From c00b69f2f79287f51331735df70abe700fd503df Mon Sep 17 00:00:00 2001 From: Janus Thorborg Date: Sun, 16 Feb 2025 17:59:42 +0100 Subject: [PATCH 01/69] Partial modern rewrite of Signalizer.jucer --- Signalizer.jucer | 185 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 157 insertions(+), 28 deletions(-) diff --git a/Signalizer.jucer b/Signalizer.jucer index e56a191..49e541b 100644 --- a/Signalizer.jucer +++ b/Signalizer.jucer @@ -1,35 +1,122 @@ - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + @@ -39,7 +126,6 @@ - @@ -48,6 +134,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -63,7 +193,6 @@ - - + From ff774ccfccdd19e2cdc22ac2f8122e6710ea71cd Mon Sep 17 00:00:00 2001 From: Janus Thorborg Date: Tue, 15 Apr 2025 00:53:49 +0200 Subject: [PATCH 02/69] Adding JUCE as a submodule, and instructing the projucer to point to it + almost all other project files --- .gitmodules | 3 + External/juce | 1 + Signalizer.jucer | 587 ++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 528 insertions(+), 63 deletions(-) create mode 160000 External/juce diff --git a/.gitmodules b/.gitmodules index 046e79a..312db7f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "External/cpl"] path = External/cpl url = https://bitbucket.org/Mayae/cpl +[submodule "External/juce"] + path = External/juce + url = https://github.com/juce-framework/JUCE diff --git a/External/juce b/External/juce new file mode 160000 index 0000000..51a8a6d --- /dev/null +++ b/External/juce @@ -0,0 +1 @@ +Subproject commit 51a8a6d7aeae7326956d747737ccf1575e61e209 diff --git a/Signalizer.jucer b/Signalizer.jucer index 49e541b..d72076c 100644 --- a/Signalizer.jucer +++ b/Signalizer.jucer @@ -13,10 +13,23 @@ companyEmail="contact@jthorborg.com" pluginFormats="buildAU,buildVST,buildVST3" buildAUv3="0" buildStandalone="0" enableIAA="0" pluginVST3Category="Analyzer" lv2Uri="https://jthorborg.com/index.html?ipage=signalizer" jucerFormatVersion="1" - headerPath="External/cpl"> + headerPath="../../External ../../Source ../../Source/Config"> - - + + + + + + + + + + + - - - - - - @@ -107,6 +113,471 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -119,19 +590,16 @@ optimisation="2" targetName="Signalizer" fastMath="1" stripLocalSymbols="1"/> - - - - - - - - - - - - - + + + + + + + + + + @@ -142,19 +610,16 @@ enablePluginBinaryCopyStep="1" vstBinaryLocation_x64="C:\Audio\VSTPlugins"/> - - - - - - - - - - - - - + + + + + + + + + + @@ -163,36 +628,32 @@ - - - - - - - - - - - - - + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + - + From f22cdc79714bde020102f980563c05b43384dfb6 Mon Sep 17 00:00:00 2001 From: Janus Thorborg Date: Tue, 15 Apr 2025 00:55:42 +0200 Subject: [PATCH 03/69] Deleting embedded juce modules, point to submodule instead --- JuceLibraryCode/AppConfig.h | 327 +- JuceLibraryCode/JuceHeader.h | 47 +- JuceLibraryCode/JucePluginDefines.h | 171 + JuceLibraryCode/ReadMe.txt | 6 +- JuceLibraryCode/include_juce_audio_basics.cpp | 9 + JuceLibraryCode/include_juce_audio_basics.mm | 9 + .../include_juce_audio_plugin_client_AAX.cpp | 9 + .../include_juce_audio_plugin_client_AAX.mm | 9 + ...ude_juce_audio_plugin_client_AAX_utils.cpp | 9 + .../include_juce_audio_plugin_client_ARA.cpp | 9 + .../include_juce_audio_plugin_client_AU_1.mm | 9 + .../include_juce_audio_plugin_client_AU_2.mm | 9 + .../include_juce_audio_plugin_client_AUv3.mm | 9 + .../include_juce_audio_plugin_client_LV2.cpp | 9 + .../include_juce_audio_plugin_client_LV2.mm | 9 + ...de_juce_audio_plugin_client_Standalone.cpp | 9 + ...include_juce_audio_plugin_client_Unity.cpp | 9 + .../include_juce_audio_plugin_client_VST2.cpp | 9 + .../include_juce_audio_plugin_client_VST2.mm | 9 + .../include_juce_audio_plugin_client_VST3.cpp | 9 + .../include_juce_audio_plugin_client_VST3.mm | 9 + .../include_juce_audio_processors.cpp | 9 + .../include_juce_audio_processors.mm | 9 + .../include_juce_audio_processors_ara.cpp | 9 + ...include_juce_audio_processors_lv2_libs.cpp | 9 + JuceLibraryCode/include_juce_core.cpp | 9 + JuceLibraryCode/include_juce_core.mm | 9 + .../include_juce_core_CompilationTime.cpp | 9 + .../include_juce_data_structures.cpp | 9 + .../include_juce_data_structures.mm | 9 + JuceLibraryCode/include_juce_events.cpp | 9 + JuceLibraryCode/include_juce_events.mm | 9 + JuceLibraryCode/include_juce_graphics.cpp | 9 + JuceLibraryCode/include_juce_graphics.mm | 9 + .../include_juce_graphics_Harfbuzz.cpp | 9 + .../include_juce_graphics_Sheenbidi.c | 9 + JuceLibraryCode/include_juce_gui_basics.cpp | 9 + JuceLibraryCode/include_juce_gui_basics.mm | 9 + JuceLibraryCode/include_juce_gui_extra.cpp | 9 + JuceLibraryCode/include_juce_gui_extra.mm | 9 + JuceLibraryCode/include_juce_opengl.cpp | 9 + JuceLibraryCode/include_juce_opengl.mm | 9 + .../buffers/juce_AudioDataConverters.cpp | 600 - .../buffers/juce_AudioDataConverters.h | 712 - .../buffers/juce_AudioSampleBuffer.cpp | 670 - .../buffers/juce_AudioSampleBuffer.h | 526 - .../buffers/juce_FloatVectorOperations.cpp | 1043 - .../buffers/juce_FloatVectorOperations.h | 198 - .../juce_audio_basics/effects/juce_Decibels.h | 104 - .../juce_audio_basics/effects/juce_FFT.cpp | 280 - .../juce_audio_basics/effects/juce_FFT.h | 92 - .../effects/juce_IIRFilter.cpp | 244 - .../effects/juce_IIRFilter.h | 174 - .../effects/juce_LagrangeInterpolator.cpp | 206 - .../effects/juce_LagrangeInterpolator.h | 94 - .../juce_audio_basics/effects/juce_Reverb.h | 372 - .../juce_audio_basics/juce_audio_basics.cpp | 95 - .../juce_audio_basics/juce_audio_basics.h | 63 - .../juce_audio_basics/juce_audio_basics.mm | 25 - .../juce_audio_basics/juce_module_info | 24 - .../midi/juce_MidiBuffer.cpp | 229 - .../juce_audio_basics/midi/juce_MidiBuffer.h | 235 - .../juce_audio_basics/midi/juce_MidiFile.cpp | 428 - .../juce_audio_basics/midi/juce_MidiFile.h | 180 - .../midi/juce_MidiKeyboardState.cpp | 183 - .../midi/juce_MidiKeyboardState.h | 205 - .../midi/juce_MidiMessage.cpp | 1094 -- .../juce_audio_basics/midi/juce_MidiMessage.h | 903 - .../midi/juce_MidiMessageSequence.cpp | 331 - .../midi/juce_MidiMessageSequence.h | 265 - .../sources/juce_AudioSource.h | 181 - .../sources/juce_BufferingAudioSource.cpp | 259 - .../sources/juce_BufferingAudioSource.h | 111 - .../juce_ChannelRemappingAudioSource.cpp | 184 - .../juce_ChannelRemappingAudioSource.h | 143 - .../sources/juce_IIRFilterAudioSource.cpp | 77 - .../sources/juce_IIRFilterAudioSource.h | 70 - .../sources/juce_MixerAudioSource.cpp | 155 - .../sources/juce_MixerAudioSource.h | 101 - .../sources/juce_PositionableAudioSource.h | 78 - .../sources/juce_ResamplingAudioSource.cpp | 262 - .../sources/juce_ResamplingAudioSource.h | 107 - .../sources/juce_ReverbAudioSource.cpp | 80 - .../sources/juce_ReverbAudioSource.h | 76 - .../sources/juce_ToneGeneratorAudioSource.cpp | 75 - .../sources/juce_ToneGeneratorAudioSource.h | 73 - .../synthesisers/juce_Synthesiser.cpp | 506 - .../synthesisers/juce_Synthesiser.h | 557 - .../audio_cd/juce_AudioCDBurner.h | 169 - .../audio_cd/juce_AudioCDReader.cpp | 57 - .../audio_cd/juce_AudioCDReader.h | 174 - .../audio_io/juce_AudioDeviceManager.cpp | 992 - .../audio_io/juce_AudioDeviceManager.h | 511 - .../audio_io/juce_AudioIODevice.cpp | 41 - .../audio_io/juce_AudioIODevice.h | 309 - .../audio_io/juce_AudioIODeviceType.cpp | 78 - .../audio_io/juce_AudioIODeviceType.h | 182 - .../audio_io/juce_SystemAudioVolume.h | 61 - .../juce_audio_devices/juce_audio_devices.cpp | 227 - .../juce_audio_devices/juce_audio_devices.h | 126 - .../juce_audio_devices/juce_audio_devices.mm | 25 - .../juce_audio_devices/juce_module_info | 28 - .../midi_io/juce_MidiInput.h | 180 - .../midi_io/juce_MidiMessageCollector.cpp | 153 - .../midi_io/juce_MidiMessageCollector.h | 104 - .../midi_io/juce_MidiOutput.cpp | 162 - .../midi_io/juce_MidiOutput.h | 142 - .../native/juce_MidiDataConcatenator.h | 187 - .../native/juce_android_Audio.cpp | 450 - .../native/juce_android_Midi.cpp | 85 - .../native/juce_android_OpenSL.cpp | 632 - .../native/juce_ios_Audio.cpp | 576 - .../native/juce_linux_ALSA.cpp | 1257 -- .../native/juce_linux_AudioCDReader.cpp | 77 - .../native/juce_linux_JackAudio.cpp | 604 - .../native/juce_linux_Midi.cpp | 621 - .../native/juce_mac_AudioCDBurner.mm | 455 - .../native/juce_mac_AudioCDReader.mm | 261 - .../native/juce_mac_CoreAudio.cpp | 1945 -- .../native/juce_mac_CoreMidi.cpp | 530 - .../native/juce_win32_ASIO.cpp | 1646 -- .../native/juce_win32_AudioCDBurner.cpp | 411 - .../native/juce_win32_AudioCDReader.cpp | 1309 -- .../native/juce_win32_DirectSound.cpp | 1277 -- .../native/juce_win32_Midi.cpp | 489 - .../native/juce_win32_WASAPI.cpp | 1693 -- .../sources/juce_AudioSourcePlayer.cpp | 182 - .../sources/juce_AudioSourcePlayer.h | 115 - .../sources/juce_AudioTransportSource.cpp | 298 - .../sources/juce_AudioTransportSource.h | 180 - .../codecs/flac/Flac Licence.txt | 49 - .../juce_audio_formats/codecs/flac/all.h | 371 - .../juce_audio_formats/codecs/flac/alloc.h | 209 - .../juce_audio_formats/codecs/flac/assert.h | 46 - .../juce_audio_formats/codecs/flac/callback.h | 185 - .../juce_audio_formats/codecs/flac/compat.h | 200 - .../juce_audio_formats/codecs/flac/endswap.h | 78 - .../juce_audio_formats/codecs/flac/export.h | 97 - .../juce_audio_formats/codecs/flac/format.h | 1025 - .../codecs/flac/libFLAC/bitmath.c | 109 - .../codecs/flac/libFLAC/bitreader.c | 1058 -- .../codecs/flac/libFLAC/bitwriter.c | 842 - .../codecs/flac/libFLAC/cpu.c | 490 - .../codecs/flac/libFLAC/crc.c | 143 - .../codecs/flac/libFLAC/fixed.c | 418 - .../codecs/flac/libFLAC/float.c | 302 - .../codecs/flac/libFLAC/format.c | 584 - .../codecs/flac/libFLAC/include/private/all.h | 50 - .../flac/libFLAC/include/private/bitmath.h | 186 - .../flac/libFLAC/include/private/bitreader.h | 91 - .../flac/libFLAC/include/private/bitwriter.h | 104 - .../codecs/flac/libFLAC/include/private/cpu.h | 99 - .../codecs/flac/libFLAC/include/private/crc.h | 62 - .../flac/libFLAC/include/private/fixed.h | 107 - .../flac/libFLAC/include/private/float.h | 98 - .../flac/libFLAC/include/private/format.h | 45 - .../codecs/flac/libFLAC/include/private/lpc.h | 246 - .../codecs/flac/libFLAC/include/private/md5.h | 50 - .../flac/libFLAC/include/private/memory.h | 58 - .../flac/libFLAC/include/private/metadata.h | 46 - .../libFLAC/include/private/stream_encoder.h | 67 - .../include/private/stream_encoder_framing.h | 46 - .../flac/libFLAC/include/private/window.h | 74 - .../flac/libFLAC/include/protected/all.h | 39 - .../include/protected/stream_decoder.h | 60 - .../include/protected/stream_encoder.h | 118 - .../codecs/flac/libFLAC/lpc_flac.c | 1356 -- .../codecs/flac/libFLAC/md5.c | 518 - .../codecs/flac/libFLAC/memory.c | 218 - .../codecs/flac/libFLAC/stream_decoder.c | 3395 ---- .../codecs/flac/libFLAC/stream_encoder.c | 4527 ----- .../flac/libFLAC/stream_encoder_framing.c | 549 - .../codecs/flac/libFLAC/window_flac.c | 281 - .../juce_audio_formats/codecs/flac/metadata.h | 2182 --- .../juce_audio_formats/codecs/flac/ordinals.h | 86 - .../codecs/flac/stream_decoder.h | 1560 -- .../codecs/flac/stream_encoder.h | 1790 -- .../codecs/flac/win_utf8_io.h | 69 - .../codecs/juce_AiffAudioFormat.cpp | 1016 - .../codecs/juce_AiffAudioFormat.h | 84 - .../codecs/juce_CoreAudioFormat.cpp | 528 - .../codecs/juce_CoreAudioFormat.h | 77 - .../codecs/juce_FlacAudioFormat.cpp | 556 - .../codecs/juce_FlacAudioFormat.h | 65 - .../codecs/juce_LAMEEncoderAudioFormat.cpp | 222 - .../codecs/juce_LAMEEncoderAudioFormat.h | 71 - .../codecs/juce_MP3AudioFormat.cpp | 3162 ---- .../codecs/juce_MP3AudioFormat.h | 64 - .../codecs/juce_OggVorbisAudioFormat.cpp | 532 - .../codecs/juce_OggVorbisAudioFormat.h | 93 - .../codecs/juce_QuickTimeAudioFormat.cpp | 391 - .../codecs/juce_QuickTimeAudioFormat.h | 69 - .../codecs/juce_WavAudioFormat.cpp | 1495 -- .../codecs/juce_WavAudioFormat.h | 171 - .../codecs/juce_WindowsMediaAudioFormat.cpp | 350 - .../codecs/juce_WindowsMediaAudioFormat.h | 53 - .../codecs/oggvorbis/Ogg Vorbis Licence.txt | 47 - .../codecs/oggvorbis/bitwise.c | 784 - .../codecs/oggvorbis/codec.h | 242 - .../codecs/oggvorbis/config_types.h | 10 - .../codecs/oggvorbis/framing.c | 1796 -- .../codecs/oggvorbis/libvorbis-1.3.2/AUTHORS | 3 - .../codecs/oggvorbis/libvorbis-1.3.2/CHANGES | 126 - .../codecs/oggvorbis/libvorbis-1.3.2/COPYING | 28 - .../codecs/oggvorbis/libvorbis-1.3.2/README | 134 - .../oggvorbis/libvorbis-1.3.2/lib/analysis.c | 109 - .../oggvorbis/libvorbis-1.3.2/lib/backends.h | 144 - .../oggvorbis/libvorbis-1.3.2/lib/bitrate.c | 253 - .../oggvorbis/libvorbis-1.3.2/lib/bitrate.h | 59 - .../oggvorbis/libvorbis-1.3.2/lib/block.c | 1033 - .../lib/books/coupled/res_books_51.h | 12256 ------------ .../lib/books/coupled/res_books_stereo.h | 15782 ---------------- .../lib/books/floor/floor_books.h | 1546 -- .../lib/books/uncoupled/res_books_uncoupled.h | 7757 -------- .../oggvorbis/libvorbis-1.3.2/lib/codebook.c | 479 - .../oggvorbis/libvorbis-1.3.2/lib/codebook.h | 119 - .../libvorbis-1.3.2/lib/codec_internal.h | 187 - .../oggvorbis/libvorbis-1.3.2/lib/envelope.c | 375 - .../oggvorbis/libvorbis-1.3.2/lib/envelope.h | 80 - .../oggvorbis/libvorbis-1.3.2/lib/floor0.c | 223 - .../oggvorbis/libvorbis-1.3.2/lib/floor1.c | 1080 -- .../oggvorbis/libvorbis-1.3.2/lib/highlevel.h | 58 - .../oggvorbis/libvorbis-1.3.2/lib/info.c | 660 - .../oggvorbis/libvorbis-1.3.2/lib/lookup.c | 94 - .../oggvorbis/libvorbis-1.3.2/lib/lookup.h | 32 - .../libvorbis-1.3.2/lib/lookup_data.h | 192 - .../oggvorbis/libvorbis-1.3.2/lib/lpc.c | 160 - .../oggvorbis/libvorbis-1.3.2/lib/lpc.h | 29 - .../oggvorbis/libvorbis-1.3.2/lib/lsp.c | 454 - .../oggvorbis/libvorbis-1.3.2/lib/lsp.h | 28 - .../oggvorbis/libvorbis-1.3.2/lib/mapping0.c | 816 - .../oggvorbis/libvorbis-1.3.2/lib/masking.h | 785 - .../oggvorbis/libvorbis-1.3.2/lib/mdct.c | 563 - .../oggvorbis/libvorbis-1.3.2/lib/mdct.h | 71 - .../oggvorbis/libvorbis-1.3.2/lib/misc.h | 53 - .../libvorbis-1.3.2/lib/modes/floor_all.h | 260 - .../libvorbis-1.3.2/lib/modes/psych_11.h | 50 - .../libvorbis-1.3.2/lib/modes/psych_16.h | 133 - .../libvorbis-1.3.2/lib/modes/psych_44.h | 642 - .../libvorbis-1.3.2/lib/modes/psych_8.h | 101 - .../libvorbis-1.3.2/lib/modes/residue_16.h | 163 - .../libvorbis-1.3.2/lib/modes/residue_44.h | 292 - .../libvorbis-1.3.2/lib/modes/residue_44p51.h | 451 - .../libvorbis-1.3.2/lib/modes/residue_44u.h | 318 - .../libvorbis-1.3.2/lib/modes/residue_8.h | 109 - .../libvorbis-1.3.2/lib/modes/setup_11.h | 143 - .../libvorbis-1.3.2/lib/modes/setup_16.h | 153 - .../libvorbis-1.3.2/lib/modes/setup_22.h | 128 - .../libvorbis-1.3.2/lib/modes/setup_32.h | 132 - .../libvorbis-1.3.2/lib/modes/setup_44.h | 117 - .../libvorbis-1.3.2/lib/modes/setup_44p51.h | 74 - .../libvorbis-1.3.2/lib/modes/setup_44u.h | 74 - .../libvorbis-1.3.2/lib/modes/setup_8.h | 149 - .../libvorbis-1.3.2/lib/modes/setup_X.h | 225 - .../codecs/oggvorbis/libvorbis-1.3.2/lib/os.h | 186 - .../oggvorbis/libvorbis-1.3.2/lib/psy.c | 1205 -- .../oggvorbis/libvorbis-1.3.2/lib/psy.h | 154 - .../oggvorbis/libvorbis-1.3.2/lib/registry.c | 45 - .../oggvorbis/libvorbis-1.3.2/lib/registry.h | 32 - .../oggvorbis/libvorbis-1.3.2/lib/res0.c | 891 - .../oggvorbis/libvorbis-1.3.2/lib/scales.h | 90 - .../libvorbis-1.3.2/lib/sharedbook.c | 581 - .../oggvorbis/libvorbis-1.3.2/lib/smallft.c | 1255 -- .../oggvorbis/libvorbis-1.3.2/lib/smallft.h | 34 - .../oggvorbis/libvorbis-1.3.2/lib/synthesis.c | 184 - .../oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c | 1215 -- .../libvorbis-1.3.2/lib/vorbisfile.c | 2338 --- .../oggvorbis/libvorbis-1.3.2/lib/window.c | 2135 --- .../oggvorbis/libvorbis-1.3.2/lib/window.h | 26 - .../juce_audio_formats/codecs/oggvorbis/ogg.h | 206 - .../codecs/oggvorbis/os_types.h | 127 - .../codecs/oggvorbis/vorbisenc.h | 436 - .../codecs/oggvorbis/vorbisfile.h | 205 - .../format/juce_AudioFormat.cpp | 56 - .../format/juce_AudioFormat.h | 178 - .../format/juce_AudioFormatManager.cpp | 177 - .../format/juce_AudioFormatManager.h | 143 - .../format/juce_AudioFormatReader.cpp | 414 - .../format/juce_AudioFormatReader.h | 300 - .../format/juce_AudioFormatReaderSource.cpp | 85 - .../format/juce_AudioFormatReaderSource.h | 100 - .../format/juce_AudioFormatWriter.cpp | 342 - .../format/juce_AudioFormatWriter.h | 274 - .../format/juce_AudioSubsectionReader.cpp | 66 - .../format/juce_AudioSubsectionReader.h | 83 - .../juce_BufferingAudioFormatReader.cpp | 172 - .../format/juce_BufferingAudioFormatReader.h | 93 - .../juce_MemoryMappedAudioFormatReader.h | 112 - .../juce_audio_formats/juce_audio_formats.cpp | 121 - .../juce_audio_formats/juce_audio_formats.h | 110 - .../juce_audio_formats/juce_audio_formats.mm | 25 - .../juce_audio_formats/juce_module_info | 22 - .../sampler/juce_Sampler.cpp | 224 - .../juce_audio_formats/sampler/juce_Sampler.h | 146 - .../AAX/juce_AAX_Wrapper.cpp | 1093 -- .../AAX/juce_AAX_Wrapper.mm | 26 - .../AU/juce_AU_Resources.r | 69 - .../AU/juce_AU_Wrapper.mm | 1633 -- .../RTAS/juce_RTAS_DigiCode1.cpp | 64 - .../RTAS/juce_RTAS_DigiCode2.cpp | 53 - .../RTAS/juce_RTAS_DigiCode3.cpp | 71 - .../RTAS/juce_RTAS_DigiCode_Header.h | 73 - .../RTAS/juce_RTAS_MacResources.r | 6 - .../RTAS/juce_RTAS_MacUtilities.mm | 169 - .../RTAS/juce_RTAS_WinExports.def | 3 - .../RTAS/juce_RTAS_WinResources.rsr | Bin 3198 -> 0 bytes .../RTAS/juce_RTAS_WinUtilities.cpp | 140 - .../RTAS/juce_RTAS_Wrapper.cpp | 990 - .../Standalone/juce_StandaloneFilterWindow.h | 394 - .../VST/juce_VST_Wrapper.cpp | 1605 -- .../VST/juce_VST_Wrapper.mm | 296 - .../VST3/juce_VST3_Wrapper.cpp | 1814 -- .../VST3/juce_VST3_Wrapper.mm | 273 - .../juce_audio_plugin_client.h | 38 - .../juce_audio_plugin_client/juce_module_info | 45 - .../utility/juce_CarbonVisibility.h | 79 - .../utility/juce_CheckSettingMacros.h | 105 - .../utility/juce_FakeMouseMoveGenerator.h | 66 - .../utility/juce_IncludeModuleHeaders.h | 46 - .../utility/juce_IncludeSystemHeaders.h | 66 - .../utility/juce_PluginHostType.h | 237 - .../utility/juce_PluginUtilities.cpp | 79 - .../utility/juce_WindowsHooks.h | 107 - .../format/juce_AudioPluginFormat.cpp | 26 - .../format/juce_AudioPluginFormat.h | 112 - .../format/juce_AudioPluginFormatManager.cpp | 104 - .../format/juce_AudioPluginFormatManager.h | 99 - .../format_types/juce_AudioUnitPluginFormat.h | 55 - .../juce_AudioUnitPluginFormat.mm | 1738 -- .../format_types/juce_LADSPAPluginFormat.cpp | 703 - .../format_types/juce_LADSPAPluginFormat.h | 57 - .../format_types/juce_VST3Common.h | 420 - .../format_types/juce_VST3Headers.h | 172 - .../format_types/juce_VST3PluginFormat.cpp | 2554 --- .../format_types/juce_VST3PluginFormat.h | 72 - .../format_types/juce_VSTMidiEventList.h | 187 - .../format_types/juce_VSTPluginFormat.cpp | 2896 --- .../format_types/juce_VSTPluginFormat.h | 113 - .../juce_audio_processors.cpp | 158 - .../juce_audio_processors.h | 98 - .../juce_audio_processors.mm | 25 - .../juce_audio_processors/juce_module_info | 25 - .../processors/juce_AudioPlayHead.h | 142 - .../processors/juce_AudioPluginInstance.h | 86 - .../processors/juce_AudioProcessor.cpp | 474 - .../processors/juce_AudioProcessor.h | 695 - .../processors/juce_AudioProcessorEditor.cpp | 43 - .../processors/juce_AudioProcessorEditor.h | 92 - .../processors/juce_AudioProcessorGraph.cpp | 1511 -- .../processors/juce_AudioProcessorGraph.h | 398 - .../processors/juce_AudioProcessorListener.h | 106 - .../processors/juce_AudioProcessorParameter.h | 158 - .../juce_GenericAudioProcessorEditor.cpp | 172 - .../juce_GenericAudioProcessorEditor.h | 58 - .../processors/juce_PluginDescription.cpp | 140 - .../processors/juce_PluginDescription.h | 151 - .../scanning/juce_KnownPluginList.cpp | 549 - .../scanning/juce_KnownPluginList.h | 223 - .../scanning/juce_PluginDirectoryScanner.cpp | 136 - .../scanning/juce_PluginDirectoryScanner.h | 127 - .../scanning/juce_PluginListComponent.cpp | 554 - .../scanning/juce_PluginListComponent.h | 114 - .../containers/juce_AbstractFifo.cpp | 235 - .../juce_core/containers/juce_AbstractFifo.h | 220 - .../modules/juce_core/containers/juce_Array.h | 1137 -- .../containers/juce_ArrayAllocationBase.h | 138 - .../containers/juce_DynamicObject.cpp | 133 - .../juce_core/containers/juce_DynamicObject.h | 139 - .../containers/juce_ElementComparator.h | 195 - .../juce_core/containers/juce_HashMap.h | 455 - .../containers/juce_LinkedListPointer.h | 371 - .../containers/juce_NamedValueSet.cpp | 270 - .../juce_core/containers/juce_NamedValueSet.h | 145 - .../juce_core/containers/juce_OwnedArray.h | 897 - .../juce_core/containers/juce_PropertySet.cpp | 219 - .../juce_core/containers/juce_PropertySet.h | 211 - .../containers/juce_ReferenceCountedArray.h | 897 - .../containers/juce_ScopedValueSetter.h | 100 - .../juce_core/containers/juce_SortedSet.h | 494 - .../juce_core/containers/juce_SparseSet.h | 298 - .../juce_core/containers/juce_Variant.cpp | 780 - .../juce_core/containers/juce_Variant.h | 327 - .../files/juce_DirectoryIterator.cpp | 166 - .../juce_core/files/juce_DirectoryIterator.h | 159 - .../modules/juce_core/files/juce_File.cpp | 1091 -- .../modules/juce_core/files/juce_File.h | 984 - .../juce_core/files/juce_FileFilter.cpp | 41 - .../modules/juce_core/files/juce_FileFilter.h | 77 - .../juce_core/files/juce_FileInputStream.cpp | 84 - .../juce_core/files/juce_FileInputStream.h | 96 - .../juce_core/files/juce_FileOutputStream.cpp | 134 - .../juce_core/files/juce_FileOutputStream.h | 116 - .../juce_core/files/juce_FileSearchPath.cpp | 172 - .../juce_core/files/juce_FileSearchPath.h | 165 - .../juce_core/files/juce_MemoryMappedFile.h | 115 - .../juce_core/files/juce_TemporaryFile.cpp | 117 - .../juce_core/files/juce_TemporaryFile.h | 169 - .../files/juce_WildcardFileFilter.cpp | 76 - .../juce_core/files/juce_WildcardFileFilter.h | 82 - .../juce_core/javascript/juce_JSON.cpp | 643 - .../modules/juce_core/javascript/juce_JSON.h | 136 - .../juce_core/javascript/juce_Javascript.cpp | 1725 -- .../juce_core/javascript/juce_Javascript.h | 108 - .../modules/juce_core/juce_core.cpp | 227 - JuceLibraryCode/modules/juce_core/juce_core.h | 284 - .../modules/juce_core/juce_core.mm | 29 - .../modules/juce_core/juce_module_info | 38 - .../juce_core/logging/juce_FileLogger.cpp | 134 - .../juce_core/logging/juce_FileLogger.h | 139 - .../modules/juce_core/logging/juce_Logger.cpp | 63 - .../modules/juce_core/logging/juce_Logger.h | 97 - .../juce_core/maths/juce_BigInteger.cpp | 1014 - .../modules/juce_core/maths/juce_BigInteger.h | 334 - .../juce_core/maths/juce_Expression.cpp | 1183 -- .../modules/juce_core/maths/juce_Expression.h | 270 - .../juce_core/maths/juce_MathsFunctions.h | 565 - .../juce_core/maths/juce_NormalisableRange.h | 169 - .../modules/juce_core/maths/juce_Random.cpp | 189 - .../modules/juce_core/maths/juce_Random.h | 143 - .../modules/juce_core/maths/juce_Range.h | 304 - .../modules/juce_core/memory/juce_Atomic.h | 399 - .../modules/juce_core/memory/juce_ByteOrder.h | 196 - .../memory/juce_ContainerDeletePolicy.h | 53 - .../modules/juce_core/memory/juce_HeapBlock.h | 308 - .../memory/juce_LeakedObjectDetector.h | 146 - .../modules/juce_core/memory/juce_Memory.h | 126 - .../juce_core/memory/juce_MemoryBlock.cpp | 416 - .../juce_core/memory/juce_MemoryBlock.h | 253 - .../memory/juce_OptionalScopedPointer.h | 186 - .../memory/juce_ReferenceCountedObject.h | 415 - .../juce_core/memory/juce_ScopedPointer.h | 253 - .../memory/juce_SharedResourcePointer.h | 152 - .../modules/juce_core/memory/juce_Singleton.h | 292 - .../juce_core/memory/juce_WeakReference.h | 212 - .../modules/juce_core/misc/juce_Result.cpp | 83 - .../modules/juce_core/misc/juce_Result.h | 125 - .../modules/juce_core/misc/juce_Uuid.cpp | 117 - .../modules/juce_core/misc/juce_Uuid.h | 121 - .../juce_core/misc/juce_WindowsRegistry.h | 141 - .../native/java/JuceAppActivity.java | 819 - .../native/juce_BasicNativeHeaders.h | 223 - .../juce_core/native/juce_android_Files.cpp | 104 - .../native/juce_android_JNIHelpers.h | 429 - .../juce_core/native/juce_android_Misc.cpp | 32 - .../juce_core/native/juce_android_Network.cpp | 182 - .../native/juce_android_SystemStats.cpp | 315 - .../juce_core/native/juce_android_Threads.cpp | 76 - .../native/juce_linux_CommonFile.cpp | 153 - .../juce_core/native/juce_linux_Files.cpp | 241 - .../juce_core/native/juce_linux_Network.cpp | 453 - .../native/juce_linux_SystemStats.cpp | 191 - .../juce_core/native/juce_linux_Threads.cpp | 90 - .../juce_core/native/juce_mac_Files.mm | 498 - .../juce_core/native/juce_mac_Network.mm | 467 - .../juce_core/native/juce_mac_Strings.mm | 100 - .../juce_core/native/juce_mac_SystemStats.mm | 306 - .../juce_core/native/juce_mac_Threads.mm | 97 - .../juce_core/native/juce_osx_ObjCHelpers.h | 169 - .../juce_core/native/juce_posix_NamedPipe.cpp | 224 - .../juce_core/native/juce_posix_SharedCode.h | 1319 -- .../juce_core/native/juce_win32_ComSmartPtr.h | 170 - .../juce_core/native/juce_win32_Files.cpp | 1010 - .../juce_core/native/juce_win32_Network.cpp | 519 - .../juce_core/native/juce_win32_Registry.cpp | 227 - .../native/juce_win32_SystemStats.cpp | 459 - .../juce_core/native/juce_win32_Threads.cpp | 625 - .../juce_core/network/juce_IPAddress.cpp | 149 - .../juce_core/network/juce_IPAddress.h | 82 - .../juce_core/network/juce_MACAddress.cpp | 78 - .../juce_core/network/juce_MACAddress.h | 82 - .../juce_core/network/juce_NamedPipe.cpp | 66 - .../juce_core/network/juce_NamedPipe.h | 104 - .../modules/juce_core/network/juce_Socket.cpp | 604 - .../modules/juce_core/network/juce_Socket.h | 305 - .../modules/juce_core/network/juce_URL.cpp | 515 - .../modules/juce_core/network/juce_URL.h | 387 - .../streams/juce_BufferedInputStream.cpp | 198 - .../streams/juce_BufferedInputStream.h | 92 - .../streams/juce_FileInputSource.cpp | 56 - .../juce_core/streams/juce_FileInputSource.h | 66 - .../juce_core/streams/juce_InputSource.h | 78 - .../juce_core/streams/juce_InputStream.cpp | 236 - .../juce_core/streams/juce_InputStream.h | 266 - .../streams/juce_MemoryInputStream.cpp | 159 - .../streams/juce_MemoryInputStream.h | 97 - .../streams/juce_MemoryOutputStream.cpp | 214 - .../streams/juce_MemoryOutputStream.h | 139 - .../juce_core/streams/juce_OutputStream.cpp | 351 - .../juce_core/streams/juce_OutputStream.h | 278 - .../streams/juce_SubregionStream.cpp | 82 - .../juce_core/streams/juce_SubregionStream.h | 88 - .../juce_core/system/juce_CompilerSupport.h | 160 - .../juce_core/system/juce_PlatformDefs.h | 339 - .../juce_core/system/juce_StandardHeader.h | 160 - .../juce_core/system/juce_SystemStats.cpp | 183 - .../juce_core/system/juce_SystemStats.h | 196 - .../juce_core/system/juce_TargetPlatform.h | 201 - .../juce_core/text/juce_CharPointer_ASCII.h | 389 - .../juce_core/text/juce_CharPointer_UTF16.h | 525 - .../juce_core/text/juce_CharPointer_UTF32.h | 378 - .../juce_core/text/juce_CharPointer_UTF8.h | 574 - .../text/juce_CharacterFunctions.cpp | 154 - .../juce_core/text/juce_CharacterFunctions.h | 629 - .../juce_core/text/juce_Identifier.cpp | 70 - .../modules/juce_core/text/juce_Identifier.h | 120 - .../juce_core/text/juce_LocalisedStrings.cpp | 209 - .../juce_core/text/juce_LocalisedStrings.h | 247 - .../modules/juce_core/text/juce_NewLine.h | 86 - .../modules/juce_core/text/juce_String.cpp | 2547 --- .../modules/juce_core/text/juce_String.h | 1370 -- .../juce_core/text/juce_StringArray.cpp | 492 - .../modules/juce_core/text/juce_StringArray.h | 425 - .../juce_core/text/juce_StringPairArray.cpp | 147 - .../juce_core/text/juce_StringPairArray.h | 157 - .../juce_core/text/juce_StringPool.cpp | 166 - .../modules/juce_core/text/juce_StringPool.h | 96 - .../modules/juce_core/text/juce_StringRef.h | 138 - .../modules/juce_core/text/juce_TextDiff.cpp | 247 - .../modules/juce_core/text/juce_TextDiff.h | 80 - .../juce_core/threads/juce_ChildProcess.cpp | 113 - .../juce_core/threads/juce_ChildProcess.h | 119 - .../juce_core/threads/juce_CriticalSection.h | 266 - .../juce_core/threads/juce_DynamicLibrary.h | 85 - .../threads/juce_HighResolutionTimer.cpp | 36 - .../threads/juce_HighResolutionTimer.h | 109 - .../juce_core/threads/juce_InterProcessLock.h | 128 - .../modules/juce_core/threads/juce_Process.h | 153 - .../juce_core/threads/juce_ReadWriteLock.cpp | 150 - .../juce_core/threads/juce_ReadWriteLock.h | 152 - .../juce_core/threads/juce_ScopedLock.h | 237 - .../juce_core/threads/juce_ScopedReadLock.h | 90 - .../juce_core/threads/juce_ScopedWriteLock.h | 90 - .../modules/juce_core/threads/juce_SpinLock.h | 91 - .../modules/juce_core/threads/juce_Thread.cpp | 373 - .../modules/juce_core/threads/juce_Thread.h | 289 - .../juce_core/threads/juce_ThreadLocalValue.h | 198 - .../juce_core/threads/juce_ThreadPool.cpp | 384 - .../juce_core/threads/juce_ThreadPool.h | 321 - .../threads/juce_TimeSliceThread.cpp | 171 - .../juce_core/threads/juce_TimeSliceThread.h | 149 - .../juce_core/threads/juce_WaitableEvent.h | 118 - .../time/juce_PerformanceCounter.cpp | 132 - .../juce_core/time/juce_PerformanceCounter.h | 127 - .../juce_core/time/juce_RelativeTime.cpp | 139 - .../juce_core/time/juce_RelativeTime.h | 184 - .../modules/juce_core/time/juce_Time.cpp | 473 - .../modules/juce_core/time/juce_Time.h | 404 - .../juce_core/unit_tests/juce_UnitTest.cpp | 260 - .../juce_core/unit_tests/juce_UnitTest.h | 311 - .../juce_core/xml/juce_XmlDocument.cpp | 884 - .../modules/juce_core/xml/juce_XmlDocument.h | 181 - .../modules/juce_core/xml/juce_XmlElement.cpp | 888 - .../modules/juce_core/xml/juce_XmlElement.h | 770 - .../zip/juce_GZIPCompressorOutputStream.cpp | 213 - .../zip/juce_GZIPCompressorOutputStream.h | 101 - .../zip/juce_GZIPDecompressorInputStream.cpp | 288 - .../zip/juce_GZIPDecompressorInputStream.h | 97 - .../modules/juce_core/zip/juce_ZipFile.cpp | 608 - .../modules/juce_core/zip/juce_ZipFile.h | 259 - .../modules/juce_core/zip/zlib/README | 125 - .../modules/juce_core/zip/zlib/adler32.c | 143 - .../modules/juce_core/zip/zlib/compress.c | 70 - .../modules/juce_core/zip/zlib/crc32.c | 407 - .../modules/juce_core/zip/zlib/crc32.h | 441 - .../modules/juce_core/zip/zlib/deflate.c | 1679 -- .../modules/juce_core/zip/zlib/deflate.h | 333 - .../modules/juce_core/zip/zlib/infback.c | 611 - .../modules/juce_core/zip/zlib/inffast.c | 316 - .../modules/juce_core/zip/zlib/inffast.h | 11 - .../modules/juce_core/zip/zlib/inffixed.h | 94 - .../modules/juce_core/zip/zlib/inflate.c | 1339 -- .../modules/juce_core/zip/zlib/inflate.h | 121 - .../modules/juce_core/zip/zlib/inftrees.c | 328 - .../modules/juce_core/zip/zlib/inftrees.h | 61 - .../modules/juce_core/zip/zlib/trees.c | 1191 -- .../modules/juce_core/zip/zlib/trees.h | 127 - .../modules/juce_core/zip/zlib/uncompr.c | 60 - .../modules/juce_core/zip/zlib/zconf.h | 345 - .../modules/juce_core/zip/zlib/zconf.in.h | 332 - .../modules/juce_core/zip/zlib/zlib.h | 1358 -- .../modules/juce_core/zip/zlib/zutil.c | 311 - .../modules/juce_core/zip/zlib/zutil.h | 271 - .../encryption/juce_BlowFish.cpp | 271 - .../encryption/juce_BlowFish.h | 72 - .../encryption/juce_Primes.cpp | 238 - .../encryption/juce_Primes.h | 73 - .../encryption/juce_RSAKey.cpp | 135 - .../encryption/juce_RSAKey.h | 174 - .../juce_cryptography/hashing/juce_MD5.cpp | 336 - .../juce_cryptography/hashing/juce_MD5.h | 119 - .../juce_cryptography/hashing/juce_SHA256.cpp | 275 - .../juce_cryptography/hashing/juce_SHA256.h | 107 - .../hashing/juce_Whirlpool.cpp | 661 - .../hashing/juce_Whirlpool.h | 113 - .../juce_cryptography/juce_cryptography.cpp | 50 - .../juce_cryptography/juce_cryptography.h | 43 - .../juce_cryptography/juce_cryptography.mm | 25 - .../juce_cryptography/juce_module_info | 18 - .../juce_ApplicationProperties.cpp | 102 - .../juce_ApplicationProperties.h | 132 - .../app_properties/juce_PropertiesFile.cpp | 355 - .../app_properties/juce_PropertiesFile.h | 247 - .../juce_data_structures.cpp | 49 - .../juce_data_structures.h | 43 - .../juce_data_structures.mm | 25 - .../juce_data_structures/juce_module_info | 20 - .../undomanager/juce_UndoManager.cpp | 303 - .../undomanager/juce_UndoManager.h | 239 - .../undomanager/juce_UndoableAction.h | 99 - .../values/juce_Value.cpp | 237 - .../juce_data_structures/values/juce_Value.h | 237 - .../values/juce_ValueTree.cpp | 1123 -- .../values/juce_ValueTree.h | 531 - .../broadcasters/juce_ActionBroadcaster.cpp | 91 - .../broadcasters/juce_ActionBroadcaster.h | 83 - .../broadcasters/juce_ActionListener.h | 50 - .../broadcasters/juce_AsyncUpdater.cpp | 86 - .../broadcasters/juce_AsyncUpdater.h | 109 - .../broadcasters/juce_ChangeBroadcaster.cpp | 96 - .../broadcasters/juce_ChangeBroadcaster.h | 105 - .../broadcasters/juce_ChangeListener.h | 64 - .../broadcasters/juce_ListenerList.h | 359 - .../juce_ConnectedChildProcess.cpp | 264 - .../interprocess/juce_ConnectedChildProcess.h | 191 - .../juce_InterprocessConnection.cpp | 365 - .../juce_InterprocessConnection.h | 209 - .../juce_InterprocessConnectionServer.cpp | 73 - .../juce_InterprocessConnectionServer.h | 93 - .../modules/juce_events/juce_events.cpp | 106 - .../modules/juce_events/juce_events.h | 58 - .../modules/juce_events/juce_events.mm | 25 - .../modules/juce_events/juce_module_info | 23 - .../messages/juce_ApplicationBase.cpp | 294 - .../messages/juce_ApplicationBase.h | 283 - .../messages/juce_CallbackMessage.h | 73 - .../messages/juce_DeletedAtShutdown.cpp | 79 - .../messages/juce_DeletedAtShutdown.h | 68 - .../messages/juce_Initialisation.h | 112 - .../juce_events/messages/juce_Message.h | 65 - .../messages/juce_MessageListener.cpp | 49 - .../messages/juce_MessageListener.h | 72 - .../messages/juce_MessageManager.cpp | 375 - .../messages/juce_MessageManager.h | 335 - .../juce_MountedVolumeListChangeDetector.h | 59 - .../messages/juce_NotificationType.h | 42 - .../juce_events/native/juce_ScopedXLock.h | 50 - .../native/juce_android_Messaging.cpp | 79 - .../native/juce_ios_MessageManager.mm | 88 - .../native/juce_linux_Messaging.cpp | 398 - .../native/juce_mac_MessageManager.mm | 433 - .../native/juce_osx_MessageQueue.h | 103 - .../native/juce_win32_HiddenMessageWindow.h | 137 - .../native/juce_win32_Messaging.cpp | 224 - .../juce_events/timers/juce_MultiTimer.cpp | 105 - .../juce_events/timers/juce_MultiTimer.h | 126 - .../modules/juce_events/timers/juce_Timer.cpp | 358 - .../modules/juce_events/timers/juce_Timer.h | 135 - .../juce_graphics/colour/juce_Colour.cpp | 444 - .../juce_graphics/colour/juce_Colour.h | 360 - .../colour/juce_ColourGradient.cpp | 220 - .../colour/juce_ColourGradient.h | 181 - .../juce_graphics/colour/juce_Colours.cpp | 320 - .../juce_graphics/colour/juce_Colours.h | 107 - .../juce_graphics/colour/juce_FillType.cpp | 148 - .../juce_graphics/colour/juce_FillType.h | 149 - .../juce_graphics/colour/juce_PixelFormats.h | 604 - .../contexts/juce_GraphicsContext.cpp | 678 - .../contexts/juce_GraphicsContext.h | 730 - .../contexts/juce_LowLevelGraphicsContext.h | 101 - ...uce_LowLevelGraphicsPostScriptRenderer.cpp | 533 - .../juce_LowLevelGraphicsPostScriptRenderer.h | 121 - .../juce_LowLevelGraphicsSoftwareRenderer.cpp | 38 - .../juce_LowLevelGraphicsSoftwareRenderer.h | 56 - .../effects/juce_DropShadowEffect.cpp | 182 - .../effects/juce_DropShadowEffect.h | 110 - .../juce_graphics/effects/juce_GlowEffect.cpp | 58 - .../juce_graphics/effects/juce_GlowEffect.h | 74 - .../effects/juce_ImageEffectFilter.h | 69 - .../fonts/juce_AttributedString.cpp | 232 - .../fonts/juce_AttributedString.h | 218 - .../fonts/juce_CustomTypeface.cpp | 406 - .../juce_graphics/fonts/juce_CustomTypeface.h | 164 - .../modules/juce_graphics/fonts/juce_Font.cpp | 720 - .../modules/juce_graphics/fonts/juce_Font.h | 460 - .../fonts/juce_GlyphArrangement.cpp | 812 - .../fonts/juce_GlyphArrangement.h | 322 - .../juce_graphics/fonts/juce_TextLayout.cpp | 638 - .../juce_graphics/fonts/juce_TextLayout.h | 196 - .../juce_graphics/fonts/juce_Typeface.cpp | 260 - .../juce_graphics/fonts/juce_Typeface.h | 161 - .../geometry/juce_AffineTransform.cpp | 262 - .../geometry/juce_AffineTransform.h | 285 - .../juce_graphics/geometry/juce_BorderSize.h | 153 - .../juce_graphics/geometry/juce_EdgeTable.cpp | 831 - .../juce_graphics/geometry/juce_EdgeTable.h | 220 - .../juce_graphics/geometry/juce_Line.h | 416 - .../juce_graphics/geometry/juce_Path.cpp | 1615 -- .../juce_graphics/geometry/juce_Path.h | 804 - .../geometry/juce_PathIterator.cpp | 286 - .../geometry/juce_PathIterator.h | 113 - .../geometry/juce_PathStrokeType.cpp | 740 - .../geometry/juce_PathStrokeType.h | 204 - .../juce_graphics/geometry/juce_Point.h | 228 - .../juce_graphics/geometry/juce_Rectangle.h | 917 - .../geometry/juce_RectangleList.h | 648 - .../juce_graphics/image_formats/jpglib/README | 385 - .../image_formats/jpglib/cderror.h | 132 - .../jpglib/changes to libjpeg for JUCE.txt | 16 - .../image_formats/jpglib/jcapimin.c | 280 - .../image_formats/jpglib/jcapistd.c | 161 - .../image_formats/jpglib/jccoefct.c | 449 - .../image_formats/jpglib/jccolor.c | 459 - .../image_formats/jpglib/jcdctmgr.c | 387 - .../image_formats/jpglib/jchuff.c | 909 - .../image_formats/jpglib/jchuff.h | 52 - .../image_formats/jpglib/jcinit.c | 72 - .../image_formats/jpglib/jcmainct.c | 293 - .../image_formats/jpglib/jcmarker.c | 597 - .../image_formats/jpglib/jcmaster.c | 590 - .../image_formats/jpglib/jcomapi.c | 106 - .../image_formats/jpglib/jconfig.h | 57 - .../image_formats/jpglib/jcparam.c | 610 - .../image_formats/jpglib/jcphuff.c | 833 - .../image_formats/jpglib/jcprepct.c | 354 - .../image_formats/jpglib/jcsample.c | 519 - .../image_formats/jpglib/jctrans.c | 388 - .../image_formats/jpglib/jdapimin.c | 395 - .../image_formats/jpglib/jdapistd.c | 275 - .../image_formats/jpglib/jdatasrc.c | 212 - .../image_formats/jpglib/jdcoefct.c | 736 - .../image_formats/jpglib/jdcolor.c | 396 - .../juce_graphics/image_formats/jpglib/jdct.h | 182 - .../image_formats/jpglib/jddctmgr.c | 269 - .../image_formats/jpglib/jdhuff.c | 625 - .../image_formats/jpglib/jdhuff.h | 206 - .../image_formats/jpglib/jdinput.c | 381 - .../image_formats/jpglib/jdmainct.c | 512 - .../image_formats/jpglib/jdmarker.c | 1292 -- .../image_formats/jpglib/jdmaster.c | 557 - .../image_formats/jpglib/jdmerge.c | 400 - .../image_formats/jpglib/jdphuff.c | 642 - .../image_formats/jpglib/jdpostct.c | 290 - .../image_formats/jpglib/jdsample.c | 478 - .../image_formats/jpglib/jdtrans.c | 143 - .../image_formats/jpglib/jerror.c | 252 - .../image_formats/jpglib/jerror.h | 291 - .../image_formats/jpglib/jfdctflt.c | 168 - .../image_formats/jpglib/jfdctfst.c | 224 - .../image_formats/jpglib/jfdctint.c | 283 - .../image_formats/jpglib/jidctflt.c | 242 - .../image_formats/jpglib/jidctfst.c | 368 - .../image_formats/jpglib/jidctint.c | 389 - .../image_formats/jpglib/jidctred.c | 398 - .../image_formats/jpglib/jinclude.h | 192 - .../image_formats/jpglib/jmemmgr.c | 1118 -- .../image_formats/jpglib/jmemnobs.c | 109 - .../image_formats/jpglib/jmemsys.h | 203 - .../image_formats/jpglib/jmorecfg.h | 363 - .../image_formats/jpglib/jpegint.h | 392 - .../image_formats/jpglib/jpeglib.h | 1096 -- .../image_formats/jpglib/jquant1.c | 856 - .../image_formats/jpglib/jquant2.c | 1310 -- .../image_formats/jpglib/jutils.c | 179 - .../image_formats/jpglib/jversion.h | 14 - .../image_formats/jpglib/transupp.c | 928 - .../image_formats/jpglib/transupp.h | 135 - .../image_formats/juce_GIFLoader.cpp | 444 - .../image_formats/juce_JPEGLoader.cpp | 430 - .../image_formats/juce_PNGLoader.cpp | 546 - .../image_formats/pnglib/LICENSE | 109 - .../image_formats/pnglib/libpng_readme.txt | 2 - .../juce_graphics/image_formats/pnglib/png.c | 4295 ----- .../juce_graphics/image_formats/pnglib/png.h | 3292 ---- .../image_formats/pnglib/pngconf.h | 616 - .../image_formats/pnglib/pngerror.c | 932 - .../image_formats/pnglib/pngget.c | 1177 -- .../image_formats/pnglib/pnginfo.h | 260 - .../image_formats/pnglib/pngmem.c | 277 - .../image_formats/pnglib/pngpread.c | 1291 -- .../image_formats/pnglib/pngpriv.h | 1904 -- .../image_formats/pnglib/pngread.c | 4000 ---- .../image_formats/pnglib/pngrio.c | 118 - .../image_formats/pnglib/pngrtran.c | 5102 ----- .../image_formats/pnglib/pngrutil.c | 4459 ----- .../image_formats/pnglib/pngset.c | 1606 -- .../image_formats/pnglib/pngstruct.h | 489 - .../image_formats/pnglib/pngtrans.c | 830 - .../image_formats/pnglib/pngwio.c | 164 - .../image_formats/pnglib/pngwrite.c | 2331 --- .../image_formats/pnglib/pngwtran.c | 637 - .../image_formats/pnglib/pngwutil.c | 3020 --- .../juce_graphics/images/juce_Image.cpp | 659 - .../modules/juce_graphics/images/juce_Image.h | 533 - .../juce_graphics/images/juce_ImageCache.cpp | 176 - .../juce_graphics/images/juce_ImageCache.h | 125 - .../images/juce_ImageConvolutionKernel.cpp | 290 - .../images/juce_ImageConvolutionKernel.h | 111 - .../images/juce_ImageFileFormat.cpp | 107 - .../images/juce_ImageFileFormat.h | 216 - .../modules/juce_graphics/juce_graphics.cpp | 171 - .../modules/juce_graphics/juce_graphics.h | 113 - .../modules/juce_graphics/juce_graphics.mm | 25 - .../modules/juce_graphics/juce_module_info | 30 - .../native/juce_RenderingHelpers.h | 2682 --- .../native/juce_android_Fonts.cpp | 334 - .../native/juce_android_GraphicsContext.cpp | 60 - .../native/juce_freetype_Fonts.cpp | 455 - .../juce_graphics/native/juce_linux_Fonts.cpp | 180 - .../native/juce_mac_CoreGraphicsContext.h | 113 - .../native/juce_mac_CoreGraphicsContext.mm | 913 - .../native/juce_mac_CoreGraphicsHelpers.h | 60 - .../juce_graphics/native/juce_mac_Fonts.mm | 1321 -- .../juce_win32_Direct2DGraphicsContext.cpp | 838 - .../juce_win32_DirectWriteTypeLayout.cpp | 445 - .../native/juce_win32_DirectWriteTypeface.cpp | 307 - .../juce_graphics/native/juce_win32_Fonts.cpp | 644 - .../placement/juce_Justification.h | 189 - .../placement/juce_RectanglePlacement.cpp | 127 - .../placement/juce_RectanglePlacement.h | 172 - .../application/juce_Application.cpp | 98 - .../application/juce_Application.h | 190 - .../buttons/juce_ArrowButton.cpp | 45 - .../buttons/juce_ArrowButton.h | 64 - .../juce_gui_basics/buttons/juce_Button.cpp | 674 - .../juce_gui_basics/buttons/juce_Button.h | 514 - .../buttons/juce_DrawableButton.cpp | 221 - .../buttons/juce_DrawableButton.h | 188 - .../buttons/juce_HyperlinkButton.cpp | 109 - .../buttons/juce_HyperlinkButton.h | 114 - .../buttons/juce_ImageButton.cpp | 189 - .../buttons/juce_ImageButton.h | 160 - .../buttons/juce_ShapeButton.cpp | 114 - .../buttons/juce_ShapeButton.h | 106 - .../buttons/juce_TextButton.cpp | 70 - .../juce_gui_basics/buttons/juce_TextButton.h | 113 - .../buttons/juce_ToggleButton.cpp | 54 - .../buttons/juce_ToggleButton.h | 87 - .../buttons/juce_ToolbarButton.cpp | 107 - .../buttons/juce_ToolbarButton.h | 97 - .../commands/juce_ApplicationCommandID.h | 91 - .../commands/juce_ApplicationCommandInfo.cpp | 60 - .../commands/juce_ApplicationCommandInfo.h | 189 - .../juce_ApplicationCommandManager.cpp | 312 - .../commands/juce_ApplicationCommandManager.h | 353 - .../juce_ApplicationCommandTarget.cpp | 186 - .../commands/juce_ApplicationCommandTarget.h | 245 - .../commands/juce_KeyPressMappingSet.cpp | 412 - .../commands/juce_KeyPressMappingSet.h | 245 - .../components/juce_CachedComponentImage.h | 70 - .../components/juce_Component.cpp | 3026 --- .../components/juce_Component.h | 2384 --- .../components/juce_ComponentListener.cpp | 31 - .../components/juce_ComponentListener.h | 111 - .../components/juce_Desktop.cpp | 415 - .../juce_gui_basics/components/juce_Desktop.h | 460 - .../components/juce_ModalComponentManager.cpp | 294 - .../components/juce_ModalComponentManager.h | 369 - .../drawables/juce_Drawable.cpp | 251 - .../juce_gui_basics/drawables/juce_Drawable.h | 259 - .../drawables/juce_DrawableComposite.cpp | 327 - .../drawables/juce_DrawableComposite.h | 156 - .../drawables/juce_DrawableImage.cpp | 290 - .../drawables/juce_DrawableImage.h | 138 - .../drawables/juce_DrawablePath.cpp | 570 - .../drawables/juce_DrawablePath.h | 145 - .../drawables/juce_DrawableRectangle.cpp | 182 - .../drawables/juce_DrawableRectangle.h | 103 - .../drawables/juce_DrawableShape.cpp | 472 - .../drawables/juce_DrawableShape.h | 182 - .../drawables/juce_DrawableText.cpp | 334 - .../drawables/juce_DrawableText.h | 155 - .../drawables/juce_SVGParser.cpp | 1354 -- ...juce_DirectoryContentsDisplayComponent.cpp | 71 - .../juce_DirectoryContentsDisplayComponent.h | 111 - .../juce_DirectoryContentsList.cpp | 258 - .../filebrowser/juce_DirectoryContentsList.h | 223 - .../filebrowser/juce_FileBrowserComponent.cpp | 586 - .../filebrowser/juce_FileBrowserComponent.h | 290 - .../filebrowser/juce_FileBrowserListener.h | 57 - .../filebrowser/juce_FileChooser.cpp | 145 - .../filebrowser/juce_FileChooser.h | 197 - .../filebrowser/juce_FileChooserDialogBox.cpp | 269 - .../filebrowser/juce_FileChooserDialogBox.h | 157 - .../filebrowser/juce_FileListComponent.cpp | 257 - .../filebrowser/juce_FileListComponent.h | 96 - .../filebrowser/juce_FilePreviewComponent.h | 65 - .../juce_FileSearchPathListComponent.cpp | 264 - .../juce_FileSearchPathListComponent.h | 116 - .../filebrowser/juce_FileTreeComponent.cpp | 322 - .../filebrowser/juce_FileTreeComponent.h | 104 - .../filebrowser/juce_FilenameComponent.cpp | 267 - .../filebrowser/juce_FilenameComponent.h | 234 - .../juce_ImagePreviewComponent.cpp | 114 - .../filebrowser/juce_ImagePreviewComponent.h | 66 - .../juce_gui_basics/juce_gui_basics.cpp | 299 - .../modules/juce_gui_basics/juce_gui_basics.h | 247 - .../juce_gui_basics/juce_gui_basics.mm | 25 - .../modules/juce_gui_basics/juce_module_info | 40 - .../keyboard/juce_CaretComponent.cpp | 58 - .../keyboard/juce_CaretComponent.h | 80 - .../keyboard/juce_KeyListener.cpp | 28 - .../keyboard/juce_KeyListener.h | 76 - .../keyboard/juce_KeyPress.cpp | 299 - .../juce_gui_basics/keyboard/juce_KeyPress.h | 254 - .../keyboard/juce_KeyboardFocusTraverser.cpp | 135 - .../keyboard/juce_KeyboardFocusTraverser.h | 89 - .../keyboard/juce_ModifierKeys.cpp | 51 - .../keyboard/juce_ModifierKeys.h | 223 - .../keyboard/juce_SystemClipboard.h | 47 - .../keyboard/juce_TextEditorKeyMapper.h | 121 - .../keyboard/juce_TextInputTarget.h | 95 - .../layout/juce_AnimatedPosition.h | 209 - .../layout/juce_AnimatedPositionBehaviours.h | 151 - .../layout/juce_ComponentAnimator.cpp | 328 - .../layout/juce_ComponentAnimator.h | 161 - .../juce_ComponentBoundsConstrainer.cpp | 301 - .../layout/juce_ComponentBoundsConstrainer.h | 197 - .../layout/juce_ComponentBuilder.cpp | 280 - .../layout/juce_ComponentBuilder.h | 245 - .../layout/juce_ComponentMovementWatcher.cpp | 139 - .../layout/juce_ComponentMovementWatcher.h | 95 - .../layout/juce_ConcertinaPanel.cpp | 416 - .../layout/juce_ConcertinaPanel.h | 132 - .../layout/juce_GroupComponent.cpp | 66 - .../layout/juce_GroupComponent.h | 111 - .../layout/juce_MultiDocumentPanel.cpp | 507 - .../layout/juce_MultiDocumentPanel.h | 304 - .../layout/juce_ResizableBorderComponent.cpp | 201 - .../layout/juce_ResizableBorderComponent.h | 195 - .../layout/juce_ResizableCornerComponent.cpp | 99 - .../layout/juce_ResizableCornerComponent.h | 91 - .../layout/juce_ResizableEdgeComponent.cpp | 107 - .../layout/juce_ResizableEdgeComponent.h | 99 - .../juce_gui_basics/layout/juce_ScrollBar.cpp | 421 - .../juce_gui_basics/layout/juce_ScrollBar.h | 404 - .../layout/juce_StretchableLayoutManager.cpp | 342 - .../layout/juce_StretchableLayoutManager.h | 260 - .../juce_StretchableLayoutResizerBar.cpp | 73 - .../layout/juce_StretchableLayoutResizerBar.h | 104 - .../layout/juce_StretchableObjectResizer.cpp | 116 - .../layout/juce_StretchableObjectResizer.h | 101 - .../layout/juce_TabbedButtonBar.cpp | 579 - .../layout/juce_TabbedButtonBar.h | 369 - .../layout/juce_TabbedComponent.cpp | 307 - .../layout/juce_TabbedComponent.h | 220 - .../juce_gui_basics/layout/juce_Viewport.cpp | 463 - .../juce_gui_basics/layout/juce_Viewport.h | 287 - .../lookandfeel/juce_LookAndFeel.cpp | 150 - .../lookandfeel/juce_LookAndFeel.h | 233 - .../lookandfeel/juce_LookAndFeel_V1.cpp | 567 - .../lookandfeel/juce_LookAndFeel_V1.h | 101 - .../lookandfeel/juce_LookAndFeel_V2.cpp | 2887 --- .../lookandfeel/juce_LookAndFeel_V2.h | 350 - .../lookandfeel/juce_LookAndFeel_V3.cpp | 633 - .../lookandfeel/juce_LookAndFeel_V3.h | 96 - .../menus/juce_MenuBarComponent.cpp | 347 - .../menus/juce_MenuBarComponent.h | 118 - .../menus/juce_MenuBarModel.cpp | 84 - .../juce_gui_basics/menus/juce_MenuBarModel.h | 182 - .../juce_gui_basics/menus/juce_PopupMenu.cpp | 1770 -- .../juce_gui_basics/menus/juce_PopupMenu.h | 624 - .../misc/juce_BubbleComponent.cpp | 142 - .../misc/juce_BubbleComponent.h | 180 - .../misc/juce_DropShadower.cpp | 215 - .../juce_gui_basics/misc/juce_DropShadower.h | 80 - .../mouse/juce_ComponentDragger.cpp | 61 - .../mouse/juce_ComponentDragger.h | 99 - .../mouse/juce_DragAndDropContainer.cpp | 508 - .../mouse/juce_DragAndDropContainer.h | 187 - .../mouse/juce_DragAndDropTarget.h | 152 - .../mouse/juce_FileDragAndDropTarget.h | 104 - .../mouse/juce_LassoComponent.h | 223 - .../mouse/juce_MouseCursor.cpp | 215 - .../juce_gui_basics/mouse/juce_MouseCursor.h | 182 - .../juce_gui_basics/mouse/juce_MouseEvent.cpp | 119 - .../juce_gui_basics/mouse/juce_MouseEvent.h | 360 - .../mouse/juce_MouseInactivityDetector.cpp | 73 - .../mouse/juce_MouseInactivityDetector.h | 106 - .../mouse/juce_MouseInputSource.cpp | 685 - .../mouse/juce_MouseInputSource.h | 188 - .../mouse/juce_MouseListener.cpp | 32 - .../mouse/juce_MouseListener.h | 165 - .../mouse/juce_SelectedItemSet.h | 311 - .../mouse/juce_TextDragAndDropTarget.h | 105 - .../mouse/juce_TooltipClient.h | 85 - .../native/juce_MultiTouchMapper.h | 77 - .../native/juce_android_FileChooser.cpp | 44 - .../native/juce_android_Windowing.cpp | 839 - .../native/juce_ios_UIViewComponentPeer.mm | 1040 - .../native/juce_ios_Windowing.mm | 353 - .../native/juce_linux_Clipboard.cpp | 271 - .../native/juce_linux_FileChooser.cpp | 198 - .../native/juce_linux_Windowing.cpp | 3565 ---- .../native/juce_mac_FileChooser.mm | 268 - .../native/juce_mac_MainMenu.mm | 750 - .../native/juce_mac_MouseCursor.mm | 173 - .../native/juce_mac_NSViewComponentPeer.mm | 2031 -- .../native/juce_mac_Windowing.mm | 449 - .../native/juce_win32_DragAndDrop.cpp | 293 - .../native/juce_win32_FileChooser.cpp | 288 - .../native/juce_win32_Windowing.cpp | 3531 ---- .../positioning/juce_MarkerList.cpp | 278 - .../positioning/juce_MarkerList.h | 184 - .../positioning/juce_RelativeCoordinate.cpp | 170 - .../positioning/juce_RelativeCoordinate.h | 147 - .../juce_RelativeCoordinatePositioner.cpp | 320 - .../juce_RelativeCoordinatePositioner.h | 92 - .../juce_RelativeParallelogram.cpp | 134 - .../positioning/juce_RelativeParallelogram.h | 65 - .../positioning/juce_RelativePoint.cpp | 94 - .../positioning/juce_RelativePoint.h | 90 - .../positioning/juce_RelativePointPath.cpp | 292 - .../positioning/juce_RelativePointPath.h | 191 - .../positioning/juce_RelativeRectangle.cpp | 261 - .../positioning/juce_RelativeRectangle.h | 107 - .../juce_BooleanPropertyComponent.cpp | 85 - .../juce_BooleanPropertyComponent.h | 111 - .../juce_ButtonPropertyComponent.cpp | 46 - .../properties/juce_ButtonPropertyComponent.h | 78 - .../juce_ChoicePropertyComponent.cpp | 152 - .../properties/juce_ChoicePropertyComponent.h | 125 - .../properties/juce_PropertyComponent.cpp | 50 - .../properties/juce_PropertyComponent.h | 145 - .../properties/juce_PropertyPanel.cpp | 414 - .../properties/juce_PropertyPanel.h | 167 - .../juce_SliderPropertyComponent.cpp | 80 - .../properties/juce_SliderPropertyComponent.h | 107 - .../properties/juce_TextPropertyComponent.cpp | 134 - .../properties/juce_TextPropertyComponent.h | 109 - .../juce_gui_basics/widgets/juce_ComboBox.cpp | 648 - .../juce_gui_basics/widgets/juce_ComboBox.h | 452 - .../widgets/juce_ImageComponent.cpp | 77 - .../widgets/juce_ImageComponent.h | 78 - .../juce_gui_basics/widgets/juce_Label.cpp | 469 - .../juce_gui_basics/widgets/juce_Label.h | 351 - .../juce_gui_basics/widgets/juce_ListBox.cpp | 968 - .../juce_gui_basics/widgets/juce_ListBox.h | 589 - .../widgets/juce_ProgressBar.cpp | 111 - .../widgets/juce_ProgressBar.h | 135 - .../juce_gui_basics/widgets/juce_Slider.cpp | 1613 -- .../juce_gui_basics/widgets/juce_Slider.h | 898 - .../widgets/juce_TableHeaderComponent.cpp | 926 - .../widgets/juce_TableHeaderComponent.h | 442 - .../widgets/juce_TableListBox.cpp | 471 - .../widgets/juce_TableListBox.h | 346 - .../widgets/juce_TextEditor.cpp | 2520 --- .../juce_gui_basics/widgets/juce_TextEditor.h | 746 - .../juce_gui_basics/widgets/juce_Toolbar.cpp | 810 - .../juce_gui_basics/widgets/juce_Toolbar.h | 330 - .../widgets/juce_ToolbarItemComponent.cpp | 235 - .../widgets/juce_ToolbarItemComponent.h | 205 - .../widgets/juce_ToolbarItemFactory.h | 108 - .../widgets/juce_ToolbarItemPalette.cpp | 106 - .../widgets/juce_ToolbarItemPalette.h | 76 - .../juce_gui_basics/widgets/juce_TreeView.cpp | 1910 -- .../juce_gui_basics/widgets/juce_TreeView.h | 891 - .../windows/juce_AlertWindow.cpp | 713 - .../windows/juce_AlertWindow.h | 489 - .../windows/juce_CallOutBox.cpp | 242 - .../juce_gui_basics/windows/juce_CallOutBox.h | 182 - .../windows/juce_ComponentPeer.cpp | 591 - .../windows/juce_ComponentPeer.h | 372 - .../windows/juce_DialogWindow.cpp | 166 - .../windows/juce_DialogWindow.h | 255 - .../windows/juce_DocumentWindow.cpp | 369 - .../windows/juce_DocumentWindow.h | 295 - .../windows/juce_NativeMessageBox.h | 164 - .../windows/juce_ResizableWindow.cpp | 621 - .../windows/juce_ResizableWindow.h | 401 - .../windows/juce_ThreadWithProgressWindow.cpp | 114 - .../windows/juce_ThreadWithProgressWindow.h | 173 - .../windows/juce_TooltipWindow.cpp | 186 - .../windows/juce_TooltipWindow.h | 132 - .../windows/juce_TopLevelWindow.cpp | 353 - .../windows/juce_TopLevelWindow.h | 164 - .../juce_CPlusPlusCodeTokeniser.cpp | 71 - .../code_editor/juce_CPlusPlusCodeTokeniser.h | 71 - .../juce_CPlusPlusCodeTokeniserFunctions.h | 641 - .../code_editor/juce_CodeDocument.cpp | 990 - .../code_editor/juce_CodeDocument.h | 417 - .../code_editor/juce_CodeEditorComponent.cpp | 1658 -- .../code_editor/juce_CodeEditorComponent.h | 432 - .../code_editor/juce_CodeTokeniser.h | 58 - .../code_editor/juce_LuaCodeTokeniser.cpp | 233 - .../code_editor/juce_LuaCodeTokeniser.h | 63 - .../code_editor/juce_XMLCodeTokeniser.cpp | 166 - .../code_editor/juce_XMLCodeTokeniser.h | 62 - .../documents/juce_FileBasedDocument.cpp | 257 - .../documents/juce_FileBasedDocument.h | 294 - .../embedding/juce_ActiveXControlComponent.h | 122 - .../embedding/juce_NSViewComponent.h | 85 - .../embedding/juce_UIViewComponent.h | 86 - .../modules/juce_gui_extra/juce_gui_extra.cpp | 152 - .../modules/juce_gui_extra/juce_gui_extra.h | 79 - .../modules/juce_gui_extra/juce_gui_extra.mm | 25 - .../modules/juce_gui_extra/juce_module_info | 24 - .../misc/juce_AnimatedAppComponent.cpp | 48 - .../misc/juce_AnimatedAppComponent.h | 77 - .../juce_gui_extra/misc/juce_AppleRemote.h | 114 - .../misc/juce_BubbleMessageComponent.cpp | 118 - .../misc/juce_BubbleMessageComponent.h | 132 - .../misc/juce_ColourSelector.cpp | 576 - .../juce_gui_extra/misc/juce_ColourSelector.h | 171 - .../misc/juce_KeyMappingEditorComponent.cpp | 472 - .../misc/juce_KeyMappingEditorComponent.h | 136 - .../misc/juce_LiveConstantEditor.cpp | 474 - .../misc/juce_LiveConstantEditor.h | 303 - .../misc/juce_PreferencesPanel.cpp | 150 - .../misc/juce_PreferencesPanel.h | 148 - .../misc/juce_RecentlyOpenedFilesList.cpp | 146 - .../misc/juce_RecentlyOpenedFilesList.h | 164 - .../juce_gui_extra/misc/juce_SplashScreen.cpp | 83 - .../juce_gui_extra/misc/juce_SplashScreen.h | 155 - .../misc/juce_SystemTrayIconComponent.cpp | 36 - .../misc/juce_SystemTrayIconComponent.h | 97 - .../misc/juce_WebBrowserComponent.h | 136 - .../juce_android_WebBrowserComponent.cpp | 113 - .../native/juce_ios_UIViewComponent.mm | 127 - .../native/juce_linux_SystemTrayIcon.cpp | 142 - .../native/juce_linux_WebBrowserComponent.cpp | 118 - .../native/juce_mac_AppleRemote.mm | 263 - .../juce_mac_CarbonViewWrapperComponent.h | 332 - .../native/juce_mac_NSViewComponent.mm | 223 - .../native/juce_mac_SystemTrayIcon.cpp | 244 - .../native/juce_mac_WebBrowserComponent.mm | 414 - .../native/juce_win32_ActiveXComponent.cpp | 402 - .../native/juce_win32_SystemTrayIcon.cpp | 235 - .../native/juce_win32_WebBrowserComponent.cpp | 352 - .../geometry/juce_Draggable3DOrientation.h | 157 - .../juce_opengl/geometry/juce_Matrix3D.h | 154 - .../juce_opengl/geometry/juce_Quaternion.h | 99 - .../juce_opengl/geometry/juce_Vector3D.h | 81 - .../modules/juce_opengl/juce_module_info | 25 - .../modules/juce_opengl/juce_opengl.cpp | 212 - .../modules/juce_opengl/juce_opengl.h | 153 - .../modules/juce_opengl/juce_opengl.mm | 25 - .../native/juce_MissingGLDefinitions.h | 152 - .../native/juce_OpenGLExtensions.h | 128 - .../juce_opengl/native/juce_OpenGL_android.h | 182 - .../juce_opengl/native/juce_OpenGL_ios.h | 294 - .../juce_opengl/native/juce_OpenGL_linux.h | 195 - .../juce_opengl/native/juce_OpenGL_osx.h | 244 - .../juce_opengl/native/juce_OpenGL_win32.h | 266 - .../juce_opengl/opengl/juce_OpenGLContext.cpp | 979 - .../juce_opengl/opengl/juce_OpenGLContext.h | 288 - .../opengl/juce_OpenGLFrameBuffer.cpp | 347 - .../opengl/juce_OpenGLFrameBuffer.h | 134 - .../opengl/juce_OpenGLGraphicsContext.cpp | 1891 -- .../opengl/juce_OpenGLGraphicsContext.h | 96 - .../juce_opengl/opengl/juce_OpenGLHelpers.cpp | 103 - .../juce_opengl/opengl/juce_OpenGLHelpers.h | 73 - .../juce_opengl/opengl/juce_OpenGLImage.cpp | 206 - .../juce_opengl/opengl/juce_OpenGLImage.h | 52 - .../opengl/juce_OpenGLPixelFormat.cpp | 61 - .../opengl/juce_OpenGLPixelFormat.h | 70 - .../juce_opengl/opengl/juce_OpenGLRenderer.h | 72 - .../opengl/juce_OpenGLShaderProgram.cpp | 161 - .../opengl/juce_OpenGLShaderProgram.h | 167 - .../juce_opengl/opengl/juce_OpenGLTexture.cpp | 193 - .../juce_opengl/opengl/juce_OpenGLTexture.h | 102 - .../utils/juce_OpenGLAppComponent.cpp | 63 - .../utils/juce_OpenGLAppComponent.h | 80 - .../juce_video/capture/juce_CameraDevice.cpp | 89 - .../juce_video/capture/juce_CameraDevice.h | 161 - .../modules/juce_video/juce_module_info | 21 - .../modules/juce_video/juce_video.cpp | 146 - .../modules/juce_video/juce_video.h | 82 - .../modules/juce_video/juce_video.mm | 25 - .../native/juce_android_CameraDevice.cpp | 83 - .../native/juce_mac_CameraDevice.mm | 353 - .../juce_mac_QuickTimeMovieComponent.mm | 341 - .../native/juce_win32_CameraDevice.cpp | 792 - .../native/juce_win32_DirectShowComponent.cpp | 926 - .../juce_win32_QuickTimeMovieComponent.cpp | 483 - .../playback/juce_DirectShowComponent.h | 216 - .../playback/juce_QuickTimeMovieComponent.h | 220 - diffs/juce_ColourSelector.cpp | Bin 0 -> 5116 bytes diffs/juce_OpenGLContext.cpp | Bin 0 -> 13930 bytes diffs/juce_win32_Windowing.cpp | Bin 0 -> 11104 bytes 1179 files changed, 646 insertions(+), 441351 deletions(-) create mode 100644 JuceLibraryCode/JucePluginDefines.h create mode 100644 JuceLibraryCode/include_juce_audio_basics.cpp create mode 100644 JuceLibraryCode/include_juce_audio_basics.mm create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_AAX.cpp create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_AAX.mm create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_AAX_utils.cpp create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_ARA.cpp create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_AU_1.mm create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_AU_2.mm create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_AUv3.mm create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_LV2.cpp create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_LV2.mm create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_Standalone.cpp create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_Unity.cpp create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_VST2.cpp create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_VST2.mm create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp create mode 100644 JuceLibraryCode/include_juce_audio_plugin_client_VST3.mm create mode 100644 JuceLibraryCode/include_juce_audio_processors.cpp create mode 100644 JuceLibraryCode/include_juce_audio_processors.mm create mode 100644 JuceLibraryCode/include_juce_audio_processors_ara.cpp create mode 100644 JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp create mode 100644 JuceLibraryCode/include_juce_core.cpp create mode 100644 JuceLibraryCode/include_juce_core.mm create mode 100644 JuceLibraryCode/include_juce_core_CompilationTime.cpp create mode 100644 JuceLibraryCode/include_juce_data_structures.cpp create mode 100644 JuceLibraryCode/include_juce_data_structures.mm create mode 100644 JuceLibraryCode/include_juce_events.cpp create mode 100644 JuceLibraryCode/include_juce_events.mm create mode 100644 JuceLibraryCode/include_juce_graphics.cpp create mode 100644 JuceLibraryCode/include_juce_graphics.mm create mode 100644 JuceLibraryCode/include_juce_graphics_Harfbuzz.cpp create mode 100644 JuceLibraryCode/include_juce_graphics_Sheenbidi.c create mode 100644 JuceLibraryCode/include_juce_gui_basics.cpp create mode 100644 JuceLibraryCode/include_juce_gui_basics.mm create mode 100644 JuceLibraryCode/include_juce_gui_extra.cpp create mode 100644 JuceLibraryCode/include_juce_gui_extra.mm create mode 100644 JuceLibraryCode/include_juce_opengl.cpp create mode 100644 JuceLibraryCode/include_juce_opengl.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/format.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/lpc.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/window_flac.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/flac/win_utf8_io.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/codec.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/config_types.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/framing.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/backends.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/highlevel.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/info.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lsp.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lsp.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mapping0.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/ogg.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacResources.r delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources.rsr delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_Array.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/containers/juce_Variant.h delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_File.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_File.h delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h delete mode 100755 JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h delete mode 100755 JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h delete mode 100755 JuceLibraryCode/modules/juce_core/juce_core.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/juce_core.h delete mode 100755 JuceLibraryCode/modules/juce_core/juce_core.mm delete mode 100755 JuceLibraryCode/modules/juce_core/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h delete mode 100755 JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/logging/juce_Logger.h delete mode 100755 JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h delete mode 100755 JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/maths/juce_Expression.h delete mode 100755 JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h delete mode 100755 JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h delete mode 100755 JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/maths/juce_Random.h delete mode 100755 JuceLibraryCode/modules/juce_core/maths/juce_Range.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_Memory.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h delete mode 100755 JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h delete mode 100755 JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/misc/juce_Result.h delete mode 100755 JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h delete mode 100755 JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h delete mode 100755 JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h delete mode 100755 JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h delete mode 100755 JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h delete mode 100755 JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/network/juce_Socket.h delete mode 100755 JuceLibraryCode/modules/juce_core/network/juce_URL.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/network/juce_URL.h delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h delete mode 100755 JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h delete mode 100755 JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h delete mode 100755 JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h delete mode 100755 JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h delete mode 100755 JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_Identifier.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_NewLine.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_String.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_String.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_StringArray.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_StringPool.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_StringRef.h delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_Process.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_Thread.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h delete mode 100755 JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h delete mode 100755 JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h delete mode 100755 JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h delete mode 100755 JuceLibraryCode/modules/juce_core/time/juce_Time.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/time/juce_Time.h delete mode 100755 JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h delete mode 100755 JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h delete mode 100755 JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp delete mode 100755 JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/README delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/adler32.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/compress.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/crc32.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/crc32.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/deflate.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/deflate.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/infback.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/inffast.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/inffast.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/inffixed.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/inflate.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/inflate.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/trees.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/trees.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/uncompr.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/zconf.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/zconf.in.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/zlib.h delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/zutil.c delete mode 100755 JuceLibraryCode/modules/juce_core/zip/zlib/zutil.h delete mode 100755 JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.cpp delete mode 100755 JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.h delete mode 100755 JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.cpp delete mode 100755 JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h delete mode 100755 JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.cpp delete mode 100755 JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.h delete mode 100755 JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.cpp delete mode 100755 JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.h delete mode 100755 JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.cpp delete mode 100755 JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.h delete mode 100755 JuceLibraryCode/modules/juce_cryptography/hashing/juce_Whirlpool.cpp delete mode 100755 JuceLibraryCode/modules/juce_cryptography/hashing/juce_Whirlpool.h delete mode 100755 JuceLibraryCode/modules/juce_cryptography/juce_cryptography.cpp delete mode 100755 JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h delete mode 100755 JuceLibraryCode/modules/juce_cryptography/juce_cryptography.mm delete mode 100755 JuceLibraryCode/modules/juce_cryptography/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp delete mode 100755 JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h delete mode 100755 JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp delete mode 100755 JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h delete mode 100755 JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp delete mode 100755 JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h delete mode 100755 JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm delete mode 100755 JuceLibraryCode/modules/juce_data_structures/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp delete mode 100755 JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h delete mode 100755 JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h delete mode 100755 JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp delete mode 100755 JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h delete mode 100755 JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp delete mode 100755 JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h delete mode 100755 JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h delete mode 100755 JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h delete mode 100755 JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h delete mode 100755 JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h delete mode 100755 JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h delete mode 100755 JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h delete mode 100755 JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h delete mode 100755 JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h delete mode 100755 JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h delete mode 100755 JuceLibraryCode/modules/juce_events/juce_events.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/juce_events.h delete mode 100755 JuceLibraryCode/modules/juce_events/juce_events.mm delete mode 100755 JuceLibraryCode/modules/juce_events/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_Message.h delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h delete mode 100755 JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h delete mode 100755 JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h delete mode 100755 JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm delete mode 100755 JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm delete mode 100755 JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h delete mode 100755 JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h delete mode 100755 JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h delete mode 100755 JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp delete mode 100755 JuceLibraryCode/modules/juce_events/timers/juce_Timer.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/README delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/cderror.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapimin.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapistd.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccoefct.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccolor.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcdctmgr.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcinit.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmainct.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmarker.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmaster.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcomapi.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jconfig.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcparam.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcphuff.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcprepct.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcsample.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jctrans.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapimin.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapistd.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdatasrc.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcoefct.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcolor.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdct.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jddctmgr.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdinput.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmainct.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmarker.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmaster.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmerge.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdphuff.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdpostct.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdsample.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdtrans.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctflt.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctfst.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctint.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctflt.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctfst.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctint.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctred.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemmgr.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemnobs.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemsys.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmorecfg.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpegint.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpeglib.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant1.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant2.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jutils.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jversion.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/LICENSE delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/libpng_readme.txt delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngconf.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngerror.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngget.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pnginfo.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngmem.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpread.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpriv.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngread.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrio.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrtran.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrutil.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngset.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngstruct.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngtrans.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwio.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwrite.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwtran.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwutil.c delete mode 100755 JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/images/juce_Image.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/juce_graphics.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/juce_graphics.mm delete mode 100755 JuceLibraryCode/modules/juce_graphics/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h delete mode 100755 JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp delete mode 100755 JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooser.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileChooserDialogBox.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileListComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileTreeComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_ImagePreviewComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/juce_gui_basics.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_CaretComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyListener.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyPress.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_KeyboardFocusTraverser.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_ModifierKeys.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_SystemClipboard.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextEditorKeyMapper.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/keyboard/juce_TextInputTarget.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPosition.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_AnimatedPositionBehaviours.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentAnimator.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBoundsConstrainer.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentBuilder.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ConcertinaPanel.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_GroupComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableBorderComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableCornerComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ResizableEdgeComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_ScrollBar.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutManager.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_StretchableObjectResizer.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedButtonBar.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_TabbedComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/layout/juce_Viewport.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V3.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/menus/juce_MenuBarModel.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/menus/juce_PopupMenu.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/misc/juce_BubbleComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/misc/juce_DropShadower.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_ComponentDragger.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_DragAndDropTarget.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_FileDragAndDropTarget.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_LassoComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseCursor.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseEvent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInactivityDetector.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseInputSource.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_MouseListener.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_SelectedItemSet.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TextDragAndDropTarget.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/mouse/juce_TooltipClient.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_MultiTouchMapper.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_android_FileChooser.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_android_Windowing.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_ios_Windowing.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Clipboard.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_FileChooser.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_linux_Windowing.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_FileChooser.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MainMenu.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_MouseCursor.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_mac_Windowing.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_DragAndDrop.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_FileChooser.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/native/juce_win32_Windowing.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_MarkerList.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinate.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeParallelogram.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePoint.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativePointPath.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/positioning/juce_RelativeRectangle.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_BooleanPropertyComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_ButtonPropertyComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_PropertyPanel.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/properties/juce_TextPropertyComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ComboBox.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ImageComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Label.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ListBox.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ProgressBar.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Slider.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TableListBox.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TextEditor.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_Toolbar.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemFactory.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_ToolbarItemPalette.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/widgets/juce_TreeView.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_AlertWindow.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_CallOutBox.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_ComponentPeer.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_DialogWindow.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_DocumentWindow.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_NativeMessageBox.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_ResizableWindow.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_ThreadWithProgressWindow.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_TooltipWindow.h delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_basics/windows/juce_TopLevelWindow.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniser.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CPlusPlusCodeTokeniserFunctions.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeDocument.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_CodeTokeniser.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_LuaCodeTokeniser.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/documents/juce_FileBasedDocument.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/embedding/juce_ActiveXControlComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/embedding/juce_NSViewComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/embedding/juce_UIViewComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/juce_gui_extra.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_AnimatedAppComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_AppleRemote.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_BubbleMessageComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_ColourSelector.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_KeyMappingEditorComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_LiveConstantEditor.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_PreferencesPanel.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_RecentlyOpenedFilesList.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_SplashScreen.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/misc/juce_WebBrowserComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_ios_UIViewComponent.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_linux_WebBrowserComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_AppleRemote.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_NSViewComponent.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_ActiveXComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_SystemTrayIcon.cpp delete mode 100755 JuceLibraryCode/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/geometry/juce_Draggable3DOrientation.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/geometry/juce_Matrix3D.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/geometry/juce_Quaternion.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/geometry/juce_Vector3D.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_opengl/juce_opengl.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/juce_opengl.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/juce_opengl.mm delete mode 100755 JuceLibraryCode/modules/juce_opengl/native/juce_MissingGLDefinitions.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/native/juce_OpenGLExtensions.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_android.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_ios.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_linux.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_osx.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/native/juce_OpenGL_win32.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLContext.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLFrameBuffer.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLHelpers.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLImage.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLRenderer.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLShaderProgram.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/opengl/juce_OpenGLTexture.h delete mode 100755 JuceLibraryCode/modules/juce_opengl/utils/juce_OpenGLAppComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_opengl/utils/juce_OpenGLAppComponent.h delete mode 100755 JuceLibraryCode/modules/juce_video/capture/juce_CameraDevice.cpp delete mode 100755 JuceLibraryCode/modules/juce_video/capture/juce_CameraDevice.h delete mode 100755 JuceLibraryCode/modules/juce_video/juce_module_info delete mode 100755 JuceLibraryCode/modules/juce_video/juce_video.cpp delete mode 100755 JuceLibraryCode/modules/juce_video/juce_video.h delete mode 100755 JuceLibraryCode/modules/juce_video/juce_video.mm delete mode 100755 JuceLibraryCode/modules/juce_video/native/juce_android_CameraDevice.cpp delete mode 100755 JuceLibraryCode/modules/juce_video/native/juce_mac_CameraDevice.mm delete mode 100755 JuceLibraryCode/modules/juce_video/native/juce_mac_QuickTimeMovieComponent.mm delete mode 100755 JuceLibraryCode/modules/juce_video/native/juce_win32_CameraDevice.cpp delete mode 100755 JuceLibraryCode/modules/juce_video/native/juce_win32_DirectShowComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_video/native/juce_win32_QuickTimeMovieComponent.cpp delete mode 100755 JuceLibraryCode/modules/juce_video/playback/juce_DirectShowComponent.h delete mode 100755 JuceLibraryCode/modules/juce_video/playback/juce_QuickTimeMovieComponent.h create mode 100644 diffs/juce_ColourSelector.cpp create mode 100644 diffs/juce_OpenGLContext.cpp create mode 100644 diffs/juce_win32_Windowing.cpp diff --git a/JuceLibraryCode/AppConfig.h b/JuceLibraryCode/AppConfig.h index 6774d60..ba585bc 100644 --- a/JuceLibraryCode/AppConfig.h +++ b/JuceLibraryCode/AppConfig.h @@ -4,15 +4,14 @@ project - if you alter its contents, your changes may be overwritten! There's a section below where you can add your own custom code safely, and the - Introjucer will preserve the contents of that block, but the best way to change - any of these definitions is by using the Introjucer's project settings. + Projucer will preserve the contents of that block, but the best way to change + any of these definitions is by using the Projucer's project settings. Any commented-out settings will assume their default values. */ -#ifndef __JUCE_APPCONFIG_RFTOVS__ -#define __JUCE_APPCONFIG_RFTOVS__ +#pragma once //============================================================================== // [BEGIN_USER_CODE_SECTION] @@ -28,322 +27,202 @@ #endif // [END_USER_CODE_SECTION] -//============================================================================== +#include "JucePluginDefines.h" -#ifdef _MSC_VER -#pragma warning(disable:4458) -#pragma warning(disable:4459) -#pragma warning(disable:4456) -#pragma warning(disable:4457) -#pragma warning(disable:4244) -#pragma warning(disable:4996) -#endif +#define JUCE_PROJUCER_VERSION 0x80006 +//============================================================================== #define JUCE_MODULE_AVAILABLE_juce_audio_basics 1 -#define JUCE_MODULE_AVAILABLE_juce_audio_devices 1 -#define JUCE_MODULE_AVAILABLE_juce_audio_formats 1 #define JUCE_MODULE_AVAILABLE_juce_audio_plugin_client 1 #define JUCE_MODULE_AVAILABLE_juce_audio_processors 1 #define JUCE_MODULE_AVAILABLE_juce_core 1 -#define JUCE_MODULE_AVAILABLE_juce_cryptography 1 #define JUCE_MODULE_AVAILABLE_juce_data_structures 1 #define JUCE_MODULE_AVAILABLE_juce_events 1 #define JUCE_MODULE_AVAILABLE_juce_graphics 1 #define JUCE_MODULE_AVAILABLE_juce_gui_basics 1 #define JUCE_MODULE_AVAILABLE_juce_gui_extra 1 #define JUCE_MODULE_AVAILABLE_juce_opengl 1 -#define JUCE_MODULE_AVAILABLE_juce_video 1 + +#define JUCE_GLOBAL_MODULE_SETTINGS_INCLUDED 1 //============================================================================== -// juce_audio_devices flags: +// juce_audio_plugin_client flags: -#ifndef JUCE_ASIO - //#define JUCE_ASIO +#ifndef JUCE_VST3_CAN_REPLACE_VST2 + //#define JUCE_VST3_CAN_REPLACE_VST2 1 #endif -#ifndef JUCE_WASAPI - //#define JUCE_WASAPI +#ifndef JUCE_FORCE_USE_LEGACY_PARAM_IDS + #define JUCE_FORCE_USE_LEGACY_PARAM_IDS 1 #endif -#ifndef JUCE_WASAPI_EXCLUSIVE - //#define JUCE_WASAPI_EXCLUSIVE +#ifndef JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE + #define JUCE_FORCE_LEGACY_PARAMETER_AUTOMATION_TYPE 1 #endif -#ifndef JUCE_DIRECTSOUND - //#define JUCE_DIRECTSOUND +#ifndef JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS + //#define JUCE_USE_STUDIO_ONE_COMPATIBLE_PARAMETERS 1 #endif -#ifndef JUCE_ALSA - //#define JUCE_ALSA +#ifndef JUCE_AU_WRAPPERS_SAVE_PROGRAM_STATES + //#define JUCE_AU_WRAPPERS_SAVE_PROGRAM_STATES 0 #endif -#ifndef JUCE_JACK - //#define JUCE_JACK +#ifndef JUCE_STANDALONE_FILTER_WINDOW_USE_KIOSK_MODE + #define JUCE_STANDALONE_FILTER_WINDOW_USE_KIOSK_MODE 1 #endif -#ifndef JUCE_USE_ANDROID_OPENSLES - //#define JUCE_USE_ANDROID_OPENSLES +//============================================================================== +// juce_audio_processors flags: + +#ifndef JUCE_PLUGINHOST_VST + //#define JUCE_PLUGINHOST_VST 0 #endif -#ifndef JUCE_USE_CDREADER - //#define JUCE_USE_CDREADER +#ifndef JUCE_PLUGINHOST_VST3 + //#define JUCE_PLUGINHOST_VST3 0 #endif -#ifndef JUCE_USE_CDBURNER - //#define JUCE_USE_CDBURNER +#ifndef JUCE_PLUGINHOST_AU + //#define JUCE_PLUGINHOST_AU 0 #endif -//============================================================================== -// juce_audio_formats flags: +#ifndef JUCE_PLUGINHOST_LADSPA + //#define JUCE_PLUGINHOST_LADSPA 0 +#endif -#ifndef JUCE_USE_FLAC - //#define JUCE_USE_FLAC +#ifndef JUCE_PLUGINHOST_LV2 + //#define JUCE_PLUGINHOST_LV2 0 #endif -#ifndef JUCE_USE_OGGVORBIS - //#define JUCE_USE_OGGVORBIS +#ifndef JUCE_PLUGINHOST_ARA + //#define JUCE_PLUGINHOST_ARA 0 #endif -#ifndef JUCE_USE_MP3AUDIOFORMAT - //#define JUCE_USE_MP3AUDIOFORMAT +#ifndef JUCE_CUSTOM_VST3_SDK + //#define JUCE_CUSTOM_VST3_SDK 0 #endif -#ifndef JUCE_USE_LAME_AUDIO_FORMAT - //#define JUCE_USE_LAME_AUDIO_FORMAT +//============================================================================== +// juce_core flags: + +#ifndef JUCE_FORCE_DEBUG + //#define JUCE_FORCE_DEBUG 0 #endif -#ifndef JUCE_USE_WINDOWS_MEDIA_FORMAT - //#define JUCE_USE_WINDOWS_MEDIA_FORMAT +#ifndef JUCE_LOG_ASSERTIONS + //#define JUCE_LOG_ASSERTIONS 0 #endif -//============================================================================== -// juce_audio_processors flags: +#ifndef JUCE_CHECK_MEMORY_LEAKS + //#define JUCE_CHECK_MEMORY_LEAKS 1 +#endif -#ifndef JUCE_PLUGINHOST_VST - //#define JUCE_PLUGINHOST_VST +#ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES + //#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES 0 #endif -#ifndef JUCE_PLUGINHOST_VST3 - //#define JUCE_PLUGINHOST_VST3 +#ifndef JUCE_INCLUDE_ZLIB_CODE + #define JUCE_INCLUDE_ZLIB_CODE 0 #endif -#ifndef JUCE_PLUGINHOST_AU - //#define JUCE_PLUGINHOST_AU +#ifndef JUCE_USE_CURL + #define JUCE_USE_CURL 0 #endif -//============================================================================== -// juce_core flags: +#ifndef JUCE_LOAD_CURL_SYMBOLS_LAZILY + //#define JUCE_LOAD_CURL_SYMBOLS_LAZILY 0 +#endif -#ifndef JUCE_FORCE_DEBUG - //#define JUCE_FORCE_DEBUG +#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS + //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 0 #endif -#ifndef JUCE_LOG_ASSERTIONS - //#define JUCE_LOG_ASSERTIONS +#ifndef JUCE_ALLOW_STATIC_NULL_VARIABLES + //#define JUCE_ALLOW_STATIC_NULL_VARIABLES 0 #endif -#ifndef JUCE_CHECK_MEMORY_LEAKS - //#define JUCE_CHECK_MEMORY_LEAKS +#ifndef JUCE_STRICT_REFCOUNTEDPOINTER + //#define JUCE_STRICT_REFCOUNTEDPOINTER 0 #endif -#ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES - //#define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES +#ifndef JUCE_ENABLE_ALLOCATION_HOOKS + //#define JUCE_ENABLE_ALLOCATION_HOOKS 0 #endif -#ifndef JUCE_INCLUDE_ZLIB_CODE - //#define JUCE_INCLUDE_ZLIB_CODE +//============================================================================== +// juce_events flags: + +#ifndef JUCE_EXECUTE_APP_SUSPEND_ON_BACKGROUND_TASK + //#define JUCE_EXECUTE_APP_SUSPEND_ON_BACKGROUND_TASK 0 #endif //============================================================================== // juce_graphics flags: #ifndef JUCE_USE_COREIMAGE_LOADER - //#define JUCE_USE_COREIMAGE_LOADER + //#define JUCE_USE_COREIMAGE_LOADER 1 #endif -#ifndef JUCE_USE_DIRECTWRITE - //#define JUCE_USE_DIRECTWRITE +#ifndef JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING + //#define JUCE_DISABLE_COREGRAPHICS_FONT_SMOOTHING 0 #endif //============================================================================== // juce_gui_basics flags: #ifndef JUCE_ENABLE_REPAINT_DEBUGGING - //#define JUCE_ENABLE_REPAINT_DEBUGGING + //#define JUCE_ENABLE_REPAINT_DEBUGGING 0 #endif -#ifndef JUCE_USE_XSHM - //#define JUCE_USE_XSHM +#ifndef JUCE_USE_XRANDR + //#define JUCE_USE_XRANDR 1 #endif -#ifndef JUCE_USE_XRENDER - //#define JUCE_USE_XRENDER +#ifndef JUCE_USE_XINERAMA + //#define JUCE_USE_XINERAMA 1 #endif -#ifndef JUCE_USE_XCURSOR - //#define JUCE_USE_XCURSOR +#ifndef JUCE_USE_XSHM + //#define JUCE_USE_XSHM 1 #endif -//============================================================================== -// juce_gui_extra flags: +#ifndef JUCE_USE_XRENDER + //#define JUCE_USE_XRENDER 0 +#endif -#ifndef JUCE_WEB_BROWSER - //#define JUCE_WEB_BROWSER +#ifndef JUCE_USE_XCURSOR + //#define JUCE_USE_XCURSOR 1 #endif -#ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR - //#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR +#ifndef JUCE_WIN_PER_MONITOR_DPI_AWARE + //#define JUCE_WIN_PER_MONITOR_DPI_AWARE 1 #endif //============================================================================== -// juce_video flags: +// juce_gui_extra flags: -#ifndef JUCE_DIRECTSHOW - //#define JUCE_DIRECTSHOW +#ifndef JUCE_WEB_BROWSER + //#define JUCE_WEB_BROWSER 1 #endif -#ifndef JUCE_MEDIAFOUNDATION - //#define JUCE_MEDIAFOUNDATION +#ifndef JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING + //#define JUCE_USE_WIN_WEBVIEW2_WITH_STATIC_LINKING 0 #endif -#ifndef JUCE_QUICKTIME - #define JUCE_QUICKTIME 0 +#ifndef JUCE_USE_WIN_WEBVIEW2 + //#define JUCE_USE_WIN_WEBVIEW2 0 #endif -#ifndef JUCE_USE_CAMERA - //#define JUCE_USE_CAMERA +#ifndef JUCE_ENABLE_LIVE_CONSTANT_EDITOR + //#define JUCE_ENABLE_LIVE_CONSTANT_EDITOR 0 #endif - //============================================================================== -// Audio plugin settings.. - -#ifndef JucePlugin_Build_VST - #define JucePlugin_Build_VST 1 -#endif -#ifndef JucePlugin_Build_VST3 - #define JucePlugin_Build_VST3 1 -#endif -#ifndef JucePlugin_Build_AU - #define JucePlugin_Build_AU 1 -#endif -#ifndef JucePlugin_Build_RTAS - #define JucePlugin_Build_RTAS 0 -#endif -#ifndef JucePlugin_Build_AAX - #define JucePlugin_Build_AAX 0 -#endif -#ifndef JucePlugin_Name - #define JucePlugin_Name "Signalizer" -#endif -#ifndef JucePlugin_Desc - #define JucePlugin_Desc "Inspect audio." -#endif -#ifndef JucePlugin_Manufacturer - #define JucePlugin_Manufacturer "Lightbridge" -#endif -#ifndef JucePlugin_ManufacturerWebsite - #define JucePlugin_ManufacturerWebsite "www.jthorborg.com" -#endif -#ifndef JucePlugin_ManufacturerEmail - #define JucePlugin_ManufacturerEmail "contact@jthorborg.com" -#endif -#ifndef JucePlugin_ManufacturerCode - #define JucePlugin_ManufacturerCode 'LbJt' -#endif -#ifndef JucePlugin_PluginCode - #define JucePlugin_PluginCode 'Sign' -#endif -#ifndef JucePlugin_MaxNumInputChannels - #define JucePlugin_MaxNumInputChannels 2 -#endif -#ifndef JucePlugin_MaxNumOutputChannels - #define JucePlugin_MaxNumOutputChannels 2 -#endif -#ifndef JucePlugin_PreferredChannelConfigurations - #define JucePlugin_PreferredChannelConfigurations {1, 1}, {2, 2} -#endif -#ifndef JucePlugin_IsSynth - #define JucePlugin_IsSynth 0 -#endif -#ifndef JucePlugin_WantsMidiInput - #define JucePlugin_WantsMidiInput 0 -#endif -#ifndef JucePlugin_ProducesMidiOutput - #define JucePlugin_ProducesMidiOutput 0 -#endif -#ifndef JucePlugin_SilenceInProducesSilenceOut - #define JucePlugin_SilenceInProducesSilenceOut 1 -#endif -#ifndef JucePlugin_EditorRequiresKeyboardFocus - #define JucePlugin_EditorRequiresKeyboardFocus 0 +#ifndef JUCE_STANDALONE_APPLICATION + #if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone) + #define JUCE_STANDALONE_APPLICATION JucePlugin_Build_Standalone + #else + #define JUCE_STANDALONE_APPLICATION 0 + #endif #endif -#ifndef JucePlugin_Version - #define JucePlugin_Version SIGNALIZER_MAJOR.SIGNALIZER_MINOR.SIGNALIZER_BUILD -#endif -#ifndef JucePlugin_VersionCode - #define JucePlugin_VersionCode SIGNALIZER_VST_VERSION_HEX - //#define JucePlugin_VersionCode 0x000207 -#endif -#ifndef JucePlugin_VersionString - #define JucePlugin_VersionString SIGNALIZER_VERSION_STRING -#endif -#ifndef JucePlugin_VSTUniqueID - #define JucePlugin_VSTUniqueID JucePlugin_PluginCode -#endif -#ifndef JucePlugin_VSTCategory - #define JucePlugin_VSTCategory kPlugCategEffect -#endif -#ifndef JucePlugin_AUMainType - #define JucePlugin_AUMainType kAudioUnitType_Effect -#endif -#ifndef JucePlugin_AUSubType - #define JucePlugin_AUSubType JucePlugin_PluginCode -#endif -#ifndef JucePlugin_AUExportPrefix - #define JucePlugin_AUExportPrefix SignalizerAU -#endif -#ifndef JucePlugin_AUExportPrefixQuoted - #define JucePlugin_AUExportPrefixQuoted "SignalizerAU" -#endif -#ifndef JucePlugin_AUManufacturerCode - #define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode -#endif -#ifndef JucePlugin_CFBundleIdentifier - #define JucePlugin_CFBundleIdentifier com.Lightbridge.Signalizer -#endif -#ifndef JucePlugin_RTASCategory - #define JucePlugin_RTASCategory ePlugInCategory_None -#endif -#ifndef JucePlugin_RTASManufacturerCode - #define JucePlugin_RTASManufacturerCode JucePlugin_ManufacturerCode -#endif -#ifndef JucePlugin_RTASProductId - #define JucePlugin_RTASProductId JucePlugin_PluginCode -#endif -#ifndef JucePlugin_RTASDisableBypass - #define JucePlugin_RTASDisableBypass 0 -#endif -#ifndef JucePlugin_RTASDisableMultiMono - #define JucePlugin_RTASDisableMultiMono 0 -#endif -#ifndef JucePlugin_AAXIdentifier - #define JucePlugin_AAXIdentifier com.Lightbridge.Signalizer -#endif -#ifndef JucePlugin_AAXManufacturerCode - #define JucePlugin_AAXManufacturerCode JucePlugin_ManufacturerCode -#endif -#ifndef JucePlugin_AAXProductId - #define JucePlugin_AAXProductId JucePlugin_PluginCode -#endif -#ifndef JucePlugin_AAXCategory - #define JucePlugin_AAXCategory AAX_ePlugInCategory_Dynamics -#endif -#ifndef JucePlugin_AAXDisableBypass - #define JucePlugin_AAXDisableBypass 0 -#endif -#ifndef JucePlugin_AAXDisableMultiMono - #define JucePlugin_AAXDisableMultiMono 0 -#endif - -#endif // __JUCE_APPCONFIG_RFTOVS__ diff --git a/JuceLibraryCode/JuceHeader.h b/JuceLibraryCode/JuceHeader.h index d50e5e1..3ce11b9 100644 --- a/JuceLibraryCode/JuceHeader.h +++ b/JuceLibraryCode/JuceHeader.h @@ -10,24 +10,30 @@ */ -#ifndef __APPHEADERFILE_RFTOVS__ -#define __APPHEADERFILE_RFTOVS__ +#pragma once #include "AppConfig.h" -#include "modules/juce_audio_basics/juce_audio_basics.h" -#include "modules/juce_audio_devices/juce_audio_devices.h" -#include "modules/juce_audio_formats/juce_audio_formats.h" -#include "modules/juce_audio_plugin_client/juce_audio_plugin_client.h" -#include "modules/juce_audio_processors/juce_audio_processors.h" -#include "modules/juce_core/juce_core.h" -#include "modules/juce_cryptography/juce_cryptography.h" -#include "modules/juce_data_structures/juce_data_structures.h" -#include "modules/juce_events/juce_events.h" -#include "modules/juce_graphics/juce_graphics.h" -#include "modules/juce_gui_basics/juce_gui_basics.h" -#include "modules/juce_gui_extra/juce_gui_extra.h" -#include "modules/juce_opengl/juce_opengl.h" -#include "modules/juce_video/juce_video.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#if defined (JUCE_PROJUCER_VERSION) && JUCE_PROJUCER_VERSION < JUCE_VERSION + /** If you've hit this error then the version of the Projucer that was used to generate this project is + older than the version of the JUCE modules being included. To fix this error, re-save your project + using the latest version of the Projucer or, if you aren't using the Projucer to manage your project, + remove the JUCE_PROJUCER_VERSION define. + */ + #error "This project was last saved using an outdated version of the Projucer! Re-save this project with the latest version to fix this error." +#endif #if ! DONT_SET_USING_JUCE_NAMESPACE // If your code uses a lot of JUCE classes, then this will obviously save you @@ -35,11 +41,12 @@ using namespace juce; #endif +#if ! JUCE_DONT_DECLARE_PROJECTINFO namespace ProjectInfo { const char* const projectName = "Signalizer"; - const char* const versionString = "0.1.0"; - const int versionNumber = 0x100; + const char* const companyName = "Lightbridge"; + const char* const versionString = "0.5.0"; + const int versionNumber = 0x500; } - -#endif // __APPHEADERFILE_RFTOVS__ +#endif diff --git a/JuceLibraryCode/JucePluginDefines.h b/JuceLibraryCode/JucePluginDefines.h new file mode 100644 index 0000000..858a4e6 --- /dev/null +++ b/JuceLibraryCode/JucePluginDefines.h @@ -0,0 +1,171 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#pragma once + +//============================================================================== +// Audio plugin settings.. + +#ifndef JucePlugin_Build_VST + #define JucePlugin_Build_VST 1 +#endif +#ifndef JucePlugin_Build_VST3 + #define JucePlugin_Build_VST3 1 +#endif +#ifndef JucePlugin_Build_AU + #define JucePlugin_Build_AU 1 +#endif +#ifndef JucePlugin_Build_AUv3 + #define JucePlugin_Build_AUv3 0 +#endif +#ifndef JucePlugin_Build_AAX + #define JucePlugin_Build_AAX 0 +#endif +#ifndef JucePlugin_Build_Standalone + #define JucePlugin_Build_Standalone 0 +#endif +#ifndef JucePlugin_Build_Unity + #define JucePlugin_Build_Unity 0 +#endif +#ifndef JucePlugin_Build_LV2 + #define JucePlugin_Build_LV2 0 +#endif +#ifndef JucePlugin_Enable_IAA + #define JucePlugin_Enable_IAA 0 +#endif +#ifndef JucePlugin_Enable_ARA + #define JucePlugin_Enable_ARA 0 +#endif +#ifndef JucePlugin_Name + #define JucePlugin_Name "Signalizer" +#endif +#ifndef JucePlugin_Desc + #define JucePlugin_Desc "Inspect and visualize audio" +#endif +#ifndef JucePlugin_Manufacturer + #define JucePlugin_Manufacturer "Lightbridge" +#endif +#ifndef JucePlugin_ManufacturerWebsite + #define JucePlugin_ManufacturerWebsite "www.jthorborg.com" +#endif +#ifndef JucePlugin_ManufacturerEmail + #define JucePlugin_ManufacturerEmail "contact@jthorborg.com" +#endif +#ifndef JucePlugin_ManufacturerCode + #define JucePlugin_ManufacturerCode 0x4c624a74 +#endif +#ifndef JucePlugin_PluginCode + #define JucePlugin_PluginCode 0x5369676e +#endif +#ifndef JucePlugin_IsSynth + #define JucePlugin_IsSynth 0 +#endif +#ifndef JucePlugin_WantsMidiInput + #define JucePlugin_WantsMidiInput 0 +#endif +#ifndef JucePlugin_ProducesMidiOutput + #define JucePlugin_ProducesMidiOutput 0 +#endif +#ifndef JucePlugin_IsMidiEffect + #define JucePlugin_IsMidiEffect 0 +#endif +#ifndef JucePlugin_EditorRequiresKeyboardFocus + #define JucePlugin_EditorRequiresKeyboardFocus 0 +#endif +#ifndef JucePlugin_Version + #define JucePlugin_Version 0.5.0 +#endif +#ifndef JucePlugin_VersionCode + #define JucePlugin_VersionCode 0x500 +#endif +#ifndef JucePlugin_VersionString + #define JucePlugin_VersionString "0.5.0" +#endif +#ifndef JucePlugin_VSTUniqueID + #define JucePlugin_VSTUniqueID JucePlugin_PluginCode +#endif +#ifndef JucePlugin_VSTCategory + #define JucePlugin_VSTCategory kPlugCategEffect +#endif +#ifndef JucePlugin_Vst3Category + #define JucePlugin_Vst3Category "Fx|Analyzer" +#endif +#ifndef JucePlugin_AUMainType + #define JucePlugin_AUMainType 'aufx' +#endif +#ifndef JucePlugin_AUSubType + #define JucePlugin_AUSubType JucePlugin_PluginCode +#endif +#ifndef JucePlugin_AUExportPrefix + #define JucePlugin_AUExportPrefix SignalizerAU +#endif +#ifndef JucePlugin_AUExportPrefixQuoted + #define JucePlugin_AUExportPrefixQuoted "SignalizerAU" +#endif +#ifndef JucePlugin_AUManufacturerCode + #define JucePlugin_AUManufacturerCode JucePlugin_ManufacturerCode +#endif +#ifndef JucePlugin_CFBundleIdentifier + #define JucePlugin_CFBundleIdentifier com.Lightbridge.Signalizer +#endif +#ifndef JucePlugin_AAXIdentifier + #define JucePlugin_AAXIdentifier com.Lightbridge.Signalizer +#endif +#ifndef JucePlugin_AAXManufacturerCode + #define JucePlugin_AAXManufacturerCode JucePlugin_ManufacturerCode +#endif +#ifndef JucePlugin_AAXProductId + #define JucePlugin_AAXProductId JucePlugin_PluginCode +#endif +#ifndef JucePlugin_AAXCategory + #define JucePlugin_AAXCategory 8192 +#endif +#ifndef JucePlugin_AAXDisableBypass + #define JucePlugin_AAXDisableBypass 0 +#endif +#ifndef JucePlugin_AAXDisableMultiMono + #define JucePlugin_AAXDisableMultiMono 0 +#endif +#ifndef JucePlugin_IAAType + #define JucePlugin_IAAType 0x61757278 +#endif +#ifndef JucePlugin_IAASubType + #define JucePlugin_IAASubType JucePlugin_PluginCode +#endif +#ifndef JucePlugin_IAAName + #define JucePlugin_IAAName "Lightbridge: Signalizer" +#endif +#ifndef JucePlugin_VSTNumMidiInputs + #define JucePlugin_VSTNumMidiInputs 16 +#endif +#ifndef JucePlugin_VSTNumMidiOutputs + #define JucePlugin_VSTNumMidiOutputs 16 +#endif +#ifndef JucePlugin_ARAContentTypes + #define JucePlugin_ARAContentTypes 0 +#endif +#ifndef JucePlugin_ARATransformationFlags + #define JucePlugin_ARATransformationFlags 0 +#endif +#ifndef JucePlugin_ARAFactoryID + #define JucePlugin_ARAFactoryID "com.Lightbridge.Signalizer.factory" +#endif +#ifndef JucePlugin_ARADocumentArchiveID + #define JucePlugin_ARADocumentArchiveID "com.Lightbridge.Signalizer.aradocumentarchive.0.5.0" +#endif +#ifndef JucePlugin_ARACompatibleArchiveIDs + #define JucePlugin_ARACompatibleArchiveIDs "" +#endif +#ifndef JucePlugin_MaxNumInputChannels + #define JucePlugin_MaxNumInputChannels 2 +#endif +#ifndef JucePlugin_MaxNumOutputChannels + #define JucePlugin_MaxNumOutputChannels 2 +#endif +#ifndef JucePlugin_PreferredChannelConfigurations + #define JucePlugin_PreferredChannelConfigurations {1, 1}, {2, 2} +#endif diff --git a/JuceLibraryCode/ReadMe.txt b/JuceLibraryCode/ReadMe.txt index f6c3564..091a5aa 100644 --- a/JuceLibraryCode/ReadMe.txt +++ b/JuceLibraryCode/ReadMe.txt @@ -2,11 +2,11 @@ Important Note!! ================ -The purpose of this folder is to contain files that are auto-generated by the Introjucer, +The purpose of this folder is to contain files that are auto-generated by the Projucer, and ALL files in this folder will be mercilessly DELETED and completely re-written whenever -the Introjucer saves your project. +the Projucer saves your project. Therefore, it's a bad idea to make any manual changes to the files in here, or to put any of your own files in here if you don't want to lose them. (Of course you may choose to add the folder's contents to your version-control system so that you can re-merge your own -modifications after the Introjucer has saved its changes). +modifications after the Projucer has saved its changes). diff --git a/JuceLibraryCode/include_juce_audio_basics.cpp b/JuceLibraryCode/include_juce_audio_basics.cpp new file mode 100644 index 0000000..b949f56 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_basics.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_basics.mm b/JuceLibraryCode/include_juce_audio_basics.mm new file mode 100644 index 0000000..2643e2d --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_basics.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_AAX.cpp b/JuceLibraryCode/include_juce_audio_plugin_client_AAX.cpp new file mode 100644 index 0000000..cdd536f --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_AAX.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_AAX.mm b/JuceLibraryCode/include_juce_audio_plugin_client_AAX.mm new file mode 100644 index 0000000..e41374a --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_AAX.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_AAX_utils.cpp b/JuceLibraryCode/include_juce_audio_plugin_client_AAX_utils.cpp new file mode 100644 index 0000000..d8864ab --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_AAX_utils.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_ARA.cpp b/JuceLibraryCode/include_juce_audio_plugin_client_ARA.cpp new file mode 100644 index 0000000..893fb69 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_ARA.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_AU_1.mm b/JuceLibraryCode/include_juce_audio_plugin_client_AU_1.mm new file mode 100644 index 0000000..3b3af64 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_AU_1.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_AU_2.mm b/JuceLibraryCode/include_juce_audio_plugin_client_AU_2.mm new file mode 100644 index 0000000..b40e42a --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_AU_2.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_AUv3.mm b/JuceLibraryCode/include_juce_audio_plugin_client_AUv3.mm new file mode 100644 index 0000000..557ff97 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_AUv3.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_LV2.cpp b/JuceLibraryCode/include_juce_audio_plugin_client_LV2.cpp new file mode 100644 index 0000000..87669fa --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_LV2.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_LV2.mm b/JuceLibraryCode/include_juce_audio_plugin_client_LV2.mm new file mode 100644 index 0000000..c61dc9e --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_LV2.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_Standalone.cpp b/JuceLibraryCode/include_juce_audio_plugin_client_Standalone.cpp new file mode 100644 index 0000000..3d66f62 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_Standalone.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_Unity.cpp b/JuceLibraryCode/include_juce_audio_plugin_client_Unity.cpp new file mode 100644 index 0000000..3b38ef5 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_Unity.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_VST2.cpp b/JuceLibraryCode/include_juce_audio_plugin_client_VST2.cpp new file mode 100644 index 0000000..2b9e759 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_VST2.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_VST2.mm b/JuceLibraryCode/include_juce_audio_plugin_client_VST2.mm new file mode 100644 index 0000000..011f347 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_VST2.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp b/JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp new file mode 100644 index 0000000..052256a --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_plugin_client_VST3.mm b/JuceLibraryCode/include_juce_audio_plugin_client_VST3.mm new file mode 100644 index 0000000..dccd947 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_plugin_client_VST3.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_processors.cpp b/JuceLibraryCode/include_juce_audio_processors.cpp new file mode 100644 index 0000000..f2ea745 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_processors.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_processors.mm b/JuceLibraryCode/include_juce_audio_processors.mm new file mode 100644 index 0000000..e396c68 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_processors.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_processors_ara.cpp b/JuceLibraryCode/include_juce_audio_processors_ara.cpp new file mode 100644 index 0000000..24f042d --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_processors_ara.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp b/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp new file mode 100644 index 0000000..b08b6d7 --- /dev/null +++ b/JuceLibraryCode/include_juce_audio_processors_lv2_libs.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_core.cpp b/JuceLibraryCode/include_juce_core.cpp new file mode 100644 index 0000000..862edad --- /dev/null +++ b/JuceLibraryCode/include_juce_core.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_core.mm b/JuceLibraryCode/include_juce_core.mm new file mode 100644 index 0000000..3c86bd0 --- /dev/null +++ b/JuceLibraryCode/include_juce_core.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_core_CompilationTime.cpp b/JuceLibraryCode/include_juce_core_CompilationTime.cpp new file mode 100644 index 0000000..2c58360 --- /dev/null +++ b/JuceLibraryCode/include_juce_core_CompilationTime.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_data_structures.cpp b/JuceLibraryCode/include_juce_data_structures.cpp new file mode 100644 index 0000000..3706126 --- /dev/null +++ b/JuceLibraryCode/include_juce_data_structures.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_data_structures.mm b/JuceLibraryCode/include_juce_data_structures.mm new file mode 100644 index 0000000..8f42478 --- /dev/null +++ b/JuceLibraryCode/include_juce_data_structures.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_events.cpp b/JuceLibraryCode/include_juce_events.cpp new file mode 100644 index 0000000..667778e --- /dev/null +++ b/JuceLibraryCode/include_juce_events.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_events.mm b/JuceLibraryCode/include_juce_events.mm new file mode 100644 index 0000000..7de1c88 --- /dev/null +++ b/JuceLibraryCode/include_juce_events.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_graphics.cpp b/JuceLibraryCode/include_juce_graphics.cpp new file mode 100644 index 0000000..64570b7 --- /dev/null +++ b/JuceLibraryCode/include_juce_graphics.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_graphics.mm b/JuceLibraryCode/include_juce_graphics.mm new file mode 100644 index 0000000..6e2297f --- /dev/null +++ b/JuceLibraryCode/include_juce_graphics.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_graphics_Harfbuzz.cpp b/JuceLibraryCode/include_juce_graphics_Harfbuzz.cpp new file mode 100644 index 0000000..593e71a --- /dev/null +++ b/JuceLibraryCode/include_juce_graphics_Harfbuzz.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_graphics_Sheenbidi.c b/JuceLibraryCode/include_juce_graphics_Sheenbidi.c new file mode 100644 index 0000000..4a96a53 --- /dev/null +++ b/JuceLibraryCode/include_juce_graphics_Sheenbidi.c @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_gui_basics.cpp b/JuceLibraryCode/include_juce_gui_basics.cpp new file mode 100644 index 0000000..5c9e275 --- /dev/null +++ b/JuceLibraryCode/include_juce_gui_basics.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_gui_basics.mm b/JuceLibraryCode/include_juce_gui_basics.mm new file mode 100644 index 0000000..c87fe80 --- /dev/null +++ b/JuceLibraryCode/include_juce_gui_basics.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_gui_extra.cpp b/JuceLibraryCode/include_juce_gui_extra.cpp new file mode 100644 index 0000000..5290620 --- /dev/null +++ b/JuceLibraryCode/include_juce_gui_extra.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_gui_extra.mm b/JuceLibraryCode/include_juce_gui_extra.mm new file mode 100644 index 0000000..763d623 --- /dev/null +++ b/JuceLibraryCode/include_juce_gui_extra.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_opengl.cpp b/JuceLibraryCode/include_juce_opengl.cpp new file mode 100644 index 0000000..4809e42 --- /dev/null +++ b/JuceLibraryCode/include_juce_opengl.cpp @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/include_juce_opengl.mm b/JuceLibraryCode/include_juce_opengl.mm new file mode 100644 index 0000000..5063b65 --- /dev/null +++ b/JuceLibraryCode/include_juce_opengl.mm @@ -0,0 +1,9 @@ +/* + + IMPORTANT! This file is auto-generated each time you save your + project - if you alter its contents, your changes may be overwritten! + +*/ + +#include "AppConfig.h" +#include diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp deleted file mode 100755 index a78b395..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp +++ /dev/null @@ -1,600 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -void AudioDataConverters::convertFloatToInt16LE (const float* source, void* dest, int numSamples, const int destBytesPerSample) -{ - const double maxVal = (double) 0x7fff; - char* intData = static_cast (dest); - - if (dest != (void*) source || destBytesPerSample <= 4) - { - for (int i = 0; i < numSamples; ++i) - { - *(uint16*) intData = ByteOrder::swapIfBigEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); - intData += destBytesPerSample; - } - } - else - { - intData += destBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= destBytesPerSample; - *(uint16*) intData = ByteOrder::swapIfBigEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); - } - } -} - -void AudioDataConverters::convertFloatToInt16BE (const float* source, void* dest, int numSamples, const int destBytesPerSample) -{ - const double maxVal = (double) 0x7fff; - char* intData = static_cast (dest); - - if (dest != (void*) source || destBytesPerSample <= 4) - { - for (int i = 0; i < numSamples; ++i) - { - *(uint16*) intData = ByteOrder::swapIfLittleEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); - intData += destBytesPerSample; - } - } - else - { - intData += destBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= destBytesPerSample; - *(uint16*) intData = ByteOrder::swapIfLittleEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); - } - } -} - -void AudioDataConverters::convertFloatToInt24LE (const float* source, void* dest, int numSamples, const int destBytesPerSample) -{ - const double maxVal = (double) 0x7fffff; - char* intData = static_cast (dest); - - if (dest != (void*) source || destBytesPerSample <= 4) - { - for (int i = 0; i < numSamples; ++i) - { - ByteOrder::littleEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData); - intData += destBytesPerSample; - } - } - else - { - intData += destBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= destBytesPerSample; - ByteOrder::littleEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData); - } - } -} - -void AudioDataConverters::convertFloatToInt24BE (const float* source, void* dest, int numSamples, const int destBytesPerSample) -{ - const double maxVal = (double) 0x7fffff; - char* intData = static_cast (dest); - - if (dest != (void*) source || destBytesPerSample <= 4) - { - for (int i = 0; i < numSamples; ++i) - { - ByteOrder::bigEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData); - intData += destBytesPerSample; - } - } - else - { - intData += destBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= destBytesPerSample; - ByteOrder::bigEndian24BitToChars (roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i])), intData); - } - } -} - -void AudioDataConverters::convertFloatToInt32LE (const float* source, void* dest, int numSamples, const int destBytesPerSample) -{ - const double maxVal = (double) 0x7fffffff; - char* intData = static_cast (dest); - - if (dest != (void*) source || destBytesPerSample <= 4) - { - for (int i = 0; i < numSamples; ++i) - { - *(uint32*)intData = ByteOrder::swapIfBigEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); - intData += destBytesPerSample; - } - } - else - { - intData += destBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= destBytesPerSample; - *(uint32*)intData = ByteOrder::swapIfBigEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); - } - } -} - -void AudioDataConverters::convertFloatToInt32BE (const float* source, void* dest, int numSamples, const int destBytesPerSample) -{ - const double maxVal = (double) 0x7fffffff; - char* intData = static_cast (dest); - - if (dest != (void*) source || destBytesPerSample <= 4) - { - for (int i = 0; i < numSamples; ++i) - { - *(uint32*)intData = ByteOrder::swapIfLittleEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); - intData += destBytesPerSample; - } - } - else - { - intData += destBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= destBytesPerSample; - *(uint32*)intData = ByteOrder::swapIfLittleEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * source[i]))); - } - } -} - -void AudioDataConverters::convertFloatToFloat32LE (const float* source, void* dest, int numSamples, const int destBytesPerSample) -{ - jassert (dest != (void*) source || destBytesPerSample <= 4); // This op can't be performed on in-place data! - - char* d = static_cast (dest); - - for (int i = 0; i < numSamples; ++i) - { - *(float*) d = source[i]; - - #if JUCE_BIG_ENDIAN - *(uint32*) d = ByteOrder::swap (*(uint32*) d); - #endif - - d += destBytesPerSample; - } -} - -void AudioDataConverters::convertFloatToFloat32BE (const float* source, void* dest, int numSamples, const int destBytesPerSample) -{ - jassert (dest != (void*) source || destBytesPerSample <= 4); // This op can't be performed on in-place data! - - char* d = static_cast (dest); - - for (int i = 0; i < numSamples; ++i) - { - *(float*) d = source[i]; - - #if JUCE_LITTLE_ENDIAN - *(uint32*) d = ByteOrder::swap (*(uint32*) d); - #endif - - d += destBytesPerSample; - } -} - -//============================================================================== -void AudioDataConverters::convertInt16LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) -{ - const float scale = 1.0f / 0x7fff; - const char* intData = static_cast (source); - - if (source != (void*) dest || srcBytesPerSample >= 4) - { - for (int i = 0; i < numSamples; ++i) - { - dest[i] = scale * (short) ByteOrder::swapIfBigEndian (*(uint16*)intData); - intData += srcBytesPerSample; - } - } - else - { - intData += srcBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= srcBytesPerSample; - dest[i] = scale * (short) ByteOrder::swapIfBigEndian (*(uint16*)intData); - } - } -} - -void AudioDataConverters::convertInt16BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) -{ - const float scale = 1.0f / 0x7fff; - const char* intData = static_cast (source); - - if (source != (void*) dest || srcBytesPerSample >= 4) - { - for (int i = 0; i < numSamples; ++i) - { - dest[i] = scale * (short) ByteOrder::swapIfLittleEndian (*(uint16*)intData); - intData += srcBytesPerSample; - } - } - else - { - intData += srcBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= srcBytesPerSample; - dest[i] = scale * (short) ByteOrder::swapIfLittleEndian (*(uint16*)intData); - } - } -} - -void AudioDataConverters::convertInt24LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) -{ - const float scale = 1.0f / 0x7fffff; - const char* intData = static_cast (source); - - if (source != (void*) dest || srcBytesPerSample >= 4) - { - for (int i = 0; i < numSamples; ++i) - { - dest[i] = scale * (short) ByteOrder::littleEndian24Bit (intData); - intData += srcBytesPerSample; - } - } - else - { - intData += srcBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= srcBytesPerSample; - dest[i] = scale * (short) ByteOrder::littleEndian24Bit (intData); - } - } -} - -void AudioDataConverters::convertInt24BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) -{ - const float scale = 1.0f / 0x7fffff; - const char* intData = static_cast (source); - - if (source != (void*) dest || srcBytesPerSample >= 4) - { - for (int i = 0; i < numSamples; ++i) - { - dest[i] = scale * (short) ByteOrder::bigEndian24Bit (intData); - intData += srcBytesPerSample; - } - } - else - { - intData += srcBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= srcBytesPerSample; - dest[i] = scale * (short) ByteOrder::bigEndian24Bit (intData); - } - } -} - -void AudioDataConverters::convertInt32LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) -{ - const float scale = 1.0f / 0x7fffffff; - const char* intData = static_cast (source); - - if (source != (void*) dest || srcBytesPerSample >= 4) - { - for (int i = 0; i < numSamples; ++i) - { - dest[i] = scale * (int) ByteOrder::swapIfBigEndian (*(uint32*) intData); - intData += srcBytesPerSample; - } - } - else - { - intData += srcBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= srcBytesPerSample; - dest[i] = scale * (int) ByteOrder::swapIfBigEndian (*(uint32*) intData); - } - } -} - -void AudioDataConverters::convertInt32BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) -{ - const float scale = 1.0f / 0x7fffffff; - const char* intData = static_cast (source); - - if (source != (void*) dest || srcBytesPerSample >= 4) - { - for (int i = 0; i < numSamples; ++i) - { - dest[i] = scale * (int) ByteOrder::swapIfLittleEndian (*(uint32*) intData); - intData += srcBytesPerSample; - } - } - else - { - intData += srcBytesPerSample * numSamples; - - for (int i = numSamples; --i >= 0;) - { - intData -= srcBytesPerSample; - dest[i] = scale * (int) ByteOrder::swapIfLittleEndian (*(uint32*) intData); - } - } -} - -void AudioDataConverters::convertFloat32LEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) -{ - const char* s = static_cast (source); - - for (int i = 0; i < numSamples; ++i) - { - dest[i] = *(float*)s; - - #if JUCE_BIG_ENDIAN - uint32* const d = (uint32*) (dest + i); - *d = ByteOrder::swap (*d); - #endif - - s += srcBytesPerSample; - } -} - -void AudioDataConverters::convertFloat32BEToFloat (const void* const source, float* const dest, int numSamples, const int srcBytesPerSample) -{ - const char* s = static_cast (source); - - for (int i = 0; i < numSamples; ++i) - { - dest[i] = *(float*)s; - - #if JUCE_LITTLE_ENDIAN - uint32* const d = (uint32*) (dest + i); - *d = ByteOrder::swap (*d); - #endif - - s += srcBytesPerSample; - } -} - - -//============================================================================== -void AudioDataConverters::convertFloatToFormat (const DataFormat destFormat, - const float* const source, - void* const dest, - const int numSamples) -{ - switch (destFormat) - { - case int16LE: convertFloatToInt16LE (source, dest, numSamples); break; - case int16BE: convertFloatToInt16BE (source, dest, numSamples); break; - case int24LE: convertFloatToInt24LE (source, dest, numSamples); break; - case int24BE: convertFloatToInt24BE (source, dest, numSamples); break; - case int32LE: convertFloatToInt32LE (source, dest, numSamples); break; - case int32BE: convertFloatToInt32BE (source, dest, numSamples); break; - case float32LE: convertFloatToFloat32LE (source, dest, numSamples); break; - case float32BE: convertFloatToFloat32BE (source, dest, numSamples); break; - default: jassertfalse; break; - } -} - -void AudioDataConverters::convertFormatToFloat (const DataFormat sourceFormat, - const void* const source, - float* const dest, - const int numSamples) -{ - switch (sourceFormat) - { - case int16LE: convertInt16LEToFloat (source, dest, numSamples); break; - case int16BE: convertInt16BEToFloat (source, dest, numSamples); break; - case int24LE: convertInt24LEToFloat (source, dest, numSamples); break; - case int24BE: convertInt24BEToFloat (source, dest, numSamples); break; - case int32LE: convertInt32LEToFloat (source, dest, numSamples); break; - case int32BE: convertInt32BEToFloat (source, dest, numSamples); break; - case float32LE: convertFloat32LEToFloat (source, dest, numSamples); break; - case float32BE: convertFloat32BEToFloat (source, dest, numSamples); break; - default: jassertfalse; break; - } -} - -//============================================================================== -void AudioDataConverters::interleaveSamples (const float** const source, - float* const dest, - const int numSamples, - const int numChannels) -{ - for (int chan = 0; chan < numChannels; ++chan) - { - int i = chan; - const float* src = source [chan]; - - for (int j = 0; j < numSamples; ++j) - { - dest [i] = src [j]; - i += numChannels; - } - } -} - -void AudioDataConverters::deinterleaveSamples (const float* const source, - float** const dest, - const int numSamples, - const int numChannels) -{ - for (int chan = 0; chan < numChannels; ++chan) - { - int i = chan; - float* dst = dest [chan]; - - for (int j = 0; j < numSamples; ++j) - { - dst [j] = source [i]; - i += numChannels; - } - } -} - - -//============================================================================== -#if JUCE_UNIT_TESTS - -class AudioConversionTests : public UnitTest -{ -public: - AudioConversionTests() : UnitTest ("Audio data conversion") {} - - template - struct Test5 - { - static void test (UnitTest& unitTest, Random& r) - { - test (unitTest, false, r); - test (unitTest, true, r); - } - - static void test (UnitTest& unitTest, bool inPlace, Random& r) - { - const int numSamples = 2048; - int32 original [numSamples], converted [numSamples], reversed [numSamples]; - - { - AudioData::Pointer d (original); - bool clippingFailed = false; - - for (int i = 0; i < numSamples / 2; ++i) - { - d.setAsFloat (r.nextFloat() * 2.2f - 1.1f); - - if (! d.isFloatingPoint()) - clippingFailed = d.getAsFloat() > 1.0f || d.getAsFloat() < -1.0f || clippingFailed; - - ++d; - d.setAsInt32 (r.nextInt()); - ++d; - } - - unitTest.expect (! clippingFailed); - } - - // convert data from the source to dest format.. - ScopedPointer conv (new AudioData::ConverterInstance , - AudioData::Pointer >()); - conv->convertSamples (inPlace ? reversed : converted, original, numSamples); - - // ..and back again.. - conv = new AudioData::ConverterInstance , - AudioData::Pointer >(); - if (! inPlace) - zeromem (reversed, sizeof (reversed)); - - conv->convertSamples (reversed, inPlace ? reversed : converted, numSamples); - - { - int biggestDiff = 0; - AudioData::Pointer d1 (original); - AudioData::Pointer d2 (reversed); - - const int errorMargin = 2 * AudioData::Pointer::get32BitResolution() - + AudioData::Pointer::get32BitResolution(); - - for (int i = 0; i < numSamples; ++i) - { - biggestDiff = jmax (biggestDiff, std::abs (d1.getAsInt32() - d2.getAsInt32())); - ++d1; - ++d2; - } - - unitTest.expect (biggestDiff <= errorMargin); - } - } - }; - - template - struct Test3 - { - static void test (UnitTest& unitTest, Random& r) - { - Test5 ::test (unitTest, r); - Test5 ::test (unitTest, r); - } - }; - - template - struct Test2 - { - static void test (UnitTest& unitTest, Random& r) - { - Test3 ::test (unitTest, r); - Test3 ::test (unitTest, r); - Test3 ::test (unitTest, r); - Test3 ::test (unitTest, r); - Test3 ::test (unitTest, r); - Test3 ::test (unitTest, r); - } - }; - - template - struct Test1 - { - static void test (UnitTest& unitTest, Random& r) - { - Test2 ::test (unitTest, r); - Test2 ::test (unitTest, r); - } - }; - - void runTest() - { - Random r = getRandom(); - beginTest ("Round-trip conversion: Int8"); - Test1 ::test (*this, r); - beginTest ("Round-trip conversion: Int16"); - Test1 ::test (*this, r); - beginTest ("Round-trip conversion: Int24"); - Test1 ::test (*this, r); - beginTest ("Round-trip conversion: Int32"); - Test1 ::test (*this, r); - beginTest ("Round-trip conversion: Float32"); - Test1 ::test (*this, r); - } -}; - -static AudioConversionTests audioConversionUnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h deleted file mode 100755 index 17cc48c..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioDataConverters.h +++ /dev/null @@ -1,712 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIODATACONVERTERS_H_INCLUDED -#define JUCE_AUDIODATACONVERTERS_H_INCLUDED - - -//============================================================================== -/** - This class a container which holds all the classes pertaining to the AudioData::Pointer - audio sample format class. - - @see AudioData::Pointer. -*/ -class JUCE_API AudioData -{ -public: - //============================================================================== - // These types can be used as the SampleFormat template parameter for the AudioData::Pointer class. - - class Int8; /**< Used as a template parameter for AudioData::Pointer. Indicates an 8-bit integer packed data format. */ - class UInt8; /**< Used as a template parameter for AudioData::Pointer. Indicates an 8-bit unsigned integer packed data format. */ - class Int16; /**< Used as a template parameter for AudioData::Pointer. Indicates an 16-bit integer packed data format. */ - class Int24; /**< Used as a template parameter for AudioData::Pointer. Indicates an 24-bit integer packed data format. */ - class Int32; /**< Used as a template parameter for AudioData::Pointer. Indicates an 32-bit integer packed data format. */ - class Float32; /**< Used as a template parameter for AudioData::Pointer. Indicates an 32-bit float data format. */ - - //============================================================================== - // These types can be used as the Endianness template parameter for the AudioData::Pointer class. - - class BigEndian; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples are stored in big-endian order. */ - class LittleEndian; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples are stored in little-endian order. */ - class NativeEndian; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples are stored in the CPU's native endianness. */ - - //============================================================================== - // These types can be used as the InterleavingType template parameter for the AudioData::Pointer class. - - class NonInterleaved; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples are stored contiguously. */ - class Interleaved; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples are interleaved with a number of other channels. */ - - //============================================================================== - // These types can be used as the Constness template parameter for the AudioData::Pointer class. - - class NonConst; /**< Used as a template parameter for AudioData::Pointer. Indicates that the pointer can be used for non-const data. */ - class Const; /**< Used as a template parameter for AudioData::Pointer. Indicates that the samples can only be used for const data.. */ - - #ifndef DOXYGEN - //============================================================================== - class BigEndian - { - public: - template static inline float getAsFloat (SampleFormatType& s) noexcept { return s.getAsFloatBE(); } - template static inline void setAsFloat (SampleFormatType& s, float newValue) noexcept { s.setAsFloatBE (newValue); } - template static inline int32 getAsInt32 (SampleFormatType& s) noexcept { return s.getAsInt32BE(); } - template static inline void setAsInt32 (SampleFormatType& s, int32 newValue) noexcept { s.setAsInt32BE (newValue); } - template static inline void copyFrom (DestType& dest, SourceType& source) noexcept { dest.copyFromBE (source); } - enum { isBigEndian = 1 }; - }; - - class LittleEndian - { - public: - template static inline float getAsFloat (SampleFormatType& s) noexcept { return s.getAsFloatLE(); } - template static inline void setAsFloat (SampleFormatType& s, float newValue) noexcept { s.setAsFloatLE (newValue); } - template static inline int32 getAsInt32 (SampleFormatType& s) noexcept { return s.getAsInt32LE(); } - template static inline void setAsInt32 (SampleFormatType& s, int32 newValue) noexcept { s.setAsInt32LE (newValue); } - template static inline void copyFrom (DestType& dest, SourceType& source) noexcept { dest.copyFromLE (source); } - enum { isBigEndian = 0 }; - }; - - #if JUCE_BIG_ENDIAN - class NativeEndian : public BigEndian {}; - #else - class NativeEndian : public LittleEndian {}; - #endif - - //============================================================================== - class Int8 - { - public: - inline Int8 (void* d) noexcept : data (static_cast (d)) {} - - inline void advance() noexcept { ++data; } - inline void skip (int numSamples) noexcept { data += numSamples; } - inline float getAsFloatLE() const noexcept { return (float) (*data * (1.0 / (1.0 + maxValue))); } - inline float getAsFloatBE() const noexcept { return getAsFloatLE(); } - inline void setAsFloatLE (float newValue) noexcept { *data = (int8) jlimit ((int) -maxValue, (int) maxValue, roundToInt (newValue * (1.0 + maxValue))); } - inline void setAsFloatBE (float newValue) noexcept { setAsFloatLE (newValue); } - inline int32 getAsInt32LE() const noexcept { return (int) (*data << 24); } - inline int32 getAsInt32BE() const noexcept { return getAsInt32LE(); } - inline void setAsInt32LE (int newValue) noexcept { *data = (int8) (newValue >> 24); } - inline void setAsInt32BE (int newValue) noexcept { setAsInt32LE (newValue); } - inline void clear() noexcept { *data = 0; } - inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} - template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } - template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } - inline void copyFromSameType (Int8& source) noexcept { *data = *source.data; } - - int8* data; - enum { bytesPerSample = 1, maxValue = 0x7f, resolution = (1 << 24), isFloat = 0 }; - }; - - class UInt8 - { - public: - inline UInt8 (void* d) noexcept : data (static_cast (d)) {} - - inline void advance() noexcept { ++data; } - inline void skip (int numSamples) noexcept { data += numSamples; } - inline float getAsFloatLE() const noexcept { return (float) ((*data - 128) * (1.0 / (1.0 + maxValue))); } - inline float getAsFloatBE() const noexcept { return getAsFloatLE(); } - inline void setAsFloatLE (float newValue) noexcept { *data = (uint8) jlimit (0, 255, 128 + roundToInt (newValue * (1.0 + maxValue))); } - inline void setAsFloatBE (float newValue) noexcept { setAsFloatLE (newValue); } - inline int32 getAsInt32LE() const noexcept { return (int) ((*data - 128) << 24); } - inline int32 getAsInt32BE() const noexcept { return getAsInt32LE(); } - inline void setAsInt32LE (int newValue) noexcept { *data = (uint8) (128 + (newValue >> 24)); } - inline void setAsInt32BE (int newValue) noexcept { setAsInt32LE (newValue); } - inline void clear() noexcept { *data = 128; } - inline void clearMultiple (int num) noexcept { memset (data, 128, (size_t) num) ;} - template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } - template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } - inline void copyFromSameType (UInt8& source) noexcept { *data = *source.data; } - - uint8* data; - enum { bytesPerSample = 1, maxValue = 0x7f, resolution = (1 << 24), isFloat = 0 }; - }; - - class Int16 - { - public: - inline Int16 (void* d) noexcept : data (static_cast (d)) {} - - inline void advance() noexcept { ++data; } - inline void skip (int numSamples) noexcept { data += numSamples; } - inline float getAsFloatLE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int16) ByteOrder::swapIfBigEndian (*data)); } - inline float getAsFloatBE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int16) ByteOrder::swapIfLittleEndian (*data)); } - inline void setAsFloatLE (float newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint16) jlimit ((int) -maxValue, (int) maxValue, roundToInt (newValue * (1.0 + maxValue)))); } - inline void setAsFloatBE (float newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint16) jlimit ((int) -maxValue, (int) maxValue, roundToInt (newValue * (1.0 + maxValue)))); } - inline int32 getAsInt32LE() const noexcept { return (int32) (ByteOrder::swapIfBigEndian ((uint16) *data) << 16); } - inline int32 getAsInt32BE() const noexcept { return (int32) (ByteOrder::swapIfLittleEndian ((uint16) *data) << 16); } - inline void setAsInt32LE (int32 newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint16) (newValue >> 16)); } - inline void setAsInt32BE (int32 newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint16) (newValue >> 16)); } - inline void clear() noexcept { *data = 0; } - inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} - template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } - template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } - inline void copyFromSameType (Int16& source) noexcept { *data = *source.data; } - - uint16* data; - enum { bytesPerSample = 2, maxValue = 0x7fff, resolution = (1 << 16), isFloat = 0 }; - }; - - class Int24 - { - public: - inline Int24 (void* d) noexcept : data (static_cast (d)) {} - - inline void advance() noexcept { data += 3; } - inline void skip (int numSamples) noexcept { data += 3 * numSamples; } - inline float getAsFloatLE() const noexcept { return (float) (ByteOrder::littleEndian24Bit (data) * (1.0 / (1.0 + maxValue))); } - inline float getAsFloatBE() const noexcept { return (float) (ByteOrder::bigEndian24Bit (data) * (1.0 / (1.0 + maxValue))); } - inline void setAsFloatLE (float newValue) noexcept { ByteOrder::littleEndian24BitToChars (jlimit ((int) -maxValue, (int) maxValue, roundToInt (newValue * (1.0 + maxValue))), data); } - inline void setAsFloatBE (float newValue) noexcept { ByteOrder::bigEndian24BitToChars (jlimit ((int) -maxValue, (int) maxValue, roundToInt (newValue * (1.0 + maxValue))), data); } - inline int32 getAsInt32LE() const noexcept { return (int32) ByteOrder::littleEndian24Bit (data) << 8; } - inline int32 getAsInt32BE() const noexcept { return (int32) ByteOrder::bigEndian24Bit (data) << 8; } - inline void setAsInt32LE (int32 newValue) noexcept { ByteOrder::littleEndian24BitToChars (newValue >> 8, data); } - inline void setAsInt32BE (int32 newValue) noexcept { ByteOrder::bigEndian24BitToChars (newValue >> 8, data); } - inline void clear() noexcept { data[0] = 0; data[1] = 0; data[2] = 0; } - inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} - template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } - template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } - inline void copyFromSameType (Int24& source) noexcept { data[0] = source.data[0]; data[1] = source.data[1]; data[2] = source.data[2]; } - - char* data; - enum { bytesPerSample = 3, maxValue = 0x7fffff, resolution = (1 << 8), isFloat = 0 }; - }; - - class Int32 - { - public: - inline Int32 (void* d) noexcept : data (static_cast (d)) {} - - inline void advance() noexcept { ++data; } - inline void skip (int numSamples) noexcept { data += numSamples; } - inline float getAsFloatLE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfBigEndian (*data)); } - inline float getAsFloatBE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfLittleEndian (*data)); } - inline void setAsFloatLE (float newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } - inline void setAsFloatBE (float newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } - inline int32 getAsInt32LE() const noexcept { return (int32) ByteOrder::swapIfBigEndian (*data); } - inline int32 getAsInt32BE() const noexcept { return (int32) ByteOrder::swapIfLittleEndian (*data); } - inline void setAsInt32LE (int32 newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) newValue); } - inline void setAsInt32BE (int32 newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) newValue); } - inline void clear() noexcept { *data = 0; } - inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} - template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } - template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } - inline void copyFromSameType (Int32& source) noexcept { *data = *source.data; } - - uint32* data; - enum { bytesPerSample = 4, maxValue = 0x7fffffff, resolution = 1, isFloat = 0 }; - }; - - /** A 32-bit integer type, of which only the bottom 24 bits are used. */ - class Int24in32 : public Int32 - { - public: - inline Int24in32 (void* d) noexcept : Int32 (d) {} - - inline float getAsFloatLE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfBigEndian (*data)); } - inline float getAsFloatBE() const noexcept { return (float) ((1.0 / (1.0 + maxValue)) * (int32) ByteOrder::swapIfLittleEndian (*data)); } - inline void setAsFloatLE (float newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } - inline void setAsFloatBE (float newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) (maxValue * jlimit (-1.0, 1.0, (double) newValue))); } - inline int32 getAsInt32LE() const noexcept { return (int32) ByteOrder::swapIfBigEndian (*data) << 8; } - inline int32 getAsInt32BE() const noexcept { return (int32) ByteOrder::swapIfLittleEndian (*data) << 8; } - inline void setAsInt32LE (int32 newValue) noexcept { *data = ByteOrder::swapIfBigEndian ((uint32) newValue >> 8); } - inline void setAsInt32BE (int32 newValue) noexcept { *data = ByteOrder::swapIfLittleEndian ((uint32) newValue >> 8); } - template inline void copyFromLE (SourceType& source) noexcept { setAsInt32LE (source.getAsInt32()); } - template inline void copyFromBE (SourceType& source) noexcept { setAsInt32BE (source.getAsInt32()); } - inline void copyFromSameType (Int24in32& source) noexcept { *data = *source.data; } - - enum { bytesPerSample = 4, maxValue = 0x7fffff, resolution = (1 << 8), isFloat = 0 }; - }; - - class Float32 - { - public: - inline Float32 (void* d) noexcept : data (static_cast (d)) {} - - inline void advance() noexcept { ++data; } - inline void skip (int numSamples) noexcept { data += numSamples; } - #if JUCE_BIG_ENDIAN - inline float getAsFloatBE() const noexcept { return *data; } - inline void setAsFloatBE (float newValue) noexcept { *data = newValue; } - inline float getAsFloatLE() const noexcept { union { uint32 asInt; float asFloat; } n; n.asInt = ByteOrder::swap (*(uint32*) data); return n.asFloat; } - inline void setAsFloatLE (float newValue) noexcept { union { uint32 asInt; float asFloat; } n; n.asFloat = newValue; *(uint32*) data = ByteOrder::swap (n.asInt); } - #else - inline float getAsFloatLE() const noexcept { return *data; } - inline void setAsFloatLE (float newValue) noexcept { *data = newValue; } - inline float getAsFloatBE() const noexcept { union { uint32 asInt; float asFloat; } n; n.asInt = ByteOrder::swap (*(uint32*) data); return n.asFloat; } - inline void setAsFloatBE (float newValue) noexcept { union { uint32 asInt; float asFloat; } n; n.asFloat = newValue; *(uint32*) data = ByteOrder::swap (n.asInt); } - #endif - inline int32 getAsInt32LE() const noexcept { return (int32) roundToInt (jlimit (-1.0, 1.0, (double) getAsFloatLE()) * (double) maxValue); } - inline int32 getAsInt32BE() const noexcept { return (int32) roundToInt (jlimit (-1.0, 1.0, (double) getAsFloatBE()) * (double) maxValue); } - inline void setAsInt32LE (int32 newValue) noexcept { setAsFloatLE ((float) (newValue * (1.0 / (1.0 + maxValue)))); } - inline void setAsInt32BE (int32 newValue) noexcept { setAsFloatBE ((float) (newValue * (1.0 / (1.0 + maxValue)))); } - inline void clear() noexcept { *data = 0; } - inline void clearMultiple (int num) noexcept { zeromem (data, (size_t) (num * bytesPerSample)) ;} - template inline void copyFromLE (SourceType& source) noexcept { setAsFloatLE (source.getAsFloat()); } - template inline void copyFromBE (SourceType& source) noexcept { setAsFloatBE (source.getAsFloat()); } - inline void copyFromSameType (Float32& source) noexcept { *data = *source.data; } - - float* data; - enum { bytesPerSample = 4, maxValue = 0x7fffffff, resolution = (1 << 8), isFloat = 1 }; - }; - - //============================================================================== - class NonInterleaved - { - public: - inline NonInterleaved() noexcept {} - inline NonInterleaved (const NonInterleaved&) noexcept {} - inline NonInterleaved (const int) noexcept {} - inline void copyFrom (const NonInterleaved&) noexcept {} - template inline void advanceData (SampleFormatType& s) noexcept { s.advance(); } - template inline void advanceDataBy (SampleFormatType& s, int numSamples) noexcept { s.skip (numSamples); } - template inline void clear (SampleFormatType& s, int numSamples) noexcept { s.clearMultiple (numSamples); } - template inline static int getNumBytesBetweenSamples (const SampleFormatType&) noexcept { return SampleFormatType::bytesPerSample; } - - enum { isInterleavedType = 0, numInterleavedChannels = 1 }; - }; - - class Interleaved - { - public: - inline Interleaved() noexcept : numInterleavedChannels (1) {} - inline Interleaved (const Interleaved& other) noexcept : numInterleavedChannels (other.numInterleavedChannels) {} - inline Interleaved (const int numInterleavedChans) noexcept : numInterleavedChannels (numInterleavedChans) {} - inline void copyFrom (const Interleaved& other) noexcept { numInterleavedChannels = other.numInterleavedChannels; } - template inline void advanceData (SampleFormatType& s) noexcept { s.skip (numInterleavedChannels); } - template inline void advanceDataBy (SampleFormatType& s, int numSamples) noexcept { s.skip (numInterleavedChannels * numSamples); } - template inline void clear (SampleFormatType& s, int numSamples) noexcept { while (--numSamples >= 0) { s.clear(); s.skip (numInterleavedChannels); } } - template inline int getNumBytesBetweenSamples (const SampleFormatType&) const noexcept { return numInterleavedChannels * SampleFormatType::bytesPerSample; } - int numInterleavedChannels; - enum { isInterleavedType = 1 }; - }; - - //============================================================================== - class NonConst - { - public: - typedef void VoidType; - static inline void* toVoidPtr (VoidType* v) noexcept { return v; } - enum { isConst = 0 }; - }; - - class Const - { - public: - typedef const void VoidType; - static inline void* toVoidPtr (VoidType* v) noexcept { return const_cast (v); } - enum { isConst = 1 }; - }; - #endif - - //============================================================================== - /** - A pointer to a block of audio data with a particular encoding. - - This object can be used to read and write from blocks of encoded audio samples. To create one, you specify - the audio format as a series of template parameters, e.g. - @code - // this creates a pointer for reading from a const array of 16-bit little-endian packed samples. - AudioData::Pointer pointer (someRawAudioData); - - // These methods read the sample that is being pointed to - float firstSampleAsFloat = pointer.getAsFloat(); - int32 firstSampleAsInt = pointer.getAsInt32(); - ++pointer; // moves the pointer to the next sample. - pointer += 3; // skips the next 3 samples. - @endcode - - The convertSamples() method lets you copy a range of samples from one format to another, automatically - converting its format. - - @see AudioData::Converter - */ - template - class Pointer : private InterleavingType // (inherited for EBCO) - { - public: - //============================================================================== - /** Creates a non-interleaved pointer from some raw data in the appropriate format. - This constructor is only used if you've specified the AudioData::NonInterleaved option - - for interleaved formats, use the constructor that also takes a number of channels. - */ - Pointer (typename Constness::VoidType* sourceData) noexcept - : data (Constness::toVoidPtr (sourceData)) - { - // If you're using interleaved data, call the other constructor! If you're using non-interleaved data, - // you should pass NonInterleaved as the template parameter for the interleaving type! - static_jassert (InterleavingType::isInterleavedType == 0); - } - - /** Creates a pointer from some raw data in the appropriate format with the specified number of interleaved channels. - For non-interleaved data, use the other constructor. - */ - Pointer (typename Constness::VoidType* sourceData, int numInterleaved) noexcept - : InterleavingType (numInterleaved), data (Constness::toVoidPtr (sourceData)) - { - } - - /** Creates a copy of another pointer. */ - Pointer (const Pointer& other) noexcept - : InterleavingType (other), data (other.data) - { - } - - Pointer& operator= (const Pointer& other) noexcept - { - InterleavingType::operator= (other); - data = other.data; - return *this; - } - - //============================================================================== - /** Returns the value of the first sample as a floating point value. - The value will be in the range -1.0 to 1.0 for integer formats. For floating point - formats, the value could be outside that range, although -1 to 1 is the standard range. - */ - inline float getAsFloat() const noexcept { return Endianness::getAsFloat (data); } - - /** Sets the value of the first sample as a floating point value. - - (This method can only be used if the AudioData::NonConst option was used). - The value should be in the range -1.0 to 1.0 - for integer formats, values outside that - range will be clipped. For floating point formats, any value passed in here will be - written directly, although -1 to 1 is the standard range. - */ - inline void setAsFloat (float newValue) noexcept - { - static_jassert (Constness::isConst == 0); // trying to write to a const pointer! For a writeable one, use AudioData::NonConst instead! - Endianness::setAsFloat (data, newValue); - } - - /** Returns the value of the first sample as a 32-bit integer. - The value returned will be in the range 0x80000000 to 0x7fffffff, and shorter values will be - shifted to fill this range (e.g. if you're reading from 24-bit data, the values will be shifted up - by 8 bits when returned here). If the source data is floating point, values beyond -1.0 to 1.0 will - be clipped so that -1.0 maps onto -0x7fffffff and 1.0 maps to 0x7fffffff. - */ - inline int32 getAsInt32() const noexcept { return Endianness::getAsInt32 (data); } - - /** Sets the value of the first sample as a 32-bit integer. - This will be mapped to the range of the format that is being written - see getAsInt32(). - */ - inline void setAsInt32 (int32 newValue) noexcept - { - static_jassert (Constness::isConst == 0); // trying to write to a const pointer! For a writeable one, use AudioData::NonConst instead! - Endianness::setAsInt32 (data, newValue); - } - - /** Moves the pointer along to the next sample. */ - inline Pointer& operator++() noexcept { advance(); return *this; } - - /** Moves the pointer back to the previous sample. */ - inline Pointer& operator--() noexcept { this->advanceDataBy (data, -1); return *this; } - - /** Adds a number of samples to the pointer's position. */ - Pointer& operator+= (int samplesToJump) noexcept { this->advanceDataBy (data, samplesToJump); return *this; } - - /** Writes a stream of samples into this pointer from another pointer. - This will copy the specified number of samples, converting between formats appropriately. - */ - void convertSamples (Pointer source, int numSamples) const noexcept - { - static_jassert (Constness::isConst == 0); // trying to write to a const pointer! For a writeable one, use AudioData::NonConst instead! - - for (Pointer dest (*this); --numSamples >= 0;) - { - dest.data.copyFromSameType (source.data); - dest.advance(); - source.advance(); - } - } - - /** Writes a stream of samples into this pointer from another pointer. - This will copy the specified number of samples, converting between formats appropriately. - */ - template - void convertSamples (OtherPointerType source, int numSamples) const noexcept - { - static_jassert (Constness::isConst == 0); // trying to write to a const pointer! For a writeable one, use AudioData::NonConst instead! - - Pointer dest (*this); - - if (source.getRawData() != getRawData() || source.getNumBytesBetweenSamples() >= getNumBytesBetweenSamples()) - { - while (--numSamples >= 0) - { - Endianness::copyFrom (dest.data, source); - dest.advance(); - ++source; - } - } - else // copy backwards if we're increasing the sample width.. - { - dest += numSamples; - source += numSamples; - - while (--numSamples >= 0) - Endianness::copyFrom ((--dest).data, --source); - } - } - - /** Sets a number of samples to zero. */ - void clearSamples (int numSamples) const noexcept - { - Pointer dest (*this); - dest.clear (dest.data, numSamples); - } - - /** Scans a block of data, returning the lowest and highest levels as floats */ - Range findMinAndMax (size_t numSamples) const noexcept - { - if (numSamples == 0) - return Range(); - - Pointer dest (*this); - - if (isFloatingPoint()) - { - float mn = dest.getAsFloat(); - dest.advance(); - float mx = mn; - - while (--numSamples > 0) - { - const float v = dest.getAsFloat(); - dest.advance(); - - if (mx < v) mx = v; - if (v < mn) mn = v; - } - - return Range (mn, mx); - } - - int32 mn = dest.getAsInt32(); - dest.advance(); - int32 mx = mn; - - while (--numSamples > 0) - { - const int v = dest.getAsInt32(); - dest.advance(); - - if (mx < v) mx = v; - if (v < mn) mn = v; - } - - return Range (mn * (float) (1.0 / (1.0 + Int32::maxValue)), - mx * (float) (1.0 / (1.0 + Int32::maxValue))); - } - - /** Scans a block of data, returning the lowest and highest levels as floats */ - void findMinAndMax (size_t numSamples, float& minValue, float& maxValue) const noexcept - { - Range r (findMinAndMax (numSamples)); - minValue = r.getStart(); - maxValue = r.getEnd(); - } - - /** Returns true if the pointer is using a floating-point format. */ - static bool isFloatingPoint() noexcept { return (bool) SampleFormat::isFloat; } - - /** Returns true if the format is big-endian. */ - static bool isBigEndian() noexcept { return (bool) Endianness::isBigEndian; } - - /** Returns the number of bytes in each sample (ignoring the number of interleaved channels). */ - static int getBytesPerSample() noexcept { return (int) SampleFormat::bytesPerSample; } - - /** Returns the number of interleaved channels in the format. */ - int getNumInterleavedChannels() const noexcept { return (int) this->numInterleavedChannels; } - - /** Returns the number of bytes between the start address of each sample. */ - int getNumBytesBetweenSamples() const noexcept { return InterleavingType::getNumBytesBetweenSamples (data); } - - /** Returns the accuracy of this format when represented as a 32-bit integer. - This is the smallest number above 0 that can be represented in the sample format, converted to - a 32-bit range. E,g. if the format is 8-bit, its resolution is 0x01000000; if the format is 24-bit, - its resolution is 0x100. - */ - static int get32BitResolution() noexcept { return (int) SampleFormat::resolution; } - - /** Returns a pointer to the underlying data. */ - const void* getRawData() const noexcept { return data.data; } - - private: - //============================================================================== - SampleFormat data; - - inline void advance() noexcept { this->advanceData (data); } - - Pointer operator++ (int); // private to force you to use the more efficient pre-increment! - Pointer operator-- (int); - }; - - //============================================================================== - /** A base class for objects that are used to convert between two different sample formats. - - The AudioData::ConverterInstance implements this base class and can be templated, so - you can create an instance that converts between two particular formats, and then - store this in the abstract base class. - - @see AudioData::ConverterInstance - */ - class Converter - { - public: - virtual ~Converter() {} - - /** Converts a sequence of samples from the converter's source format into the dest format. */ - virtual void convertSamples (void* destSamples, const void* sourceSamples, int numSamples) const = 0; - - /** Converts a sequence of samples from the converter's source format into the dest format. - This method takes sub-channel indexes, which can be used with interleaved formats in order to choose a - particular sub-channel of the data to be used. - */ - virtual void convertSamples (void* destSamples, int destSubChannel, - const void* sourceSamples, int sourceSubChannel, int numSamples) const = 0; - }; - - //============================================================================== - /** - A class that converts between two templated AudioData::Pointer types, and which - implements the AudioData::Converter interface. - - This can be used as a concrete instance of the AudioData::Converter abstract class. - - @see AudioData::Converter - */ - template - class ConverterInstance : public Converter - { - public: - ConverterInstance (int numSourceChannels = 1, int numDestChannels = 1) - : sourceChannels (numSourceChannels), destChannels (numDestChannels) - {} - - void convertSamples (void* dest, const void* source, int numSamples) const override - { - SourceSampleType s (source, sourceChannels); - DestSampleType d (dest, destChannels); - d.convertSamples (s, numSamples); - } - - void convertSamples (void* dest, int destSubChannel, - const void* source, int sourceSubChannel, int numSamples) const override - { - jassert (destSubChannel < destChannels && sourceSubChannel < sourceChannels); - - SourceSampleType s (addBytesToPointer (source, sourceSubChannel * SourceSampleType::getBytesPerSample()), sourceChannels); - DestSampleType d (addBytesToPointer (dest, destSubChannel * DestSampleType::getBytesPerSample()), destChannels); - d.convertSamples (s, numSamples); - } - - private: - JUCE_DECLARE_NON_COPYABLE (ConverterInstance) - - const int sourceChannels, destChannels; - }; -}; - - - -//============================================================================== -/** - A set of routines to convert buffers of 32-bit floating point data to and from - various integer formats. - - Note that these functions are deprecated - the AudioData class provides a much more - flexible set of conversion classes now. -*/ -class JUCE_API AudioDataConverters -{ -public: - //============================================================================== - static void convertFloatToInt16LE (const float* source, void* dest, int numSamples, int destBytesPerSample = 2); - static void convertFloatToInt16BE (const float* source, void* dest, int numSamples, int destBytesPerSample = 2); - - static void convertFloatToInt24LE (const float* source, void* dest, int numSamples, int destBytesPerSample = 3); - static void convertFloatToInt24BE (const float* source, void* dest, int numSamples, int destBytesPerSample = 3); - - static void convertFloatToInt32LE (const float* source, void* dest, int numSamples, int destBytesPerSample = 4); - static void convertFloatToInt32BE (const float* source, void* dest, int numSamples, int destBytesPerSample = 4); - - static void convertFloatToFloat32LE (const float* source, void* dest, int numSamples, int destBytesPerSample = 4); - static void convertFloatToFloat32BE (const float* source, void* dest, int numSamples, int destBytesPerSample = 4); - - //============================================================================== - static void convertInt16LEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 2); - static void convertInt16BEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 2); - - static void convertInt24LEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 3); - static void convertInt24BEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 3); - - static void convertInt32LEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 4); - static void convertInt32BEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 4); - - static void convertFloat32LEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 4); - static void convertFloat32BEToFloat (const void* source, float* dest, int numSamples, int srcBytesPerSample = 4); - - //============================================================================== - enum DataFormat - { - int16LE, - int16BE, - int24LE, - int24BE, - int32LE, - int32BE, - float32LE, - float32BE, - }; - - static void convertFloatToFormat (DataFormat destFormat, - const float* source, void* dest, int numSamples); - - static void convertFormatToFloat (DataFormat sourceFormat, - const void* source, float* dest, int numSamples); - - //============================================================================== - static void interleaveSamples (const float** source, float* dest, - int numSamples, int numChannels); - - static void deinterleaveSamples (const float* source, float** dest, - int numSamples, int numChannels); - -private: - AudioDataConverters(); - JUCE_DECLARE_NON_COPYABLE (AudioDataConverters) -}; - - -#endif // JUCE_AUDIODATACONVERTERS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp deleted file mode 100755 index 15b59da..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp +++ /dev/null @@ -1,670 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioSampleBuffer::AudioSampleBuffer() noexcept - : numChannels (0), size (0), allocatedBytes (0), - channels (static_cast (preallocatedChannelSpace)), - isClear (false) -{ -} - -AudioSampleBuffer::AudioSampleBuffer (const int numChans, - const int numSamples) noexcept - : numChannels (numChans), - size (numSamples) -{ - jassert (numSamples >= 0); - jassert (numChans >= 0); - - allocateData(); -} - -AudioSampleBuffer::AudioSampleBuffer (const AudioSampleBuffer& other) noexcept - : numChannels (other.numChannels), - size (other.size), - allocatedBytes (other.allocatedBytes) -{ - if (allocatedBytes == 0) - { - allocateChannels (other.channels, 0); - } - else - { - allocateData(); - - if (other.isClear) - { - clear(); - } - else - { - for (int i = 0; i < numChannels; ++i) - FloatVectorOperations::copy (channels[i], other.channels[i], size); - } - } -} - -void AudioSampleBuffer::allocateData() -{ - const size_t channelListSize = sizeof (float*) * (size_t) (numChannels + 1); - allocatedBytes = (size_t) numChannels * (size_t) size * sizeof (float) + channelListSize + 32; - allocatedData.malloc (allocatedBytes); - channels = reinterpret_cast (allocatedData.getData()); - - float* chan = (float*) (allocatedData + channelListSize); - for (int i = 0; i < numChannels; ++i) - { - channels[i] = chan; - chan += size; - } - - channels [numChannels] = nullptr; - isClear = false; -} - -AudioSampleBuffer::AudioSampleBuffer (float* const* dataToReferTo, - const int numChans, - const int numSamples) noexcept - : numChannels (numChans), - size (numSamples), - allocatedBytes (0) -{ - jassert (dataToReferTo != nullptr); - jassert (numChans >= 0 && numSamples >= 0); - allocateChannels (dataToReferTo, 0); -} - -AudioSampleBuffer::AudioSampleBuffer (float* const* dataToReferTo, - const int numChans, - const int startSample, - const int numSamples) noexcept - : numChannels (numChans), - size (numSamples), - allocatedBytes (0), - isClear (false) -{ - jassert (dataToReferTo != nullptr); - jassert (numChans >= 0 && startSample >= 0 && numSamples >= 0); - allocateChannels (dataToReferTo, startSample); -} - -void AudioSampleBuffer::setDataToReferTo (float** dataToReferTo, - const int newNumChannels, - const int newNumSamples) noexcept -{ - jassert (dataToReferTo != nullptr); - jassert (newNumChannels >= 0 && newNumSamples >= 0); - - allocatedBytes = 0; - allocatedData.free(); - - numChannels = newNumChannels; - size = newNumSamples; - - allocateChannels (dataToReferTo, 0); - jassert (! isClear); -} - -void AudioSampleBuffer::allocateChannels (float* const* const dataToReferTo, int offset) -{ - jassert (offset >= 0); - - // (try to avoid doing a malloc here, as that'll blow up things like Pro-Tools) - if (numChannels < (int) numElementsInArray (preallocatedChannelSpace)) - { - channels = static_cast (preallocatedChannelSpace); - } - else - { - allocatedData.malloc ((size_t) numChannels + 1, sizeof (float*)); - channels = reinterpret_cast (allocatedData.getData()); - } - - for (int i = 0; i < numChannels; ++i) - { - // you have to pass in the same number of valid pointers as numChannels - jassert (dataToReferTo[i] != nullptr); - - channels[i] = dataToReferTo[i] + offset; - } - - channels [numChannels] = nullptr; - isClear = false; -} - -AudioSampleBuffer& AudioSampleBuffer::operator= (const AudioSampleBuffer& other) noexcept -{ - if (this != &other) - { - setSize (other.getNumChannels(), other.getNumSamples(), false, false, false); - - if (other.isClear) - { - clear(); - } - else - { - isClear = false; - - for (int i = 0; i < numChannels; ++i) - FloatVectorOperations::copy (channels[i], other.channels[i], size); - } - } - - return *this; -} - -AudioSampleBuffer::~AudioSampleBuffer() noexcept -{ -} - -void AudioSampleBuffer::setSize (const int newNumChannels, - const int newNumSamples, - const bool keepExistingContent, - const bool clearExtraSpace, - const bool avoidReallocating) noexcept -{ - jassert (newNumChannels >= 0); - jassert (newNumSamples >= 0); - - if (newNumSamples != size || newNumChannels != numChannels) - { - const size_t allocatedSamplesPerChannel = ((size_t) newNumSamples + 3) & ~3u; - const size_t channelListSize = ((sizeof (float*) * (size_t) (newNumChannels + 1)) + 15) & ~15u; - const size_t newTotalBytes = ((size_t) newNumChannels * (size_t) allocatedSamplesPerChannel * sizeof (float)) - + channelListSize + 32; - - if (keepExistingContent) - { - HeapBlock newData; - newData.allocate (newTotalBytes, clearExtraSpace || isClear); - - const size_t numSamplesToCopy = (size_t) jmin (newNumSamples, size); - - float** const newChannels = reinterpret_cast (newData.getData()); - float* newChan = reinterpret_cast (newData + channelListSize); - - for (int j = 0; j < newNumChannels; ++j) - { - newChannels[j] = newChan; - newChan += allocatedSamplesPerChannel; - } - - if (! isClear) - { - const int numChansToCopy = jmin (numChannels, newNumChannels); - for (int i = 0; i < numChansToCopy; ++i) - FloatVectorOperations::copy (newChannels[i], channels[i], (int) numSamplesToCopy); - } - - allocatedData.swapWith (newData); - allocatedBytes = newTotalBytes; - channels = newChannels; - } - else - { - if (avoidReallocating && allocatedBytes >= newTotalBytes) - { - if (clearExtraSpace || isClear) - allocatedData.clear (newTotalBytes); - } - else - { - allocatedBytes = newTotalBytes; - allocatedData.allocate (newTotalBytes, clearExtraSpace || isClear); - channels = reinterpret_cast (allocatedData.getData()); - } - - float* chan = reinterpret_cast (allocatedData + channelListSize); - for (int i = 0; i < newNumChannels; ++i) - { - channels[i] = chan; - chan += allocatedSamplesPerChannel; - } - } - - channels [newNumChannels] = 0; - size = newNumSamples; - numChannels = newNumChannels; - } -} - -void AudioSampleBuffer::clear() noexcept -{ - if (! isClear) - { - for (int i = 0; i < numChannels; ++i) - FloatVectorOperations::clear (channels[i], size); - - isClear = true; - } -} - -void AudioSampleBuffer::clear (const int startSample, - const int numSamples) noexcept -{ - jassert (startSample >= 0 && startSample + numSamples <= size); - - if (! isClear) - { - if (startSample == 0 && numSamples == size) - isClear = true; - - for (int i = 0; i < numChannels; ++i) - FloatVectorOperations::clear (channels[i] + startSample, numSamples); - } -} - -void AudioSampleBuffer::clear (const int channel, - const int startSample, - const int numSamples) noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (startSample >= 0 && startSample + numSamples <= size); - - if (! isClear) - FloatVectorOperations::clear (channels [channel] + startSample, numSamples); -} - -float AudioSampleBuffer::getSample (int channel, int index) const noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (isPositiveAndBelow (index, size)); - return *(channels [channel] + index); -} - -void AudioSampleBuffer::setSample (int channel, int index, float newValue) noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (isPositiveAndBelow (index, size)); - *(channels [channel] + index) = newValue; - isClear = false; -} - -void AudioSampleBuffer::addSample (int channel, int index, float valueToAdd) noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (isPositiveAndBelow (index, size)); - *(channels [channel] + index) += valueToAdd; - isClear = false; -} - -void AudioSampleBuffer::applyGain (const int channel, - const int startSample, - int numSamples, - const float gain) noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (startSample >= 0 && startSample + numSamples <= size); - - if (gain != 1.0f && ! isClear) - { - float* const d = channels [channel] + startSample; - - if (gain == 0.0f) - FloatVectorOperations::clear (d, numSamples); - else - FloatVectorOperations::multiply (d, gain, numSamples); - } -} - -void AudioSampleBuffer::applyGainRamp (const int channel, - const int startSample, - int numSamples, - float startGain, - float endGain) noexcept -{ - if (! isClear) - { - if (startGain == endGain) - { - applyGain (channel, startSample, numSamples, startGain); - } - else - { - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (startSample >= 0 && startSample + numSamples <= size); - - const float increment = (endGain - startGain) / numSamples; - float* d = channels [channel] + startSample; - - while (--numSamples >= 0) - { - *d++ *= startGain; - startGain += increment; - } - } - } -} - -void AudioSampleBuffer::applyGain (int startSample, int numSamples, float gain) noexcept -{ - for (int i = 0; i < numChannels; ++i) - applyGain (i, startSample, numSamples, gain); -} - -void AudioSampleBuffer::applyGain (const float gain) noexcept -{ - applyGain (0, size, gain); -} - -void AudioSampleBuffer::applyGainRamp (int startSample, int numSamples, - float startGain, float endGain) noexcept -{ - for (int i = 0; i < numChannels; ++i) - applyGainRamp (i, startSample, numSamples, startGain, endGain); -} - -void AudioSampleBuffer::addFrom (const int destChannel, - const int destStartSample, - const AudioSampleBuffer& source, - const int sourceChannel, - const int sourceStartSample, - int numSamples, - const float gain) noexcept -{ - jassert (&source != this || sourceChannel != destChannel); - jassert (isPositiveAndBelow (destChannel, numChannels)); - jassert (destStartSample >= 0 && destStartSample + numSamples <= size); - jassert (isPositiveAndBelow (sourceChannel, source.numChannels)); - jassert (sourceStartSample >= 0 && sourceStartSample + numSamples <= source.size); - - if (gain != 0.0f && numSamples > 0 && ! source.isClear) - { - float* const d = channels [destChannel] + destStartSample; - const float* const s = source.channels [sourceChannel] + sourceStartSample; - - if (isClear) - { - isClear = false; - - if (gain != 1.0f) - FloatVectorOperations::copyWithMultiply (d, s, gain, numSamples); - else - FloatVectorOperations::copy (d, s, numSamples); - } - else - { - if (gain != 1.0f) - FloatVectorOperations::addWithMultiply (d, s, gain, numSamples); - else - FloatVectorOperations::add (d, s, numSamples); - } - } -} - -void AudioSampleBuffer::addFrom (const int destChannel, - const int destStartSample, - const float* source, - int numSamples, - const float gain) noexcept -{ - jassert (isPositiveAndBelow (destChannel, numChannels)); - jassert (destStartSample >= 0 && destStartSample + numSamples <= size); - jassert (source != nullptr); - - if (gain != 0.0f && numSamples > 0) - { - float* const d = channels [destChannel] + destStartSample; - - if (isClear) - { - isClear = false; - - if (gain != 1.0f) - FloatVectorOperations::copyWithMultiply (d, source, gain, numSamples); - else - FloatVectorOperations::copy (d, source, numSamples); - } - else - { - if (gain != 1.0f) - FloatVectorOperations::addWithMultiply (d, source, gain, numSamples); - else - FloatVectorOperations::add (d, source, numSamples); - } - } -} - -void AudioSampleBuffer::addFromWithRamp (const int destChannel, - const int destStartSample, - const float* source, - int numSamples, - float startGain, - const float endGain) noexcept -{ - jassert (isPositiveAndBelow (destChannel, numChannels)); - jassert (destStartSample >= 0 && destStartSample + numSamples <= size); - jassert (source != nullptr); - - if (startGain == endGain) - { - addFrom (destChannel, destStartSample, source, numSamples, startGain); - } - else - { - if (numSamples > 0 && (startGain != 0.0f || endGain != 0.0f)) - { - isClear = false; - const float increment = (endGain - startGain) / numSamples; - float* d = channels [destChannel] + destStartSample; - - while (--numSamples >= 0) - { - *d++ += startGain * *source++; - startGain += increment; - } - } - } -} - -void AudioSampleBuffer::copyFrom (const int destChannel, - const int destStartSample, - const AudioSampleBuffer& source, - const int sourceChannel, - const int sourceStartSample, - int numSamples) noexcept -{ - jassert (&source != this || sourceChannel != destChannel); - jassert (isPositiveAndBelow (destChannel, numChannels)); - jassert (destStartSample >= 0 && destStartSample + numSamples <= size); - jassert (isPositiveAndBelow (sourceChannel, source.numChannels)); - jassert (sourceStartSample >= 0 && sourceStartSample + numSamples <= source.size); - - if (numSamples > 0) - { - if (source.isClear) - { - if (! isClear) - FloatVectorOperations::clear (channels [destChannel] + destStartSample, numSamples); - } - else - { - isClear = false; - FloatVectorOperations::copy (channels [destChannel] + destStartSample, - source.channels [sourceChannel] + sourceStartSample, - numSamples); - } - } -} - -void AudioSampleBuffer::copyFrom (const int destChannel, - const int destStartSample, - const float* source, - int numSamples) noexcept -{ - jassert (isPositiveAndBelow (destChannel, numChannels)); - jassert (destStartSample >= 0 && destStartSample + numSamples <= size); - jassert (source != nullptr); - - if (numSamples > 0) - { - isClear = false; - FloatVectorOperations::copy (channels [destChannel] + destStartSample, source, numSamples); - } -} - -void AudioSampleBuffer::copyFrom (const int destChannel, - const int destStartSample, - const float* source, - int numSamples, - const float gain) noexcept -{ - jassert (isPositiveAndBelow (destChannel, numChannels)); - jassert (destStartSample >= 0 && destStartSample + numSamples <= size); - jassert (source != nullptr); - - if (numSamples > 0) - { - float* const d = channels [destChannel] + destStartSample; - - if (gain != 1.0f) - { - if (gain == 0) - { - if (! isClear) - FloatVectorOperations::clear (d, numSamples); - } - else - { - isClear = false; - FloatVectorOperations::copyWithMultiply (d, source, gain, numSamples); - } - } - else - { - isClear = false; - FloatVectorOperations::copy (d, source, numSamples); - } - } -} - -void AudioSampleBuffer::copyFromWithRamp (const int destChannel, - const int destStartSample, - const float* source, - int numSamples, - float startGain, - float endGain) noexcept -{ - jassert (isPositiveAndBelow (destChannel, numChannels)); - jassert (destStartSample >= 0 && destStartSample + numSamples <= size); - jassert (source != nullptr); - - if (startGain == endGain) - { - copyFrom (destChannel, destStartSample, source, numSamples, startGain); - } - else - { - if (numSamples > 0 && (startGain != 0.0f || endGain != 0.0f)) - { - isClear = false; - const float increment = (endGain - startGain) / numSamples; - float* d = channels [destChannel] + destStartSample; - - while (--numSamples >= 0) - { - *d++ = startGain * *source++; - startGain += increment; - } - } - } -} - -void AudioSampleBuffer::reverse (int channel, int startSample, int numSamples) const noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (startSample >= 0 && startSample + numSamples <= size); - - if (! isClear) - std::reverse (channels[channel] + startSample, - channels[channel] + startSample + numSamples); -} - -void AudioSampleBuffer::reverse (int startSample, int numSamples) const noexcept -{ - for (int i = 0; i < numChannels; ++i) - reverse (i, startSample, numSamples); -} - -Range AudioSampleBuffer::findMinMax (const int channel, - const int startSample, - int numSamples) const noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (startSample >= 0 && startSample + numSamples <= size); - - if (isClear) - return Range(); - - return FloatVectorOperations::findMinAndMax (channels [channel] + startSample, numSamples); -} - -float AudioSampleBuffer::getMagnitude (const int channel, - const int startSample, - const int numSamples) const noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (startSample >= 0 && startSample + numSamples <= size); - - if (isClear) - return 0.0f; - - const Range r (findMinMax (channel, startSample, numSamples)); - - return jmax (r.getStart(), -r.getStart(), r.getEnd(), -r.getEnd()); -} - -float AudioSampleBuffer::getMagnitude (int startSample, int numSamples) const noexcept -{ - float mag = 0.0f; - - if (! isClear) - for (int i = 0; i < numChannels; ++i) - mag = jmax (mag, getMagnitude (i, startSample, numSamples)); - - return mag; -} - -float AudioSampleBuffer::getRMSLevel (const int channel, - const int startSample, - const int numSamples) const noexcept -{ - jassert (isPositiveAndBelow (channel, numChannels)); - jassert (startSample >= 0 && startSample + numSamples <= size); - - if (numSamples <= 0 || channel < 0 || channel >= numChannels || isClear) - return 0.0f; - - const float* const data = channels [channel] + startSample; - double sum = 0.0; - - for (int i = 0; i < numSamples; ++i) - { - const float sample = data [i]; - sum += sample * sample; - } - - return (float) std::sqrt (sum / numSamples); -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h deleted file mode 100755 index 8b9a72c..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.h +++ /dev/null @@ -1,526 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOSAMPLEBUFFER_H_INCLUDED -#define JUCE_AUDIOSAMPLEBUFFER_H_INCLUDED - - -//============================================================================== -/** - A multi-channel buffer of 32-bit floating point audio samples. - -*/ -class JUCE_API AudioSampleBuffer -{ -public: - //============================================================================== - /** Creates an empty buffer with 0 channels and 0 length. */ - AudioSampleBuffer() noexcept; - - //============================================================================== - /** Creates a buffer with a specified number of channels and samples. - - The contents of the buffer will initially be undefined, so use clear() to - set all the samples to zero. - - The buffer will allocate its memory internally, and this will be released - when the buffer is deleted. If the memory can't be allocated, this will - throw a std::bad_alloc exception. - */ - AudioSampleBuffer (int numChannels, - int numSamples) noexcept; - - /** Creates a buffer using a pre-allocated block of memory. - - Note that if the buffer is resized or its number of channels is changed, it - will re-allocate memory internally and copy the existing data to this new area, - so it will then stop directly addressing this memory. - - @param dataToReferTo a pre-allocated array containing pointers to the data - for each channel that should be used by this buffer. The - buffer will only refer to this memory, it won't try to delete - it when the buffer is deleted or resized. - @param numChannels the number of channels to use - this must correspond to the - number of elements in the array passed in - @param numSamples the number of samples to use - this must correspond to the - size of the arrays passed in - */ - AudioSampleBuffer (float* const* dataToReferTo, - int numChannels, - int numSamples) noexcept; - - /** Creates a buffer using a pre-allocated block of memory. - - Note that if the buffer is resized or its number of channels is changed, it - will re-allocate memory internally and copy the existing data to this new area, - so it will then stop directly addressing this memory. - - @param dataToReferTo a pre-allocated array containing pointers to the data - for each channel that should be used by this buffer. The - buffer will only refer to this memory, it won't try to delete - it when the buffer is deleted or resized. - @param numChannels the number of channels to use - this must correspond to the - number of elements in the array passed in - @param startSample the offset within the arrays at which the data begins - @param numSamples the number of samples to use - this must correspond to the - size of the arrays passed in - */ - AudioSampleBuffer (float* const* dataToReferTo, - int numChannels, - int startSample, - int numSamples) noexcept; - - /** Copies another buffer. - - This buffer will make its own copy of the other's data, unless the buffer was created - using an external data buffer, in which case boths buffers will just point to the same - shared block of data. - */ - AudioSampleBuffer (const AudioSampleBuffer&) noexcept; - - /** Copies another buffer onto this one. - This buffer's size will be changed to that of the other buffer. - */ - AudioSampleBuffer& operator= (const AudioSampleBuffer&) noexcept; - - /** Destructor. - This will free any memory allocated by the buffer. - */ - ~AudioSampleBuffer() noexcept; - - //============================================================================== - /** Returns the number of channels of audio data that this buffer contains. - @see getSampleData - */ - int getNumChannels() const noexcept { return numChannels; } - - /** Returns the number of samples allocated in each of the buffer's channels. - @see getSampleData - */ - int getNumSamples() const noexcept { return size; } - - /** Returns a pointer to an array of read-only samples in one of the buffer's channels. - For speed, this doesn't check whether the channel number is out of range, - so be careful when using it! - If you need to write to the data, do NOT call this method and const_cast the - result! Instead, you must call getWritePointer so that the buffer knows you're - planning on modifying the data. - */ - const float* getReadPointer (int channelNumber) const noexcept - { - jassert (isPositiveAndBelow (channelNumber, numChannels)); - return channels [channelNumber]; - } - - /** Returns a pointer to an array of read-only samples in one of the buffer's channels. - For speed, this doesn't check whether the channel number or index are out of range, - so be careful when using it! - If you need to write to the data, do NOT call this method and const_cast the - result! Instead, you must call getWritePointer so that the buffer knows you're - planning on modifying the data. - */ - const float* getReadPointer (int channelNumber, int sampleIndex) const noexcept - { - jassert (isPositiveAndBelow (channelNumber, numChannels)); - jassert (isPositiveAndBelow (sampleIndex, size)); - return channels [channelNumber] + sampleIndex; - } - - /** Returns a writeable pointer to one of the buffer's channels. - For speed, this doesn't check whether the channel number is out of range, - so be careful when using it! - Note that if you're not planning on writing to the data, you should always - use getReadPointer instead. - */ - float* getWritePointer (int channelNumber) noexcept - { - jassert (isPositiveAndBelow (channelNumber, numChannels)); - isClear = false; - return channels [channelNumber]; - } - - /** Returns a writeable pointer to one of the buffer's channels. - For speed, this doesn't check whether the channel number or index are out of range, - so be careful when using it! - Note that if you're not planning on writing to the data, you should - use getReadPointer instead. - */ - float* getWritePointer (int channelNumber, int sampleIndex) noexcept - { - jassert (isPositiveAndBelow (channelNumber, numChannels)); - jassert (isPositiveAndBelow (sampleIndex, size)); - isClear = false; - return channels [channelNumber] + sampleIndex; - } - - /** Returns an array of pointers to the channels in the buffer. - - Don't modify any of the pointers that are returned, and bear in mind that - these will become invalid if the buffer is resized. - */ - const float** getArrayOfReadPointers() const noexcept { return const_cast (channels); } - - /** Returns an array of pointers to the channels in the buffer. - - Don't modify any of the pointers that are returned, and bear in mind that - these will become invalid if the buffer is resized. - */ - float** getArrayOfWritePointers() noexcept { isClear = false; return channels; } - - //============================================================================== - /** Changes the buffer's size or number of channels. - - This can expand or contract the buffer's length, and add or remove channels. - - If keepExistingContent is true, it will try to preserve as much of the - old data as it can in the new buffer. - - If clearExtraSpace is true, then any extra channels or space that is - allocated will be also be cleared. If false, then this space is left - uninitialised. - - If avoidReallocating is true, then changing the buffer's size won't reduce the - amount of memory that is currently allocated (but it will still increase it if - the new size is bigger than the amount it currently has). If this is false, then - a new allocation will be done so that the buffer uses takes up the minimum amount - of memory that it needs. - - If the required memory can't be allocated, this will throw a std::bad_alloc exception. - */ - void setSize (int newNumChannels, - int newNumSamples, - bool keepExistingContent = false, - bool clearExtraSpace = false, - bool avoidReallocating = false) noexcept; - - - /** Makes this buffer point to a pre-allocated set of channel data arrays. - - There's also a constructor that lets you specify arrays like this, but this - lets you change the channels dynamically. - - Note that if the buffer is resized or its number of channels is changed, it - will re-allocate memory internally and copy the existing data to this new area, - so it will then stop directly addressing this memory. - - @param dataToReferTo a pre-allocated array containing pointers to the data - for each channel that should be used by this buffer. The - buffer will only refer to this memory, it won't try to delete - it when the buffer is deleted or resized. - @param numChannels the number of channels to use - this must correspond to the - number of elements in the array passed in - @param numSamples the number of samples to use - this must correspond to the - size of the arrays passed in - */ - void setDataToReferTo (float** dataToReferTo, - int numChannels, - int numSamples) noexcept; - - //============================================================================== - /** Clears all the samples in all channels. */ - void clear() noexcept; - - /** Clears a specified region of all the channels. - - For speed, this doesn't check whether the channel and sample number - are in-range, so be careful! - */ - void clear (int startSample, - int numSamples) noexcept; - - /** Clears a specified region of just one channel. - - For speed, this doesn't check whether the channel and sample number - are in-range, so be careful! - */ - void clear (int channel, - int startSample, - int numSamples) noexcept; - - /** Returns true if the buffer has been entirely cleared. - Note that this does not actually measure the contents of the buffer - it simply - returns a flag that is set when the buffer is cleared, and which is reset whenever - functions like getWritePointer() are invoked. That means the method does not take - any time, but it may return false negatives when in fact the buffer is still empty. - */ - bool hasBeenCleared() const noexcept { return isClear; } - - //============================================================================== - /** Returns a sample from the buffer. - The channel and index are not checked - they are expected to be in-range. If not, - an assertion will be thrown, but in a release build, you're into 'undefined behaviour' - territory. - */ - float getSample (int channel, int sampleIndex) const noexcept; - - /** Sets a sample in the buffer. - The channel and index are not checked - they are expected to be in-range. If not, - an assertion will be thrown, but in a release build, you're into 'undefined behaviour' - territory. - */ - void setSample (int destChannel, int destSample, float newValue) noexcept; - - /** Adds a value to a sample in the buffer. - The channel and index are not checked - they are expected to be in-range. If not, - an assertion will be thrown, but in a release build, you're into 'undefined behaviour' - territory. - */ - void addSample (int destChannel, int destSample, float valueToAdd) noexcept; - - /** Applies a gain multiple to a region of one channel. - - For speed, this doesn't check whether the channel and sample number - are in-range, so be careful! - */ - void applyGain (int channel, - int startSample, - int numSamples, - float gain) noexcept; - - /** Applies a gain multiple to a region of all the channels. - - For speed, this doesn't check whether the sample numbers - are in-range, so be careful! - */ - void applyGain (int startSample, - int numSamples, - float gain) noexcept; - - /** Applies a gain multiple to all the audio data. */ - void applyGain (float gain) noexcept; - - /** Applies a range of gains to a region of a channel. - - The gain that is applied to each sample will vary from - startGain on the first sample to endGain on the last Sample, - so it can be used to do basic fades. - - For speed, this doesn't check whether the sample numbers - are in-range, so be careful! - */ - void applyGainRamp (int channel, - int startSample, - int numSamples, - float startGain, - float endGain) noexcept; - - /** Applies a range of gains to a region of all channels. - - The gain that is applied to each sample will vary from - startGain on the first sample to endGain on the last Sample, - so it can be used to do basic fades. - - For speed, this doesn't check whether the sample numbers - are in-range, so be careful! - */ - void applyGainRamp (int startSample, - int numSamples, - float startGain, - float endGain) noexcept; - - /** Adds samples from another buffer to this one. - - @param destChannel the channel within this buffer to add the samples to - @param destStartSample the start sample within this buffer's channel - @param source the source buffer to add from - @param sourceChannel the channel within the source buffer to read from - @param sourceStartSample the offset within the source buffer's channel to start reading samples from - @param numSamples the number of samples to process - @param gainToApplyToSource an optional gain to apply to the source samples before they are - added to this buffer's samples - - @see copyFrom - */ - void addFrom (int destChannel, - int destStartSample, - const AudioSampleBuffer& source, - int sourceChannel, - int sourceStartSample, - int numSamples, - float gainToApplyToSource = 1.0f) noexcept; - - /** Adds samples from an array of floats to one of the channels. - - @param destChannel the channel within this buffer to add the samples to - @param destStartSample the start sample within this buffer's channel - @param source the source data to use - @param numSamples the number of samples to process - @param gainToApplyToSource an optional gain to apply to the source samples before they are - added to this buffer's samples - - @see copyFrom - */ - void addFrom (int destChannel, - int destStartSample, - const float* source, - int numSamples, - float gainToApplyToSource = 1.0f) noexcept; - - /** Adds samples from an array of floats, applying a gain ramp to them. - - @param destChannel the channel within this buffer to add the samples to - @param destStartSample the start sample within this buffer's channel - @param source the source data to use - @param numSamples the number of samples to process - @param startGain the gain to apply to the first sample (this is multiplied with - the source samples before they are added to this buffer) - @param endGain the gain to apply to the final sample. The gain is linearly - interpolated between the first and last samples. - */ - void addFromWithRamp (int destChannel, - int destStartSample, - const float* source, - int numSamples, - float startGain, - float endGain) noexcept; - - /** Copies samples from another buffer to this one. - - @param destChannel the channel within this buffer to copy the samples to - @param destStartSample the start sample within this buffer's channel - @param source the source buffer to read from - @param sourceChannel the channel within the source buffer to read from - @param sourceStartSample the offset within the source buffer's channel to start reading samples from - @param numSamples the number of samples to process - - @see addFrom - */ - void copyFrom (int destChannel, - int destStartSample, - const AudioSampleBuffer& source, - int sourceChannel, - int sourceStartSample, - int numSamples) noexcept; - - /** Copies samples from an array of floats into one of the channels. - - @param destChannel the channel within this buffer to copy the samples to - @param destStartSample the start sample within this buffer's channel - @param source the source buffer to read from - @param numSamples the number of samples to process - - @see addFrom - */ - void copyFrom (int destChannel, - int destStartSample, - const float* source, - int numSamples) noexcept; - - /** Copies samples from an array of floats into one of the channels, applying a gain to it. - - @param destChannel the channel within this buffer to copy the samples to - @param destStartSample the start sample within this buffer's channel - @param source the source buffer to read from - @param numSamples the number of samples to process - @param gain the gain to apply - - @see addFrom - */ - void copyFrom (int destChannel, - int destStartSample, - const float* source, - int numSamples, - float gain) noexcept; - - /** Copies samples from an array of floats into one of the channels, applying a gain ramp. - - @param destChannel the channel within this buffer to copy the samples to - @param destStartSample the start sample within this buffer's channel - @param source the source buffer to read from - @param numSamples the number of samples to process - @param startGain the gain to apply to the first sample (this is multiplied with - the source samples before they are copied to this buffer) - @param endGain the gain to apply to the final sample. The gain is linearly - interpolated between the first and last samples. - - @see addFrom - */ - void copyFromWithRamp (int destChannel, - int destStartSample, - const float* source, - int numSamples, - float startGain, - float endGain) noexcept; - - - /** Returns a Range indicating the lowest and highest sample values in a given section. - - @param channel the channel to read from - @param startSample the start sample within the channel - @param numSamples the number of samples to check - */ - Range findMinMax (int channel, - int startSample, - int numSamples) const noexcept; - - /** Finds the highest absolute sample value within a region of a channel. */ - float getMagnitude (int channel, - int startSample, - int numSamples) const noexcept; - - /** Finds the highest absolute sample value within a region on all channels. */ - float getMagnitude (int startSample, - int numSamples) const noexcept; - - /** Returns the root mean squared level for a region of a channel. */ - float getRMSLevel (int channel, - int startSample, - int numSamples) const noexcept; - - /** Reverses a part of a channel. */ - void reverse (int channel, int startSample, int numSamples) const noexcept; - - /** Reverses a part of the buffer. */ - void reverse (int startSample, int numSamples) const noexcept; - - //============================================================================== - #ifndef DOXYGEN - // Note that these methods have now been replaced by getReadPointer() and getWritePointer() - JUCE_DEPRECATED_WITH_BODY (const float* getSampleData (int channel) const, { return getReadPointer (channel); }) - JUCE_DEPRECATED_WITH_BODY (const float* getSampleData (int channel, int index) const, { return getReadPointer (channel, index); }) - JUCE_DEPRECATED_WITH_BODY (float* getSampleData (int channel), { return getWritePointer (channel); }) - JUCE_DEPRECATED_WITH_BODY (float* getSampleData (int channel, int index), { return getWritePointer (channel, index); }) - - // These have been replaced by getArrayOfReadPointers() and getArrayOfWritePointers() - JUCE_DEPRECATED_WITH_BODY (const float** getArrayOfChannels() const, { return getArrayOfReadPointers(); }) - JUCE_DEPRECATED_WITH_BODY (float** getArrayOfChannels(), { return getArrayOfWritePointers(); }) - #endif - -private: - //============================================================================== - int numChannels, size; - size_t allocatedBytes; - float** channels; - HeapBlock allocatedData; - float* preallocatedChannelSpace [32]; - bool isClear; - - void allocateData(); - void allocateChannels (float* const*, int offset); - - JUCE_LEAK_DETECTOR (AudioSampleBuffer) -}; - - -#endif // JUCE_AUDIOSAMPLEBUFFER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp deleted file mode 100755 index 67a7297..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp +++ /dev/null @@ -1,1043 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace FloatVectorHelpers -{ - #define JUCE_INCREMENT_SRC_DEST dest += (16 / sizeof (*dest)); src += (16 / sizeof (*dest)); - #define JUCE_INCREMENT_SRC1_SRC2_DEST dest += (16 / sizeof (*dest)); src1 += (16 / sizeof (*dest)); src2 += (16 / sizeof (*dest)); - #define JUCE_INCREMENT_DEST dest += (16 / sizeof (*dest)); - - #if JUCE_USE_SSE_INTRINSICS - static bool sse2Present = false; - - static bool isSSE2Available() noexcept - { - if (sse2Present) - return true; - - sse2Present = SystemStats::hasSSE2(); - return sse2Present; - } - - inline static bool isAligned (const void* p) noexcept - { - return (((pointer_sized_int) p) & 15) == 0; - } - - struct BasicOps32 - { - typedef float Type; - typedef __m128 ParallelType; - enum { numParallel = 4 }; - - static forcedinline ParallelType load1 (Type v) noexcept { return _mm_load1_ps (&v); } - static forcedinline ParallelType loadA (const Type* v) noexcept { return _mm_load_ps (v); } - static forcedinline ParallelType loadU (const Type* v) noexcept { return _mm_loadu_ps (v); } - static forcedinline void storeA (Type* dest, ParallelType a) noexcept { _mm_store_ps (dest, a); } - static forcedinline void storeU (Type* dest, ParallelType a) noexcept { _mm_storeu_ps (dest, a); } - - static forcedinline ParallelType add (ParallelType a, ParallelType b) noexcept { return _mm_add_ps (a, b); } - static forcedinline ParallelType sub (ParallelType a, ParallelType b) noexcept { return _mm_sub_ps (a, b); } - static forcedinline ParallelType mul (ParallelType a, ParallelType b) noexcept { return _mm_mul_ps (a, b); } - static forcedinline ParallelType max (ParallelType a, ParallelType b) noexcept { return _mm_max_ps (a, b); } - static forcedinline ParallelType min (ParallelType a, ParallelType b) noexcept { return _mm_min_ps (a, b); } - - static forcedinline Type max (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmax (v[0], v[1], v[2], v[3]); } - static forcedinline Type min (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmin (v[0], v[1], v[2], v[3]); } - }; - - struct BasicOps64 - { - typedef double Type; - typedef __m128d ParallelType; - enum { numParallel = 2 }; - - static forcedinline ParallelType load1 (Type v) noexcept { return _mm_load1_pd (&v); } - static forcedinline ParallelType loadA (const Type* v) noexcept { return _mm_load_pd (v); } - static forcedinline ParallelType loadU (const Type* v) noexcept { return _mm_loadu_pd (v); } - static forcedinline void storeA (Type* dest, ParallelType a) noexcept { _mm_store_pd (dest, a); } - static forcedinline void storeU (Type* dest, ParallelType a) noexcept { _mm_storeu_pd (dest, a); } - - static forcedinline ParallelType add (ParallelType a, ParallelType b) noexcept { return _mm_add_pd (a, b); } - static forcedinline ParallelType sub (ParallelType a, ParallelType b) noexcept { return _mm_sub_pd (a, b); } - static forcedinline ParallelType mul (ParallelType a, ParallelType b) noexcept { return _mm_mul_pd (a, b); } - static forcedinline ParallelType max (ParallelType a, ParallelType b) noexcept { return _mm_max_pd (a, b); } - static forcedinline ParallelType min (ParallelType a, ParallelType b) noexcept { return _mm_min_pd (a, b); } - - static forcedinline Type max (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmax (v[0], v[1]); } - static forcedinline Type min (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmin (v[0], v[1]); } - }; - - #define JUCE_BEGIN_VEC_OP \ - typedef FloatVectorHelpers::ModeType::Mode Mode; \ - if (FloatVectorHelpers::isSSE2Available()) \ - { \ - const int numLongOps = num / Mode::numParallel; - - #define JUCE_FINISH_VEC_OP(normalOp) \ - num &= (Mode::numParallel - 1); \ - if (num == 0) return; \ - } \ - for (int i = 0; i < num; ++i) normalOp; - - #define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \ - JUCE_BEGIN_VEC_OP \ - setupOp \ - if (FloatVectorHelpers::isAligned (dest)) JUCE_VEC_LOOP (vecOp, dummy, Mode::loadA, Mode::storeA, locals, JUCE_INCREMENT_DEST) \ - else JUCE_VEC_LOOP (vecOp, dummy, Mode::loadU, Mode::storeU, locals, JUCE_INCREMENT_DEST) \ - JUCE_FINISH_VEC_OP (normalOp) - - #define JUCE_PERFORM_VEC_OP_SRC_DEST(normalOp, vecOp, locals, increment, setupOp) \ - JUCE_BEGIN_VEC_OP \ - setupOp \ - if (FloatVectorHelpers::isAligned (dest)) \ - { \ - if (FloatVectorHelpers::isAligned (src)) JUCE_VEC_LOOP (vecOp, Mode::loadA, Mode::loadA, Mode::storeA, locals, increment) \ - else JUCE_VEC_LOOP (vecOp, Mode::loadU, Mode::loadA, Mode::storeA, locals, increment) \ - }\ - else \ - { \ - if (FloatVectorHelpers::isAligned (src)) JUCE_VEC_LOOP (vecOp, Mode::loadA, Mode::loadU, Mode::storeU, locals, increment) \ - else JUCE_VEC_LOOP (vecOp, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ - } \ - JUCE_FINISH_VEC_OP (normalOp) - - #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST(normalOp, vecOp, locals, increment, setupOp) \ - JUCE_BEGIN_VEC_OP \ - setupOp \ - { \ - Mode::ParallelType (&loadSrc1) (const Mode::Type* v) = FloatVectorHelpers::isAligned (src1) ? Mode::loadA : Mode::loadU; \ - Mode::ParallelType (&loadSrc2) (const Mode::Type* v) = FloatVectorHelpers::isAligned (src2) ? Mode::loadA : Mode::loadU; \ - void (&storeDst) (Mode::Type* dest, Mode::ParallelType a) = FloatVectorHelpers::isAligned (dest) ? Mode::storeA : Mode::storeU; \ - JUCE_VEC_LOOP_TWO_SOURCES (vecOp, loadSrc1, loadSrc2, storeDst, locals, increment); \ - } \ - JUCE_FINISH_VEC_OP (normalOp) - - #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST(normalOp, vecOp, locals, increment, setupOp) \ - JUCE_BEGIN_VEC_OP \ - setupOp \ - { \ - Mode::ParallelType (&loadSrc1) (const Mode::Type* v) = FloatVectorHelpers::isAligned (src1) ? Mode::loadA : Mode::loadU; \ - Mode::ParallelType (&loadSrc2) (const Mode::Type* v) = FloatVectorHelpers::isAligned (src2) ? Mode::loadA : Mode::loadU; \ - Mode::ParallelType (&loadDst) (const Mode::Type* v) = FloatVectorHelpers::isAligned (dest) ? Mode::loadA : Mode::loadU; \ - void (&storeDst) (Mode::Type* dest, Mode::ParallelType a) = FloatVectorHelpers::isAligned (dest) ? Mode::storeA : Mode::storeU; \ - JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, loadSrc1, loadSrc2, loadDst, storeDst, locals, increment); \ - } \ - JUCE_FINISH_VEC_OP (normalOp) - - - //============================================================================== - #elif JUCE_USE_ARM_NEON - - struct BasicOps32 - { - typedef float Type; - typedef float32x4_t ParallelType; - enum { numParallel = 4 }; - - static forcedinline ParallelType load1 (Type v) noexcept { return vld1q_dup_f32 (&v); } - static forcedinline ParallelType loadA (const Type* v) noexcept { return vld1q_f32 (v); } - static forcedinline ParallelType loadU (const Type* v) noexcept { return vld1q_f32 (v); } - static forcedinline void storeA (Type* dest, ParallelType a) noexcept { vst1q_f32 (dest, a); } - static forcedinline void storeU (Type* dest, ParallelType a) noexcept { vst1q_f32 (dest, a); } - - static forcedinline ParallelType add (ParallelType a, ParallelType b) noexcept { return vaddq_f32 (a, b); } - static forcedinline ParallelType sub (ParallelType a, ParallelType b) noexcept { return vsubq_f32 (a, b); } - static forcedinline ParallelType mul (ParallelType a, ParallelType b) noexcept { return vmulq_f32 (a, b); } - static forcedinline ParallelType max (ParallelType a, ParallelType b) noexcept { return vmaxq_f32 (a, b); } - static forcedinline ParallelType min (ParallelType a, ParallelType b) noexcept { return vminq_f32 (a, b); } - - static forcedinline Type max (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmax (v[0], v[1], v[2], v[3]); } - static forcedinline Type min (ParallelType a) noexcept { Type v[numParallel]; storeU (v, a); return jmin (v[0], v[1], v[2], v[3]); } - }; - - struct BasicOps64 - { - typedef double Type; - typedef double ParallelType; - enum { numParallel = 1 }; - - static forcedinline ParallelType load1 (Type v) noexcept { return v; } - static forcedinline ParallelType loadA (const Type* v) noexcept { return *v; } - static forcedinline ParallelType loadU (const Type* v) noexcept { return *v; } - static forcedinline void storeA (Type* dest, ParallelType a) noexcept { *dest = a; } - static forcedinline void storeU (Type* dest, ParallelType a) noexcept { *dest = a; } - - static forcedinline ParallelType add (ParallelType a, ParallelType b) noexcept { return a + b; } - static forcedinline ParallelType sub (ParallelType a, ParallelType b) noexcept { return a - b; } - static forcedinline ParallelType mul (ParallelType a, ParallelType b) noexcept { return a * b; } - static forcedinline ParallelType max (ParallelType a, ParallelType b) noexcept { return jmax (a, b); } - static forcedinline ParallelType min (ParallelType a, ParallelType b) noexcept { return jmin (a, b); } - - static forcedinline Type max (ParallelType a) noexcept { return a; } - static forcedinline Type min (ParallelType a) noexcept { return a; } - }; - - #define JUCE_BEGIN_VEC_OP \ - typedef FloatVectorHelpers::ModeType::Mode Mode; \ - if (Mode::numParallel > 1) \ - { \ - const int numLongOps = num / Mode::numParallel; - - #define JUCE_FINISH_VEC_OP(normalOp) \ - num &= (Mode::numParallel - 1); \ - if (num == 0) return; \ - } \ - for (int i = 0; i < num; ++i) normalOp; - - #define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \ - JUCE_BEGIN_VEC_OP \ - setupOp \ - JUCE_VEC_LOOP (vecOp, dummy, Mode::loadU, Mode::storeU, locals, JUCE_INCREMENT_DEST) \ - JUCE_FINISH_VEC_OP (normalOp) - - #define JUCE_PERFORM_VEC_OP_SRC_DEST(normalOp, vecOp, locals, increment, setupOp) \ - JUCE_BEGIN_VEC_OP \ - setupOp \ - JUCE_VEC_LOOP (vecOp, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ - JUCE_FINISH_VEC_OP (normalOp) - - #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST(normalOp, vecOp, locals, increment, setupOp) \ - JUCE_BEGIN_VEC_OP \ - setupOp \ - JUCE_VEC_LOOP_TWO_SOURCES (vecOp, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ - JUCE_FINISH_VEC_OP (normalOp) - - #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST(normalOp, vecOp, locals, increment, setupOp) \ - JUCE_BEGIN_VEC_OP \ - setupOp \ - JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD (vecOp, Mode::loadU, Mode::loadU, Mode::loadU, Mode::storeU, locals, increment) \ - JUCE_FINISH_VEC_OP (normalOp) - - - //============================================================================== - #else - #define JUCE_PERFORM_VEC_OP_DEST(normalOp, vecOp, locals, setupOp) \ - for (int i = 0; i < num; ++i) normalOp; - - #define JUCE_PERFORM_VEC_OP_SRC_DEST(normalOp, vecOp, locals, increment, setupOp) \ - for (int i = 0; i < num; ++i) normalOp; - - #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST(normalOp, vecOp, locals, increment, setupOp) \ - for (int i = 0; i < num; ++i) normalOp; - - #define JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST(normalOp, vecOp, locals, increment, setupOp) \ - for (int i = 0; i < num; ++i) normalOp; - - #endif - - //============================================================================== - #define JUCE_VEC_LOOP(vecOp, srcLoad, dstLoad, dstStore, locals, increment) \ - for (int i = 0; i < numLongOps; ++i) \ - { \ - locals (srcLoad, dstLoad); \ - dstStore (dest, vecOp); \ - increment; \ - } - - #define JUCE_VEC_LOOP_TWO_SOURCES(vecOp, src1Load, src2Load, dstStore, locals, increment) \ - for (int i = 0; i < numLongOps; ++i) \ - { \ - locals (src1Load, src2Load); \ - dstStore (dest, vecOp); \ - increment; \ - } - - #define JUCE_VEC_LOOP_TWO_SOURCES_WITH_DEST_LOAD(vecOp, src1Load, src2Load, dstLoad, dstStore, locals, increment) \ - for (int i = 0; i < numLongOps; ++i) \ - { \ - locals (src1Load, src2Load, dstLoad); \ - dstStore (dest, vecOp); \ - increment; \ - } - - #define JUCE_LOAD_NONE(srcLoad, dstLoad) - #define JUCE_LOAD_DEST(srcLoad, dstLoad) const Mode::ParallelType d = dstLoad (dest); - #define JUCE_LOAD_SRC(srcLoad, dstLoad) const Mode::ParallelType s = srcLoad (src); - #define JUCE_LOAD_SRC1_SRC2(src1Load, src2Load) const Mode::ParallelType s1 = src1Load (src1), s2 = src2Load (src2); - #define JUCE_LOAD_SRC1_SRC2_DEST(src1Load, src2Load, dstLoad) const Mode::ParallelType d = dstLoad (dest), s1 = src1Load (src1), s2 = src2Load (src2); - #define JUCE_LOAD_SRC_DEST(srcLoad, dstLoad) const Mode::ParallelType d = dstLoad (dest), s = srcLoad (src); - - #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON - template struct ModeType { typedef BasicOps32 Mode; }; - template<> struct ModeType<8> { typedef BasicOps64 Mode; }; - - template - struct MinMax - { - typedef typename Mode::Type Type; - typedef typename Mode::ParallelType ParallelType; - - static Type findMinOrMax (const Type* src, int num, const bool isMinimum) noexcept - { - int numLongOps = num / Mode::numParallel; - - #if JUCE_USE_SSE_INTRINSICS - if (numLongOps > 1 && isSSE2Available()) - #else - if (numLongOps > 1) - #endif - { - ParallelType val; - - #if ! JUCE_USE_ARM_NEON - if (isAligned (src)) - { - val = Mode::loadA (src); - - if (isMinimum) - { - while (--numLongOps > 0) - { - src += Mode::numParallel; - val = Mode::min (val, Mode::loadA (src)); - } - } - else - { - while (--numLongOps > 0) - { - src += Mode::numParallel; - val = Mode::max (val, Mode::loadA (src)); - } - } - } - else - #endif - { - val = Mode::loadU (src); - - if (isMinimum) - { - while (--numLongOps > 0) - { - src += Mode::numParallel; - val = Mode::min (val, Mode::loadU (src)); - } - } - else - { - while (--numLongOps > 0) - { - src += Mode::numParallel; - val = Mode::max (val, Mode::loadU (src)); - } - } - } - - Type result = isMinimum ? Mode::min (val) - : Mode::max (val); - - num &= (Mode::numParallel - 1); - src += Mode::numParallel; - - for (int i = 0; i < num; ++i) - result = isMinimum ? jmin (result, src[i]) - : jmax (result, src[i]); - - return result; - } - - return isMinimum ? juce::findMinimum (src, num) - : juce::findMaximum (src, num); - } - - static Range findMinAndMax (const Type* src, int num) noexcept - { - int numLongOps = num / Mode::numParallel; - - #if JUCE_USE_SSE_INTRINSICS - if (numLongOps > 1 && isSSE2Available()) - #else - if (numLongOps > 1) - #endif - { - ParallelType mn, mx; - - #if ! JUCE_USE_ARM_NEON - if (isAligned (src)) - { - mn = Mode::loadA (src); - mx = mn; - - while (--numLongOps > 0) - { - src += Mode::numParallel; - const ParallelType v = Mode::loadA (src); - mn = Mode::min (mn, v); - mx = Mode::max (mx, v); - } - } - else - #endif - { - mn = Mode::loadU (src); - mx = mn; - - while (--numLongOps > 0) - { - src += Mode::numParallel; - const ParallelType v = Mode::loadU (src); - mn = Mode::min (mn, v); - mx = Mode::max (mx, v); - } - } - - Range result (Mode::min (mn), - Mode::max (mx)); - - num &= (Mode::numParallel - 1); - src += Mode::numParallel; - - for (int i = 0; i < num; ++i) - result = result.getUnionWith (src[i]); - - return result; - } - - return Range::findMinAndMax (src, num); - } - }; - #endif -} - -//============================================================================== -void JUCE_CALLTYPE FloatVectorOperations::clear (float* dest, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vclr (dest, 1, (size_t) num); - #else - zeromem (dest, num * sizeof (float)); - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::clear (double* dest, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vclrD (dest, 1, (size_t) num); - #else - zeromem (dest, num * sizeof (double)); - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::fill (float* dest, float valueToFill, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vfill (&valueToFill, dest, 1, (size_t) num); - #else - JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill, val, JUCE_LOAD_NONE, - const Mode::ParallelType val = Mode::load1 (valueToFill);) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::fill (double* dest, double valueToFill, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vfillD (&valueToFill, dest, 1, (size_t) num); - #else - JUCE_PERFORM_VEC_OP_DEST (dest[i] = valueToFill, val, JUCE_LOAD_NONE, - const Mode::ParallelType val = Mode::load1 (valueToFill);) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::copy (float* dest, const float* src, int num) noexcept -{ - memcpy (dest, src, (size_t) num * sizeof (float)); -} - -void JUCE_CALLTYPE FloatVectorOperations::copy (double* dest, const double* src, int num) noexcept -{ - memcpy (dest, src, (size_t) num * sizeof (double)); -} - -void JUCE_CALLTYPE FloatVectorOperations::copyWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vsmul (src, 1, &multiplier, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType mult = Mode::load1 (multiplier);) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::copyWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vsmulD (src, 1, &multiplier, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType mult = Mode::load1 (multiplier);) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, float amount, int num) noexcept -{ - JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount, Mode::add (d, amountToAdd), JUCE_LOAD_DEST, - const Mode::ParallelType amountToAdd = Mode::load1 (amount);) -} - -void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, double amount, int num) noexcept -{ - JUCE_PERFORM_VEC_OP_DEST (dest[i] += amount, Mode::add (d, amountToAdd), JUCE_LOAD_DEST, - const Mode::ParallelType amountToAdd = Mode::load1 (amount);) -} - -void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, float* src, float amount, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vsadd (src, 1, &amount, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount, Mode::add (am, s), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType am = Mode::load1 (amount);) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, double* src, double amount, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vsaddD (src, 1, &amount, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] + amount, Mode::add (am, s), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType am = Mode::load1 (amount);) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, const float* src, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vadd (src, 1, dest, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i], Mode::add (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, const double* src, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vaddD (src, 1, dest, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i], Mode::add (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::add (float* dest, const float* src1, const float* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vadd (src1, 1, src2, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i], Mode::add (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::add (double* dest, const double* src1, const double* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vaddD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] + src2[i], Mode::add (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::subtract (float* dest, const float* src, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vsub (src, 1, dest, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i], Mode::sub (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::subtract (double* dest, const double* src, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vsubD (src, 1, dest, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] -= src[i], Mode::sub (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::subtract (float* dest, const float* src1, const float* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vsub (src2, 1, src1, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i], Mode::sub (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::subtract (double* dest, const double* src1, const double* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vsubD (src2, 1, src1, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] - src2[i], Mode::sub (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (float* dest, const float* src, float multiplier, int num) noexcept -{ - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier, Mode::add (d, Mode::mul (mult, s)), - JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType mult = Mode::load1 (multiplier);) -} - -void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (double* dest, const double* src, double multiplier, int num) noexcept -{ - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] += src[i] * multiplier, Mode::add (d, Mode::mul (mult, s)), - JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType mult = Mode::load1 (multiplier);) -} - -void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vma ((float*) src1, 1, (float*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i], Mode::add (d, Mode::mul (s1, s2)), - JUCE_LOAD_SRC1_SRC2_DEST, - JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::addWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vmaD ((double*) src1, 1, (double*) src2, 1, dest, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST_DEST (dest[i] += src1[i] * src2[i], Mode::add (d, Mode::mul (s1, s2)), - JUCE_LOAD_SRC1_SRC2_DEST, - JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vmul (src, 1, dest, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i], Mode::mul (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vmulD (src, 1, dest, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] *= src[i], Mode::mul (d, s), JUCE_LOAD_SRC_DEST, JUCE_INCREMENT_SRC_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src1, const float* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vmul (src1, 1, src2, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i], Mode::mul (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src1, const double* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vmulD (src1, 1, src2, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = src1[i] * src2[i], Mode::mul (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, float multiplier, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vsmul (dest, 1, &multiplier, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier, Mode::mul (d, mult), JUCE_LOAD_DEST, - const Mode::ParallelType mult = Mode::load1 (multiplier);) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, double multiplier, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vsmulD (dest, 1, &multiplier, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_DEST (dest[i] *= multiplier, Mode::mul (d, mult), JUCE_LOAD_DEST, - const Mode::ParallelType mult = Mode::load1 (multiplier);) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::multiply (float* dest, const float* src, float multiplier, int num) noexcept -{ - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType mult = Mode::load1 (multiplier);) -} - -void JUCE_CALLTYPE FloatVectorOperations::multiply (double* dest, const double* src, double multiplier, int num) noexcept -{ - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, Mode::mul (mult, s), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType mult = Mode::load1 (multiplier);) -} - -void FloatVectorOperations::negate (float* dest, const float* src, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vneg ((float*) src, 1, dest, 1, (vDSP_Length) num); - #else - copyWithMultiply (dest, src, -1.0f, num); - #endif -} - -void FloatVectorOperations::negate (double* dest, const double* src, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vnegD ((double*) src, 1, dest, 1, (vDSP_Length) num); - #else - copyWithMultiply (dest, src, -1.0f, num); - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::convertFixedToFloat (float* dest, const int* src, float multiplier, int num) noexcept -{ - #if JUCE_USE_ARM_NEON - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, - vmulq_n_f32 (vcvtq_f32_s32 (vld1q_s32 (src)), multiplier), - JUCE_LOAD_NONE, JUCE_INCREMENT_SRC_DEST, ) - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = src[i] * multiplier, - Mode::mul (mult, _mm_cvtepi32_ps (_mm_loadu_si128 ((const __m128i*) src))), - JUCE_LOAD_NONE, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType mult = Mode::load1 (multiplier);) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::min (float* dest, const float* src, float comp, int num) noexcept -{ - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp), Mode::min (s, cmp), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType cmp = Mode::load1 (comp);) -} - -void JUCE_CALLTYPE FloatVectorOperations::min (double* dest, const double* src, double comp, int num) noexcept -{ - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmin (src[i], comp), Mode::min (s, cmp), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType cmp = Mode::load1 (comp);) -} - -void JUCE_CALLTYPE FloatVectorOperations::min (float* dest, const float* src1, const float* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vmin ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]), Mode::min (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::min (double* dest, const double* src1, const double* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vminD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmin (src1[i], src2[i]), Mode::min (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::max (float* dest, const float* src, float comp, int num) noexcept -{ - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp), Mode::max (s, cmp), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType cmp = Mode::load1 (comp);) -} - -void JUCE_CALLTYPE FloatVectorOperations::max (double* dest, const double* src, double comp, int num) noexcept -{ - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (src[i], comp), Mode::max (s, cmp), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType cmp = Mode::load1 (comp);) -} - -void JUCE_CALLTYPE FloatVectorOperations::max (float* dest, const float* src1, const float* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vmax ((float*) src1, 1, (float*) src2, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]), Mode::max (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::max (double* dest, const double* src1, const double* src2, int num) noexcept -{ - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vmaxD ((double*) src1, 1, (double*) src2, 1, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC1_SRC2_DEST (dest[i] = jmax (src1[i], src2[i]), Mode::max (s1, s2), JUCE_LOAD_SRC1_SRC2, JUCE_INCREMENT_SRC1_SRC2_DEST, ) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::clip (float* dest, const float* src, float low, float high, int num) noexcept -{ - jassert(high >= low); - - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vclip ((float*) src, 1, &low, &high, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low), Mode::max (Mode::min (s, hi), lo), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType lo = Mode::load1 (low); const Mode::ParallelType hi = Mode::load1 (high);) - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::clip (double* dest, const double* src, double low, double high, int num) noexcept -{ - jassert(high >= low); - - #if JUCE_USE_VDSP_FRAMEWORK - vDSP_vclipD ((double*) src, 1, &low, &high, dest, 1, (vDSP_Length) num); - #else - JUCE_PERFORM_VEC_OP_SRC_DEST (dest[i] = jmax (jmin (src[i], high), low), Mode::max (Mode::min (s, hi), lo), - JUCE_LOAD_SRC, JUCE_INCREMENT_SRC_DEST, - const Mode::ParallelType lo = Mode::load1 (low); const Mode::ParallelType hi = Mode::load1 (high);) - #endif -} - -Range JUCE_CALLTYPE FloatVectorOperations::findMinAndMax (const float* src, int num) noexcept -{ - #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON - return FloatVectorHelpers::MinMax::findMinAndMax (src, num); - #else - return Range::findMinAndMax (src, num); - #endif -} - -Range JUCE_CALLTYPE FloatVectorOperations::findMinAndMax (const double* src, int num) noexcept -{ - #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON - return FloatVectorHelpers::MinMax::findMinAndMax (src, num); - #else - return Range::findMinAndMax (src, num); - #endif -} - -float JUCE_CALLTYPE FloatVectorOperations::findMinimum (const float* src, int num) noexcept -{ - #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON - return FloatVectorHelpers::MinMax::findMinOrMax (src, num, true); - #else - return juce::findMinimum (src, num); - #endif -} - -double JUCE_CALLTYPE FloatVectorOperations::findMinimum (const double* src, int num) noexcept -{ - #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON - return FloatVectorHelpers::MinMax::findMinOrMax (src, num, true); - #else - return juce::findMinimum (src, num); - #endif -} - -float JUCE_CALLTYPE FloatVectorOperations::findMaximum (const float* src, int num) noexcept -{ - #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON - return FloatVectorHelpers::MinMax::findMinOrMax (src, num, false); - #else - return juce::findMaximum (src, num); - #endif -} - -double JUCE_CALLTYPE FloatVectorOperations::findMaximum (const double* src, int num) noexcept -{ - #if JUCE_USE_SSE_INTRINSICS || JUCE_USE_ARM_NEON - return FloatVectorHelpers::MinMax::findMinOrMax (src, num, false); - #else - return juce::findMaximum (src, num); - #endif -} - -void JUCE_CALLTYPE FloatVectorOperations::enableFlushToZeroMode (bool shouldEnable) noexcept -{ - #if JUCE_USE_SSE_INTRINSICS - if (FloatVectorHelpers::isSSE2Available()) - _MM_SET_FLUSH_ZERO_MODE (shouldEnable ? _MM_FLUSH_ZERO_ON : _MM_FLUSH_ZERO_OFF); - #endif - (void) shouldEnable; -} - -//============================================================================== -//============================================================================== -#if JUCE_UNIT_TESTS - -class FloatVectorOperationsTests : public UnitTest -{ -public: - FloatVectorOperationsTests() : UnitTest ("FloatVectorOperations") {} - - template - struct TestRunner - { - static void runTest (UnitTest& u, Random random) - { - const int range = random.nextBool() ? 500 : 10; - const int num = random.nextInt (range) + 1; - - HeapBlock buffer1 ((size_t) num + 16), buffer2 ((size_t) num + 16); - HeapBlock buffer3 ((size_t) num + 16); - - #if JUCE_ARM - ValueType* const data1 = buffer1; - ValueType* const data2 = buffer2; - int* const int1 = buffer3; - #else - ValueType* const data1 = addBytesToPointer (buffer1.getData(), random.nextInt (16)); - ValueType* const data2 = addBytesToPointer (buffer2.getData(), random.nextInt (16)); - int* const int1 = addBytesToPointer (buffer3.getData(), random.nextInt (16)); - #endif - - fillRandomly (random, data1, num); - fillRandomly (random, data2, num); - - Range minMax1 (FloatVectorOperations::findMinAndMax (data1, num)); - Range minMax2 (Range::findMinAndMax (data1, num)); - u.expect (minMax1 == minMax2); - - u.expect (valuesMatch (FloatVectorOperations::findMinimum (data1, num), juce::findMinimum (data1, num))); - u.expect (valuesMatch (FloatVectorOperations::findMaximum (data1, num), juce::findMaximum (data1, num))); - - u.expect (valuesMatch (FloatVectorOperations::findMinimum (data2, num), juce::findMinimum (data2, num))); - u.expect (valuesMatch (FloatVectorOperations::findMaximum (data2, num), juce::findMaximum (data2, num))); - - FloatVectorOperations::clear (data1, num); - u.expect (areAllValuesEqual (data1, num, 0)); - - FloatVectorOperations::fill (data1, (ValueType) 2, num); - u.expect (areAllValuesEqual (data1, num, (ValueType) 2)); - - FloatVectorOperations::add (data1, (ValueType) 2, num); - u.expect (areAllValuesEqual (data1, num, (ValueType) 4)); - - FloatVectorOperations::copy (data2, data1, num); - u.expect (areAllValuesEqual (data2, num, (ValueType) 4)); - - FloatVectorOperations::add (data2, data1, num); - u.expect (areAllValuesEqual (data2, num, (ValueType) 8)); - - FloatVectorOperations::copyWithMultiply (data2, data1, (ValueType) 4, num); - u.expect (areAllValuesEqual (data2, num, (ValueType) 16)); - - FloatVectorOperations::addWithMultiply (data2, data1, (ValueType) 4, num); - u.expect (areAllValuesEqual (data2, num, (ValueType) 32)); - - FloatVectorOperations::multiply (data1, (ValueType) 2, num); - u.expect (areAllValuesEqual (data1, num, (ValueType) 8)); - - FloatVectorOperations::multiply (data1, data2, num); - u.expect (areAllValuesEqual (data1, num, (ValueType) 256)); - - FloatVectorOperations::negate (data2, data1, num); - u.expect (areAllValuesEqual (data2, num, (ValueType) -256)); - - FloatVectorOperations::subtract (data1, data2, num); - u.expect (areAllValuesEqual (data1, num, (ValueType) 512)); - - fillRandomly (random, int1, num); - doConversionTest (u, data1, data2, int1, num); - - FloatVectorOperations::fill (data1, (ValueType) 2, num); - FloatVectorOperations::fill (data2, (ValueType) 3, num); - FloatVectorOperations::addWithMultiply (data1, data1, data2, num); - u.expect (areAllValuesEqual (data1, num, (ValueType) 8)); - } - - static void doConversionTest (UnitTest& u, float* data1, float* data2, int* const int1, int num) - { - FloatVectorOperations::convertFixedToFloat (data1, int1, 2.0f, num); - convertFixed (data2, int1, 2.0f, num); - u.expect (buffersMatch (data1, data2, num)); - } - - static void doConversionTest (UnitTest&, double*, double*, int*, int) {} - - static void fillRandomly (Random& random, ValueType* d, int num) - { - while (--num >= 0) - *d++ = (ValueType) (random.nextDouble() * 1000.0); - } - - static void fillRandomly (Random& random, int* d, int num) - { - while (--num >= 0) - *d++ = random.nextInt(); - } - - static void convertFixed (float* d, const int* s, ValueType multiplier, int num) - { - while (--num >= 0) - *d++ = *s++ * multiplier; - } - - static bool areAllValuesEqual (const ValueType* d, int num, ValueType target) - { - while (--num >= 0) - if (*d++ != target) - return false; - - return true; - } - - static bool buffersMatch (const ValueType* d1, const ValueType* d2, int num) - { - while (--num >= 0) - if (! valuesMatch (*d1++, *d2++)) - return false; - - return true; - } - - static bool valuesMatch (ValueType v1, ValueType v2) - { - return std::abs (v1 - v2) < std::numeric_limits::epsilon(); - } - }; - - void runTest() - { - beginTest ("FloatVectorOperations"); - - for (int i = 1000; --i >= 0;) - { - TestRunner::runTest (*this, getRandom()); - TestRunner::runTest (*this, getRandom()); - } - } -}; - -static FloatVectorOperationsTests vectorOpTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h b/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h deleted file mode 100755 index b7dc972..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_FLOATVECTOROPERATIONS_H_INCLUDED -#define JUCE_FLOATVECTOROPERATIONS_H_INCLUDED - - -//============================================================================== -/** - A collection of simple vector operations on arrays of floats, accelerated with - SIMD instructions where possible. -*/ -class JUCE_API FloatVectorOperations -{ -public: - //============================================================================== - /** Clears a vector of floats. */ - static void JUCE_CALLTYPE clear (float* dest, int numValues) noexcept; - - /** Clears a vector of doubles. */ - static void JUCE_CALLTYPE clear (double* dest, int numValues) noexcept; - - /** Copies a repeated value into a vector of floats. */ - static void JUCE_CALLTYPE fill (float* dest, float valueToFill, int numValues) noexcept; - - /** Copies a repeated value into a vector of doubles. */ - static void JUCE_CALLTYPE fill (double* dest, double valueToFill, int numValues) noexcept; - - /** Copies a vector of floats. */ - static void JUCE_CALLTYPE copy (float* dest, const float* src, int numValues) noexcept; - - /** Copies a vector of doubles. */ - static void JUCE_CALLTYPE copy (double* dest, const double* src, int numValues) noexcept; - - /** Copies a vector of floats, multiplying each value by a given multiplier */ - static void JUCE_CALLTYPE copyWithMultiply (float* dest, const float* src, float multiplier, int numValues) noexcept; - - /** Copies a vector of doubles, multiplying each value by a given multiplier */ - static void JUCE_CALLTYPE copyWithMultiply (double* dest, const double* src, double multiplier, int numValues) noexcept; - - /** Adds a fixed value to the destination values. */ - static void JUCE_CALLTYPE add (float* dest, float amountToAdd, int numValues) noexcept; - - /** Adds a fixed value to the destination values. */ - static void JUCE_CALLTYPE add (double* dest, double amountToAdd, int numValues) noexcept; - - /** Adds a fixed value to each source value and stores it in the destination array. */ - static void JUCE_CALLTYPE add (float* dest, float* src, float amount, int numValues) noexcept; - - /** Adds a fixed value to each source value and stores it in the destination array. */ - static void JUCE_CALLTYPE add (double* dest, double* src, double amount, int numValues) noexcept; - - /** Adds the source values to the destination values. */ - static void JUCE_CALLTYPE add (float* dest, const float* src, int numValues) noexcept; - - /** Adds the source values to the destination values. */ - static void JUCE_CALLTYPE add (double* dest, const double* src, int numValues) noexcept; - - /** Adds each source1 value to the corresponding source2 value and stores the result in the destination array. */ - static void JUCE_CALLTYPE add (float* dest, const float* src1, const float* src2, int num) noexcept; - - /** Adds each source1 value to the corresponding source2 value and stores the result in the destination array. */ - static void JUCE_CALLTYPE add (double* dest, const double* src1, const double* src2, int num) noexcept; - - /** Subtracts the source values from the destination values. */ - static void JUCE_CALLTYPE subtract (float* dest, const float* src, int numValues) noexcept; - - /** Subtracts the source values from the destination values. */ - static void JUCE_CALLTYPE subtract (double* dest, const double* src, int numValues) noexcept; - - /** Subtracts each source2 value from the corresponding source1 value and stores the result in the destination array. */ - static void JUCE_CALLTYPE subtract (float* dest, const float* src1, const float* src2, int num) noexcept; - - /** Subtracts each source2 value from the corresponding source1 value and stores the result in the destination array. */ - static void JUCE_CALLTYPE subtract (double* dest, const double* src1, const double* src2, int num) noexcept; - - /** Multiplies each source value by the given multiplier, then adds it to the destination value. */ - static void JUCE_CALLTYPE addWithMultiply (float* dest, const float* src, float multiplier, int numValues) noexcept; - - /** Multiplies each source value by the given multiplier, then adds it to the destination value. */ - static void JUCE_CALLTYPE addWithMultiply (double* dest, const double* src, double multiplier, int numValues) noexcept; - - /** Multiplies each source1 value by the corresponding source2 value, then adds it to the destination value. */ - static void JUCE_CALLTYPE addWithMultiply (float* dest, const float* src1, const float* src2, int num) noexcept; - - /** Multiplies each source1 value by the corresponding source2 value, then adds it to the destination value. */ - static void JUCE_CALLTYPE addWithMultiply (double* dest, const double* src1, const double* src2, int num) noexcept; - - /** Multiplies the destination values by the source values. */ - static void JUCE_CALLTYPE multiply (float* dest, const float* src, int numValues) noexcept; - - /** Multiplies the destination values by the source values. */ - static void JUCE_CALLTYPE multiply (double* dest, const double* src, int numValues) noexcept; - - /** Multiplies each source1 value by the correspinding source2 value, then stores it in the destination array. */ - static void JUCE_CALLTYPE multiply (float* dest, const float* src1, const float* src2, int numValues) noexcept; - - /** Multiplies each source1 value by the correspinding source2 value, then stores it in the destination array. */ - static void JUCE_CALLTYPE multiply (double* dest, const double* src1, const double* src2, int numValues) noexcept; - - /** Multiplies each of the destination values by a fixed multiplier. */ - static void JUCE_CALLTYPE multiply (float* dest, float multiplier, int numValues) noexcept; - - /** Multiplies each of the destination values by a fixed multiplier. */ - static void JUCE_CALLTYPE multiply (double* dest, double multiplier, int numValues) noexcept; - - /** Multiplies each of the source values by a fixed multiplier and stores the result in the destination array. */ - static void JUCE_CALLTYPE multiply (float* dest, const float* src, float multiplier, int num) noexcept; - - /** Multiplies each of the source values by a fixed multiplier and stores the result in the destination array. */ - static void JUCE_CALLTYPE multiply (double* dest, const double* src, double multiplier, int num) noexcept; - - /** Copies a source vector to a destination, negating each value. */ - static void JUCE_CALLTYPE negate (float* dest, const float* src, int numValues) noexcept; - - /** Copies a source vector to a destination, negating each value. */ - static void JUCE_CALLTYPE negate (double* dest, const double* src, int numValues) noexcept; - - /** Converts a stream of integers to floats, multiplying each one by the given multiplier. */ - static void JUCE_CALLTYPE convertFixedToFloat (float* dest, const int* src, float multiplier, int numValues) noexcept; - - /** Each element of dest will be the minimum of the corresponding element of the source array and the given comp value. */ - static void JUCE_CALLTYPE min (float* dest, const float* src, float comp, int num) noexcept; - - /** Each element of dest will be the minimum of the corresponding element of the source array and the given comp value. */ - static void JUCE_CALLTYPE min (double* dest, const double* src, double comp, int num) noexcept; - - /** Each element of dest will be the minimum of the corresponding source1 and source2 values. */ - static void JUCE_CALLTYPE min (float* dest, const float* src1, const float* src2, int num) noexcept; - - /** Each element of dest will be the minimum of the corresponding source1 and source2 values. */ - static void JUCE_CALLTYPE min (double* dest, const double* src1, const double* src2, int num) noexcept; - - /** Each element of dest will be the maximum of the corresponding element of the source array and the given comp value. */ - static void JUCE_CALLTYPE max (float* dest, const float* src, float comp, int num) noexcept; - - /** Each element of dest will be the maximum of the corresponding element of the source array and the given comp value. */ - static void JUCE_CALLTYPE max (double* dest, const double* src, double comp, int num) noexcept; - - /** Each element of dest will be the maximum of the corresponding source1 and source2 values. */ - static void JUCE_CALLTYPE max (float* dest, const float* src1, const float* src2, int num) noexcept; - - /** Each element of dest will be the maximum of the corresponding source1 and source2 values. */ - static void JUCE_CALLTYPE max (double* dest, const double* src1, const double* src2, int num) noexcept; - - /** Each element of dest is calculated by hard clipping the corresponding src element so that it is in the range specified by the arguments low and high. */ - static void JUCE_CALLTYPE clip (float* dest, const float* src, float low, float high, int num) noexcept; - - /** Each element of dest is calculated by hard clipping the corresponding src element so that it is in the range specified by the arguments low and high. */ - static void JUCE_CALLTYPE clip (double* dest, const double* src, double low, double high, int num) noexcept; - - /** Finds the miniumum and maximum values in the given array. */ - static Range JUCE_CALLTYPE findMinAndMax (const float* src, int numValues) noexcept; - - /** Finds the miniumum and maximum values in the given array. */ - static Range JUCE_CALLTYPE findMinAndMax (const double* src, int numValues) noexcept; - - /** Finds the miniumum value in the given array. */ - static float JUCE_CALLTYPE findMinimum (const float* src, int numValues) noexcept; - - /** Finds the miniumum value in the given array. */ - static double JUCE_CALLTYPE findMinimum (const double* src, int numValues) noexcept; - - /** Finds the maximum value in the given array. */ - static float JUCE_CALLTYPE findMaximum (const float* src, int numValues) noexcept; - - /** Finds the maximum value in the given array. */ - static double JUCE_CALLTYPE findMaximum (const double* src, int numValues) noexcept; - - /** On Intel CPUs, this method enables or disables the SSE flush-to-zero mode. - Effectively, this is a wrapper around a call to _MM_SET_FLUSH_ZERO_MODE - */ - static void JUCE_CALLTYPE enableFlushToZeroMode (bool shouldEnable) noexcept; -}; - - -#endif // JUCE_FLOATVECTOROPERATIONS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h deleted file mode 100755 index c63746c..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Decibels.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DECIBELS_H_INCLUDED -#define JUCE_DECIBELS_H_INCLUDED - - -//============================================================================== -/** - This class contains some helpful static methods for dealing with decibel values. -*/ -class Decibels -{ -public: - //============================================================================== - /** Converts a dBFS value to its equivalent gain level. - - A gain of 1.0 = 0 dB, and lower gains map onto negative decibel values. Any - decibel value lower than minusInfinityDb will return a gain of 0. - */ - template - static Type decibelsToGain (const Type decibels, - const Type minusInfinityDb = (Type) defaultMinusInfinitydB) - { - return decibels > minusInfinityDb ? std::pow ((Type) 10.0, decibels * (Type) 0.05) - : Type(); - } - - /** Converts a gain level into a dBFS value. - - A gain of 1.0 = 0 dB, and lower gains map onto negative decibel values. - If the gain is 0 (or negative), then the method will return the value - provided as minusInfinityDb. - */ - template - static Type gainToDecibels (const Type gain, - const Type minusInfinityDb = (Type) defaultMinusInfinitydB) - { - return gain > Type() ? jmax (minusInfinityDb, (Type) std::log10 (gain) * (Type) 20.0) - : minusInfinityDb; - } - - //============================================================================== - /** Converts a decibel reading to a string, with the 'dB' suffix. - If the decibel value is lower than minusInfinityDb, the return value will - be "-INF dB". - */ - template - static String toString (const Type decibels, - const int decimalPlaces = 2, - const Type minusInfinityDb = (Type) defaultMinusInfinitydB) - { - String s; - - if (decibels <= minusInfinityDb) - { - s = "-INF dB"; - } - else - { - if (decibels >= Type()) - s << '+'; - - s << String (decibels, decimalPlaces) << " dB"; - } - - return s; - } - - -private: - //============================================================================== - enum - { - defaultMinusInfinitydB = -100 - }; - - Decibels(); // This class can't be instantiated, it's just a holder for static methods.. - JUCE_DECLARE_NON_COPYABLE (Decibels) -}; - - -#endif // JUCE_DECIBELS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.cpp b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.cpp deleted file mode 100755 index 05a6e03..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.cpp +++ /dev/null @@ -1,280 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// (For the moment, we'll implement a few local operators for this complex class - one -// day we'll probably either have a juce complex class, or use the C++11 one) -static FFT::Complex operator+ (FFT::Complex a, FFT::Complex b) noexcept { FFT::Complex c = { a.r + b.r, a.i + b.i }; return c; } -static FFT::Complex operator- (FFT::Complex a, FFT::Complex b) noexcept { FFT::Complex c = { a.r - b.r, a.i - b.i }; return c; } -static FFT::Complex operator* (FFT::Complex a, FFT::Complex b) noexcept { FFT::Complex c = { a.r * b.r - a.i * b.i, a.r * b.i + a.i * b.r }; return c; } -static FFT::Complex& operator+= (FFT::Complex& a, FFT::Complex b) noexcept { a.r += b.r; a.i += b.i; return a; } - -//============================================================================== -struct FFT::FFTConfig -{ - FFTConfig (int sizeOfFFT, bool isInverse) - : fftSize (sizeOfFFT), inverse (isInverse), twiddleTable ((size_t) sizeOfFFT) - { - for (int i = 0; i < fftSize; ++i) - { - const double phase = (isInverse ? 2.0 : -2.0) * double_Pi * i / fftSize; - twiddleTable[i].r = (float) cos (phase); - twiddleTable[i].i = (float) sin (phase); - } - - const int root = (int) std::sqrt ((double) fftSize); - int divisor = 4, n = fftSize; - - for (int i = 0; i < numElementsInArray (factors); ++i) - { - while ((n % divisor) != 0) - { - if (divisor == 2) divisor = 3; - else if (divisor == 4) divisor = 2; - else divisor += 2; - - if (divisor > root) - divisor = n; - } - - n /= divisor; - - jassert (divisor == 1 || divisor == 2 || divisor == 4); - factors[i].radix = divisor; - factors[i].length = n; - } - } - - void perform (const Complex* input, Complex* output) const noexcept - { - perform (input, output, 1, 1, factors); - } - - const int fftSize; - const bool inverse; - - struct Factor { int radix, length; }; - Factor factors[32]; - HeapBlock twiddleTable; - - void perform (const Complex* input, Complex* output, const int stride, const int strideIn, const Factor* facs) const noexcept - { - const Factor factor (*facs++); - Complex* const originalOutput = output; - const Complex* const outputEnd = output + factor.radix * factor.length; - - if (stride == 1 && factor.radix <= 5) - { - for (int i = 0; i < factor.radix; ++i) - perform (input + stride * strideIn * i, output + i * factor.length, stride * factor.radix, strideIn, facs); - - butterfly (factor, output, stride); - return; - } - - if (factor.length == 1) - { - do - { - *output++ = *input; - input += stride * strideIn; - } - while (output < outputEnd); - } - else - { - do - { - perform (input, output, stride * factor.radix, strideIn, facs); - input += stride * strideIn; - output += factor.length; - } - while (output < outputEnd); - } - - butterfly (factor, originalOutput, stride); - } - - void butterfly (const Factor factor, Complex* data, const int stride) const noexcept - { - switch (factor.radix) - { - case 1: break; - case 2: butterfly2 (data, stride, factor.length); return; - case 4: butterfly4 (data, stride, factor.length); return; - default: jassertfalse; break; - } - - Complex* scratch = static_cast (alloca (sizeof (Complex) * (size_t) factor.radix)); - - for (int i = 0; i < factor.length; ++i) - { - for (int k = i, q1 = 0; q1 < factor.radix; ++q1) - { - scratch[q1] = data[k]; - k += factor.length; - } - - for (int k = i, q1 = 0; q1 < factor.radix; ++q1) - { - int twiddleIndex = 0; - data[k] = scratch[0]; - - for (int q = 1; q < factor.radix; ++q) - { - twiddleIndex += stride * k; - - if (twiddleIndex >= fftSize) - twiddleIndex -= fftSize; - - data[k] += scratch[q] * twiddleTable[twiddleIndex]; - } - - k += factor.length; - } - } - } - - void butterfly2 (Complex* data, const int stride, const int length) const noexcept - { - Complex* dataEnd = data + length; - const Complex* tw = twiddleTable; - - for (int i = length; --i >= 0;) - { - const Complex s (*dataEnd * *tw); - tw += stride; - *dataEnd++ = *data - s; - *data++ += s; - } - } - - void butterfly4 (Complex* data, const int stride, const int length) const noexcept - { - const int lengthX2 = length * 2; - const int lengthX3 = length * 3; - - const Complex* twiddle1 = twiddleTable; - const Complex* twiddle2 = twiddle1; - const Complex* twiddle3 = twiddle1; - - for (int i = length; --i >= 0;) - { - const Complex s0 = data[length] * *twiddle1; - const Complex s1 = data[lengthX2] * *twiddle2; - const Complex s2 = data[lengthX3] * *twiddle3; - const Complex s3 = s0 + s2; - const Complex s4 = s0 - s2; - const Complex s5 = *data - s1; - *data += s1; - data[lengthX2] = *data - s3; - twiddle1 += stride; - twiddle2 += stride * 2; - twiddle3 += stride * 3; - *data += s3; - - if (inverse) - { - data[length].r = s5.r - s4.i; - data[length].i = s5.i + s4.r; - data[lengthX3].r = s5.r + s4.i; - data[lengthX3].i = s5.i - s4.r; - } - else - { - data[length].r = s5.r + s4.i; - data[length].i = s5.i - s4.r; - data[lengthX3].r = s5.r - s4.i; - data[lengthX3].i = s5.i + s4.r; - } - - ++data; - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FFTConfig) -}; - - -//============================================================================== -FFT::FFT (int order, bool inverse) : config (new FFTConfig (1 << order, inverse)), size (1 << order) {} -FFT::~FFT() {} - -void FFT::perform (const Complex* const input, Complex* const output) const noexcept -{ - config->perform (input, output); -} - -void FFT::performRealOnlyForwardTransform (float* d) const noexcept -{ - // This can only be called on an FFT object that was created to do forward transforms. - jassert (! config->inverse); - - Complex* const scratch = static_cast (alloca (16 + sizeof (Complex) * (size_t) size)); - - for (int i = 0; i < size; ++i) - { - scratch[i].r = d[i]; - scratch[i].i = 0; - } - - perform (scratch, reinterpret_cast (d)); -} - -void FFT::performRealOnlyInverseTransform (float* d) const noexcept -{ - // This can only be called on an FFT object that was created to do inverse transforms. - jassert (config->inverse); - - Complex* const scratch = static_cast (alloca (16 + sizeof (Complex) * (size_t) size)); - - perform (reinterpret_cast (d), scratch); - - const float scaleFactor = 1.0f / size; - - for (int i = 0; i < size; ++i) - { - d[i] = scratch[i].r * scaleFactor; - d[i + size] = scratch[i].i * scaleFactor; - } -} - -void FFT::performFrequencyOnlyForwardTransform (float* d) const noexcept -{ - performRealOnlyForwardTransform (d); - const int twiceSize = size * 2; - - for (int i = 0; i < twiceSize; i += 2) - { - const float d1 = d[i]; - const float d2 = d[i + 1]; - - d[i / 2] = std::sqrt (d1 * d1 + d2 * d2); - - if (i > size / 2) - { - d[i] = 0; - d[i + 1] = 0; - } - } -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.h b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.h deleted file mode 100755 index c9e327a..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_FFT.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -/** - A very minimal FFT class. - - This is only a simple low-footprint implementation and isn't tuned for speed - it may - be useful for simple applications where one of the more complex FFT libraries would be - overkill. (But in the future it may end up becoming optimised of course...) - - The FFT class itself contains lookup tables, so there's some overhead in creating - one, you should create and cache an FFT object for each size/direction of transform - that you need, and re-use them to perform the actual operation. -*/ -class JUCE_API FFT -{ -public: - /** Initialises an object for performing either a forward or inverse FFT with the given size. - The the number of points the FFT will operate on will be 2 ^ order. - */ - FFT (int order, bool isInverse); - - /** Destructor. */ - ~FFT(); - - /** A complex number, for the purposes of the FFT class. */ - struct Complex - { - float r; /**< Real part. */ - float i; /**< Imaginary part. */ - }; - - /** Performs an out-of-place FFT, either forward or inverse depending on the mode - that was passed to this object's constructor. - - The arrays must contain at least getSize() elements. - */ - void perform (const Complex* input, Complex* output) const noexcept; - - /** Performs an in-place forward transform on a block of real data. - - The size of the array passed in must be 2 * getSize(), and the first half - should contain your raw input sample data. On return, the array will contain - complex frequency + phase data, and can be passed to performRealOnlyForwardTransform() - in order to convert it back to reals. - */ - void performRealOnlyForwardTransform (float* inputOutputData) const noexcept; - - /** Performs a reverse operation to data created in performRealOnlyForwardTransform(). - - The size of the array passed in must be 2 * getSize(), containing complex - frequency and phase data. On return, the first half of the array will contain - the reconstituted samples. - */ - void performRealOnlyInverseTransform (float* inputOutputData) const noexcept; - - /** Takes an array and simply transforms it to the frequency spectrum. - This may be handy for things like frequency displays or analysis. - */ - void performFrequencyOnlyForwardTransform (float* inputOutputData) const noexcept; - - /** Returns the number of data points that this FFT was created to work with. */ - int getSize() const noexcept { return size; } - -private: - struct FFTConfig; - ScopedPointer config; - const int size; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FFT) -}; diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp deleted file mode 100755 index b961a6a..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.cpp +++ /dev/null @@ -1,244 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_INTEL - #define JUCE_SNAP_TO_ZERO(n) if (! (n < -1.0e-8f || n > 1.0e-8f)) n = 0; -#else - #define JUCE_SNAP_TO_ZERO(n) -#endif - -//============================================================================== -IIRCoefficients::IIRCoefficients() noexcept -{ - zeromem (coefficients, sizeof (coefficients)); -} - -IIRCoefficients::~IIRCoefficients() noexcept {} - -IIRCoefficients::IIRCoefficients (const IIRCoefficients& other) noexcept -{ - memcpy (coefficients, other.coefficients, sizeof (coefficients)); -} - -IIRCoefficients& IIRCoefficients::operator= (const IIRCoefficients& other) noexcept -{ - memcpy (coefficients, other.coefficients, sizeof (coefficients)); - return *this; -} - -IIRCoefficients::IIRCoefficients (double c1, double c2, double c3, - double c4, double c5, double c6) noexcept -{ - const double a = 1.0 / c4; - - coefficients[0] = (float) (c1 * a); - coefficients[1] = (float) (c2 * a); - coefficients[2] = (float) (c3 * a); - coefficients[3] = (float) (c5 * a); - coefficients[4] = (float) (c6 * a); -} - -IIRCoefficients IIRCoefficients::makeLowPass (const double sampleRate, - const double frequency) noexcept -{ - jassert (sampleRate > 0); - - const double n = 1.0 / std::tan (double_Pi * frequency / sampleRate); - const double nSquared = n * n; - const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); - - return IIRCoefficients (c1, - c1 * 2.0, - c1, - 1.0, - c1 * 2.0 * (1.0 - nSquared), - c1 * (1.0 - std::sqrt (2.0) * n + nSquared)); -} - -IIRCoefficients IIRCoefficients::makeHighPass (const double sampleRate, - const double frequency) noexcept -{ - const double n = std::tan (double_Pi * frequency / sampleRate); - const double nSquared = n * n; - const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); - - return IIRCoefficients (c1, - c1 * -2.0, - c1, - 1.0, - c1 * 2.0 * (nSquared - 1.0), - c1 * (1.0 - std::sqrt (2.0) * n + nSquared)); -} - -IIRCoefficients IIRCoefficients::makeLowShelf (const double sampleRate, - const double cutOffFrequency, - const double Q, - const float gainFactor) noexcept -{ - jassert (sampleRate > 0); - jassert (Q > 0); - - const double A = jmax (0.0f, std::sqrt (gainFactor)); - const double aminus1 = A - 1.0; - const double aplus1 = A + 1.0; - const double omega = (double_Pi * 2.0 * jmax (cutOffFrequency, 2.0)) / sampleRate; - const double coso = std::cos (omega); - const double beta = std::sin (omega) * std::sqrt (A) / Q; - const double aminus1TimesCoso = aminus1 * coso; - - return IIRCoefficients (A * (aplus1 - aminus1TimesCoso + beta), - A * 2.0 * (aminus1 - aplus1 * coso), - A * (aplus1 - aminus1TimesCoso - beta), - aplus1 + aminus1TimesCoso + beta, - -2.0 * (aminus1 + aplus1 * coso), - aplus1 + aminus1TimesCoso - beta); -} - -IIRCoefficients IIRCoefficients::makeHighShelf (const double sampleRate, - const double cutOffFrequency, - const double Q, - const float gainFactor) noexcept -{ - jassert (sampleRate > 0); - jassert (Q > 0); - - const double A = jmax (0.0f, std::sqrt (gainFactor)); - const double aminus1 = A - 1.0; - const double aplus1 = A + 1.0; - const double omega = (double_Pi * 2.0 * jmax (cutOffFrequency, 2.0)) / sampleRate; - const double coso = std::cos (omega); - const double beta = std::sin (omega) * std::sqrt (A) / Q; - const double aminus1TimesCoso = aminus1 * coso; - - return IIRCoefficients (A * (aplus1 + aminus1TimesCoso + beta), - A * -2.0 * (aminus1 + aplus1 * coso), - A * (aplus1 + aminus1TimesCoso - beta), - aplus1 - aminus1TimesCoso + beta, - 2.0 * (aminus1 - aplus1 * coso), - aplus1 - aminus1TimesCoso - beta); -} - -IIRCoefficients IIRCoefficients::makePeakFilter (const double sampleRate, - const double centreFrequency, - const double Q, - const float gainFactor) noexcept -{ - jassert (sampleRate > 0); - jassert (Q > 0); - - const double A = jmax (0.0f, std::sqrt (gainFactor)); - const double omega = (double_Pi * 2.0 * jmax (centreFrequency, 2.0)) / sampleRate; - const double alpha = 0.5 * std::sin (omega) / Q; - const double c2 = -2.0 * std::cos (omega); - const double alphaTimesA = alpha * A; - const double alphaOverA = alpha / A; - - return IIRCoefficients (1.0 + alphaTimesA, - c2, - 1.0 - alphaTimesA, - 1.0 + alphaOverA, - c2, - 1.0 - alphaOverA); -} - -//============================================================================== -IIRFilter::IIRFilter() noexcept - : v1 (0), v2 (0), active (false) -{ -} - -IIRFilter::IIRFilter (const IIRFilter& other) noexcept - : v1 (0), v2 (0), active (other.active) -{ - const SpinLock::ScopedLockType sl (other.processLock); - coefficients = other.coefficients; -} - -IIRFilter::~IIRFilter() noexcept -{ -} - -//============================================================================== -void IIRFilter::makeInactive() noexcept -{ - const SpinLock::ScopedLockType sl (processLock); - active = false; -} - -void IIRFilter::setCoefficients (const IIRCoefficients& newCoefficients) noexcept -{ - const SpinLock::ScopedLockType sl (processLock); - - coefficients = newCoefficients; - active = true; -} - -//============================================================================== -void IIRFilter::reset() noexcept -{ - const SpinLock::ScopedLockType sl (processLock); - v1 = v2 = 0; -} - -float IIRFilter::processSingleSampleRaw (const float in) noexcept -{ - float out = coefficients.coefficients[0] * in + v1; - - JUCE_SNAP_TO_ZERO (out); - - v1 = coefficients.coefficients[1] * in - coefficients.coefficients[3] * out + v2; - v2 = coefficients.coefficients[2] * in - coefficients.coefficients[4] * out; - - return out; -} - -void IIRFilter::processSamples (float* const samples, const int numSamples) noexcept -{ - const SpinLock::ScopedLockType sl (processLock); - - if (active) - { - const float c0 = coefficients.coefficients[0]; - const float c1 = coefficients.coefficients[1]; - const float c2 = coefficients.coefficients[2]; - const float c3 = coefficients.coefficients[3]; - const float c4 = coefficients.coefficients[4]; - float lv1 = v1, lv2 = v2; - - for (int i = 0; i < numSamples; ++i) - { - const float in = samples[i]; - const float out = c0 * in + lv1; - samples[i] = out; - - lv1 = c1 * in - c3 * out + lv2; - lv2 = c2 * in - c4 * out; - } - - JUCE_SNAP_TO_ZERO (lv1); v1 = lv1; - JUCE_SNAP_TO_ZERO (lv2); v2 = lv2; - } -} - -#undef JUCE_SNAP_TO_ZERO diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h deleted file mode 100755 index 8269cf5..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_IIRFilter.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_IIRFILTER_H_INCLUDED -#define JUCE_IIRFILTER_H_INCLUDED - -class IIRFilter; - -//============================================================================== -/** - A set of coefficients for use in an IIRFilter object. - - @see IIRFilter -*/ -class JUCE_API IIRCoefficients -{ -public: - //============================================================================== - /** Creates a null set of coefficients (which will produce silence). */ - IIRCoefficients() noexcept; - - /** Directly constructs an object from the raw coefficients. - Most people will want to use the static methods instead of this, but - the constructor is public to allow tinkerers to create their own custom - filters! - */ - IIRCoefficients (double c1, double c2, double c3, - double c4, double c5, double c6) noexcept; - - /** Creates a copy of another filter. */ - IIRCoefficients (const IIRCoefficients&) noexcept; - /** Creates a copy of another filter. */ - IIRCoefficients& operator= (const IIRCoefficients&) noexcept; - /** Destructor. */ - ~IIRCoefficients() noexcept; - - /** Returns the coefficients for a low-pass filter. */ - static IIRCoefficients makeLowPass (double sampleRate, - double frequency) noexcept; - - /** Returns the coefficients for a high-pass filter. */ - static IIRCoefficients makeHighPass (double sampleRate, - double frequency) noexcept; - - //============================================================================== - /** Returns the coefficients for a low-pass shelf filter with variable Q and gain. - - The gain is a scale factor that the low frequencies are multiplied by, so values - greater than 1.0 will boost the low frequencies, values less than 1.0 will - attenuate them. - */ - static IIRCoefficients makeLowShelf (double sampleRate, - double cutOffFrequency, - double Q, - float gainFactor) noexcept; - - /** Returns the coefficients for a high-pass shelf filter with variable Q and gain. - - The gain is a scale factor that the high frequencies are multiplied by, so values - greater than 1.0 will boost the high frequencies, values less than 1.0 will - attenuate them. - */ - static IIRCoefficients makeHighShelf (double sampleRate, - double cutOffFrequency, - double Q, - float gainFactor) noexcept; - - /** Returns the coefficients for a peak filter centred around a - given frequency, with a variable Q and gain. - - The gain is a scale factor that the centre frequencies are multiplied by, so - values greater than 1.0 will boost the centre frequencies, values less than - 1.0 will attenuate them. - */ - static IIRCoefficients makePeakFilter (double sampleRate, - double centreFrequency, - double Q, - float gainFactor) noexcept; - - //============================================================================== - /** The raw coefficients. - You should leave these numbers alone unless you really know what you're doing. - */ - float coefficients[5]; -}; - -//============================================================================== -/** - An IIR filter that can perform low, high, or band-pass filtering on an - audio signal. - - @see IIRCoefficient, IIRFilterAudioSource -*/ -class JUCE_API IIRFilter -{ -public: - //============================================================================== - /** Creates a filter. - - Initially the filter is inactive, so will have no effect on samples that - you process with it. Use the setCoefficients() method to turn it into the - type of filter needed. - */ - IIRFilter() noexcept; - - /** Creates a copy of another filter. */ - IIRFilter (const IIRFilter&) noexcept; - - /** Destructor. */ - ~IIRFilter() noexcept; - - //============================================================================== - /** Clears the filter so that any incoming data passes through unchanged. */ - void makeInactive() noexcept; - - /** Applies a set of coefficients to this filter. */ - void setCoefficients (const IIRCoefficients& newCoefficients) noexcept; - - /** Returns the coefficients that this filter is using. */ - IIRCoefficients getCoefficients() const noexcept { return coefficients; } - - //============================================================================== - /** Resets the filter's processing pipeline, ready to start a new stream of data. - - Note that this clears the processing state, but the type of filter and - its coefficients aren't changed. To put a filter into an inactive state, use - the makeInactive() method. - */ - void reset() noexcept; - - /** Performs the filter operation on the given set of samples. */ - void processSamples (float* samples, int numSamples) noexcept; - - /** Processes a single sample, without any locking or checking. - - Use this if you need fast processing of a single value, but be aware that - this isn't thread-safe in the way that processSamples() is. - */ - float processSingleSampleRaw (float sample) noexcept; - -protected: - //============================================================================== - SpinLock processLock; - IIRCoefficients coefficients; - float v1, v2; - bool active; - - IIRFilter& operator= (const IIRFilter&); - JUCE_LEAK_DETECTOR (IIRFilter) -}; - - -#endif // JUCE_IIRFILTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp deleted file mode 100755 index 6d26cc4..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.cpp +++ /dev/null @@ -1,206 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace LagrangeHelpers -{ - template - struct ResampleHelper - { - static forcedinline void calc (float& a, float b) { a *= b * (1.0f / k); } - }; - - template<> - struct ResampleHelper <0> - { - static forcedinline void calc (float&, float) {} - }; - - template - static forcedinline float calcCoefficient (float input, const float offset) noexcept - { - ResampleHelper <0 - k>::calc (input, -2.0f - offset); - ResampleHelper <1 - k>::calc (input, -1.0f - offset); - ResampleHelper <2 - k>::calc (input, 0.0f - offset); - ResampleHelper <3 - k>::calc (input, 1.0f - offset); - ResampleHelper <4 - k>::calc (input, 2.0f - offset); - return input; - } - - static forcedinline float valueAtOffset (const float* const inputs, const float offset) noexcept - { - return calcCoefficient<0> (inputs[4], offset) - + calcCoefficient<1> (inputs[3], offset) - + calcCoefficient<2> (inputs[2], offset) - + calcCoefficient<3> (inputs[1], offset) - + calcCoefficient<4> (inputs[0], offset); - } - - static forcedinline void push (float* inputs, const float newValue) noexcept - { - inputs[4] = inputs[3]; - inputs[3] = inputs[2]; - inputs[2] = inputs[1]; - inputs[1] = inputs[0]; - inputs[0] = newValue; - } -} - -//============================================================================== -LagrangeInterpolator::LagrangeInterpolator() { reset(); } -LagrangeInterpolator::~LagrangeInterpolator() {} - -void LagrangeInterpolator::reset() noexcept -{ - subSamplePos = 1.0; - - for (int i = 0; i < numElementsInArray (lastInputSamples); ++i) - lastInputSamples[i] = 0; -} - -int LagrangeInterpolator::process (const double actualRatio, const float* in, - float* out, const int numOut) noexcept -{ - if (actualRatio == 1.0) - { - memcpy (out, in, (size_t) numOut * sizeof (float)); - - if (numOut >= 4) - { - const float* end = in + numOut; - - for (int i = 0; i < 4; ++i) - lastInputSamples[i] = *--end; - } - else - { - for (int i = 0; i < numOut; ++i) - LagrangeHelpers::push (lastInputSamples, in[i]); - } - - return numOut; - } - - const float* const originalIn = in; - double pos = subSamplePos; - - if (actualRatio < 1.0) - { - for (int i = numOut; --i >= 0;) - { - if (pos >= 1.0) - { - LagrangeHelpers::push (lastInputSamples, *in++); - pos -= 1.0; - } - - *out++ = LagrangeHelpers::valueAtOffset (lastInputSamples, (float) pos); - pos += actualRatio; - } - } - else - { - for (int i = numOut; --i >= 0;) - { - while (pos < actualRatio) - { - LagrangeHelpers::push (lastInputSamples, *in++); - pos += 1.0; - } - - pos -= actualRatio; - *out++ = LagrangeHelpers::valueAtOffset (lastInputSamples, 1.0f - (float) pos); - } - } - - subSamplePos = pos; - return (int) (in - originalIn); -} - -int LagrangeInterpolator::processAdding (const double actualRatio, const float* in, - float* out, const int numOut, const float gain) noexcept -{ - if (actualRatio == 1.0) - { - if (gain != 1.0f) - { - for (int i = 0; i < numOut; ++i) - out[i] += in[i] * gain; - } - else - { - for (int i = 0; i < numOut; ++i) - out[i] += in[i]; - } - - if (numOut >= 4) - { - const float* end = in + numOut; - - for (int i = 0; i < 4; ++i) - lastInputSamples[i] = *--end; - } - else - { - for (int i = 0; i < numOut; ++i) - LagrangeHelpers::push (lastInputSamples, in[i]); - } - - return numOut; - } - - const float* const originalIn = in; - double pos = subSamplePos; - - if (actualRatio < 1.0) - { - for (int i = numOut; --i >= 0;) - { - if (pos >= 1.0) - { - LagrangeHelpers::push (lastInputSamples, *in++); - pos -= 1.0; - } - - *out++ += gain * LagrangeHelpers::valueAtOffset (lastInputSamples, (float) pos); - pos += actualRatio; - } - } - else - { - for (int i = numOut; --i >= 0;) - { - while (pos < actualRatio) - { - LagrangeHelpers::push (lastInputSamples, *in++); - pos += 1.0; - } - - pos -= actualRatio; - *out++ += gain * LagrangeHelpers::valueAtOffset (lastInputSamples, jmax (0.0f, 1.0f - (float) pos)); - } - } - - subSamplePos = pos; - return (int) (in - originalIn); -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h deleted file mode 100755 index caa4802..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_LagrangeInterpolator.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_LAGRANGEINTERPOLATOR_H_INCLUDED -#define JUCE_LAGRANGEINTERPOLATOR_H_INCLUDED - - -//============================================================================== -/** - Interpolator for resampling a stream of floats using 4-point lagrange interpolation. - - Note that the resampler is stateful, so when there's a break in the continuity - of the input stream you're feeding it, you should call reset() before feeding - it any new data. And like with any other stateful filter, if you're resampling - multiple channels, make sure each one uses its own LagrangeInterpolator - object. -*/ -class JUCE_API LagrangeInterpolator -{ -public: - LagrangeInterpolator(); - ~LagrangeInterpolator(); - - /** Resets the state of the interpolator. - Call this when there's a break in the continuity of the input data stream. - */ - void reset() noexcept; - - /** Resamples a stream of samples. - - @param speedRatio the number of input samples to use for each output sample - @param inputSamples the source data to read from. This must contain at - least (speedRatio * numOutputSamplesToProduce) samples. - @param outputSamples the buffer to write the results into - @param numOutputSamplesToProduce the number of output samples that should be created - - @returns the actual number of input samples that were used - */ - int process (double speedRatio, - const float* inputSamples, - float* outputSamples, - int numOutputSamplesToProduce) noexcept; - - /** Resamples a stream of samples, adding the results to the output data - with a gain. - - @param speedRatio the number of input samples to use for each output sample - @param inputSamples the source data to read from. This must contain at - least (speedRatio * numOutputSamplesToProduce) samples. - @param outputSamples the buffer to write the results to - the result values will be added - to any pre-existing data in this buffer after being multiplied by - the gain factor - @param numOutputSamplesToProduce the number of output samples that should be created - @param gain a gain factor to multiply the resulting samples by before - adding them to the destination buffer - - @returns the actual number of input samples that were used - */ - int processAdding (double speedRatio, - const float* inputSamples, - float* outputSamples, - int numOutputSamplesToProduce, - float gain) noexcept; - -private: - float lastInputSamples[5]; - double subSamplePos; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LagrangeInterpolator) -}; - - -#endif // JUCE_LAGRANGEINTERPOLATOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h b/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h deleted file mode 100755 index c0b7596..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/effects/juce_Reverb.h +++ /dev/null @@ -1,372 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_REVERB_H_INCLUDED -#define JUCE_REVERB_H_INCLUDED - - -//============================================================================== -/** - Performs a simple reverb effect on a stream of audio data. - - This is a simple stereo reverb, based on the technique and tunings used in FreeVerb. - Use setSampleRate() to prepare it, and then call processStereo() or processMono() to - apply the reverb to your audio data. - - @see ReverbAudioSource -*/ -class Reverb -{ -public: - //============================================================================== - Reverb() - { - setParameters (Parameters()); - setSampleRate (44100.0); - } - - //============================================================================== - /** Holds the parameters being used by a Reverb object. */ - struct Parameters - { - Parameters() noexcept - : roomSize (0.5f), - damping (0.5f), - wetLevel (0.33f), - dryLevel (0.4f), - width (1.0f), - freezeMode (0) - {} - - float roomSize; /**< Room size, 0 to 1.0, where 1.0 is big, 0 is small. */ - float damping; /**< Damping, 0 to 1.0, where 0 is not damped, 1.0 is fully damped. */ - float wetLevel; /**< Wet level, 0 to 1.0 */ - float dryLevel; /**< Dry level, 0 to 1.0 */ - float width; /**< Reverb width, 0 to 1.0, where 1.0 is very wide. */ - float freezeMode; /**< Freeze mode - values < 0.5 are "normal" mode, values > 0.5 - put the reverb into a continuous feedback loop. */ - }; - - //============================================================================== - /** Returns the reverb's current parameters. */ - const Parameters& getParameters() const noexcept { return parameters; } - - /** Applies a new set of parameters to the reverb. - Note that this doesn't attempt to lock the reverb, so if you call this in parallel with - the process method, you may get artifacts. - */ - void setParameters (const Parameters& newParams) - { - const float wetScaleFactor = 3.0f; - const float dryScaleFactor = 2.0f; - - const float wet = newParams.wetLevel * wetScaleFactor; - dryGain.setValue (newParams.dryLevel * dryScaleFactor); - wetGain1.setValue (0.5f * wet * (1.0f + newParams.width)); - wetGain2.setValue (0.5f * wet * (1.0f - newParams.width)); - - gain = isFrozen (newParams.freezeMode) ? 0.0f : 0.015f; - parameters = newParams; - updateDamping(); - } - - //============================================================================== - /** Sets the sample rate that will be used for the reverb. - You must call this before the process methods, in order to tell it the correct sample rate. - */ - void setSampleRate (const double sampleRate) - { - jassert (sampleRate > 0); - - static const short combTunings[] = { 1116, 1188, 1277, 1356, 1422, 1491, 1557, 1617 }; // (at 44100Hz) - static const short allPassTunings[] = { 556, 441, 341, 225 }; - const int stereoSpread = 23; - const int intSampleRate = (int) sampleRate; - - for (int i = 0; i < numCombs; ++i) - { - comb[0][i].setSize ((intSampleRate * combTunings[i]) / 44100); - comb[1][i].setSize ((intSampleRate * (combTunings[i] + stereoSpread)) / 44100); - } - - for (int i = 0; i < numAllPasses; ++i) - { - allPass[0][i].setSize ((intSampleRate * allPassTunings[i]) / 44100); - allPass[1][i].setSize ((intSampleRate * (allPassTunings[i] + stereoSpread)) / 44100); - } - - const double smoothTime = 0.01; - damping .reset (sampleRate, smoothTime); - feedback.reset (sampleRate, smoothTime); - dryGain .reset (sampleRate, smoothTime); - wetGain1.reset (sampleRate, smoothTime); - wetGain2.reset (sampleRate, smoothTime); - } - - /** Clears the reverb's buffers. */ - void reset() - { - for (int j = 0; j < numChannels; ++j) - { - for (int i = 0; i < numCombs; ++i) - comb[j][i].clear(); - - for (int i = 0; i < numAllPasses; ++i) - allPass[j][i].clear(); - } - } - - //============================================================================== - /** Applies the reverb to two stereo channels of audio data. */ - void processStereo (float* const left, float* const right, const int numSamples) noexcept - { - jassert (left != nullptr && right != nullptr); - - for (int i = 0; i < numSamples; ++i) - { - const float input = (left[i] + right[i]) * gain; - float outL = 0, outR = 0; - - const float damp = damping.getNextValue(); - const float feedbck = feedback.getNextValue(); - - for (int j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel - { - outL += comb[0][j].process (input, damp, feedbck); - outR += comb[1][j].process (input, damp, feedbck); - } - - for (int j = 0; j < numAllPasses; ++j) // run the allpass filters in series - { - outL = allPass[0][j].process (outL); - outR = allPass[1][j].process (outR); - } - - const float dry = dryGain.getNextValue(); - const float wet1 = wetGain1.getNextValue(); - const float wet2 = wetGain2.getNextValue(); - - left[i] = outL * wet1 + outR * wet2 + left[i] * dry; - right[i] = outR * wet1 + outL * wet2 + right[i] * dry; - } - } - - /** Applies the reverb to a single mono channel of audio data. */ - void processMono (float* const samples, const int numSamples) noexcept - { - jassert (samples != nullptr); - - for (int i = 0; i < numSamples; ++i) - { - const float input = samples[i] * gain; - float output = 0; - - const float damp = damping.getNextValue(); - const float feedbck = feedback.getNextValue(); - - for (int j = 0; j < numCombs; ++j) // accumulate the comb filters in parallel - output += comb[0][j].process (input, damp, feedbck); - - for (int j = 0; j < numAllPasses; ++j) // run the allpass filters in series - output = allPass[0][j].process (output); - - const float dry = dryGain.getNextValue(); - const float wet1 = wetGain1.getNextValue(); - - samples[i] = output * wet1 + samples[i] * dry; - } - } - -private: - //============================================================================== - static bool isFrozen (const float freezeMode) noexcept { return freezeMode >= 0.5f; } - - void updateDamping() noexcept - { - const float roomScaleFactor = 0.28f; - const float roomOffset = 0.7f; - const float dampScaleFactor = 0.4f; - - if (isFrozen (parameters.freezeMode)) - setDamping (0.0f, 1.0f); - else - setDamping (parameters.damping * dampScaleFactor, - parameters.roomSize * roomScaleFactor + roomOffset); - } - - void setDamping (const float dampingToUse, const float roomSizeToUse) noexcept - { - damping.setValue (dampingToUse); - feedback.setValue (roomSizeToUse); - } - - //============================================================================== - class CombFilter - { - public: - CombFilter() noexcept : bufferSize (0), bufferIndex (0), last (0) {} - - void setSize (const int size) - { - if (size != bufferSize) - { - bufferIndex = 0; - buffer.malloc ((size_t) size); - bufferSize = size; - } - - clear(); - } - - void clear() noexcept - { - last = 0; - buffer.clear ((size_t) bufferSize); - } - - float process (const float input, const float damp, const float feedbackLevel) noexcept - { - const float output = buffer[bufferIndex]; - last = (output * (1.0f - damp)) + (last * damp); - JUCE_UNDENORMALISE (last); - - float temp = input + (last * feedbackLevel); - JUCE_UNDENORMALISE (temp); - buffer[bufferIndex] = temp; - bufferIndex = (bufferIndex + 1) % bufferSize; - return output; - } - - private: - HeapBlock buffer; - int bufferSize, bufferIndex; - float last; - - JUCE_DECLARE_NON_COPYABLE (CombFilter) - }; - - //============================================================================== - class AllPassFilter - { - public: - AllPassFilter() noexcept : bufferSize (0), bufferIndex (0) {} - - void setSize (const int size) - { - if (size != bufferSize) - { - bufferIndex = 0; - buffer.malloc ((size_t) size); - bufferSize = size; - } - - clear(); - } - - void clear() noexcept - { - buffer.clear ((size_t) bufferSize); - } - - float process (const float input) noexcept - { - const float bufferedValue = buffer [bufferIndex]; - float temp = input + (bufferedValue * 0.5f); - JUCE_UNDENORMALISE (temp); - buffer [bufferIndex] = temp; - bufferIndex = (bufferIndex + 1) % bufferSize; - return bufferedValue - input; - } - - private: - HeapBlock buffer; - int bufferSize, bufferIndex; - - JUCE_DECLARE_NON_COPYABLE (AllPassFilter) - }; - - //============================================================================== - class LinearSmoothedValue - { - public: - LinearSmoothedValue() noexcept - : currentValue (0), target (0), step (0), countdown (0), stepsToTarget (0) - { - } - - void reset (double sampleRate, double fadeLengthSeconds) noexcept - { - jassert (sampleRate > 0 && fadeLengthSeconds >= 0); - stepsToTarget = (int) std::floor (fadeLengthSeconds * sampleRate); - currentValue = target; - countdown = 0; - } - - void setValue (float newValue) noexcept - { - if (target != newValue) - { - target = newValue; - countdown = stepsToTarget; - - if (countdown <= 0) - currentValue = target; - else - step = (target - currentValue) / countdown; - } - } - - float getNextValue() noexcept - { - if (countdown <= 0) - return target; - - --countdown; - currentValue += step; - return currentValue; - } - - private: - float currentValue, target, step; - int countdown, stepsToTarget; - - JUCE_DECLARE_NON_COPYABLE (LinearSmoothedValue) - }; - - //============================================================================== - enum { numCombs = 8, numAllPasses = 4, numChannels = 2 }; - - Parameters parameters; - float gain; - - CombFilter comb [numChannels][numCombs]; - AllPassFilter allPass [numChannels][numAllPasses]; - - LinearSmoothedValue damping, feedback, dryGain, wetGain1, wetGain2; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Reverb) -}; - - -#endif // JUCE_REVERB_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp b/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp deleted file mode 100755 index f0f6c88..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if defined (JUCE_AUDIO_BASICS_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE - /* When you add this cpp file to your project, you mustn't include it in a file where you've - already included any other headers - just put it inside a file on its own, possibly with your config - flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix - header files that the compiler may be using. - */ - #error "Incorrect use of JUCE cpp file" -#endif - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" -#include "juce_audio_basics.h" - -#if JUCE_MINGW && ! defined (__SSE2__) - #define JUCE_USE_SSE_INTRINSICS 0 -#endif - -#ifndef JUCE_USE_SSE_INTRINSICS - #define JUCE_USE_SSE_INTRINSICS 1 -#endif - -#if ! JUCE_INTEL - #undef JUCE_USE_SSE_INTRINSICS -#endif - -#if JUCE_USE_SSE_INTRINSICS - #include -#endif - -#ifndef JUCE_USE_VDSP_FRAMEWORK - #define JUCE_USE_VDSP_FRAMEWORK 1 -#endif - -#if (JUCE_MAC || JUCE_IOS) && JUCE_USE_VDSP_FRAMEWORK - #define Point CarbonDummyPointName // (workaround to avoid definition of "Point" by old Carbon headers) - #include - #undef Point -#else - #undef JUCE_USE_VDSP_FRAMEWORK -#endif - -#if __ARM_NEON__ && ! (JUCE_USE_VDSP_FRAMEWORK || defined (JUCE_USE_ARM_NEON)) - #define JUCE_USE_ARM_NEON 1 - #include -#endif - -namespace juce -{ - -#include "buffers/juce_AudioDataConverters.cpp" -#include "buffers/juce_AudioSampleBuffer.cpp" -#include "buffers/juce_FloatVectorOperations.cpp" -#include "effects/juce_IIRFilter.cpp" -#include "effects/juce_LagrangeInterpolator.cpp" -#include "effects/juce_FFT.cpp" -#include "midi/juce_MidiBuffer.cpp" -#include "midi/juce_MidiFile.cpp" -#include "midi/juce_MidiKeyboardState.cpp" -#include "midi/juce_MidiMessage.cpp" -#include "midi/juce_MidiMessageSequence.cpp" -#include "sources/juce_BufferingAudioSource.cpp" -#include "sources/juce_ChannelRemappingAudioSource.cpp" -#include "sources/juce_IIRFilterAudioSource.cpp" -#include "sources/juce_MixerAudioSource.cpp" -#include "sources/juce_ResamplingAudioSource.cpp" -#include "sources/juce_ReverbAudioSource.cpp" -#include "sources/juce_ToneGeneratorAudioSource.cpp" -#include "synthesisers/juce_Synthesiser.cpp" - -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h b/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h deleted file mode 100755 index 106df2b..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIO_BASICS_H_INCLUDED -#define JUCE_AUDIO_BASICS_H_INCLUDED - -#include "../juce_core/juce_core.h" - -//============================================================================= -namespace juce -{ - -#undef Complex // apparently some C libraries actually define these symbols (!) -#undef Factor - -#include "buffers/juce_AudioDataConverters.h" -#include "buffers/juce_AudioSampleBuffer.h" -#include "buffers/juce_FloatVectorOperations.h" -#include "effects/juce_Decibels.h" -#include "effects/juce_IIRFilter.h" -#include "effects/juce_LagrangeInterpolator.h" -#include "effects/juce_FFT.h" -#include "effects/juce_Reverb.h" -#include "midi/juce_MidiMessage.h" -#include "midi/juce_MidiBuffer.h" -#include "midi/juce_MidiMessageSequence.h" -#include "midi/juce_MidiFile.h" -#include "midi/juce_MidiKeyboardState.h" -#include "sources/juce_AudioSource.h" -#include "sources/juce_PositionableAudioSource.h" -#include "sources/juce_BufferingAudioSource.h" -#include "sources/juce_ChannelRemappingAudioSource.h" -#include "sources/juce_IIRFilterAudioSource.h" -#include "sources/juce_MixerAudioSource.h" -#include "sources/juce_ResamplingAudioSource.h" -#include "sources/juce_ReverbAudioSource.h" -#include "sources/juce_ToneGeneratorAudioSource.h" -#include "synthesisers/juce_Synthesiser.h" - -} - -#endif // JUCE_AUDIO_BASICS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm b/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm deleted file mode 100755 index 54083fd..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/juce_audio_basics.mm +++ /dev/null @@ -1,25 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#include "juce_audio_basics.cpp" diff --git a/JuceLibraryCode/modules/juce_audio_basics/juce_module_info b/JuceLibraryCode/modules/juce_audio_basics/juce_module_info deleted file mode 100755 index 01874e6..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/juce_module_info +++ /dev/null @@ -1,24 +0,0 @@ -{ - "id": "juce_audio_basics", - "name": "JUCE audio and midi data classes", - "version": "3.1.1", - "description": "Classes for audio buffer manipulation, midi message handling, synthesis, etc", - "website": "http://www.juce.com/juce", - "license": "GPL/Commercial", - - "dependencies": [ { "id": "juce_core", "version": "matching" } ], - - "include": "juce_audio_basics.h", - - "compile": [ { "file": "juce_audio_basics.cpp", "target": "! xcode" }, - { "file": "juce_audio_basics.mm", "target": "xcode" } ], - - "browse": [ "buffers/*", - "midi/*", - "effects/*", - "sources/*", - "synthesisers/*" ], - - "OSXFrameworks": "Accelerate", - "iOSFrameworks": "Accelerate" -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp deleted file mode 100755 index 43ab4c1..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.cpp +++ /dev/null @@ -1,229 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace MidiBufferHelpers -{ - inline int getEventTime (const void* const d) noexcept - { - return *static_cast (d); - } - - inline uint16 getEventDataSize (const void* const d) noexcept - { - return *reinterpret_cast (static_cast (d) + sizeof (int32)); - } - - inline uint16 getEventTotalSize (const void* const d) noexcept - { - return getEventDataSize (d) + sizeof (int32) + sizeof (uint16); - } - - static int findActualEventLength (const uint8* const data, const int maxBytes) noexcept - { - unsigned int byte = (unsigned int) *data; - int size = 0; - - if (byte == 0xf0 || byte == 0xf7) - { - const uint8* d = data + 1; - - while (d < data + maxBytes) - if (*d++ == 0xf7) - break; - - size = (int) (d - data); - } - else if (byte == 0xff) - { - int n; - const int bytesLeft = MidiMessage::readVariableLengthVal (data + 1, n); - size = jmin (maxBytes, n + 2 + bytesLeft); - } - else if (byte >= 0x80) - { - size = jmin (maxBytes, MidiMessage::getMessageLengthFromFirstByte ((uint8) byte)); - } - - return size; - } - - static uint8* findEventAfter (uint8* d, uint8* endData, const int samplePosition) noexcept - { - while (d < endData && getEventTime (d) <= samplePosition) - d += getEventTotalSize (d); - - return d; - } -} - -//============================================================================== -MidiBuffer::MidiBuffer() noexcept {} -MidiBuffer::~MidiBuffer() {} - -MidiBuffer::MidiBuffer (const MidiBuffer& other) noexcept : data (other.data) {} - -MidiBuffer& MidiBuffer::operator= (const MidiBuffer& other) noexcept -{ - data = other.data; - return *this; -} - -MidiBuffer::MidiBuffer (const MidiMessage& message) noexcept -{ - addEvent (message, 0); -} - -void MidiBuffer::swapWith (MidiBuffer& other) noexcept { data.swapWith (other.data); } -void MidiBuffer::clear() noexcept { data.clearQuick(); } -void MidiBuffer::ensureSize (size_t minimumNumBytes) { data.ensureStorageAllocated ((int) minimumNumBytes); } -bool MidiBuffer::isEmpty() const noexcept { return data.size() == 0; } - -void MidiBuffer::clear (const int startSample, const int numSamples) -{ - uint8* const start = MidiBufferHelpers::findEventAfter (data.begin(), data.end(), startSample - 1); - uint8* const end = MidiBufferHelpers::findEventAfter (start, data.end(), startSample + numSamples - 1); - - data.removeRange ((int) (start - data.begin()), (int) (end - data.begin())); -} - -void MidiBuffer::addEvent (const MidiMessage& m, const int sampleNumber) -{ - addEvent (m.getRawData(), m.getRawDataSize(), sampleNumber); -} - -void MidiBuffer::addEvent (const void* const newData, const int maxBytes, const int sampleNumber) -{ - const int numBytes = MidiBufferHelpers::findActualEventLength (static_cast (newData), maxBytes); - - if (numBytes > 0) - { - const size_t newItemSize = (size_t) numBytes + sizeof (int32) + sizeof (uint16); - const int offset = (int) (MidiBufferHelpers::findEventAfter (data.begin(), data.end(), sampleNumber) - data.begin()); - - data.insertMultiple (offset, 0, (int) newItemSize); - - uint8* const d = data.begin() + offset; - *reinterpret_cast (d) = sampleNumber; - *reinterpret_cast (d + 4) = (uint16) numBytes; - memcpy (d + 6, newData, (size_t) numBytes); - } -} - -void MidiBuffer::addEvents (const MidiBuffer& otherBuffer, - const int startSample, - const int numSamples, - const int sampleDeltaToAdd) -{ - Iterator i (otherBuffer); - i.setNextSamplePosition (startSample); - - const uint8* eventData; - int eventSize, position; - - while (i.getNextEvent (eventData, eventSize, position) - && (position < startSample + numSamples || numSamples < 0)) - { - addEvent (eventData, eventSize, position + sampleDeltaToAdd); - } -} - -int MidiBuffer::getNumEvents() const noexcept -{ - int n = 0; - const uint8* const end = data.end(); - - for (const uint8* d = data.begin(); d < end; ++n) - d += MidiBufferHelpers::getEventTotalSize (d); - - return n; -} - -int MidiBuffer::getFirstEventTime() const noexcept -{ - return data.size() > 0 ? MidiBufferHelpers::getEventTime (data.begin()) : 0; -} - -int MidiBuffer::getLastEventTime() const noexcept -{ - if (data.size() == 0) - return 0; - - const uint8* const endData = data.end(); - - for (const uint8* d = data.begin();;) - { - const uint8* const nextOne = d + MidiBufferHelpers::getEventTotalSize (d); - - if (nextOne >= endData) - return MidiBufferHelpers::getEventTime (d); - - d = nextOne; - } -} - -//============================================================================== -MidiBuffer::Iterator::Iterator (const MidiBuffer& b) noexcept - : buffer (b), data (b.data.begin()) -{ -} - -MidiBuffer::Iterator::~Iterator() noexcept -{ -} - -void MidiBuffer::Iterator::setNextSamplePosition (const int samplePosition) noexcept -{ - data = buffer.data.begin(); - const uint8* const dataEnd = buffer.data.end(); - - while (data < dataEnd && MidiBufferHelpers::getEventTime (data) < samplePosition) - data += MidiBufferHelpers::getEventTotalSize (data); -} - -bool MidiBuffer::Iterator::getNextEvent (const uint8* &midiData, int& numBytes, int& samplePosition) noexcept -{ - if (data >= buffer.data.end()) - return false; - - samplePosition = MidiBufferHelpers::getEventTime (data); - const int itemSize = MidiBufferHelpers::getEventDataSize (data); - numBytes = itemSize; - midiData = data + sizeof (int32) + sizeof (uint16); - data += sizeof (int32) + sizeof (uint16) + (size_t) itemSize; - - return true; -} - -bool MidiBuffer::Iterator::getNextEvent (MidiMessage& result, int& samplePosition) noexcept -{ - if (data >= buffer.data.end()) - return false; - - samplePosition = MidiBufferHelpers::getEventTime (data); - const int itemSize = MidiBufferHelpers::getEventDataSize (data); - result = MidiMessage (data + sizeof (int32) + sizeof (uint16), itemSize, samplePosition); - data += sizeof (int32) + sizeof (uint16) + (size_t) itemSize; - - return true; -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h deleted file mode 100755 index ecbc56a..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiBuffer.h +++ /dev/null @@ -1,235 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MIDIBUFFER_H_INCLUDED -#define JUCE_MIDIBUFFER_H_INCLUDED - - -//============================================================================== -/** - Holds a sequence of time-stamped midi events. - - Analogous to the AudioSampleBuffer, this holds a set of midi events with - integer time-stamps. The buffer is kept sorted in order of the time-stamps. - - If you're working with a sequence of midi events that may need to be manipulated - or read/written to a midi file, then MidiMessageSequence is probably a more - appropriate container. MidiBuffer is designed for lower-level streams of raw - midi data. - - @see MidiMessage -*/ -class JUCE_API MidiBuffer -{ -public: - //============================================================================== - /** Creates an empty MidiBuffer. */ - MidiBuffer() noexcept; - - /** Creates a MidiBuffer containing a single midi message. */ - explicit MidiBuffer (const MidiMessage& message) noexcept; - - /** Creates a copy of another MidiBuffer. */ - MidiBuffer (const MidiBuffer&) noexcept; - - /** Makes a copy of another MidiBuffer. */ - MidiBuffer& operator= (const MidiBuffer&) noexcept; - - /** Destructor */ - ~MidiBuffer(); - - //============================================================================== - /** Removes all events from the buffer. */ - void clear() noexcept; - - /** Removes all events between two times from the buffer. - - All events for which (start <= event position < start + numSamples) will - be removed. - */ - void clear (int start, int numSamples); - - /** Returns true if the buffer is empty. - To actually retrieve the events, use a MidiBuffer::Iterator object - */ - bool isEmpty() const noexcept; - - /** Counts the number of events in the buffer. - - This is actually quite a slow operation, as it has to iterate through all - the events, so you might prefer to call isEmpty() if that's all you need - to know. - */ - int getNumEvents() const noexcept; - - /** Adds an event to the buffer. - - The sample number will be used to determine the position of the event in - the buffer, which is always kept sorted. The MidiMessage's timestamp is - ignored. - - If an event is added whose sample position is the same as one or more events - already in the buffer, the new event will be placed after the existing ones. - - To retrieve events, use a MidiBuffer::Iterator object - */ - void addEvent (const MidiMessage& midiMessage, int sampleNumber); - - /** Adds an event to the buffer from raw midi data. - - The sample number will be used to determine the position of the event in - the buffer, which is always kept sorted. - - If an event is added whose sample position is the same as one or more events - already in the buffer, the new event will be placed after the existing ones. - - The event data will be inspected to calculate the number of bytes in length that - the midi event really takes up, so maxBytesOfMidiData may be longer than the data - that actually gets stored. E.g. if you pass in a note-on and a length of 4 bytes, - it'll actually only store 3 bytes. If the midi data is invalid, it might not - add an event at all. - - To retrieve events, use a MidiBuffer::Iterator object - */ - void addEvent (const void* rawMidiData, - int maxBytesOfMidiData, - int sampleNumber); - - /** Adds some events from another buffer to this one. - - @param otherBuffer the buffer containing the events you want to add - @param startSample the lowest sample number in the source buffer for which - events should be added. Any source events whose timestamp is - less than this will be ignored - @param numSamples the valid range of samples from the source buffer for which - events should be added - i.e. events in the source buffer whose - timestamp is greater than or equal to (startSample + numSamples) - will be ignored. If this value is less than 0, all events after - startSample will be taken. - @param sampleDeltaToAdd a value which will be added to the source timestamps of the events - that are added to this buffer - */ - void addEvents (const MidiBuffer& otherBuffer, - int startSample, - int numSamples, - int sampleDeltaToAdd); - - /** Returns the sample number of the first event in the buffer. - If the buffer's empty, this will just return 0. - */ - int getFirstEventTime() const noexcept; - - /** Returns the sample number of the last event in the buffer. - If the buffer's empty, this will just return 0. - */ - int getLastEventTime() const noexcept; - - //============================================================================== - /** Exchanges the contents of this buffer with another one. - - This is a quick operation, because no memory allocating or copying is done, it - just swaps the internal state of the two buffers. - */ - void swapWith (MidiBuffer&) noexcept; - - /** Preallocates some memory for the buffer to use. - This helps to avoid needing to reallocate space when the buffer has messages - added to it. - */ - void ensureSize (size_t minimumNumBytes); - - //============================================================================== - /** - Used to iterate through the events in a MidiBuffer. - - Note that altering the buffer while an iterator is using it isn't a - safe operation. - - @see MidiBuffer - */ - class JUCE_API Iterator - { - public: - //============================================================================== - /** Creates an Iterator for this MidiBuffer. */ - Iterator (const MidiBuffer&) noexcept; - - /** Destructor. */ - ~Iterator() noexcept; - - //============================================================================== - /** Repositions the iterator so that the next event retrieved will be the first - one whose sample position is at greater than or equal to the given position. - */ - void setNextSamplePosition (int samplePosition) noexcept; - - /** Retrieves a copy of the next event from the buffer. - - @param result on return, this will be the message. The MidiMessage's timestamp - is set to the same value as samplePosition. - @param samplePosition on return, this will be the position of the event, as a - sample index in the buffer - @returns true if an event was found, or false if the iterator has reached - the end of the buffer - */ - bool getNextEvent (MidiMessage& result, - int& samplePosition) noexcept; - - /** Retrieves the next event from the buffer. - - @param midiData on return, this pointer will be set to a block of data containing - the midi message. Note that to make it fast, this is a pointer - directly into the MidiBuffer's internal data, so is only valid - temporarily until the MidiBuffer is altered. - @param numBytesOfMidiData on return, this is the number of bytes of data used by the - midi message - @param samplePosition on return, this will be the position of the event, as a - sample index in the buffer - @returns true if an event was found, or false if the iterator has reached - the end of the buffer - */ - bool getNextEvent (const uint8* &midiData, - int& numBytesOfMidiData, - int& samplePosition) noexcept; - - private: - //============================================================================== - const MidiBuffer& buffer; - const uint8* data; - - JUCE_DECLARE_NON_COPYABLE (Iterator) - }; - - /** The raw data holding this buffer. - Obviously access to this data is provided at your own risk. Its internal format could - change in future, so don't write code that relies on it! - */ - Array data; - -private: - JUCE_LEAK_DETECTOR (MidiBuffer) -}; - - -#endif // JUCE_MIDIBUFFER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp deleted file mode 100755 index e798cc0..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.cpp +++ /dev/null @@ -1,428 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace MidiFileHelpers -{ - static void writeVariableLengthInt (OutputStream& out, unsigned int v) - { - unsigned int buffer = v & 0x7f; - - while ((v >>= 7) != 0) - { - buffer <<= 8; - buffer |= ((v & 0x7f) | 0x80); - } - - for (;;) - { - out.writeByte ((char) buffer); - - if (buffer & 0x80) - buffer >>= 8; - else - break; - } - } - - static bool parseMidiHeader (const uint8* &data, short& timeFormat, short& fileType, short& numberOfTracks) noexcept - { - unsigned int ch = ByteOrder::bigEndianInt (data); - data += 4; - - if (ch != ByteOrder::bigEndianInt ("MThd")) - { - bool ok = false; - - if (ch == ByteOrder::bigEndianInt ("RIFF")) - { - for (int i = 0; i < 8; ++i) - { - ch = ByteOrder::bigEndianInt (data); - data += 4; - - if (ch == ByteOrder::bigEndianInt ("MThd")) - { - ok = true; - break; - } - } - } - - if (! ok) - return false; - } - - unsigned int bytesRemaining = ByteOrder::bigEndianInt (data); - data += 4; - fileType = (short) ByteOrder::bigEndianShort (data); - data += 2; - numberOfTracks = (short) ByteOrder::bigEndianShort (data); - data += 2; - timeFormat = (short) ByteOrder::bigEndianShort (data); - data += 2; - bytesRemaining -= 6; - data += bytesRemaining; - - return true; - } - - static double convertTicksToSeconds (const double time, - const MidiMessageSequence& tempoEvents, - const int timeFormat) - { - if (timeFormat < 0) - return time / (-(timeFormat >> 8) * (timeFormat & 0xff)); - - double lastTime = 0.0, correctedTime = 0.0; - const double tickLen = 1.0 / (timeFormat & 0x7fff); - double secsPerTick = 0.5 * tickLen; - const int numEvents = tempoEvents.getNumEvents(); - - for (int i = 0; i < numEvents; ++i) - { - const MidiMessage& m = tempoEvents.getEventPointer(i)->message; - const double eventTime = m.getTimeStamp(); - - if (eventTime >= time) - break; - - correctedTime += (eventTime - lastTime) * secsPerTick; - lastTime = eventTime; - - if (m.isTempoMetaEvent()) - secsPerTick = tickLen * m.getTempoSecondsPerQuarterNote(); - - while (i + 1 < numEvents) - { - const MidiMessage& m2 = tempoEvents.getEventPointer(i + 1)->message; - - if (m2.getTimeStamp() != eventTime) - break; - - if (m2.isTempoMetaEvent()) - secsPerTick = tickLen * m2.getTempoSecondsPerQuarterNote(); - - ++i; - } - } - - return correctedTime + (time - lastTime) * secsPerTick; - } - - // a comparator that puts all the note-offs before note-ons that have the same time - struct Sorter - { - static int compareElements (const MidiMessageSequence::MidiEventHolder* const first, - const MidiMessageSequence::MidiEventHolder* const second) noexcept - { - const double diff = (first->message.getTimeStamp() - second->message.getTimeStamp()); - - if (diff > 0) return 1; - if (diff < 0) return -1; - if (first->message.isNoteOff() && second->message.isNoteOn()) return -1; - if (first->message.isNoteOn() && second->message.isNoteOff()) return 1; - - return 0; - } - }; - - template - static void findAllMatchingEvents (const OwnedArray& tracks, - MidiMessageSequence& results, - MethodType method) - { - for (int i = 0; i < tracks.size(); ++i) - { - const MidiMessageSequence& track = *tracks.getUnchecked(i); - const int numEvents = track.getNumEvents(); - - for (int j = 0; j < numEvents; ++j) - { - const MidiMessage& m = track.getEventPointer(j)->message; - - if ((m.*method)()) - results.addEvent (m); - } - } - } -} - -//============================================================================== -MidiFile::MidiFile() - : timeFormat ((short) (unsigned short) 0xe728) -{ -} - -MidiFile::~MidiFile() -{ -} - -void MidiFile::clear() -{ - tracks.clear(); -} - -//============================================================================== -int MidiFile::getNumTracks() const noexcept -{ - return tracks.size(); -} - -const MidiMessageSequence* MidiFile::getTrack (const int index) const noexcept -{ - return tracks [index]; -} - -void MidiFile::addTrack (const MidiMessageSequence& trackSequence) -{ - tracks.add (new MidiMessageSequence (trackSequence)); -} - -//============================================================================== -short MidiFile::getTimeFormat() const noexcept -{ - return timeFormat; -} - -void MidiFile::setTicksPerQuarterNote (const int ticks) noexcept -{ - timeFormat = (short) ticks; -} - -void MidiFile::setSmpteTimeFormat (const int framesPerSecond, - const int subframeResolution) noexcept -{ - timeFormat = (short) (((-framesPerSecond) << 8) | subframeResolution); -} - -//============================================================================== -void MidiFile::findAllTempoEvents (MidiMessageSequence& results) const -{ - MidiFileHelpers::findAllMatchingEvents (tracks, results, &MidiMessage::isTempoMetaEvent); -} - -void MidiFile::findAllTimeSigEvents (MidiMessageSequence& results) const -{ - MidiFileHelpers::findAllMatchingEvents (tracks, results, &MidiMessage::isTimeSignatureMetaEvent); -} - -void MidiFile::findAllKeySigEvents (MidiMessageSequence& results) const -{ - MidiFileHelpers::findAllMatchingEvents (tracks, results, &MidiMessage::isKeySignatureMetaEvent); -} - -double MidiFile::getLastTimestamp() const -{ - double t = 0.0; - - for (int i = tracks.size(); --i >= 0;) - t = jmax (t, tracks.getUnchecked(i)->getEndTime()); - - return t; -} - -//============================================================================== -bool MidiFile::readFrom (InputStream& sourceStream) -{ - clear(); - MemoryBlock data; - - const int maxSensibleMidiFileSize = 2 * 1024 * 1024; - - // (put a sanity-check on the file size, as midi files are generally small) - if (sourceStream.readIntoMemoryBlock (data, maxSensibleMidiFileSize)) - { - size_t size = data.getSize(); - const uint8* d = static_cast (data.getData()); - short fileType, expectedTracks; - - if (size > 16 && MidiFileHelpers::parseMidiHeader (d, timeFormat, fileType, expectedTracks)) - { - size -= (size_t) (d - static_cast (data.getData())); - - int track = 0; - - while (size > 0 && track < expectedTracks) - { - const int chunkType = (int) ByteOrder::bigEndianInt (d); - d += 4; - const int chunkSize = (int) ByteOrder::bigEndianInt (d); - d += 4; - - if (chunkSize <= 0) - break; - - if (chunkType == (int) ByteOrder::bigEndianInt ("MTrk")) - readNextTrack (d, chunkSize); - - size -= (size_t) chunkSize + 8; - d += chunkSize; - ++track; - } - - return true; - } - } - - return false; -} - -void MidiFile::readNextTrack (const uint8* data, int size) -{ - double time = 0; - uint8 lastStatusByte = 0; - - MidiMessageSequence result; - - while (size > 0) - { - int bytesUsed; - const int delay = MidiMessage::readVariableLengthVal (data, bytesUsed); - data += bytesUsed; - size -= bytesUsed; - time += delay; - - int messSize = 0; - const MidiMessage mm (data, size, messSize, lastStatusByte, time); - - if (messSize <= 0) - break; - - size -= messSize; - data += messSize; - - result.addEvent (mm); - - const uint8 firstByte = *(mm.getRawData()); - if ((firstByte & 0xf0) != 0xf0) - lastStatusByte = firstByte; - } - - // use a sort that puts all the note-offs before note-ons that have the same time - MidiFileHelpers::Sorter sorter; - result.list.sort (sorter, true); - - addTrack (result); - tracks.getLast()->updateMatchedPairs(); -} - -//============================================================================== -void MidiFile::convertTimestampTicksToSeconds() -{ - MidiMessageSequence tempoEvents; - findAllTempoEvents (tempoEvents); - findAllTimeSigEvents (tempoEvents); - - if (timeFormat != 0) - { - for (int i = 0; i < tracks.size(); ++i) - { - const MidiMessageSequence& ms = *tracks.getUnchecked(i); - - for (int j = ms.getNumEvents(); --j >= 0;) - { - MidiMessage& m = ms.getEventPointer(j)->message; - m.setTimeStamp (MidiFileHelpers::convertTicksToSeconds (m.getTimeStamp(), tempoEvents, timeFormat)); - } - } - } -} - -//============================================================================== -bool MidiFile::writeTo (OutputStream& out, int midiFileType) -{ - jassert (midiFileType >= 0 && midiFileType <= 2); - - out.writeIntBigEndian ((int) ByteOrder::bigEndianInt ("MThd")); - out.writeIntBigEndian (6); - out.writeShortBigEndian ((short) midiFileType); - out.writeShortBigEndian ((short) tracks.size()); - out.writeShortBigEndian (timeFormat); - - for (int i = 0; i < tracks.size(); ++i) - writeTrack (out, i); - - out.flush(); - return true; -} - -void MidiFile::writeTrack (OutputStream& mainOut, const int trackNum) -{ - MemoryOutputStream out; - const MidiMessageSequence& ms = *tracks.getUnchecked (trackNum); - - int lastTick = 0; - uint8 lastStatusByte = 0; - bool endOfTrackEventWritten = false; - - for (int i = 0; i < ms.getNumEvents(); ++i) - { - const MidiMessage& mm = ms.getEventPointer(i)->message; - - if (mm.isEndOfTrackMetaEvent()) - endOfTrackEventWritten = true; - - const int tick = roundToInt (mm.getTimeStamp()); - const int delta = jmax (0, tick - lastTick); - MidiFileHelpers::writeVariableLengthInt (out, (uint32) delta); - lastTick = tick; - - const uint8* data = mm.getRawData(); - int dataSize = mm.getRawDataSize(); - - const uint8 statusByte = data[0]; - - if (statusByte == lastStatusByte - && (statusByte & 0xf0) != 0xf0 - && dataSize > 1 - && i > 0) - { - ++data; - --dataSize; - } - else if (statusByte == 0xf0) // Write sysex message with length bytes. - { - out.writeByte ((char) statusByte); - - ++data; - --dataSize; - - MidiFileHelpers::writeVariableLengthInt (out, (uint32) dataSize); - } - - out.write (data, (size_t) dataSize); - lastStatusByte = statusByte; - } - - if (! endOfTrackEventWritten) - { - out.writeByte (0); // (tick delta) - const MidiMessage m (MidiMessage::endOfTrack()); - out.write (m.getRawData(), (size_t) m.getRawDataSize()); - } - - mainOut.writeIntBigEndian ((int) ByteOrder::bigEndianInt ("MTrk")); - mainOut.writeIntBigEndian ((int) out.getDataSize()); - mainOut << out; -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h deleted file mode 100755 index 2a69937..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiFile.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MIDIFILE_H_INCLUDED -#define JUCE_MIDIFILE_H_INCLUDED - - -//============================================================================== -/** - Reads/writes standard midi format files. - - To read a midi file, create a MidiFile object and call its readFrom() method. You - can then get the individual midi tracks from it using the getTrack() method. - - To write a file, create a MidiFile object, add some MidiMessageSequence objects - to it using the addTrack() method, and then call its writeTo() method to stream - it out. - - @see MidiMessageSequence -*/ -class JUCE_API MidiFile -{ -public: - //============================================================================== - /** Creates an empty MidiFile object. - */ - MidiFile(); - - /** Destructor. */ - ~MidiFile(); - - //============================================================================== - /** Returns the number of tracks in the file. - @see getTrack, addTrack - */ - int getNumTracks() const noexcept; - - /** Returns a pointer to one of the tracks in the file. - @returns a pointer to the track, or nullptr if the index is out-of-range - @see getNumTracks, addTrack - */ - const MidiMessageSequence* getTrack (int index) const noexcept; - - /** Adds a midi track to the file. - This will make its own internal copy of the sequence that is passed-in. - @see getNumTracks, getTrack - */ - void addTrack (const MidiMessageSequence& trackSequence); - - /** Removes all midi tracks from the file. - @see getNumTracks - */ - void clear(); - - /** Returns the raw time format code that will be written to a stream. - - After reading a midi file, this method will return the time-format that - was read from the file's header. It can be changed using the setTicksPerQuarterNote() - or setSmpteTimeFormat() methods. - - If the value returned is positive, it indicates the number of midi ticks - per quarter-note - see setTicksPerQuarterNote(). - - It it's negative, the upper byte indicates the frames-per-second (but negative), and - the lower byte is the number of ticks per frame - see setSmpteTimeFormat(). - */ - short getTimeFormat() const noexcept; - - /** Sets the time format to use when this file is written to a stream. - - If this is called, the file will be written as bars/beats using the - specified resolution, rather than SMPTE absolute times, as would be - used if setSmpteTimeFormat() had been called instead. - - @param ticksPerQuarterNote e.g. 96, 960 - @see setSmpteTimeFormat - */ - void setTicksPerQuarterNote (int ticksPerQuarterNote) noexcept; - - /** Sets the time format to use when this file is written to a stream. - - If this is called, the file will be written using absolute times, rather - than bars/beats as would be the case if setTicksPerBeat() had been called - instead. - - @param framesPerSecond must be 24, 25, 29 or 30 - @param subframeResolution the sub-second resolution, e.g. 4 (midi time code), - 8, 10, 80 (SMPTE bit resolution), or 100. For millisecond - timing, setSmpteTimeFormat (25, 40) - @see setTicksPerBeat - */ - void setSmpteTimeFormat (int framesPerSecond, - int subframeResolution) noexcept; - - //============================================================================== - /** Makes a list of all the tempo-change meta-events from all tracks in the midi file. - Useful for finding the positions of all the tempo changes in a file. - @param tempoChangeEvents a list to which all the events will be added - */ - void findAllTempoEvents (MidiMessageSequence& tempoChangeEvents) const; - - /** Makes a list of all the time-signature meta-events from all tracks in the midi file. - Useful for finding the positions of all the tempo changes in a file. - @param timeSigEvents a list to which all the events will be added - */ - void findAllTimeSigEvents (MidiMessageSequence& timeSigEvents) const; - - /** Makes a list of all the time-signature meta-events from all tracks in the midi file. - @param keySigEvents a list to which all the events will be added - */ - void findAllKeySigEvents (MidiMessageSequence& keySigEvents) const; - - /** Returns the latest timestamp in any of the tracks. - (Useful for finding the length of the file). - */ - double getLastTimestamp() const; - - //============================================================================== - /** Reads a midi file format stream. - - After calling this, you can get the tracks that were read from the file by using the - getNumTracks() and getTrack() methods. - - The timestamps of the midi events in the tracks will represent their positions in - terms of midi ticks. To convert them to seconds, use the convertTimestampTicksToSeconds() - method. - - @returns true if the stream was read successfully - */ - bool readFrom (InputStream& sourceStream); - - /** Writes the midi tracks as a standard midi file. - The midiFileType value is written as the file's format type, which can be 0, 1 - or 2 - see the midi file spec for more info about that. - @returns true if the operation succeeded. - */ - bool writeTo (OutputStream& destStream, int midiFileType = 1); - - /** Converts the timestamp of all the midi events from midi ticks to seconds. - - This will use the midi time format and tempo/time signature info in the - tracks to convert all the timestamps to absolute values in seconds. - */ - void convertTimestampTicksToSeconds(); - - -private: - //============================================================================== - OwnedArray tracks; - short timeFormat; - - void readNextTrack (const uint8*, int size); - void writeTrack (OutputStream&, int trackNum); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiFile) -}; - - -#endif // JUCE_MIDIFILE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp deleted file mode 100755 index a40262b..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -MidiKeyboardState::MidiKeyboardState() -{ - zerostruct (noteStates); -} - -MidiKeyboardState::~MidiKeyboardState() -{ -} - -//============================================================================== -void MidiKeyboardState::reset() -{ - const ScopedLock sl (lock); - zerostruct (noteStates); - eventsToAdd.clear(); -} - -bool MidiKeyboardState::isNoteOn (const int midiChannel, const int n) const noexcept -{ - jassert (midiChannel >= 0 && midiChannel <= 16); - - return isPositiveAndBelow (n, (int) 128) - && (noteStates[n] & (1 << (midiChannel - 1))) != 0; -} - -bool MidiKeyboardState::isNoteOnForChannels (const int midiChannelMask, const int n) const noexcept -{ - return isPositiveAndBelow (n, (int) 128) - && (noteStates[n] & midiChannelMask) != 0; -} - -void MidiKeyboardState::noteOn (const int midiChannel, const int midiNoteNumber, const float velocity) -{ - jassert (midiChannel >= 0 && midiChannel <= 16); - jassert (isPositiveAndBelow (midiNoteNumber, (int) 128)); - - const ScopedLock sl (lock); - - if (isPositiveAndBelow (midiNoteNumber, (int) 128)) - { - const int timeNow = (int) Time::getMillisecondCounter(); - eventsToAdd.addEvent (MidiMessage::noteOn (midiChannel, midiNoteNumber, velocity), timeNow); - eventsToAdd.clear (0, timeNow - 500); - - noteOnInternal (midiChannel, midiNoteNumber, velocity); - } -} - -void MidiKeyboardState::noteOnInternal (const int midiChannel, const int midiNoteNumber, const float velocity) -{ - if (isPositiveAndBelow (midiNoteNumber, (int) 128)) - { - noteStates [midiNoteNumber] |= (1 << (midiChannel - 1)); - - for (int i = listeners.size(); --i >= 0;) - listeners.getUnchecked(i)->handleNoteOn (this, midiChannel, midiNoteNumber, velocity); - } -} - -void MidiKeyboardState::noteOff (const int midiChannel, const int midiNoteNumber) -{ - const ScopedLock sl (lock); - - if (isNoteOn (midiChannel, midiNoteNumber)) - { - const int timeNow = (int) Time::getMillisecondCounter(); - eventsToAdd.addEvent (MidiMessage::noteOff (midiChannel, midiNoteNumber), timeNow); - eventsToAdd.clear (0, timeNow - 500); - - noteOffInternal (midiChannel, midiNoteNumber); - } -} - -void MidiKeyboardState::noteOffInternal (const int midiChannel, const int midiNoteNumber) -{ - if (isNoteOn (midiChannel, midiNoteNumber)) - { - noteStates [midiNoteNumber] &= ~(1 << (midiChannel - 1)); - - for (int i = listeners.size(); --i >= 0;) - listeners.getUnchecked(i)->handleNoteOff (this, midiChannel, midiNoteNumber); - } -} - -void MidiKeyboardState::allNotesOff (const int midiChannel) -{ - const ScopedLock sl (lock); - - if (midiChannel <= 0) - { - for (int i = 1; i <= 16; ++i) - allNotesOff (i); - } - else - { - for (int i = 0; i < 128; ++i) - noteOff (midiChannel, i); - } -} - -void MidiKeyboardState::processNextMidiEvent (const MidiMessage& message) -{ - if (message.isNoteOn()) - { - noteOnInternal (message.getChannel(), message.getNoteNumber(), message.getFloatVelocity()); - } - else if (message.isNoteOff()) - { - noteOffInternal (message.getChannel(), message.getNoteNumber()); - } - else if (message.isAllNotesOff()) - { - for (int i = 0; i < 128; ++i) - noteOffInternal (message.getChannel(), i); - } -} - -void MidiKeyboardState::processNextMidiBuffer (MidiBuffer& buffer, - const int startSample, - const int numSamples, - const bool injectIndirectEvents) -{ - MidiBuffer::Iterator i (buffer); - MidiMessage message (0xf4, 0.0); - int time; - - const ScopedLock sl (lock); - - while (i.getNextEvent (message, time)) - processNextMidiEvent (message); - - if (injectIndirectEvents) - { - MidiBuffer::Iterator i2 (eventsToAdd); - const int firstEventToAdd = eventsToAdd.getFirstEventTime(); - const double scaleFactor = numSamples / (double) (eventsToAdd.getLastEventTime() + 1 - firstEventToAdd); - - while (i2.getNextEvent (message, time)) - { - const int pos = jlimit (0, numSamples - 1, roundToInt ((time - firstEventToAdd) * scaleFactor)); - buffer.addEvent (message, startSample + pos); - } - } - - eventsToAdd.clear(); -} - -//============================================================================== -void MidiKeyboardState::addListener (MidiKeyboardStateListener* const listener) -{ - const ScopedLock sl (lock); - listeners.addIfNotAlreadyThere (listener); -} - -void MidiKeyboardState::removeListener (MidiKeyboardStateListener* const listener) -{ - const ScopedLock sl (lock); - listeners.removeFirstMatchingValue (listener); -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h deleted file mode 100755 index 885b7d8..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiKeyboardState.h +++ /dev/null @@ -1,205 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MIDIKEYBOARDSTATE_H_INCLUDED -#define JUCE_MIDIKEYBOARDSTATE_H_INCLUDED - -class MidiKeyboardState; - - -//============================================================================== -/** - Receives events from a MidiKeyboardState object. - - @see MidiKeyboardState -*/ -class JUCE_API MidiKeyboardStateListener -{ -public: - //============================================================================== - MidiKeyboardStateListener() noexcept {} - virtual ~MidiKeyboardStateListener() {} - - //============================================================================== - /** Called when one of the MidiKeyboardState's keys is pressed. - - This will be called synchronously when the state is either processing a - buffer in its MidiKeyboardState::processNextMidiBuffer() method, or - when a note is being played with its MidiKeyboardState::noteOn() method. - - Note that this callback could happen from an audio callback thread, so be - careful not to block, and avoid any UI activity in the callback. - */ - virtual void handleNoteOn (MidiKeyboardState* source, - int midiChannel, int midiNoteNumber, float velocity) = 0; - - /** Called when one of the MidiKeyboardState's keys is released. - - This will be called synchronously when the state is either processing a - buffer in its MidiKeyboardState::processNextMidiBuffer() method, or - when a note is being played with its MidiKeyboardState::noteOff() method. - - Note that this callback could happen from an audio callback thread, so be - careful not to block, and avoid any UI activity in the callback. - */ - virtual void handleNoteOff (MidiKeyboardState* source, - int midiChannel, int midiNoteNumber) = 0; -}; - - -//============================================================================== -/** - Represents a piano keyboard, keeping track of which keys are currently pressed. - - This object can parse a stream of midi events, using them to update its idea - of which keys are pressed for each individiual midi channel. - - When keys go up or down, it can broadcast these events to listener objects. - - It also allows key up/down events to be triggered with its noteOn() and noteOff() - methods, and midi messages for these events will be merged into the - midi stream that gets processed by processNextMidiBuffer(). -*/ -class JUCE_API MidiKeyboardState -{ -public: - //============================================================================== - MidiKeyboardState(); - ~MidiKeyboardState(); - - //============================================================================== - /** Resets the state of the object. - - All internal data for all the channels is reset, but no events are sent as a - result. - - If you want to release any keys that are currently down, and to send out note-up - midi messages for this, use the allNotesOff() method instead. - */ - void reset(); - - /** Returns true if the given midi key is currently held down for the given midi channel. - - The channel number must be between 1 and 16. If you want to see if any notes are - on for a range of channels, use the isNoteOnForChannels() method. - */ - bool isNoteOn (int midiChannel, int midiNoteNumber) const noexcept; - - /** Returns true if the given midi key is currently held down on any of a set of midi channels. - - The channel mask has a bit set for each midi channel you want to test for - bit - 0 = midi channel 1, bit 1 = midi channel 2, etc. - - If a note is on for at least one of the specified channels, this returns true. - */ - bool isNoteOnForChannels (int midiChannelMask, int midiNoteNumber) const noexcept; - - /** Turns a specified note on. - - This will cause a suitable midi note-on event to be injected into the midi buffer during the - next call to processNextMidiBuffer(). - - It will also trigger a synchronous callback to the listeners to tell them that the key has - gone down. - */ - void noteOn (int midiChannel, int midiNoteNumber, float velocity); - - /** Turns a specified note off. - - This will cause a suitable midi note-off event to be injected into the midi buffer during the - next call to processNextMidiBuffer(). - - It will also trigger a synchronous callback to the listeners to tell them that the key has - gone up. - - But if the note isn't acutally down for the given channel, this method will in fact do nothing. - */ - void noteOff (int midiChannel, int midiNoteNumber); - - /** This will turn off any currently-down notes for the given midi channel. - - If you pass 0 for the midi channel, it will in fact turn off all notes on all channels. - - Calling this method will make calls to noteOff(), so can trigger synchronous callbacks - and events being added to the midi stream. - */ - void allNotesOff (int midiChannel); - - //============================================================================== - /** Looks at a key-up/down event and uses it to update the state of this object. - - To process a buffer full of midi messages, use the processNextMidiBuffer() method - instead. - */ - void processNextMidiEvent (const MidiMessage& message); - - /** Scans a midi stream for up/down events and adds its own events to it. - - This will look for any up/down events and use them to update the internal state, - synchronously making suitable callbacks to the listeners. - - If injectIndirectEvents is true, then midi events to produce the recent noteOn() - and noteOff() calls will be added into the buffer. - - Only the section of the buffer whose timestamps are between startSample and - (startSample + numSamples) will be affected, and any events added will be placed - between these times. - - If you're going to use this method, you'll need to keep calling it regularly for - it to work satisfactorily. - - To process a single midi event at a time, use the processNextMidiEvent() method - instead. - */ - void processNextMidiBuffer (MidiBuffer& buffer, - int startSample, - int numSamples, - bool injectIndirectEvents); - - //============================================================================== - /** Registers a listener for callbacks when keys go up or down. - @see removeListener - */ - void addListener (MidiKeyboardStateListener* listener); - - /** Deregisters a listener. - @see addListener - */ - void removeListener (MidiKeyboardStateListener* listener); - -private: - //============================================================================== - CriticalSection lock; - uint16 noteStates [128]; - MidiBuffer eventsToAdd; - Array listeners; - - void noteOnInternal (int midiChannel, int midiNoteNumber, float velocity); - void noteOffInternal (int midiChannel, int midiNoteNumber); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiKeyboardState) -}; - - -#endif // JUCE_MIDIKEYBOARDSTATE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp deleted file mode 100755 index 07e2ccd..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.cpp +++ /dev/null @@ -1,1094 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace MidiHelpers -{ - inline uint8 initialByte (const int type, const int channel) noexcept - { - return (uint8) (type | jlimit (0, 15, channel - 1)); - } - - inline uint8 validVelocity (const int v) noexcept - { - return (uint8) jlimit (0, 127, v); - } -} - -//============================================================================== -int MidiMessage::readVariableLengthVal (const uint8* data, int& numBytesUsed) noexcept -{ - numBytesUsed = 0; - int v = 0, i; - - do - { - i = (int) *data++; - - if (++numBytesUsed > 6) - break; - - v = (v << 7) + (i & 0x7f); - - } while (i & 0x80); - - return v; -} - -int MidiMessage::getMessageLengthFromFirstByte (const uint8 firstByte) noexcept -{ - // this method only works for valid starting bytes of a short midi message - jassert (firstByte >= 0x80 && firstByte != 0xf0 && firstByte != 0xf7); - - static const char messageLengths[] = - { - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 1, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 - }; - - return messageLengths [firstByte & 0x7f]; -} - -//============================================================================== -MidiMessage::MidiMessage() noexcept - : timeStamp (0), size (2) -{ - preallocatedData.asBytes[0] = 0xf0; - preallocatedData.asBytes[1] = 0xf7; -} - -MidiMessage::MidiMessage (const void* const d, const int dataSize, const double t) - : timeStamp (t), - size (dataSize) -{ - jassert (dataSize > 0); - memcpy (allocateSpace (dataSize), d, (size_t) dataSize); - - // check that the length matches the data.. - jassert (size > 3 || *(uint8*)d >= 0xf0 || getMessageLengthFromFirstByte (*(uint8*)d) == size); -} - -MidiMessage::MidiMessage (const int byte1, const double t) noexcept - : timeStamp (t), size (1) -{ - preallocatedData.asBytes[0] = (uint8) byte1; - - // check that the length matches the data.. - jassert (byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8) byte1) == 1); -} - -MidiMessage::MidiMessage (const int byte1, const int byte2, const double t) noexcept - : timeStamp (t), size (2) -{ - preallocatedData.asBytes[0] = (uint8) byte1; - preallocatedData.asBytes[1] = (uint8) byte2; - - // check that the length matches the data.. - jassert (byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8) byte1) == 2); -} - -MidiMessage::MidiMessage (const int byte1, const int byte2, const int byte3, const double t) noexcept - : timeStamp (t), size (3) -{ - preallocatedData.asBytes[0] = (uint8) byte1; - preallocatedData.asBytes[1] = (uint8) byte2; - preallocatedData.asBytes[2] = (uint8) byte3; - - // check that the length matches the data.. - jassert (byte1 >= 0xf0 || getMessageLengthFromFirstByte ((uint8) byte1) == 3); -} - -MidiMessage::MidiMessage (const MidiMessage& other) - : timeStamp (other.timeStamp), size (other.size) -{ - if (other.allocatedData != nullptr) - { - allocatedData.malloc ((size_t) size); - memcpy (allocatedData, other.allocatedData, (size_t) size); - } - else - { - preallocatedData.asInt32 = other.preallocatedData.asInt32; - } -} - -MidiMessage::MidiMessage (const MidiMessage& other, const double newTimeStamp) - : timeStamp (newTimeStamp), size (other.size) -{ - if (other.allocatedData != nullptr) - { - allocatedData.malloc ((size_t) size); - memcpy (allocatedData, other.allocatedData, (size_t) size); - } - else - { - preallocatedData.asInt32 = other.preallocatedData.asInt32; - } -} - -MidiMessage::MidiMessage (const void* srcData, int sz, int& numBytesUsed, const uint8 lastStatusByte, - double t, bool sysexHasEmbeddedLength) - : timeStamp (t) -{ - const uint8* src = static_cast (srcData); - unsigned int byte = (unsigned int) *src; - - if (byte < 0x80) - { - byte = (unsigned int) (uint8) lastStatusByte; - numBytesUsed = -1; - } - else - { - numBytesUsed = 0; - --sz; - ++src; - } - - if (byte >= 0x80) - { - if (byte == 0xf0) - { - const uint8* d = src; - bool haveReadAllLengthBytes = ! sysexHasEmbeddedLength; - int numVariableLengthSysexBytes = 0; - - while (d < src + sz) - { - if (*d >= 0x80) - { - if (*d == 0xf7) - { - ++d; // include the trailing 0xf7 when we hit it - break; - } - - if (haveReadAllLengthBytes) // if we see a 0x80 bit set after the initial data length - break; // bytes, assume it's the end of the sysex - - ++numVariableLengthSysexBytes; - } - else if (! haveReadAllLengthBytes) - { - haveReadAllLengthBytes = true; - ++numVariableLengthSysexBytes; - } - - ++d; - } - - src += numVariableLengthSysexBytes; - size = 1 + (int) (d - src); - - uint8* dest = allocateSpace (size); - *dest = (uint8) byte; - memcpy (dest + 1, src, (size_t) (size - 1)); - - numBytesUsed += numVariableLengthSysexBytes; // (these aren't counted in the size) - } - else if (byte == 0xff) - { - int n; - const int bytesLeft = readVariableLengthVal (src + 1, n); - size = jmin (sz + 1, n + 2 + bytesLeft); - - uint8* dest = allocateSpace (size); - *dest = (uint8) byte; - memcpy (dest + 1, src, (size_t) size - 1); - } - else - { - preallocatedData.asInt32 = 0; - size = getMessageLengthFromFirstByte ((uint8) byte); - preallocatedData.asBytes[0] = (uint8) byte; - - if (size > 1) - { - preallocatedData.asBytes[1] = src[0]; - - if (size > 2) - preallocatedData.asBytes[2] = src[1]; - } - } - - numBytesUsed += size; - } - else - { - preallocatedData.asInt32 = 0; - size = 0; - } -} - -MidiMessage& MidiMessage::operator= (const MidiMessage& other) -{ - if (this != &other) - { - timeStamp = other.timeStamp; - size = other.size; - - if (other.allocatedData != nullptr) - { - allocatedData.malloc ((size_t) size); - memcpy (allocatedData, other.allocatedData, (size_t) size); - } - else - { - allocatedData.free(); - preallocatedData.asInt32 = other.preallocatedData.asInt32; - } - } - - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -MidiMessage::MidiMessage (MidiMessage&& other) noexcept - : timeStamp (other.timeStamp), size (other.size) -{ - if (other.allocatedData != nullptr) - allocatedData.swapWith (other.allocatedData); - else - preallocatedData.asInt32 = other.preallocatedData.asInt32; -} - -MidiMessage& MidiMessage::operator= (MidiMessage&& other) noexcept -{ - jassert (this != &other); // shouldn't be possible - - timeStamp = other.timeStamp; - size = other.size; - allocatedData.swapWith (other.allocatedData); - preallocatedData.asInt32 = other.preallocatedData.asInt32; - - return *this; -} -#endif - -MidiMessage::~MidiMessage() {} - -uint8* MidiMessage::allocateSpace (int bytes) -{ - if (bytes > 4) - { - allocatedData.malloc ((size_t) bytes); - return allocatedData; - } - - return preallocatedData.asBytes; -} - -int MidiMessage::getChannel() const noexcept -{ - const uint8* const data = getRawData(); - - if ((data[0] & 0xf0) != 0xf0) - return (data[0] & 0xf) + 1; - - return 0; -} - -bool MidiMessage::isForChannel (const int channel) const noexcept -{ - jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 - - const uint8* const data = getRawData(); - - return ((data[0] & 0xf) == channel - 1) - && ((data[0] & 0xf0) != 0xf0); -} - -void MidiMessage::setChannel (const int channel) noexcept -{ - jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 - - uint8* const data = getData(); - - if ((data[0] & 0xf0) != (uint8) 0xf0) - data[0] = (uint8) ((data[0] & (uint8) 0xf0) - | (uint8)(channel - 1)); -} - -bool MidiMessage::isNoteOn (const bool returnTrueForVelocity0) const noexcept -{ - const uint8* const data = getRawData(); - - return ((data[0] & 0xf0) == 0x90) - && (returnTrueForVelocity0 || data[2] != 0); -} - -bool MidiMessage::isNoteOff (const bool returnTrueForNoteOnVelocity0) const noexcept -{ - const uint8* const data = getRawData(); - - return ((data[0] & 0xf0) == 0x80) - || (returnTrueForNoteOnVelocity0 && (data[2] == 0) && ((data[0] & 0xf0) == 0x90)); -} - -bool MidiMessage::isNoteOnOrOff() const noexcept -{ - const uint8* const data = getRawData(); - - const int d = data[0] & 0xf0; - return (d == 0x90) || (d == 0x80); -} - -int MidiMessage::getNoteNumber() const noexcept -{ - return getRawData()[1]; -} - -void MidiMessage::setNoteNumber (const int newNoteNumber) noexcept -{ - if (isNoteOnOrOff()) - getData()[1] = (uint8) (newNoteNumber & 127); -} - -uint8 MidiMessage::getVelocity() const noexcept -{ - if (isNoteOnOrOff()) - return getRawData()[2]; - - return 0; -} - -float MidiMessage::getFloatVelocity() const noexcept -{ - return getVelocity() * (1.0f / 127.0f); -} - -void MidiMessage::setVelocity (const float newVelocity) noexcept -{ - if (isNoteOnOrOff()) - getData()[2] = MidiHelpers::validVelocity (roundToInt (newVelocity * 127.0f)); -} - -void MidiMessage::multiplyVelocity (const float scaleFactor) noexcept -{ - if (isNoteOnOrOff()) - { - uint8* const data = getData(); - data[2] = MidiHelpers::validVelocity (roundToInt (scaleFactor * data[2])); - } -} - -bool MidiMessage::isAftertouch() const noexcept -{ - return (getRawData()[0] & 0xf0) == 0xa0; -} - -int MidiMessage::getAfterTouchValue() const noexcept -{ - jassert (isAftertouch()); - return getRawData()[2]; -} - -MidiMessage MidiMessage::aftertouchChange (const int channel, - const int noteNum, - const int aftertouchValue) noexcept -{ - jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 - jassert (isPositiveAndBelow (noteNum, (int) 128)); - jassert (isPositiveAndBelow (aftertouchValue, (int) 128)); - - return MidiMessage (MidiHelpers::initialByte (0xa0, channel), - noteNum & 0x7f, - aftertouchValue & 0x7f); -} - -bool MidiMessage::isChannelPressure() const noexcept -{ - return (getRawData()[0] & 0xf0) == 0xd0; -} - -int MidiMessage::getChannelPressureValue() const noexcept -{ - jassert (isChannelPressure()); - return getRawData()[1]; -} - -MidiMessage MidiMessage::channelPressureChange (const int channel, const int pressure) noexcept -{ - jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 - jassert (isPositiveAndBelow (pressure, (int) 128)); - - return MidiMessage (MidiHelpers::initialByte (0xd0, channel), pressure & 0x7f); -} - -bool MidiMessage::isSustainPedalOn() const noexcept { return isControllerOfType (0x40) && getRawData()[2] >= 64; } -bool MidiMessage::isSustainPedalOff() const noexcept { return isControllerOfType (0x40) && getRawData()[2] < 64; } - -bool MidiMessage::isSostenutoPedalOn() const noexcept { return isControllerOfType (0x42) && getRawData()[2] >= 64; } -bool MidiMessage::isSostenutoPedalOff() const noexcept { return isControllerOfType (0x42) && getRawData()[2] < 64; } - -bool MidiMessage::isSoftPedalOn() const noexcept { return isControllerOfType (0x43) && getRawData()[2] >= 64; } -bool MidiMessage::isSoftPedalOff() const noexcept { return isControllerOfType (0x43) && getRawData()[2] < 64; } - - -bool MidiMessage::isProgramChange() const noexcept -{ - return (getRawData()[0] & 0xf0) == 0xc0; -} - -int MidiMessage::getProgramChangeNumber() const noexcept -{ - jassert (isProgramChange()); - return getRawData()[1]; -} - -MidiMessage MidiMessage::programChange (const int channel, const int programNumber) noexcept -{ - jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 - - return MidiMessage (MidiHelpers::initialByte (0xc0, channel), programNumber & 0x7f); -} - -bool MidiMessage::isPitchWheel() const noexcept -{ - return (getRawData()[0] & 0xf0) == 0xe0; -} - -int MidiMessage::getPitchWheelValue() const noexcept -{ - jassert (isPitchWheel()); - const uint8* const data = getRawData(); - return data[1] | (data[2] << 7); -} - -MidiMessage MidiMessage::pitchWheel (const int channel, const int position) noexcept -{ - jassert (channel > 0 && channel <= 16); // valid channels are numbered 1 to 16 - jassert (isPositiveAndBelow (position, (int) 0x4000)); - - return MidiMessage (MidiHelpers::initialByte (0xe0, channel), - position & 127, (position >> 7) & 127); -} - -bool MidiMessage::isController() const noexcept -{ - return (getRawData()[0] & 0xf0) == 0xb0; -} - -bool MidiMessage::isControllerOfType (const int controllerType) const noexcept -{ - const uint8* const data = getRawData(); - return (data[0] & 0xf0) == 0xb0 && data[1] == controllerType; -} - -int MidiMessage::getControllerNumber() const noexcept -{ - jassert (isController()); - return getRawData()[1]; -} - -int MidiMessage::getControllerValue() const noexcept -{ - jassert (isController()); - return getRawData()[2]; -} - -MidiMessage MidiMessage::controllerEvent (const int channel, const int controllerType, const int value) noexcept -{ - // the channel must be between 1 and 16 inclusive - jassert (channel > 0 && channel <= 16); - - return MidiMessage (MidiHelpers::initialByte (0xb0, channel), - controllerType & 127, value & 127); -} - -MidiMessage MidiMessage::noteOn (const int channel, const int noteNumber, const float velocity) noexcept -{ - return noteOn (channel, noteNumber, (uint8) (velocity * 127.0f + 0.5f)); -} - -MidiMessage MidiMessage::noteOn (const int channel, const int noteNumber, const uint8 velocity) noexcept -{ - jassert (channel > 0 && channel <= 16); - jassert (isPositiveAndBelow (noteNumber, (int) 128)); - - return MidiMessage (MidiHelpers::initialByte (0x90, channel), - noteNumber & 127, MidiHelpers::validVelocity (velocity)); -} - -MidiMessage MidiMessage::noteOff (const int channel, const int noteNumber, uint8 velocity) noexcept -{ - jassert (channel > 0 && channel <= 16); - jassert (isPositiveAndBelow (noteNumber, (int) 128)); - - return MidiMessage (MidiHelpers::initialByte (0x80, channel), - noteNumber & 127, MidiHelpers::validVelocity (velocity)); -} - -MidiMessage MidiMessage::allNotesOff (const int channel) noexcept -{ - return controllerEvent (channel, 123, 0); -} - -bool MidiMessage::isAllNotesOff() const noexcept -{ - const uint8* const data = getRawData(); - return (data[0] & 0xf0) == 0xb0 && data[1] == 123; -} - -MidiMessage MidiMessage::allSoundOff (const int channel) noexcept -{ - return controllerEvent (channel, 120, 0); -} - -bool MidiMessage::isAllSoundOff() const noexcept -{ - const uint8* const data = getRawData(); - return (data[0] & 0xf0) == 0xb0 && data[1] == 120; -} - -MidiMessage MidiMessage::allControllersOff (const int channel) noexcept -{ - return controllerEvent (channel, 121, 0); -} - -MidiMessage MidiMessage::masterVolume (const float volume) -{ - const int vol = jlimit (0, 0x3fff, roundToInt (volume * 0x4000)); - - const uint8 buf[] = { 0xf0, 0x7f, 0x7f, 0x04, 0x01, - (uint8) (vol & 0x7f), - (uint8) (vol >> 7), - 0xf7 }; - - return MidiMessage (buf, 8); -} - -//============================================================================== -bool MidiMessage::isSysEx() const noexcept -{ - return *getRawData() == 0xf0; -} - -MidiMessage MidiMessage::createSysExMessage (const void* sysexData, const int dataSize) -{ - HeapBlock m ((size_t) dataSize + 2); - - m[0] = 0xf0; - memcpy (m + 1, sysexData, (size_t) dataSize); - m[dataSize + 1] = 0xf7; - - return MidiMessage (m, dataSize + 2); -} - -const uint8* MidiMessage::getSysExData() const noexcept -{ - return isSysEx() ? getRawData() + 1 : nullptr; -} - -int MidiMessage::getSysExDataSize() const noexcept -{ - return isSysEx() ? size - 2 : 0; -} - -//============================================================================== -bool MidiMessage::isMetaEvent() const noexcept { return *getRawData() == 0xff; } -bool MidiMessage::isActiveSense() const noexcept { return *getRawData() == 0xfe; } - -int MidiMessage::getMetaEventType() const noexcept -{ - const uint8* const data = getRawData(); - return *data != 0xff ? -1 : data[1]; -} - -int MidiMessage::getMetaEventLength() const noexcept -{ - const uint8* const data = getRawData(); - if (*data == 0xff) - { - int n; - return jmin (size - 2, readVariableLengthVal (data + 2, n)); - } - - return 0; -} - -const uint8* MidiMessage::getMetaEventData() const noexcept -{ - jassert (isMetaEvent()); - - int n; - const uint8* d = getRawData() + 2; - readVariableLengthVal (d, n); - return d + n; -} - -bool MidiMessage::isTrackMetaEvent() const noexcept { return getMetaEventType() == 0; } -bool MidiMessage::isEndOfTrackMetaEvent() const noexcept { return getMetaEventType() == 47; } - -bool MidiMessage::isTextMetaEvent() const noexcept -{ - const int t = getMetaEventType(); - return t > 0 && t < 16; -} - -String MidiMessage::getTextFromTextMetaEvent() const -{ - const char* const textData = reinterpret_cast (getMetaEventData()); - return String (CharPointer_UTF8 (textData), - CharPointer_UTF8 (textData + getMetaEventLength())); -} - -MidiMessage MidiMessage::textMetaEvent (int type, StringRef text) -{ - jassert (type > 0 && type < 16); - - MidiMessage result; - - const size_t textSize = text.text.sizeInBytes() - 1; - - uint8 header[8]; - size_t n = sizeof (header); - - header[--n] = (uint8) (textSize & 0x7f); - - for (size_t i = textSize; (i >>= 7) != 0;) - header[--n] = (uint8) ((i & 0x7f) | 0x80); - - header[--n] = (uint8) type; - header[--n] = 0xff; - - const size_t headerLen = sizeof (header) - n; - - uint8* const dest = result.allocateSpace ((int) (headerLen + textSize)); - result.size = (int) (headerLen + textSize); - - memcpy (dest, header + n, headerLen); - memcpy (dest + headerLen, text.text.getAddress(), textSize); - - return result; -} - -bool MidiMessage::isTrackNameEvent() const noexcept { const uint8* data = getRawData(); return (data[1] == 3) && (*data == 0xff); } -bool MidiMessage::isTempoMetaEvent() const noexcept { const uint8* data = getRawData(); return (data[1] == 81) && (*data == 0xff); } -bool MidiMessage::isMidiChannelMetaEvent() const noexcept { const uint8* data = getRawData(); return (data[1] == 0x20) && (*data == 0xff) && (data[2] == 1); } - -int MidiMessage::getMidiChannelMetaEventChannel() const noexcept -{ - jassert (isMidiChannelMetaEvent()); - return getRawData()[3] + 1; -} - -double MidiMessage::getTempoSecondsPerQuarterNote() const noexcept -{ - if (! isTempoMetaEvent()) - return 0.0; - - const uint8* const d = getMetaEventData(); - - return (((unsigned int) d[0] << 16) - | ((unsigned int) d[1] << 8) - | d[2]) - / 1000000.0; -} - -double MidiMessage::getTempoMetaEventTickLength (const short timeFormat) const noexcept -{ - if (timeFormat > 0) - { - if (! isTempoMetaEvent()) - return 0.5 / timeFormat; - - return getTempoSecondsPerQuarterNote() / timeFormat; - } - else - { - const int frameCode = (-timeFormat) >> 8; - double framesPerSecond; - - switch (frameCode) - { - case 24: framesPerSecond = 24.0; break; - case 25: framesPerSecond = 25.0; break; - case 29: framesPerSecond = 29.97; break; - case 30: framesPerSecond = 30.0; break; - default: framesPerSecond = 30.0; break; - } - - return (1.0 / framesPerSecond) / (timeFormat & 0xff); - } -} - -MidiMessage MidiMessage::tempoMetaEvent (int microsecondsPerQuarterNote) noexcept -{ - const uint8 d[] = { 0xff, 81, 3, - (uint8) (microsecondsPerQuarterNote >> 16), - (uint8) (microsecondsPerQuarterNote >> 8), - (uint8) microsecondsPerQuarterNote }; - - return MidiMessage (d, 6, 0.0); -} - -bool MidiMessage::isTimeSignatureMetaEvent() const noexcept -{ - const uint8* const data = getRawData(); - return (data[1] == 0x58) && (*data == (uint8) 0xff); -} - -void MidiMessage::getTimeSignatureInfo (int& numerator, int& denominator) const noexcept -{ - if (isTimeSignatureMetaEvent()) - { - const uint8* const d = getMetaEventData(); - numerator = d[0]; - denominator = 1 << d[1]; - } - else - { - numerator = 4; - denominator = 4; - } -} - -MidiMessage MidiMessage::timeSignatureMetaEvent (const int numerator, const int denominator) -{ - int n = 1; - int powerOfTwo = 0; - - while (n < denominator) - { - n <<= 1; - ++powerOfTwo; - } - - const uint8 d[] = { 0xff, 0x58, 0x04, (uint8) numerator, (uint8) powerOfTwo, 1, 96 }; - return MidiMessage (d, 7, 0.0); -} - -MidiMessage MidiMessage::midiChannelMetaEvent (const int channel) noexcept -{ - const uint8 d[] = { 0xff, 0x20, 0x01, (uint8) jlimit (0, 0xff, channel - 1) }; - return MidiMessage (d, 4, 0.0); -} - -bool MidiMessage::isKeySignatureMetaEvent() const noexcept -{ - return getMetaEventType() == 0x59; -} - -int MidiMessage::getKeySignatureNumberOfSharpsOrFlats() const noexcept -{ - return (int) getMetaEventData()[0]; -} - -bool MidiMessage::isKeySignatureMajorKey() const noexcept -{ - return getMetaEventData()[1] == 0; -} - -MidiMessage MidiMessage::keySignatureMetaEvent (int numberOfSharpsOrFlats, bool isMinorKey) -{ - jassert (numberOfSharpsOrFlats >= -7 && numberOfSharpsOrFlats <= 7); - - const uint8 d[] = { 0xff, 0x59, 0x02, (uint8) numberOfSharpsOrFlats, isMinorKey ? (uint8) 1 : (uint8) 0 }; - return MidiMessage (d, 5, 0.0); -} - -MidiMessage MidiMessage::endOfTrack() noexcept -{ - return MidiMessage (0xff, 0x2f, 0, 0.0); -} - -//============================================================================== -bool MidiMessage::isSongPositionPointer() const noexcept { return *getRawData() == 0xf2; } -int MidiMessage::getSongPositionPointerMidiBeat() const noexcept { const uint8* data = getRawData(); return data[1] | (data[2] << 7); } - -MidiMessage MidiMessage::songPositionPointer (const int positionInMidiBeats) noexcept -{ - return MidiMessage (0xf2, - positionInMidiBeats & 127, - (positionInMidiBeats >> 7) & 127); -} - -bool MidiMessage::isMidiStart() const noexcept { return *getRawData() == 0xfa; } -MidiMessage MidiMessage::midiStart() noexcept { return MidiMessage (0xfa); } - -bool MidiMessage::isMidiContinue() const noexcept { return *getRawData() == 0xfb; } -MidiMessage MidiMessage::midiContinue() noexcept { return MidiMessage (0xfb); } - -bool MidiMessage::isMidiStop() const noexcept { return *getRawData() == 0xfc; } -MidiMessage MidiMessage::midiStop() noexcept { return MidiMessage (0xfc); } - -bool MidiMessage::isMidiClock() const noexcept { return *getRawData() == 0xf8; } -MidiMessage MidiMessage::midiClock() noexcept { return MidiMessage (0xf8); } - -bool MidiMessage::isQuarterFrame() const noexcept { return *getRawData() == 0xf1; } -int MidiMessage::getQuarterFrameSequenceNumber() const noexcept { return ((int) getRawData()[1]) >> 4; } -int MidiMessage::getQuarterFrameValue() const noexcept { return ((int) getRawData()[1]) & 0x0f; } - -MidiMessage MidiMessage::quarterFrame (const int sequenceNumber, const int value) noexcept -{ - return MidiMessage (0xf1, (sequenceNumber << 4) | value); -} - -bool MidiMessage::isFullFrame() const noexcept -{ - const uint8* const data = getRawData(); - - return data[0] == 0xf0 - && data[1] == 0x7f - && size >= 10 - && data[3] == 0x01 - && data[4] == 0x01; -} - -void MidiMessage::getFullFrameParameters (int& hours, int& minutes, int& seconds, int& frames, - MidiMessage::SmpteTimecodeType& timecodeType) const noexcept -{ - jassert (isFullFrame()); - - const uint8* const data = getRawData(); - timecodeType = (SmpteTimecodeType) (data[5] >> 5); - hours = data[5] & 0x1f; - minutes = data[6]; - seconds = data[7]; - frames = data[8]; -} - -MidiMessage MidiMessage::fullFrame (const int hours, const int minutes, - const int seconds, const int frames, - MidiMessage::SmpteTimecodeType timecodeType) -{ - const uint8 d[] = { 0xf0, 0x7f, 0x7f, 0x01, 0x01, - (uint8) ((hours & 0x01f) | (timecodeType << 5)), - (uint8) minutes, - (uint8) seconds, - (uint8) frames, - 0xf7 }; - - return MidiMessage (d, 10, 0.0); -} - -bool MidiMessage::isMidiMachineControlMessage() const noexcept -{ - const uint8* const data = getRawData(); - return data[0] == 0xf0 - && data[1] == 0x7f - && data[3] == 0x06 - && size > 5; -} - -MidiMessage::MidiMachineControlCommand MidiMessage::getMidiMachineControlCommand() const noexcept -{ - jassert (isMidiMachineControlMessage()); - - return (MidiMachineControlCommand) getRawData()[4]; -} - -MidiMessage MidiMessage::midiMachineControlCommand (MidiMessage::MidiMachineControlCommand command) -{ - const uint8 d[] = { 0xf0, 0x7f, 0, 6, (uint8) command, 0xf7 }; - - return MidiMessage (d, 6, 0.0); -} - -//============================================================================== -bool MidiMessage::isMidiMachineControlGoto (int& hours, int& minutes, int& seconds, int& frames) const noexcept -{ - const uint8* const data = getRawData(); - if (size >= 12 - && data[0] == 0xf0 - && data[1] == 0x7f - && data[3] == 0x06 - && data[4] == 0x44 - && data[5] == 0x06 - && data[6] == 0x01) - { - hours = data[7] % 24; // (that some machines send out hours > 24) - minutes = data[8]; - seconds = data[9]; - frames = data[10]; - - return true; - } - - return false; -} - -MidiMessage MidiMessage::midiMachineControlGoto (int hours, int minutes, int seconds, int frames) -{ - const uint8 d[] = { 0xf0, 0x7f, 0, 6, 0x44, 6, 1, - (uint8) hours, - (uint8) minutes, - (uint8) seconds, - (uint8) frames, - 0xf7 }; - - return MidiMessage (d, 12, 0.0); -} - -//============================================================================== -String MidiMessage::getMidiNoteName (int note, bool useSharps, bool includeOctaveNumber, int octaveNumForMiddleC) -{ - static const char* const sharpNoteNames[] = { "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B" }; - static const char* const flatNoteNames[] = { "C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B" }; - - if (isPositiveAndBelow (note, (int) 128)) - { - String s (useSharps ? sharpNoteNames [note % 12] - : flatNoteNames [note % 12]); - - if (includeOctaveNumber) - s << (note / 12 + (octaveNumForMiddleC - 5)); - - return s; - } - - return String::empty; -} - -double MidiMessage::getMidiNoteInHertz (int noteNumber, const double frequencyOfA) noexcept -{ - return frequencyOfA * pow (2.0, (noteNumber - 69) / 12.0); -} - -bool MidiMessage::isMidiNoteBlack (int noteNumber) noexcept -{ - return ((1 << (noteNumber % 12)) & 0x054a) != 0; -} - -const char* MidiMessage::getGMInstrumentName (const int n) -{ - static const char* names[] = - { - NEEDS_TRANS("Acoustic Grand Piano"), NEEDS_TRANS("Bright Acoustic Piano"), NEEDS_TRANS("Electric Grand Piano"), NEEDS_TRANS("Honky-tonk Piano"), - NEEDS_TRANS("Electric Piano 1"), NEEDS_TRANS("Electric Piano 2"), NEEDS_TRANS("Harpsichord"), NEEDS_TRANS("Clavinet"), - NEEDS_TRANS("Celesta"), NEEDS_TRANS("Glockenspiel"), NEEDS_TRANS("Music Box"), NEEDS_TRANS("Vibraphone"), - NEEDS_TRANS("Marimba"), NEEDS_TRANS("Xylophone"), NEEDS_TRANS("Tubular Bells"), NEEDS_TRANS("Dulcimer"), - NEEDS_TRANS("Drawbar Organ"), NEEDS_TRANS("Percussive Organ"), NEEDS_TRANS("Rock Organ"), NEEDS_TRANS("Church Organ"), - NEEDS_TRANS("Reed Organ"), NEEDS_TRANS("Accordion"), NEEDS_TRANS("Harmonica"), NEEDS_TRANS("Tango Accordion"), - NEEDS_TRANS("Acoustic Guitar (nylon)"), NEEDS_TRANS("Acoustic Guitar (steel)"), NEEDS_TRANS("Electric Guitar (jazz)"), NEEDS_TRANS("Electric Guitar (clean)"), - NEEDS_TRANS("Electric Guitar (mute)"), NEEDS_TRANS("Overdriven Guitar"), NEEDS_TRANS("Distortion Guitar"), NEEDS_TRANS("Guitar Harmonics"), - NEEDS_TRANS("Acoustic Bass"), NEEDS_TRANS("Electric Bass (finger)"), NEEDS_TRANS("Electric Bass (pick)"), NEEDS_TRANS("Fretless Bass"), - NEEDS_TRANS("Slap Bass 1"), NEEDS_TRANS("Slap Bass 2"), NEEDS_TRANS("Synth Bass 1"), NEEDS_TRANS("Synth Bass 2"), - NEEDS_TRANS("Violin"), NEEDS_TRANS("Viola"), NEEDS_TRANS("Cello"), NEEDS_TRANS("Contrabass"), - NEEDS_TRANS("Tremolo Strings"), NEEDS_TRANS("Pizzicato Strings"), NEEDS_TRANS("Orchestral Harp"), NEEDS_TRANS("Timpani"), - NEEDS_TRANS("String Ensemble 1"), NEEDS_TRANS("String Ensemble 2"), NEEDS_TRANS("SynthStrings 1"), NEEDS_TRANS("SynthStrings 2"), - NEEDS_TRANS("Choir Aahs"), NEEDS_TRANS("Voice Oohs"), NEEDS_TRANS("Synth Voice"), NEEDS_TRANS("Orchestra Hit"), - NEEDS_TRANS("Trumpet"), NEEDS_TRANS("Trombone"), NEEDS_TRANS("Tuba"), NEEDS_TRANS("Muted Trumpet"), - NEEDS_TRANS("French Horn"), NEEDS_TRANS("Brass Section"), NEEDS_TRANS("SynthBrass 1"), NEEDS_TRANS("SynthBrass 2"), - NEEDS_TRANS("Soprano Sax"), NEEDS_TRANS("Alto Sax"), NEEDS_TRANS("Tenor Sax"), NEEDS_TRANS("Baritone Sax"), - NEEDS_TRANS("Oboe"), NEEDS_TRANS("English Horn"), NEEDS_TRANS("Bassoon"), NEEDS_TRANS("Clarinet"), - NEEDS_TRANS("Piccolo"), NEEDS_TRANS("Flute"), NEEDS_TRANS("Recorder"), NEEDS_TRANS("Pan Flute"), - NEEDS_TRANS("Blown Bottle"), NEEDS_TRANS("Shakuhachi"), NEEDS_TRANS("Whistle"), NEEDS_TRANS("Ocarina"), - NEEDS_TRANS("Lead 1 (square)"), NEEDS_TRANS("Lead 2 (sawtooth)"), NEEDS_TRANS("Lead 3 (calliope)"), NEEDS_TRANS("Lead 4 (chiff)"), - NEEDS_TRANS("Lead 5 (charang)"), NEEDS_TRANS("Lead 6 (voice)"), NEEDS_TRANS("Lead 7 (fifths)"), NEEDS_TRANS("Lead 8 (bass+lead)"), - NEEDS_TRANS("Pad 1 (new age)"), NEEDS_TRANS("Pad 2 (warm)"), NEEDS_TRANS("Pad 3 (polysynth)"), NEEDS_TRANS("Pad 4 (choir)"), - NEEDS_TRANS("Pad 5 (bowed)"), NEEDS_TRANS("Pad 6 (metallic)"), NEEDS_TRANS("Pad 7 (halo)"), NEEDS_TRANS("Pad 8 (sweep)"), - NEEDS_TRANS("FX 1 (rain)"), NEEDS_TRANS("FX 2 (soundtrack)"), NEEDS_TRANS("FX 3 (crystal)"), NEEDS_TRANS("FX 4 (atmosphere)"), - NEEDS_TRANS("FX 5 (brightness)"), NEEDS_TRANS("FX 6 (goblins)"), NEEDS_TRANS("FX 7 (echoes)"), NEEDS_TRANS("FX 8 (sci-fi)"), - NEEDS_TRANS("Sitar"), NEEDS_TRANS("Banjo"), NEEDS_TRANS("Shamisen"), NEEDS_TRANS("Koto"), - NEEDS_TRANS("Kalimba"), NEEDS_TRANS("Bag pipe"), NEEDS_TRANS("Fiddle"), NEEDS_TRANS("Shanai"), - NEEDS_TRANS("Tinkle Bell"), NEEDS_TRANS("Agogo"), NEEDS_TRANS("Steel Drums"), NEEDS_TRANS("Woodblock"), - NEEDS_TRANS("Taiko Drum"), NEEDS_TRANS("Melodic Tom"), NEEDS_TRANS("Synth Drum"), NEEDS_TRANS("Reverse Cymbal"), - NEEDS_TRANS("Guitar Fret Noise"), NEEDS_TRANS("Breath Noise"), NEEDS_TRANS("Seashore"), NEEDS_TRANS("Bird Tweet"), - NEEDS_TRANS("Telephone Ring"), NEEDS_TRANS("Helicopter"), NEEDS_TRANS("Applause"), NEEDS_TRANS("Gunshot") - }; - - return isPositiveAndBelow (n, numElementsInArray (names)) ? names[n] : nullptr; -} - -const char* MidiMessage::getGMInstrumentBankName (const int n) -{ - static const char* names[] = - { - NEEDS_TRANS("Piano"), NEEDS_TRANS("Chromatic Percussion"), NEEDS_TRANS("Organ"), NEEDS_TRANS("Guitar"), - NEEDS_TRANS("Bass"), NEEDS_TRANS("Strings"), NEEDS_TRANS("Ensemble"), NEEDS_TRANS("Brass"), - NEEDS_TRANS("Reed"), NEEDS_TRANS("Pipe"), NEEDS_TRANS("Synth Lead"), NEEDS_TRANS("Synth Pad"), - NEEDS_TRANS("Synth Effects"), NEEDS_TRANS("Ethnic"), NEEDS_TRANS("Percussive"), NEEDS_TRANS("Sound Effects") - }; - - return isPositiveAndBelow (n, numElementsInArray (names)) ? names[n] : nullptr; -} - -const char* MidiMessage::getRhythmInstrumentName (const int n) -{ - static const char* names[] = - { - NEEDS_TRANS("Acoustic Bass Drum"), NEEDS_TRANS("Bass Drum 1"), NEEDS_TRANS("Side Stick"), NEEDS_TRANS("Acoustic Snare"), - NEEDS_TRANS("Hand Clap"), NEEDS_TRANS("Electric Snare"), NEEDS_TRANS("Low Floor Tom"), NEEDS_TRANS("Closed Hi-Hat"), - NEEDS_TRANS("High Floor Tom"), NEEDS_TRANS("Pedal Hi-Hat"), NEEDS_TRANS("Low Tom"), NEEDS_TRANS("Open Hi-Hat"), - NEEDS_TRANS("Low-Mid Tom"), NEEDS_TRANS("Hi-Mid Tom"), NEEDS_TRANS("Crash Cymbal 1"), NEEDS_TRANS("High Tom"), - NEEDS_TRANS("Ride Cymbal 1"), NEEDS_TRANS("Chinese Cymbal"), NEEDS_TRANS("Ride Bell"), NEEDS_TRANS("Tambourine"), - NEEDS_TRANS("Splash Cymbal"), NEEDS_TRANS("Cowbell"), NEEDS_TRANS("Crash Cymbal 2"), NEEDS_TRANS("Vibraslap"), - NEEDS_TRANS("Ride Cymbal 2"), NEEDS_TRANS("Hi Bongo"), NEEDS_TRANS("Low Bongo"), NEEDS_TRANS("Mute Hi Conga"), - NEEDS_TRANS("Open Hi Conga"), NEEDS_TRANS("Low Conga"), NEEDS_TRANS("High Timbale"), NEEDS_TRANS("Low Timbale"), - NEEDS_TRANS("High Agogo"), NEEDS_TRANS("Low Agogo"), NEEDS_TRANS("Cabasa"), NEEDS_TRANS("Maracas"), - NEEDS_TRANS("Short Whistle"), NEEDS_TRANS("Long Whistle"), NEEDS_TRANS("Short Guiro"), NEEDS_TRANS("Long Guiro"), - NEEDS_TRANS("Claves"), NEEDS_TRANS("Hi Wood Block"), NEEDS_TRANS("Low Wood Block"), NEEDS_TRANS("Mute Cuica"), - NEEDS_TRANS("Open Cuica"), NEEDS_TRANS("Mute Triangle"), NEEDS_TRANS("Open Triangle") - }; - - return (n >= 35 && n <= 81) ? names [n - 35] : nullptr; -} - -const char* MidiMessage::getControllerName (const int n) -{ - static const char* names[] = - { - NEEDS_TRANS("Bank Select"), NEEDS_TRANS("Modulation Wheel (coarse)"), NEEDS_TRANS("Breath controller (coarse)"), - nullptr, - NEEDS_TRANS("Foot Pedal (coarse)"), NEEDS_TRANS("Portamento Time (coarse)"), NEEDS_TRANS("Data Entry (coarse)"), - NEEDS_TRANS("Volume (coarse)"), NEEDS_TRANS("Balance (coarse)"), - nullptr, - NEEDS_TRANS("Pan position (coarse)"), NEEDS_TRANS("Expression (coarse)"), NEEDS_TRANS("Effect Control 1 (coarse)"), - NEEDS_TRANS("Effect Control 2 (coarse)"), - nullptr, nullptr, - NEEDS_TRANS("General Purpose Slider 1"), NEEDS_TRANS("General Purpose Slider 2"), - NEEDS_TRANS("General Purpose Slider 3"), NEEDS_TRANS("General Purpose Slider 4"), - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - NEEDS_TRANS("Bank Select (fine)"), NEEDS_TRANS("Modulation Wheel (fine)"), NEEDS_TRANS("Breath controller (fine)"), - nullptr, - NEEDS_TRANS("Foot Pedal (fine)"), NEEDS_TRANS("Portamento Time (fine)"), NEEDS_TRANS("Data Entry (fine)"), NEEDS_TRANS("Volume (fine)"), - NEEDS_TRANS("Balance (fine)"), nullptr, NEEDS_TRANS("Pan position (fine)"), NEEDS_TRANS("Expression (fine)"), - NEEDS_TRANS("Effect Control 1 (fine)"), NEEDS_TRANS("Effect Control 2 (fine)"), - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - NEEDS_TRANS("Hold Pedal (on/off)"), NEEDS_TRANS("Portamento (on/off)"), NEEDS_TRANS("Sustenuto Pedal (on/off)"), NEEDS_TRANS("Soft Pedal (on/off)"), - NEEDS_TRANS("Legato Pedal (on/off)"), NEEDS_TRANS("Hold 2 Pedal (on/off)"), NEEDS_TRANS("Sound Variation"), NEEDS_TRANS("Sound Timbre"), - NEEDS_TRANS("Sound Release Time"), NEEDS_TRANS("Sound Attack Time"), NEEDS_TRANS("Sound Brightness"), NEEDS_TRANS("Sound Control 6"), - NEEDS_TRANS("Sound Control 7"), NEEDS_TRANS("Sound Control 8"), NEEDS_TRANS("Sound Control 9"), NEEDS_TRANS("Sound Control 10"), - NEEDS_TRANS("General Purpose Button 1 (on/off)"), NEEDS_TRANS("General Purpose Button 2 (on/off)"), - NEEDS_TRANS("General Purpose Button 3 (on/off)"), NEEDS_TRANS("General Purpose Button 4 (on/off)"), - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - NEEDS_TRANS("Reverb Level"), NEEDS_TRANS("Tremolo Level"), NEEDS_TRANS("Chorus Level"), NEEDS_TRANS("Celeste Level"), - NEEDS_TRANS("Phaser Level"), NEEDS_TRANS("Data Button increment"), NEEDS_TRANS("Data Button decrement"), NEEDS_TRANS("Non-registered Parameter (fine)"), - NEEDS_TRANS("Non-registered Parameter (coarse)"), NEEDS_TRANS("Registered Parameter (fine)"), NEEDS_TRANS("Registered Parameter (coarse)"), - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - NEEDS_TRANS("All Sound Off"), NEEDS_TRANS("All Controllers Off"), NEEDS_TRANS("Local Keyboard (on/off)"), NEEDS_TRANS("All Notes Off"), - NEEDS_TRANS("Omni Mode Off"), NEEDS_TRANS("Omni Mode On"), NEEDS_TRANS("Mono Operation"), NEEDS_TRANS("Poly Operation") - }; - - return isPositiveAndBelow (n, numElementsInArray (names)) ? names[n] : nullptr; -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h deleted file mode 100755 index 9002aa0..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessage.h +++ /dev/null @@ -1,903 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MIDIMESSAGE_H_INCLUDED -#define JUCE_MIDIMESSAGE_H_INCLUDED - - -//============================================================================== -/** - Encapsulates a MIDI message. - - @see MidiMessageSequence, MidiOutput, MidiInput -*/ -class JUCE_API MidiMessage -{ -public: - //============================================================================== - /** Creates a 3-byte short midi message. - - @param byte1 message byte 1 - @param byte2 message byte 2 - @param byte3 message byte 3 - @param timeStamp the time to give the midi message - this value doesn't - use any particular units, so will be application-specific - */ - MidiMessage (int byte1, int byte2, int byte3, double timeStamp = 0) noexcept; - - /** Creates a 2-byte short midi message. - - @param byte1 message byte 1 - @param byte2 message byte 2 - @param timeStamp the time to give the midi message - this value doesn't - use any particular units, so will be application-specific - */ - MidiMessage (int byte1, int byte2, double timeStamp = 0) noexcept; - - /** Creates a 1-byte short midi message. - - @param byte1 message byte 1 - @param timeStamp the time to give the midi message - this value doesn't - use any particular units, so will be application-specific - */ - MidiMessage (int byte1, double timeStamp = 0) noexcept; - - /** Creates a midi message from a block of data. */ - MidiMessage (const void* data, int numBytes, double timeStamp = 0); - - /** Reads the next midi message from some data. - - This will read as many bytes from a data stream as it needs to make a - complete message, and will return the number of bytes it used. This lets - you read a sequence of midi messages from a file or stream. - - @param data the data to read from - @param maxBytesToUse the maximum number of bytes it's allowed to read - @param numBytesUsed returns the number of bytes that were actually needed - @param lastStatusByte in a sequence of midi messages, the initial byte - can be dropped from a message if it's the same as the - first byte of the previous message, so this lets you - supply the byte to use if the first byte of the message - has in fact been dropped. - @param timeStamp the time to give the midi message - this value doesn't - use any particular units, so will be application-specific - @param sysexHasEmbeddedLength when reading sysexes, this flag indicates whether - to expect the data to begin with a variable-length field - indicating its size - */ - MidiMessage (const void* data, int maxBytesToUse, - int& numBytesUsed, uint8 lastStatusByte, - double timeStamp = 0, - bool sysexHasEmbeddedLength = true); - - /** Creates an active-sense message. - Since the MidiMessage has to contain a valid message, this default constructor - just initialises it with an empty sysex message. - */ - MidiMessage() noexcept; - - /** Creates a copy of another midi message. */ - MidiMessage (const MidiMessage&); - - /** Creates a copy of another midi message, with a different timestamp. */ - MidiMessage (const MidiMessage&, double newTimeStamp); - - /** Destructor. */ - ~MidiMessage(); - - /** Copies this message from another one. */ - MidiMessage& operator= (const MidiMessage& other); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - MidiMessage (MidiMessage&&) noexcept; - MidiMessage& operator= (MidiMessage&&) noexcept; - #endif - - //============================================================================== - /** Returns a pointer to the raw midi data. - @see getRawDataSize - */ - const uint8* getRawData() const noexcept { return allocatedData != nullptr ? allocatedData.getData() : preallocatedData.asBytes; } - - /** Returns the number of bytes of data in the message. - @see getRawData - */ - int getRawDataSize() const noexcept { return size; } - - //============================================================================== - /** Returns the timestamp associated with this message. - - The exact meaning of this time and its units will vary, as messages are used in - a variety of different contexts. - - If you're getting the message from a midi file, this could be a time in seconds, or - a number of ticks - see MidiFile::convertTimestampTicksToSeconds(). - - If the message is being used in a MidiBuffer, it might indicate the number of - audio samples from the start of the buffer. - - If the message was created by a MidiInput, see MidiInputCallback::handleIncomingMidiMessage() - for details of the way that it initialises this value. - - @see setTimeStamp, addToTimeStamp - */ - double getTimeStamp() const noexcept { return timeStamp; } - - /** Changes the message's associated timestamp. - The units for the timestamp will be application-specific - see the notes for getTimeStamp(). - @see addToTimeStamp, getTimeStamp - */ - void setTimeStamp (double newTimestamp) noexcept { timeStamp = newTimestamp; } - - /** Adds a value to the message's timestamp. - The units for the timestamp will be application-specific. - */ - void addToTimeStamp (double delta) noexcept { timeStamp += delta; } - - //============================================================================== - /** Returns the midi channel associated with the message. - - @returns a value 1 to 16 if the message has a channel, or 0 if it hasn't (e.g. - if it's a sysex) - @see isForChannel, setChannel - */ - int getChannel() const noexcept; - - /** Returns true if the message applies to the given midi channel. - - @param channelNumber the channel number to look for, in the range 1 to 16 - @see getChannel, setChannel - */ - bool isForChannel (int channelNumber) const noexcept; - - /** Changes the message's midi channel. - This won't do anything for non-channel messages like sysexes. - @param newChannelNumber the channel number to change it to, in the range 1 to 16 - */ - void setChannel (int newChannelNumber) noexcept; - - //============================================================================== - /** Returns true if this is a system-exclusive message. - */ - bool isSysEx() const noexcept; - - /** Returns a pointer to the sysex data inside the message. - If this event isn't a sysex event, it'll return 0. - @see getSysExDataSize - */ - const uint8* getSysExData() const noexcept; - - /** Returns the size of the sysex data. - This value excludes the 0xf0 header byte and the 0xf7 at the end. - @see getSysExData - */ - int getSysExDataSize() const noexcept; - - //============================================================================== - /** Returns true if this message is a 'key-down' event. - - @param returnTrueForVelocity0 if true, then if this event is a note-on with - velocity 0, it will still be considered to be a note-on and the - method will return true. If returnTrueForVelocity0 is false, then - if this is a note-on event with velocity 0, it'll be regarded as - a note-off, and the method will return false - - @see isNoteOff, getNoteNumber, getVelocity, noteOn - */ - bool isNoteOn (bool returnTrueForVelocity0 = false) const noexcept; - - /** Creates a key-down message (using a floating-point velocity). - - @param channel the midi channel, in the range 1 to 16 - @param noteNumber the key number, 0 to 127 - @param velocity in the range 0 to 1.0 - @see isNoteOn - */ - static MidiMessage noteOn (int channel, int noteNumber, float velocity) noexcept; - - /** Creates a key-down message (using an integer velocity). - - @param channel the midi channel, in the range 1 to 16 - @param noteNumber the key number, 0 to 127 - @param velocity in the range 0 to 127 - @see isNoteOn - */ - static MidiMessage noteOn (int channel, int noteNumber, uint8 velocity) noexcept; - - /** Returns true if this message is a 'key-up' event. - - If returnTrueForNoteOnVelocity0 is true, then his will also return true - for a note-on event with a velocity of 0. - - @see isNoteOn, getNoteNumber, getVelocity, noteOff - */ - bool isNoteOff (bool returnTrueForNoteOnVelocity0 = true) const noexcept; - - /** Creates a key-up message. - - @param channel the midi channel, in the range 1 to 16 - @param noteNumber the key number, 0 to 127 - @param velocity in the range 0 to 127 - @see isNoteOff - */ - static MidiMessage noteOff (int channel, int noteNumber, uint8 velocity = 0) noexcept; - - /** Returns true if this message is a 'key-down' or 'key-up' event. - - @see isNoteOn, isNoteOff - */ - bool isNoteOnOrOff() const noexcept; - - /** Returns the midi note number for note-on and note-off messages. - If the message isn't a note-on or off, the value returned is undefined. - @see isNoteOff, getMidiNoteName, getMidiNoteInHertz, setNoteNumber - */ - int getNoteNumber() const noexcept; - - /** Changes the midi note number of a note-on or note-off message. - If the message isn't a note on or off, this will do nothing. - */ - void setNoteNumber (int newNoteNumber) noexcept; - - //============================================================================== - /** Returns the velocity of a note-on or note-off message. - - The value returned will be in the range 0 to 127. - If the message isn't a note-on or off event, it will return 0. - - @see getFloatVelocity - */ - uint8 getVelocity() const noexcept; - - /** Returns the velocity of a note-on or note-off message. - - The value returned will be in the range 0 to 1.0 - If the message isn't a note-on or off event, it will return 0. - - @see getVelocity, setVelocity - */ - float getFloatVelocity() const noexcept; - - /** Changes the velocity of a note-on or note-off message. - - If the message isn't a note on or off, this will do nothing. - - @param newVelocity the new velocity, in the range 0 to 1.0 - @see getFloatVelocity, multiplyVelocity - */ - void setVelocity (float newVelocity) noexcept; - - /** Multiplies the velocity of a note-on or note-off message by a given amount. - - If the message isn't a note on or off, this will do nothing. - - @param scaleFactor the value by which to multiply the velocity - @see setVelocity - */ - void multiplyVelocity (float scaleFactor) noexcept; - - //============================================================================== - /** Returns true if this message is a 'sustain pedal down' controller message. */ - bool isSustainPedalOn() const noexcept; - /** Returns true if this message is a 'sustain pedal up' controller message. */ - bool isSustainPedalOff() const noexcept; - - /** Returns true if this message is a 'sostenuto pedal down' controller message. */ - bool isSostenutoPedalOn() const noexcept; - /** Returns true if this message is a 'sostenuto pedal up' controller message. */ - bool isSostenutoPedalOff() const noexcept; - - /** Returns true if this message is a 'soft pedal down' controller message. */ - bool isSoftPedalOn() const noexcept; - /** Returns true if this message is a 'soft pedal up' controller message. */ - bool isSoftPedalOff() const noexcept; - - //============================================================================== - /** Returns true if the message is a program (patch) change message. - @see getProgramChangeNumber, getGMInstrumentName - */ - bool isProgramChange() const noexcept; - - /** Returns the new program number of a program change message. - If the message isn't a program change, the value returned is undefined. - @see isProgramChange, getGMInstrumentName - */ - int getProgramChangeNumber() const noexcept; - - /** Creates a program-change message. - - @param channel the midi channel, in the range 1 to 16 - @param programNumber the midi program number, 0 to 127 - @see isProgramChange, getGMInstrumentName - */ - static MidiMessage programChange (int channel, int programNumber) noexcept; - - //============================================================================== - /** Returns true if the message is a pitch-wheel move. - @see getPitchWheelValue, pitchWheel - */ - bool isPitchWheel() const noexcept; - - /** Returns the pitch wheel position from a pitch-wheel move message. - - The value returned is a 14-bit number from 0 to 0x3fff, indicating the wheel position. - If called for messages which aren't pitch wheel events, the number returned will be - nonsense. - - @see isPitchWheel - */ - int getPitchWheelValue() const noexcept; - - /** Creates a pitch-wheel move message. - - @param channel the midi channel, in the range 1 to 16 - @param position the wheel position, in the range 0 to 16383 - @see isPitchWheel - */ - static MidiMessage pitchWheel (int channel, int position) noexcept; - - //============================================================================== - /** Returns true if the message is an aftertouch event. - - For aftertouch events, use the getNoteNumber() method to find out the key - that it applies to, and getAftertouchValue() to find out the amount. Use - getChannel() to find out the channel. - - @see getAftertouchValue, getNoteNumber - */ - bool isAftertouch() const noexcept; - - /** Returns the amount of aftertouch from an aftertouch messages. - - The value returned is in the range 0 to 127, and will be nonsense for messages - other than aftertouch messages. - - @see isAftertouch - */ - int getAfterTouchValue() const noexcept; - - /** Creates an aftertouch message. - - @param channel the midi channel, in the range 1 to 16 - @param noteNumber the key number, 0 to 127 - @param aftertouchAmount the amount of aftertouch, 0 to 127 - @see isAftertouch - */ - static MidiMessage aftertouchChange (int channel, - int noteNumber, - int aftertouchAmount) noexcept; - - /** Returns true if the message is a channel-pressure change event. - - This is like aftertouch, but common to the whole channel rather than a specific - note. Use getChannelPressureValue() to find out the pressure, and getChannel() - to find out the channel. - - @see channelPressureChange - */ - bool isChannelPressure() const noexcept; - - /** Returns the pressure from a channel pressure change message. - - @returns the pressure, in the range 0 to 127 - @see isChannelPressure, channelPressureChange - */ - int getChannelPressureValue() const noexcept; - - /** Creates a channel-pressure change event. - - @param channel the midi channel: 1 to 16 - @param pressure the pressure, 0 to 127 - @see isChannelPressure - */ - static MidiMessage channelPressureChange (int channel, int pressure) noexcept; - - //============================================================================== - /** Returns true if this is a midi controller message. - - @see getControllerNumber, getControllerValue, controllerEvent - */ - bool isController() const noexcept; - - /** Returns the controller number of a controller message. - - The name of the controller can be looked up using the getControllerName() method. - Note that the value returned is invalid for messages that aren't controller changes. - - @see isController, getControllerName, getControllerValue - */ - int getControllerNumber() const noexcept; - - /** Returns the controller value from a controller message. - - A value 0 to 127 is returned to indicate the new controller position. - Note that the value returned is invalid for messages that aren't controller changes. - - @see isController, getControllerNumber - */ - int getControllerValue() const noexcept; - - /** Returns true if this message is a controller message and if it has the specified - controller type. - */ - bool isControllerOfType (int controllerType) const noexcept; - - /** Creates a controller message. - - @param channel the midi channel, in the range 1 to 16 - @param controllerType the type of controller - @param value the controller value - @see isController - */ - static MidiMessage controllerEvent (int channel, - int controllerType, - int value) noexcept; - - /** Checks whether this message is an all-notes-off message. - @see allNotesOff - */ - bool isAllNotesOff() const noexcept; - - /** Checks whether this message is an all-sound-off message. - @see allSoundOff - */ - bool isAllSoundOff() const noexcept; - - /** Creates an all-notes-off message. - - @param channel the midi channel, in the range 1 to 16 - @see isAllNotesOff - */ - static MidiMessage allNotesOff (int channel) noexcept; - - /** Creates an all-sound-off message. - - @param channel the midi channel, in the range 1 to 16 - @see isAllSoundOff - */ - static MidiMessage allSoundOff (int channel) noexcept; - - /** Creates an all-controllers-off message. - - @param channel the midi channel, in the range 1 to 16 - */ - static MidiMessage allControllersOff (int channel) noexcept; - - //============================================================================== - /** Returns true if this event is a meta-event. - - Meta-events are things like tempo changes, track names, etc. - - @see getMetaEventType, isTrackMetaEvent, isEndOfTrackMetaEvent, - isTextMetaEvent, isTrackNameEvent, isTempoMetaEvent, isTimeSignatureMetaEvent, - isKeySignatureMetaEvent, isMidiChannelMetaEvent - */ - bool isMetaEvent() const noexcept; - - /** Returns a meta-event's type number. - - If the message isn't a meta-event, this will return -1. - - @see isMetaEvent, isTrackMetaEvent, isEndOfTrackMetaEvent, - isTextMetaEvent, isTrackNameEvent, isTempoMetaEvent, isTimeSignatureMetaEvent, - isKeySignatureMetaEvent, isMidiChannelMetaEvent - */ - int getMetaEventType() const noexcept; - - /** Returns a pointer to the data in a meta-event. - @see isMetaEvent, getMetaEventLength - */ - const uint8* getMetaEventData() const noexcept; - - /** Returns the length of the data for a meta-event. - @see isMetaEvent, getMetaEventData - */ - int getMetaEventLength() const noexcept; - - //============================================================================== - /** Returns true if this is a 'track' meta-event. */ - bool isTrackMetaEvent() const noexcept; - - /** Returns true if this is an 'end-of-track' meta-event. */ - bool isEndOfTrackMetaEvent() const noexcept; - - /** Creates an end-of-track meta-event. - @see isEndOfTrackMetaEvent - */ - static MidiMessage endOfTrack() noexcept; - - /** Returns true if this is an 'track name' meta-event. - You can use the getTextFromTextMetaEvent() method to get the track's name. - */ - bool isTrackNameEvent() const noexcept; - - /** Returns true if this is a 'text' meta-event. - @see getTextFromTextMetaEvent - */ - bool isTextMetaEvent() const noexcept; - - /** Returns the text from a text meta-event. - @see isTextMetaEvent - */ - String getTextFromTextMetaEvent() const; - - /** Creates a text meta-event. */ - static MidiMessage textMetaEvent (int type, StringRef text); - - //============================================================================== - /** Returns true if this is a 'tempo' meta-event. - @see getTempoMetaEventTickLength, getTempoSecondsPerQuarterNote - */ - bool isTempoMetaEvent() const noexcept; - - /** Returns the tick length from a tempo meta-event. - - @param timeFormat the 16-bit time format value from the midi file's header. - @returns the tick length (in seconds). - @see isTempoMetaEvent - */ - double getTempoMetaEventTickLength (short timeFormat) const noexcept; - - /** Calculates the seconds-per-quarter-note from a tempo meta-event. - @see isTempoMetaEvent, getTempoMetaEventTickLength - */ - double getTempoSecondsPerQuarterNote() const noexcept; - - /** Creates a tempo meta-event. - @see isTempoMetaEvent - */ - static MidiMessage tempoMetaEvent (int microsecondsPerQuarterNote) noexcept; - - //============================================================================== - /** Returns true if this is a 'time-signature' meta-event. - @see getTimeSignatureInfo - */ - bool isTimeSignatureMetaEvent() const noexcept; - - /** Returns the time-signature values from a time-signature meta-event. - @see isTimeSignatureMetaEvent - */ - void getTimeSignatureInfo (int& numerator, int& denominator) const noexcept; - - /** Creates a time-signature meta-event. - @see isTimeSignatureMetaEvent - */ - static MidiMessage timeSignatureMetaEvent (int numerator, int denominator); - - //============================================================================== - /** Returns true if this is a 'key-signature' meta-event. - @see getKeySignatureNumberOfSharpsOrFlats, isKeySignatureMajorKey - */ - bool isKeySignatureMetaEvent() const noexcept; - - /** Returns the key from a key-signature meta-event. - This method must only be called if isKeySignatureMetaEvent() is true. - A positive number here indicates the number of sharps in the key signature, - and a negative number indicates a number of flats. So e.g. 3 = F# + C# + G#, - -2 = Bb + Eb - @see isKeySignatureMetaEvent, isKeySignatureMajorKey - */ - int getKeySignatureNumberOfSharpsOrFlats() const noexcept; - - /** Returns true if this key-signature event is major, or false if it's minor. - This method must only be called if isKeySignatureMetaEvent() is true. - */ - bool isKeySignatureMajorKey() const noexcept; - - /** Creates a key-signature meta-event. - @param numberOfSharpsOrFlats if positive, this indicates the number of sharps - in the key; if negative, the number of flats - @param isMinorKey if true, the key is minor; if false, it is major - @see isKeySignatureMetaEvent - */ - static MidiMessage keySignatureMetaEvent (int numberOfSharpsOrFlats, bool isMinorKey); - - //============================================================================== - /** Returns true if this is a 'channel' meta-event. - - A channel meta-event specifies the midi channel that should be used - for subsequent meta-events. - - @see getMidiChannelMetaEventChannel - */ - bool isMidiChannelMetaEvent() const noexcept; - - /** Returns the channel number from a channel meta-event. - - @returns the channel, in the range 1 to 16. - @see isMidiChannelMetaEvent - */ - int getMidiChannelMetaEventChannel() const noexcept; - - /** Creates a midi channel meta-event. - - @param channel the midi channel, in the range 1 to 16 - @see isMidiChannelMetaEvent - */ - static MidiMessage midiChannelMetaEvent (int channel) noexcept; - - //============================================================================== - /** Returns true if this is an active-sense message. */ - bool isActiveSense() const noexcept; - - //============================================================================== - /** Returns true if this is a midi start event. - @see midiStart - */ - bool isMidiStart() const noexcept; - - /** Creates a midi start event. */ - static MidiMessage midiStart() noexcept; - - /** Returns true if this is a midi continue event. - @see midiContinue - */ - bool isMidiContinue() const noexcept; - - /** Creates a midi continue event. */ - static MidiMessage midiContinue() noexcept; - - /** Returns true if this is a midi stop event. - @see midiStop - */ - bool isMidiStop() const noexcept; - - /** Creates a midi stop event. */ - static MidiMessage midiStop() noexcept; - - /** Returns true if this is a midi clock event. - @see midiClock, songPositionPointer - */ - bool isMidiClock() const noexcept; - - /** Creates a midi clock event. */ - static MidiMessage midiClock() noexcept; - - /** Returns true if this is a song-position-pointer message. - @see getSongPositionPointerMidiBeat, songPositionPointer - */ - bool isSongPositionPointer() const noexcept; - - /** Returns the midi beat-number of a song-position-pointer message. - @see isSongPositionPointer, songPositionPointer - */ - int getSongPositionPointerMidiBeat() const noexcept; - - /** Creates a song-position-pointer message. - - The position is a number of midi beats from the start of the song, where 1 midi - beat is 6 midi clocks, and there are 24 midi clocks in a quarter-note. So there - are 4 midi beats in a quarter-note. - - @see isSongPositionPointer, getSongPositionPointerMidiBeat - */ - static MidiMessage songPositionPointer (int positionInMidiBeats) noexcept; - - //============================================================================== - /** Returns true if this is a quarter-frame midi timecode message. - @see quarterFrame, getQuarterFrameSequenceNumber, getQuarterFrameValue - */ - bool isQuarterFrame() const noexcept; - - /** Returns the sequence number of a quarter-frame midi timecode message. - This will be a value between 0 and 7. - @see isQuarterFrame, getQuarterFrameValue, quarterFrame - */ - int getQuarterFrameSequenceNumber() const noexcept; - - /** Returns the value from a quarter-frame message. - This will be the lower nybble of the message's data-byte, a value between 0 and 15 - */ - int getQuarterFrameValue() const noexcept; - - /** Creates a quarter-frame MTC message. - - @param sequenceNumber a value 0 to 7 for the upper nybble of the message's data byte - @param value a value 0 to 15 for the lower nybble of the message's data byte - */ - static MidiMessage quarterFrame (int sequenceNumber, int value) noexcept; - - /** SMPTE timecode types. - Used by the getFullFrameParameters() and fullFrame() methods. - */ - enum SmpteTimecodeType - { - fps24 = 0, - fps25 = 1, - fps30drop = 2, - fps30 = 3 - }; - - /** Returns true if this is a full-frame midi timecode message. */ - bool isFullFrame() const noexcept; - - /** Extracts the timecode information from a full-frame midi timecode message. - - You should only call this on messages where you've used isFullFrame() to - check that they're the right kind. - */ - void getFullFrameParameters (int& hours, - int& minutes, - int& seconds, - int& frames, - SmpteTimecodeType& timecodeType) const noexcept; - - /** Creates a full-frame MTC message. */ - static MidiMessage fullFrame (int hours, - int minutes, - int seconds, - int frames, - SmpteTimecodeType timecodeType); - - //============================================================================== - /** Types of MMC command. - - @see isMidiMachineControlMessage, getMidiMachineControlCommand, midiMachineControlCommand - */ - enum MidiMachineControlCommand - { - mmc_stop = 1, - mmc_play = 2, - mmc_deferredplay = 3, - mmc_fastforward = 4, - mmc_rewind = 5, - mmc_recordStart = 6, - mmc_recordStop = 7, - mmc_pause = 9 - }; - - /** Checks whether this is an MMC message. - If it is, you can use the getMidiMachineControlCommand() to find out its type. - */ - bool isMidiMachineControlMessage() const noexcept; - - /** For an MMC message, this returns its type. - - Make sure it's actually an MMC message with isMidiMachineControlMessage() before - calling this method. - */ - MidiMachineControlCommand getMidiMachineControlCommand() const noexcept; - - /** Creates an MMC message. */ - static MidiMessage midiMachineControlCommand (MidiMachineControlCommand command); - - /** Checks whether this is an MMC "goto" message. - If it is, the parameters passed-in are set to the time that the message contains. - @see midiMachineControlGoto - */ - bool isMidiMachineControlGoto (int& hours, - int& minutes, - int& seconds, - int& frames) const noexcept; - - /** Creates an MMC "goto" message. - This messages tells the device to go to a specific frame. - @see isMidiMachineControlGoto - */ - static MidiMessage midiMachineControlGoto (int hours, - int minutes, - int seconds, - int frames); - - //============================================================================== - /** Creates a master-volume change message. - @param volume the volume, 0 to 1.0 - */ - static MidiMessage masterVolume (float volume); - - //============================================================================== - /** Creates a system-exclusive message. - The data passed in is wrapped with header and tail bytes of 0xf0 and 0xf7. - */ - static MidiMessage createSysExMessage (const void* sysexData, - int dataSize); - - - //============================================================================== - /** Reads a midi variable-length integer. - - @param data the data to read the number from - @param numBytesUsed on return, this will be set to the number of bytes that were read - */ - static int readVariableLengthVal (const uint8* data, - int& numBytesUsed) noexcept; - - /** Based on the first byte of a short midi message, this uses a lookup table - to return the message length (either 1, 2, or 3 bytes). - - The value passed in must be 0x80 or higher. - */ - static int getMessageLengthFromFirstByte (const uint8 firstByte) noexcept; - - //============================================================================== - /** Returns the name of a midi note number. - - E.g "C", "D#", etc. - - @param noteNumber the midi note number, 0 to 127 - @param useSharps if true, sharpened notes are used, e.g. "C#", otherwise - they'll be flattened, e.g. "Db" - @param includeOctaveNumber if true, the octave number will be appended to the string, - e.g. "C#4" - @param octaveNumForMiddleC if an octave number is being appended, this indicates the - number that will be used for middle C's octave - - @see getMidiNoteInHertz - */ - static String getMidiNoteName (int noteNumber, - bool useSharps, - bool includeOctaveNumber, - int octaveNumForMiddleC); - - /** Returns the frequency of a midi note number. - - The frequencyOfA parameter is an optional frequency for 'A', normally 440-444Hz for concert pitch. - @see getMidiNoteName - */ - static double getMidiNoteInHertz (int noteNumber, const double frequencyOfA = 440.0) noexcept; - - /** Returns true if the given midi note number is a black key. */ - static bool isMidiNoteBlack (int noteNumber) noexcept; - - /** Returns the standard name of a GM instrument, or nullptr if unknown for this index. - - @param midiInstrumentNumber the program number 0 to 127 - @see getProgramChangeNumber - */ - static const char* getGMInstrumentName (int midiInstrumentNumber); - - /** Returns the name of a bank of GM instruments, or nullptr if unknown for this bank number. - @param midiBankNumber the bank, 0 to 15 - */ - static const char* getGMInstrumentBankName (int midiBankNumber); - - /** Returns the standard name of a channel 10 percussion sound, or nullptr if unknown for this note number. - @param midiNoteNumber the key number, 35 to 81 - */ - static const char* getRhythmInstrumentName (int midiNoteNumber); - - /** Returns the name of a controller type number, or nullptr if unknown for this controller number. - @see getControllerNumber - */ - static const char* getControllerName (int controllerNumber); - -private: - //============================================================================== - double timeStamp; - HeapBlock allocatedData; - int size; - - #ifndef DOXYGEN - union - { - uint8 asBytes[4]; - uint32 asInt32; - } preallocatedData; - #endif - - inline uint8* getData() noexcept { return allocatedData != nullptr ? allocatedData.getData() : preallocatedData.asBytes; } - uint8* allocateSpace (int); -}; - -#endif // JUCE_MIDIMESSAGE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp deleted file mode 100755 index 94a6b9b..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp +++ /dev/null @@ -1,331 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -MidiMessageSequence::MidiMessageSequence() -{ -} - -MidiMessageSequence::MidiMessageSequence (const MidiMessageSequence& other) -{ - list.addCopiesOf (other.list); - updateMatchedPairs(); -} - -MidiMessageSequence& MidiMessageSequence::operator= (const MidiMessageSequence& other) -{ - MidiMessageSequence otherCopy (other); - swapWith (otherCopy); - return *this; -} - -void MidiMessageSequence::swapWith (MidiMessageSequence& other) noexcept -{ - list.swapWith (other.list); -} - -MidiMessageSequence::~MidiMessageSequence() -{ -} - -void MidiMessageSequence::clear() -{ - list.clear(); -} - -int MidiMessageSequence::getNumEvents() const noexcept -{ - return list.size(); -} - -MidiMessageSequence::MidiEventHolder* MidiMessageSequence::getEventPointer (const int index) const noexcept -{ - return list [index]; -} - -double MidiMessageSequence::getTimeOfMatchingKeyUp (const int index) const noexcept -{ - if (const MidiEventHolder* const meh = list [index]) - if (meh->noteOffObject != nullptr) - return meh->noteOffObject->message.getTimeStamp(); - - return 0.0; -} - -int MidiMessageSequence::getIndexOfMatchingKeyUp (const int index) const noexcept -{ - if (const MidiEventHolder* const meh = list [index]) - return list.indexOf (meh->noteOffObject); - - return -1; -} - -int MidiMessageSequence::getIndexOf (MidiEventHolder* const event) const noexcept -{ - return list.indexOf (event); -} - -int MidiMessageSequence::getNextIndexAtTime (const double timeStamp) const noexcept -{ - const int numEvents = list.size(); - - int i; - for (i = 0; i < numEvents; ++i) - if (list.getUnchecked(i)->message.getTimeStamp() >= timeStamp) - break; - - return i; -} - -//============================================================================== -double MidiMessageSequence::getStartTime() const noexcept -{ - return getEventTime (0); -} - -double MidiMessageSequence::getEndTime() const noexcept -{ - return getEventTime (list.size() - 1); -} - -double MidiMessageSequence::getEventTime (const int index) const noexcept -{ - if (const MidiEventHolder* const meh = list [index]) - return meh->message.getTimeStamp(); - - return 0.0; -} - -//============================================================================== -MidiMessageSequence::MidiEventHolder* MidiMessageSequence::addEvent (const MidiMessage& newMessage, - double timeAdjustment) -{ - MidiEventHolder* const newOne = new MidiEventHolder (newMessage); - - timeAdjustment += newMessage.getTimeStamp(); - newOne->message.setTimeStamp (timeAdjustment); - - int i; - for (i = list.size(); --i >= 0;) - if (list.getUnchecked(i)->message.getTimeStamp() <= timeAdjustment) - break; - - list.insert (i + 1, newOne); - return newOne; -} - -void MidiMessageSequence::deleteEvent (const int index, - const bool deleteMatchingNoteUp) -{ - if (isPositiveAndBelow (index, list.size())) - { - if (deleteMatchingNoteUp) - deleteEvent (getIndexOfMatchingKeyUp (index), false); - - list.remove (index); - } -} - -struct MidiMessageSequenceSorter -{ - static int compareElements (const MidiMessageSequence::MidiEventHolder* const first, - const MidiMessageSequence::MidiEventHolder* const second) noexcept - { - const double diff = first->message.getTimeStamp() - second->message.getTimeStamp(); - return (diff > 0) - (diff < 0); - } -}; - -void MidiMessageSequence::addSequence (const MidiMessageSequence& other, - double timeAdjustment, - double firstAllowableTime, - double endOfAllowableDestTimes) -{ - firstAllowableTime -= timeAdjustment; - endOfAllowableDestTimes -= timeAdjustment; - - for (int i = 0; i < other.list.size(); ++i) - { - const MidiMessage& m = other.list.getUnchecked(i)->message; - const double t = m.getTimeStamp(); - - if (t >= firstAllowableTime && t < endOfAllowableDestTimes) - { - MidiEventHolder* const newOne = new MidiEventHolder (m); - newOne->message.setTimeStamp (timeAdjustment + t); - - list.add (newOne); - } - } - - sort(); -} - -//============================================================================== -void MidiMessageSequence::sort() noexcept -{ - MidiMessageSequenceSorter sorter; - list.sort (sorter, true); -} - -void MidiMessageSequence::updateMatchedPairs() noexcept -{ - for (int i = 0; i < list.size(); ++i) - { - MidiEventHolder* const meh = list.getUnchecked(i); - const MidiMessage& m1 = meh->message; - - if (m1.isNoteOn()) - { - meh->noteOffObject = nullptr; - const int note = m1.getNoteNumber(); - const int chan = m1.getChannel(); - const int len = list.size(); - - for (int j = i + 1; j < len; ++j) - { - const MidiMessage& m = list.getUnchecked(j)->message; - - if (m.getNoteNumber() == note && m.getChannel() == chan) - { - if (m.isNoteOff()) - { - meh->noteOffObject = list[j]; - break; - } - else if (m.isNoteOn()) - { - MidiEventHolder* const newEvent = new MidiEventHolder (MidiMessage::noteOff (chan, note)); - list.insert (j, newEvent); - newEvent->message.setTimeStamp (m.getTimeStamp()); - meh->noteOffObject = newEvent; - break; - } - } - } - } - } -} - -void MidiMessageSequence::addTimeToMessages (const double delta) noexcept -{ - for (int i = list.size(); --i >= 0;) - { - MidiMessage& mm = list.getUnchecked(i)->message; - mm.setTimeStamp (mm.getTimeStamp() + delta); - } -} - -//============================================================================== -void MidiMessageSequence::extractMidiChannelMessages (const int channelNumberToExtract, - MidiMessageSequence& destSequence, - const bool alsoIncludeMetaEvents) const -{ - for (int i = 0; i < list.size(); ++i) - { - const MidiMessage& mm = list.getUnchecked(i)->message; - - if (mm.isForChannel (channelNumberToExtract) || (alsoIncludeMetaEvents && mm.isMetaEvent())) - destSequence.addEvent (mm); - } -} - -void MidiMessageSequence::extractSysExMessages (MidiMessageSequence& destSequence) const -{ - for (int i = 0; i < list.size(); ++i) - { - const MidiMessage& mm = list.getUnchecked(i)->message; - - if (mm.isSysEx()) - destSequence.addEvent (mm); - } -} - -void MidiMessageSequence::deleteMidiChannelMessages (const int channelNumberToRemove) -{ - for (int i = list.size(); --i >= 0;) - if (list.getUnchecked(i)->message.isForChannel (channelNumberToRemove)) - list.remove(i); -} - -void MidiMessageSequence::deleteSysExMessages() -{ - for (int i = list.size(); --i >= 0;) - if (list.getUnchecked(i)->message.isSysEx()) - list.remove(i); -} - -//============================================================================== -void MidiMessageSequence::createControllerUpdatesForTime (const int channelNumber, - const double time, - OwnedArray& dest) -{ - bool doneProg = false; - bool donePitchWheel = false; - Array doneControllers; - doneControllers.ensureStorageAllocated (32); - - for (int i = list.size(); --i >= 0;) - { - const MidiMessage& mm = list.getUnchecked(i)->message; - - if (mm.isForChannel (channelNumber) && mm.getTimeStamp() <= time) - { - if (mm.isProgramChange()) - { - if (! doneProg) - { - dest.add (new MidiMessage (mm, 0.0)); - doneProg = true; - } - } - else if (mm.isController()) - { - if (! doneControllers.contains (mm.getControllerNumber())) - { - dest.add (new MidiMessage (mm, 0.0)); - doneControllers.add (mm.getControllerNumber()); - } - } - else if (mm.isPitchWheel()) - { - if (! donePitchWheel) - { - dest.add (new MidiMessage (mm, 0.0)); - donePitchWheel = true; - } - } - } - } -} - - -//============================================================================== -MidiMessageSequence::MidiEventHolder::MidiEventHolder (const MidiMessage& mm) - : message (mm), noteOffObject (nullptr) -{ -} - -MidiMessageSequence::MidiEventHolder::~MidiEventHolder() -{ -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h b/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h deleted file mode 100755 index b62940c..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/midi/juce_MidiMessageSequence.h +++ /dev/null @@ -1,265 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MIDIMESSAGESEQUENCE_H_INCLUDED -#define JUCE_MIDIMESSAGESEQUENCE_H_INCLUDED - - -//============================================================================== -/** - A sequence of timestamped midi messages. - - This allows the sequence to be manipulated, and also to be read from and - written to a standard midi file. - - @see MidiMessage, MidiFile -*/ -class JUCE_API MidiMessageSequence -{ -public: - //============================================================================== - /** Creates an empty midi sequence object. */ - MidiMessageSequence(); - - /** Creates a copy of another sequence. */ - MidiMessageSequence (const MidiMessageSequence&); - - /** Replaces this sequence with another one. */ - MidiMessageSequence& operator= (const MidiMessageSequence&); - - /** Destructor. */ - ~MidiMessageSequence(); - - //============================================================================== - /** Structure used to hold midi events in the sequence. - - These structures act as 'handles' on the events as they are moved about in - the list, and make it quick to find the matching note-offs for note-on events. - - @see MidiMessageSequence::getEventPointer - */ - class MidiEventHolder - { - public: - //============================================================================== - /** Destructor. */ - ~MidiEventHolder(); - - /** The message itself, whose timestamp is used to specify the event's time. */ - MidiMessage message; - - /** The matching note-off event (if this is a note-on event). - - If this isn't a note-on, this pointer will be nullptr. - - Use the MidiMessageSequence::updateMatchedPairs() method to keep these - note-offs up-to-date after events have been moved around in the sequence - or deleted. - */ - MidiEventHolder* noteOffObject; - - private: - //============================================================================== - friend class MidiMessageSequence; - MidiEventHolder (const MidiMessage&); - JUCE_LEAK_DETECTOR (MidiEventHolder) - }; - - //============================================================================== - /** Clears the sequence. */ - void clear(); - - /** Returns the number of events in the sequence. */ - int getNumEvents() const noexcept; - - /** Returns a pointer to one of the events. */ - MidiEventHolder* getEventPointer (int index) const noexcept; - - /** Returns the time of the note-up that matches the note-on at this index. - If the event at this index isn't a note-on, it'll just return 0. - @see MidiMessageSequence::MidiEventHolder::noteOffObject - */ - double getTimeOfMatchingKeyUp (int index) const noexcept; - - /** Returns the index of the note-up that matches the note-on at this index. - If the event at this index isn't a note-on, it'll just return -1. - @see MidiMessageSequence::MidiEventHolder::noteOffObject - */ - int getIndexOfMatchingKeyUp (int index) const noexcept; - - /** Returns the index of an event. */ - int getIndexOf (MidiEventHolder* event) const noexcept; - - /** Returns the index of the first event on or after the given timestamp. - If the time is beyond the end of the sequence, this will return the - number of events. - */ - int getNextIndexAtTime (double timeStamp) const noexcept; - - //============================================================================== - /** Returns the timestamp of the first event in the sequence. - @see getEndTime - */ - double getStartTime() const noexcept; - - /** Returns the timestamp of the last event in the sequence. - @see getStartTime - */ - double getEndTime() const noexcept; - - /** Returns the timestamp of the event at a given index. - If the index is out-of-range, this will return 0.0 - */ - double getEventTime (int index) const noexcept; - - //============================================================================== - /** Inserts a midi message into the sequence. - - The index at which the new message gets inserted will depend on its timestamp, - because the sequence is kept sorted. - - Remember to call updateMatchedPairs() after adding note-on events. - - @param newMessage the new message to add (an internal copy will be made) - @param timeAdjustment an optional value to add to the timestamp of the message - that will be inserted - @see updateMatchedPairs - */ - MidiEventHolder* addEvent (const MidiMessage& newMessage, - double timeAdjustment = 0); - - /** Deletes one of the events in the sequence. - - Remember to call updateMatchedPairs() after removing events. - - @param index the index of the event to delete - @param deleteMatchingNoteUp whether to also remove the matching note-off - if the event you're removing is a note-on - */ - void deleteEvent (int index, bool deleteMatchingNoteUp); - - /** Merges another sequence into this one. - - Remember to call updateMatchedPairs() after using this method. - - @param other the sequence to add from - @param timeAdjustmentDelta an amount to add to the timestamps of the midi events - as they are read from the other sequence - @param firstAllowableDestTime events will not be added if their time is earlier - than this time. (This is after their time has been adjusted - by the timeAdjustmentDelta) - @param endOfAllowableDestTimes events will not be added if their time is equal to - or greater than this time. (This is after their time has - been adjusted by the timeAdjustmentDelta) - */ - void addSequence (const MidiMessageSequence& other, - double timeAdjustmentDelta, - double firstAllowableDestTime, - double endOfAllowableDestTimes); - - //============================================================================== - /** Makes sure all the note-on and note-off pairs are up-to-date. - - Call this after re-ordering messages or deleting/adding messages, and it - will scan the list and make sure all the note-offs in the MidiEventHolder - structures are pointing at the correct ones. - */ - void updateMatchedPairs() noexcept; - - /** Forces a sort of the sequence. - You may need to call this if you've manually modified the timestamps of some - events such that the overall order now needs updating. - */ - void sort() noexcept; - - //============================================================================== - /** Copies all the messages for a particular midi channel to another sequence. - - @param channelNumberToExtract the midi channel to look for, in the range 1 to 16 - @param destSequence the sequence that the chosen events should be copied to - @param alsoIncludeMetaEvents if true, any meta-events (which don't apply to a specific - channel) will also be copied across. - @see extractSysExMessages - */ - void extractMidiChannelMessages (int channelNumberToExtract, - MidiMessageSequence& destSequence, - bool alsoIncludeMetaEvents) const; - - /** Copies all midi sys-ex messages to another sequence. - @param destSequence this is the sequence to which any sys-exes in this sequence - will be added - @see extractMidiChannelMessages - */ - void extractSysExMessages (MidiMessageSequence& destSequence) const; - - /** Removes any messages in this sequence that have a specific midi channel. - @param channelNumberToRemove the midi channel to look for, in the range 1 to 16 - */ - void deleteMidiChannelMessages (int channelNumberToRemove); - - /** Removes any sys-ex messages from this sequence. */ - void deleteSysExMessages(); - - /** Adds an offset to the timestamps of all events in the sequence. - @param deltaTime the amount to add to each timestamp. - */ - void addTimeToMessages (double deltaTime) noexcept; - - //============================================================================== - /** Scans through the sequence to determine the state of any midi controllers at - a given time. - - This will create a sequence of midi controller changes that can be - used to set all midi controllers to the state they would be in at the - specified time within this sequence. - - As well as controllers, it will also recreate the midi program number - and pitch bend position. - - @param channelNumber the midi channel to look for, in the range 1 to 16. Controllers - for other channels will be ignored. - @param time the time at which you want to find out the state - there are - no explicit units for this time measurement, it's the same units - as used for the timestamps of the messages - @param resultMessages an array to which midi controller-change messages will be added. This - will be the minimum number of controller changes to recreate the - state at the required time. - */ - void createControllerUpdatesForTime (int channelNumber, double time, - OwnedArray& resultMessages); - - //============================================================================== - /** Swaps this sequence with another one. */ - void swapWith (MidiMessageSequence&) noexcept; - -private: - //============================================================================== - friend class MidiFile; - OwnedArray list; - - JUCE_LEAK_DETECTOR (MidiMessageSequence) -}; - - -#endif // JUCE_MIDIMESSAGESEQUENCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h deleted file mode 100755 index cfbd59f..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_AudioSource.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOSOURCE_H_INCLUDED -#define JUCE_AUDIOSOURCE_H_INCLUDED - - -//============================================================================== -/** - Used by AudioSource::getNextAudioBlock(). -*/ -struct JUCE_API AudioSourceChannelInfo -{ - /** Creates an uninitialised AudioSourceChannelInfo. */ - AudioSourceChannelInfo() noexcept - { - } - - /** Creates an AudioSourceChannelInfo. */ - AudioSourceChannelInfo (AudioSampleBuffer* bufferToUse, - int startSampleOffset, int numSamplesToUse) noexcept - : buffer (bufferToUse), - startSample (startSampleOffset), - numSamples (numSamplesToUse) - { - } - - /** Creates an AudioSourceChannelInfo that uses the whole of a buffer. - Note that the buffer provided must not be deleted while the - AudioSourceChannelInfo is still using it. - */ - explicit AudioSourceChannelInfo (AudioSampleBuffer& bufferToUse) noexcept - : buffer (&bufferToUse), - startSample (0), - numSamples (bufferToUse.getNumSamples()) - { - } - - /** The destination buffer to fill with audio data. - - When the AudioSource::getNextAudioBlock() method is called, the active section - of this buffer should be filled with whatever output the source produces. - - Only the samples specified by the startSample and numSamples members of this structure - should be affected by the call. - - The contents of the buffer when it is passed to the AudioSource::getNextAudioBlock() - method can be treated as the input if the source is performing some kind of filter operation, - but should be cleared if this is not the case - the clearActiveBufferRegion() is - a handy way of doing this. - - The number of channels in the buffer could be anything, so the AudioSource - must cope with this in whatever way is appropriate for its function. - */ - AudioSampleBuffer* buffer; - - /** The first sample in the buffer from which the callback is expected - to write data. */ - int startSample; - - /** The number of samples in the buffer which the callback is expected to - fill with data. */ - int numSamples; - - /** Convenient method to clear the buffer if the source is not producing any data. */ - void clearActiveBufferRegion() const - { - if (buffer != nullptr) - buffer->clear (startSample, numSamples); - } -}; - - -//============================================================================== -/** - Base class for objects that can produce a continuous stream of audio. - - An AudioSource has two states: 'prepared' and 'unprepared'. - - When a source needs to be played, it is first put into a 'prepared' state by a call to - prepareToPlay(), and then repeated calls will be made to its getNextAudioBlock() method to - process the audio data. - - Once playback has finished, the releaseResources() method is called to put the stream - back into an 'unprepared' state. - - @see AudioFormatReaderSource, ResamplingAudioSource -*/ -class JUCE_API AudioSource -{ -protected: - //============================================================================== - /** Creates an AudioSource. */ - AudioSource() noexcept {} - -public: - /** Destructor. */ - virtual ~AudioSource() {} - - //============================================================================== - /** Tells the source to prepare for playing. - - An AudioSource has two states: prepared and unprepared. - - The prepareToPlay() method is guaranteed to be called at least once on an 'unpreprared' - source to put it into a 'prepared' state before any calls will be made to getNextAudioBlock(). - This callback allows the source to initialise any resources it might need when playing. - - Once playback has finished, the releaseResources() method is called to put the stream - back into an 'unprepared' state. - - Note that this method could be called more than once in succession without - a matching call to releaseResources(), so make sure your code is robust and - can handle that kind of situation. - - @param samplesPerBlockExpected the number of samples that the source - will be expected to supply each time its - getNextAudioBlock() method is called. This - number may vary slightly, because it will be dependent - on audio hardware callbacks, and these aren't - guaranteed to always use a constant block size, so - the source should be able to cope with small variations. - @param sampleRate the sample rate that the output will be used at - this - is needed by sources such as tone generators. - @see releaseResources, getNextAudioBlock - */ - virtual void prepareToPlay (int samplesPerBlockExpected, - double sampleRate) = 0; - - /** Allows the source to release anything it no longer needs after playback has stopped. - - This will be called when the source is no longer going to have its getNextAudioBlock() - method called, so it should release any spare memory, etc. that it might have - allocated during the prepareToPlay() call. - - Note that there's no guarantee that prepareToPlay() will actually have been called before - releaseResources(), and it may be called more than once in succession, so make sure your - code is robust and doesn't make any assumptions about when it will be called. - - @see prepareToPlay, getNextAudioBlock - */ - virtual void releaseResources() = 0; - - /** Called repeatedly to fetch subsequent blocks of audio data. - - After calling the prepareToPlay() method, this callback will be made each - time the audio playback hardware (or whatever other destination the audio - data is going to) needs another block of data. - - It will generally be called on a high-priority system thread, or possibly even - an interrupt, so be careful not to do too much work here, as that will cause - audio glitches! - - @see AudioSourceChannelInfo, prepareToPlay, releaseResources - */ - virtual void getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) = 0; -}; - - -#endif // JUCE_AUDIOSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp deleted file mode 100755 index 21dc173..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp +++ /dev/null @@ -1,259 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -BufferingAudioSource::BufferingAudioSource (PositionableAudioSource* s, - TimeSliceThread& thread, - const bool deleteSourceWhenDeleted, - const int bufferSizeSamples, - const int numChannels) - : source (s, deleteSourceWhenDeleted), - backgroundThread (thread), - numberOfSamplesToBuffer (jmax (1024, bufferSizeSamples)), - numberOfChannels (numChannels), - bufferValidStart (0), - bufferValidEnd (0), - nextPlayPos (0), - sampleRate (0), - wasSourceLooping (false), - isPrepared (false) -{ - jassert (source != nullptr); - - jassert (numberOfSamplesToBuffer > 1024); // not much point using this class if you're - // not using a larger buffer.. -} - -BufferingAudioSource::~BufferingAudioSource() -{ - releaseResources(); -} - -//============================================================================== -void BufferingAudioSource::prepareToPlay (int samplesPerBlockExpected, double newSampleRate) -{ - const int bufferSizeNeeded = jmax (samplesPerBlockExpected * 2, numberOfSamplesToBuffer); - - if (newSampleRate != sampleRate - || bufferSizeNeeded != buffer.getNumSamples() - || ! isPrepared) - { - backgroundThread.removeTimeSliceClient (this); - - isPrepared = true; - sampleRate = newSampleRate; - - source->prepareToPlay (samplesPerBlockExpected, newSampleRate); - - buffer.setSize (numberOfChannels, bufferSizeNeeded); - buffer.clear(); - - bufferValidStart = 0; - bufferValidEnd = 0; - - backgroundThread.addTimeSliceClient (this); - - while (bufferValidEnd - bufferValidStart < jmin (((int) newSampleRate) / 4, - buffer.getNumSamples() / 2)) - { - backgroundThread.moveToFrontOfQueue (this); - Thread::sleep (5); - } - } -} - -void BufferingAudioSource::releaseResources() -{ - isPrepared = false; - backgroundThread.removeTimeSliceClient (this); - - buffer.setSize (numberOfChannels, 0); - source->releaseResources(); -} - -void BufferingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info) -{ - const ScopedLock sl (bufferStartPosLock); - - const int validStart = (int) (jlimit (bufferValidStart, bufferValidEnd, nextPlayPos) - nextPlayPos); - const int validEnd = (int) (jlimit (bufferValidStart, bufferValidEnd, nextPlayPos + info.numSamples) - nextPlayPos); - - if (validStart == validEnd) - { - // total cache miss - info.clearActiveBufferRegion(); - } - else - { - if (validStart > 0) - info.buffer->clear (info.startSample, validStart); // partial cache miss at start - - if (validEnd < info.numSamples) - info.buffer->clear (info.startSample + validEnd, - info.numSamples - validEnd); // partial cache miss at end - - if (validStart < validEnd) - { - for (int chan = jmin (numberOfChannels, info.buffer->getNumChannels()); --chan >= 0;) - { - jassert (buffer.getNumSamples() > 0); - const int startBufferIndex = (int) ((validStart + nextPlayPos) % buffer.getNumSamples()); - const int endBufferIndex = (int) ((validEnd + nextPlayPos) % buffer.getNumSamples()); - - if (startBufferIndex < endBufferIndex) - { - info.buffer->copyFrom (chan, info.startSample + validStart, - buffer, - chan, startBufferIndex, - validEnd - validStart); - } - else - { - const int initialSize = buffer.getNumSamples() - startBufferIndex; - - info.buffer->copyFrom (chan, info.startSample + validStart, - buffer, - chan, startBufferIndex, - initialSize); - - info.buffer->copyFrom (chan, info.startSample + validStart + initialSize, - buffer, - chan, 0, - (validEnd - validStart) - initialSize); - } - } - } - - nextPlayPos += info.numSamples; - } -} - -int64 BufferingAudioSource::getNextReadPosition() const -{ - jassert (source->getTotalLength() > 0); - return (source->isLooping() && nextPlayPos > 0) - ? nextPlayPos % source->getTotalLength() - : nextPlayPos; -} - -void BufferingAudioSource::setNextReadPosition (int64 newPosition) -{ - const ScopedLock sl (bufferStartPosLock); - - nextPlayPos = newPosition; - backgroundThread.moveToFrontOfQueue (this); -} - -bool BufferingAudioSource::readNextBufferChunk() -{ - int64 newBVS, newBVE, sectionToReadStart, sectionToReadEnd; - - { - const ScopedLock sl (bufferStartPosLock); - - if (wasSourceLooping != isLooping()) - { - wasSourceLooping = isLooping(); - bufferValidStart = 0; - bufferValidEnd = 0; - } - - newBVS = jmax ((int64) 0, nextPlayPos); - newBVE = newBVS + buffer.getNumSamples() - 4; - sectionToReadStart = 0; - sectionToReadEnd = 0; - - const int maxChunkSize = 2048; - - if (newBVS < bufferValidStart || newBVS >= bufferValidEnd) - { - newBVE = jmin (newBVE, newBVS + maxChunkSize); - - sectionToReadStart = newBVS; - sectionToReadEnd = newBVE; - - bufferValidStart = 0; - bufferValidEnd = 0; - } - else if (std::abs ((int) (newBVS - bufferValidStart)) > 512 - || std::abs ((int) (newBVE - bufferValidEnd)) > 512) - { - newBVE = jmin (newBVE, bufferValidEnd + maxChunkSize); - - sectionToReadStart = bufferValidEnd; - sectionToReadEnd = newBVE; - - bufferValidStart = newBVS; - bufferValidEnd = jmin (bufferValidEnd, newBVE); - } - } - - if (sectionToReadStart == sectionToReadEnd) - return false; - - jassert (buffer.getNumSamples() > 0); - const int bufferIndexStart = (int) (sectionToReadStart % buffer.getNumSamples()); - const int bufferIndexEnd = (int) (sectionToReadEnd % buffer.getNumSamples()); - - if (bufferIndexStart < bufferIndexEnd) - { - readBufferSection (sectionToReadStart, - (int) (sectionToReadEnd - sectionToReadStart), - bufferIndexStart); - } - else - { - const int initialSize = buffer.getNumSamples() - bufferIndexStart; - - readBufferSection (sectionToReadStart, - initialSize, - bufferIndexStart); - - readBufferSection (sectionToReadStart + initialSize, - (int) (sectionToReadEnd - sectionToReadStart) - initialSize, - 0); - } - - { - const ScopedLock sl2 (bufferStartPosLock); - - bufferValidStart = newBVS; - bufferValidEnd = newBVE; - } - - return true; -} - -void BufferingAudioSource::readBufferSection (const int64 start, const int length, const int bufferOffset) -{ - if (source->getNextReadPosition() != start) - source->setNextReadPosition (start); - - AudioSourceChannelInfo info (&buffer, bufferOffset, length); - source->getNextAudioBlock (info); -} - -int BufferingAudioSource::useTimeSlice() -{ - return readNextBufferChunk() ? 1 : 100; -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h deleted file mode 100755 index b0ab4d2..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_BufferingAudioSource.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_BUFFERINGAUDIOSOURCE_H_INCLUDED -#define JUCE_BUFFERINGAUDIOSOURCE_H_INCLUDED - - -//============================================================================== -/** - An AudioSource which takes another source as input, and buffers it using a thread. - - Create this as a wrapper around another thread, and it will read-ahead with - a background thread to smooth out playback. You can either create one of these - directly, or use it indirectly using an AudioTransportSource. - - @see PositionableAudioSource, AudioTransportSource -*/ -class JUCE_API BufferingAudioSource : public PositionableAudioSource, - private TimeSliceClient -{ -public: - //============================================================================== - /** Creates a BufferingAudioSource. - - @param source the input source to read from - @param backgroundThread a background thread that will be used for the - background read-ahead. This object must not be deleted - until after any BufferedAudioSources that are using it - have been deleted! - @param deleteSourceWhenDeleted if true, then the input source object will - be deleted when this object is deleted - @param numberOfSamplesToBuffer the size of buffer to use for reading ahead - @param numberOfChannels the number of channels that will be played - */ - BufferingAudioSource (PositionableAudioSource* source, - TimeSliceThread& backgroundThread, - bool deleteSourceWhenDeleted, - int numberOfSamplesToBuffer, - int numberOfChannels = 2); - - /** Destructor. - - The input source may be deleted depending on whether the deleteSourceWhenDeleted - flag was set in the constructor. - */ - ~BufferingAudioSource(); - - //============================================================================== - /** Implementation of the AudioSource method. */ - void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; - - /** Implementation of the AudioSource method. */ - void releaseResources() override; - - /** Implementation of the AudioSource method. */ - void getNextAudioBlock (const AudioSourceChannelInfo&) override; - - //============================================================================== - /** Implements the PositionableAudioSource method. */ - void setNextReadPosition (int64 newPosition) override; - - /** Implements the PositionableAudioSource method. */ - int64 getNextReadPosition() const override; - - /** Implements the PositionableAudioSource method. */ - int64 getTotalLength() const override { return source->getTotalLength(); } - - /** Implements the PositionableAudioSource method. */ - bool isLooping() const override { return source->isLooping(); } - -private: - //============================================================================== - OptionalScopedPointer source; - TimeSliceThread& backgroundThread; - int numberOfSamplesToBuffer, numberOfChannels; - AudioSampleBuffer buffer; - CriticalSection bufferStartPosLock; - int64 volatile bufferValidStart, bufferValidEnd, nextPlayPos; - double volatile sampleRate; - bool wasSourceLooping, isPrepared; - - bool readNextBufferChunk(); - void readBufferSection (int64 start, int length, int bufferOffset); - int useTimeSlice() override; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BufferingAudioSource) -}; - - -#endif // JUCE_BUFFERINGAUDIOSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp deleted file mode 100755 index 7e0a58c..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ChannelRemappingAudioSource::ChannelRemappingAudioSource (AudioSource* const source_, - const bool deleteSourceWhenDeleted) - : source (source_, deleteSourceWhenDeleted), - requiredNumberOfChannels (2) -{ - remappedInfo.buffer = &buffer; - remappedInfo.startSample = 0; -} - -ChannelRemappingAudioSource::~ChannelRemappingAudioSource() {} - -//============================================================================== -void ChannelRemappingAudioSource::setNumberOfChannelsToProduce (const int requiredNumberOfChannels_) -{ - const ScopedLock sl (lock); - requiredNumberOfChannels = requiredNumberOfChannels_; -} - -void ChannelRemappingAudioSource::clearAllMappings() -{ - const ScopedLock sl (lock); - - remappedInputs.clear(); - remappedOutputs.clear(); -} - -void ChannelRemappingAudioSource::setInputChannelMapping (const int destIndex, const int sourceIndex) -{ - const ScopedLock sl (lock); - - while (remappedInputs.size() < destIndex) - remappedInputs.add (-1); - - remappedInputs.set (destIndex, sourceIndex); -} - -void ChannelRemappingAudioSource::setOutputChannelMapping (const int sourceIndex, const int destIndex) -{ - const ScopedLock sl (lock); - - while (remappedOutputs.size() < sourceIndex) - remappedOutputs.add (-1); - - remappedOutputs.set (sourceIndex, destIndex); -} - -int ChannelRemappingAudioSource::getRemappedInputChannel (const int inputChannelIndex) const -{ - const ScopedLock sl (lock); - - if (inputChannelIndex >= 0 && inputChannelIndex < remappedInputs.size()) - return remappedInputs.getUnchecked (inputChannelIndex); - - return -1; -} - -int ChannelRemappingAudioSource::getRemappedOutputChannel (const int outputChannelIndex) const -{ - const ScopedLock sl (lock); - - if (outputChannelIndex >= 0 && outputChannelIndex < remappedOutputs.size()) - return remappedOutputs .getUnchecked (outputChannelIndex); - - return -1; -} - -//============================================================================== -void ChannelRemappingAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) -{ - source->prepareToPlay (samplesPerBlockExpected, sampleRate); -} - -void ChannelRemappingAudioSource::releaseResources() -{ - source->releaseResources(); -} - -void ChannelRemappingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) -{ - const ScopedLock sl (lock); - - buffer.setSize (requiredNumberOfChannels, bufferToFill.numSamples, false, false, true); - - const int numChans = bufferToFill.buffer->getNumChannels(); - - for (int i = 0; i < buffer.getNumChannels(); ++i) - { - const int remappedChan = getRemappedInputChannel (i); - - if (remappedChan >= 0 && remappedChan < numChans) - { - buffer.copyFrom (i, 0, *bufferToFill.buffer, - remappedChan, - bufferToFill.startSample, - bufferToFill.numSamples); - } - else - { - buffer.clear (i, 0, bufferToFill.numSamples); - } - } - - remappedInfo.numSamples = bufferToFill.numSamples; - - source->getNextAudioBlock (remappedInfo); - - bufferToFill.clearActiveBufferRegion(); - - for (int i = 0; i < requiredNumberOfChannels; ++i) - { - const int remappedChan = getRemappedOutputChannel (i); - - if (remappedChan >= 0 && remappedChan < numChans) - { - bufferToFill.buffer->addFrom (remappedChan, bufferToFill.startSample, - buffer, i, 0, bufferToFill.numSamples); - - } - } -} - -//============================================================================== -XmlElement* ChannelRemappingAudioSource::createXml() const -{ - XmlElement* e = new XmlElement ("MAPPINGS"); - String ins, outs; - - const ScopedLock sl (lock); - - for (int i = 0; i < remappedInputs.size(); ++i) - ins << remappedInputs.getUnchecked(i) << ' '; - - for (int i = 0; i < remappedOutputs.size(); ++i) - outs << remappedOutputs.getUnchecked(i) << ' '; - - e->setAttribute ("inputs", ins.trimEnd()); - e->setAttribute ("outputs", outs.trimEnd()); - - return e; -} - -void ChannelRemappingAudioSource::restoreFromXml (const XmlElement& e) -{ - if (e.hasTagName ("MAPPINGS")) - { - const ScopedLock sl (lock); - - clearAllMappings(); - - StringArray ins, outs; - ins.addTokens (e.getStringAttribute ("inputs"), false); - outs.addTokens (e.getStringAttribute ("outputs"), false); - - for (int i = 0; i < ins.size(); ++i) - remappedInputs.add (ins[i].getIntValue()); - - for (int i = 0; i < outs.size(); ++i) - remappedOutputs.add (outs[i].getIntValue()); - } -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h deleted file mode 100755 index 483fe99..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ChannelRemappingAudioSource.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED -#define JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED - - -//============================================================================== -/** - An AudioSource that takes the audio from another source, and re-maps its - input and output channels to a different arrangement. - - You can use this to increase or decrease the number of channels that an - audio source uses, or to re-order those channels. - - Call the reset() method before using it to set up a default mapping, and then - the setInputChannelMapping() and setOutputChannelMapping() methods to - create an appropriate mapping, otherwise no channels will be connected and - it'll produce silence. - - @see AudioSource -*/ -class ChannelRemappingAudioSource : public AudioSource -{ -public: - //============================================================================== - /** Creates a remapping source that will pass on audio from the given input. - - @param source the input source to use. Make sure that this doesn't - get deleted before the ChannelRemappingAudioSource object - @param deleteSourceWhenDeleted if true, the input source will be deleted - when this object is deleted, if false, the caller is - responsible for its deletion - */ - ChannelRemappingAudioSource (AudioSource* source, - bool deleteSourceWhenDeleted); - - /** Destructor. */ - ~ChannelRemappingAudioSource(); - - //============================================================================== - /** Specifies a number of channels that this audio source must produce from its - getNextAudioBlock() callback. - */ - void setNumberOfChannelsToProduce (int requiredNumberOfChannels); - - /** Clears any mapped channels. - - After this, no channels are mapped, so this object will produce silence. Create - some mappings with setInputChannelMapping() and setOutputChannelMapping(). - */ - void clearAllMappings(); - - /** Creates an input channel mapping. - - When the getNextAudioBlock() method is called, the data in channel sourceChannelIndex of the incoming - data will be sent to destChannelIndex of our input source. - - @param destChannelIndex the index of an input channel in our input audio source (i.e. the - source specified when this object was created). - @param sourceChannelIndex the index of the input channel in the incoming audio data buffer - during our getNextAudioBlock() callback - */ - void setInputChannelMapping (int destChannelIndex, - int sourceChannelIndex); - - /** Creates an output channel mapping. - - When the getNextAudioBlock() method is called, the data returned in channel sourceChannelIndex by - our input audio source will be copied to channel destChannelIndex of the final buffer. - - @param sourceChannelIndex the index of an output channel coming from our input audio source - (i.e. the source specified when this object was created). - @param destChannelIndex the index of the output channel in the incoming audio data buffer - during our getNextAudioBlock() callback - */ - void setOutputChannelMapping (int sourceChannelIndex, - int destChannelIndex); - - /** Returns the channel from our input that will be sent to channel inputChannelIndex of - our input audio source. - */ - int getRemappedInputChannel (int inputChannelIndex) const; - - /** Returns the output channel to which channel outputChannelIndex of our input audio - source will be sent to. - */ - int getRemappedOutputChannel (int outputChannelIndex) const; - - - //============================================================================== - /** Returns an XML object to encapsulate the state of the mappings. - @see restoreFromXml - */ - XmlElement* createXml() const; - - /** Restores the mappings from an XML object created by createXML(). - @see createXml - */ - void restoreFromXml (const XmlElement&); - - //============================================================================== - void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; - void releaseResources() override; - void getNextAudioBlock (const AudioSourceChannelInfo&) override; - - -private: - //============================================================================== - OptionalScopedPointer source; - Array remappedInputs, remappedOutputs; - int requiredNumberOfChannels; - - AudioSampleBuffer buffer; - AudioSourceChannelInfo remappedInfo; - CriticalSection lock; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChannelRemappingAudioSource) -}; - - -#endif // JUCE_CHANNELREMAPPINGAUDIOSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp deleted file mode 100755 index 08e87f0..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -IIRFilterAudioSource::IIRFilterAudioSource (AudioSource* const inputSource, - const bool deleteInputWhenDeleted) - : input (inputSource, deleteInputWhenDeleted) -{ - jassert (inputSource != nullptr); - - for (int i = 2; --i >= 0;) - iirFilters.add (new IIRFilter()); -} - -IIRFilterAudioSource::~IIRFilterAudioSource() {} - -//============================================================================== -void IIRFilterAudioSource::setCoefficients (const IIRCoefficients& newCoefficients) -{ - for (int i = iirFilters.size(); --i >= 0;) - iirFilters.getUnchecked(i)->setCoefficients (newCoefficients); -} - -void IIRFilterAudioSource::makeInactive() -{ - for (int i = iirFilters.size(); --i >= 0;) - iirFilters.getUnchecked(i)->makeInactive(); -} - -//============================================================================== -void IIRFilterAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) -{ - input->prepareToPlay (samplesPerBlockExpected, sampleRate); - - for (int i = iirFilters.size(); --i >= 0;) - iirFilters.getUnchecked(i)->reset(); -} - -void IIRFilterAudioSource::releaseResources() -{ - input->releaseResources(); -} - -void IIRFilterAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) -{ - input->getNextAudioBlock (bufferToFill); - - const int numChannels = bufferToFill.buffer->getNumChannels(); - - while (numChannels > iirFilters.size()) - iirFilters.add (new IIRFilter (*iirFilters.getUnchecked (0))); - - for (int i = 0; i < numChannels; ++i) - iirFilters.getUnchecked(i) - ->processSamples (bufferToFill.buffer->getWritePointer (i, bufferToFill.startSample), - bufferToFill.numSamples); -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h deleted file mode 100755 index 40844c5..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_IIRFILTERAUDIOSOURCE_H_INCLUDED -#define JUCE_IIRFILTERAUDIOSOURCE_H_INCLUDED - - -//============================================================================== -/** - An AudioSource that performs an IIR filter on another source. -*/ -class JUCE_API IIRFilterAudioSource : public AudioSource -{ -public: - //============================================================================== - /** Creates a IIRFilterAudioSource for a given input source. - - @param inputSource the input source to read from - this must not be null - @param deleteInputWhenDeleted if true, the input source will be deleted when - this object is deleted - */ - IIRFilterAudioSource (AudioSource* inputSource, - bool deleteInputWhenDeleted); - - /** Destructor. */ - ~IIRFilterAudioSource(); - - //============================================================================== - /** Changes the filter to use the same parameters as the one being passed in. */ - void setCoefficients (const IIRCoefficients& newCoefficients); - - /** Calls IIRFilter::makeInactive() on all the filters being used internally. */ - void makeInactive(); - - //============================================================================== - void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; - void releaseResources() override; - void getNextAudioBlock (const AudioSourceChannelInfo&) override; - -private: - //============================================================================== - OptionalScopedPointer input; - OwnedArray iirFilters; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IIRFilterAudioSource) -}; - - -#endif // JUCE_IIRFILTERAUDIOSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp deleted file mode 100755 index 60ae191..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.cpp +++ /dev/null @@ -1,155 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -MixerAudioSource::MixerAudioSource() - : currentSampleRate (0.0), bufferSizeExpected (0) -{ -} - -MixerAudioSource::~MixerAudioSource() -{ - removeAllInputs(); -} - -//============================================================================== -void MixerAudioSource::addInputSource (AudioSource* input, const bool deleteWhenRemoved) -{ - if (input != nullptr && ! inputs.contains (input)) - { - double localRate; - int localBufferSize; - - { - const ScopedLock sl (lock); - localRate = currentSampleRate; - localBufferSize = bufferSizeExpected; - } - - if (localRate > 0.0) - input->prepareToPlay (localBufferSize, localRate); - - const ScopedLock sl (lock); - - inputsToDelete.setBit (inputs.size(), deleteWhenRemoved); - inputs.add (input); - } -} - -void MixerAudioSource::removeInputSource (AudioSource* const input) -{ - if (input != nullptr) - { - ScopedPointer toDelete; - - { - const ScopedLock sl (lock); - const int index = inputs.indexOf (input); - - if (index < 0) - return; - - if (inputsToDelete [index]) - toDelete = input; - - inputsToDelete.shiftBits (-1, index); - inputs.remove (index); - } - - input->releaseResources(); - } -} - -void MixerAudioSource::removeAllInputs() -{ - OwnedArray toDelete; - - { - const ScopedLock sl (lock); - - for (int i = inputs.size(); --i >= 0;) - if (inputsToDelete[i]) - toDelete.add (inputs.getUnchecked(i)); - - inputs.clear(); - } - - for (int i = toDelete.size(); --i >= 0;) - toDelete.getUnchecked(i)->releaseResources(); -} - -void MixerAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) -{ - tempBuffer.setSize (2, samplesPerBlockExpected); - - const ScopedLock sl (lock); - - currentSampleRate = sampleRate; - bufferSizeExpected = samplesPerBlockExpected; - - for (int i = inputs.size(); --i >= 0;) - inputs.getUnchecked(i)->prepareToPlay (samplesPerBlockExpected, sampleRate); -} - -void MixerAudioSource::releaseResources() -{ - const ScopedLock sl (lock); - - for (int i = inputs.size(); --i >= 0;) - inputs.getUnchecked(i)->releaseResources(); - - tempBuffer.setSize (2, 0); - - currentSampleRate = 0; - bufferSizeExpected = 0; -} - -void MixerAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info) -{ - const ScopedLock sl (lock); - - if (inputs.size() > 0) - { - inputs.getUnchecked(0)->getNextAudioBlock (info); - - if (inputs.size() > 1) - { - tempBuffer.setSize (jmax (1, info.buffer->getNumChannels()), - info.buffer->getNumSamples()); - - AudioSourceChannelInfo info2 (&tempBuffer, 0, info.numSamples); - - for (int i = 1; i < inputs.size(); ++i) - { - inputs.getUnchecked(i)->getNextAudioBlock (info2); - - for (int chan = 0; chan < info.buffer->getNumChannels(); ++chan) - info.buffer->addFrom (chan, info.startSample, tempBuffer, chan, 0, info.numSamples); - } - } - } - else - { - info.clearActiveBufferRegion(); - } -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h deleted file mode 100755 index f581ac3..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_MixerAudioSource.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MIXERAUDIOSOURCE_H_INCLUDED -#define JUCE_MIXERAUDIOSOURCE_H_INCLUDED - - -//============================================================================== -/** - An AudioSource that mixes together the output of a set of other AudioSources. - - Input sources can be added and removed while the mixer is running as long as their - prepareToPlay() and releaseResources() methods are called before and after adding - them to the mixer. -*/ -class JUCE_API MixerAudioSource : public AudioSource -{ -public: - //============================================================================== - /** Creates a MixerAudioSource. */ - MixerAudioSource(); - - /** Destructor. */ - ~MixerAudioSource(); - - //============================================================================== - /** Adds an input source to the mixer. - - If the mixer is running you'll need to make sure that the input source - is ready to play by calling its prepareToPlay() method before adding it. - If the mixer is stopped, then its input sources will be automatically - prepared when the mixer's prepareToPlay() method is called. - - @param newInput the source to add to the mixer - @param deleteWhenRemoved if true, then this source will be deleted when - no longer needed by the mixer. - */ - void addInputSource (AudioSource* newInput, bool deleteWhenRemoved); - - /** Removes an input source. - If the source was added by calling addInputSource() with the deleteWhenRemoved - flag set, it will be deleted by this method. - */ - void removeInputSource (AudioSource* input); - - /** Removes all the input sources. - Any sources which were added by calling addInputSource() with the deleteWhenRemoved - flag set will be deleted by this method. - */ - void removeAllInputs(); - - //============================================================================== - /** Implementation of the AudioSource method. - This will call prepareToPlay() on all its input sources. - */ - void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; - - /** Implementation of the AudioSource method. - This will call releaseResources() on all its input sources. - */ - void releaseResources() override; - - /** Implementation of the AudioSource method. */ - void getNextAudioBlock (const AudioSourceChannelInfo&) override; - - -private: - //============================================================================== - Array inputs; - BigInteger inputsToDelete; - CriticalSection lock; - AudioSampleBuffer tempBuffer; - double currentSampleRate; - int bufferSizeExpected; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MixerAudioSource) -}; - - -#endif // JUCE_MIXERAUDIOSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h deleted file mode 100755 index 2213722..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_PositionableAudioSource.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_POSITIONABLEAUDIOSOURCE_H_INCLUDED -#define JUCE_POSITIONABLEAUDIOSOURCE_H_INCLUDED - - -//============================================================================== -/** - A type of AudioSource which can be repositioned. - - The basic AudioSource just streams continuously with no idea of a current - time or length, so the PositionableAudioSource is used for a finite stream - that has a current read position. - - @see AudioSource, AudioTransportSource -*/ -class JUCE_API PositionableAudioSource : public AudioSource -{ -protected: - //============================================================================== - /** Creates the PositionableAudioSource. */ - PositionableAudioSource() noexcept {} - -public: - /** Destructor */ - ~PositionableAudioSource() {} - - //============================================================================== - /** Tells the stream to move to a new position. - - Calling this indicates that the next call to AudioSource::getNextAudioBlock() - should return samples from this position. - - Note that this may be called on a different thread to getNextAudioBlock(), - so the subclass should make sure it's synchronised. - */ - virtual void setNextReadPosition (int64 newPosition) = 0; - - /** Returns the position from which the next block will be returned. - - @see setNextReadPosition - */ - virtual int64 getNextReadPosition() const = 0; - - /** Returns the total length of the stream (in samples). */ - virtual int64 getTotalLength() const = 0; - - /** Returns true if this source is actually playing in a loop. */ - virtual bool isLooping() const = 0; - - /** Tells the source whether you'd like it to play in a loop. */ - virtual void setLooping (bool shouldLoop) { (void) shouldLoop; } -}; - - -#endif // JUCE_POSITIONABLEAUDIOSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp deleted file mode 100755 index 419f008..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ResamplingAudioSource::ResamplingAudioSource (AudioSource* const inputSource, - const bool deleteInputWhenDeleted, - const int numChannels_) - : input (inputSource, deleteInputWhenDeleted), - ratio (1.0), - lastRatio (1.0), - bufferPos (0), - sampsInBuffer (0), - subSampleOffset (0), - numChannels (numChannels_) -{ - jassert (input != nullptr); - zeromem (coefficients, sizeof (coefficients)); -} - -ResamplingAudioSource::~ResamplingAudioSource() {} - -void ResamplingAudioSource::setResamplingRatio (const double samplesInPerOutputSample) -{ - jassert (samplesInPerOutputSample > 0); - - const SpinLock::ScopedLockType sl (ratioLock); - ratio = jmax (0.0, samplesInPerOutputSample); -} - -void ResamplingAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) -{ - const SpinLock::ScopedLockType sl (ratioLock); - - input->prepareToPlay (samplesPerBlockExpected, sampleRate); - - buffer.setSize (numChannels, roundToInt (samplesPerBlockExpected * ratio) + 32); - - filterStates.calloc ((size_t) numChannels); - srcBuffers.calloc ((size_t) numChannels); - destBuffers.calloc ((size_t) numChannels); - createLowPass (ratio); - - flushBuffers(); -} - -void ResamplingAudioSource::flushBuffers() -{ - buffer.clear(); - bufferPos = 0; - sampsInBuffer = 0; - subSampleOffset = 0.0; - resetFilters(); -} - -void ResamplingAudioSource::releaseResources() -{ - input->releaseResources(); - buffer.setSize (numChannels, 0); -} - -void ResamplingAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info) -{ - double localRatio; - - { - const SpinLock::ScopedLockType sl (ratioLock); - localRatio = ratio; - } - - if (lastRatio != localRatio) - { - createLowPass (localRatio); - lastRatio = localRatio; - } - - const int sampsNeeded = roundToInt (info.numSamples * localRatio) + 3; - - int bufferSize = buffer.getNumSamples(); - - if (bufferSize < sampsNeeded + 8) - { - bufferPos %= bufferSize; - bufferSize = sampsNeeded + 32; - buffer.setSize (buffer.getNumChannels(), bufferSize, true, true); - } - - bufferPos %= bufferSize; - - int endOfBufferPos = bufferPos + sampsInBuffer; - const int channelsToProcess = jmin (numChannels, info.buffer->getNumChannels()); - - while (sampsNeeded > sampsInBuffer) - { - endOfBufferPos %= bufferSize; - - int numToDo = jmin (sampsNeeded - sampsInBuffer, - bufferSize - endOfBufferPos); - - AudioSourceChannelInfo readInfo (&buffer, endOfBufferPos, numToDo); - input->getNextAudioBlock (readInfo); - - if (localRatio > 1.0001) - { - // for down-sampling, pre-apply the filter.. - - for (int i = channelsToProcess; --i >= 0;) - applyFilter (buffer.getWritePointer (i, endOfBufferPos), numToDo, filterStates[i]); - } - - sampsInBuffer += numToDo; - endOfBufferPos += numToDo; - } - - for (int channel = 0; channel < channelsToProcess; ++channel) - { - destBuffers[channel] = info.buffer->getWritePointer (channel, info.startSample); - srcBuffers[channel] = buffer.getReadPointer (channel); - } - - int nextPos = (bufferPos + 1) % bufferSize; - - for (int m = info.numSamples; --m >= 0;) - { - jassert (sampsInBuffer > 0 && nextPos != endOfBufferPos); - - const float alpha = (float) subSampleOffset; - - for (int channel = 0; channel < channelsToProcess; ++channel) - *destBuffers[channel]++ = srcBuffers[channel][bufferPos] - + alpha * (srcBuffers[channel][nextPos] - srcBuffers[channel][bufferPos]); - - subSampleOffset += localRatio; - - while (subSampleOffset >= 1.0) - { - if (++bufferPos >= bufferSize) - bufferPos = 0; - - --sampsInBuffer; - - nextPos = (bufferPos + 1) % bufferSize; - subSampleOffset -= 1.0; - } - } - - if (localRatio < 0.9999) - { - // for up-sampling, apply the filter after transposing.. - for (int i = channelsToProcess; --i >= 0;) - applyFilter (info.buffer->getWritePointer (i, info.startSample), info.numSamples, filterStates[i]); - } - else if (localRatio <= 1.0001 && info.numSamples > 0) - { - // if the filter's not currently being applied, keep it stoked with the last couple of samples to avoid discontinuities - for (int i = channelsToProcess; --i >= 0;) - { - const float* const endOfBuffer = info.buffer->getReadPointer (i, info.startSample + info.numSamples - 1); - FilterState& fs = filterStates[i]; - - if (info.numSamples > 1) - { - fs.y2 = fs.x2 = *(endOfBuffer - 1); - } - else - { - fs.y2 = fs.y1; - fs.x2 = fs.x1; - } - - fs.y1 = fs.x1 = *endOfBuffer; - } - } - - jassert (sampsInBuffer >= 0); -} - -void ResamplingAudioSource::createLowPass (const double frequencyRatio) -{ - const double proportionalRate = (frequencyRatio > 1.0) ? 0.5 / frequencyRatio - : 0.5 * frequencyRatio; - - const double n = 1.0 / std::tan (double_Pi * jmax (0.001, proportionalRate)); - const double nSquared = n * n; - const double c1 = 1.0 / (1.0 + std::sqrt (2.0) * n + nSquared); - - setFilterCoefficients (c1, - c1 * 2.0f, - c1, - 1.0, - c1 * 2.0 * (1.0 - nSquared), - c1 * (1.0 - std::sqrt (2.0) * n + nSquared)); -} - -void ResamplingAudioSource::setFilterCoefficients (double c1, double c2, double c3, double c4, double c5, double c6) -{ - const double a = 1.0 / c4; - - c1 *= a; - c2 *= a; - c3 *= a; - c5 *= a; - c6 *= a; - - coefficients[0] = c1; - coefficients[1] = c2; - coefficients[2] = c3; - coefficients[3] = c4; - coefficients[4] = c5; - coefficients[5] = c6; -} - -void ResamplingAudioSource::resetFilters() -{ - if (filterStates != nullptr) - filterStates.clear ((size_t) numChannels); -} - -void ResamplingAudioSource::applyFilter (float* samples, int num, FilterState& fs) -{ - while (--num >= 0) - { - const double in = *samples; - - double out = coefficients[0] * in - + coefficients[1] * fs.x1 - + coefficients[2] * fs.x2 - - coefficients[4] * fs.y1 - - coefficients[5] * fs.y2; - - #if JUCE_INTEL - if (! (out < -1.0e-8 || out > 1.0e-8)) - out = 0; - #endif - - fs.x2 = fs.x1; - fs.x1 = in; - fs.y2 = fs.y1; - fs.y1 = out; - - *samples++ = (float) out; - } -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h deleted file mode 100755 index 09d27a8..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ResamplingAudioSource.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED -#define JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED - - -//============================================================================== -/** - A type of AudioSource that takes an input source and changes its sample rate. - - @see AudioSource -*/ -class JUCE_API ResamplingAudioSource : public AudioSource -{ -public: - //============================================================================== - /** Creates a ResamplingAudioSource for a given input source. - - @param inputSource the input source to read from - @param deleteInputWhenDeleted if true, the input source will be deleted when - this object is deleted - @param numChannels the number of channels to process - */ - ResamplingAudioSource (AudioSource* inputSource, - bool deleteInputWhenDeleted, - int numChannels = 2); - - /** Destructor. */ - ~ResamplingAudioSource(); - - /** Changes the resampling ratio. - - (This value can be changed at any time, even while the source is running). - - @param samplesInPerOutputSample if set to 1.0, the input is passed through; higher - values will speed it up; lower values will slow it - down. The ratio must be greater than 0 - */ - void setResamplingRatio (double samplesInPerOutputSample); - - /** Returns the current resampling ratio. - - This is the value that was set by setResamplingRatio(). - */ - double getResamplingRatio() const noexcept { return ratio; } - - /** Clears any buffers and filters that the resampler is using. */ - void flushBuffers(); - - //============================================================================== - void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; - void releaseResources() override; - void getNextAudioBlock (const AudioSourceChannelInfo&) override; - -private: - //============================================================================== - OptionalScopedPointer input; - double ratio, lastRatio; - AudioSampleBuffer buffer; - int bufferPos, sampsInBuffer; - double subSampleOffset; - double coefficients[6]; - SpinLock ratioLock; - const int numChannels; - HeapBlock destBuffers; - HeapBlock srcBuffers; - - void setFilterCoefficients (double c1, double c2, double c3, double c4, double c5, double c6); - void createLowPass (double proportionalRate); - - struct FilterState - { - double x1, x2, y1, y2; - }; - - HeapBlock filterStates; - void resetFilters(); - - void applyFilter (float* samples, int num, FilterState& fs); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ResamplingAudioSource) -}; - - -#endif // JUCE_RESAMPLINGAUDIOSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp deleted file mode 100755 index d630075..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ReverbAudioSource::ReverbAudioSource (AudioSource* const inputSource, const bool deleteInputWhenDeleted) - : input (inputSource, deleteInputWhenDeleted), - bypass (false) -{ - jassert (inputSource != nullptr); -} - -ReverbAudioSource::~ReverbAudioSource() {} - -void ReverbAudioSource::prepareToPlay (int samplesPerBlockExpected, double sampleRate) -{ - const ScopedLock sl (lock); - input->prepareToPlay (samplesPerBlockExpected, sampleRate); - reverb.setSampleRate (sampleRate); -} - -void ReverbAudioSource::releaseResources() {} - -void ReverbAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& bufferToFill) -{ - const ScopedLock sl (lock); - - input->getNextAudioBlock (bufferToFill); - - if (! bypass) - { - float* const firstChannel = bufferToFill.buffer->getWritePointer (0, bufferToFill.startSample); - - if (bufferToFill.buffer->getNumChannels() > 1) - { - reverb.processStereo (firstChannel, - bufferToFill.buffer->getWritePointer (1, bufferToFill.startSample), - bufferToFill.numSamples); - } - else - { - reverb.processMono (firstChannel, bufferToFill.numSamples); - } - } -} - -void ReverbAudioSource::setParameters (const Reverb::Parameters& newParams) -{ - const ScopedLock sl (lock); - reverb.setParameters (newParams); -} - -void ReverbAudioSource::setBypassed (bool b) noexcept -{ - if (bypass != b) - { - const ScopedLock sl (lock); - bypass = b; - reverb.reset(); - } -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h deleted file mode 100755 index 6b90e18..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ReverbAudioSource.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_REVERBAUDIOSOURCE_H_INCLUDED -#define JUCE_REVERBAUDIOSOURCE_H_INCLUDED - - -//============================================================================== -/** - An AudioSource that uses the Reverb class to apply a reverb to another AudioSource. - - @see Reverb -*/ -class JUCE_API ReverbAudioSource : public AudioSource -{ -public: - /** Creates a ReverbAudioSource to process a given input source. - - @param inputSource the input source to read from - this must not be null - @param deleteInputWhenDeleted if true, the input source will be deleted when - this object is deleted - */ - ReverbAudioSource (AudioSource* inputSource, - bool deleteInputWhenDeleted); - - /** Destructor. */ - ~ReverbAudioSource(); - - //============================================================================== - /** Returns the parameters from the reverb. */ - const Reverb::Parameters& getParameters() const noexcept { return reverb.getParameters(); } - - /** Changes the reverb's parameters. */ - void setParameters (const Reverb::Parameters& newParams); - - void setBypassed (bool isBypassed) noexcept; - bool isBypassed() const noexcept { return bypass; } - - //============================================================================== - void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; - void releaseResources() override; - void getNextAudioBlock (const AudioSourceChannelInfo&) override; - -private: - //============================================================================== - CriticalSection lock; - OptionalScopedPointer input; - Reverb reverb; - volatile bool bypass; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReverbAudioSource) -}; - - -#endif // JUCE_REVERBAUDIOSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp deleted file mode 100755 index a0e04ef..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ToneGeneratorAudioSource::ToneGeneratorAudioSource() - : frequency (1000.0), - sampleRate (44100.0), - currentPhase (0.0), - phasePerSample (0.0), - amplitude (0.5f) -{ -} - -ToneGeneratorAudioSource::~ToneGeneratorAudioSource() -{ -} - -//============================================================================== -void ToneGeneratorAudioSource::setAmplitude (const float newAmplitude) -{ - amplitude = newAmplitude; -} - -void ToneGeneratorAudioSource::setFrequency (const double newFrequencyHz) -{ - frequency = newFrequencyHz; - phasePerSample = 0.0; -} - -//============================================================================== -void ToneGeneratorAudioSource::prepareToPlay (int /*samplesPerBlockExpected*/, double rate) -{ - currentPhase = 0.0; - phasePerSample = 0.0; - sampleRate = rate; -} - -void ToneGeneratorAudioSource::releaseResources() -{ -} - -void ToneGeneratorAudioSource::getNextAudioBlock (const AudioSourceChannelInfo& info) -{ - if (phasePerSample == 0.0) - phasePerSample = double_Pi * 2.0 / (sampleRate / frequency); - - for (int i = 0; i < info.numSamples; ++i) - { - const float sample = amplitude * (float) std::sin (currentPhase); - currentPhase += phasePerSample; - - for (int j = info.buffer->getNumChannels(); --j >= 0;) - info.buffer->setSample (j, info.startSample + i, sample); - } -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h b/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h deleted file mode 100755 index 5d09ad8..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/sources/juce_ToneGeneratorAudioSource.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_TONEGENERATORAUDIOSOURCE_H_INCLUDED -#define JUCE_TONEGENERATORAUDIOSOURCE_H_INCLUDED - - -//============================================================================== -/** - A simple AudioSource that generates a sine wave. - -*/ -class JUCE_API ToneGeneratorAudioSource : public AudioSource -{ -public: - //============================================================================== - /** Creates a ToneGeneratorAudioSource. */ - ToneGeneratorAudioSource(); - - /** Destructor. */ - ~ToneGeneratorAudioSource(); - - //============================================================================== - /** Sets the signal's amplitude. */ - void setAmplitude (float newAmplitude); - - /** Sets the signal's frequency. */ - void setFrequency (double newFrequencyHz); - - - //============================================================================== - /** Implementation of the AudioSource method. */ - void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; - - /** Implementation of the AudioSource method. */ - void releaseResources() override; - - /** Implementation of the AudioSource method. */ - void getNextAudioBlock (const AudioSourceChannelInfo&) override; - - -private: - //============================================================================== - double frequency, sampleRate; - double currentPhase, phasePerSample; - float amplitude; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToneGeneratorAudioSource) -}; - - -#endif // JUCE_TONEGENERATORAUDIOSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp b/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp deleted file mode 100755 index 45f2d66..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.cpp +++ /dev/null @@ -1,506 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -SynthesiserSound::SynthesiserSound() {} -SynthesiserSound::~SynthesiserSound() {} - -//============================================================================== -SynthesiserVoice::SynthesiserVoice() - : currentSampleRate (44100.0), - currentlyPlayingNote (-1), - currentPlayingMidiChannel (0), - noteOnTime (0), - keyIsDown (false), - sostenutoPedalDown (false) -{ -} - -SynthesiserVoice::~SynthesiserVoice() -{ -} - -bool SynthesiserVoice::isPlayingChannel (const int midiChannel) const -{ - return currentPlayingMidiChannel == midiChannel; -} - -void SynthesiserVoice::setCurrentPlaybackSampleRate (const double newRate) -{ - currentSampleRate = newRate; -} - -bool SynthesiserVoice::isVoiceActive() const -{ - return getCurrentlyPlayingNote() >= 0; -} - -void SynthesiserVoice::clearCurrentNote() -{ - currentlyPlayingNote = -1; - currentlyPlayingSound = nullptr; - currentPlayingMidiChannel = 0; -} - -void SynthesiserVoice::aftertouchChanged (int) {} - -bool SynthesiserVoice::wasStartedBefore (const SynthesiserVoice& other) const noexcept -{ - return noteOnTime < other.noteOnTime; -} - -//============================================================================== -Synthesiser::Synthesiser() - : sampleRate (0), - lastNoteOnCounter (0), - shouldStealNotes (true) -{ - for (int i = 0; i < numElementsInArray (lastPitchWheelValues); ++i) - lastPitchWheelValues[i] = 0x2000; -} - -Synthesiser::~Synthesiser() -{ -} - -//============================================================================== -SynthesiserVoice* Synthesiser::getVoice (const int index) const -{ - const ScopedLock sl (lock); - return voices [index]; -} - -void Synthesiser::clearVoices() -{ - const ScopedLock sl (lock); - voices.clear(); -} - -SynthesiserVoice* Synthesiser::addVoice (SynthesiserVoice* const newVoice) -{ - const ScopedLock sl (lock); - return voices.add (newVoice); -} - -void Synthesiser::removeVoice (const int index) -{ - const ScopedLock sl (lock); - voices.remove (index); -} - -void Synthesiser::clearSounds() -{ - const ScopedLock sl (lock); - sounds.clear(); -} - -SynthesiserSound* Synthesiser::addSound (const SynthesiserSound::Ptr& newSound) -{ - const ScopedLock sl (lock); - return sounds.add (newSound); -} - -void Synthesiser::removeSound (const int index) -{ - const ScopedLock sl (lock); - sounds.remove (index); -} - -void Synthesiser::setNoteStealingEnabled (const bool shouldSteal) -{ - shouldStealNotes = shouldSteal; -} - -//============================================================================== -void Synthesiser::setCurrentPlaybackSampleRate (const double newRate) -{ - if (sampleRate != newRate) - { - const ScopedLock sl (lock); - - allNotesOff (0, false); - - sampleRate = newRate; - - for (int i = voices.size(); --i >= 0;) - voices.getUnchecked (i)->setCurrentPlaybackSampleRate (newRate); - } -} - -void Synthesiser::renderNextBlock (AudioSampleBuffer& outputBuffer, const MidiBuffer& midiData, - int startSample, int numSamples) -{ - // must set the sample rate before using this! - jassert (sampleRate != 0); - - const ScopedLock sl (lock); - - MidiBuffer::Iterator midiIterator (midiData); - midiIterator.setNextSamplePosition (startSample); - MidiMessage m (0xf4, 0.0); - - while (numSamples > 0) - { - int midiEventPos; - const bool useEvent = midiIterator.getNextEvent (m, midiEventPos) - && midiEventPos < startSample + numSamples; - - const int numThisTime = useEvent ? midiEventPos - startSample - : numSamples; - - if (numThisTime > 0) - renderVoices (outputBuffer, startSample, numThisTime); - - if (useEvent) - handleMidiEvent (m); - - startSample += numThisTime; - numSamples -= numThisTime; - } -} - -void Synthesiser::renderVoices (AudioSampleBuffer& buffer, int startSample, int numSamples) -{ - for (int i = voices.size(); --i >= 0;) - voices.getUnchecked (i)->renderNextBlock (buffer, startSample, numSamples); -} - -void Synthesiser::handleMidiEvent (const MidiMessage& m) -{ - if (m.isNoteOn()) - { - noteOn (m.getChannel(), m.getNoteNumber(), m.getFloatVelocity()); - } - else if (m.isNoteOff()) - { - noteOff (m.getChannel(), m.getNoteNumber(), m.getFloatVelocity(), true); - } - else if (m.isAllNotesOff() || m.isAllSoundOff()) - { - allNotesOff (m.getChannel(), true); - } - else if (m.isPitchWheel()) - { - const int channel = m.getChannel(); - const int wheelPos = m.getPitchWheelValue(); - lastPitchWheelValues [channel - 1] = wheelPos; - - handlePitchWheel (channel, wheelPos); - } - else if (m.isAftertouch()) - { - handleAftertouch (m.getChannel(), m.getNoteNumber(), m.getAfterTouchValue()); - } - else if (m.isController()) - { - handleController (m.getChannel(), m.getControllerNumber(), m.getControllerValue()); - } -} - -//============================================================================== -void Synthesiser::noteOn (const int midiChannel, - const int midiNoteNumber, - const float velocity) -{ - const ScopedLock sl (lock); - - for (int i = sounds.size(); --i >= 0;) - { - SynthesiserSound* const sound = sounds.getUnchecked(i); - - if (sound->appliesToNote (midiNoteNumber) - && sound->appliesToChannel (midiChannel)) - { - // If hitting a note that's still ringing, stop it first (it could be - // still playing because of the sustain or sostenuto pedal). - for (int j = voices.size(); --j >= 0;) - { - SynthesiserVoice* const voice = voices.getUnchecked (j); - - if (voice->getCurrentlyPlayingNote() == midiNoteNumber - && voice->isPlayingChannel (midiChannel)) - stopVoice (voice, 1.0f, true); - } - - startVoice (findFreeVoice (sound, midiChannel, midiNoteNumber, shouldStealNotes), - sound, midiChannel, midiNoteNumber, velocity); - } - } -} - -void Synthesiser::startVoice (SynthesiserVoice* const voice, - SynthesiserSound* const sound, - const int midiChannel, - const int midiNoteNumber, - const float velocity) -{ - if (voice != nullptr && sound != nullptr) - { - if (voice->currentlyPlayingSound != nullptr) - voice->stopNote (0.0f, false); - - voice->currentlyPlayingNote = midiNoteNumber; - voice->currentPlayingMidiChannel = midiChannel; - voice->noteOnTime = ++lastNoteOnCounter; - voice->currentlyPlayingSound = sound; - voice->keyIsDown = true; - voice->sostenutoPedalDown = false; - - voice->startNote (midiNoteNumber, velocity, sound, - lastPitchWheelValues [midiChannel - 1]); - } -} - -void Synthesiser::stopVoice (SynthesiserVoice* voice, float velocity, const bool allowTailOff) -{ - jassert (voice != nullptr); - - voice->stopNote (velocity, allowTailOff); - - // the subclass MUST call clearCurrentNote() if it's not tailing off! RTFM for stopNote()! - jassert (allowTailOff || (voice->getCurrentlyPlayingNote() < 0 && voice->getCurrentlyPlayingSound() == 0)); -} - -void Synthesiser::noteOff (const int midiChannel, - const int midiNoteNumber, - const float velocity, - const bool allowTailOff) -{ - const ScopedLock sl (lock); - - for (int i = voices.size(); --i >= 0;) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if (voice->getCurrentlyPlayingNote() == midiNoteNumber - && voice->isPlayingChannel (midiChannel)) - { - if (SynthesiserSound* const sound = voice->getCurrentlyPlayingSound()) - { - if (sound->appliesToNote (midiNoteNumber) - && sound->appliesToChannel (midiChannel)) - { - voice->keyIsDown = false; - - if (! (sustainPedalsDown [midiChannel] || voice->sostenutoPedalDown)) - stopVoice (voice, velocity, allowTailOff); - } - } - } - } -} - -void Synthesiser::allNotesOff (const int midiChannel, const bool allowTailOff) -{ - const ScopedLock sl (lock); - - for (int i = voices.size(); --i >= 0;) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if (midiChannel <= 0 || voice->isPlayingChannel (midiChannel)) - voice->stopNote (1.0f, allowTailOff); - } - - sustainPedalsDown.clear(); -} - -void Synthesiser::handlePitchWheel (const int midiChannel, const int wheelValue) -{ - const ScopedLock sl (lock); - - for (int i = voices.size(); --i >= 0;) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if (midiChannel <= 0 || voice->isPlayingChannel (midiChannel)) - voice->pitchWheelMoved (wheelValue); - } -} - -void Synthesiser::handleController (const int midiChannel, - const int controllerNumber, - const int controllerValue) -{ - switch (controllerNumber) - { - case 0x40: handleSustainPedal (midiChannel, controllerValue >= 64); break; - case 0x42: handleSostenutoPedal (midiChannel, controllerValue >= 64); break; - case 0x43: handleSoftPedal (midiChannel, controllerValue >= 64); break; - default: break; - } - - const ScopedLock sl (lock); - - for (int i = voices.size(); --i >= 0;) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if (midiChannel <= 0 || voice->isPlayingChannel (midiChannel)) - voice->controllerMoved (controllerNumber, controllerValue); - } -} - -void Synthesiser::handleAftertouch (int midiChannel, int midiNoteNumber, int aftertouchValue) -{ - const ScopedLock sl (lock); - - for (int i = voices.size(); --i >= 0;) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if (voice->getCurrentlyPlayingNote() == midiNoteNumber - && (midiChannel <= 0 || voice->isPlayingChannel (midiChannel))) - voice->aftertouchChanged (aftertouchValue); - } -} - -void Synthesiser::handleSustainPedal (int midiChannel, bool isDown) -{ - jassert (midiChannel > 0 && midiChannel <= 16); - const ScopedLock sl (lock); - - if (isDown) - { - sustainPedalsDown.setBit (midiChannel); - } - else - { - for (int i = voices.size(); --i >= 0;) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if (voice->isPlayingChannel (midiChannel) && ! voice->keyIsDown) - stopVoice (voice, 1.0f, true); - } - - sustainPedalsDown.clearBit (midiChannel); - } -} - -void Synthesiser::handleSostenutoPedal (int midiChannel, bool isDown) -{ - jassert (midiChannel > 0 && midiChannel <= 16); - const ScopedLock sl (lock); - - for (int i = voices.size(); --i >= 0;) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if (voice->isPlayingChannel (midiChannel)) - { - if (isDown) - voice->sostenutoPedalDown = true; - else if (voice->sostenutoPedalDown) - stopVoice (voice, 1.0f, true); - } - } -} - -void Synthesiser::handleSoftPedal (int midiChannel, bool /*isDown*/) -{ - (void) midiChannel; - jassert (midiChannel > 0 && midiChannel <= 16); -} - -//============================================================================== -SynthesiserVoice* Synthesiser::findFreeVoice (SynthesiserSound* soundToPlay, - int midiChannel, int midiNoteNumber, - const bool stealIfNoneAvailable) const -{ - const ScopedLock sl (lock); - - for (int i = 0; i < voices.size(); ++i) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if ((! voice->isVoiceActive()) && voice->canPlaySound (soundToPlay)) - return voice; - } - - if (stealIfNoneAvailable) - return findVoiceToSteal (soundToPlay, midiChannel, midiNoteNumber); - - return nullptr; -} - -struct VoiceAgeSorter -{ - static int compareElements (SynthesiserVoice* v1, SynthesiserVoice* v2) noexcept - { - return v1->wasStartedBefore (*v2) ? -1 : (v2->wasStartedBefore (*v1) ? 1 : 0); - } -}; - -SynthesiserVoice* Synthesiser::findVoiceToSteal (SynthesiserSound* soundToPlay, - int /*midiChannel*/, int midiNoteNumber) const -{ - SynthesiserVoice* bottom = nullptr; - SynthesiserVoice* top = nullptr; - - // this is a list of voices we can steal, sorted by how long they've been running - Array usableVoices; - usableVoices.ensureStorageAllocated (voices.size()); - - for (int i = 0; i < voices.size(); ++i) - { - SynthesiserVoice* const voice = voices.getUnchecked (i); - - if (voice->canPlaySound (soundToPlay)) - { - VoiceAgeSorter sorter; - usableVoices.addSorted (sorter, voice); - - const int note = voice->getCurrentlyPlayingNote(); - - if (bottom == nullptr || note < bottom->getCurrentlyPlayingNote()) - bottom = voice; - - if (top == nullptr || note > top->getCurrentlyPlayingNote()) - top = voice; - } - } - - const int stealableVoiceRange = usableVoices.size() - 6; - - // The oldest note that's playing with the target pitch playing is ideal.. - for (int i = 0; i < stealableVoiceRange; ++i) - { - SynthesiserVoice* const voice = usableVoices.getUnchecked (i); - - if (voice->getCurrentlyPlayingNote() == midiNoteNumber) - return voice; - } - - // ..otherwise, look for the oldest note that isn't the top or bottom note.. - for (int i = 0; i < stealableVoiceRange; ++i) - { - SynthesiserVoice* const voice = usableVoices.getUnchecked (i); - - if (voice != bottom && voice != top) - return voice; - } - - // ..otherwise, there's only one or two voices to choose from - we'll return the oldest one.. - return usableVoices.getFirst(); -} diff --git a/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h b/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h deleted file mode 100755 index 66f0960..0000000 --- a/JuceLibraryCode/modules/juce_audio_basics/synthesisers/juce_Synthesiser.h +++ /dev/null @@ -1,557 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_SYNTHESISER_H_INCLUDED -#define JUCE_SYNTHESISER_H_INCLUDED - - -//============================================================================== -/** - Describes one of the sounds that a Synthesiser can play. - - A synthesiser can contain one or more sounds, and a sound can choose which - midi notes and channels can trigger it. - - The SynthesiserSound is a passive class that just describes what the sound is - - the actual audio rendering for a sound is done by a SynthesiserVoice. This allows - more than one SynthesiserVoice to play the same sound at the same time. - - @see Synthesiser, SynthesiserVoice -*/ -class JUCE_API SynthesiserSound : public ReferenceCountedObject -{ -protected: - //============================================================================== - SynthesiserSound(); - -public: - /** Destructor. */ - virtual ~SynthesiserSound(); - - //============================================================================== - /** Returns true if this sound should be played when a given midi note is pressed. - - The Synthesiser will use this information when deciding which sounds to trigger - for a given note. - */ - virtual bool appliesToNote (int midiNoteNumber) = 0; - - /** Returns true if the sound should be triggered by midi events on a given channel. - - The Synthesiser will use this information when deciding which sounds to trigger - for a given note. - */ - virtual bool appliesToChannel (int midiChannel) = 0; - - /** The class is reference-counted, so this is a handy pointer class for it. */ - typedef ReferenceCountedObjectPtr Ptr; - - -private: - //============================================================================== - JUCE_LEAK_DETECTOR (SynthesiserSound) -}; - - -//============================================================================== -/** - Represents a voice that a Synthesiser can use to play a SynthesiserSound. - - A voice plays a single sound at a time, and a synthesiser holds an array of - voices so that it can play polyphonically. - - @see Synthesiser, SynthesiserSound -*/ -class JUCE_API SynthesiserVoice -{ -public: - //============================================================================== - /** Creates a voice. */ - SynthesiserVoice(); - - /** Destructor. */ - virtual ~SynthesiserVoice(); - - //============================================================================== - /** Returns the midi note that this voice is currently playing. - Returns a value less than 0 if no note is playing. - */ - int getCurrentlyPlayingNote() const noexcept { return currentlyPlayingNote; } - - /** Returns the sound that this voice is currently playing. - Returns nullptr if it's not playing. - */ - SynthesiserSound::Ptr getCurrentlyPlayingSound() const noexcept { return currentlyPlayingSound; } - - /** Must return true if this voice object is capable of playing the given sound. - - If there are different classes of sound, and different classes of voice, a voice can - choose which ones it wants to take on. - - A typical implementation of this method may just return true if there's only one type - of voice and sound, or it might check the type of the sound object passed-in and - see if it's one that it understands. - */ - virtual bool canPlaySound (SynthesiserSound*) = 0; - - /** Called to start a new note. - This will be called during the rendering callback, so must be fast and thread-safe. - */ - virtual void startNote (int midiNoteNumber, - float velocity, - SynthesiserSound* sound, - int currentPitchWheelPosition) = 0; - - /** Called to stop a note. - - This will be called during the rendering callback, so must be fast and thread-safe. - - The velocity indicates how quickly the note was released - 0 is slowly, 1 is quickly. - - If allowTailOff is false or the voice doesn't want to tail-off, then it must stop all - sound immediately, and must call clearCurrentNote() to reset the state of this voice - and allow the synth to reassign it another sound. - - If allowTailOff is true and the voice decides to do a tail-off, then it's allowed to - begin fading out its sound, and it can stop playing until it's finished. As soon as it - finishes playing (during the rendering callback), it must make sure that it calls - clearCurrentNote(). - */ - virtual void stopNote (float velocity, bool allowTailOff) = 0; - - /** Returns true if this voice is currently busy playing a sound. - By default this just checks the getCurrentlyPlayingNote() value, but can - be overridden for more advanced checking. - */ - virtual bool isVoiceActive() const; - - /** Called to let the voice know that the pitch wheel has been moved. - This will be called during the rendering callback, so must be fast and thread-safe. - */ - virtual void pitchWheelMoved (int newPitchWheelValue) = 0; - - /** Called to let the voice know that a midi controller has been moved. - This will be called during the rendering callback, so must be fast and thread-safe. - */ - virtual void controllerMoved (int controllerNumber, int newControllerValue) = 0; - - /** Called to let the voice know that the aftertouch has changed. - This will be called during the rendering callback, so must be fast and thread-safe. - */ - virtual void aftertouchChanged (int newAftertouchValue); - - //============================================================================== - /** Renders the next block of data for this voice. - - The output audio data must be added to the current contents of the buffer provided. - Only the region of the buffer between startSample and (startSample + numSamples) - should be altered by this method. - - If the voice is currently silent, it should just return without doing anything. - - If the sound that the voice is playing finishes during the course of this rendered - block, it must call clearCurrentNote(), to tell the synthesiser that it has finished. - - The size of the blocks that are rendered can change each time it is called, and may - involve rendering as little as 1 sample at a time. In between rendering callbacks, - the voice's methods will be called to tell it about note and controller events. - */ - virtual void renderNextBlock (AudioSampleBuffer& outputBuffer, - int startSample, - int numSamples) = 0; - - /** Changes the voice's reference sample rate. - - The rate is set so that subclasses know the output rate and can set their pitch - accordingly. - - This method is called by the synth, and subclasses can access the current rate with - the currentSampleRate member. - */ - virtual void setCurrentPlaybackSampleRate (double newRate); - - /** Returns true if the voice is currently playing a sound which is mapped to the given - midi channel. - - If it's not currently playing, this will return false. - */ - virtual bool isPlayingChannel (int midiChannel) const; - - /** Returns the current target sample rate at which rendering is being done. - Subclasses may need to know this so that they can pitch things correctly. - */ - double getSampleRate() const noexcept { return currentSampleRate; } - - /** Returns true if the key that triggered this voice is still held down. - Note that the voice may still be playing after the key was released (e.g because the - sostenuto pedal is down). - */ - bool isKeyDown() const noexcept { return keyIsDown; } - - /** Returns true if the sostenuto pedal is currently active for this voice. */ - bool isSostenutoPedalDown() const noexcept { return sostenutoPedalDown; } - - /** Returns true if this voice started playing its current note before the other voice did. */ - bool wasStartedBefore (const SynthesiserVoice& other) const noexcept; - -protected: - /** Resets the state of this voice after a sound has finished playing. - - The subclass must call this when it finishes playing a note and becomes available - to play new ones. - - It must either call it in the stopNote() method, or if the voice is tailing off, - then it should call it later during the renderNextBlock method, as soon as it - finishes its tail-off. - - It can also be called at any time during the render callback if the sound happens - to have finished, e.g. if it's playing a sample and the sample finishes. - */ - void clearCurrentNote(); - - -private: - //============================================================================== - friend class Synthesiser; - - double currentSampleRate; - int currentlyPlayingNote, currentPlayingMidiChannel; - uint32 noteOnTime; - SynthesiserSound::Ptr currentlyPlayingSound; - bool keyIsDown, sostenutoPedalDown; - - #if JUCE_CATCH_DEPRECATED_CODE_MISUSE - // Note the new parameters for this method. - virtual int stopNote (bool) { return 0; } - #endif - - JUCE_LEAK_DETECTOR (SynthesiserVoice) -}; - - -//============================================================================== -/** - Base class for a musical device that can play sounds. - - To create a synthesiser, you'll need to create a subclass of SynthesiserSound - to describe each sound available to your synth, and a subclass of SynthesiserVoice - which can play back one of these sounds. - - Then you can use the addVoice() and addSound() methods to give the synthesiser a - set of sounds, and a set of voices it can use to play them. If you only give it - one voice it will be monophonic - the more voices it has, the more polyphony it'll - have available. - - Then repeatedly call the renderNextBlock() method to produce the audio. Any midi - events that go in will be scanned for note on/off messages, and these are used to - start and stop the voices playing the appropriate sounds. - - While it's playing, you can also cause notes to be triggered by calling the noteOn(), - noteOff() and other controller methods. - - Before rendering, be sure to call the setCurrentPlaybackSampleRate() to tell it - what the target playback rate is. This value is passed on to the voices so that - they can pitch their output correctly. -*/ -class JUCE_API Synthesiser -{ -public: - //============================================================================== - /** Creates a new synthesiser. - You'll need to add some sounds and voices before it'll make any sound. - */ - Synthesiser(); - - /** Destructor. */ - virtual ~Synthesiser(); - - //============================================================================== - /** Deletes all voices. */ - void clearVoices(); - - /** Returns the number of voices that have been added. */ - int getNumVoices() const noexcept { return voices.size(); } - - /** Returns one of the voices that have been added. */ - SynthesiserVoice* getVoice (int index) const; - - /** Adds a new voice to the synth. - - All the voices should be the same class of object and are treated equally. - - The object passed in will be managed by the synthesiser, which will delete - it later on when no longer needed. The caller should not retain a pointer to the - voice. - */ - SynthesiserVoice* addVoice (SynthesiserVoice* newVoice); - - /** Deletes one of the voices. */ - void removeVoice (int index); - - //============================================================================== - /** Deletes all sounds. */ - void clearSounds(); - - /** Returns the number of sounds that have been added to the synth. */ - int getNumSounds() const noexcept { return sounds.size(); } - - /** Returns one of the sounds. */ - SynthesiserSound* getSound (int index) const noexcept { return sounds [index]; } - - /** Adds a new sound to the synthesiser. - - The object passed in is reference counted, so will be deleted when the - synthesiser and all voices are no longer using it. - */ - SynthesiserSound* addSound (const SynthesiserSound::Ptr& newSound); - - /** Removes and deletes one of the sounds. */ - void removeSound (int index); - - //============================================================================== - /** If set to true, then the synth will try to take over an existing voice if - it runs out and needs to play another note. - - The value of this boolean is passed into findFreeVoice(), so the result will - depend on the implementation of this method. - */ - void setNoteStealingEnabled (bool shouldStealNotes); - - /** Returns true if note-stealing is enabled. - @see setNoteStealingEnabled - */ - bool isNoteStealingEnabled() const noexcept { return shouldStealNotes; } - - //============================================================================== - /** Triggers a note-on event. - - The default method here will find all the sounds that want to be triggered by - this note/channel. For each sound, it'll try to find a free voice, and use the - voice to start playing the sound. - - Subclasses might want to override this if they need a more complex algorithm. - - This method will be called automatically according to the midi data passed into - renderNextBlock(), but may be called explicitly too. - - The midiChannel parameter is the channel, between 1 and 16 inclusive. - */ - virtual void noteOn (int midiChannel, - int midiNoteNumber, - float velocity); - - /** Triggers a note-off event. - - This will turn off any voices that are playing a sound for the given note/channel. - - If allowTailOff is true, the voices will be allowed to fade out the notes gracefully - (if they can do). If this is false, the notes will all be cut off immediately. - - This method will be called automatically according to the midi data passed into - renderNextBlock(), but may be called explicitly too. - - The midiChannel parameter is the channel, between 1 and 16 inclusive. - */ - virtual void noteOff (int midiChannel, - int midiNoteNumber, - float velocity, - bool allowTailOff); - - /** Turns off all notes. - - This will turn off any voices that are playing a sound on the given midi channel. - - If midiChannel is 0 or less, then all voices will be turned off, regardless of - which channel they're playing. Otherwise it represents a valid midi channel, from - 1 to 16 inclusive. - - If allowTailOff is true, the voices will be allowed to fade out the notes gracefully - (if they can do). If this is false, the notes will all be cut off immediately. - - This method will be called automatically according to the midi data passed into - renderNextBlock(), but may be called explicitly too. - */ - virtual void allNotesOff (int midiChannel, - bool allowTailOff); - - /** Sends a pitch-wheel message to any active voices. - - This will send a pitch-wheel message to any voices that are playing sounds on - the given midi channel. - - This method will be called automatically according to the midi data passed into - renderNextBlock(), but may be called explicitly too. - - @param midiChannel the midi channel, from 1 to 16 inclusive - @param wheelValue the wheel position, from 0 to 0x3fff, as returned by MidiMessage::getPitchWheelValue() - */ - virtual void handlePitchWheel (int midiChannel, - int wheelValue); - - /** Sends a midi controller message to any active voices. - - This will send a midi controller message to any voices that are playing sounds on - the given midi channel. - - This method will be called automatically according to the midi data passed into - renderNextBlock(), but may be called explicitly too. - - @param midiChannel the midi channel, from 1 to 16 inclusive - @param controllerNumber the midi controller type, as returned by MidiMessage::getControllerNumber() - @param controllerValue the midi controller value, between 0 and 127, as returned by MidiMessage::getControllerValue() - */ - virtual void handleController (int midiChannel, - int controllerNumber, - int controllerValue); - - /** Sends an aftertouch message. - - This will send an aftertouch message to any voices that are playing sounds on - the given midi channel and note number. - - This method will be called automatically according to the midi data passed into - renderNextBlock(), but may be called explicitly too. - - @param midiChannel the midi channel, from 1 to 16 inclusive - @param midiNoteNumber the midi note number, 0 to 127 - @param aftertouchValue the aftertouch value, between 0 and 127, - as returned by MidiMessage::getAftertouchValue() - */ - virtual void handleAftertouch (int midiChannel, int midiNoteNumber, int aftertouchValue); - - /** Handles a sustain pedal event. */ - virtual void handleSustainPedal (int midiChannel, bool isDown); - - /** Handles a sostenuto pedal event. */ - virtual void handleSostenutoPedal (int midiChannel, bool isDown); - - /** Can be overridden to handle soft pedal events. */ - virtual void handleSoftPedal (int midiChannel, bool isDown); - - //============================================================================== - /** Tells the synthesiser what the sample rate is for the audio it's being used to render. - - This value is propagated to the voices so that they can use it to render the correct - pitches. - */ - virtual void setCurrentPlaybackSampleRate (double sampleRate); - - /** Creates the next block of audio output. - - This will process the next numSamples of data from all the voices, and add that output - to the audio block supplied, starting from the offset specified. Note that the - data will be added to the current contents of the buffer, so you should clear it - before calling this method if necessary. - - The midi events in the inputMidi buffer are parsed for note and controller events, - and these are used to trigger the voices. Note that the startSample offset applies - both to the audio output buffer and the midi input buffer, so any midi events - with timestamps outside the specified region will be ignored. - */ - void renderNextBlock (AudioSampleBuffer& outputAudio, - const MidiBuffer& inputMidi, - int startSample, - int numSamples); - - /** Returns the current target sample rate at which rendering is being done. - Subclasses may need to know this so that they can pitch things correctly. - */ - double getSampleRate() const noexcept { return sampleRate; } - -protected: - //============================================================================== - /** This is used to control access to the rendering callback and the note trigger methods. */ - CriticalSection lock; - - OwnedArray voices; - ReferenceCountedArray sounds; - - /** The last pitch-wheel values for each midi channel. */ - int lastPitchWheelValues [16]; - - /** Renders the voices for the given range. - By default this just calls renderNextBlock() on each voice, but you may need - to override it to handle custom cases. - */ - virtual void renderVoices (AudioSampleBuffer& outputAudio, - int startSample, int numSamples); - - /** Searches through the voices to find one that's not currently playing, and - which can play the given sound. - - Returns nullptr if all voices are busy and stealing isn't enabled. - - To implement a custom note-stealing algorithm, you can either override this - method, or (preferably) override findVoiceToSteal(). - */ - virtual SynthesiserVoice* findFreeVoice (SynthesiserSound* soundToPlay, - int midiChannel, - int midiNoteNumber, - bool stealIfNoneAvailable) const; - - /** Chooses a voice that is most suitable for being re-used. - The default method will attempt to find the oldest voice that isn't the - bottom or top note being played. If that's not suitable for your synth, - you can override this method and do something more cunning instead. - */ - virtual SynthesiserVoice* findVoiceToSteal (SynthesiserSound* soundToPlay, - int midiChannel, - int midiNoteNumber) const; - - /** Starts a specified voice playing a particular sound. - - You'll probably never need to call this, it's used internally by noteOn(), but - may be needed by subclasses for custom behaviours. - */ - void startVoice (SynthesiserVoice* voice, - SynthesiserSound* sound, - int midiChannel, - int midiNoteNumber, - float velocity); - - /** Can be overridden to do custom handling of incoming midi events. */ - virtual void handleMidiEvent (const MidiMessage&); - -private: - //============================================================================== - double sampleRate; - uint32 lastNoteOnCounter; - bool shouldStealNotes; - BigInteger sustainPedalsDown; - - void stopVoice (SynthesiserVoice*, float velocity, bool allowTailOff); - - #if JUCE_CATCH_DEPRECATED_CODE_MISUSE - // Note the new parameters for these methods. - virtual int findFreeVoice (const bool) const { return 0; } - virtual int noteOff (int, int, int) { return 0; } - virtual int findFreeVoice (SynthesiserSound*, const bool) { return 0; } - virtual int findVoiceToSteal (SynthesiserSound*) const { return 0; } - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Synthesiser) -}; - - -#endif // JUCE_SYNTHESISER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h b/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h deleted file mode 100755 index 88b1ef2..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDBurner.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOCDBURNER_H_INCLUDED -#define JUCE_AUDIOCDBURNER_H_INCLUDED - -#if JUCE_USE_CDBURNER || DOXYGEN - - -//============================================================================== -/** -*/ -class AudioCDBurner : public ChangeBroadcaster -{ -public: - //============================================================================== - /** Returns a list of available optical drives. - - Use openDevice() to open one of the items from this list. - */ - static StringArray findAvailableDevices(); - - /** Tries to open one of the optical drives. - - The deviceIndex is an index into the array returned by findAvailableDevices(). - */ - static AudioCDBurner* openDevice (const int deviceIndex); - - /** Destructor. */ - ~AudioCDBurner(); - - //============================================================================== - enum DiskState - { - unknown, /**< An error condition, if the device isn't responding. */ - trayOpen, /**< The drive is currently open. Note that a slot-loading drive - may seem to be permanently open. */ - noDisc, /**< The drive has no disk in it. */ - writableDiskPresent, /**< The drive contains a writeable disk. */ - readOnlyDiskPresent /**< The drive contains a read-only disk. */ - }; - - /** Returns the current status of the device. - - To get informed when the drive's status changes, attach a ChangeListener to - the AudioCDBurner. - */ - DiskState getDiskState() const; - - /** Returns true if there's a writable disk in the drive. */ - bool isDiskPresent() const; - - /** Sends an eject signal to the drive. - The eject will happen asynchronously, so you can use getDiskState() and - waitUntilStateChange() to monitor its progress. - */ - bool openTray(); - - /** Blocks the current thread until the drive's state changes, or until the timeout expires. - @returns the device's new state - */ - DiskState waitUntilStateChange (int timeOutMilliseconds); - - //============================================================================== - /** Returns the set of possible write speeds that the device can handle. - These are as a multiple of 'normal' speed, so e.g. '24x' returns 24, etc. - Note that if there's no media present in the drive, this value may be unavailable! - @see setWriteSpeed, getWriteSpeed - */ - Array getAvailableWriteSpeeds() const; - - //============================================================================== - /** Tries to enable or disable buffer underrun safety on devices that support it. - @returns true if it's now enabled. If the device doesn't support it, this - will always return false. - */ - bool setBufferUnderrunProtection (bool shouldBeEnabled); - - //============================================================================== - /** Returns the number of free blocks on the disk. - - There are 75 blocks per second, at 44100Hz. - */ - int getNumAvailableAudioBlocks() const; - - /** Adds a track to be written. - - The source passed-in here will be kept by this object, and it will - be used and deleted at some point in the future, either during the - burn() method or when this AudioCDBurner object is deleted. Your caller - method shouldn't keep a reference to it or use it again after passing - it in here. - */ - bool addAudioTrack (AudioSource* source, int numSamples); - - //============================================================================== - /** Receives progress callbacks during a cd-burn operation. - @see AudioCDBurner::burn() - */ - class BurnProgressListener - { - public: - BurnProgressListener() noexcept {} - virtual ~BurnProgressListener() {} - - /** Called at intervals to report on the progress of the AudioCDBurner. - - To cancel the burn, return true from this method. - */ - virtual bool audioCDBurnProgress (float proportionComplete) = 0; - }; - - /** Runs the burn process. - This method will block until the operation is complete. - - @param listener the object to receive callbacks about progress - @param ejectDiscAfterwards whether to eject the disk after the burn completes - @param performFakeBurnForTesting if true, no data will actually be written to the disk - @param writeSpeed one of the write speeds from getAvailableWriteSpeeds(), or - 0 or less to mean the fastest speed. - */ - String burn (BurnProgressListener* listener, - bool ejectDiscAfterwards, - bool performFakeBurnForTesting, - int writeSpeed); - - /** If a burn operation is currently in progress, this tells it to stop - as soon as possible. - - It's also possible to stop the burn process by returning true from - BurnProgressListener::audioCDBurnProgress() - */ - void abortBurn(); - -private: - //============================================================================== - AudioCDBurner (const int deviceIndex); - - class Pimpl; - friend struct ContainerDeletePolicy; - ScopedPointer pimpl; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioCDBurner) -}; - - -#endif -#endif // JUCE_AUDIOCDBURNER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp b/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp deleted file mode 100755 index ca9c5b0..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_USE_CDREADER - -int AudioCDReader::getNumTracks() const -{ - return trackStartSamples.size() - 1; -} - -int AudioCDReader::getPositionOfTrackStart (int trackNum) const -{ - return trackStartSamples [trackNum]; -} - -const Array& AudioCDReader::getTrackOffsets() const -{ - return trackStartSamples; -} - -int AudioCDReader::getCDDBId() -{ - int checksum = 0; - const int numTracks = getNumTracks(); - - for (int i = 0; i < numTracks; ++i) - for (int offset = (trackStartSamples.getUnchecked(i) + 88200) / 44100; offset > 0; offset /= 10) - checksum += offset % 10; - - const int length = (trackStartSamples.getLast() - trackStartSamples.getFirst()) / 44100; - - // CCLLLLTT: checksum, length, tracks - return ((checksum & 0xff) << 24) | (length << 8) | numTracks; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h b/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h deleted file mode 100755 index 0e868db..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_cd/juce_AudioCDReader.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOCDREADER_H_INCLUDED -#define JUCE_AUDIOCDREADER_H_INCLUDED - -#if JUCE_USE_CDREADER || DOXYGEN - - -//============================================================================== -/** - A type of AudioFormatReader that reads from an audio CD. - - One of these can be used to read a CD as if it's one big audio stream. Use the - getPositionOfTrackStart() method to find where the individual tracks are - within the stream. - - @see AudioFormatReader -*/ -class JUCE_API AudioCDReader : public AudioFormatReader -{ -public: - //============================================================================== - /** Returns a list of names of Audio CDs currently available for reading. - - If there's a CD drive but no CD in it, this might return an empty list, or - possibly a device that can be opened but which has no tracks, depending - on the platform. - - @see createReaderForCD - */ - static StringArray getAvailableCDNames(); - - /** Tries to create an AudioFormatReader that can read from an Audio CD. - - @param index the index of one of the available CDs - use getAvailableCDNames() - to find out how many there are. - @returns a new AudioCDReader object, or nullptr if it couldn't be created. The - caller will be responsible for deleting the object returned. - */ - static AudioCDReader* createReaderForCD (const int index); - - //============================================================================== - /** Destructor. */ - ~AudioCDReader(); - - /** Implementation of the AudioFormatReader method. */ - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override; - - /** Checks whether the CD has been removed from the drive. */ - bool isCDStillPresent() const; - - /** Returns the total number of tracks (audio + data). */ - int getNumTracks() const; - - /** Finds the sample offset of the start of a track. - @param trackNum the track number, where trackNum = 0 is the first track - and trackNum = getNumTracks() means the end of the CD. - */ - int getPositionOfTrackStart (int trackNum) const; - - /** Returns true if a given track is an audio track. - @param trackNum the track number, where 0 is the first track. - */ - bool isTrackAudio (int trackNum) const; - - /** Returns an array of sample offsets for the start of each track, followed by - the sample position of the end of the CD. - */ - const Array& getTrackOffsets() const; - - /** Refreshes the object's table of contents. - - If the disc has been ejected and a different one put in since this - object was created, this will cause it to update its idea of how many tracks - there are, etc. - */ - void refreshTrackLengths(); - - /** Enables scanning for indexes within tracks. - @see getLastIndex - */ - void enableIndexScanning (bool enabled); - - /** Returns the index number found during the last read() call. - - Index scanning is turned off by default - turn it on with enableIndexScanning(). - - Then when the read() method is called, if it comes across an index within that - block, the index number is stored and returned by this method. - - Some devices might not support indexes, of course. - - (If you don't know what CD indexes are, it's unlikely you'll ever need them). - - @see enableIndexScanning - */ - int getLastIndex() const; - - /** Scans a track to find the position of any indexes within it. - @param trackNumber the track to look in, where 0 is the first track on the disc - @returns an array of sample positions of any index points found (not including - the index that marks the start of the track) - */ - Array findIndexesInTrack (const int trackNumber); - - /** Returns the CDDB id number for the CD. - It's not a great way of identifying a disc, but it's traditional. - */ - int getCDDBId(); - - /** Tries to eject the disk. - Ejecting the disk might not actually be possible, e.g. if some other process is using it. - */ - void ejectDisk(); - - //============================================================================== - enum - { - framesPerSecond = 75, - samplesPerFrame = 44100 / framesPerSecond - }; - -private: - //============================================================================== - Array trackStartSamples; - - #if JUCE_MAC - File volumeDir; - Array tracks; - int currentReaderTrack; - ScopedPointer reader; - AudioCDReader (const File& volume); - - #elif JUCE_WINDOWS - bool audioTracks [100]; - void* handle; - MemoryBlock buffer; - bool indexingEnabled; - int lastIndex, firstFrameInBuffer, samplesInBuffer; - AudioCDReader (void* handle); - int getIndexAt (int samplePos); - - #elif JUCE_LINUX - AudioCDReader(); - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioCDReader) -}; - -#endif -#endif // JUCE_AUDIOCDREADER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp deleted file mode 100755 index 9cc71f1..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.cpp +++ /dev/null @@ -1,992 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioDeviceManager::AudioDeviceSetup::AudioDeviceSetup() - : sampleRate (0), - bufferSize (0), - useDefaultInputChannels (true), - useDefaultOutputChannels (true) -{ -} - -bool AudioDeviceManager::AudioDeviceSetup::operator== (const AudioDeviceManager::AudioDeviceSetup& other) const -{ - return outputDeviceName == other.outputDeviceName - && inputDeviceName == other.inputDeviceName - && sampleRate == other.sampleRate - && bufferSize == other.bufferSize - && inputChannels == other.inputChannels - && useDefaultInputChannels == other.useDefaultInputChannels - && outputChannels == other.outputChannels - && useDefaultOutputChannels == other.useDefaultOutputChannels; -} - -//============================================================================== -class AudioDeviceManager::CallbackHandler : public AudioIODeviceCallback, - public MidiInputCallback, - public AudioIODeviceType::Listener -{ -public: - CallbackHandler (AudioDeviceManager& adm) noexcept : owner (adm) {} - -private: - void audioDeviceIOCallback (const float** ins, int numIns, float** outs, int numOuts, int numSamples) override - { - owner.audioDeviceIOCallbackInt (ins, numIns, outs, numOuts, numSamples); - } - - void audioDeviceAboutToStart (AudioIODevice* device) override - { - owner.audioDeviceAboutToStartInt (device); - } - - void audioDeviceStopped() override - { - owner.audioDeviceStoppedInt(); - } - - void audioDeviceError (const String& message) override - { - owner.audioDeviceErrorInt (message); - } - - void handleIncomingMidiMessage (MidiInput* source, const MidiMessage& message) override - { - owner.handleIncomingMidiMessageInt (source, message); - } - - void audioDeviceListChanged() override - { - owner.audioDeviceListChanged(); - } - - AudioDeviceManager& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CallbackHandler) -}; - - -//============================================================================== -AudioDeviceManager::AudioDeviceManager() - : numInputChansNeeded (0), - numOutputChansNeeded (2), - listNeedsScanning (true), - inputLevel (0), - testSoundPosition (0), - cpuUsageMs (0), - timeToCpuScale (0) -{ - callbackHandler = new CallbackHandler (*this); -} - -AudioDeviceManager::~AudioDeviceManager() -{ - currentAudioDevice = nullptr; - defaultMidiOutput = nullptr; -} - - -//============================================================================== -void AudioDeviceManager::createDeviceTypesIfNeeded() -{ - if (availableDeviceTypes.size() == 0) - { - OwnedArray types; - createAudioDeviceTypes (types); - - for (int i = 0; i < types.size(); ++i) - addAudioDeviceType (types.getUnchecked(i)); - - types.clear (false); - - if (AudioIODeviceType* first = availableDeviceTypes.getFirst()) - currentDeviceType = first->getTypeName(); - } -} - -const OwnedArray& AudioDeviceManager::getAvailableDeviceTypes() -{ - scanDevicesIfNeeded(); - return availableDeviceTypes; -} - -void AudioDeviceManager::audioDeviceListChanged() -{ - if (currentAudioDevice != nullptr) - { - currentSetup.sampleRate = currentAudioDevice->getCurrentSampleRate(); - currentSetup.bufferSize = currentAudioDevice->getCurrentBufferSizeSamples(); - currentSetup.inputChannels = currentAudioDevice->getActiveInputChannels(); - currentSetup.outputChannels = currentAudioDevice->getActiveOutputChannels(); - } - - sendChangeMessage(); -} - -//============================================================================== -static void addIfNotNull (OwnedArray& list, AudioIODeviceType* const device) -{ - if (device != nullptr) - list.add (device); -} - -void AudioDeviceManager::createAudioDeviceTypes (OwnedArray& list) -{ - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_WASAPI (false)); - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_WASAPI (true)); - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_DirectSound()); - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_ASIO()); - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_CoreAudio()); - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_iOSAudio()); - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_ALSA()); - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_JACK()); - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_OpenSLES()); - addIfNotNull (list, AudioIODeviceType::createAudioIODeviceType_Android()); -} - -void AudioDeviceManager::addAudioDeviceType (AudioIODeviceType* newDeviceType) -{ - if (newDeviceType != nullptr) - { - jassert (lastDeviceTypeConfigs.size() == availableDeviceTypes.size()); - availableDeviceTypes.add (newDeviceType); - lastDeviceTypeConfigs.add (new AudioDeviceSetup()); - - newDeviceType->addListener (callbackHandler); - } -} - -static bool deviceListContains (AudioIODeviceType* type, bool isInput, const String& name) -{ - StringArray devices (type->getDeviceNames (isInput)); - - for (int i = devices.size(); --i >= 0;) - if (devices[i].trim().equalsIgnoreCase (name.trim())) - return true; - - return false; -} - -//============================================================================== -String AudioDeviceManager::initialise (const int numInputChannelsNeeded, - const int numOutputChannelsNeeded, - const XmlElement* const xml, - const bool selectDefaultDeviceOnFailure, - const String& preferredDefaultDeviceName, - const AudioDeviceSetup* preferredSetupOptions) -{ - scanDevicesIfNeeded(); - - numInputChansNeeded = numInputChannelsNeeded; - numOutputChansNeeded = numOutputChannelsNeeded; - - if (xml != nullptr && xml->hasTagName ("DEVICESETUP")) - return initialiseFromXML (*xml, selectDefaultDeviceOnFailure, - preferredDefaultDeviceName, preferredSetupOptions); - - return initialiseDefault (preferredDefaultDeviceName, preferredSetupOptions); -} - -String AudioDeviceManager::initialiseDefault (const String& preferredDefaultDeviceName, - const AudioDeviceSetup* preferredSetupOptions) -{ - AudioDeviceSetup setup; - - if (preferredSetupOptions != nullptr) - { - setup = *preferredSetupOptions; - } - else if (preferredDefaultDeviceName.isNotEmpty()) - { - for (int j = availableDeviceTypes.size(); --j >= 0;) - { - AudioIODeviceType* const type = availableDeviceTypes.getUnchecked(j); - - const StringArray outs (type->getDeviceNames (false)); - - for (int i = 0; i < outs.size(); ++i) - { - if (outs[i].matchesWildcard (preferredDefaultDeviceName, true)) - { - setup.outputDeviceName = outs[i]; - break; - } - } - - const StringArray ins (type->getDeviceNames (true)); - - for (int i = 0; i < ins.size(); ++i) - { - if (ins[i].matchesWildcard (preferredDefaultDeviceName, true)) - { - setup.inputDeviceName = ins[i]; - break; - } - } - } - } - - insertDefaultDeviceNames (setup); - return setAudioDeviceSetup (setup, false); -} - -String AudioDeviceManager::initialiseFromXML (const XmlElement& xml, - const bool selectDefaultDeviceOnFailure, - const String& preferredDefaultDeviceName, - const AudioDeviceSetup* preferredSetupOptions) -{ - lastExplicitSettings = new XmlElement (xml); - - String error; - AudioDeviceSetup setup; - - if (preferredSetupOptions != nullptr) - setup = *preferredSetupOptions; - - if (xml.getStringAttribute ("audioDeviceName").isNotEmpty()) - { - setup.inputDeviceName = setup.outputDeviceName - = xml.getStringAttribute ("audioDeviceName"); - } - else - { - setup.inputDeviceName = xml.getStringAttribute ("audioInputDeviceName"); - setup.outputDeviceName = xml.getStringAttribute ("audioOutputDeviceName"); - } - - currentDeviceType = xml.getStringAttribute ("deviceType"); - - if (findType (currentDeviceType) == nullptr) - { - if (AudioIODeviceType* const type = findType (setup.inputDeviceName, setup.outputDeviceName)) - currentDeviceType = type->getTypeName(); - else if (availableDeviceTypes.size() > 0) - currentDeviceType = availableDeviceTypes.getUnchecked(0)->getTypeName(); - } - - setup.bufferSize = xml.getIntAttribute ("audioDeviceBufferSize"); - setup.sampleRate = xml.getDoubleAttribute ("audioDeviceRate"); - - setup.inputChannels .parseString (xml.getStringAttribute ("audioDeviceInChans", "11"), 2); - setup.outputChannels.parseString (xml.getStringAttribute ("audioDeviceOutChans", "11"), 2); - - setup.useDefaultInputChannels = ! xml.hasAttribute ("audioDeviceInChans"); - setup.useDefaultOutputChannels = ! xml.hasAttribute ("audioDeviceOutChans"); - - error = setAudioDeviceSetup (setup, true); - - midiInsFromXml.clear(); - - forEachXmlChildElementWithTagName (xml, c, "MIDIINPUT") - midiInsFromXml.add (c->getStringAttribute ("name")); - - const StringArray allMidiIns (MidiInput::getDevices()); - - for (int i = allMidiIns.size(); --i >= 0;) - setMidiInputEnabled (allMidiIns[i], midiInsFromXml.contains (allMidiIns[i])); - - if (error.isNotEmpty() && selectDefaultDeviceOnFailure) - error = initialise (numInputChansNeeded, numOutputChansNeeded, - nullptr, false, preferredDefaultDeviceName); - - setDefaultMidiOutput (xml.getStringAttribute ("defaultMidiOutput")); - - return error; -} - -String AudioDeviceManager::initialiseWithDefaultDevices (int numInputChannelsNeeded, - int numOutputChannelsNeeded) -{ - lastExplicitSettings = nullptr; - - return initialise (numInputChannelsNeeded, numOutputChannelsNeeded, - nullptr, false, String(), nullptr); -} - -void AudioDeviceManager::insertDefaultDeviceNames (AudioDeviceSetup& setup) const -{ - if (AudioIODeviceType* type = getCurrentDeviceTypeObject()) - { - if (setup.outputDeviceName.isEmpty()) - setup.outputDeviceName = type->getDeviceNames (false) [type->getDefaultDeviceIndex (false)]; - - if (setup.inputDeviceName.isEmpty()) - setup.inputDeviceName = type->getDeviceNames (true) [type->getDefaultDeviceIndex (true)]; - } -} - -XmlElement* AudioDeviceManager::createStateXml() const -{ - return lastExplicitSettings.createCopy(); -} - -//============================================================================== -void AudioDeviceManager::scanDevicesIfNeeded() -{ - if (listNeedsScanning) - { - listNeedsScanning = false; - - createDeviceTypesIfNeeded(); - - for (int i = availableDeviceTypes.size(); --i >= 0;) - availableDeviceTypes.getUnchecked(i)->scanForDevices(); - } -} - -AudioIODeviceType* AudioDeviceManager::findType (const String& typeName) -{ - scanDevicesIfNeeded(); - - for (int i = availableDeviceTypes.size(); --i >= 0;) - if (availableDeviceTypes.getUnchecked(i)->getTypeName() == typeName) - return availableDeviceTypes.getUnchecked(i); - - return nullptr; -} - -AudioIODeviceType* AudioDeviceManager::findType (const String& inputName, const String& outputName) -{ - scanDevicesIfNeeded(); - - for (int i = availableDeviceTypes.size(); --i >= 0;) - { - AudioIODeviceType* const type = availableDeviceTypes.getUnchecked(i); - - if ((inputName.isNotEmpty() && deviceListContains (type, true, inputName)) - || (outputName.isNotEmpty() && deviceListContains (type, false, outputName))) - { - return type; - } - } - - return nullptr; -} - -void AudioDeviceManager::getAudioDeviceSetup (AudioDeviceSetup& setup) -{ - setup = currentSetup; -} - -void AudioDeviceManager::deleteCurrentDevice() -{ - currentAudioDevice = nullptr; - currentSetup.inputDeviceName.clear(); - currentSetup.outputDeviceName.clear(); -} - -void AudioDeviceManager::setCurrentAudioDeviceType (const String& type, - const bool treatAsChosenDevice) -{ - for (int i = 0; i < availableDeviceTypes.size(); ++i) - { - if (availableDeviceTypes.getUnchecked(i)->getTypeName() == type - && currentDeviceType != type) - { - if (currentAudioDevice != nullptr) - { - closeAudioDevice(); - Thread::sleep (1500); // allow a moment for OS devices to sort themselves out, to help - // avoid things like DirectSound/ASIO clashes - } - - currentDeviceType = type; - - AudioDeviceSetup s (*lastDeviceTypeConfigs.getUnchecked(i)); - insertDefaultDeviceNames (s); - - setAudioDeviceSetup (s, treatAsChosenDevice); - - sendChangeMessage(); - break; - } - } -} - -AudioIODeviceType* AudioDeviceManager::getCurrentDeviceTypeObject() const -{ - for (int i = 0; i < availableDeviceTypes.size(); ++i) - if (availableDeviceTypes.getUnchecked(i)->getTypeName() == currentDeviceType) - return availableDeviceTypes.getUnchecked(i); - - return availableDeviceTypes[0]; -} - -String AudioDeviceManager::setAudioDeviceSetup (const AudioDeviceSetup& newSetup, - const bool treatAsChosenDevice) -{ - jassert (&newSetup != ¤tSetup); // this will have no effect - - if (newSetup == currentSetup && currentAudioDevice != nullptr) - return String(); - - if (! (newSetup == currentSetup)) - sendChangeMessage(); - - stopDevice(); - - const String newInputDeviceName (numInputChansNeeded == 0 ? String() : newSetup.inputDeviceName); - const String newOutputDeviceName (numOutputChansNeeded == 0 ? String() : newSetup.outputDeviceName); - - String error; - AudioIODeviceType* type = getCurrentDeviceTypeObject(); - - if (type == nullptr || (newInputDeviceName.isEmpty() && newOutputDeviceName.isEmpty())) - { - deleteCurrentDevice(); - - if (treatAsChosenDevice) - updateXml(); - - return String(); - } - - if (currentSetup.inputDeviceName != newInputDeviceName - || currentSetup.outputDeviceName != newOutputDeviceName - || currentAudioDevice == nullptr) - { - deleteCurrentDevice(); - scanDevicesIfNeeded(); - - if (newOutputDeviceName.isNotEmpty() && ! deviceListContains (type, false, newOutputDeviceName)) - return "No such device: " + newOutputDeviceName; - - if (newInputDeviceName.isNotEmpty() && ! deviceListContains (type, true, newInputDeviceName)) - return "No such device: " + newInputDeviceName; - - currentAudioDevice = type->createDevice (newOutputDeviceName, newInputDeviceName); - - if (currentAudioDevice == nullptr) - error = "Can't open the audio device!\n\n" - "This may be because another application is currently using the same device - " - "if so, you should close any other applications and try again!"; - else - error = currentAudioDevice->getLastError(); - - if (error.isNotEmpty()) - { - deleteCurrentDevice(); - return error; - } - - if (newSetup.useDefaultInputChannels) - { - inputChannels.clear(); - inputChannels.setRange (0, numInputChansNeeded, true); - } - - if (newSetup.useDefaultOutputChannels) - { - outputChannels.clear(); - outputChannels.setRange (0, numOutputChansNeeded, true); - } - - if (newInputDeviceName.isEmpty()) inputChannels.clear(); - if (newOutputDeviceName.isEmpty()) outputChannels.clear(); - } - - if (! newSetup.useDefaultInputChannels) inputChannels = newSetup.inputChannels; - if (! newSetup.useDefaultOutputChannels) outputChannels = newSetup.outputChannels; - - currentSetup = newSetup; - - currentSetup.sampleRate = chooseBestSampleRate (newSetup.sampleRate); - currentSetup.bufferSize = chooseBestBufferSize (newSetup.bufferSize); - - error = currentAudioDevice->open (inputChannels, - outputChannels, - currentSetup.sampleRate, - currentSetup.bufferSize); - - if (error.isEmpty()) - { - currentDeviceType = currentAudioDevice->getTypeName(); - - currentAudioDevice->start (callbackHandler); - - currentSetup.sampleRate = currentAudioDevice->getCurrentSampleRate(); - currentSetup.bufferSize = currentAudioDevice->getCurrentBufferSizeSamples(); - currentSetup.inputChannels = currentAudioDevice->getActiveInputChannels(); - currentSetup.outputChannels = currentAudioDevice->getActiveOutputChannels(); - - for (int i = 0; i < availableDeviceTypes.size(); ++i) - if (availableDeviceTypes.getUnchecked (i)->getTypeName() == currentDeviceType) - *(lastDeviceTypeConfigs.getUnchecked (i)) = currentSetup; - - if (treatAsChosenDevice) - updateXml(); - } - else - { - deleteCurrentDevice(); - } - - return error; -} - -double AudioDeviceManager::chooseBestSampleRate (double rate) const -{ - jassert (currentAudioDevice != nullptr); - - const Array rates (currentAudioDevice->getAvailableSampleRates()); - - if (rate > 0 && rates.contains (rate)) - return rate; - - double lowestAbove44 = 0.0; - - for (int i = rates.size(); --i >= 0;) - { - const double sr = rates[i]; - - if (sr >= 44100.0 && (lowestAbove44 < 1.0 || sr < lowestAbove44)) - lowestAbove44 = sr; - } - - if (lowestAbove44 > 0.0) - return lowestAbove44; - - return rates[0]; -} - -int AudioDeviceManager::chooseBestBufferSize (int bufferSize) const -{ - jassert (currentAudioDevice != nullptr); - - if (bufferSize > 0 && currentAudioDevice->getAvailableBufferSizes().contains (bufferSize)) - return bufferSize; - - return currentAudioDevice->getDefaultBufferSize(); -} - -void AudioDeviceManager::stopDevice() -{ - if (currentAudioDevice != nullptr) - currentAudioDevice->stop(); - - testSound = nullptr; -} - -void AudioDeviceManager::closeAudioDevice() -{ - stopDevice(); - currentAudioDevice = nullptr; -} - -void AudioDeviceManager::restartLastAudioDevice() -{ - if (currentAudioDevice == nullptr) - { - if (currentSetup.inputDeviceName.isEmpty() - && currentSetup.outputDeviceName.isEmpty()) - { - // This method will only reload the last device that was running - // before closeAudioDevice() was called - you need to actually open - // one first, with setAudioDevice(). - jassertfalse; - return; - } - - AudioDeviceSetup s (currentSetup); - setAudioDeviceSetup (s, false); - } -} - -void AudioDeviceManager::updateXml() -{ - lastExplicitSettings = new XmlElement ("DEVICESETUP"); - - lastExplicitSettings->setAttribute ("deviceType", currentDeviceType); - lastExplicitSettings->setAttribute ("audioOutputDeviceName", currentSetup.outputDeviceName); - lastExplicitSettings->setAttribute ("audioInputDeviceName", currentSetup.inputDeviceName); - - if (currentAudioDevice != nullptr) - { - lastExplicitSettings->setAttribute ("audioDeviceRate", currentAudioDevice->getCurrentSampleRate()); - - if (currentAudioDevice->getDefaultBufferSize() != currentAudioDevice->getCurrentBufferSizeSamples()) - lastExplicitSettings->setAttribute ("audioDeviceBufferSize", currentAudioDevice->getCurrentBufferSizeSamples()); - - if (! currentSetup.useDefaultInputChannels) - lastExplicitSettings->setAttribute ("audioDeviceInChans", currentSetup.inputChannels.toString (2)); - - if (! currentSetup.useDefaultOutputChannels) - lastExplicitSettings->setAttribute ("audioDeviceOutChans", currentSetup.outputChannels.toString (2)); - } - - for (int i = 0; i < enabledMidiInputs.size(); ++i) - lastExplicitSettings->createNewChildElement ("MIDIINPUT") - ->setAttribute ("name", enabledMidiInputs[i]->getName()); - - if (midiInsFromXml.size() > 0) - { - // Add any midi devices that have been enabled before, but which aren't currently - // open because the device has been disconnected. - const StringArray availableMidiDevices (MidiInput::getDevices()); - - for (int i = 0; i < midiInsFromXml.size(); ++i) - if (! availableMidiDevices.contains (midiInsFromXml[i], true)) - lastExplicitSettings->createNewChildElement ("MIDIINPUT") - ->setAttribute ("name", midiInsFromXml[i]); - } - - if (defaultMidiOutputName.isNotEmpty()) - lastExplicitSettings->setAttribute ("defaultMidiOutput", defaultMidiOutputName); -} - -//============================================================================== -void AudioDeviceManager::addAudioCallback (AudioIODeviceCallback* newCallback) -{ - { - const ScopedLock sl (audioCallbackLock); - if (callbacks.contains (newCallback)) - return; - } - - if (currentAudioDevice != nullptr && newCallback != nullptr) - newCallback->audioDeviceAboutToStart (currentAudioDevice); - - const ScopedLock sl (audioCallbackLock); - callbacks.add (newCallback); -} - -void AudioDeviceManager::removeAudioCallback (AudioIODeviceCallback* callbackToRemove) -{ - if (callbackToRemove != nullptr) - { - bool needsDeinitialising = currentAudioDevice != nullptr; - - { - const ScopedLock sl (audioCallbackLock); - - needsDeinitialising = needsDeinitialising && callbacks.contains (callbackToRemove); - callbacks.removeFirstMatchingValue (callbackToRemove); - } - - if (needsDeinitialising) - callbackToRemove->audioDeviceStopped(); - } -} - -void AudioDeviceManager::audioDeviceIOCallbackInt (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) -{ - const ScopedLock sl (audioCallbackLock); - - if (inputLevelMeasurementEnabledCount.get() > 0 && numInputChannels > 0) - { - for (int j = 0; j < numSamples; ++j) - { - float s = 0; - - for (int i = 0; i < numInputChannels; ++i) - s += std::abs (inputChannelData[i][j]); - - s /= numInputChannels; - - const double decayFactor = 0.99992; - - if (s > inputLevel) - inputLevel = s; - else if (inputLevel > 0.001f) - inputLevel *= decayFactor; - else - inputLevel = 0; - } - } - else - { - inputLevel = 0; - } - - if (callbacks.size() > 0) - { - const double callbackStartTime = Time::getMillisecondCounterHiRes(); - - tempBuffer.setSize (jmax (1, numOutputChannels), jmax (1, numSamples), false, false, true); - - callbacks.getUnchecked(0)->audioDeviceIOCallback (inputChannelData, numInputChannels, - outputChannelData, numOutputChannels, numSamples); - - float** const tempChans = tempBuffer.getArrayOfWritePointers(); - - for (int i = callbacks.size(); --i > 0;) - { - callbacks.getUnchecked(i)->audioDeviceIOCallback (inputChannelData, numInputChannels, - tempChans, numOutputChannels, numSamples); - - for (int chan = 0; chan < numOutputChannels; ++chan) - { - if (const float* const src = tempChans [chan]) - if (float* const dst = outputChannelData [chan]) - for (int j = 0; j < numSamples; ++j) - dst[j] += src[j]; - } - } - - const double msTaken = Time::getMillisecondCounterHiRes() - callbackStartTime; - const double filterAmount = 0.2; - cpuUsageMs += filterAmount * (msTaken - cpuUsageMs); - } - else - { - for (int i = 0; i < numOutputChannels; ++i) - zeromem (outputChannelData[i], sizeof (float) * (size_t) numSamples); - } - - if (testSound != nullptr) - { - const int numSamps = jmin (numSamples, testSound->getNumSamples() - testSoundPosition); - const float* const src = testSound->getReadPointer (0, testSoundPosition); - - for (int i = 0; i < numOutputChannels; ++i) - for (int j = 0; j < numSamps; ++j) - outputChannelData [i][j] += src[j]; - - testSoundPosition += numSamps; - if (testSoundPosition >= testSound->getNumSamples()) - testSound = nullptr; - } -} - -void AudioDeviceManager::audioDeviceAboutToStartInt (AudioIODevice* const device) -{ - cpuUsageMs = 0; - - const double sampleRate = device->getCurrentSampleRate(); - const int blockSize = device->getCurrentBufferSizeSamples(); - - if (sampleRate > 0.0 && blockSize > 0) - { - const double msPerBlock = 1000.0 * blockSize / sampleRate; - timeToCpuScale = (msPerBlock > 0.0) ? (1.0 / msPerBlock) : 0.0; - } - - { - const ScopedLock sl (audioCallbackLock); - for (int i = callbacks.size(); --i >= 0;) - callbacks.getUnchecked(i)->audioDeviceAboutToStart (device); - } - - sendChangeMessage(); -} - -void AudioDeviceManager::audioDeviceStoppedInt() -{ - cpuUsageMs = 0; - timeToCpuScale = 0; - sendChangeMessage(); - - const ScopedLock sl (audioCallbackLock); - for (int i = callbacks.size(); --i >= 0;) - callbacks.getUnchecked(i)->audioDeviceStopped(); -} - -void AudioDeviceManager::audioDeviceErrorInt (const String& message) -{ - const ScopedLock sl (audioCallbackLock); - for (int i = callbacks.size(); --i >= 0;) - callbacks.getUnchecked(i)->audioDeviceError (message); -} - -double AudioDeviceManager::getCpuUsage() const -{ - return jlimit (0.0, 1.0, timeToCpuScale * cpuUsageMs); -} - -//============================================================================== -void AudioDeviceManager::setMidiInputEnabled (const String& name, const bool enabled) -{ - if (enabled != isMidiInputEnabled (name)) - { - if (enabled) - { - const int index = MidiInput::getDevices().indexOf (name); - - if (index >= 0) - { - if (MidiInput* const midiIn = MidiInput::openDevice (index, callbackHandler)) - { - enabledMidiInputs.add (midiIn); - midiIn->start(); - } - } - } - else - { - for (int i = enabledMidiInputs.size(); --i >= 0;) - if (enabledMidiInputs[i]->getName() == name) - enabledMidiInputs.remove (i); - } - - updateXml(); - sendChangeMessage(); - } -} - -bool AudioDeviceManager::isMidiInputEnabled (const String& name) const -{ - for (int i = enabledMidiInputs.size(); --i >= 0;) - if (enabledMidiInputs[i]->getName() == name) - return true; - - return false; -} - -void AudioDeviceManager::addMidiInputCallback (const String& name, MidiInputCallback* callbackToAdd) -{ - removeMidiInputCallback (name, callbackToAdd); - - if (name.isEmpty() || isMidiInputEnabled (name)) - { - const ScopedLock sl (midiCallbackLock); - - MidiCallbackInfo mc; - mc.deviceName = name; - mc.callback = callbackToAdd; - midiCallbacks.add (mc); - } -} - -void AudioDeviceManager::removeMidiInputCallback (const String& name, MidiInputCallback* callbackToRemove) -{ - for (int i = midiCallbacks.size(); --i >= 0;) - { - const MidiCallbackInfo& mc = midiCallbacks.getReference(i); - - if (mc.callback == callbackToRemove && mc.deviceName == name) - { - const ScopedLock sl (midiCallbackLock); - midiCallbacks.remove (i); - } - } -} - -void AudioDeviceManager::handleIncomingMidiMessageInt (MidiInput* source, const MidiMessage& message) -{ - if (! message.isActiveSense()) - { - const ScopedLock sl (midiCallbackLock); - - for (int i = 0; i < midiCallbacks.size(); ++i) - { - const MidiCallbackInfo& mc = midiCallbacks.getReference(i); - - if (mc.deviceName.isEmpty() || mc.deviceName == source->getName()) - mc.callback->handleIncomingMidiMessage (source, message); - } - } -} - -//============================================================================== -void AudioDeviceManager::setDefaultMidiOutput (const String& deviceName) -{ - if (defaultMidiOutputName != deviceName) - { - Array oldCallbacks; - - { - const ScopedLock sl (audioCallbackLock); - oldCallbacks.swapWith (callbacks); - } - - if (currentAudioDevice != nullptr) - for (int i = oldCallbacks.size(); --i >= 0;) - oldCallbacks.getUnchecked(i)->audioDeviceStopped(); - - defaultMidiOutput = nullptr; - defaultMidiOutputName = deviceName; - - if (deviceName.isNotEmpty()) - defaultMidiOutput = MidiOutput::openDevice (MidiOutput::getDevices().indexOf (deviceName)); - - if (currentAudioDevice != nullptr) - for (int i = oldCallbacks.size(); --i >= 0;) - oldCallbacks.getUnchecked(i)->audioDeviceAboutToStart (currentAudioDevice); - - { - const ScopedLock sl (audioCallbackLock); - oldCallbacks.swapWith (callbacks); - } - - updateXml(); - sendChangeMessage(); - } -} - -//============================================================================== -void AudioDeviceManager::playTestSound() -{ - { // cunningly nested to swap, unlock and delete in that order. - ScopedPointer oldSound; - - { - const ScopedLock sl (audioCallbackLock); - oldSound = testSound; - } - } - - testSoundPosition = 0; - - if (currentAudioDevice != nullptr) - { - const double sampleRate = currentAudioDevice->getCurrentSampleRate(); - const int soundLength = (int) sampleRate; - - const double frequency = 440.0; - const float amplitude = 0.5f; - - const double phasePerSample = double_Pi * 2.0 / (sampleRate / frequency); - - AudioSampleBuffer* const newSound = new AudioSampleBuffer (1, soundLength); - - for (int i = 0; i < soundLength; ++i) - newSound->setSample (0, i, amplitude * (float) std::sin (i * phasePerSample)); - - newSound->applyGainRamp (0, 0, soundLength / 10, 0.0f, 1.0f); - newSound->applyGainRamp (0, soundLength - soundLength / 4, soundLength / 4, 1.0f, 0.0f); - - const ScopedLock sl (audioCallbackLock); - testSound = newSound; - } -} - -void AudioDeviceManager::enableInputLevelMeasurement (const bool enableMeasurement) -{ - if (enableMeasurement) - ++inputLevelMeasurementEnabledCount; - else - --inputLevelMeasurementEnabledCount; - - inputLevel = 0; -} - -double AudioDeviceManager::getCurrentInputLevel() const -{ - jassert (inputLevelMeasurementEnabledCount.get() > 0); // you need to call enableInputLevelMeasurement() before using this! - return inputLevel; -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h deleted file mode 100755 index 639489b..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h +++ /dev/null @@ -1,511 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIODEVICEMANAGER_H_INCLUDED -#define JUCE_AUDIODEVICEMANAGER_H_INCLUDED - - -//============================================================================== -/** - Manages the state of some audio and midi i/o devices. - - This class keeps tracks of a currently-selected audio device, through - with which it continuously streams data from an audio callback, as well as - one or more midi inputs. - - The idea is that your application will create one global instance of this object, - and let it take care of creating and deleting specific types of audio devices - internally. So when the device is changed, your callbacks will just keep running - without having to worry about this. - - The manager can save and reload all of its device settings as XML, which - makes it very easy for you to save and reload the audio setup of your - application. - - And to make it easy to let the user change its settings, there's a component - to do just that - the AudioDeviceSelectorComponent class, which contains a set of - device selection/sample-rate/latency controls. - - To use an AudioDeviceManager, create one, and use initialise() to set it up. Then - call addAudioCallback() to register your audio callback with it, and use that to process - your audio data. - - The manager also acts as a handy hub for incoming midi messages, allowing a - listener to register for messages from either a specific midi device, or from whatever - the current default midi input device is. The listener then doesn't have to worry about - re-registering with different midi devices if they are changed or deleted. - - And yet another neat trick is that amount of CPU time being used is measured and - available with the getCpuUsage() method. - - The AudioDeviceManager is a ChangeBroadcaster, and will send a change message to - listeners whenever one of its settings is changed. - - @see AudioDeviceSelectorComponent, AudioIODevice, AudioIODeviceType -*/ -class JUCE_API AudioDeviceManager : public ChangeBroadcaster -{ -public: - //============================================================================== - /** Creates a default AudioDeviceManager. - - Initially no audio device will be selected. You should call the initialise() method - and register an audio callback with setAudioCallback() before it'll be able to - actually make any noise. - */ - AudioDeviceManager(); - - /** Destructor. */ - ~AudioDeviceManager(); - - //============================================================================== - /** - This structure holds a set of properties describing the current audio setup. - - An AudioDeviceManager uses this class to save/load its current settings, and to - specify your preferred options when opening a device. - - @see AudioDeviceManager::setAudioDeviceSetup(), AudioDeviceManager::initialise() - */ - struct JUCE_API AudioDeviceSetup - { - /** Creates an AudioDeviceSetup object. - - The default constructor sets all the member variables to indicate default values. - You can then fill-in any values you want to before passing the object to - AudioDeviceManager::initialise(). - */ - AudioDeviceSetup(); - - bool operator== (const AudioDeviceSetup& other) const; - - /** The name of the audio device used for output. - The name has to be one of the ones listed by the AudioDeviceManager's currently - selected device type. - This may be the same as the input device. - An empty string indicates the default device. - */ - String outputDeviceName; - - /** The name of the audio device used for input. - This may be the same as the output device. - An empty string indicates the default device. - */ - String inputDeviceName; - - /** The current sample rate. - This rate is used for both the input and output devices. - A value of 0 indicates that you don't care what rate is used, and the - device will choose a sensible rate for you. - */ - double sampleRate; - - /** The buffer size, in samples. - This buffer size is used for both the input and output devices. - A value of 0 indicates the default buffer size. - */ - int bufferSize; - - /** The set of active input channels. - The bits that are set in this array indicate the channels of the - input device that are active. - If useDefaultInputChannels is true, this value is ignored. - */ - BigInteger inputChannels; - - /** If this is true, it indicates that the inputChannels array - should be ignored, and instead, the device's default channels - should be used. - */ - bool useDefaultInputChannels; - - /** The set of active output channels. - The bits that are set in this array indicate the channels of the - input device that are active. - If useDefaultOutputChannels is true, this value is ignored. - */ - BigInteger outputChannels; - - /** If this is true, it indicates that the outputChannels array - should be ignored, and instead, the device's default channels - should be used. - */ - bool useDefaultOutputChannels; - }; - - - //============================================================================== - /** Opens a set of audio devices ready for use. - - This will attempt to open either a default audio device, or one that was - previously saved as XML. - - @param numInputChannelsNeeded the maximum number of input channels your app would like to - use (the actual number of channels opened may be less than - the number requested) - @param numOutputChannelsNeeded the maximum number of output channels your app would like to - use (the actual number of channels opened may be less than - the number requested) - @param savedState either a previously-saved state that was produced - by createStateXml(), or nullptr if you want the manager - to choose the best device to open. - @param selectDefaultDeviceOnFailure if true, then if the device specified in the XML - fails to open, then a default device will be used - instead. If false, then on failure, no device is - opened. - @param preferredDefaultDeviceName if this is not empty, and there's a device with this - name, then that will be used as the default device - (assuming that there wasn't one specified in the XML). - The string can actually be a simple wildcard, containing "*" - and "?" characters - @param preferredSetupOptions if this is non-null, the structure will be used as the - set of preferred settings when opening the device. If you - use this parameter, the preferredDefaultDeviceName - field will be ignored - - @returns an error message if anything went wrong, or an empty string if it worked ok. - */ - String initialise (int numInputChannelsNeeded, - int numOutputChannelsNeeded, - const XmlElement* savedState, - bool selectDefaultDeviceOnFailure, - const String& preferredDefaultDeviceName = String(), - const AudioDeviceSetup* preferredSetupOptions = nullptr); - - /** Resets everything to a default device setup, clearing any stored settings. */ - String initialiseWithDefaultDevices (int numInputChannelsNeeded, - int numOutputChannelsNeeded); - - /** Returns some XML representing the current state of the manager. - - This stores the current device, its samplerate, block size, etc, and - can be restored later with initialise(). - - Note that this can return a null pointer if no settings have been explicitly changed - (i.e. if the device manager has just been left in its default state). - */ - XmlElement* createStateXml() const; - - //============================================================================== - /** Returns the current device properties that are in use. - @see setAudioDeviceSetup - */ - void getAudioDeviceSetup (AudioDeviceSetup& result); - - /** Changes the current device or its settings. - - If you want to change a device property, like the current sample rate or - block size, you can call getAudioDeviceSetup() to retrieve the current - settings, then tweak the appropriate fields in the AudioDeviceSetup structure, - and pass it back into this method to apply the new settings. - - @param newSetup the settings that you'd like to use - @param treatAsChosenDevice if this is true and if the device opens correctly, these new - settings will be taken as having been explicitly chosen by the - user, and the next time createStateXml() is called, these settings - will be returned. If it's false, then the device is treated as a - temporary or default device, and a call to createStateXml() will - return either the last settings that were made with treatAsChosenDevice - as true, or the last XML settings that were passed into initialise(). - @returns an error message if anything went wrong, or an empty string if it worked ok. - - @see getAudioDeviceSetup - */ - String setAudioDeviceSetup (const AudioDeviceSetup& newSetup, - bool treatAsChosenDevice); - - - /** Returns the currently-active audio device. */ - AudioIODevice* getCurrentAudioDevice() const noexcept { return currentAudioDevice; } - - /** Returns the type of audio device currently in use. - @see setCurrentAudioDeviceType - */ - String getCurrentAudioDeviceType() const { return currentDeviceType; } - - /** Returns the currently active audio device type object. - Don't keep a copy of this pointer - it's owned by the device manager and could - change at any time. - */ - AudioIODeviceType* getCurrentDeviceTypeObject() const; - - /** Changes the class of audio device being used. - - This switches between, e.g. ASIO and DirectSound. On the Mac you probably won't ever call - this because there's only one type: CoreAudio. - - For a list of types, see getAvailableDeviceTypes(). - */ - void setCurrentAudioDeviceType (const String& type, - bool treatAsChosenDevice); - - /** Closes the currently-open device. - You can call restartLastAudioDevice() later to reopen it in the same state - that it was just in. - */ - void closeAudioDevice(); - - /** Tries to reload the last audio device that was running. - - Note that this only reloads the last device that was running before - closeAudioDevice() was called - it doesn't reload any kind of saved-state, - and can only be called after a device has been opened with SetAudioDevice(). - - If a device is already open, this call will do nothing. - */ - void restartLastAudioDevice(); - - //============================================================================== - /** Registers an audio callback to be used. - - The manager will redirect callbacks from whatever audio device is currently - in use to all registered callback objects. If more than one callback is - active, they will all be given the same input data, and their outputs will - be summed. - - If necessary, this method will invoke audioDeviceAboutToStart() on the callback - object before returning. - - To remove a callback, use removeAudioCallback(). - */ - void addAudioCallback (AudioIODeviceCallback* newCallback); - - /** Deregisters a previously added callback. - - If necessary, this method will invoke audioDeviceStopped() on the callback - object before returning. - - @see addAudioCallback - */ - void removeAudioCallback (AudioIODeviceCallback* callback); - - //============================================================================== - /** Returns the average proportion of available CPU being spent inside the audio callbacks. - @returns A value between 0 and 1.0 to indicate the approximate proportion of CPU - time spent in the callbacks. - */ - double getCpuUsage() const; - - //============================================================================== - /** Enables or disables a midi input device. - - The list of devices can be obtained with the MidiInput::getDevices() method. - - Any incoming messages from enabled input devices will be forwarded on to all the - listeners that have been registered with the addMidiInputCallback() method. They - can either register for messages from a particular device, or from just the - "default" midi input. - - Routing the midi input via an AudioDeviceManager means that when a listener - registers for the default midi input, this default device can be changed by the - manager without the listeners having to know about it or re-register. - - It also means that a listener can stay registered for a midi input that is disabled - or not present, so that when the input is re-enabled, the listener will start - receiving messages again. - - @see addMidiInputCallback, isMidiInputEnabled - */ - void setMidiInputEnabled (const String& midiInputDeviceName, bool enabled); - - /** Returns true if a given midi input device is being used. - @see setMidiInputEnabled - */ - bool isMidiInputEnabled (const String& midiInputDeviceName) const; - - /** Registers a listener for callbacks when midi events arrive from a midi input. - - The device name can be empty to indicate that it wants to receive all incoming - events from all the enabled MIDI inputs. Or it can be the name of one of the - MIDI input devices if it just wants the events from that device. (see - MidiInput::getDevices() for the list of device names). - - Only devices which are enabled (see the setMidiInputEnabled() method) will have their - events forwarded on to listeners. - */ - void addMidiInputCallback (const String& midiInputDeviceName, - MidiInputCallback* callback); - - /** Removes a listener that was previously registered with addMidiInputCallback(). */ - void removeMidiInputCallback (const String& midiInputDeviceName, - MidiInputCallback* callback); - - //============================================================================== - /** Sets a midi output device to use as the default. - - The list of devices can be obtained with the MidiOutput::getDevices() method. - - The specified device will be opened automatically and can be retrieved with the - getDefaultMidiOutput() method. - - Pass in an empty string to deselect all devices. For the default device, you - can use MidiOutput::getDevices() [MidiOutput::getDefaultDeviceIndex()]. - - @see getDefaultMidiOutput, getDefaultMidiOutputName - */ - void setDefaultMidiOutput (const String& deviceName); - - /** Returns the name of the default midi output. - @see setDefaultMidiOutput, getDefaultMidiOutput - */ - const String& getDefaultMidiOutputName() const noexcept { return defaultMidiOutputName; } - - /** Returns the current default midi output device. - If no device has been selected, or the device can't be opened, this will return nullptr. - @see getDefaultMidiOutputName - */ - MidiOutput* getDefaultMidiOutput() const noexcept { return defaultMidiOutput; } - - /** Returns a list of the types of device supported. */ - const OwnedArray& getAvailableDeviceTypes(); - - //============================================================================== - /** Creates a list of available types. - - This will add a set of new AudioIODeviceType objects to the specified list, to - represent each available types of device. - - You can override this if your app needs to do something specific, like avoid - using DirectSound devices, etc. - */ - virtual void createAudioDeviceTypes (OwnedArray& types); - - /** Adds a new device type to the list of types. - The manager will take ownership of the object that is passed-in. - */ - void addAudioDeviceType (AudioIODeviceType* newDeviceType); - - //============================================================================== - /** Plays a beep through the current audio device. - - This is here to allow the audio setup UI panels to easily include a "test" - button so that the user can check where the audio is coming from. - */ - void playTestSound(); - - /** Turns on level-measuring. - - When enabled, the device manager will measure the peak input level - across all channels, and you can get this level by calling getCurrentInputLevel(). - - This is mainly intended for audio setup UI panels to use to create a mic - level display, so that the user can check that they've selected the right - device. - - A simple filter is used to make the level decay smoothly, but this is - only intended for giving rough feedback, and not for any kind of accurate - measurement. - */ - void enableInputLevelMeasurement (bool enableMeasurement); - - /** Returns the current input level. - To use this, you must first enable it by calling enableInputLevelMeasurement(). - See enableInputLevelMeasurement() for more info. - */ - double getCurrentInputLevel() const; - - /** Returns the a lock that can be used to synchronise access to the audio callback. - Obviously while this is locked, you're blocking the audio thread from running, so - it must only be used for very brief periods when absolutely necessary. - */ - CriticalSection& getAudioCallbackLock() noexcept { return audioCallbackLock; } - - /** Returns the a lock that can be used to synchronise access to the midi callback. - Obviously while this is locked, you're blocking the midi system from running, so - it must only be used for very brief periods when absolutely necessary. - */ - CriticalSection& getMidiCallbackLock() noexcept { return midiCallbackLock; } - -private: - //============================================================================== - OwnedArray availableDeviceTypes; - OwnedArray lastDeviceTypeConfigs; - - AudioDeviceSetup currentSetup; - ScopedPointer currentAudioDevice; - Array callbacks; - int numInputChansNeeded, numOutputChansNeeded; - String currentDeviceType; - BigInteger inputChannels, outputChannels; - ScopedPointer lastExplicitSettings; - mutable bool listNeedsScanning; - Atomic inputLevelMeasurementEnabledCount; - double inputLevel; - ScopedPointer testSound; - int testSoundPosition; - AudioSampleBuffer tempBuffer; - - struct MidiCallbackInfo - { - String deviceName; - MidiInputCallback* callback; - }; - - StringArray midiInsFromXml; - OwnedArray enabledMidiInputs; - Array midiCallbacks; - - String defaultMidiOutputName; - ScopedPointer defaultMidiOutput; - CriticalSection audioCallbackLock, midiCallbackLock; - - double cpuUsageMs, timeToCpuScale; - - //============================================================================== - class CallbackHandler; - friend class CallbackHandler; - friend struct ContainerDeletePolicy; - ScopedPointer callbackHandler; - - void audioDeviceIOCallbackInt (const float** inputChannelData, int totalNumInputChannels, - float** outputChannelData, int totalNumOutputChannels, int numSamples); - void audioDeviceAboutToStartInt (AudioIODevice*); - void audioDeviceStoppedInt(); - void audioDeviceErrorInt (const String&); - void handleIncomingMidiMessageInt (MidiInput*, const MidiMessage&); - void audioDeviceListChanged(); - - String restartDevice (int blockSizeToUse, double sampleRateToUse, - const BigInteger& ins, const BigInteger& outs); - void stopDevice(); - - void updateXml(); - - void createDeviceTypesIfNeeded(); - void scanDevicesIfNeeded(); - void deleteCurrentDevice(); - double chooseBestSampleRate (double preferred) const; - int chooseBestBufferSize (int preferred) const; - void insertDefaultDeviceNames (AudioDeviceSetup&) const; - String initialiseDefault (const String& preferredDefaultDeviceName, const AudioDeviceSetup*); - String initialiseFromXML (const XmlElement&, bool selectDefaultDeviceOnFailure, - const String& preferredDefaultDeviceName, const AudioDeviceSetup*); - - AudioIODeviceType* findType (const String& inputName, const String& outputName); - AudioIODeviceType* findType (const String& typeName); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioDeviceManager) -}; - -#endif // JUCE_AUDIODEVICEMANAGER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp deleted file mode 100755 index 95221ba..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioIODevice::AudioIODevice (const String& deviceName, const String& deviceTypeName) - : name (deviceName), typeName (deviceTypeName) -{ -} - -AudioIODevice::~AudioIODevice() {} - -void AudioIODeviceCallback::audioDeviceError (const String&) {} -bool AudioIODevice::setAudioPreprocessingEnabled (bool) { return false; } -bool AudioIODevice::hasControlPanel() const { return false; } - -bool AudioIODevice::showControlPanel() -{ - jassertfalse; // this should only be called for devices which return true from - // their hasControlPanel() method. - return false; -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h deleted file mode 100755 index 8ce41d0..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODevice.h +++ /dev/null @@ -1,309 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOIODEVICE_H_INCLUDED -#define JUCE_AUDIOIODEVICE_H_INCLUDED - -class AudioIODevice; - - -//============================================================================== -/** - One of these is passed to an AudioIODevice object to stream the audio data - in and out. - - The AudioIODevice will repeatedly call this class's audioDeviceIOCallback() - method on its own high-priority audio thread, when it needs to send or receive - the next block of data. - - @see AudioIODevice, AudioDeviceManager -*/ -class JUCE_API AudioIODeviceCallback -{ -public: - /** Destructor. */ - virtual ~AudioIODeviceCallback() {} - - /** Processes a block of incoming and outgoing audio data. - - The subclass's implementation should use the incoming audio for whatever - purposes it needs to, and must fill all the output channels with the next - block of output data before returning. - - The channel data is arranged with the same array indices as the channel name - array returned by AudioIODevice::getOutputChannelNames(), but those channels - that aren't specified in AudioIODevice::open() will have a null pointer for their - associated channel, so remember to check for this. - - @param inputChannelData a set of arrays containing the audio data for each - incoming channel - this data is valid until the function - returns. There will be one channel of data for each input - channel that was enabled when the audio device was opened - (see AudioIODevice::open()) - @param numInputChannels the number of pointers to channel data in the - inputChannelData array. - @param outputChannelData a set of arrays which need to be filled with the data - that should be sent to each outgoing channel of the device. - There will be one channel of data for each output channel - that was enabled when the audio device was opened (see - AudioIODevice::open()) - The initial contents of the array is undefined, so the - callback function must fill all the channels with zeros if - its output is silence. Failing to do this could cause quite - an unpleasant noise! - @param numOutputChannels the number of pointers to channel data in the - outputChannelData array. - @param numSamples the number of samples in each channel of the input and - output arrays. The number of samples will depend on the - audio device's buffer size and will usually remain constant, - although this isn't guaranteed, so make sure your code can - cope with reasonable changes in the buffer size from one - callback to the next. - */ - virtual void audioDeviceIOCallback (const float** inputChannelData, - int numInputChannels, - float** outputChannelData, - int numOutputChannels, - int numSamples) = 0; - - /** Called to indicate that the device is about to start calling back. - - This will be called just before the audio callbacks begin, either when this - callback has just been added to an audio device, or after the device has been - restarted because of a sample-rate or block-size change. - - You can use this opportunity to find out the sample rate and block size - that the device is going to use by calling the AudioIODevice::getCurrentSampleRate() - and AudioIODevice::getCurrentBufferSizeSamples() on the supplied pointer. - - @param device the audio IO device that will be used to drive the callback. - Note that if you're going to store this this pointer, it is - only valid until the next time that audioDeviceStopped is called. - */ - virtual void audioDeviceAboutToStart (AudioIODevice* device) = 0; - - /** Called to indicate that the device has stopped. */ - virtual void audioDeviceStopped() = 0; - - /** This can be overridden to be told if the device generates an error while operating. - Be aware that this could be called by any thread! And not all devices perform - this callback. - */ - virtual void audioDeviceError (const String& errorMessage); -}; - - -//============================================================================== -/** - Base class for an audio device with synchronised input and output channels. - - Subclasses of this are used to implement different protocols such as DirectSound, - ASIO, CoreAudio, etc. - - To create one of these, you'll need to use the AudioIODeviceType class - see the - documentation for that class for more info. - - For an easier way of managing audio devices and their settings, have a look at the - AudioDeviceManager class. - - @see AudioIODeviceType, AudioDeviceManager -*/ -class JUCE_API AudioIODevice -{ -public: - /** Destructor. */ - virtual ~AudioIODevice(); - - //============================================================================== - /** Returns the device's name, (as set in the constructor). */ - const String& getName() const noexcept { return name; } - - /** Returns the type of the device. - - E.g. "CoreAudio", "ASIO", etc. - this comes from the AudioIODeviceType that created it. - */ - const String& getTypeName() const noexcept { return typeName; } - - //============================================================================== - /** Returns the names of all the available output channels on this device. - To find out which of these are currently in use, call getActiveOutputChannels(). - */ - virtual StringArray getOutputChannelNames() = 0; - - /** Returns the names of all the available input channels on this device. - To find out which of these are currently in use, call getActiveInputChannels(). - */ - virtual StringArray getInputChannelNames() = 0; - - //============================================================================== - /** Returns the set of sample-rates this device supports. - @see getCurrentSampleRate - */ - virtual Array getAvailableSampleRates() = 0; - - /** Returns the set of buffer sizes that are available. - @see getCurrentBufferSizeSamples, getDefaultBufferSize - */ - virtual Array getAvailableBufferSizes() = 0; - - /** Returns the default buffer-size to use. - @returns a number of samples - @see getAvailableBufferSizes - */ - virtual int getDefaultBufferSize() = 0; - - //============================================================================== - /** Tries to open the device ready to play. - - @param inputChannels a BigInteger in which a set bit indicates that the corresponding - input channel should be enabled - @param outputChannels a BigInteger in which a set bit indicates that the corresponding - output channel should be enabled - @param sampleRate the sample rate to try to use - to find out which rates are - available, see getAvailableSampleRates() - @param bufferSizeSamples the size of i/o buffer to use - to find out the available buffer - sizes, see getAvailableBufferSizes() - @returns an error description if there's a problem, or an empty string if it succeeds in - opening the device - @see close - */ - virtual String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sampleRate, - int bufferSizeSamples) = 0; - - /** Closes and releases the device if it's open. */ - virtual void close() = 0; - - /** Returns true if the device is still open. - - A device might spontaneously close itself if something goes wrong, so this checks if - it's still open. - */ - virtual bool isOpen() = 0; - - /** Starts the device actually playing. - - This must be called after the device has been opened. - - @param callback the callback to use for streaming the data. - @see AudioIODeviceCallback, open - */ - virtual void start (AudioIODeviceCallback* callback) = 0; - - /** Stops the device playing. - - Once a device has been started, this will stop it. Any pending calls to the - callback class will be flushed before this method returns. - */ - virtual void stop() = 0; - - /** Returns true if the device is still calling back. - - The device might mysteriously stop, so this checks whether it's - still playing. - */ - virtual bool isPlaying() = 0; - - /** Returns the last error that happened if anything went wrong. */ - virtual String getLastError() = 0; - - //============================================================================== - /** Returns the buffer size that the device is currently using. - - If the device isn't actually open, this value doesn't really mean much. - */ - virtual int getCurrentBufferSizeSamples() = 0; - - /** Returns the sample rate that the device is currently using. - - If the device isn't actually open, this value doesn't really mean much. - */ - virtual double getCurrentSampleRate() = 0; - - /** Returns the device's current physical bit-depth. - - If the device isn't actually open, this value doesn't really mean much. - */ - virtual int getCurrentBitDepth() = 0; - - /** Returns a mask showing which of the available output channels are currently - enabled. - @see getOutputChannelNames - */ - virtual BigInteger getActiveOutputChannels() const = 0; - - /** Returns a mask showing which of the available input channels are currently - enabled. - @see getInputChannelNames - */ - virtual BigInteger getActiveInputChannels() const = 0; - - /** Returns the device's output latency. - - This is the delay in samples between a callback getting a block of data, and - that data actually getting played. - */ - virtual int getOutputLatencyInSamples() = 0; - - /** Returns the device's input latency. - - This is the delay in samples between some audio actually arriving at the soundcard, - and the callback getting passed this block of data. - */ - virtual int getInputLatencyInSamples() = 0; - - - //============================================================================== - /** True if this device can show a pop-up control panel for editing its settings. - - This is generally just true of ASIO devices. If true, you can call showControlPanel() - to display it. - */ - virtual bool hasControlPanel() const; - - /** Shows a device-specific control panel if there is one. - - This should only be called for devices which return true from hasControlPanel(). - */ - virtual bool showControlPanel(); - - /** On devices which support it, this allows automatic gain control or other - mic processing to be disabled. - If the device doesn't support this operation, it'll return false. - */ - virtual bool setAudioPreprocessingEnabled (bool shouldBeEnabled); - - //============================================================================== -protected: - /** Creates a device, setting its name and type member variables. */ - AudioIODevice (const String& deviceName, - const String& typeName); - - /** @internal */ - String name, typeName; -}; - - -#endif // JUCE_AUDIOIODEVICE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp deleted file mode 100755 index bdce8f4..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioIODeviceType::AudioIODeviceType (const String& name) - : typeName (name) -{ -} - -AudioIODeviceType::~AudioIODeviceType() -{ -} - -//============================================================================== -void AudioIODeviceType::addListener (Listener* l) { listeners.add (l); } -void AudioIODeviceType::removeListener (Listener* l) { listeners.remove (l); } - -void AudioIODeviceType::callDeviceChangeListeners() -{ - listeners.call (&AudioIODeviceType::Listener::audioDeviceListChanged); -} - -//============================================================================== -#if ! JUCE_MAC -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_CoreAudio() { return nullptr; } -#endif - -#if ! JUCE_IOS -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio() { return nullptr; } -#endif - -#if ! (JUCE_WINDOWS && JUCE_WASAPI) -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool) { return nullptr; } -#endif - -#if ! (JUCE_WINDOWS && JUCE_DIRECTSOUND) -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound() { return nullptr; } -#endif - -#if ! (JUCE_WINDOWS && JUCE_ASIO) -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO() { return nullptr; } -#endif - -#if ! (JUCE_LINUX && JUCE_ALSA) -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA() { return nullptr; } -#endif - -#if ! (JUCE_LINUX && JUCE_JACK) -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK() { return nullptr; } -#endif - -#if ! JUCE_ANDROID -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Android() { return nullptr; } -#endif - -#if ! (JUCE_ANDROID && JUCE_USE_ANDROID_OPENSLES) -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_OpenSLES() { return nullptr; } -#endif diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h deleted file mode 100755 index debfdb2..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_AudioIODeviceType.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOIODEVICETYPE_H_INCLUDED -#define JUCE_AUDIOIODEVICETYPE_H_INCLUDED - - -//============================================================================== -/** - Represents a type of audio driver, such as DirectSound, ASIO, CoreAudio, etc. - - To get a list of available audio driver types, use the AudioDeviceManager::createAudioDeviceTypes() - method. Each of the objects returned can then be used to list the available - devices of that type. E.g. - @code - OwnedArray types; - myAudioDeviceManager.createAudioDeviceTypes (types); - - for (int i = 0; i < types.size(); ++i) - { - String typeName (types[i]->getTypeName()); // This will be things like "DirectSound", "CoreAudio", etc. - - types[i]->scanForDevices(); // This must be called before getting the list of devices - - StringArray deviceNames (types[i]->getDeviceNames()); // This will now return a list of available devices of this type - - for (int j = 0; j < deviceNames.size(); ++j) - { - AudioIODevice* device = types[i]->createDevice (deviceNames [j]); - - ... - } - } - @endcode - - For an easier way of managing audio devices and their settings, have a look at the - AudioDeviceManager class. - - @see AudioIODevice, AudioDeviceManager -*/ -class JUCE_API AudioIODeviceType -{ -public: - //============================================================================== - /** Returns the name of this type of driver that this object manages. - - This will be something like "DirectSound", "ASIO", "CoreAudio", "ALSA", etc. - */ - const String& getTypeName() const noexcept { return typeName; } - - //============================================================================== - /** Refreshes the object's cached list of known devices. - - This must be called at least once before calling getDeviceNames() or any of - the other device creation methods. - */ - virtual void scanForDevices() = 0; - - /** Returns the list of available devices of this type. - - The scanForDevices() method must have been called to create this list. - - @param wantInputNames only really used by DirectSound where devices are split up - into inputs and outputs, this indicates whether to use - the input or output name to refer to a pair of devices. - */ - virtual StringArray getDeviceNames (bool wantInputNames = false) const = 0; - - /** Returns the name of the default device. - - This will be one of the names from the getDeviceNames() list. - - @param forInput if true, this means that a default input device should be - returned; if false, it should return the default output - */ - virtual int getDefaultDeviceIndex (bool forInput) const = 0; - - /** Returns the index of a given device in the list of device names. - If asInput is true, it shows the index in the inputs list, otherwise it - looks for it in the outputs list. - */ - virtual int getIndexOfDevice (AudioIODevice* device, bool asInput) const = 0; - - /** Returns true if two different devices can be used for the input and output. - */ - virtual bool hasSeparateInputsAndOutputs() const = 0; - - /** Creates one of the devices of this type. - - The deviceName must be one of the strings returned by getDeviceNames(), and - scanForDevices() must have been called before this method is used. - */ - virtual AudioIODevice* createDevice (const String& outputDeviceName, - const String& inputDeviceName) = 0; - - //============================================================================== - /** - A class for receiving events when audio devices are inserted or removed. - - You can register an AudioIODeviceType::Listener with an~AudioIODeviceType object - using the AudioIODeviceType::addListener() method, and it will be called when - devices of that type are added or removed. - - @see AudioIODeviceType::addListener, AudioIODeviceType::removeListener - */ - class Listener - { - public: - virtual ~Listener() {} - - /** Called when the list of available audio devices changes. */ - virtual void audioDeviceListChanged() = 0; - }; - - /** Adds a listener that will be called when this type of device is added or - removed from the system. - */ - void addListener (Listener* listener); - - /** Removes a listener that was previously added with addListener(). */ - void removeListener (Listener* listener); - - //============================================================================== - /** Destructor. */ - virtual ~AudioIODeviceType(); - - //============================================================================== - /** Creates a CoreAudio device type if it's available on this platform, or returns null. */ - static AudioIODeviceType* createAudioIODeviceType_CoreAudio(); - /** Creates an iOS device type if it's available on this platform, or returns null. */ - static AudioIODeviceType* createAudioIODeviceType_iOSAudio(); - /** Creates a WASAPI device type if it's available on this platform, or returns null. */ - static AudioIODeviceType* createAudioIODeviceType_WASAPI (bool exclusiveMode); - /** Creates a DirectSound device type if it's available on this platform, or returns null. */ - static AudioIODeviceType* createAudioIODeviceType_DirectSound(); - /** Creates an ASIO device type if it's available on this platform, or returns null. */ - static AudioIODeviceType* createAudioIODeviceType_ASIO(); - /** Creates an ALSA device type if it's available on this platform, or returns null. */ - static AudioIODeviceType* createAudioIODeviceType_ALSA(); - /** Creates a JACK device type if it's available on this platform, or returns null. */ - static AudioIODeviceType* createAudioIODeviceType_JACK(); - /** Creates an Android device type if it's available on this platform, or returns null. */ - static AudioIODeviceType* createAudioIODeviceType_Android(); - /** Creates an Android OpenSLES device type if it's available on this platform, or returns null. */ - static AudioIODeviceType* createAudioIODeviceType_OpenSLES(); - -protected: - explicit AudioIODeviceType (const String& typeName); - - /** Synchronously calls all the registered device list change listeners. */ - void callDeviceChangeListeners(); - -private: - String typeName; - ListenerList listeners; - - JUCE_DECLARE_NON_COPYABLE (AudioIODeviceType) -}; - - -#endif // JUCE_AUDIOIODEVICETYPE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h b/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h deleted file mode 100755 index 689e1f2..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_SYSTEMAUDIOVOLUME_H_INCLUDED -#define JUCE_SYSTEMAUDIOVOLUME_H_INCLUDED - - -//============================================================================== -/** - Contains functions to control the system's master volume. -*/ -class JUCE_API SystemAudioVolume -{ -public: - //============================================================================== - /** Returns the operating system's current volume level in the range 0 to 1.0 */ - static float JUCE_CALLTYPE getGain(); - - /** Attempts to set the operating system's current volume level. - @param newGain the level, between 0 and 1.0 - @returns true if the operation succeeds - */ - static bool JUCE_CALLTYPE setGain (float newGain); - - /** Returns true if the system's audio output is currently muted. */ - static bool JUCE_CALLTYPE isMuted(); - - /** Attempts to mute the operating system's audio output. - @param shouldBeMuted true if you want it to be muted - @returns true if the operation succeeds - */ - static bool JUCE_CALLTYPE setMuted (bool shouldBeMuted); - -private: - SystemAudioVolume(); // Don't instantiate this class, just call its static fns. - JUCE_DECLARE_NON_COPYABLE (SystemAudioVolume) -}; - - -#endif // JUCE_SYSTEMAUDIOVOLUME_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp b/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp deleted file mode 100755 index d35e660..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if defined (JUCE_AUDIO_DEVICES_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE - /* When you add this cpp file to your project, you mustn't include it in a file where you've - already included any other headers - just put it inside a file on its own, possibly with your config - flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix - header files that the compiler may be using. - */ - #error "Incorrect use of JUCE cpp file" -#endif - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../juce_core/native/juce_BasicNativeHeaders.h" -#include "juce_audio_devices.h" - -//============================================================================== -#if JUCE_MAC - #define Point CarbonDummyPointName - #define Component CarbonDummyCompName - #import - #import - #import - #import - #undef Point - #undef Component - -#elif JUCE_IOS - #import - #import - #import - -//============================================================================== -#elif JUCE_WINDOWS - #if JUCE_WASAPI - #include - #endif - - #if JUCE_ASIO - /* This is very frustrating - we only need to use a handful of definitions from - a couple of the header files in Steinberg's ASIO SDK, and it'd be easy to copy - about 30 lines of code into this cpp file to create a fully stand-alone ASIO - implementation... - - ..unfortunately that would break Steinberg's license agreement for use of - their SDK, so I'm not allowed to do this. - - This means that anyone who wants to use JUCE's ASIO abilities will have to: - - 1) Agree to Steinberg's licensing terms and download the ASIO SDK - (see http://www.steinberg.net/en/company/developers.html). - - 2) Enable this code with a global definition #define JUCE_ASIO 1. - - 3) Make sure that your header search path contains the iasiodrv.h file that - comes with the SDK. (Only about a handful of the SDK header files are actually - needed - so to simplify things, you could just copy these into your JUCE directory). - */ - #include - #endif - - #if JUCE_USE_CDBURNER - /* You'll need the Platform SDK for these headers - if you don't have it and don't - need to use CD-burning, then you might just want to set the JUCE_USE_CDBURNER flag - to 0, to avoid these includes. - */ - #include - #include - #endif - -//============================================================================== -#elif JUCE_LINUX - #if JUCE_ALSA - /* Got an include error here? If so, you've either not got ALSA installed, or you've - not got your paths set up correctly to find its header files. - - The package you need to install to get ASLA support is "libasound2-dev". - - If you don't have the ALSA library and don't want to build Juce with audio support, - just set the JUCE_ALSA flag to 0. - */ - #include - #endif - - #if JUCE_JACK - /* Got an include error here? If so, you've either not got jack-audio-connection-kit - installed, or you've not got your paths set up correctly to find its header files. - - The package you need to install to get JACK support is "libjack-dev". - - If you don't have the jack-audio-connection-kit library and don't want to build - Juce with low latency audio support, just set the JUCE_JACK flag to 0. - */ - #include - #endif - #undef SIZEOF - -//============================================================================== -#elif JUCE_ANDROID - - #if JUCE_USE_ANDROID_OPENSLES - #include - #include - #include - #endif - -#endif - -namespace juce -{ - -#include "audio_io/juce_AudioDeviceManager.cpp" -#include "audio_io/juce_AudioIODevice.cpp" -#include "audio_io/juce_AudioIODeviceType.cpp" -#include "midi_io/juce_MidiMessageCollector.cpp" -#include "midi_io/juce_MidiOutput.cpp" -#include "audio_cd/juce_AudioCDReader.cpp" -#include "sources/juce_AudioSourcePlayer.cpp" -#include "sources/juce_AudioTransportSource.cpp" -#include "native/juce_MidiDataConcatenator.h" - -//============================================================================== -#if JUCE_MAC - #include "../juce_core/native/juce_osx_ObjCHelpers.h" - #include "native/juce_mac_CoreAudio.cpp" - #include "native/juce_mac_CoreMidi.cpp" - - #if JUCE_USE_CDREADER - #include "native/juce_mac_AudioCDReader.mm" - #endif - - #if JUCE_USE_CDBURNER - #include "native/juce_mac_AudioCDBurner.mm" - #endif - -//============================================================================== -#elif JUCE_IOS - #include "native/juce_ios_Audio.cpp" - #include "native/juce_mac_CoreMidi.cpp" - -//============================================================================== -#elif JUCE_WINDOWS - #include "../juce_core/native/juce_win32_ComSmartPtr.h" - #include "../juce_events/native/juce_win32_HiddenMessageWindow.h" - - #if JUCE_WASAPI - #include "native/juce_win32_WASAPI.cpp" - #endif - - #if JUCE_DIRECTSOUND - #include "native/juce_win32_DirectSound.cpp" - #endif - - #include "native/juce_win32_Midi.cpp" - - #if JUCE_ASIO - #include "native/juce_win32_ASIO.cpp" - #endif - - #if JUCE_USE_CDREADER - #include "native/juce_win32_AudioCDReader.cpp" - #endif - - #if JUCE_USE_CDBURNER - #include "native/juce_win32_AudioCDBurner.cpp" - #endif - -//============================================================================== -#elif JUCE_LINUX - #if JUCE_ALSA - #include "native/juce_linux_ALSA.cpp" - #endif - - #include "native/juce_linux_Midi.cpp" - - #if JUCE_JACK - #include "native/juce_linux_JackAudio.cpp" - #endif - - #if JUCE_USE_CDREADER - #include "native/juce_linux_AudioCDReader.cpp" - #endif - -//============================================================================== -#elif JUCE_ANDROID - #include "../juce_core/native/juce_android_JNIHelpers.h" - #include "native/juce_android_Audio.cpp" - #include "native/juce_android_Midi.cpp" - - #if JUCE_USE_ANDROID_OPENSLES - #include "native/juce_android_OpenSL.cpp" - #endif - -#endif - -#if ! JUCE_SYSTEMAUDIOVOL_IMPLEMENTED - // None of these methods are available. (On Windows you might need to enable WASAPI for this) - float JUCE_CALLTYPE SystemAudioVolume::getGain() { jassertfalse; return 0.0f; } - bool JUCE_CALLTYPE SystemAudioVolume::setGain (float) { jassertfalse; return false; } - bool JUCE_CALLTYPE SystemAudioVolume::isMuted() { jassertfalse; return false; } - bool JUCE_CALLTYPE SystemAudioVolume::setMuted (bool) { jassertfalse; return false; } -#endif -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h b/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h deleted file mode 100755 index fd63c6f..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIO_DEVICES_H_INCLUDED -#define JUCE_AUDIO_DEVICES_H_INCLUDED - -#include "../juce_events/juce_events.h" -#include "../juce_audio_basics/juce_audio_basics.h" -#include "../juce_audio_formats/juce_audio_formats.h" - -//============================================================================= -/** Config: JUCE_ASIO - Enables ASIO audio devices (MS Windows only). - Turning this on means that you'll need to have the Steinberg ASIO SDK installed - on your Windows build machine. - - See the comments in the ASIOAudioIODevice class's header file for more - info about this. -*/ -#ifndef JUCE_ASIO - #define JUCE_ASIO 0 -#endif - -/** Config: JUCE_WASAPI - Enables WASAPI audio devices (Windows Vista and above). See also the - JUCE_WASAPI_EXCLUSIVE flag. -*/ -#ifndef JUCE_WASAPI - #define JUCE_WASAPI 1 -#endif - -/** Config: JUCE_WASAPI_EXCLUSIVE - Enables WASAPI audio devices in exclusive mode (Windows Vista and above). -*/ -#ifndef JUCE_WASAPI_EXCLUSIVE - #define JUCE_WASAPI_EXCLUSIVE 0 -#endif - - -/** Config: JUCE_DIRECTSOUND - Enables DirectSound audio (MS Windows only). -*/ -#ifndef JUCE_DIRECTSOUND - #define JUCE_DIRECTSOUND 1 -#endif - -/** Config: JUCE_ALSA - Enables ALSA audio devices (Linux only). -*/ -#ifndef JUCE_ALSA - #define JUCE_ALSA 1 -#endif - -/** Config: JUCE_JACK - Enables JACK audio devices (Linux only). -*/ -#ifndef JUCE_JACK - #define JUCE_JACK 0 -#endif - -/** Config: JUCE_USE_ANDROID_OPENSLES - Enables OpenSLES devices (Android only). -*/ -#ifndef JUCE_USE_ANDROID_OPENSLES - #if JUCE_ANDROID_API_VERSION > 8 - #define JUCE_USE_ANDROID_OPENSLES 1 - #else - #define JUCE_USE_ANDROID_OPENSLES 0 - #endif -#endif - -//============================================================================= -/** Config: JUCE_USE_CDREADER - Enables the AudioCDReader class (on supported platforms). -*/ -#ifndef JUCE_USE_CDREADER - #define JUCE_USE_CDREADER 0 -#endif - -/** Config: JUCE_USE_CDBURNER - Enables the AudioCDBurner class (on supported platforms). -*/ -#ifndef JUCE_USE_CDBURNER - #define JUCE_USE_CDBURNER 0 -#endif - -//============================================================================= -namespace juce -{ - -#include "audio_io/juce_AudioIODevice.h" -#include "audio_io/juce_AudioIODeviceType.h" -#include "audio_io/juce_SystemAudioVolume.h" -#include "midi_io/juce_MidiInput.h" -#include "midi_io/juce_MidiMessageCollector.h" -#include "midi_io/juce_MidiOutput.h" -#include "sources/juce_AudioSourcePlayer.h" -#include "sources/juce_AudioTransportSource.h" -#include "audio_cd/juce_AudioCDBurner.h" -#include "audio_cd/juce_AudioCDReader.h" -#include "audio_io/juce_AudioDeviceManager.h" - -} - -#endif // JUCE_AUDIO_DEVICES_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm b/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm deleted file mode 100755 index a135119..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/juce_audio_devices.mm +++ /dev/null @@ -1,25 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#include "juce_audio_devices.cpp" diff --git a/JuceLibraryCode/modules/juce_audio_devices/juce_module_info b/JuceLibraryCode/modules/juce_audio_devices/juce_module_info deleted file mode 100755 index 6712c58..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/juce_module_info +++ /dev/null @@ -1,28 +0,0 @@ -{ - "id": "juce_audio_devices", - "name": "JUCE audio and midi I/O device classes", - "version": "3.1.1", - "description": "Classes to play and record from audio and midi i/o devices.", - "website": "http://www.juce.com/juce", - "license": "GPL/Commercial", - - "dependencies": [ { "id": "juce_audio_basics", "version": "matching" }, - { "id": "juce_audio_formats", "version": "matching" }, - { "id": "juce_events", "version": "matching" } ], - - "include": "juce_audio_devices.h", - - "compile": [ { "file": "juce_audio_devices.cpp", "target": "! xcode" }, - { "file": "juce_audio_devices.mm", "target": "xcode" } ], - - "browse": [ "audio_io/*", - "midi_io/*", - "sources/*", - "audio_cd/*", - "native/*" ], - - "OSXFrameworks": "CoreAudio CoreMIDI DiscRecording", - "iOSFrameworks": "AudioToolbox CoreMIDI", - "LinuxLibs": "asound", - "mingwLibs": "winmm" -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h deleted file mode 100755 index 9b238b3..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiInput.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MIDIINPUT_H_INCLUDED -#define JUCE_MIDIINPUT_H_INCLUDED - -class MidiInput; - - -//============================================================================== -/** - Receives incoming messages from a physical MIDI input device. - - This class is overridden to handle incoming midi messages. See the MidiInput - class for more details. - - @see MidiInput -*/ -class JUCE_API MidiInputCallback -{ -public: - /** Destructor. */ - virtual ~MidiInputCallback() {} - - - /** Receives an incoming message. - - A MidiInput object will call this method when a midi event arrives. It'll be - called on a high-priority system thread, so avoid doing anything time-consuming - in here, and avoid making any UI calls. You might find the MidiBuffer class helpful - for queueing incoming messages for use later. - - @param source the MidiInput object that generated the message - @param message the incoming message. The message's timestamp is set to a value - equivalent to (Time::getMillisecondCounter() / 1000.0) to specify the - time when the message arrived. - */ - virtual void handleIncomingMidiMessage (MidiInput* source, - const MidiMessage& message) = 0; - - /** Notification sent each time a packet of a multi-packet sysex message arrives. - - If a long sysex message is broken up into multiple packets, this callback is made - for each packet that arrives until the message is finished, at which point - the normal handleIncomingMidiMessage() callback will be made with the entire - message. - - The message passed in will contain the start of a sysex, but won't be finished - with the terminating 0xf7 byte. - */ - virtual void handlePartialSysexMessage (MidiInput* source, - const uint8* messageData, - int numBytesSoFar, - double timestamp) - { - // (this bit is just to avoid compiler warnings about unused variables) - (void) source; (void) messageData; (void) numBytesSoFar; (void) timestamp; - } -}; - -//============================================================================== -/** - Represents a midi input device. - - To create one of these, use the static getDevices() method to find out what inputs are - available, and then use the openDevice() method to try to open one. - - @see MidiOutput -*/ -class JUCE_API MidiInput -{ -public: - //============================================================================== - /** Returns a list of the available midi input devices. - - You can open one of the devices by passing its index into the - openDevice() method. - - @see getDefaultDeviceIndex, openDevice - */ - static StringArray getDevices(); - - /** Returns the index of the default midi input device to use. - - This refers to the index in the list returned by getDevices(). - */ - static int getDefaultDeviceIndex(); - - /** Tries to open one of the midi input devices. - - This will return a MidiInput object if it manages to open it. You can then - call start() and stop() on this device, and delete it when no longer needed. - - If the device can't be opened, this will return a null pointer. - - @param deviceIndex the index of a device from the list returned by getDevices() - @param callback the object that will receive the midi messages from this device. - - @see MidiInputCallback, getDevices - */ - static MidiInput* openDevice (int deviceIndex, - MidiInputCallback* callback); - - #if JUCE_LINUX || JUCE_MAC || JUCE_IOS || DOXYGEN - /** This will try to create a new midi input device (Not available on Windows). - - This will attempt to create a new midi input device with the specified name, - for other apps to connect to. - - Returns nullptr if a device can't be created. - - @param deviceName the name to use for the new device - @param callback the object that will receive the midi messages from this device. - */ - static MidiInput* createNewDevice (const String& deviceName, - MidiInputCallback* callback); - #endif - - //============================================================================== - /** Destructor. */ - ~MidiInput(); - - /** Returns the name of this device. */ - const String& getName() const noexcept { return name; } - - /** Allows you to set a custom name for the device, in case you don't like the name - it was given when created. - */ - void setName (const String& newName) noexcept { name = newName; } - - //============================================================================== - /** Starts the device running. - - After calling this, the device will start sending midi messages to the - MidiInputCallback object that was specified when the openDevice() method - was called. - - @see stop - */ - void start(); - - /** Stops the device running. - @see start - */ - void stop(); - -private: - //============================================================================== - String name; - void* internal; - - // The input objects are created with the openDevice() method. - explicit MidiInput (const String&); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInput) -}; - - -#endif // JUCE_MIDIINPUT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp deleted file mode 100755 index 28e81c0..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -MidiMessageCollector::MidiMessageCollector() - : lastCallbackTime (0), - sampleRate (44100.0001) -{ -} - -MidiMessageCollector::~MidiMessageCollector() -{ -} - -//============================================================================== -void MidiMessageCollector::reset (const double sampleRate_) -{ - jassert (sampleRate_ > 0); - - const ScopedLock sl (midiCallbackLock); - sampleRate = sampleRate_; - incomingMessages.clear(); - lastCallbackTime = Time::getMillisecondCounterHiRes(); -} - -void MidiMessageCollector::addMessageToQueue (const MidiMessage& message) -{ - // you need to call reset() to set the correct sample rate before using this object - jassert (sampleRate != 44100.0001); - - // the messages that come in here need to be time-stamped correctly - see MidiInput - // for details of what the number should be. - jassert (message.getTimeStamp() != 0); - - const ScopedLock sl (midiCallbackLock); - - const int sampleNumber - = (int) ((message.getTimeStamp() - 0.001 * lastCallbackTime) * sampleRate); - - incomingMessages.addEvent (message, sampleNumber); - - // if the messages don't get used for over a second, we'd better - // get rid of any old ones to avoid the queue getting too big - if (sampleNumber > sampleRate) - incomingMessages.clear (0, sampleNumber - (int) sampleRate); -} - -void MidiMessageCollector::removeNextBlockOfMessages (MidiBuffer& destBuffer, - const int numSamples) -{ - // you need to call reset() to set the correct sample rate before using this object - jassert (sampleRate != 44100.0001); - jassert (numSamples > 0); - - const double timeNow = Time::getMillisecondCounterHiRes(); - const double msElapsed = timeNow - lastCallbackTime; - - const ScopedLock sl (midiCallbackLock); - lastCallbackTime = timeNow; - - if (! incomingMessages.isEmpty()) - { - int numSourceSamples = jmax (1, roundToInt (msElapsed * 0.001 * sampleRate)); - - int startSample = 0; - int scale = 1 << 16; - - const uint8* midiData; - int numBytes, samplePosition; - - MidiBuffer::Iterator iter (incomingMessages); - - if (numSourceSamples > numSamples) - { - // if our list of events is longer than the buffer we're being - // asked for, scale them down to squeeze them all in.. - const int maxBlockLengthToUse = numSamples << 5; - - if (numSourceSamples > maxBlockLengthToUse) - { - startSample = numSourceSamples - maxBlockLengthToUse; - numSourceSamples = maxBlockLengthToUse; - iter.setNextSamplePosition (startSample); - } - - scale = (numSamples << 10) / numSourceSamples; - - while (iter.getNextEvent (midiData, numBytes, samplePosition)) - { - samplePosition = ((samplePosition - startSample) * scale) >> 10; - - destBuffer.addEvent (midiData, numBytes, - jlimit (0, numSamples - 1, samplePosition)); - } - } - else - { - // if our event list is shorter than the number we need, put them - // towards the end of the buffer - startSample = numSamples - numSourceSamples; - - while (iter.getNextEvent (midiData, numBytes, samplePosition)) - { - destBuffer.addEvent (midiData, numBytes, - jlimit (0, numSamples - 1, samplePosition + startSample)); - } - } - - incomingMessages.clear(); - } -} - -//============================================================================== -void MidiMessageCollector::handleNoteOn (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) -{ - MidiMessage m (MidiMessage::noteOn (midiChannel, midiNoteNumber, velocity)); - m.setTimeStamp (Time::getMillisecondCounterHiRes() * 0.001); - - addMessageToQueue (m); -} - -void MidiMessageCollector::handleNoteOff (MidiKeyboardState*, int midiChannel, int midiNoteNumber) -{ - MidiMessage m (MidiMessage::noteOff (midiChannel, midiNoteNumber)); - m.setTimeStamp (Time::getMillisecondCounterHiRes() * 0.001); - - addMessageToQueue (m); -} - -void MidiMessageCollector::handleIncomingMidiMessage (MidiInput*, const MidiMessage& message) -{ - addMessageToQueue (message); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h deleted file mode 100755 index 5b16737..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiMessageCollector.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MIDIMESSAGECOLLECTOR_H_INCLUDED -#define JUCE_MIDIMESSAGECOLLECTOR_H_INCLUDED - - -//============================================================================== -/** - Collects incoming realtime MIDI messages and turns them into blocks suitable for - processing by a block-based audio callback. - - The class can also be used as either a MidiKeyboardStateListener or a MidiInputCallback - so it can easily use a midi input or keyboard component as its source. - - @see MidiMessage, MidiInput -*/ -class JUCE_API MidiMessageCollector : public MidiKeyboardStateListener, - public MidiInputCallback -{ -public: - //============================================================================== - /** Creates a MidiMessageCollector. */ - MidiMessageCollector(); - - /** Destructor. */ - ~MidiMessageCollector(); - - //============================================================================== - /** Clears any messages from the queue. - - You need to call this method before starting to use the collector, so that - it knows the correct sample rate to use. - */ - void reset (double sampleRate); - - /** Takes an incoming real-time message and adds it to the queue. - - The message's timestamp is taken, and it will be ready for retrieval as part - of the block returned by the next call to removeNextBlockOfMessages(). - - This method is fully thread-safe when overlapping calls are made with - removeNextBlockOfMessages(). - */ - void addMessageToQueue (const MidiMessage& message); - - /** Removes all the pending messages from the queue as a buffer. - - This will also correct the messages' timestamps to make sure they're in - the range 0 to numSamples - 1. - - This call should be made regularly by something like an audio processing - callback, because the time that it happens is used in calculating the - midi event positions. - - This method is fully thread-safe when overlapping calls are made with - addMessageToQueue(). - - Precondition: numSamples must be greater than 0. - */ - void removeNextBlockOfMessages (MidiBuffer& destBuffer, int numSamples); - - - //============================================================================== - /** @internal */ - void handleNoteOn (MidiKeyboardState*, int midiChannel, int midiNoteNumber, float velocity) override; - /** @internal */ - void handleNoteOff (MidiKeyboardState*, int midiChannel, int midiNoteNumber) override; - /** @internal */ - void handleIncomingMidiMessage (MidiInput*, const MidiMessage&) override; - -private: - //============================================================================== - double lastCallbackTime; - CriticalSection midiCallbackLock; - MidiBuffer incomingMessages; - double sampleRate; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiMessageCollector) -}; - - -#endif // JUCE_MIDIMESSAGECOLLECTOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp deleted file mode 100755 index 0af7d1b..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -struct MidiOutput::PendingMessage -{ - PendingMessage (const void* const data, const int len, const double timeStamp) - : message (data, len, timeStamp) - {} - - MidiMessage message; - PendingMessage* next; -}; - -MidiOutput::MidiOutput() - : Thread ("midi out"), - internal (nullptr), - firstMessage (nullptr) -{ -} - -void MidiOutput::sendBlockOfMessages (const MidiBuffer& buffer, - const double millisecondCounterToStartAt, - double samplesPerSecondForBuffer) -{ - // You've got to call startBackgroundThread() for this to actually work.. - jassert (isThreadRunning()); - - // this needs to be a value in the future - RTFM for this method! - jassert (millisecondCounterToStartAt > 0); - - const double timeScaleFactor = 1000.0 / samplesPerSecondForBuffer; - - MidiBuffer::Iterator i (buffer); - - const uint8* data; - int len, time; - - while (i.getNextEvent (data, len, time)) - { - const double eventTime = millisecondCounterToStartAt + timeScaleFactor * time; - - PendingMessage* const m = new PendingMessage (data, len, eventTime); - - const ScopedLock sl (lock); - - if (firstMessage == nullptr || firstMessage->message.getTimeStamp() > eventTime) - { - m->next = firstMessage; - firstMessage = m; - } - else - { - PendingMessage* mm = firstMessage; - - while (mm->next != nullptr && mm->next->message.getTimeStamp() <= eventTime) - mm = mm->next; - - m->next = mm->next; - mm->next = m; - } - } - - notify(); -} - -void MidiOutput::clearAllPendingMessages() -{ - const ScopedLock sl (lock); - - while (firstMessage != nullptr) - { - PendingMessage* const m = firstMessage; - firstMessage = firstMessage->next; - delete m; - } -} - -void MidiOutput::startBackgroundThread() -{ - startThread (9); -} - -void MidiOutput::stopBackgroundThread() -{ - stopThread (5000); -} - -void MidiOutput::run() -{ - while (! threadShouldExit()) - { - uint32 now = Time::getMillisecondCounter(); - uint32 eventTime = 0; - uint32 timeToWait = 500; - - PendingMessage* message; - - { - const ScopedLock sl (lock); - message = firstMessage; - - if (message != nullptr) - { - eventTime = (uint32) roundToInt (message->message.getTimeStamp()); - - if (eventTime > now + 20) - { - timeToWait = eventTime - (now + 20); - message = nullptr; - } - else - { - firstMessage = message->next; - } - } - } - - if (message != nullptr) - { - const ScopedPointer messageDeleter (message); - - if (eventTime > now) - { - Time::waitForMillisecondCounter (eventTime); - - if (threadShouldExit()) - break; - } - - if (eventTime > now - 200) - sendMessageNow (message->message); - } - else - { - jassert (timeToWait < 1000 * 30); - wait ((int) timeToWait); - } - } - - clearAllPendingMessages(); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h b/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h deleted file mode 100755 index ff23d68..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/midi_io/juce_MidiOutput.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MIDIOUTPUT_H_INCLUDED -#define JUCE_MIDIOUTPUT_H_INCLUDED - - -//============================================================================== -/** - Controls a physical MIDI output device. - - To create one of these, use the static getDevices() method to get a list of the - available output devices, then use the openDevice() method to try to open one. - - @see MidiInput -*/ -class JUCE_API MidiOutput : private Thread -{ -public: - //============================================================================== - /** Returns a list of the available midi output devices. - - You can open one of the devices by passing its index into the - openDevice() method. - - @see getDefaultDeviceIndex, openDevice - */ - static StringArray getDevices(); - - /** Returns the index of the default midi output device to use. - - This refers to the index in the list returned by getDevices(). - */ - static int getDefaultDeviceIndex(); - - /** Tries to open one of the midi output devices. - - This will return a MidiOutput object if it manages to open it. You can then - send messages to this device, and delete it when no longer needed. - - If the device can't be opened, this will return a null pointer. - - @param deviceIndex the index of a device from the list returned by getDevices() - @see getDevices - */ - static MidiOutput* openDevice (int deviceIndex); - - - #if JUCE_LINUX || JUCE_MAC || JUCE_IOS || DOXYGEN - /** This will try to create a new midi output device (Not available on Windows). - - This will attempt to create a new midi output device that other apps can connect - to and use as their midi input. - - Returns nullptr if a device can't be created. - - @param deviceName the name to use for the new device - */ - static MidiOutput* createNewDevice (const String& deviceName); - #endif - - //============================================================================== - /** Destructor. */ - ~MidiOutput(); - - /** Makes this device output a midi message. - @see MidiMessage - */ - void sendMessageNow (const MidiMessage& message); - - //============================================================================== - /** This lets you supply a block of messages that will be sent out at some point - in the future. - - The MidiOutput class has an internal thread that can send out timestamped - messages - this appends a set of messages to its internal buffer, ready for - sending. - - This will only work if you've already started the thread with startBackgroundThread(). - - A time is specified, at which the block of messages should be sent. This time uses - the same time base as Time::getMillisecondCounter(), and must be in the future. - - The samplesPerSecondForBuffer parameter indicates the number of samples per second - used by the MidiBuffer. Each event in a MidiBuffer has a sample position, and the - samplesPerSecondForBuffer value is needed to convert this sample position to a - real time. - */ - void sendBlockOfMessages (const MidiBuffer& buffer, - double millisecondCounterToStartAt, - double samplesPerSecondForBuffer); - - /** Gets rid of any midi messages that had been added by sendBlockOfMessages(). */ - void clearAllPendingMessages(); - - /** Starts up a background thread so that the device can send blocks of data. - Call this to get the device ready, before using sendBlockOfMessages(). - */ - void startBackgroundThread(); - - /** Stops the background thread, and clears any pending midi events. - @see startBackgroundThread - */ - void stopBackgroundThread(); - - -private: - //============================================================================== - void* internal; - CriticalSection lock; - struct PendingMessage; - PendingMessage* firstMessage; - - MidiOutput(); // These objects are created with the openDevice() method. - void run() override; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiOutput) -}; - - -#endif // JUCE_MIDIOUTPUT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h b/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h deleted file mode 100755 index 4dc70b9..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_MidiDataConcatenator.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MIDIDATACONCATENATOR_H_INCLUDED -#define JUCE_MIDIDATACONCATENATOR_H_INCLUDED - -//============================================================================== -/** - Helper class that takes chunks of incoming midi bytes, packages them into - messages, and dispatches them to a midi callback. -*/ -class MidiDataConcatenator -{ -public: - //============================================================================== - MidiDataConcatenator (const int initialBufferSize) - : pendingData ((size_t) initialBufferSize), - pendingDataTime (0), pendingBytes (0), runningStatus (0) - { - } - - void reset() - { - pendingBytes = 0; - runningStatus = 0; - pendingDataTime = 0; - } - - template - void pushMidiData (const void* inputData, int numBytes, double time, - UserDataType* input, CallbackType& callback) - { - const uint8* d = static_cast (inputData); - - while (numBytes > 0) - { - if (pendingBytes > 0 || d[0] == 0xf0) - { - processSysex (d, numBytes, time, input, callback); - runningStatus = 0; - } - else - { - int len = 0; - uint8 data[3]; - - while (numBytes > 0) - { - // If there's a realtime message embedded in the middle of - // the normal message, handle it now.. - if (*d >= 0xf8 && *d <= 0xfe) - { - const MidiMessage m (*d++, time); - callback.handleIncomingMidiMessage (input, m); - --numBytes; - } - else - { - if (len == 0 && *d < 0x80 && runningStatus >= 0x80) - data[len++] = runningStatus; - - data[len++] = *d++; - --numBytes; - - if (len >= MidiMessage::getMessageLengthFromFirstByte (data[0])) - break; - } - } - - if (len > 0) - { - int used = 0; - const MidiMessage m (data, len, used, 0, time); - - if (used <= 0) - break; // malformed message.. - - jassert (used == len); - callback.handleIncomingMidiMessage (input, m); - runningStatus = data[0]; - } - } - } - } - -private: - template - void processSysex (const uint8*& d, int& numBytes, double time, - UserDataType* input, CallbackType& callback) - { - if (*d == 0xf0) - { - pendingBytes = 0; - pendingDataTime = time; - } - - pendingData.ensureSize ((size_t) (pendingBytes + numBytes), false); - uint8* totalMessage = static_cast (pendingData.getData()); - uint8* dest = totalMessage + pendingBytes; - - do - { - if (pendingBytes > 0 && *d >= 0x80) - { - if (*d == 0xf7) - { - *dest++ = *d++; - ++pendingBytes; - --numBytes; - break; - } - - if (*d >= 0xfa || *d == 0xf8) - { - callback.handleIncomingMidiMessage (input, MidiMessage (*d, time)); - ++d; - --numBytes; - } - else - { - pendingBytes = 0; - int used = 0; - const MidiMessage m (d, numBytes, used, 0, time); - - if (used > 0) - { - callback.handleIncomingMidiMessage (input, m); - numBytes -= used; - d += used; - } - - break; - } - } - else - { - *dest++ = *d++; - ++pendingBytes; - --numBytes; - } - } - while (numBytes > 0); - - if (pendingBytes > 0) - { - if (totalMessage [pendingBytes - 1] == 0xf7) - { - callback.handleIncomingMidiMessage (input, MidiMessage (totalMessage, pendingBytes, pendingDataTime)); - pendingBytes = 0; - } - else - { - callback.handlePartialSysexMessage (input, totalMessage, pendingBytes, pendingDataTime); - } - } - } - - MemoryBlock pendingData; - double pendingDataTime; - int pendingBytes; - uint8 runningStatus; - - JUCE_DECLARE_NON_COPYABLE (MidiDataConcatenator) -}; - -#endif // JUCE_MIDIDATACONCATENATOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp deleted file mode 100755 index 80711da..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Audio.cpp +++ /dev/null @@ -1,450 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - STATICMETHOD (getMinBufferSize, "getMinBufferSize", "(III)I") \ - STATICMETHOD (getNativeOutputSampleRate, "getNativeOutputSampleRate", "(I)I") \ - METHOD (constructor, "", "(IIIIII)V") \ - METHOD (getState, "getState", "()I") \ - METHOD (play, "play", "()V") \ - METHOD (stop, "stop", "()V") \ - METHOD (release, "release", "()V") \ - METHOD (flush, "flush", "()V") \ - METHOD (write, "write", "([SII)I") \ - -DECLARE_JNI_CLASS (AudioTrack, "android/media/AudioTrack"); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - STATICMETHOD (getMinBufferSize, "getMinBufferSize", "(III)I") \ - METHOD (constructor, "", "(IIIII)V") \ - METHOD (getState, "getState", "()I") \ - METHOD (startRecording, "startRecording", "()V") \ - METHOD (stop, "stop", "()V") \ - METHOD (read, "read", "([SII)I") \ - METHOD (release, "release", "()V") \ - -DECLARE_JNI_CLASS (AudioRecord, "android/media/AudioRecord"); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -enum -{ - CHANNEL_OUT_STEREO = 12, - CHANNEL_IN_STEREO = 12, - CHANNEL_IN_MONO = 16, - ENCODING_PCM_16BIT = 2, - STREAM_MUSIC = 3, - MODE_STREAM = 1, - STATE_UNINITIALIZED = 0 -}; - -const char* const javaAudioTypeName = "Android Audio"; - -//============================================================================== -class AndroidAudioIODevice : public AudioIODevice, - public Thread -{ -public: - //============================================================================== - AndroidAudioIODevice (const String& deviceName) - : AudioIODevice (deviceName, javaAudioTypeName), - Thread ("audio"), - minBufferSizeOut (0), minBufferSizeIn (0), callback (0), sampleRate (0), - numClientInputChannels (0), numDeviceInputChannels (0), numDeviceInputChannelsAvailable (2), - numClientOutputChannels (0), numDeviceOutputChannels (0), - actualBufferSize (0), isRunning (false), - inputChannelBuffer (1, 1), - outputChannelBuffer (1, 1) - { - JNIEnv* env = getEnv(); - sampleRate = env->CallStaticIntMethod (AudioTrack, AudioTrack.getNativeOutputSampleRate, MODE_STREAM); - - minBufferSizeOut = (int) env->CallStaticIntMethod (AudioTrack, AudioTrack.getMinBufferSize, sampleRate, CHANNEL_OUT_STEREO, ENCODING_PCM_16BIT); - minBufferSizeIn = (int) env->CallStaticIntMethod (AudioRecord, AudioRecord.getMinBufferSize, sampleRate, CHANNEL_IN_STEREO, ENCODING_PCM_16BIT); - - if (minBufferSizeIn <= 0) - { - minBufferSizeIn = env->CallStaticIntMethod (AudioRecord, AudioRecord.getMinBufferSize, sampleRate, CHANNEL_IN_MONO, ENCODING_PCM_16BIT); - - if (minBufferSizeIn > 0) - numDeviceInputChannelsAvailable = 1; - else - numDeviceInputChannelsAvailable = 0; - } - - DBG ("Audio device - min buffers: " << minBufferSizeOut << ", " << minBufferSizeIn << "; " - << sampleRate << " Hz; input chans: " << numDeviceInputChannelsAvailable); - } - - ~AndroidAudioIODevice() - { - close(); - } - - StringArray getOutputChannelNames() override - { - StringArray s; - s.add ("Left"); - s.add ("Right"); - return s; - } - - StringArray getInputChannelNames() override - { - StringArray s; - - if (numDeviceInputChannelsAvailable == 2) - { - s.add ("Left"); - s.add ("Right"); - } - else if (numDeviceInputChannelsAvailable == 1) - { - s.add ("Audio Input"); - } - - return s; - } - - Array getAvailableSampleRates() override - { - Array r; - r.add ((double) sampleRate); - return r; - } - - Array getAvailableBufferSizes() override - { - Array b; - int n = 16; - - for (int i = 0; i < 50; ++i) - { - b.add (n); - n += n < 64 ? 16 - : (n < 512 ? 32 - : (n < 1024 ? 64 - : (n < 2048 ? 128 : 256))); - } - - return b; - } - - int getDefaultBufferSize() override { return 2048; } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double requestedSampleRate, - int bufferSize) override - { - close(); - - if (sampleRate != (int) requestedSampleRate) - return "Sample rate not allowed"; - - lastError.clear(); - int preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize; - - numDeviceInputChannels = 0; - numDeviceOutputChannels = 0; - - activeOutputChans = outputChannels; - activeOutputChans.setRange (2, activeOutputChans.getHighestBit(), false); - numClientOutputChannels = activeOutputChans.countNumberOfSetBits(); - - activeInputChans = inputChannels; - activeInputChans.setRange (2, activeInputChans.getHighestBit(), false); - numClientInputChannels = activeInputChans.countNumberOfSetBits(); - - actualBufferSize = preferredBufferSize; - inputChannelBuffer.setSize (2, actualBufferSize); - inputChannelBuffer.clear(); - outputChannelBuffer.setSize (2, actualBufferSize); - outputChannelBuffer.clear(); - - JNIEnv* env = getEnv(); - - if (numClientOutputChannels > 0) - { - numDeviceOutputChannels = 2; - outputDevice = GlobalRef (env->NewObject (AudioTrack, AudioTrack.constructor, - STREAM_MUSIC, sampleRate, CHANNEL_OUT_STEREO, ENCODING_PCM_16BIT, - (jint) (minBufferSizeOut * numDeviceOutputChannels * sizeof (int16)), MODE_STREAM)); - - if (env->CallIntMethod (outputDevice, AudioTrack.getState) != STATE_UNINITIALIZED) - isRunning = true; - else - outputDevice.clear(); // failed to open the device - } - - if (numClientInputChannels > 0 && numDeviceInputChannelsAvailable > 0) - { - numDeviceInputChannels = jmin (numClientInputChannels, numDeviceInputChannelsAvailable); - inputDevice = GlobalRef (env->NewObject (AudioRecord, AudioRecord.constructor, - 0 /* (default audio source) */, sampleRate, - numDeviceInputChannelsAvailable > 1 ? CHANNEL_IN_STEREO : CHANNEL_IN_MONO, - ENCODING_PCM_16BIT, - (jint) (minBufferSizeIn * numDeviceInputChannels * sizeof (int16)))); - - if (env->CallIntMethod (inputDevice, AudioRecord.getState) != STATE_UNINITIALIZED) - isRunning = true; - else - inputDevice.clear(); // failed to open the device - } - - if (isRunning) - { - if (outputDevice != nullptr) - env->CallVoidMethod (outputDevice, AudioTrack.play); - - if (inputDevice != nullptr) - env->CallVoidMethod (inputDevice, AudioRecord.startRecording); - - startThread (8); - } - else - { - closeDevices(); - } - - return lastError; - } - - void close() override - { - if (isRunning) - { - stopThread (2000); - isRunning = false; - closeDevices(); - } - } - - int getOutputLatencyInSamples() override { return (minBufferSizeOut * 3) / 4; } - int getInputLatencyInSamples() override { return (minBufferSizeIn * 3) / 4; } - bool isOpen() override { return isRunning; } - int getCurrentBufferSizeSamples() override { return actualBufferSize; } - int getCurrentBitDepth() override { return 16; } - double getCurrentSampleRate() override { return sampleRate; } - BigInteger getActiveOutputChannels() const override { return activeOutputChans; } - BigInteger getActiveInputChannels() const override { return activeInputChans; } - String getLastError() override { return lastError; } - bool isPlaying() override { return isRunning && callback != 0; } - - void start (AudioIODeviceCallback* newCallback) override - { - if (isRunning && callback != newCallback) - { - if (newCallback != nullptr) - newCallback->audioDeviceAboutToStart (this); - - const ScopedLock sl (callbackLock); - callback = newCallback; - } - } - - void stop() override - { - if (isRunning) - { - AudioIODeviceCallback* lastCallback; - - { - const ScopedLock sl (callbackLock); - lastCallback = callback; - callback = nullptr; - } - - if (lastCallback != nullptr) - lastCallback->audioDeviceStopped(); - } - } - - void run() override - { - JNIEnv* env = getEnv(); - jshortArray audioBuffer = env->NewShortArray (actualBufferSize * jmax (numDeviceOutputChannels, numDeviceInputChannels)); - - while (! threadShouldExit()) - { - if (inputDevice != nullptr) - { - jint numRead = env->CallIntMethod (inputDevice, AudioRecord.read, audioBuffer, 0, actualBufferSize * numDeviceInputChannels); - - if (numRead < actualBufferSize * numDeviceInputChannels) - { - DBG ("Audio read under-run! " << numRead); - } - - jshort* const src = env->GetShortArrayElements (audioBuffer, 0); - - for (int chan = 0; chan < inputChannelBuffer.getNumChannels(); ++chan) - { - AudioData::Pointer d (inputChannelBuffer.getWritePointer (chan)); - - if (chan < numDeviceInputChannels) - { - AudioData::Pointer s (src + chan, numDeviceInputChannels); - d.convertSamples (s, actualBufferSize); - } - else - { - d.clearSamples (actualBufferSize); - } - } - - env->ReleaseShortArrayElements (audioBuffer, src, 0); - } - - if (threadShouldExit()) - break; - - { - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - { - callback->audioDeviceIOCallback (inputChannelBuffer.getArrayOfReadPointers(), numClientInputChannels, - outputChannelBuffer.getArrayOfWritePointers(), numClientOutputChannels, - actualBufferSize); - } - else - { - outputChannelBuffer.clear(); - } - } - - if (outputDevice != nullptr) - { - if (threadShouldExit()) - break; - - jshort* const dest = env->GetShortArrayElements (audioBuffer, 0); - - for (int chan = 0; chan < numDeviceOutputChannels; ++chan) - { - AudioData::Pointer d (dest + chan, numDeviceOutputChannels); - - const float* const sourceChanData = outputChannelBuffer.getReadPointer (jmin (chan, outputChannelBuffer.getNumChannels() - 1)); - AudioData::Pointer s (sourceChanData); - d.convertSamples (s, actualBufferSize); - } - - env->ReleaseShortArrayElements (audioBuffer, dest, 0); - jint numWritten = env->CallIntMethod (outputDevice, AudioTrack.write, audioBuffer, 0, actualBufferSize * numDeviceOutputChannels); - - if (numWritten < actualBufferSize * numDeviceOutputChannels) - { - DBG ("Audio write underrun! " << numWritten); - } - } - } - } - - int minBufferSizeOut, minBufferSizeIn; - -private: - //================================================================================================== - CriticalSection callbackLock; - AudioIODeviceCallback* callback; - jint sampleRate; - int numClientInputChannels, numDeviceInputChannels, numDeviceInputChannelsAvailable; - int numClientOutputChannels, numDeviceOutputChannels; - int actualBufferSize; - bool isRunning; - String lastError; - BigInteger activeOutputChans, activeInputChans; - GlobalRef outputDevice, inputDevice; - AudioSampleBuffer inputChannelBuffer, outputChannelBuffer; - - void closeDevices() - { - if (outputDevice != nullptr) - { - outputDevice.callVoidMethod (AudioTrack.stop); - outputDevice.callVoidMethod (AudioTrack.release); - outputDevice.clear(); - } - - if (inputDevice != nullptr) - { - inputDevice.callVoidMethod (AudioRecord.stop); - inputDevice.callVoidMethod (AudioRecord.release); - inputDevice.clear(); - } - } - - JUCE_DECLARE_NON_COPYABLE (AndroidAudioIODevice) -}; - -//============================================================================== -class AndroidAudioIODeviceType : public AudioIODeviceType -{ -public: - AndroidAudioIODeviceType() : AudioIODeviceType (javaAudioTypeName) {} - - //============================================================================== - void scanForDevices() {} - StringArray getDeviceNames (bool wantInputNames) const { return StringArray (javaAudioTypeName); } - int getDefaultDeviceIndex (bool forInput) const { return 0; } - int getIndexOfDevice (AudioIODevice* device, bool asInput) const { return device != nullptr ? 0 : -1; } - bool hasSeparateInputsAndOutputs() const { return false; } - - AudioIODevice* createDevice (const String& outputDeviceName, - const String& inputDeviceName) - { - ScopedPointer dev; - - if (outputDeviceName.isNotEmpty() || inputDeviceName.isNotEmpty()) - { - dev = new AndroidAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName - : inputDeviceName); - - if (dev->getCurrentSampleRate() <= 0 || dev->getDefaultBufferSize() <= 0) - dev = nullptr; - } - - return dev.release(); - } - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AndroidAudioIODeviceType) -}; - - -//============================================================================== -extern bool isOpenSLAvailable(); - -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_Android() -{ - #if JUCE_USE_ANDROID_OPENSLES - if (isOpenSLAvailable()) - return nullptr; - #endif - - return new AndroidAudioIODeviceType(); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp deleted file mode 100755 index 88eeae6..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_Midi.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -StringArray MidiOutput::getDevices() -{ - StringArray devices; - - return devices; -} - -int MidiOutput::getDefaultDeviceIndex() -{ - return 0; -} - -MidiOutput* MidiOutput::openDevice (int index) -{ - return nullptr; -} - -MidiOutput::~MidiOutput() -{ - stopBackgroundThread(); -} - -void MidiOutput::sendMessageNow (const MidiMessage&) -{ -} - -//============================================================================== -MidiInput::MidiInput (const String& name_) - : name (name_), - internal (0) -{ -} - -MidiInput::~MidiInput() -{ -} - -void MidiInput::start() -{ -} - -void MidiInput::stop() -{ -} - -int MidiInput::getDefaultDeviceIndex() -{ - return 0; -} - -StringArray MidiInput::getDevices() -{ - StringArray devs; - - return devs; -} - -MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback) -{ - return nullptr; -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp deleted file mode 100755 index 53dc5df..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_android_OpenSL.cpp +++ /dev/null @@ -1,632 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -const char* const openSLTypeName = "Android OpenSL"; - -bool isOpenSLAvailable() -{ - DynamicLibrary library; - return library.open ("libOpenSLES.so"); -} - -//============================================================================== -class OpenSLAudioIODevice : public AudioIODevice, - public Thread -{ -public: - OpenSLAudioIODevice (const String& deviceName) - : AudioIODevice (deviceName, openSLTypeName), - Thread ("OpenSL"), - callback (nullptr), sampleRate (0), deviceOpen (false), - inputBuffer (2, 2), outputBuffer (2, 2) - { - // OpenSL has piss-poor support for determining latency, so the only way I can find to - // get a number for this is by asking the AudioTrack/AudioRecord classes.. - AndroidAudioIODevice javaDevice (String::empty); - - // this is a total guess about how to calculate the latency, but seems to vaguely agree - // with the devices I've tested.. YMMV - inputLatency = ((javaDevice.minBufferSizeIn * 2) / 3); - outputLatency = ((javaDevice.minBufferSizeOut * 2) / 3); - - const int longestLatency = jmax (inputLatency, outputLatency); - const int totalLatency = inputLatency + outputLatency; - inputLatency = ((longestLatency * inputLatency) / totalLatency) & ~15; - outputLatency = ((longestLatency * outputLatency) / totalLatency) & ~15; - } - - ~OpenSLAudioIODevice() - { - close(); - } - - bool openedOk() const { return engine.outputMixObject != nullptr; } - - StringArray getOutputChannelNames() override - { - StringArray s; - s.add ("Left"); - s.add ("Right"); - return s; - } - - StringArray getInputChannelNames() override - { - StringArray s; - s.add ("Audio Input"); - return s; - } - - Array getAvailableSampleRates() override - { - static const double rates[] = { 8000.0, 16000.0, 32000.0, 44100.0, 48000.0 }; - return Array (rates, numElementsInArray (rates)); - } - - Array getAvailableBufferSizes() override - { - static const int sizes[] = { 256, 512, 768, 1024, 1280, 1600 }; // must all be multiples of the block size - return Array (sizes, numElementsInArray (sizes)); - } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double requestedSampleRate, - int bufferSize) override - { - close(); - - lastError.clear(); - sampleRate = (int) requestedSampleRate; - - int preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize; - - activeOutputChans = outputChannels; - activeOutputChans.setRange (2, activeOutputChans.getHighestBit(), false); - numOutputChannels = activeOutputChans.countNumberOfSetBits(); - - activeInputChans = inputChannels; - activeInputChans.setRange (1, activeInputChans.getHighestBit(), false); - numInputChannels = activeInputChans.countNumberOfSetBits(); - - actualBufferSize = preferredBufferSize; - - inputBuffer.setSize (jmax (1, numInputChannels), actualBufferSize); - outputBuffer.setSize (jmax (1, numOutputChannels), actualBufferSize); - outputBuffer.clear(); - - recorder = engine.createRecorder (numInputChannels, sampleRate); - player = engine.createPlayer (numOutputChannels, sampleRate); - - startThread (8); - - deviceOpen = true; - return lastError; - } - - void close() override - { - stop(); - stopThread (6000); - deviceOpen = false; - recorder = nullptr; - player = nullptr; - } - - int getDefaultBufferSize() override { return 1024; } - int getOutputLatencyInSamples() override { return outputLatency; } - int getInputLatencyInSamples() override { return inputLatency; } - bool isOpen() override { return deviceOpen; } - int getCurrentBufferSizeSamples() override { return actualBufferSize; } - int getCurrentBitDepth() override { return 16; } - double getCurrentSampleRate() override { return sampleRate; } - BigInteger getActiveOutputChannels() const override { return activeOutputChans; } - BigInteger getActiveInputChannels() const override { return activeInputChans; } - String getLastError() override { return lastError; } - bool isPlaying() override { return callback != nullptr; } - - void start (AudioIODeviceCallback* newCallback) override - { - stop(); - - if (deviceOpen && callback != newCallback) - { - if (newCallback != nullptr) - newCallback->audioDeviceAboutToStart (this); - - setCallback (newCallback); - } - } - - void stop() override - { - if (AudioIODeviceCallback* const oldCallback = setCallback (nullptr)) - oldCallback->audioDeviceStopped(); - } - - bool setAudioPreprocessingEnabled (bool enable) override - { - return recorder != nullptr && recorder->setAudioPreprocessingEnabled (enable); - } - -private: - //================================================================================================== - CriticalSection callbackLock; - AudioIODeviceCallback* callback; - int actualBufferSize, sampleRate; - int inputLatency, outputLatency; - bool deviceOpen; - String lastError; - BigInteger activeOutputChans, activeInputChans; - int numInputChannels, numOutputChannels; - AudioSampleBuffer inputBuffer, outputBuffer; - struct Player; - struct Recorder; - - AudioIODeviceCallback* setCallback (AudioIODeviceCallback* const newCallback) - { - const ScopedLock sl (callbackLock); - AudioIODeviceCallback* const oldCallback = callback; - callback = newCallback; - return oldCallback; - } - - void run() override - { - if (recorder != nullptr) recorder->start(); - if (player != nullptr) player->start(); - - while (! threadShouldExit()) - { - if (player != nullptr) player->writeBuffer (outputBuffer, *this); - if (recorder != nullptr) recorder->readNextBlock (inputBuffer, *this); - - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - { - callback->audioDeviceIOCallback (numInputChannels > 0 ? inputBuffer.getArrayOfReadPointers() : nullptr, numInputChannels, - numOutputChannels > 0 ? outputBuffer.getArrayOfWritePointers() : nullptr, numOutputChannels, - actualBufferSize); - } - else - { - outputBuffer.clear(); - } - } - } - - //================================================================================================== - struct Engine - { - Engine() - : engineObject (nullptr), engineInterface (nullptr), outputMixObject (nullptr) - { - if (library.open ("libOpenSLES.so")) - { - typedef SLresult (*CreateEngineFunc) (SLObjectItf*, SLuint32, const SLEngineOption*, SLuint32, const SLInterfaceID*, const SLboolean*); - - if (CreateEngineFunc createEngine = (CreateEngineFunc) library.getFunction ("slCreateEngine")) - { - check (createEngine (&engineObject, 0, nullptr, 0, nullptr, nullptr)); - - SLInterfaceID* SL_IID_ENGINE = (SLInterfaceID*) library.getFunction ("SL_IID_ENGINE"); - SL_IID_ANDROIDSIMPLEBUFFERQUEUE = (SLInterfaceID*) library.getFunction ("SL_IID_ANDROIDSIMPLEBUFFERQUEUE"); - SL_IID_PLAY = (SLInterfaceID*) library.getFunction ("SL_IID_PLAY"); - SL_IID_RECORD = (SLInterfaceID*) library.getFunction ("SL_IID_RECORD"); - SL_IID_ANDROIDCONFIGURATION = (SLInterfaceID*) library.getFunction ("SL_IID_ANDROIDCONFIGURATION"); - - check ((*engineObject)->Realize (engineObject, SL_BOOLEAN_FALSE)); - check ((*engineObject)->GetInterface (engineObject, *SL_IID_ENGINE, &engineInterface)); - - check ((*engineInterface)->CreateOutputMix (engineInterface, &outputMixObject, 0, nullptr, nullptr)); - check ((*outputMixObject)->Realize (outputMixObject, SL_BOOLEAN_FALSE)); - } - } - } - - ~Engine() - { - if (outputMixObject != nullptr) (*outputMixObject)->Destroy (outputMixObject); - if (engineObject != nullptr) (*engineObject)->Destroy (engineObject); - } - - Player* createPlayer (const int numChannels, const int sampleRate) - { - if (numChannels <= 0) - return nullptr; - - ScopedPointer player (new Player (numChannels, sampleRate, *this)); - return player->openedOk() ? player.release() : nullptr; - } - - Recorder* createRecorder (const int numChannels, const int sampleRate) - { - if (numChannels <= 0) - return nullptr; - - ScopedPointer recorder (new Recorder (numChannels, sampleRate, *this)); - return recorder->openedOk() ? recorder.release() : nullptr; - } - - SLObjectItf engineObject; - SLEngineItf engineInterface; - SLObjectItf outputMixObject; - - SLInterfaceID* SL_IID_ANDROIDSIMPLEBUFFERQUEUE; - SLInterfaceID* SL_IID_PLAY; - SLInterfaceID* SL_IID_RECORD; - SLInterfaceID* SL_IID_ANDROIDCONFIGURATION; - - private: - DynamicLibrary library; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Engine) - }; - - //================================================================================================== - struct BufferList - { - BufferList (const int numChannels_) - : numChannels (numChannels_), bufferSpace (numChannels_ * numSamples * numBuffers), nextBlock (0) - { - } - - int16* waitForFreeBuffer (Thread& threadToCheck) - { - while (numBlocksOut.get() == numBuffers) - { - dataArrived.wait (1); - - if (threadToCheck.threadShouldExit()) - return nullptr; - } - - return getNextBuffer(); - } - - int16* getNextBuffer() - { - if (++nextBlock == numBuffers) - nextBlock = 0; - - return bufferSpace + nextBlock * numChannels * numSamples; - } - - void bufferReturned() { --numBlocksOut; dataArrived.signal(); } - void bufferSent() { ++numBlocksOut; dataArrived.signal(); } - - int getBufferSizeBytes() const { return numChannels * numSamples * sizeof (int16); } - - const int numChannels; - enum { numSamples = 256, numBuffers = 16 }; - - private: - HeapBlock bufferSpace; - int nextBlock; - Atomic numBlocksOut; - WaitableEvent dataArrived; - }; - - //================================================================================================== - struct Player - { - Player (int numChannels, int sampleRate, Engine& engine) - : playerObject (nullptr), playerPlay (nullptr), playerBufferQueue (nullptr), - bufferList (numChannels) - { - jassert (numChannels == 2); - - SLDataFormat_PCM pcmFormat = - { - SL_DATAFORMAT_PCM, - (SLuint32) numChannels, - (SLuint32) (sampleRate * 1000), // (sample rate units are millihertz) - SL_PCMSAMPLEFORMAT_FIXED_16, - SL_PCMSAMPLEFORMAT_FIXED_16, - SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT, - SL_BYTEORDER_LITTLEENDIAN - }; - - SLDataLocator_AndroidSimpleBufferQueue bufferQueue = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, bufferList.numBuffers }; - SLDataSource audioSrc = { &bufferQueue, &pcmFormat }; - - SLDataLocator_OutputMix outputMix = { SL_DATALOCATOR_OUTPUTMIX, engine.outputMixObject }; - SLDataSink audioSink = { &outputMix, nullptr }; - - // (SL_IID_BUFFERQUEUE is not guaranteed to remain future-proof, so use SL_IID_ANDROIDSIMPLEBUFFERQUEUE) - const SLInterfaceID interfaceIDs[] = { *engine.SL_IID_ANDROIDSIMPLEBUFFERQUEUE }; - const SLboolean flags[] = { SL_BOOLEAN_TRUE }; - - check ((*engine.engineInterface)->CreateAudioPlayer (engine.engineInterface, &playerObject, &audioSrc, &audioSink, - 1, interfaceIDs, flags)); - - check ((*playerObject)->Realize (playerObject, SL_BOOLEAN_FALSE)); - check ((*playerObject)->GetInterface (playerObject, *engine.SL_IID_PLAY, &playerPlay)); - check ((*playerObject)->GetInterface (playerObject, *engine.SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &playerBufferQueue)); - check ((*playerBufferQueue)->RegisterCallback (playerBufferQueue, staticCallback, this)); - } - - ~Player() - { - if (playerPlay != nullptr) - check ((*playerPlay)->SetPlayState (playerPlay, SL_PLAYSTATE_STOPPED)); - - if (playerBufferQueue != nullptr) - check ((*playerBufferQueue)->Clear (playerBufferQueue)); - - if (playerObject != nullptr) - (*playerObject)->Destroy (playerObject); - } - - bool openedOk() const noexcept { return playerBufferQueue != nullptr; } - - void start() - { - jassert (openedOk()); - check ((*playerPlay)->SetPlayState (playerPlay, SL_PLAYSTATE_PLAYING)); - } - - void writeBuffer (const AudioSampleBuffer& buffer, Thread& thread) - { - jassert (buffer.getNumChannels() == bufferList.numChannels); - jassert (buffer.getNumSamples() < bufferList.numSamples * bufferList.numBuffers); - - int offset = 0; - int numSamples = buffer.getNumSamples(); - - while (numSamples > 0) - { - int16* const destBuffer = bufferList.waitForFreeBuffer (thread); - - if (destBuffer == nullptr) - break; - - for (int i = 0; i < bufferList.numChannels; ++i) - { - typedef AudioData::Pointer DstSampleType; - typedef AudioData::Pointer SrcSampleType; - - DstSampleType dstData (destBuffer + i, bufferList.numChannels); - SrcSampleType srcData (buffer.getReadPointer (i, offset)); - dstData.convertSamples (srcData, bufferList.numSamples); - } - - check ((*playerBufferQueue)->Enqueue (playerBufferQueue, destBuffer, bufferList.getBufferSizeBytes())); - bufferList.bufferSent(); - - numSamples -= bufferList.numSamples; - offset += bufferList.numSamples; - } - } - - private: - SLObjectItf playerObject; - SLPlayItf playerPlay; - SLAndroidSimpleBufferQueueItf playerBufferQueue; - - BufferList bufferList; - - static void staticCallback (SLAndroidSimpleBufferQueueItf queue, void* context) - { - jassert (queue == static_cast (context)->playerBufferQueue); (void) queue; - static_cast (context)->bufferList.bufferReturned(); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Player) - }; - - //================================================================================================== - struct Recorder - { - Recorder (int numChannels, int sampleRate, Engine& engine) - : recorderObject (nullptr), recorderRecord (nullptr), - recorderBufferQueue (nullptr), configObject (nullptr), - bufferList (numChannels) - { - jassert (numChannels == 1); // STEREO doesn't always work!! - - SLDataFormat_PCM pcmFormat = - { - SL_DATAFORMAT_PCM, - (SLuint32) numChannels, - (SLuint32) (sampleRate * 1000), // (sample rate units are millihertz) - SL_PCMSAMPLEFORMAT_FIXED_16, - SL_PCMSAMPLEFORMAT_FIXED_16, - (numChannels == 1) ? SL_SPEAKER_FRONT_CENTER : (SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT), - SL_BYTEORDER_LITTLEENDIAN - }; - - SLDataLocator_IODevice ioDevice = { SL_DATALOCATOR_IODEVICE, SL_IODEVICE_AUDIOINPUT, SL_DEFAULTDEVICEID_AUDIOINPUT, nullptr }; - SLDataSource audioSrc = { &ioDevice, nullptr }; - - SLDataLocator_AndroidSimpleBufferQueue bufferQueue = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, bufferList.numBuffers }; - SLDataSink audioSink = { &bufferQueue, &pcmFormat }; - - const SLInterfaceID interfaceIDs[] = { *engine.SL_IID_ANDROIDSIMPLEBUFFERQUEUE }; - const SLboolean flags[] = { SL_BOOLEAN_TRUE }; - - if (check ((*engine.engineInterface)->CreateAudioRecorder (engine.engineInterface, &recorderObject, &audioSrc, - &audioSink, 1, interfaceIDs, flags))) - { - if (check ((*recorderObject)->Realize (recorderObject, SL_BOOLEAN_FALSE))) - { - check ((*recorderObject)->GetInterface (recorderObject, *engine.SL_IID_RECORD, &recorderRecord)); - check ((*recorderObject)->GetInterface (recorderObject, *engine.SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &recorderBufferQueue)); - check ((*recorderObject)->GetInterface (recorderObject, *engine.SL_IID_ANDROIDCONFIGURATION, &configObject)); - check ((*recorderBufferQueue)->RegisterCallback (recorderBufferQueue, staticCallback, this)); - check ((*recorderRecord)->SetRecordState (recorderRecord, SL_RECORDSTATE_STOPPED)); - - for (int i = bufferList.numBuffers; --i >= 0;) - { - int16* const buffer = bufferList.getNextBuffer(); - jassert (buffer != nullptr); - enqueueBuffer (buffer); - } - } - } - } - - ~Recorder() - { - if (recorderRecord != nullptr) - check ((*recorderRecord)->SetRecordState (recorderRecord, SL_RECORDSTATE_STOPPED)); - - if (recorderBufferQueue != nullptr) - check ((*recorderBufferQueue)->Clear (recorderBufferQueue)); - - if (recorderObject != nullptr) - (*recorderObject)->Destroy (recorderObject); - } - - bool openedOk() const noexcept { return recorderBufferQueue != nullptr; } - - void start() - { - jassert (openedOk()); - check ((*recorderRecord)->SetRecordState (recorderRecord, SL_RECORDSTATE_RECORDING)); - } - - void readNextBlock (AudioSampleBuffer& buffer, Thread& thread) - { - jassert (buffer.getNumChannels() == bufferList.numChannels); - jassert (buffer.getNumSamples() < bufferList.numSamples * bufferList.numBuffers); - jassert ((buffer.getNumSamples() % bufferList.numSamples) == 0); - - int offset = 0; - int numSamples = buffer.getNumSamples(); - - while (numSamples > 0) - { - int16* const srcBuffer = bufferList.waitForFreeBuffer (thread); - - if (srcBuffer == nullptr) - break; - - for (int i = 0; i < bufferList.numChannels; ++i) - { - typedef AudioData::Pointer DstSampleType; - typedef AudioData::Pointer SrcSampleType; - - DstSampleType dstData (buffer.getWritePointer (i, offset)); - SrcSampleType srcData (srcBuffer + i, bufferList.numChannels); - dstData.convertSamples (srcData, bufferList.numSamples); - } - - enqueueBuffer (srcBuffer); - - numSamples -= bufferList.numSamples; - offset += bufferList.numSamples; - } - } - - bool setAudioPreprocessingEnabled (bool enable) - { - SLuint32 mode = enable ? SL_ANDROID_RECORDING_PRESET_GENERIC - : SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION; - - return configObject != nullptr - && check ((*configObject)->SetConfiguration (configObject, SL_ANDROID_KEY_RECORDING_PRESET, &mode, sizeof (mode))); - } - - private: - SLObjectItf recorderObject; - SLRecordItf recorderRecord; - SLAndroidSimpleBufferQueueItf recorderBufferQueue; - SLAndroidConfigurationItf configObject; - - BufferList bufferList; - - void enqueueBuffer (int16* buffer) - { - check ((*recorderBufferQueue)->Enqueue (recorderBufferQueue, buffer, bufferList.getBufferSizeBytes())); - bufferList.bufferSent(); - } - - static void staticCallback (SLAndroidSimpleBufferQueueItf queue, void* context) - { - jassert (queue == static_cast (context)->recorderBufferQueue); (void) queue; - static_cast (context)->bufferList.bufferReturned(); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Recorder) - }; - - - //============================================================================== - Engine engine; - - ScopedPointer player; - ScopedPointer recorder; - - //============================================================================== - static bool check (const SLresult result) - { - jassert (result == SL_RESULT_SUCCESS); - return result == SL_RESULT_SUCCESS; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenSLAudioIODevice) -}; - - -//============================================================================== -class OpenSLAudioDeviceType : public AudioIODeviceType -{ -public: - OpenSLAudioDeviceType() : AudioIODeviceType (openSLTypeName) {} - - //============================================================================== - void scanForDevices() {} - StringArray getDeviceNames (bool wantInputNames) const { return StringArray (openSLTypeName); } - int getDefaultDeviceIndex (bool forInput) const { return 0; } - int getIndexOfDevice (AudioIODevice* device, bool asInput) const { return device != nullptr ? 0 : -1; } - bool hasSeparateInputsAndOutputs() const { return false; } - - AudioIODevice* createDevice (const String& outputDeviceName, - const String& inputDeviceName) - { - ScopedPointer dev; - - if (outputDeviceName.isNotEmpty() || inputDeviceName.isNotEmpty()) - { - dev = new OpenSLAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName - : inputDeviceName); - if (! dev->openedOk()) - dev = nullptr; - } - - return dev.release(); - } - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenSLAudioDeviceType) -}; - - -//============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_OpenSLES() -{ - return isOpenSLAvailable() ? new OpenSLAudioDeviceType() : nullptr; -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp deleted file mode 100755 index 70490aa..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_ios_Audio.cpp +++ /dev/null @@ -1,576 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class iOSAudioIODevice : public AudioIODevice -{ -public: - iOSAudioIODevice (const String& deviceName) - : AudioIODevice (deviceName, "Audio"), - actualBufferSize (0), - isRunning (false), - audioUnit (0), - callback (nullptr), - floatData (1, 2) - { - getSessionHolder().activeDevices.add (this); - - numInputChannels = 2; - numOutputChannels = 2; - preferredBufferSize = 0; - - updateDeviceInfo(); - } - - ~iOSAudioIODevice() - { - getSessionHolder().activeDevices.removeFirstMatchingValue (this); - close(); - } - - StringArray getOutputChannelNames() override - { - StringArray s; - s.add ("Left"); - s.add ("Right"); - return s; - } - - StringArray getInputChannelNames() override - { - StringArray s; - if (audioInputIsAvailable) - { - s.add ("Left"); - s.add ("Right"); - } - return s; - } - - Array getAvailableSampleRates() override - { - // can't find a good way to actually ask the device for which of these it supports.. - static const double rates[] = { 8000.0, 16000.0, 22050.0, 32000.0, 44100.0, 48000.0 }; - return Array (rates, numElementsInArray (rates)); - } - - Array getAvailableBufferSizes() override - { - Array r; - - for (int i = 6; i < 12; ++i) - r.add (1 << i); - - return r; - } - - int getDefaultBufferSize() override { return 1024; } - - String open (const BigInteger& inputChannelsWanted, - const BigInteger& outputChannelsWanted, - double targetSampleRate, int bufferSize) override - { - close(); - - lastError.clear(); - preferredBufferSize = (bufferSize <= 0) ? getDefaultBufferSize() : bufferSize; - - // xxx set up channel mapping - - activeOutputChans = outputChannelsWanted; - activeOutputChans.setRange (2, activeOutputChans.getHighestBit(), false); - numOutputChannels = activeOutputChans.countNumberOfSetBits(); - monoOutputChannelNumber = activeOutputChans.findNextSetBit (0); - - activeInputChans = inputChannelsWanted; - activeInputChans.setRange (2, activeInputChans.getHighestBit(), false); - numInputChannels = activeInputChans.countNumberOfSetBits(); - monoInputChannelNumber = activeInputChans.findNextSetBit (0); - - AudioSessionSetActive (true); - - if (numInputChannels > 0 && audioInputIsAvailable) - { - setSessionUInt32Property (kAudioSessionProperty_AudioCategory, kAudioSessionCategory_PlayAndRecord); - setSessionUInt32Property (kAudioSessionProperty_OverrideCategoryEnableBluetoothInput, 1); - } - else - { - setSessionUInt32Property (kAudioSessionProperty_AudioCategory, kAudioSessionCategory_MediaPlayback); - } - - AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, routingChangedStatic, this); - - fixAudioRouteIfSetToReceiver(); - - setSessionFloat64Property (kAudioSessionProperty_PreferredHardwareSampleRate, targetSampleRate); - updateDeviceInfo(); - - setSessionFloat32Property (kAudioSessionProperty_PreferredHardwareIOBufferDuration, preferredBufferSize / sampleRate); - updateCurrentBufferSize(); - - prepareFloatBuffers (actualBufferSize); - - isRunning = true; - routingChanged (nullptr); // creates and starts the AU - - lastError = audioUnit != 0 ? "" : "Couldn't open the device"; - return lastError; - } - - void close() override - { - if (isRunning) - { - isRunning = false; - - setSessionUInt32Property (kAudioSessionProperty_AudioCategory, kAudioSessionCategory_MediaPlayback); - - AudioSessionRemovePropertyListenerWithUserData (kAudioSessionProperty_AudioRouteChange, routingChangedStatic, this); - AudioSessionSetActive (false); - - if (audioUnit != 0) - { - AudioComponentInstanceDispose (audioUnit); - audioUnit = 0; - } - } - } - - bool isOpen() override { return isRunning; } - - int getCurrentBufferSizeSamples() override { return actualBufferSize; } - double getCurrentSampleRate() override { return sampleRate; } - int getCurrentBitDepth() override { return 16; } - - BigInteger getActiveOutputChannels() const override { return activeOutputChans; } - BigInteger getActiveInputChannels() const override { return activeInputChans; } - - int getOutputLatencyInSamples() override { return getLatency (kAudioSessionProperty_CurrentHardwareOutputLatency); } - int getInputLatencyInSamples() override { return getLatency (kAudioSessionProperty_CurrentHardwareInputLatency); } - - int getLatency (AudioSessionPropertyID propID) - { - Float32 latency = 0; - getSessionProperty (propID, latency); - return roundToInt (latency * getCurrentSampleRate()); - } - - void start (AudioIODeviceCallback* newCallback) override - { - if (isRunning && callback != newCallback) - { - if (newCallback != nullptr) - newCallback->audioDeviceAboutToStart (this); - - const ScopedLock sl (callbackLock); - callback = newCallback; - } - } - - void stop() override - { - if (isRunning) - { - AudioIODeviceCallback* lastCallback; - - { - const ScopedLock sl (callbackLock); - lastCallback = callback; - callback = nullptr; - } - - if (lastCallback != nullptr) - lastCallback->audioDeviceStopped(); - } - } - - bool isPlaying() override { return isRunning && callback != nullptr; } - String getLastError() override { return lastError; } - - bool setAudioPreprocessingEnabled (bool enable) override - { - return setSessionUInt32Property (kAudioSessionProperty_Mode, enable ? kAudioSessionMode_Default - : kAudioSessionMode_Measurement); - } - -private: - //================================================================================================== - CriticalSection callbackLock; - Float64 sampleRate; - int numInputChannels, numOutputChannels; - int preferredBufferSize, actualBufferSize; - bool isRunning; - String lastError; - - AudioStreamBasicDescription format; - AudioUnit audioUnit; - UInt32 audioInputIsAvailable; - AudioIODeviceCallback* callback; - BigInteger activeOutputChans, activeInputChans; - - AudioSampleBuffer floatData; - float* inputChannels[3]; - float* outputChannels[3]; - bool monoInputChannelNumber, monoOutputChannelNumber; - - void prepareFloatBuffers (int bufferSize) - { - if (numInputChannels + numOutputChannels > 0) - { - floatData.setSize (numInputChannels + numOutputChannels, bufferSize); - zeromem (inputChannels, sizeof (inputChannels)); - zeromem (outputChannels, sizeof (outputChannels)); - - for (int i = 0; i < numInputChannels; ++i) - inputChannels[i] = floatData.getWritePointer (i); - - for (int i = 0; i < numOutputChannels; ++i) - outputChannels[i] = floatData.getWritePointer (i + numInputChannels); - } - } - - //================================================================================================== - OSStatus process (AudioUnitRenderActionFlags* flags, const AudioTimeStamp* time, - const UInt32 numFrames, AudioBufferList* data) - { - OSStatus err = noErr; - - if (audioInputIsAvailable && numInputChannels > 0) - err = AudioUnitRender (audioUnit, flags, time, 1, numFrames, data); - - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - { - if ((int) numFrames > floatData.getNumSamples()) - prepareFloatBuffers ((int) numFrames); - - if (audioInputIsAvailable && numInputChannels > 0) - { - short* shortData = (short*) data->mBuffers[0].mData; - - if (numInputChannels >= 2) - { - for (UInt32 i = 0; i < numFrames; ++i) - { - inputChannels[0][i] = *shortData++ * (1.0f / 32768.0f); - inputChannels[1][i] = *shortData++ * (1.0f / 32768.0f); - } - } - else - { - if (monoInputChannelNumber > 0) - ++shortData; - - for (UInt32 i = 0; i < numFrames; ++i) - { - inputChannels[0][i] = *shortData++ * (1.0f / 32768.0f); - ++shortData; - } - } - } - else - { - for (int i = numInputChannels; --i >= 0;) - zeromem (inputChannels[i], sizeof (float) * numFrames); - } - - callback->audioDeviceIOCallback ((const float**) inputChannels, numInputChannels, - outputChannels, numOutputChannels, (int) numFrames); - - short* shortData = (short*) data->mBuffers[0].mData; - int n = 0; - - if (numOutputChannels >= 2) - { - for (UInt32 i = 0; i < numFrames; ++i) - { - shortData [n++] = (short) (outputChannels[0][i] * 32767.0f); - shortData [n++] = (short) (outputChannels[1][i] * 32767.0f); - } - } - else if (numOutputChannels == 1) - { - for (UInt32 i = 0; i < numFrames; ++i) - { - const short s = (short) (outputChannels[monoOutputChannelNumber][i] * 32767.0f); - shortData [n++] = s; - shortData [n++] = s; - } - } - else - { - zeromem (data->mBuffers[0].mData, 2 * sizeof (short) * numFrames); - } - } - else - { - zeromem (data->mBuffers[0].mData, 2 * sizeof (short) * numFrames); - } - - return err; - } - - void updateDeviceInfo() - { - getSessionProperty (kAudioSessionProperty_CurrentHardwareSampleRate, sampleRate); - getSessionProperty (kAudioSessionProperty_AudioInputAvailable, audioInputIsAvailable); - } - - void updateCurrentBufferSize() - { - Float32 bufferDuration = sampleRate > 0 ? (Float32) (preferredBufferSize / sampleRate) : 0.0f; - getSessionProperty (kAudioSessionProperty_CurrentHardwareIOBufferDuration, bufferDuration); - actualBufferSize = (int) (sampleRate * bufferDuration + 0.5); - } - - void routingChanged (const void* propertyValue) - { - if (! isRunning) - return; - - if (propertyValue != nullptr) - { - CFDictionaryRef routeChangeDictionary = (CFDictionaryRef) propertyValue; - CFNumberRef routeChangeReasonRef = (CFNumberRef) CFDictionaryGetValue (routeChangeDictionary, - CFSTR (kAudioSession_AudioRouteChangeKey_Reason)); - - SInt32 routeChangeReason; - CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason); - - if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) - { - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - callback->audioDeviceError ("Old device unavailable"); - } - } - - updateDeviceInfo(); - createAudioUnit(); - - AudioSessionSetActive (true); - - if (audioUnit != 0) - { - UInt32 formatSize = sizeof (format); - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &format, &formatSize); - - updateCurrentBufferSize(); - AudioOutputUnitStart (audioUnit); - } - } - - //================================================================================================== - struct AudioSessionHolder - { - AudioSessionHolder() - { - AudioSessionInitialize (0, 0, interruptionListenerCallback, this); - } - - static void interruptionListenerCallback (void* client, UInt32 interruptionType) - { - const Array & activeDevices = static_cast (client)->activeDevices; - - for (int i = activeDevices.size(); --i >= 0;) - activeDevices.getUnchecked(i)->interruptionListener (interruptionType); - } - - Array activeDevices; - }; - - static AudioSessionHolder& getSessionHolder() - { - static AudioSessionHolder audioSessionHolder; - return audioSessionHolder; - } - - void interruptionListener (const UInt32 interruptionType) - { - if (interruptionType == kAudioSessionBeginInterruption) - { - isRunning = false; - AudioOutputUnitStop (audioUnit); - AudioSessionSetActive (false); - - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - callback->audioDeviceError ("iOS audio session interruption"); - } - - if (interruptionType == kAudioSessionEndInterruption) - { - isRunning = true; - AudioSessionSetActive (true); - AudioOutputUnitStart (audioUnit); - - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - callback->audioDeviceError ("iOS audio session resumed"); - } - } - - //================================================================================================== - static OSStatus processStatic (void* client, AudioUnitRenderActionFlags* flags, const AudioTimeStamp* time, - UInt32 /*busNumber*/, UInt32 numFrames, AudioBufferList* data) - { - return static_cast (client)->process (flags, time, numFrames, data); - } - - static void routingChangedStatic (void* client, AudioSessionPropertyID, UInt32 /*inDataSize*/, const void* propertyValue) - { - static_cast (client)->routingChanged (propertyValue); - } - - //================================================================================================== - void resetFormat (const int numChannels) noexcept - { - zerostruct (format); - format.mFormatID = kAudioFormatLinearPCM; - format.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked | kAudioFormatFlagsNativeEndian; - format.mBitsPerChannel = 8 * sizeof (short); - format.mChannelsPerFrame = (UInt32) numChannels; - format.mFramesPerPacket = 1; - format.mBytesPerFrame = format.mBytesPerPacket = (UInt32) numChannels * sizeof (short); - } - - bool createAudioUnit() - { - if (audioUnit != 0) - { - AudioComponentInstanceDispose (audioUnit); - audioUnit = 0; - } - - resetFormat (2); - - AudioComponentDescription desc; - desc.componentType = kAudioUnitType_Output; - desc.componentSubType = kAudioUnitSubType_RemoteIO; - desc.componentManufacturer = kAudioUnitManufacturer_Apple; - desc.componentFlags = 0; - desc.componentFlagsMask = 0; - - AudioComponent comp = AudioComponentFindNext (0, &desc); - AudioComponentInstanceNew (comp, &audioUnit); - - if (audioUnit == 0) - return false; - - if (numInputChannels > 0) - { - const UInt32 one = 1; - AudioUnitSetProperty (audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, 1, &one, sizeof (one)); - } - - { - AudioChannelLayout layout; - layout.mChannelBitmap = 0; - layout.mNumberChannelDescriptions = 0; - layout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_AudioChannelLayout, kAudioUnitScope_Input, 0, &layout, sizeof (layout)); - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_AudioChannelLayout, kAudioUnitScope_Output, 0, &layout, sizeof (layout)); - } - - { - AURenderCallbackStruct inputProc; - inputProc.inputProc = processStatic; - inputProc.inputProcRefCon = this; - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input, 0, &inputProc, sizeof (inputProc)); - } - - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &format, sizeof (format)); - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &format, sizeof (format)); - - AudioUnitInitialize (audioUnit); - return true; - } - - // If the routing is set to go through the receiver (i.e. the speaker, but quiet), this re-routes it - // to make it loud. Needed because by default when using an input + output, the output is kept quiet. - static void fixAudioRouteIfSetToReceiver() - { - CFStringRef audioRoute = 0; - if (getSessionProperty (kAudioSessionProperty_AudioRoute, audioRoute) == noErr) - { - NSString* route = (NSString*) audioRoute; - - //DBG ("audio route: " + nsStringToJuce (route)); - - if ([route hasPrefix: @"Receiver"]) - setSessionUInt32Property (kAudioSessionProperty_OverrideAudioRoute, kAudioSessionOverrideAudioRoute_Speaker); - - CFRelease (audioRoute); - } - } - - template - static OSStatus getSessionProperty (AudioSessionPropertyID propID, Type& result) noexcept - { - UInt32 valueSize = sizeof (result); - return AudioSessionGetProperty (propID, &valueSize, &result); - } - - static bool setSessionUInt32Property (AudioSessionPropertyID propID, UInt32 v) noexcept { return AudioSessionSetProperty (propID, sizeof (v), &v) == kAudioSessionNoError; } - static bool setSessionFloat32Property (AudioSessionPropertyID propID, Float32 v) noexcept { return AudioSessionSetProperty (propID, sizeof (v), &v) == kAudioSessionNoError; } - static bool setSessionFloat64Property (AudioSessionPropertyID propID, Float64 v) noexcept { return AudioSessionSetProperty (propID, sizeof (v), &v) == kAudioSessionNoError; } - - JUCE_DECLARE_NON_COPYABLE (iOSAudioIODevice) -}; - - -//============================================================================== -class iOSAudioIODeviceType : public AudioIODeviceType -{ -public: - iOSAudioIODeviceType() : AudioIODeviceType ("iOS Audio") {} - - void scanForDevices() {} - StringArray getDeviceNames (bool /*wantInputNames*/) const { return StringArray ("iOS Audio"); } - int getDefaultDeviceIndex (bool /*forInput*/) const { return 0; } - int getIndexOfDevice (AudioIODevice* d, bool /*asInput*/) const { return d != nullptr ? 0 : -1; } - bool hasSeparateInputsAndOutputs() const { return false; } - - AudioIODevice* createDevice (const String& outputDeviceName, const String& inputDeviceName) - { - if (outputDeviceName.isNotEmpty() || inputDeviceName.isNotEmpty()) - return new iOSAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName - : inputDeviceName); - - return nullptr; - } - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (iOSAudioIODeviceType) -}; - -//============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_iOSAudio() -{ - return new iOSAudioIODeviceType(); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp deleted file mode 100755 index edbe361..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_ALSA.cpp +++ /dev/null @@ -1,1257 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace -{ - -#ifndef JUCE_ALSA_LOGGING - #define JUCE_ALSA_LOGGING 0 -#endif - -#if JUCE_ALSA_LOGGING - #define JUCE_ALSA_LOG(dbgtext) { juce::String tempDbgBuf ("ALSA: "); tempDbgBuf << dbgtext; Logger::writeToLog (tempDbgBuf); DBG (tempDbgBuf); } - #define JUCE_CHECKED_RESULT(x) (logErrorMessage (x, __LINE__)) - - static int logErrorMessage (int err, int lineNum) - { - if (err < 0) - JUCE_ALSA_LOG ("Error: line " << lineNum << ": code " << err << " (" << snd_strerror (err) << ")"); - - return err; - } -#else - #define JUCE_ALSA_LOG(x) {} - #define JUCE_CHECKED_RESULT(x) (x) -#endif - -#define JUCE_ALSA_FAILED(x) failed (x) - -static void getDeviceSampleRates (snd_pcm_t* handle, Array& rates) -{ - const int ratesToTry[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 }; - - snd_pcm_hw_params_t* hwParams; - snd_pcm_hw_params_alloca (&hwParams); - - for (int i = 0; ratesToTry[i] != 0; ++i) - { - if (snd_pcm_hw_params_any (handle, hwParams) >= 0 - && snd_pcm_hw_params_test_rate (handle, hwParams, ratesToTry[i], 0) == 0) - { - rates.addIfNotAlreadyThere ((double) ratesToTry[i]); - } - } -} - -static void getDeviceNumChannels (snd_pcm_t* handle, unsigned int* minChans, unsigned int* maxChans) -{ - snd_pcm_hw_params_t *params; - snd_pcm_hw_params_alloca (¶ms); - - if (snd_pcm_hw_params_any (handle, params) >= 0) - { - snd_pcm_hw_params_get_channels_min (params, minChans); - snd_pcm_hw_params_get_channels_max (params, maxChans); - - JUCE_ALSA_LOG ("getDeviceNumChannels: " << (int) *minChans << " " << (int) *maxChans); - - // some virtual devices (dmix for example) report 10000 channels , we have to clamp these values - *maxChans = jmin (*maxChans, 32u); - *minChans = jmin (*minChans, *maxChans); - } - else - { - JUCE_ALSA_LOG ("getDeviceNumChannels failed"); - } -} - -static void getDeviceProperties (const String& deviceID, - unsigned int& minChansOut, - unsigned int& maxChansOut, - unsigned int& minChansIn, - unsigned int& maxChansIn, - Array& rates, - bool testOutput, - bool testInput) -{ - minChansOut = maxChansOut = minChansIn = maxChansIn = 0; - - if (deviceID.isEmpty()) - return; - - JUCE_ALSA_LOG ("getDeviceProperties(" << deviceID.toUTF8().getAddress() << ")"); - - snd_pcm_info_t* info; - snd_pcm_info_alloca (&info); - - if (testOutput) - { - snd_pcm_t* pcmHandle; - - if (JUCE_CHECKED_RESULT (snd_pcm_open (&pcmHandle, deviceID.toUTF8().getAddress(), SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) >= 0) - { - getDeviceNumChannels (pcmHandle, &minChansOut, &maxChansOut); - getDeviceSampleRates (pcmHandle, rates); - - snd_pcm_close (pcmHandle); - } - } - - if (testInput) - { - snd_pcm_t* pcmHandle; - - if (JUCE_CHECKED_RESULT (snd_pcm_open (&pcmHandle, deviceID.toUTF8(), SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK) >= 0)) - { - getDeviceNumChannels (pcmHandle, &minChansIn, &maxChansIn); - - if (rates.size() == 0) - getDeviceSampleRates (pcmHandle, rates); - - snd_pcm_close (pcmHandle); - } - } -} - -static void ensureMinimumNumBitsSet (BigInteger& chans, int minNumChans) -{ - int i = 0; - - while (chans.countNumberOfSetBits() < minNumChans) - chans.setBit (i++); -} - -static void silentErrorHandler (const char*, int, const char*, int, const char*,...) {} - -//============================================================================== -class ALSADevice -{ -public: - ALSADevice (const String& devID, bool forInput) - : handle (nullptr), - bitDepth (16), - numChannelsRunning (0), - latency (0), - deviceID (devID), - isInput (forInput), - isInterleaved (true) - { - JUCE_ALSA_LOG ("snd_pcm_open (" << deviceID.toUTF8().getAddress() << ", forInput=" << forInput << ")"); - - int err = snd_pcm_open (&handle, deviceID.toUTF8(), - forInput ? SND_PCM_STREAM_CAPTURE : SND_PCM_STREAM_PLAYBACK, - SND_PCM_ASYNC); - if (err < 0) - { - if (-err == EBUSY) - error << "The device \"" << deviceID << "\" is busy (another application is using it)."; - else if (-err == ENOENT) - error << "The device \"" << deviceID << "\" is not available."; - else - error << "Could not open " << (forInput ? "input" : "output") << " device \"" << deviceID - << "\": " << snd_strerror(err) << " (" << err << ")"; - - JUCE_ALSA_LOG ("snd_pcm_open failed; " << error); - } - } - - ~ALSADevice() - { - closeNow(); - } - - void closeNow() - { - if (handle != nullptr) - { - snd_pcm_close (handle); - handle = nullptr; - } - } - - bool setParameters (unsigned int sampleRate, int numChannels, int bufferSize) - { - if (handle == nullptr) - return false; - - JUCE_ALSA_LOG ("ALSADevice::setParameters(" << deviceID << ", " - << (int) sampleRate << ", " << numChannels << ", " << bufferSize << ")"); - - snd_pcm_hw_params_t* hwParams; - snd_pcm_hw_params_alloca (&hwParams); - - if (snd_pcm_hw_params_any (handle, hwParams) < 0) - { - // this is the error message that aplay returns when an error happens here, - // it is a bit more explicit that "Invalid parameter" - error = "Broken configuration for this PCM: no configurations available"; - return false; - } - - if (snd_pcm_hw_params_set_access (handle, hwParams, SND_PCM_ACCESS_RW_INTERLEAVED) >= 0) // works better for plughw.. - isInterleaved = true; - else if (snd_pcm_hw_params_set_access (handle, hwParams, SND_PCM_ACCESS_RW_NONINTERLEAVED) >= 0) - isInterleaved = false; - else - { - jassertfalse; - return false; - } - - enum { isFloatBit = 1 << 16, isLittleEndianBit = 1 << 17, onlyUseLower24Bits = 1 << 18 }; - - const int formatsToTry[] = { SND_PCM_FORMAT_FLOAT_LE, 32 | isFloatBit | isLittleEndianBit, - SND_PCM_FORMAT_FLOAT_BE, 32 | isFloatBit, - SND_PCM_FORMAT_S32_LE, 32 | isLittleEndianBit, - SND_PCM_FORMAT_S32_BE, 32, - SND_PCM_FORMAT_S24_3LE, 24 | isLittleEndianBit, - SND_PCM_FORMAT_S24_3BE, 24, - SND_PCM_FORMAT_S24_LE, 32 | isLittleEndianBit | onlyUseLower24Bits, - SND_PCM_FORMAT_S16_LE, 16 | isLittleEndianBit, - SND_PCM_FORMAT_S16_BE, 16 }; - bitDepth = 0; - - for (int i = 0; i < numElementsInArray (formatsToTry); i += 2) - { - if (snd_pcm_hw_params_set_format (handle, hwParams, (_snd_pcm_format) formatsToTry [i]) >= 0) - { - const int type = formatsToTry [i + 1]; - bitDepth = type & 255; - - converter = createConverter (isInput, bitDepth, - (type & isFloatBit) != 0, - (type & isLittleEndianBit) != 0, - (type & onlyUseLower24Bits) != 0, - numChannels); - break; - } - } - - if (bitDepth == 0) - { - error = "device doesn't support a compatible PCM format"; - JUCE_ALSA_LOG ("Error: " + error); - return false; - } - - int dir = 0; - unsigned int periods = 4; - snd_pcm_uframes_t samplesPerPeriod = bufferSize; - - if (JUCE_ALSA_FAILED (snd_pcm_hw_params_set_rate_near (handle, hwParams, &sampleRate, 0)) - || JUCE_ALSA_FAILED (snd_pcm_hw_params_set_channels (handle, hwParams, numChannels)) - || JUCE_ALSA_FAILED (snd_pcm_hw_params_set_periods_near (handle, hwParams, &periods, &dir)) - || JUCE_ALSA_FAILED (snd_pcm_hw_params_set_period_size_near (handle, hwParams, &samplesPerPeriod, &dir)) - || JUCE_ALSA_FAILED (snd_pcm_hw_params (handle, hwParams))) - { - return false; - } - - snd_pcm_uframes_t frames = 0; - - if (JUCE_ALSA_FAILED (snd_pcm_hw_params_get_period_size (hwParams, &frames, &dir)) - || JUCE_ALSA_FAILED (snd_pcm_hw_params_get_periods (hwParams, &periods, &dir))) - latency = 0; - else - latency = frames * (periods - 1); // (this is the method JACK uses to guess the latency..) - - JUCE_ALSA_LOG ("frames: " << (int) frames << ", periods: " << (int) periods - << ", samplesPerPeriod: " << (int) samplesPerPeriod); - - snd_pcm_sw_params_t* swParams; - snd_pcm_sw_params_alloca (&swParams); - snd_pcm_uframes_t boundary; - - if (JUCE_ALSA_FAILED (snd_pcm_sw_params_current (handle, swParams)) - || JUCE_ALSA_FAILED (snd_pcm_sw_params_get_boundary (swParams, &boundary)) - || JUCE_ALSA_FAILED (snd_pcm_sw_params_set_silence_threshold (handle, swParams, 0)) - || JUCE_ALSA_FAILED (snd_pcm_sw_params_set_silence_size (handle, swParams, boundary)) - || JUCE_ALSA_FAILED (snd_pcm_sw_params_set_start_threshold (handle, swParams, samplesPerPeriod)) - || JUCE_ALSA_FAILED (snd_pcm_sw_params_set_stop_threshold (handle, swParams, boundary)) - || JUCE_ALSA_FAILED (snd_pcm_sw_params (handle, swParams))) - { - return false; - } - - #if JUCE_ALSA_LOGGING - // enable this to dump the config of the devices that get opened - snd_output_t* out; - snd_output_stdio_attach (&out, stderr, 0); - snd_pcm_hw_params_dump (hwParams, out); - snd_pcm_sw_params_dump (swParams, out); - #endif - - numChannelsRunning = numChannels; - - return true; - } - - //============================================================================== - bool writeToOutputDevice (AudioSampleBuffer& outputChannelBuffer, const int numSamples) - { - jassert (numChannelsRunning <= outputChannelBuffer.getNumChannels()); - float* const* const data = outputChannelBuffer.getArrayOfWritePointers(); - snd_pcm_sframes_t numDone = 0; - - if (isInterleaved) - { - scratch.ensureSize (sizeof (float) * numSamples * numChannelsRunning, false); - - for (int i = 0; i < numChannelsRunning; ++i) - converter->convertSamples (scratch.getData(), i, data[i], 0, numSamples); - - numDone = snd_pcm_writei (handle, scratch.getData(), numSamples); - } - else - { - for (int i = 0; i < numChannelsRunning; ++i) - converter->convertSamples (data[i], data[i], numSamples); - - numDone = snd_pcm_writen (handle, (void**) data, numSamples); - } - - if (numDone < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, numDone, 1 /* silent */))) - return false; - - if (numDone < numSamples) - JUCE_ALSA_LOG ("Did not write all samples: numDone: " << numDone << ", numSamples: " << numSamples); - - return true; - } - - bool readFromInputDevice (AudioSampleBuffer& inputChannelBuffer, const int numSamples) - { - jassert (numChannelsRunning <= inputChannelBuffer.getNumChannels()); - float* const* const data = inputChannelBuffer.getArrayOfWritePointers(); - - if (isInterleaved) - { - scratch.ensureSize (sizeof (float) * numSamples * numChannelsRunning, false); - scratch.fillWith (0); // (not clearing this data causes warnings in valgrind) - - snd_pcm_sframes_t num = snd_pcm_readi (handle, scratch.getData(), numSamples); - - if (num < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, num, 1 /* silent */))) - return false; - - if (num < numSamples) - JUCE_ALSA_LOG ("Did not read all samples: num: " << num << ", numSamples: " << numSamples); - - for (int i = 0; i < numChannelsRunning; ++i) - converter->convertSamples (data[i], 0, scratch.getData(), i, numSamples); - } - else - { - snd_pcm_sframes_t num = snd_pcm_readn (handle, (void**) data, numSamples); - - if (num < 0 && JUCE_ALSA_FAILED (snd_pcm_recover (handle, num, 1 /* silent */))) - return false; - - if (num < numSamples) - JUCE_ALSA_LOG ("Did not read all samples: num: " << num << ", numSamples: " << numSamples); - - for (int i = 0; i < numChannelsRunning; ++i) - converter->convertSamples (data[i], data[i], numSamples); - } - - return true; - } - - //============================================================================== - snd_pcm_t* handle; - String error; - int bitDepth, numChannelsRunning, latency; - -private: - //============================================================================== - String deviceID; - const bool isInput; - bool isInterleaved; - MemoryBlock scratch; - ScopedPointer converter; - - //============================================================================== - template - struct ConverterHelper - { - static AudioData::Converter* createConverter (const bool forInput, const bool isLittleEndian, const int numInterleavedChannels) - { - if (forInput) - { - typedef AudioData::Pointer DestType; - - if (isLittleEndian) - return new AudioData::ConverterInstance , DestType> (numInterleavedChannels, 1); - - return new AudioData::ConverterInstance , DestType> (numInterleavedChannels, 1); - } - - typedef AudioData::Pointer SourceType; - - if (isLittleEndian) - return new AudioData::ConverterInstance > (1, numInterleavedChannels); - - return new AudioData::ConverterInstance > (1, numInterleavedChannels); - } - }; - - static AudioData::Converter* createConverter (bool forInput, int bitDepth, - bool isFloat, bool isLittleEndian, bool useOnlyLower24Bits, - int numInterleavedChannels) - { - JUCE_ALSA_LOG ("format: bitDepth=" << bitDepth << ", isFloat=" << isFloat - << ", isLittleEndian=" << isLittleEndian << ", numChannels=" << numInterleavedChannels); - - if (isFloat) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); - if (bitDepth == 16) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); - if (bitDepth == 24) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); - - jassert (bitDepth == 32); - - if (useOnlyLower24Bits) - return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); - - return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); - } - - //============================================================================== - bool failed (const int errorNum) - { - if (errorNum >= 0) - return false; - - error = snd_strerror (errorNum); - JUCE_ALSA_LOG ("ALSA error: " << error); - return true; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ALSADevice) -}; - -//============================================================================== -class ALSAThread : public Thread -{ -public: - ALSAThread (const String& inputDeviceID, const String& outputDeviceID) - : Thread ("Juce ALSA"), - sampleRate (0), - bufferSize (0), - outputLatency (0), - inputLatency (0), - callback (0), - inputId (inputDeviceID), - outputId (outputDeviceID), - numCallbacks (0), - audioIoInProgress (false), - inputChannelBuffer (1, 1), - outputChannelBuffer (1, 1) - { - initialiseRatesAndChannels(); - } - - ~ALSAThread() - { - close(); - } - - void open (BigInteger inputChannels, - BigInteger outputChannels, - const double newSampleRate, - const int newBufferSize) - { - close(); - - error.clear(); - sampleRate = newSampleRate; - bufferSize = newBufferSize; - - inputChannelBuffer.setSize (jmax ((int) minChansIn, inputChannels.getHighestBit()) + 1, bufferSize); - inputChannelBuffer.clear(); - inputChannelDataForCallback.clear(); - currentInputChans.clear(); - - if (inputChannels.getHighestBit() >= 0) - { - for (int i = 0; i <= jmax (inputChannels.getHighestBit(), (int) minChansIn); ++i) - { - if (inputChannels[i]) - { - inputChannelDataForCallback.add (inputChannelBuffer.getReadPointer (i)); - currentInputChans.setBit (i); - } - } - } - - ensureMinimumNumBitsSet (outputChannels, minChansOut); - - outputChannelBuffer.setSize (jmax ((int) minChansOut, outputChannels.getHighestBit()) + 1, bufferSize); - outputChannelBuffer.clear(); - outputChannelDataForCallback.clear(); - currentOutputChans.clear(); - - if (outputChannels.getHighestBit() >= 0) - { - for (int i = 0; i <= jmax (outputChannels.getHighestBit(), (int) minChansOut); ++i) - { - if (outputChannels[i]) - { - outputChannelDataForCallback.add (outputChannelBuffer.getWritePointer (i)); - currentOutputChans.setBit (i); - } - } - } - - if (outputChannelDataForCallback.size() > 0 && outputId.isNotEmpty()) - { - outputDevice = new ALSADevice (outputId, false); - - if (outputDevice->error.isNotEmpty()) - { - error = outputDevice->error; - outputDevice = nullptr; - return; - } - - if (! outputDevice->setParameters ((unsigned int) sampleRate, - jlimit ((int) minChansOut, (int) maxChansOut, - currentOutputChans.getHighestBit() + 1), - bufferSize)) - { - error = outputDevice->error; - outputDevice = nullptr; - return; - } - - outputLatency = outputDevice->latency; - } - - if (inputChannelDataForCallback.size() > 0 && inputId.isNotEmpty()) - { - inputDevice = new ALSADevice (inputId, true); - - if (inputDevice->error.isNotEmpty()) - { - error = inputDevice->error; - inputDevice = nullptr; - return; - } - - ensureMinimumNumBitsSet (currentInputChans, minChansIn); - - if (! inputDevice->setParameters ((unsigned int) sampleRate, - jlimit ((int) minChansIn, (int) maxChansIn, currentInputChans.getHighestBit() + 1), - bufferSize)) - { - error = inputDevice->error; - inputDevice = nullptr; - return; - } - - inputLatency = inputDevice->latency; - } - - if (outputDevice == nullptr && inputDevice == nullptr) - { - error = "no channels"; - return; - } - - if (outputDevice != nullptr && inputDevice != nullptr) - snd_pcm_link (outputDevice->handle, inputDevice->handle); - - if (inputDevice != nullptr && JUCE_ALSA_FAILED (snd_pcm_prepare (inputDevice->handle))) - return; - - if (outputDevice != nullptr && JUCE_ALSA_FAILED (snd_pcm_prepare (outputDevice->handle))) - return; - - startThread (9); - - int count = 1000; - - while (numCallbacks == 0) - { - sleep (5); - - if (--count < 0 || ! isThreadRunning()) - { - error = "device didn't start"; - break; - } - } - } - - void close() - { - if (isThreadRunning()) - { - // problem: when pulseaudio is suspended (with pasuspend) , the ALSAThread::run is just stuck in - // snd_pcm_writei -- no error, no nothing it just stays stuck. So the only way I found to exit "nicely" - // (that is without the "killing thread by force" of stopThread) , is to just call snd_pcm_close from - // here which will cause the thread to resume, and exit - signalThreadShouldExit(); - - const int callbacksToStop = numCallbacks; - - if ((! waitForThreadToExit (400)) && audioIoInProgress && numCallbacks == callbacksToStop) - { - JUCE_ALSA_LOG ("Thread is stuck in i/o.. Is pulseaudio suspended?"); - - if (outputDevice != nullptr) outputDevice->closeNow(); - if (inputDevice != nullptr) inputDevice->closeNow(); - } - } - - stopThread (6000); - - inputDevice = nullptr; - outputDevice = nullptr; - - inputChannelBuffer.setSize (1, 1); - outputChannelBuffer.setSize (1, 1); - - numCallbacks = 0; - } - - void setCallback (AudioIODeviceCallback* const newCallback) noexcept - { - const ScopedLock sl (callbackLock); - callback = newCallback; - } - - void run() override - { - while (! threadShouldExit()) - { - if (inputDevice != nullptr && inputDevice->handle != nullptr) - { - if (outputDevice == nullptr || outputDevice->handle == nullptr) - { - JUCE_ALSA_FAILED (snd_pcm_wait (inputDevice->handle, 2000)); - - if (threadShouldExit()) - break; - - snd_pcm_sframes_t avail = snd_pcm_avail_update (inputDevice->handle); - - if (avail < 0) - JUCE_ALSA_FAILED (snd_pcm_recover (inputDevice->handle, avail, 0)); - } - - audioIoInProgress = true; - - if (! inputDevice->readFromInputDevice (inputChannelBuffer, bufferSize)) - { - JUCE_ALSA_LOG ("Read failure"); - break; - } - - audioIoInProgress = false; - } - - if (threadShouldExit()) - break; - - { - const ScopedLock sl (callbackLock); - ++numCallbacks; - - if (callback != nullptr) - { - callback->audioDeviceIOCallback (inputChannelDataForCallback.getRawDataPointer(), - inputChannelDataForCallback.size(), - outputChannelDataForCallback.getRawDataPointer(), - outputChannelDataForCallback.size(), - bufferSize); - } - else - { - for (int i = 0; i < outputChannelDataForCallback.size(); ++i) - zeromem (outputChannelDataForCallback[i], sizeof (float) * bufferSize); - } - } - - if (outputDevice != nullptr && outputDevice->handle != nullptr) - { - JUCE_ALSA_FAILED (snd_pcm_wait (outputDevice->handle, 2000)); - - if (threadShouldExit()) - break; - - snd_pcm_sframes_t avail = snd_pcm_avail_update (outputDevice->handle); - - if (avail < 0) - JUCE_ALSA_FAILED (snd_pcm_recover (outputDevice->handle, avail, 0)); - - audioIoInProgress = true; - - if (! outputDevice->writeToOutputDevice (outputChannelBuffer, bufferSize)) - { - JUCE_ALSA_LOG ("write failure"); - break; - } - - audioIoInProgress = false; - } - } - - audioIoInProgress = false; - } - - int getBitDepth() const noexcept - { - if (outputDevice != nullptr) - return outputDevice->bitDepth; - - if (inputDevice != nullptr) - return inputDevice->bitDepth; - - return 16; - } - - //============================================================================== - String error; - double sampleRate; - int bufferSize, outputLatency, inputLatency; - BigInteger currentInputChans, currentOutputChans; - - Array sampleRates; - StringArray channelNamesOut, channelNamesIn; - AudioIODeviceCallback* callback; - -private: - //============================================================================== - const String inputId, outputId; - ScopedPointer outputDevice, inputDevice; - int numCallbacks; - bool audioIoInProgress; - - CriticalSection callbackLock; - - AudioSampleBuffer inputChannelBuffer, outputChannelBuffer; - Array inputChannelDataForCallback; - Array outputChannelDataForCallback; - - unsigned int minChansOut, maxChansOut; - unsigned int minChansIn, maxChansIn; - - bool failed (const int errorNum) - { - if (errorNum >= 0) - return false; - - error = snd_strerror (errorNum); - JUCE_ALSA_LOG ("ALSA error: " << error); - return true; - } - - void initialiseRatesAndChannels() - { - sampleRates.clear(); - channelNamesOut.clear(); - channelNamesIn.clear(); - minChansOut = 0; - maxChansOut = 0; - minChansIn = 0; - maxChansIn = 0; - unsigned int dummy = 0; - - getDeviceProperties (inputId, dummy, dummy, minChansIn, maxChansIn, sampleRates, false, true); - getDeviceProperties (outputId, minChansOut, maxChansOut, dummy, dummy, sampleRates, true, false); - - for (unsigned int i = 0; i < maxChansOut; ++i) - channelNamesOut.add ("channel " + String ((int) i + 1)); - - for (unsigned int i = 0; i < maxChansIn; ++i) - channelNamesIn.add ("channel " + String ((int) i + 1)); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ALSAThread) -}; - - -//============================================================================== -class ALSAAudioIODevice : public AudioIODevice -{ -public: - ALSAAudioIODevice (const String& deviceName, - const String& typeName, - const String& inputDeviceID, - const String& outputDeviceID) - : AudioIODevice (deviceName, typeName), - inputId (inputDeviceID), - outputId (outputDeviceID), - isOpen_ (false), - isStarted (false), - internal (inputDeviceID, outputDeviceID) - { - } - - ~ALSAAudioIODevice() - { - close(); - } - - StringArray getOutputChannelNames() override { return internal.channelNamesOut; } - StringArray getInputChannelNames() override { return internal.channelNamesIn; } - - Array getAvailableSampleRates() override { return internal.sampleRates; } - - Array getAvailableBufferSizes() override - { - Array r; - int n = 16; - - for (int i = 0; i < 50; ++i) - { - r.add (n); - n += n < 64 ? 16 - : (n < 512 ? 32 - : (n < 1024 ? 64 - : (n < 2048 ? 128 : 256))); - } - - return r; - } - - int getDefaultBufferSize() override { return 512; } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sampleRate, - int bufferSizeSamples) override - { - close(); - - if (bufferSizeSamples <= 0) - bufferSizeSamples = getDefaultBufferSize(); - - if (sampleRate <= 0) - { - for (int i = 0; i < internal.sampleRates.size(); ++i) - { - double rate = internal.sampleRates[i]; - - if (rate >= 44100) - { - sampleRate = rate; - break; - } - } - } - - internal.open (inputChannels, outputChannels, - sampleRate, bufferSizeSamples); - - isOpen_ = internal.error.isEmpty(); - return internal.error; - } - - void close() override - { - stop(); - internal.close(); - isOpen_ = false; - } - - bool isOpen() override { return isOpen_; } - bool isPlaying() override { return isStarted && internal.error.isEmpty(); } - String getLastError() override { return internal.error; } - - int getCurrentBufferSizeSamples() override { return internal.bufferSize; } - double getCurrentSampleRate() override { return internal.sampleRate; } - int getCurrentBitDepth() override { return internal.getBitDepth(); } - - BigInteger getActiveOutputChannels() const override { return internal.currentOutputChans; } - BigInteger getActiveInputChannels() const override { return internal.currentInputChans; } - - int getOutputLatencyInSamples() override { return internal.outputLatency; } - int getInputLatencyInSamples() override { return internal.inputLatency; } - - void start (AudioIODeviceCallback* callback) override - { - if (! isOpen_) - callback = nullptr; - - if (callback != nullptr) - callback->audioDeviceAboutToStart (this); - - internal.setCallback (callback); - - isStarted = (callback != nullptr); - } - - void stop() override - { - AudioIODeviceCallback* const oldCallback = internal.callback; - - start (nullptr); - - if (oldCallback != nullptr) - oldCallback->audioDeviceStopped(); - } - - String inputId, outputId; - -private: - bool isOpen_, isStarted; - ALSAThread internal; -}; - - -//============================================================================== -class ALSAAudioIODeviceType : public AudioIODeviceType -{ -public: - ALSAAudioIODeviceType (bool onlySoundcards, const String &typeName) - : AudioIODeviceType (typeName), - hasScanned (false), - listOnlySoundcards (onlySoundcards) - { - #if ! JUCE_ALSA_LOGGING - snd_lib_error_set_handler (&silentErrorHandler); - #endif - } - - ~ALSAAudioIODeviceType() - { - #if ! JUCE_ALSA_LOGGING - snd_lib_error_set_handler (nullptr); - #endif - - snd_config_update_free_global(); // prevent valgrind from screaming about alsa leaks - } - - //============================================================================== - void scanForDevices() - { - if (hasScanned) - return; - - hasScanned = true; - inputNames.clear(); - inputIds.clear(); - outputNames.clear(); - outputIds.clear(); - - JUCE_ALSA_LOG ("scanForDevices()"); - - if (listOnlySoundcards) - enumerateAlsaSoundcards(); - else - enumerateAlsaPCMDevices(); - - inputNames.appendNumbersToDuplicates (false, true); - outputNames.appendNumbersToDuplicates (false, true); - } - - StringArray getDeviceNames (bool wantInputNames) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - return wantInputNames ? inputNames : outputNames; - } - - int getDefaultDeviceIndex (bool forInput) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - const int idx = (forInput ? inputIds : outputIds).indexOf ("default"); - return idx >= 0 ? idx : 0; - } - - bool hasSeparateInputsAndOutputs() const { return true; } - - int getIndexOfDevice (AudioIODevice* device, bool asInput) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - if (ALSAAudioIODevice* d = dynamic_cast (device)) - return asInput ? inputIds.indexOf (d->inputId) - : outputIds.indexOf (d->outputId); - - return -1; - } - - AudioIODevice* createDevice (const String& outputDeviceName, - const String& inputDeviceName) - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - const int inputIndex = inputNames.indexOf (inputDeviceName); - const int outputIndex = outputNames.indexOf (outputDeviceName); - - String deviceName (outputIndex >= 0 ? outputDeviceName - : inputDeviceName); - - if (inputIndex >= 0 || outputIndex >= 0) - return new ALSAAudioIODevice (deviceName, getTypeName(), - inputIds [inputIndex], - outputIds [outputIndex]); - - return nullptr; - } - -private: - //============================================================================== - StringArray inputNames, outputNames, inputIds, outputIds; - bool hasScanned, listOnlySoundcards; - - bool testDevice (const String &id, const String &outputName, const String &inputName) - { - unsigned int minChansOut = 0, maxChansOut = 0; - unsigned int minChansIn = 0, maxChansIn = 0; - Array rates; - - bool isInput = inputName.isNotEmpty(), isOutput = outputName.isNotEmpty(); - getDeviceProperties (id, minChansOut, maxChansOut, minChansIn, maxChansIn, rates, isOutput, isInput); - - isInput = maxChansIn > 0; - isOutput = maxChansOut > 0; - - if ((isInput || isOutput) && rates.size() > 0) - { - JUCE_ALSA_LOG ("testDevice: '" << id.toUTF8().getAddress() << "' -> isInput: " - << isInput << ", isOutput: " << isOutput); - - if (isInput) - { - inputNames.add (inputName); - inputIds.add (id); - } - - if (isOutput) - { - outputNames.add (outputName); - outputIds.add (id); - } - - return isInput || isOutput; - } - - return false; - } - - void enumerateAlsaSoundcards() - { - snd_ctl_t* handle = nullptr; - snd_ctl_card_info_t* info = nullptr; - snd_ctl_card_info_alloca (&info); - - int cardNum = -1; - - while (outputIds.size() + inputIds.size() <= 64) - { - snd_card_next (&cardNum); - - if (cardNum < 0) - break; - - if (JUCE_CHECKED_RESULT (snd_ctl_open (&handle, ("hw:" + String (cardNum)).toUTF8(), SND_CTL_NONBLOCK)) >= 0) - { - if (JUCE_CHECKED_RESULT (snd_ctl_card_info (handle, info)) >= 0) - { - String cardId (snd_ctl_card_info_get_id (info)); - - if (cardId.removeCharacters ("0123456789").isEmpty()) - cardId = String (cardNum); - - String cardName = snd_ctl_card_info_get_name (info); - - if (cardName.isEmpty()) - cardName = cardId; - - int device = -1; - - snd_pcm_info_t* pcmInfo; - snd_pcm_info_alloca (&pcmInfo); - - for (;;) - { - if (snd_ctl_pcm_next_device (handle, &device) < 0 || device < 0) - break; - - snd_pcm_info_set_device (pcmInfo, device); - - for (int subDevice = 0, nbSubDevice = 1; subDevice < nbSubDevice; ++subDevice) - { - snd_pcm_info_set_subdevice (pcmInfo, subDevice); - snd_pcm_info_set_stream (pcmInfo, SND_PCM_STREAM_CAPTURE); - const bool isInput = (snd_ctl_pcm_info (handle, pcmInfo) >= 0); - - snd_pcm_info_set_stream (pcmInfo, SND_PCM_STREAM_PLAYBACK); - const bool isOutput = (snd_ctl_pcm_info (handle, pcmInfo) >= 0); - - if (! (isInput || isOutput)) - continue; - - if (nbSubDevice == 1) - nbSubDevice = snd_pcm_info_get_subdevices_count (pcmInfo); - - String id, name; - - if (nbSubDevice == 1) - { - id << "hw:" << cardId << "," << device; - name << cardName << ", " << snd_pcm_info_get_name (pcmInfo); - } - else - { - id << "hw:" << cardId << "," << device << "," << subDevice; - name << cardName << ", " << snd_pcm_info_get_name (pcmInfo) - << " {" << snd_pcm_info_get_subdevice_name (pcmInfo) << "}"; - } - - JUCE_ALSA_LOG ("Soundcard ID: " << id << ", name: '" << name - << ", isInput:" << isInput << ", isOutput:" << isOutput << "\n"); - - if (isInput) - { - inputNames.add (name); - inputIds.add (id); - } - - if (isOutput) - { - outputNames.add (name); - outputIds.add (id); - } - } - } - } - - JUCE_CHECKED_RESULT (snd_ctl_close (handle)); - } - } - } - - /* Enumerates all ALSA output devices (as output by the command aplay -L) - Does not try to open the devices (with "testDevice" for example), - so that it also finds devices that are busy and not yet available. - */ - void enumerateAlsaPCMDevices() - { - void** hints = nullptr; - - if (JUCE_CHECKED_RESULT (snd_device_name_hint (-1, "pcm", &hints)) == 0) - { - for (char** h = (char**) hints; *h; ++h) - { - const String id (hintToString (*h, "NAME")); - const String description (hintToString (*h, "DESC")); - const String ioid (hintToString (*h, "IOID")); - - JUCE_ALSA_LOG ("ID: " << id << "; desc: " << description << "; ioid: " << ioid); - - String ss = id.fromFirstOccurrenceOf ("=", false, false) - .upToFirstOccurrenceOf (",", false, false); - - if (id.isEmpty() - || id.startsWith ("default:") || id.startsWith ("sysdefault:") - || id.startsWith ("plughw:") || id == "null") - continue; - - String name (description.replace ("\n", "; ")); - - if (name.isEmpty()) - name = id; - - bool isOutput = (ioid != "Input"); - bool isInput = (ioid != "Output"); - - // alsa is stupid here, it advertises dmix and dsnoop as input/output devices, but - // opening dmix as input, or dsnoop as output will trigger errors.. - isInput = isInput && ! id.startsWith ("dmix"); - isOutput = isOutput && ! id.startsWith ("dsnoop"); - - if (isInput) - { - inputNames.add (name); - inputIds.add (id); - } - - if (isOutput) - { - outputNames.add (name); - outputIds.add (id); - } - } - - snd_device_name_free_hint (hints); - } - - // sometimes the "default" device is not listed, but it is nice to see it explicitely in the list - if (! outputIds.contains ("default")) - testDevice ("default", "Default ALSA Output", "Default ALSA Input"); - - // same for the pulseaudio plugin - if (! outputIds.contains ("pulse")) - testDevice ("pulse", "Pulseaudio output", "Pulseaudio input"); - - // make sure the default device is listed first, and followed by the pulse device (if present) - int idx = outputIds.indexOf ("pulse"); - outputIds.move (idx, 0); - outputNames.move (idx, 0); - - idx = inputIds.indexOf ("pulse"); - inputIds.move (idx, 0); - inputNames.move (idx, 0); - - idx = outputIds.indexOf ("default"); - outputIds.move (idx, 0); - outputNames.move (idx, 0); - - idx = inputIds.indexOf ("default"); - inputIds.move (idx, 0); - inputNames.move (idx, 0); - } - - static String hintToString (const void* hints, const char* type) - { - char* const hint = snd_device_name_get_hint (hints, type); - const String s (String::fromUTF8 (hint)); - ::free (hint); - return s; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ALSAAudioIODeviceType) -}; - -} - -//============================================================================== -AudioIODeviceType* createAudioIODeviceType_ALSA_Soundcards() -{ - return new ALSAAudioIODeviceType (true, "ALSA HW"); -} - -AudioIODeviceType* createAudioIODeviceType_ALSA_PCMDevices() -{ - return new ALSAAudioIODeviceType (false, "ALSA"); -} - -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ALSA() -{ - return createAudioIODeviceType_ALSA_PCMDevices(); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp deleted file mode 100755 index a645333..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_AudioCDReader.cpp +++ /dev/null @@ -1,77 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioCDReader::AudioCDReader() - : AudioFormatReader (0, "CD Audio") -{ -} - -StringArray AudioCDReader::getAvailableCDNames() -{ - StringArray names; - return names; -} - -AudioCDReader* AudioCDReader::createReaderForCD (const int index) -{ - return nullptr; -} - -AudioCDReader::~AudioCDReader() -{ -} - -void AudioCDReader::refreshTrackLengths() -{ -} - -bool AudioCDReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) -{ - return false; -} - -bool AudioCDReader::isCDStillPresent() const -{ - return false; -} - -bool AudioCDReader::isTrackAudio (int trackNum) const -{ - return false; -} - -void AudioCDReader::enableIndexScanning (bool b) -{ -} - -int AudioCDReader::getLastIndex() const -{ - return 0; -} - -Array AudioCDReader::findIndexesInTrack (const int trackNumber) -{ - return Array(); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp deleted file mode 100755 index 38ad64d..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_JackAudio.cpp +++ /dev/null @@ -1,604 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -//============================================================================== -static void* juce_libjackHandle = nullptr; - -static void* juce_loadJackFunction (const char* const name) -{ - if (juce_libjackHandle == nullptr) - return nullptr; - - return dlsym (juce_libjackHandle, name); -} - -#define JUCE_DECL_JACK_FUNCTION(return_type, fn_name, argument_types, arguments) \ - return_type fn_name argument_types \ - { \ - typedef return_type (*fn_type) argument_types; \ - static fn_type fn = (fn_type) juce_loadJackFunction (#fn_name); \ - return (fn != nullptr) ? ((*fn) arguments) : (return_type) 0; \ - } - -#define JUCE_DECL_VOID_JACK_FUNCTION(fn_name, argument_types, arguments) \ - void fn_name argument_types \ - { \ - typedef void (*fn_type) argument_types; \ - static fn_type fn = (fn_type) juce_loadJackFunction (#fn_name); \ - if (fn != nullptr) (*fn) arguments; \ - } - -//============================================================================== -JUCE_DECL_JACK_FUNCTION (jack_client_t*, jack_client_open, (const char* client_name, jack_options_t options, jack_status_t* status, ...), (client_name, options, status)); -JUCE_DECL_JACK_FUNCTION (int, jack_client_close, (jack_client_t *client), (client)); -JUCE_DECL_JACK_FUNCTION (int, jack_activate, (jack_client_t* client), (client)); -JUCE_DECL_JACK_FUNCTION (int, jack_deactivate, (jack_client_t* client), (client)); -JUCE_DECL_JACK_FUNCTION (jack_nframes_t, jack_get_buffer_size, (jack_client_t* client), (client)); -JUCE_DECL_JACK_FUNCTION (jack_nframes_t, jack_get_sample_rate, (jack_client_t* client), (client)); -JUCE_DECL_VOID_JACK_FUNCTION (jack_on_shutdown, (jack_client_t* client, void (*function)(void* arg), void* arg), (client, function, arg)); -JUCE_DECL_JACK_FUNCTION (void* , jack_port_get_buffer, (jack_port_t* port, jack_nframes_t nframes), (port, nframes)); -JUCE_DECL_JACK_FUNCTION (jack_nframes_t, jack_port_get_total_latency, (jack_client_t* client, jack_port_t* port), (client, port)); -JUCE_DECL_JACK_FUNCTION (jack_port_t* , jack_port_register, (jack_client_t* client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size), (client, port_name, port_type, flags, buffer_size)); -JUCE_DECL_VOID_JACK_FUNCTION (jack_set_error_function, (void (*func)(const char*)), (func)); -JUCE_DECL_JACK_FUNCTION (int, jack_set_process_callback, (jack_client_t* client, JackProcessCallback process_callback, void* arg), (client, process_callback, arg)); -JUCE_DECL_JACK_FUNCTION (const char**, jack_get_ports, (jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags), (client, port_name_pattern, type_name_pattern, flags)); -JUCE_DECL_JACK_FUNCTION (int, jack_connect, (jack_client_t* client, const char* source_port, const char* destination_port), (client, source_port, destination_port)); -JUCE_DECL_JACK_FUNCTION (const char*, jack_port_name, (const jack_port_t* port), (port)); -JUCE_DECL_JACK_FUNCTION (void*, jack_set_port_connect_callback, (jack_client_t* client, JackPortConnectCallback connect_callback, void* arg), (client, connect_callback, arg)); -JUCE_DECL_JACK_FUNCTION (jack_port_t* , jack_port_by_id, (jack_client_t* client, jack_port_id_t port_id), (client, port_id)); -JUCE_DECL_JACK_FUNCTION (int, jack_port_connected, (const jack_port_t* port), (port)); -JUCE_DECL_JACK_FUNCTION (int, jack_port_connected_to, (const jack_port_t* port, const char* port_name), (port, port_name)); - -#if JUCE_DEBUG - #define JACK_LOGGING_ENABLED 1 -#endif - -#if JACK_LOGGING_ENABLED -namespace -{ - void jack_Log (const String& s) - { - std::cerr << s << std::endl; - } - - const char* getJackErrorMessage (const jack_status_t status) - { - if (status & JackServerFailed - || status & JackServerError) return "Unable to connect to JACK server"; - if (status & JackVersionError) return "Client's protocol version does not match"; - if (status & JackInvalidOption) return "The operation contained an invalid or unsupported option"; - if (status & JackNameNotUnique) return "The desired client name was not unique"; - if (status & JackNoSuchClient) return "Requested client does not exist"; - if (status & JackInitFailure) return "Unable to initialize client"; - return nullptr; - } -} - #define JUCE_JACK_LOG_STATUS(x) { if (const char* m = getJackErrorMessage (x)) jack_Log (m); } - #define JUCE_JACK_LOG(x) jack_Log(x) -#else - #define JUCE_JACK_LOG_STATUS(x) {} - #define JUCE_JACK_LOG(x) {} -#endif - - -//============================================================================== -#ifndef JUCE_JACK_CLIENT_NAME - #define JUCE_JACK_CLIENT_NAME "JUCEJack" -#endif - -struct JackPortIterator -{ - JackPortIterator (jack_client_t* const client, const bool forInput) - : ports (nullptr), index (-1) - { - if (client != nullptr) - ports = juce::jack_get_ports (client, nullptr, nullptr, - forInput ? JackPortIsOutput : JackPortIsInput); - // (NB: This looks like it's the wrong way round, but it is correct!) - } - - ~JackPortIterator() - { - ::free (ports); - } - - bool next() - { - if (ports == nullptr || ports [index + 1] == nullptr) - return false; - - name = CharPointer_UTF8 (ports[++index]); - clientName = name.upToFirstOccurrenceOf (":", false, false); - return true; - } - - const char** ports; - int index; - String name; - String clientName; -}; - -class JackAudioIODeviceType; -static Array activeDeviceTypes; - -//============================================================================== -class JackAudioIODevice : public AudioIODevice -{ -public: - JackAudioIODevice (const String& deviceName, - const String& inId, - const String& outId) - : AudioIODevice (deviceName, "JACK"), - inputId (inId), - outputId (outId), - deviceIsOpen (false), - callback (nullptr), - totalNumberOfInputChannels (0), - totalNumberOfOutputChannels (0) - { - jassert (deviceName.isNotEmpty()); - - jack_status_t status; - client = juce::jack_client_open (JUCE_JACK_CLIENT_NAME, JackNoStartServer, &status); - - if (client == nullptr) - { - JUCE_JACK_LOG_STATUS (status); - } - else - { - juce::jack_set_error_function (errorCallback); - - // open input ports - const StringArray inputChannels (getInputChannelNames()); - for (int i = 0; i < inputChannels.size(); ++i) - { - String inputName; - inputName << "in_" << ++totalNumberOfInputChannels; - - inputPorts.add (juce::jack_port_register (client, inputName.toUTF8(), - JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0)); - } - - // open output ports - const StringArray outputChannels (getOutputChannelNames()); - for (int i = 0; i < outputChannels.size (); ++i) - { - String outputName; - outputName << "out_" << ++totalNumberOfOutputChannels; - - outputPorts.add (juce::jack_port_register (client, outputName.toUTF8(), - JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)); - } - - inChans.calloc (totalNumberOfInputChannels + 2); - outChans.calloc (totalNumberOfOutputChannels + 2); - } - } - - ~JackAudioIODevice() - { - close(); - if (client != nullptr) - { - juce::jack_client_close (client); - client = nullptr; - } - } - - StringArray getChannelNames (bool forInput) const - { - StringArray names; - - for (JackPortIterator i (client, forInput); i.next();) - if (i.clientName == getName()) - names.add (i.name.fromFirstOccurrenceOf (":", false, false)); - - return names; - } - - StringArray getOutputChannelNames() override { return getChannelNames (false); } - StringArray getInputChannelNames() override { return getChannelNames (true); } - - Array getAvailableSampleRates() override - { - Array rates; - - if (client != nullptr) - rates.add (juce::jack_get_sample_rate (client)); - - return rates; - } - - Array getAvailableBufferSizes() override - { - Array sizes; - - if (client != nullptr) - sizes.add (juce::jack_get_buffer_size (client)); - - return sizes; - } - - int getDefaultBufferSize() override { return getCurrentBufferSizeSamples(); } - int getCurrentBufferSizeSamples() override { return client != nullptr ? juce::jack_get_buffer_size (client) : 0; } - double getCurrentSampleRate() override { return client != nullptr ? juce::jack_get_sample_rate (client) : 0; } - - - String open (const BigInteger& inputChannels, const BigInteger& outputChannels, - double /* sampleRate */, int /* bufferSizeSamples */) override - { - if (client == nullptr) - { - lastError = "No JACK client running"; - return lastError; - } - - lastError.clear(); - close(); - - juce::jack_set_process_callback (client, processCallback, this); - juce::jack_set_port_connect_callback (client, portConnectCallback, this); - juce::jack_on_shutdown (client, shutdownCallback, this); - juce::jack_activate (client); - deviceIsOpen = true; - - if (! inputChannels.isZero()) - { - for (JackPortIterator i (client, true); i.next();) - { - if (inputChannels [i.index] && i.clientName == getName()) - { - int error = juce::jack_connect (client, i.ports[i.index], juce::jack_port_name ((jack_port_t*) inputPorts[i.index])); - if (error != 0) - JUCE_JACK_LOG ("Cannot connect input port " + String (i.index) + " (" + i.name + "), error " + String (error)); - } - } - } - - if (! outputChannels.isZero()) - { - for (JackPortIterator i (client, false); i.next();) - { - if (outputChannels [i.index] && i.clientName == getName()) - { - int error = juce::jack_connect (client, juce::jack_port_name ((jack_port_t*) outputPorts[i.index]), i.ports[i.index]); - if (error != 0) - JUCE_JACK_LOG ("Cannot connect output port " + String (i.index) + " (" + i.name + "), error " + String (error)); - } - } - } - - return lastError; - } - - void close() override - { - stop(); - - if (client != nullptr) - { - juce::jack_deactivate (client); - juce::jack_set_process_callback (client, processCallback, nullptr); - juce::jack_set_port_connect_callback (client, portConnectCallback, nullptr); - juce::jack_on_shutdown (client, shutdownCallback, nullptr); - } - - deviceIsOpen = false; - } - - void start (AudioIODeviceCallback* newCallback) override - { - if (deviceIsOpen && newCallback != callback) - { - if (newCallback != nullptr) - newCallback->audioDeviceAboutToStart (this); - - AudioIODeviceCallback* const oldCallback = callback; - - { - const ScopedLock sl (callbackLock); - callback = newCallback; - } - - if (oldCallback != nullptr) - oldCallback->audioDeviceStopped(); - } - } - - void stop() override - { - start (nullptr); - } - - bool isOpen() override { return deviceIsOpen; } - bool isPlaying() override { return callback != nullptr; } - int getCurrentBitDepth() override { return 32; } - String getLastError() override { return lastError; } - - BigInteger getActiveOutputChannels() const override { return activeOutputChannels; } - BigInteger getActiveInputChannels() const override { return activeInputChannels; } - - int getOutputLatencyInSamples() override - { - int latency = 0; - - for (int i = 0; i < outputPorts.size(); i++) - latency = jmax (latency, (int) juce::jack_port_get_total_latency (client, (jack_port_t*) outputPorts [i])); - - return latency; - } - - int getInputLatencyInSamples() override - { - int latency = 0; - - for (int i = 0; i < inputPorts.size(); i++) - latency = jmax (latency, (int) juce::jack_port_get_total_latency (client, (jack_port_t*) inputPorts [i])); - - return latency; - } - - String inputId, outputId; - -private: - void process (const int numSamples) - { - int numActiveInChans = 0, numActiveOutChans = 0; - - for (int i = 0; i < totalNumberOfInputChannels; ++i) - { - if (activeInputChannels[i]) - if (jack_default_audio_sample_t* in - = (jack_default_audio_sample_t*) juce::jack_port_get_buffer ((jack_port_t*) inputPorts.getUnchecked(i), numSamples)) - inChans [numActiveInChans++] = (float*) in; - } - - for (int i = 0; i < totalNumberOfOutputChannels; ++i) - { - if (activeOutputChannels[i]) - if (jack_default_audio_sample_t* out - = (jack_default_audio_sample_t*) juce::jack_port_get_buffer ((jack_port_t*) outputPorts.getUnchecked(i), numSamples)) - outChans [numActiveOutChans++] = (float*) out; - } - - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - { - if ((numActiveInChans + numActiveOutChans) > 0) - callback->audioDeviceIOCallback (const_cast (inChans.getData()), numActiveInChans, - outChans, numActiveOutChans, numSamples); - } - else - { - for (int i = 0; i < numActiveOutChans; ++i) - zeromem (outChans[i], sizeof (float) * numSamples); - } - } - - static int processCallback (jack_nframes_t nframes, void* callbackArgument) - { - if (callbackArgument != nullptr) - ((JackAudioIODevice*) callbackArgument)->process (nframes); - - return 0; - } - - void updateActivePorts() - { - BigInteger newOutputChannels, newInputChannels; - - for (int i = 0; i < outputPorts.size(); ++i) - if (juce::jack_port_connected ((jack_port_t*) outputPorts.getUnchecked(i))) - newOutputChannels.setBit (i); - - for (int i = 0; i < inputPorts.size(); ++i) - if (juce::jack_port_connected ((jack_port_t*) inputPorts.getUnchecked(i))) - newInputChannels.setBit (i); - - if (newOutputChannels != activeOutputChannels - || newInputChannels != activeInputChannels) - { - AudioIODeviceCallback* const oldCallback = callback; - - stop(); - - activeOutputChannels = newOutputChannels; - activeInputChannels = newInputChannels; - - if (oldCallback != nullptr) - start (oldCallback); - - sendDeviceChangedCallback(); - } - } - - static void portConnectCallback (jack_port_id_t, jack_port_id_t, int, void* arg) - { - if (JackAudioIODevice* device = static_cast (arg)) - device->updateActivePorts(); - } - - static void threadInitCallback (void* /* callbackArgument */) - { - JUCE_JACK_LOG ("JackAudioIODevice::initialise"); - } - - static void shutdownCallback (void* callbackArgument) - { - JUCE_JACK_LOG ("JackAudioIODevice::shutdown"); - - if (JackAudioIODevice* device = (JackAudioIODevice*) callbackArgument) - { - device->client = nullptr; - device->close(); - } - } - - static void errorCallback (const char* msg) - { - JUCE_JACK_LOG ("JackAudioIODevice::errorCallback " + String (msg)); - } - - static void sendDeviceChangedCallback(); - - bool deviceIsOpen; - jack_client_t* client; - String lastError; - AudioIODeviceCallback* callback; - CriticalSection callbackLock; - - HeapBlock inChans, outChans; - int totalNumberOfInputChannels; - int totalNumberOfOutputChannels; - Array inputPorts, outputPorts; - BigInteger activeInputChannels, activeOutputChannels; -}; - - -//============================================================================== -class JackAudioIODeviceType : public AudioIODeviceType -{ -public: - JackAudioIODeviceType() - : AudioIODeviceType ("JACK"), - hasScanned (false) - { - activeDeviceTypes.add (this); - } - - ~JackAudioIODeviceType() - { - activeDeviceTypes.removeFirstMatchingValue (this); - } - - void scanForDevices() - { - hasScanned = true; - inputNames.clear(); - inputIds.clear(); - outputNames.clear(); - outputIds.clear(); - - if (juce_libjackHandle == nullptr) juce_libjackHandle = dlopen ("libjack.so.0", RTLD_LAZY); - if (juce_libjackHandle == nullptr) juce_libjackHandle = dlopen ("libjack.so", RTLD_LAZY); - if (juce_libjackHandle == nullptr) return; - - jack_status_t status; - - // open a dummy client - if (jack_client_t* const client = juce::jack_client_open ("JuceJackDummy", JackNoStartServer, &status)) - { - // scan for output devices - for (JackPortIterator i (client, false); i.next();) - { - if (i.clientName != (JUCE_JACK_CLIENT_NAME) && ! inputNames.contains (i.clientName)) - { - inputNames.add (i.clientName); - inputIds.add (i.ports [i.index]); - } - } - - // scan for input devices - for (JackPortIterator i (client, true); i.next();) - { - if (i.clientName != (JUCE_JACK_CLIENT_NAME) && ! outputNames.contains (i.clientName)) - { - outputNames.add (i.clientName); - outputIds.add (i.ports [i.index]); - } - } - - juce::jack_client_close (client); - } - else - { - JUCE_JACK_LOG_STATUS (status); - } - } - - StringArray getDeviceNames (bool wantInputNames) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - return wantInputNames ? inputNames : outputNames; - } - - int getDefaultDeviceIndex (bool /* forInput */) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - return 0; - } - - bool hasSeparateInputsAndOutputs() const { return true; } - - int getIndexOfDevice (AudioIODevice* device, bool asInput) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - if (JackAudioIODevice* d = dynamic_cast (device)) - return asInput ? inputIds.indexOf (d->inputId) - : outputIds.indexOf (d->outputId); - - return -1; - } - - AudioIODevice* createDevice (const String& outputDeviceName, - const String& inputDeviceName) - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - const int inputIndex = inputNames.indexOf (inputDeviceName); - const int outputIndex = outputNames.indexOf (outputDeviceName); - - if (inputIndex >= 0 || outputIndex >= 0) - return new JackAudioIODevice (outputIndex >= 0 ? outputDeviceName - : inputDeviceName, - inputIds [inputIndex], - outputIds [outputIndex]); - - return nullptr; - } - - void portConnectionChange() { callDeviceChangeListeners(); } - -private: - StringArray inputNames, outputNames, inputIds, outputIds; - bool hasScanned; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JackAudioIODeviceType) -}; - -void JackAudioIODevice::sendDeviceChangedCallback() -{ - for (int i = activeDeviceTypes.size(); --i >= 0;) - if (JackAudioIODeviceType* d = activeDeviceTypes[i]) - d->portConnectionChange(); -} - -//============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_JACK() -{ - return new JackAudioIODeviceType(); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp deleted file mode 100755 index 43cb43d..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_linux_Midi.cpp +++ /dev/null @@ -1,621 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_ALSA - -// You can define these strings in your app if you want to override the default names: -#ifndef JUCE_ALSA_MIDI_INPUT_NAME - #define JUCE_ALSA_MIDI_INPUT_NAME "Juce Midi Input" -#endif - -#ifndef JUCE_ALSA_MIDI_OUTPUT_NAME - #define JUCE_ALSA_MIDI_OUTPUT_NAME "Juce Midi Output" -#endif - -//============================================================================== -namespace -{ - -class AlsaPortAndCallback; - -//============================================================================== -class AlsaClient : public ReferenceCountedObject -{ -public: - typedef ReferenceCountedObjectPtr Ptr; - - AlsaClient (bool forInput) - : input (forInput), handle (nullptr) - { - snd_seq_open (&handle, "default", forInput ? SND_SEQ_OPEN_INPUT - : SND_SEQ_OPEN_OUTPUT, 0); - } - - ~AlsaClient() - { - if (handle != nullptr) - { - snd_seq_close (handle); - handle = nullptr; - } - - jassert (activeCallbacks.size() == 0); - - if (inputThread) - { - inputThread->stopThread (3000); - inputThread = nullptr; - } - } - - bool isInput() const noexcept { return input; } - - void setName (const String& name) - { - snd_seq_set_client_name (handle, name.toUTF8()); - } - - void registerCallback (AlsaPortAndCallback* cb) - { - if (cb != nullptr) - { - { - const ScopedLock sl (callbackLock); - activeCallbacks.add (cb); - - if (inputThread == nullptr) - inputThread = new MidiInputThread (*this); - } - - inputThread->startThread(); - } - } - - void unregisterCallback (AlsaPortAndCallback* cb) - { - const ScopedLock sl (callbackLock); - - jassert (activeCallbacks.contains (cb)); - activeCallbacks.removeAllInstancesOf (cb); - - if (activeCallbacks.size() == 0 && inputThread->isThreadRunning()) - inputThread->signalThreadShouldExit(); - } - - void handleIncomingMidiMessage (const MidiMessage& message, int port); - - snd_seq_t* get() const noexcept { return handle; } - -private: - bool input; - snd_seq_t* handle; - - Array activeCallbacks; - CriticalSection callbackLock; - - //============================================================================== - class MidiInputThread : public Thread - { - public: - MidiInputThread (AlsaClient& c) - : Thread ("Juce MIDI Input"), client (c) - { - jassert (client.input && client.get() != nullptr); - } - - void run() override - { - const int maxEventSize = 16 * 1024; - snd_midi_event_t* midiParser; - snd_seq_t* seqHandle = client.get(); - - if (snd_midi_event_new (maxEventSize, &midiParser) >= 0) - { - const int numPfds = snd_seq_poll_descriptors_count (seqHandle, POLLIN); - HeapBlock pfd (numPfds); - snd_seq_poll_descriptors (seqHandle, pfd, numPfds, POLLIN); - - HeapBlock buffer (maxEventSize); - - while (! threadShouldExit()) - { - if (poll (pfd, numPfds, 100) > 0) // there was a "500" here which is a bit long when we exit the program and have to wait for a timeout on this poll call - { - if (threadShouldExit()) - break; - - snd_seq_nonblock (seqHandle, 1); - - do - { - snd_seq_event_t* inputEvent = nullptr; - - if (snd_seq_event_input (seqHandle, &inputEvent) >= 0) - { - // xxx what about SYSEXes that are too big for the buffer? - const int numBytes = snd_midi_event_decode (midiParser, buffer, - maxEventSize, inputEvent); - - snd_midi_event_reset_decode (midiParser); - - if (numBytes > 0) - { - const MidiMessage message ((const uint8*) buffer, numBytes, - Time::getMillisecondCounter() * 0.001); - - client.handleIncomingMidiMessage (message, inputEvent->dest.port); - } - - snd_seq_free_event (inputEvent); - } - } - while (snd_seq_event_input_pending (seqHandle, 0) > 0); - } - } - - snd_midi_event_free (midiParser); - } - }; - - private: - AlsaClient& client; - }; - - ScopedPointer inputThread; -}; - - -static AlsaClient::Ptr globalAlsaSequencerIn() -{ - static AlsaClient::Ptr global (new AlsaClient (true)); - return global; -} - -static AlsaClient::Ptr globalAlsaSequencerOut() -{ - static AlsaClient::Ptr global (new AlsaClient (false)); - return global; -} - -static AlsaClient::Ptr globalAlsaSequencer (bool input) -{ - return input ? globalAlsaSequencerIn() - : globalAlsaSequencerOut(); -} - -//============================================================================== -// represents an input or output port of the supplied AlsaClient -class AlsaPort -{ -public: - AlsaPort() noexcept : portId (-1) {} - AlsaPort (const AlsaClient::Ptr& c, int port) noexcept : client (c), portId (port) {} - - void createPort (const AlsaClient::Ptr& c, const String& name, bool forInput) - { - client = c; - - if (snd_seq_t* handle = client->get()) - portId = snd_seq_create_simple_port (handle, name.toUTF8(), - forInput ? (SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE) - : (SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ), - SND_SEQ_PORT_TYPE_MIDI_GENERIC); - } - - void deletePort() - { - if (isValid()) - { - snd_seq_delete_simple_port (client->get(), portId); - portId = -1; - } - } - - void connectWith (int sourceClient, int sourcePort) - { - if (client->isInput()) - snd_seq_connect_from (client->get(), portId, sourceClient, sourcePort); - else - snd_seq_connect_to (client->get(), portId, sourceClient, sourcePort); - } - - bool isValid() const noexcept - { - return client != nullptr && client->get() != nullptr && portId >= 0; - } - - AlsaClient::Ptr client; - int portId; -}; - -//============================================================================== -class AlsaPortAndCallback -{ -public: - AlsaPortAndCallback (AlsaPort p, MidiInput* in, MidiInputCallback* cb) - : port (p), midiInput (in), callback (cb), callbackEnabled (false) - { - } - - ~AlsaPortAndCallback() - { - enableCallback (false); - port.deletePort(); - } - - void enableCallback (bool enable) - { - if (callbackEnabled != enable) - { - callbackEnabled = enable; - - if (enable) - port.client->registerCallback (this); - else - port.client->unregisterCallback (this); - } - } - - void handleIncomingMidiMessage (const MidiMessage& message) const - { - callback->handleIncomingMidiMessage (midiInput, message); - } - -private: - AlsaPort port; - MidiInput* midiInput; - MidiInputCallback* callback; - bool callbackEnabled; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AlsaPortAndCallback) -}; - -void AlsaClient::handleIncomingMidiMessage (const MidiMessage& message, int port) -{ - const ScopedLock sl (callbackLock); - - if (AlsaPortAndCallback* const cb = activeCallbacks[port]) - cb->handleIncomingMidiMessage (message); -} - -//============================================================================== -static AlsaPort iterateMidiClient (const AlsaClient::Ptr& seq, - snd_seq_client_info_t* clientInfo, - const bool forInput, - StringArray& deviceNamesFound, - const int deviceIndexToOpen) -{ - AlsaPort port; - - snd_seq_t* seqHandle = seq->get(); - snd_seq_port_info_t* portInfo = nullptr; - - if (snd_seq_port_info_malloc (&portInfo) == 0) - { - int numPorts = snd_seq_client_info_get_num_ports (clientInfo); - const int client = snd_seq_client_info_get_client (clientInfo); - - snd_seq_port_info_set_client (portInfo, client); - snd_seq_port_info_set_port (portInfo, -1); - - while (--numPorts >= 0) - { - if (snd_seq_query_next_port (seqHandle, portInfo) == 0 - && (snd_seq_port_info_get_capability (portInfo) & (forInput ? SND_SEQ_PORT_CAP_READ - : SND_SEQ_PORT_CAP_WRITE)) != 0) - { - deviceNamesFound.add (snd_seq_client_info_get_name (clientInfo)); - - if (deviceNamesFound.size() == deviceIndexToOpen + 1) - { - const int sourcePort = snd_seq_port_info_get_port (portInfo); - const int sourceClient = snd_seq_client_info_get_client (clientInfo); - - if (sourcePort != -1) - { - const String name (forInput ? JUCE_ALSA_MIDI_INPUT_NAME - : JUCE_ALSA_MIDI_OUTPUT_NAME); - seq->setName (name); - port.createPort (seq, name, forInput); - port.connectWith (sourceClient, sourcePort); - } - } - } - } - - snd_seq_port_info_free (portInfo); - } - - return port; -} - -static AlsaPort iterateMidiDevices (const bool forInput, - StringArray& deviceNamesFound, - const int deviceIndexToOpen) -{ - AlsaPort port; - const AlsaClient::Ptr client (globalAlsaSequencer (forInput)); - - if (snd_seq_t* const seqHandle = client->get()) - { - snd_seq_system_info_t* systemInfo = nullptr; - snd_seq_client_info_t* clientInfo = nullptr; - - if (snd_seq_system_info_malloc (&systemInfo) == 0) - { - if (snd_seq_system_info (seqHandle, systemInfo) == 0 - && snd_seq_client_info_malloc (&clientInfo) == 0) - { - int numClients = snd_seq_system_info_get_cur_clients (systemInfo); - - while (--numClients >= 0 && ! port.isValid()) - if (snd_seq_query_next_client (seqHandle, clientInfo) == 0) - port = iterateMidiClient (client, clientInfo, forInput, - deviceNamesFound, deviceIndexToOpen); - - snd_seq_client_info_free (clientInfo); - } - - snd_seq_system_info_free (systemInfo); - } - - } - - deviceNamesFound.appendNumbersToDuplicates (true, true); - - return port; -} - -AlsaPort createMidiDevice (const bool forInput, const String& deviceNameToOpen) -{ - AlsaPort port; - AlsaClient::Ptr client (new AlsaClient (forInput)); - - if (client->get()) - { - client->setName (deviceNameToOpen + (forInput ? " Input" : " Output")); - port.createPort (client, forInput ? "in" : "out", forInput); - } - - return port; -} - -//============================================================================== -class MidiOutputDevice -{ -public: - MidiOutputDevice (MidiOutput* const output, const AlsaPort& p) - : midiOutput (output), port (p), - maxEventSize (16 * 1024) - { - jassert (port.isValid() && midiOutput != nullptr); - snd_midi_event_new (maxEventSize, &midiParser); - } - - ~MidiOutputDevice() - { - snd_midi_event_free (midiParser); - port.deletePort(); - } - - bool sendMessageNow (const MidiMessage& message) - { - if (message.getRawDataSize() > maxEventSize) - { - maxEventSize = message.getRawDataSize(); - snd_midi_event_free (midiParser); - snd_midi_event_new (maxEventSize, &midiParser); - } - - snd_seq_event_t event; - snd_seq_ev_clear (&event); - - long numBytes = (long) message.getRawDataSize(); - const uint8* data = message.getRawData(); - - snd_seq_t* seqHandle = port.client->get(); - bool success = true; - - while (numBytes > 0) - { - const long numSent = snd_midi_event_encode (midiParser, data, numBytes, &event); - - if (numSent <= 0) - { - success = numSent == 0; - break; - } - - numBytes -= numSent; - data += numSent; - - snd_seq_ev_set_source (&event, 0); - snd_seq_ev_set_subs (&event); - snd_seq_ev_set_direct (&event); - - if (snd_seq_event_output_direct (seqHandle, &event) < 0) - { - success = false; - break; - } - } - - snd_midi_event_reset_encode (midiParser); - return success; - } - -private: - MidiOutput* const midiOutput; - AlsaPort port; - snd_midi_event_t* midiParser; - int maxEventSize; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiOutputDevice); -}; - -} // namespace - -StringArray MidiOutput::getDevices() -{ - StringArray devices; - iterateMidiDevices (false, devices, -1); - return devices; -} - -int MidiOutput::getDefaultDeviceIndex() -{ - return 0; -} - -MidiOutput* MidiOutput::openDevice (int deviceIndex) -{ - MidiOutput* newDevice = nullptr; - - StringArray devices; - AlsaPort port (iterateMidiDevices (false, devices, deviceIndex)); - - if (port.isValid()) - { - newDevice = new MidiOutput(); - newDevice->internal = new MidiOutputDevice (newDevice, port); - } - - return newDevice; -} - -MidiOutput* MidiOutput::createNewDevice (const String& deviceName) -{ - MidiOutput* newDevice = nullptr; - - AlsaPort port (createMidiDevice (false, deviceName)); - - if (port.isValid()) - { - newDevice = new MidiOutput(); - newDevice->internal = new MidiOutputDevice (newDevice, port); - } - - return newDevice; -} - -MidiOutput::~MidiOutput() -{ - stopBackgroundThread(); - - delete static_cast (internal); -} - -void MidiOutput::sendMessageNow (const MidiMessage& message) -{ - static_cast (internal)->sendMessageNow (message); -} - -//============================================================================== -MidiInput::MidiInput (const String& nm) - : name (nm), internal (nullptr) -{ -} - -MidiInput::~MidiInput() -{ - stop(); - delete static_cast (internal); -} - -void MidiInput::start() -{ - static_cast (internal)->enableCallback (true); -} - -void MidiInput::stop() -{ - static_cast (internal)->enableCallback (false); -} - -int MidiInput::getDefaultDeviceIndex() -{ - return 0; -} - -StringArray MidiInput::getDevices() -{ - StringArray devices; - iterateMidiDevices (true, devices, -1); - return devices; -} - -MidiInput* MidiInput::openDevice (int deviceIndex, MidiInputCallback* callback) -{ - MidiInput* newDevice = nullptr; - - StringArray devices; - AlsaPort port (iterateMidiDevices (true, devices, deviceIndex)); - - if (port.isValid()) - { - newDevice = new MidiInput (devices [deviceIndex]); - newDevice->internal = new AlsaPortAndCallback (port, newDevice, callback); - } - - return newDevice; -} - -MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback) -{ - MidiInput* newDevice = nullptr; - - AlsaPort port (createMidiDevice (true, deviceName)); - - if (port.isValid()) - { - newDevice = new MidiInput (deviceName); - newDevice->internal = new AlsaPortAndCallback (port, newDevice, callback); - } - - return newDevice; -} - - -//============================================================================== -#else - -// (These are just stub functions if ALSA is unavailable...) - -StringArray MidiOutput::getDevices() { return StringArray(); } -int MidiOutput::getDefaultDeviceIndex() { return 0; } -MidiOutput* MidiOutput::openDevice (int) { return nullptr; } -MidiOutput* MidiOutput::createNewDevice (const String&) { return nullptr; } -MidiOutput::~MidiOutput() {} -void MidiOutput::sendMessageNow (const MidiMessage&) {} - -MidiInput::MidiInput (const String& nm) : name (nm), internal (nullptr) {} -MidiInput::~MidiInput() {} -void MidiInput::start() {} -void MidiInput::stop() {} -int MidiInput::getDefaultDeviceIndex() { return 0; } -StringArray MidiInput::getDevices() { return StringArray(); } -MidiInput* MidiInput::openDevice (int, MidiInputCallback*) { return nullptr; } -MidiInput* MidiInput::createNewDevice (const String&, MidiInputCallback*) { return nullptr; } - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm deleted file mode 100755 index 8dd7bfa..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDBurner.mm +++ /dev/null @@ -1,455 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -const int kilobytesPerSecond1x = 176; - -struct AudioTrackProducerClass : public ObjCClass -{ - AudioTrackProducerClass() : ObjCClass ("JUCEAudioTrackProducer_") - { - addIvar ("source"); - - addMethod (@selector (initWithAudioSourceHolder:), initWithAudioSourceHolder, "@@:^v"); - addMethod (@selector (cleanupTrackAfterBurn:), cleanupTrackAfterBurn, "v@:@"); - addMethod (@selector (cleanupTrackAfterVerification:), cleanupTrackAfterVerification, "c@:@"); - addMethod (@selector (estimateLengthOfTrack:), estimateLengthOfTrack, "Q@:@"); - addMethod (@selector (prepareTrack:forBurn:toMedia:), prepareTrack, "c@:@@@"); - addMethod (@selector (prepareTrackForVerification:), prepareTrackForVerification, "c@:@"); - addMethod (@selector (produceDataForTrack:intoBuffer:length:atAddress:blockSize:ioFlags:), - produceDataForTrack, "I@:@^cIQI^I"); - addMethod (@selector (producePreGapForTrack:intoBuffer:length:atAddress:blockSize:ioFlags:), - produceDataForTrack, "I@:@^cIQI^I"); - addMethod (@selector (verifyDataForTrack:intoBuffer:length:atAddress:blockSize:ioFlags:), - produceDataForTrack, "I@:@^cIQI^I"); - - registerClass(); - } - - struct AudioSourceHolder - { - AudioSourceHolder (AudioSource* s, int numFrames) - : source (s), readPosition (0), lengthInFrames (numFrames) - { - } - - ~AudioSourceHolder() - { - if (source != nullptr) - source->releaseResources(); - } - - ScopedPointer source; - int readPosition, lengthInFrames; - }; - -private: - static id initWithAudioSourceHolder (id self, SEL, AudioSourceHolder* source) - { - self = sendSuperclassMessage (self, @selector (init)); - object_setInstanceVariable (self, "source", source); - return self; - } - - static AudioSourceHolder* getSource (id self) - { - return getIvar (self, "source"); - } - - static void dealloc (id self, SEL) - { - delete getSource (self); - sendSuperclassMessage (self, @selector (dealloc)); - } - - static void cleanupTrackAfterBurn (id self, SEL, DRTrack*) {} - static BOOL cleanupTrackAfterVerification (id self, SEL, DRTrack*) { return true; } - - static uint64_t estimateLengthOfTrack (id self, SEL, DRTrack*) - { - return getSource (self)->lengthInFrames; - } - - static BOOL prepareTrack (id self, SEL, DRTrack*, DRBurn*, NSDictionary*) - { - if (AudioSourceHolder* const source = getSource (self)) - { - source->source->prepareToPlay (44100 / 75, 44100); - source->readPosition = 0; - } - - return true; - } - - static BOOL prepareTrackForVerification (id self, SEL, DRTrack*) - { - if (AudioSourceHolder* const source = getSource (self)) - source->source->prepareToPlay (44100 / 75, 44100); - - return true; - } - - static uint32_t produceDataForTrack (id self, SEL, DRTrack*, char* buffer, - uint32_t bufferLength, uint64_t /*address*/, - uint32_t /*blockSize*/, uint32_t* /*flags*/) - { - if (AudioSourceHolder* const source = getSource (self)) - { - const int numSamples = jmin ((int) bufferLength / 4, - (source->lengthInFrames * (44100 / 75)) - source->readPosition); - - if (numSamples > 0) - { - AudioSampleBuffer tempBuffer (2, numSamples); - AudioSourceChannelInfo info (tempBuffer); - - source->source->getNextAudioBlock (info); - - typedef AudioData::Pointer CDSampleFormat; - typedef AudioData::Pointer SourceSampleFormat; - - CDSampleFormat left (buffer, 2); - left.convertSamples (SourceSampleFormat (tempBuffer.getReadPointer (0)), numSamples); - CDSampleFormat right (buffer + 2, 2); - right.convertSamples (SourceSampleFormat (tempBuffer.getReadPointer (1)), numSamples); - - source->readPosition += numSamples; - } - - return numSamples * 4; - } - - return 0; - } - - static uint32_t producePreGapForTrack (id self, SEL, DRTrack*, char* buffer, - uint32_t bufferLength, uint64_t /*address*/, - uint32_t /*blockSize*/, uint32_t* /*flags*/) - { - zeromem (buffer, bufferLength); - return bufferLength; - } - - static BOOL verifyDataForTrack (id self, SEL, DRTrack*, const char*, - uint32_t /*bufferLength*/, uint64_t /*address*/, - uint32_t /*blockSize*/, uint32_t* /*flags*/) - { - return true; - } -}; - -struct OpenDiskDevice -{ - OpenDiskDevice (DRDevice* d) - : device (d), - tracks ([[NSMutableArray alloc] init]), - underrunProtection (true) - { - } - - ~OpenDiskDevice() - { - [tracks release]; - } - - void addSourceTrack (AudioSource* source, int numSamples) - { - if (source != nullptr) - { - const int numFrames = (numSamples + 587) / 588; - - static AudioTrackProducerClass cls; - - NSObject* producer = [cls.createInstance() performSelector: @selector (initWithAudioSourceHolder:) - withObject: (id) new AudioTrackProducerClass::AudioSourceHolder (source, numFrames)]; - DRTrack* track = [[DRTrack alloc] initWithProducer: producer]; - - { - NSMutableDictionary* p = [[track properties] mutableCopy]; - [p setObject: [DRMSF msfWithFrames: numFrames] forKey: DRTrackLengthKey]; - [p setObject: [NSNumber numberWithUnsignedShort: 2352] forKey: DRBlockSizeKey]; - [p setObject: [NSNumber numberWithInt: 0] forKey: DRDataFormKey]; - [p setObject: [NSNumber numberWithInt: 0] forKey: DRBlockTypeKey]; - [p setObject: [NSNumber numberWithInt: 0] forKey: DRTrackModeKey]; - [p setObject: [NSNumber numberWithInt: 0] forKey: DRSessionFormatKey]; - [track setProperties: p]; - [p release]; - } - - [tracks addObject: track]; - - [track release]; - [producer release]; - } - } - - String burn (AudioCDBurner::BurnProgressListener* listener, - bool shouldEject, bool peformFakeBurnForTesting, int burnSpeed) - { - DRBurn* burn = [DRBurn burnForDevice: device]; - - if (! [device acquireExclusiveAccess]) - return "Couldn't open or write to the CD device"; - - [device acquireMediaReservation]; - - NSMutableDictionary* d = [[burn properties] mutableCopy]; - [d autorelease]; - [d setObject: [NSNumber numberWithBool: peformFakeBurnForTesting] forKey: DRBurnTestingKey]; - [d setObject: [NSNumber numberWithBool: false] forKey: DRBurnVerifyDiscKey]; - [d setObject: (shouldEject ? DRBurnCompletionActionEject : DRBurnCompletionActionMount) forKey: DRBurnCompletionActionKey]; - - if (burnSpeed > 0) - [d setObject: [NSNumber numberWithFloat: burnSpeed * kilobytesPerSecond1x] forKey: DRBurnRequestedSpeedKey]; - - if (! underrunProtection) - [d setObject: [NSNumber numberWithBool: false] forKey: DRBurnUnderrunProtectionKey]; - - [burn setProperties: d]; - - [burn writeLayout: tracks]; - - for (;;) - { - Thread::sleep (300); - float progress = [[[burn status] objectForKey: DRStatusPercentCompleteKey] floatValue]; - - if (listener != nullptr && listener->audioCDBurnProgress (progress)) - { - [burn abort]; - return "User cancelled the write operation"; - } - - if ([[[burn status] objectForKey: DRStatusStateKey] isEqualTo: DRStatusStateFailed]) - return "Write operation failed"; - - if ([[[burn status] objectForKey: DRStatusStateKey] isEqualTo: DRStatusStateDone]) - break; - - NSString* err = (NSString*) [[[burn status] objectForKey: DRErrorStatusKey] - objectForKey: DRErrorStatusErrorStringKey]; - if ([err length] > 0) - return nsStringToJuce (err); - } - - [device releaseMediaReservation]; - [device releaseExclusiveAccess]; - return String::empty; - } - - DRDevice* device; - NSMutableArray* tracks; - bool underrunProtection; -}; - -//============================================================================== -class AudioCDBurner::Pimpl : public Timer -{ -public: - Pimpl (AudioCDBurner& b, int deviceIndex) : owner (b) - { - if (DRDevice* dev = [[DRDevice devices] objectAtIndex: deviceIndex]) - { - device = new OpenDiskDevice (dev); - lastState = getDiskState(); - startTimer (1000); - } - } - - ~Pimpl() - { - stopTimer(); - } - - void timerCallback() override - { - const DiskState state = getDiskState(); - - if (state != lastState) - { - lastState = state; - owner.sendChangeMessage(); - } - } - - DiskState getDiskState() const - { - if ([device->device isValid]) - { - NSDictionary* status = [device->device status]; - NSString* state = [status objectForKey: DRDeviceMediaStateKey]; - - if ([state isEqualTo: DRDeviceMediaStateNone]) - { - if ([[status objectForKey: DRDeviceIsTrayOpenKey] boolValue]) - return trayOpen; - - return noDisc; - } - - if ([state isEqualTo: DRDeviceMediaStateMediaPresent]) - { - if ([[[status objectForKey: DRDeviceMediaInfoKey] objectForKey: DRDeviceMediaBlocksFreeKey] intValue] > 0) - return writableDiskPresent; - - return readOnlyDiskPresent; - } - } - - return unknown; - } - - bool openTray() { return [device->device isValid] && [device->device ejectMedia]; } - - Array getAvailableWriteSpeeds() const - { - Array results; - - if ([device->device isValid]) - for (id kbPerSec in [[[device->device status] objectForKey: DRDeviceMediaInfoKey] objectForKey: DRDeviceBurnSpeedsKey]) - results.add ([kbPerSec intValue] / kilobytesPerSecond1x); - - return results; - } - - bool setBufferUnderrunProtection (const bool shouldBeEnabled) - { - if ([device->device isValid]) - { - device->underrunProtection = shouldBeEnabled; - return shouldBeEnabled && [[[device->device status] objectForKey: DRDeviceCanUnderrunProtectCDKey] boolValue]; - } - - return false; - } - - int getNumAvailableAudioBlocks() const - { - return [[[[device->device status] objectForKey: DRDeviceMediaInfoKey] - objectForKey: DRDeviceMediaBlocksFreeKey] intValue]; - } - - ScopedPointer device; - -private: - DiskState lastState; - AudioCDBurner& owner; -}; - -//============================================================================== -AudioCDBurner::AudioCDBurner (const int deviceIndex) -{ - pimpl = new Pimpl (*this, deviceIndex); -} - -AudioCDBurner::~AudioCDBurner() -{ -} - -AudioCDBurner* AudioCDBurner::openDevice (const int deviceIndex) -{ - ScopedPointer b (new AudioCDBurner (deviceIndex)); - - if (b->pimpl->device == nil) - b = nullptr; - - return b.release(); -} - -StringArray AudioCDBurner::findAvailableDevices() -{ - StringArray s; - - for (NSDictionary* dic in [DRDevice devices]) - if (NSString* name = [dic valueForKey: DRDeviceProductNameKey]) - s.add (nsStringToJuce (name)); - - return s; -} - -AudioCDBurner::DiskState AudioCDBurner::getDiskState() const -{ - return pimpl->getDiskState(); -} - -bool AudioCDBurner::isDiskPresent() const -{ - return getDiskState() == writableDiskPresent; -} - -bool AudioCDBurner::openTray() -{ - return pimpl->openTray(); -} - -AudioCDBurner::DiskState AudioCDBurner::waitUntilStateChange (int timeOutMilliseconds) -{ - const int64 timeout = Time::currentTimeMillis() + timeOutMilliseconds; - DiskState oldState = getDiskState(); - DiskState newState = oldState; - - while (newState == oldState && Time::currentTimeMillis() < timeout) - { - newState = getDiskState(); - Thread::sleep (100); - } - - return newState; -} - -Array AudioCDBurner::getAvailableWriteSpeeds() const -{ - return pimpl->getAvailableWriteSpeeds(); -} - -bool AudioCDBurner::setBufferUnderrunProtection (const bool shouldBeEnabled) -{ - return pimpl->setBufferUnderrunProtection (shouldBeEnabled); -} - -int AudioCDBurner::getNumAvailableAudioBlocks() const -{ - return pimpl->getNumAvailableAudioBlocks(); -} - -bool AudioCDBurner::addAudioTrack (AudioSource* source, int numSamps) -{ - if ([pimpl->device->device isValid]) - { - pimpl->device->addSourceTrack (source, numSamps); - return true; - } - - return false; -} - -String AudioCDBurner::burn (AudioCDBurner::BurnProgressListener* listener, - bool ejectDiscAfterwards, - bool performFakeBurnForTesting, - int writeSpeed) -{ - if ([pimpl->device->device isValid]) - return pimpl->device->burn (listener, ejectDiscAfterwards, performFakeBurnForTesting, writeSpeed); - - return "Couldn't open or write to the CD device"; -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm deleted file mode 100755 index 447c98b..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_AudioCDReader.mm +++ /dev/null @@ -1,261 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace CDReaderHelpers -{ - inline const XmlElement* getElementForKey (const XmlElement& xml, const String& key) - { - forEachXmlChildElementWithTagName (xml, child, "key") - if (child->getAllSubText().trim() == key) - return child->getNextElement(); - - return nullptr; - } - - static int getIntValueForKey (const XmlElement& xml, const String& key, int defaultValue = -1) - { - const XmlElement* const block = getElementForKey (xml, key); - return block != nullptr ? block->getAllSubText().trim().getIntValue() : defaultValue; - } - - // Get the track offsets for a CD given an XmlElement representing its TOC.Plist. - // Returns NULL on success, otherwise a const char* representing an error. - static const char* getTrackOffsets (XmlDocument& xmlDocument, Array& offsets) - { - const ScopedPointer xml (xmlDocument.getDocumentElement()); - if (xml == nullptr) - return "Couldn't parse XML in file"; - - const XmlElement* const dict = xml->getChildByName ("dict"); - if (dict == nullptr) - return "Couldn't get top level dictionary"; - - const XmlElement* const sessions = getElementForKey (*dict, "Sessions"); - if (sessions == nullptr) - return "Couldn't find sessions key"; - - const XmlElement* const session = sessions->getFirstChildElement(); - if (session == nullptr) - return "Couldn't find first session"; - - const int leadOut = getIntValueForKey (*session, "Leadout Block"); - if (leadOut < 0) - return "Couldn't find Leadout Block"; - - const XmlElement* const trackArray = getElementForKey (*session, "Track Array"); - if (trackArray == nullptr) - return "Couldn't find Track Array"; - - forEachXmlChildElement (*trackArray, track) - { - const int trackValue = getIntValueForKey (*track, "Start Block"); - if (trackValue < 0) - return "Couldn't find Start Block in the track"; - - offsets.add (trackValue * AudioCDReader::samplesPerFrame - 88200); - } - - offsets.add (leadOut * AudioCDReader::samplesPerFrame - 88200); - return nullptr; - } - - static void findDevices (Array& cds) - { - File volumes ("/Volumes"); - volumes.findChildFiles (cds, File::findDirectories, false); - - for (int i = cds.size(); --i >= 0;) - if (! cds.getReference(i).getChildFile (".TOC.plist").exists()) - cds.remove (i); - } - - struct TrackSorter - { - static int getCDTrackNumber (const File& file) - { - return file.getFileName().initialSectionContainingOnly ("0123456789").getIntValue(); - } - - static int compareElements (const File& first, const File& second) - { - const int firstTrack = getCDTrackNumber (first); - const int secondTrack = getCDTrackNumber (second); - - jassert (firstTrack > 0 && secondTrack > 0); - - return firstTrack - secondTrack; - } - }; -} - -//============================================================================== -StringArray AudioCDReader::getAvailableCDNames() -{ - Array cds; - CDReaderHelpers::findDevices (cds); - - StringArray names; - - for (int i = 0; i < cds.size(); ++i) - names.add (cds.getReference(i).getFileName()); - - return names; -} - -AudioCDReader* AudioCDReader::createReaderForCD (const int index) -{ - Array cds; - CDReaderHelpers::findDevices (cds); - - if (cds[index].exists()) - return new AudioCDReader (cds[index]); - - return nullptr; -} - -AudioCDReader::AudioCDReader (const File& volume) - : AudioFormatReader (0, "CD Audio"), - volumeDir (volume), - currentReaderTrack (-1), - reader (0) -{ - sampleRate = 44100.0; - bitsPerSample = 16; - numChannels = 2; - usesFloatingPointData = false; - - refreshTrackLengths(); -} - -AudioCDReader::~AudioCDReader() -{ -} - -void AudioCDReader::refreshTrackLengths() -{ - tracks.clear(); - trackStartSamples.clear(); - lengthInSamples = 0; - - volumeDir.findChildFiles (tracks, File::findFiles | File::ignoreHiddenFiles, false, "*.aiff"); - - CDReaderHelpers::TrackSorter sorter; - tracks.sort (sorter); - - const File toc (volumeDir.getChildFile (".TOC.plist")); - - if (toc.exists()) - { - XmlDocument doc (toc); - const char* error = CDReaderHelpers::getTrackOffsets (doc, trackStartSamples); - (void) error; // could be logged.. - - lengthInSamples = trackStartSamples.getLast() - trackStartSamples.getFirst(); - } -} - -bool AudioCDReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) -{ - while (numSamples > 0) - { - int track = -1; - - for (int i = 0; i < trackStartSamples.size() - 1; ++i) - { - if (startSampleInFile < trackStartSamples.getUnchecked (i + 1)) - { - track = i; - break; - } - } - - if (track < 0) - return false; - - if (track != currentReaderTrack) - { - reader = nullptr; - - if (FileInputStream* const in = tracks [track].createInputStream()) - { - BufferedInputStream* const bin = new BufferedInputStream (in, 65536, true); - - AiffAudioFormat format; - reader = format.createReaderFor (bin, true); - - if (reader == nullptr) - currentReaderTrack = -1; - else - currentReaderTrack = track; - } - } - - if (reader == nullptr) - return false; - - const int startPos = (int) (startSampleInFile - trackStartSamples.getUnchecked (track)); - const int numAvailable = (int) jmin ((int64) numSamples, reader->lengthInSamples - startPos); - - reader->readSamples (destSamples, numDestChannels, startOffsetInDestBuffer, startPos, numAvailable); - - numSamples -= numAvailable; - startSampleInFile += numAvailable; - } - - return true; -} - -bool AudioCDReader::isCDStillPresent() const -{ - return volumeDir.exists(); -} - -void AudioCDReader::ejectDisk() -{ - JUCE_AUTORELEASEPOOL - { - [[NSWorkspace sharedWorkspace] unmountAndEjectDeviceAtPath: juceStringToNS (volumeDir.getFullPathName())]; - } -} - -bool AudioCDReader::isTrackAudio (int trackNum) const -{ - return tracks [trackNum].hasFileExtension (".aiff"); -} - -void AudioCDReader::enableIndexScanning (bool) -{ - // any way to do this on a Mac?? -} - -int AudioCDReader::getLastIndex() const -{ - return 0; -} - -Array AudioCDReader::findIndexesInTrack (const int /*trackNumber*/) -{ - return Array(); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp deleted file mode 100755 index 0061b0f..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreAudio.cpp +++ /dev/null @@ -1,1945 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_COREAUDIO_LOGGING_ENABLED - #define JUCE_COREAUDIOLOG(a) { String camsg ("CoreAudio: "); camsg << a; Logger::writeToLog (camsg); } -#else - #define JUCE_COREAUDIOLOG(a) -#endif - -//============================================================================== -struct SystemVol -{ - SystemVol (AudioObjectPropertySelector selector) - : outputDeviceID (kAudioObjectUnknown) - { - addr.mScope = kAudioObjectPropertyScopeGlobal; - addr.mElement = kAudioObjectPropertyElementMaster; - addr.mSelector = kAudioHardwarePropertyDefaultOutputDevice; - - if (AudioHardwareServiceHasProperty (kAudioObjectSystemObject, &addr)) - { - UInt32 deviceIDSize = sizeof (outputDeviceID); - OSStatus status = AudioHardwareServiceGetPropertyData (kAudioObjectSystemObject, &addr, 0, - nullptr, &deviceIDSize, &outputDeviceID); - - if (status == noErr) - { - addr.mElement = kAudioObjectPropertyElementMaster; - addr.mSelector = selector; - addr.mScope = kAudioDevicePropertyScopeOutput; - - if (! AudioHardwareServiceHasProperty (outputDeviceID, &addr)) - outputDeviceID = kAudioObjectUnknown; - } - } - } - - float getGain() - { - Float32 gain = 0; - - if (outputDeviceID != kAudioObjectUnknown) - { - UInt32 size = sizeof (gain); - AudioHardwareServiceGetPropertyData (outputDeviceID, &addr, - 0, nullptr, &size, &gain); - } - - return (float) gain; - } - - bool setGain (float gain) - { - if (outputDeviceID != kAudioObjectUnknown && canSetVolume()) - { - Float32 newVolume = gain; - UInt32 size = sizeof (newVolume); - - return AudioHardwareServiceSetPropertyData (outputDeviceID, &addr, 0, nullptr, - size, &newVolume) == noErr; - } - - return false; - } - - bool isMuted() - { - UInt32 muted = 0; - - if (outputDeviceID != kAudioObjectUnknown) - { - UInt32 size = sizeof (muted); - AudioHardwareServiceGetPropertyData (outputDeviceID, &addr, - 0, nullptr, &size, &muted); - } - - return muted != 0; - } - - bool setMuted (bool mute) - { - if (outputDeviceID != kAudioObjectUnknown && canSetVolume()) - { - UInt32 newMute = mute ? 1 : 0; - UInt32 size = sizeof (newMute); - - return AudioHardwareServiceSetPropertyData (outputDeviceID, &addr, 0, nullptr, - size, &newMute) == noErr; - } - - return false; - } - -private: - AudioDeviceID outputDeviceID; - AudioObjectPropertyAddress addr; - - bool canSetVolume() - { - Boolean isSettable = NO; - return AudioHardwareServiceIsPropertySettable (outputDeviceID, &addr, &isSettable) == noErr - && isSettable; - } -}; - -#define JUCE_SYSTEMAUDIOVOL_IMPLEMENTED 1 -float JUCE_CALLTYPE SystemAudioVolume::getGain() { return SystemVol (kAudioHardwareServiceDeviceProperty_VirtualMasterVolume).getGain(); } -bool JUCE_CALLTYPE SystemAudioVolume::setGain (float gain) { return SystemVol (kAudioHardwareServiceDeviceProperty_VirtualMasterVolume).setGain (gain); } -bool JUCE_CALLTYPE SystemAudioVolume::isMuted() { return SystemVol (kAudioDevicePropertyMute).isMuted(); } -bool JUCE_CALLTYPE SystemAudioVolume::setMuted (bool mute) { return SystemVol (kAudioDevicePropertyMute).setMuted (mute); } - -//============================================================================== -struct CoreAudioClasses -{ - -class CoreAudioIODevice; - -//============================================================================== -class CoreAudioInternal : private Timer -{ -public: - CoreAudioInternal (CoreAudioIODevice& d, AudioDeviceID id) - : owner (d), - inputLatency (0), - outputLatency (0), - bitDepth (32), - callback (nullptr), - #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 - audioProcID (0), - #endif - deviceID (id), - started (false), - sampleRate (0), - bufferSize (512), - numInputChans (0), - numOutputChans (0), - callbacksAllowed (true) - { - jassert (deviceID != 0); - - updateDetailsFromDevice(); - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioObjectPropertySelectorWildcard; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementWildcard; - - AudioObjectAddPropertyListener (deviceID, &pa, deviceListenerProc, this); - } - - ~CoreAudioInternal() - { - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioObjectPropertySelectorWildcard; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementWildcard; - - AudioObjectRemovePropertyListener (deviceID, &pa, deviceListenerProc, this); - - stop (false); - } - - void allocateTempBuffers() - { - const int tempBufSize = bufferSize + 4; - audioBuffer.calloc ((size_t) ((numInputChans + numOutputChans) * tempBufSize)); - - tempInputBuffers.calloc ((size_t) numInputChans + 2); - tempOutputBuffers.calloc ((size_t) numOutputChans + 2); - - int count = 0; - for (int i = 0; i < numInputChans; ++i) tempInputBuffers[i] = audioBuffer + count++ * tempBufSize; - for (int i = 0; i < numOutputChans; ++i) tempOutputBuffers[i] = audioBuffer + count++ * tempBufSize; - } - - struct CallbackDetailsForChannel - { - int streamNum; - int dataOffsetSamples; - int dataStrideSamples; - }; - - // returns the number of actual available channels - StringArray getChannelInfo (const bool input, Array& newChannelInfo) const - { - StringArray newNames; - int chanNum = 0; - UInt32 size; - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioDevicePropertyStreamConfiguration; - pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; - pa.mElement = kAudioObjectPropertyElementMaster; - - if (OK (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size))) - { - HeapBlock bufList; - bufList.calloc (size, 1); - - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, bufList))) - { - const int numStreams = (int) bufList->mNumberBuffers; - - for (int i = 0; i < numStreams; ++i) - { - const AudioBuffer& b = bufList->mBuffers[i]; - - for (unsigned int j = 0; j < b.mNumberChannels; ++j) - { - String name; - NSString* nameNSString = nil; - size = sizeof (nameNSString); - - pa.mSelector = kAudioObjectPropertyElementName; - pa.mElement = (AudioObjectPropertyElement) chanNum + 1; - - if (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &nameNSString) == noErr) - { - name = nsStringToJuce (nameNSString); - [nameNSString release]; - } - - if ((input ? activeInputChans : activeOutputChans) [chanNum]) - { - CallbackDetailsForChannel info = { i, (int) j, (int) b.mNumberChannels }; - newChannelInfo.add (info); - } - - if (name.isEmpty()) - name << (input ? "Input " : "Output ") << (chanNum + 1); - - newNames.add (name); - ++chanNum; - } - } - } - } - - return newNames; - } - - Array getSampleRatesFromDevice() const - { - Array newSampleRates; - - AudioObjectPropertyAddress pa; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementMaster; - pa.mSelector = kAudioDevicePropertyAvailableNominalSampleRates; - UInt32 size = 0; - - if (OK (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size))) - { - HeapBlock ranges; - ranges.calloc (size, 1); - - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ranges))) - { - static const double possibleRates[] = { 44100.0, 48000.0, 88200.0, 96000.0, 176400.0, 192000.0 }; - - for (int i = 0; i < numElementsInArray (possibleRates); ++i) - { - for (int j = size / (int) sizeof (AudioValueRange); --j >= 0;) - { - if (possibleRates[i] >= ranges[j].mMinimum - 2 && possibleRates[i] <= ranges[j].mMaximum + 2) - { - newSampleRates.add (possibleRates[i]); - break; - } - } - } - } - } - - if (newSampleRates.size() == 0 && sampleRate > 0) - newSampleRates.add (sampleRate); - - return newSampleRates; - } - - Array getBufferSizesFromDevice() const - { - Array newBufferSizes; - - AudioObjectPropertyAddress pa; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementMaster; - pa.mSelector = kAudioDevicePropertyBufferFrameSizeRange; - UInt32 size = 0; - - if (OK (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size))) - { - HeapBlock ranges; - ranges.calloc (size, 1); - - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ranges))) - { - newBufferSizes.add ((int) (ranges[0].mMinimum + 15) & ~15); - - for (int i = 32; i < 2048; i += 32) - { - for (int j = size / (int) sizeof (AudioValueRange); --j >= 0;) - { - if (i >= ranges[j].mMinimum && i <= ranges[j].mMaximum) - { - newBufferSizes.addIfNotAlreadyThere (i); - break; - } - } - } - - if (bufferSize > 0) - newBufferSizes.addIfNotAlreadyThere (bufferSize); - } - } - - if (newBufferSizes.size() == 0 && bufferSize > 0) - newBufferSizes.add (bufferSize); - - return newBufferSizes; - } - - int getLatencyFromDevice (AudioObjectPropertyScope scope) const - { - UInt32 lat = 0; - UInt32 size = sizeof (lat); - AudioObjectPropertyAddress pa; - pa.mElement = kAudioObjectPropertyElementMaster; - pa.mSelector = kAudioDevicePropertyLatency; - pa.mScope = scope; - AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &lat); - return (int) lat; - } - - int getBitDepthFromDevice (AudioObjectPropertyScope scope) const - { - AudioObjectPropertyAddress pa; - pa.mElement = kAudioObjectPropertyElementMaster; - pa.mSelector = kAudioStreamPropertyPhysicalFormat; - pa.mScope = scope; - - AudioStreamBasicDescription asbd; - UInt32 size = sizeof (asbd); - - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &asbd))) - return (int) asbd.mBitsPerChannel; - - return 0; - } - - void updateDetailsFromDevice() - { - stopTimer(); - - if (deviceID == 0) - return; - - // this collects all the new details from the device without any locking, then - // locks + swaps them afterwards. - AudioObjectPropertyAddress pa; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementMaster; - - UInt32 isAlive; - UInt32 size = sizeof (isAlive); - pa.mSelector = kAudioDevicePropertyDeviceIsAlive; - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &isAlive)) && isAlive == 0) - return; - - Float64 sr; - size = sizeof (sr); - pa.mSelector = kAudioDevicePropertyNominalSampleRate; - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &sr))) - sampleRate = sr; - - UInt32 framesPerBuf = (UInt32) bufferSize; - size = sizeof (framesPerBuf); - pa.mSelector = kAudioDevicePropertyBufferFrameSize; - AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &framesPerBuf); - - Array newBufferSizes (getBufferSizesFromDevice()); - Array newSampleRates (getSampleRatesFromDevice()); - - inputLatency = getLatencyFromDevice (kAudioDevicePropertyScopeInput); - outputLatency = getLatencyFromDevice (kAudioDevicePropertyScopeOutput); - - Array newInChans, newOutChans; - StringArray newInNames (getChannelInfo (true, newInChans)); - StringArray newOutNames (getChannelInfo (false, newOutChans)); - - const int inputBitDepth = getBitDepthFromDevice (kAudioDevicePropertyScopeInput); - const int outputBitDepth = getBitDepthFromDevice (kAudioDevicePropertyScopeOutput); - - bitDepth = jmax (inputBitDepth, outputBitDepth); - if (bitDepth <= 0) - bitDepth = 32; - - // after getting the new values, lock + apply them - const ScopedLock sl (callbackLock); - - bufferSize = (int) framesPerBuf; - allocateTempBuffers(); - - sampleRates.swapWith (newSampleRates); - bufferSizes.swapWith (newBufferSizes); - - inChanNames.swapWith (newInNames); - outChanNames.swapWith (newOutNames); - - inputChannelInfo.swapWith (newInChans); - outputChannelInfo.swapWith (newOutChans); - } - - //============================================================================== - StringArray getSources (bool input) - { - StringArray s; - HeapBlock types; - const int num = getAllDataSourcesForDevice (deviceID, types); - - for (int i = 0; i < num; ++i) - { - AudioValueTranslation avt; - char buffer[256]; - - avt.mInputData = &(types[i]); - avt.mInputDataSize = sizeof (UInt32); - avt.mOutputData = buffer; - avt.mOutputDataSize = 256; - - UInt32 transSize = sizeof (avt); - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioDevicePropertyDataSourceNameForID; - pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; - pa.mElement = kAudioObjectPropertyElementMaster; - - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &transSize, &avt))) - s.add (buffer); - } - - return s; - } - - int getCurrentSourceIndex (bool input) const - { - OSType currentSourceID = 0; - UInt32 size = sizeof (currentSourceID); - int result = -1; - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioDevicePropertyDataSource; - pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; - pa.mElement = kAudioObjectPropertyElementMaster; - - if (deviceID != 0) - { - if (OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, ¤tSourceID))) - { - HeapBlock types; - const int num = getAllDataSourcesForDevice (deviceID, types); - - for (int i = 0; i < num; ++i) - { - if (types[num] == currentSourceID) - { - result = i; - break; - } - } - } - } - - return result; - } - - void setCurrentSourceIndex (int index, bool input) - { - if (deviceID != 0) - { - HeapBlock types; - const int num = getAllDataSourcesForDevice (deviceID, types); - - if (isPositiveAndBelow (index, num)) - { - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioDevicePropertyDataSource; - pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; - pa.mElement = kAudioObjectPropertyElementMaster; - - OSType typeId = types[index]; - - OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (typeId), &typeId)); - } - } - } - - //============================================================================== - String reopen (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double newSampleRate, int bufferSizeSamples) - { - String error; - callbacksAllowed = false; - stopTimer(); - - stop (false); - - activeInputChans = inputChannels; - activeInputChans.setRange (inChanNames.size(), - activeInputChans.getHighestBit() + 1 - inChanNames.size(), - false); - - activeOutputChans = outputChannels; - activeOutputChans.setRange (outChanNames.size(), - activeOutputChans.getHighestBit() + 1 - outChanNames.size(), - false); - - numInputChans = activeInputChans.countNumberOfSetBits(); - numOutputChans = activeOutputChans.countNumberOfSetBits(); - - // set sample rate - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioDevicePropertyNominalSampleRate; - pa.mScope = kAudioObjectPropertyScopeGlobal; - pa.mElement = kAudioObjectPropertyElementMaster; - Float64 sr = newSampleRate; - - if (! OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (sr), &sr))) - { - error = "Couldn't change sample rate"; - } - else - { - // change buffer size - UInt32 framesPerBuf = (UInt32) bufferSizeSamples; - pa.mSelector = kAudioDevicePropertyBufferFrameSize; - - if (! OK (AudioObjectSetPropertyData (deviceID, &pa, 0, 0, sizeof (framesPerBuf), &framesPerBuf))) - { - error = "Couldn't change buffer size"; - } - else - { - // Annoyingly, after changing the rate and buffer size, some devices fail to - // correctly report their new settings until some random time in the future, so - // after calling updateDetailsFromDevice, we need to manually bodge these values - // to make sure we're using the correct numbers.. - updateDetailsFromDevice(); - sampleRate = newSampleRate; - bufferSize = bufferSizeSamples; - - if (sampleRates.size() == 0) - error = "Device has no available sample-rates"; - else if (bufferSizes.size() == 0) - error = "Device has no available buffer-sizes"; - } - } - - callbacksAllowed = true; - return error; - } - - bool start() - { - if (! started) - { - callback = nullptr; - - if (deviceID != 0) - { - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - if (OK (AudioDeviceAddIOProc (deviceID, audioIOProc, this))) - #else - if (OK (AudioDeviceCreateIOProcID (deviceID, audioIOProc, this, &audioProcID))) - #endif - { - if (OK (AudioDeviceStart (deviceID, audioIOProc))) - { - started = true; - } - else - { - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - OK (AudioDeviceRemoveIOProc (deviceID, audioIOProc)); - #else - OK (AudioDeviceDestroyIOProcID (deviceID, audioProcID)); - audioProcID = 0; - #endif - } - } - } - } - - return started; - } - - void setCallback (AudioIODeviceCallback* cb) - { - const ScopedLock sl (callbackLock); - callback = cb; - } - - void stop (bool leaveInterruptRunning) - { - { - const ScopedLock sl (callbackLock); - callback = nullptr; - } - - if (started - && (deviceID != 0) - && ! leaveInterruptRunning) - { - OK (AudioDeviceStop (deviceID, audioIOProc)); - - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - OK (AudioDeviceRemoveIOProc (deviceID, audioIOProc)); - #else - OK (AudioDeviceDestroyIOProcID (deviceID, audioProcID)); - audioProcID = 0; - #endif - - started = false; - - { const ScopedLock sl (callbackLock); } - - // wait until it's definately stopped calling back.. - for (int i = 40; --i >= 0;) - { - Thread::sleep (50); - - UInt32 running = 0; - UInt32 size = sizeof (running); - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioDevicePropertyDeviceIsRunning; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementMaster; - - OK (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &running)); - - if (running == 0) - break; - } - - const ScopedLock sl (callbackLock); - } - } - - double getSampleRate() const { return sampleRate; } - int getBufferSize() const { return bufferSize; } - - void audioCallback (const AudioBufferList* inInputData, - AudioBufferList* outOutputData) - { - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - { - for (int i = numInputChans; --i >= 0;) - { - const CallbackDetailsForChannel& info = inputChannelInfo.getReference(i); - float* dest = tempInputBuffers [i]; - const float* src = ((const float*) inInputData->mBuffers[info.streamNum].mData) - + info.dataOffsetSamples; - const int stride = info.dataStrideSamples; - - if (stride != 0) // if this is zero, info is invalid - { - for (int j = bufferSize; --j >= 0;) - { - *dest++ = *src; - src += stride; - } - } - } - - callback->audioDeviceIOCallback (const_cast (tempInputBuffers.getData()), - numInputChans, - tempOutputBuffers, - numOutputChans, - bufferSize); - - for (int i = numOutputChans; --i >= 0;) - { - const CallbackDetailsForChannel& info = outputChannelInfo.getReference(i); - const float* src = tempOutputBuffers [i]; - float* dest = ((float*) outOutputData->mBuffers[info.streamNum].mData) - + info.dataOffsetSamples; - const int stride = info.dataStrideSamples; - - if (stride != 0) // if this is zero, info is invalid - { - for (int j = bufferSize; --j >= 0;) - { - *dest = *src++; - dest += stride; - } - } - } - } - else - { - for (UInt32 i = 0; i < outOutputData->mNumberBuffers; ++i) - zeromem (outOutputData->mBuffers[i].mData, - outOutputData->mBuffers[i].mDataByteSize); - } - } - - // called by callbacks - void deviceDetailsChanged() - { - if (callbacksAllowed) - startTimer (100); - } - - void timerCallback() override - { - JUCE_COREAUDIOLOG ("Device changed"); - - stopTimer(); - const double oldSampleRate = sampleRate; - const int oldBufferSize = bufferSize; - updateDetailsFromDevice(); - - if (oldBufferSize != bufferSize || oldSampleRate != sampleRate) - owner.restart(); - } - - //============================================================================== - CoreAudioIODevice& owner; - int inputLatency, outputLatency; - int bitDepth; - BigInteger activeInputChans, activeOutputChans; - StringArray inChanNames, outChanNames; - Array sampleRates; - Array bufferSizes; - AudioIODeviceCallback* callback; - #if MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 - AudioDeviceIOProcID audioProcID; - #endif - -private: - CriticalSection callbackLock; - AudioDeviceID deviceID; - bool started; - double sampleRate; - int bufferSize; - HeapBlock audioBuffer; - int numInputChans, numOutputChans; - bool callbacksAllowed; - - Array inputChannelInfo, outputChannelInfo; - HeapBlock tempInputBuffers, tempOutputBuffers; - - //============================================================================== - static OSStatus audioIOProc (AudioDeviceID /*inDevice*/, - const AudioTimeStamp* /*inNow*/, - const AudioBufferList* inInputData, - const AudioTimeStamp* /*inInputTime*/, - AudioBufferList* outOutputData, - const AudioTimeStamp* /*inOutputTime*/, - void* device) - { - static_cast (device)->audioCallback (inInputData, outOutputData); - return noErr; - } - - static OSStatus deviceListenerProc (AudioDeviceID /*inDevice*/, UInt32 /*inLine*/, const AudioObjectPropertyAddress* pa, void* inClientData) - { - CoreAudioInternal* const intern = static_cast (inClientData); - - switch (pa->mSelector) - { - case kAudioDevicePropertyBufferSize: - case kAudioDevicePropertyBufferFrameSize: - case kAudioDevicePropertyNominalSampleRate: - case kAudioDevicePropertyStreamFormat: - case kAudioDevicePropertyDeviceIsAlive: - case kAudioStreamPropertyPhysicalFormat: - intern->deviceDetailsChanged(); - break; - - case kAudioDevicePropertyBufferSizeRange: - case kAudioDevicePropertyVolumeScalar: - case kAudioDevicePropertyMute: - case kAudioDevicePropertyPlayThru: - case kAudioDevicePropertyDataSource: - case kAudioDevicePropertyDeviceIsRunning: - break; - } - - return noErr; - } - - //============================================================================== - static int getAllDataSourcesForDevice (AudioDeviceID deviceID, HeapBlock& types) - { - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioDevicePropertyDataSources; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementMaster; - UInt32 size = 0; - - if (deviceID != 0 - && AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size) == noErr) - { - types.calloc (size, 1); - - if (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, types) == noErr) - return size / (int) sizeof (OSType); - } - - return 0; - } - - bool OK (const OSStatus errorCode) const - { - if (errorCode == noErr) - return true; - - const String errorMessage ("CoreAudio error: " + String::toHexString ((int) errorCode)); - JUCE_COREAUDIOLOG (errorMessage); - - if (callback != nullptr) - callback->audioDeviceError (errorMessage); - - return false; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioInternal) -}; - - -//============================================================================== -class CoreAudioIODevice : public AudioIODevice -{ -public: - CoreAudioIODevice (const String& deviceName, - AudioDeviceID inputDeviceId, const int inputIndex_, - AudioDeviceID outputDeviceId, const int outputIndex_) - : AudioIODevice (deviceName, "CoreAudio"), - inputIndex (inputIndex_), - outputIndex (outputIndex_), - isOpen_ (false), - isStarted (false) - { - CoreAudioInternal* device = nullptr; - - if (outputDeviceId == 0 || outputDeviceId == inputDeviceId) - { - jassert (inputDeviceId != 0); - device = new CoreAudioInternal (*this, inputDeviceId); - } - else - { - device = new CoreAudioInternal (*this, outputDeviceId); - } - - internal = device; - jassert (device != nullptr); - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioObjectPropertySelectorWildcard; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementWildcard; - - AudioObjectAddPropertyListener (kAudioObjectSystemObject, &pa, hardwareListenerProc, internal); - } - - ~CoreAudioIODevice() - { - close(); - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioObjectPropertySelectorWildcard; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementWildcard; - - AudioObjectRemovePropertyListener (kAudioObjectSystemObject, &pa, hardwareListenerProc, internal); - } - - StringArray getOutputChannelNames() override { return internal->outChanNames; } - StringArray getInputChannelNames() override { return internal->inChanNames; } - - bool isOpen() override { return isOpen_; } - - Array getAvailableSampleRates() override { return internal->sampleRates; } - Array getAvailableBufferSizes() override { return internal->bufferSizes; } - - double getCurrentSampleRate() override { return internal->getSampleRate(); } - int getCurrentBitDepth() override { return internal->bitDepth; } - int getCurrentBufferSizeSamples() override { return internal->getBufferSize(); } - - int getDefaultBufferSize() override - { - int best = 0; - - for (int i = 0; best < 512 && i < internal->bufferSizes.size(); ++i) - best = internal->bufferSizes.getUnchecked(i); - - if (best == 0) - best = 512; - - return best; - } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sampleRate, int bufferSizeSamples) override - { - isOpen_ = true; - - if (bufferSizeSamples <= 0) - bufferSizeSamples = getDefaultBufferSize(); - - lastError = internal->reopen (inputChannels, outputChannels, sampleRate, bufferSizeSamples); - - JUCE_COREAUDIOLOG ("Opened: " << getName()); - JUCE_COREAUDIOLOG ("Latencies: " << getInputLatencyInSamples() << ' ' << getOutputLatencyInSamples()); - - isOpen_ = lastError.isEmpty(); - return lastError; - } - - void close() override - { - isOpen_ = false; - internal->stop (false); - } - - void restart() - { - JUCE_COREAUDIOLOG ("Restarting"); - AudioIODeviceCallback* oldCallback = internal->callback; - stop(); - start (oldCallback); - } - - BigInteger getActiveOutputChannels() const override { return internal->activeOutputChans; } - BigInteger getActiveInputChannels() const override { return internal->activeInputChans; } - - int getOutputLatencyInSamples() override - { - // this seems like a good guess at getting the latency right - comparing - // this with a round-trip measurement, it gets it to within a few millisecs - // for the built-in mac soundcard - return internal->outputLatency; - } - - int getInputLatencyInSamples() override - { - return internal->inputLatency; - } - - void start (AudioIODeviceCallback* callback) override - { - if (! isStarted) - { - if (callback != nullptr) - callback->audioDeviceAboutToStart (this); - - isStarted = internal->start(); - - if (isStarted) - internal->setCallback (callback); - } - } - - void stop() override - { - if (isStarted) - { - AudioIODeviceCallback* const lastCallback = internal->callback; - - isStarted = false; - internal->stop (true); - - if (lastCallback != nullptr) - lastCallback->audioDeviceStopped(); - } - } - - bool isPlaying() override - { - if (internal->callback == nullptr) - isStarted = false; - - return isStarted; - } - - String getLastError() override - { - return lastError; - } - - int inputIndex, outputIndex; - -private: - ScopedPointer internal; - bool isOpen_, isStarted; - String lastError; - - static OSStatus hardwareListenerProc (AudioDeviceID /*inDevice*/, UInt32 /*inLine*/, const AudioObjectPropertyAddress* pa, void* inClientData) - { - switch (pa->mSelector) - { - case kAudioHardwarePropertyDevices: - static_cast (inClientData)->deviceDetailsChanged(); - break; - - case kAudioHardwarePropertyDefaultOutputDevice: - case kAudioHardwarePropertyDefaultInputDevice: - case kAudioHardwarePropertyDefaultSystemOutputDevice: - break; - } - - return noErr; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioIODevice) -}; - -//============================================================================== -class AudioIODeviceCombiner : public AudioIODevice, - private Thread -{ -public: - AudioIODeviceCombiner (const String& deviceName) - : AudioIODevice (deviceName, "CoreAudio"), - Thread (deviceName), callback (nullptr), - currentSampleRate (0), currentBufferSize (0), active (false) - { - } - - ~AudioIODeviceCombiner() - { - close(); - devices.clear(); - } - - void addDevice (AudioIODevice* device, bool useInputs, bool useOutputs) - { - jassert (device != nullptr); - jassert (! isOpen()); - jassert (! device->isOpen()); - devices.add (new DeviceWrapper (*this, device, useInputs, useOutputs)); - } - - Array getDevices() const - { - Array devs; - - for (int i = 0; i < devices.size(); ++i) - devs.add (devices.getUnchecked(i)->device); - - return devs; - } - - StringArray getOutputChannelNames() override - { - StringArray names; - - for (int i = 0; i < devices.size(); ++i) - names.addArray (devices.getUnchecked(i)->getOutputChannelNames()); - - names.appendNumbersToDuplicates (false, true); - return names; - } - - StringArray getInputChannelNames() override - { - StringArray names; - - for (int i = 0; i < devices.size(); ++i) - names.addArray (devices.getUnchecked(i)->getInputChannelNames()); - - names.appendNumbersToDuplicates (false, true); - return names; - } - - Array getAvailableSampleRates() override - { - Array commonRates; - - for (int i = 0; i < devices.size(); ++i) - { - Array rates (devices.getUnchecked(i)->device->getAvailableSampleRates()); - - if (i == 0) - commonRates = rates; - else - commonRates.removeValuesNotIn (rates); - } - - return commonRates; - } - - Array getAvailableBufferSizes() override - { - Array commonSizes; - - for (int i = 0; i < devices.size(); ++i) - { - Array sizes (devices.getUnchecked(i)->device->getAvailableBufferSizes()); - - if (i == 0) - commonSizes = sizes; - else - commonSizes.removeValuesNotIn (sizes); - } - - return commonSizes; - } - - bool isOpen() override { return active; } - bool isPlaying() override { return callback != nullptr; } - double getCurrentSampleRate() override { return currentSampleRate; } - int getCurrentBufferSizeSamples() override { return currentBufferSize; } - - int getCurrentBitDepth() override - { - int depth = 32; - - for (int i = 0; i < devices.size(); ++i) - depth = jmin (depth, devices.getUnchecked(i)->device->getCurrentBitDepth()); - - return depth; - } - - int getDefaultBufferSize() override - { - int size = 0; - - for (int i = 0; i < devices.size(); ++i) - size = jmax (size, devices.getUnchecked(i)->device->getDefaultBufferSize()); - - return size; - } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sampleRate, int bufferSize) override - { - close(); - active = true; - - if (bufferSize <= 0) - bufferSize = getDefaultBufferSize(); - - if (sampleRate <= 0) - { - Array rates (getAvailableSampleRates()); - - for (int i = 0; i < rates.size() && sampleRate < 44100.0; ++i) - sampleRate = rates.getUnchecked(i); - } - - currentSampleRate = sampleRate; - currentBufferSize = bufferSize; - - const int fifoSize = bufferSize * 3 + 1; - int totalInputChanIndex = 0, totalOutputChanIndex = 0; - int chanIndex = 0; - - for (int i = 0; i < devices.size(); ++i) - { - DeviceWrapper& d = *devices.getUnchecked(i); - - BigInteger ins (inputChannels >> totalInputChanIndex); - BigInteger outs (outputChannels >> totalOutputChanIndex); - - int numIns = d.getInputChannelNames().size(); - int numOuts = d.getOutputChannelNames().size(); - - totalInputChanIndex += numIns; - totalOutputChanIndex += numOuts; - - String err = d.open (ins, outs, sampleRate, bufferSize, - chanIndex, fifoSize); - - if (err.isNotEmpty()) - { - close(); - lastError = err; - return err; - } - - chanIndex += d.numInputChans + d.numOutputChans; - } - - fifos.setSize (chanIndex, fifoSize); - fifos.clear(); - startThread (9); - - return String(); - } - - void close() override - { - stop(); - stopThread (10000); - fifos.clear(); - active = false; - - for (int i = 0; i < devices.size(); ++i) - devices.getUnchecked(i)->close(); - } - - BigInteger getActiveOutputChannels() const override - { - BigInteger chans; - int start = 0; - - for (int i = 0; i < devices.size(); ++i) - { - const int numChans = devices.getUnchecked(i)->getOutputChannelNames().size(); - - if (numChans > 0) - { - chans |= (devices.getUnchecked(i)->device->getActiveOutputChannels() << start); - start += numChans; - } - } - - return chans; - } - - BigInteger getActiveInputChannels() const override - { - BigInteger chans; - int start = 0; - - for (int i = 0; i < devices.size(); ++i) - { - const int numChans = devices.getUnchecked(i)->getInputChannelNames().size(); - - if (numChans > 0) - { - chans |= (devices.getUnchecked(i)->device->getActiveInputChannels() << start); - start += numChans; - } - } - - return chans; - } - - int getOutputLatencyInSamples() override - { - int lat = 0; - - for (int i = 0; i < devices.size(); ++i) - lat = jmax (lat, devices.getUnchecked(i)->device->getOutputLatencyInSamples()); - - return lat + currentBufferSize * 2; - } - - int getInputLatencyInSamples() override - { - int lat = 0; - - for (int i = 0; i < devices.size(); ++i) - lat = jmax (lat, devices.getUnchecked(i)->device->getInputLatencyInSamples()); - - return lat + currentBufferSize * 2; - } - - void start (AudioIODeviceCallback* newCallback) override - { - if (callback != newCallback) - { - stop(); - fifos.clear(); - - for (int i = 0; i < devices.size(); ++i) - devices.getUnchecked(i)->start(); - - if (newCallback != nullptr) - newCallback->audioDeviceAboutToStart (this); - - const ScopedLock sl (callbackLock); - callback = newCallback; - } - } - - void stop() override - { - AudioIODeviceCallback* lastCallback = nullptr; - - { - const ScopedLock sl (callbackLock); - std::swap (callback, lastCallback); - } - - for (int i = 0; i < devices.size(); ++i) - devices.getUnchecked(i)->device->stop(); - - if (lastCallback != nullptr) - lastCallback->audioDeviceStopped(); - } - - String getLastError() override - { - return lastError; - } - -private: - CriticalSection callbackLock; - AudioIODeviceCallback* callback; - double currentSampleRate; - int currentBufferSize; - bool active; - String lastError; - - AudioSampleBuffer fifos; - - void run() override - { - const int numSamples = currentBufferSize; - - AudioSampleBuffer buffer (fifos.getNumChannels(), numSamples); - buffer.clear(); - - Array inputChans; - Array outputChans; - - for (int i = 0; i < devices.size(); ++i) - { - DeviceWrapper& d = *devices.getUnchecked(i); - - for (int j = 0; j < d.numInputChans; ++j) inputChans.add (buffer.getReadPointer (d.inputIndex + j)); - for (int j = 0; j < d.numOutputChans; ++j) outputChans.add (buffer.getWritePointer (d.outputIndex + j)); - } - - const int numInputChans = inputChans.size(); - const int numOutputChans = outputChans.size(); - - inputChans.add (nullptr); - outputChans.add (nullptr); - - const int blockSizeMs = jmax (1, (int) (1000 * numSamples / currentSampleRate)); - - jassert (numInputChans + numOutputChans == buffer.getNumChannels()); - - while (! threadShouldExit()) - { - readInput (buffer, numSamples, blockSizeMs); - - bool didCallback = true; - - { - const ScopedLock sl (callbackLock); - - if (callback != nullptr) - callback->audioDeviceIOCallback ((const float**) inputChans.getRawDataPointer(), numInputChans, - outputChans.getRawDataPointer(), numOutputChans, numSamples); - else - didCallback = false; - } - - if (didCallback) - { - pushOutputData (buffer, numSamples, blockSizeMs); - } - else - { - for (int i = 0; i < numOutputChans; ++i) - FloatVectorOperations::clear (outputChans[i], numSamples); - - reset(); - } - } - } - - void reset() - { - for (int i = 0; i < devices.size(); ++i) - devices.getUnchecked(i)->reset(); - } - - void underrun() - { - } - - void readInput (AudioSampleBuffer& buffer, const int numSamples, const int blockSizeMs) - { - for (int i = 0; i < devices.size(); ++i) - { - DeviceWrapper& d = *devices.getUnchecked(i); - d.done = (d.numInputChans == 0); - } - - for (int tries = 5;;) - { - bool anyRemaining = false; - - for (int i = 0; i < devices.size(); ++i) - { - DeviceWrapper& d = *devices.getUnchecked(i); - - if (! d.done) - { - if (d.isInputReady (numSamples)) - { - d.readInput (buffer, numSamples); - d.done = true; - } - else - anyRemaining = true; - } - } - - if (! anyRemaining) - return; - - if (--tries == 0) - break; - - wait (blockSizeMs); - } - - for (int j = 0; j < devices.size(); ++j) - { - DeviceWrapper& d = *devices.getUnchecked(j); - - if (! d.done) - for (int i = 0; i < d.numInputChans; ++i) - buffer.clear (d.inputIndex + i, 0, numSamples); - } - } - - void pushOutputData (AudioSampleBuffer& buffer, const int numSamples, const int blockSizeMs) - { - for (int i = 0; i < devices.size(); ++i) - { - DeviceWrapper& d = *devices.getUnchecked(i); - d.done = (d.numOutputChans == 0); - } - - for (int tries = 5;;) - { - bool anyRemaining = false; - - for (int i = 0; i < devices.size(); ++i) - { - DeviceWrapper& d = *devices.getUnchecked(i); - - if (! d.done) - { - if (d.isOutputReady (numSamples)) - { - d.pushOutputData (buffer, numSamples); - d.done = true; - } - else - anyRemaining = true; - } - } - - if ((! anyRemaining) || --tries == 0) - return; - - wait (blockSizeMs); - } - } - - //============================================================================== - struct DeviceWrapper : private AudioIODeviceCallback - { - DeviceWrapper (AudioIODeviceCombiner& cd, AudioIODevice* d, bool useIns, bool useOuts) - : owner (cd), device (d), inputIndex (0), outputIndex (0), - useInputs (useIns), useOutputs (useOuts), - inputFifo (32), outputFifo (32), done (false) - { - } - - ~DeviceWrapper() - { - close(); - } - - String open (const BigInteger& inputChannels, const BigInteger& outputChannels, - double sampleRate, int bufferSize, - int channelIndex, - int fifoSize) - { - inputFifo.setTotalSize (fifoSize); - outputFifo.setTotalSize (fifoSize); - inputFifo.reset(); - outputFifo.reset(); - - String err (device->open (useInputs ? inputChannels : BigInteger(), - useOutputs ? outputChannels : BigInteger(), - sampleRate, bufferSize)); - - numInputChans = useInputs ? device->getActiveInputChannels().countNumberOfSetBits() : 0; - numOutputChans = useOutputs ? device->getActiveOutputChannels().countNumberOfSetBits() : 0; - - inputIndex = channelIndex; - outputIndex = channelIndex + numInputChans; - - return err; - } - - void close() - { - device->close(); - } - - void start() - { - reset(); - device->start (this); - } - - void reset() - { - inputFifo.reset(); - outputFifo.reset(); - } - - StringArray getOutputChannelNames() const { return useOutputs ? device->getOutputChannelNames() : StringArray(); } - StringArray getInputChannelNames() const { return useInputs ? device->getInputChannelNames() : StringArray(); } - - bool isInputReady (int numSamples) const noexcept - { - return numInputChans == 0 || inputFifo.getNumReady() >= numSamples; - } - - void readInput (AudioSampleBuffer& destBuffer, int numSamples) - { - if (numInputChans == 0) - return; - - int start1, size1, start2, size2; - inputFifo.prepareToRead (numSamples, start1, size1, start2, size2); - - for (int i = 0; i < numInputChans; ++i) - { - const int index = inputIndex + i; - float* const dest = destBuffer.getWritePointer (index); - const float* const src = owner.fifos.getReadPointer (index); - - if (size1 > 0) FloatVectorOperations::copy (dest, src + start1, size1); - if (size2 > 0) FloatVectorOperations::copy (dest + size1, src + start2, size2); - } - - inputFifo.finishedRead (size1 + size2); - } - - bool isOutputReady (int numSamples) const noexcept - { - return numOutputChans == 0 || outputFifo.getFreeSpace() >= numSamples; - } - - void pushOutputData (AudioSampleBuffer& srcBuffer, int numSamples) - { - if (numOutputChans == 0) - return; - - int start1, size1, start2, size2; - outputFifo.prepareToWrite (numSamples, start1, size1, start2, size2); - - for (int i = 0; i < numOutputChans; ++i) - { - const int index = outputIndex + i; - float* const dest = owner.fifos.getWritePointer (index); - const float* const src = srcBuffer.getReadPointer (index); - - if (size1 > 0) FloatVectorOperations::copy (dest + start1, src, size1); - if (size2 > 0) FloatVectorOperations::copy (dest + start2, src + size1, size2); - } - - outputFifo.finishedWrite (size1 + size2); - } - - void audioDeviceIOCallback (const float** inputChannelData, int numInputChannels, - float** outputChannelData, int numOutputChannels, - int numSamples) override - { - AudioSampleBuffer& buf = owner.fifos; - - if (numInputChannels > 0) - { - int start1, size1, start2, size2; - inputFifo.prepareToWrite (numSamples, start1, size1, start2, size2); - - if (size1 + size2 < numSamples) - { - inputFifo.reset(); - inputFifo.prepareToWrite (numSamples, start1, size1, start2, size2); - } - - for (int i = 0; i < numInputChannels; ++i) - { - float* const dest = buf.getWritePointer (inputIndex + i); - const float* const src = inputChannelData[i]; - - if (size1 > 0) FloatVectorOperations::copy (dest + start1, src, size1); - if (size2 > 0) FloatVectorOperations::copy (dest + start2, src + size1, size2); - } - - inputFifo.finishedWrite (size1 + size2); - - if (numSamples > size1 + size2) - { - for (int i = 0; i < numInputChans; ++i) - buf.clear (inputIndex + i, size1 + size2, numSamples - (size1 + size2)); - - owner.underrun(); - } - } - - if (numOutputChannels > 0) - { - int start1, size1, start2, size2; - outputFifo.prepareToRead (numSamples, start1, size1, start2, size2); - - if (size1 + size2 < numSamples) - { - Thread::sleep (1); - outputFifo.prepareToRead (numSamples, start1, size1, start2, size2); - } - - for (int i = 0; i < numOutputChannels; ++i) - { - float* const dest = outputChannelData[i]; - const float* const src = buf.getReadPointer (outputIndex + i); - - if (size1 > 0) FloatVectorOperations::copy (dest, src + start1, size1); - if (size2 > 0) FloatVectorOperations::copy (dest + size1, src + start2, size2); - } - - outputFifo.finishedRead (size1 + size2); - - if (numSamples > size1 + size2) - { - for (int i = 0; i < numOutputChannels; ++i) - FloatVectorOperations::clear (outputChannelData[i] + (size1 + size2), numSamples - (size1 + size2)); - - owner.underrun(); - } - } - - owner.notify(); - } - - void audioDeviceAboutToStart (AudioIODevice*) override {} - void audioDeviceStopped() override {} - - void audioDeviceError (const String& errorMessage) override - { - const ScopedLock sl (owner.callbackLock); - - if (owner.callback != nullptr) - owner.callback->audioDeviceError (errorMessage); - } - - AudioIODeviceCombiner& owner; - ScopedPointer device; - int inputIndex, numInputChans, outputIndex, numOutputChans; - bool useInputs, useOutputs; - AbstractFifo inputFifo, outputFifo; - bool done; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DeviceWrapper) - }; - - OwnedArray devices; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioIODeviceCombiner) -}; - - -//============================================================================== -class CoreAudioIODeviceType : public AudioIODeviceType -{ -public: - CoreAudioIODeviceType() - : AudioIODeviceType ("CoreAudio"), - hasScanned (false) - { - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioHardwarePropertyDevices; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementWildcard; - - AudioObjectAddPropertyListener (kAudioObjectSystemObject, &pa, hardwareListenerProc, this); - } - - ~CoreAudioIODeviceType() - { - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioHardwarePropertyDevices; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementWildcard; - - AudioObjectRemovePropertyListener (kAudioObjectSystemObject, &pa, hardwareListenerProc, this); - } - - //============================================================================== - void scanForDevices() - { - hasScanned = true; - - inputDeviceNames.clear(); - outputDeviceNames.clear(); - inputIds.clear(); - outputIds.clear(); - - UInt32 size; - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioHardwarePropertyDevices; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementMaster; - - if (AudioObjectGetPropertyDataSize (kAudioObjectSystemObject, &pa, 0, nullptr, &size) == noErr) - { - HeapBlock devs; - devs.calloc (size, 1); - - if (AudioObjectGetPropertyData (kAudioObjectSystemObject, &pa, 0, nullptr, &size, devs) == noErr) - { - const int num = size / (int) sizeof (AudioDeviceID); - for (int i = 0; i < num; ++i) - { - char name [1024]; - size = sizeof (name); - pa.mSelector = kAudioDevicePropertyDeviceName; - - if (AudioObjectGetPropertyData (devs[i], &pa, 0, nullptr, &size, name) == noErr) - { - const String nameString (String::fromUTF8 (name, (int) strlen (name))); - const int numIns = getNumChannels (devs[i], true); - const int numOuts = getNumChannels (devs[i], false); - - if (numIns > 0) - { - inputDeviceNames.add (nameString); - inputIds.add (devs[i]); - } - - if (numOuts > 0) - { - outputDeviceNames.add (nameString); - outputIds.add (devs[i]); - } - } - } - } - } - - inputDeviceNames.appendNumbersToDuplicates (false, true); - outputDeviceNames.appendNumbersToDuplicates (false, true); - } - - StringArray getDeviceNames (bool wantInputNames) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - return wantInputNames ? inputDeviceNames - : outputDeviceNames; - } - - int getDefaultDeviceIndex (bool forInput) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - AudioDeviceID deviceID; - UInt32 size = sizeof (deviceID); - - // if they're asking for any input channels at all, use the default input, so we - // get the built-in mic rather than the built-in output with no inputs.. - - AudioObjectPropertyAddress pa; - pa.mSelector = forInput ? kAudioHardwarePropertyDefaultInputDevice - : kAudioHardwarePropertyDefaultOutputDevice; - pa.mScope = kAudioObjectPropertyScopeWildcard; - pa.mElement = kAudioObjectPropertyElementMaster; - - if (AudioObjectGetPropertyData (kAudioObjectSystemObject, &pa, 0, nullptr, &size, &deviceID) == noErr) - { - if (forInput) - { - for (int i = inputIds.size(); --i >= 0;) - if (inputIds[i] == deviceID) - return i; - } - else - { - for (int i = outputIds.size(); --i >= 0;) - if (outputIds[i] == deviceID) - return i; - } - } - - return 0; - } - - int getIndexOfDevice (AudioIODevice* device, bool asInput) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - if (CoreAudioIODevice* const d = dynamic_cast (device)) - return asInput ? d->inputIndex - : d->outputIndex; - - if (AudioIODeviceCombiner* const d = dynamic_cast (device)) - { - const Array devs (d->getDevices()); - - for (int i = 0; i < devs.size(); ++i) - { - const int index = getIndexOfDevice (devs.getUnchecked(i), asInput); - - if (index >= 0) - return index; - } - } - - return -1; - } - - bool hasSeparateInputsAndOutputs() const { return true; } - - AudioIODevice* createDevice (const String& outputDeviceName, - const String& inputDeviceName) - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - const int inputIndex = inputDeviceNames.indexOf (inputDeviceName); - const int outputIndex = outputDeviceNames.indexOf (outputDeviceName); - - AudioDeviceID inputDeviceID = inputIds [inputIndex]; - AudioDeviceID outputDeviceID = outputIds [outputIndex]; - - if (inputDeviceID == 0 && outputDeviceID == 0) - return nullptr; - - String combinedName (outputDeviceName.isEmpty() ? inputDeviceName : outputDeviceName); - - if (inputDeviceID == outputDeviceID) - return new CoreAudioIODevice (combinedName, inputDeviceID, inputIndex, outputDeviceID, outputIndex); - - ScopedPointer in, out; - - if (inputDeviceID != 0) - in = new CoreAudioIODevice (inputDeviceName, inputDeviceID, inputIndex, 0, -1); - - if (outputDeviceID != 0) - out = new CoreAudioIODevice (outputDeviceName, 0, -1, outputDeviceID, outputIndex); - - if (in == nullptr) return out.release(); - if (out == nullptr) return in.release(); - - ScopedPointer combo (new AudioIODeviceCombiner (combinedName)); - combo->addDevice (in.release(), true, false); - combo->addDevice (out.release(), false, true); - return combo.release(); - } - - //============================================================================== -private: - StringArray inputDeviceNames, outputDeviceNames; - Array inputIds, outputIds; - - bool hasScanned; - - static int getNumChannels (AudioDeviceID deviceID, bool input) - { - int total = 0; - UInt32 size; - - AudioObjectPropertyAddress pa; - pa.mSelector = kAudioDevicePropertyStreamConfiguration; - pa.mScope = input ? kAudioDevicePropertyScopeInput : kAudioDevicePropertyScopeOutput; - pa.mElement = kAudioObjectPropertyElementMaster; - - if (AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size) == noErr) - { - HeapBlock bufList; - bufList.calloc (size, 1); - - if (AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, bufList) == noErr) - { - const int numStreams = (int) bufList->mNumberBuffers; - - for (int i = 0; i < numStreams; ++i) - { - const AudioBuffer& b = bufList->mBuffers[i]; - total += b.mNumberChannels; - } - } - } - - return total; - } - - void audioDeviceListChanged() - { - scanForDevices(); - callDeviceChangeListeners(); - } - - static OSStatus hardwareListenerProc (AudioDeviceID, UInt32, const AudioObjectPropertyAddress*, void* clientData) - { - static_cast (clientData)->audioDeviceListChanged(); - return noErr; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioIODeviceType) -}; - -}; - -//============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_CoreAudio() -{ - return new CoreAudioClasses::CoreAudioIODeviceType(); -} - -#undef JUCE_COREAUDIOLOG diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp deleted file mode 100755 index 5f8b3d5..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_mac_CoreMidi.cpp +++ /dev/null @@ -1,530 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_LOG_COREMIDI_ERRORS - #define JUCE_LOG_COREMIDI_ERRORS 1 -#endif - -namespace CoreMidiHelpers -{ - static bool checkError (const OSStatus err, const int lineNum) - { - if (err == noErr) - return true; - - #if JUCE_LOG_COREMIDI_ERRORS - Logger::writeToLog ("CoreMIDI error: " + String (lineNum) + " - " + String::toHexString ((int) err)); - #endif - - (void) lineNum; - return false; - } - - #undef CHECK_ERROR - #define CHECK_ERROR(a) CoreMidiHelpers::checkError (a, __LINE__) - - //============================================================================== - static String getMidiObjectName (MIDIObjectRef entity) - { - String result; - CFStringRef str = nullptr; - MIDIObjectGetStringProperty (entity, kMIDIPropertyName, &str); - - if (str != nullptr) - { - result = String::fromCFString (str); - CFRelease (str); - } - - return result; - } - - static String getEndpointName (MIDIEndpointRef endpoint, bool isExternal) - { - String result (getMidiObjectName (endpoint)); - - MIDIEntityRef entity = 0; // NB: don't attempt to use nullptr for refs - it fails in some types of build. - MIDIEndpointGetEntity (endpoint, &entity); - - if (entity == 0) - return result; // probably virtual - - if (result.isEmpty()) - result = getMidiObjectName (entity); // endpoint name is empty - try the entity - - // now consider the device's name - MIDIDeviceRef device = 0; - MIDIEntityGetDevice (entity, &device); - - if (device != 0) - { - const String deviceName (getMidiObjectName (device)); - - if (deviceName.isNotEmpty()) - { - // if an external device has only one entity, throw away - // the endpoint name and just use the device name - if (isExternal && MIDIDeviceGetNumberOfEntities (device) < 2) - { - result = deviceName; - } - else if (! result.startsWithIgnoreCase (deviceName)) - { - // prepend the device name to the entity name - result = (deviceName + " " + result).trimEnd(); - } - } - } - - return result; - } - - static String getConnectedEndpointName (MIDIEndpointRef endpoint) - { - String result; - - // Does the endpoint have connections? - CFDataRef connections = nullptr; - int numConnections = 0; - - MIDIObjectGetDataProperty (endpoint, kMIDIPropertyConnectionUniqueID, &connections); - - if (connections != nullptr) - { - numConnections = ((int) CFDataGetLength (connections)) / (int) sizeof (MIDIUniqueID); - - if (numConnections > 0) - { - const SInt32* pid = reinterpret_cast (CFDataGetBytePtr (connections)); - - for (int i = 0; i < numConnections; ++i, ++pid) - { - MIDIUniqueID uid = (MIDIUniqueID) ByteOrder::swapIfLittleEndian ((uint32) *pid); - MIDIObjectRef connObject; - MIDIObjectType connObjectType; - OSStatus err = MIDIObjectFindByUniqueID (uid, &connObject, &connObjectType); - - if (err == noErr) - { - String s; - - if (connObjectType == kMIDIObjectType_ExternalSource - || connObjectType == kMIDIObjectType_ExternalDestination) - { - // Connected to an external device's endpoint (10.3 and later). - s = getEndpointName (static_cast (connObject), true); - } - else - { - // Connected to an external device (10.2) (or something else, catch-all) - s = getMidiObjectName (connObject); - } - - if (s.isNotEmpty()) - { - if (result.isNotEmpty()) - result += ", "; - - result += s; - } - } - } - } - - CFRelease (connections); - } - - if (result.isEmpty()) // Here, either the endpoint had no connections, or we failed to obtain names for them. - result = getEndpointName (endpoint, false); - - return result; - } - - static StringArray findDevices (const bool forInput) - { - const ItemCount num = forInput ? MIDIGetNumberOfSources() - : MIDIGetNumberOfDestinations(); - StringArray s; - - for (ItemCount i = 0; i < num; ++i) - { - MIDIEndpointRef dest = forInput ? MIDIGetSource (i) - : MIDIGetDestination (i); - String name; - - if (dest != 0) - name = getConnectedEndpointName (dest); - - if (name.isEmpty()) - name = ""; - - s.add (name); - } - - return s; - } - - static void globalSystemChangeCallback (const MIDINotification*, void*) - { - // TODO.. Should pass-on this notification.. - } - - static String getGlobalMidiClientName() - { - if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) - return app->getApplicationName(); - - return "JUCE"; - } - - static MIDIClientRef getGlobalMidiClient() - { - static MIDIClientRef globalMidiClient = 0; - - if (globalMidiClient == 0) - { - // Since OSX 10.6, the MIDIClientCreate function will only work - // correctly when called from the message thread! - jassert (MessageManager::getInstance()->isThisTheMessageThread()); - - CFStringRef name = getGlobalMidiClientName().toCFString(); - CHECK_ERROR (MIDIClientCreate (name, &globalSystemChangeCallback, nullptr, &globalMidiClient)); - CFRelease (name); - } - - return globalMidiClient; - } - - //============================================================================== - class MidiPortAndEndpoint - { - public: - MidiPortAndEndpoint (MIDIPortRef p, MIDIEndpointRef ep) - : port (p), endPoint (ep) - { - } - - ~MidiPortAndEndpoint() - { - if (port != 0) - MIDIPortDispose (port); - - if (port == 0 && endPoint != 0) // if port == nullptr, it means we created the endpoint, so it's safe to delete it - MIDIEndpointDispose (endPoint); - } - - void send (const MIDIPacketList* const packets) - { - if (port != 0) - MIDISend (port, endPoint, packets); - else - MIDIReceived (endPoint, packets); - } - - MIDIPortRef port; - MIDIEndpointRef endPoint; - }; - - //============================================================================== - class MidiPortAndCallback; - CriticalSection callbackLock; - Array activeCallbacks; - - class MidiPortAndCallback - { - public: - MidiPortAndCallback (MidiInputCallback& cb) - : input (nullptr), active (false), callback (cb), concatenator (2048) - { - } - - ~MidiPortAndCallback() - { - active = false; - - { - const ScopedLock sl (callbackLock); - activeCallbacks.removeFirstMatchingValue (this); - } - - if (portAndEndpoint != 0 && portAndEndpoint->port != 0) - CHECK_ERROR (MIDIPortDisconnectSource (portAndEndpoint->port, portAndEndpoint->endPoint)); - } - - void handlePackets (const MIDIPacketList* const pktlist) - { - const double time = Time::getMillisecondCounterHiRes() * 0.001; - - const ScopedLock sl (callbackLock); - if (activeCallbacks.contains (this) && active) - { - const MIDIPacket* packet = &pktlist->packet[0]; - - for (unsigned int i = 0; i < pktlist->numPackets; ++i) - { - concatenator.pushMidiData (packet->data, (int) packet->length, time, - input, callback); - - packet = MIDIPacketNext (packet); - } - } - } - - MidiInput* input; - ScopedPointer portAndEndpoint; - volatile bool active; - - private: - MidiInputCallback& callback; - MidiDataConcatenator concatenator; - }; - - static void midiInputProc (const MIDIPacketList* pktlist, void* readProcRefCon, void* /*srcConnRefCon*/) - { - static_cast (readProcRefCon)->handlePackets (pktlist); - } -} - -//============================================================================== -StringArray MidiOutput::getDevices() { return CoreMidiHelpers::findDevices (false); } -int MidiOutput::getDefaultDeviceIndex() { return 0; } - -MidiOutput* MidiOutput::openDevice (int index) -{ - MidiOutput* mo = nullptr; - - if (isPositiveAndBelow (index, (int) MIDIGetNumberOfDestinations())) - { - MIDIEndpointRef endPoint = MIDIGetDestination ((ItemCount) index); - - CFStringRef pname; - if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &pname))) - { - MIDIClientRef client = CoreMidiHelpers::getGlobalMidiClient(); - MIDIPortRef port; - - if (client != 0 && CHECK_ERROR (MIDIOutputPortCreate (client, pname, &port))) - { - mo = new MidiOutput(); - mo->internal = new CoreMidiHelpers::MidiPortAndEndpoint (port, endPoint); - } - - CFRelease (pname); - } - } - - return mo; -} - -MidiOutput* MidiOutput::createNewDevice (const String& deviceName) -{ - MidiOutput* mo = nullptr; - MIDIClientRef client = CoreMidiHelpers::getGlobalMidiClient(); - - MIDIEndpointRef endPoint; - CFStringRef name = deviceName.toCFString(); - - if (client != 0 && CHECK_ERROR (MIDISourceCreate (client, name, &endPoint))) - { - mo = new MidiOutput(); - mo->internal = new CoreMidiHelpers::MidiPortAndEndpoint (0, endPoint); - } - - CFRelease (name); - return mo; -} - -MidiOutput::~MidiOutput() -{ - stopBackgroundThread(); - - delete static_cast (internal); -} - -void MidiOutput::sendMessageNow (const MidiMessage& message) -{ - #if JUCE_IOS - const MIDITimeStamp timeStamp = mach_absolute_time(); - #else - const MIDITimeStamp timeStamp = AudioGetCurrentHostTime(); - #endif - - HeapBlock allocatedPackets; - MIDIPacketList stackPacket; - MIDIPacketList* packetToSend = &stackPacket; - const size_t dataSize = (size_t) message.getRawDataSize(); - - if (message.isSysEx()) - { - const int maxPacketSize = 256; - int pos = 0, bytesLeft = (int) dataSize; - const int numPackets = (bytesLeft + maxPacketSize - 1) / maxPacketSize; - allocatedPackets.malloc ((size_t) (32 * (size_t) numPackets + dataSize), 1); - packetToSend = allocatedPackets; - packetToSend->numPackets = (UInt32) numPackets; - - MIDIPacket* p = packetToSend->packet; - - for (int i = 0; i < numPackets; ++i) - { - p->timeStamp = timeStamp; - p->length = (UInt16) jmin (maxPacketSize, bytesLeft); - memcpy (p->data, message.getRawData() + pos, p->length); - pos += p->length; - bytesLeft -= p->length; - p = MIDIPacketNext (p); - } - } - else if (dataSize < 65536) // max packet size - { - const size_t stackCapacity = sizeof (stackPacket.packet->data); - - if (dataSize > stackCapacity) - { - allocatedPackets.malloc ((sizeof (MIDIPacketList) - stackCapacity) + dataSize, 1); - packetToSend = allocatedPackets; - } - - packetToSend->numPackets = 1; - MIDIPacket& p = *(packetToSend->packet); - p.timeStamp = timeStamp; - p.length = (UInt16) dataSize; - memcpy (p.data, message.getRawData(), dataSize); - } - else - { - jassertfalse; // packet too large to send! - return; - } - - static_cast (internal)->send (packetToSend); -} - -//============================================================================== -StringArray MidiInput::getDevices() { return CoreMidiHelpers::findDevices (true); } -int MidiInput::getDefaultDeviceIndex() { return 0; } - -MidiInput* MidiInput::openDevice (int index, MidiInputCallback* callback) -{ - jassert (callback != nullptr); - - using namespace CoreMidiHelpers; - MidiInput* newInput = nullptr; - - if (isPositiveAndBelow (index, (int) MIDIGetNumberOfSources())) - { - if (MIDIEndpointRef endPoint = MIDIGetSource ((ItemCount) index)) - { - CFStringRef name; - - if (CHECK_ERROR (MIDIObjectGetStringProperty (endPoint, kMIDIPropertyName, &name))) - { - if (MIDIClientRef client = getGlobalMidiClient()) - { - MIDIPortRef port; - ScopedPointer mpc (new MidiPortAndCallback (*callback)); - - if (CHECK_ERROR (MIDIInputPortCreate (client, name, midiInputProc, mpc, &port))) - { - if (CHECK_ERROR (MIDIPortConnectSource (port, endPoint, nullptr))) - { - mpc->portAndEndpoint = new MidiPortAndEndpoint (port, endPoint); - - newInput = new MidiInput (getDevices() [index]); - mpc->input = newInput; - newInput->internal = mpc; - - const ScopedLock sl (callbackLock); - activeCallbacks.add (mpc.release()); - } - else - { - CHECK_ERROR (MIDIPortDispose (port)); - } - } - } - } - - CFRelease (name); - } - } - - return newInput; -} - -MidiInput* MidiInput::createNewDevice (const String& deviceName, MidiInputCallback* callback) -{ - jassert (callback != nullptr); - - using namespace CoreMidiHelpers; - MidiInput* mi = nullptr; - - if (MIDIClientRef client = getGlobalMidiClient()) - { - ScopedPointer mpc (new MidiPortAndCallback (*callback)); - mpc->active = false; - - MIDIEndpointRef endPoint; - CFStringRef name = deviceName.toCFString(); - - if (CHECK_ERROR (MIDIDestinationCreate (client, name, midiInputProc, mpc, &endPoint))) - { - mpc->portAndEndpoint = new MidiPortAndEndpoint (0, endPoint); - - mi = new MidiInput (deviceName); - mpc->input = mi; - mi->internal = mpc; - - const ScopedLock sl (callbackLock); - activeCallbacks.add (mpc.release()); - } - - CFRelease (name); - } - - return mi; -} - -MidiInput::MidiInput (const String& nm) : name (nm) -{ -} - -MidiInput::~MidiInput() -{ - delete static_cast (internal); -} - -void MidiInput::start() -{ - const ScopedLock sl (CoreMidiHelpers::callbackLock); - static_cast (internal)->active = true; -} - -void MidiInput::stop() -{ - const ScopedLock sl (CoreMidiHelpers::callbackLock); - static_cast (internal)->active = false; -} - -#undef CHECK_ERROR diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp deleted file mode 100755 index 99e3cfb..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_ASIO.cpp +++ /dev/null @@ -1,1646 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#undef WINDOWS - -/* The ASIO SDK *should* declare its callback functions as being __cdecl, but different versions seem - to be pretty random about whether or not they do this. If you hit an error using these functions - it'll be because you're trying to build using __stdcall, in which case you'd need to either get hold of - an ASIO SDK which correctly specifies __cdecl, or add the __cdecl keyword to its functions yourself. -*/ -#define JUCE_ASIOCALLBACK __cdecl - -//============================================================================== -namespace ASIODebugging -{ - #if JUCE_ASIO_DEBUGGING - #define JUCE_ASIO_LOG(msg) ASIODebugging::logMessage (msg) - #define JUCE_ASIO_LOG_ERROR(msg, errNum) ASIODebugging::logError ((msg), (errNum)) - - static void logMessage (String message) - { - message = "ASIO: " + message; - DBG (message); - Logger::writeToLog (message); - } - - static void logError (const String& context, long error) - { - const char* err = "Unknown error"; - - switch (error) - { - case ASE_OK: return; - case ASE_NotPresent: err = "Not Present"; break; - case ASE_HWMalfunction: err = "Hardware Malfunction"; break; - case ASE_InvalidParameter: err = "Invalid Parameter"; break; - case ASE_InvalidMode: err = "Invalid Mode"; break; - case ASE_SPNotAdvancing: err = "Sample position not advancing"; break; - case ASE_NoClock: err = "No Clock"; break; - case ASE_NoMemory: err = "Out of memory"; break; - default: break; - } - - logMessage ("error: " + context + " - " + err); - } - #else - static void dummyLog() {} - #define JUCE_ASIO_LOG(msg) ASIODebugging::dummyLog() - #define JUCE_ASIO_LOG_ERROR(msg, errNum) (void) errNum; ASIODebugging::dummyLog() - #endif -} - -//============================================================================== -struct ASIOSampleFormat -{ - ASIOSampleFormat() noexcept {} - - ASIOSampleFormat (const long type) noexcept - : bitDepth (24), - littleEndian (true), - formatIsFloat (false), - byteStride (4) - { - switch (type) - { - case ASIOSTInt16MSB: byteStride = 2; littleEndian = false; bitDepth = 16; break; - case ASIOSTInt24MSB: byteStride = 3; littleEndian = false; break; - case ASIOSTInt32MSB: bitDepth = 32; littleEndian = false; break; - case ASIOSTFloat32MSB: bitDepth = 32; littleEndian = false; formatIsFloat = true; break; - case ASIOSTFloat64MSB: bitDepth = 64; byteStride = 8; littleEndian = false; break; - case ASIOSTInt32MSB16: bitDepth = 16; littleEndian = false; break; - case ASIOSTInt32MSB18: littleEndian = false; break; - case ASIOSTInt32MSB20: littleEndian = false; break; - case ASIOSTInt32MSB24: littleEndian = false; break; - case ASIOSTInt16LSB: byteStride = 2; bitDepth = 16; break; - case ASIOSTInt24LSB: byteStride = 3; break; - case ASIOSTInt32LSB: bitDepth = 32; break; - case ASIOSTFloat32LSB: bitDepth = 32; formatIsFloat = true; break; - case ASIOSTFloat64LSB: bitDepth = 64; byteStride = 8; break; - case ASIOSTInt32LSB16: bitDepth = 16; break; - case ASIOSTInt32LSB18: break; // (unhandled) - case ASIOSTInt32LSB20: break; // (unhandled) - case ASIOSTInt32LSB24: break; - - case ASIOSTDSDInt8LSB1: break; // (unhandled) - case ASIOSTDSDInt8MSB1: break; // (unhandled) - case ASIOSTDSDInt8NER8: break; // (unhandled) - - default: - jassertfalse; // (not a valid format code..) - break; - } - } - - void convertToFloat (const void* const src, float* const dst, const int samps) const noexcept - { - if (formatIsFloat) - { - memcpy (dst, src, samps * sizeof (float)); - } - else - { - switch (bitDepth) - { - case 16: convertInt16ToFloat (static_cast (src), dst, byteStride, samps, littleEndian); break; - case 24: convertInt24ToFloat (static_cast (src), dst, byteStride, samps, littleEndian); break; - case 32: convertInt32ToFloat (static_cast (src), dst, byteStride, samps, littleEndian); break; - default: jassertfalse; break; - } - } - } - - void convertFromFloat (const float* const src, void* const dst, const int samps) const noexcept - { - if (formatIsFloat) - { - memcpy (dst, src, samps * sizeof (float)); - } - else - { - switch (bitDepth) - { - case 16: convertFloatToInt16 (src, static_cast (dst), byteStride, samps, littleEndian); break; - case 24: convertFloatToInt24 (src, static_cast (dst), byteStride, samps, littleEndian); break; - case 32: convertFloatToInt32 (src, static_cast (dst), byteStride, samps, littleEndian); break; - default: jassertfalse; break; - } - } - } - - void clear (void* dst, const int numSamps) noexcept - { - if (dst != nullptr) - zeromem (dst, numSamps * byteStride); - } - - int bitDepth, byteStride; - bool formatIsFloat, littleEndian; - -private: - static void convertInt16ToFloat (const char* src, float* dest, const int srcStrideBytes, - int numSamples, const bool littleEndian) noexcept - { - const double g = 1.0 / 32768.0; - - if (littleEndian) - { - while (--numSamples >= 0) - { - *dest++ = (float) (g * (short) ByteOrder::littleEndianShort (src)); - src += srcStrideBytes; - } - } - else - { - while (--numSamples >= 0) - { - *dest++ = (float) (g * (short) ByteOrder::bigEndianShort (src)); - src += srcStrideBytes; - } - } - } - - static void convertFloatToInt16 (const float* src, char* dest, const int dstStrideBytes, - int numSamples, const bool littleEndian) noexcept - { - const double maxVal = (double) 0x7fff; - - if (littleEndian) - { - while (--numSamples >= 0) - { - *(uint16*) dest = ByteOrder::swapIfBigEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); - dest += dstStrideBytes; - } - } - else - { - while (--numSamples >= 0) - { - *(uint16*) dest = ByteOrder::swapIfLittleEndian ((uint16) (short) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); - dest += dstStrideBytes; - } - } - } - - static void convertInt24ToFloat (const char* src, float* dest, const int srcStrideBytes, - int numSamples, const bool littleEndian) noexcept - { - const double g = 1.0 / 0x7fffff; - - if (littleEndian) - { - while (--numSamples >= 0) - { - *dest++ = (float) (g * ByteOrder::littleEndian24Bit (src)); - src += srcStrideBytes; - } - } - else - { - while (--numSamples >= 0) - { - *dest++ = (float) (g * ByteOrder::bigEndian24Bit (src)); - src += srcStrideBytes; - } - } - } - - static void convertFloatToInt24 (const float* src, char* dest, const int dstStrideBytes, - int numSamples, const bool littleEndian) noexcept - { - const double maxVal = (double) 0x7fffff; - - if (littleEndian) - { - while (--numSamples >= 0) - { - ByteOrder::littleEndian24BitToChars ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++)), dest); - dest += dstStrideBytes; - } - } - else - { - while (--numSamples >= 0) - { - ByteOrder::bigEndian24BitToChars ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++)), dest); - dest += dstStrideBytes; - } - } - } - - static void convertInt32ToFloat (const char* src, float* dest, const int srcStrideBytes, - int numSamples, const bool littleEndian) noexcept - { - const double g = 1.0 / 0x7fffffff; - - if (littleEndian) - { - while (--numSamples >= 0) - { - *dest++ = (float) (g * (int) ByteOrder::littleEndianInt (src)); - src += srcStrideBytes; - } - } - else - { - while (--numSamples >= 0) - { - *dest++ = (float) (g * (int) ByteOrder::bigEndianInt (src)); - src += srcStrideBytes; - } - } - } - - static void convertFloatToInt32 (const float* src, char* dest, const int dstStrideBytes, - int numSamples, const bool littleEndian) noexcept - { - const double maxVal = (double) 0x7fffffff; - - if (littleEndian) - { - while (--numSamples >= 0) - { - *(uint32*) dest = ByteOrder::swapIfBigEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); - dest += dstStrideBytes; - } - } - else - { - while (--numSamples >= 0) - { - *(uint32*) dest = ByteOrder::swapIfLittleEndian ((uint32) roundToInt (jlimit (-maxVal, maxVal, maxVal * *src++))); - dest += dstStrideBytes; - } - } - } -}; - -//============================================================================== -class ASIOAudioIODevice; -static ASIOAudioIODevice* volatile currentASIODev[16] = { 0 }; - -extern HWND juce_messageWindowHandle; - -class ASIOAudioIODeviceType; -static void sendASIODeviceChangeToListeners (ASIOAudioIODeviceType*); - -//============================================================================== -class ASIOAudioIODevice : public AudioIODevice, - private Timer -{ -public: - ASIOAudioIODevice (ASIOAudioIODeviceType* ownerType, const String& devName, - const CLSID clsID, const int slotNumber) - : AudioIODevice (devName, "ASIO"), - owner (ownerType), - asioObject (nullptr), - classId (clsID), - inputLatency (0), - outputLatency (0), - minSize (0), maxSize (0), - preferredSize (0), - granularity (0), - numClockSources (0), - currentBlockSizeSamples (0), - currentBitDepth (16), - currentSampleRate (0), - currentCallback (nullptr), - bufferIndex (0), - numActiveInputChans (0), - numActiveOutputChans (0), - deviceIsOpen (false), - isStarted (false), - buffersCreated (false), - calledback (false), - littleEndian (false), - postOutput (true), - needToReset (false), - insideControlPanelModalLoop (false), - shouldUsePreferredSize (false) - { - name = devName; - inBuffers.calloc (4); - outBuffers.calloc (4); - - jassert (currentASIODev [slotNumber] == nullptr); - currentASIODev [slotNumber] = this; - - openDevice(); - } - - ~ASIOAudioIODevice() - { - for (int i = 0; i < numElementsInArray (currentASIODev); ++i) - if (currentASIODev[i] == this) - currentASIODev[i] = nullptr; - - close(); - JUCE_ASIO_LOG ("closed"); - removeCurrentDriver(); - } - - void updateSampleRates() - { - // find a list of sample rates.. - const int possibleSampleRates[] = { 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 }; - Array newRates; - - if (asioObject != nullptr) - { - for (int index = 0; index < numElementsInArray (possibleSampleRates); ++index) - if (asioObject->canSampleRate ((double) possibleSampleRates[index]) == 0) - newRates.add ((double) possibleSampleRates[index]); - } - - if (newRates.size() == 0) - { - double cr = getSampleRate(); - JUCE_ASIO_LOG ("No sample rates supported - current rate: " + String ((int) cr)); - - if (cr > 0) - newRates.add ((int) cr); - } - - if (sampleRates != newRates) - { - sampleRates.swapWith (newRates); - - #if JUCE_ASIO_DEBUGGING - StringArray s; - for (int i = 0; i < sampleRates.size(); ++i) - s.add (String (sampleRates.getUnchecked(i))); - - JUCE_ASIO_LOG ("Rates: " + s.joinIntoString (" ")); - #endif - } - } - - StringArray getOutputChannelNames() override { return outputChannelNames; } - StringArray getInputChannelNames() override { return inputChannelNames; } - - Array getAvailableSampleRates() override { return sampleRates; } - Array getAvailableBufferSizes() override { return bufferSizes; } - int getDefaultBufferSize() override { return preferredSize; } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sr, int bufferSizeSamples) override - { - if (isOpen()) - close(); - - jassert (currentCallback == nullptr); - - if (bufferSizeSamples < 8 || bufferSizeSamples > 16384) - shouldUsePreferredSize = true; - - if (asioObject == nullptr) - { - const String openingError (openDevice()); - - if (asioObject == nullptr) - return openingError; - } - - isStarted = false; - bufferIndex = -1; - - long err = asioObject->getChannels (&totalNumInputChans, &totalNumOutputChans); - jassert (err == ASE_OK); - - bufferSizeSamples = readBufferSizes (bufferSizeSamples); - - double sampleRate = sr; - currentSampleRate = sampleRate; - currentBlockSizeSamples = bufferSizeSamples; - currentChansOut.clear(); - currentChansIn.clear(); - - updateSampleRates(); - - if (sampleRate == 0 || (sampleRates.size() > 0 && ! sampleRates.contains (sampleRate))) - sampleRate = sampleRates[0]; - - jassert (sampleRate != 0); - if (sampleRate == 0) - sampleRate = 44100.0; - - updateClockSources(); - currentSampleRate = getSampleRate(); - - error.clear(); - buffersCreated = false; - - setSampleRate (sampleRate); - - // (need to get this again in case a sample rate change affected the channel count) - err = asioObject->getChannels (&totalNumInputChans, &totalNumOutputChans); - jassert (err == ASE_OK); - - inBuffers.calloc (totalNumInputChans + 8); - outBuffers.calloc (totalNumOutputChans + 8); - - if (needToReset) - { - JUCE_ASIO_LOG (" Resetting"); - removeCurrentDriver(); - - loadDriver(); - const String error (initDriver()); - - if (error.isNotEmpty()) - JUCE_ASIO_LOG ("ASIOInit: " + error); - - needToReset = false; - } - - const int totalBuffers = resetBuffers (inputChannels, outputChannels); - - setCallbackFunctions(); - - JUCE_ASIO_LOG ("disposing buffers"); - err = asioObject->disposeBuffers(); - - JUCE_ASIO_LOG ("creating buffers: " + String (totalBuffers) + ", " + String (currentBlockSizeSamples)); - err = asioObject->createBuffers (bufferInfos, totalBuffers, currentBlockSizeSamples, &callbacks); - - if (err != ASE_OK) - { - currentBlockSizeSamples = preferredSize; - JUCE_ASIO_LOG_ERROR ("create buffers 2", err); - - asioObject->disposeBuffers(); - err = asioObject->createBuffers (bufferInfos, totalBuffers, currentBlockSizeSamples, &callbacks); - } - - if (err == ASE_OK) - { - buffersCreated = true; - - tempBuffer.calloc (totalBuffers * currentBlockSizeSamples + 32); - - int n = 0; - Array types; - currentBitDepth = 16; - - for (int i = 0; i < (int) totalNumInputChans; ++i) - { - if (inputChannels[i]) - { - inBuffers[n] = tempBuffer + (currentBlockSizeSamples * n); - - ASIOChannelInfo channelInfo = { 0 }; - channelInfo.channel = i; - channelInfo.isInput = 1; - asioObject->getChannelInfo (&channelInfo); - - types.addIfNotAlreadyThere (channelInfo.type); - inputFormat[n] = ASIOSampleFormat (channelInfo.type); - - currentBitDepth = jmax (currentBitDepth, inputFormat[n].bitDepth); - ++n; - } - } - - jassert (numActiveInputChans == n); - n = 0; - - for (int i = 0; i < (int) totalNumOutputChans; ++i) - { - if (outputChannels[i]) - { - outBuffers[n] = tempBuffer + (currentBlockSizeSamples * (numActiveInputChans + n)); - - ASIOChannelInfo channelInfo = { 0 }; - channelInfo.channel = i; - channelInfo.isInput = 0; - asioObject->getChannelInfo (&channelInfo); - - types.addIfNotAlreadyThere (channelInfo.type); - outputFormat[n] = ASIOSampleFormat (channelInfo.type); - - currentBitDepth = jmax (currentBitDepth, outputFormat[n].bitDepth); - ++n; - } - } - - jassert (numActiveOutputChans == n); - - for (int i = types.size(); --i >= 0;) - JUCE_ASIO_LOG ("channel format: " + String (types[i])); - - jassert (n <= totalBuffers); - - for (int i = 0; i < numActiveOutputChans; ++i) - { - outputFormat[i].clear (bufferInfos [numActiveInputChans + i].buffers[0], currentBlockSizeSamples); - outputFormat[i].clear (bufferInfos [numActiveInputChans + i].buffers[1], currentBlockSizeSamples); - } - - readLatencies(); - - asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity); - deviceIsOpen = true; - - JUCE_ASIO_LOG ("starting"); - calledback = false; - err = asioObject->start(); - - if (err != 0) - { - deviceIsOpen = false; - JUCE_ASIO_LOG ("stop on failure"); - Thread::sleep (10); - asioObject->stop(); - error = "Can't start device"; - Thread::sleep (10); - } - else - { - int count = 300; - while (--count > 0 && ! calledback) - Thread::sleep (10); - - isStarted = true; - - if (! calledback) - { - error = "Device didn't start correctly"; - JUCE_ASIO_LOG ("no callbacks - stopping.."); - asioObject->stop(); - } - } - } - else - { - error = "Can't create i/o buffers"; - } - - if (error.isNotEmpty()) - { - JUCE_ASIO_LOG_ERROR (error, err); - disposeBuffers(); - - Thread::sleep (20); - isStarted = false; - deviceIsOpen = false; - - const String errorCopy (error); - close(); // (this resets the error string) - error = errorCopy; - } - - needToReset = false; - return error; - } - - void close() override - { - error.clear(); - stopTimer(); - stop(); - - if (asioObject != nullptr && deviceIsOpen) - { - const ScopedLock sl (callbackLock); - - deviceIsOpen = false; - isStarted = false; - needToReset = false; - - JUCE_ASIO_LOG ("stopping"); - - if (asioObject != nullptr) - { - Thread::sleep (20); - asioObject->stop(); - Thread::sleep (10); - disposeBuffers(); - } - - Thread::sleep (10); - } - } - - bool isOpen() override { return deviceIsOpen || insideControlPanelModalLoop; } - bool isPlaying() override { return asioObject != nullptr && currentCallback != nullptr; } - - int getCurrentBufferSizeSamples() override { return currentBlockSizeSamples; } - double getCurrentSampleRate() override { return currentSampleRate; } - int getCurrentBitDepth() override { return currentBitDepth; } - - BigInteger getActiveOutputChannels() const override { return currentChansOut; } - BigInteger getActiveInputChannels() const override { return currentChansIn; } - - int getOutputLatencyInSamples() override { return outputLatency + currentBlockSizeSamples / 4; } - int getInputLatencyInSamples() override { return inputLatency + currentBlockSizeSamples / 4; } - - void start (AudioIODeviceCallback* callback) override - { - if (callback != nullptr) - { - callback->audioDeviceAboutToStart (this); - - const ScopedLock sl (callbackLock); - currentCallback = callback; - } - } - - void stop() override - { - AudioIODeviceCallback* const lastCallback = currentCallback; - - { - const ScopedLock sl (callbackLock); - currentCallback = nullptr; - } - - if (lastCallback != nullptr) - lastCallback->audioDeviceStopped(); - } - - String getLastError() { return error; } - bool hasControlPanel() const { return true; } - - bool showControlPanel() - { - JUCE_ASIO_LOG ("showing control panel"); - - bool done = false; - - JUCE_TRY - { - // are there are devices that need to be closed before showing their control panel? - // close(); - insideControlPanelModalLoop = true; - - const uint32 started = Time::getMillisecondCounter(); - - if (asioObject != nullptr) - { - asioObject->controlPanel(); - - const int spent = (int) Time::getMillisecondCounter() - (int) started; - - JUCE_ASIO_LOG ("spent: " + String (spent)); - - if (spent > 300) - { - shouldUsePreferredSize = true; - done = true; - } - } - } - JUCE_CATCH_ALL - - insideControlPanelModalLoop = false; - return done; - } - - void resetRequest() noexcept - { - startTimer (500); - } - - void timerCallback() override - { - if (! insideControlPanelModalLoop) - { - stopTimer(); - - JUCE_ASIO_LOG ("restart request!"); - - AudioIODeviceCallback* const oldCallback = currentCallback; - - close(); - - needToReset = true; - open (BigInteger (currentChansIn), BigInteger (currentChansOut), - currentSampleRate, currentBlockSizeSamples); - - reloadChannelNames(); - - if (oldCallback != nullptr) - start (oldCallback); - - sendASIODeviceChangeToListeners (owner); - } - else - { - startTimer (100); - } - } - -private: - //============================================================================== - WeakReference owner; - IASIO* volatile asioObject; - ASIOCallbacks callbacks; - - CLSID classId; - String error; - - long totalNumInputChans, totalNumOutputChans; - StringArray inputChannelNames, outputChannelNames; - - Array sampleRates; - Array bufferSizes; - long inputLatency, outputLatency; - long minSize, maxSize, preferredSize, granularity; - ASIOClockSource clocks[32]; - int numClockSources; - - int volatile currentBlockSizeSamples; - int volatile currentBitDepth; - double volatile currentSampleRate; - BigInteger currentChansOut, currentChansIn; - AudioIODeviceCallback* volatile currentCallback; - CriticalSection callbackLock; - - HeapBlock bufferInfos; - HeapBlock inBuffers, outBuffers; - HeapBlock inputFormat, outputFormat; - - WaitableEvent event1; - HeapBlock tempBuffer; - int volatile bufferIndex, numActiveInputChans, numActiveOutputChans; - - bool deviceIsOpen, isStarted, buffersCreated; - bool volatile calledback; - bool volatile littleEndian, postOutput, needToReset; - bool volatile insideControlPanelModalLoop; - bool volatile shouldUsePreferredSize; - - //============================================================================== - static String convertASIOString (char* const text, int length) - { - if (CharPointer_UTF8::isValidString (text, length)) - return String::fromUTF8 (text, length); - - WCHAR wideVersion [64] = { 0 }; - MultiByteToWideChar (CP_ACP, 0, text, length, wideVersion, numElementsInArray (wideVersion)); - return wideVersion; - } - - String getChannelName (int index, bool isInput) const - { - ASIOChannelInfo channelInfo = { 0 }; - channelInfo.channel = index; - channelInfo.isInput = isInput ? 1 : 0; - asioObject->getChannelInfo (&channelInfo); - - return convertASIOString (channelInfo.name, sizeof (channelInfo.name)); - } - - void reloadChannelNames() - { - if (asioObject != nullptr - && asioObject->getChannels (&totalNumInputChans, &totalNumOutputChans) == ASE_OK) - { - inputChannelNames.clear(); - outputChannelNames.clear(); - - for (int i = 0; i < totalNumInputChans; ++i) - inputChannelNames.add (getChannelName (i, true)); - - for (int i = 0; i < totalNumOutputChans; ++i) - outputChannelNames.add (getChannelName (i, false)); - - outputChannelNames.trim(); - inputChannelNames.trim(); - outputChannelNames.appendNumbersToDuplicates (false, true); - inputChannelNames.appendNumbersToDuplicates (false, true); - } - } - - int readBufferSizes (int bufferSizeSamples) - { - minSize = 0; - maxSize = 0; - granularity = 0; - - long newPreferredSize = 0; - - if (asioObject->getBufferSize (&minSize, &maxSize, &newPreferredSize, &granularity) == ASE_OK) - { - if (preferredSize != 0 && newPreferredSize != 0 && newPreferredSize != preferredSize) - shouldUsePreferredSize = true; - - if (bufferSizeSamples < minSize || bufferSizeSamples > maxSize) - shouldUsePreferredSize = true; - - preferredSize = newPreferredSize; - } - - // unfortunate workaround for certain drivers which crash if you make - // dynamic changes to the buffer size... - shouldUsePreferredSize = shouldUsePreferredSize || getName().containsIgnoreCase ("Digidesign"); - - if (shouldUsePreferredSize) - { - JUCE_ASIO_LOG ("Using preferred size for buffer.."); - long err = asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity); - - if (err == ASE_OK) - { - bufferSizeSamples = (int) preferredSize; - } - else - { - bufferSizeSamples = 1024; - JUCE_ASIO_LOG_ERROR ("getBufferSize1", err); - } - - shouldUsePreferredSize = false; - } - - return bufferSizeSamples; - } - - int resetBuffers (const BigInteger& inputChannels, - const BigInteger& outputChannels) - { - numActiveInputChans = 0; - numActiveOutputChans = 0; - - ASIOBufferInfo* info = bufferInfos; - for (int i = 0; i < totalNumInputChans; ++i) - { - if (inputChannels[i]) - { - currentChansIn.setBit (i); - info->isInput = 1; - info->channelNum = i; - info->buffers[0] = info->buffers[1] = nullptr; - ++info; - ++numActiveInputChans; - } - } - - for (int i = 0; i < totalNumOutputChans; ++i) - { - if (outputChannels[i]) - { - currentChansOut.setBit (i); - info->isInput = 0; - info->channelNum = i; - info->buffers[0] = info->buffers[1] = nullptr; - ++info; - ++numActiveOutputChans; - } - } - - return numActiveInputChans + numActiveOutputChans; - } - - void addBufferSizes (long minSize, long maxSize, long preferredSize, long granularity) - { - // find a list of buffer sizes.. - JUCE_ASIO_LOG (String ((int) minSize) + "->" + String ((int) maxSize) + ", " - + String ((int) preferredSize) + ", " + String ((int) granularity)); - - if (granularity >= 0) - { - granularity = jmax (16, (int) granularity); - - for (int i = jmax ((int) (minSize + 15) & ~15, (int) granularity); i < jmin (6400, (int) maxSize); i += granularity) - bufferSizes.addIfNotAlreadyThere (granularity * (i / granularity)); - } - else if (granularity < 0) - { - for (int i = 0; i < 18; ++i) - { - const int s = (1 << i); - - if (s >= minSize && s <= maxSize) - bufferSizes.add (s); - } - } - - bufferSizes.addIfNotAlreadyThere (preferredSize); - - DefaultElementComparator comparator; - bufferSizes.sort (comparator); - } - - double getSampleRate() const - { - double cr = 0; - long err = asioObject->getSampleRate (&cr); - JUCE_ASIO_LOG_ERROR ("getSampleRate", err); - return cr; - } - - void setSampleRate (double newRate) - { - if (currentSampleRate != newRate) - { - JUCE_ASIO_LOG ("rate change: " + String (currentSampleRate) + " to " + String (newRate)); - long err = asioObject->setSampleRate (newRate); - - if (err == ASE_NoClock && numClockSources > 0) - { - JUCE_ASIO_LOG ("trying to set a clock source.."); - Thread::sleep (10); - err = asioObject->setClockSource (clocks[0].index); - JUCE_ASIO_LOG_ERROR ("setClockSource2", err); - - Thread::sleep (10); - err = asioObject->setSampleRate (newRate); - } - - if (err == 0) - currentSampleRate = newRate; - - // on fail, ignore the attempt to change rate, and run with the current one.. - } - } - - void updateClockSources() - { - zeromem (clocks, sizeof (clocks)); - long numSources = numElementsInArray (clocks); - asioObject->getClockSources (clocks, &numSources); - numClockSources = (int) numSources; - - bool isSourceSet = false; - - // careful not to remove this loop because it does more than just logging! - for (int i = 0; i < numClockSources; ++i) - { - String s ("clock: "); - s += clocks[i].name; - - if (clocks[i].isCurrentSource) - { - isSourceSet = true; - s << " (cur)"; - } - - JUCE_ASIO_LOG (s); - } - - if (numClockSources > 1 && ! isSourceSet) - { - JUCE_ASIO_LOG ("setting clock source"); - long err = asioObject->setClockSource (clocks[0].index); - JUCE_ASIO_LOG_ERROR ("setClockSource1", err); - Thread::sleep (20); - } - else - { - if (numClockSources == 0) - JUCE_ASIO_LOG ("no clock sources!"); - } - } - - void readLatencies() - { - inputLatency = outputLatency = 0; - - if (asioObject->getLatencies (&inputLatency, &outputLatency) != 0) - JUCE_ASIO_LOG ("getLatencies() failed"); - else - JUCE_ASIO_LOG ("Latencies: in = " + String ((int) inputLatency) + ", out = " + String ((int) outputLatency)); - } - - void createDummyBuffers (long preferredSize) - { - numActiveInputChans = 0; - numActiveOutputChans = 0; - - ASIOBufferInfo* info = bufferInfos; - int numChans = 0; - - for (int i = 0; i < jmin (2, (int) totalNumInputChans); ++i) - { - info->isInput = 1; - info->channelNum = i; - info->buffers[0] = info->buffers[1] = nullptr; - ++info; - ++numChans; - } - - const int outputBufferIndex = numChans; - - for (int i = 0; i < jmin (2, (int) totalNumOutputChans); ++i) - { - info->isInput = 0; - info->channelNum = i; - info->buffers[0] = info->buffers[1] = nullptr; - ++info; - ++numChans; - } - - setCallbackFunctions(); - - JUCE_ASIO_LOG ("creating buffers (dummy): " + String (numChans) + ", " + String ((int) preferredSize)); - - if (preferredSize > 0) - { - long err = asioObject->createBuffers (bufferInfos, numChans, preferredSize, &callbacks); - JUCE_ASIO_LOG_ERROR ("dummy buffers", err); - } - - long newInps = 0, newOuts = 0; - asioObject->getChannels (&newInps, &newOuts); - - if (totalNumInputChans != newInps || totalNumOutputChans != newOuts) - { - totalNumInputChans = newInps; - totalNumOutputChans = newOuts; - - JUCE_ASIO_LOG (String ((int) totalNumInputChans) + " in; " + String ((int) totalNumOutputChans) + " out"); - } - - updateSampleRates(); - reloadChannelNames(); - - for (int i = 0; i < totalNumOutputChans; ++i) - { - ASIOChannelInfo channelInfo = { 0 }; - channelInfo.channel = i; - channelInfo.isInput = 0; - asioObject->getChannelInfo (&channelInfo); - - outputFormat[i] = ASIOSampleFormat (channelInfo.type); - - if (i < 2) - { - // clear the channels that are used with the dummy stuff - outputFormat[i].clear (bufferInfos [outputBufferIndex + i].buffers[0], preferredSize); - outputFormat[i].clear (bufferInfos [outputBufferIndex + i].buffers[1], preferredSize); - } - } - } - - void removeCurrentDriver() - { - if (asioObject != nullptr) - { - asioObject->Release(); - asioObject = nullptr; - } - } - - bool loadDriver() - { - removeCurrentDriver(); - - bool crashed = false; - bool ok = tryCreatingDriver (crashed); - - if (crashed) - JUCE_ASIO_LOG ("** Driver crashed while being opened"); - - return ok; - } - - bool tryCreatingDriver (bool& crashed) - { - #if ! JUCE_MINGW - __try - #endif - { - return CoCreateInstance (classId, 0, CLSCTX_INPROC_SERVER, - classId, (void**) &asioObject) == S_OK; - } - #if ! JUCE_MINGW - __except (EXCEPTION_EXECUTE_HANDLER) { crashed = true; } - return false; - #endif - } - - String getLastDriverError() const - { - jassert (asioObject != nullptr); - char buffer [512] = { 0 }; - asioObject->getErrorMessage (buffer); - return String (buffer, sizeof (buffer) - 1); - } - - String initDriver() - { - if (asioObject == nullptr) - return "No Driver"; - - const bool initOk = !! asioObject->init (juce_messageWindowHandle); - String driverError; - - // Get error message if init() failed, or if it's a buggy Denon driver, - // which returns true from init() even when it fails. - if ((! initOk) || getName().containsIgnoreCase ("denon dj")) - driverError = getLastDriverError(); - - if ((! initOk) && driverError.isEmpty()) - driverError = "Driver failed to initialise"; - - if (driverError.isEmpty()) - { - char buffer [512]; - asioObject->getDriverName (buffer); // just in case any flimsy drivers expect this to be called.. - } - - return driverError; - } - - String openDevice() - { - // open the device and get its info.. - JUCE_ASIO_LOG ("opening device: " + getName()); - - needToReset = false; - outputChannelNames.clear(); - inputChannelNames.clear(); - bufferSizes.clear(); - sampleRates.clear(); - deviceIsOpen = false; - totalNumInputChans = 0; - totalNumOutputChans = 0; - numActiveInputChans = 0; - numActiveOutputChans = 0; - currentCallback = nullptr; - - error.clear(); - - if (getName().isEmpty()) - return error; - - long err = 0; - - if (loadDriver()) - { - if ((error = initDriver()).isEmpty()) - { - numActiveInputChans = 0; - numActiveOutputChans = 0; - totalNumInputChans = 0; - totalNumOutputChans = 0; - - if (asioObject != nullptr - && (err = asioObject->getChannels (&totalNumInputChans, &totalNumOutputChans)) == 0) - { - JUCE_ASIO_LOG (String ((int) totalNumInputChans) + " in, " + String ((int) totalNumOutputChans) + " out"); - - const int chansToAllocate = totalNumInputChans + totalNumOutputChans + 4; - bufferInfos.calloc (chansToAllocate); - inBuffers.calloc (chansToAllocate); - outBuffers.calloc (chansToAllocate); - inputFormat.calloc (chansToAllocate); - outputFormat.calloc (chansToAllocate); - - if ((err = asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity)) == 0) - { - addBufferSizes (minSize, maxSize, preferredSize, granularity); - - double currentRate = getSampleRate(); - - if (currentRate < 1.0 || currentRate > 192001.0) - { - JUCE_ASIO_LOG ("setting default sample rate"); - err = asioObject->setSampleRate (44100.0); - JUCE_ASIO_LOG_ERROR ("setting sample rate", err); - - currentRate = getSampleRate(); - } - - currentSampleRate = currentRate; - - postOutput = (asioObject->outputReady() == 0); - if (postOutput) - JUCE_ASIO_LOG ("outputReady true"); - - updateSampleRates(); - - readLatencies(); // ..doing these steps because cubase does so at this stage - createDummyBuffers (preferredSize); // in initialisation, and some devices fail if we don't. - readLatencies(); - - // start and stop because cubase does it.. - err = asioObject->start(); - // ignore an error here, as it might start later after setting other stuff up - JUCE_ASIO_LOG_ERROR ("start", err); - - Thread::sleep (80); - asioObject->stop(); - } - else - { - error = "Can't detect buffer sizes"; - } - } - else - { - error = "Can't detect asio channels"; - } - } - } - else - { - error = "No such device"; - } - - if (error.isNotEmpty()) - { - JUCE_ASIO_LOG_ERROR (error, err); - disposeBuffers(); - removeCurrentDriver(); - } - else - { - JUCE_ASIO_LOG ("device open"); - } - - deviceIsOpen = false; - needToReset = false; - stopTimer(); - return error; - } - - void disposeBuffers() - { - if (asioObject != nullptr && buffersCreated) - { - buffersCreated = false; - asioObject->disposeBuffers(); - } - } - - //============================================================================== - void JUCE_ASIOCALLBACK callback (const long index) - { - if (isStarted) - { - bufferIndex = index; - processBuffer(); - } - else - { - if (postOutput && (asioObject != nullptr)) - asioObject->outputReady(); - } - - calledback = true; - } - - void processBuffer() - { - const ASIOBufferInfo* const infos = bufferInfos; - const int bi = bufferIndex; - - const ScopedLock sl (callbackLock); - - if (bi >= 0) - { - const int samps = currentBlockSizeSamples; - - if (currentCallback != nullptr) - { - for (int i = 0; i < numActiveInputChans; ++i) - { - jassert (inBuffers[i] != nullptr); - inputFormat[i].convertToFloat (infos[i].buffers[bi], inBuffers[i], samps); - } - - currentCallback->audioDeviceIOCallback (const_cast (inBuffers.getData()), numActiveInputChans, - outBuffers, numActiveOutputChans, samps); - - for (int i = 0; i < numActiveOutputChans; ++i) - { - jassert (outBuffers[i] != nullptr); - outputFormat[i].convertFromFloat (outBuffers[i], infos [numActiveInputChans + i].buffers[bi], samps); - } - } - else - { - for (int i = 0; i < numActiveOutputChans; ++i) - outputFormat[i].clear (infos[numActiveInputChans + i].buffers[bi], samps); - } - } - - if (postOutput) - asioObject->outputReady(); - } - - long asioMessagesCallback (long selector, long value) - { - switch (selector) - { - case kAsioSelectorSupported: - if (value == kAsioResetRequest || value == kAsioEngineVersion || value == kAsioResyncRequest - || value == kAsioLatenciesChanged || value == kAsioSupportsInputMonitor) - return 1; - break; - - case kAsioBufferSizeChange: JUCE_ASIO_LOG ("kAsioBufferSizeChange"); resetRequest(); return 1; - case kAsioResetRequest: JUCE_ASIO_LOG ("kAsioResetRequest"); resetRequest(); return 1; - case kAsioResyncRequest: JUCE_ASIO_LOG ("kAsioResyncRequest"); resetRequest(); return 1; - case kAsioLatenciesChanged: JUCE_ASIO_LOG ("kAsioLatenciesChanged"); return 1; - case kAsioEngineVersion: return 2; - - case kAsioSupportsTimeInfo: - case kAsioSupportsTimeCode: return 0; - } - - return 0; - } - - //============================================================================== - template - struct ASIOCallbackFunctions - { - static ASIOTime* JUCE_ASIOCALLBACK bufferSwitchTimeInfoCallback (ASIOTime*, long index, long) - { - if (currentASIODev[deviceIndex] != nullptr) - currentASIODev[deviceIndex]->callback (index); - - return nullptr; - } - - static void JUCE_ASIOCALLBACK bufferSwitchCallback (long index, long) - { - if (currentASIODev[deviceIndex] != nullptr) - currentASIODev[deviceIndex]->callback (index); - } - - static long JUCE_ASIOCALLBACK asioMessagesCallback (long selector, long value, void*, double*) - { - return currentASIODev[deviceIndex] != nullptr - ? currentASIODev[deviceIndex]->asioMessagesCallback (selector, value) - : 0; - } - - static void JUCE_ASIOCALLBACK sampleRateChangedCallback (ASIOSampleRate) - { - if (currentASIODev[deviceIndex] != nullptr) - currentASIODev[deviceIndex]->resetRequest(); - } - - static void setCallbacks (ASIOCallbacks& callbacks) noexcept - { - callbacks.bufferSwitch = &bufferSwitchCallback; - callbacks.asioMessage = &asioMessagesCallback; - callbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfoCallback; - callbacks.sampleRateDidChange = &sampleRateChangedCallback; - } - - static void setCallbacksForDevice (ASIOCallbacks& callbacks, ASIOAudioIODevice* device) noexcept - { - if (currentASIODev[deviceIndex] == device) - setCallbacks (callbacks); - else - ASIOCallbackFunctions::setCallbacksForDevice (callbacks, device); - } - }; - - template <> - struct ASIOCallbackFunctions - { - static void setCallbacksForDevice (ASIOCallbacks&, ASIOAudioIODevice*) noexcept {} - }; - - void setCallbackFunctions() noexcept - { - ASIOCallbackFunctions<0>::setCallbacksForDevice (callbacks, this); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ASIOAudioIODevice) -}; - -//============================================================================== -class ASIOAudioIODeviceType : public AudioIODeviceType -{ -public: - ASIOAudioIODeviceType() - : AudioIODeviceType ("ASIO"), - hasScanned (false) - { - } - - ~ASIOAudioIODeviceType() - { - masterReference.clear(); - } - - //============================================================================== - void scanForDevices() - { - hasScanned = true; - - deviceNames.clear(); - classIds.clear(); - - HKEY hk = 0; - int index = 0; - - if (RegOpenKey (HKEY_LOCAL_MACHINE, _T("software\\asio"), &hk) == ERROR_SUCCESS) - { - TCHAR name [256]; - - while (RegEnumKey (hk, index++, name, numElementsInArray (name)) == ERROR_SUCCESS) - addDriverInfo (name, hk); - - RegCloseKey (hk); - } - } - - StringArray getDeviceNames (bool /*wantInputNames*/) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - return deviceNames; - } - - int getDefaultDeviceIndex (bool) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - for (int i = deviceNames.size(); --i >= 0;) - if (deviceNames[i].containsIgnoreCase ("asio4all")) - return i; // asio4all is a safe choice for a default.. - - #if JUCE_DEBUG - if (deviceNames.size() > 1 && deviceNames[0].containsIgnoreCase ("digidesign")) - return 1; // (the digi m-box driver crashes the app when you run - // it in the debugger, which can be a bit annoying) - #endif - - return 0; - } - - static int findFreeSlot() - { - for (int i = 0; i < numElementsInArray (currentASIODev); ++i) - if (currentASIODev[i] == 0) - return i; - - jassertfalse; // unfortunately you can only have a finite number - // of ASIO devices open at the same time.. - return -1; - } - - int getIndexOfDevice (AudioIODevice* d, bool /*asInput*/) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - return d == nullptr ? -1 : deviceNames.indexOf (d->getName()); - } - - bool hasSeparateInputsAndOutputs() const { return false; } - - AudioIODevice* createDevice (const String& outputDeviceName, - const String& inputDeviceName) - { - // ASIO can't open two different devices for input and output - they must be the same one. - jassert (inputDeviceName == outputDeviceName || outputDeviceName.isEmpty() || inputDeviceName.isEmpty()); - jassert (hasScanned); // need to call scanForDevices() before doing this - - const String deviceName (outputDeviceName.isNotEmpty() ? outputDeviceName - : inputDeviceName); - const int index = deviceNames.indexOf (deviceName); - - if (index >= 0) - { - const int freeSlot = findFreeSlot(); - - if (freeSlot >= 0) - return new ASIOAudioIODevice (this, deviceName, - classIds.getReference (index), freeSlot); - } - - return nullptr; - } - - void sendDeviceChangeToListeners() - { - callDeviceChangeListeners(); - } - - WeakReference::Master masterReference; - -private: - StringArray deviceNames; - Array classIds; - - bool hasScanned; - - //============================================================================== - static bool checkClassIsOk (const String& classId) - { - HKEY hk = 0; - bool ok = false; - - if (RegOpenKey (HKEY_CLASSES_ROOT, _T("clsid"), &hk) == ERROR_SUCCESS) - { - int index = 0; - TCHAR name [512]; - - while (RegEnumKey (hk, index++, name, numElementsInArray (name)) == ERROR_SUCCESS) - { - if (classId.equalsIgnoreCase (name)) - { - HKEY subKey, pathKey; - - if (RegOpenKeyEx (hk, name, 0, KEY_READ, &subKey) == ERROR_SUCCESS) - { - if (RegOpenKeyEx (subKey, _T("InprocServer32"), 0, KEY_READ, &pathKey) == ERROR_SUCCESS) - { - TCHAR pathName [1024] = { 0 }; - DWORD dtype = REG_SZ; - DWORD dsize = sizeof (pathName); - - if (RegQueryValueEx (pathKey, 0, 0, &dtype, (LPBYTE) pathName, &dsize) == ERROR_SUCCESS) - // In older code, this used to check for the existance of the file, but there are situations - // where our process doesn't have access to it, but where the driver still loads ok.. - ok = (pathName[0] != 0); - - RegCloseKey (pathKey); - } - - RegCloseKey (subKey); - } - - break; - } - } - - RegCloseKey (hk); - } - - return ok; - } - - //============================================================================== - void addDriverInfo (const String& keyName, HKEY hk) - { - HKEY subKey; - - if (RegOpenKeyEx (hk, keyName.toWideCharPointer(), 0, KEY_READ, &subKey) == ERROR_SUCCESS) - { - TCHAR buf [256] = { 0 }; - DWORD dtype = REG_SZ; - DWORD dsize = sizeof (buf); - - if (RegQueryValueEx (subKey, _T("clsid"), 0, &dtype, (LPBYTE) buf, &dsize) == ERROR_SUCCESS) - { - if (dsize > 0 && checkClassIsOk (buf)) - { - CLSID classId; - if (CLSIDFromString ((LPOLESTR) buf, &classId) == S_OK) - { - dtype = REG_SZ; - dsize = sizeof (buf); - String deviceName; - - if (RegQueryValueEx (subKey, _T("description"), 0, &dtype, (LPBYTE) buf, &dsize) == ERROR_SUCCESS) - deviceName = buf; - else - deviceName = keyName; - - JUCE_ASIO_LOG ("found " + deviceName); - deviceNames.add (deviceName); - classIds.add (classId); - } - } - - RegCloseKey (subKey); - } - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ASIOAudioIODeviceType) -}; - -void sendASIODeviceChangeToListeners (ASIOAudioIODeviceType* type) -{ - if (type != nullptr) - type->sendDeviceChangeToListeners(); -} - -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_ASIO() -{ - return new ASIOAudioIODeviceType(); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp deleted file mode 100755 index 3c3befb..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDBurner.cpp +++ /dev/null @@ -1,411 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace CDBurnerHelpers -{ - IDiscRecorder* enumCDBurners (StringArray* list, int indexToOpen, IDiscMaster** master) - { - CoInitialize (0); - - IDiscMaster* dm; - IDiscRecorder* result = nullptr; - - if (SUCCEEDED (CoCreateInstance (CLSID_MSDiscMasterObj, 0, - CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, - IID_IDiscMaster, - (void**) &dm))) - { - if (SUCCEEDED (dm->Open())) - { - IEnumDiscRecorders* drEnum = nullptr; - - if (SUCCEEDED (dm->EnumDiscRecorders (&drEnum))) - { - IDiscRecorder* dr = nullptr; - DWORD dummy; - int index = 0; - - while (drEnum->Next (1, &dr, &dummy) == S_OK) - { - if (indexToOpen == index) - { - result = dr; - break; - } - else if (list != nullptr) - { - BSTR path; - - if (SUCCEEDED (dr->GetPath (&path))) - list->add ((const WCHAR*) path); - } - - ++index; - dr->Release(); - } - - drEnum->Release(); - } - - if (master == 0) - dm->Close(); - } - - if (master != nullptr) - *master = dm; - else - dm->Release(); - } - - return result; - } -} - -//============================================================================== -class AudioCDBurner::Pimpl : public ComBaseClassHelper , - public Timer -{ -public: - Pimpl (AudioCDBurner& owner_, IDiscMaster* discMaster_, IDiscRecorder* discRecorder_) - : owner (owner_), discMaster (discMaster_), discRecorder (discRecorder_), redbook (0), - listener (0), progress (0), shouldCancel (false) - { - HRESULT hr = discMaster->SetActiveDiscMasterFormat (IID_IRedbookDiscMaster, (void**) &redbook); - jassert (SUCCEEDED (hr)); - hr = discMaster->SetActiveDiscRecorder (discRecorder); - //jassert (SUCCEEDED (hr)); - - lastState = getDiskState(); - startTimer (2000); - } - - ~Pimpl() {} - - void releaseObjects() - { - discRecorder->Close(); - if (redbook != nullptr) - redbook->Release(); - discRecorder->Release(); - discMaster->Release(); - Release(); - } - - JUCE_COMRESULT QueryCancel (boolean* pbCancel) - { - if (listener != nullptr && ! shouldCancel) - shouldCancel = listener->audioCDBurnProgress (progress); - - *pbCancel = shouldCancel; - - return S_OK; - } - - JUCE_COMRESULT NotifyBlockProgress (long nCompleted, long nTotal) - { - progress = nCompleted / (float) nTotal; - shouldCancel = listener != nullptr && listener->audioCDBurnProgress (progress); - - return E_NOTIMPL; - } - - JUCE_COMRESULT NotifyPnPActivity (void) { return E_NOTIMPL; } - JUCE_COMRESULT NotifyAddProgress (long /*nCompletedSteps*/, long /*nTotalSteps*/) { return E_NOTIMPL; } - JUCE_COMRESULT NotifyTrackProgress (long /*nCurrentTrack*/, long /*nTotalTracks*/) { return E_NOTIMPL; } - JUCE_COMRESULT NotifyPreparingBurn (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } - JUCE_COMRESULT NotifyClosingDisc (long /*nEstimatedSeconds*/) { return E_NOTIMPL; } - JUCE_COMRESULT NotifyBurnComplete (HRESULT /*status*/) { return E_NOTIMPL; } - JUCE_COMRESULT NotifyEraseComplete (HRESULT /*status*/) { return E_NOTIMPL; } - - class ScopedDiscOpener - { - public: - ScopedDiscOpener (Pimpl& p) : pimpl (p) { pimpl.discRecorder->OpenExclusive(); } - ~ScopedDiscOpener() { pimpl.discRecorder->Close(); } - - private: - Pimpl& pimpl; - - JUCE_DECLARE_NON_COPYABLE (ScopedDiscOpener) - }; - - DiskState getDiskState() - { - const ScopedDiscOpener opener (*this); - - long type, flags; - HRESULT hr = discRecorder->QueryMediaType (&type, &flags); - - if (FAILED (hr)) - return unknown; - - if (type != 0 && (flags & MEDIA_WRITABLE) != 0) - return writableDiskPresent; - - if (type == 0) - return noDisc; - - return readOnlyDiskPresent; - } - - int getIntProperty (const LPOLESTR name, const int defaultReturn) const - { - ComSmartPtr prop; - if (FAILED (discRecorder->GetRecorderProperties (prop.resetAndGetPointerAddress()))) - return defaultReturn; - - PROPSPEC iPropSpec; - iPropSpec.ulKind = PRSPEC_LPWSTR; - iPropSpec.lpwstr = name; - - PROPVARIANT iPropVariant; - return FAILED (prop->ReadMultiple (1, &iPropSpec, &iPropVariant)) - ? defaultReturn : (int) iPropVariant.lVal; - } - - bool setIntProperty (const LPOLESTR name, const int value) const - { - ComSmartPtr prop; - if (FAILED (discRecorder->GetRecorderProperties (prop.resetAndGetPointerAddress()))) - return false; - - PROPSPEC iPropSpec; - iPropSpec.ulKind = PRSPEC_LPWSTR; - iPropSpec.lpwstr = name; - - PROPVARIANT iPropVariant; - if (FAILED (prop->ReadMultiple (1, &iPropSpec, &iPropVariant))) - return false; - - iPropVariant.lVal = (long) value; - return SUCCEEDED (prop->WriteMultiple (1, &iPropSpec, &iPropVariant, iPropVariant.vt)) - && SUCCEEDED (discRecorder->SetRecorderProperties (prop)); - } - - void timerCallback() override - { - const DiskState state = getDiskState(); - - if (state != lastState) - { - lastState = state; - owner.sendChangeMessage(); - } - } - - AudioCDBurner& owner; - DiskState lastState; - IDiscMaster* discMaster; - IDiscRecorder* discRecorder; - IRedbookDiscMaster* redbook; - AudioCDBurner::BurnProgressListener* listener; - float progress; - bool shouldCancel; -}; - -//============================================================================== -AudioCDBurner::AudioCDBurner (const int deviceIndex) -{ - IDiscMaster* discMaster = nullptr; - IDiscRecorder* discRecorder = CDBurnerHelpers::enumCDBurners (0, deviceIndex, &discMaster); - - if (discRecorder != nullptr) - pimpl = new Pimpl (*this, discMaster, discRecorder); -} - -AudioCDBurner::~AudioCDBurner() -{ - if (pimpl != nullptr) - pimpl.release()->releaseObjects(); -} - -StringArray AudioCDBurner::findAvailableDevices() -{ - StringArray devs; - CDBurnerHelpers::enumCDBurners (&devs, -1, 0); - return devs; -} - -AudioCDBurner* AudioCDBurner::openDevice (const int deviceIndex) -{ - ScopedPointer b (new AudioCDBurner (deviceIndex)); - - if (b->pimpl == 0) - b = nullptr; - - return b.release(); -} - -AudioCDBurner::DiskState AudioCDBurner::getDiskState() const -{ - return pimpl->getDiskState(); -} - -bool AudioCDBurner::isDiskPresent() const -{ - return getDiskState() == writableDiskPresent; -} - -bool AudioCDBurner::openTray() -{ - const Pimpl::ScopedDiscOpener opener (*pimpl); - return SUCCEEDED (pimpl->discRecorder->Eject()); -} - -AudioCDBurner::DiskState AudioCDBurner::waitUntilStateChange (int timeOutMilliseconds) -{ - const int64 timeout = Time::currentTimeMillis() + timeOutMilliseconds; - DiskState oldState = getDiskState(); - DiskState newState = oldState; - - while (newState == oldState && Time::currentTimeMillis() < timeout) - { - newState = getDiskState(); - Thread::sleep (jmin (250, (int) (timeout - Time::currentTimeMillis()))); - } - - return newState; -} - -Array AudioCDBurner::getAvailableWriteSpeeds() const -{ - Array results; - const int maxSpeed = pimpl->getIntProperty (L"MaxWriteSpeed", 1); - const int speeds[] = { 1, 2, 4, 8, 12, 16, 20, 24, 32, 40, 64, 80 }; - - for (int i = 0; i < numElementsInArray (speeds); ++i) - if (speeds[i] <= maxSpeed) - results.add (speeds[i]); - - results.addIfNotAlreadyThere (maxSpeed); - return results; -} - -bool AudioCDBurner::setBufferUnderrunProtection (const bool shouldBeEnabled) -{ - if (pimpl->getIntProperty (L"BufferUnderrunFreeCapable", 0) == 0) - return false; - - pimpl->setIntProperty (L"EnableBufferUnderrunFree", shouldBeEnabled ? -1 : 0); - return pimpl->getIntProperty (L"EnableBufferUnderrunFree", 0) != 0; -} - -int AudioCDBurner::getNumAvailableAudioBlocks() const -{ - long blocksFree = 0; - pimpl->redbook->GetAvailableAudioTrackBlocks (&blocksFree); - return blocksFree; -} - -String AudioCDBurner::burn (AudioCDBurner::BurnProgressListener* listener, bool ejectDiscAfterwards, - bool performFakeBurnForTesting, int writeSpeed) -{ - pimpl->setIntProperty (L"WriteSpeed", writeSpeed > 0 ? writeSpeed : -1); - - pimpl->listener = listener; - pimpl->progress = 0; - pimpl->shouldCancel = false; - - UINT_PTR cookie; - HRESULT hr = pimpl->discMaster->ProgressAdvise ((AudioCDBurner::Pimpl*) pimpl, &cookie); - - hr = pimpl->discMaster->RecordDisc (performFakeBurnForTesting, - ejectDiscAfterwards); - - String error; - if (hr != S_OK) - { - const char* e = "Couldn't open or write to the CD device"; - - if (hr == IMAPI_E_USERABORT) - e = "User cancelled the write operation"; - else if (hr == IMAPI_E_MEDIUM_NOTPRESENT || hr == IMAPI_E_TRACKOPEN) - e = "No Disk present"; - - error = e; - } - - pimpl->discMaster->ProgressUnadvise (cookie); - pimpl->listener = 0; - - return error; -} - -bool AudioCDBurner::addAudioTrack (AudioSource* audioSource, int numSamples) -{ - if (audioSource == 0) - return false; - - ScopedPointer source (audioSource); - - long bytesPerBlock; - HRESULT hr = pimpl->redbook->GetAudioBlockSize (&bytesPerBlock); - - const int samplesPerBlock = bytesPerBlock / 4; - bool ok = true; - - hr = pimpl->redbook->CreateAudioTrack ((long) numSamples / (bytesPerBlock * 4)); - - HeapBlock buffer (bytesPerBlock); - AudioSampleBuffer sourceBuffer (2, samplesPerBlock); - int samplesDone = 0; - - source->prepareToPlay (samplesPerBlock, 44100.0); - - while (ok) - { - { - AudioSourceChannelInfo info (&sourceBuffer, 0, samplesPerBlock); - sourceBuffer.clear(); - - source->getNextAudioBlock (info); - } - - buffer.clear (bytesPerBlock); - - typedef AudioData::Pointer CDSampleFormat; - - typedef AudioData::Pointer SourceSampleFormat; - - CDSampleFormat left (buffer, 2); - left.convertSamples (SourceSampleFormat (sourceBuffer.getReadPointer (0)), samplesPerBlock); - CDSampleFormat right (buffer + 2, 2); - right.convertSamples (SourceSampleFormat (sourceBuffer.getReadPointer (1)), samplesPerBlock); - - hr = pimpl->redbook->AddAudioTrackBlocks (buffer, bytesPerBlock); - - if (FAILED (hr)) - ok = false; - - samplesDone += samplesPerBlock; - - if (samplesDone >= numSamples) - break; - } - - hr = pimpl->redbook->CloseAudioTrack(); - return ok && hr == S_OK; -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp deleted file mode 100755 index 064ca91..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp +++ /dev/null @@ -1,1309 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace CDReaderHelpers -{ - -#define FILE_ANY_ACCESS 0 -#ifndef FILE_READ_ACCESS - #define FILE_READ_ACCESS 1 -#endif -#ifndef FILE_WRITE_ACCESS - #define FILE_WRITE_ACCESS 2 -#endif - -#define METHOD_BUFFERED 0 -#define IOCTL_SCSI_BASE 4 -#define SCSI_IOCTL_DATA_OUT 0 -#define SCSI_IOCTL_DATA_IN 1 -#define SCSI_IOCTL_DATA_UNSPECIFIED 2 - -#define CTL_CODE2(DevType, Function, Method, Access) (((DevType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) -#define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE2( IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS ) -#define IOCTL_SCSI_GET_ADDRESS CTL_CODE2( IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS ) - -#define SENSE_LEN 14 -#define SRB_ENABLE_RESIDUAL_COUNT 0x04 -#define SRB_DIR_IN 0x08 -#define SRB_DIR_OUT 0x10 -#define SRB_EVENT_NOTIFY 0x40 -#define SC_HA_INQUIRY 0x00 -#define SC_GET_DEV_TYPE 0x01 -#define SC_EXEC_SCSI_CMD 0x02 -#define SS_PENDING 0x00 -#define SS_COMP 0x01 -#define SS_ERR 0x04 - -enum -{ - READTYPE_ANY = 0, - READTYPE_ATAPI1 = 1, - READTYPE_ATAPI2 = 2, - READTYPE_READ6 = 3, - READTYPE_READ10 = 4, - READTYPE_READ_D8 = 5, - READTYPE_READ_D4 = 6, - READTYPE_READ_D4_1 = 7, - READTYPE_READ10_2 = 8 -}; - -struct SCSI_PASS_THROUGH -{ - USHORT Length; - UCHAR ScsiStatus; - UCHAR PathId; - UCHAR TargetId; - UCHAR Lun; - UCHAR CdbLength; - UCHAR SenseInfoLength; - UCHAR DataIn; - ULONG DataTransferLength; - ULONG TimeOutValue; - ULONG DataBufferOffset; - ULONG SenseInfoOffset; - UCHAR Cdb[16]; -}; - -struct SCSI_PASS_THROUGH_DIRECT -{ - USHORT Length; - UCHAR ScsiStatus; - UCHAR PathId; - UCHAR TargetId; - UCHAR Lun; - UCHAR CdbLength; - UCHAR SenseInfoLength; - UCHAR DataIn; - ULONG DataTransferLength; - ULONG TimeOutValue; - PVOID DataBuffer; - ULONG SenseInfoOffset; - UCHAR Cdb[16]; -}; - -struct SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER -{ - SCSI_PASS_THROUGH_DIRECT spt; - ULONG Filler; - UCHAR ucSenseBuf[32]; -}; - -struct SCSI_ADDRESS -{ - ULONG Length; - UCHAR PortNumber; - UCHAR PathId; - UCHAR TargetId; - UCHAR Lun; -}; - -#pragma pack(1) - -struct SRB_GDEVBlock -{ - BYTE SRB_Cmd; - BYTE SRB_Status; - BYTE SRB_HaID; - BYTE SRB_Flags; - DWORD SRB_Hdr_Rsvd; - BYTE SRB_Target; - BYTE SRB_Lun; - BYTE SRB_DeviceType; - BYTE SRB_Rsvd1; - BYTE pad[68]; -}; - - -struct SRB_ExecSCSICmd -{ - BYTE SRB_Cmd; - BYTE SRB_Status; - BYTE SRB_HaID; - BYTE SRB_Flags; - DWORD SRB_Hdr_Rsvd; - BYTE SRB_Target; - BYTE SRB_Lun; - WORD SRB_Rsvd1; - DWORD SRB_BufLen; - BYTE *SRB_BufPointer; - BYTE SRB_SenseLen; - BYTE SRB_CDBLen; - BYTE SRB_HaStat; - BYTE SRB_TargStat; - VOID *SRB_PostProc; - BYTE SRB_Rsvd2[20]; - BYTE CDBByte[16]; - BYTE SenseArea[SENSE_LEN + 2]; -}; - -struct SRB -{ - BYTE SRB_Cmd; - BYTE SRB_Status; - BYTE SRB_HaId; - BYTE SRB_Flags; - DWORD SRB_Hdr_Rsvd; -}; - -struct TOCTRACK -{ - BYTE rsvd; - BYTE ADR; - BYTE trackNumber; - BYTE rsvd2; - BYTE addr[4]; -}; - -struct TOC -{ - WORD tocLen; - BYTE firstTrack; - BYTE lastTrack; - TOCTRACK tracks[100]; -}; - -#pragma pack() - -//============================================================================== -struct CDDeviceDescription -{ - CDDeviceDescription() : ha (0), tgt (0), lun (0), scsiDriveLetter (0) - { - } - - void createDescription (const char* data) - { - description << String (data + 8, 8).trim() // vendor - << ' ' << String (data + 16, 16).trim() // product id - << ' ' << String (data + 32, 4).trim(); // rev - } - - String description; - BYTE ha, tgt, lun; - char scsiDriveLetter; // will be 0 if not using scsi -}; - -//============================================================================== -class CDReadBuffer -{ -public: - CDReadBuffer (const int numberOfFrames) - : startFrame (0), numFrames (0), dataStartOffset (0), - dataLength (0), bufferSize (2352 * numberOfFrames), index (0), - buffer (bufferSize), wantsIndex (false) - { - } - - bool isZero() const noexcept - { - for (int i = 0; i < dataLength; ++i) - if (buffer [dataStartOffset + i] != 0) - return false; - - return true; - } - - int startFrame, numFrames, dataStartOffset; - int dataLength, bufferSize, index; - HeapBlock buffer; - bool wantsIndex; -}; - -class CDDeviceHandle; - -//============================================================================== -class CDController -{ -public: - CDController() : initialised (false) {} - virtual ~CDController() {} - - virtual bool read (CDReadBuffer&) = 0; - virtual void shutDown() {} - - bool readAudio (CDReadBuffer& rb, CDReadBuffer* overlapBuffer = 0); - int getLastIndex(); - -public: - CDDeviceHandle* deviceInfo; - int framesToCheck, framesOverlap; - bool initialised; - - void prepare (SRB_ExecSCSICmd& s); - void perform (SRB_ExecSCSICmd& s); - void setPaused (bool paused); -}; - - -//============================================================================== -class CDDeviceHandle -{ -public: - CDDeviceHandle (const CDDeviceDescription& device, HANDLE scsiHandle_) - : info (device), scsiHandle (scsiHandle_), readType (READTYPE_ANY) - { - } - - ~CDDeviceHandle() - { - if (controller != nullptr) - { - controller->shutDown(); - controller = 0; - } - - if (scsiHandle != 0) - CloseHandle (scsiHandle); - } - - bool readTOC (TOC* lpToc); - bool readAudio (CDReadBuffer& buffer, CDReadBuffer* overlapBuffer = 0); - void openDrawer (bool shouldBeOpen); - void performScsiCommand (HANDLE event, SRB_ExecSCSICmd& s); - - CDDeviceDescription info; - HANDLE scsiHandle; - BYTE readType; - -private: - ScopedPointer controller; - - bool testController (int readType, CDController* newController, CDReadBuffer& bufferToUse); -}; - -//============================================================================== -HANDLE createSCSIDeviceHandle (const char driveLetter) -{ - TCHAR devicePath[] = { '\\', '\\', '.', '\\', driveLetter, ':', 0, 0 }; - DWORD flags = GENERIC_READ | GENERIC_WRITE; - HANDLE h = CreateFile (devicePath, flags, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - - if (h == INVALID_HANDLE_VALUE) - { - flags ^= GENERIC_WRITE; - h = CreateFile (devicePath, flags, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); - } - - return h; -} - -void findCDDevices (Array& list) -{ - for (char driveLetter = 'b'; driveLetter <= 'z'; ++driveLetter) - { - TCHAR drivePath[] = { driveLetter, ':', '\\', 0, 0 }; - - if (GetDriveType (drivePath) == DRIVE_CDROM) - { - HANDLE h = createSCSIDeviceHandle (driveLetter); - - if (h != INVALID_HANDLE_VALUE) - { - char buffer[100] = { 0 }; - - SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER p = { 0 }; - p.spt.Length = sizeof (SCSI_PASS_THROUGH); - p.spt.CdbLength = 6; - p.spt.SenseInfoLength = 24; - p.spt.DataIn = SCSI_IOCTL_DATA_IN; - p.spt.DataTransferLength = sizeof (buffer); - p.spt.TimeOutValue = 2; - p.spt.DataBuffer = buffer; - p.spt.SenseInfoOffset = offsetof (SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, ucSenseBuf); - p.spt.Cdb[0] = 0x12; - p.spt.Cdb[4] = 100; - - DWORD bytesReturned = 0; - - if (DeviceIoControl (h, IOCTL_SCSI_PASS_THROUGH_DIRECT, - &p, sizeof (p), &p, sizeof (p), - &bytesReturned, 0) != 0) - { - CDDeviceDescription dev; - dev.scsiDriveLetter = driveLetter; - dev.createDescription (buffer); - - SCSI_ADDRESS scsiAddr = { 0 }; - scsiAddr.Length = sizeof (scsiAddr); - - if (DeviceIoControl (h, IOCTL_SCSI_GET_ADDRESS, - 0, 0, &scsiAddr, sizeof (scsiAddr), - &bytesReturned, 0) != 0) - { - dev.ha = scsiAddr.PortNumber; - dev.tgt = scsiAddr.TargetId; - dev.lun = scsiAddr.Lun; - list.add (dev); - } - } - - CloseHandle (h); - } - } - } -} - -DWORD performScsiPassThroughCommand (SRB_ExecSCSICmd* const srb, const char driveLetter, - HANDLE& deviceHandle, const bool retryOnFailure) -{ - SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER s = { 0 }; - s.spt.Length = sizeof (SCSI_PASS_THROUGH); - s.spt.CdbLength = srb->SRB_CDBLen; - - s.spt.DataIn = (BYTE) ((srb->SRB_Flags & SRB_DIR_IN) - ? SCSI_IOCTL_DATA_IN - : ((srb->SRB_Flags & SRB_DIR_OUT) - ? SCSI_IOCTL_DATA_OUT - : SCSI_IOCTL_DATA_UNSPECIFIED)); - - s.spt.DataTransferLength = srb->SRB_BufLen; - s.spt.TimeOutValue = 5; - s.spt.DataBuffer = srb->SRB_BufPointer; - s.spt.SenseInfoOffset = offsetof (SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER, ucSenseBuf); - - memcpy (s.spt.Cdb, srb->CDBByte, srb->SRB_CDBLen); - - srb->SRB_Status = SS_ERR; - srb->SRB_TargStat = 0x0004; - - DWORD bytesReturned = 0; - - if (DeviceIoControl (deviceHandle, IOCTL_SCSI_PASS_THROUGH_DIRECT, - &s, sizeof (s), &s, sizeof (s), &bytesReturned, 0) != 0) - { - srb->SRB_Status = SS_COMP; - } - else if (retryOnFailure) - { - const DWORD error = GetLastError(); - - if ((error == ERROR_MEDIA_CHANGED) || (error == ERROR_INVALID_HANDLE)) - { - if (error != ERROR_INVALID_HANDLE) - CloseHandle (deviceHandle); - - deviceHandle = createSCSIDeviceHandle (driveLetter); - - return performScsiPassThroughCommand (srb, driveLetter, deviceHandle, false); - } - } - - return srb->SRB_Status; -} - - -//============================================================================== -// Controller types.. - -class ControllerType1 : public CDController -{ -public: - ControllerType1() {} - - bool read (CDReadBuffer& rb) - { - if (rb.numFrames * 2352 > rb.bufferSize) - return false; - - SRB_ExecSCSICmd s; - prepare (s); - s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; - s.SRB_BufLen = rb.bufferSize; - s.SRB_BufPointer = rb.buffer; - s.SRB_CDBLen = 12; - s.CDBByte[0] = 0xBE; - s.CDBByte[3] = (BYTE) ((rb.startFrame >> 16) & 0xFF); - s.CDBByte[4] = (BYTE) ((rb.startFrame >> 8) & 0xFF); - s.CDBByte[5] = (BYTE) (rb.startFrame & 0xFF); - s.CDBByte[8] = (BYTE) (rb.numFrames & 0xFF); - s.CDBByte[9] = (BYTE) (deviceInfo->readType == READTYPE_ATAPI1 ? 0x10 : 0xF0); - perform (s); - - if (s.SRB_Status != SS_COMP) - return false; - - rb.dataLength = rb.numFrames * 2352; - rb.dataStartOffset = 0; - return true; - } -}; - -//============================================================================== -class ControllerType2 : public CDController -{ -public: - ControllerType2() {} - - void shutDown() - { - if (initialised) - { - BYTE bufPointer[] = { 0, 0, 0, 8, 83, 0, 0, 0, 0, 0, 8, 0 }; - - SRB_ExecSCSICmd s; - prepare (s); - s.SRB_Flags = SRB_EVENT_NOTIFY | SRB_ENABLE_RESIDUAL_COUNT; - s.SRB_BufLen = 0x0C; - s.SRB_BufPointer = bufPointer; - s.SRB_CDBLen = 6; - s.CDBByte[0] = 0x15; - s.CDBByte[4] = 0x0C; - perform (s); - } - } - - bool init() - { - SRB_ExecSCSICmd s; - s.SRB_Status = SS_ERR; - - if (deviceInfo->readType == READTYPE_READ10_2) - { - BYTE bufPointer1[] = { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48, 35, 6, 0, 0, 0, 0, 0, 128 }; - BYTE bufPointer2[] = { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48, 1, 6, 32, 7, 0, 0, 0, 0 }; - - for (int i = 0; i < 2; ++i) - { - prepare (s); - s.SRB_Flags = SRB_EVENT_NOTIFY; - s.SRB_BufLen = 0x14; - s.SRB_BufPointer = (i == 0) ? bufPointer1 : bufPointer2; - s.SRB_CDBLen = 6; - s.CDBByte[0] = 0x15; - s.CDBByte[1] = 0x10; - s.CDBByte[4] = 0x14; - perform (s); - - if (s.SRB_Status != SS_COMP) - return false; - } - } - else - { - BYTE bufPointer[] = { 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 9, 48 }; - - prepare (s); - s.SRB_Flags = SRB_EVENT_NOTIFY; - s.SRB_BufLen = 0x0C; - s.SRB_BufPointer = bufPointer; - s.SRB_CDBLen = 6; - s.CDBByte[0] = 0x15; - s.CDBByte[4] = 0x0C; - perform (s); - } - - return s.SRB_Status == SS_COMP; - } - - bool read (CDReadBuffer& rb) - { - if (rb.numFrames * 2352 > rb.bufferSize) - return false; - - if (! initialised) - { - initialised = init(); - - if (! initialised) - return false; - } - - SRB_ExecSCSICmd s; - prepare (s); - s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; - s.SRB_BufLen = rb.bufferSize; - s.SRB_BufPointer = rb.buffer; - s.SRB_CDBLen = 10; - s.CDBByte[0] = 0x28; - s.CDBByte[1] = (BYTE) (deviceInfo->info.lun << 5); - s.CDBByte[3] = (BYTE) ((rb.startFrame >> 16) & 0xFF); - s.CDBByte[4] = (BYTE) ((rb.startFrame >> 8) & 0xFF); - s.CDBByte[5] = (BYTE) (rb.startFrame & 0xFF); - s.CDBByte[8] = (BYTE) (rb.numFrames & 0xFF); - perform (s); - - if (s.SRB_Status != SS_COMP) - return false; - - rb.dataLength = rb.numFrames * 2352; - rb.dataStartOffset = 0; - return true; - } -}; - -//============================================================================== -class ControllerType3 : public CDController -{ -public: - ControllerType3() {} - - bool read (CDReadBuffer& rb) - { - if (rb.numFrames * 2352 > rb.bufferSize) - return false; - - if (! initialised) - { - setPaused (false); - initialised = true; - } - - SRB_ExecSCSICmd s; - prepare (s); - s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; - s.SRB_BufLen = rb.numFrames * 2352; - s.SRB_BufPointer = rb.buffer; - s.SRB_CDBLen = 12; - s.CDBByte[0] = 0xD8; - s.CDBByte[3] = (BYTE) ((rb.startFrame >> 16) & 0xFF); - s.CDBByte[4] = (BYTE) ((rb.startFrame >> 8) & 0xFF); - s.CDBByte[5] = (BYTE) (rb.startFrame & 0xFF); - s.CDBByte[9] = (BYTE) (rb.numFrames & 0xFF); - perform (s); - - if (s.SRB_Status != SS_COMP) - return false; - - rb.dataLength = rb.numFrames * 2352; - rb.dataStartOffset = 0; - return true; - } -}; - -//============================================================================== -class ControllerType4 : public CDController -{ -public: - ControllerType4() {} - - bool selectD4Mode() - { - BYTE bufPointer[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 48 }; - - SRB_ExecSCSICmd s; - prepare (s); - s.SRB_Flags = SRB_EVENT_NOTIFY; - s.SRB_CDBLen = 6; - s.SRB_BufLen = 12; - s.SRB_BufPointer = bufPointer; - s.CDBByte[0] = 0x15; - s.CDBByte[1] = 0x10; - s.CDBByte[4] = 0x08; - perform (s); - - return s.SRB_Status == SS_COMP; - } - - bool read (CDReadBuffer& rb) - { - if (rb.numFrames * 2352 > rb.bufferSize) - return false; - - if (! initialised) - { - setPaused (true); - - if (deviceInfo->readType == READTYPE_READ_D4_1) - selectD4Mode(); - - initialised = true; - } - - SRB_ExecSCSICmd s; - prepare (s); - s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; - s.SRB_BufLen = rb.bufferSize; - s.SRB_BufPointer = rb.buffer; - s.SRB_CDBLen = 10; - s.CDBByte[0] = 0xD4; - s.CDBByte[3] = (BYTE) ((rb.startFrame >> 16) & 0xFF); - s.CDBByte[4] = (BYTE) ((rb.startFrame >> 8) & 0xFF); - s.CDBByte[5] = (BYTE) (rb.startFrame & 0xFF); - s.CDBByte[8] = (BYTE) (rb.numFrames & 0xFF); - perform (s); - - if (s.SRB_Status != SS_COMP) - return false; - - rb.dataLength = rb.numFrames * 2352; - rb.dataStartOffset = 0; - return true; - } -}; - - -//============================================================================== -void CDController::prepare (SRB_ExecSCSICmd& s) -{ - zerostruct (s); - s.SRB_Cmd = SC_EXEC_SCSI_CMD; - s.SRB_HaID = deviceInfo->info.ha; - s.SRB_Target = deviceInfo->info.tgt; - s.SRB_Lun = deviceInfo->info.lun; - s.SRB_SenseLen = SENSE_LEN; -} - -void CDController::perform (SRB_ExecSCSICmd& s) -{ - s.SRB_PostProc = CreateEvent (0, TRUE, FALSE, 0); - - deviceInfo->performScsiCommand (s.SRB_PostProc, s); -} - -void CDController::setPaused (bool paused) -{ - SRB_ExecSCSICmd s; - prepare (s); - s.SRB_Flags = SRB_EVENT_NOTIFY; - s.SRB_CDBLen = 10; - s.CDBByte[0] = 0x4B; - s.CDBByte[8] = (BYTE) (paused ? 0 : 1); - perform (s); -} - -bool CDController::readAudio (CDReadBuffer& rb, CDReadBuffer* overlapBuffer) -{ - if (overlapBuffer != nullptr) - { - const bool canDoJitter = (overlapBuffer->bufferSize >= 2352 * framesToCheck); - const bool doJitter = canDoJitter && ! overlapBuffer->isZero(); - - if (doJitter - && overlapBuffer->startFrame > 0 - && overlapBuffer->numFrames > 0 - && overlapBuffer->dataLength > 0) - { - const int numFrames = rb.numFrames; - - if (overlapBuffer->startFrame == (rb.startFrame - framesToCheck)) - { - rb.startFrame -= framesOverlap; - - if (framesToCheck < framesOverlap - && numFrames + framesOverlap <= rb.bufferSize / 2352) - rb.numFrames += framesOverlap; - } - else - { - overlapBuffer->dataLength = 0; - overlapBuffer->startFrame = 0; - overlapBuffer->numFrames = 0; - } - } - - if (! read (rb)) - return false; - - if (doJitter) - { - const int checkLen = framesToCheck * 2352; - const int maxToCheck = rb.dataLength - checkLen; - - if (overlapBuffer->dataLength == 0 || overlapBuffer->isZero()) - return true; - - BYTE* const p = overlapBuffer->buffer + overlapBuffer->dataStartOffset; - bool found = false; - - for (int i = 0; i < maxToCheck; ++i) - { - if (memcmp (p, rb.buffer + i, checkLen) == 0) - { - i += checkLen; - rb.dataStartOffset = i; - rb.dataLength -= i; - rb.startFrame = overlapBuffer->startFrame + framesToCheck; - found = true; - break; - } - } - - rb.numFrames = rb.dataLength / 2352; - rb.dataLength = 2352 * rb.numFrames; - - if (! found) - return false; - } - - if (canDoJitter) - { - memcpy (overlapBuffer->buffer, - rb.buffer + rb.dataStartOffset + 2352 * (rb.numFrames - framesToCheck), - 2352 * framesToCheck); - - overlapBuffer->startFrame = rb.startFrame + rb.numFrames - framesToCheck; - overlapBuffer->numFrames = framesToCheck; - overlapBuffer->dataLength = 2352 * framesToCheck; - overlapBuffer->dataStartOffset = 0; - } - else - { - overlapBuffer->startFrame = 0; - overlapBuffer->numFrames = 0; - overlapBuffer->dataLength = 0; - } - - return true; - } - - return read (rb); -} - -int CDController::getLastIndex() -{ - char qdata[100]; - - SRB_ExecSCSICmd s; - prepare (s); - s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; - s.SRB_BufLen = sizeof (qdata); - s.SRB_BufPointer = (BYTE*) qdata; - s.SRB_CDBLen = 12; - s.CDBByte[0] = 0x42; - s.CDBByte[1] = (BYTE) (deviceInfo->info.lun << 5); - s.CDBByte[2] = 64; - s.CDBByte[3] = 1; // get current position - s.CDBByte[7] = 0; - s.CDBByte[8] = (BYTE) sizeof (qdata); - perform (s); - - return s.SRB_Status == SS_COMP ? qdata[7] : 0; -} - -//============================================================================== -bool CDDeviceHandle::readTOC (TOC* lpToc) -{ - SRB_ExecSCSICmd s = { 0 }; - s.SRB_Cmd = SC_EXEC_SCSI_CMD; - s.SRB_HaID = info.ha; - s.SRB_Target = info.tgt; - s.SRB_Lun = info.lun; - s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; - s.SRB_BufLen = 0x324; - s.SRB_BufPointer = (BYTE*) lpToc; - s.SRB_SenseLen = 0x0E; - s.SRB_CDBLen = 0x0A; - s.SRB_PostProc = CreateEvent (0, TRUE, FALSE, 0); - s.CDBByte[0] = 0x43; - s.CDBByte[1] = 0x00; - s.CDBByte[7] = 0x03; - s.CDBByte[8] = 0x24; - - performScsiCommand (s.SRB_PostProc, s); - return (s.SRB_Status == SS_COMP); -} - -void CDDeviceHandle::performScsiCommand (HANDLE event, SRB_ExecSCSICmd& s) -{ - ResetEvent (event); - DWORD status = performScsiPassThroughCommand ((SRB_ExecSCSICmd*) &s, info.scsiDriveLetter, scsiHandle, true); - - if (status == SS_PENDING) - WaitForSingleObject (event, 4000); - - CloseHandle (event); -} - -bool CDDeviceHandle::readAudio (CDReadBuffer& buffer, CDReadBuffer* overlapBuffer) -{ - if (controller == 0) - { - testController (READTYPE_ATAPI2, new ControllerType1(), buffer) - || testController (READTYPE_ATAPI1, new ControllerType1(), buffer) - || testController (READTYPE_READ10_2, new ControllerType2(), buffer) - || testController (READTYPE_READ10, new ControllerType2(), buffer) - || testController (READTYPE_READ_D8, new ControllerType3(), buffer) - || testController (READTYPE_READ_D4, new ControllerType4(), buffer) - || testController (READTYPE_READ_D4_1, new ControllerType4(), buffer); - } - - buffer.index = 0; - - if (controller != nullptr && controller->readAudio (buffer, overlapBuffer)) - { - if (buffer.wantsIndex) - buffer.index = controller->getLastIndex(); - - return true; - } - - return false; -} - -void CDDeviceHandle::openDrawer (bool shouldBeOpen) -{ - if (shouldBeOpen) - { - if (controller != nullptr) - { - controller->shutDown(); - controller = nullptr; - } - - if (scsiHandle != 0) - { - CloseHandle (scsiHandle); - scsiHandle = 0; - } - } - - SRB_ExecSCSICmd s = { 0 }; - s.SRB_Cmd = SC_EXEC_SCSI_CMD; - s.SRB_HaID = info.ha; - s.SRB_Target = info.tgt; - s.SRB_Lun = info.lun; - s.SRB_SenseLen = SENSE_LEN; - s.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY; - s.SRB_BufLen = 0; - s.SRB_BufPointer = 0; - s.SRB_CDBLen = 12; - s.CDBByte[0] = 0x1b; - s.CDBByte[1] = (BYTE) (info.lun << 5); - s.CDBByte[4] = (BYTE) (shouldBeOpen ? 2 : 3); - s.SRB_PostProc = CreateEvent (0, TRUE, FALSE, 0); - - performScsiCommand (s.SRB_PostProc, s); -} - -bool CDDeviceHandle::testController (const int type, CDController* const newController, CDReadBuffer& rb) -{ - controller = newController; - readType = (BYTE) type; - - controller->deviceInfo = this; - controller->framesToCheck = 1; - controller->framesOverlap = 3; - - bool passed = false; - memset (rb.buffer, 0xcd, rb.bufferSize); - - if (controller->read (rb)) - { - passed = true; - int* p = (int*) (rb.buffer + rb.dataStartOffset); - int wrong = 0; - - for (int i = rb.dataLength / 4; --i >= 0;) - { - if (*p++ == (int) 0xcdcdcdcd) - { - if (++wrong == 4) - { - passed = false; - break; - } - } - else - { - wrong = 0; - } - } - } - - if (! passed) - { - controller->shutDown(); - controller = nullptr; - } - - return passed; -} - - -//============================================================================== -struct CDDeviceWrapper -{ - CDDeviceWrapper (const CDDeviceDescription& device, HANDLE scsiHandle) - : deviceHandle (device, scsiHandle), overlapBuffer (3), jitter (false) - { - // xxx jitter never seemed to actually be enabled (??) - } - - CDDeviceHandle deviceHandle; - CDReadBuffer overlapBuffer; - bool jitter; -}; - -//============================================================================== -int getAddressOfTrack (const TOCTRACK& t) noexcept -{ - return (((DWORD) t.addr[0]) << 24) + (((DWORD) t.addr[1]) << 16) - + (((DWORD) t.addr[2]) << 8) + ((DWORD) t.addr[3]); -} - -const int samplesPerFrame = 44100 / 75; -const int bytesPerFrame = samplesPerFrame * 4; -const int framesPerIndexRead = 4; - -} - -//============================================================================== -StringArray AudioCDReader::getAvailableCDNames() -{ - using namespace CDReaderHelpers; - StringArray results; - - Array list; - findCDDevices (list); - - for (int i = 0; i < list.size(); ++i) - { - String s; - if (list[i].scsiDriveLetter > 0) - s << String::charToString (list[i].scsiDriveLetter).toUpperCase() << ": "; - - s << list[i].description; - results.add (s); - } - - return results; -} - -AudioCDReader* AudioCDReader::createReaderForCD (const int deviceIndex) -{ - using namespace CDReaderHelpers; - - Array list; - findCDDevices (list); - - if (isPositiveAndBelow (deviceIndex, list.size())) - { - HANDLE h = createSCSIDeviceHandle (list [deviceIndex].scsiDriveLetter); - - if (h != INVALID_HANDLE_VALUE) - { - ScopedPointer cd (new AudioCDReader (new CDDeviceWrapper (list [deviceIndex], h))); - - if (cd->lengthInSamples > 0) - return cd.release(); - } - } - - return nullptr; -} - -AudioCDReader::AudioCDReader (void* handle_) - : AudioFormatReader (0, "CD Audio"), - handle (handle_), - indexingEnabled (false), - lastIndex (0), - firstFrameInBuffer (0), - samplesInBuffer (0) -{ - using namespace CDReaderHelpers; - jassert (handle_ != nullptr); - - refreshTrackLengths(); - - sampleRate = 44100.0; - bitsPerSample = 16; - numChannels = 2; - usesFloatingPointData = false; - - buffer.setSize (4 * bytesPerFrame, true); -} - -AudioCDReader::~AudioCDReader() -{ - using namespace CDReaderHelpers; - CDDeviceWrapper* const device = static_cast (handle); - delete device; -} - -bool AudioCDReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) -{ - using namespace CDReaderHelpers; - CDDeviceWrapper* const device = static_cast (handle); - - bool ok = true; - - while (numSamples > 0) - { - const int bufferStartSample = firstFrameInBuffer * samplesPerFrame; - const int bufferEndSample = bufferStartSample + samplesInBuffer; - - if (startSampleInFile >= bufferStartSample - && startSampleInFile < bufferEndSample) - { - const int toDo = (int) jmin ((int64) numSamples, bufferEndSample - startSampleInFile); - - int* const l = destSamples[0] + startOffsetInDestBuffer; - int* const r = numDestChannels > 1 ? (destSamples[1] + startOffsetInDestBuffer) : nullptr; - const short* src = (const short*) buffer.getData(); - src += 2 * (startSampleInFile - bufferStartSample); - - for (int i = 0; i < toDo; ++i) - { - l[i] = src [i << 1] << 16; - - if (r != nullptr) - r[i] = src [(i << 1) + 1] << 16; - } - - startOffsetInDestBuffer += toDo; - startSampleInFile += toDo; - numSamples -= toDo; - } - else - { - const int framesInBuffer = (int) (buffer.getSize() / bytesPerFrame); - const int frameNeeded = (int) (startSampleInFile / samplesPerFrame); - - if (firstFrameInBuffer + framesInBuffer != frameNeeded) - { - device->overlapBuffer.dataLength = 0; - device->overlapBuffer.startFrame = 0; - device->overlapBuffer.numFrames = 0; - device->jitter = false; - } - - firstFrameInBuffer = frameNeeded; - lastIndex = 0; - - CDReadBuffer readBuffer (framesInBuffer + 4); - readBuffer.wantsIndex = indexingEnabled; - - int i; - for (i = 5; --i >= 0;) - { - readBuffer.startFrame = frameNeeded; - readBuffer.numFrames = framesInBuffer; - - if (device->deviceHandle.readAudio (readBuffer, device->jitter ? &device->overlapBuffer : 0)) - break; - else - device->overlapBuffer.dataLength = 0; - } - - if (i >= 0) - { - buffer.copyFrom (readBuffer.buffer + readBuffer.dataStartOffset, 0, readBuffer.dataLength); - samplesInBuffer = readBuffer.dataLength >> 2; - lastIndex = readBuffer.index; - } - else - { - int* l = destSamples[0] + startOffsetInDestBuffer; - int* r = numDestChannels > 1 ? (destSamples[1] + startOffsetInDestBuffer) : nullptr; - - while (--numSamples >= 0) - { - *l++ = 0; - - if (r != nullptr) - *r++ = 0; - } - - // sometimes the read fails for just the very last couple of blocks, so - // we'll ignore and errors in the last half-second of the disk.. - ok = startSampleInFile > (trackStartSamples [getNumTracks()] - 20000); - break; - } - } - } - - return ok; -} - -bool AudioCDReader::isCDStillPresent() const -{ - using namespace CDReaderHelpers; - TOC toc = { 0 }; - return static_cast (handle)->deviceHandle.readTOC (&toc); -} - -void AudioCDReader::refreshTrackLengths() -{ - using namespace CDReaderHelpers; - trackStartSamples.clear(); - zeromem (audioTracks, sizeof (audioTracks)); - - TOC toc = { 0 }; - - if (static_cast (handle)->deviceHandle.readTOC (&toc)) - { - int numTracks = 1 + toc.lastTrack - toc.firstTrack; - - for (int i = 0; i <= numTracks; ++i) - { - trackStartSamples.add (samplesPerFrame * getAddressOfTrack (toc.tracks [i])); - audioTracks [i] = ((toc.tracks[i].ADR & 4) == 0); - } - } - - lengthInSamples = getPositionOfTrackStart (getNumTracks()); -} - -bool AudioCDReader::isTrackAudio (int trackNum) const -{ - return trackNum >= 0 && trackNum < getNumTracks() && audioTracks [trackNum]; -} - -void AudioCDReader::enableIndexScanning (bool b) -{ - indexingEnabled = b; -} - -int AudioCDReader::getLastIndex() const -{ - return lastIndex; -} - -int AudioCDReader::getIndexAt (int samplePos) -{ - using namespace CDReaderHelpers; - CDDeviceWrapper* const device = static_cast (handle); - - const int frameNeeded = samplePos / samplesPerFrame; - - device->overlapBuffer.dataLength = 0; - device->overlapBuffer.startFrame = 0; - device->overlapBuffer.numFrames = 0; - device->jitter = false; - - firstFrameInBuffer = 0; - lastIndex = 0; - - CDReadBuffer readBuffer (4 + framesPerIndexRead); - readBuffer.wantsIndex = true; - - int i; - for (i = 5; --i >= 0;) - { - readBuffer.startFrame = frameNeeded; - readBuffer.numFrames = framesPerIndexRead; - - if (device->deviceHandle.readAudio (readBuffer)) - break; - } - - if (i >= 0) - return readBuffer.index; - - return -1; -} - -Array AudioCDReader::findIndexesInTrack (const int trackNumber) -{ - using namespace CDReaderHelpers; - Array indexes; - - const int trackStart = getPositionOfTrackStart (trackNumber); - const int trackEnd = getPositionOfTrackStart (trackNumber + 1); - - bool needToScan = true; - - if (trackEnd - trackStart > 20 * 44100) - { - // check the end of the track for indexes before scanning the whole thing - needToScan = false; - int pos = jmax (trackStart, trackEnd - 44100 * 5); - bool seenAnIndex = false; - - while (pos <= trackEnd - samplesPerFrame) - { - const int index = getIndexAt (pos); - - if (index == 0) - { - // lead-out, so skip back a bit if we've not found any indexes yet.. - if (seenAnIndex) - break; - - pos -= 44100 * 5; - - if (pos < trackStart) - break; - } - else - { - if (index > 0) - seenAnIndex = true; - - if (index > 1) - { - needToScan = true; - break; - } - - pos += samplesPerFrame * framesPerIndexRead; - } - } - } - - if (needToScan) - { - CDDeviceWrapper* const device = static_cast (handle); - - int pos = trackStart; - int last = -1; - - while (pos < trackEnd - samplesPerFrame * 10) - { - const int frameNeeded = pos / samplesPerFrame; - - device->overlapBuffer.dataLength = 0; - device->overlapBuffer.startFrame = 0; - device->overlapBuffer.numFrames = 0; - device->jitter = false; - - firstFrameInBuffer = 0; - - CDReadBuffer readBuffer (4); - readBuffer.wantsIndex = true; - - int i; - for (i = 5; --i >= 0;) - { - readBuffer.startFrame = frameNeeded; - readBuffer.numFrames = framesPerIndexRead; - - if (device->deviceHandle.readAudio (readBuffer)) - break; - } - - if (i < 0) - break; - - if (readBuffer.index > last && readBuffer.index > 1) - { - last = readBuffer.index; - indexes.add (pos); - } - - pos += samplesPerFrame * framesPerIndexRead; - } - - indexes.removeFirstMatchingValue (trackStart); - } - - return indexes; -} - -void AudioCDReader::ejectDisk() -{ - using namespace CDReaderHelpers; - static_cast (handle)->deviceHandle.openDrawer (true); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp deleted file mode 100755 index 88a5960..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_DirectSound.cpp +++ /dev/null @@ -1,1277 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -} // (juce namespace) - -extern "C" -{ - // Declare just the minimum number of interfaces for the DSound objects that we need.. - typedef struct typeDSBUFFERDESC - { - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; - LPWAVEFORMATEX lpwfxFormat; - GUID guid3DAlgorithm; - } DSBUFFERDESC; - - struct IDirectSoundBuffer; - - #undef INTERFACE - #define INTERFACE IDirectSound - DECLARE_INTERFACE_(IDirectSound, IUnknown) - { - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - STDMETHOD(CreateSoundBuffer) (THIS_ DSBUFFERDESC*, IDirectSoundBuffer**, LPUNKNOWN) PURE; - STDMETHOD(GetCaps) (THIS_ void*) PURE; - STDMETHOD(DuplicateSoundBuffer) (THIS_ IDirectSoundBuffer*, IDirectSoundBuffer**) PURE; - STDMETHOD(SetCooperativeLevel) (THIS_ HWND, DWORD) PURE; - STDMETHOD(Compact) (THIS) PURE; - STDMETHOD(GetSpeakerConfig) (THIS_ LPDWORD) PURE; - STDMETHOD(SetSpeakerConfig) (THIS_ DWORD) PURE; - STDMETHOD(Initialize) (THIS_ const GUID*) PURE; - }; - - #undef INTERFACE - #define INTERFACE IDirectSoundBuffer - DECLARE_INTERFACE_(IDirectSoundBuffer, IUnknown) - { - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - STDMETHOD(GetCaps) (THIS_ void*) PURE; - STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD, LPDWORD) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX, DWORD, LPDWORD) PURE; - STDMETHOD(GetVolume) (THIS_ LPLONG) PURE; - STDMETHOD(GetPan) (THIS_ LPLONG) PURE; - STDMETHOD(GetFrequency) (THIS_ LPDWORD) PURE; - STDMETHOD(GetStatus) (THIS_ LPDWORD) PURE; - STDMETHOD(Initialize) (THIS_ IDirectSound*, DSBUFFERDESC*) PURE; - STDMETHOD(Lock) (THIS_ DWORD, DWORD, LPVOID*, LPDWORD, LPVOID*, LPDWORD, DWORD) PURE; - STDMETHOD(Play) (THIS_ DWORD, DWORD, DWORD) PURE; - STDMETHOD(SetCurrentPosition) (THIS_ DWORD) PURE; - STDMETHOD(SetFormat) (THIS_ const WAVEFORMATEX*) PURE; - STDMETHOD(SetVolume) (THIS_ LONG) PURE; - STDMETHOD(SetPan) (THIS_ LONG) PURE; - STDMETHOD(SetFrequency) (THIS_ DWORD) PURE; - STDMETHOD(Stop) (THIS) PURE; - STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE; - STDMETHOD(Restore) (THIS) PURE; - }; - - //============================================================================== - typedef struct typeDSCBUFFERDESC - { - DWORD dwSize; - DWORD dwFlags; - DWORD dwBufferBytes; - DWORD dwReserved; - LPWAVEFORMATEX lpwfxFormat; - } DSCBUFFERDESC; - - struct IDirectSoundCaptureBuffer; - - #undef INTERFACE - #define INTERFACE IDirectSoundCapture - DECLARE_INTERFACE_(IDirectSoundCapture, IUnknown) - { - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - STDMETHOD(CreateCaptureBuffer) (THIS_ DSCBUFFERDESC*, IDirectSoundCaptureBuffer**, LPUNKNOWN) PURE; - STDMETHOD(GetCaps) (THIS_ void*) PURE; - STDMETHOD(Initialize) (THIS_ const GUID*) PURE; - }; - - #undef INTERFACE - #define INTERFACE IDirectSoundCaptureBuffer - DECLARE_INTERFACE_(IDirectSoundCaptureBuffer, IUnknown) - { - STDMETHOD(QueryInterface) (THIS_ REFIID, LPVOID*) PURE; - STDMETHOD_(ULONG,AddRef) (THIS) PURE; - STDMETHOD_(ULONG,Release) (THIS) PURE; - STDMETHOD(GetCaps) (THIS_ void*) PURE; - STDMETHOD(GetCurrentPosition) (THIS_ LPDWORD, LPDWORD) PURE; - STDMETHOD(GetFormat) (THIS_ LPWAVEFORMATEX, DWORD, LPDWORD) PURE; - STDMETHOD(GetStatus) (THIS_ LPDWORD) PURE; - STDMETHOD(Initialize) (THIS_ IDirectSoundCapture*, DSCBUFFERDESC*) PURE; - STDMETHOD(Lock) (THIS_ DWORD, DWORD, LPVOID*, LPDWORD, LPVOID*, LPDWORD, DWORD) PURE; - STDMETHOD(Start) (THIS_ DWORD) PURE; - STDMETHOD(Stop) (THIS) PURE; - STDMETHOD(Unlock) (THIS_ LPVOID, DWORD, LPVOID, DWORD) PURE; - }; - - #undef INTERFACE -} - -namespace juce -{ - -//============================================================================== -namespace DSoundLogging -{ - String getErrorMessage (HRESULT hr) - { - const char* result = nullptr; - - switch (hr) - { - case MAKE_HRESULT(1, 0x878, 10): result = "Device already allocated"; break; - case MAKE_HRESULT(1, 0x878, 30): result = "Control unavailable"; break; - case E_INVALIDARG: result = "Invalid parameter"; break; - case MAKE_HRESULT(1, 0x878, 50): result = "Invalid call"; break; - case E_FAIL: result = "Generic error"; break; - case MAKE_HRESULT(1, 0x878, 70): result = "Priority level error"; break; - case E_OUTOFMEMORY: result = "Out of memory"; break; - case MAKE_HRESULT(1, 0x878, 100): result = "Bad format"; break; - case E_NOTIMPL: result = "Unsupported function"; break; - case MAKE_HRESULT(1, 0x878, 120): result = "No driver"; break; - case MAKE_HRESULT(1, 0x878, 130): result = "Already initialised"; break; - case CLASS_E_NOAGGREGATION: result = "No aggregation"; break; - case MAKE_HRESULT(1, 0x878, 150): result = "Buffer lost"; break; - case MAKE_HRESULT(1, 0x878, 160): result = "Another app has priority"; break; - case MAKE_HRESULT(1, 0x878, 170): result = "Uninitialised"; break; - case E_NOINTERFACE: result = "No interface"; break; - case S_OK: result = "No error"; break; - default: return "Unknown error: " + String ((int) hr); - } - - return result; - } - - //============================================================================== - #if JUCE_DIRECTSOUND_LOGGING - static void logMessage (String message) - { - message = "DSOUND: " + message; - DBG (message); - Logger::writeToLog (message); - } - - static void logError (HRESULT hr, int lineNum) - { - if (FAILED (hr)) - { - String error ("Error at line "); - error << lineNum << ": " << getErrorMessage (hr); - logMessage (error); - } - } - - #define CATCH JUCE_CATCH_EXCEPTION - #define JUCE_DS_LOG(a) DSoundLogging::logMessage(a); - #define JUCE_DS_LOG_ERROR(a) DSoundLogging::logError(a, __LINE__); - #else - #define CATCH JUCE_CATCH_ALL - #define JUCE_DS_LOG(a) - #define JUCE_DS_LOG_ERROR(a) - #endif -} - -//============================================================================== -namespace -{ - #define DSOUND_FUNCTION(functionName, params) \ - typedef HRESULT (WINAPI *type##functionName) params; \ - static type##functionName ds##functionName = nullptr; - - #define DSOUND_FUNCTION_LOAD(functionName) \ - ds##functionName = (type##functionName) GetProcAddress (h, #functionName); \ - jassert (ds##functionName != nullptr); - - typedef BOOL (CALLBACK *LPDSENUMCALLBACKW) (LPGUID, LPCWSTR, LPCWSTR, LPVOID); - typedef BOOL (CALLBACK *LPDSENUMCALLBACKA) (LPGUID, LPCSTR, LPCSTR, LPVOID); - - DSOUND_FUNCTION (DirectSoundCreate, (const GUID*, IDirectSound**, LPUNKNOWN)) - DSOUND_FUNCTION (DirectSoundCaptureCreate, (const GUID*, IDirectSoundCapture**, LPUNKNOWN)) - DSOUND_FUNCTION (DirectSoundEnumerateW, (LPDSENUMCALLBACKW, LPVOID)) - DSOUND_FUNCTION (DirectSoundCaptureEnumerateW, (LPDSENUMCALLBACKW, LPVOID)) - - void initialiseDSoundFunctions() - { - if (dsDirectSoundCreate == nullptr) - { - HMODULE h = LoadLibraryA ("dsound.dll"); - - DSOUND_FUNCTION_LOAD (DirectSoundCreate) - DSOUND_FUNCTION_LOAD (DirectSoundCaptureCreate) - DSOUND_FUNCTION_LOAD (DirectSoundEnumerateW) - DSOUND_FUNCTION_LOAD (DirectSoundCaptureEnumerateW) - } - } - - // the overall size of buffer used is this value x the block size - enum { blocksPerOverallBuffer = 16 }; -} - -//============================================================================== -class DSoundInternalOutChannel -{ -public: - DSoundInternalOutChannel (const String& name_, const GUID& guid_, int rate, - int bufferSize, float* left, float* right) - : bitDepth (16), name (name_), guid (guid_), sampleRate (rate), - bufferSizeSamples (bufferSize), leftBuffer (left), rightBuffer (right), - pDirectSound (nullptr), pOutputBuffer (nullptr) - { - } - - ~DSoundInternalOutChannel() - { - close(); - } - - void close() - { - if (pOutputBuffer != nullptr) - { - JUCE_DS_LOG ("closing output: " + name); - HRESULT hr = pOutputBuffer->Stop(); - JUCE_DS_LOG_ERROR (hr); (void) hr; - - pOutputBuffer->Release(); - pOutputBuffer = nullptr; - } - - if (pDirectSound != nullptr) - { - pDirectSound->Release(); - pDirectSound = nullptr; - } - } - - String open() - { - JUCE_DS_LOG ("opening output: " + name + " rate=" + String (sampleRate) - + " bits=" + String (bitDepth) + " buf=" + String (bufferSizeSamples)); - - pDirectSound = nullptr; - pOutputBuffer = nullptr; - writeOffset = 0; - - String error; - HRESULT hr = E_NOINTERFACE; - - if (dsDirectSoundCreate != nullptr) - hr = dsDirectSoundCreate (&guid, &pDirectSound, nullptr); - - if (SUCCEEDED (hr)) - { - bytesPerBuffer = (bufferSizeSamples * (bitDepth >> 2)) & ~15; - totalBytesPerBuffer = (blocksPerOverallBuffer * bytesPerBuffer) & ~15; - const int numChannels = 2; - - hr = pDirectSound->SetCooperativeLevel (GetDesktopWindow(), 2 /* DSSCL_PRIORITY */); - JUCE_DS_LOG_ERROR (hr); - - if (SUCCEEDED (hr)) - { - IDirectSoundBuffer* pPrimaryBuffer; - - DSBUFFERDESC primaryDesc = { 0 }; - primaryDesc.dwSize = sizeof (DSBUFFERDESC); - primaryDesc.dwFlags = 1 /* DSBCAPS_PRIMARYBUFFER */; - primaryDesc.dwBufferBytes = 0; - primaryDesc.lpwfxFormat = 0; - - JUCE_DS_LOG ("co-op level set"); - hr = pDirectSound->CreateSoundBuffer (&primaryDesc, &pPrimaryBuffer, 0); - JUCE_DS_LOG_ERROR (hr); - - if (SUCCEEDED (hr)) - { - WAVEFORMATEX wfFormat; - wfFormat.wFormatTag = WAVE_FORMAT_PCM; - wfFormat.nChannels = (unsigned short) numChannels; - wfFormat.nSamplesPerSec = (DWORD) sampleRate; - wfFormat.wBitsPerSample = (unsigned short) bitDepth; - wfFormat.nBlockAlign = (unsigned short) (wfFormat.nChannels * wfFormat.wBitsPerSample / 8); - wfFormat.nAvgBytesPerSec = wfFormat.nSamplesPerSec * wfFormat.nBlockAlign; - wfFormat.cbSize = 0; - - hr = pPrimaryBuffer->SetFormat (&wfFormat); - JUCE_DS_LOG_ERROR (hr); - - if (SUCCEEDED (hr)) - { - DSBUFFERDESC secondaryDesc = { 0 }; - secondaryDesc.dwSize = sizeof (DSBUFFERDESC); - secondaryDesc.dwFlags = 0x8000 /* DSBCAPS_GLOBALFOCUS */ - | 0x10000 /* DSBCAPS_GETCURRENTPOSITION2 */; - secondaryDesc.dwBufferBytes = (DWORD) totalBytesPerBuffer; - secondaryDesc.lpwfxFormat = &wfFormat; - - hr = pDirectSound->CreateSoundBuffer (&secondaryDesc, &pOutputBuffer, 0); - JUCE_DS_LOG_ERROR (hr); - - if (SUCCEEDED (hr)) - { - JUCE_DS_LOG ("buffer created"); - - DWORD dwDataLen; - unsigned char* pDSBuffData; - - hr = pOutputBuffer->Lock (0, (DWORD) totalBytesPerBuffer, - (LPVOID*) &pDSBuffData, &dwDataLen, 0, 0, 0); - JUCE_DS_LOG_ERROR (hr); - - if (SUCCEEDED (hr)) - { - zeromem (pDSBuffData, dwDataLen); - - hr = pOutputBuffer->Unlock (pDSBuffData, dwDataLen, 0, 0); - - if (SUCCEEDED (hr)) - { - hr = pOutputBuffer->SetCurrentPosition (0); - - if (SUCCEEDED (hr)) - { - hr = pOutputBuffer->Play (0, 0, 1 /* DSBPLAY_LOOPING */); - - if (SUCCEEDED (hr)) - return String::empty; - } - } - } - } - } - } - } - } - - error = DSoundLogging::getErrorMessage (hr); - close(); - return error; - } - - void synchronisePosition() - { - if (pOutputBuffer != nullptr) - { - DWORD playCursor; - pOutputBuffer->GetCurrentPosition (&playCursor, &writeOffset); - } - } - - bool service() - { - if (pOutputBuffer == 0) - return true; - - DWORD playCursor, writeCursor; - - for (;;) - { - HRESULT hr = pOutputBuffer->GetCurrentPosition (&playCursor, &writeCursor); - - if (hr == MAKE_HRESULT (1, 0x878, 150)) // DSERR_BUFFERLOST - { - pOutputBuffer->Restore(); - continue; - } - - if (SUCCEEDED (hr)) - break; - - JUCE_DS_LOG_ERROR (hr); - jassertfalse; - return true; - } - - int playWriteGap = (int) (writeCursor - playCursor); - if (playWriteGap < 0) - playWriteGap += totalBytesPerBuffer; - - int bytesEmpty = (int) (playCursor - writeOffset); - if (bytesEmpty < 0) - bytesEmpty += totalBytesPerBuffer; - - if (bytesEmpty > (totalBytesPerBuffer - playWriteGap)) - { - writeOffset = writeCursor; - bytesEmpty = totalBytesPerBuffer - playWriteGap; - } - - if (bytesEmpty >= bytesPerBuffer) - { - int* buf1 = nullptr; - int* buf2 = nullptr; - DWORD dwSize1 = 0; - DWORD dwSize2 = 0; - - HRESULT hr = pOutputBuffer->Lock (writeOffset, (DWORD) bytesPerBuffer, - (void**) &buf1, &dwSize1, - (void**) &buf2, &dwSize2, 0); - - if (hr == MAKE_HRESULT (1, 0x878, 150)) // DSERR_BUFFERLOST - { - pOutputBuffer->Restore(); - - hr = pOutputBuffer->Lock (writeOffset, (DWORD) bytesPerBuffer, - (void**) &buf1, &dwSize1, - (void**) &buf2, &dwSize2, 0); - } - - if (SUCCEEDED (hr)) - { - if (bitDepth == 16) - { - const float* left = leftBuffer; - const float* right = rightBuffer; - int samples1 = (int) (dwSize1 >> 2); - int samples2 = (int) (dwSize2 >> 2); - - if (left == nullptr) - { - for (int* dest = buf1; --samples1 >= 0;) *dest++ = convertInputValues (0, *right++); - for (int* dest = buf2; --samples2 >= 0;) *dest++ = convertInputValues (0, *right++); - } - else if (right == nullptr) - { - for (int* dest = buf1; --samples1 >= 0;) *dest++ = convertInputValues (*left++, 0); - for (int* dest = buf2; --samples2 >= 0;) *dest++ = convertInputValues (*left++, 0); - } - else - { - for (int* dest = buf1; --samples1 >= 0;) *dest++ = convertInputValues (*left++, *right++); - for (int* dest = buf2; --samples2 >= 0;) *dest++ = convertInputValues (*left++, *right++); - } - } - else - { - jassertfalse; - } - - writeOffset = (writeOffset + dwSize1 + dwSize2) % totalBytesPerBuffer; - - pOutputBuffer->Unlock (buf1, dwSize1, buf2, dwSize2); - } - else - { - jassertfalse; - JUCE_DS_LOG_ERROR (hr); - } - - bytesEmpty -= bytesPerBuffer; - return true; - } - else - { - return false; - } - } - - int bitDepth; - bool doneFlag; - -private: - String name; - GUID guid; - int sampleRate, bufferSizeSamples; - float* leftBuffer; - float* rightBuffer; - - IDirectSound* pDirectSound; - IDirectSoundBuffer* pOutputBuffer; - DWORD writeOffset; - int totalBytesPerBuffer, bytesPerBuffer; - unsigned int lastPlayCursor; - - static inline int convertInputValues (const float l, const float r) noexcept - { - return jlimit (-32768, 32767, roundToInt (32767.0f * r)) << 16 - | (0xffff & jlimit (-32768, 32767, roundToInt (32767.0f * l))); - } - - JUCE_DECLARE_NON_COPYABLE (DSoundInternalOutChannel) -}; - -//============================================================================== -struct DSoundInternalInChannel -{ -public: - DSoundInternalInChannel (const String& name_, const GUID& guid_, int rate, - int bufferSize, float* left, float* right) - : bitDepth (16), name (name_), guid (guid_), sampleRate (rate), - bufferSizeSamples (bufferSize), leftBuffer (left), rightBuffer (right), - pDirectSound (nullptr), pDirectSoundCapture (nullptr), pInputBuffer (nullptr) - { - } - - ~DSoundInternalInChannel() - { - close(); - } - - void close() - { - if (pInputBuffer != nullptr) - { - JUCE_DS_LOG ("closing input: " + name); - HRESULT hr = pInputBuffer->Stop(); - JUCE_DS_LOG_ERROR (hr); (void) hr; - - pInputBuffer->Release(); - pInputBuffer = nullptr; - } - - if (pDirectSoundCapture != nullptr) - { - pDirectSoundCapture->Release(); - pDirectSoundCapture = nullptr; - } - - if (pDirectSound != nullptr) - { - pDirectSound->Release(); - pDirectSound = nullptr; - } - } - - String open() - { - JUCE_DS_LOG ("opening input: " + name - + " rate=" + String (sampleRate) + " bits=" + String (bitDepth) + " buf=" + String (bufferSizeSamples)); - - pDirectSound = nullptr; - pDirectSoundCapture = nullptr; - pInputBuffer = nullptr; - readOffset = 0; - totalBytesPerBuffer = 0; - - HRESULT hr = dsDirectSoundCaptureCreate != nullptr - ? dsDirectSoundCaptureCreate (&guid, &pDirectSoundCapture, nullptr) - : E_NOINTERFACE; - - if (SUCCEEDED (hr)) - { - const int numChannels = 2; - bytesPerBuffer = (bufferSizeSamples * (bitDepth >> 2)) & ~15; - totalBytesPerBuffer = (blocksPerOverallBuffer * bytesPerBuffer) & ~15; - - WAVEFORMATEX wfFormat; - wfFormat.wFormatTag = WAVE_FORMAT_PCM; - wfFormat.nChannels = (unsigned short)numChannels; - wfFormat.nSamplesPerSec = (DWORD) sampleRate; - wfFormat.wBitsPerSample = (unsigned short) bitDepth; - wfFormat.nBlockAlign = (unsigned short) (wfFormat.nChannels * (wfFormat.wBitsPerSample / 8)); - wfFormat.nAvgBytesPerSec = wfFormat.nSamplesPerSec * wfFormat.nBlockAlign; - wfFormat.cbSize = 0; - - DSCBUFFERDESC captureDesc = { 0 }; - captureDesc.dwSize = sizeof (DSCBUFFERDESC); - captureDesc.dwFlags = 0; - captureDesc.dwBufferBytes = (DWORD) totalBytesPerBuffer; - captureDesc.lpwfxFormat = &wfFormat; - - JUCE_DS_LOG ("object created"); - hr = pDirectSoundCapture->CreateCaptureBuffer (&captureDesc, &pInputBuffer, 0); - - if (SUCCEEDED (hr)) - { - hr = pInputBuffer->Start (1 /* DSCBSTART_LOOPING */); - - if (SUCCEEDED (hr)) - return String::empty; - } - } - - JUCE_DS_LOG_ERROR (hr); - const String error (DSoundLogging::getErrorMessage (hr)); - close(); - - return error; - } - - void synchronisePosition() - { - if (pInputBuffer != nullptr) - { - DWORD capturePos; - pInputBuffer->GetCurrentPosition (&capturePos, (DWORD*) &readOffset); - } - } - - bool service() - { - if (pInputBuffer == 0) - return true; - - DWORD capturePos, readPos; - HRESULT hr = pInputBuffer->GetCurrentPosition (&capturePos, &readPos); - JUCE_DS_LOG_ERROR (hr); - - if (FAILED (hr)) - return true; - - int bytesFilled = (int) (readPos - readOffset); - if (bytesFilled < 0) - bytesFilled += totalBytesPerBuffer; - - if (bytesFilled >= bytesPerBuffer) - { - short* buf1 = nullptr; - short* buf2 = nullptr; - DWORD dwsize1 = 0; - DWORD dwsize2 = 0; - - HRESULT hr = pInputBuffer->Lock ((DWORD) readOffset, (DWORD) bytesPerBuffer, - (void**) &buf1, &dwsize1, - (void**) &buf2, &dwsize2, 0); - - if (SUCCEEDED (hr)) - { - if (bitDepth == 16) - { - const float g = 1.0f / 32768.0f; - - float* destL = leftBuffer; - float* destR = rightBuffer; - int samples1 = (int) (dwsize1 >> 2); - int samples2 = (int) (dwsize2 >> 2); - - if (destL == nullptr) - { - for (const short* src = buf1; --samples1 >= 0;) { ++src; *destR++ = *src++ * g; } - for (const short* src = buf2; --samples2 >= 0;) { ++src; *destR++ = *src++ * g; } - } - else if (destR == nullptr) - { - for (const short* src = buf1; --samples1 >= 0;) { *destL++ = *src++ * g; ++src; } - for (const short* src = buf2; --samples2 >= 0;) { *destL++ = *src++ * g; ++src; } - } - else - { - for (const short* src = buf1; --samples1 >= 0;) { *destL++ = *src++ * g; *destR++ = *src++ * g; } - for (const short* src = buf2; --samples2 >= 0;) { *destL++ = *src++ * g; *destR++ = *src++ * g; } - } - } - else - { - jassertfalse; - } - - readOffset = (readOffset + dwsize1 + dwsize2) % totalBytesPerBuffer; - - pInputBuffer->Unlock (buf1, dwsize1, buf2, dwsize2); - } - else - { - JUCE_DS_LOG_ERROR (hr); - jassertfalse; - } - - bytesFilled -= bytesPerBuffer; - - return true; - } - else - { - return false; - } - } - - unsigned int readOffset; - int bytesPerBuffer, totalBytesPerBuffer; - int bitDepth; - bool doneFlag; - -private: - String name; - GUID guid; - int sampleRate, bufferSizeSamples; - float* leftBuffer; - float* rightBuffer; - - IDirectSound* pDirectSound; - IDirectSoundCapture* pDirectSoundCapture; - IDirectSoundCaptureBuffer* pInputBuffer; - - JUCE_DECLARE_NON_COPYABLE (DSoundInternalInChannel) -}; - -//============================================================================== -class DSoundAudioIODevice : public AudioIODevice, - public Thread -{ -public: - DSoundAudioIODevice (const String& deviceName, - const int outputDeviceIndex_, - const int inputDeviceIndex_) - : AudioIODevice (deviceName, "DirectSound"), - Thread ("Juce DSound"), - outputDeviceIndex (outputDeviceIndex_), - inputDeviceIndex (inputDeviceIndex_), - isOpen_ (false), - isStarted (false), - bufferSizeSamples (0), - sampleRate (0.0), - callback (nullptr) - { - if (outputDeviceIndex_ >= 0) - { - outChannels.add (TRANS("Left")); - outChannels.add (TRANS("Right")); - } - - if (inputDeviceIndex_ >= 0) - { - inChannels.add (TRANS("Left")); - inChannels.add (TRANS("Right")); - } - } - - ~DSoundAudioIODevice() - { - close(); - } - - String open (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sampleRate, int bufferSizeSamples) override - { - lastError = openDevice (inputChannels, outputChannels, sampleRate, bufferSizeSamples); - isOpen_ = lastError.isEmpty(); - - return lastError; - } - - void close() override - { - stop(); - - if (isOpen_) - { - closeDevice(); - isOpen_ = false; - } - } - - bool isOpen() override { return isOpen_ && isThreadRunning(); } - int getCurrentBufferSizeSamples() override { return bufferSizeSamples; } - double getCurrentSampleRate() override { return sampleRate; } - BigInteger getActiveOutputChannels() const override { return enabledOutputs; } - BigInteger getActiveInputChannels() const override { return enabledInputs; } - int getOutputLatencyInSamples() override { return (int) (getCurrentBufferSizeSamples() * 1.5); } - int getInputLatencyInSamples() override { return getOutputLatencyInSamples(); } - StringArray getOutputChannelNames() override { return outChannels; } - StringArray getInputChannelNames() override { return inChannels; } - - Array getAvailableSampleRates() override - { - static const double rates[] = { 44100.0, 48000.0, 88200.0, 96000.0 }; - return Array (rates, numElementsInArray (rates)); - } - - Array getAvailableBufferSizes() override - { - Array r; - int n = 64; - - for (int i = 0; i < 50; ++i) - { - r.add (n); - n += (n < 512) ? 32 - : ((n < 1024) ? 64 - : ((n < 2048) ? 128 : 256)); - } - - return r; - } - - int getDefaultBufferSize() override { return 2560; } - - int getCurrentBitDepth() override - { - int bits = 256; - - for (int i = inChans.size(); --i >= 0;) - bits = jmin (bits, inChans[i]->bitDepth); - - for (int i = outChans.size(); --i >= 0;) - bits = jmin (bits, outChans[i]->bitDepth); - - if (bits > 32) - bits = 16; - - return bits; - } - - void start (AudioIODeviceCallback* call) override - { - if (isOpen_ && call != nullptr && ! isStarted) - { - if (! isThreadRunning()) - { - // something gone wrong and the thread's stopped.. - isOpen_ = false; - return; - } - - call->audioDeviceAboutToStart (this); - - const ScopedLock sl (startStopLock); - callback = call; - isStarted = true; - } - } - - void stop() override - { - if (isStarted) - { - AudioIODeviceCallback* const callbackLocal = callback; - - { - const ScopedLock sl (startStopLock); - isStarted = false; - } - - if (callbackLocal != nullptr) - callbackLocal->audioDeviceStopped(); - } - } - - bool isPlaying() override { return isStarted && isOpen_ && isThreadRunning(); } - String getLastError() override { return lastError; } - - //============================================================================== - StringArray inChannels, outChannels; - int outputDeviceIndex, inputDeviceIndex; - -private: - bool isOpen_; - bool isStarted; - String lastError; - - OwnedArray inChans; - OwnedArray outChans; - WaitableEvent startEvent; - - int bufferSizeSamples; - double sampleRate; - BigInteger enabledInputs, enabledOutputs; - AudioSampleBuffer inputBuffers, outputBuffers; - - AudioIODeviceCallback* callback; - CriticalSection startStopLock; - - String openDevice (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sampleRate_, int bufferSizeSamples_); - - void closeDevice() - { - isStarted = false; - stopThread (5000); - - inChans.clear(); - outChans.clear(); - inputBuffers.setSize (1, 1); - outputBuffers.setSize (1, 1); - } - - void resync() - { - if (! threadShouldExit()) - { - sleep (5); - - for (int i = 0; i < outChans.size(); ++i) - outChans.getUnchecked(i)->synchronisePosition(); - - for (int i = 0; i < inChans.size(); ++i) - inChans.getUnchecked(i)->synchronisePosition(); - } - } - -public: - void run() override - { - while (! threadShouldExit()) - { - if (wait (100)) - break; - } - - const int latencyMs = (int) (bufferSizeSamples * 1000.0 / sampleRate); - const int maxTimeMS = jmax (5, 3 * latencyMs); - - while (! threadShouldExit()) - { - int numToDo = 0; - uint32 startTime = Time::getMillisecondCounter(); - - for (int i = inChans.size(); --i >= 0;) - { - inChans.getUnchecked(i)->doneFlag = false; - ++numToDo; - } - - for (int i = outChans.size(); --i >= 0;) - { - outChans.getUnchecked(i)->doneFlag = false; - ++numToDo; - } - - if (numToDo > 0) - { - const int maxCount = 3; - int count = maxCount; - - for (;;) - { - for (int i = inChans.size(); --i >= 0;) - { - DSoundInternalInChannel* const in = inChans.getUnchecked(i); - - if ((! in->doneFlag) && in->service()) - { - in->doneFlag = true; - --numToDo; - } - } - - for (int i = outChans.size(); --i >= 0;) - { - DSoundInternalOutChannel* const out = outChans.getUnchecked(i); - - if ((! out->doneFlag) && out->service()) - { - out->doneFlag = true; - --numToDo; - } - } - - if (numToDo <= 0) - break; - - if (Time::getMillisecondCounter() > startTime + maxTimeMS) - { - resync(); - break; - } - - if (--count <= 0) - { - Sleep (1); - count = maxCount; - } - - if (threadShouldExit()) - return; - } - } - else - { - sleep (1); - } - - const ScopedLock sl (startStopLock); - - if (isStarted) - { - callback->audioDeviceIOCallback (inputBuffers.getArrayOfReadPointers(), inputBuffers.getNumChannels(), - outputBuffers.getArrayOfWritePointers(), outputBuffers.getNumChannels(), - bufferSizeSamples); - } - else - { - outputBuffers.clear(); - sleep (1); - } - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DSoundAudioIODevice) -}; - -//============================================================================== -struct DSoundDeviceList -{ - StringArray outputDeviceNames, inputDeviceNames; - Array outputGuids, inputGuids; - - void scan() - { - outputDeviceNames.clear(); - inputDeviceNames.clear(); - outputGuids.clear(); - inputGuids.clear(); - - if (dsDirectSoundEnumerateW != 0) - { - dsDirectSoundEnumerateW (outputEnumProcW, this); - dsDirectSoundCaptureEnumerateW (inputEnumProcW, this); - } - } - - bool operator!= (const DSoundDeviceList& other) const noexcept - { - return outputDeviceNames != other.outputDeviceNames - || inputDeviceNames != other.inputDeviceNames - || outputGuids != other.outputGuids - || inputGuids != other.inputGuids; - } - -private: - static BOOL enumProc (LPGUID lpGUID, String desc, StringArray& names, Array& guids) - { - desc = desc.trim(); - - if (desc.isNotEmpty()) - { - const String origDesc (desc); - - int n = 2; - while (names.contains (desc)) - desc = origDesc + " (" + String (n++) + ")"; - - names.add (desc); - guids.add (lpGUID != nullptr ? *lpGUID : GUID()); - } - - return TRUE; - } - - BOOL outputEnumProc (LPGUID guid, LPCWSTR desc) { return enumProc (guid, desc, outputDeviceNames, outputGuids); } - BOOL inputEnumProc (LPGUID guid, LPCWSTR desc) { return enumProc (guid, desc, inputDeviceNames, inputGuids); } - - static BOOL CALLBACK outputEnumProcW (LPGUID lpGUID, LPCWSTR description, LPCWSTR, LPVOID object) - { - return static_cast (object)->outputEnumProc (lpGUID, description); - } - - static BOOL CALLBACK inputEnumProcW (LPGUID lpGUID, LPCWSTR description, LPCWSTR, LPVOID object) - { - return static_cast (object)->inputEnumProc (lpGUID, description); - } -}; - -//============================================================================== -String DSoundAudioIODevice::openDevice (const BigInteger& inputChannels, - const BigInteger& outputChannels, - double sampleRate_, int bufferSizeSamples_) -{ - closeDevice(); - - sampleRate = sampleRate_; - - if (bufferSizeSamples_ <= 0) - bufferSizeSamples_ = 960; // use as a default size if none is set. - - bufferSizeSamples = bufferSizeSamples_ & ~7; - - DSoundDeviceList dlh; - dlh.scan(); - - enabledInputs = inputChannels; - enabledInputs.setRange (inChannels.size(), - enabledInputs.getHighestBit() + 1 - inChannels.size(), - false); - - inputBuffers.setSize (jmax (1, enabledInputs.countNumberOfSetBits()), bufferSizeSamples); - inputBuffers.clear(); - int numIns = 0; - - for (int i = 0; i <= enabledInputs.getHighestBit(); i += 2) - { - float* left = enabledInputs[i] ? inputBuffers.getWritePointer (numIns++) : nullptr; - float* right = enabledInputs[i + 1] ? inputBuffers.getWritePointer (numIns++) : nullptr; - - if (left != nullptr || right != nullptr) - inChans.add (new DSoundInternalInChannel (dlh.inputDeviceNames [inputDeviceIndex], - dlh.inputGuids [inputDeviceIndex], - (int) sampleRate, bufferSizeSamples, - left, right)); - } - - enabledOutputs = outputChannels; - enabledOutputs.setRange (outChannels.size(), - enabledOutputs.getHighestBit() + 1 - outChannels.size(), - false); - - outputBuffers.setSize (jmax (1, enabledOutputs.countNumberOfSetBits()), bufferSizeSamples); - outputBuffers.clear(); - int numOuts = 0; - - for (int i = 0; i <= enabledOutputs.getHighestBit(); i += 2) - { - float* left = enabledOutputs[i] ? outputBuffers.getWritePointer (numOuts++) : nullptr; - float* right = enabledOutputs[i + 1] ? outputBuffers.getWritePointer (numOuts++) : nullptr; - - if (left != nullptr || right != nullptr) - outChans.add (new DSoundInternalOutChannel (dlh.outputDeviceNames[outputDeviceIndex], - dlh.outputGuids [outputDeviceIndex], - (int) sampleRate, bufferSizeSamples, - left, right)); - } - - String error; - - // boost our priority while opening the devices to try to get better sync between them - const int oldThreadPri = GetThreadPriority (GetCurrentThread()); - const DWORD oldProcPri = GetPriorityClass (GetCurrentProcess()); - SetThreadPriority (GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); - SetPriorityClass (GetCurrentProcess(), REALTIME_PRIORITY_CLASS); - - for (int i = 0; i < outChans.size(); ++i) - { - error = outChans[i]->open(); - - if (error.isNotEmpty()) - { - error = "Error opening " + dlh.outputDeviceNames[i] + ": \"" + error + "\""; - break; - } - } - - if (error.isEmpty()) - { - for (int i = 0; i < inChans.size(); ++i) - { - error = inChans[i]->open(); - - if (error.isNotEmpty()) - { - error = "Error opening " + dlh.inputDeviceNames[i] + ": \"" + error + "\""; - break; - } - } - } - - if (error.isEmpty()) - { - for (int i = 0; i < outChans.size(); ++i) - outChans.getUnchecked(i)->synchronisePosition(); - - for (int i = 0; i < inChans.size(); ++i) - inChans.getUnchecked(i)->synchronisePosition(); - - startThread (9); - sleep (10); - - notify(); - } - else - { - JUCE_DS_LOG ("Opening failed: " + error); - } - - SetThreadPriority (GetCurrentThread(), oldThreadPri); - SetPriorityClass (GetCurrentProcess(), oldProcPri); - - return error; -} - -//============================================================================== -class DSoundAudioIODeviceType : public AudioIODeviceType, - private DeviceChangeDetector -{ -public: - DSoundAudioIODeviceType() - : AudioIODeviceType ("DirectSound"), - DeviceChangeDetector (L"DirectSound"), - hasScanned (false) - { - initialiseDSoundFunctions(); - } - - void scanForDevices() - { - hasScanned = true; - deviceList.scan(); - } - - StringArray getDeviceNames (bool wantInputNames) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - return wantInputNames ? deviceList.inputDeviceNames - : deviceList.outputDeviceNames; - } - - int getDefaultDeviceIndex (bool /*forInput*/) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - return 0; - } - - int getIndexOfDevice (AudioIODevice* device, bool asInput) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - if (DSoundAudioIODevice* const d = dynamic_cast (device)) - return asInput ? d->inputDeviceIndex - : d->outputDeviceIndex; - - return -1; - } - - bool hasSeparateInputsAndOutputs() const { return true; } - - AudioIODevice* createDevice (const String& outputDeviceName, - const String& inputDeviceName) - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - const int outputIndex = deviceList.outputDeviceNames.indexOf (outputDeviceName); - const int inputIndex = deviceList.inputDeviceNames.indexOf (inputDeviceName); - - if (outputIndex >= 0 || inputIndex >= 0) - return new DSoundAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName - : inputDeviceName, - outputIndex, inputIndex); - - return nullptr; - } - -private: - DSoundDeviceList deviceList; - bool hasScanned; - - void systemDeviceChanged() override - { - DSoundDeviceList newList; - newList.scan(); - - if (newList != deviceList) - { - deviceList = newList; - callDeviceChangeListeners(); - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DSoundAudioIODeviceType) -}; - -//============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_DirectSound() -{ - return new DSoundAudioIODeviceType(); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp deleted file mode 100755 index 2737b1e..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_Midi.cpp +++ /dev/null @@ -1,489 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class MidiInCollector -{ -public: - MidiInCollector (MidiInput* const input_, - MidiInputCallback& callback_) - : deviceHandle (0), - input (input_), - callback (callback_), - concatenator (4096), - isStarted (false), - startTime (0) - { - } - - ~MidiInCollector() - { - stop(); - - if (deviceHandle != 0) - { - for (int count = 5; --count >= 0;) - { - if (midiInClose (deviceHandle) == MMSYSERR_NOERROR) - break; - - Sleep (20); - } - } - } - - //============================================================================== - void handleMessage (const uint8* bytes, const uint32 timeStamp) - { - if (bytes[0] >= 0x80 && isStarted) - { - concatenator.pushMidiData (bytes, MidiMessage::getMessageLengthFromFirstByte (bytes[0]), - convertTimeStamp (timeStamp), input, callback); - writeFinishedBlocks(); - } - } - - void handleSysEx (MIDIHDR* const hdr, const uint32 timeStamp) - { - if (isStarted && hdr->dwBytesRecorded > 0) - { - concatenator.pushMidiData (hdr->lpData, (int) hdr->dwBytesRecorded, - convertTimeStamp (timeStamp), input, callback); - writeFinishedBlocks(); - } - } - - void start() - { - if (deviceHandle != 0 && ! isStarted) - { - activeMidiCollectors.addIfNotAlreadyThere (this); - - for (int i = 0; i < (int) numHeaders; ++i) - { - headers[i].prepare (deviceHandle); - headers[i].write (deviceHandle); - } - - startTime = Time::getMillisecondCounterHiRes(); - MMRESULT res = midiInStart (deviceHandle); - - if (res == MMSYSERR_NOERROR) - { - concatenator.reset(); - isStarted = true; - } - else - { - unprepareAllHeaders(); - } - } - } - - void stop() - { - if (isStarted) - { - isStarted = false; - midiInReset (deviceHandle); - midiInStop (deviceHandle); - activeMidiCollectors.removeFirstMatchingValue (this); - unprepareAllHeaders(); - concatenator.reset(); - } - } - - static void CALLBACK midiInCallback (HMIDIIN, UINT uMsg, DWORD_PTR dwInstance, - DWORD_PTR midiMessage, DWORD_PTR timeStamp) - { - MidiInCollector* const collector = reinterpret_cast (dwInstance); - - if (activeMidiCollectors.contains (collector)) - { - if (uMsg == MIM_DATA) - collector->handleMessage ((const uint8*) &midiMessage, (uint32) timeStamp); - else if (uMsg == MIM_LONGDATA) - collector->handleSysEx ((MIDIHDR*) midiMessage, (uint32) timeStamp); - } - } - - HMIDIIN deviceHandle; - -private: - static Array activeMidiCollectors; - - MidiInput* input; - MidiInputCallback& callback; - MidiDataConcatenator concatenator; - bool volatile isStarted; - double startTime; - - class MidiHeader - { - public: - MidiHeader() {} - - void prepare (HMIDIIN deviceHandle) - { - zerostruct (hdr); - hdr.lpData = data; - hdr.dwBufferLength = (DWORD) numElementsInArray (data); - - midiInPrepareHeader (deviceHandle, &hdr, sizeof (hdr)); - } - - void unprepare (HMIDIIN deviceHandle) - { - if ((hdr.dwFlags & WHDR_DONE) != 0) - { - int c = 10; - while (--c >= 0 && midiInUnprepareHeader (deviceHandle, &hdr, sizeof (hdr)) == MIDIERR_STILLPLAYING) - Thread::sleep (20); - - jassert (c >= 0); - } - } - - void write (HMIDIIN deviceHandle) - { - hdr.dwBytesRecorded = 0; - midiInAddBuffer (deviceHandle, &hdr, sizeof (hdr)); - } - - void writeIfFinished (HMIDIIN deviceHandle) - { - if ((hdr.dwFlags & WHDR_DONE) != 0) - write (deviceHandle); - } - - private: - MIDIHDR hdr; - char data [256]; - - JUCE_DECLARE_NON_COPYABLE (MidiHeader) - }; - - enum { numHeaders = 32 }; - MidiHeader headers [numHeaders]; - - void writeFinishedBlocks() - { - for (int i = 0; i < (int) numHeaders; ++i) - headers[i].writeIfFinished (deviceHandle); - } - - void unprepareAllHeaders() - { - for (int i = 0; i < (int) numHeaders; ++i) - headers[i].unprepare (deviceHandle); - } - - double convertTimeStamp (uint32 timeStamp) - { - double t = startTime + timeStamp; - - const double now = Time::getMillisecondCounterHiRes(); - if (t > now) - { - if (t > now + 2.0) - startTime -= 1.0; - - t = now; - } - - return t * 0.001; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInCollector) -}; - -Array MidiInCollector::activeMidiCollectors; - - -//============================================================================== -StringArray MidiInput::getDevices() -{ - StringArray s; - const UINT num = midiInGetNumDevs(); - - for (UINT i = 0; i < num; ++i) - { - MIDIINCAPS mc = { 0 }; - - if (midiInGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) - s.add (String (mc.szPname, sizeof (mc.szPname))); - } - - return s; -} - -int MidiInput::getDefaultDeviceIndex() -{ - return 0; -} - -MidiInput* MidiInput::openDevice (const int index, MidiInputCallback* const callback) -{ - if (callback == nullptr) - return nullptr; - - UINT deviceId = MIDI_MAPPER; - int n = 0; - String name; - - const UINT num = midiInGetNumDevs(); - - for (UINT i = 0; i < num; ++i) - { - MIDIINCAPS mc = { 0 }; - - if (midiInGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) - { - if (index == n) - { - deviceId = i; - name = String (mc.szPname, (size_t) numElementsInArray (mc.szPname)); - break; - } - - ++n; - } - } - - ScopedPointer in (new MidiInput (name)); - ScopedPointer collector (new MidiInCollector (in, *callback)); - - HMIDIIN h; - MMRESULT err = midiInOpen (&h, deviceId, - (DWORD_PTR) &MidiInCollector::midiInCallback, - (DWORD_PTR) (MidiInCollector*) collector, - CALLBACK_FUNCTION); - - if (err == MMSYSERR_NOERROR) - { - collector->deviceHandle = h; - in->internal = collector.release(); - return in.release(); - } - - return nullptr; -} - -MidiInput::MidiInput (const String& name_) - : name (name_), - internal (0) -{ -} - -MidiInput::~MidiInput() -{ - delete static_cast (internal); -} - -void MidiInput::start() { static_cast (internal)->start(); } -void MidiInput::stop() { static_cast (internal)->stop(); } - - -//============================================================================== -struct MidiOutHandle -{ - int refCount; - UINT deviceId; - HMIDIOUT handle; - - static Array activeHandles; - -private: - JUCE_LEAK_DETECTOR (MidiOutHandle) -}; - -Array MidiOutHandle::activeHandles; - -//============================================================================== -StringArray MidiOutput::getDevices() -{ - StringArray s; - const UINT num = midiOutGetNumDevs(); - - for (UINT i = 0; i < num; ++i) - { - MIDIOUTCAPS mc = { 0 }; - - if (midiOutGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) - s.add (String (mc.szPname, sizeof (mc.szPname))); - } - - return s; -} - -int MidiOutput::getDefaultDeviceIndex() -{ - const UINT num = midiOutGetNumDevs(); - int n = 0; - - for (UINT i = 0; i < num; ++i) - { - MIDIOUTCAPS mc = { 0 }; - - if (midiOutGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) - { - if ((mc.wTechnology & MOD_MAPPER) != 0) - return n; - - ++n; - } - } - - return 0; -} - -MidiOutput* MidiOutput::openDevice (int index) -{ - UINT deviceId = MIDI_MAPPER; - const UINT num = midiOutGetNumDevs(); - int n = 0; - - for (UINT i = 0; i < num; ++i) - { - MIDIOUTCAPS mc = { 0 }; - - if (midiOutGetDevCaps (i, &mc, sizeof (mc)) == MMSYSERR_NOERROR) - { - // use the microsoft sw synth as a default - best not to allow deviceId - // to be MIDI_MAPPER, or else device sharing breaks - if (String (mc.szPname, sizeof (mc.szPname)).containsIgnoreCase ("microsoft")) - deviceId = i; - - if (index == n) - { - deviceId = i; - break; - } - - ++n; - } - } - - for (int i = MidiOutHandle::activeHandles.size(); --i >= 0;) - { - MidiOutHandle* const han = MidiOutHandle::activeHandles.getUnchecked(i); - - if (han->deviceId == deviceId) - { - han->refCount++; - - MidiOutput* const out = new MidiOutput(); - out->internal = han; - return out; - } - } - - for (int i = 4; --i >= 0;) - { - HMIDIOUT h = 0; - MMRESULT res = midiOutOpen (&h, deviceId, 0, 0, CALLBACK_NULL); - - if (res == MMSYSERR_NOERROR) - { - MidiOutHandle* const han = new MidiOutHandle(); - han->deviceId = deviceId; - han->refCount = 1; - han->handle = h; - MidiOutHandle::activeHandles.add (han); - - MidiOutput* const out = new MidiOutput(); - out->internal = han; - return out; - } - else if (res == MMSYSERR_ALLOCATED) - { - Sleep (100); - } - else - { - break; - } - } - - return nullptr; -} - -MidiOutput::~MidiOutput() -{ - stopBackgroundThread(); - - MidiOutHandle* const h = static_cast (internal); - - if (MidiOutHandle::activeHandles.contains (h) && --(h->refCount) == 0) - { - midiOutClose (h->handle); - MidiOutHandle::activeHandles.removeFirstMatchingValue (h); - delete h; - } -} - -void MidiOutput::sendMessageNow (const MidiMessage& message) -{ - const MidiOutHandle* const handle = static_cast (internal); - - if (message.getRawDataSize() > 3 || message.isSysEx()) - { - MIDIHDR h = { 0 }; - - h.lpData = (char*) message.getRawData(); - h.dwBytesRecorded = h.dwBufferLength = (DWORD) message.getRawDataSize(); - - if (midiOutPrepareHeader (handle->handle, &h, sizeof (MIDIHDR)) == MMSYSERR_NOERROR) - { - MMRESULT res = midiOutLongMsg (handle->handle, &h, sizeof (MIDIHDR)); - - if (res == MMSYSERR_NOERROR) - { - while ((h.dwFlags & MHDR_DONE) == 0) - Sleep (1); - - int count = 500; // 1 sec timeout - - while (--count >= 0) - { - res = midiOutUnprepareHeader (handle->handle, &h, sizeof (MIDIHDR)); - - if (res == MIDIERR_STILLPLAYING) - Sleep (2); - else - break; - } - } - } - } - else - { - for (int i = 0; i < 50; ++i) - { - if (midiOutShortMsg (handle->handle, *(unsigned int*) message.getRawData()) != MIDIERR_NOTREADY) - break; - - Sleep (1); - } - } -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp b/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp deleted file mode 100755 index 875ce61..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/native/juce_win32_WASAPI.cpp +++ /dev/null @@ -1,1693 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_WASAPI_LOGGING - #define JUCE_WASAPI_LOGGING 0 -#endif - -//============================================================================== -namespace WasapiClasses -{ - -void logFailure (HRESULT hr) -{ - (void) hr; - jassert (hr != (HRESULT) 0x800401f0); // If you hit this, it means you're trying to call from - // a thread which hasn't been initialised with CoInitialize(). - - #if JUCE_WASAPI_LOGGING - if (FAILED (hr)) - { - const char* m = nullptr; - - switch (hr) - { - case E_POINTER: m = "E_POINTER"; break; - case E_INVALIDARG: m = "E_INVALIDARG"; break; - case E_NOINTERFACE: m = "E_NOINTERFACE"; break; - - #define JUCE_WASAPI_ERR(desc, n) \ - case MAKE_HRESULT(1, 0x889, n): m = #desc; break; - - JUCE_WASAPI_ERR (AUDCLNT_E_NOT_INITIALIZED, 0x001) - JUCE_WASAPI_ERR (AUDCLNT_E_ALREADY_INITIALIZED, 0x002) - JUCE_WASAPI_ERR (AUDCLNT_E_WRONG_ENDPOINT_TYPE, 0x003) - JUCE_WASAPI_ERR (AUDCLNT_E_DEVICE_INVALIDATED, 0x004) - JUCE_WASAPI_ERR (AUDCLNT_E_NOT_STOPPED, 0x005) - JUCE_WASAPI_ERR (AUDCLNT_E_BUFFER_TOO_LARGE, 0x006) - JUCE_WASAPI_ERR (AUDCLNT_E_OUT_OF_ORDER, 0x007) - JUCE_WASAPI_ERR (AUDCLNT_E_UNSUPPORTED_FORMAT, 0x008) - JUCE_WASAPI_ERR (AUDCLNT_E_INVALID_SIZE, 0x009) - JUCE_WASAPI_ERR (AUDCLNT_E_DEVICE_IN_USE, 0x00a) - JUCE_WASAPI_ERR (AUDCLNT_E_BUFFER_OPERATION_PENDING, 0x00b) - JUCE_WASAPI_ERR (AUDCLNT_E_THREAD_NOT_REGISTERED, 0x00c) - JUCE_WASAPI_ERR (AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED, 0x00e) - JUCE_WASAPI_ERR (AUDCLNT_E_ENDPOINT_CREATE_FAILED, 0x00f) - JUCE_WASAPI_ERR (AUDCLNT_E_SERVICE_NOT_RUNNING, 0x010) - JUCE_WASAPI_ERR (AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED, 0x011) - JUCE_WASAPI_ERR (AUDCLNT_E_EXCLUSIVE_MODE_ONLY, 0x012) - JUCE_WASAPI_ERR (AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL, 0x013) - JUCE_WASAPI_ERR (AUDCLNT_E_EVENTHANDLE_NOT_SET, 0x014) - JUCE_WASAPI_ERR (AUDCLNT_E_INCORRECT_BUFFER_SIZE, 0x015) - JUCE_WASAPI_ERR (AUDCLNT_E_BUFFER_SIZE_ERROR, 0x016) - JUCE_WASAPI_ERR (AUDCLNT_E_CPUUSAGE_EXCEEDED, 0x017) - JUCE_WASAPI_ERR (AUDCLNT_E_BUFFER_ERROR, 0x018) - JUCE_WASAPI_ERR (AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED, 0x019) - JUCE_WASAPI_ERR (AUDCLNT_E_INVALID_DEVICE_PERIOD, 0x020) - default: break; - } - - Logger::writeToLog ("WASAPI error: " + (m != nullptr ? String (m) - : String::toHexString ((int) hr))); - } - #endif -} - -#undef check - -bool check (HRESULT hr) -{ - logFailure (hr); - return SUCCEEDED (hr); -} - -//============================================================================== -} - -#if JUCE_MINGW - #define JUCE_COMCLASS(name, guid) \ - struct name; \ - template<> struct UUIDGetter { static CLSID get() { return uuidFromString (guid); } }; \ - struct name - - struct PROPERTYKEY - { - GUID fmtid; - DWORD pid; - }; - - WINOLEAPI PropVariantClear (PROPVARIANT*); -#else - #define JUCE_COMCLASS(name, guid) struct __declspec (uuid (guid)) name -#endif - -#ifndef KSDATAFORMAT_SUBTYPE_PCM - #define KSDATAFORMAT_SUBTYPE_PCM uuidFromString ("00000001-0000-0010-8000-00aa00389b71") - #define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT uuidFromString ("00000003-0000-0010-8000-00aa00389b71") -#endif - -#define JUCE_IUNKNOWNCLASS(name, guid) JUCE_COMCLASS(name, guid) : public IUnknown -#define JUCE_COMCALL virtual HRESULT STDMETHODCALLTYPE - -enum EDataFlow -{ - eRender = 0, - eCapture = (eRender + 1), - eAll = (eCapture + 1) -}; - -enum -{ - DEVICE_STATE_ACTIVE = 1, - AUDCLNT_BUFFERFLAGS_SILENT = 2 -}; - -JUCE_IUNKNOWNCLASS (IPropertyStore, "886d8eeb-8cf2-4446-8d02-cdba1dbdcf99") -{ - JUCE_COMCALL GetCount (DWORD*) = 0; - JUCE_COMCALL GetAt (DWORD, PROPERTYKEY*) = 0; - JUCE_COMCALL GetValue (const PROPERTYKEY&, PROPVARIANT*) = 0; - JUCE_COMCALL SetValue (const PROPERTYKEY&, const PROPVARIANT&) = 0; - JUCE_COMCALL Commit() = 0; -}; - -JUCE_IUNKNOWNCLASS (IMMDevice, "D666063F-1587-4E43-81F1-B948E807363F") -{ - JUCE_COMCALL Activate (REFIID, DWORD, PROPVARIANT*, void**) = 0; - JUCE_COMCALL OpenPropertyStore (DWORD, IPropertyStore**) = 0; - JUCE_COMCALL GetId (LPWSTR*) = 0; - JUCE_COMCALL GetState (DWORD*) = 0; -}; - -JUCE_IUNKNOWNCLASS (IMMEndpoint, "1BE09788-6894-4089-8586-9A2A6C265AC5") -{ - JUCE_COMCALL GetDataFlow (EDataFlow*) = 0; -}; - -struct IMMDeviceCollection : public IUnknown -{ - JUCE_COMCALL GetCount (UINT*) = 0; - JUCE_COMCALL Item (UINT, IMMDevice**) = 0; -}; - -enum ERole -{ - eConsole = 0, - eMultimedia = (eConsole + 1), - eCommunications = (eMultimedia + 1) -}; - -JUCE_IUNKNOWNCLASS (IMMNotificationClient, "7991EEC9-7E89-4D85-8390-6C703CEC60C0") -{ - JUCE_COMCALL OnDeviceStateChanged (LPCWSTR, DWORD) = 0; - JUCE_COMCALL OnDeviceAdded (LPCWSTR) = 0; - JUCE_COMCALL OnDeviceRemoved (LPCWSTR) = 0; - JUCE_COMCALL OnDefaultDeviceChanged (EDataFlow, ERole, LPCWSTR) = 0; - JUCE_COMCALL OnPropertyValueChanged (LPCWSTR, const PROPERTYKEY) = 0; -}; - -JUCE_IUNKNOWNCLASS (IMMDeviceEnumerator, "A95664D2-9614-4F35-A746-DE8DB63617E6") -{ - JUCE_COMCALL EnumAudioEndpoints (EDataFlow, DWORD, IMMDeviceCollection**) = 0; - JUCE_COMCALL GetDefaultAudioEndpoint (EDataFlow, ERole, IMMDevice**) = 0; - JUCE_COMCALL GetDevice (LPCWSTR, IMMDevice**) = 0; - JUCE_COMCALL RegisterEndpointNotificationCallback (IMMNotificationClient*) = 0; - JUCE_COMCALL UnregisterEndpointNotificationCallback (IMMNotificationClient*) = 0; -}; - -JUCE_COMCLASS (MMDeviceEnumerator, "BCDE0395-E52F-467C-8E3D-C4579291692E"); - -typedef LONGLONG REFERENCE_TIME; - -enum AVRT_PRIORITY -{ - AVRT_PRIORITY_LOW = -1, - AVRT_PRIORITY_NORMAL, - AVRT_PRIORITY_HIGH, - AVRT_PRIORITY_CRITICAL -}; - -enum AUDCLNT_SHAREMODE -{ - AUDCLNT_SHAREMODE_SHARED, - AUDCLNT_SHAREMODE_EXCLUSIVE -}; - -JUCE_IUNKNOWNCLASS (IAudioClient, "1CB9AD4C-DBFA-4c32-B178-C2F568A703B2") -{ - JUCE_COMCALL Initialize (AUDCLNT_SHAREMODE, DWORD, REFERENCE_TIME, REFERENCE_TIME, const WAVEFORMATEX*, LPCGUID) = 0; - JUCE_COMCALL GetBufferSize (UINT32*) = 0; - JUCE_COMCALL GetStreamLatency (REFERENCE_TIME*) = 0; - JUCE_COMCALL GetCurrentPadding (UINT32*) = 0; - JUCE_COMCALL IsFormatSupported (AUDCLNT_SHAREMODE, const WAVEFORMATEX*, WAVEFORMATEX**) = 0; - JUCE_COMCALL GetMixFormat (WAVEFORMATEX**) = 0; - JUCE_COMCALL GetDevicePeriod (REFERENCE_TIME*, REFERENCE_TIME*) = 0; - JUCE_COMCALL Start() = 0; - JUCE_COMCALL Stop() = 0; - JUCE_COMCALL Reset() = 0; - JUCE_COMCALL SetEventHandle (HANDLE) = 0; - JUCE_COMCALL GetService (REFIID, void**) = 0; -}; - -JUCE_IUNKNOWNCLASS (IAudioCaptureClient, "C8ADBD64-E71E-48a0-A4DE-185C395CD317") -{ - JUCE_COMCALL GetBuffer (BYTE**, UINT32*, DWORD*, UINT64*, UINT64*) = 0; - JUCE_COMCALL ReleaseBuffer (UINT32) = 0; - JUCE_COMCALL GetNextPacketSize (UINT32*) = 0; -}; - -JUCE_IUNKNOWNCLASS (IAudioRenderClient, "F294ACFC-3146-4483-A7BF-ADDCA7C260E2") -{ - JUCE_COMCALL GetBuffer (UINT32, BYTE**) = 0; - JUCE_COMCALL ReleaseBuffer (UINT32, DWORD) = 0; -}; - -JUCE_IUNKNOWNCLASS (IAudioEndpointVolume, "5CDF2C82-841E-4546-9722-0CF74078229A") -{ - JUCE_COMCALL RegisterControlChangeNotify (void*) = 0; - JUCE_COMCALL UnregisterControlChangeNotify (void*) = 0; - JUCE_COMCALL GetChannelCount (UINT*) = 0; - JUCE_COMCALL SetMasterVolumeLevel (float, LPCGUID) = 0; - JUCE_COMCALL SetMasterVolumeLevelScalar (float, LPCGUID) = 0; - JUCE_COMCALL GetMasterVolumeLevel (float*) = 0; - JUCE_COMCALL GetMasterVolumeLevelScalar (float*) = 0; - JUCE_COMCALL SetChannelVolumeLevel (UINT, float, LPCGUID) = 0; - JUCE_COMCALL SetChannelVolumeLevelScalar (UINT, float, LPCGUID) = 0; - JUCE_COMCALL GetChannelVolumeLevel (UINT, float*) = 0; - JUCE_COMCALL GetChannelVolumeLevelScalar (UINT, float*) = 0; - JUCE_COMCALL SetMute (BOOL, LPCGUID) = 0; - JUCE_COMCALL GetMute (BOOL*) = 0; - JUCE_COMCALL GetVolumeStepInfo (UINT*, UINT*) = 0; - JUCE_COMCALL VolumeStepUp (LPCGUID) = 0; - JUCE_COMCALL VolumeStepDown (LPCGUID) = 0; - JUCE_COMCALL QueryHardwareSupport (DWORD*) = 0; - JUCE_COMCALL GetVolumeRange (float*, float*, float*) = 0; -}; - -enum AudioSessionDisconnectReason -{ - DisconnectReasonDeviceRemoval = 0, - DisconnectReasonServerShutdown = 1, - DisconnectReasonFormatChanged = 2, - DisconnectReasonSessionLogoff = 3, - DisconnectReasonSessionDisconnected = 4, - DisconnectReasonExclusiveModeOverride = 5 -}; - -enum AudioSessionState -{ - AudioSessionStateInactive = 0, - AudioSessionStateActive = 1, - AudioSessionStateExpired = 2 -}; - -JUCE_IUNKNOWNCLASS (IAudioSessionEvents, "24918ACC-64B3-37C1-8CA9-74A66E9957A8") -{ - JUCE_COMCALL OnDisplayNameChanged (LPCWSTR, LPCGUID) = 0; - JUCE_COMCALL OnIconPathChanged (LPCWSTR, LPCGUID) = 0; - JUCE_COMCALL OnSimpleVolumeChanged (float, BOOL, LPCGUID) = 0; - JUCE_COMCALL OnChannelVolumeChanged (DWORD, float*, DWORD, LPCGUID) = 0; - JUCE_COMCALL OnGroupingParamChanged (LPCGUID, LPCGUID) = 0; - JUCE_COMCALL OnStateChanged (AudioSessionState) = 0; - JUCE_COMCALL OnSessionDisconnected (AudioSessionDisconnectReason) = 0; -}; - -JUCE_IUNKNOWNCLASS (IAudioSessionControl, "F4B1A599-7266-4319-A8CA-E70ACB11E8CD") -{ - JUCE_COMCALL GetState (AudioSessionState*) = 0; - JUCE_COMCALL GetDisplayName (LPWSTR*) = 0; - JUCE_COMCALL SetDisplayName (LPCWSTR, LPCGUID) = 0; - JUCE_COMCALL GetIconPath (LPWSTR*) = 0; - JUCE_COMCALL SetIconPath (LPCWSTR, LPCGUID) = 0; - JUCE_COMCALL GetGroupingParam (GUID*) = 0; - JUCE_COMCALL SetGroupingParam (LPCGUID, LPCGUID) = 0; - JUCE_COMCALL RegisterAudioSessionNotification (IAudioSessionEvents*) = 0; - JUCE_COMCALL UnregisterAudioSessionNotification (IAudioSessionEvents*) = 0; -}; - -#undef JUCE_COMCALL -#undef JUCE_COMCLASS -#undef JUCE_IUNKNOWNCLASS - -//============================================================================== -namespace WasapiClasses -{ - -String getDeviceID (IMMDevice* const device) -{ - String s; - WCHAR* deviceId = nullptr; - - if (check (device->GetId (&deviceId))) - { - s = String (deviceId); - CoTaskMemFree (deviceId); - } - - return s; -} - -EDataFlow getDataFlow (const ComSmartPtr& device) -{ - EDataFlow flow = eRender; - ComSmartPtr endPoint; - if (check (device.QueryInterface (endPoint))) - (void) check (endPoint->GetDataFlow (&flow)); - - return flow; -} - -int refTimeToSamples (const REFERENCE_TIME& t, const double sampleRate) noexcept -{ - return roundToInt (sampleRate * ((double) t) * 0.0000001); -} - -REFERENCE_TIME samplesToRefTime (const int numSamples, const double sampleRate) noexcept -{ - return (REFERENCE_TIME) ((numSamples * 10000.0 * 1000.0 / sampleRate) + 0.5); -} - -void copyWavFormat (WAVEFORMATEXTENSIBLE& dest, const WAVEFORMATEX* const src) noexcept -{ - memcpy (&dest, src, src->wFormatTag == WAVE_FORMAT_EXTENSIBLE ? sizeof (WAVEFORMATEXTENSIBLE) - : sizeof (WAVEFORMATEX)); -} - -//============================================================================== -class WASAPIDeviceBase -{ -public: - WASAPIDeviceBase (const ComSmartPtr& d, const bool exclusiveMode) - : device (d), - sampleRate (0), - defaultSampleRate (0), - numChannels (0), - actualNumChannels (0), - minBufferSize (0), - defaultBufferSize (0), - latencySamples (0), - useExclusiveMode (exclusiveMode), - actualBufferSize (0), - bytesPerSample (0), - bytesPerFrame (0), - sampleRateHasChanged (false) - { - clientEvent = CreateEvent (nullptr, false, false, nullptr); - - ComSmartPtr tempClient (createClient()); - if (tempClient == nullptr) - return; - - REFERENCE_TIME defaultPeriod, minPeriod; - if (! check (tempClient->GetDevicePeriod (&defaultPeriod, &minPeriod))) - return; - - WAVEFORMATEX* mixFormat = nullptr; - if (! check (tempClient->GetMixFormat (&mixFormat))) - return; - - WAVEFORMATEXTENSIBLE format; - copyWavFormat (format, mixFormat); - CoTaskMemFree (mixFormat); - - actualNumChannels = numChannels = format.Format.nChannels; - defaultSampleRate = format.Format.nSamplesPerSec; - minBufferSize = refTimeToSamples (minPeriod, defaultSampleRate); - defaultBufferSize = refTimeToSamples (defaultPeriod, defaultSampleRate); - mixFormatChannelMask = format.dwChannelMask; - - rates.addUsingDefaultSort (defaultSampleRate); - - if (useExclusiveMode - && findSupportedFormat (tempClient, defaultSampleRate, format.dwChannelMask, format)) - { - // Got a format that is supported by the device so we can ask what sample rates are supported (in whatever format) - } - - static const int ratesToTest[] = { 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 }; - - for (int i = 0; i < numElementsInArray (ratesToTest); ++i) - { - if (rates.contains (ratesToTest[i])) - continue; - - format.Format.nSamplesPerSec = (DWORD) ratesToTest[i]; - format.Format.nAvgBytesPerSec = (DWORD) (format.Format.nSamplesPerSec * format.Format.nChannels * format.Format.wBitsPerSample / 8); - - if (SUCCEEDED (tempClient->IsFormatSupported (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE - : AUDCLNT_SHAREMODE_SHARED, - (WAVEFORMATEX*) &format, 0))) - if (! rates.contains (ratesToTest[i])) - rates.addUsingDefaultSort (ratesToTest[i]); - } - } - - virtual ~WASAPIDeviceBase() - { - device = nullptr; - CloseHandle (clientEvent); - } - - bool isOk() const noexcept { return defaultBufferSize > 0 && defaultSampleRate > 0; } - - bool openClient (const double newSampleRate, const BigInteger& newChannels, const int bufferSizeSamples) - { - sampleRate = newSampleRate; - channels = newChannels; - channels.setRange (actualNumChannels, channels.getHighestBit() + 1 - actualNumChannels, false); - numChannels = channels.getHighestBit() + 1; - - if (numChannels == 0) - return true; - - client = createClient(); - - if (client != nullptr - && tryInitialisingWithBufferSize (bufferSizeSamples)) - { - sampleRateHasChanged = false; - - channelMaps.clear(); - for (int i = 0; i <= channels.getHighestBit(); ++i) - if (channels[i]) - channelMaps.add (i); - - REFERENCE_TIME latency; - if (check (client->GetStreamLatency (&latency))) - latencySamples = refTimeToSamples (latency, sampleRate); - - (void) check (client->GetBufferSize (&actualBufferSize)); - - createSessionEventCallback(); - - return check (client->SetEventHandle (clientEvent)); - } - - return false; - } - - void closeClient() - { - if (client != nullptr) - client->Stop(); - - deleteSessionEventCallback(); - client = nullptr; - ResetEvent (clientEvent); - } - - void deviceSampleRateChanged() - { - sampleRateHasChanged = true; - } - - //============================================================================== - ComSmartPtr device; - ComSmartPtr client; - double sampleRate, defaultSampleRate; - int numChannels, actualNumChannels; - int minBufferSize, defaultBufferSize, latencySamples; - DWORD mixFormatChannelMask; - const bool useExclusiveMode; - Array rates; - HANDLE clientEvent; - BigInteger channels; - Array channelMaps; - UINT32 actualBufferSize; - int bytesPerSample, bytesPerFrame; - bool sampleRateHasChanged; - - virtual void updateFormat (bool isFloat) = 0; - -private: - //============================================================================== - class SessionEventCallback : public ComBaseClassHelper - { - public: - SessionEventCallback (WASAPIDeviceBase& d) : owner (d) {} - - JUCE_COMRESULT OnDisplayNameChanged (LPCWSTR, LPCGUID) { return S_OK; } - JUCE_COMRESULT OnIconPathChanged (LPCWSTR, LPCGUID) { return S_OK; } - JUCE_COMRESULT OnSimpleVolumeChanged (float, BOOL, LPCGUID) { return S_OK; } - JUCE_COMRESULT OnChannelVolumeChanged (DWORD, float*, DWORD, LPCGUID) { return S_OK; } - JUCE_COMRESULT OnGroupingParamChanged (LPCGUID, LPCGUID) { return S_OK; } - JUCE_COMRESULT OnStateChanged (AudioSessionState) { return S_OK; } - - JUCE_COMRESULT OnSessionDisconnected (AudioSessionDisconnectReason reason) - { - if (reason == DisconnectReasonFormatChanged) - owner.deviceSampleRateChanged(); - - return S_OK; - } - - private: - WASAPIDeviceBase& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SessionEventCallback) - }; - - ComSmartPtr audioSessionControl; - ComSmartPtr sessionEventCallback; - - void createSessionEventCallback() - { - deleteSessionEventCallback(); - client->GetService (__uuidof (IAudioSessionControl), - (void**) audioSessionControl.resetAndGetPointerAddress()); - - if (audioSessionControl != nullptr) - { - sessionEventCallback = new SessionEventCallback (*this); - audioSessionControl->RegisterAudioSessionNotification (sessionEventCallback); - sessionEventCallback->Release(); // (required because ComBaseClassHelper objects are constructed with a ref count of 1) - } - } - - void deleteSessionEventCallback() - { - if (audioSessionControl != nullptr && sessionEventCallback != nullptr) - audioSessionControl->UnregisterAudioSessionNotification (sessionEventCallback); - - audioSessionControl = nullptr; - sessionEventCallback = nullptr; - } - - //============================================================================== - ComSmartPtr createClient() - { - ComSmartPtr client; - - if (device != nullptr) - logFailure (device->Activate (__uuidof (IAudioClient), CLSCTX_INPROC_SERVER, - nullptr, (void**) client.resetAndGetPointerAddress())); - - return client; - } - - struct AudioSampleFormat - { - bool useFloat; - int bitsPerSampleToTry; - int bytesPerSampleContainer; - }; - - bool tryFormat (const AudioSampleFormat sampleFormat, IAudioClient* clientToUse, double sampleRate, - DWORD mixFormatChannelMask, WAVEFORMATEXTENSIBLE& format) const - { - zerostruct (format); - - if (numChannels <= 2 && sampleFormat.bitsPerSampleToTry <= 16) - { - format.Format.wFormatTag = WAVE_FORMAT_PCM; - } - else - { - format.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; - format.Format.cbSize = sizeof (WAVEFORMATEXTENSIBLE) - sizeof (WAVEFORMATEX); - } - - format.Format.nSamplesPerSec = (DWORD) sampleRate; - format.Format.nChannels = (WORD) numChannels; - format.Format.wBitsPerSample = (WORD) (8 * sampleFormat.bytesPerSampleContainer); - format.Samples.wValidBitsPerSample = (WORD) (sampleFormat.bitsPerSampleToTry); - format.Format.nBlockAlign = (WORD) (format.Format.nChannels * format.Format.wBitsPerSample / 8); - format.Format.nAvgBytesPerSec = (DWORD) (format.Format.nSamplesPerSec * format.Format.nBlockAlign); - format.SubFormat = sampleFormat.useFloat ? KSDATAFORMAT_SUBTYPE_IEEE_FLOAT : KSDATAFORMAT_SUBTYPE_PCM; - format.dwChannelMask = mixFormatChannelMask; - - WAVEFORMATEXTENSIBLE* nearestFormat = nullptr; - - HRESULT hr = clientToUse->IsFormatSupported (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE - : AUDCLNT_SHAREMODE_SHARED, - (WAVEFORMATEX*) &format, - useExclusiveMode ? nullptr : (WAVEFORMATEX**) &nearestFormat); - logFailure (hr); - - if (hr == S_FALSE && format.Format.nSamplesPerSec == nearestFormat->Format.nSamplesPerSec) - { - copyWavFormat (format, (const WAVEFORMATEX*) nearestFormat); - hr = S_OK; - } - - CoTaskMemFree (nearestFormat); - return check (hr); - } - - bool findSupportedFormat (IAudioClient* clientToUse, double sampleRate, - DWORD mixFormatChannelMask, WAVEFORMATEXTENSIBLE& format) const - { - static const AudioSampleFormat formats[] = - { - { true, 32, 4 }, - { false, 32, 4 }, - { false, 24, 4 }, - { false, 24, 3 }, - { false, 20, 4 }, - { false, 20, 3 }, - { false, 16, 2 } - }; - - for (int i = 0; i < numElementsInArray (formats); ++i) - if (tryFormat (formats[i], clientToUse, sampleRate, mixFormatChannelMask, format)) - return true; - - return false; - } - - bool tryInitialisingWithBufferSize (const int bufferSizeSamples) - { - WAVEFORMATEXTENSIBLE format; - - if (findSupportedFormat (client, sampleRate, mixFormatChannelMask, format)) - { - REFERENCE_TIME defaultPeriod = 0, minPeriod = 0; - - check (client->GetDevicePeriod (&defaultPeriod, &minPeriod)); - - if (useExclusiveMode && bufferSizeSamples > 0) - defaultPeriod = jmax (minPeriod, samplesToRefTime (bufferSizeSamples, format.Format.nSamplesPerSec)); - - for (;;) - { - GUID session; - HRESULT hr = client->Initialize (useExclusiveMode ? AUDCLNT_SHAREMODE_EXCLUSIVE : AUDCLNT_SHAREMODE_SHARED, - 0x40000 /*AUDCLNT_STREAMFLAGS_EVENTCALLBACK*/, - defaultPeriod, useExclusiveMode ? defaultPeriod : 0, (WAVEFORMATEX*) &format, &session); - - if (check (hr)) - { - actualNumChannels = format.Format.nChannels; - const bool isFloat = format.Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE && format.SubFormat == KSDATAFORMAT_SUBTYPE_IEEE_FLOAT; - bytesPerSample = format.Format.wBitsPerSample / 8; - bytesPerFrame = format.Format.nBlockAlign; - - updateFormat (isFloat); - return true; - } - - // Handle the "alignment dance" : http://msdn.microsoft.com/en-us/library/windows/desktop/dd370875(v=vs.85).aspx (see Remarks) - if (hr != MAKE_HRESULT (1, 0x889, 0x19)) // AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED - break; - - UINT32 numFrames = 0; - if (! check (client->GetBufferSize (&numFrames))) - break; - - // Recreate client - client = nullptr; - client = createClient(); - - defaultPeriod = samplesToRefTime (numFrames, format.Format.nSamplesPerSec); - } - } - - return false; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIDeviceBase) -}; - -//============================================================================== -class WASAPIInputDevice : public WASAPIDeviceBase -{ -public: - WASAPIInputDevice (const ComSmartPtr& d, const bool exclusiveMode) - : WASAPIDeviceBase (d, exclusiveMode), - reservoir (1, 1) - { - } - - ~WASAPIInputDevice() - { - close(); - } - - bool open (const double newSampleRate, const BigInteger& newChannels, int bufferSizeSamples) - { - return openClient (newSampleRate, newChannels, bufferSizeSamples) - && (numChannels == 0 || check (client->GetService (__uuidof (IAudioCaptureClient), - (void**) captureClient.resetAndGetPointerAddress()))); - } - - void close() - { - closeClient(); - captureClient = nullptr; - reservoir.reset(); - reservoirReadPos = reservoirWritePos = 0; - } - - template - void updateFormatWithType (SourceType*) noexcept - { - typedef AudioData::Pointer NativeType; - converter = new AudioData::ConverterInstance, NativeType> (actualNumChannels, 1); - } - - void updateFormat (bool isFloat) override - { - if (isFloat) updateFormatWithType ((AudioData::Float32*) nullptr); - else if (bytesPerSample == 4) updateFormatWithType ((AudioData::Int32*) nullptr); - else if (bytesPerSample == 3) updateFormatWithType ((AudioData::Int24*) nullptr); - else updateFormatWithType ((AudioData::Int16*) nullptr); - } - - bool start (const int userBufferSize) - { - reservoirSize = actualBufferSize + userBufferSize; - reservoirMask = nextPowerOfTwo (reservoirSize) - 1; - reservoir.setSize ((reservoirMask + 1) * bytesPerFrame, true); - reservoirReadPos = reservoirWritePos = 0; - - if (! check (client->Start())) - return false; - - purgeInputBuffers(); - return true; - } - - void purgeInputBuffers() - { - uint8* inputData; - UINT32 numSamplesAvailable; - DWORD flags; - - while (captureClient->GetBuffer (&inputData, &numSamplesAvailable, &flags, nullptr, nullptr) - != MAKE_HRESULT (0, 0x889, 0x1) /* AUDCLNT_S_BUFFER_EMPTY */) - captureClient->ReleaseBuffer (numSamplesAvailable); - } - - int getNumSamplesInReservoir() const noexcept { return reservoirWritePos - reservoirReadPos; } - - void handleDeviceBuffer() - { - if (numChannels <= 0) - return; - - uint8* inputData; - UINT32 numSamplesAvailable; - DWORD flags; - - while (check (captureClient->GetBuffer (&inputData, &numSamplesAvailable, &flags, nullptr, nullptr)) && numSamplesAvailable > 0) - { - int samplesLeft = (int) numSamplesAvailable; - - while (samplesLeft > 0) - { - const int localWrite = reservoirWritePos & reservoirMask; - const int samplesToDo = jmin (samplesLeft, reservoirMask + 1 - localWrite); - const int samplesToDoBytes = samplesToDo * bytesPerFrame; - - void* reservoirPtr = addBytesToPointer (reservoir.getData(), localWrite * bytesPerFrame); - - if ((flags & AUDCLNT_BUFFERFLAGS_SILENT) != 0) - zeromem (reservoirPtr, samplesToDoBytes); - else - memcpy (reservoirPtr, inputData, samplesToDoBytes); - - reservoirWritePos += samplesToDo; - inputData += samplesToDoBytes; - samplesLeft -= samplesToDo; - } - - if (getNumSamplesInReservoir() > reservoirSize) - reservoirReadPos = reservoirWritePos - reservoirSize; - - captureClient->ReleaseBuffer (numSamplesAvailable); - } - } - - void copyBuffersFromReservoir (float** destBuffers, int numDestBuffers, int bufferSize) - { - if ((numChannels <= 0 && bufferSize == 0) || reservoir.getSize() == 0) - return; - - int offset = jmax (0, bufferSize - getNumSamplesInReservoir()); - - if (offset > 0) - { - for (int i = 0; i < numDestBuffers; ++i) - zeromem (destBuffers[i], offset * sizeof (float)); - - bufferSize -= offset; - reservoirReadPos -= offset / 2; - } - - while (bufferSize > 0) - { - const int localRead = reservoirReadPos & reservoirMask; - - const int samplesToDo = jmin (bufferSize, getNumSamplesInReservoir(), reservoirMask + 1 - localRead); - if (samplesToDo <= 0) - break; - - const int reservoirOffset = localRead * bytesPerFrame; - - for (int i = 0; i < numDestBuffers; ++i) - converter->convertSamples (destBuffers[i] + offset, 0, addBytesToPointer (reservoir.getData(), reservoirOffset), channelMaps.getUnchecked(i), samplesToDo); - - bufferSize -= samplesToDo; - offset += samplesToDo; - reservoirReadPos += samplesToDo; - } - } - - ComSmartPtr captureClient; - MemoryBlock reservoir; - int reservoirSize, reservoirMask; - volatile int reservoirReadPos, reservoirWritePos; - - ScopedPointer converter; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIInputDevice) -}; - -//============================================================================== -class WASAPIOutputDevice : public WASAPIDeviceBase -{ -public: - WASAPIOutputDevice (const ComSmartPtr& d, const bool exclusiveMode) - : WASAPIDeviceBase (d, exclusiveMode) - { - } - - ~WASAPIOutputDevice() - { - close(); - } - - bool open (const double newSampleRate, const BigInteger& newChannels, int bufferSizeSamples) - { - return openClient (newSampleRate, newChannels, bufferSizeSamples) - && (numChannels == 0 || check (client->GetService (__uuidof (IAudioRenderClient), - (void**) renderClient.resetAndGetPointerAddress()))); - } - - void close() - { - closeClient(); - renderClient = nullptr; - } - - template - void updateFormatWithType (DestType*) - { - typedef AudioData::Pointer NativeType; - converter = new AudioData::ConverterInstance > (1, actualNumChannels); - } - - void updateFormat (bool isFloat) override - { - if (isFloat) updateFormatWithType ((AudioData::Float32*) nullptr); - else if (bytesPerSample == 4) updateFormatWithType ((AudioData::Int32*) nullptr); - else if (bytesPerSample == 3) updateFormatWithType ((AudioData::Int24*) nullptr); - else updateFormatWithType ((AudioData::Int16*) nullptr); - } - - bool start() - { - int samplesToDo = getNumSamplesAvailableToCopy(); - uint8* outputData; - - if (check (renderClient->GetBuffer (samplesToDo, &outputData))) - renderClient->ReleaseBuffer (samplesToDo, AUDCLNT_BUFFERFLAGS_SILENT); - - return check (client->Start()); - } - - int getNumSamplesAvailableToCopy() const - { - if (numChannels <= 0) - return 0; - - if (! useExclusiveMode) - { - UINT32 padding = 0; - if (check (client->GetCurrentPadding (&padding))) - return actualBufferSize - (int) padding; - } - - return actualBufferSize; - } - - void copyBuffers (const float** const srcBuffers, const int numSrcBuffers, int bufferSize, - WASAPIInputDevice* inputDevice, Thread& thread) - { - if (numChannels <= 0) - return; - - int offset = 0; - - while (bufferSize > 0) - { - // This is needed in order not to drop any input data if the output device endpoint buffer was full - if ((! useExclusiveMode) && inputDevice != nullptr - && WaitForSingleObject (inputDevice->clientEvent, 0) == WAIT_OBJECT_0) - inputDevice->handleDeviceBuffer(); - - int samplesToDo = jmin (getNumSamplesAvailableToCopy(), bufferSize); - - if (samplesToDo == 0) - { - // This can ONLY occur in non-exclusive mode - if (! thread.threadShouldExit() && WaitForSingleObject (clientEvent, 1000) == WAIT_OBJECT_0) - continue; - - break; - } - - if (useExclusiveMode && WaitForSingleObject (clientEvent, 1000) == WAIT_TIMEOUT) - break; - - uint8* outputData = nullptr; - if (check (renderClient->GetBuffer ((UINT32) samplesToDo, &outputData))) - { - for (int i = 0; i < numSrcBuffers; ++i) - converter->convertSamples (outputData, channelMaps.getUnchecked(i), srcBuffers[i] + offset, 0, samplesToDo); - - renderClient->ReleaseBuffer ((UINT32) samplesToDo, 0); - } - - bufferSize -= samplesToDo; - offset += samplesToDo; - } - } - - ComSmartPtr renderClient; - ScopedPointer converter; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIOutputDevice) -}; - -//============================================================================== -class WASAPIAudioIODevice : public AudioIODevice, - public Thread, - private AsyncUpdater -{ -public: - WASAPIAudioIODevice (const String& deviceName, - const String& typeName, - const String& outputDeviceID, - const String& inputDeviceID, - const bool exclusiveMode) - : AudioIODevice (deviceName, typeName), - Thread ("Juce WASAPI"), - outputDeviceId (outputDeviceID), - inputDeviceId (inputDeviceID), - useExclusiveMode (exclusiveMode), - isOpen_ (false), - isStarted (false), - currentBufferSizeSamples (0), - currentSampleRate (0), - callback (nullptr) - { - } - - ~WASAPIAudioIODevice() - { - close(); - } - - bool initialise() - { - latencyIn = latencyOut = 0; - Array ratesIn, ratesOut; - - if (createDevices()) - { - jassert (inputDevice != nullptr || outputDevice != nullptr); - - if (inputDevice != nullptr && outputDevice != nullptr) - { - defaultSampleRate = jmin (inputDevice->defaultSampleRate, outputDevice->defaultSampleRate); - minBufferSize = jmin (inputDevice->minBufferSize, outputDevice->minBufferSize); - defaultBufferSize = jmax (inputDevice->defaultBufferSize, outputDevice->defaultBufferSize); - sampleRates = inputDevice->rates; - sampleRates.removeValuesNotIn (outputDevice->rates); - } - else - { - WASAPIDeviceBase* d = inputDevice != nullptr ? static_cast (inputDevice) - : static_cast (outputDevice); - defaultSampleRate = d->defaultSampleRate; - minBufferSize = d->minBufferSize; - defaultBufferSize = d->defaultBufferSize; - sampleRates = d->rates; - } - - bufferSizes.addUsingDefaultSort (defaultBufferSize); - if (minBufferSize != defaultBufferSize) - bufferSizes.addUsingDefaultSort (minBufferSize); - - int n = 64; - for (int i = 0; i < 40; ++i) - { - if (n >= minBufferSize && n <= 2048 && ! bufferSizes.contains (n)) - bufferSizes.addUsingDefaultSort (n); - - n += (n < 512) ? 32 : (n < 1024 ? 64 : 128); - } - - return true; - } - - return false; - } - - StringArray getOutputChannelNames() override - { - StringArray outChannels; - - if (outputDevice != nullptr) - for (int i = 1; i <= outputDevice->actualNumChannels; ++i) - outChannels.add ("Output channel " + String (i)); - - return outChannels; - } - - StringArray getInputChannelNames() override - { - StringArray inChannels; - - if (inputDevice != nullptr) - for (int i = 1; i <= inputDevice->actualNumChannels; ++i) - inChannels.add ("Input channel " + String (i)); - - return inChannels; - } - - Array getAvailableSampleRates() override { return sampleRates; } - Array getAvailableBufferSizes() override { return bufferSizes; } - int getDefaultBufferSize() override { return defaultBufferSize; } - - int getCurrentBufferSizeSamples() override { return currentBufferSizeSamples; } - double getCurrentSampleRate() override { return currentSampleRate; } - int getCurrentBitDepth() override { return 32; } - int getOutputLatencyInSamples() override { return latencyOut; } - int getInputLatencyInSamples() override { return latencyIn; } - BigInteger getActiveOutputChannels() const override { return outputDevice != nullptr ? outputDevice->channels : BigInteger(); } - BigInteger getActiveInputChannels() const override { return inputDevice != nullptr ? inputDevice->channels : BigInteger(); } - String getLastError() override { return lastError; } - - - String open (const BigInteger& inputChannels, const BigInteger& outputChannels, - double sampleRate, int bufferSizeSamples) override - { - close(); - lastError.clear(); - - if (sampleRates.size() == 0 && inputDevice != nullptr && outputDevice != nullptr) - { - lastError = TRANS("The input and output devices don't share a common sample rate!"); - return lastError; - } - - currentBufferSizeSamples = bufferSizeSamples <= 0 ? defaultBufferSize : jmax (bufferSizeSamples, minBufferSize); - currentSampleRate = sampleRate > 0 ? sampleRate : defaultSampleRate; - lastKnownInputChannels = inputChannels; - lastKnownOutputChannels = outputChannels; - - if (inputDevice != nullptr && ! inputDevice->open (currentSampleRate, inputChannels, bufferSizeSamples)) - { - lastError = TRANS("Couldn't open the input device!"); - return lastError; - } - - if (outputDevice != nullptr && ! outputDevice->open (currentSampleRate, outputChannels, bufferSizeSamples)) - { - close(); - lastError = TRANS("Couldn't open the output device!"); - return lastError; - } - - if (useExclusiveMode) - { - // This is to make sure that the callback uses actualBufferSize in case of exclusive mode - if (inputDevice != nullptr && outputDevice != nullptr && inputDevice->actualBufferSize != outputDevice->actualBufferSize) - { - close(); - lastError = TRANS("Couldn't open the output device (buffer size mismatch)"); - return lastError; - } - - currentBufferSizeSamples = outputDevice != nullptr ? outputDevice->actualBufferSize - : inputDevice->actualBufferSize; - } - - if (inputDevice != nullptr) ResetEvent (inputDevice->clientEvent); - if (outputDevice != nullptr) ResetEvent (outputDevice->clientEvent); - - startThread (8); - Thread::sleep (5); - - if (inputDevice != nullptr && inputDevice->client != nullptr) - { - latencyIn = (int) (inputDevice->latencySamples + currentBufferSizeSamples); - - if (! inputDevice->start (currentBufferSizeSamples)) - { - close(); - lastError = TRANS("Couldn't start the input device!"); - return lastError; - } - } - - if (outputDevice != nullptr && outputDevice->client != nullptr) - { - latencyOut = (int) (outputDevice->latencySamples + currentBufferSizeSamples); - - if (! outputDevice->start()) - { - close(); - lastError = TRANS("Couldn't start the output device!"); - return lastError; - } - } - - isOpen_ = true; - return lastError; - } - - void close() override - { - stop(); - signalThreadShouldExit(); - - if (inputDevice != nullptr) SetEvent (inputDevice->clientEvent); - if (outputDevice != nullptr) SetEvent (outputDevice->clientEvent); - - stopThread (5000); - - if (inputDevice != nullptr) inputDevice->close(); - if (outputDevice != nullptr) outputDevice->close(); - - isOpen_ = false; - } - - bool isOpen() override { return isOpen_ && isThreadRunning(); } - bool isPlaying() override { return isStarted && isOpen_ && isThreadRunning(); } - - void start (AudioIODeviceCallback* call) override - { - if (isOpen_ && call != nullptr && ! isStarted) - { - if (! isThreadRunning()) - { - // something's gone wrong and the thread's stopped.. - isOpen_ = false; - return; - } - - call->audioDeviceAboutToStart (this); - - const ScopedLock sl (startStopLock); - callback = call; - isStarted = true; - } - } - - void stop() override - { - if (isStarted) - { - AudioIODeviceCallback* const callbackLocal = callback; - - { - const ScopedLock sl (startStopLock); - isStarted = false; - } - - if (callbackLocal != nullptr) - callbackLocal->audioDeviceStopped(); - } - } - - void setMMThreadPriority() - { - DynamicLibrary dll ("avrt.dll"); - JUCE_LOAD_WINAPI_FUNCTION (dll, AvSetMmThreadCharacteristicsW, avSetMmThreadCharacteristics, HANDLE, (LPCWSTR, LPDWORD)) - JUCE_LOAD_WINAPI_FUNCTION (dll, AvSetMmThreadPriority, avSetMmThreadPriority, HANDLE, (HANDLE, AVRT_PRIORITY)) - - if (avSetMmThreadCharacteristics != 0 && avSetMmThreadPriority != 0) - { - DWORD dummy = 0; - HANDLE h = avSetMmThreadCharacteristics (L"Pro Audio", &dummy); - - if (h != 0) - avSetMmThreadPriority (h, AVRT_PRIORITY_NORMAL); - } - } - - void run() override - { - setMMThreadPriority(); - - const int bufferSize = currentBufferSizeSamples; - const int numInputBuffers = getActiveInputChannels().countNumberOfSetBits(); - const int numOutputBuffers = getActiveOutputChannels().countNumberOfSetBits(); - bool sampleRateHasChanged = false; - - AudioSampleBuffer ins (jmax (1, numInputBuffers), bufferSize + 32); - AudioSampleBuffer outs (jmax (1, numOutputBuffers), bufferSize + 32); - float** const inputBuffers = ins.getArrayOfWritePointers(); - float** const outputBuffers = outs.getArrayOfWritePointers(); - ins.clear(); - outs.clear(); - - while (! threadShouldExit()) - { - if (inputDevice != nullptr) - { - if (outputDevice == nullptr) - { - if (WaitForSingleObject (inputDevice->clientEvent, 1000) == WAIT_TIMEOUT) - break; - - inputDevice->handleDeviceBuffer(); - - if (inputDevice->getNumSamplesInReservoir() < bufferSize) - continue; - } - else - { - if (useExclusiveMode && WaitForSingleObject (inputDevice->clientEvent, 0) == WAIT_OBJECT_0) - inputDevice->handleDeviceBuffer(); - } - - inputDevice->copyBuffersFromReservoir (inputBuffers, numInputBuffers, bufferSize); - - if (inputDevice->sampleRateHasChanged) - { - sampleRateHasChanged = true; - sampleRateChangedByOutput = false; - } - } - - { - const ScopedTryLock sl (startStopLock); - - if (sl.isLocked() && isStarted) - callback->audioDeviceIOCallback (const_cast (inputBuffers), numInputBuffers, - outputBuffers, numOutputBuffers, bufferSize); - else - outs.clear(); - } - - if (outputDevice != nullptr) - { - // Note that this function is handed the input device so it can check for the event and make sure - // the input reservoir is filled up correctly even when bufferSize > device actualBufferSize - outputDevice->copyBuffers (const_cast (outputBuffers), numOutputBuffers, bufferSize, inputDevice, *this); - - if (outputDevice->sampleRateHasChanged) - { - sampleRateHasChanged = true; - sampleRateChangedByOutput = true; - } - } - - if (sampleRateHasChanged) - { - triggerAsyncUpdate(); - break; // Quit the thread... will restart it later! - } - } - } - - //============================================================================== - String outputDeviceId, inputDeviceId; - String lastError; - -private: - // Device stats... - ScopedPointer inputDevice; - ScopedPointer outputDevice; - const bool useExclusiveMode; - double defaultSampleRate; - int minBufferSize, defaultBufferSize; - int latencyIn, latencyOut; - Array sampleRates; - Array bufferSizes; - - // Active state... - bool isOpen_, isStarted; - int currentBufferSizeSamples; - double currentSampleRate; - bool sampleRateChangedByOutput; - - AudioIODeviceCallback* callback; - CriticalSection startStopLock; - - BigInteger lastKnownInputChannels, lastKnownOutputChannels; - - //============================================================================== - bool createDevices() - { - ComSmartPtr enumerator; - if (! check (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator)))) - return false; - - ComSmartPtr deviceCollection; - if (! check (enumerator->EnumAudioEndpoints (eAll, DEVICE_STATE_ACTIVE, deviceCollection.resetAndGetPointerAddress()))) - return false; - - UINT32 numDevices = 0; - if (! check (deviceCollection->GetCount (&numDevices))) - return false; - - for (UINT32 i = 0; i < numDevices; ++i) - { - ComSmartPtr device; - if (! check (deviceCollection->Item (i, device.resetAndGetPointerAddress()))) - continue; - - const String deviceId (getDeviceID (device)); - if (deviceId.isEmpty()) - continue; - - const EDataFlow flow = getDataFlow (device); - - if (deviceId == inputDeviceId && flow == eCapture) - inputDevice = new WASAPIInputDevice (device, useExclusiveMode); - else if (deviceId == outputDeviceId && flow == eRender) - outputDevice = new WASAPIOutputDevice (device, useExclusiveMode); - } - - return (outputDeviceId.isEmpty() || (outputDevice != nullptr && outputDevice->isOk())) - && (inputDeviceId.isEmpty() || (inputDevice != nullptr && inputDevice->isOk())); - } - - //============================================================================== - void handleAsyncUpdate() override - { - stop(); - - outputDevice = nullptr; - inputDevice = nullptr; - initialise(); - - open (lastKnownInputChannels, lastKnownOutputChannels, - getChangedSampleRate(), currentBufferSizeSamples); - - start (callback); - } - - double getChangedSampleRate() const - { - if (outputDevice != nullptr && sampleRateChangedByOutput) - return outputDevice->defaultSampleRate; - - if (inputDevice != nullptr && ! sampleRateChangedByOutput) - return inputDevice->defaultSampleRate; - - return 0.0; - } - - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIAudioIODevice) -}; - - -//============================================================================== -class WASAPIAudioIODeviceType : public AudioIODeviceType, - private DeviceChangeDetector -{ -public: - WASAPIAudioIODeviceType (bool exclusive) - : AudioIODeviceType (exclusive ? "Windows Audio (Exclusive Mode)" : "Windows Audio"), - DeviceChangeDetector (L"Windows Audio"), - exclusiveMode (exclusive), - hasScanned (false) - { - } - - ~WASAPIAudioIODeviceType() - { - if (notifyClient != nullptr) - enumerator->UnregisterEndpointNotificationCallback (notifyClient); - } - - //============================================================================== - void scanForDevices() - { - hasScanned = true; - - outputDeviceNames.clear(); - inputDeviceNames.clear(); - outputDeviceIds.clear(); - inputDeviceIds.clear(); - - scan (outputDeviceNames, inputDeviceNames, - outputDeviceIds, inputDeviceIds); - } - - StringArray getDeviceNames (bool wantInputNames) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - return wantInputNames ? inputDeviceNames - : outputDeviceNames; - } - - int getDefaultDeviceIndex (bool /*forInput*/) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - return 0; - } - - int getIndexOfDevice (AudioIODevice* device, bool asInput) const - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - if (WASAPIAudioIODevice* const d = dynamic_cast (device)) - return asInput ? inputDeviceIds.indexOf (d->inputDeviceId) - : outputDeviceIds.indexOf (d->outputDeviceId); - - return -1; - } - - bool hasSeparateInputsAndOutputs() const { return true; } - - AudioIODevice* createDevice (const String& outputDeviceName, - const String& inputDeviceName) - { - jassert (hasScanned); // need to call scanForDevices() before doing this - - ScopedPointer device; - - const int outputIndex = outputDeviceNames.indexOf (outputDeviceName); - const int inputIndex = inputDeviceNames.indexOf (inputDeviceName); - - if (outputIndex >= 0 || inputIndex >= 0) - { - device = new WASAPIAudioIODevice (outputDeviceName.isNotEmpty() ? outputDeviceName - : inputDeviceName, - getTypeName(), - outputDeviceIds [outputIndex], - inputDeviceIds [inputIndex], - exclusiveMode); - - if (! device->initialise()) - device = nullptr; - } - - return device.release(); - } - - //============================================================================== - StringArray outputDeviceNames, outputDeviceIds; - StringArray inputDeviceNames, inputDeviceIds; - -private: - bool exclusiveMode, hasScanned; - ComSmartPtr enumerator; - - //============================================================================== - class ChangeNotificationClient : public ComBaseClassHelper - { - public: - ChangeNotificationClient (WASAPIAudioIODeviceType& d) - : ComBaseClassHelper (0), device (d) {} - - HRESULT STDMETHODCALLTYPE OnDeviceAdded (LPCWSTR) { return notify(); } - HRESULT STDMETHODCALLTYPE OnDeviceRemoved (LPCWSTR) { return notify(); } - HRESULT STDMETHODCALLTYPE OnDeviceStateChanged (LPCWSTR, DWORD) { return notify(); } - HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged (EDataFlow, ERole, LPCWSTR) { return notify(); } - HRESULT STDMETHODCALLTYPE OnPropertyValueChanged (LPCWSTR, const PROPERTYKEY) { return notify(); } - - private: - WASAPIAudioIODeviceType& device; - - HRESULT notify() { device.triggerAsyncDeviceChangeCallback(); return S_OK; } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChangeNotificationClient) - }; - - ComSmartPtr notifyClient; - - //============================================================================== - static String getDefaultEndpoint (IMMDeviceEnumerator* const enumerator, const bool forCapture) - { - String s; - IMMDevice* dev = nullptr; - - if (check (enumerator->GetDefaultAudioEndpoint (forCapture ? eCapture : eRender, - eMultimedia, &dev))) - { - WCHAR* deviceId = nullptr; - - if (check (dev->GetId (&deviceId))) - { - s = deviceId; - CoTaskMemFree (deviceId); - } - - dev->Release(); - } - - return s; - } - - //============================================================================== - void scan (StringArray& outputDeviceNames, - StringArray& inputDeviceNames, - StringArray& outputDeviceIds, - StringArray& inputDeviceIds) - { - if (enumerator == nullptr) - { - if (! check (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator)))) - return; - - notifyClient = new ChangeNotificationClient (*this); - enumerator->RegisterEndpointNotificationCallback (notifyClient); - } - - const String defaultRenderer (getDefaultEndpoint (enumerator, false)); - const String defaultCapture (getDefaultEndpoint (enumerator, true)); - - ComSmartPtr deviceCollection; - UINT32 numDevices = 0; - - if (! (check (enumerator->EnumAudioEndpoints (eAll, DEVICE_STATE_ACTIVE, deviceCollection.resetAndGetPointerAddress())) - && check (deviceCollection->GetCount (&numDevices)))) - return; - - for (UINT32 i = 0; i < numDevices; ++i) - { - ComSmartPtr device; - if (! check (deviceCollection->Item (i, device.resetAndGetPointerAddress()))) - continue; - - DWORD state = 0; - if (! (check (device->GetState (&state)) && state == DEVICE_STATE_ACTIVE)) - continue; - - const String deviceId (getDeviceID (device)); - String name; - - { - ComSmartPtr properties; - if (! check (device->OpenPropertyStore (STGM_READ, properties.resetAndGetPointerAddress()))) - continue; - - PROPVARIANT value; - zerostruct (value); - - const PROPERTYKEY PKEY_Device_FriendlyName - = { { 0xa45c254e, 0xdf1c, 0x4efd, { 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0 } }, 14 }; - - if (check (properties->GetValue (PKEY_Device_FriendlyName, &value))) - name = value.pwszVal; - - PropVariantClear (&value); - } - - const EDataFlow flow = getDataFlow (device); - - if (flow == eRender) - { - const int index = (deviceId == defaultRenderer) ? 0 : -1; - outputDeviceIds.insert (index, deviceId); - outputDeviceNames.insert (index, name); - } - else if (flow == eCapture) - { - const int index = (deviceId == defaultCapture) ? 0 : -1; - inputDeviceIds.insert (index, deviceId); - inputDeviceNames.insert (index, name); - } - } - - inputDeviceNames.appendNumbersToDuplicates (false, false); - outputDeviceNames.appendNumbersToDuplicates (false, false); - } - - //============================================================================== - void systemDeviceChanged() override - { - StringArray newOutNames, newInNames, newOutIds, newInIds; - scan (newOutNames, newInNames, newOutIds, newInIds); - - if (newOutNames != outputDeviceNames - || newInNames != inputDeviceNames - || newOutIds != outputDeviceIds - || newInIds != inputDeviceIds) - { - hasScanned = true; - outputDeviceNames = newOutNames; - inputDeviceNames = newInNames; - outputDeviceIds = newOutIds; - inputDeviceIds = newInIds; - } - - callDeviceChangeListeners(); - } - - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WASAPIAudioIODeviceType) -}; - -//============================================================================== -struct MMDeviceMasterVolume -{ - MMDeviceMasterVolume() - { - ComSmartPtr enumerator; - if (check (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator)))) - { - ComSmartPtr device; - if (check (enumerator->GetDefaultAudioEndpoint (eRender, eConsole, device.resetAndGetPointerAddress()))) - check (device->Activate (__uuidof (IAudioEndpointVolume), CLSCTX_INPROC_SERVER, nullptr, - (void**) endpointVolume.resetAndGetPointerAddress())); - } - } - - float getGain() const - { - float vol = 0.0f; - if (endpointVolume != nullptr) - check (endpointVolume->GetMasterVolumeLevelScalar (&vol)); - - return vol; - } - - bool setGain (float newGain) const - { - return endpointVolume != nullptr - && check (endpointVolume->SetMasterVolumeLevelScalar (jlimit (0.0f, 1.0f, newGain), nullptr)); - } - - bool isMuted() const - { - BOOL mute = 0; - return endpointVolume != nullptr - && check (endpointVolume->GetMute (&mute)) && mute != 0; - } - - bool setMuted (bool shouldMute) const - { - return endpointVolume != nullptr - && check (endpointVolume->SetMute (shouldMute, nullptr)); - } - - ComSmartPtr endpointVolume; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MMDeviceMasterVolume) -}; - -} - -//============================================================================== -AudioIODeviceType* AudioIODeviceType::createAudioIODeviceType_WASAPI (bool exclusiveMode) -{ - #if ! JUCE_WASAPI_EXCLUSIVE - if (exclusiveMode) - return nullptr; - #endif - - return SystemStats::getOperatingSystemType() >= SystemStats::WinVista - ? new WasapiClasses::WASAPIAudioIODeviceType (exclusiveMode) - : nullptr; -} - -//============================================================================== -#define JUCE_SYSTEMAUDIOVOL_IMPLEMENTED 1 -float JUCE_CALLTYPE SystemAudioVolume::getGain() { return WasapiClasses::MMDeviceMasterVolume().getGain(); } -bool JUCE_CALLTYPE SystemAudioVolume::setGain (float gain) { return WasapiClasses::MMDeviceMasterVolume().setGain (gain); } -bool JUCE_CALLTYPE SystemAudioVolume::isMuted() { return WasapiClasses::MMDeviceMasterVolume().isMuted(); } -bool JUCE_CALLTYPE SystemAudioVolume::setMuted (bool mute) { return WasapiClasses::MMDeviceMasterVolume().setMuted (mute); } diff --git a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp deleted file mode 100755 index c351795..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioSourcePlayer::AudioSourcePlayer() - : source (nullptr), - sampleRate (0), - bufferSize (0), - lastGain (1.0f), - gain (1.0f) -{ -} - -AudioSourcePlayer::~AudioSourcePlayer() -{ - setSource (nullptr); -} - -void AudioSourcePlayer::setSource (AudioSource* newSource) -{ - if (source != newSource) - { - AudioSource* const oldSource = source; - - if (newSource != nullptr && bufferSize > 0 && sampleRate > 0) - newSource->prepareToPlay (bufferSize, sampleRate); - - { - const ScopedLock sl (readLock); - source = newSource; - } - - if (oldSource != nullptr) - oldSource->releaseResources(); - } -} - -void AudioSourcePlayer::setGain (const float newGain) noexcept -{ - gain = newGain; -} - -void AudioSourcePlayer::audioDeviceIOCallback (const float** inputChannelData, - int totalNumInputChannels, - float** outputChannelData, - int totalNumOutputChannels, - int numSamples) -{ - // these should have been prepared by audioDeviceAboutToStart()... - jassert (sampleRate > 0 && bufferSize > 0); - - const ScopedLock sl (readLock); - - if (source != nullptr) - { - int numActiveChans = 0, numInputs = 0, numOutputs = 0; - - // messy stuff needed to compact the channels down into an array - // of non-zero pointers.. - for (int i = 0; i < totalNumInputChannels; ++i) - { - if (inputChannelData[i] != nullptr) - { - inputChans [numInputs++] = inputChannelData[i]; - if (numInputs >= numElementsInArray (inputChans)) - break; - } - } - - for (int i = 0; i < totalNumOutputChannels; ++i) - { - if (outputChannelData[i] != nullptr) - { - outputChans [numOutputs++] = outputChannelData[i]; - if (numOutputs >= numElementsInArray (outputChans)) - break; - } - } - - if (numInputs > numOutputs) - { - // if there aren't enough output channels for the number of - // inputs, we need to create some temporary extra ones (can't - // use the input data in case it gets written to) - tempBuffer.setSize (numInputs - numOutputs, numSamples, - false, false, true); - - for (int i = 0; i < numOutputs; ++i) - { - channels[numActiveChans] = outputChans[i]; - memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * (size_t) numSamples); - ++numActiveChans; - } - - for (int i = numOutputs; i < numInputs; ++i) - { - channels[numActiveChans] = tempBuffer.getWritePointer (i - numOutputs); - memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * (size_t) numSamples); - ++numActiveChans; - } - } - else - { - for (int i = 0; i < numInputs; ++i) - { - channels[numActiveChans] = outputChans[i]; - memcpy (channels[numActiveChans], inputChans[i], sizeof (float) * (size_t) numSamples); - ++numActiveChans; - } - - for (int i = numInputs; i < numOutputs; ++i) - { - channels[numActiveChans] = outputChans[i]; - zeromem (channels[numActiveChans], sizeof (float) * (size_t) numSamples); - ++numActiveChans; - } - } - - AudioSampleBuffer buffer (channels, numActiveChans, numSamples); - - AudioSourceChannelInfo info (&buffer, 0, numSamples); - source->getNextAudioBlock (info); - - for (int i = info.buffer->getNumChannels(); --i >= 0;) - buffer.applyGainRamp (i, info.startSample, info.numSamples, lastGain, gain); - - lastGain = gain; - } - else - { - for (int i = 0; i < totalNumOutputChannels; ++i) - if (outputChannelData[i] != nullptr) - zeromem (outputChannelData[i], sizeof (float) * (size_t) numSamples); - } -} - -void AudioSourcePlayer::audioDeviceAboutToStart (AudioIODevice* device) -{ - prepareToPlay (device->getCurrentSampleRate(), - device->getCurrentBufferSizeSamples()); -} - -void AudioSourcePlayer::prepareToPlay (double newSampleRate, int newBufferSize) -{ - sampleRate = newSampleRate; - bufferSize = newBufferSize; - zeromem (channels, sizeof (channels)); - - if (source != nullptr) - source->prepareToPlay (bufferSize, sampleRate); -} - -void AudioSourcePlayer::audioDeviceStopped() -{ - if (source != nullptr) - source->releaseResources(); - - sampleRate = 0.0; - bufferSize = 0; - - tempBuffer.setSize (2, 8); -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h deleted file mode 100755 index 0a3751c..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioSourcePlayer.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOSOURCEPLAYER_H_INCLUDED -#define JUCE_AUDIOSOURCEPLAYER_H_INCLUDED - - -//============================================================================== -/** - Wrapper class to continuously stream audio from an audio source to an - AudioIODevice. - - This object acts as an AudioIODeviceCallback, so can be attached to an - output device, and will stream audio from an AudioSource. -*/ -class JUCE_API AudioSourcePlayer : public AudioIODeviceCallback -{ -public: - //============================================================================== - /** Creates an empty AudioSourcePlayer. */ - AudioSourcePlayer(); - - /** Destructor. - - Make sure this object isn't still being used by an AudioIODevice before - deleting it! - */ - virtual ~AudioSourcePlayer(); - - //============================================================================== - /** Changes the current audio source to play from. - - If the source passed in is already being used, this method will do nothing. - If the source is not null, its prepareToPlay() method will be called - before it starts being used for playback. - - If there's another source currently playing, its releaseResources() method - will be called after it has been swapped for the new one. - - @param newSource the new source to use - this will NOT be deleted - by this object when no longer needed, so it's the - caller's responsibility to manage it. - */ - void setSource (AudioSource* newSource); - - /** Returns the source that's playing. - May return nullptr if there's no source. - */ - AudioSource* getCurrentSource() const noexcept { return source; } - - /** Sets a gain to apply to the audio data. - @see getGain - */ - void setGain (float newGain) noexcept; - - /** Returns the current gain. - @see setGain - */ - float getGain() const noexcept { return gain; } - - //============================================================================== - /** Implementation of the AudioIODeviceCallback method. */ - void audioDeviceIOCallback (const float** inputChannelData, - int totalNumInputChannels, - float** outputChannelData, - int totalNumOutputChannels, - int numSamples) override; - - /** Implementation of the AudioIODeviceCallback method. */ - void audioDeviceAboutToStart (AudioIODevice* device) override; - - /** Implementation of the AudioIODeviceCallback method. */ - void audioDeviceStopped() override; - - /** An alternative method for initialising the source without an AudioIODevice. */ - void prepareToPlay (double sampleRate, int blockSize); - -private: - //============================================================================== - CriticalSection readLock; - AudioSource* source; - double sampleRate; - int bufferSize; - float* channels [128]; - float* outputChans [128]; - const float* inputChans [128]; - AudioSampleBuffer tempBuffer; - float lastGain, gain; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioSourcePlayer) -}; - - -#endif // JUCE_AUDIOSOURCEPLAYER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp deleted file mode 100755 index feb58a9..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.cpp +++ /dev/null @@ -1,298 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioTransportSource::AudioTransportSource() - : source (nullptr), - resamplerSource (nullptr), - bufferingSource (nullptr), - positionableSource (nullptr), - masterSource (nullptr), - gain (1.0f), - lastGain (1.0f), - playing (false), - stopped (true), - sampleRate (44100.0), - sourceSampleRate (0.0), - blockSize (128), - readAheadBufferSize (0), - isPrepared (false), - inputStreamEOF (false) -{ -} - -AudioTransportSource::~AudioTransportSource() -{ - setSource (nullptr); - releaseMasterResources(); -} - -void AudioTransportSource::setSource (PositionableAudioSource* const newSource, - int readAheadSize, TimeSliceThread* readAheadThread, - double sourceSampleRateToCorrectFor, int maxNumChannels) -{ - if (source == newSource) - { - if (source == nullptr) - return; - - setSource (nullptr, 0, nullptr); // deselect and reselect to avoid releasing resources wrongly - } - - readAheadBufferSize = readAheadSize; - sourceSampleRate = sourceSampleRateToCorrectFor; - - ResamplingAudioSource* newResamplerSource = nullptr; - BufferingAudioSource* newBufferingSource = nullptr; - PositionableAudioSource* newPositionableSource = nullptr; - AudioSource* newMasterSource = nullptr; - - ScopedPointer oldResamplerSource (resamplerSource); - ScopedPointer oldBufferingSource (bufferingSource); - AudioSource* oldMasterSource = masterSource; - - if (newSource != nullptr) - { - newPositionableSource = newSource; - - if (readAheadSize > 0) - { - // If you want to use a read-ahead buffer, you must also provide a TimeSliceThread - // for it to use! - jassert (readAheadThread != nullptr); - - newPositionableSource = newBufferingSource - = new BufferingAudioSource (newPositionableSource, *readAheadThread, - false, readAheadSize, maxNumChannels); - } - - newPositionableSource->setNextReadPosition (0); - - if (sourceSampleRateToCorrectFor > 0) - newMasterSource = newResamplerSource - = new ResamplingAudioSource (newPositionableSource, false, maxNumChannels); - else - newMasterSource = newPositionableSource; - - if (isPrepared) - { - if (newResamplerSource != nullptr && sourceSampleRate > 0 && sampleRate > 0) - newResamplerSource->setResamplingRatio (sourceSampleRate / sampleRate); - - newMasterSource->prepareToPlay (blockSize, sampleRate); - } - } - - { - const ScopedLock sl (callbackLock); - - source = newSource; - resamplerSource = newResamplerSource; - bufferingSource = newBufferingSource; - masterSource = newMasterSource; - positionableSource = newPositionableSource; - - inputStreamEOF = false; - playing = false; - } - - if (oldMasterSource != nullptr) - oldMasterSource->releaseResources(); -} - -void AudioTransportSource::start() -{ - if ((! playing) && masterSource != nullptr) - { - { - const ScopedLock sl (callbackLock); - playing = true; - stopped = false; - inputStreamEOF = false; - } - - sendChangeMessage(); - } -} - -void AudioTransportSource::stop() -{ - if (playing) - { - { - const ScopedLock sl (callbackLock); - playing = false; - } - - int n = 500; - while (--n >= 0 && ! stopped) - Thread::sleep (2); - - sendChangeMessage(); - } -} - -void AudioTransportSource::setPosition (double newPosition) -{ - if (sampleRate > 0.0) - setNextReadPosition ((int64) (newPosition * sampleRate)); -} - -double AudioTransportSource::getCurrentPosition() const -{ - if (sampleRate > 0.0) - return getNextReadPosition() / sampleRate; - - return 0.0; -} - -double AudioTransportSource::getLengthInSeconds() const -{ - if (sampleRate > 0.0) - return getTotalLength() / sampleRate; - - return 0.0; -} - -void AudioTransportSource::setNextReadPosition (int64 newPosition) -{ - if (positionableSource != nullptr) - { - if (sampleRate > 0 && sourceSampleRate > 0) - newPosition = (int64) (newPosition * sourceSampleRate / sampleRate); - - positionableSource->setNextReadPosition (newPosition); - - if (resamplerSource != nullptr) - resamplerSource->flushBuffers(); - - inputStreamEOF = false; - } -} - -int64 AudioTransportSource::getNextReadPosition() const -{ - if (positionableSource != nullptr) - { - const double ratio = (sampleRate > 0 && sourceSampleRate > 0) ? sampleRate / sourceSampleRate : 1.0; - return (int64) (positionableSource->getNextReadPosition() * ratio); - } - - return 0; -} - -int64 AudioTransportSource::getTotalLength() const -{ - const ScopedLock sl (callbackLock); - - if (positionableSource != nullptr) - { - const double ratio = (sampleRate > 0 && sourceSampleRate > 0) ? sampleRate / sourceSampleRate : 1.0; - return (int64) (positionableSource->getTotalLength() * ratio); - } - - return 0; -} - -bool AudioTransportSource::isLooping() const -{ - const ScopedLock sl (callbackLock); - return positionableSource != nullptr && positionableSource->isLooping(); -} - -void AudioTransportSource::setGain (const float newGain) noexcept -{ - gain = newGain; -} - -void AudioTransportSource::prepareToPlay (int samplesPerBlockExpected, double newSampleRate) -{ - const ScopedLock sl (callbackLock); - - sampleRate = newSampleRate; - blockSize = samplesPerBlockExpected; - - if (masterSource != nullptr) - masterSource->prepareToPlay (samplesPerBlockExpected, sampleRate); - - if (resamplerSource != nullptr && sourceSampleRate > 0) - resamplerSource->setResamplingRatio (sourceSampleRate / sampleRate); - - inputStreamEOF = false; - isPrepared = true; -} - -void AudioTransportSource::releaseMasterResources() -{ - const ScopedLock sl (callbackLock); - - if (masterSource != nullptr) - masterSource->releaseResources(); - - isPrepared = false; -} - -void AudioTransportSource::releaseResources() -{ - releaseMasterResources(); -} - -void AudioTransportSource::getNextAudioBlock (const AudioSourceChannelInfo& info) -{ - const ScopedLock sl (callbackLock); - - if (masterSource != nullptr && ! stopped) - { - masterSource->getNextAudioBlock (info); - - if (! playing) - { - // just stopped playing, so fade out the last block.. - for (int i = info.buffer->getNumChannels(); --i >= 0;) - info.buffer->applyGainRamp (i, info.startSample, jmin (256, info.numSamples), 1.0f, 0.0f); - - if (info.numSamples > 256) - info.buffer->clear (info.startSample + 256, info.numSamples - 256); - } - - if (positionableSource->getNextReadPosition() > positionableSource->getTotalLength() + 1 - && ! positionableSource->isLooping()) - { - playing = false; - inputStreamEOF = true; - sendChangeMessage(); - } - - stopped = ! playing; - - for (int i = info.buffer->getNumChannels(); --i >= 0;) - info.buffer->applyGainRamp (i, info.startSample, info.numSamples, lastGain, gain); - } - else - { - info.clearActiveBufferRegion(); - stopped = true; - } - - lastGain = gain; -} diff --git a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h b/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h deleted file mode 100755 index e60dee0..0000000 --- a/JuceLibraryCode/modules/juce_audio_devices/sources/juce_AudioTransportSource.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOTRANSPORTSOURCE_H_INCLUDED -#define JUCE_AUDIOTRANSPORTSOURCE_H_INCLUDED - - -//============================================================================== -/** - An AudioSource that takes a PositionableAudioSource and allows it to be - played, stopped, started, etc. - - This can also be told use a buffer and background thread to read ahead, and - if can correct for different sample-rates. - - You may want to use one of these along with an AudioSourcePlayer and AudioIODevice - to control playback of an audio file. - - @see AudioSource, AudioSourcePlayer -*/ -class JUCE_API AudioTransportSource : public PositionableAudioSource, - public ChangeBroadcaster -{ -public: - //============================================================================== - /** Creates an AudioTransportSource. - After creating one of these, use the setSource() method to select an input source. - */ - AudioTransportSource(); - - /** Destructor. */ - ~AudioTransportSource(); - - //============================================================================== - /** Sets the reader that is being used as the input source. - - This will stop playback, reset the position to 0 and change to the new reader. - - The source passed in will not be deleted by this object, so must be managed by - the caller. - - @param newSource the new input source to use. This may be zero - @param readAheadBufferSize a size of buffer to use for reading ahead. If this - is zero, no reading ahead will be done; if it's - greater than zero, a BufferingAudioSource will be used - to do the reading-ahead. If you set a non-zero value here, - you'll also need to set the readAheadThread parameter. - @param readAheadThread if you set readAheadBufferSize to a non-zero value, then - you'll also need to supply this TimeSliceThread object for - the background reader to use. The thread object must not be - deleted while the AudioTransport source is still using it. - @param sourceSampleRateToCorrectFor if this is non-zero, it specifies the sample - rate of the source, and playback will be sample-rate - adjusted to maintain playback at the correct pitch. If - this is 0, no sample-rate adjustment will be performed - @param maxNumChannels the maximum number of channels that may need to be played - */ - void setSource (PositionableAudioSource* newSource, - int readAheadBufferSize = 0, - TimeSliceThread* readAheadThread = nullptr, - double sourceSampleRateToCorrectFor = 0.0, - int maxNumChannels = 2); - - //============================================================================== - /** Changes the current playback position in the source stream. - - The next time the getNextAudioBlock() method is called, this - is the time from which it'll read data. - - @see getPosition - */ - void setPosition (double newPosition); - - /** Returns the position that the next data block will be read from - This is a time in seconds. - */ - double getCurrentPosition() const; - - /** Returns the stream's length in seconds. */ - double getLengthInSeconds() const; - - /** Returns true if the player has stopped because its input stream ran out of data. */ - bool hasStreamFinished() const noexcept { return inputStreamEOF; } - - //============================================================================== - /** Starts playing (if a source has been selected). - - If it starts playing, this will send a message to any ChangeListeners - that are registered with this object. - */ - void start(); - - /** Stops playing. - - If it's actually playing, this will send a message to any ChangeListeners - that are registered with this object. - */ - void stop(); - - /** Returns true if it's currently playing. */ - bool isPlaying() const noexcept { return playing; } - - //============================================================================== - /** Changes the gain to apply to the output. - @param newGain a factor by which to multiply the outgoing samples, - so 1.0 = 0dB, 0.5 = -6dB, 2.0 = 6dB, etc. - */ - void setGain (float newGain) noexcept; - - /** Returns the current gain setting. - @see setGain - */ - float getGain() const noexcept { return gain; } - - //============================================================================== - /** Implementation of the AudioSource method. */ - void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; - - /** Implementation of the AudioSource method. */ - void releaseResources() override; - - /** Implementation of the AudioSource method. */ - void getNextAudioBlock (const AudioSourceChannelInfo&) override; - - //============================================================================== - /** Implements the PositionableAudioSource method. */ - void setNextReadPosition (int64 newPosition) override; - - /** Implements the PositionableAudioSource method. */ - int64 getNextReadPosition() const override; - - /** Implements the PositionableAudioSource method. */ - int64 getTotalLength() const override; - - /** Implements the PositionableAudioSource method. */ - bool isLooping() const override; - -private: - //============================================================================== - PositionableAudioSource* source; - ResamplingAudioSource* resamplerSource; - BufferingAudioSource* bufferingSource; - PositionableAudioSource* positionableSource; - AudioSource* masterSource; - - CriticalSection callbackLock; - float volatile gain, lastGain; - bool volatile playing, stopped; - double sampleRate, sourceSampleRate; - int blockSize, readAheadBufferSize; - bool volatile isPrepared, inputStreamEOF; - - void releaseMasterResources(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioTransportSource) -}; - - -#endif // JUCE_AUDIOTRANSPORTSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt deleted file mode 100755 index 39992bd..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/Flac Licence.txt +++ /dev/null @@ -1,49 +0,0 @@ - -===================================================================== - -I've incorporated FLAC directly into the Juce codebase because it makes -things much easier than having to make all your builds link correctly to -the appropriate libraries on every different platform. - -I've made minimal changes to the FLAC code - just tweaked a few include paths -to make it build smoothly, added some headers to allow you to turn off FLAC -compilation, and commented-out a couple of unused bits of code. - -===================================================================== - - -The following license is the BSD-style license that comes with the -Flac distribution, and which applies just to the files I've -included in this directory. For more info, and to get the rest of the -distribution, visit the Flac homepage: flac.sourceforge.net - -===================================================================== - -Copyright (C) 2000,2001,2002,2003,2004,2005,2006 Josh Coalson - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -- Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -- Neither the name of the Xiph.org Foundation nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR -CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h deleted file mode 100755 index c7f3032..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/all.h +++ /dev/null @@ -1,371 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__ALL_H -#define FLAC__ALL_H - -#include "export.h" - -#include "assert.h" -#include "callback.h" -#include "format.h" -#include "metadata.h" -#include "ordinals.h" -#include "stream_decoder.h" -#include "stream_encoder.h" - -/** \mainpage - * - * \section intro Introduction - * - * This is the documentation for the FLAC C and C++ APIs. It is - * highly interconnected; this introduction should give you a top - * level idea of the structure and how to find the information you - * need. As a prerequisite you should have at least a basic - * knowledge of the FLAC format, documented - * here. - * - * \section c_api FLAC C API - * - * The FLAC C API is the interface to libFLAC, a set of structures - * describing the components of FLAC streams, and functions for - * encoding and decoding streams, as well as manipulating FLAC - * metadata in files. The public include files will be installed - * in your include area (for example /usr/include/FLAC/...). - * - * By writing a little code and linking against libFLAC, it is - * relatively easy to add FLAC support to another program. The - * library is licensed under Xiph's BSD license. - * Complete source code of libFLAC as well as the command-line - * encoder and plugins is available and is a useful source of - * examples. - * - * Aside from encoders and decoders, libFLAC provides a powerful - * metadata interface for manipulating metadata in FLAC files. It - * allows the user to add, delete, and modify FLAC metadata blocks - * and it can automatically take advantage of PADDING blocks to avoid - * rewriting the entire FLAC file when changing the size of the - * metadata. - * - * libFLAC usually only requires the standard C library and C math - * library. In particular, threading is not used so there is no - * dependency on a thread library. However, libFLAC does not use - * global variables and should be thread-safe. - * - * libFLAC also supports encoding to and decoding from Ogg FLAC. - * However the metadata editing interfaces currently have limited - * read-only support for Ogg FLAC files. - * - * \section cpp_api FLAC C++ API - * - * The FLAC C++ API is a set of classes that encapsulate the - * structures and functions in libFLAC. They provide slightly more - * functionality with respect to metadata but are otherwise - * equivalent. For the most part, they share the same usage as - * their counterparts in libFLAC, and the FLAC C API documentation - * can be used as a supplement. The public include files - * for the C++ API will be installed in your include area (for - * example /usr/include/FLAC++/...). - * - * libFLAC++ is also licensed under - * Xiph's BSD license. - * - * \section getting_started Getting Started - * - * A good starting point for learning the API is to browse through - * the modules. Modules are logical - * groupings of related functions or classes, which correspond roughly - * to header files or sections of header files. Each module includes a - * detailed description of the general usage of its functions or - * classes. - * - * From there you can go on to look at the documentation of - * individual functions. You can see different views of the individual - * functions through the links in top bar across this page. - * - * If you prefer a more hands-on approach, you can jump right to some - * example code. - * - * \section porting_guide Porting Guide - * - * Starting with FLAC 1.1.3 a \link porting Porting Guide \endlink - * has been introduced which gives detailed instructions on how to - * port your code to newer versions of FLAC. - * - * \section embedded_developers Embedded Developers - * - * libFLAC has grown larger over time as more functionality has been - * included, but much of it may be unnecessary for a particular embedded - * implementation. Unused parts may be pruned by some simple editing of - * src/libFLAC/Makefile.am. In general, the decoders, encoders, and - * metadata interface are all independent from each other. - * - * It is easiest to just describe the dependencies: - * - * - All modules depend on the \link flac_format Format \endlink module. - * - The decoders and encoders depend on the bitbuffer. - * - The decoder is independent of the encoder. The encoder uses the - * decoder because of the verify feature, but this can be removed if - * not needed. - * - Parts of the metadata interface require the stream decoder (but not - * the encoder). - * - Ogg support is selectable through the compile time macro - * \c FLAC__HAS_OGG. - * - * For example, if your application only requires the stream decoder, no - * encoder, and no metadata interface, you can remove the stream encoder - * and the metadata interface, which will greatly reduce the size of the - * library. - * - * Also, there are several places in the libFLAC code with comments marked - * with "OPT:" where a #define can be changed to enable code that might be - * faster on a specific platform. Experimenting with these can yield faster - * binaries. - */ - -/** \defgroup porting Porting Guide for New Versions - * - * This module describes differences in the library interfaces from - * version to version. It assists in the porting of code that uses - * the libraries to newer versions of FLAC. - * - * One simple facility for making porting easier that has been added - * in FLAC 1.1.3 is a set of \c #defines in \c export.h of each - * library's includes (e.g. \c include/FLAC/export.h). The - * \c #defines mirror the libraries' - * libtool version numbers, - * e.g. in libFLAC there are \c FLAC_API_VERSION_CURRENT, - * \c FLAC_API_VERSION_REVISION, and \c FLAC_API_VERSION_AGE. - * These can be used to support multiple versions of an API during the - * transition phase, e.g. - * - * \code - * #if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7 - * legacy code - * #else - * new code - * #endif - * \endcode - * - * The the source will work for multiple versions and the legacy code can - * easily be removed when the transition is complete. - * - * Another available symbol is FLAC_API_SUPPORTS_OGG_FLAC (defined in - * include/FLAC/export.h), which can be used to determine whether or not - * the library has been compiled with support for Ogg FLAC. This is - * simpler than trying to call an Ogg init function and catching the - * error. - */ - -/** \defgroup porting_1_1_2_to_1_1_3 Porting from FLAC 1.1.2 to 1.1.3 - * \ingroup porting - * - * \brief - * This module describes porting from FLAC 1.1.2 to FLAC 1.1.3. - * - * The main change between the APIs in 1.1.2 and 1.1.3 is that they have - * been simplified. First, libOggFLAC has been merged into libFLAC and - * libOggFLAC++ has been merged into libFLAC++. Second, both the three - * decoding layers and three encoding layers have been merged into a - * single stream decoder and stream encoder. That is, the functionality - * of FLAC__SeekableStreamDecoder and FLAC__FileDecoder has been merged - * into FLAC__StreamDecoder, and FLAC__SeekableStreamEncoder and - * FLAC__FileEncoder into FLAC__StreamEncoder. Only the - * FLAC__StreamDecoder and FLAC__StreamEncoder remain. What this means - * is there is now a single API that can be used to encode or decode - * streams to/from native FLAC or Ogg FLAC and the single API can work - * on both seekable and non-seekable streams. - * - * Instead of creating an encoder or decoder of a certain layer, now the - * client will always create a FLAC__StreamEncoder or - * FLAC__StreamDecoder. The old layers are now differentiated by the - * initialization function. For example, for the decoder, - * FLAC__stream_decoder_init() has been replaced by - * FLAC__stream_decoder_init_stream(). This init function takes - * callbacks for the I/O, and the seeking callbacks are optional. This - * allows the client to use the same object for seekable and - * non-seekable streams. For decoding a FLAC file directly, the client - * can use FLAC__stream_decoder_init_file() and pass just a filename - * and fewer callbacks; most of the other callbacks are supplied - * internally. For situations where fopen()ing by filename is not - * possible (e.g. Unicode filenames on Windows) the client can instead - * open the file itself and supply the FILE* to - * FLAC__stream_decoder_init_FILE(). The init functions now returns a - * FLAC__StreamDecoderInitStatus instead of FLAC__StreamDecoderState. - * Since the callbacks and client data are now passed to the init - * function, the FLAC__stream_decoder_set_*_callback() functions and - * FLAC__stream_decoder_set_client_data() are no longer needed. The - * rest of the calls to the decoder are the same as before. - * - * There are counterpart init functions for Ogg FLAC, e.g. - * FLAC__stream_decoder_init_ogg_stream(). All the rest of the calls - * and callbacks are the same as for native FLAC. - * - * As an example, in FLAC 1.1.2 a seekable stream decoder would have - * been set up like so: - * - * \code - * FLAC__SeekableStreamDecoder *decoder = FLAC__seekable_stream_decoder_new(); - * if(decoder == NULL) do_something; - * FLAC__seekable_stream_decoder_set_md5_checking(decoder, true); - * [... other settings ...] - * FLAC__seekable_stream_decoder_set_read_callback(decoder, my_read_callback); - * FLAC__seekable_stream_decoder_set_seek_callback(decoder, my_seek_callback); - * FLAC__seekable_stream_decoder_set_tell_callback(decoder, my_tell_callback); - * FLAC__seekable_stream_decoder_set_length_callback(decoder, my_length_callback); - * FLAC__seekable_stream_decoder_set_eof_callback(decoder, my_eof_callback); - * FLAC__seekable_stream_decoder_set_write_callback(decoder, my_write_callback); - * FLAC__seekable_stream_decoder_set_metadata_callback(decoder, my_metadata_callback); - * FLAC__seekable_stream_decoder_set_error_callback(decoder, my_error_callback); - * FLAC__seekable_stream_decoder_set_client_data(decoder, my_client_data); - * if(FLAC__seekable_stream_decoder_init(decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK) do_something; - * \endcode - * - * In FLAC 1.1.3 it is like this: - * - * \code - * FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new(); - * if(decoder == NULL) do_something; - * FLAC__stream_decoder_set_md5_checking(decoder, true); - * [... other settings ...] - * if(FLAC__stream_decoder_init_stream( - * decoder, - * my_read_callback, - * my_seek_callback, // or NULL - * my_tell_callback, // or NULL - * my_length_callback, // or NULL - * my_eof_callback, // or NULL - * my_write_callback, - * my_metadata_callback, // or NULL - * my_error_callback, - * my_client_data - * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; - * \endcode - * - * or you could do; - * - * \code - * [...] - * FILE *file = fopen("somefile.flac","rb"); - * if(file == NULL) do_somthing; - * if(FLAC__stream_decoder_init_FILE( - * decoder, - * file, - * my_write_callback, - * my_metadata_callback, // or NULL - * my_error_callback, - * my_client_data - * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; - * \endcode - * - * or just: - * - * \code - * [...] - * if(FLAC__stream_decoder_init_file( - * decoder, - * "somefile.flac", - * my_write_callback, - * my_metadata_callback, // or NULL - * my_error_callback, - * my_client_data - * ) != FLAC__STREAM_DECODER_INIT_STATUS_OK) do_something; - * \endcode - * - * Another small change to the decoder is in how it handles unparseable - * streams. Before, when the decoder found an unparseable stream - * (reserved for when the decoder encounters a stream from a future - * encoder that it can't parse), it changed the state to - * \c FLAC__STREAM_DECODER_UNPARSEABLE_STREAM. Now the decoder instead - * drops sync and calls the error callback with a new error code - * \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM. This is - * more robust. If your error callback does not discriminate on the the - * error state, your code does not need to be changed. - * - * The encoder now has a new setting: - * FLAC__stream_encoder_set_apodization(). This is for setting the - * method used to window the data before LPC analysis. You only need to - * add a call to this function if the default is not suitable. There - * are also two new convenience functions that may be useful: - * FLAC__metadata_object_cuesheet_calculate_cddb_id() and - * FLAC__metadata_get_cuesheet(). - * - * The \a bytes parameter to FLAC__StreamDecoderReadCallback, - * FLAC__StreamEncoderReadCallback, and FLAC__StreamEncoderWriteCallback - * is now \c size_t instead of \c unsigned. - */ - -/** \defgroup porting_1_1_3_to_1_1_4 Porting from FLAC 1.1.3 to 1.1.4 - * \ingroup porting - * - * \brief - * This module describes porting from FLAC 1.1.3 to FLAC 1.1.4. - * - * There were no changes to any of the interfaces from 1.1.3 to 1.1.4. - * There was a slight change in the implementation of - * FLAC__stream_encoder_set_metadata(); the function now makes a copy - * of the \a metadata array of pointers so the client no longer needs - * to maintain it after the call. The objects themselves that are - * pointed to by the array are still not copied though and must be - * maintained until the call to FLAC__stream_encoder_finish(). - */ - -/** \defgroup porting_1_1_4_to_1_2_0 Porting from FLAC 1.1.4 to 1.2.0 - * \ingroup porting - * - * \brief - * This module describes porting from FLAC 1.1.4 to FLAC 1.2.0. - * - * There were only very minor changes to the interfaces from 1.1.4 to 1.2.0. - * In libFLAC, \c FLAC__format_sample_rate_is_subset() was added. - * In libFLAC++, \c FLAC::Decoder::Stream::get_decode_position() was added. - * - * Finally, value of the constant \c FLAC__FRAME_HEADER_RESERVED_LEN - * has changed to reflect the conversion of one of the reserved bits - * into active use. It used to be \c 2 and now is \c 1. However the - * FLAC frame header length has not changed, so to skip the proper - * number of bits, use \c FLAC__FRAME_HEADER_RESERVED_LEN + - * \c FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN - */ - -/** \defgroup flac FLAC C API - * - * The FLAC C API is the interface to libFLAC, a set of structures - * describing the components of FLAC streams, and functions for - * encoding and decoding streams, as well as manipulating FLAC - * metadata in files. - * - * You should start with the format components as all other modules - * are dependent on it. - */ - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h deleted file mode 100755 index 3aab81c..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/alloc.h +++ /dev/null @@ -1,209 +0,0 @@ -/* alloc - Convenience routines for safely allocating memory - * Copyright (C) 2007-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__SHARE__ALLOC_H -#define FLAC__SHARE__ALLOC_H - -#ifdef HAVE_CONFIG_H -# include -#endif - -/* WATCHOUT: for c++ you may have to #define __STDC_LIMIT_MACROS 1 real early - * before #including this file, otherwise SIZE_MAX might not be defined - */ - -#include /* for SIZE_MAX */ -#if HAVE_STDINT_H -#include /* for SIZE_MAX in case limits.h didn't get it */ -#endif -#include /* for size_t, malloc(), etc */ -#include "compat.h" - -#ifndef SIZE_MAX -# ifndef SIZE_T_MAX -# ifdef _MSC_VER -# ifdef _WIN64 -# define SIZE_T_MAX 0xffffffffffffffffui64 -# else -# define SIZE_T_MAX 0xffffffff -# endif -# else -# error -# endif -# endif -# define SIZE_MAX SIZE_T_MAX -#endif - -/* avoid malloc()ing 0 bytes, see: - * https://www.securecoding.cert.org/confluence/display/seccode/MEM04-A.+Do+not+make+assumptions+about+the+result+of+allocating+0+bytes?focusedCommentId=5407003 -*/ -static inline void *safe_malloc_(size_t size) -{ - /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(!size) - size++; - return malloc(size); -} - -static inline void *safe_calloc_(size_t nmemb, size_t size) -{ - if(!nmemb || !size) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - return calloc(nmemb, size); -} - -/*@@@@ there's probably a better way to prevent overflows when allocating untrusted sums but this works for now */ - -static inline void *safe_malloc_add_2op_(size_t size1, size_t size2) -{ - size2 += size1; - if(size2 < size1) - return 0; - return safe_malloc_(size2); -} - -static inline void *safe_malloc_add_3op_(size_t size1, size_t size2, size_t size3) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - return safe_malloc_(size3); -} - -static inline void *safe_malloc_add_4op_(size_t size1, size_t size2, size_t size3, size_t size4) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - size4 += size3; - if(size4 < size3) - return 0; - return safe_malloc_(size4); -} - -void *safe_malloc_mul_2op_(size_t size1, size_t size2) ; - -static inline void *safe_malloc_mul_3op_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || !size2 || !size3) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(size1 > SIZE_MAX / size2) - return 0; - size1 *= size2; - if(size1 > SIZE_MAX / size3) - return 0; - return malloc(size1*size3); -} - -/* size1*size2 + size3 */ -static inline void *safe_malloc_mul2add_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || !size2) - return safe_malloc_(size3); - if(size1 > SIZE_MAX / size2) - return 0; - return safe_malloc_add_2op_(size1*size2, size3); -} - -/* size1 * (size2 + size3) */ -static inline void *safe_malloc_muladd2_(size_t size1, size_t size2, size_t size3) -{ - if(!size1 || (!size2 && !size3)) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - size2 += size3; - if(size2 < size3) - return 0; - if(size1 > SIZE_MAX / size2) - return 0; - return malloc(size1*size2); -} - -static inline void *safe_realloc_add_2op_(void *ptr, size_t size1, size_t size2) -{ - size2 += size1; - if(size2 < size1) - return 0; - return realloc(ptr, size2); -} - -static inline void *safe_realloc_add_3op_(void *ptr, size_t size1, size_t size2, size_t size3) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - return realloc(ptr, size3); -} - -static inline void *safe_realloc_add_4op_(void *ptr, size_t size1, size_t size2, size_t size3, size_t size4) -{ - size2 += size1; - if(size2 < size1) - return 0; - size3 += size2; - if(size3 < size2) - return 0; - size4 += size3; - if(size4 < size3) - return 0; - return realloc(ptr, size4); -} - -static inline void *safe_realloc_mul_2op_(void *ptr, size_t size1, size_t size2) -{ - if(!size1 || !size2) - return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ - if(size1 > SIZE_MAX / size2) - return 0; - return realloc(ptr, size1*size2); -} - -/* size1 * (size2 + size3) */ -static inline void *safe_realloc_muladd2_(void *ptr, size_t size1, size_t size2, size_t size3) -{ - if(!size1 || (!size2 && !size3)) - return realloc(ptr, 0); /* preserve POSIX realloc(ptr, 0) semantics */ - size2 += size3; - if(size2 < size3) - return 0; - return safe_realloc_mul_2op_(ptr, size1, size2); -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h deleted file mode 100755 index f02aeac..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/assert.h +++ /dev/null @@ -1,46 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__ASSERT_H -#define FLAC__ASSERT_H - -/* we need this since some compilers (like MSVC) leave assert()s on release code (and we don't want to use their ASSERT) */ -#ifdef DEBUG -#include -#define FLAC__ASSERT(x) assert(x) -#define FLAC__ASSERT_DECLARATION(x) x -#else -#define FLAC__ASSERT(x) -#define FLAC__ASSERT_DECLARATION(x) -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h deleted file mode 100755 index 9928843..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/callback.h +++ /dev/null @@ -1,185 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__CALLBACK_H -#define FLAC__CALLBACK_H - -#include "ordinals.h" -#include /* for size_t */ - -/** \file include/FLAC/callback.h - * - * \brief - * This module defines the structures for describing I/O callbacks - * to the other FLAC interfaces. - * - * See the detailed documentation for callbacks in the - * \link flac_callbacks callbacks \endlink module. - */ - -/** \defgroup flac_callbacks FLAC/callback.h: I/O callback structures - * \ingroup flac - * - * \brief - * This module defines the structures for describing I/O callbacks - * to the other FLAC interfaces. - * - * The purpose of the I/O callback functions is to create a common way - * for the metadata interfaces to handle I/O. - * - * Originally the metadata interfaces required filenames as the way of - * specifying FLAC files to operate on. This is problematic in some - * environments so there is an additional option to specify a set of - * callbacks for doing I/O on the FLAC file, instead of the filename. - * - * In addition to the callbacks, a FLAC__IOHandle type is defined as an - * opaque structure for a data source. - * - * The callback function prototypes are similar (but not identical) to the - * stdio functions fread, fwrite, fseek, ftell, feof, and fclose. If you use - * stdio streams to implement the callbacks, you can pass fread, fwrite, and - * fclose anywhere a FLAC__IOCallback_Read, FLAC__IOCallback_Write, or - * FLAC__IOCallback_Close is required, and a FILE* anywhere a FLAC__IOHandle - * is required. \warning You generally CANNOT directly use fseek or ftell - * for FLAC__IOCallback_Seek or FLAC__IOCallback_Tell since on most systems - * these use 32-bit offsets and FLAC requires 64-bit offsets to deal with - * large files. You will have to find an equivalent function (e.g. ftello), - * or write a wrapper. The same is true for feof() since this is usually - * implemented as a macro, not as a function whose address can be taken. - * - * \{ - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** This is the opaque handle type used by the callbacks. Typically - * this is a \c FILE* or address of a file descriptor. - */ -typedef void* FLAC__IOHandle; - -/** Signature for the read callback. - * The signature and semantics match POSIX fread() implementations - * and can generally be used interchangeably. - * - * \param ptr The address of the read buffer. - * \param size The size of the records to be read. - * \param nmemb The number of records to be read. - * \param handle The handle to the data source. - * \retval size_t - * The number of records read. - */ -typedef size_t (*FLAC__IOCallback_Read) (void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); - -/** Signature for the write callback. - * The signature and semantics match POSIX fwrite() implementations - * and can generally be used interchangeably. - * - * \param ptr The address of the write buffer. - * \param size The size of the records to be written. - * \param nmemb The number of records to be written. - * \param handle The handle to the data source. - * \retval size_t - * The number of records written. - */ -typedef size_t (*FLAC__IOCallback_Write) (const void *ptr, size_t size, size_t nmemb, FLAC__IOHandle handle); - -/** Signature for the seek callback. - * The signature and semantics mostly match POSIX fseek() WITH ONE IMPORTANT - * EXCEPTION: the offset is a 64-bit type whereas fseek() is generally 'long' - * and 32-bits wide. - * - * \param handle The handle to the data source. - * \param offset The new position, relative to \a whence - * \param whence \c SEEK_SET, \c SEEK_CUR, or \c SEEK_END - * \retval int - * \c 0 on success, \c -1 on error. - */ -typedef int (*FLAC__IOCallback_Seek) (FLAC__IOHandle handle, FLAC__int64 offset, int whence); - -/** Signature for the tell callback. - * The signature and semantics mostly match POSIX ftell() WITH ONE IMPORTANT - * EXCEPTION: the offset is a 64-bit type whereas ftell() is generally 'long' - * and 32-bits wide. - * - * \param handle The handle to the data source. - * \retval FLAC__int64 - * The current position on success, \c -1 on error. - */ -typedef FLAC__int64 (*FLAC__IOCallback_Tell) (FLAC__IOHandle handle); - -/** Signature for the EOF callback. - * The signature and semantics mostly match POSIX feof() but WATCHOUT: - * on many systems, feof() is a macro, so in this case a wrapper function - * must be provided instead. - * - * \param handle The handle to the data source. - * \retval int - * \c 0 if not at end of file, nonzero if at end of file. - */ -typedef int (*FLAC__IOCallback_Eof) (FLAC__IOHandle handle); - -/** Signature for the close callback. - * The signature and semantics match POSIX fclose() implementations - * and can generally be used interchangeably. - * - * \param handle The handle to the data source. - * \retval int - * \c 0 on success, \c EOF on error. - */ -typedef int (*FLAC__IOCallback_Close) (FLAC__IOHandle handle); - -/** A structure for holding a set of callbacks. - * Each FLAC interface that requires a FLAC__IOCallbacks structure will - * describe which of the callbacks are required. The ones that are not - * required may be set to NULL. - * - * If the seek requirement for an interface is optional, you can signify that - * a data sorce is not seekable by setting the \a seek field to \c NULL. - */ -typedef struct { - FLAC__IOCallback_Read read; - FLAC__IOCallback_Write write; - FLAC__IOCallback_Seek seek; - FLAC__IOCallback_Tell tell; - FLAC__IOCallback_Eof eof; - FLAC__IOCallback_Close close; -} FLAC__IOCallbacks; - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h deleted file mode 100755 index a3dc7c7..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/compat.h +++ /dev/null @@ -1,200 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2012-2014 Xiph.org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* This is the prefered location of all CPP hackery to make $random_compiler - * work like something approaching a C99 (or maybe more accurately GNU99) - * compiler. - * - * It is assumed that this header will be included after "config.h". - */ - -#ifndef FLAC__SHARE__COMPAT_H -#define FLAC__SHARE__COMPAT_H - -#if defined _WIN32 && !defined __CYGWIN__ -/* where MSVC puts unlink() */ -# include -#else -# include -#endif - -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ -#include /* for off_t */ -#define FLAC__off_t __int64 /* use this instead of off_t to fix the 2 GB limit */ -#if !defined __MINGW32__ -#define fseeko _fseeki64 -#define ftello _ftelli64 -#else /* MinGW */ -#if !defined(HAVE_FSEEKO) -#define fseeko fseeko64 -#define ftello ftello64 -#endif -#endif -#else -#define FLAC__off_t off_t -#endif - -#if HAVE_INTTYPES_H -#define __STDC_FORMAT_MACROS -#include -#endif - -#if defined(_MSC_VER) -#define strtoll _strtoi64 -#define strtoull _strtoui64 -#endif - -#if defined(_MSC_VER) -#define inline __inline -#endif - -#if defined __INTEL_COMPILER || (defined _MSC_VER && defined _WIN64) -/* MSVS generates VERY slow 32-bit code with __restrict */ -#define flac_restrict __restrict -#elif defined __GNUC__ -#define flac_restrict __restrict__ -#else -#define flac_restrict -#endif - -#define FLAC__U64L(x) x##ULL - -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ -#define FLAC__STRCASECMP stricmp -#define FLAC__STRNCASECMP strnicmp -#else -#define FLAC__STRCASECMP strcasecmp -#define FLAC__STRNCASECMP strncasecmp -#endif - -#if defined _MSC_VER || defined __MINGW32__ || defined __CYGWIN__ || defined __EMX__ -#include /* for _setmode(), chmod() */ -#include /* for _O_BINARY */ -#else -#include /* for chown(), unlink() */ -#endif - -#if defined _MSC_VER || defined __BORLANDC__ || defined __MINGW32__ -#if defined __BORLANDC__ -#include /* for utime() */ -#else -#include /* for utime() */ -#endif -#else -#include /* some flavors of BSD (like OS X) require this to get time_t */ -#include /* for utime() */ -#endif - -#if defined _MSC_VER -# if _MSC_VER >= 1600 -/* Visual Studio 2010 has decent C99 support */ -# include -# define PRIu64 "llu" -# define PRId64 "lld" -# define PRIx64 "llx" -# else -# include -# ifndef UINT32_MAX -# define UINT32_MAX _UI32_MAX -# endif - typedef unsigned __int64 uint64_t; - typedef unsigned __int32 uint32_t; - typedef unsigned __int16 uint16_t; - typedef unsigned __int8 uint8_t; - typedef __int64 int64_t; - typedef __int32 int32_t; - typedef __int16 int16_t; - typedef __int8 int8_t; -# define PRIu64 "I64u" -# define PRId64 "I64d" -# define PRIx64 "I64x" -# endif -#endif /* defined _MSC_VER */ - -#ifdef _WIN32 -/* All char* strings are in UTF-8 format. Added to support Unicode files on Windows */ -#include "win_utf8_io.h" - -#define flac_printf printf_utf8 -#define flac_fprintf fprintf_utf8 -#define flac_vfprintf vfprintf_utf8 -#define flac_fopen fopen_utf8 -#define flac_chmod chmod_utf8 -#define flac_utime utime_utf8 -#define flac_unlink unlink_utf8 -#define flac_rename rename_utf8 -#define flac_stat _stat64_utf8 - -#else - -#define flac_printf printf -#define flac_fprintf fprintf -#define flac_vfprintf vfprintf -#define flac_fopen fopen -#define flac_chmod chmod -#define flac_utime utime -#define flac_unlink unlink -#define flac_rename rename -#define flac_stat stat - -#endif - -#ifdef _WIN32 -#define flac_stat_s __stat64 /* stat struct */ -#define flac_fstat _fstat64 -#else -#define flac_stat_s stat /* stat struct */ -#define flac_fstat fstat -#endif - -#ifndef M_LN2 -#define M_LN2 0.69314718055994530942 -#endif -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -/* FLAC needs to compile and work correctly on systems with a normal ISO C99 - * snprintf as well as Microsoft Visual Studio which has an non-standards - * conformant snprint_s function. - * - * This function wraps the MS version to behave more like the the ISO version. - */ -#ifdef __cplusplus -extern "C" { -#endif -int flac_snprintf(char *str, size_t size, const char *fmt, ...); -int flac_vsnprintf(char *str, size_t size, const char *fmt, va_list va); -#ifdef __cplusplus -}; -#endif - -#endif /* FLAC__SHARE__COMPAT_H */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h deleted file mode 100755 index b2a7e85..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/endswap.h +++ /dev/null @@ -1,78 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2012-2014 Xiph.org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* It is assumed that this header will be included after "config.h". */ - -#if HAVE_BSWAP32 /* GCC and Clang */ - -/* GCC prior to 4.8 didn't provide bswap16 on x86_64 */ -#if ! HAVE_BSWAP16 -static inline unsigned short __builtin_bswap16(unsigned short a) -{ - return (a<<8)|(a>>8); -} -#endif - -#define ENDSWAP_16(x) (__builtin_bswap16 (x)) -#define ENDSWAP_32(x) (__builtin_bswap32 (x)) - -#elif defined _MSC_VER /* Windows. Apparently in . */ - -#define ENDSWAP_16(x) (_byteswap_ushort (x)) -#define ENDSWAP_32(x) (_byteswap_ulong (x)) - -#elif defined HAVE_BYTESWAP_H /* Linux */ - -#include - -#define ENDSWAP_16(x) (bswap_16 (x)) -#define ENDSWAP_32(x) (bswap_32 (x)) - -#else - -#define ENDSWAP_16(x) ((((x) >> 8) & 0xFF) | (((x) & 0xFF) << 8)) -#define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) | (((x) >> 8) & 0xFF00) | (((x) & 0xFF00) << 8) | (((x) & 0xFF) << 24)) - -#endif - - -/* Host to little-endian byte swapping. */ -#if CPU_IS_BIG_ENDIAN - -#define H2LE_16(x) ENDSWAP_16 (x) -#define H2LE_32(x) ENDSWAP_32 (x) - -#else - -#define H2LE_16(x) (x) -#define H2LE_32(x) (x) - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h deleted file mode 100755 index 30f018b..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/export.h +++ /dev/null @@ -1,97 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__EXPORT_H -#define FLAC__EXPORT_H - -/** \file include/FLAC/export.h - * - * \brief - * This module contains #defines and symbols for exporting function - * calls, and providing version information and compiled-in features. - * - * See the \link flac_export export \endlink module. - */ - -/** \defgroup flac_export FLAC/export.h: export symbols - * \ingroup flac - * - * \brief - * This module contains #defines and symbols for exporting function - * calls, and providing version information and compiled-in features. - * - * If you are compiling with MSVC and will link to the static library - * (libFLAC.lib) you should define FLAC__NO_DLL in your project to - * make sure the symbols are exported properly. - * - * \{ - */ - -#if defined(FLAC__NO_DLL) -#define FLAC_API - -#elif defined(_MSC_VER) -#ifdef FLAC_API_EXPORTS -#define FLAC_API __declspec(dllexport) -#else -#define FLAC_API __declspec(dllimport) -#endif - -#elif defined(FLAC__USE_VISIBILITY_ATTR) -#define FLAC_API __attribute__ ((visibility ("default"))) - -#else -#define FLAC_API - -#endif - -/** These #defines will mirror the libtool-based library version number, see - * http://www.gnu.org/software/libtool/manual/libtool.html#Libtool-versioning - */ -#define FLAC_API_VERSION_CURRENT 11 -#define FLAC_API_VERSION_REVISION 0 /**< see above */ -#define FLAC_API_VERSION_AGE 3 /**< see above */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** \c 1 if the library has been compiled with support for Ogg FLAC, else \c 0. */ -extern FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC; - -#ifdef __cplusplus -} -#endif - -/* \} */ - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h deleted file mode 100755 index a151b67..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/format.h +++ /dev/null @@ -1,1025 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__FORMAT_H -#define FLAC__FORMAT_H - -#include "export.h" -#include "ordinals.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** \file include/FLAC/format.h - * - * \brief - * This module contains structure definitions for the representation - * of FLAC format components in memory. These are the basic - * structures used by the rest of the interfaces. - * - * See the detailed documentation in the - * \link flac_format format \endlink module. - */ - -/** \defgroup flac_format FLAC/format.h: format components - * \ingroup flac - * - * \brief - * This module contains structure definitions for the representation - * of FLAC format components in memory. These are the basic - * structures used by the rest of the interfaces. - * - * First, you should be familiar with the - * FLAC format. Many of the values here - * follow directly from the specification. As a user of libFLAC, the - * interesting parts really are the structures that describe the frame - * header and metadata blocks. - * - * The format structures here are very primitive, designed to store - * information in an efficient way. Reading information from the - * structures is easy but creating or modifying them directly is - * more complex. For the most part, as a user of a library, editing - * is not necessary; however, for metadata blocks it is, so there are - * convenience functions provided in the \link flac_metadata metadata - * module \endlink to simplify the manipulation of metadata blocks. - * - * \note - * It's not the best convention, but symbols ending in _LEN are in bits - * and _LENGTH are in bytes. _LENGTH symbols are \#defines instead of - * global variables because they are usually used when declaring byte - * arrays and some compilers require compile-time knowledge of array - * sizes when declared on the stack. - * - * \{ - */ - - -/* - Most of the values described in this file are defined by the FLAC - format specification. There is nothing to tune here. -*/ - -/** The largest legal metadata type code. */ -#define FLAC__MAX_METADATA_TYPE_CODE (126u) - -/** The minimum block size, in samples, permitted by the format. */ -#define FLAC__MIN_BLOCK_SIZE (16u) - -/** The maximum block size, in samples, permitted by the format. */ -#define FLAC__MAX_BLOCK_SIZE (65535u) - -/** The maximum block size, in samples, permitted by the FLAC subset for - * sample rates up to 48kHz. */ -#define FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ (4608u) - -/** The maximum number of channels permitted by the format. */ -#define FLAC__MAX_CHANNELS (8u) - -/** The minimum sample resolution permitted by the format. */ -#define FLAC__MIN_BITS_PER_SAMPLE (4u) - -/** The maximum sample resolution permitted by the format. */ -#define FLAC__MAX_BITS_PER_SAMPLE (32u) - -/** The maximum sample resolution permitted by libFLAC. - * - * \warning - * FLAC__MAX_BITS_PER_SAMPLE is the limit of the FLAC format. However, - * the reference encoder/decoder is currently limited to 24 bits because - * of prevalent 32-bit math, so make sure and use this value when - * appropriate. - */ -#define FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE (24u) - -/** The maximum sample rate permitted by the format. The value is - * ((2 ^ 16) - 1) * 10; see FLAC format - * as to why. - */ -#define FLAC__MAX_SAMPLE_RATE (655350u) - -/** The maximum LPC order permitted by the format. */ -#define FLAC__MAX_LPC_ORDER (32u) - -/** The maximum LPC order permitted by the FLAC subset for sample rates - * up to 48kHz. */ -#define FLAC__SUBSET_MAX_LPC_ORDER_48000HZ (12u) - -/** The minimum quantized linear predictor coefficient precision - * permitted by the format. - */ -#define FLAC__MIN_QLP_COEFF_PRECISION (5u) - -/** The maximum quantized linear predictor coefficient precision - * permitted by the format. - */ -#define FLAC__MAX_QLP_COEFF_PRECISION (15u) - -/** The maximum order of the fixed predictors permitted by the format. */ -#define FLAC__MAX_FIXED_ORDER (4u) - -/** The maximum Rice partition order permitted by the format. */ -#define FLAC__MAX_RICE_PARTITION_ORDER (15u) - -/** The maximum Rice partition order permitted by the FLAC Subset. */ -#define FLAC__SUBSET_MAX_RICE_PARTITION_ORDER (8u) - -/** The version string of the release, stamped onto the libraries and binaries. - * - * \note - * This does not correspond to the shared library version number, which - * is used to determine binary compatibility. - */ -extern FLAC_API const char *FLAC__VERSION_STRING; - -/** The vendor string inserted by the encoder into the VORBIS_COMMENT block. - * This is a NUL-terminated ASCII string; when inserted into the - * VORBIS_COMMENT the trailing null is stripped. - */ -extern FLAC_API const char *FLAC__VENDOR_STRING; - -/** The byte string representation of the beginning of a FLAC stream. */ -extern FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4]; /* = "fLaC" */ - -/** The 32-bit integer big-endian representation of the beginning of - * a FLAC stream. - */ -extern FLAC_API const unsigned FLAC__STREAM_SYNC; /* = 0x664C6143 */ - -/** The length of the FLAC signature in bits. */ -extern FLAC_API const unsigned FLAC__STREAM_SYNC_LEN; /* = 32 bits */ - -/** The length of the FLAC signature in bytes. */ -#define FLAC__STREAM_SYNC_LENGTH (4u) - - -/***************************************************************************** - * - * Subframe structures - * - *****************************************************************************/ - -/*****************************************************************************/ - -/** An enumeration of the available entropy coding methods. */ -typedef enum { - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE = 0, - /**< Residual is coded by partitioning into contexts, each with it's own - * 4-bit Rice parameter. */ - - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 = 1 - /**< Residual is coded by partitioning into contexts, each with it's own - * 5-bit Rice parameter. */ -} FLAC__EntropyCodingMethodType; - -/** Maps a FLAC__EntropyCodingMethodType to a C string. - * - * Using a FLAC__EntropyCodingMethodType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__EntropyCodingMethodTypeString[]; - - -/** Contents of a Rice partitioned residual - */ -typedef struct { - - unsigned *parameters; - /**< The Rice parameters for each context. */ - - unsigned *raw_bits; - /**< Widths for escape-coded partitions. Will be non-zero for escaped - * partitions and zero for unescaped partitions. - */ - - unsigned capacity_by_order; - /**< The capacity of the \a parameters and \a raw_bits arrays - * specified as an order, i.e. the number of array elements - * allocated is 2 ^ \a capacity_by_order. - */ -} FLAC__EntropyCodingMethod_PartitionedRiceContents; - -/** Header for a Rice partitioned residual. (c.f. format specification) - */ -typedef struct { - - unsigned order; - /**< The partition order, i.e. # of contexts = 2 ^ \a order. */ - - const FLAC__EntropyCodingMethod_PartitionedRiceContents *contents; - /**< The context's Rice parameters and/or raw bits. */ - -} FLAC__EntropyCodingMethod_PartitionedRice; - -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN; /**< == 5 (bits) */ -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN; /**< == 5 (bits) */ - -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; -/**< == (1<format specification) - */ -typedef struct { - FLAC__EntropyCodingMethodType type; - union { - FLAC__EntropyCodingMethod_PartitionedRice partitioned_rice; - } data; -} FLAC__EntropyCodingMethod; - -extern FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN; /**< == 2 (bits) */ - -/*****************************************************************************/ - -/** An enumeration of the available subframe types. */ -typedef enum { - FLAC__SUBFRAME_TYPE_CONSTANT = 0, /**< constant signal */ - FLAC__SUBFRAME_TYPE_VERBATIM = 1, /**< uncompressed signal */ - FLAC__SUBFRAME_TYPE_FIXED = 2, /**< fixed polynomial prediction */ - FLAC__SUBFRAME_TYPE_LPC = 3 /**< linear prediction */ -} FLAC__SubframeType; - -/** Maps a FLAC__SubframeType to a C string. - * - * Using a FLAC__SubframeType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__SubframeTypeString[]; - - -/** CONSTANT subframe. (c.f. format specification) - */ -typedef struct { - FLAC__int32 value; /**< The constant signal value. */ -} FLAC__Subframe_Constant; - - -/** VERBATIM subframe. (c.f. format specification) - */ -typedef struct { - const FLAC__int32 *data; /**< A pointer to verbatim signal. */ -} FLAC__Subframe_Verbatim; - - -/** FIXED subframe. (c.f. format specification) - */ -typedef struct { - FLAC__EntropyCodingMethod entropy_coding_method; - /**< The residual coding method. */ - - unsigned order; - /**< The polynomial order. */ - - FLAC__int32 warmup[FLAC__MAX_FIXED_ORDER]; - /**< Warmup samples to prime the predictor, length == order. */ - - const FLAC__int32 *residual; - /**< The residual signal, length == (blocksize minus order) samples. */ -} FLAC__Subframe_Fixed; - - -/** LPC subframe. (c.f. format specification) - */ -typedef struct { - FLAC__EntropyCodingMethod entropy_coding_method; - /**< The residual coding method. */ - - unsigned order; - /**< The FIR order. */ - - unsigned qlp_coeff_precision; - /**< Quantized FIR filter coefficient precision in bits. */ - - int quantization_level; - /**< The qlp coeff shift needed. */ - - FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; - /**< FIR filter coefficients. */ - - FLAC__int32 warmup[FLAC__MAX_LPC_ORDER]; - /**< Warmup samples to prime the predictor, length == order. */ - - const FLAC__int32 *residual; - /**< The residual signal, length == (blocksize minus order) samples. */ -} FLAC__Subframe_LPC; - -extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN; /**< == 5 (bits) */ - - -/** FLAC subframe structure. (c.f. format specification) - */ -typedef struct { - FLAC__SubframeType type; - union { - FLAC__Subframe_Constant constant; - FLAC__Subframe_Fixed fixed; - FLAC__Subframe_LPC lpc; - FLAC__Subframe_Verbatim verbatim; - } data; - unsigned wasted_bits; -} FLAC__Subframe; - -/** == 1 (bit) - * - * This used to be a zero-padding bit (hence the name - * FLAC__SUBFRAME_ZERO_PAD_LEN) but is now a reserved bit. It still has a - * mandatory value of \c 0 but in the future may take on the value \c 0 or \c 1 - * to mean something else. - */ -extern FLAC_API const unsigned FLAC__SUBFRAME_ZERO_PAD_LEN; -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LEN; /**< == 6 (bits) */ -extern FLAC_API const unsigned FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN; /**< == 1 (bit) */ - -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK; /**< = 0x00 */ -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK; /**< = 0x02 */ -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK; /**< = 0x10 */ -extern FLAC_API const unsigned FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK; /**< = 0x40 */ - -/*****************************************************************************/ - - -/***************************************************************************** - * - * Frame structures - * - *****************************************************************************/ - -/** An enumeration of the available channel assignments. */ -typedef enum { - FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0, /**< independent channels */ - FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1, /**< left+side stereo */ - FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2, /**< right+side stereo */ - FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 /**< mid+side stereo */ -} FLAC__ChannelAssignment; - -/** Maps a FLAC__ChannelAssignment to a C string. - * - * Using a FLAC__ChannelAssignment as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__ChannelAssignmentString[]; - -/** An enumeration of the possible frame numbering methods. */ -typedef enum { - FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER, /**< number contains the frame number */ - FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER /**< number contains the sample number of first sample in frame */ -} FLAC__FrameNumberType; - -/** Maps a FLAC__FrameNumberType to a C string. - * - * Using a FLAC__FrameNumberType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__FrameNumberTypeString[]; - - -/** FLAC frame header structure. (c.f. format specification) - */ -typedef struct { - unsigned blocksize; - /**< The number of samples per subframe. */ - - unsigned sample_rate; - /**< The sample rate in Hz. */ - - unsigned channels; - /**< The number of channels (== number of subframes). */ - - FLAC__ChannelAssignment channel_assignment; - /**< The channel assignment for the frame. */ - - unsigned bits_per_sample; - /**< The sample resolution. */ - - FLAC__FrameNumberType number_type; - /**< The numbering scheme used for the frame. As a convenience, the - * decoder will always convert a frame number to a sample number because - * the rules are complex. */ - - union { - FLAC__uint32 frame_number; - FLAC__uint64 sample_number; - } number; - /**< The frame number or sample number of first sample in frame; - * use the \a number_type value to determine which to use. */ - - FLAC__uint8 crc; - /**< CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) - * of the raw frame header bytes, meaning everything before the CRC byte - * including the sync code. - */ -} FLAC__FrameHeader; - -extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC; /**< == 0x3ffe; the frame header sync code */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN; /**< == 14 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN; /**< == 1 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN; /**< == 1 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN; /**< == 4 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN; /**< == 3 (bits) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN; /**< == 8 (bits) */ - - -/** FLAC frame footer structure. (c.f. format specification) - */ -typedef struct { - FLAC__uint16 crc; - /**< CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with - * 0) of the bytes before the crc, back to and including the frame header - * sync code. - */ -} FLAC__FrameFooter; - -extern FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN; /**< == 16 (bits) */ - - -/** FLAC frame structure. (c.f. format specification) - */ -typedef struct { - FLAC__FrameHeader header; - FLAC__Subframe subframes[FLAC__MAX_CHANNELS]; - FLAC__FrameFooter footer; -} FLAC__Frame; - -/*****************************************************************************/ - - -/***************************************************************************** - * - * Meta-data structures - * - *****************************************************************************/ - -/** An enumeration of the available metadata block types. */ -typedef enum { - - FLAC__METADATA_TYPE_STREAMINFO = 0, - /**< STREAMINFO block */ - - FLAC__METADATA_TYPE_PADDING = 1, - /**< PADDING block */ - - FLAC__METADATA_TYPE_APPLICATION = 2, - /**< APPLICATION block */ - - FLAC__METADATA_TYPE_SEEKTABLE = 3, - /**< SEEKTABLE block */ - - FLAC__METADATA_TYPE_VORBIS_COMMENT = 4, - /**< VORBISCOMMENT block (a.k.a. FLAC tags) */ - - FLAC__METADATA_TYPE_CUESHEET = 5, - /**< CUESHEET block */ - - FLAC__METADATA_TYPE_PICTURE = 6, - /**< PICTURE block */ - - FLAC__METADATA_TYPE_UNDEFINED = 7, - /**< marker to denote beginning of undefined type range; this number will increase as new metadata types are added */ - - FLAC__MAX_METADATA_TYPE = FLAC__MAX_METADATA_TYPE_CODE, - /**< No type will ever be greater than this. There is not enough room in the protocol block. */ -} FLAC__MetadataType; - -/** Maps a FLAC__MetadataType to a C string. - * - * Using a FLAC__MetadataType as the index to this array will - * give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__MetadataTypeString[]; - - -/** FLAC STREAMINFO structure. (c.f. format specification) - */ -typedef struct { - unsigned min_blocksize, max_blocksize; - unsigned min_framesize, max_framesize; - unsigned sample_rate; - unsigned channels; - unsigned bits_per_sample; - FLAC__uint64 total_samples; - FLAC__byte md5sum[16]; -} FLAC__StreamMetadata_StreamInfo; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; /**< == 16 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; /**< == 16 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; /**< == 24 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; /**< == 24 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; /**< == 20 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; /**< == 3 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; /**< == 5 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; /**< == 36 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN; /**< == 128 (bits) */ - -/** The total stream length of the STREAMINFO block in bytes. */ -#define FLAC__STREAM_METADATA_STREAMINFO_LENGTH (34u) - -/** FLAC PADDING structure. (c.f. format specification) - */ -typedef struct { - int dummy; - /**< Conceptually this is an empty struct since we don't store the - * padding bytes. Empty structs are not allowed by some C compilers, - * hence the dummy. - */ -} FLAC__StreamMetadata_Padding; - - -/** FLAC APPLICATION structure. (c.f. format specification) - */ -typedef struct { - FLAC__byte id[4]; - FLAC__byte *data; -} FLAC__StreamMetadata_Application; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN; /**< == 32 (bits) */ - -/** SeekPoint structure used in SEEKTABLE blocks. (c.f. format specification) - */ -typedef struct { - FLAC__uint64 sample_number; - /**< The sample number of the target frame. */ - - FLAC__uint64 stream_offset; - /**< The offset, in bytes, of the target frame with respect to - * beginning of the first frame. */ - - unsigned frame_samples; - /**< The number of samples in the target frame. */ -} FLAC__StreamMetadata_SeekPoint; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN; /**< == 16 (bits) */ - -/** The total stream length of a seek point in bytes. */ -#define FLAC__STREAM_METADATA_SEEKPOINT_LENGTH (18u) - -/** The value used in the \a sample_number field of - * FLAC__StreamMetadataSeekPoint used to indicate a placeholder - * point (== 0xffffffffffffffff). - */ -extern FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; - - -/** FLAC SEEKTABLE structure. (c.f. format specification) - * - * \note From the format specification: - * - The seek points must be sorted by ascending sample number. - * - Each seek point's sample number must be the first sample of the - * target frame. - * - Each seek point's sample number must be unique within the table. - * - Existence of a SEEKTABLE block implies a correct setting of - * total_samples in the stream_info block. - * - Behavior is undefined when more than one SEEKTABLE block is - * present in a stream. - */ -typedef struct { - unsigned num_points; - FLAC__StreamMetadata_SeekPoint *points; -} FLAC__StreamMetadata_SeekTable; - - -/** Vorbis comment entry structure used in VORBIS_COMMENT blocks. (c.f. format specification) - * - * For convenience, the APIs maintain a trailing NUL character at the end of - * \a entry which is not counted toward \a length, i.e. - * \code strlen(entry) == length \endcode - */ -typedef struct { - FLAC__uint32 length; - FLAC__byte *entry; -} FLAC__StreamMetadata_VorbisComment_Entry; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN; /**< == 32 (bits) */ - - -/** FLAC VORBIS_COMMENT structure. (c.f. format specification) - */ -typedef struct { - FLAC__StreamMetadata_VorbisComment_Entry vendor_string; - FLAC__uint32 num_comments; - FLAC__StreamMetadata_VorbisComment_Entry *comments; -} FLAC__StreamMetadata_VorbisComment; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN; /**< == 32 (bits) */ - - -/** FLAC CUESHEET track index structure. (See the - * format specification for - * the full description of each field.) - */ -typedef struct { - FLAC__uint64 offset; - /**< Offset in samples, relative to the track offset, of the index - * point. - */ - - FLAC__byte number; - /**< The index point number. */ -} FLAC__StreamMetadata_CueSheet_Index; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN; /**< == 8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN; /**< == 3*8 (bits) */ - - -/** FLAC CUESHEET track structure. (See the - * format specification for - * the full description of each field.) - */ -typedef struct { - FLAC__uint64 offset; - /**< Track offset in samples, relative to the beginning of the FLAC audio stream. */ - - FLAC__byte number; - /**< The track number. */ - - char isrc[13]; - /**< Track ISRC. This is a 12-digit alphanumeric code plus a trailing \c NUL byte */ - - unsigned type:1; - /**< The track type: 0 for audio, 1 for non-audio. */ - - unsigned pre_emphasis:1; - /**< The pre-emphasis flag: 0 for no pre-emphasis, 1 for pre-emphasis. */ - - FLAC__byte num_indices; - /**< The number of track index points. */ - - FLAC__StreamMetadata_CueSheet_Index *indices; - /**< NULL if num_indices == 0, else pointer to array of index points. */ - -} FLAC__StreamMetadata_CueSheet_Track; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN; /**< == 8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN; /**< == 12*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN; /**< == 6+13*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN; /**< == 8 (bits) */ - - -/** FLAC CUESHEET structure. (See the - * format specification - * for the full description of each field.) - */ -typedef struct { - char media_catalog_number[129]; - /**< Media catalog number, in ASCII printable characters 0x20-0x7e. In - * general, the media catalog number may be 0 to 128 bytes long; any - * unused characters should be right-padded with NUL characters. - */ - - FLAC__uint64 lead_in; - /**< The number of lead-in samples. */ - - FLAC__bool is_cd; - /**< \c true if CUESHEET corresponds to a Compact Disc, else \c false. */ - - unsigned num_tracks; - /**< The number of tracks. */ - - FLAC__StreamMetadata_CueSheet_Track *tracks; - /**< NULL if num_tracks == 0, else pointer to array of tracks. */ - -} FLAC__StreamMetadata_CueSheet; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN; /**< == 128*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN; /**< == 64 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN; /**< == 7+258*8 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN; /**< == 8 (bits) */ - - -/** An enumeration of the PICTURE types (see FLAC__StreamMetadataPicture and id3 v2.4 APIC tag). */ -typedef enum { - FLAC__STREAM_METADATA_PICTURE_TYPE_OTHER = 0, /**< Other */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD = 1, /**< 32x32 pixels 'file icon' (PNG only) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON = 2, /**< Other file icon */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FRONT_COVER = 3, /**< Cover (front) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BACK_COVER = 4, /**< Cover (back) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LEAFLET_PAGE = 5, /**< Leaflet page */ - FLAC__STREAM_METADATA_PICTURE_TYPE_MEDIA = 6, /**< Media (e.g. label side of CD) */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LEAD_ARTIST = 7, /**< Lead artist/lead performer/soloist */ - FLAC__STREAM_METADATA_PICTURE_TYPE_ARTIST = 8, /**< Artist/performer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_CONDUCTOR = 9, /**< Conductor */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BAND = 10, /**< Band/Orchestra */ - FLAC__STREAM_METADATA_PICTURE_TYPE_COMPOSER = 11, /**< Composer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_LYRICIST = 12, /**< Lyricist/text writer */ - FLAC__STREAM_METADATA_PICTURE_TYPE_RECORDING_LOCATION = 13, /**< Recording Location */ - FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_RECORDING = 14, /**< During recording */ - FLAC__STREAM_METADATA_PICTURE_TYPE_DURING_PERFORMANCE = 15, /**< During performance */ - FLAC__STREAM_METADATA_PICTURE_TYPE_VIDEO_SCREEN_CAPTURE = 16, /**< Movie/video screen capture */ - FLAC__STREAM_METADATA_PICTURE_TYPE_FISH = 17, /**< A bright coloured fish */ - FLAC__STREAM_METADATA_PICTURE_TYPE_ILLUSTRATION = 18, /**< Illustration */ - FLAC__STREAM_METADATA_PICTURE_TYPE_BAND_LOGOTYPE = 19, /**< Band/artist logotype */ - FLAC__STREAM_METADATA_PICTURE_TYPE_PUBLISHER_LOGOTYPE = 20, /**< Publisher/Studio logotype */ - FLAC__STREAM_METADATA_PICTURE_TYPE_UNDEFINED -} FLAC__StreamMetadata_Picture_Type; - -/** Maps a FLAC__StreamMetadata_Picture_Type to a C string. - * - * Using a FLAC__StreamMetadata_Picture_Type as the index to this array - * will give the string equivalent. The contents should not be - * modified. - */ -extern FLAC_API const char * const FLAC__StreamMetadata_Picture_TypeString[]; - -/** FLAC PICTURE structure. (See the - * format specification - * for the full description of each field.) - */ -typedef struct { - FLAC__StreamMetadata_Picture_Type type; - /**< The kind of picture stored. */ - - char *mime_type; - /**< Picture data's MIME type, in ASCII printable characters - * 0x20-0x7e, NUL terminated. For best compatibility with players, - * use picture data of MIME type \c image/jpeg or \c image/png. A - * MIME type of '-->' is also allowed, in which case the picture - * data should be a complete URL. In file storage, the MIME type is - * stored as a 32-bit length followed by the ASCII string with no NUL - * terminator, but is converted to a plain C string in this structure - * for convenience. - */ - - FLAC__byte *description; - /**< Picture's description in UTF-8, NUL terminated. In file storage, - * the description is stored as a 32-bit length followed by the UTF-8 - * string with no NUL terminator, but is converted to a plain C string - * in this structure for convenience. - */ - - FLAC__uint32 width; - /**< Picture's width in pixels. */ - - FLAC__uint32 height; - /**< Picture's height in pixels. */ - - FLAC__uint32 depth; - /**< Picture's color depth in bits-per-pixel. */ - - FLAC__uint32 colors; - /**< For indexed palettes (like GIF), picture's number of colors (the - * number of palette entries), or \c 0 for non-indexed (i.e. 2^depth). - */ - - FLAC__uint32 data_length; - /**< Length of binary picture data in bytes. */ - - FLAC__byte *data; - /**< Binary picture data. */ - -} FLAC__StreamMetadata_Picture; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN; /**< == 32 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN; /**< == 32 (bits) */ - - -/** Structure that is used when a metadata block of unknown type is loaded. - * The contents are opaque. The structure is used only internally to - * correctly handle unknown metadata. - */ -typedef struct { - FLAC__byte *data; -} FLAC__StreamMetadata_Unknown; - - -/** FLAC metadata block structure. (c.f. format specification) - */ -typedef struct { - FLAC__MetadataType type; - /**< The type of the metadata block; used determine which member of the - * \a data union to dereference. If type >= FLAC__METADATA_TYPE_UNDEFINED - * then \a data.unknown must be used. */ - - FLAC__bool is_last; - /**< \c true if this metadata block is the last, else \a false */ - - unsigned length; - /**< Length, in bytes, of the block data as it appears in the stream. */ - - union { - FLAC__StreamMetadata_StreamInfo stream_info; - FLAC__StreamMetadata_Padding padding; - FLAC__StreamMetadata_Application application; - FLAC__StreamMetadata_SeekTable seek_table; - FLAC__StreamMetadata_VorbisComment vorbis_comment; - FLAC__StreamMetadata_CueSheet cue_sheet; - FLAC__StreamMetadata_Picture picture; - FLAC__StreamMetadata_Unknown unknown; - } data; - /**< Polymorphic block data; use the \a type value to determine which - * to use. */ -} FLAC__StreamMetadata; - -extern FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN; /**< == 1 (bit) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN; /**< == 7 (bits) */ -extern FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN; /**< == 24 (bits) */ - -/** The total stream length of a metadata block header in bytes. */ -#define FLAC__STREAM_METADATA_HEADER_LENGTH (4u) - -/*****************************************************************************/ - - -/***************************************************************************** - * - * Utility functions - * - *****************************************************************************/ - -/** Tests that a sample rate is valid for FLAC. - * - * \param sample_rate The sample rate to test for compliance. - * \retval FLAC__bool - * \c true if the given sample rate conforms to the specification, else - * \c false. - */ -FLAC_API FLAC__bool FLAC__format_sample_rate_is_valid(unsigned sample_rate); - -/** Tests that a blocksize at the given sample rate is valid for the FLAC - * subset. - * - * \param blocksize The blocksize to test for compliance. - * \param sample_rate The sample rate is needed, since the valid subset - * blocksize depends on the sample rate. - * \retval FLAC__bool - * \c true if the given blocksize conforms to the specification for the - * subset at the given sample rate, else \c false. - */ -FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(unsigned blocksize, unsigned sample_rate); - -/** Tests that a sample rate is valid for the FLAC subset. The subset rules - * for valid sample rates are slightly more complex since the rate has to - * be expressible completely in the frame header. - * - * \param sample_rate The sample rate to test for compliance. - * \retval FLAC__bool - * \c true if the given sample rate conforms to the specification for the - * subset, else \c false. - */ -FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate); - -/** Check a Vorbis comment entry name to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment names must be composed only of characters from - * [0x20-0x3C,0x3E-0x7D]. - * - * \param name A NUL-terminated string to be checked. - * \assert - * \code name != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name); - -/** Check a Vorbis comment entry value to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment values must be valid UTF-8 sequences. - * - * \param value A string to be checked. - * \param length A the length of \a value in bytes. May be - * \c (unsigned)(-1) to indicate that \a value is a plain - * UTF-8 NUL-terminated string. - * \assert - * \code value != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length); - -/** Check a Vorbis comment entry to see if it conforms to the Vorbis - * comment specification. - * - * Vorbis comment entries must be of the form 'name=value', and 'name' and - * 'value' must be legal according to - * FLAC__format_vorbiscomment_entry_name_is_legal() and - * FLAC__format_vorbiscomment_entry_value_is_legal() respectively. - * - * \param entry An entry to be checked. - * \param length The length of \a entry in bytes. - * \assert - * \code value != NULL \endcode - * \retval FLAC__bool - * \c false if entry name is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length); - -/** Check a seek table to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * seek table. - * - * \param seek_table A pointer to a seek table to be checked. - * \assert - * \code seek_table != NULL \endcode - * \retval FLAC__bool - * \c false if seek table is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table); - -/** Sort a seek table's seek points according to the format specification. - * This includes a "unique-ification" step to remove duplicates, i.e. - * seek points with identical \a sample_number values. Duplicate seek - * points are converted into placeholder points and sorted to the end of - * the table. - * - * \param seek_table A pointer to a seek table to be sorted. - * \assert - * \code seek_table != NULL \endcode - * \retval unsigned - * The number of duplicate seek points converted into placeholders. - */ -FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table); - -/** Check a cue sheet to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * cue sheet. - * - * \param cue_sheet A pointer to an existing cue sheet to be checked. - * \param check_cd_da_subset If \c true, check CUESHEET against more - * stringent requirements for a CD-DA (audio) disc. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code cue_sheet != NULL \endcode - * \retval FLAC__bool - * \c false if cue sheet is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation); - -/** Check picture data to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * PICTURE block. - * - * \param picture A pointer to existing picture data to be checked. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code picture != NULL \endcode - * \retval FLAC__bool - * \c false if picture data is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c deleted file mode 100755 index e011f84..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitmath.c +++ /dev/null @@ -1,109 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "include/private/bitmath.h" - -/* An example of what FLAC__bitmath_silog2() computes: - * - * silog2(-10) = 5 - * silog2(- 9) = 5 - * silog2(- 8) = 4 - * silog2(- 7) = 4 - * silog2(- 6) = 4 - * silog2(- 5) = 4 - * silog2(- 4) = 3 - * silog2(- 3) = 3 - * silog2(- 2) = 2 - * silog2(- 1) = 2 - * silog2( 0) = 0 - * silog2( 1) = 2 - * silog2( 2) = 3 - * silog2( 3) = 3 - * silog2( 4) = 4 - * silog2( 5) = 4 - * silog2( 6) = 4 - * silog2( 7) = 4 - * silog2( 8) = 5 - * silog2( 9) = 5 - * silog2( 10) = 5 - */ -unsigned FLAC__bitmath_silog2(int v) -{ - while(1) { - if(v == 0) { - return 0; - } - else if(v > 0) { - unsigned l = 0; - while(v) { - l++; - v >>= 1; - } - return l+1; - } - else if(v == -1) { - return 2; - } - else { - v++; - v = -v; - } - } -} - -unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v) -{ - while(1) { - if(v == 0) { - return 0; - } - else if(v > 0) { - unsigned l = 0; - while(v) { - l++; - v >>= 1; - } - return l+1; - } - else if(v == -1) { - return 2; - } - else { - v++; - v = -v; - } - } -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c deleted file mode 100755 index 47e07e2..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitreader.c +++ /dev/null @@ -1,1058 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include "include/private/bitmath.h" -#include "include/private/bitreader.h" -#include "include/private/crc.h" -#include "../assert.h" -#include "../compat.h" -#include "../endswap.h" - -/* Things should be fastest when this matches the machine word size */ -/* WATCHOUT: if you change this you must also change the following #defines down to FLAC__clz_uint32 below to match */ -/* WATCHOUT: there are a few places where the code will not work unless uint32_t is >= 32 bits wide */ -/* also, some sections currently only have fast versions for 4 or 8 bytes per word */ -#define FLAC__BYTES_PER_WORD 4 /* sizeof uint32_t */ -#define FLAC__BITS_PER_WORD (8 * FLAC__BYTES_PER_WORD) -#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) -/* SWAP_BE_WORD_TO_HOST swaps bytes in a uint32_t (which is always big-endian) if necessary to match host byte order */ -#if WORDS_BIGENDIAN -#define SWAP_BE_WORD_TO_HOST(x) (x) -#else -#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_32(x) -#endif - -/* - * This should be at least twice as large as the largest number of words - * required to represent any 'number' (in any encoding) you are going to - * read. With FLAC this is on the order of maybe a few hundred bits. - * If the buffer is smaller than that, the decoder won't be able to read - * in a whole number that is in a variable length encoding (e.g. Rice). - * But to be practical it should be at least 1K bytes. - * - * Increase this number to decrease the number of read callbacks, at the - * expense of using more memory. Or decrease for the reverse effect, - * keeping in mind the limit from the first paragraph. The optimal size - * also depends on the CPU cache size and other factors; some twiddling - * may be necessary to squeeze out the best performance. - */ -static const unsigned FLAC__BITREADER_DEFAULT_CAPACITY = 65536u / FLAC__BITS_PER_WORD; /* in words */ - -struct FLAC__BitReader { - /* any partially-consumed word at the head will stay right-justified as bits are consumed from the left */ - /* any incomplete word at the tail will be left-justified, and bytes from the read callback are added on the right */ - uint32_t *buffer; - unsigned capacity; /* in words */ - unsigned words; /* # of completed words in buffer */ - unsigned bytes; /* # of bytes in incomplete word at buffer[words] */ - unsigned consumed_words; /* #words ... */ - unsigned consumed_bits; /* ... + (#bits of head word) already consumed from the front of buffer */ - unsigned read_crc16; /* the running frame CRC */ - unsigned crc16_align; /* the number of bits in the current consumed word that should not be CRC'd */ - FLAC__BitReaderReadCallback read_callback; - void *client_data; -}; - -static inline void crc16_update_word_(FLAC__BitReader *br, uint32_t word) -{ - unsigned crc = br->read_crc16; -#if FLAC__BYTES_PER_WORD == 4 - switch(br->crc16_align) { - case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 24), crc); - case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc); - case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc); - case 24: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc); - } -#elif FLAC__BYTES_PER_WORD == 8 - switch(br->crc16_align) { - case 0: crc = FLAC__CRC16_UPDATE((unsigned)(word >> 56), crc); - case 8: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 48) & 0xff), crc); - case 16: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 40) & 0xff), crc); - case 24: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 32) & 0xff), crc); - case 32: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 24) & 0xff), crc); - case 40: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 16) & 0xff), crc); - case 48: crc = FLAC__CRC16_UPDATE((unsigned)((word >> 8) & 0xff), crc); - case 56: br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)(word & 0xff), crc); - } -#else - for( ; br->crc16_align < FLAC__BITS_PER_WORD; br->crc16_align += 8) - crc = FLAC__CRC16_UPDATE((unsigned)((word >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), crc); - br->read_crc16 = crc; -#endif - br->crc16_align = 0; -} - -static FLAC__bool bitreader_read_from_client_(FLAC__BitReader *br) -{ - unsigned start, end; - size_t bytes; - FLAC__byte *target; - - /* first shift the unconsumed buffer data toward the front as much as possible */ - if(br->consumed_words > 0) { - start = br->consumed_words; - end = br->words + (br->bytes? 1:0); - memmove(br->buffer, br->buffer+start, FLAC__BYTES_PER_WORD * (end - start)); - - br->words -= start; - br->consumed_words = 0; - } - - /* - * set the target for reading, taking into account word alignment and endianness - */ - bytes = (br->capacity - br->words) * FLAC__BYTES_PER_WORD - br->bytes; - if(bytes == 0) - return false; /* no space left, buffer is too small; see note for FLAC__BITREADER_DEFAULT_CAPACITY */ - target = ((FLAC__byte*)(br->buffer+br->words)) + br->bytes; - - /* before reading, if the existing reader looks like this (say uint32_t is 32 bits wide) - * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 (partial tail word is left-justified) - * buffer[BE]: 11 22 33 44 55 ?? ?? ?? (shown layed out as bytes sequentially in memory) - * buffer[LE]: 44 33 22 11 ?? ?? ?? 55 (?? being don't-care) - * ^^-------target, bytes=3 - * on LE machines, have to byteswap the odd tail word so nothing is - * overwritten: - */ -#if WORDS_BIGENDIAN -#else - if(br->bytes) - br->buffer[br->words] = SWAP_BE_WORD_TO_HOST(br->buffer[br->words]); -#endif - - /* now it looks like: - * bitstream : 11 22 33 44 55 br->words=1 br->bytes=1 - * buffer[BE]: 11 22 33 44 55 ?? ?? ?? - * buffer[LE]: 44 33 22 11 55 ?? ?? ?? - * ^^-------target, bytes=3 - */ - - /* read in the data; note that the callback may return a smaller number of bytes */ - if(!br->read_callback(target, &bytes, br->client_data)) - return false; - - /* after reading bytes 66 77 88 99 AA BB CC DD EE FF from the client: - * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF - * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? - * buffer[LE]: 44 33 22 11 55 66 77 88 99 AA BB CC DD EE FF ?? - * now have to byteswap on LE machines: - */ -#if WORDS_BIGENDIAN -#else - end = (br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes + (FLAC__BYTES_PER_WORD-1)) / FLAC__BYTES_PER_WORD; - for(start = br->words; start < end; start++) - br->buffer[start] = SWAP_BE_WORD_TO_HOST(br->buffer[start]); -#endif - - /* now it looks like: - * bitstream : 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF - * buffer[BE]: 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF ?? - * buffer[LE]: 44 33 22 11 88 77 66 55 CC BB AA 99 ?? FF EE DD - * finally we'll update the reader values: - */ - end = br->words*FLAC__BYTES_PER_WORD + br->bytes + bytes; - br->words = end / FLAC__BYTES_PER_WORD; - br->bytes = end % FLAC__BYTES_PER_WORD; - - return true; -} - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -FLAC__BitReader *FLAC__bitreader_new(void) -{ - FLAC__BitReader *br = (FLAC__BitReader*) calloc(1, sizeof(FLAC__BitReader)); - - /* calloc() implies: - memset(br, 0, sizeof(FLAC__BitReader)); - br->buffer = 0; - br->capacity = 0; - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - br->read_callback = 0; - br->client_data = 0; - */ - return br; -} - -void FLAC__bitreader_delete(FLAC__BitReader *br) -{ - FLAC__ASSERT(0 != br); - - FLAC__bitreader_free(br); - free(br); -} - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd) -{ - FLAC__ASSERT(0 != br); - - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - br->capacity = FLAC__BITREADER_DEFAULT_CAPACITY; - br->buffer = (uint32_t*) malloc(sizeof(uint32_t) * br->capacity); - if(br->buffer == 0) - return false; - br->read_callback = rcb; - br->client_data = cd; - - return true; -} - -void FLAC__bitreader_free(FLAC__BitReader *br) -{ - FLAC__ASSERT(0 != br); - - if(0 != br->buffer) - free(br->buffer); - br->buffer = 0; - br->capacity = 0; - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - br->read_callback = 0; - br->client_data = 0; -} - -FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br) -{ - br->words = br->bytes = 0; - br->consumed_words = br->consumed_bits = 0; - return true; -} - -void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out) -{ - unsigned i, j; - if(br == 0) { - fprintf(out, "bitreader is NULL\n"); - } - else { - fprintf(out, "bitreader: capacity=%u words=%u bytes=%u consumed: words=%u, bits=%u\n", br->capacity, br->words, br->bytes, br->consumed_words, br->consumed_bits); - - for(i = 0; i < br->words; i++) { - fprintf(out, "%08X: ", i); - for(j = 0; j < FLAC__BITS_PER_WORD; j++) - if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) - fprintf(out, "."); - else - fprintf(out, "%01u", br->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); - fprintf(out, "\n"); - } - if(br->bytes > 0) { - fprintf(out, "%08X: ", i); - for(j = 0; j < br->bytes*8; j++) - if(i < br->consumed_words || (i == br->consumed_words && j < br->consumed_bits)) - fprintf(out, "."); - else - fprintf(out, "%01u", br->buffer[i] & (1 << (br->bytes*8-j-1)) ? 1:0); - fprintf(out, "\n"); - } - } -} - -void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed) -{ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT((br->consumed_bits & 7) == 0); - - br->read_crc16 = (unsigned)seed; - br->crc16_align = br->consumed_bits; -} - -FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br) -{ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT((br->consumed_bits & 7) == 0); - FLAC__ASSERT(br->crc16_align <= br->consumed_bits); - - /* CRC any tail bytes in a partially-consumed word */ - if(br->consumed_bits) { - const uint32_t tail = br->buffer[br->consumed_words]; - for( ; br->crc16_align < br->consumed_bits; br->crc16_align += 8) - br->read_crc16 = FLAC__CRC16_UPDATE((unsigned)((tail >> (FLAC__BITS_PER_WORD-8-br->crc16_align)) & 0xff), br->read_crc16); - } - return br->read_crc16; -} - -inline FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br) -{ - return ((br->consumed_bits & 7) == 0); -} - -inline unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br) -{ - return 8 - (br->consumed_bits & 7); -} - -inline unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br) -{ - return (br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits; -} - -FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits) -{ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - FLAC__ASSERT(bits <= 32); - FLAC__ASSERT((br->capacity*FLAC__BITS_PER_WORD) * 2 >= bits); - FLAC__ASSERT(br->consumed_words <= br->words); - - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - - if(bits == 0) { /* OPT: investigate if this can ever happen, maybe change to assertion */ - *val = 0; - return true; - } - - while((br->words-br->consumed_words)*FLAC__BITS_PER_WORD + br->bytes*8 - br->consumed_bits < bits) { - if(!bitreader_read_from_client_(br)) - return false; - } - if(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ - /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ - if(br->consumed_bits) { - /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ - const unsigned n = FLAC__BITS_PER_WORD - br->consumed_bits; - const uint32_t word = br->buffer[br->consumed_words]; - if(bits < n) { - *val = (word & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (n-bits); - br->consumed_bits += bits; - return true; - } - *val = word & (FLAC__WORD_ALL_ONES >> br->consumed_bits); - bits -= n; - crc16_update_word_(br, word); - br->consumed_words++; - br->consumed_bits = 0; - if(bits) { /* if there are still bits left to read, there have to be less than 32 so they will all be in the next word */ - *val <<= bits; - *val |= (br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits)); - br->consumed_bits = bits; - } - return true; - } - else { - const uint32_t word = br->buffer[br->consumed_words]; - if(bits < FLAC__BITS_PER_WORD) { - *val = word >> (FLAC__BITS_PER_WORD-bits); - br->consumed_bits = bits; - return true; - } - /* at this point 'bits' must be == FLAC__BITS_PER_WORD; because of previous assertions, it can't be larger */ - *val = word; - crc16_update_word_(br, word); - br->consumed_words++; - return true; - } - } - else { - /* in this case we're starting our read at a partial tail word; - * the reader has guaranteed that we have at least 'bits' bits - * available to read, which makes this case simpler. - */ - /* OPT: taking out the consumed_bits==0 "else" case below might make things faster if less code allows the compiler to inline this function */ - if(br->consumed_bits) { - /* this also works when consumed_bits==0, it's just a little slower than necessary for that case */ - FLAC__ASSERT(br->consumed_bits + bits <= br->bytes*8); - *val = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES >> br->consumed_bits)) >> (FLAC__BITS_PER_WORD-br->consumed_bits-bits); - br->consumed_bits += bits; - return true; - } - else { - *val = br->buffer[br->consumed_words] >> (FLAC__BITS_PER_WORD-bits); - br->consumed_bits += bits; - return true; - } - } -} - -FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits) -{ - /* OPT: inline raw uint32 code here, or make into a macro if possible in the .h file */ - if(!FLAC__bitreader_read_raw_uint32(br, (FLAC__uint32*)val, bits)) - return false; - /* sign-extend: */ - *val <<= (32-bits); - *val >>= (32-bits); - return true; -} - -FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits) -{ - FLAC__uint32 hi, lo; - - if(bits > 32) { - if(!FLAC__bitreader_read_raw_uint32(br, &hi, bits-32)) - return false; - if(!FLAC__bitreader_read_raw_uint32(br, &lo, 32)) - return false; - *val = hi; - *val <<= 32; - *val |= lo; - } - else { - if(!FLAC__bitreader_read_raw_uint32(br, &lo, bits)) - return false; - *val = lo; - } - return true; -} - -inline FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val) -{ - FLAC__uint32 x8, x32 = 0; - - /* this doesn't need to be that fast as currently it is only used for vorbis comments */ - - if(!FLAC__bitreader_read_raw_uint32(br, &x32, 8)) - return false; - - if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) - return false; - x32 |= (x8 << 8); - - if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) - return false; - x32 |= (x8 << 16); - - if(!FLAC__bitreader_read_raw_uint32(br, &x8, 8)) - return false; - x32 |= (x8 << 24); - - *val = x32; - return true; -} - -FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits) -{ - /* - * OPT: a faster implementation is possible but probably not that useful - * since this is only called a couple of times in the metadata readers. - */ - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - if(bits > 0) { - const unsigned n = br->consumed_bits & 7; - unsigned m; - FLAC__uint32 x; - - if(n != 0) { - m = flac_min(8-n, bits); - if(!FLAC__bitreader_read_raw_uint32(br, &x, m)) - return false; - bits -= m; - } - m = bits / 8; - if(m > 0) { - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(br, m)) - return false; - bits %= 8; - } - if(bits > 0) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, bits)) - return false; - } - } - - return true; -} - -FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals) -{ - FLAC__uint32 x; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); - - /* step 1: skip over partial head word to get word aligned */ - while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - nvals--; - } - if(0 == nvals) - return true; - /* step 2: skip whole words in chunks */ - while(nvals >= FLAC__BYTES_PER_WORD) { - if(br->consumed_words < br->words) { - br->consumed_words++; - nvals -= FLAC__BYTES_PER_WORD; - } - else if(!bitreader_read_from_client_(br)) - return false; - } - /* step 3: skip any remainder from partial tail bytes */ - while(nvals) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - nvals--; - } - - return true; -} - -FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals) -{ - FLAC__uint32 x; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(br)); - - /* step 1: read from partial head word to get word aligned */ - while(nvals && br->consumed_bits) { /* i.e. run until we read 'nvals' bytes or we hit the end of the head word */ - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - *val++ = (FLAC__byte)x; - nvals--; - } - if(0 == nvals) - return true; - /* step 2: read whole words in chunks */ - while(nvals >= FLAC__BYTES_PER_WORD) { - if(br->consumed_words < br->words) { - const uint32_t word = br->buffer[br->consumed_words++]; -#if FLAC__BYTES_PER_WORD == 4 - val[0] = (FLAC__byte)(word >> 24); - val[1] = (FLAC__byte)(word >> 16); - val[2] = (FLAC__byte)(word >> 8); - val[3] = (FLAC__byte)word; -#elif FLAC__BYTES_PER_WORD == 8 - val[0] = (FLAC__byte)(word >> 56); - val[1] = (FLAC__byte)(word >> 48); - val[2] = (FLAC__byte)(word >> 40); - val[3] = (FLAC__byte)(word >> 32); - val[4] = (FLAC__byte)(word >> 24); - val[5] = (FLAC__byte)(word >> 16); - val[6] = (FLAC__byte)(word >> 8); - val[7] = (FLAC__byte)word; -#else - for(x = 0; x < FLAC__BYTES_PER_WORD; x++) - val[x] = (FLAC__byte)(word >> (8*(FLAC__BYTES_PER_WORD-x-1))); -#endif - val += FLAC__BYTES_PER_WORD; - nvals -= FLAC__BYTES_PER_WORD; - } - else if(!bitreader_read_from_client_(br)) - return false; - } - /* step 3: read any remainder from partial tail bytes */ - while(nvals) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - *val++ = (FLAC__byte)x; - nvals--; - } - - return true; -} - -FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val) -#if 0 /* slow but readable version */ -{ - unsigned bit; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - *val = 0; - while(1) { - if(!FLAC__bitreader_read_bit(br, &bit)) - return false; - if(bit) - break; - else - *val++; - } - return true; -} -#else -{ - unsigned i; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - *val = 0; - while(1) { - while(br->consumed_words < br->words) { /* if we've not consumed up to a partial tail word... */ - uint32_t b = br->buffer[br->consumed_words] << br->consumed_bits; - if(b) { - i = FLAC__clz_uint32(b); - *val += i; - i++; - br->consumed_bits += i; - if(br->consumed_bits >= FLAC__BITS_PER_WORD) { /* faster way of testing if(br->consumed_bits == FLAC__BITS_PER_WORD) */ - crc16_update_word_(br, br->buffer[br->consumed_words]); - br->consumed_words++; - br->consumed_bits = 0; - } - return true; - } - else { - *val += FLAC__BITS_PER_WORD - br->consumed_bits; - crc16_update_word_(br, br->buffer[br->consumed_words]); - br->consumed_words++; - br->consumed_bits = 0; - /* didn't find stop bit yet, have to keep going... */ - } - } - /* at this point we've eaten up all the whole words; have to try - * reading through any tail bytes before calling the read callback. - * this is a repeat of the above logic adjusted for the fact we - * don't have a whole word. note though if the client is feeding - * us data a byte at a time (unlikely), br->consumed_bits may not - * be zero. - */ - if(br->bytes*8 > br->consumed_bits) { - const unsigned end = br->bytes * 8; - uint32_t b = (br->buffer[br->consumed_words] & (FLAC__WORD_ALL_ONES << (FLAC__BITS_PER_WORD-end))) << br->consumed_bits; - if(b) { - i = FLAC__clz_uint32(b); - *val += i; - i++; - br->consumed_bits += i; - FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); - return true; - } - else { - *val += end - br->consumed_bits; - br->consumed_bits = end; - FLAC__ASSERT(br->consumed_bits < FLAC__BITS_PER_WORD); - /* didn't find stop bit yet, have to keep going... */ - } - } - if(!bitreader_read_from_client_(br)) - return false; - } -} -#endif - -FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter) -{ - FLAC__uint32 lsbs = 0, msbs = 0; - unsigned uval; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - FLAC__ASSERT(parameter <= 31); - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter)) - return false; - - /* compose the value */ - uval = (msbs << parameter) | lsbs; - if(uval & 1) - *val = -((int)(uval >> 1)) - 1; - else - *val = (int)(uval >> 1); - - return true; -} - -/* this is by far the most heavily used reader call. it ain't pretty but it's fast */ -FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter) -{ - /* try and get br->consumed_words and br->consumed_bits into register; - * must remember to flush them back to *br before calling other - * bitreader functions that use them, and before returning */ - unsigned cwords, words, lsbs, msbs, x, y; - unsigned ucbits; /* keep track of the number of unconsumed bits in word */ - uint32_t b; - int *val, *end; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - FLAC__ASSERT(parameter < 32); - /* the above two asserts also guarantee that the binary part never straddles more than 2 words, so we don't have to loop to read it */ - - val = vals; - end = vals + nvals; - - if(parameter == 0) { - while(val < end) { - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - *val++ = (int)(msbs >> 1) ^ -(int)(msbs & 1); - } - - return true; - } - - FLAC__ASSERT(parameter > 0); - - cwords = br->consumed_words; - words = br->words; - - /* if we've not consumed up to a partial tail word... */ - if(cwords >= words) { - x = 0; - goto process_tail; - } - - ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; - b = br->buffer[cwords] << br->consumed_bits; /* keep unconsumed bits aligned to left */ - - while(val < end) { - /* read the unary MSBs and end bit */ - x = y = FLAC__clz2_uint32(b); - if(x == FLAC__BITS_PER_WORD) { - x = ucbits; - do { - /* didn't find stop bit yet, have to keep going... */ - crc16_update_word_(br, br->buffer[cwords++]); - if (cwords >= words) - goto incomplete_msbs; - b = br->buffer[cwords]; - y = FLAC__clz2_uint32(b); - x += y; - } while(y == FLAC__BITS_PER_WORD); - } - b <<= y; - b <<= 1; /* account for stop bit */ - ucbits = (ucbits - x - 1) % FLAC__BITS_PER_WORD; - msbs = x; - - /* read the binary LSBs */ - x = b >> (FLAC__BITS_PER_WORD - parameter); - if(parameter <= ucbits) { - ucbits -= parameter; - b <<= parameter; - } else { - /* there are still bits left to read, they will all be in the next word */ - crc16_update_word_(br, br->buffer[cwords++]); - if (cwords >= words) - goto incomplete_lsbs; - b = br->buffer[cwords]; - ucbits += FLAC__BITS_PER_WORD - parameter; - x |= b >> ucbits; - b <<= FLAC__BITS_PER_WORD - ucbits; - } - lsbs = x; - - /* compose the value */ - x = (msbs << parameter) | lsbs; - *val++ = (int)(x >> 1) ^ -(int)(x & 1); - - continue; - - /* at this point we've eaten up all the whole words */ -process_tail: - do { - if(0) { -incomplete_msbs: - br->consumed_bits = 0; - br->consumed_words = cwords; - } - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - msbs += x; - x = ucbits = 0; - - if(0) { -incomplete_lsbs: - br->consumed_bits = 0; - br->consumed_words = cwords; - } - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, parameter - ucbits)) - return false; - lsbs = x | lsbs; - - /* compose the value */ - x = (msbs << parameter) | lsbs; - *val++ = (int)(x >> 1) ^ -(int)(x & 1); - x = 0; - - cwords = br->consumed_words; - words = br->words; - ucbits = FLAC__BITS_PER_WORD - br->consumed_bits; - b = br->buffer[cwords] << br->consumed_bits; - } while(cwords >= words && val < end); - } - - if(ucbits == 0 && cwords < words) { - /* don't leave the head word with no unconsumed bits */ - crc16_update_word_(br, br->buffer[cwords++]); - ucbits = FLAC__BITS_PER_WORD; - } - - br->consumed_bits = FLAC__BITS_PER_WORD - ucbits; - br->consumed_words = cwords; - - return true; -} - -#if 0 /* UNUSED */ -FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter) -{ - FLAC__uint32 lsbs = 0, msbs = 0; - unsigned bit, uval, k; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - k = FLAC__bitmath_ilog2(parameter); - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) - return false; - - if(parameter == 1u<= d) { - if(!FLAC__bitreader_read_bit(br, &bit)) - return false; - lsbs <<= 1; - lsbs |= bit; - lsbs -= d; - } - /* compose the value */ - uval = msbs * parameter + lsbs; - } - - /* unfold unsigned to signed */ - if(uval & 1) - *val = -((int)(uval >> 1)) - 1; - else - *val = (int)(uval >> 1); - - return true; -} - -FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter) -{ - FLAC__uint32 lsbs, msbs = 0; - unsigned bit, k; - - FLAC__ASSERT(0 != br); - FLAC__ASSERT(0 != br->buffer); - - k = FLAC__bitmath_ilog2(parameter); - - /* read the unary MSBs and end bit */ - if(!FLAC__bitreader_read_unary_unsigned(br, &msbs)) - return false; - - /* read the binary LSBs */ - if(!FLAC__bitreader_read_raw_uint32(br, &lsbs, k)) - return false; - - if(parameter == 1u<= d) { - if(!FLAC__bitreader_read_bit(br, &bit)) - return false; - lsbs <<= 1; - lsbs |= bit; - lsbs -= d; - } - /* compose the value */ - *val = msbs * parameter + lsbs; - } - - return true; -} -#endif /* UNUSED */ - -/* on return, if *val == 0xffffffff then the utf-8 sequence was invalid, but the return value will be true */ -FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen) -{ - FLAC__uint32 v = 0; - FLAC__uint32 x; - unsigned i; - - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80)) { /* 0xxxxxxx */ - v = x; - i = 0; - } - else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ - v = x & 0x1F; - i = 1; - } - else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ - v = x & 0x0F; - i = 2; - } - else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ - v = x & 0x07; - i = 3; - } - else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ - v = x & 0x03; - i = 4; - } - else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ - v = x & 0x01; - i = 5; - } - else { - *val = 0xffffffff; - return true; - } - for( ; i; i--) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ - *val = 0xffffffff; - return true; - } - v <<= 6; - v |= (x & 0x3F); - } - *val = v; - return true; -} - -/* on return, if *val == 0xffffffffffffffff then the utf-8 sequence was invalid, but the return value will be true */ -FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen) -{ - FLAC__uint64 v = 0; - FLAC__uint32 x; - unsigned i; - - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80)) { /* 0xxxxxxx */ - v = x; - i = 0; - } - else if(x & 0xC0 && !(x & 0x20)) { /* 110xxxxx */ - v = x & 0x1F; - i = 1; - } - else if(x & 0xE0 && !(x & 0x10)) { /* 1110xxxx */ - v = x & 0x0F; - i = 2; - } - else if(x & 0xF0 && !(x & 0x08)) { /* 11110xxx */ - v = x & 0x07; - i = 3; - } - else if(x & 0xF8 && !(x & 0x04)) { /* 111110xx */ - v = x & 0x03; - i = 4; - } - else if(x & 0xFC && !(x & 0x02)) { /* 1111110x */ - v = x & 0x01; - i = 5; - } - else if(x & 0xFE && !(x & 0x01)) { /* 11111110 */ - v = 0; - i = 6; - } - else { - *val = FLAC__U64L(0xffffffffffffffff); - return true; - } - for( ; i; i--) { - if(!FLAC__bitreader_read_raw_uint32(br, &x, 8)) - return false; - if(raw) - raw[(*rawlen)++] = (FLAC__byte)x; - if(!(x & 0x80) || (x & 0x40)) { /* 10xxxxxx */ - *val = FLAC__U64L(0xffffffffffffffff); - return true; - } - v <<= 6; - v |= (x & 0x3F); - } - *val = v; - return true; -} - -/* These functions are declared inline in this file but are also callable as - * externs from elsewhere. - * According to the C99 spec, section 6.7.4, simply providing a function - * prototype in a header file without 'inline' and making the function inline - * in this file should be sufficient. - * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To - * fix that we add extern declarations here. - */ -extern FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); -extern unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); -extern unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); -extern FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c deleted file mode 100755 index 5658da2..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/bitwriter.c +++ /dev/null @@ -1,842 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include "include/private/bitwriter.h" -#include "include/private/crc.h" -#include "../assert.h" -#include "../alloc.h" -#include "../compat.h" -#include "../endswap.h" - -/* Things should be fastest when this matches the machine word size */ -/* WATCHOUT: if you change this you must also change the following #defines down to SWAP_BE_WORD_TO_HOST below to match */ -/* WATCHOUT: there are a few places where the code will not work unless uint32_t is >= 32 bits wide */ -#define FLAC__BYTES_PER_WORD 4 -#define FLAC__BITS_PER_WORD (8 * FLAC__BYTES_PER_WORD) -#define FLAC__WORD_ALL_ONES ((FLAC__uint32)0xffffffff) -/* SWAP_BE_WORD_TO_HOST swaps bytes in a uint32_t (which is always big-endian) if necessary to match host byte order */ -#if WORDS_BIGENDIAN -#define SWAP_BE_WORD_TO_HOST(x) (x) -#else -#define SWAP_BE_WORD_TO_HOST(x) ENDSWAP_32(x) -#endif - -/* - * The default capacity here doesn't matter too much. The buffer always grows - * to hold whatever is written to it. Usually the encoder will stop adding at - * a frame or metadata block, then write that out and clear the buffer for the - * next one. - */ -static const unsigned FLAC__BITWRITER_DEFAULT_CAPACITY = 32768u / sizeof(uint32_t); /* size in words */ -/* When growing, increment 4K at a time */ -static const unsigned FLAC__BITWRITER_DEFAULT_INCREMENT = 4096u / sizeof(uint32_t); /* size in words */ - -#define FLAC__WORDS_TO_BITS(words) ((words) * FLAC__BITS_PER_WORD) -#define FLAC__TOTAL_BITS(bw) (FLAC__WORDS_TO_BITS((bw)->words) + (bw)->bits) - -struct FLAC__BitWriter { - uint32_t *buffer; - uint32_t accum; /* accumulator; bits are right-justified; when full, accum is appended to buffer */ - unsigned capacity; /* capacity of buffer in words */ - unsigned words; /* # of complete words in buffer */ - unsigned bits; /* # of used bits in accum */ -}; - -/* * WATCHOUT: The current implementation only grows the buffer. */ -#ifndef __SUNPRO_C -static -#endif -FLAC__bool bitwriter_grow_(FLAC__BitWriter *bw, unsigned bits_to_add) -{ - unsigned new_capacity; - uint32_t *new_buffer; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - /* calculate total words needed to store 'bits_to_add' additional bits */ - new_capacity = bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD); - - /* it's possible (due to pessimism in the growth estimation that - * leads to this call) that we don't actually need to grow - */ - if(bw->capacity >= new_capacity) - return true; - - /* round up capacity increase to the nearest FLAC__BITWRITER_DEFAULT_INCREMENT */ - if((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT) - new_capacity += FLAC__BITWRITER_DEFAULT_INCREMENT - ((new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT); - /* make sure we got everything right */ - FLAC__ASSERT(0 == (new_capacity - bw->capacity) % FLAC__BITWRITER_DEFAULT_INCREMENT); - FLAC__ASSERT(new_capacity > bw->capacity); - FLAC__ASSERT(new_capacity >= bw->words + ((bw->bits + bits_to_add + FLAC__BITS_PER_WORD - 1) / FLAC__BITS_PER_WORD)); - - new_buffer = (uint32_t*) safe_realloc_mul_2op_(bw->buffer, sizeof(uint32_t), /*times*/new_capacity); - if(new_buffer == 0) - return false; - bw->buffer = new_buffer; - bw->capacity = new_capacity; - return true; -} - - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -FLAC__BitWriter *FLAC__bitwriter_new(void) -{ - FLAC__BitWriter *bw = (FLAC__BitWriter*) calloc(1, sizeof(FLAC__BitWriter)); - /* note that calloc() sets all members to 0 for us */ - return bw; -} - -void FLAC__bitwriter_delete(FLAC__BitWriter *bw) -{ - FLAC__ASSERT(0 != bw); - - FLAC__bitwriter_free(bw); - free(bw); -} - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw) -{ - FLAC__ASSERT(0 != bw); - - bw->words = bw->bits = 0; - bw->capacity = FLAC__BITWRITER_DEFAULT_CAPACITY; - bw->buffer = (uint32_t*) malloc(sizeof(uint32_t) * bw->capacity); - if(bw->buffer == 0) - return false; - - return true; -} - -void FLAC__bitwriter_free(FLAC__BitWriter *bw) -{ - FLAC__ASSERT(0 != bw); - - if(0 != bw->buffer) - free(bw->buffer); - bw->buffer = 0; - bw->capacity = 0; - bw->words = bw->bits = 0; -} - -void FLAC__bitwriter_clear(FLAC__BitWriter *bw) -{ - bw->words = bw->bits = 0; -} - -void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out) -{ - unsigned i, j; - if(bw == 0) { - fprintf(out, "bitwriter is NULL\n"); - } - else { - fprintf(out, "bitwriter: capacity=%u words=%u bits=%u total_bits=%u\n", bw->capacity, bw->words, bw->bits, FLAC__TOTAL_BITS(bw)); - - for(i = 0; i < bw->words; i++) { - fprintf(out, "%08X: ", i); - for(j = 0; j < FLAC__BITS_PER_WORD; j++) - fprintf(out, "%01u", bw->buffer[i] & (1 << (FLAC__BITS_PER_WORD-j-1)) ? 1:0); - fprintf(out, "\n"); - } - if(bw->bits > 0) { - fprintf(out, "%08X: ", i); - for(j = 0; j < bw->bits; j++) - fprintf(out, "%01u", bw->accum & (1 << (bw->bits-j-1)) ? 1:0); - fprintf(out, "\n"); - } - } -} - -FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc) -{ - const FLAC__byte *buffer; - size_t bytes; - - FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */ - - if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes)) - return false; - - *crc = (FLAC__uint16)FLAC__crc16(buffer, bytes); - FLAC__bitwriter_release_buffer(bw); - return true; -} - -FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc) -{ - const FLAC__byte *buffer; - size_t bytes; - - FLAC__ASSERT((bw->bits & 7) == 0); /* assert that we're byte-aligned */ - - if(!FLAC__bitwriter_get_buffer(bw, &buffer, &bytes)) - return false; - - *crc = FLAC__crc8(buffer, bytes); - FLAC__bitwriter_release_buffer(bw); - return true; -} - -FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw) -{ - return ((bw->bits & 7) == 0); -} - -unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw) -{ - return FLAC__TOTAL_BITS(bw); -} - -FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes) -{ - FLAC__ASSERT((bw->bits & 7) == 0); - /* double protection */ - if(bw->bits & 7) - return false; - /* if we have bits in the accumulator we have to flush those to the buffer first */ - if(bw->bits) { - FLAC__ASSERT(bw->words <= bw->capacity); - if(bw->words == bw->capacity && !bitwriter_grow_(bw, FLAC__BITS_PER_WORD)) - return false; - /* append bits as complete word to buffer, but don't change bw->accum or bw->bits */ - bw->buffer[bw->words] = SWAP_BE_WORD_TO_HOST(bw->accum << (FLAC__BITS_PER_WORD-bw->bits)); - } - /* now we can just return what we have */ - *buffer = (FLAC__byte*)bw->buffer; - *bytes = (FLAC__BYTES_PER_WORD * bw->words) + (bw->bits >> 3); - return true; -} - -void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw) -{ - /* nothing to do. in the future, strict checking of a 'writer-is-in- - * get-mode' flag could be added everywhere and then cleared here - */ - (void)bw; -} - -inline FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits) -{ - unsigned n; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - if(bits == 0) - return true; - /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ - if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits)) - return false; - /* first part gets to word alignment */ - if(bw->bits) { - n = flac_min(FLAC__BITS_PER_WORD - bw->bits, bits); - bw->accum <<= n; - bits -= n; - bw->bits += n; - if(bw->bits == FLAC__BITS_PER_WORD) { - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->bits = 0; - } - else - return true; - } - /* do whole words */ - while(bits >= FLAC__BITS_PER_WORD) { - bw->buffer[bw->words++] = 0; - bits -= FLAC__BITS_PER_WORD; - } - /* do any leftovers */ - if(bits > 0) { - bw->accum = 0; - bw->bits = bits; - } - return true; -} - -inline FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits) -{ - unsigned left; - - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - FLAC__ASSERT(bits <= 32); - if(bits == 0) - return true; - - /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+bits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ - if(bw->capacity <= bw->words + bits && !bitwriter_grow_(bw, bits)) - return false; - - left = FLAC__BITS_PER_WORD - bw->bits; - if(bits < left) { - bw->accum <<= bits; - bw->accum |= val; - bw->bits += bits; - } - else if(bw->bits) { /* WATCHOUT: if bw->bits == 0, left==FLAC__BITS_PER_WORD and bw->accum<<=left is a NOP instead of setting to 0 */ - bw->accum <<= left; - bw->accum |= val >> (bw->bits = bits - left); - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->accum = val; - } - else { - bw->accum = val; - bw->bits = 0; - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(val); - } - - return true; -} - -inline FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits) -{ - /* zero-out unused bits */ - if(bits < 32) - val &= (~(0xffffffff << bits)); - - return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits); -} - -inline FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits) -{ - /* this could be a little faster but it's not used for much */ - if(bits > 32) { - return - FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(val>>32), bits-32) && - FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 32); - } - else - return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, bits); -} - -inline FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val) -{ - /* this doesn't need to be that fast as currently it is only used for vorbis comments */ - - if(!FLAC__bitwriter_write_raw_uint32(bw, val & 0xff, 8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>8) & 0xff, 8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, (val>>16) & 0xff, 8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, val>>24, 8)) - return false; - - return true; -} - -inline FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals) -{ - unsigned i; - - /* this could be faster but currently we don't need it to be since it's only used for writing metadata */ - for(i = 0; i < nvals; i++) { - if(!FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)(vals[i]), 8)) - return false; - } - - return true; -} - -FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val) -{ - if(val < 32) - return FLAC__bitwriter_write_raw_uint32(bw, 1, ++val); - else - return - FLAC__bitwriter_write_zeroes(bw, val) && - FLAC__bitwriter_write_raw_uint32(bw, 1, 1); -} - -unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter) -{ - FLAC__uint32 uval; - - FLAC__ASSERT(parameter < sizeof(unsigned)*8); - - /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ - uval = (val<<1) ^ (val>>31); - - return 1 + parameter + (uval >> parameter); -} - -#if 0 /* UNUSED */ -unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter) -{ - unsigned bits, msbs, uval; - unsigned k; - - FLAC__ASSERT(parameter > 0); - - /* fold signed to unsigned */ - if(val < 0) - uval = (unsigned)(((-(++val)) << 1) + 1); - else - uval = (unsigned)(val << 1); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<> k; - bits = 1 + k + msbs; - } - else { - unsigned q, r, d; - - d = (1 << (k+1)) - parameter; - q = uval / parameter; - r = uval - (q * parameter); - - bits = 1 + q + k; - if(r >= d) - bits++; - } - return bits; -} - -unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned uval, unsigned parameter) -{ - unsigned bits, msbs; - unsigned k; - - FLAC__ASSERT(parameter > 0); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<> k; - bits = 1 + k + msbs; - } - else { - unsigned q, r, d; - - d = (1 << (k+1)) - parameter; - q = uval / parameter; - r = uval - (q * parameter); - - bits = 1 + q + k; - if(r >= d) - bits++; - } - return bits; -} -#endif /* UNUSED */ - -FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter) -{ - unsigned total_bits, interesting_bits, msbs; - FLAC__uint32 uval, pattern; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter < 8*sizeof(uval)); - - /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ - uval = (val<<1) ^ (val>>31); - - msbs = uval >> parameter; - interesting_bits = 1 + parameter; - total_bits = interesting_bits + msbs; - pattern = 1 << parameter; /* the unary end bit */ - pattern |= (uval & ((1<> (31-parameter); /* ...then mask off the bits above the stop bit with val&=mask2*/ - FLAC__uint32 uval; - unsigned left; - const unsigned lsbits = 1 + parameter; - unsigned msbits; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter < 8*sizeof(uint32_t)-1); - /* WATCHOUT: code does not work with <32bit words; we can make things much faster with this assertion */ - FLAC__ASSERT(FLAC__BITS_PER_WORD >= 32); - - while(nvals) { - /* fold signed to unsigned; actual formula is: negative(v)? -2v-1 : 2v */ - uval = (*vals<<1) ^ (*vals>>31); - - msbits = uval >> parameter; - - if(bw->bits && bw->bits + msbits + lsbits < FLAC__BITS_PER_WORD) { /* i.e. if the whole thing fits in the current uint32_t */ - /* ^^^ if bw->bits is 0 then we may have filled the buffer and have no free uint32_t to work in */ - bw->bits = bw->bits + msbits + lsbits; - uval |= mask1; /* set stop bit */ - uval &= mask2; /* mask off unused top bits */ - bw->accum <<= msbits + lsbits; - bw->accum |= uval; - } - else { - /* slightly pessimistic size check but faster than "<= bw->words + (bw->bits+msbits+lsbits+FLAC__BITS_PER_WORD-1)/FLAC__BITS_PER_WORD" */ - /* OPT: pessimism may cause flurry of false calls to grow_ which eat up all savings before it */ - if(bw->capacity <= bw->words + bw->bits + msbits + 1/*lsbits always fit in 1 uint32_t*/ && !bitwriter_grow_(bw, msbits+lsbits)) - return false; - - if(msbits) { - /* first part gets to word alignment */ - if(bw->bits) { - left = FLAC__BITS_PER_WORD - bw->bits; - if(msbits < left) { - bw->accum <<= msbits; - bw->bits += msbits; - goto break1; - } - else { - bw->accum <<= left; - msbits -= left; - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->bits = 0; - } - } - /* do whole words */ - while(msbits >= FLAC__BITS_PER_WORD) { - bw->buffer[bw->words++] = 0; - msbits -= FLAC__BITS_PER_WORD; - } - /* do any leftovers */ - if(msbits > 0) { - bw->accum = 0; - bw->bits = msbits; - } - } -break1: - uval |= mask1; /* set stop bit */ - uval &= mask2; /* mask off unused top bits */ - - left = FLAC__BITS_PER_WORD - bw->bits; - if(lsbits < left) { - bw->accum <<= lsbits; - bw->accum |= uval; - bw->bits += lsbits; - } - else { - /* if bw->bits == 0, left==FLAC__BITS_PER_WORD which will always - * be > lsbits (because of previous assertions) so it would have - * triggered the (lsbitsbits); - FLAC__ASSERT(left < FLAC__BITS_PER_WORD); - bw->accum <<= left; - bw->accum |= uval >> (bw->bits = lsbits - left); - bw->buffer[bw->words++] = SWAP_BE_WORD_TO_HOST(bw->accum); - bw->accum = uval; - } - } - vals++; - nvals--; - } - return true; -} - -#if 0 /* UNUSED */ -FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter) -{ - unsigned total_bits, msbs, uval; - unsigned k; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter > 0); - - /* fold signed to unsigned */ - if(val < 0) - uval = (unsigned)(((-(++val)) << 1) + 1); - else - uval = (unsigned)(val << 1); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<> k; - total_bits = 1 + k + msbs; - pattern = 1 << k; /* the unary end bit */ - pattern |= (uval & ((1u<= d) { - if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1)) - return false; - } - else { - if(!FLAC__bitwriter_write_raw_uint32(bw, r, k)) - return false; - } - } - return true; -} - -FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned uval, unsigned parameter) -{ - unsigned total_bits, msbs; - unsigned k; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - FLAC__ASSERT(parameter > 0); - - k = FLAC__bitmath_ilog2(parameter); - if(parameter == 1u<> k; - total_bits = 1 + k + msbs; - pattern = 1 << k; /* the unary end bit */ - pattern |= (uval & ((1u<= d) { - if(!FLAC__bitwriter_write_raw_uint32(bw, r+d, k+1)) - return false; - } - else { - if(!FLAC__bitwriter_write_raw_uint32(bw, r, k)) - return false; - } - } - return true; -} -#endif /* UNUSED */ - -FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val) -{ - FLAC__bool ok = 1; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - FLAC__ASSERT(!(val & 0x80000000)); /* this version only handles 31 bits */ - - if(val < 0x80) { - return FLAC__bitwriter_write_raw_uint32(bw, val, 8); - } - else if(val < 0x800) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (val>>6), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else if(val < 0x10000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (val>>12), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else if(val < 0x200000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (val>>18), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else if(val < 0x4000000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (val>>24), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - else { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (val>>30), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>24)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | ((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (val&0x3F), 8); - } - - return ok; -} - -FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val) -{ - FLAC__bool ok = 1; - - FLAC__ASSERT(0 != bw); - FLAC__ASSERT(0 != bw->buffer); - - FLAC__ASSERT(!(val & FLAC__U64L(0xFFFFFFF000000000))); /* this version only handles 36 bits */ - - if(val < 0x80) { - return FLAC__bitwriter_write_raw_uint32(bw, (FLAC__uint32)val, 8); - } - else if(val < 0x800) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xC0 | (FLAC__uint32)(val>>6), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x10000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xE0 | (FLAC__uint32)(val>>12), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x200000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF0 | (FLAC__uint32)(val>>18), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x4000000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xF8 | (FLAC__uint32)(val>>24), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else if(val < 0x80000000) { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFC | (FLAC__uint32)(val>>30), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - else { - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0xFE, 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>30)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>24)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>18)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>12)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)((val>>6)&0x3F), 8); - ok &= FLAC__bitwriter_write_raw_uint32(bw, 0x80 | (FLAC__uint32)(val&0x3F), 8); - } - - return ok; -} - -FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw) -{ - /* 0-pad to byte boundary */ - if(bw->bits & 7u) - return FLAC__bitwriter_write_zeroes(bw, 8 - (bw->bits & 7u)); - else - return true; -} - -/* These functions are declared inline in this file but are also callable as - * externs from elsewhere. - * According to the C99 spec, section 6.7.4, simply providing a function - * prototype in a header file without 'inline' and making the function inline - * in this file should be sufficient. - * Unfortunately, the Microsoft VS compiler doesn't pick them up externally. To - * fix that we add extern declarations here. - */ -extern FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits); -extern FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits); -extern FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits); -extern FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val); -extern FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals); diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c deleted file mode 100755 index 46db9e3..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/cpu.c +++ /dev/null @@ -1,490 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "include/private/cpu.h" - -#if 0 - #include - #include - #include -#endif - -#if defined FLAC__CPU_IA32 -# include - -static void disable_sse(FLAC__CPUInfo *info) -{ - info->ia32.sse = false; - info->ia32.sse2 = false; - info->ia32.sse3 = false; - info->ia32.ssse3 = false; - info->ia32.sse41 = false; - info->ia32.sse42 = false; -} - -static void disable_avx(FLAC__CPUInfo *info) -{ - info->ia32.avx = false; - info->ia32.avx2 = false; - info->ia32.fma = false; -} - -#elif defined FLAC__CPU_X86_64 - -static void disable_avx(FLAC__CPUInfo *info) -{ - info->x86.avx = false; - info->x86.avx2 = false; - info->x86.fma = false; -} -#endif - -#if defined (__NetBSD__) || defined(__OpenBSD__) -#include -#include -#include -#endif - -#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) -#include -#include -#endif - -#if defined(__APPLE__) -/* how to get sysctlbyname()? */ -#endif - -#ifdef FLAC__CPU_IA32 -/* these are flags in EDX of CPUID AX=00000001 */ -static const unsigned FLAC__CPUINFO_IA32_CPUID_CMOV = 0x00008000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_MMX = 0x00800000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_FXSR = 0x01000000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE = 0x02000000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE2 = 0x04000000; -#endif - -/* these are flags in ECX of CPUID AX=00000001 */ -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE3 = 0x00000001; -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSSE3 = 0x00000200; -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE41 = 0x00080000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_SSE42 = 0x00100000; - -#if defined FLAC__AVX_SUPPORTED -/* these are flags in ECX of CPUID AX=00000001 */ -static const unsigned FLAC__CPUINFO_IA32_CPUID_OSXSAVE = 0x08000000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_AVX = 0x10000000; -static const unsigned FLAC__CPUINFO_IA32_CPUID_FMA = 0x00001000; -/* these are flags in EBX of CPUID AX=00000007 */ -static const unsigned FLAC__CPUINFO_IA32_CPUID_AVX2 = 0x00000020; -#endif - -/* - * Extra stuff needed for detection of OS support for SSE on IA-32 - */ -#if defined(FLAC__CPU_IA32) && !defined FLAC__NO_ASM && (defined FLAC__HAS_NASM || defined FLAC__HAS_X86INTRIN) && !defined FLAC__NO_SSE_OS && !defined FLAC__SSE_OS -# if defined(__linux__) -/* - * If the OS doesn't support SSE, we will get here with a SIGILL. We - * modify the return address to jump over the offending SSE instruction - * and also the operation following it that indicates the instruction - * executed successfully. In this way we use no global variables and - * stay thread-safe. - * - * 3 + 3 + 6: - * 3 bytes for "xorps xmm0,xmm0" - * 3 bytes for estimate of how long the follwing "inc var" instruction is - * 6 bytes extra in case our estimate is wrong - * 12 bytes puts us in the NOP "landing zone" - */ -# include - static void sigill_handler_sse_os(int signal, siginfo_t *si, void *uc) - { - (void)signal, (void)si; - ((ucontext_t*)uc)->uc_mcontext.gregs[14/*REG_EIP*/] += 3 + 3 + 6; - } -# elif defined(_MSC_VER) -# include -# endif -#endif - - -void FLAC__cpu_info(FLAC__CPUInfo *info) -{ -/* - * IA32-specific - */ -#ifdef FLAC__CPU_IA32 - FLAC__bool ia32_fxsr = false; - FLAC__bool ia32_osxsave = false; - (void) ia32_fxsr; (void) ia32_osxsave; /* to avoid warnings about unused variables */ - memset(info, 0, sizeof(*info)); - info->type = FLAC__CPUINFO_TYPE_IA32; -#if !defined FLAC__NO_ASM && (defined FLAC__HAS_NASM || defined FLAC__HAS_X86INTRIN) - info->use_asm = true; /* we assume a minimum of 80386 with FLAC__CPU_IA32 */ -#ifdef FLAC__HAS_X86INTRIN - if(!FLAC__cpu_have_cpuid_x86()) - return; -#else - if(!FLAC__cpu_have_cpuid_asm_ia32()) - return; -#endif - { - /* http://www.sandpile.org/x86/cpuid.htm */ -#ifdef FLAC__HAS_X86INTRIN - FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx; - FLAC__cpu_info_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); -#else - FLAC__uint32 flags_ecx, flags_edx; - FLAC__cpu_info_asm_ia32(&flags_edx, &flags_ecx); -#endif - info->ia32.cmov = (flags_edx & FLAC__CPUINFO_IA32_CPUID_CMOV )? true : false; - info->ia32.mmx = (flags_edx & FLAC__CPUINFO_IA32_CPUID_MMX )? true : false; - ia32_fxsr = (flags_edx & FLAC__CPUINFO_IA32_CPUID_FXSR )? true : false; - info->ia32.sse = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE )? true : false; - info->ia32.sse2 = (flags_edx & FLAC__CPUINFO_IA32_CPUID_SSE2 )? true : false; - info->ia32.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; - info->ia32.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; - info->ia32.sse41 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE41)? true : false; - info->ia32.sse42 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE42)? true : false; -#if defined FLAC__HAS_X86INTRIN && defined FLAC__AVX_SUPPORTED - ia32_osxsave = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_OSXSAVE)? true : false; - info->ia32.avx = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_AVX )? true : false; - info->ia32.fma = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_FMA )? true : false; - FLAC__cpu_info_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); - info->ia32.avx2 = (flags_ebx & FLAC__CPUINFO_IA32_CPUID_AVX2 )? true : false; -#endif - } - -#ifdef DEBUG - fprintf(stderr, "CPU info (IA-32):\n"); - fprintf(stderr, " CMOV ....... %c\n", info->ia32.cmov ? 'Y' : 'n'); - fprintf(stderr, " MMX ........ %c\n", info->ia32.mmx ? 'Y' : 'n'); - fprintf(stderr, " SSE ........ %c\n", info->ia32.sse ? 'Y' : 'n'); - fprintf(stderr, " SSE2 ....... %c\n", info->ia32.sse2 ? 'Y' : 'n'); - fprintf(stderr, " SSE3 ....... %c\n", info->ia32.sse3 ? 'Y' : 'n'); - fprintf(stderr, " SSSE3 ...... %c\n", info->ia32.ssse3 ? 'Y' : 'n'); - fprintf(stderr, " SSE41 ...... %c\n", info->ia32.sse41 ? 'Y' : 'n'); - fprintf(stderr, " SSE42 ...... %c\n", info->ia32.sse42 ? 'Y' : 'n'); -# if defined FLAC__HAS_X86INTRIN && defined FLAC__AVX_SUPPORTED - fprintf(stderr, " AVX ........ %c\n", info->ia32.avx ? 'Y' : 'n'); - fprintf(stderr, " FMA ........ %c\n", info->ia32.fma ? 'Y' : 'n'); - fprintf(stderr, " AVX2 ....... %c\n", info->ia32.avx2 ? 'Y' : 'n'); -# endif -#endif - - /* - * now have to check for OS support of SSE instructions - */ - if(info->ia32.sse) { -#if defined FLAC__NO_SSE_OS - /* assume user knows better than us; turn it off */ - disable_sse(info); -#elif defined FLAC__SSE_OS - /* assume user knows better than us; leave as detected above */ -#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) || defined(__APPLE__) - int sse = 0; - size_t len; - /* at least one of these must work: */ - len = sizeof(sse); sse = sse || (sysctlbyname("hw.instruction_sse", &sse, &len, NULL, 0) == 0 && sse); - len = sizeof(sse); sse = sse || (sysctlbyname("hw.optional.sse" , &sse, &len, NULL, 0) == 0 && sse); /* __APPLE__ ? */ - if(!sse) - disable_sse(info); -#elif defined(__NetBSD__) || defined (__OpenBSD__) -# if __NetBSD_Version__ >= 105250000 || (defined __OpenBSD__) - int val = 0, mib[2] = { CTL_MACHDEP, CPU_SSE }; - size_t len = sizeof(val); - if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) - disable_sse(info); - else { /* double-check SSE2 */ - mib[1] = CPU_SSE2; - len = sizeof(val); - if(sysctl(mib, 2, &val, &len, NULL, 0) < 0 || !val) { - disable_sse(info); - info->ia32.sse = true; - } - } -# else - disable_sse(info); -# endif -#elif defined(__linux__) - int sse = 0; - struct sigaction sigill_save; - struct sigaction sigill_sse; - sigill_sse.sa_sigaction = sigill_handler_sse_os; - __sigemptyset(&sigill_sse.sa_mask); - sigill_sse.sa_flags = SA_SIGINFO | SA_RESETHAND; /* SA_RESETHAND just in case our SIGILL return jump breaks, so we don't get stuck in a loop */ - if(0 == sigaction(SIGILL, &sigill_sse, &sigill_save)) - { - /* http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html */ - /* see sigill_handler_sse_os() for an explanation of the following: */ - asm volatile ( - "xorps %%xmm0,%%xmm0\n\t" /* will cause SIGILL if unsupported by OS */ - "incl %0\n\t" /* SIGILL handler will jump over this */ - /* landing zone */ - "nop\n\t" /* SIGILL jump lands here if "inc" is 9 bytes */ - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" - "nop\n\t" /* SIGILL jump lands here if "inc" is 3 bytes (expected) */ - "nop\n\t" - "nop" /* SIGILL jump lands here if "inc" is 1 byte */ - : "=r"(sse) - : "0"(sse) - ); - - sigaction(SIGILL, &sigill_save, NULL); - } - - if(!sse) - disable_sse(info); -#elif defined(_MSC_VER) - __try { - __asm { - xorps xmm0,xmm0 - } - } - __except(EXCEPTION_EXECUTE_HANDLER) { - if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) - disable_sse(info); - } -#elif defined(__GNUC__) /* MinGW goes here */ - int sse = 0; - /* Based on the idea described in Agner Fog's manual "Optimizing subroutines in assembly language" */ - /* In theory, not guaranteed to detect lack of OS SSE support on some future Intel CPUs, but in practice works (see the aforementioned manual) */ - if (ia32_fxsr) { - struct { - FLAC__uint32 buff[128]; - } __attribute__((aligned(16))) fxsr; - FLAC__uint32 old_val, new_val; - - asm volatile ("fxsave %0" : "=m" (fxsr) : "m" (fxsr)); - old_val = fxsr.buff[50]; - fxsr.buff[50] ^= 0x0013c0de; /* change value in the buffer */ - asm volatile ("fxrstor %0" : "=m" (fxsr) : "m" (fxsr)); /* try to change SSE register */ - fxsr.buff[50] = old_val; /* restore old value in the buffer */ - asm volatile ("fxsave %0 " : "=m" (fxsr) : "m" (fxsr)); /* old value will be overwritten if SSE register was changed */ - new_val = fxsr.buff[50]; /* == old_val if FXRSTOR didn't change SSE register and (old_val ^ 0x0013c0de) otherwise */ - fxsr.buff[50] = old_val; /* again restore old value in the buffer */ - asm volatile ("fxrstor %0" : "=m" (fxsr) : "m" (fxsr)); /* restore old values of registers */ - - if ((old_val^new_val) == 0x0013c0de) - sse = 1; - } - if(!sse) - disable_sse(info); -#else - /* no way to test, disable to be safe */ - disable_sse(info); -#endif -#ifdef DEBUG - fprintf(stderr, " SSE OS sup . %c\n", info->ia32.sse ? 'Y' : 'n'); -#endif - } - else /* info->ia32.sse == false */ - disable_sse(info); - - /* - * now have to check for OS support of AVX instructions - */ - if(info->ia32.avx && ia32_osxsave) { - FLAC__uint32 ecr = FLAC__cpu_xgetbv_x86(); - if ((ecr & 0x6) != 0x6) - disable_avx(info); -#ifdef DEBUG - fprintf(stderr, " AVX OS sup . %c\n", info->ia32.avx ? 'Y' : 'n'); -#endif - } - else /* no OS AVX support*/ - disable_avx(info); -#else - info->use_asm = false; -#endif - -/* - * x86-64-specific - */ -#elif defined FLAC__CPU_X86_64 - FLAC__bool x86_osxsave = false; - (void) x86_osxsave; /* to avoid warnings about unused variables */ - memset(info, 0, sizeof(*info)); - info->type = FLAC__CPUINFO_TYPE_X86_64; -#if !defined FLAC__NO_ASM && defined FLAC__HAS_X86INTRIN - info->use_asm = true; - { - /* http://www.sandpile.org/x86/cpuid.htm */ - FLAC__uint32 flags_eax, flags_ebx, flags_ecx, flags_edx; - FLAC__cpu_info_x86(1, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); - info->x86.sse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE3 )? true : false; - info->x86.ssse3 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSSE3)? true : false; - info->x86.sse41 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE41)? true : false; - info->x86.sse42 = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_SSE42)? true : false; -#if defined FLAC__AVX_SUPPORTED - x86_osxsave = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_OSXSAVE)? true : false; - info->x86.avx = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_AVX )? true : false; - info->x86.fma = (flags_ecx & FLAC__CPUINFO_IA32_CPUID_FMA )? true : false; - FLAC__cpu_info_x86(7, &flags_eax, &flags_ebx, &flags_ecx, &flags_edx); - info->x86.avx2 = (flags_ebx & FLAC__CPUINFO_IA32_CPUID_AVX2 )? true : false; -#endif - } -#ifdef DEBUG - fprintf(stderr, "CPU info (x86-64):\n"); - fprintf(stderr, " SSE3 ....... %c\n", info->x86.sse3 ? 'Y' : 'n'); - fprintf(stderr, " SSSE3 ...... %c\n", info->x86.ssse3 ? 'Y' : 'n'); - fprintf(stderr, " SSE41 ...... %c\n", info->x86.sse41 ? 'Y' : 'n'); - fprintf(stderr, " SSE42 ...... %c\n", info->x86.sse42 ? 'Y' : 'n'); -# if defined FLAC__AVX_SUPPORTED - fprintf(stderr, " AVX ........ %c\n", info->x86.avx ? 'Y' : 'n'); - fprintf(stderr, " FMA ........ %c\n", info->x86.fma ? 'Y' : 'n'); - fprintf(stderr, " AVX2 ....... %c\n", info->x86.avx2 ? 'Y' : 'n'); -# endif -#endif - - /* - * now have to check for OS support of AVX instructions - */ - if(info->x86.avx && x86_osxsave) { - FLAC__uint32 ecr = FLAC__cpu_xgetbv_x86(); - if ((ecr & 0x6) != 0x6) - disable_avx(info); -#ifdef DEBUG - fprintf(stderr, " AVX OS sup . %c\n", info->x86.avx ? 'Y' : 'n'); -#endif - } - else /* no OS AVX support*/ - disable_avx(info); -#else - info->use_asm = false; -#endif - -/* - * unknown CPU - */ -#else - info->type = FLAC__CPUINFO_TYPE_UNKNOWN; - info->use_asm = false; -#endif -} - -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN - -#if defined _MSC_VER -#include /* for __cpuid() and _xgetbv() */ -#elif defined __GNUC__ && defined HAVE_CPUID_H -#include /* for __get_cpuid() and __get_cpuid_max() */ -#endif - -FLAC__uint32 FLAC__cpu_have_cpuid_x86(void) -{ -#ifdef FLAC__CPU_X86_64 - return 1; -#else -# if defined _MSC_VER || defined __INTEL_COMPILER /* Do they support CPUs w/o CPUID support (or OSes that work on those CPUs)? */ - FLAC__uint32 flags1, flags2; - __asm { - pushfd - pushfd - pop eax - mov flags1, eax - xor eax, 0x200000 - push eax - popfd - pushfd - pop eax - mov flags2, eax - popfd - } - if (((flags1^flags2) & 0x200000) != 0) - return 1; - else - return 0; -# elif defined __GNUC__ && defined HAVE_CPUID_H - if (__get_cpuid_max(0, 0) != 0) - return 1; - else - return 0; -# else - return 0; -# endif -#endif -} - -void FLAC__cpu_info_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx) -{ - (void) level; - -#if defined _MSC_VER || defined __INTEL_COMPILER - int cpuinfo[4]; - int ext = level & 0x80000000; - __cpuid(cpuinfo, ext); - if((unsigned)cpuinfo[0] < level) { - *eax = *ebx = *ecx = *edx = 0; - return; - } -#if defined FLAC__AVX_SUPPORTED - __cpuidex(cpuinfo, level, 0); /* for AVX2 detection */ -#else - __cpuid(cpuinfo, level); /* some old compilers don't support __cpuidex */ -#endif - *eax = cpuinfo[0]; *ebx = cpuinfo[1]; *ecx = cpuinfo[2]; *edx = cpuinfo[3]; -#elif defined __GNUC__ && defined HAVE_CPUID_H - FLAC__uint32 ext = level & 0x80000000; - __cpuid(ext, *eax, *ebx, *ecx, *edx); - if (*eax < level) { - *eax = *ebx = *ecx = *edx = 0; - return; - } - __cpuid_count(level, 0, *eax, *ebx, *ecx, *edx); -#else - *eax = *ebx = *ecx = *edx = 0; -#endif -} - -FLAC__uint32 FLAC__cpu_xgetbv_x86(void) -{ -#if (defined _MSC_VER || defined __INTEL_COMPILER) && defined FLAC__AVX_SUPPORTED - return (FLAC__uint32)_xgetbv(0); -#elif defined __GNUC__ - FLAC__uint32 lo, hi; - asm volatile (".byte 0x0f, 0x01, 0xd0" : "=a"(lo), "=d"(hi) : "c" (0)); - return lo; -#else - return 0; -#endif -} - -#endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c deleted file mode 100755 index f58e7be..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/crc.c +++ /dev/null @@ -1,143 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "include/private/crc.h" - -/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ - -FLAC__byte const FLAC__crc8_table[256] = { - 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, - 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, - 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, - 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, - 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, - 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, - 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, - 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, - 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, - 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, - 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, - 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, - 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, - 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, - 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, - 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, - 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, - 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, - 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, - 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, - 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, - 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, - 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, - 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, - 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, - 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, - 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, - 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, - 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, - 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, - 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, - 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 -}; - -/* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */ - -unsigned const FLAC__crc16_table[256] = { - 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, - 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, - 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, - 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, - 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, - 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, - 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, - 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, - 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, - 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, - 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, - 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, - 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, - 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, - 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, - 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, - 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, - 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, - 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, - 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, - 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, - 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, - 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, - 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, - 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, - 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, - 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, - 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, - 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, - 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, - 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, - 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 -}; - - -void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc) -{ - *crc = FLAC__crc8_table[*crc ^ data]; -} - -void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc) -{ - while(len--) - *crc = FLAC__crc8_table[*crc ^ *data++]; -} - -FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len) -{ - FLAC__uint8 crc = 0; - - while(len--) - crc = FLAC__crc8_table[crc ^ *data++]; - - return crc; -} - -unsigned FLAC__crc16(const FLAC__byte *data, unsigned len) -{ - unsigned crc = 0; - - while(len--) - crc = ((crc<<8) ^ FLAC__crc16_table[(crc>>8) ^ *data++]) & 0xffff; - - return crc; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c deleted file mode 100755 index 78a9ec0..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/fixed.c +++ /dev/null @@ -1,418 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include "../compat.h" -#include "include/private/bitmath.h" -#include "include/private/fixed.h" -#include "../assert.h" - -#ifdef local_abs -#undef local_abs -#endif -#define local_abs(x) ((unsigned)((x)<0? -(x) : (x))) - -#ifdef FLAC__INTEGER_ONLY_LIBRARY -/* rbps stands for residual bits per sample - * - * (ln(2) * err) - * rbps = log (-----------) - * 2 ( n ) - */ -static FLAC__fixedpoint local__compute_rbps_integerized(FLAC__uint32 err, FLAC__uint32 n) -{ - FLAC__uint32 rbps; - unsigned bits; /* the number of bits required to represent a number */ - int fracbits; /* the number of bits of rbps that comprise the fractional part */ - - FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); - FLAC__ASSERT(err > 0); - FLAC__ASSERT(n > 0); - - FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); - if(err <= n) - return 0; - /* - * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. - * These allow us later to know we won't lose too much precision in the - * fixed-point division (err< 0); - bits = FLAC__bitmath_ilog2(err)+1; - if(bits > 16) { - err >>= (bits-16); - fracbits -= (bits-16); - } - rbps = (FLAC__uint32)err; - - /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ - rbps *= FLAC__FP_LN2; - fracbits += 16; - FLAC__ASSERT(fracbits >= 0); - - /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ - { - const int f = fracbits & 3; - if(f) { - rbps >>= f; - fracbits -= f; - } - } - - rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); - - if(rbps == 0) - return 0; - - /* - * The return value must have 16 fractional bits. Since the whole part - * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits - * must be >= -3, these assertion allows us to be able to shift rbps - * left if necessary to get 16 fracbits without losing any bits of the - * whole part of rbps. - * - * There is a slight chance due to accumulated error that the whole part - * will require 6 bits, so we use 6 in the assertion. Really though as - * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. - */ - FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); - FLAC__ASSERT(fracbits >= -3); - - /* now shift the decimal point into place */ - if(fracbits < 16) - return rbps << (16-fracbits); - else if(fracbits > 16) - return rbps >> (fracbits-16); - else - return rbps; -} - -static FLAC__fixedpoint local__compute_rbps_wide_integerized(FLAC__uint64 err, FLAC__uint32 n) -{ - FLAC__uint32 rbps; - unsigned bits; /* the number of bits required to represent a number */ - int fracbits; /* the number of bits of rbps that comprise the fractional part */ - - FLAC__ASSERT(sizeof(rbps) == sizeof(FLAC__fixedpoint)); - FLAC__ASSERT(err > 0); - FLAC__ASSERT(n > 0); - - FLAC__ASSERT(n <= FLAC__MAX_BLOCK_SIZE); - if(err <= n) - return 0; - /* - * The above two things tell us 1) n fits in 16 bits; 2) err/n > 1. - * These allow us later to know we won't lose too much precision in the - * fixed-point division (err< 0); - bits = FLAC__bitmath_ilog2_wide(err)+1; - if(bits > 16) { - err >>= (bits-16); - fracbits -= (bits-16); - } - rbps = (FLAC__uint32)err; - - /* Multiply by fixed-point version of ln(2), with 16 fractional bits */ - rbps *= FLAC__FP_LN2; - fracbits += 16; - FLAC__ASSERT(fracbits >= 0); - - /* FLAC__fixedpoint_log2 requires fracbits%4 to be 0 */ - { - const int f = fracbits & 3; - if(f) { - rbps >>= f; - fracbits -= f; - } - } - - rbps = FLAC__fixedpoint_log2(rbps, fracbits, (unsigned)(-1)); - - if(rbps == 0) - return 0; - - /* - * The return value must have 16 fractional bits. Since the whole part - * of the base-2 log of a 32 bit number must fit in 5 bits, and fracbits - * must be >= -3, these assertion allows us to be able to shift rbps - * left if necessary to get 16 fracbits without losing any bits of the - * whole part of rbps. - * - * There is a slight chance due to accumulated error that the whole part - * will require 6 bits, so we use 6 in the assertion. Really though as - * long as it fits in 13 bits (32 - (16 - (-3))) we are fine. - */ - FLAC__ASSERT((int)FLAC__bitmath_ilog2(rbps)+1 <= fracbits + 6); - FLAC__ASSERT(fracbits >= -3); - - /* now shift the decimal point into place */ - if(fracbits < 16) - return rbps << (16-fracbits); - else if(fracbits > 16) - return rbps >> (fracbits-16); - else - return rbps; -} -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) -#else -unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) -#endif -{ - FLAC__int32 last_error_0 = data[-1]; - FLAC__int32 last_error_1 = data[-1] - data[-2]; - FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); - FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); - FLAC__int32 error, save; - FLAC__uint32 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; - unsigned i, order; - - for(i = 0; i < data_len; i++) { - error = data[i] ; total_error_0 += local_abs(error); save = error; - error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; - error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; - error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; - error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; - } - - if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < flac_min(total_error_3, total_error_4)) - order = 2; - else if(total_error_3 < total_error_4) - order = 3; - else - order = 4; - - /* Estimate the expected number of bits per residual signal sample. */ - /* 'total_error*' is linearly related to the variance of the residual */ - /* signal, so we use it directly to compute E(|x|) */ - FLAC__ASSERT(data_len > 0 || total_error_0 == 0); - FLAC__ASSERT(data_len > 0 || total_error_1 == 0); - FLAC__ASSERT(data_len > 0 || total_error_2 == 0); - FLAC__ASSERT(data_len > 0 || total_error_3 == 0); - FLAC__ASSERT(data_len > 0 || total_error_4 == 0); -#ifndef FLAC__INTEGER_ONLY_LIBRARY - residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); -#else - residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_integerized(total_error_0, data_len) : 0; - residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_integerized(total_error_1, data_len) : 0; - residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_integerized(total_error_2, data_len) : 0; - residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_integerized(total_error_3, data_len) : 0; - residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_integerized(total_error_4, data_len) : 0; -#endif - - return order; -} - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) -#else -unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]) -#endif -{ - FLAC__int32 last_error_0 = data[-1]; - FLAC__int32 last_error_1 = data[-1] - data[-2]; - FLAC__int32 last_error_2 = last_error_1 - (data[-2] - data[-3]); - FLAC__int32 last_error_3 = last_error_2 - (data[-2] - 2*data[-3] + data[-4]); - FLAC__int32 error, save; - /* total_error_* are 64-bits to avoid overflow when encoding - * erratic signals when the bits-per-sample and blocksize are - * large. - */ - FLAC__uint64 total_error_0 = 0, total_error_1 = 0, total_error_2 = 0, total_error_3 = 0, total_error_4 = 0; - unsigned i, order; - - for(i = 0; i < data_len; i++) { - error = data[i] ; total_error_0 += local_abs(error); save = error; - error -= last_error_0; total_error_1 += local_abs(error); last_error_0 = save; save = error; - error -= last_error_1; total_error_2 += local_abs(error); last_error_1 = save; save = error; - error -= last_error_2; total_error_3 += local_abs(error); last_error_2 = save; save = error; - error -= last_error_3; total_error_4 += local_abs(error); last_error_3 = save; - } - - if(total_error_0 < flac_min(flac_min(flac_min(total_error_1, total_error_2), total_error_3), total_error_4)) - order = 0; - else if(total_error_1 < flac_min(flac_min(total_error_2, total_error_3), total_error_4)) - order = 1; - else if(total_error_2 < flac_min(total_error_3, total_error_4)) - order = 2; - else if(total_error_3 < total_error_4) - order = 3; - else - order = 4; - - /* Estimate the expected number of bits per residual signal sample. */ - /* 'total_error*' is linearly related to the variance of the residual */ - /* signal, so we use it directly to compute E(|x|) */ - FLAC__ASSERT(data_len > 0 || total_error_0 == 0); - FLAC__ASSERT(data_len > 0 || total_error_1 == 0); - FLAC__ASSERT(data_len > 0 || total_error_2 == 0); - FLAC__ASSERT(data_len > 0 || total_error_3 == 0); - FLAC__ASSERT(data_len > 0 || total_error_4 == 0); -#ifndef FLAC__INTEGER_ONLY_LIBRARY - residual_bits_per_sample[0] = (FLAC__float)((total_error_0 > 0) ? log(M_LN2 * (FLAC__double)total_error_0 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[1] = (FLAC__float)((total_error_1 > 0) ? log(M_LN2 * (FLAC__double)total_error_1 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[2] = (FLAC__float)((total_error_2 > 0) ? log(M_LN2 * (FLAC__double)total_error_2 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[3] = (FLAC__float)((total_error_3 > 0) ? log(M_LN2 * (FLAC__double)total_error_3 / (FLAC__double)data_len) / M_LN2 : 0.0); - residual_bits_per_sample[4] = (FLAC__float)((total_error_4 > 0) ? log(M_LN2 * (FLAC__double)total_error_4 / (FLAC__double)data_len) / M_LN2 : 0.0); -#else - residual_bits_per_sample[0] = (total_error_0 > 0) ? local__compute_rbps_wide_integerized(total_error_0, data_len) : 0; - residual_bits_per_sample[1] = (total_error_1 > 0) ? local__compute_rbps_wide_integerized(total_error_1, data_len) : 0; - residual_bits_per_sample[2] = (total_error_2 > 0) ? local__compute_rbps_wide_integerized(total_error_2, data_len) : 0; - residual_bits_per_sample[3] = (total_error_3 > 0) ? local__compute_rbps_wide_integerized(total_error_3, data_len) : 0; - residual_bits_per_sample[4] = (total_error_4 > 0) ? local__compute_rbps_wide_integerized(total_error_4, data_len) : 0; -#endif - - return order; -} - -void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]) -{ - const int idata_len = (int)data_len; - int i; - - switch(order) { - case 0: - FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); - memcpy(residual, data, sizeof(residual[0])*data_len); - break; - case 1: - for(i = 0; i < idata_len; i++) - residual[i] = data[i] - data[i-1]; - break; - case 2: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - residual[i] = data[i] - (data[i-1] << 1) + data[i-2]; -#else - residual[i] = data[i] - 2*data[i-1] + data[i-2]; -#endif - break; - case 3: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - residual[i] = data[i] - (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) - data[i-3]; -#else - residual[i] = data[i] - 3*data[i-1] + 3*data[i-2] - data[i-3]; -#endif - break; - case 4: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - residual[i] = data[i] - ((data[i-1]+data[i-3])<<2) + ((data[i-2]<<2) + (data[i-2]<<1)) + data[i-4]; -#else - residual[i] = data[i] - 4*data[i-1] + 6*data[i-2] - 4*data[i-3] + data[i-4]; -#endif - break; - default: - FLAC__ASSERT(0); - } -} - -void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]) -{ - int i, idata_len = (int)data_len; - - switch(order) { - case 0: - FLAC__ASSERT(sizeof(residual[0]) == sizeof(data[0])); - memcpy(data, residual, sizeof(residual[0])*data_len); - break; - case 1: - for(i = 0; i < idata_len; i++) - data[i] = residual[i] + data[i-1]; - break; - case 2: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - data[i] = residual[i] + (data[i-1]<<1) - data[i-2]; -#else - data[i] = residual[i] + 2*data[i-1] - data[i-2]; -#endif - break; - case 3: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - data[i] = residual[i] + (((data[i-1]-data[i-2])<<1) + (data[i-1]-data[i-2])) + data[i-3]; -#else - data[i] = residual[i] + 3*data[i-1] - 3*data[i-2] + data[i-3]; -#endif - break; - case 4: - for(i = 0; i < idata_len; i++) -#if 1 /* OPT: may be faster with some compilers on some systems */ - data[i] = residual[i] + ((data[i-1]+data[i-3])<<2) - ((data[i-2]<<2) + (data[i-2]<<1)) - data[i-4]; -#else - data[i] = residual[i] + 4*data[i-1] - 6*data[i-2] + 4*data[i-3] - data[i-4]; -#endif - break; - default: - FLAC__ASSERT(0); - } -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c deleted file mode 100755 index 1c16a2b..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/float.c +++ /dev/null @@ -1,302 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "../assert.h" -#include "../compat.h" -#include "include/private/float.h" - -#ifdef FLAC__INTEGER_ONLY_LIBRARY - -const FLAC__fixedpoint FLAC__FP_ZERO = 0; -const FLAC__fixedpoint FLAC__FP_ONE_HALF = 0x00008000; -const FLAC__fixedpoint FLAC__FP_ONE = 0x00010000; -const FLAC__fixedpoint FLAC__FP_LN2 = 45426; -const FLAC__fixedpoint FLAC__FP_E = 178145; - -/* Lookup tables for Knuth's logarithm algorithm */ -#define LOG2_LOOKUP_PRECISION 16 -static const FLAC__uint32 log2_lookup[][LOG2_LOOKUP_PRECISION] = { - { - /* - * 0 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00000001, - /* lg(4/3) = */ 0x00000000, - /* lg(8/7) = */ 0x00000000, - /* lg(16/15) = */ 0x00000000, - /* lg(32/31) = */ 0x00000000, - /* lg(64/63) = */ 0x00000000, - /* lg(128/127) = */ 0x00000000, - /* lg(256/255) = */ 0x00000000, - /* lg(512/511) = */ 0x00000000, - /* lg(1024/1023) = */ 0x00000000, - /* lg(2048/2047) = */ 0x00000000, - /* lg(4096/4095) = */ 0x00000000, - /* lg(8192/8191) = */ 0x00000000, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 4 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00000010, - /* lg(4/3) = */ 0x00000007, - /* lg(8/7) = */ 0x00000003, - /* lg(16/15) = */ 0x00000001, - /* lg(32/31) = */ 0x00000001, - /* lg(64/63) = */ 0x00000000, - /* lg(128/127) = */ 0x00000000, - /* lg(256/255) = */ 0x00000000, - /* lg(512/511) = */ 0x00000000, - /* lg(1024/1023) = */ 0x00000000, - /* lg(2048/2047) = */ 0x00000000, - /* lg(4096/4095) = */ 0x00000000, - /* lg(8192/8191) = */ 0x00000000, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 8 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00000100, - /* lg(4/3) = */ 0x0000006a, - /* lg(8/7) = */ 0x00000031, - /* lg(16/15) = */ 0x00000018, - /* lg(32/31) = */ 0x0000000c, - /* lg(64/63) = */ 0x00000006, - /* lg(128/127) = */ 0x00000003, - /* lg(256/255) = */ 0x00000001, - /* lg(512/511) = */ 0x00000001, - /* lg(1024/1023) = */ 0x00000000, - /* lg(2048/2047) = */ 0x00000000, - /* lg(4096/4095) = */ 0x00000000, - /* lg(8192/8191) = */ 0x00000000, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 12 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00001000, - /* lg(4/3) = */ 0x000006a4, - /* lg(8/7) = */ 0x00000315, - /* lg(16/15) = */ 0x0000017d, - /* lg(32/31) = */ 0x000000bc, - /* lg(64/63) = */ 0x0000005d, - /* lg(128/127) = */ 0x0000002e, - /* lg(256/255) = */ 0x00000017, - /* lg(512/511) = */ 0x0000000c, - /* lg(1024/1023) = */ 0x00000006, - /* lg(2048/2047) = */ 0x00000003, - /* lg(4096/4095) = */ 0x00000001, - /* lg(8192/8191) = */ 0x00000001, - /* lg(16384/16383) = */ 0x00000000, - /* lg(32768/32767) = */ 0x00000000 - }, - { - /* - * 16 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00010000, - /* lg(4/3) = */ 0x00006a40, - /* lg(8/7) = */ 0x00003151, - /* lg(16/15) = */ 0x000017d6, - /* lg(32/31) = */ 0x00000bba, - /* lg(64/63) = */ 0x000005d1, - /* lg(128/127) = */ 0x000002e6, - /* lg(256/255) = */ 0x00000172, - /* lg(512/511) = */ 0x000000b9, - /* lg(1024/1023) = */ 0x0000005c, - /* lg(2048/2047) = */ 0x0000002e, - /* lg(4096/4095) = */ 0x00000017, - /* lg(8192/8191) = */ 0x0000000c, - /* lg(16384/16383) = */ 0x00000006, - /* lg(32768/32767) = */ 0x00000003 - }, - { - /* - * 20 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x00100000, - /* lg(4/3) = */ 0x0006a3fe, - /* lg(8/7) = */ 0x00031513, - /* lg(16/15) = */ 0x00017d60, - /* lg(32/31) = */ 0x0000bb9d, - /* lg(64/63) = */ 0x00005d10, - /* lg(128/127) = */ 0x00002e59, - /* lg(256/255) = */ 0x00001721, - /* lg(512/511) = */ 0x00000b8e, - /* lg(1024/1023) = */ 0x000005c6, - /* lg(2048/2047) = */ 0x000002e3, - /* lg(4096/4095) = */ 0x00000171, - /* lg(8192/8191) = */ 0x000000b9, - /* lg(16384/16383) = */ 0x0000005c, - /* lg(32768/32767) = */ 0x0000002e - }, - { - /* - * 24 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x01000000, - /* lg(4/3) = */ 0x006a3fe6, - /* lg(8/7) = */ 0x00315130, - /* lg(16/15) = */ 0x0017d605, - /* lg(32/31) = */ 0x000bb9ca, - /* lg(64/63) = */ 0x0005d0fc, - /* lg(128/127) = */ 0x0002e58f, - /* lg(256/255) = */ 0x0001720e, - /* lg(512/511) = */ 0x0000b8d8, - /* lg(1024/1023) = */ 0x00005c61, - /* lg(2048/2047) = */ 0x00002e2d, - /* lg(4096/4095) = */ 0x00001716, - /* lg(8192/8191) = */ 0x00000b8b, - /* lg(16384/16383) = */ 0x000005c5, - /* lg(32768/32767) = */ 0x000002e3 - }, - { - /* - * 28 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ 0x10000000, - /* lg(4/3) = */ 0x06a3fe5c, - /* lg(8/7) = */ 0x03151301, - /* lg(16/15) = */ 0x017d6049, - /* lg(32/31) = */ 0x00bb9ca6, - /* lg(64/63) = */ 0x005d0fba, - /* lg(128/127) = */ 0x002e58f7, - /* lg(256/255) = */ 0x001720da, - /* lg(512/511) = */ 0x000b8d87, - /* lg(1024/1023) = */ 0x0005c60b, - /* lg(2048/2047) = */ 0x0002e2d7, - /* lg(4096/4095) = */ 0x00017160, - /* lg(8192/8191) = */ 0x0000b8ad, - /* lg(16384/16383) = */ 0x00005c56, - /* lg(32768/32767) = */ 0x00002e2b - } -}; - -#if 0 -static const FLAC__uint64 log2_lookup_wide[] = { - { - /* - * 32 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ FLAC__U64L(0x100000000), - /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c6), - /* lg(8/7) = */ FLAC__U64L(0x31513015), - /* lg(16/15) = */ FLAC__U64L(0x17d60497), - /* lg(32/31) = */ FLAC__U64L(0x0bb9ca65), - /* lg(64/63) = */ FLAC__U64L(0x05d0fba2), - /* lg(128/127) = */ FLAC__U64L(0x02e58f74), - /* lg(256/255) = */ FLAC__U64L(0x01720d9c), - /* lg(512/511) = */ FLAC__U64L(0x00b8d875), - /* lg(1024/1023) = */ FLAC__U64L(0x005c60aa), - /* lg(2048/2047) = */ FLAC__U64L(0x002e2d72), - /* lg(4096/4095) = */ FLAC__U64L(0x00171600), - /* lg(8192/8191) = */ FLAC__U64L(0x000b8ad2), - /* lg(16384/16383) = */ FLAC__U64L(0x0005c55d), - /* lg(32768/32767) = */ FLAC__U64L(0x0002e2ac) - }, - { - /* - * 48 fraction bits - */ - /* undefined */ 0x00000000, - /* lg(2/1) = */ FLAC__U64L(0x1000000000000), - /* lg(4/3) = */ FLAC__U64L(0x6a3fe5c60429), - /* lg(8/7) = */ FLAC__U64L(0x315130157f7a), - /* lg(16/15) = */ FLAC__U64L(0x17d60496cfbb), - /* lg(32/31) = */ FLAC__U64L(0xbb9ca64ecac), - /* lg(64/63) = */ FLAC__U64L(0x5d0fba187cd), - /* lg(128/127) = */ FLAC__U64L(0x2e58f7441ee), - /* lg(256/255) = */ FLAC__U64L(0x1720d9c06a8), - /* lg(512/511) = */ FLAC__U64L(0xb8d8752173), - /* lg(1024/1023) = */ FLAC__U64L(0x5c60aa252e), - /* lg(2048/2047) = */ FLAC__U64L(0x2e2d71b0d8), - /* lg(4096/4095) = */ FLAC__U64L(0x1716001719), - /* lg(8192/8191) = */ FLAC__U64L(0xb8ad1de1b), - /* lg(16384/16383) = */ FLAC__U64L(0x5c55d640d), - /* lg(32768/32767) = */ FLAC__U64L(0x2e2abcf52) - } -}; -#endif - -FLAC__uint32 FLAC__fixedpoint_log2(FLAC__uint32 x, unsigned fracbits, unsigned precision) -{ - const FLAC__uint32 ONE = (1u << fracbits); - const FLAC__uint32 *table = log2_lookup[fracbits >> 2]; - - FLAC__ASSERT(fracbits < 32); - FLAC__ASSERT((fracbits & 0x3) == 0); - - if(x < ONE) - return 0; - - if(precision > LOG2_LOOKUP_PRECISION) - precision = LOG2_LOOKUP_PRECISION; - - /* Knuth's algorithm for computing logarithms, optimized for base-2 with lookup tables */ - { - FLAC__uint32 y = 0; - FLAC__uint32 z = x >> 1, k = 1; - while (x > ONE && k < precision) { - if (x - z >= ONE) { - x -= z; - z = x >> k; - y += table[k]; - } - else { - z >>= 1; - k++; - } - } - return y; - } -} - -#endif /* defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c deleted file mode 100755 index eb8f56f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/format.c +++ /dev/null @@ -1,584 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include /* for qsort() */ -#include /* for memset() */ -#include "../assert.h" -#include "../format.h" -#include "../compat.h" -#include "include/private/format.h" - -/* VERSION should come from configure */ -FLAC_API const char *FLAC__VERSION_STRING = VERSION; - -FLAC_API const char *FLAC__VENDOR_STRING = "reference libFLAC " VERSION " 20141125"; - -FLAC_API const FLAC__byte FLAC__STREAM_SYNC_STRING[4] = { 'f','L','a','C' }; -FLAC_API const unsigned FLAC__STREAM_SYNC = 0x664C6143; -FLAC_API const unsigned FLAC__STREAM_SYNC_LEN = 32; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN = 16; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN = 16; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN = 24; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN = 24; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN = 20; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN = 3; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN = 5; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN = 36; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_STREAMINFO_MD5SUM_LEN = 128; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_APPLICATION_ID_LEN = 32; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN = 64; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN = 64; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN = 16; /* bits */ - -FLAC_API const FLAC__uint64 FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER = FLAC__U64L(0xffffffffffffffff); - -FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN = 32; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN = 64; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN = 8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN = 3*8; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN = 64; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN = 8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN = 12*8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN = 1; /* bit */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN = 1; /* bit */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN = 6+13*8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN = 8; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN = 128*8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN = 64; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN = 1; /* bit */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN = 7+258*8; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN = 8; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_TYPE_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_COLORS_LEN = 32; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN = 32; /* bits */ - -FLAC_API const unsigned FLAC__STREAM_METADATA_IS_LAST_LEN = 1; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_TYPE_LEN = 7; /* bits */ -FLAC_API const unsigned FLAC__STREAM_METADATA_LENGTH_LEN = 24; /* bits */ - -FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC = 0x3ffe; -FLAC_API const unsigned FLAC__FRAME_HEADER_SYNC_LEN = 14; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_RESERVED_LEN = 1; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN = 1; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_BLOCK_SIZE_LEN = 4; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_SAMPLE_RATE_LEN = 4; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN = 4; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN = 3; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_ZERO_PAD_LEN = 1; /* bits */ -FLAC_API const unsigned FLAC__FRAME_HEADER_CRC_LEN = 8; /* bits */ - -FLAC_API const unsigned FLAC__FRAME_FOOTER_CRC_LEN = 16; /* bits */ - -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_TYPE_LEN = 2; /* bits */ -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN = 4; /* bits */ -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN = 4; /* bits */ -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN = 5; /* bits */ -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN = 5; /* bits */ - -FLAC_API const unsigned FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER = 15; /* == (1< FLAC__MAX_SAMPLE_RATE) { - return false; - } - else - return true; -} - -FLAC_API FLAC__bool FLAC__format_blocksize_is_subset(unsigned blocksize, unsigned sample_rate) -{ - if(blocksize > 16384) - return false; - else if(sample_rate <= 48000 && blocksize > 4608) - return false; - else - return true; -} - -FLAC_API FLAC__bool FLAC__format_sample_rate_is_subset(unsigned sample_rate) -{ - if( - !FLAC__format_sample_rate_is_valid(sample_rate) || - ( - sample_rate >= (1u << 16) && - !(sample_rate % 1000 == 0 || sample_rate % 10 == 0) - ) - ) { - return false; - } - else - return true; -} - -/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API FLAC__bool FLAC__format_seektable_is_legal(const FLAC__StreamMetadata_SeekTable *seek_table) -{ - unsigned i; - FLAC__uint64 prev_sample_number = 0; - FLAC__bool got_prev = false; - - FLAC__ASSERT(0 != seek_table); - - for(i = 0; i < seek_table->num_points; i++) { - if(got_prev) { - if( - seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && - seek_table->points[i].sample_number <= prev_sample_number - ) - return false; - } - prev_sample_number = seek_table->points[i].sample_number; - got_prev = true; - } - - return true; -} - -/* used as the sort predicate for qsort() */ -static int seekpoint_compare_(const FLAC__StreamMetadata_SeekPoint *l, const FLAC__StreamMetadata_SeekPoint *r) -{ - /* we don't just 'return l->sample_number - r->sample_number' since the result (FLAC__int64) might overflow an 'int' */ - if(l->sample_number == r->sample_number) - return 0; - else if(l->sample_number < r->sample_number) - return -1; - else - return 1; -} - -/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API unsigned FLAC__format_seektable_sort(FLAC__StreamMetadata_SeekTable *seek_table) -{ - unsigned i, j; - FLAC__bool first; - - FLAC__ASSERT(0 != seek_table); - - /* sort the seekpoints */ - qsort(seek_table->points, seek_table->num_points, sizeof(FLAC__StreamMetadata_SeekPoint), (int (*)(const void *, const void *))seekpoint_compare_); - - /* uniquify the seekpoints */ - first = true; - for(i = j = 0; i < seek_table->num_points; i++) { - if(seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER) { - if(!first) { - if(seek_table->points[i].sample_number == seek_table->points[j-1].sample_number) - continue; - } - } - first = false; - seek_table->points[j++] = seek_table->points[i]; - } - - for(i = j; i < seek_table->num_points; i++) { - seek_table->points[i].sample_number = FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER; - seek_table->points[i].stream_offset = 0; - seek_table->points[i].frame_samples = 0; - } - - return j; -} - -/* - * also disallows non-shortest-form encodings, c.f. - * http://www.unicode.org/versions/corrigendum1.html - * and a more clear explanation at the end of this section: - * http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - */ -static unsigned utf8len_(const FLAC__byte *utf8) -{ - FLAC__ASSERT(0 != utf8); - if ((utf8[0] & 0x80) == 0) { - return 1; - } - else if ((utf8[0] & 0xE0) == 0xC0 && (utf8[1] & 0xC0) == 0x80) { - if ((utf8[0] & 0xFE) == 0xC0) /* overlong sequence check */ - return 0; - return 2; - } - else if ((utf8[0] & 0xF0) == 0xE0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80) { - if (utf8[0] == 0xE0 && (utf8[1] & 0xE0) == 0x80) /* overlong sequence check */ - return 0; - /* illegal surrogates check (U+D800...U+DFFF and U+FFFE...U+FFFF) */ - if (utf8[0] == 0xED && (utf8[1] & 0xE0) == 0xA0) /* D800-DFFF */ - return 0; - if (utf8[0] == 0xEF && utf8[1] == 0xBF && (utf8[2] & 0xFE) == 0xBE) /* FFFE-FFFF */ - return 0; - return 3; - } - else if ((utf8[0] & 0xF8) == 0xF0 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80) { - if (utf8[0] == 0xF0 && (utf8[1] & 0xF0) == 0x80) /* overlong sequence check */ - return 0; - return 4; - } - else if ((utf8[0] & 0xFC) == 0xF8 && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80) { - if (utf8[0] == 0xF8 && (utf8[1] & 0xF8) == 0x80) /* overlong sequence check */ - return 0; - return 5; - } - else if ((utf8[0] & 0xFE) == 0xFC && (utf8[1] & 0xC0) == 0x80 && (utf8[2] & 0xC0) == 0x80 && (utf8[3] & 0xC0) == 0x80 && (utf8[4] & 0xC0) == 0x80 && (utf8[5] & 0xC0) == 0x80) { - if (utf8[0] == 0xFC && (utf8[1] & 0xFC) == 0x80) /* overlong sequence check */ - return 0; - return 6; - } - else { - return 0; - } -} - -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_name_is_legal(const char *name) -{ - char c; - for(c = *name; c; c = *(++name)) - if(c < 0x20 || c == 0x3d || c > 0x7d) - return false; - return true; -} - -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_value_is_legal(const FLAC__byte *value, unsigned length) -{ - if(length == (unsigned)(-1)) { - while(*value) { - unsigned n = utf8len_(value); - if(n == 0) - return false; - value += n; - } - } - else { - const FLAC__byte *end = value + length; - while(value < end) { - unsigned n = utf8len_(value); - if(n == 0) - return false; - value += n; - } - if(value != end) - return false; - } - return true; -} - -FLAC_API FLAC__bool FLAC__format_vorbiscomment_entry_is_legal(const FLAC__byte *entry, unsigned length) -{ - const FLAC__byte *s, *end; - - for(s = entry, end = s + length; s < end && *s != '='; s++) { - if(*s < 0x20 || *s > 0x7D) - return false; - } - if(s == end) - return false; - - s++; /* skip '=' */ - - while(s < end) { - unsigned n = utf8len_(s); - if(n == 0) - return false; - s += n; - } - if(s != end) - return false; - - return true; -} - -/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API FLAC__bool FLAC__format_cuesheet_is_legal(const FLAC__StreamMetadata_CueSheet *cue_sheet, FLAC__bool check_cd_da_subset, const char **violation) -{ - unsigned i, j; - - if(check_cd_da_subset) { - if(cue_sheet->lead_in < 2 * 44100) { - if(violation) *violation = "CD-DA cue sheet must have a lead-in length of at least 2 seconds"; - return false; - } - if(cue_sheet->lead_in % 588 != 0) { - if(violation) *violation = "CD-DA cue sheet lead-in length must be evenly divisible by 588 samples"; - return false; - } - } - - if(cue_sheet->num_tracks == 0) { - if(violation) *violation = "cue sheet must have at least one track (the lead-out)"; - return false; - } - - if(check_cd_da_subset && cue_sheet->tracks[cue_sheet->num_tracks-1].number != 170) { - if(violation) *violation = "CD-DA cue sheet must have a lead-out track number 170 (0xAA)"; - return false; - } - - for(i = 0; i < cue_sheet->num_tracks; i++) { - if(cue_sheet->tracks[i].number == 0) { - if(violation) *violation = "cue sheet may not have a track number 0"; - return false; - } - - if(check_cd_da_subset) { - if(!((cue_sheet->tracks[i].number >= 1 && cue_sheet->tracks[i].number <= 99) || cue_sheet->tracks[i].number == 170)) { - if(violation) *violation = "CD-DA cue sheet track number must be 1-99 or 170"; - return false; - } - } - - if(check_cd_da_subset && cue_sheet->tracks[i].offset % 588 != 0) { - if(violation) { - if(i == cue_sheet->num_tracks-1) /* the lead-out track... */ - *violation = "CD-DA cue sheet lead-out offset must be evenly divisible by 588 samples"; - else - *violation = "CD-DA cue sheet track offset must be evenly divisible by 588 samples"; - } - return false; - } - - if(i < cue_sheet->num_tracks - 1) { - if(cue_sheet->tracks[i].num_indices == 0) { - if(violation) *violation = "cue sheet track must have at least one index point"; - return false; - } - - if(cue_sheet->tracks[i].indices[0].number > 1) { - if(violation) *violation = "cue sheet track's first index number must be 0 or 1"; - return false; - } - } - - for(j = 0; j < cue_sheet->tracks[i].num_indices; j++) { - if(check_cd_da_subset && cue_sheet->tracks[i].indices[j].offset % 588 != 0) { - if(violation) *violation = "CD-DA cue sheet track index offset must be evenly divisible by 588 samples"; - return false; - } - - if(j > 0) { - if(cue_sheet->tracks[i].indices[j].number != cue_sheet->tracks[i].indices[j-1].number + 1) { - if(violation) *violation = "cue sheet track index numbers must increase by 1"; - return false; - } - } - } - } - - return true; -} - -/* @@@@ add to unit tests; it is already indirectly tested by the metadata_object tests */ -FLAC_API FLAC__bool FLAC__format_picture_is_legal(const FLAC__StreamMetadata_Picture *picture, const char **violation) -{ - char *p; - FLAC__byte *b; - - for(p = picture->mime_type; *p; p++) { - if(*p < 0x20 || *p > 0x7e) { - if(violation) *violation = "MIME type string must contain only printable ASCII characters (0x20-0x7e)"; - return false; - } - } - - for(b = picture->description; *b; ) { - unsigned n = utf8len_(b); - if(n == 0) { - if(violation) *violation = "description string must be valid UTF-8"; - return false; - } - b += n; - } - - return true; -} - -/* - * These routines are private to libFLAC - */ -unsigned FLAC__format_get_max_rice_partition_order(unsigned blocksize, unsigned predictor_order) -{ - return - FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order( - FLAC__format_get_max_rice_partition_order_from_blocksize(blocksize), - blocksize, - predictor_order - ); -} - -unsigned FLAC__format_get_max_rice_partition_order_from_blocksize(unsigned blocksize) -{ - unsigned max_rice_partition_order = 0; - while(!(blocksize & 1)) { - max_rice_partition_order++; - blocksize >>= 1; - } - return flac_min(FLAC__MAX_RICE_PARTITION_ORDER, max_rice_partition_order); -} - -unsigned FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(unsigned limit, unsigned blocksize, unsigned predictor_order) -{ - unsigned max_rice_partition_order = limit; - - while(max_rice_partition_order > 0 && (blocksize >> max_rice_partition_order) <= predictor_order) - max_rice_partition_order--; - - FLAC__ASSERT( - (max_rice_partition_order == 0 && blocksize >= predictor_order) || - (max_rice_partition_order > 0 && blocksize >> max_rice_partition_order > predictor_order) - ); - - return max_rice_partition_order; -} - -void FLAC__format_entropy_coding_method_partitioned_rice_contents_init(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) -{ - FLAC__ASSERT(0 != object); - - object->parameters = 0; - object->raw_bits = 0; - object->capacity_by_order = 0; -} - -void FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(FLAC__EntropyCodingMethod_PartitionedRiceContents *object) -{ - FLAC__ASSERT(0 != object); - - if(0 != object->parameters) - free(object->parameters); - if(0 != object->raw_bits) - free(object->raw_bits); - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(object); -} - -FLAC__bool FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(FLAC__EntropyCodingMethod_PartitionedRiceContents *object, unsigned max_partition_order) -{ - FLAC__ASSERT(0 != object); - - FLAC__ASSERT(object->capacity_by_order > 0 || (0 == object->parameters && 0 == object->raw_bits)); - - if(object->capacity_by_order < max_partition_order) { - if(0 == (object->parameters = (unsigned int*) realloc(object->parameters, sizeof(unsigned)*(1 << max_partition_order)))) - return false; - if(0 == (object->raw_bits = (unsigned int*) realloc(object->raw_bits, sizeof(unsigned)*(1 << max_partition_order)))) - return false; - memset(object->raw_bits, 0, sizeof(unsigned)*(1 << max_partition_order)); - object->capacity_by_order = max_partition_order; - } - - return true; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h deleted file mode 100755 index a526071..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/all.h +++ /dev/null @@ -1,50 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__ALL_H -#define FLAC__PRIVATE__ALL_H - -#include "bitmath.h" -#include "bitreader.h" -#include "bitwriter.h" -#include "cpu.h" -#include "crc.h" -#include "fixed.h" -#include "float.h" -#include "format.h" -#include "lpc.h" -#include "md5.h" -#include "memory.h" -#include "metadata.h" -#include "stream_encoder_framing.h" - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h deleted file mode 100755 index 9ca9ec3..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitmath.h +++ /dev/null @@ -1,186 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__BITMATH_H -#define FLAC__PRIVATE__BITMATH_H - -#include "../../../ordinals.h" -#include "../../../assert.h" - -/* for CHAR_BIT */ -#include -#include "../../../compat.h" - -#if defined(_MSC_VER) && (_MSC_VER >= 1400) -#include /* for _BitScanReverse* */ -#endif - -/* Will never be emitted for MSVC, GCC, Intel compilers */ -static inline unsigned int FLAC__clz_soft_uint32(unsigned int word) -{ - static const unsigned char byte_to_unary_table[] = { - 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - }; - - return (word) > 0xffffff ? byte_to_unary_table[(word) >> 24] : - (word) > 0xffff ? byte_to_unary_table[(word) >> 16] + 8 : - (word) > 0xff ? byte_to_unary_table[(word) >> 8] + 16 : - byte_to_unary_table[(word)] + 24; -} - -static inline unsigned int FLAC__clz_uint32(FLAC__uint32 v) -{ -/* Never used with input 0 */ - FLAC__ASSERT(v > 0); -#if defined(__INTEL_COMPILER) - return _bit_scan_reverse(v) ^ 31U; -#elif defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) -/* This will translate either to (bsr ^ 31U), clz , ctlz, cntlz, lzcnt depending on - * -march= setting or to a software routine in exotic machines. */ - return __builtin_clz(v); -#elif defined(_MSC_VER) && (_MSC_VER >= 1400) - { - unsigned long idx; - _BitScanReverse(&idx, v); - return idx ^ 31U; - } -#else - return FLAC__clz_soft_uint32(v); -#endif -} - -/* This one works with input 0 */ -static inline unsigned int FLAC__clz2_uint32(FLAC__uint32 v) -{ - if (!v) - return 32; - return FLAC__clz_uint32(v); -} - -/* An example of what FLAC__bitmath_ilog2() computes: - * - * ilog2( 0) = assertion failure - * ilog2( 1) = 0 - * ilog2( 2) = 1 - * ilog2( 3) = 1 - * ilog2( 4) = 2 - * ilog2( 5) = 2 - * ilog2( 6) = 2 - * ilog2( 7) = 2 - * ilog2( 8) = 3 - * ilog2( 9) = 3 - * ilog2(10) = 3 - * ilog2(11) = 3 - * ilog2(12) = 3 - * ilog2(13) = 3 - * ilog2(14) = 3 - * ilog2(15) = 3 - * ilog2(16) = 4 - * ilog2(17) = 4 - * ilog2(18) = 4 - */ - -static inline unsigned FLAC__bitmath_ilog2(FLAC__uint32 v) -{ - FLAC__ASSERT(v > 0); -#if defined(__INTEL_COMPILER) - return _bit_scan_reverse(v); -#elif defined(_MSC_VER) && (_MSC_VER >= 1400) - { - unsigned long idx; - _BitScanReverse(&idx, v); - return idx; - } -#else - return sizeof(FLAC__uint32) * CHAR_BIT - 1 - FLAC__clz_uint32(v); -#endif -} - - -#ifdef FLAC__INTEGER_ONLY_LIBRARY /* Unused otherwise */ - -static inline unsigned FLAC__bitmath_ilog2_wide(FLAC__uint64 v) -{ - FLAC__ASSERT(v > 0); -#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) - return sizeof(FLAC__uint64) * CHAR_BIT - 1 - __builtin_clzll(v); -/* Sorry, only supported in x64/Itanium.. and both have fast FPU which makes integer-only encoder pointless */ -#elif (defined(_MSC_VER) && (_MSC_VER >= 1400)) && (defined(_M_IA64) || defined(_M_X64)) - { - unsigned long idx; - _BitScanReverse64(&idx, v); - return idx; - } -#else -/* Brain-damaged compilers will use the fastest possible way that is, - de Bruijn sequences (http://supertech.csail.mit.edu/papers/debruijn.pdf) - (C) Timothy B. Terriberry (tterribe@xiph.org) 2001-2009 CC0 (Public domain). -*/ - { - static const unsigned char DEBRUIJN_IDX64[64]={ - 0, 1, 2, 7, 3,13, 8,19, 4,25,14,28, 9,34,20,40, - 5,17,26,38,15,46,29,48,10,31,35,54,21,50,41,57, - 63, 6,12,18,24,27,33,39,16,37,45,47,30,53,49,56, - 62,11,23,32,36,44,52,55,61,22,43,51,60,42,59,58 - }; - v|= v>>1; - v|= v>>2; - v|= v>>4; - v|= v>>8; - v|= v>>16; - v|= v>>32; - v= (v>>1)+1; - return DEBRUIJN_IDX64[v*0x218A392CD3D5DBF>>58&0x3F]; - } -#endif -} -#endif - -unsigned FLAC__bitmath_silog2(int v); -unsigned FLAC__bitmath_silog2_wide(FLAC__int64 v); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h deleted file mode 100755 index 83f8361..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitreader.h +++ /dev/null @@ -1,91 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__BITREADER_H -#define FLAC__PRIVATE__BITREADER_H - -#include /* for FILE */ -#include "../../../ordinals.h" -#include "cpu.h" - -/* - * opaque structure definition - */ -struct FLAC__BitReader; -typedef struct FLAC__BitReader FLAC__BitReader; - -typedef FLAC__bool (*FLAC__BitReaderReadCallback)(FLAC__byte buffer[], size_t *bytes, void *client_data); - -/* - * construction, deletion, initialization, etc functions - */ -FLAC__BitReader *FLAC__bitreader_new(void); -void FLAC__bitreader_delete(FLAC__BitReader *br); -FLAC__bool FLAC__bitreader_init(FLAC__BitReader *br, FLAC__BitReaderReadCallback rcb, void *cd); -void FLAC__bitreader_free(FLAC__BitReader *br); /* does not 'free(br)' */ -FLAC__bool FLAC__bitreader_clear(FLAC__BitReader *br); -void FLAC__bitreader_dump(const FLAC__BitReader *br, FILE *out); - -/* - * CRC functions - */ -void FLAC__bitreader_reset_read_crc16(FLAC__BitReader *br, FLAC__uint16 seed); -FLAC__uint16 FLAC__bitreader_get_read_crc16(FLAC__BitReader *br); - -/* - * info functions - */ -FLAC__bool FLAC__bitreader_is_consumed_byte_aligned(const FLAC__BitReader *br); -unsigned FLAC__bitreader_bits_left_for_byte_alignment(const FLAC__BitReader *br); -unsigned FLAC__bitreader_get_input_bits_unconsumed(const FLAC__BitReader *br); - -/* - * read functions - */ - -FLAC__bool FLAC__bitreader_read_raw_uint32(FLAC__BitReader *br, FLAC__uint32 *val, unsigned bits); -FLAC__bool FLAC__bitreader_read_raw_int32(FLAC__BitReader *br, FLAC__int32 *val, unsigned bits); -FLAC__bool FLAC__bitreader_read_raw_uint64(FLAC__BitReader *br, FLAC__uint64 *val, unsigned bits); -FLAC__bool FLAC__bitreader_read_uint32_little_endian(FLAC__BitReader *br, FLAC__uint32 *val); /*only for bits=32*/ -FLAC__bool FLAC__bitreader_skip_bits_no_crc(FLAC__BitReader *br, unsigned bits); /* WATCHOUT: does not CRC the skipped data! */ /*@@@@ add to unit tests */ -FLAC__bool FLAC__bitreader_skip_byte_block_aligned_no_crc(FLAC__BitReader *br, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ -FLAC__bool FLAC__bitreader_read_byte_block_aligned_no_crc(FLAC__BitReader *br, FLAC__byte *val, unsigned nvals); /* WATCHOUT: does not CRC the read data! */ -FLAC__bool FLAC__bitreader_read_unary_unsigned(FLAC__BitReader *br, unsigned *val); -FLAC__bool FLAC__bitreader_read_rice_signed(FLAC__BitReader *br, int *val, unsigned parameter); -FLAC__bool FLAC__bitreader_read_rice_signed_block(FLAC__BitReader *br, int vals[], unsigned nvals, unsigned parameter); -#if 0 /* UNUSED */ -FLAC__bool FLAC__bitreader_read_golomb_signed(FLAC__BitReader *br, int *val, unsigned parameter); -FLAC__bool FLAC__bitreader_read_golomb_unsigned(FLAC__BitReader *br, unsigned *val, unsigned parameter); -#endif -FLAC__bool FLAC__bitreader_read_utf8_uint32(FLAC__BitReader *br, FLAC__uint32 *val, FLAC__byte *raw, unsigned *rawlen); -FLAC__bool FLAC__bitreader_read_utf8_uint64(FLAC__BitReader *br, FLAC__uint64 *val, FLAC__byte *raw, unsigned *rawlen); -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h deleted file mode 100755 index 1e23efe..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/bitwriter.h +++ /dev/null @@ -1,104 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__BITWRITER_H -#define FLAC__PRIVATE__BITWRITER_H - -#include /* for FILE */ -#include "../../../ordinals.h" - -/* - * opaque structure definition - */ -struct FLAC__BitWriter; -typedef struct FLAC__BitWriter FLAC__BitWriter; - -/* - * construction, deletion, initialization, etc functions - */ -FLAC__BitWriter *FLAC__bitwriter_new(void); -void FLAC__bitwriter_delete(FLAC__BitWriter *bw); -FLAC__bool FLAC__bitwriter_init(FLAC__BitWriter *bw); -void FLAC__bitwriter_free(FLAC__BitWriter *bw); /* does not 'free(buffer)' */ -void FLAC__bitwriter_clear(FLAC__BitWriter *bw); -void FLAC__bitwriter_dump(const FLAC__BitWriter *bw, FILE *out); - -/* - * CRC functions - * - * non-const *bw because they have to cal FLAC__bitwriter_get_buffer() - */ -FLAC__bool FLAC__bitwriter_get_write_crc16(FLAC__BitWriter *bw, FLAC__uint16 *crc); -FLAC__bool FLAC__bitwriter_get_write_crc8(FLAC__BitWriter *bw, FLAC__byte *crc); - -/* - * info functions - */ -FLAC__bool FLAC__bitwriter_is_byte_aligned(const FLAC__BitWriter *bw); -unsigned FLAC__bitwriter_get_input_bits_unconsumed(const FLAC__BitWriter *bw); /* can be called anytime, returns total # of bits unconsumed */ - -/* - * direct buffer access - * - * there may be no calls on the bitwriter between get and release. - * the bitwriter continues to own the returned buffer. - * before get, bitwriter MUST be byte aligned: check with FLAC__bitwriter_is_byte_aligned() - */ -FLAC__bool FLAC__bitwriter_get_buffer(FLAC__BitWriter *bw, const FLAC__byte **buffer, size_t *bytes); -void FLAC__bitwriter_release_buffer(FLAC__BitWriter *bw); - -/* - * write functions - */ -FLAC__bool FLAC__bitwriter_write_zeroes(FLAC__BitWriter *bw, unsigned bits); -FLAC__bool FLAC__bitwriter_write_raw_uint32(FLAC__BitWriter *bw, FLAC__uint32 val, unsigned bits); -FLAC__bool FLAC__bitwriter_write_raw_int32(FLAC__BitWriter *bw, FLAC__int32 val, unsigned bits); -FLAC__bool FLAC__bitwriter_write_raw_uint64(FLAC__BitWriter *bw, FLAC__uint64 val, unsigned bits); -FLAC__bool FLAC__bitwriter_write_raw_uint32_little_endian(FLAC__BitWriter *bw, FLAC__uint32 val); /*only for bits=32*/ -FLAC__bool FLAC__bitwriter_write_byte_block(FLAC__BitWriter *bw, const FLAC__byte vals[], unsigned nvals); -FLAC__bool FLAC__bitwriter_write_unary_unsigned(FLAC__BitWriter *bw, unsigned val); -unsigned FLAC__bitwriter_rice_bits(FLAC__int32 val, unsigned parameter); -#if 0 /* UNUSED */ -unsigned FLAC__bitwriter_golomb_bits_signed(int val, unsigned parameter); -unsigned FLAC__bitwriter_golomb_bits_unsigned(unsigned val, unsigned parameter); -#endif -FLAC__bool FLAC__bitwriter_write_rice_signed(FLAC__BitWriter *bw, FLAC__int32 val, unsigned parameter); -FLAC__bool FLAC__bitwriter_write_rice_signed_block(FLAC__BitWriter *bw, const FLAC__int32 *vals, unsigned nvals, unsigned parameter); -#if 0 /* UNUSED */ -FLAC__bool FLAC__bitwriter_write_golomb_signed(FLAC__BitWriter *bw, int val, unsigned parameter); -FLAC__bool FLAC__bitwriter_write_golomb_unsigned(FLAC__BitWriter *bw, unsigned val, unsigned parameter); -#endif -FLAC__bool FLAC__bitwriter_write_utf8_uint32(FLAC__BitWriter *bw, FLAC__uint32 val); -FLAC__bool FLAC__bitwriter_write_utf8_uint64(FLAC__BitWriter *bw, FLAC__uint64 val); -FLAC__bool FLAC__bitwriter_zero_pad_to_byte_boundary(FLAC__BitWriter *bw); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h deleted file mode 100755 index 655800e..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/cpu.h +++ /dev/null @@ -1,99 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__CPU_H -#define FLAC__PRIVATE__CPU_H - -#include "../../../ordinals.h" - -#ifdef HAVE_CONFIG_H -#include -#endif - -typedef enum { - FLAC__CPUINFO_TYPE_IA32, - FLAC__CPUINFO_TYPE_X86_64, - FLAC__CPUINFO_TYPE_UNKNOWN -} FLAC__CPUInfo_Type; - -#if defined FLAC__CPU_IA32 -typedef struct { - FLAC__bool cmov; - FLAC__bool mmx; - FLAC__bool sse; - FLAC__bool sse2; - - FLAC__bool sse3; - FLAC__bool ssse3; - FLAC__bool sse41; - FLAC__bool sse42; - FLAC__bool avx; - FLAC__bool avx2; - FLAC__bool fma; -} FLAC__CPUInfo_IA32; -#elif defined FLAC__CPU_X86_64 -typedef struct { - FLAC__bool sse3; - FLAC__bool ssse3; - FLAC__bool sse41; - FLAC__bool sse42; - FLAC__bool avx; - FLAC__bool avx2; - FLAC__bool fma; -} FLAC__CPUInfo_x86; -#endif - -typedef struct { - FLAC__bool use_asm; - FLAC__CPUInfo_Type type; -#if defined FLAC__CPU_IA32 - FLAC__CPUInfo_IA32 ia32; -#elif defined FLAC__CPU_X86_64 - FLAC__CPUInfo_x86 x86; -#endif -} FLAC__CPUInfo; - -void FLAC__cpu_info(FLAC__CPUInfo *info); - -#ifndef FLAC__NO_ASM -# if defined FLAC__CPU_IA32 && defined FLAC__HAS_NASM -FLAC__uint32 FLAC__cpu_have_cpuid_asm_ia32(void); -void FLAC__cpu_info_asm_ia32(FLAC__uint32 *flags_edx, FLAC__uint32 *flags_ecx); -# endif -# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -FLAC__uint32 FLAC__cpu_have_cpuid_x86(void); -void FLAC__cpu_info_x86(FLAC__uint32 level, FLAC__uint32 *eax, FLAC__uint32 *ebx, FLAC__uint32 *ecx, FLAC__uint32 *edx); -FLAC__uint32 FLAC__cpu_xgetbv_x86(void); -# endif -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h deleted file mode 100755 index 8ebe5c8..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/crc.h +++ /dev/null @@ -1,62 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__CRC_H -#define FLAC__PRIVATE__CRC_H - -#include "../../../ordinals.h" - -/* 8 bit CRC generator, MSB shifted first -** polynomial = x^8 + x^2 + x^1 + x^0 -** init = 0 -*/ -extern FLAC__byte const FLAC__crc8_table[256]; -#define FLAC__CRC8_UPDATE(data, crc) (crc) = FLAC__crc8_table[(crc) ^ (data)]; -void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc); -void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc); -FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len); - -/* 16 bit CRC generator, MSB shifted first -** polynomial = x^16 + x^15 + x^2 + x^0 -** init = 0 -*/ -extern unsigned const FLAC__crc16_table[256]; - -#define FLAC__CRC16_UPDATE(data, crc) ((((crc)<<8) & 0xffff) ^ FLAC__crc16_table[((crc)>>8) ^ (data)]) -/* this alternate may be faster on some systems/compilers */ -#if 0 -#define FLAC__CRC16_UPDATE(data, crc) ((((crc)<<8) ^ FLAC__crc16_table[((crc)>>8) ^ (data)]) & 0xffff) -#endif - -unsigned FLAC__crc16(const FLAC__byte *data, unsigned len); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h deleted file mode 100755 index e4c044b..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/fixed.h +++ /dev/null @@ -1,107 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__FIXED_H -#define FLAC__PRIVATE__FIXED_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "cpu.h" -#include "float.h" -#include "../../../format.h" - -/* - * FLAC__fixed_compute_best_predictor() - * -------------------------------------------------------------------- - * Compute the best fixed predictor and the expected bits-per-sample - * of the residual signal for each order. The _wide() version uses - * 64-bit integers which is statistically necessary when bits-per- - * sample + log2(blocksize) > 30 - * - * IN data[0,data_len-1] - * IN data_len - * OUT residual_bits_per_sample[0,FLAC__MAX_FIXED_ORDER] - */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY -unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -# ifndef FLAC__NO_ASM -# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE2_SUPPORTED -unsigned FLAC__fixed_compute_best_predictor_intrin_sse2(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); -unsigned FLAC__fixed_compute_best_predictor_wide_intrin_sse2(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); -# endif -# ifdef FLAC__SSSE3_SUPPORTED -unsigned FLAC__fixed_compute_best_predictor_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -unsigned FLAC__fixed_compute_best_predictor_wide_intrin_ssse3(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER + 1]); -# endif -# endif -# if defined FLAC__CPU_IA32 && defined FLAC__HAS_NASM -unsigned FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -# endif -# endif -#else -unsigned FLAC__fixed_compute_best_predictor(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -unsigned FLAC__fixed_compute_best_predictor_wide(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -#endif - -/* - * FLAC__fixed_compute_residual() - * -------------------------------------------------------------------- - * Compute the residual signal obtained from sutracting the predicted - * signal from the original. - * - * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) - * IN data_len length of original signal - * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order - * OUT residual[0,data_len-1] residual signal - */ -void FLAC__fixed_compute_residual(const FLAC__int32 data[], unsigned data_len, unsigned order, FLAC__int32 residual[]); - -/* - * FLAC__fixed_restore_signal() - * -------------------------------------------------------------------- - * Restore the original signal by summing the residual and the - * predictor. - * - * IN residual[0,data_len-1] residual signal - * IN data_len length of original signal - * IN order <= FLAC__MAX_FIXED_ORDER fixed-predictor order - * *** IMPORTANT: the caller must pass in the historical samples: - * IN data[-order,-1] previously-reconstructed historical samples - * OUT data[0,data_len-1] original signal - */ -void FLAC__fixed_restore_signal(const FLAC__int32 residual[], unsigned data_len, unsigned order, FLAC__int32 data[]); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h deleted file mode 100755 index af09336..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/float.h +++ /dev/null @@ -1,98 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2004-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__FLOAT_H -#define FLAC__PRIVATE__FLOAT_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "../../../ordinals.h" - -/* - * These typedefs make it easier to ensure that integer versions of - * the library really only contain integer operations. All the code - * in libFLAC should use FLAC__float and FLAC__double in place of - * float and double, and be protected by checks of the macro - * FLAC__INTEGER_ONLY_LIBRARY. - * - * FLAC__real is the basic floating point type used in LPC analysis. - */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY -typedef double FLAC__double; -typedef float FLAC__float; -/* - * WATCHOUT: changing FLAC__real will change the signatures of many - * functions that have assembly language equivalents and break them. - */ -typedef float FLAC__real; -#else -/* - * The convention for FLAC__fixedpoint is to use the upper 16 bits - * for the integer part and lower 16 bits for the fractional part. - */ -typedef FLAC__int32 FLAC__fixedpoint; -extern const FLAC__fixedpoint FLAC__FP_ZERO; -extern const FLAC__fixedpoint FLAC__FP_ONE_HALF; -extern const FLAC__fixedpoint FLAC__FP_ONE; -extern const FLAC__fixedpoint FLAC__FP_LN2; -extern const FLAC__fixedpoint FLAC__FP_E; - -#define FLAC__fixedpoint_trunc(x) ((x)>>16) - -#define FLAC__fixedpoint_mul(x, y) ( (FLAC__fixedpoint) ( ((FLAC__int64)(x)*(FLAC__int64)(y)) >> 16 ) ) - -#define FLAC__fixedpoint_div(x, y) ( (FLAC__fixedpoint) ( ( ((FLAC__int64)(x)<<32) / (FLAC__int64)(y) ) >> 16 ) ) - -/* - * FLAC__fixedpoint_log2() - * -------------------------------------------------------------------- - * Returns the base-2 logarithm of the fixed-point number 'x' using an - * algorithm by Knuth for x >= 1.0 - * - * 'fracbits' is the number of fractional bits of 'x'. 'fracbits' must - * be < 32 and evenly divisible by 4 (0 is OK but not very precise). - * - * 'precision' roughly limits the number of iterations that are done; - * use (unsigned)(-1) for maximum precision. - * - * If 'x' is less than one -- that is, x < (1< -#endif - -#include "cpu.h" -#include "float.h" -#include "../../../format.h" - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -/* - * FLAC__lpc_window_data() - * -------------------------------------------------------------------- - * Applies the given window to the data. - * OPT: asm implementation - * - * IN in[0,data_len-1] - * IN window[0,data_len-1] - * OUT out[0,lag-1] - * IN data_len - */ -void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len); - -/* - * FLAC__lpc_compute_autocorrelation() - * -------------------------------------------------------------------- - * Compute the autocorrelation for lags between 0 and lag-1. - * Assumes data[] outside of [0,data_len-1] == 0. - * Asserts that lag > 0. - * - * IN data[0,data_len-1] - * IN data_len - * IN 0 < lag <= data_len - * OUT autoc[0,lag-1] - */ -void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -#ifndef FLAC__NO_ASM -# ifdef FLAC__CPU_IA32 -# ifdef FLAC__HAS_NASM -void FLAC__lpc_compute_autocorrelation_asm_ia32(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -# endif -# endif -# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE_SUPPORTED -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); -# endif -# endif -#endif - -/* - * FLAC__lpc_compute_lp_coefficients() - * -------------------------------------------------------------------- - * Computes LP coefficients for orders 1..max_order. - * Do not call if autoc[0] == 0.0. This means the signal is zero - * and there is no point in calculating a predictor. - * - * IN autoc[0,max_order] autocorrelation values - * IN 0 < max_order <= FLAC__MAX_LPC_ORDER max LP order to compute - * OUT lp_coeff[0,max_order-1][0,max_order-1] LP coefficients for each order - * *** IMPORTANT: - * *** lp_coeff[0,max_order-1][max_order,FLAC__MAX_LPC_ORDER-1] are untouched - * OUT error[0,max_order-1] error for each order (more - * specifically, the variance of - * the error signal times # of - * samples in the signal) - * - * Example: if max_order is 9, the LP coefficients for order 9 will be - * in lp_coeff[8][0,8], the LP coefficients for order 8 will be - * in lp_coeff[7][0,7], etc. - */ -void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]); - -/* - * FLAC__lpc_quantize_coefficients() - * -------------------------------------------------------------------- - * Quantizes the LP coefficients. NOTE: precision + bits_per_sample - * must be less than 32 (sizeof(FLAC__int32)*8). - * - * IN lp_coeff[0,order-1] LP coefficients - * IN order LP order - * IN FLAC__MIN_QLP_COEFF_PRECISION < precision - * desired precision (in bits, including sign - * bit) of largest coefficient - * OUT qlp_coeff[0,order-1] quantized coefficients - * OUT shift # of bits to shift right to get approximated - * LP coefficients. NOTE: could be negative. - * RETURN 0 => quantization OK - * 1 => coefficients require too much shifting for *shift to - * fit in the LPC subframe header. 'shift' is unset. - * 2 => coefficients are all zero, which is bad. 'shift' is - * unset. - */ -int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift); - -/* - * FLAC__lpc_compute_residual_from_qlp_coefficients() - * -------------------------------------------------------------------- - * Compute the residual signal obtained from sutracting the predicted - * signal from the original. - * - * IN data[-order,data_len-1] original signal (NOTE THE INDICES!) - * IN data_len length of original signal - * IN qlp_coeff[0,order-1] quantized LP coefficients - * IN order > 0 LP order - * IN lp_quantization quantization of LP coefficients in bits - * OUT residual[0,data_len-1] residual signal - */ -void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -#ifndef FLAC__NO_ASM -# ifdef FLAC__CPU_IA32 -# ifdef FLAC__HAS_NASM -void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -# endif -# endif -# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE2_SUPPORTED -void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -# endif -# ifdef FLAC__SSE4_1_SUPPORTED -void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_sse41(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -# endif -# ifdef FLAC__AVX2_SUPPORTED -void FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -# endif -# endif -#endif - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - -/* - * FLAC__lpc_restore_signal() - * -------------------------------------------------------------------- - * Restore the original signal by summing the residual and the - * predictor. - * - * IN residual[0,data_len-1] residual signal - * IN data_len length of original signal - * IN qlp_coeff[0,order-1] quantized LP coefficients - * IN order > 0 LP order - * IN lp_quantization quantization of LP coefficients in bits - * *** IMPORTANT: the caller must pass in the historical samples: - * IN data[-order,-1] previously-reconstructed historical samples - * OUT data[0,data_len-1] original signal - */ -void FLAC__lpc_restore_signal(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -void FLAC__lpc_restore_signal_wide(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -#ifndef FLAC__NO_ASM -# ifdef FLAC__CPU_IA32 -# ifdef FLAC__HAS_NASM -void FLAC__lpc_restore_signal_asm_ia32(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -void FLAC__lpc_restore_signal_asm_ia32_mmx(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -void FLAC__lpc_restore_signal_wide_asm_ia32(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -# endif /* FLAC__HAS_NASM */ -# endif /* FLAC__CPU_IA32 */ -# if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE2_SUPPORTED -void FLAC__lpc_restore_signal_16_intrin_sse2(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -# endif -# ifdef FLAC__SSE4_1_SUPPORTED -void FLAC__lpc_restore_signal_wide_intrin_sse41(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); -# endif -# endif -#endif /* FLAC__NO_ASM */ - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -/* - * FLAC__lpc_compute_expected_bits_per_residual_sample() - * -------------------------------------------------------------------- - * Compute the expected number of bits per residual signal sample - * based on the LP error (which is related to the residual variance). - * - * IN lpc_error >= 0.0 error returned from calculating LP coefficients - * IN total_samples > 0 # of samples in residual signal - * RETURN expected bits per sample - */ -FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples); -FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale); - -/* - * FLAC__lpc_compute_best_order() - * -------------------------------------------------------------------- - * Compute the best order from the array of signal errors returned - * during coefficient computation. - * - * IN lpc_error[0,max_order-1] >= 0.0 error returned from calculating LP coefficients - * IN max_order > 0 max LP order - * IN total_samples > 0 # of samples in residual signal - * IN overhead_bits_per_order # of bits overhead for each increased LP order - * (includes warmup sample size and quantized LP coefficient) - * RETURN [1,max_order] best order - */ -unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order); - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h deleted file mode 100755 index b1324a9..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/md5.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef FLAC__PRIVATE__MD5_H -#define FLAC__PRIVATE__MD5_H - -/* - * This is the header file for the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - * - * Changed so as no longer to depend on Colin Plumb's `usual.h' - * header definitions; now uses stuff from dpkg's config.h - * - Ian Jackson . - * Still in the public domain. - * - * Josh Coalson: made some changes to integrate with libFLAC. - * Still in the public domain, with no warranty. - */ - -#include "../../../ordinals.h" - -typedef union { - FLAC__byte *p8; - FLAC__int16 *p16; - FLAC__int32 *p32; -} FLAC__multibyte; - -typedef struct { - FLAC__uint32 in[16]; - FLAC__uint32 buf[4]; - FLAC__uint32 bytes[2]; - FLAC__multibyte internal_buf; - size_t capacity; -} FLAC__MD5Context; - -void FLAC__MD5Init(FLAC__MD5Context *context); -void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *context); - -FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h deleted file mode 100755 index c387ea6..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/memory.h +++ /dev/null @@ -1,58 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__MEMORY_H -#define FLAC__PRIVATE__MEMORY_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include /* for size_t */ - -#include "float.h" -#include "../../../ordinals.h" /* for FLAC__bool */ - -/* Returns the unaligned address returned by malloc. - * Use free() on this address to deallocate. - */ -void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address); -FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer); -FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer); -FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer); -FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, unsigned **unaligned_pointer, unsigned **aligned_pointer); -#ifndef FLAC__INTEGER_ONLY_LIBRARY -FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer); -#endif -void *safe_malloc_mul_2op_p(size_t size1, size_t size2); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h deleted file mode 100755 index 29c73e0..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/metadata.h +++ /dev/null @@ -1,46 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2002-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__METADATA_H -#define FLAC__PRIVATE__METADATA_H - -#include "FLAC/metadata.h" - -/* WATCHOUT: all malloc()ed data in the block is free()ed; this may not - * be a consistent state (e.g. PICTURE) or equivalent to the initial - * state after FLAC__metadata_object_new() - */ -void FLAC__metadata_object_delete_data(FLAC__StreamMetadata *object); - -void FLAC__metadata_object_cuesheet_track_delete_data(FLAC__StreamMetadata_CueSheet_Track *object); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h deleted file mode 100755 index 3ba6dd2..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder.h +++ /dev/null @@ -1,67 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__STREAM_ENCODER_H -#define FLAC__PRIVATE__STREAM_ENCODER_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -/* - * This is used to avoid overflow with unusual signals in 32-bit - * accumulator in the *precompute_partition_info_sums_* functions. - */ -#define FLAC__MAX_EXTRA_RESIDUAL_BPS 4 - -#if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X86INTRIN -#include "cpu.h" -#include "../../../format.h" - -#ifdef FLAC__SSE2_SUPPORTED -extern void FLAC__precompute_partition_info_sums_intrin_sse2(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); -#endif - -#ifdef FLAC__SSSE3_SUPPORTED -extern void FLAC__precompute_partition_info_sums_intrin_ssse3(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); -#endif - -#ifdef FLAC__AVX2_SUPPORTED -extern void FLAC__precompute_partition_info_sums_intrin_avx2(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); -#endif - -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h deleted file mode 100755 index eaa9958..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/stream_encoder_framing.h +++ /dev/null @@ -1,46 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__STREAM_ENCODER_FRAMING_H -#define FLAC__PRIVATE__STREAM_ENCODER_FRAMING_H - -#include "../../../format.h" -#include "bitwriter.h" - -FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw); -FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw); -FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); -FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); -FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); -FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h deleted file mode 100755 index 8464d22..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/private/window.h +++ /dev/null @@ -1,74 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2006-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PRIVATE__WINDOW_H -#define FLAC__PRIVATE__WINDOW_H - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include "float.h" -#include "../../../format.h" - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -/* - * FLAC__window_*() - * -------------------------------------------------------------------- - * Calculates window coefficients according to different apodization - * functions. - * - * OUT window[0,L-1] - * IN L (number of points in window) - */ -void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev); /* 0.0 < stddev <= 0.5 */ -void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L); -void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p); -void FLAC__window_partial_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end); -void FLAC__window_punchout_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end); -void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L); - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h deleted file mode 100755 index b852c2b..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/all.h +++ /dev/null @@ -1,39 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PROTECTED__ALL_H -#define FLAC__PROTECTED__ALL_H - -#include "stream_decoder.h" -#include "stream_encoder.h" - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h deleted file mode 100755 index d8a3e61..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_decoder.h +++ /dev/null @@ -1,60 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PROTECTED__STREAM_DECODER_H -#define FLAC__PROTECTED__STREAM_DECODER_H - -#include "../../../stream_decoder.h" -#if FLAC__HAS_OGG -#include "../private/ogg_decoder_aspect.h" -#endif - -typedef struct FLAC__StreamDecoderProtected { - FLAC__StreamDecoderState state; - FLAC__StreamDecoderInitStatus initstate; - unsigned channels; - FLAC__ChannelAssignment channel_assignment; - unsigned bits_per_sample; - unsigned sample_rate; /* in Hz */ - unsigned blocksize; /* in samples (per channel) */ - FLAC__bool md5_checking; /* if true, generate MD5 signature of decoded data and compare against signature in the STREAMINFO metadata block */ -#if FLAC__HAS_OGG - FLAC__OggDecoderAspect ogg_decoder_aspect; -#endif -} FLAC__StreamDecoderProtected; - -/* - * return the number of input bytes consumed - */ -unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h deleted file mode 100755 index bd0cf25..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/include/protected/stream_encoder.h +++ /dev/null @@ -1,118 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__PROTECTED__STREAM_ENCODER_H -#define FLAC__PROTECTED__STREAM_ENCODER_H - -#include "../../../stream_encoder.h" -#if FLAC__HAS_OGG -#include "../private/ogg_encoder_aspect.h" -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -#include "../private/float.h" - -#define FLAC__MAX_APODIZATION_FUNCTIONS 32 - -typedef enum { - FLAC__APODIZATION_BARTLETT, - FLAC__APODIZATION_BARTLETT_HANN, - FLAC__APODIZATION_BLACKMAN, - FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE, - FLAC__APODIZATION_CONNES, - FLAC__APODIZATION_FLATTOP, - FLAC__APODIZATION_GAUSS, - FLAC__APODIZATION_HAMMING, - FLAC__APODIZATION_HANN, - FLAC__APODIZATION_KAISER_BESSEL, - FLAC__APODIZATION_NUTTALL, - FLAC__APODIZATION_RECTANGLE, - FLAC__APODIZATION_TRIANGLE, - FLAC__APODIZATION_TUKEY, - FLAC__APODIZATION_PARTIAL_TUKEY, - FLAC__APODIZATION_PUNCHOUT_TUKEY, - FLAC__APODIZATION_WELCH -} FLAC__ApodizationFunction; - -typedef struct { - FLAC__ApodizationFunction type; - union { - struct { - FLAC__real stddev; - } gauss; - struct { - FLAC__real p; - } tukey; - struct { - FLAC__real p; - FLAC__real start; - FLAC__real end; - } multiple_tukey; - } parameters; -} FLAC__ApodizationSpecification; - -#endif // #ifndef FLAC__INTEGER_ONLY_LIBRARY - -typedef struct FLAC__StreamEncoderProtected { - FLAC__StreamEncoderState state; - FLAC__bool verify; - FLAC__bool streamable_subset; - FLAC__bool do_md5; - FLAC__bool do_mid_side_stereo; - FLAC__bool loose_mid_side_stereo; - unsigned channels; - unsigned bits_per_sample; - unsigned sample_rate; - unsigned blocksize; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - unsigned num_apodizations; - FLAC__ApodizationSpecification apodizations[FLAC__MAX_APODIZATION_FUNCTIONS]; -#endif - unsigned max_lpc_order; - unsigned qlp_coeff_precision; - FLAC__bool do_qlp_coeff_prec_search; - FLAC__bool do_exhaustive_model_search; - FLAC__bool do_escape_coding; - unsigned min_residual_partition_order; - unsigned max_residual_partition_order; - unsigned rice_parameter_search_dist; - FLAC__uint64 total_samples_estimate; - FLAC__StreamMetadata **metadata; - unsigned num_metadata_blocks; - FLAC__uint64 streaminfo_offset, seektable_offset, audio_offset; -#if FLAC__HAS_OGG - FLAC__OggEncoderAspect ogg_encoder_aspect; -#endif -} FLAC__StreamEncoderProtected; - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c deleted file mode 100755 index 87e2321..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/lpc_flac.c +++ /dev/null @@ -1,1356 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include - -#include "../assert.h" -#include "../format.h" -#include "../compat.h" -#include "include/private/bitmath.h" -#include "include/private/lpc.h" -#if defined DEBUG || defined FLAC__OVERFLOW_DETECT || defined FLAC__OVERFLOW_DETECT_VERBOSE -#include -#endif - -/* OPT: #undef'ing this may improve the speed on some architectures */ -#define FLAC__LPC_UNROLLED_FILTER_LOOPS - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -#if !defined(HAVE_LROUND) -#if defined(_MSC_VER) -#include -#define copysign _copysign -#elif defined(__GNUC__) -#define copysign __builtin_copysign -#endif -static inline long int lround(double x) { - return (long)(x + copysign (0.5, x)); -} -/* If this fails, we are in the presence of a mid 90's compiler, move along... */ -#endif - -void FLAC__lpc_window_data(const FLAC__int32 in[], const FLAC__real window[], FLAC__real out[], unsigned data_len) -{ - unsigned i; - for(i = 0; i < data_len; i++) - out[i] = in[i] * window[i]; -} - -void FLAC__lpc_compute_autocorrelation(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]) -{ - /* a readable, but slower, version */ -#if 0 - FLAC__real d; - unsigned i; - - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= data_len); - - /* - * Technically we should subtract the mean first like so: - * for(i = 0; i < data_len; i++) - * data[i] -= mean; - * but it appears not to make enough of a difference to matter, and - * most signals are already closely centered around zero - */ - while(lag--) { - for(i = lag, d = 0.0; i < data_len; i++) - d += data[i] * data[i - lag]; - autoc[lag] = d; - } -#endif - - /* - * this version tends to run faster because of better data locality - * ('data_len' is usually much larger than 'lag') - */ - FLAC__real d; - unsigned sample, coeff; - const unsigned limit = data_len - lag; - - FLAC__ASSERT(lag > 0); - FLAC__ASSERT(lag <= data_len); - - for(coeff = 0; coeff < lag; coeff++) - autoc[coeff] = 0.0; - for(sample = 0; sample <= limit; sample++) { - d = data[sample]; - for(coeff = 0; coeff < lag; coeff++) - autoc[coeff] += d * data[sample+coeff]; - } - for(; sample < data_len; sample++) { - d = data[sample]; - for(coeff = 0; coeff < data_len - sample; coeff++) - autoc[coeff] += d * data[sample+coeff]; - } -} - -void FLAC__lpc_compute_lp_coefficients(const FLAC__real autoc[], unsigned *max_order, FLAC__real lp_coeff[][FLAC__MAX_LPC_ORDER], FLAC__double error[]) -{ - unsigned i, j; - FLAC__double r, err, lpc[FLAC__MAX_LPC_ORDER]; - - FLAC__ASSERT(0 != max_order); - FLAC__ASSERT(0 < *max_order); - FLAC__ASSERT(*max_order <= FLAC__MAX_LPC_ORDER); - FLAC__ASSERT(autoc[0] != 0.0); - - err = autoc[0]; - - for(i = 0; i < *max_order; i++) { - /* Sum up this iteration's reflection coefficient. */ - r = -autoc[i+1]; - for(j = 0; j < i; j++) - r -= lpc[j] * autoc[i-j]; - r /= err; - - /* Update LPC coefficients and total error. */ - lpc[i]=r; - for(j = 0; j < (i>>1); j++) { - FLAC__double tmp = lpc[j]; - lpc[j] += r * lpc[i-1-j]; - lpc[i-1-j] += r * tmp; - } - if(i & 1) - lpc[j] += lpc[j] * r; - - err *= (1.0 - r * r); - - /* save this order */ - for(j = 0; j <= i; j++) - lp_coeff[i][j] = (FLAC__real)(-lpc[j]); /* negate FIR filter coeff to get predictor coeff */ - error[i] = err; - - /* see SF bug https://sourceforge.net/p/flac/bugs/234/ */ - if(err == 0.0) { - *max_order = i+1; - return; - } - } -} - -int FLAC__lpc_quantize_coefficients(const FLAC__real lp_coeff[], unsigned order, unsigned precision, FLAC__int32 qlp_coeff[], int *shift) -{ - unsigned i; - FLAC__double cmax; - FLAC__int32 qmax, qmin; - - FLAC__ASSERT(precision > 0); - FLAC__ASSERT(precision >= FLAC__MIN_QLP_COEFF_PRECISION); - - /* drop one bit for the sign; from here on out we consider only |lp_coeff[i]| */ - precision--; - qmax = 1 << precision; - qmin = -qmax; - qmax--; - - /* calc cmax = max( |lp_coeff[i]| ) */ - cmax = 0.0; - for(i = 0; i < order; i++) { - const FLAC__double d = fabs(lp_coeff[i]); - if(d > cmax) - cmax = d; - } - - if(cmax <= 0.0) { - /* => coefficients are all 0, which means our constant-detect didn't work */ - return 2; - } - else { - const int max_shiftlimit = (1 << (FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN-1)) - 1; - const int min_shiftlimit = -max_shiftlimit - 1; - int log2cmax; - - (void)frexp(cmax, &log2cmax); - log2cmax--; - *shift = (int)precision - log2cmax - 1; - - if(*shift > max_shiftlimit) - *shift = max_shiftlimit; - else if(*shift < min_shiftlimit) - return 1; - } - - if(*shift >= 0) { - FLAC__double error = 0.0; - FLAC__int32 q; - for(i = 0; i < order; i++) { - error += lp_coeff[i] * (1 << *shift); - q = lround(error); - -#ifdef FLAC__OVERFLOW_DETECT - if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); - else if(q < qmin) - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) - q = qmax; - else if(q < qmin) - q = qmin; - error -= q; - qlp_coeff[i] = q; - } - } - /* negative shift is very rare but due to design flaw, negative shift is - * a NOP in the decoder, so it must be handled specially by scaling down - * coeffs - */ - else { - const int nshift = -(*shift); - FLAC__double error = 0.0; - FLAC__int32 q; -#ifdef DEBUG - fprintf(stderr,"FLAC__lpc_quantize_coefficients: negative shift=%d order=%u cmax=%f\n", *shift, order, cmax); -#endif - for(i = 0; i < order; i++) { - error += lp_coeff[i] / (1 << nshift); - q = lround(error); -#ifdef FLAC__OVERFLOW_DETECT - if(q > qmax+1) /* we expect q==qmax+1 occasionally due to rounding */ - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q>qmax %d>%d shift=%d cmax=%f precision=%u lpc[%u]=%f\n",q,qmax,*shift,cmax,precision+1,i,lp_coeff[i]); - else if(q < qmin) - fprintf(stderr,"FLAC__lpc_quantize_coefficients: quantizer overflow: q qmax) - q = qmax; - else if(q < qmin) - q = qmin; - error -= q; - qlp_coeff[i] = q; - } - *shift = 0; - } - - return 0; -} - -#if defined(_MSC_VER) -// silence MSVC warnings about __restrict modifier -#pragma warning ( disable : 4028 ) -#endif - -void FLAC__lpc_compute_residual_from_qlp_coefficients(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) -#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) -{ - FLAC__int64 sumo; - unsigned i, j; - FLAC__int32 sum; - const FLAC__int32 *history; - -#ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sumo = 0; - sum = 0; - history = data; - for(j = 0; j < order; j++) { - sum += qlp_coeff[j] * (*(--history)); - sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); - } - *(residual++) = *(data++) - (sum >> lp_quantization); - } - - /* Here's a slower but clearer version: - for(i = 0; i < data_len; i++) { - sum = 0; - for(j = 0; j < order; j++) - sum += qlp_coeff[j] * data[i-j-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - */ -} -#else /* fully unrolled version for normal use */ -{ - int i; - FLAC__int32 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - residual[i] = data[i] - (sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - residual[i] = data[i] - ((qlp_coeff[0] * data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; - case 31: sum += qlp_coeff[30] * data[i-31]; - case 30: sum += qlp_coeff[29] * data[i-30]; - case 29: sum += qlp_coeff[28] * data[i-29]; - case 28: sum += qlp_coeff[27] * data[i-28]; - case 27: sum += qlp_coeff[26] * data[i-27]; - case 26: sum += qlp_coeff[25] * data[i-26]; - case 25: sum += qlp_coeff[24] * data[i-25]; - case 24: sum += qlp_coeff[23] * data[i-24]; - case 23: sum += qlp_coeff[22] * data[i-23]; - case 22: sum += qlp_coeff[21] * data[i-22]; - case 21: sum += qlp_coeff[20] * data[i-21]; - case 20: sum += qlp_coeff[19] * data[i-20]; - case 19: sum += qlp_coeff[18] * data[i-19]; - case 18: sum += qlp_coeff[17] * data[i-18]; - case 17: sum += qlp_coeff[16] * data[i-17]; - case 16: sum += qlp_coeff[15] * data[i-16]; - case 15: sum += qlp_coeff[14] * data[i-15]; - case 14: sum += qlp_coeff[13] * data[i-14]; - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - residual[i] = data[i] - (sum >> lp_quantization); - } - } -} -#endif - -void FLAC__lpc_compute_residual_from_qlp_coefficients_wide(const FLAC__int32 * flac_restrict data, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict residual) -#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) -{ - unsigned i, j; - FLAC__int64 sum; - const FLAC__int32 *history; - -#ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sum = 0; - history = data; - for(j = 0; j < order; j++) - sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); - if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); - break; - } - if(FLAC__bitmath_silog2_wide((FLAC__int64)(*data) - (sum >> lp_quantization)) > 32) { - fprintf(stderr,"FLAC__lpc_compute_residual_from_qlp_coefficients_wide: OVERFLOW, i=%u, data=%d, sum=%" PRId64 ", residual=%" PRId64 "\n", i, *data, (long long)(sum >> lp_quantization), ((FLAC__int64)(*data) - (sum >> lp_quantization))); - break; - } - *(residual++) = *(data++) - (FLAC__int32)(sum >> lp_quantization); - } -} -#else /* fully unrolled version for normal use */ -{ - int i; - FLAC__int64 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - residual[i] = data[i] - (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; - case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; - case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; - case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; - case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; - case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; - case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; - case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; - case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; - case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; - case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; - case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; - case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; - case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; - case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; - case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; - case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; - case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; - case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; - case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; - sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; - sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; - sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; - sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; - sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; - sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; - sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; - sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; - } - residual[i] = data[i] - (FLAC__int32)(sum >> lp_quantization); - } - } -} -#endif - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - -void FLAC__lpc_restore_signal(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) -#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) -{ - FLAC__int64 sumo; - unsigned i, j; - FLAC__int32 sum; - const FLAC__int32 *r = residual, *history; - -#ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_restore_signal: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sumo = 0; - sum = 0; - history = data; - for(j = 0; j < order; j++) { - sum += qlp_coeff[j] * (*(--history)); - sumo += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*history); - if(sumo > 2147483647ll || sumo < -2147483648ll) - fprintf(stderr,"FLAC__lpc_restore_signal: OVERFLOW, i=%u, j=%u, c=%d, d=%d, sumo=%" PRId64 "\n",i,j,qlp_coeff[j],*history,sumo); - } - *(data++) = *(r++) + (sum >> lp_quantization); - } - - /* Here's a slower but clearer version: - for(i = 0; i < data_len; i++) { - sum = 0; - for(j = 0; j < order; j++) - sum += qlp_coeff[j] * data[i-j-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - */ -} -#else /* fully unrolled version for normal use */ -{ - int i; - FLAC__int32 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * data[i-10]; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * data[i-9]; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * data[i-8]; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * data[i-7]; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * data[i-6]; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * data[i-5]; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * data[i-4]; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * data[i-3]; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * data[i-2]; - sum += qlp_coeff[0] * data[i-1]; - data[i] = residual[i] + (sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - data[i] = residual[i] + ((qlp_coeff[0] * data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * data[i-32]; - case 31: sum += qlp_coeff[30] * data[i-31]; - case 30: sum += qlp_coeff[29] * data[i-30]; - case 29: sum += qlp_coeff[28] * data[i-29]; - case 28: sum += qlp_coeff[27] * data[i-28]; - case 27: sum += qlp_coeff[26] * data[i-27]; - case 26: sum += qlp_coeff[25] * data[i-26]; - case 25: sum += qlp_coeff[24] * data[i-25]; - case 24: sum += qlp_coeff[23] * data[i-24]; - case 23: sum += qlp_coeff[22] * data[i-23]; - case 22: sum += qlp_coeff[21] * data[i-22]; - case 21: sum += qlp_coeff[20] * data[i-21]; - case 20: sum += qlp_coeff[19] * data[i-20]; - case 19: sum += qlp_coeff[18] * data[i-19]; - case 18: sum += qlp_coeff[17] * data[i-18]; - case 17: sum += qlp_coeff[16] * data[i-17]; - case 16: sum += qlp_coeff[15] * data[i-16]; - case 15: sum += qlp_coeff[14] * data[i-15]; - case 14: sum += qlp_coeff[13] * data[i-14]; - case 13: sum += qlp_coeff[12] * data[i-13]; - sum += qlp_coeff[11] * data[i-12]; - sum += qlp_coeff[10] * data[i-11]; - sum += qlp_coeff[ 9] * data[i-10]; - sum += qlp_coeff[ 8] * data[i- 9]; - sum += qlp_coeff[ 7] * data[i- 8]; - sum += qlp_coeff[ 6] * data[i- 7]; - sum += qlp_coeff[ 5] * data[i- 6]; - sum += qlp_coeff[ 4] * data[i- 5]; - sum += qlp_coeff[ 3] * data[i- 4]; - sum += qlp_coeff[ 2] * data[i- 3]; - sum += qlp_coeff[ 1] * data[i- 2]; - sum += qlp_coeff[ 0] * data[i- 1]; - } - data[i] = residual[i] + (sum >> lp_quantization); - } - } -} -#endif - -void FLAC__lpc_restore_signal_wide(const FLAC__int32 * flac_restrict residual, unsigned data_len, const FLAC__int32 * flac_restrict qlp_coeff, unsigned order, int lp_quantization, FLAC__int32 * flac_restrict data) -#if defined(FLAC__OVERFLOW_DETECT) || !defined(FLAC__LPC_UNROLLED_FILTER_LOOPS) -{ - unsigned i, j; - FLAC__int64 sum; - const FLAC__int32 *r = residual, *history; - -#ifdef FLAC__OVERFLOW_DETECT_VERBOSE - fprintf(stderr,"FLAC__lpc_restore_signal_wide: data_len=%d, order=%u, lpq=%d",data_len,order,lp_quantization); - for(i=0;i 0); - - for(i = 0; i < data_len; i++) { - sum = 0; - history = data; - for(j = 0; j < order; j++) - sum += (FLAC__int64)qlp_coeff[j] * (FLAC__int64)(*(--history)); - if(FLAC__bitmath_silog2_wide(sum >> lp_quantization) > 32) { - fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, sum=%" PRId64 "\n", i, (sum >> lp_quantization)); - break; - } - if(FLAC__bitmath_silog2_wide((FLAC__int64)(*r) + (sum >> lp_quantization)) > 32) { - fprintf(stderr,"FLAC__lpc_restore_signal_wide: OVERFLOW, i=%u, residual=%d, sum=%" PRId64 ", data=%" PRId64 "\n", i, *r, (sum >> lp_quantization), ((FLAC__int64)(*r) + (sum >> lp_quantization))); - break; - } - *(data++) = *(r++) + (FLAC__int32)(sum >> lp_quantization); - } -} -#else /* fully unrolled version for normal use */ -{ - int i; - FLAC__int64 sum; - - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= 32); - - /* - * We do unique versions up to 12th order since that's the subset limit. - * Also they are roughly ordered to match frequency of occurrence to - * minimize branching. - */ - if(order <= 12) { - if(order > 8) { - if(order > 10) { - if(order == 12) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 11 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 10) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 9 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[8] * (FLAC__int64)data[i-9]; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - } - } - else if(order > 4) { - if(order > 6) { - if(order == 8) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[7] * (FLAC__int64)data[i-8]; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 7 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[6] * (FLAC__int64)data[i-7]; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 6) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[5] * (FLAC__int64)data[i-6]; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 5 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[4] * (FLAC__int64)data[i-5]; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - } - } - else { - if(order > 2) { - if(order == 4) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[3] * (FLAC__int64)data[i-4]; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 3 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[2] * (FLAC__int64)data[i-3]; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - } - else { - if(order == 2) { - for(i = 0; i < (int)data_len; i++) { - sum = 0; - sum += qlp_coeff[1] * (FLAC__int64)data[i-2]; - sum += qlp_coeff[0] * (FLAC__int64)data[i-1]; - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } - else { /* order == 1 */ - for(i = 0; i < (int)data_len; i++) - data[i] = residual[i] + (FLAC__int32)((qlp_coeff[0] * (FLAC__int64)data[i-1]) >> lp_quantization); - } - } - } - } - else { /* order > 12 */ - for(i = 0; i < (int)data_len; i++) { - sum = 0; - switch(order) { - case 32: sum += qlp_coeff[31] * (FLAC__int64)data[i-32]; - case 31: sum += qlp_coeff[30] * (FLAC__int64)data[i-31]; - case 30: sum += qlp_coeff[29] * (FLAC__int64)data[i-30]; - case 29: sum += qlp_coeff[28] * (FLAC__int64)data[i-29]; - case 28: sum += qlp_coeff[27] * (FLAC__int64)data[i-28]; - case 27: sum += qlp_coeff[26] * (FLAC__int64)data[i-27]; - case 26: sum += qlp_coeff[25] * (FLAC__int64)data[i-26]; - case 25: sum += qlp_coeff[24] * (FLAC__int64)data[i-25]; - case 24: sum += qlp_coeff[23] * (FLAC__int64)data[i-24]; - case 23: sum += qlp_coeff[22] * (FLAC__int64)data[i-23]; - case 22: sum += qlp_coeff[21] * (FLAC__int64)data[i-22]; - case 21: sum += qlp_coeff[20] * (FLAC__int64)data[i-21]; - case 20: sum += qlp_coeff[19] * (FLAC__int64)data[i-20]; - case 19: sum += qlp_coeff[18] * (FLAC__int64)data[i-19]; - case 18: sum += qlp_coeff[17] * (FLAC__int64)data[i-18]; - case 17: sum += qlp_coeff[16] * (FLAC__int64)data[i-17]; - case 16: sum += qlp_coeff[15] * (FLAC__int64)data[i-16]; - case 15: sum += qlp_coeff[14] * (FLAC__int64)data[i-15]; - case 14: sum += qlp_coeff[13] * (FLAC__int64)data[i-14]; - case 13: sum += qlp_coeff[12] * (FLAC__int64)data[i-13]; - sum += qlp_coeff[11] * (FLAC__int64)data[i-12]; - sum += qlp_coeff[10] * (FLAC__int64)data[i-11]; - sum += qlp_coeff[ 9] * (FLAC__int64)data[i-10]; - sum += qlp_coeff[ 8] * (FLAC__int64)data[i- 9]; - sum += qlp_coeff[ 7] * (FLAC__int64)data[i- 8]; - sum += qlp_coeff[ 6] * (FLAC__int64)data[i- 7]; - sum += qlp_coeff[ 5] * (FLAC__int64)data[i- 6]; - sum += qlp_coeff[ 4] * (FLAC__int64)data[i- 5]; - sum += qlp_coeff[ 3] * (FLAC__int64)data[i- 4]; - sum += qlp_coeff[ 2] * (FLAC__int64)data[i- 3]; - sum += qlp_coeff[ 1] * (FLAC__int64)data[i- 2]; - sum += qlp_coeff[ 0] * (FLAC__int64)data[i- 1]; - } - data[i] = residual[i] + (FLAC__int32)(sum >> lp_quantization); - } - } -} -#endif - -#if defined(_MSC_VER) -#pragma warning ( default : 4028 ) -#endif - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample(FLAC__double lpc_error, unsigned total_samples) -{ - FLAC__double error_scale; - - FLAC__ASSERT(total_samples > 0); - - error_scale = 0.5 * M_LN2 * M_LN2 / (FLAC__double)total_samples; - - return FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error, error_scale); -} - -FLAC__double FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(FLAC__double lpc_error, FLAC__double error_scale) -{ - if(lpc_error > 0.0) { - FLAC__double bps = (FLAC__double)0.5 * log(error_scale * lpc_error) / M_LN2; - if(bps >= 0.0) - return bps; - else - return 0.0; - } - else if(lpc_error < 0.0) { /* error should not be negative but can happen due to inadequate floating-point resolution */ - return 1e32; - } - else { - return 0.0; - } -} - -unsigned FLAC__lpc_compute_best_order(const FLAC__double lpc_error[], unsigned max_order, unsigned total_samples, unsigned overhead_bits_per_order) -{ - unsigned order, indx, best_index; /* 'index' the index into lpc_error; index==order-1 since lpc_error[0] is for order==1, lpc_error[1] is for order==2, etc */ - FLAC__double bits, best_bits, error_scale; - - FLAC__ASSERT(max_order > 0); - FLAC__ASSERT(total_samples > 0); - - error_scale = 0.5 * M_LN2 * M_LN2 / (FLAC__double)total_samples; - - best_index = 0; - best_bits = (unsigned)(-1); - - for(indx = 0, order = 1; indx < max_order; indx++, order++) { - bits = FLAC__lpc_compute_expected_bits_per_residual_sample_with_error_scale(lpc_error[indx], error_scale) * (FLAC__double)(total_samples - order) + (FLAC__double)(order * overhead_bits_per_order); - if(bits < best_bits) { - best_index = indx; - best_bits = bits; - } - } - - return best_index+1; /* +1 since indx of lpc_error[] is order-1 */ -} - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c deleted file mode 100755 index 42ea534..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/md5.c +++ /dev/null @@ -1,518 +0,0 @@ -#ifdef HAVE_CONFIG_H -# include -#endif - -#include /* for malloc() */ -#include /* for memcpy() */ - -#include "include/private/md5.h" -#include "../alloc.h" -#include "../endswap.h" - -/* - * This code implements the MD5 message-digest algorithm. - * The algorithm is due to Ron Rivest. This code was - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - * - * Changed so as no longer to depend on Colin Plumb's `usual.h' header - * definitions; now uses stuff from dpkg's config.h. - * - Ian Jackson . - * Still in the public domain. - * - * Josh Coalson: made some changes to integrate with libFLAC. - * Still in the public domain. - */ - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f,w,x,y,z,in,s) \ - (w += f(x,y,z) + in, w = (w<>(32-s)) + x) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. MD5Update blocks - * the data and converts bytes into longwords for this routine. - */ -static void FLAC__MD5Transform(FLAC__uint32 buf[4], FLAC__uint32 const in[16]) -{ - FLAC__uint32 a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} - -#if WORDS_BIGENDIAN -//@@@@@@ OPT: use bswap/intrinsics -static void byteSwap(FLAC__uint32 *buf, unsigned words) -{ - FLAC__uint32 x; - do { - x = *buf; - x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); - *buf++ = (x >> 16) | (x << 16); - } while (--words); -} -static void byteSwapX16(FLAC__uint32 *buf) -{ - FLAC__uint32 x; - - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf++ = (x >> 16) | (x << 16); - x = *buf; x = ((x << 8) & 0xff00ff00) | ((x >> 8) & 0x00ff00ff); *buf = (x >> 16) | (x << 16); -} -#else -#define byteSwap(buf, words) -#define byteSwapX16(buf) -#endif - -/* - * Update context to reflect the concatenation of another buffer full - * of bytes. - */ -static void FLAC__MD5Update(FLAC__MD5Context *ctx, FLAC__byte const *buf, unsigned len) -{ - FLAC__uint32 t; - - /* Update byte count */ - - t = ctx->bytes[0]; - if ((ctx->bytes[0] = t + len) < t) - ctx->bytes[1]++; /* Carry from low to high */ - - t = 64 - (t & 0x3f); /* Space available in ctx->in (at least 1) */ - if (t > len) { - memcpy((FLAC__byte *)ctx->in + 64 - t, buf, len); - return; - } - /* First chunk is an odd size */ - memcpy((FLAC__byte *)ctx->in + 64 - t, buf, t); - byteSwapX16(ctx->in); - FLAC__MD5Transform(ctx->buf, ctx->in); - buf += t; - len -= t; - - /* Process data in 64-byte chunks */ - while (len >= 64) { - memcpy(ctx->in, buf, 64); - byteSwapX16(ctx->in); - FLAC__MD5Transform(ctx->buf, ctx->in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - memcpy(ctx->in, buf, len); -} - -/* - * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious - * initialization constants. - */ -void FLAC__MD5Init(FLAC__MD5Context *ctx) -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bytes[0] = 0; - ctx->bytes[1] = 0; - - ctx->internal_buf.p8= 0; - ctx->capacity = 0; -} - -/* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -void FLAC__MD5Final(FLAC__byte digest[16], FLAC__MD5Context *ctx) -{ - int count = ctx->bytes[0] & 0x3f; /* Number of bytes in ctx->in */ - FLAC__byte *p = (FLAC__byte *)ctx->in + count; - - /* Set the first char of padding to 0x80. There is always room. */ - *p++ = 0x80; - - /* Bytes of padding needed to make 56 bytes (-8..55) */ - count = 56 - 1 - count; - - if (count < 0) { /* Padding forces an extra block */ - memset(p, 0, count + 8); - byteSwapX16(ctx->in); - FLAC__MD5Transform(ctx->buf, ctx->in); - p = (FLAC__byte *)ctx->in; - count = 56; - } - memset(p, 0, count); - byteSwap(ctx->in, 14); - - /* Append length in bits and transform */ - ctx->in[14] = ctx->bytes[0] << 3; - ctx->in[15] = ctx->bytes[1] << 3 | ctx->bytes[0] >> 29; - FLAC__MD5Transform(ctx->buf, ctx->in); - - byteSwap(ctx->buf, 4); - memcpy(digest, ctx->buf, 16); - if (0 != ctx->internal_buf.p8) { - free(ctx->internal_buf.p8); - ctx->internal_buf.p8= 0; - ctx->capacity = 0; - } - memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ -} - -/* - * Convert the incoming audio signal to a byte stream - */ -static void format_input_(FLAC__multibyte *mbuf, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) -{ - FLAC__byte *buf_ = mbuf->p8; - FLAC__int16 *buf16 = mbuf->p16; - FLAC__int32 *buf32 = mbuf->p32; - FLAC__int32 a_word; - unsigned channel, sample; - - /* Storage in the output buffer, buf, is little endian. */ - -#define BYTES_CHANNEL_SELECTOR(bytes, channels) (bytes * 100 + channels) - - /* First do the most commonly used combinations. */ - switch (BYTES_CHANNEL_SELECTOR (bytes_per_sample, channels)) { - /* One byte per sample. */ - case (BYTES_CHANNEL_SELECTOR (1, 1)): - for (sample = 0; sample < samples; sample++) - *buf_++ = signal[0][sample]; - return; - - case (BYTES_CHANNEL_SELECTOR (1, 2)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - } - return; - - case (BYTES_CHANNEL_SELECTOR (1, 4)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - *buf_++ = signal[2][sample]; - *buf_++ = signal[3][sample]; - } - return; - - case (BYTES_CHANNEL_SELECTOR (1, 6)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - *buf_++ = signal[2][sample]; - *buf_++ = signal[3][sample]; - *buf_++ = signal[4][sample]; - *buf_++ = signal[5][sample]; - } - return; - - case (BYTES_CHANNEL_SELECTOR (1, 8)): - for (sample = 0; sample < samples; sample++) { - *buf_++ = signal[0][sample]; - *buf_++ = signal[1][sample]; - *buf_++ = signal[2][sample]; - *buf_++ = signal[3][sample]; - *buf_++ = signal[4][sample]; - *buf_++ = signal[5][sample]; - *buf_++ = signal[6][sample]; - *buf_++ = signal[7][sample]; - } - return; - - /* Two bytes per sample. */ - case (BYTES_CHANNEL_SELECTOR (2, 1)): - for (sample = 0; sample < samples; sample++) - *buf16++ = H2LE_16(signal[0][sample]); - return; - - case (BYTES_CHANNEL_SELECTOR (2, 2)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (2, 4)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - *buf16++ = H2LE_16(signal[2][sample]); - *buf16++ = H2LE_16(signal[3][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (2, 6)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - *buf16++ = H2LE_16(signal[2][sample]); - *buf16++ = H2LE_16(signal[3][sample]); - *buf16++ = H2LE_16(signal[4][sample]); - *buf16++ = H2LE_16(signal[5][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (2, 8)): - for (sample = 0; sample < samples; sample++) { - *buf16++ = H2LE_16(signal[0][sample]); - *buf16++ = H2LE_16(signal[1][sample]); - *buf16++ = H2LE_16(signal[2][sample]); - *buf16++ = H2LE_16(signal[3][sample]); - *buf16++ = H2LE_16(signal[4][sample]); - *buf16++ = H2LE_16(signal[5][sample]); - *buf16++ = H2LE_16(signal[6][sample]); - *buf16++ = H2LE_16(signal[7][sample]); - } - return; - - /* Three bytes per sample. */ - case (BYTES_CHANNEL_SELECTOR (3, 1)): - for (sample = 0; sample < samples; sample++) { - a_word = signal[0][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - return; - - case (BYTES_CHANNEL_SELECTOR (3, 2)): - for (sample = 0; sample < samples; sample++) { - a_word = signal[0][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - a_word = signal[1][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - return; - - /* Four bytes per sample. */ - case (BYTES_CHANNEL_SELECTOR (4, 1)): - for (sample = 0; sample < samples; sample++) - *buf32++ = H2LE_32(signal[0][sample]); - return; - - case (BYTES_CHANNEL_SELECTOR (4, 2)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (4, 4)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - *buf32++ = H2LE_32(signal[2][sample]); - *buf32++ = H2LE_32(signal[3][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (4, 6)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - *buf32++ = H2LE_32(signal[2][sample]); - *buf32++ = H2LE_32(signal[3][sample]); - *buf32++ = H2LE_32(signal[4][sample]); - *buf32++ = H2LE_32(signal[5][sample]); - } - return; - - case (BYTES_CHANNEL_SELECTOR (4, 8)): - for (sample = 0; sample < samples; sample++) { - *buf32++ = H2LE_32(signal[0][sample]); - *buf32++ = H2LE_32(signal[1][sample]); - *buf32++ = H2LE_32(signal[2][sample]); - *buf32++ = H2LE_32(signal[3][sample]); - *buf32++ = H2LE_32(signal[4][sample]); - *buf32++ = H2LE_32(signal[5][sample]); - *buf32++ = H2LE_32(signal[6][sample]); - *buf32++ = H2LE_32(signal[7][sample]); - } - return; - - default: - break; - } - - /* General version. */ - switch (bytes_per_sample) { - case 1: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) - *buf_++ = signal[channel][sample]; - return; - - case 2: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) - *buf16++ = H2LE_16(signal[channel][sample]); - return; - - case 3: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) { - a_word = signal[channel][sample]; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; a_word >>= 8; - *buf_++ = (FLAC__byte)a_word; - } - return; - - case 4: - for (sample = 0; sample < samples; sample++) - for (channel = 0; channel < channels; channel++) - *buf32++ = H2LE_32(signal[channel][sample]); - return; - - default: - break; - } -} - -/* - * Convert the incoming audio signal to a byte stream and FLAC__MD5Update it. - */ -FLAC__bool FLAC__MD5Accumulate(FLAC__MD5Context *ctx, const FLAC__int32 * const signal[], unsigned channels, unsigned samples, unsigned bytes_per_sample) -{ - const size_t bytes_needed = (size_t)channels * (size_t)samples * (size_t)bytes_per_sample; - - /* overflow check */ - if ((size_t)channels > SIZE_MAX / (size_t)bytes_per_sample) - return false; - if ((size_t)channels * (size_t)bytes_per_sample > SIZE_MAX / (size_t)samples) - return false; - - if (ctx->capacity < bytes_needed) { - FLAC__byte *tmp = (FLAC__byte*) realloc(ctx->internal_buf.p8, bytes_needed); - if (0 == tmp) { - free(ctx->internal_buf.p8); - if (0 == (ctx->internal_buf.p8= (FLAC__byte*) safe_malloc_(bytes_needed))) - return false; - } - else - ctx->internal_buf.p8= tmp; - ctx->capacity = bytes_needed; - } - - format_input_(&ctx->internal_buf, signal, channels, samples, bytes_per_sample); - - FLAC__MD5Update(ctx, ctx->internal_buf.p8, bytes_needed); - - return true; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c deleted file mode 100755 index fb125f1..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/memory.c +++ /dev/null @@ -1,218 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#ifdef HAVE_STDINT_H -#include -#endif - -#include "include/private/memory.h" -#include "../assert.h" -#include "../alloc.h" - -void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address) -{ - void *x; - - FLAC__ASSERT(0 != aligned_address); - -#ifdef FLAC__ALIGN_MALLOC_DATA - /* align on 32-byte (256-bit) boundary */ - x = safe_malloc_add_2op_(bytes, /*+*/31L); - *aligned_address = (void*)(((uintptr_t)x + 31L) & -32L); -#else - x = safe_malloc_(bytes); - *aligned_address = x; -#endif - return x; -} - -FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer) -{ - FLAC__int32 *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__int32 *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = (FLAC__int32*) FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } -} - -FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer) -{ - FLAC__uint32 *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__uint32 *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = (FLAC__uint32*) FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } -} - -FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer) -{ - FLAC__uint64 *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__uint64 *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = (FLAC__uint64*) FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } -} - -FLAC__bool FLAC__memory_alloc_aligned_unsigned_array(size_t elements, unsigned **unaligned_pointer, unsigned **aligned_pointer) -{ - unsigned *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - unsigned *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = (unsigned int*) FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } -} - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - -FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer) -{ - FLAC__real *pu; /* unaligned pointer */ - union { /* union needed to comply with C99 pointer aliasing rules */ - FLAC__real *pa; /* aligned pointer */ - void *pv; /* aligned pointer alias */ - } u; - - FLAC__ASSERT(elements > 0); - FLAC__ASSERT(0 != unaligned_pointer); - FLAC__ASSERT(0 != aligned_pointer); - FLAC__ASSERT(unaligned_pointer != aligned_pointer); - - if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */ - return false; - - pu = (FLAC__real*) FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv); - if(0 == pu) { - return false; - } - else { - if(*unaligned_pointer != 0) - free(*unaligned_pointer); - *unaligned_pointer = pu; - *aligned_pointer = u.pa; - return true; - } -} - -#endif - -void *safe_malloc_mul_2op_p(size_t size1, size_t size2) -{ - if(!size1 || !size2) - return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */ - if(size1 > SIZE_MAX / size2) - return 0; - return malloc(size1*size2); -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c deleted file mode 100755 index d6a7973..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_decoder.c +++ /dev/null @@ -1,3395 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include /* for malloc() */ -#include /* for memset/memcpy() */ -#include /* for stat() */ -#include /* for off_t */ -#include "../compat.h" -#include "../assert.h" -#include "../alloc.h" -#include "include/protected/stream_decoder.h" -#include "include/private/bitreader.h" -#include "include/private/bitmath.h" -#include "include/private/cpu.h" -#include "include/private/crc.h" -#include "include/private/fixed.h" -#include "include/private/format.h" -#include "include/private/lpc.h" -#include "include/private/md5.h" -#include "include/private/memory.h" - - -/* technically this should be in an "export.c" but this is convenient enough */ -FLAC_API int FLAC_API_SUPPORTS_OGG_FLAC = -#if FLAC__HAS_OGG - 1 -#else - 0 -#endif -; - - -/*********************************************************************** - * - * Private static data - * - ***********************************************************************/ - -static const FLAC__byte ID3V2_TAG_[3] = { 'I', 'D', '3' }; - -/*********************************************************************** - * - * Private class method prototypes - * - ***********************************************************************/ - -static void set_defaults_(FLAC__StreamDecoder *decoder); -//static FILE *get_binary_stdin_(void); -static FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigned channels); -static FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id); -static FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder); -static FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder); -static FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); -static FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length); -static FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, unsigned length); -static FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj); -static FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj); -static FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder); -static FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder); -static FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode); -static FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder); -static FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); -static FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); -static FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode); -static FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode); -static FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode); -static FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigned predictor_order, unsigned partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended); -static FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder); -static FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data); -#if FLAC__HAS_OGG -static FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes); -static FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -#endif -static FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]); -static void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status); -static FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample); -#if FLAC__HAS_OGG -static FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample); -#endif -//static FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -//static FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); -//static FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); -//static FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); -//static FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data); - -/*********************************************************************** - * - * Private class data - * - ***********************************************************************/ - -typedef struct FLAC__StreamDecoderPrivate { -#if FLAC__HAS_OGG - FLAC__bool is_ogg; -#endif - FLAC__StreamDecoderReadCallback read_callback; - FLAC__StreamDecoderSeekCallback seek_callback; - FLAC__StreamDecoderTellCallback tell_callback; - FLAC__StreamDecoderLengthCallback length_callback; - FLAC__StreamDecoderEofCallback eof_callback; - FLAC__StreamDecoderWriteCallback write_callback; - FLAC__StreamDecoderMetadataCallback metadata_callback; - FLAC__StreamDecoderErrorCallback error_callback; - /* generic 32-bit datapath: */ - void (*local_lpc_restore_signal)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); - /* generic 64-bit datapath: */ - void (*local_lpc_restore_signal_64bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); - /* for use when the signal is <= 16 bits-per-sample, or <= 15 bits-per-sample on a side channel (which requires 1 extra bit): */ - void (*local_lpc_restore_signal_16bit)(const FLAC__int32 residual[], unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 data[]); - void *client_data; - FILE *file; /* only used if FLAC__stream_decoder_init_file()/FLAC__stream_decoder_init_file() called, else NULL */ - FLAC__BitReader *input; - FLAC__int32 *output[FLAC__MAX_CHANNELS]; - FLAC__int32 *residual[FLAC__MAX_CHANNELS]; /* WATCHOUT: these are the aligned pointers; the real pointers that should be free()'d are residual_unaligned[] below */ - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents[FLAC__MAX_CHANNELS]; - unsigned output_capacity, output_channels; - FLAC__uint32 fixed_block_size, next_fixed_block_size; - FLAC__uint64 samples_decoded; - FLAC__bool has_stream_info, has_seek_table; - FLAC__StreamMetadata stream_info; - FLAC__StreamMetadata seek_table; - FLAC__bool metadata_filter[128]; /* MAGIC number 128 == total number of metadata block types == 1 << 7 */ - FLAC__byte *metadata_filter_ids; - size_t metadata_filter_ids_count, metadata_filter_ids_capacity; /* units for both are IDs, not bytes */ - FLAC__Frame frame; - FLAC__bool cached; /* true if there is a byte in lookahead */ - FLAC__CPUInfo cpuinfo; - FLAC__byte header_warmup[2]; /* contains the sync code and reserved bits */ - FLAC__byte lookahead; /* temp storage when we need to look ahead one byte in the stream */ - /* unaligned (original) pointers to allocated data */ - FLAC__int32 *residual_unaligned[FLAC__MAX_CHANNELS]; - FLAC__bool do_md5_checking; /* initially gets protected_->md5_checking but is turned off after a seek or if the metadata has a zero MD5 */ - FLAC__bool internal_reset_hack; /* used only during init() so we can call reset to set up the decoder without rewinding the input */ - FLAC__bool is_seeking; - FLAC__MD5Context md5context; - FLAC__byte computed_md5sum[16]; /* this is the sum we computed from the decoded data */ - /* (the rest of these are only used for seeking) */ - FLAC__Frame last_frame; /* holds the info of the last frame we seeked to */ - FLAC__uint64 first_frame_offset; /* hint to the seek routine of where in the stream the first audio frame starts */ - FLAC__uint64 target_sample; - unsigned unparseable_frame_count; /* used to tell whether we're decoding a future version of FLAC or just got a bad sync */ -#if FLAC__HAS_OGG - FLAC__bool got_a_frame; /* hack needed in Ogg FLAC seek routine to check when process_single() actually writes a frame */ -#endif -} FLAC__StreamDecoderPrivate; - -/*********************************************************************** - * - * Public static class data - * - ***********************************************************************/ - -FLAC_API const char * const FLAC__StreamDecoderStateString[] = { - "FLAC__STREAM_DECODER_SEARCH_FOR_METADATA", - "FLAC__STREAM_DECODER_READ_METADATA", - "FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC", - "FLAC__STREAM_DECODER_READ_FRAME", - "FLAC__STREAM_DECODER_END_OF_STREAM", - "FLAC__STREAM_DECODER_OGG_ERROR", - "FLAC__STREAM_DECODER_SEEK_ERROR", - "FLAC__STREAM_DECODER_ABORTED", - "FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR", - "FLAC__STREAM_DECODER_UNINITIALIZED" -}; - -FLAC_API const char * const FLAC__StreamDecoderInitStatusString[] = { - "FLAC__STREAM_DECODER_INIT_STATUS_OK", - "FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER", - "FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS", - "FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR", - "FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE", - "FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED" -}; - -FLAC_API const char * const FLAC__StreamDecoderReadStatusString[] = { - "FLAC__STREAM_DECODER_READ_STATUS_CONTINUE", - "FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM", - "FLAC__STREAM_DECODER_READ_STATUS_ABORT" -}; - -FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[] = { - "FLAC__STREAM_DECODER_SEEK_STATUS_OK", - "FLAC__STREAM_DECODER_SEEK_STATUS_ERROR", - "FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamDecoderTellStatusString[] = { - "FLAC__STREAM_DECODER_TELL_STATUS_OK", - "FLAC__STREAM_DECODER_TELL_STATUS_ERROR", - "FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[] = { - "FLAC__STREAM_DECODER_LENGTH_STATUS_OK", - "FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR", - "FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[] = { - "FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE", - "FLAC__STREAM_DECODER_WRITE_STATUS_ABORT" -}; - -FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[] = { - "FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC", - "FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER", - "FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH", - "FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM" -}; - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ -FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void) -{ - FLAC__StreamDecoder *decoder; - unsigned i; - - FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ - - decoder = (FLAC__StreamDecoder*) calloc(1, sizeof(FLAC__StreamDecoder)); - if(decoder == 0) { - return 0; - } - - decoder->protected_ = (FLAC__StreamDecoderProtected*) calloc(1, sizeof(FLAC__StreamDecoderProtected)); - if(decoder->protected_ == 0) { - free(decoder); - return 0; - } - - decoder->private_ = (FLAC__StreamDecoderPrivate*) calloc(1, sizeof(FLAC__StreamDecoderPrivate)); - if(decoder->private_ == 0) { - free(decoder->protected_); - free(decoder); - return 0; - } - - decoder->private_->input = FLAC__bitreader_new(); - if(decoder->private_->input == 0) { - free(decoder->private_); - free(decoder->protected_); - free(decoder); - return 0; - } - - decoder->private_->metadata_filter_ids_capacity = 16; - if(0 == (decoder->private_->metadata_filter_ids = (FLAC__byte*) malloc((FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) * decoder->private_->metadata_filter_ids_capacity))) { - FLAC__bitreader_delete(decoder->private_->input); - free(decoder->private_); - free(decoder->protected_); - free(decoder); - return 0; - } - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - decoder->private_->output[i] = 0; - decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; - } - - decoder->private_->output_capacity = 0; - decoder->private_->output_channels = 0; - decoder->private_->has_seek_table = false; - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&decoder->private_->partitioned_rice_contents[i]); - - decoder->private_->file = 0; - - set_defaults_(decoder); - - decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; - - return decoder; -} - -FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder) -{ - unsigned i; - - if (decoder == NULL) - return ; - - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->private_->input); - - (void)FLAC__stream_decoder_finish(decoder); - - if(0 != decoder->private_->metadata_filter_ids) - free(decoder->private_->metadata_filter_ids); - - FLAC__bitreader_delete(decoder->private_->input); - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&decoder->private_->partitioned_rice_contents[i]); - - free(decoder->private_); - free(decoder->protected_); - free(decoder); -} - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -static FLAC__StreamDecoderInitStatus init_stream_internal_( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FLAC__ASSERT(0 != decoder); - - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; - -#if !FLAC__HAS_OGG - if(is_ogg) - return FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER; -#endif - - if( - 0 == read_callback || - 0 == write_callback || - 0 == error_callback || - (seek_callback && (0 == tell_callback || 0 == length_callback || 0 == eof_callback)) - ) - return FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; - -#if FLAC__HAS_OGG - decoder->private_->is_ogg = is_ogg; - if(is_ogg && !FLAC__ogg_decoder_aspect_init(&decoder->protected_->ogg_decoder_aspect)) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; -#endif - - /* - * get the CPU info and set the function pointers - */ - FLAC__cpu_info(&decoder->private_->cpuinfo); - /* first default to the non-asm routines */ - decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal; - decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide; - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal; - /* now override with asm where appropriate */ -#ifndef FLAC__NO_ASM - if(decoder->private_->cpuinfo.use_asm) { -#ifdef FLAC__CPU_IA32 - FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); -#ifdef FLAC__HAS_NASM - decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ - if(decoder->private_->cpuinfo.ia32.mmx) { - decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32_mmx; - } - else { - decoder->private_->local_lpc_restore_signal = FLAC__lpc_restore_signal_asm_ia32; - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_asm_ia32; - } -#endif -#ifdef FLAC__HAS_X86INTRIN -# if defined FLAC__SSE2_SUPPORTED && !defined FLAC__HAS_NASM /* OPT_SSE: not better than MMX asm */ - if(decoder->private_->cpuinfo.ia32.sse2) { - decoder->private_->local_lpc_restore_signal_16bit = FLAC__lpc_restore_signal_16_intrin_sse2; - } -# endif -# if defined FLAC__SSE4_1_SUPPORTED - if(decoder->private_->cpuinfo.ia32.sse41) { - decoder->private_->local_lpc_restore_signal_64bit = FLAC__lpc_restore_signal_wide_intrin_sse41; - } -# endif -#endif -#elif defined FLAC__CPU_X86_64 - FLAC__ASSERT(decoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); - /* No useful SSE optimizations yet */ -#endif - } -#endif - - /* from here on, errors are fatal */ - - if(!FLAC__bitreader_init(decoder->private_->input, read_callback_, decoder)) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; - } - - decoder->private_->read_callback = read_callback; - decoder->private_->seek_callback = seek_callback; - decoder->private_->tell_callback = tell_callback; - decoder->private_->length_callback = length_callback; - decoder->private_->eof_callback = eof_callback; - decoder->private_->write_callback = write_callback; - decoder->private_->metadata_callback = metadata_callback; - decoder->private_->error_callback = error_callback; - decoder->private_->client_data = client_data; - decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; - decoder->private_->samples_decoded = 0; - decoder->private_->has_stream_info = false; - decoder->private_->cached = false; - - decoder->private_->do_md5_checking = decoder->protected_->md5_checking; - decoder->private_->is_seeking = false; - - decoder->private_->internal_reset_hack = true; /* so the following reset does not try to rewind the input */ - if(!FLAC__stream_decoder_reset(decoder)) { - /* above call sets the state for us */ - return FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR; - } - - return FLAC__STREAM_DECODER_INIT_STATUS_OK; -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_stream_internal_( - decoder, - read_callback, - seek_callback, - tell_callback, - length_callback, - eof_callback, - write_callback, - metadata_callback, - error_callback, - client_data, - /*is_ogg=*/false - ); -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_stream_internal_( - decoder, - read_callback, - seek_callback, - tell_callback, - length_callback, - eof_callback, - write_callback, - metadata_callback, - error_callback, - client_data, - /*is_ogg=*/true - ); -} - -#if 0 -static FLAC__StreamDecoderInitStatus init_FILE_internal_( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != file); - - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; - - if(0 == write_callback || 0 == error_callback) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; - - /* - * To make sure that our file does not go unclosed after an error, we - * must assign the FILE pointer before any further error can occur in - * this routine. - */ - if(file == stdin) - file = get_binary_stdin_(); /* just to be safe */ - - decoder->private_->file = file; - - return init_stream_internal_( - decoder, - file_read_callback_, - decoder->private_->file == stdin? 0: file_seek_callback_, - decoder->private_->file == stdin? 0: file_tell_callback_, - decoder->private_->file == stdin? 0: file_length_callback_, - file_eof_callback_, - write_callback, - metadata_callback, - error_callback, - client_data, - is_ogg - ); -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); -} - -static FLAC__StreamDecoderInitStatus init_file_internal_( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FILE *file; - - FLAC__ASSERT(0 != decoder); - - /* - * To make sure that our file does not go unclosed after an error, we - * have to do the same entrance checks here that are later performed - * in FLAC__stream_decoder_init_FILE() before the FILE* is assigned. - */ - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED; - - if(0 == write_callback || 0 == error_callback) - return decoder->protected_->initstate = FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS; - - file = filename? flac_fopen(filename, "rb") : stdin; - - if(0 == file) - return FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE; - - return init_FILE_internal_(decoder, file, write_callback, metadata_callback, error_callback, client_data, is_ogg); -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/false); -} - -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -) -{ - return init_file_internal_(decoder, filename, write_callback, metadata_callback, error_callback, client_data, /*is_ogg=*/true); -} -#endif - -FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder) -{ - FLAC__bool md5_failed = false; - unsigned i; - - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - - if(decoder->protected_->state == FLAC__STREAM_DECODER_UNINITIALIZED) - return true; - - /* see the comment in FLAC__stream_decoder_reset() as to why we - * always call FLAC__MD5Final() - */ - FLAC__MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context); - - if(decoder->private_->has_seek_table && 0 != decoder->private_->seek_table.data.seek_table.points) { - free(decoder->private_->seek_table.data.seek_table.points); - decoder->private_->seek_table.data.seek_table.points = 0; - decoder->private_->has_seek_table = false; - } - FLAC__bitreader_free(decoder->private_->input); - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - /* WATCHOUT: - * FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the - * output arrays have a buffer of up to 3 zeroes in front - * (at negative indices) for alignment purposes; we use 4 - * to keep the data well-aligned. - */ - if(0 != decoder->private_->output[i]) { - free(decoder->private_->output[i]-4); - decoder->private_->output[i] = 0; - } - if(0 != decoder->private_->residual_unaligned[i]) { - free(decoder->private_->residual_unaligned[i]); - decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; - } - } - decoder->private_->output_capacity = 0; - decoder->private_->output_channels = 0; - -#if FLAC__HAS_OGG - if(decoder->private_->is_ogg) - FLAC__ogg_decoder_aspect_finish(&decoder->protected_->ogg_decoder_aspect); -#endif - - if(0 != decoder->private_->file) { - if(decoder->private_->file != stdin) - fclose(decoder->private_->file); - decoder->private_->file = 0; - } - - if(decoder->private_->do_md5_checking) { - if(memcmp(decoder->private_->stream_info.data.stream_info.md5sum, decoder->private_->computed_md5sum, 16)) - md5_failed = true; - } - decoder->private_->is_seeking = false; - - set_defaults_(decoder); - - decoder->protected_->state = FLAC__STREAM_DECODER_UNINITIALIZED; - - return !md5_failed; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long value) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; -#if FLAC__HAS_OGG - /* can't check decoder->private_->is_ogg since that's not set until init time */ - FLAC__ogg_decoder_aspect_set_serial_number(&decoder->protected_->ogg_decoder_aspect, value); - return true; -#else - (void)value; - return false; -#endif -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - decoder->protected_->md5_checking = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT((unsigned)type <= FLAC__MAX_METADATA_TYPE_CODE); - /* double protection */ - if((unsigned)type > FLAC__MAX_METADATA_TYPE_CODE) - return false; - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - decoder->private_->metadata_filter[type] = true; - if(type == FLAC__METADATA_TYPE_APPLICATION) - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT(0 != id); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - - if(decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) - return true; - - FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); - - if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { - if(0 == (decoder->private_->metadata_filter_ids = (FLAC__byte*) safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - decoder->private_->metadata_filter_ids_capacity *= 2; - } - - memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); - decoder->private_->metadata_filter_ids_count++; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder) -{ - unsigned i; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - for(i = 0; i < sizeof(decoder->private_->metadata_filter) / sizeof(decoder->private_->metadata_filter[0]); i++) - decoder->private_->metadata_filter[i] = true; - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT((unsigned)type <= FLAC__MAX_METADATA_TYPE_CODE); - /* double protection */ - if((unsigned)type > FLAC__MAX_METADATA_TYPE_CODE) - return false; - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - decoder->private_->metadata_filter[type] = false; - if(type == FLAC__METADATA_TYPE_APPLICATION) - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - FLAC__ASSERT(0 != id); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - - if(!decoder->private_->metadata_filter[FLAC__METADATA_TYPE_APPLICATION]) - return true; - - FLAC__ASSERT(0 != decoder->private_->metadata_filter_ids); - - if(decoder->private_->metadata_filter_ids_count == decoder->private_->metadata_filter_ids_capacity) { - if(0 == (decoder->private_->metadata_filter_ids = (FLAC__byte*) safe_realloc_mul_2op_(decoder->private_->metadata_filter_ids, decoder->private_->metadata_filter_ids_capacity, /*times*/2))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - decoder->private_->metadata_filter_ids_capacity *= 2; - } - - memcpy(decoder->private_->metadata_filter_ids + decoder->private_->metadata_filter_ids_count * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)); - decoder->private_->metadata_filter_ids_count++; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - if(decoder->protected_->state != FLAC__STREAM_DECODER_UNINITIALIZED) - return false; - memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); - decoder->private_->metadata_filter_ids_count = 0; - return true; -} - -FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->state; -} - -FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder) -{ - return FLAC__StreamDecoderStateString[decoder->protected_->state]; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->md5_checking; -} - -FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->private_->has_stream_info? decoder->private_->stream_info.data.stream_info.total_samples : 0; -} - -FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->channels; -} - -FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->channel_assignment; -} - -FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->bits_per_sample; -} - -FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->sample_rate; -} - -FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - return decoder->protected_->blocksize; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != position); - -#if FLAC__HAS_OGG - if(decoder->private_->is_ogg) - return false; -#endif - if(0 == decoder->private_->tell_callback) - return false; - if(decoder->private_->tell_callback(decoder, position, decoder->private_->client_data) != FLAC__STREAM_DECODER_TELL_STATUS_OK) - return false; - /* should never happen since all FLAC frames and metadata blocks are byte aligned, but check just in case */ - if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) - return false; - FLAC__ASSERT(*position >= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder)); - *position -= FLAC__stream_decoder_get_input_bytes_unconsumed(decoder); - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - - decoder->private_->samples_decoded = 0; - decoder->private_->do_md5_checking = false; - -#if FLAC__HAS_OGG - if(decoder->private_->is_ogg) - FLAC__ogg_decoder_aspect_flush(&decoder->protected_->ogg_decoder_aspect); -#endif - - if(!FLAC__bitreader_clear(decoder->private_->input)) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - FLAC__ASSERT(0 != decoder->protected_); - - if(!FLAC__stream_decoder_flush(decoder)) { - /* above call sets the state for us */ - return false; - } - -#if FLAC__HAS_OGG - /*@@@ could go in !internal_reset_hack block below */ - if(decoder->private_->is_ogg) - FLAC__ogg_decoder_aspect_reset(&decoder->protected_->ogg_decoder_aspect); -#endif - - /* Rewind if necessary. If FLAC__stream_decoder_init() is calling us, - * (internal_reset_hack) don't try to rewind since we are already at - * the beginning of the stream and don't want to fail if the input is - * not seekable. - */ - if(!decoder->private_->internal_reset_hack) { - if(decoder->private_->file == stdin) - return false; /* can't rewind stdin, reset fails */ - if(decoder->private_->seek_callback && decoder->private_->seek_callback(decoder, 0, decoder->private_->client_data) == FLAC__STREAM_DECODER_SEEK_STATUS_ERROR) - return false; /* seekable and seek fails, reset fails */ - } - else - decoder->private_->internal_reset_hack = false; - - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_METADATA; - - decoder->private_->has_stream_info = false; - if(decoder->private_->has_seek_table && 0 != decoder->private_->seek_table.data.seek_table.points) { - free(decoder->private_->seek_table.data.seek_table.points); - decoder->private_->seek_table.data.seek_table.points = 0; - decoder->private_->has_seek_table = false; - } - decoder->private_->do_md5_checking = decoder->protected_->md5_checking; - /* - * This goes in reset() and not flush() because according to the spec, a - * fixed-blocksize stream must stay that way through the whole stream. - */ - decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size = 0; - - /* We initialize the FLAC__MD5Context even though we may never use it. This - * is because md5 checking may be turned on to start and then turned off if - * a seek occurs. So we init the context here and finalize it in - * FLAC__stream_decoder_finish() to make sure things are always cleaned up - * properly. - */ - FLAC__MD5Init(&decoder->private_->md5context); - - decoder->private_->first_frame_offset = 0; - decoder->private_->unparseable_frame_count = 0; - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder) -{ - FLAC__bool got_a_frame; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - if(!find_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_METADATA: - if(!read_metadata_(decoder)) - return false; /* above function sets the status for us */ - else - return true; - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - if(!frame_sync_(decoder)) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_FRAME: - if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/true)) - return false; /* above function sets the status for us */ - if(got_a_frame) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - if(!find_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_METADATA: - if(!read_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - case FLAC__STREAM_DECODER_READ_FRAME: - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder) -{ - FLAC__bool dummy; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - if(!find_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_METADATA: - if(!read_metadata_(decoder)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - if(!frame_sync_(decoder)) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_FRAME: - if(!read_frame_(decoder, &dummy, /*do_full_decode=*/true)) - return false; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder) -{ - FLAC__bool got_a_frame; - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->protected_); - - while(1) { - switch(decoder->protected_->state) { - case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA: - case FLAC__STREAM_DECODER_READ_METADATA: - return false; /* above function sets the status for us */ - case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC: - if(!frame_sync_(decoder)) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_READ_FRAME: - if(!read_frame_(decoder, &got_a_frame, /*do_full_decode=*/false)) - return false; /* above function sets the status for us */ - if(got_a_frame) - return true; /* above function sets the status for us */ - break; - case FLAC__STREAM_DECODER_END_OF_STREAM: - case FLAC__STREAM_DECODER_ABORTED: - return true; - default: - FLAC__ASSERT(0); - return false; - } - } -} - -FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample) -{ - FLAC__uint64 length; - - FLAC__ASSERT(0 != decoder); - - if( - decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA && - decoder->protected_->state != FLAC__STREAM_DECODER_READ_METADATA && - decoder->protected_->state != FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC && - decoder->protected_->state != FLAC__STREAM_DECODER_READ_FRAME && - decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM - ) - return false; - - if(0 == decoder->private_->seek_callback) - return false; - - FLAC__ASSERT(decoder->private_->seek_callback); - FLAC__ASSERT(decoder->private_->tell_callback); - FLAC__ASSERT(decoder->private_->length_callback); - FLAC__ASSERT(decoder->private_->eof_callback); - - if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) - return false; - - decoder->private_->is_seeking = true; - - /* turn off md5 checking if a seek is attempted */ - decoder->private_->do_md5_checking = false; - - /* get the file length (currently our algorithm needs to know the length so it's also an error to get FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED) */ - if(decoder->private_->length_callback(decoder, &length, decoder->private_->client_data) != FLAC__STREAM_DECODER_LENGTH_STATUS_OK) { - decoder->private_->is_seeking = false; - return false; - } - - /* if we haven't finished processing the metadata yet, do that so we have the STREAMINFO, SEEK_TABLE, and first_frame_offset */ - if( - decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA || - decoder->protected_->state == FLAC__STREAM_DECODER_READ_METADATA - ) { - if(!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) { - /* above call sets the state for us */ - decoder->private_->is_seeking = false; - return false; - } - /* check this again in case we didn't know total_samples the first time */ - if(FLAC__stream_decoder_get_total_samples(decoder) > 0 && sample >= FLAC__stream_decoder_get_total_samples(decoder)) { - decoder->private_->is_seeking = false; - return false; - } - } - - { - const FLAC__bool ok = -#if FLAC__HAS_OGG - decoder->private_->is_ogg? - seek_to_absolute_sample_ogg_(decoder, length, sample) : -#endif - seek_to_absolute_sample_(decoder, length, sample) - ; - decoder->private_->is_seeking = false; - return ok; - } -} - -/*********************************************************************** - * - * Protected class methods - * - ***********************************************************************/ - -unsigned FLAC__stream_decoder_get_input_bytes_unconsumed(const FLAC__StreamDecoder *decoder) -{ - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - FLAC__ASSERT(!(FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) & 7)); - return FLAC__bitreader_get_input_bits_unconsumed(decoder->private_->input) / 8; -} - -/*********************************************************************** - * - * Private class methods - * - ***********************************************************************/ - -void set_defaults_(FLAC__StreamDecoder *decoder) -{ -#if FLAC__HAS_OGG - decoder->private_->is_ogg = false; -#endif - decoder->private_->read_callback = 0; - decoder->private_->seek_callback = 0; - decoder->private_->tell_callback = 0; - decoder->private_->length_callback = 0; - decoder->private_->eof_callback = 0; - decoder->private_->write_callback = 0; - decoder->private_->metadata_callback = 0; - decoder->private_->error_callback = 0; - decoder->private_->client_data = 0; - - memset(decoder->private_->metadata_filter, 0, sizeof(decoder->private_->metadata_filter)); - decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] = true; - decoder->private_->metadata_filter_ids_count = 0; - - decoder->protected_->md5_checking = false; - -#if FLAC__HAS_OGG - FLAC__ogg_decoder_aspect_set_defaults(&decoder->protected_->ogg_decoder_aspect); -#endif -} - -#if 0 -/* - * This will forcibly set stdin to binary mode (for OSes that require it) - */ -FILE *get_binary_stdin_(void) -{ - /* if something breaks here it is probably due to the presence or - * absence of an underscore before the identifiers 'setmode', - * 'fileno', and/or 'O_BINARY'; check your system header files. - */ -#if defined _MSC_VER || defined __MINGW32__ - _setmode(_fileno(stdin), _O_BINARY); -#elif defined __CYGWIN__ - /* almost certainly not needed for any modern Cygwin, but let's be safe... */ - setmode(_fileno(stdin), _O_BINARY); -#elif defined __EMX__ - setmode(fileno(stdin), O_BINARY); -#endif - - return stdin; -} -#endif - -FLAC__bool allocate_output_(FLAC__StreamDecoder *decoder, unsigned size, unsigned channels) -{ - unsigned i; - FLAC__int32 *tmp; - - if(size <= decoder->private_->output_capacity && channels <= decoder->private_->output_channels) - return true; - - /* simply using realloc() is not practical because the number of channels may change mid-stream */ - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - if(0 != decoder->private_->output[i]) { - free(decoder->private_->output[i]-4); - decoder->private_->output[i] = 0; - } - if(0 != decoder->private_->residual_unaligned[i]) { - free(decoder->private_->residual_unaligned[i]); - decoder->private_->residual_unaligned[i] = decoder->private_->residual[i] = 0; - } - } - - for(i = 0; i < channels; i++) { - /* WATCHOUT: - * FLAC__lpc_restore_signal_asm_ia32_mmx() requires that the - * output arrays have a buffer of up to 3 zeroes in front - * (at negative indices) for alignment purposes; we use 4 - * to keep the data well-aligned. - */ - tmp = (FLAC__int32*) safe_malloc_muladd2_(sizeof(FLAC__int32), /*times (*/size, /*+*/4/*)*/); - if(tmp == 0) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - memset(tmp, 0, sizeof(FLAC__int32)*4); - decoder->private_->output[i] = tmp + 4; - - if(!FLAC__memory_alloc_aligned_int32_array(size, &decoder->private_->residual_unaligned[i], &decoder->private_->residual[i])) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - } - - decoder->private_->output_capacity = size; - decoder->private_->output_channels = channels; - - return true; -} - -FLAC__bool has_id_filtered_(FLAC__StreamDecoder *decoder, FLAC__byte *id) -{ - size_t i; - - FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - - for(i = 0; i < decoder->private_->metadata_filter_ids_count; i++) - if(0 == memcmp(decoder->private_->metadata_filter_ids + i * (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8), id, (FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8))) - return true; - - return false; -} - -FLAC__bool find_metadata_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - unsigned i, id_; - FLAC__bool first = true; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - for(i = id_ = 0; i < 4; ) { - if(decoder->private_->cached) { - x = (FLAC__uint32)decoder->private_->lookahead; - decoder->private_->cached = false; - } - else { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - } - if(x == FLAC__STREAM_SYNC_STRING[i]) { - first = true; - i++; - id_ = 0; - continue; - } - - if(id_ >= 3) - return false; - - if(x == ID3V2_TAG_[id_]) { - id_++; - i = 0; - if(id_ == 3) { - if(!skip_id3v2_tag_(decoder)) - return false; /* skip_id3v2_tag_ sets the state for us */ - } - continue; - } - id_ = 0; - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->header_warmup[0] = (FLAC__byte)x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - - /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ - /* else we have to check if the second byte is the end of a sync code */ - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->lookahead = (FLAC__byte)x; - decoder->private_->cached = true; - } - else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ - decoder->private_->header_warmup[1] = (FLAC__byte)x; - decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; - return true; - } - } - i = 0; - if(first) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - first = false; - } - } - - decoder->protected_->state = FLAC__STREAM_DECODER_READ_METADATA; - return true; -} - -FLAC__bool read_metadata_(FLAC__StreamDecoder *decoder) -{ - FLAC__bool is_last; - FLAC__uint32 i, x, type, length; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_IS_LAST_LEN)) - return false; /* read_callback_ sets the state for us */ - is_last = x? true : false; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &type, FLAC__STREAM_METADATA_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &length, FLAC__STREAM_METADATA_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(type == FLAC__METADATA_TYPE_STREAMINFO) { - if(!read_metadata_streaminfo_(decoder, is_last, length)) - return false; - - decoder->private_->has_stream_info = true; - if(0 == memcmp(decoder->private_->stream_info.data.stream_info.md5sum, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16)) - decoder->private_->do_md5_checking = false; - if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_STREAMINFO] && decoder->private_->metadata_callback) - decoder->private_->metadata_callback(decoder, &decoder->private_->stream_info, decoder->private_->client_data); - } - else if(type == FLAC__METADATA_TYPE_SEEKTABLE) { - if(!read_metadata_seektable_(decoder, is_last, length)) - return false; - - decoder->private_->has_seek_table = true; - if(!decoder->private_->is_seeking && decoder->private_->metadata_filter[FLAC__METADATA_TYPE_SEEKTABLE] && decoder->private_->metadata_callback) - decoder->private_->metadata_callback(decoder, &decoder->private_->seek_table, decoder->private_->client_data); - } - else { - FLAC__bool skip_it = !decoder->private_->metadata_filter[type]; - unsigned real_length = length; - FLAC__StreamMetadata block; - - memset(&block, 0, sizeof(block)); - block.is_last = is_last; - block.type = (FLAC__MetadataType)type; - block.length = length; - - if(type == FLAC__METADATA_TYPE_APPLICATION) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8)) - return false; /* read_callback_ sets the state for us */ - - if(real_length < FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8) { /* underflow check */ - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;/*@@@@@@ maybe wrong error? need to resync?*/ - return false; - } - - real_length -= FLAC__STREAM_METADATA_APPLICATION_ID_LEN/8; - - if(decoder->private_->metadata_filter_ids_count > 0 && has_id_filtered_(decoder, block.data.application.id)) - skip_it = !skip_it; - } - - if(skip_it) { - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) - return false; /* read_callback_ sets the state for us */ - } - else { - FLAC__bool ok = true; - switch(type) { - case FLAC__METADATA_TYPE_PADDING: - /* skip the padding bytes */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, real_length)) - ok = false; /* read_callback_ sets the state for us */ - break; - case FLAC__METADATA_TYPE_APPLICATION: - /* remember, we read the ID already */ - if(real_length > 0) { - if(0 == (block.data.application.data = (FLAC__byte*) malloc(real_length))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - ok = false; - } - else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.application.data, real_length)) - ok = false; /* read_callback_ sets the state for us */ - } - else - block.data.application.data = 0; - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(!read_metadata_vorbiscomment_(decoder, &block.data.vorbis_comment, real_length)) - ok = false; - break; - case FLAC__METADATA_TYPE_CUESHEET: - if(!read_metadata_cuesheet_(decoder, &block.data.cue_sheet)) - ok = false; - break; - case FLAC__METADATA_TYPE_PICTURE: - if(!read_metadata_picture_(decoder, &block.data.picture)) - ok = false; - break; - case FLAC__METADATA_TYPE_STREAMINFO: - case FLAC__METADATA_TYPE_SEEKTABLE: - FLAC__ASSERT(0); - break; - default: - if(real_length > 0) { - if(0 == (block.data.unknown.data = (FLAC__byte*) malloc(real_length))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - ok = false; - } - else if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, block.data.unknown.data, real_length)) - ok = false; /* read_callback_ sets the state for us */ - } - else - block.data.unknown.data = 0; - break; - } - if(ok && !decoder->private_->is_seeking && decoder->private_->metadata_callback) - decoder->private_->metadata_callback(decoder, &block, decoder->private_->client_data); - - /* now we have to free any malloc()ed data in the block */ - switch(type) { - case FLAC__METADATA_TYPE_PADDING: - break; - case FLAC__METADATA_TYPE_APPLICATION: - if(0 != block.data.application.data) - free(block.data.application.data); - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(0 != block.data.vorbis_comment.vendor_string.entry) - free(block.data.vorbis_comment.vendor_string.entry); - if(block.data.vorbis_comment.num_comments > 0) - for(i = 0; i < block.data.vorbis_comment.num_comments; i++) - if(0 != block.data.vorbis_comment.comments[i].entry) - free(block.data.vorbis_comment.comments[i].entry); - if(0 != block.data.vorbis_comment.comments) - free(block.data.vorbis_comment.comments); - break; - case FLAC__METADATA_TYPE_CUESHEET: - if(block.data.cue_sheet.num_tracks > 0) - for(i = 0; i < block.data.cue_sheet.num_tracks; i++) - if(0 != block.data.cue_sheet.tracks[i].indices) - free(block.data.cue_sheet.tracks[i].indices); - if(0 != block.data.cue_sheet.tracks) - free(block.data.cue_sheet.tracks); - break; - case FLAC__METADATA_TYPE_PICTURE: - if(0 != block.data.picture.mime_type) - free(block.data.picture.mime_type); - if(0 != block.data.picture.description) - free(block.data.picture.description); - if(0 != block.data.picture.data) - free(block.data.picture.data); - break; - case FLAC__METADATA_TYPE_STREAMINFO: - case FLAC__METADATA_TYPE_SEEKTABLE: - FLAC__ASSERT(0); - default: - if(0 != block.data.unknown.data) - free(block.data.unknown.data); - break; - } - - if(!ok) /* anything that unsets "ok" should also make sure decoder->protected_->state is updated */ - return false; - } - } - - if(is_last) { - /* if this fails, it's OK, it's just a hint for the seek routine */ - if(!FLAC__stream_decoder_get_decode_position(decoder, &decoder->private_->first_frame_offset)) - decoder->private_->first_frame_offset = 0; - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - } - - return true; -} - -FLAC__bool read_metadata_streaminfo_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length) -{ - FLAC__uint32 x; - unsigned bits, used_bits = 0; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - decoder->private_->stream_info.type = FLAC__METADATA_TYPE_STREAMINFO; - decoder->private_->stream_info.is_last = is_last; - decoder->private_->stream_info.length = length; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, bits)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.min_blocksize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.max_blocksize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.min_framesize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.max_framesize = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.sample_rate = x; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.channels = x+1; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->stream_info.data.stream_info.bits_per_sample = x+1; - used_bits += bits; - - bits = FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN; - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &decoder->private_->stream_info.data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) - return false; /* read_callback_ sets the state for us */ - used_bits += bits; - - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, decoder->private_->stream_info.data.stream_info.md5sum, 16)) - return false; /* read_callback_ sets the state for us */ - used_bits += 16*8; - - /* skip the rest of the block */ - FLAC__ASSERT(used_bits % 8 == 0); - length -= (used_bits / 8); - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) - return false; /* read_callback_ sets the state for us */ - - return true; -} - -FLAC__bool read_metadata_seektable_(FLAC__StreamDecoder *decoder, FLAC__bool is_last, unsigned length) -{ - FLAC__uint32 i, x; - FLAC__uint64 xx; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - decoder->private_->seek_table.type = FLAC__METADATA_TYPE_SEEKTABLE; - decoder->private_->seek_table.is_last = is_last; - decoder->private_->seek_table.length = length; - - decoder->private_->seek_table.data.seek_table.num_points = length / FLAC__STREAM_METADATA_SEEKPOINT_LENGTH; - - /* use realloc since we may pass through here several times (e.g. after seeking) */ - if(0 == (decoder->private_->seek_table.data.seek_table.points = (FLAC__StreamMetadata_SeekPoint*) safe_realloc_mul_2op_(decoder->private_->seek_table.data.seek_table.points, decoder->private_->seek_table.data.seek_table.num_points, /*times*/sizeof(FLAC__StreamMetadata_SeekPoint)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for(i = 0; i < decoder->private_->seek_table.data.seek_table.num_points; i++) { - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->seek_table.data.seek_table.points[i].sample_number = xx; - - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &xx, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->seek_table.data.seek_table.points[i].stream_offset = xx; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->seek_table.data.seek_table.points[i].frame_samples = x; - } - length -= (decoder->private_->seek_table.data.seek_table.num_points * FLAC__STREAM_METADATA_SEEKPOINT_LENGTH); - /* if there is a partial point left, skip over it */ - if(length > 0) { - /*@@@ do a send_error_to_client_() here? there's an argument for either way */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) - return false; /* read_callback_ sets the state for us */ - } - - return true; -} - -FLAC__bool read_metadata_vorbiscomment_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_VorbisComment *obj, unsigned length) -{ - FLAC__uint32 i; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - /* read vendor string */ - if (length >= 8) { - length -= 8; /* vendor string length + num comments entries alone take 8 bytes */ - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); - if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->vendor_string.length)) - return false; /* read_callback_ sets the state for us */ - if (obj->vendor_string.length > 0) { - if (length < obj->vendor_string.length) { - obj->vendor_string.length = 0; - obj->vendor_string.entry = 0; - goto skip; - } - else - length -= obj->vendor_string.length; - if (0 == (obj->vendor_string.entry = (FLAC__byte*) safe_malloc_add_2op_(obj->vendor_string.length, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->vendor_string.entry, obj->vendor_string.length)) - return false; /* read_callback_ sets the state for us */ - obj->vendor_string.entry[obj->vendor_string.length] = '\0'; - } - else - obj->vendor_string.entry = 0; - - /* read num comments */ - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_NUM_COMMENTS_LEN == 32); - if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->num_comments)) - return false; /* read_callback_ sets the state for us */ - - /* read comments */ - if (obj->num_comments > 0) { - if (0 == (obj->comments = (FLAC__StreamMetadata_VorbisComment_Entry*) safe_malloc_mul_2op_p(obj->num_comments, /*times*/sizeof(FLAC__StreamMetadata_VorbisComment_Entry)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for (i = 0; i < obj->num_comments; i++) { - FLAC__ASSERT(FLAC__STREAM_METADATA_VORBIS_COMMENT_ENTRY_LENGTH_LEN == 32); - if (length < 4) { - obj->num_comments = i; - goto skip; - } - else - length -= 4; - if (!FLAC__bitreader_read_uint32_little_endian(decoder->private_->input, &obj->comments[i].length)) - return false; /* read_callback_ sets the state for us */ - if (obj->comments[i].length > 0) { - if (length < obj->comments[i].length) { - obj->comments[i].length = 0; - obj->comments[i].entry = 0; - obj->num_comments = i; - goto skip; - } - else - length -= obj->comments[i].length; - if (0 == (obj->comments[i].entry = (FLAC__byte*) safe_malloc_add_2op_(obj->comments[i].length, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if (!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->comments[i].entry, obj->comments[i].length)) - return false; /* read_callback_ sets the state for us */ - obj->comments[i].entry[obj->comments[i].length] = '\0'; - } - else - obj->comments[i].entry = 0; - } - } - else - obj->comments = 0; - } - - skip: - if (length > 0) { - /* This will only happen on files with invalid data in comments */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, length)) - return false; /* read_callback_ sets the state for us */ - } - - return true; -} - -FLAC__bool read_metadata_cuesheet_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_CueSheet *obj) -{ - FLAC__uint32 i, j, x; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - memset(obj, 0, sizeof(FLAC__StreamMetadata_CueSheet)); - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &obj->lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) - return false; /* read_callback_ sets the state for us */ - obj->is_cd = x? true : false; - - if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) - return false; /* read_callback_ sets the state for us */ - obj->num_tracks = x; - - if(obj->num_tracks > 0) { - if(0 == (obj->tracks = (FLAC__StreamMetadata_CueSheet_Track*) safe_calloc_(obj->num_tracks, sizeof(FLAC__StreamMetadata_CueSheet_Track)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for(i = 0; i < obj->num_tracks; i++) { - FLAC__StreamMetadata_CueSheet_Track *track = &obj->tracks[i]; - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) - return false; /* read_callback_ sets the state for us */ - track->number = (FLAC__byte)x; - - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - track->type = x; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) - return false; /* read_callback_ sets the state for us */ - track->pre_emphasis = x; - - if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) - return false; /* read_callback_ sets the state for us */ - track->num_indices = (FLAC__byte)x; - - if(track->num_indices > 0) { - if(0 == (track->indices = (FLAC__StreamMetadata_CueSheet_Index*) safe_calloc_(track->num_indices, sizeof(FLAC__StreamMetadata_CueSheet_Index)))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - for(j = 0; j < track->num_indices; j++) { - FLAC__StreamMetadata_CueSheet_Index *indx = &track->indices[j]; - if(!FLAC__bitreader_read_raw_uint64(decoder->private_->input, &indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) - return false; /* read_callback_ sets the state for us */ - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) - return false; /* read_callback_ sets the state for us */ - indx->number = (FLAC__byte)x; - - if(!FLAC__bitreader_skip_bits_no_crc(decoder->private_->input, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) - return false; /* read_callback_ sets the state for us */ - } - } - } - } - - return true; -} - -FLAC__bool read_metadata_picture_(FLAC__StreamDecoder *decoder, FLAC__StreamMetadata_Picture *obj) -{ - FLAC__uint32 x; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - /* read type */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - obj->type = (FLAC__StreamMetadata_Picture_Type) x; - - /* read MIME type */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - if(0 == (obj->mime_type = (char*) safe_malloc_add_2op_(x, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if(x > 0) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, (FLAC__byte*)obj->mime_type, x)) - return false; /* read_callback_ sets the state for us */ - } - obj->mime_type[x] = '\0'; - - /* read description */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - if(0 == (obj->description = (FLAC__byte*) safe_malloc_add_2op_(x, /*+*/1))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if(x > 0) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->description, x)) - return false; /* read_callback_ sets the state for us */ - } - obj->description[x] = '\0'; - - /* read width */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read height */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read depth */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read colors */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &obj->colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) - return false; /* read_callback_ sets the state for us */ - - /* read data */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &(obj->data_length), FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) - return false; /* read_callback_ sets the state for us */ - if(0 == (obj->data = (FLAC__byte*) safe_malloc_(obj->data_length))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - if(obj->data_length > 0) { - if(!FLAC__bitreader_read_byte_block_aligned_no_crc(decoder->private_->input, obj->data, obj->data_length)) - return false; /* read_callback_ sets the state for us */ - } - - return true; -} - -FLAC__bool skip_id3v2_tag_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - unsigned i, skip; - - /* skip the version and flags bytes */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 24)) - return false; /* read_callback_ sets the state for us */ - /* get the size (in bytes) to skip */ - skip = 0; - for(i = 0; i < 4; i++) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - skip <<= 7; - skip |= (x & 0x7f); - } - /* skip the rest of the tag */ - if(!FLAC__bitreader_skip_byte_block_aligned_no_crc(decoder->private_->input, skip)) - return false; /* read_callback_ sets the state for us */ - return true; -} - -FLAC__bool frame_sync_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - FLAC__bool first = true; - - /* If we know the total number of samples in the stream, stop if we've read that many. */ - /* This will stop us, for example, from wasting time trying to sync on an ID3V1 tag. */ - if(FLAC__stream_decoder_get_total_samples(decoder) > 0) { - if(decoder->private_->samples_decoded >= FLAC__stream_decoder_get_total_samples(decoder)) { - decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; - return true; - } - } - - /* make sure we're byte aligned */ - if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) - return false; /* read_callback_ sets the state for us */ - } - - while(1) { - if(decoder->private_->cached) { - x = (FLAC__uint32)decoder->private_->lookahead; - decoder->private_->cached = false; - } - else { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - } - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->header_warmup[0] = (FLAC__byte)x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - - /* we have to check if we just read two 0xff's in a row; the second may actually be the beginning of the sync code */ - /* else we have to check if the second byte is the end of a sync code */ - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - decoder->private_->lookahead = (FLAC__byte)x; - decoder->private_->cached = true; - } - else if(x >> 1 == 0x7c) { /* MAGIC NUMBER for the last 6 sync bits and reserved 7th bit */ - decoder->private_->header_warmup[1] = (FLAC__byte)x; - decoder->protected_->state = FLAC__STREAM_DECODER_READ_FRAME; - return true; - } - } - if(first) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - first = false; - } - } - - return true; -} - -FLAC__bool read_frame_(FLAC__StreamDecoder *decoder, FLAC__bool *got_a_frame, FLAC__bool do_full_decode) -{ - unsigned channel; - unsigned i; - FLAC__int32 mid, side; - unsigned frame_crc; /* the one we calculate from the input stream */ - FLAC__uint32 x; - - *got_a_frame = false; - - /* init the CRC */ - frame_crc = 0; - frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[0], frame_crc); - frame_crc = FLAC__CRC16_UPDATE(decoder->private_->header_warmup[1], frame_crc); - FLAC__bitreader_reset_read_crc16(decoder->private_->input, (FLAC__uint16)frame_crc); - - if(!read_frame_header_(decoder)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means we didn't sync on a valid header */ - return true; - if(!allocate_output_(decoder, decoder->private_->frame.header.blocksize, decoder->private_->frame.header.channels)) - return false; - for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { - /* - * first figure the correct bits-per-sample of the subframe - */ - unsigned bps = decoder->private_->frame.header.bits_per_sample; - switch(decoder->private_->frame.header.channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - /* no adjustment needed */ - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - if(channel == 1) - bps++; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - if(channel == 0) - bps++; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - if(channel == 1) - bps++; - break; - default: - FLAC__ASSERT(0); - } - /* - * now read it - */ - if(!read_subframe_(decoder, channel, bps, do_full_decode)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ - return true; - } - if(!read_zero_padding_(decoder)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption (i.e. "zero bits" were not all zeroes) */ - return true; - - /* - * Read the frame CRC-16 from the footer and check - */ - frame_crc = FLAC__bitreader_get_read_crc16(decoder->private_->input); - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, FLAC__FRAME_FOOTER_CRC_LEN)) - return false; /* read_callback_ sets the state for us */ - if(frame_crc == x) { - if(do_full_decode) { - /* Undo any special channel coding */ - switch(decoder->private_->frame.header.channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - /* do nothing */ - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - decoder->private_->output[1][i] = decoder->private_->output[0][i] - decoder->private_->output[1][i]; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - decoder->private_->output[0][i] += decoder->private_->output[1][i]; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - FLAC__ASSERT(decoder->private_->frame.header.channels == 2); - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { -#if 1 - mid = decoder->private_->output[0][i]; - side = decoder->private_->output[1][i]; - mid <<= 1; - mid |= (side & 1); /* i.e. if 'side' is odd... */ - decoder->private_->output[0][i] = (mid + side) >> 1; - decoder->private_->output[1][i] = (mid - side) >> 1; -#else - /* OPT: without 'side' temp variable */ - mid = (decoder->private_->output[0][i] << 1) | (decoder->private_->output[1][i] & 1); /* i.e. if 'side' is odd... */ - decoder->private_->output[0][i] = (mid + decoder->private_->output[1][i]) >> 1; - decoder->private_->output[1][i] = (mid - decoder->private_->output[1][i]) >> 1; -#endif - } - break; - default: - FLAC__ASSERT(0); - break; - } - } - } - else { - /* Bad frame, emit error and zero the output signal */ - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH); - if(do_full_decode) { - for(channel = 0; channel < decoder->private_->frame.header.channels; channel++) { - memset(decoder->private_->output[channel], 0, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); - } - } - } - - *got_a_frame = true; - - /* we wait to update fixed_block_size until here, when we're sure we've got a proper frame and hence a correct blocksize */ - if(decoder->private_->next_fixed_block_size) - decoder->private_->fixed_block_size = decoder->private_->next_fixed_block_size; - - /* put the latest values into the public section of the decoder instance */ - decoder->protected_->channels = decoder->private_->frame.header.channels; - decoder->protected_->channel_assignment = decoder->private_->frame.header.channel_assignment; - decoder->protected_->bits_per_sample = decoder->private_->frame.header.bits_per_sample; - decoder->protected_->sample_rate = decoder->private_->frame.header.sample_rate; - decoder->protected_->blocksize = decoder->private_->frame.header.blocksize; - - FLAC__ASSERT(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - decoder->private_->samples_decoded = decoder->private_->frame.header.number.sample_number + decoder->private_->frame.header.blocksize; - - /* write it */ - if(do_full_decode) { - if(write_audio_frame_to_client_(decoder, &decoder->private_->frame, (const FLAC__int32 * const *)decoder->private_->output) != FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE) - return false; - } - - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; -} - -FLAC__bool read_frame_header_(FLAC__StreamDecoder *decoder) -{ - FLAC__uint32 x; - FLAC__uint64 xx; - unsigned i, blocksize_hint = 0, sample_rate_hint = 0; - FLAC__byte crc8, raw_header[16]; /* MAGIC NUMBER based on the maximum frame header size, including CRC */ - unsigned raw_header_len; - FLAC__bool is_unparseable = false; - - FLAC__ASSERT(FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)); - - /* init the raw header with the saved bits from synchronization */ - raw_header[0] = decoder->private_->header_warmup[0]; - raw_header[1] = decoder->private_->header_warmup[1]; - raw_header_len = 2; - - /* check to make sure that reserved bit is 0 */ - if(raw_header[1] & 0x02) /* MAGIC NUMBER */ - is_unparseable = true; - - /* - * Note that along the way as we read the header, we look for a sync - * code inside. If we find one it would indicate that our original - * sync was bad since there cannot be a sync code in a valid header. - * - * Three kinds of things can go wrong when reading the frame header: - * 1) We may have sync'ed incorrectly and not landed on a frame header. - * If we don't find a sync code, it can end up looking like we read - * a valid but unparseable header, until getting to the frame header - * CRC. Even then we could get a false positive on the CRC. - * 2) We may have sync'ed correctly but on an unparseable frame (from a - * future encoder). - * 3) We may be on a damaged frame which appears valid but unparseable. - * - * For all these reasons, we try and read a complete frame header as - * long as it seems valid, even if unparseable, up until the frame - * header CRC. - */ - - /* - * read in the raw header as bytes so we can CRC it, and parse it on the way - */ - for(i = 0; i < 2; i++) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - if(x == 0xff) { /* MAGIC NUMBER for the first 8 frame sync bits */ - /* if we get here it means our original sync was erroneous since the sync code cannot appear in the header */ - decoder->private_->lookahead = (FLAC__byte)x; - decoder->private_->cached = true; - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - raw_header[raw_header_len++] = (FLAC__byte)x; - } - - switch(x = raw_header[2] >> 4) { - case 0: - is_unparseable = true; - break; - case 1: - decoder->private_->frame.header.blocksize = 192; - break; - case 2: - case 3: - case 4: - case 5: - decoder->private_->frame.header.blocksize = 576 << (x-2); - break; - case 6: - case 7: - blocksize_hint = x; - break; - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - decoder->private_->frame.header.blocksize = 256 << (x-8); - break; - default: - FLAC__ASSERT(0); - break; - } - - switch(x = raw_header[2] & 0x0f) { - case 0: - if(decoder->private_->has_stream_info) - decoder->private_->frame.header.sample_rate = decoder->private_->stream_info.data.stream_info.sample_rate; - else - is_unparseable = true; - break; - case 1: - decoder->private_->frame.header.sample_rate = 88200; - break; - case 2: - decoder->private_->frame.header.sample_rate = 176400; - break; - case 3: - decoder->private_->frame.header.sample_rate = 192000; - break; - case 4: - decoder->private_->frame.header.sample_rate = 8000; - break; - case 5: - decoder->private_->frame.header.sample_rate = 16000; - break; - case 6: - decoder->private_->frame.header.sample_rate = 22050; - break; - case 7: - decoder->private_->frame.header.sample_rate = 24000; - break; - case 8: - decoder->private_->frame.header.sample_rate = 32000; - break; - case 9: - decoder->private_->frame.header.sample_rate = 44100; - break; - case 10: - decoder->private_->frame.header.sample_rate = 48000; - break; - case 11: - decoder->private_->frame.header.sample_rate = 96000; - break; - case 12: - case 13: - case 14: - sample_rate_hint = x; - break; - case 15: - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - default: - FLAC__ASSERT(0); - } - - x = (unsigned)(raw_header[3] >> 4); - if(x & 8) { - decoder->private_->frame.header.channels = 2; - switch(x & 7) { - case 0: - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE; - break; - case 1: - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE; - break; - case 2: - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE; - break; - default: - is_unparseable = true; - break; - } - } - else { - decoder->private_->frame.header.channels = (unsigned)x + 1; - decoder->private_->frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; - } - - switch(x = (unsigned)(raw_header[3] & 0x0e) >> 1) { - case 0: - if(decoder->private_->has_stream_info) - decoder->private_->frame.header.bits_per_sample = decoder->private_->stream_info.data.stream_info.bits_per_sample; - else - is_unparseable = true; - break; - case 1: - decoder->private_->frame.header.bits_per_sample = 8; - break; - case 2: - decoder->private_->frame.header.bits_per_sample = 12; - break; - case 4: - decoder->private_->frame.header.bits_per_sample = 16; - break; - case 5: - decoder->private_->frame.header.bits_per_sample = 20; - break; - case 6: - decoder->private_->frame.header.bits_per_sample = 24; - break; - case 3: - case 7: - is_unparseable = true; - break; - default: - FLAC__ASSERT(0); - break; - } - - /* check to make sure that reserved bit is 0 */ - if(raw_header[3] & 0x01) /* MAGIC NUMBER */ - is_unparseable = true; - - /* read the frame's starting sample number (or frame number as the case may be) */ - if( - raw_header[1] & 0x01 || - /*@@@ this clause is a concession to the old way of doing variable blocksize; the only known implementation is flake and can probably be removed without inconveniencing anyone */ - (decoder->private_->has_stream_info && decoder->private_->stream_info.data.stream_info.min_blocksize != decoder->private_->stream_info.data.stream_info.max_blocksize) - ) { /* variable blocksize */ - if(!FLAC__bitreader_read_utf8_uint64(decoder->private_->input, &xx, raw_header, &raw_header_len)) - return false; /* read_callback_ sets the state for us */ - if(xx == FLAC__U64L(0xffffffffffffffff)) { /* i.e. non-UTF8 code... */ - decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ - decoder->private_->cached = true; - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; - decoder->private_->frame.header.number.sample_number = xx; - } - else { /* fixed blocksize */ - if(!FLAC__bitreader_read_utf8_uint32(decoder->private_->input, &x, raw_header, &raw_header_len)) - return false; /* read_callback_ sets the state for us */ - if(x == 0xffffffff) { /* i.e. non-UTF8 code... */ - decoder->private_->lookahead = raw_header[raw_header_len-1]; /* back up as much as we can */ - decoder->private_->cached = true; - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; - decoder->private_->frame.header.number.frame_number = x; - } - - if(blocksize_hint) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)x; - if(blocksize_hint == 7) { - FLAC__uint32 _x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)_x; - x = (x << 8) | _x; - } - decoder->private_->frame.header.blocksize = x+1; - } - - if(sample_rate_hint) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)x; - if(sample_rate_hint != 12) { - FLAC__uint32 _x; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &_x, 8)) - return false; /* read_callback_ sets the state for us */ - raw_header[raw_header_len++] = (FLAC__byte)_x; - x = (x << 8) | _x; - } - if(sample_rate_hint == 12) - decoder->private_->frame.header.sample_rate = x*1000; - else if(sample_rate_hint == 13) - decoder->private_->frame.header.sample_rate = x; - else - decoder->private_->frame.header.sample_rate = x*10; - } - - /* read the CRC-8 byte */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) - return false; /* read_callback_ sets the state for us */ - crc8 = (FLAC__byte)x; - - if(FLAC__crc8(raw_header, raw_header_len) != crc8) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - /* calculate the sample number from the frame number if needed */ - decoder->private_->next_fixed_block_size = 0; - if(decoder->private_->frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { - x = decoder->private_->frame.header.number.frame_number; - decoder->private_->frame.header.number_type = FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER; - if(decoder->private_->fixed_block_size) - decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->fixed_block_size * (FLAC__uint64)x; - else if(decoder->private_->has_stream_info) { - if(decoder->private_->stream_info.data.stream_info.min_blocksize == decoder->private_->stream_info.data.stream_info.max_blocksize) { - decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->stream_info.data.stream_info.min_blocksize * (FLAC__uint64)x; - decoder->private_->next_fixed_block_size = decoder->private_->stream_info.data.stream_info.max_blocksize; - } - else - is_unparseable = true; - } - else if(x == 0) { - decoder->private_->frame.header.number.sample_number = 0; - decoder->private_->next_fixed_block_size = decoder->private_->frame.header.blocksize; - } - else { - /* can only get here if the stream has invalid frame numbering and no STREAMINFO, so assume it's not the last (possibly short) frame */ - decoder->private_->frame.header.number.sample_number = (FLAC__uint64)decoder->private_->frame.header.blocksize * (FLAC__uint64)x; - } - } - - if(is_unparseable) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - return true; -} - -FLAC__bool read_subframe_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) -{ - FLAC__uint32 x; - FLAC__bool wasted_bits; - unsigned i; - - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &x, 8)) /* MAGIC NUMBER */ - return false; /* read_callback_ sets the state for us */ - - wasted_bits = (x & 1); - x &= 0xfe; - - if(wasted_bits) { - unsigned u; - if(!FLAC__bitreader_read_unary_unsigned(decoder->private_->input, &u)) - return false; /* read_callback_ sets the state for us */ - decoder->private_->frame.subframes[channel].wasted_bits = u+1; - bps -= decoder->private_->frame.subframes[channel].wasted_bits; - } - else - decoder->private_->frame.subframes[channel].wasted_bits = 0; - - /* - * Lots of magic numbers here - */ - if(x & 0x80) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - else if(x == 0) { - if(!read_subframe_constant_(decoder, channel, bps, do_full_decode)) - return false; - } - else if(x == 2) { - if(!read_subframe_verbatim_(decoder, channel, bps, do_full_decode)) - return false; - } - else if(x < 16) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - else if(x <= 24) { - if(!read_subframe_fixed_(decoder, channel, bps, (x>>1)&7, do_full_decode)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ - return true; - } - else if(x < 64) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - else { - if(!read_subframe_lpc_(decoder, channel, bps, ((x>>1)&31)+1, do_full_decode)) - return false; - if(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC) /* means bad sync or got corruption */ - return true; - } - - if(wasted_bits && do_full_decode) { - x = decoder->private_->frame.subframes[channel].wasted_bits; - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - decoder->private_->output[channel][i] <<= x; - } - - return true; -} - -FLAC__bool read_subframe_constant_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) -{ - FLAC__Subframe_Constant *subframe = &decoder->private_->frame.subframes[channel].data.constant; - FLAC__int32 x; - unsigned i; - FLAC__int32 *output = decoder->private_->output[channel]; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_CONSTANT; - - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) - return false; /* read_callback_ sets the state for us */ - - subframe->value = x; - - /* decode the subframe */ - if(do_full_decode) { - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) - output[i] = x; - } - - return true; -} - -FLAC__bool read_subframe_fixed_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode) -{ - FLAC__Subframe_Fixed *subframe = &decoder->private_->frame.subframes[channel].data.fixed; - FLAC__int32 i32; - FLAC__uint32 u32; - unsigned u; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_FIXED; - - subframe->residual = decoder->private_->residual[channel]; - subframe->order = order; - - /* read warm-up samples */ - for(u = 0; u < order; u++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) - return false; /* read_callback_ sets the state for us */ - subframe->warmup[u] = i32; - } - - /* read entropy coding method info */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->entropy_coding_method.data.partitioned_rice.order = u32; - subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; - break; - default: - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - /* read residual */ - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) - return false; - break; - default: - FLAC__ASSERT(0); - } - - /* decode the subframe */ - if(do_full_decode) { - memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); - FLAC__fixed_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, order, decoder->private_->output[channel]+order); - } - - return true; -} - -FLAC__bool read_subframe_lpc_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, const unsigned order, FLAC__bool do_full_decode) -{ - FLAC__Subframe_LPC *subframe = &decoder->private_->frame.subframes[channel].data.lpc; - FLAC__int32 i32; - FLAC__uint32 u32; - unsigned u; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_LPC; - - subframe->residual = decoder->private_->residual[channel]; - subframe->order = order; - - /* read warm-up samples */ - for(u = 0; u < order; u++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, bps)) - return false; /* read_callback_ sets the state for us */ - subframe->warmup[u] = i32; - } - - /* read qlp coeff precision */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) - return false; /* read_callback_ sets the state for us */ - if(u32 == (1u << FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN) - 1) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - subframe->qlp_coeff_precision = u32+1; - - /* read qlp shift */ - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->quantization_level = i32; - - /* read quantized lp coefficiencts */ - for(u = 0; u < order; u++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i32, subframe->qlp_coeff_precision)) - return false; /* read_callback_ sets the state for us */ - subframe->qlp_coeff[u] = i32; - } - - /* read entropy coding method info */ - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->entropy_coding_method.type = (FLAC__EntropyCodingMethodType)u32; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &u32, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - return false; /* read_callback_ sets the state for us */ - subframe->entropy_coding_method.data.partitioned_rice.order = u32; - subframe->entropy_coding_method.data.partitioned_rice.contents = &decoder->private_->partitioned_rice_contents[channel]; - break; - default: - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - return true; - } - - /* read residual */ - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!read_residual_partitioned_rice_(decoder, order, subframe->entropy_coding_method.data.partitioned_rice.order, &decoder->private_->partitioned_rice_contents[channel], decoder->private_->residual[channel], /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2)) - return false; - break; - default: - FLAC__ASSERT(0); - } - - /* decode the subframe */ - if(do_full_decode) { - memcpy(decoder->private_->output[channel], subframe->warmup, sizeof(FLAC__int32) * order); - /*@@@@@@ technically not pessimistic enough, should be more like - if( (FLAC__uint64)order * ((((FLAC__uint64)1)<qlp_coeff_precision)-1) < (((FLAC__uint64)-1) << 32) ) - */ - if(bps + subframe->qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) - if(bps <= 16 && subframe->qlp_coeff_precision <= 16) - decoder->private_->local_lpc_restore_signal_16bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); - else - decoder->private_->local_lpc_restore_signal(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); - else - decoder->private_->local_lpc_restore_signal_64bit(decoder->private_->residual[channel], decoder->private_->frame.header.blocksize-order, subframe->qlp_coeff, order, subframe->quantization_level, decoder->private_->output[channel]+order); - } - - return true; -} - -FLAC__bool read_subframe_verbatim_(FLAC__StreamDecoder *decoder, unsigned channel, unsigned bps, FLAC__bool do_full_decode) -{ - FLAC__Subframe_Verbatim *subframe = &decoder->private_->frame.subframes[channel].data.verbatim; - FLAC__int32 x, *residual = decoder->private_->residual[channel]; - unsigned i; - - decoder->private_->frame.subframes[channel].type = FLAC__SUBFRAME_TYPE_VERBATIM; - - subframe->data = residual; - - for(i = 0; i < decoder->private_->frame.header.blocksize; i++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &x, bps)) - return false; /* read_callback_ sets the state for us */ - residual[i] = x; - } - - /* decode the subframe */ - if(do_full_decode) - memcpy(decoder->private_->output[channel], subframe->data, sizeof(FLAC__int32) * decoder->private_->frame.header.blocksize); - - return true; -} - -FLAC__bool read_residual_partitioned_rice_(FLAC__StreamDecoder *decoder, unsigned predictor_order, unsigned partition_order, FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, FLAC__int32 *residual, FLAC__bool is_extended) -{ - FLAC__uint32 rice_parameter; - int i; - unsigned partition, sample, u; - const unsigned partitions = 1u << partition_order; - const unsigned partition_samples = partition_order > 0? decoder->private_->frame.header.blocksize >> partition_order : decoder->private_->frame.header.blocksize - predictor_order; - const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; - const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; - - /* sanity checks */ - if(partition_order == 0) { - if(decoder->private_->frame.header.blocksize < predictor_order) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - /* We have received a potentially malicious bit stream. All we can do is error out to avoid a heap overflow. */ - return false; - } - } - else { - if(partition_samples < predictor_order) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - /* We have received a potentially malicious bit stream. All we can do is error out to avoid a heap overflow. */ - return false; - } - } - - if(!FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order))) { - decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - sample = 0; - for(partition = 0; partition < partitions; partition++) { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, plen)) - return false; /* read_callback_ sets the state for us */ - partitioned_rice_contents->parameters[partition] = rice_parameter; - if(rice_parameter < pesc) { - partitioned_rice_contents->raw_bits[partition] = 0; - u = (partition_order == 0 || partition > 0)? partition_samples : partition_samples - predictor_order; - if(!FLAC__bitreader_read_rice_signed_block(decoder->private_->input, residual + sample, u, rice_parameter)) - return false; /* read_callback_ sets the state for us */ - sample += u; - } - else { - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &rice_parameter, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) - return false; /* read_callback_ sets the state for us */ - partitioned_rice_contents->raw_bits[partition] = rice_parameter; - for(u = (partition_order == 0 || partition > 0)? 0 : predictor_order; u < partition_samples; u++, sample++) { - if(!FLAC__bitreader_read_raw_int32(decoder->private_->input, &i, rice_parameter)) - return false; /* read_callback_ sets the state for us */ - residual[sample] = i; - } - } - } - - return true; -} - -FLAC__bool read_zero_padding_(FLAC__StreamDecoder *decoder) -{ - if(!FLAC__bitreader_is_consumed_byte_aligned(decoder->private_->input)) { - FLAC__uint32 zero = 0; - if(!FLAC__bitreader_read_raw_uint32(decoder->private_->input, &zero, FLAC__bitreader_bits_left_for_byte_alignment(decoder->private_->input))) - return false; /* read_callback_ sets the state for us */ - if(zero != 0) { - send_error_to_client_(decoder, FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC); - decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC; - } - } - return true; -} - -FLAC__bool read_callback_(FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder *)client_data; - - if( -#if FLAC__HAS_OGG - /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ - !decoder->private_->is_ogg && -#endif - decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) - ) { - *bytes = 0; - decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; - return false; - } - else if(*bytes > 0) { - /* While seeking, it is possible for our seek to land in the - * middle of audio data that looks exactly like a frame header - * from a future version of an encoder. When that happens, our - * error callback will get an - * FLAC__STREAM_DECODER_UNPARSEABLE_STREAM and increment its - * unparseable_frame_count. But there is a remote possibility - * that it is properly synced at such a "future-codec frame", - * so to make sure, we wait to see many "unparseable" errors in - * a row before bailing out. - */ - if(decoder->private_->is_seeking && decoder->private_->unparseable_frame_count > 20) { - decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; - return false; - } - else { - const FLAC__StreamDecoderReadStatus status = -#if FLAC__HAS_OGG - decoder->private_->is_ogg? - read_callback_ogg_aspect_(decoder, buffer, bytes) : -#endif - decoder->private_->read_callback(decoder, buffer, bytes, decoder->private_->client_data) - ; - if(status == FLAC__STREAM_DECODER_READ_STATUS_ABORT) { - decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; - return false; - } - else if(*bytes == 0) { - if( - status == FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM || - ( -#if FLAC__HAS_OGG - /* see [1] HACK NOTE below for why we don't call the eof_callback when decoding Ogg FLAC */ - !decoder->private_->is_ogg && -#endif - decoder->private_->eof_callback && decoder->private_->eof_callback(decoder, decoder->private_->client_data) - ) - ) { - decoder->protected_->state = FLAC__STREAM_DECODER_END_OF_STREAM; - return false; - } - else - return true; - } - else - return true; - } - } - else { - /* abort to avoid a deadlock */ - decoder->protected_->state = FLAC__STREAM_DECODER_ABORTED; - return false; - } - /* [1] @@@ HACK NOTE: The end-of-stream checking has to be hacked around - * for Ogg FLAC. This is because the ogg decoder aspect can lose sync - * and at the same time hit the end of the stream (for example, seeking - * to a point that is after the beginning of the last Ogg page). There - * is no way to report an Ogg sync loss through the callbacks (see note - * in read_callback_ogg_aspect_()) so it returns CONTINUE with *bytes==0. - * So to keep the decoder from stopping at this point we gate the call - * to the eof_callback and let the Ogg decoder aspect set the - * end-of-stream state when it is needed. - */ -} - -#if FLAC__HAS_OGG -FLAC__StreamDecoderReadStatus read_callback_ogg_aspect_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes) -{ - switch(FLAC__ogg_decoder_aspect_read_callback_wrapper(&decoder->protected_->ogg_decoder_aspect, buffer, bytes, read_callback_proxy_, decoder, decoder->private_->client_data)) { - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK: - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - /* we don't really have a way to handle lost sync via read - * callback so we'll let it pass and let the underlying - * FLAC decoder catch the error - */ - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_LOST_SYNC: - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM: - return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_NOT_FLAC: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_UNSUPPORTED_MAPPING_VERSION: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_ERROR: - case FLAC__OGG_DECODER_ASPECT_READ_STATUS_MEMORY_ALLOCATION_ERROR: - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - default: - FLAC__ASSERT(0); - /* double protection */ - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - } -} - -FLAC__OggDecoderAspectReadStatus read_callback_proxy_(const void *void_decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__StreamDecoder *decoder = (FLAC__StreamDecoder*)void_decoder; - - switch(decoder->private_->read_callback(decoder, buffer, bytes, client_data)) { - case FLAC__STREAM_DECODER_READ_STATUS_CONTINUE: - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_OK; - case FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM: - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_END_OF_STREAM; - case FLAC__STREAM_DECODER_READ_STATUS_ABORT: - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; - default: - /* double protection: */ - FLAC__ASSERT(0); - return FLAC__OGG_DECODER_ASPECT_READ_STATUS_ABORT; - } -} -#endif - -FLAC__StreamDecoderWriteStatus write_audio_frame_to_client_(FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[]) -{ - if(decoder->private_->is_seeking) { - FLAC__uint64 this_frame_sample = frame->header.number.sample_number; - FLAC__uint64 next_frame_sample = this_frame_sample + (FLAC__uint64)frame->header.blocksize; - FLAC__uint64 target_sample = decoder->private_->target_sample; - - FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - -#if FLAC__HAS_OGG - decoder->private_->got_a_frame = true; -#endif - decoder->private_->last_frame = *frame; /* save the frame */ - if(this_frame_sample <= target_sample && target_sample < next_frame_sample) { /* we hit our target frame */ - unsigned delta = (unsigned)(target_sample - this_frame_sample); - /* kick out of seek mode */ - decoder->private_->is_seeking = false; - /* shift out the samples before target_sample */ - if(delta > 0) { - unsigned channel; - const FLAC__int32 *newbuffer[FLAC__MAX_CHANNELS]; - for(channel = 0; channel < frame->header.channels; channel++) - newbuffer[channel] = buffer[channel] + delta; - decoder->private_->last_frame.header.blocksize -= delta; - decoder->private_->last_frame.header.number.sample_number += (FLAC__uint64)delta; - /* write the relevant samples */ - return decoder->private_->write_callback(decoder, &decoder->private_->last_frame, newbuffer, decoder->private_->client_data); - } - else { - /* write the relevant samples */ - return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); - } - } - else { - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; - } - } - else { - /* - * If we never got STREAMINFO, turn off MD5 checking to save - * cycles since we don't have a sum to compare to anyway - */ - if(!decoder->private_->has_stream_info) - decoder->private_->do_md5_checking = false; - if(decoder->private_->do_md5_checking) { - if(!FLAC__MD5Accumulate(&decoder->private_->md5context, buffer, frame->header.channels, frame->header.blocksize, (frame->header.bits_per_sample+7) / 8)) - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; - } - return decoder->private_->write_callback(decoder, frame, buffer, decoder->private_->client_data); - } -} - -void send_error_to_client_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status) -{ - if(!decoder->private_->is_seeking) - decoder->private_->error_callback(decoder, status, decoder->private_->client_data); - else if(status == FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM) - decoder->private_->unparseable_frame_count++; -} - -FLAC__bool seek_to_absolute_sample_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) -{ - FLAC__uint64 first_frame_offset = decoder->private_->first_frame_offset, lower_bound, upper_bound, lower_bound_sample, upper_bound_sample, this_frame_sample; - FLAC__int64 pos = -1; - int i; - unsigned approx_bytes_per_frame; - FLAC__bool first_seek = true; - const FLAC__uint64 total_samples = FLAC__stream_decoder_get_total_samples(decoder); - const unsigned min_blocksize = decoder->private_->stream_info.data.stream_info.min_blocksize; - const unsigned max_blocksize = decoder->private_->stream_info.data.stream_info.max_blocksize; - const unsigned max_framesize = decoder->private_->stream_info.data.stream_info.max_framesize; - const unsigned min_framesize = decoder->private_->stream_info.data.stream_info.min_framesize; - /* take these from the current frame in case they've changed mid-stream */ - unsigned channels = FLAC__stream_decoder_get_channels(decoder); - unsigned bps = FLAC__stream_decoder_get_bits_per_sample(decoder); - const FLAC__StreamMetadata_SeekTable *seek_table = decoder->private_->has_seek_table? &decoder->private_->seek_table.data.seek_table : 0; - - /* use values from stream info if we didn't decode a frame */ - if(channels == 0) - channels = decoder->private_->stream_info.data.stream_info.channels; - if(bps == 0) - bps = decoder->private_->stream_info.data.stream_info.bits_per_sample; - - /* we are just guessing here */ - if(max_framesize > 0) - approx_bytes_per_frame = (max_framesize + min_framesize) / 2 + 1; - /* - * Check if it's a known fixed-blocksize stream. Note that though - * the spec doesn't allow zeroes in the STREAMINFO block, we may - * never get a STREAMINFO block when decoding so the value of - * min_blocksize might be zero. - */ - else if(min_blocksize == max_blocksize && min_blocksize > 0) { - /* note there are no () around 'bps/8' to keep precision up since it's an integer calulation */ - approx_bytes_per_frame = min_blocksize * channels * bps/8 + 64; - } - else - approx_bytes_per_frame = 4096 * channels * bps/8 + 64; - - /* - * First, we set an upper and lower bound on where in the - * stream we will search. For now we assume the worst case - * scenario, which is our best guess at the beginning of - * the first frame and end of the stream. - */ - lower_bound = first_frame_offset; - lower_bound_sample = 0; - upper_bound = stream_length; - upper_bound_sample = total_samples > 0 ? total_samples : target_sample /*estimate it*/; - - /* - * Now we refine the bounds if we have a seektable with - * suitable points. Note that according to the spec they - * must be ordered by ascending sample number. - * - * Note: to protect against invalid seek tables we will ignore points - * that have frame_samples==0 or sample_number>=total_samples - */ - if(seek_table) { - FLAC__uint64 new_lower_bound = lower_bound; - FLAC__uint64 new_upper_bound = upper_bound; - FLAC__uint64 new_lower_bound_sample = lower_bound_sample; - FLAC__uint64 new_upper_bound_sample = upper_bound_sample; - - /* find the closest seek point <= target_sample, if it exists */ - for(i = (int)seek_table->num_points - 1; i >= 0; i--) { - if( - seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && - seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ - (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ - seek_table->points[i].sample_number <= target_sample - ) - break; - } - if(i >= 0) { /* i.e. we found a suitable seek point... */ - new_lower_bound = first_frame_offset + seek_table->points[i].stream_offset; - new_lower_bound_sample = seek_table->points[i].sample_number; - } - - /* find the closest seek point > target_sample, if it exists */ - for(i = 0; i < (int)seek_table->num_points; i++) { - if( - seek_table->points[i].sample_number != FLAC__STREAM_METADATA_SEEKPOINT_PLACEHOLDER && - seek_table->points[i].frame_samples > 0 && /* defense against bad seekpoints */ - (total_samples <= 0 || seek_table->points[i].sample_number < total_samples) && /* defense against bad seekpoints */ - seek_table->points[i].sample_number > target_sample - ) - break; - } - if(i < (int)seek_table->num_points) { /* i.e. we found a suitable seek point... */ - new_upper_bound = first_frame_offset + seek_table->points[i].stream_offset; - new_upper_bound_sample = seek_table->points[i].sample_number; - } - /* final protection against unsorted seek tables; keep original values if bogus */ - if(new_upper_bound >= new_lower_bound) { - lower_bound = new_lower_bound; - upper_bound = new_upper_bound; - lower_bound_sample = new_lower_bound_sample; - upper_bound_sample = new_upper_bound_sample; - } - } - - FLAC__ASSERT(upper_bound_sample >= lower_bound_sample); - /* there are 2 insidious ways that the following equality occurs, which - * we need to fix: - * 1) total_samples is 0 (unknown) and target_sample is 0 - * 2) total_samples is 0 (unknown) and target_sample happens to be - * exactly equal to the last seek point in the seek table; this - * means there is no seek point above it, and upper_bound_samples - * remains equal to the estimate (of target_samples) we made above - * in either case it does not hurt to move upper_bound_sample up by 1 - */ - if(upper_bound_sample == lower_bound_sample) - upper_bound_sample++; - - decoder->private_->target_sample = target_sample; - while(1) { - /* check if the bounds are still ok */ - if (lower_bound_sample >= upper_bound_sample || lower_bound > upper_bound) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - pos = (FLAC__int64)lower_bound + (FLAC__int64)((FLAC__double)(target_sample - lower_bound_sample) / (FLAC__double)(upper_bound_sample - lower_bound_sample) * (FLAC__double)(upper_bound - lower_bound)) - approx_bytes_per_frame; -#else - /* a little less accurate: */ - if(upper_bound - lower_bound < 0xffffffff) - pos = (FLAC__int64)lower_bound + (FLAC__int64)(((target_sample - lower_bound_sample) * (upper_bound - lower_bound)) / (upper_bound_sample - lower_bound_sample)) - approx_bytes_per_frame; - else /* @@@ WATCHOUT, ~2TB limit */ - pos = (FLAC__int64)lower_bound + (FLAC__int64)((((target_sample - lower_bound_sample)>>8) * ((upper_bound - lower_bound)>>8)) / ((upper_bound_sample - lower_bound_sample)>>16)) - approx_bytes_per_frame; -#endif - if(pos >= (FLAC__int64)upper_bound) - pos = (FLAC__int64)upper_bound - 1; - if(pos < (FLAC__int64)lower_bound) - pos = (FLAC__int64)lower_bound; - if(decoder->private_->seek_callback(decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - if(!FLAC__stream_decoder_flush(decoder)) { - /* above call sets the state for us */ - return false; - } - /* Now we need to get a frame. First we need to reset our - * unparseable_frame_count; if we get too many unparseable - * frames in a row, the read callback will return - * FLAC__STREAM_DECODER_READ_STATUS_ABORT, causing - * FLAC__stream_decoder_process_single() to return false. - */ - decoder->private_->unparseable_frame_count = 0; - if(!FLAC__stream_decoder_process_single(decoder)) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - /* our write callback will change the state when it gets to the target frame */ - /* actually, we could have got_a_frame if our decoder is at FLAC__STREAM_DECODER_END_OF_STREAM so we need to check for that also */ -#if 0 - /*@@@@@@ used to be the following; not clear if the check for end of stream is needed anymore */ - if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_SEEKING && decoder->protected_->state != FLAC__STREAM_DECODER_END_OF_STREAM) - break; -#endif - if(!decoder->private_->is_seeking) - break; - - FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - this_frame_sample = decoder->private_->last_frame.header.number.sample_number; - - if (0 == decoder->private_->samples_decoded || (this_frame_sample + decoder->private_->last_frame.header.blocksize >= upper_bound_sample && !first_seek)) { - if (pos == (FLAC__int64)lower_bound) { - /* can't move back any more than the first frame, something is fatally wrong */ - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - /* our last move backwards wasn't big enough, try again */ - approx_bytes_per_frame = approx_bytes_per_frame? approx_bytes_per_frame * 2 : 16; - continue; - } - /* allow one seek over upper bound, so we can get a correct upper_bound_sample for streams with unknown total_samples */ - first_seek = false; - - /* make sure we are not seeking in corrupted stream */ - if (this_frame_sample < lower_bound_sample) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - - /* we need to narrow the search */ - if(target_sample < this_frame_sample) { - upper_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; -/*@@@@@@ what will decode position be if at end of stream? */ - if(!FLAC__stream_decoder_get_decode_position(decoder, &upper_bound)) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - approx_bytes_per_frame = (unsigned)(2 * (upper_bound - pos) / 3 + 16); - } - else { /* target_sample >= this_frame_sample + this frame's blocksize */ - lower_bound_sample = this_frame_sample + decoder->private_->last_frame.header.blocksize; - if(!FLAC__stream_decoder_get_decode_position(decoder, &lower_bound)) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - approx_bytes_per_frame = (unsigned)(2 * (lower_bound - pos) / 3 + 16); - } - } - - return true; -} - -#if FLAC__HAS_OGG -FLAC__bool seek_to_absolute_sample_ogg_(FLAC__StreamDecoder *decoder, FLAC__uint64 stream_length, FLAC__uint64 target_sample) -{ - FLAC__uint64 left_pos = 0, right_pos = stream_length; - FLAC__uint64 left_sample = 0, right_sample = FLAC__stream_decoder_get_total_samples(decoder); - FLAC__uint64 this_frame_sample = (FLAC__uint64)0 - 1; - FLAC__uint64 pos = 0; /* only initialized to avoid compiler warning */ - FLAC__bool did_a_seek; - unsigned iteration = 0; - - /* In the first iterations, we will calculate the target byte position - * by the distance from the target sample to left_sample and - * right_sample (let's call it "proportional search"). After that, we - * will switch to binary search. - */ - unsigned BINARY_SEARCH_AFTER_ITERATION = 2; - - /* We will switch to a linear search once our current sample is less - * than this number of samples ahead of the target sample - */ - static const FLAC__uint64 LINEAR_SEARCH_WITHIN_SAMPLES = FLAC__MAX_BLOCK_SIZE * 2; - - /* If the total number of samples is unknown, use a large value, and - * force binary search immediately. - */ - if(right_sample == 0) { - right_sample = (FLAC__uint64)(-1); - BINARY_SEARCH_AFTER_ITERATION = 0; - } - - decoder->private_->target_sample = target_sample; - for( ; ; iteration++) { - if (iteration == 0 || this_frame_sample > target_sample || target_sample - this_frame_sample > LINEAR_SEARCH_WITHIN_SAMPLES) { - if (iteration >= BINARY_SEARCH_AFTER_ITERATION) { - pos = (right_pos + left_pos) / 2; - } - else { -#ifndef FLAC__INTEGER_ONLY_LIBRARY - pos = (FLAC__uint64)((FLAC__double)(target_sample - left_sample) / (FLAC__double)(right_sample - left_sample) * (FLAC__double)(right_pos - left_pos)); -#else - /* a little less accurate: */ - if ((target_sample-left_sample <= 0xffffffff) && (right_pos-left_pos <= 0xffffffff)) - pos = (FLAC__int64)(((target_sample-left_sample) * (right_pos-left_pos)) / (right_sample-left_sample)); - else /* @@@ WATCHOUT, ~2TB limit */ - pos = (FLAC__int64)((((target_sample-left_sample)>>8) * ((right_pos-left_pos)>>8)) / ((right_sample-left_sample)>>16)); -#endif - /* @@@ TODO: might want to limit pos to some distance - * before EOF, to make sure we land before the last frame, - * thereby getting a this_frame_sample and so having a better - * estimate. - */ - } - - /* physical seek */ - if(decoder->private_->seek_callback((FLAC__StreamDecoder*)decoder, (FLAC__uint64)pos, decoder->private_->client_data) != FLAC__STREAM_DECODER_SEEK_STATUS_OK) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - if(!FLAC__stream_decoder_flush(decoder)) { - /* above call sets the state for us */ - return false; - } - did_a_seek = true; - } - else - did_a_seek = false; - - decoder->private_->got_a_frame = false; - if(!FLAC__stream_decoder_process_single(decoder)) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - if(!decoder->private_->got_a_frame) { - if(did_a_seek) { - /* this can happen if we seek to a point after the last frame; we drop - * to binary search right away in this case to avoid any wasted - * iterations of proportional search. - */ - right_pos = pos; - BINARY_SEARCH_AFTER_ITERATION = 0; - } - else { - /* this can probably only happen if total_samples is unknown and the - * target_sample is past the end of the stream - */ - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - } - /* our write callback will change the state when it gets to the target frame */ - else if(!decoder->private_->is_seeking) { - break; - } - else { - this_frame_sample = decoder->private_->last_frame.header.number.sample_number; - FLAC__ASSERT(decoder->private_->last_frame.header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - - if (did_a_seek) { - if (this_frame_sample <= target_sample) { - /* The 'equal' case should not happen, since - * FLAC__stream_decoder_process_single() - * should recognize that it has hit the - * target sample and we would exit through - * the 'break' above. - */ - FLAC__ASSERT(this_frame_sample != target_sample); - - left_sample = this_frame_sample; - /* sanity check to avoid infinite loop */ - if (left_pos == pos) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - left_pos = pos; - } - else if(this_frame_sample > target_sample) { - right_sample = this_frame_sample; - /* sanity check to avoid infinite loop */ - if (right_pos == pos) { - decoder->protected_->state = FLAC__STREAM_DECODER_SEEK_ERROR; - return false; - } - right_pos = pos; - } - } - } - } - - return true; -} -#endif - -#if 0 -FLAC__StreamDecoderReadStatus file_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - (void)client_data; - - if(*bytes > 0) { - *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, decoder->private_->file); - if(ferror(decoder->private_->file)) - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - else if(*bytes == 0) - return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - else - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - } - else - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */ -} - -FLAC__StreamDecoderSeekStatus file_seek_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) -{ - (void)client_data; - - if(decoder->private_->file == stdin) - return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; - else if(fseeko(decoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) - return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; - else - return FLAC__STREAM_DECODER_SEEK_STATUS_OK; -} - -FLAC__StreamDecoderTellStatus file_tell_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) -{ - FLAC__off_t pos; - (void)client_data; - - if(decoder->private_->file == stdin) - return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; - else if((pos = ftello(decoder->private_->file)) < 0) - return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; - else { - *absolute_byte_offset = (FLAC__uint64)pos; - return FLAC__STREAM_DECODER_TELL_STATUS_OK; - } -} - -FLAC__StreamDecoderLengthStatus file_length_callback_(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) -{ - struct flac_stat_s filestats; - (void)client_data; - - if(decoder->private_->file == stdin) - return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; - else if(flac_fstat(fileno(decoder->private_->file), &filestats) != 0) - return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; - else { - *stream_length = (FLAC__uint64)filestats.st_size; - return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; - } -} - -FLAC__bool file_eof_callback_(const FLAC__StreamDecoder *decoder, void *client_data) -{ - (void)client_data; - - return feof(decoder->private_->file)? true : false; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c deleted file mode 100755 index f5eb90e..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder.c +++ /dev/null @@ -1,4527 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include -#include /* for malloc() */ -#include /* for memcpy() */ -#include /* for off_t */ -#include "../assert.h" -#include "../stream_decoder.h" -#include "include/protected/stream_encoder.h" -#include "include/private/bitwriter.h" -#include "include/private/bitmath.h" -#include "include/private/crc.h" -#include "include/private/cpu.h" -#include "include/private/fixed.h" -#include "include/private/format.h" -#include "include/private/lpc.h" -#include "include/private/md5.h" -#include "include/private/memory.h" -#if FLAC__HAS_OGG -#include "include/private/ogg_helper.h" -#include "include/private/ogg_mapping.h" -#endif -#include "include/private/stream_encoder.h" -#include "include/private/stream_encoder_framing.h" -#include "include/private/window.h" -#include "../alloc.h" - - -/* Exact Rice codeword length calculation is off by default. The simple - * (and fast) estimation (of how many bits a residual value will be - * encoded with) in this encoder is very good, almost always yielding - * compression within 0.1% of exact calculation. - */ -#undef EXACT_RICE_BITS_CALCULATION -/* Rice parameter searching is off by default. The simple (and fast) - * parameter estimation in this encoder is very good, almost always - * yielding compression within 0.1% of the optimal parameters. - */ -#undef ENABLE_RICE_PARAMETER_SEARCH - - -typedef struct { - FLAC__int32 *data[FLAC__MAX_CHANNELS]; - unsigned size; /* of each data[] in samples */ - unsigned tail; -} verify_input_fifo; - -typedef struct { - const FLAC__byte *data; - unsigned capacity; - unsigned bytes; -} verify_output; - -typedef enum { - ENCODER_IN_MAGIC = 0, - ENCODER_IN_METADATA = 1, - ENCODER_IN_AUDIO = 2 -} EncoderStateHint; - -static struct CompressionLevels { - FLAC__bool do_mid_side_stereo; - FLAC__bool loose_mid_side_stereo; - unsigned max_lpc_order; - unsigned qlp_coeff_precision; - FLAC__bool do_qlp_coeff_prec_search; - FLAC__bool do_escape_coding; - FLAC__bool do_exhaustive_model_search; - unsigned min_residual_partition_order; - unsigned max_residual_partition_order; - unsigned rice_parameter_search_dist; - const char *apodization; -} compression_levels_[] = { - { false, false, 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, - { true , true , 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, - { true , false, 0, 0, false, false, false, 0, 3, 0, "tukey(5e-1)" }, - { false, false, 6, 0, false, false, false, 0, 4, 0, "tukey(5e-1)" }, - { true , true , 8, 0, false, false, false, 0, 4, 0, "tukey(5e-1)" }, - { true , false, 8, 0, false, false, false, 0, 5, 0, "tukey(5e-1)" }, - { true , false, 8, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2)" }, - { true , false, 12, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2)" }, - { true , false, 12, 0, false, false, false, 0, 6, 0, "tukey(5e-1);partial_tukey(2);punchout_tukey(3)" } - /* here we use locale-independent 5e-1 instead of 0.5 or 0,5 */ -}; - - -/*********************************************************************** - * - * Private class method prototypes - * - ***********************************************************************/ - -static void set_defaults_(FLAC__StreamEncoder *encoder); -static void free_(FLAC__StreamEncoder *encoder); -static FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize); -static FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block); -static FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block); -static void update_metadata_(const FLAC__StreamEncoder *encoder); -#if FLAC__HAS_OGG -static void update_ogg_metadata_(FLAC__StreamEncoder *encoder); -#endif -static FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block); -static FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block); - -static FLAC__bool process_subframe_( - FLAC__StreamEncoder *encoder, - unsigned min_partition_order, - unsigned max_partition_order, - const FLAC__FrameHeader *frame_header, - unsigned subframe_bps, - const FLAC__int32 integer_signal[], - FLAC__Subframe *subframe[2], - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2], - FLAC__int32 *residual[2], - unsigned *best_subframe, - unsigned *best_bits -); - -static FLAC__bool add_subframe_( - FLAC__StreamEncoder *encoder, - unsigned blocksize, - unsigned subframe_bps, - const FLAC__Subframe *subframe, - FLAC__BitWriter *frame -); - -static unsigned evaluate_constant_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal, - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -); - -static unsigned evaluate_fixed_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -); - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -static unsigned evaluate_lpc_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - const FLAC__real lp_coeff[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned qlp_coeff_precision, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -); -#endif - -static unsigned evaluate_verbatim_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -); - -static unsigned find_best_partition_order_( - struct FLAC__StreamEncoderPrivate *private_, - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__EntropyCodingMethod *best_ecm -); - -static void precompute_partition_info_sums_( - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps -); - -static void precompute_partition_info_escapes_( - const FLAC__int32 residual[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order -); - -static FLAC__bool set_partitioned_rice_( -#ifdef EXACT_RICE_BITS_CALCULATION - const FLAC__int32 residual[], -#endif - const FLAC__uint64 abs_residual_partition_sums[], - const unsigned raw_bits_per_partition[], - const unsigned residual_samples, - const unsigned predictor_order, - const unsigned suggested_rice_parameter, - const unsigned rice_parameter_limit, - const unsigned rice_parameter_search_dist, - const unsigned partition_order, - const FLAC__bool search_for_escapes, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, - unsigned *bits -); - -static unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples); - -/* verify-related routines: */ -static void append_to_verify_fifo_( - verify_input_fifo *fifo, - const FLAC__int32 * const input[], - unsigned input_offset, - unsigned channels, - unsigned wide_samples -); - -static void append_to_verify_fifo_interleaved_( - verify_input_fifo *fifo, - const FLAC__int32 input[], - unsigned input_offset, - unsigned channels, - unsigned wide_samples -); - -static FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -static FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); -static void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); -static void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); - -//static FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); -//static FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); -//static FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); -//static FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); -//static FILE *get_binary_stdout_(void); - - -/*********************************************************************** - * - * Private class data - * - ***********************************************************************/ - -typedef struct FLAC__StreamEncoderPrivate { - unsigned input_capacity; /* current size (in samples) of the signal and residual buffers */ - FLAC__int32 *integer_signal[FLAC__MAX_CHANNELS]; /* the integer version of the input signal */ - FLAC__int32 *integer_signal_mid_side[2]; /* the integer version of the mid-side input signal (stereo only) */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__real *real_signal[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) the floating-point version of the input signal */ - FLAC__real *real_signal_mid_side[2]; /* (@@@ currently unused) the floating-point version of the mid-side input signal (stereo only) */ - FLAC__real *window[FLAC__MAX_APODIZATION_FUNCTIONS]; /* the pre-computed floating-point window for each apodization function */ - FLAC__real *windowed_signal; /* the integer_signal[] * current window[] */ -#endif - unsigned subframe_bps[FLAC__MAX_CHANNELS]; /* the effective bits per sample of the input signal (stream bps - wasted bits) */ - unsigned subframe_bps_mid_side[2]; /* the effective bits per sample of the mid-side input signal (stream bps - wasted bits + 0/1) */ - FLAC__int32 *residual_workspace[FLAC__MAX_CHANNELS][2]; /* each channel has a candidate and best workspace where the subframe residual signals will be stored */ - FLAC__int32 *residual_workspace_mid_side[2][2]; - FLAC__Subframe subframe_workspace[FLAC__MAX_CHANNELS][2]; - FLAC__Subframe subframe_workspace_mid_side[2][2]; - FLAC__Subframe *subframe_workspace_ptr[FLAC__MAX_CHANNELS][2]; - FLAC__Subframe *subframe_workspace_ptr_mid_side[2][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace[FLAC__MAX_CHANNELS][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_workspace_mid_side[FLAC__MAX_CHANNELS][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr[FLAC__MAX_CHANNELS][2]; - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents_workspace_ptr_mid_side[FLAC__MAX_CHANNELS][2]; - unsigned best_subframe[FLAC__MAX_CHANNELS]; /* index (0 or 1) into 2nd dimension of the above workspaces */ - unsigned best_subframe_mid_side[2]; - unsigned best_subframe_bits[FLAC__MAX_CHANNELS]; /* size in bits of the best subframe for each channel */ - unsigned best_subframe_bits_mid_side[2]; - FLAC__uint64 *abs_residual_partition_sums; /* workspace where the sum of abs(candidate residual) for each partition is stored */ - unsigned *raw_bits_per_partition; /* workspace where the sum of silog2(candidate residual) for each partition is stored */ - FLAC__BitWriter *frame; /* the current frame being worked on */ - unsigned loose_mid_side_stereo_frames; /* rounded number of frames the encoder will use before trying both independent and mid/side frames again */ - unsigned loose_mid_side_stereo_frame_count; /* number of frames using the current channel assignment */ - FLAC__ChannelAssignment last_channel_assignment; - FLAC__StreamMetadata streaminfo; /* scratchpad for STREAMINFO as it is built */ - FLAC__StreamMetadata_SeekTable *seek_table; /* pointer into encoder->protected_->metadata_ where the seek table is */ - unsigned current_sample_number; - unsigned current_frame_number; - FLAC__MD5Context md5context; - FLAC__CPUInfo cpuinfo; - void (*local_precompute_partition_info_sums)(const FLAC__int32 residual[], FLAC__uint64 abs_residual_partition_sums[], unsigned residual_samples, unsigned predictor_order, unsigned min_partition_order, unsigned max_partition_order, unsigned bps); -#ifndef FLAC__INTEGER_ONLY_LIBRARY - unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); - unsigned (*local_fixed_compute_best_predictor_wide)(const FLAC__int32 data[], unsigned data_len, FLAC__float residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -#else - unsigned (*local_fixed_compute_best_predictor)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); - unsigned (*local_fixed_compute_best_predictor_wide)(const FLAC__int32 data[], unsigned data_len, FLAC__fixedpoint residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]); -#endif -#ifndef FLAC__INTEGER_ONLY_LIBRARY - void (*local_lpc_compute_autocorrelation)(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[]); - void (*local_lpc_compute_residual_from_qlp_coefficients)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); - void (*local_lpc_compute_residual_from_qlp_coefficients_64bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); - void (*local_lpc_compute_residual_from_qlp_coefficients_16bit)(const FLAC__int32 *data, unsigned data_len, const FLAC__int32 qlp_coeff[], unsigned order, int lp_quantization, FLAC__int32 residual[]); -#endif - FLAC__bool use_wide_by_block; /* use slow 64-bit versions of some functions because of the block size */ - FLAC__bool use_wide_by_partition; /* use slow 64-bit versions of some functions because of the min partition order and blocksize */ - FLAC__bool use_wide_by_order; /* use slow 64-bit versions of some functions because of the lpc order */ - FLAC__bool disable_constant_subframes; - FLAC__bool disable_fixed_subframes; - FLAC__bool disable_verbatim_subframes; -#if FLAC__HAS_OGG - FLAC__bool is_ogg; -#endif - FLAC__StreamEncoderReadCallback read_callback; /* currently only needed for Ogg FLAC */ - FLAC__StreamEncoderSeekCallback seek_callback; - FLAC__StreamEncoderTellCallback tell_callback; - FLAC__StreamEncoderWriteCallback write_callback; - FLAC__StreamEncoderMetadataCallback metadata_callback; - FLAC__StreamEncoderProgressCallback progress_callback; - void *client_data; - unsigned first_seekpoint_to_check; - FILE *file; /* only used when encoding to a file */ - FLAC__uint64 bytes_written; - FLAC__uint64 samples_written; - unsigned frames_written; - unsigned total_frames_estimate; - /* unaligned (original) pointers to allocated data */ - FLAC__int32 *integer_signal_unaligned[FLAC__MAX_CHANNELS]; - FLAC__int32 *integer_signal_mid_side_unaligned[2]; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__real *real_signal_unaligned[FLAC__MAX_CHANNELS]; /* (@@@ currently unused) */ - FLAC__real *real_signal_mid_side_unaligned[2]; /* (@@@ currently unused) */ - FLAC__real *window_unaligned[FLAC__MAX_APODIZATION_FUNCTIONS]; - FLAC__real *windowed_signal_unaligned; -#endif - FLAC__int32 *residual_workspace_unaligned[FLAC__MAX_CHANNELS][2]; - FLAC__int32 *residual_workspace_mid_side_unaligned[2][2]; - FLAC__uint64 *abs_residual_partition_sums_unaligned; - unsigned *raw_bits_per_partition_unaligned; - /* - * These fields have been moved here from private function local - * declarations merely to save stack space during encoding. - */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__real lp_coeff[FLAC__MAX_LPC_ORDER][FLAC__MAX_LPC_ORDER]; /* from process_subframe_() */ -#endif - FLAC__EntropyCodingMethod_PartitionedRiceContents partitioned_rice_contents_extra[2]; /* from find_best_partition_order_() */ - /* - * The data for the verify section - */ - struct { - FLAC__StreamDecoder *decoder; - EncoderStateHint state_hint; - FLAC__bool needs_magic_hack; - verify_input_fifo input_fifo; - verify_output output; - struct { - FLAC__uint64 absolute_sample; - unsigned frame_number; - unsigned channel; - unsigned sample; - FLAC__int32 expected; - FLAC__int32 got; - } error_stats; - } verify; - FLAC__bool is_being_deleted; /* if true, call to ..._finish() from ..._delete() will not call the callbacks */ -} FLAC__StreamEncoderPrivate; - -/*********************************************************************** - * - * Public static class data - * - ***********************************************************************/ - -FLAC_API const char * const FLAC__StreamEncoderStateString[] = { - "FLAC__STREAM_ENCODER_OK", - "FLAC__STREAM_ENCODER_UNINITIALIZED", - "FLAC__STREAM_ENCODER_OGG_ERROR", - "FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR", - "FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA", - "FLAC__STREAM_ENCODER_CLIENT_ERROR", - "FLAC__STREAM_ENCODER_IO_ERROR", - "FLAC__STREAM_ENCODER_FRAMING_ERROR", - "FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR" -}; - -FLAC_API const char * const FLAC__StreamEncoderInitStatusString[] = { - "FLAC__STREAM_ENCODER_INIT_STATUS_OK", - "FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR", - "FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION", - "FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER", - "FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE", - "FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA", - "FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED" -}; - -FLAC_API const char * const FLAC__StreamEncoderReadStatusString[] = { - "FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE", - "FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM", - "FLAC__STREAM_ENCODER_READ_STATUS_ABORT", - "FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[] = { - "FLAC__STREAM_ENCODER_WRITE_STATUS_OK", - "FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR" -}; - -FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[] = { - "FLAC__STREAM_ENCODER_SEEK_STATUS_OK", - "FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR", - "FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED" -}; - -FLAC_API const char * const FLAC__StreamEncoderTellStatusString[] = { - "FLAC__STREAM_ENCODER_TELL_STATUS_OK", - "FLAC__STREAM_ENCODER_TELL_STATUS_ERROR", - "FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED" -}; - -/* Number of samples that will be overread to watch for end of stream. By - * 'overread', we mean that the FLAC__stream_encoder_process*() calls will - * always try to read blocksize+1 samples before encoding a block, so that - * even if the stream has a total sample count that is an integral multiple - * of the blocksize, we will still notice when we are encoding the last - * block. This is needed, for example, to correctly set the end-of-stream - * marker in Ogg FLAC. - * - * WATCHOUT: some parts of the code assert that OVERREAD_ == 1 and there's - * not really any reason to change it. - */ -static const unsigned OVERREAD_ = 1; - -/*********************************************************************** - * - * Class constructor/destructor - * - */ -FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void) -{ - FLAC__StreamEncoder *encoder; - unsigned i; - - FLAC__ASSERT(sizeof(int) >= 4); /* we want to die right away if this is not true */ - - encoder = (FLAC__StreamEncoder*) calloc(1, sizeof(FLAC__StreamEncoder)); - if(encoder == 0) { - return 0; - } - - encoder->protected_ = (FLAC__StreamEncoderProtected*) calloc(1, sizeof(FLAC__StreamEncoderProtected)); - if(encoder->protected_ == 0) { - free(encoder); - return 0; - } - - encoder->private_ = (FLAC__StreamEncoderPrivate*) calloc(1, sizeof(FLAC__StreamEncoderPrivate)); - if(encoder->private_ == 0) { - free(encoder->protected_); - free(encoder); - return 0; - } - - encoder->private_->frame = FLAC__bitwriter_new(); - if(encoder->private_->frame == 0) { - free(encoder->private_); - free(encoder->protected_); - free(encoder); - return 0; - } - - encoder->private_->file = 0; - - set_defaults_(encoder); - - encoder->private_->is_being_deleted = false; - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - encoder->private_->subframe_workspace_ptr[i][0] = &encoder->private_->subframe_workspace[i][0]; - encoder->private_->subframe_workspace_ptr[i][1] = &encoder->private_->subframe_workspace[i][1]; - } - for(i = 0; i < 2; i++) { - encoder->private_->subframe_workspace_ptr_mid_side[i][0] = &encoder->private_->subframe_workspace_mid_side[i][0]; - encoder->private_->subframe_workspace_ptr_mid_side[i][1] = &encoder->private_->subframe_workspace_mid_side[i][1]; - } - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - encoder->private_->partitioned_rice_contents_workspace_ptr[i][0] = &encoder->private_->partitioned_rice_contents_workspace[i][0]; - encoder->private_->partitioned_rice_contents_workspace_ptr[i][1] = &encoder->private_->partitioned_rice_contents_workspace[i][1]; - } - for(i = 0; i < 2; i++) { - encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][0] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]; - encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[i][1] = &encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]; - } - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace[i][1]); - } - for(i = 0; i < 2; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]); - } - for(i = 0; i < 2; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_init(&encoder->private_->partitioned_rice_contents_extra[i]); - - encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED; - - return encoder; -} - -FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder) -{ - unsigned i; - - if (encoder == NULL) - return ; - - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->private_->frame); - - encoder->private_->is_being_deleted = true; - - (void)FLAC__stream_encoder_finish(encoder); - - if(0 != encoder->private_->verify.decoder) - FLAC__stream_decoder_delete(encoder->private_->verify.decoder); - - for(i = 0; i < FLAC__MAX_CHANNELS; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace[i][1]); - } - for(i = 0; i < 2; i++) { - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][0]); - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_workspace_mid_side[i][1]); - } - for(i = 0; i < 2; i++) - FLAC__format_entropy_coding_method_partitioned_rice_contents_clear(&encoder->private_->partitioned_rice_contents_extra[i]); - - FLAC__bitwriter_delete(encoder->private_->frame); - free(encoder->private_); - free(encoder->protected_); - free(encoder); -} - -/*********************************************************************** - * - * Public class methods - * - ***********************************************************************/ - -static FLAC__StreamEncoderInitStatus init_stream_internal_( - FLAC__StreamEncoder *encoder, - FLAC__StreamEncoderReadCallback read_callback, - FLAC__StreamEncoderWriteCallback write_callback, - FLAC__StreamEncoderSeekCallback seek_callback, - FLAC__StreamEncoderTellCallback tell_callback, - FLAC__StreamEncoderMetadataCallback metadata_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - unsigned i; - FLAC__bool metadata_has_seektable, metadata_has_vorbis_comment, metadata_picture_has_type1, metadata_picture_has_type2; - - FLAC__ASSERT(0 != encoder); - - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; - -#if !FLAC__HAS_OGG - if(is_ogg) - return FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER; -#endif - - if(0 == write_callback || (seek_callback && 0 == tell_callback)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS; - - if(encoder->protected_->channels == 0 || encoder->protected_->channels > FLAC__MAX_CHANNELS) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS; - - if(encoder->protected_->channels != 2) { - encoder->protected_->do_mid_side_stereo = false; - encoder->protected_->loose_mid_side_stereo = false; - } - else if(!encoder->protected_->do_mid_side_stereo) - encoder->protected_->loose_mid_side_stereo = false; - - if(encoder->protected_->bits_per_sample >= 32) - encoder->protected_->do_mid_side_stereo = false; /* since we currenty do 32-bit math, the side channel would have 33 bps and overflow */ - - if(encoder->protected_->bits_per_sample < FLAC__MIN_BITS_PER_SAMPLE || encoder->protected_->bits_per_sample > FLAC__REFERENCE_CODEC_MAX_BITS_PER_SAMPLE) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE; - - if(!FLAC__format_sample_rate_is_valid(encoder->protected_->sample_rate)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE; - - if(encoder->protected_->blocksize == 0) { - if(encoder->protected_->max_lpc_order == 0) - encoder->protected_->blocksize = 1152; - else - encoder->protected_->blocksize = 4096; - } - - if(encoder->protected_->blocksize < FLAC__MIN_BLOCK_SIZE || encoder->protected_->blocksize > FLAC__MAX_BLOCK_SIZE) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE; - - if(encoder->protected_->max_lpc_order > FLAC__MAX_LPC_ORDER) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER; - - if(encoder->protected_->blocksize < encoder->protected_->max_lpc_order) - return FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER; - - if(encoder->protected_->qlp_coeff_precision == 0) { - if(encoder->protected_->bits_per_sample < 16) { - /* @@@ need some data about how to set this here w.r.t. blocksize and sample rate */ - /* @@@ until then we'll make a guess */ - encoder->protected_->qlp_coeff_precision = flac_max(FLAC__MIN_QLP_COEFF_PRECISION, 2 + encoder->protected_->bits_per_sample / 2); - } - else if(encoder->protected_->bits_per_sample == 16) { - if(encoder->protected_->blocksize <= 192) - encoder->protected_->qlp_coeff_precision = 7; - else if(encoder->protected_->blocksize <= 384) - encoder->protected_->qlp_coeff_precision = 8; - else if(encoder->protected_->blocksize <= 576) - encoder->protected_->qlp_coeff_precision = 9; - else if(encoder->protected_->blocksize <= 1152) - encoder->protected_->qlp_coeff_precision = 10; - else if(encoder->protected_->blocksize <= 2304) - encoder->protected_->qlp_coeff_precision = 11; - else if(encoder->protected_->blocksize <= 4608) - encoder->protected_->qlp_coeff_precision = 12; - else - encoder->protected_->qlp_coeff_precision = 13; - } - else { - if(encoder->protected_->blocksize <= 384) - encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-2; - else if(encoder->protected_->blocksize <= 1152) - encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION-1; - else - encoder->protected_->qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; - } - FLAC__ASSERT(encoder->protected_->qlp_coeff_precision <= FLAC__MAX_QLP_COEFF_PRECISION); - } - else if(encoder->protected_->qlp_coeff_precision < FLAC__MIN_QLP_COEFF_PRECISION || encoder->protected_->qlp_coeff_precision > FLAC__MAX_QLP_COEFF_PRECISION) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION; - - if(encoder->protected_->streamable_subset) { - if(!FLAC__format_blocksize_is_subset(encoder->protected_->blocksize, encoder->protected_->sample_rate)) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if(!FLAC__format_sample_rate_is_subset(encoder->protected_->sample_rate)) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if( - encoder->protected_->bits_per_sample != 8 && - encoder->protected_->bits_per_sample != 12 && - encoder->protected_->bits_per_sample != 16 && - encoder->protected_->bits_per_sample != 20 && - encoder->protected_->bits_per_sample != 24 - ) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if(encoder->protected_->max_residual_partition_order > FLAC__SUBSET_MAX_RICE_PARTITION_ORDER) - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - if( - encoder->protected_->sample_rate <= 48000 && - ( - encoder->protected_->blocksize > FLAC__SUBSET_MAX_BLOCK_SIZE_48000HZ || - encoder->protected_->max_lpc_order > FLAC__SUBSET_MAX_LPC_ORDER_48000HZ - ) - ) { - return FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE; - } - } - - if(encoder->protected_->max_residual_partition_order >= (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - encoder->protected_->max_residual_partition_order = (1u << FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN) - 1; - if(encoder->protected_->min_residual_partition_order >= encoder->protected_->max_residual_partition_order) - encoder->protected_->min_residual_partition_order = encoder->protected_->max_residual_partition_order; - -#if FLAC__HAS_OGG - /* reorder metadata if necessary to ensure that any VORBIS_COMMENT is the first, according to the mapping spec */ - if(is_ogg && 0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 1) { - unsigned i1; - for(i1 = 1; i1 < encoder->protected_->num_metadata_blocks; i1++) { - if(0 != encoder->protected_->metadata[i1] && encoder->protected_->metadata[i1]->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - FLAC__StreamMetadata *vc = encoder->protected_->metadata[i1]; - for( ; i1 > 0; i1--) - encoder->protected_->metadata[i1] = encoder->protected_->metadata[i1-1]; - encoder->protected_->metadata[0] = vc; - break; - } - } - } -#endif - /* keep track of any SEEKTABLE block */ - if(0 != encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) { - unsigned i2; - for(i2 = 0; i2 < encoder->protected_->num_metadata_blocks; i2++) { - if(0 != encoder->protected_->metadata[i2] && encoder->protected_->metadata[i2]->type == FLAC__METADATA_TYPE_SEEKTABLE) { - encoder->private_->seek_table = &encoder->protected_->metadata[i2]->data.seek_table; - break; /* take only the first one */ - } - } - } - - /* validate metadata */ - if(0 == encoder->protected_->metadata && encoder->protected_->num_metadata_blocks > 0) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_has_seektable = false; - metadata_has_vorbis_comment = false; - metadata_picture_has_type1 = false; - metadata_picture_has_type2 = false; - for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { - const FLAC__StreamMetadata *m = encoder->protected_->metadata[i]; - if(m->type == FLAC__METADATA_TYPE_STREAMINFO) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - else if(m->type == FLAC__METADATA_TYPE_SEEKTABLE) { - if(metadata_has_seektable) /* only one is allowed */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_has_seektable = true; - if(!FLAC__format_seektable_is_legal(&m->data.seek_table)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - } - else if(m->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - if(metadata_has_vorbis_comment) /* only one is allowed */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_has_vorbis_comment = true; - } - else if(m->type == FLAC__METADATA_TYPE_CUESHEET) { - if(!FLAC__format_cuesheet_is_legal(&m->data.cue_sheet, m->data.cue_sheet.is_cd, /*violation=*/0)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - } - else if(m->type == FLAC__METADATA_TYPE_PICTURE) { - if(!FLAC__format_picture_is_legal(&m->data.picture, /*violation=*/0)) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD) { - if(metadata_picture_has_type1) /* there should only be 1 per stream */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_picture_has_type1 = true; - /* standard icon must be 32x32 pixel PNG */ - if( - m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON_STANDARD && - ( - (strcmp(m->data.picture.mime_type, "image/png") && strcmp(m->data.picture.mime_type, "-->")) || - m->data.picture.width != 32 || - m->data.picture.height != 32 - ) - ) - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - } - else if(m->data.picture.type == FLAC__STREAM_METADATA_PICTURE_TYPE_FILE_ICON) { - if(metadata_picture_has_type2) /* there should only be 1 per stream */ - return FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA; - metadata_picture_has_type2 = true; - } - } - } - - encoder->private_->input_capacity = 0; - for(i = 0; i < encoder->protected_->channels; i++) { - encoder->private_->integer_signal_unaligned[i] = encoder->private_->integer_signal[i] = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->real_signal_unaligned[i] = encoder->private_->real_signal[i] = 0; -#endif - } - for(i = 0; i < 2; i++) { - encoder->private_->integer_signal_mid_side_unaligned[i] = encoder->private_->integer_signal_mid_side[i] = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->real_signal_mid_side_unaligned[i] = encoder->private_->real_signal_mid_side[i] = 0; -#endif - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - for(i = 0; i < encoder->protected_->num_apodizations; i++) - encoder->private_->window_unaligned[i] = encoder->private_->window[i] = 0; - encoder->private_->windowed_signal_unaligned = encoder->private_->windowed_signal = 0; -#endif - for(i = 0; i < encoder->protected_->channels; i++) { - encoder->private_->residual_workspace_unaligned[i][0] = encoder->private_->residual_workspace[i][0] = 0; - encoder->private_->residual_workspace_unaligned[i][1] = encoder->private_->residual_workspace[i][1] = 0; - encoder->private_->best_subframe[i] = 0; - } - for(i = 0; i < 2; i++) { - encoder->private_->residual_workspace_mid_side_unaligned[i][0] = encoder->private_->residual_workspace_mid_side[i][0] = 0; - encoder->private_->residual_workspace_mid_side_unaligned[i][1] = encoder->private_->residual_workspace_mid_side[i][1] = 0; - encoder->private_->best_subframe_mid_side[i] = 0; - } - encoder->private_->abs_residual_partition_sums_unaligned = encoder->private_->abs_residual_partition_sums = 0; - encoder->private_->raw_bits_per_partition_unaligned = encoder->private_->raw_bits_per_partition = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->loose_mid_side_stereo_frames = (unsigned)((FLAC__double)encoder->protected_->sample_rate * 0.4 / (FLAC__double)encoder->protected_->blocksize + 0.5); -#else - /* 26214 is the approximate fixed-point equivalent to 0.4 (0.4 * 2^16) */ - /* sample rate can be up to 655350 Hz, and thus use 20 bits, so we do the multiply÷ by hand */ - FLAC__ASSERT(FLAC__MAX_SAMPLE_RATE <= 655350); - FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535); - FLAC__ASSERT(encoder->protected_->sample_rate <= 655350); - FLAC__ASSERT(encoder->protected_->blocksize <= 65535); - encoder->private_->loose_mid_side_stereo_frames = (unsigned)FLAC__fixedpoint_trunc((((FLAC__uint64)(encoder->protected_->sample_rate) * (FLAC__uint64)(26214)) << 16) / (encoder->protected_->blocksize<<16) + FLAC__FP_ONE_HALF); -#endif - if(encoder->private_->loose_mid_side_stereo_frames == 0) - encoder->private_->loose_mid_side_stereo_frames = 1; - encoder->private_->loose_mid_side_stereo_frame_count = 0; - encoder->private_->current_sample_number = 0; - encoder->private_->current_frame_number = 0; - - encoder->private_->use_wide_by_block = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(encoder->protected_->blocksize)+1 > 30); - encoder->private_->use_wide_by_order = (encoder->protected_->bits_per_sample + FLAC__bitmath_ilog2(flac_max(encoder->protected_->max_lpc_order, FLAC__MAX_FIXED_ORDER))+1 > 30); /*@@@ need to use this? */ - encoder->private_->use_wide_by_partition = (false); /*@@@ need to set this */ - - /* - * get the CPU info and set the function pointers - */ - FLAC__cpu_info(&encoder->private_->cpuinfo); - /* first default to the non-asm routines */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; -#endif - encoder->private_->local_precompute_partition_info_sums = precompute_partition_info_sums_; - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients; -#endif - /* now override with asm where appropriate */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY -# ifndef FLAC__NO_ASM - if(encoder->private_->cpuinfo.use_asm) { -# ifdef FLAC__CPU_IA32 - FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_IA32); -# ifdef FLAC__HAS_NASM - if(encoder->private_->cpuinfo.ia32.sse) { - if(encoder->protected_->max_lpc_order < 4) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_4; - else if(encoder->protected_->max_lpc_order < 8) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_8; - else if(encoder->protected_->max_lpc_order < 12) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_12; - else if(encoder->protected_->max_lpc_order < 16) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32_sse_lag_16; - else - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; - } - else - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_asm_ia32; - - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_asm_ia32; /* OPT_IA32: was really necessary for GCC < 4.9 */ - if(encoder->private_->cpuinfo.ia32.mmx) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx; - } - else { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32; - } - - if(encoder->private_->cpuinfo.ia32.mmx && encoder->private_->cpuinfo.ia32.cmov) - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_asm_ia32_mmx_cmov; -# endif /* FLAC__HAS_NASM */ -# ifdef FLAC__HAS_X86INTRIN -# if defined FLAC__SSE_SUPPORTED - if(encoder->private_->cpuinfo.ia32.sse) { - if(encoder->protected_->max_lpc_order < 4) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4; - else if(encoder->protected_->max_lpc_order < 8) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8; - else if(encoder->protected_->max_lpc_order < 12) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12; - else if(encoder->protected_->max_lpc_order < 16) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16; - else - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation; - } -# endif - -# ifdef FLAC__SSE2_SUPPORTED - if(encoder->private_->cpuinfo.ia32.sse2) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2; - } -# endif -# ifdef FLAC__SSE4_1_SUPPORTED - if(encoder->private_->cpuinfo.ia32.sse41) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_sse41; - } -# endif -# ifdef FLAC__AVX2_SUPPORTED - if(encoder->private_->cpuinfo.ia32.avx2) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2; - } -# endif - -# ifdef FLAC__SSE2_SUPPORTED - if (encoder->private_->cpuinfo.ia32.sse2) { - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_sse2; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_sse2; - } -# endif -# ifdef FLAC__SSSE3_SUPPORTED - if (encoder->private_->cpuinfo.ia32.ssse3) { - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_ssse3; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_ssse3; - } -# endif -# endif /* FLAC__HAS_X86INTRIN */ -# elif defined FLAC__CPU_X86_64 - FLAC__ASSERT(encoder->private_->cpuinfo.type == FLAC__CPUINFO_TYPE_X86_64); -# ifdef FLAC__HAS_X86INTRIN -# ifdef FLAC__SSE_SUPPORTED - if(encoder->protected_->max_lpc_order < 4) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4; - else if(encoder->protected_->max_lpc_order < 8) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8; - else if(encoder->protected_->max_lpc_order < 12) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12; - else if(encoder->protected_->max_lpc_order < 16) - encoder->private_->local_lpc_compute_autocorrelation = FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16; -# endif - -# ifdef FLAC__SSE2_SUPPORTED - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_sse2; -# endif -# ifdef FLAC__SSE4_1_SUPPORTED - if(encoder->private_->cpuinfo.x86.sse41) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_sse41; - } -# endif -# ifdef FLAC__AVX2_SUPPORTED - if(encoder->private_->cpuinfo.x86.avx2) { - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit = FLAC__lpc_compute_residual_from_qlp_coefficients_16_intrin_avx2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients = FLAC__lpc_compute_residual_from_qlp_coefficients_intrin_avx2; - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit = FLAC__lpc_compute_residual_from_qlp_coefficients_wide_intrin_avx2; - } -# endif - -# ifdef FLAC__SSE2_SUPPORTED - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_sse2; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_sse2; -# endif -# ifdef FLAC__SSSE3_SUPPORTED - if (encoder->private_->cpuinfo.x86.ssse3) { - encoder->private_->local_fixed_compute_best_predictor = FLAC__fixed_compute_best_predictor_intrin_ssse3; - encoder->private_->local_fixed_compute_best_predictor_wide = FLAC__fixed_compute_best_predictor_wide_intrin_ssse3; - } -# endif -# endif /* FLAC__HAS_X86INTRIN */ -# endif /* FLAC__CPU_... */ - } -# endif /* !FLAC__NO_ASM */ -#endif /* !FLAC__INTEGER_ONLY_LIBRARY */ -#if !defined FLAC__NO_ASM && defined FLAC__HAS_X86INTRIN - if(encoder->private_->cpuinfo.use_asm) { -# if defined FLAC__CPU_IA32 -# ifdef FLAC__SSE2_SUPPORTED - if(encoder->private_->cpuinfo.ia32.sse2) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_sse2; -# endif -# ifdef FLAC__SSSE3_SUPPORTED - if(encoder->private_->cpuinfo.ia32.ssse3) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_ssse3; -# endif -# ifdef FLAC__AVX2_SUPPORTED - if(encoder->private_->cpuinfo.ia32.avx2) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_avx2; -# endif -# elif defined FLAC__CPU_X86_64 -# ifdef FLAC__SSE2_SUPPORTED - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_sse2; -# endif -# ifdef FLAC__SSSE3_SUPPORTED - if(encoder->private_->cpuinfo.x86.ssse3) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_ssse3; -# endif -# ifdef FLAC__AVX2_SUPPORTED - if(encoder->private_->cpuinfo.x86.avx2) - encoder->private_->local_precompute_partition_info_sums = FLAC__precompute_partition_info_sums_intrin_avx2; -# endif -# endif /* FLAC__CPU_... */ - } -#endif /* !FLAC__NO_ASM && FLAC__HAS_X86INTRIN */ - /* finally override based on wide-ness if necessary */ - if(encoder->private_->use_wide_by_block) { - encoder->private_->local_fixed_compute_best_predictor = encoder->private_->local_fixed_compute_best_predictor_wide; - } - - /* set state to OK; from here on, errors are fatal and we'll override the state then */ - encoder->protected_->state = FLAC__STREAM_ENCODER_OK; - -#if FLAC__HAS_OGG - encoder->private_->is_ogg = is_ogg; - if(is_ogg && !FLAC__ogg_encoder_aspect_init(&encoder->protected_->ogg_encoder_aspect)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } -#endif - - encoder->private_->read_callback = read_callback; - encoder->private_->write_callback = write_callback; - encoder->private_->seek_callback = seek_callback; - encoder->private_->tell_callback = tell_callback; - encoder->private_->metadata_callback = metadata_callback; - encoder->private_->client_data = client_data; - - if(!resize_buffers_(encoder, encoder->protected_->blocksize)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - if(!FLAC__bitwriter_init(encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * Set up the verify stuff if necessary - */ - if(encoder->protected_->verify) { - /* - * First, set up the fifo which will hold the - * original signal to compare against - */ - encoder->private_->verify.input_fifo.size = encoder->protected_->blocksize+OVERREAD_; - for(i = 0; i < encoder->protected_->channels; i++) { - if(0 == (encoder->private_->verify.input_fifo.data[i] = (FLAC__int32*) safe_malloc_mul_2op_p(sizeof(FLAC__int32), /*times*/encoder->private_->verify.input_fifo.size))) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - encoder->private_->verify.input_fifo.tail = 0; - - /* - * Now set up a stream decoder for verification - */ - if(0 == encoder->private_->verify.decoder) { - encoder->private_->verify.decoder = FLAC__stream_decoder_new(); - if(0 == encoder->private_->verify.decoder) { - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - - if(FLAC__stream_decoder_init_stream(encoder->private_->verify.decoder, verify_read_callback_, /*seek_callback=*/0, /*tell_callback=*/0, /*length_callback=*/0, /*eof_callback=*/0, verify_write_callback_, verify_metadata_callback_, verify_error_callback_, /*client_data=*/encoder) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - encoder->private_->verify.error_stats.absolute_sample = 0; - encoder->private_->verify.error_stats.frame_number = 0; - encoder->private_->verify.error_stats.channel = 0; - encoder->private_->verify.error_stats.sample = 0; - encoder->private_->verify.error_stats.expected = 0; - encoder->private_->verify.error_stats.got = 0; - - /* - * These must be done before we write any metadata, because that - * calls the write_callback, which uses these values. - */ - encoder->private_->first_seekpoint_to_check = 0; - encoder->private_->samples_written = 0; - encoder->protected_->streaminfo_offset = 0; - encoder->protected_->seektable_offset = 0; - encoder->protected_->audio_offset = 0; - - /* - * write the stream header - */ - if(encoder->protected_->verify) - encoder->private_->verify.state_hint = ENCODER_IN_MAGIC; - if(!FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, FLAC__STREAM_SYNC, FLAC__STREAM_SYNC_LEN)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * write the STREAMINFO metadata block - */ - if(encoder->protected_->verify) - encoder->private_->verify.state_hint = ENCODER_IN_METADATA; - encoder->private_->streaminfo.type = FLAC__METADATA_TYPE_STREAMINFO; - encoder->private_->streaminfo.is_last = false; /* we will have at a minimum a VORBIS_COMMENT afterwards */ - encoder->private_->streaminfo.length = FLAC__STREAM_METADATA_STREAMINFO_LENGTH; - encoder->private_->streaminfo.data.stream_info.min_blocksize = encoder->protected_->blocksize; /* this encoder uses the same blocksize for the whole stream */ - encoder->private_->streaminfo.data.stream_info.max_blocksize = encoder->protected_->blocksize; - encoder->private_->streaminfo.data.stream_info.min_framesize = 0; /* we don't know this yet; have to fill it in later */ - encoder->private_->streaminfo.data.stream_info.max_framesize = 0; /* we don't know this yet; have to fill it in later */ - encoder->private_->streaminfo.data.stream_info.sample_rate = encoder->protected_->sample_rate; - encoder->private_->streaminfo.data.stream_info.channels = encoder->protected_->channels; - encoder->private_->streaminfo.data.stream_info.bits_per_sample = encoder->protected_->bits_per_sample; - encoder->private_->streaminfo.data.stream_info.total_samples = encoder->protected_->total_samples_estimate; /* we will replace this later with the real total */ - memset(encoder->private_->streaminfo.data.stream_info.md5sum, 0, 16); /* we don't know this yet; have to fill it in later */ - if(encoder->protected_->do_md5) - FLAC__MD5Init(&encoder->private_->md5context); - if(!FLAC__add_metadata_block(&encoder->private_->streaminfo, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * Now that the STREAMINFO block is written, we can init this to an - * absurdly-high value... - */ - encoder->private_->streaminfo.data.stream_info.min_framesize = (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN) - 1; - /* ... and clear this to 0 */ - encoder->private_->streaminfo.data.stream_info.total_samples = 0; - - /* - * Check to see if the supplied metadata contains a VORBIS_COMMENT; - * if not, we will write an empty one (FLAC__add_metadata_block() - * automatically supplies the vendor string). - * - * WATCHOUT: the Ogg FLAC mapping requires us to write this block after - * the STREAMINFO. (In the case that metadata_has_vorbis_comment is - * true it will have already insured that the metadata list is properly - * ordered.) - */ - if(!metadata_has_vorbis_comment) { - FLAC__StreamMetadata vorbis_comment; - vorbis_comment.type = FLAC__METADATA_TYPE_VORBIS_COMMENT; - vorbis_comment.is_last = (encoder->protected_->num_metadata_blocks == 0); - vorbis_comment.length = 4 + 4; /* MAGIC NUMBER */ - vorbis_comment.data.vorbis_comment.vendor_string.length = 0; - vorbis_comment.data.vorbis_comment.vendor_string.entry = 0; - vorbis_comment.data.vorbis_comment.num_comments = 0; - vorbis_comment.data.vorbis_comment.comments = 0; - if(!FLAC__add_metadata_block(&vorbis_comment, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - - /* - * write the user's metadata blocks - */ - for(i = 0; i < encoder->protected_->num_metadata_blocks; i++) { - encoder->protected_->metadata[i]->is_last = (i == encoder->protected_->num_metadata_blocks - 1); - if(!FLAC__add_metadata_block(encoder->protected_->metadata[i], encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - if(!write_bitbuffer_(encoder, 0, /*is_last_block=*/false)) { - /* the above function sets the state for us in case of an error */ - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - } - - /* now that all the metadata is written, we save the stream offset */ - if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &encoder->protected_->audio_offset, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */ - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - if(encoder->protected_->verify) - encoder->private_->verify.state_hint = ENCODER_IN_AUDIO; - - return FLAC__STREAM_ENCODER_INIT_STATUS_OK; -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_stream( - FLAC__StreamEncoder *encoder, - FLAC__StreamEncoderWriteCallback write_callback, - FLAC__StreamEncoderSeekCallback seek_callback, - FLAC__StreamEncoderTellCallback tell_callback, - FLAC__StreamEncoderMetadataCallback metadata_callback, - void *client_data -) -{ - return init_stream_internal_( - encoder, - /*read_callback=*/0, - write_callback, - seek_callback, - tell_callback, - metadata_callback, - client_data, - /*is_ogg=*/false - ); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_stream( - FLAC__StreamEncoder *encoder, - FLAC__StreamEncoderReadCallback read_callback, - FLAC__StreamEncoderWriteCallback write_callback, - FLAC__StreamEncoderSeekCallback seek_callback, - FLAC__StreamEncoderTellCallback tell_callback, - FLAC__StreamEncoderMetadataCallback metadata_callback, - void *client_data -) -{ - return init_stream_internal_( - encoder, - read_callback, - write_callback, - seek_callback, - tell_callback, - metadata_callback, - client_data, - /*is_ogg=*/true - ); -} - -#if 0 -static FLAC__StreamEncoderInitStatus init_FILE_internal_( - FLAC__StreamEncoder *encoder, - FILE *file, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FLAC__StreamEncoderInitStatus init_status; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != file); - - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; - - /* double protection */ - if(file == 0) { - encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - /* - * To make sure that our file does not go unclosed after an error, we - * must assign the FILE pointer before any further error can occur in - * this routine. - */ - if(file == stdout) - file = get_binary_stdout_(); /* just to be safe */ - -#ifdef _WIN32 - /* - * Windows can suffer quite badly from disk fragmentation. This can be - * reduced significantly by setting the output buffer size to be 10MB. - */ - setvbuf(file, NULL, _IOFBF, 10*1024*1024); -#endif - encoder->private_->file = file; - - encoder->private_->progress_callback = progress_callback; - encoder->private_->bytes_written = 0; - encoder->private_->samples_written = 0; - encoder->private_->frames_written = 0; - - init_status = init_stream_internal_( - encoder, - encoder->private_->file == stdout? 0 : is_ogg? file_read_callback_ : 0, - file_write_callback_, - encoder->private_->file == stdout? 0 : file_seek_callback_, - encoder->private_->file == stdout? 0 : file_tell_callback_, - /*metadata_callback=*/0, - client_data, - is_ogg - ); - if(init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK) { - /* the above function sets the state for us in case of an error */ - return init_status; - } - - { - unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder); - - FLAC__ASSERT(blocksize != 0); - encoder->private_->total_frames_estimate = (unsigned)((FLAC__stream_encoder_get_total_samples_estimate(encoder) + blocksize - 1) / blocksize); - } - - return init_status; -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_FILE( - FLAC__StreamEncoder *encoder, - FILE *file, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/false); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_FILE( - FLAC__StreamEncoder *encoder, - FILE *file, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_FILE_internal_(encoder, file, progress_callback, client_data, /*is_ogg=*/true); -} - -static FLAC__StreamEncoderInitStatus init_file_internal_( - FLAC__StreamEncoder *encoder, - const char *filename, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data, - FLAC__bool is_ogg -) -{ - FILE *file; - - FLAC__ASSERT(0 != encoder); - - /* - * To make sure that our file does not go unclosed after an error, we - * have to do the same entrance checks here that are later performed - * in FLAC__stream_encoder_init_FILE() before the FILE* is assigned. - */ - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED; - - file = filename? flac_fopen(filename, "w+b") : stdout; - - if(file == 0) { - encoder->protected_->state = FLAC__STREAM_ENCODER_IO_ERROR; - return FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR; - } - - return init_FILE_internal_(encoder, file, progress_callback, client_data, is_ogg); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_file( - FLAC__StreamEncoder *encoder, - const char *filename, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/false); -} - -FLAC_API FLAC__StreamEncoderInitStatus FLAC__stream_encoder_init_ogg_file( - FLAC__StreamEncoder *encoder, - const char *filename, - FLAC__StreamEncoderProgressCallback progress_callback, - void *client_data -) -{ - return init_file_internal_(encoder, filename, progress_callback, client_data, /*is_ogg=*/true); -} -#endif - -FLAC_API FLAC__bool FLAC__stream_encoder_finish(FLAC__StreamEncoder *encoder) -{ - FLAC__bool error = false; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - - if(encoder->protected_->state == FLAC__STREAM_ENCODER_UNINITIALIZED) - return true; - - if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK && !encoder->private_->is_being_deleted) { - if(encoder->private_->current_sample_number != 0) { - const FLAC__bool is_fractional_block = encoder->protected_->blocksize != encoder->private_->current_sample_number; - encoder->protected_->blocksize = encoder->private_->current_sample_number; - if(!process_frame_(encoder, is_fractional_block, /*is_last_block=*/true)) - error = true; - } - } - - if(encoder->protected_->do_md5) - FLAC__MD5Final(encoder->private_->streaminfo.data.stream_info.md5sum, &encoder->private_->md5context); - - if(!encoder->private_->is_being_deleted) { - if(encoder->protected_->state == FLAC__STREAM_ENCODER_OK) { - if(encoder->private_->seek_callback) { -#if FLAC__HAS_OGG - if(encoder->private_->is_ogg) - update_ogg_metadata_(encoder); - else -#endif - update_metadata_(encoder); - - /* check if an error occurred while updating metadata */ - if(encoder->protected_->state != FLAC__STREAM_ENCODER_OK) - error = true; - } - if(encoder->private_->metadata_callback) - encoder->private_->metadata_callback(encoder, &encoder->private_->streaminfo, encoder->private_->client_data); - } - - if(encoder->protected_->verify && 0 != encoder->private_->verify.decoder && !FLAC__stream_decoder_finish(encoder->private_->verify.decoder)) { - if(!error) - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA; - error = true; - } - } - - if(0 != encoder->private_->file) { - if(encoder->private_->file != stdout) - fclose(encoder->private_->file); - encoder->private_->file = 0; - } - -#if FLAC__HAS_OGG - if(encoder->private_->is_ogg) - FLAC__ogg_encoder_aspect_finish(&encoder->protected_->ogg_encoder_aspect); -#endif - - free_(encoder); - set_defaults_(encoder); - - if(!error) - encoder->protected_->state = FLAC__STREAM_ENCODER_UNINITIALIZED; - - return !error; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#if FLAC__HAS_OGG - /* can't check encoder->private_->is_ogg since that's not set until init time */ - FLAC__ogg_encoder_aspect_set_serial_number(&encoder->protected_->ogg_encoder_aspect, value); - return true; -#else - (void)value; - return false; -#endif -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#ifndef FLAC__MANDATORY_VERIFY_WHILE_ENCODING - encoder->protected_->verify = value; -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->streamable_subset = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_md5(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_md5 = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->channels = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->bits_per_sample = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->sample_rate = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__bool ok = true; - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - if(value >= sizeof(compression_levels_)/sizeof(compression_levels_[0])) - value = sizeof(compression_levels_)/sizeof(compression_levels_[0]) - 1; - ok &= FLAC__stream_encoder_set_do_mid_side_stereo (encoder, compression_levels_[value].do_mid_side_stereo); - ok &= FLAC__stream_encoder_set_loose_mid_side_stereo (encoder, compression_levels_[value].loose_mid_side_stereo); -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#if 1 - ok &= FLAC__stream_encoder_set_apodization (encoder, compression_levels_[value].apodization); -#else - /* equivalent to -A tukey(0.5) */ - encoder->protected_->num_apodizations = 1; - encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; - encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; -#endif -#endif - ok &= FLAC__stream_encoder_set_max_lpc_order (encoder, compression_levels_[value].max_lpc_order); - ok &= FLAC__stream_encoder_set_qlp_coeff_precision (encoder, compression_levels_[value].qlp_coeff_precision); - ok &= FLAC__stream_encoder_set_do_qlp_coeff_prec_search (encoder, compression_levels_[value].do_qlp_coeff_prec_search); - ok &= FLAC__stream_encoder_set_do_escape_coding (encoder, compression_levels_[value].do_escape_coding); - ok &= FLAC__stream_encoder_set_do_exhaustive_model_search (encoder, compression_levels_[value].do_exhaustive_model_search); - ok &= FLAC__stream_encoder_set_min_residual_partition_order(encoder, compression_levels_[value].min_residual_partition_order); - ok &= FLAC__stream_encoder_set_max_residual_partition_order(encoder, compression_levels_[value].max_residual_partition_order); - ok &= FLAC__stream_encoder_set_rice_parameter_search_dist (encoder, compression_levels_[value].rice_parameter_search_dist); - return ok; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->blocksize = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_mid_side_stereo = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->loose_mid_side_stereo = value; - return true; -} - -/*@@@@add to tests*/ -FLAC_API FLAC__bool FLAC__stream_encoder_set_apodization(FLAC__StreamEncoder *encoder, const char *specification) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(0 != specification); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#ifdef FLAC__INTEGER_ONLY_LIBRARY - (void)specification; /* silently ignore since we haven't integerized; will always use a rectangular window */ -#else - encoder->protected_->num_apodizations = 0; - while(1) { - const char *s = strchr(specification, ';'); - const size_t n = s? (size_t)(s - specification) : strlen(specification); - if (n==8 && 0 == strncmp("bartlett" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT; - else if(n==13 && 0 == strncmp("bartlett_hann", specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BARTLETT_HANN; - else if(n==8 && 0 == strncmp("blackman" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN; - else if(n==26 && 0 == strncmp("blackman_harris_4term_92db", specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE; - else if(n==6 && 0 == strncmp("connes" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_CONNES; - else if(n==7 && 0 == strncmp("flattop" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_FLATTOP; - else if(n>7 && 0 == strncmp("gauss(" , specification, 6)) { - FLAC__real stddev = (FLAC__real)strtod(specification+6, 0); - if (stddev > 0.0 && stddev <= 0.5) { - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.gauss.stddev = stddev; - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_GAUSS; - } - } - else if(n==7 && 0 == strncmp("hamming" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HAMMING; - else if(n==4 && 0 == strncmp("hann" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_HANN; - else if(n==13 && 0 == strncmp("kaiser_bessel", specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_KAISER_BESSEL; - else if(n==7 && 0 == strncmp("nuttall" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_NUTTALL; - else if(n==9 && 0 == strncmp("rectangle" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_RECTANGLE; - else if(n==8 && 0 == strncmp("triangle" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TRIANGLE; - else if(n>7 && 0 == strncmp("tukey(" , specification, 6)) { - FLAC__real p = (FLAC__real)strtod(specification+6, 0); - if (p >= 0.0 && p <= 1.0) { - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; - } - } - else if(n>15 && 0 == strncmp("partial_tukey(" , specification, 14)) { - FLAC__int32 tukey_parts = (FLAC__int32)strtod(specification+14, 0); - const char *si_1 = strchr(specification, '/'); - FLAC__real overlap = si_1?flac_min((FLAC__real)strtod(si_1+1, 0),0.99f):0.1f; - FLAC__real overlap_units = 1.0f/(1.0f - overlap) - 1.0f; - const char *si_2 = strchr((si_1?(si_1+1):specification), '/'); - FLAC__real tukey_p = si_2?(FLAC__real)strtod(si_2+1, 0):0.2f; - - if (tukey_parts <= 1) { - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = tukey_p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; - }else if (encoder->protected_->num_apodizations + tukey_parts < 32){ - FLAC__int32 m; - for(m = 0; m < tukey_parts; m++){ - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.p = tukey_p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.start = m/(tukey_parts+overlap_units); - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.end = (m+1+overlap_units)/(tukey_parts+overlap_units); - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_PARTIAL_TUKEY; - } - } - } - else if(n>16 && 0 == strncmp("punchout_tukey(" , specification, 15)) { - FLAC__int32 tukey_parts = (FLAC__int32)strtod(specification+15, 0); - const char *si_1 = strchr(specification, '/'); - FLAC__real overlap = si_1?flac_min((FLAC__real)strtod(si_1+1, 0),0.99f):0.2f; - FLAC__real overlap_units = 1.0f/(1.0f - overlap) - 1.0f; - const char *si_2 = strchr((si_1?(si_1+1):specification), '/'); - FLAC__real tukey_p = si_2?(FLAC__real)strtod(si_2+1, 0):0.2f; - - if (tukey_parts <= 1) { - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.tukey.p = tukey_p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_TUKEY; - }else if (encoder->protected_->num_apodizations + tukey_parts < 32){ - FLAC__int32 m; - for(m = 0; m < tukey_parts; m++){ - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.p = tukey_p; - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.start = m/(tukey_parts+overlap_units); - encoder->protected_->apodizations[encoder->protected_->num_apodizations].parameters.multiple_tukey.end = (m+1+overlap_units)/(tukey_parts+overlap_units); - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_PUNCHOUT_TUKEY; - } - } - } - else if(n==5 && 0 == strncmp("welch" , specification, n)) - encoder->protected_->apodizations[encoder->protected_->num_apodizations++].type = FLAC__APODIZATION_WELCH; - if (encoder->protected_->num_apodizations == 32) - break; - if (s) - specification = s+1; - else - break; - } - if(encoder->protected_->num_apodizations == 0) { - encoder->protected_->num_apodizations = 1; - encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; - encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; - } -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_max_lpc_order(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->max_lpc_order = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_qlp_coeff_precision(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->qlp_coeff_precision = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_qlp_coeff_prec_search(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_qlp_coeff_prec_search = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_escape_coding(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#if 0 - /*@@@ deprecated: */ - encoder->protected_->do_escape_coding = value; -#else - (void)value; -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_exhaustive_model_search(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->do_exhaustive_model_search = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->min_residual_partition_order = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->max_residual_partition_order = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; -#if 0 - /*@@@ deprecated: */ - encoder->protected_->rice_parameter_search_dist = value; -#else - (void)value; -#endif - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->protected_->total_samples_estimate = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - if(0 == metadata) - num_blocks = 0; - if(0 == num_blocks) - metadata = 0; - /* realloc() does not do exactly what we want so... */ - if(encoder->protected_->metadata) { - free(encoder->protected_->metadata); - encoder->protected_->metadata = 0; - encoder->protected_->num_metadata_blocks = 0; - } - if(num_blocks) { - FLAC__StreamMetadata **m; - if(0 == (m = (FLAC__StreamMetadata**) safe_malloc_mul_2op_p(sizeof(m[0]), /*times*/num_blocks))) - return false; - memcpy(m, metadata, sizeof(m[0]) * num_blocks); - encoder->protected_->metadata = m; - encoder->protected_->num_metadata_blocks = num_blocks; - } -#if FLAC__HAS_OGG - if(!FLAC__ogg_encoder_aspect_set_num_metadata(&encoder->protected_->ogg_encoder_aspect, num_blocks)) - return false; -#endif - return true; -} - -/* - * These three functions are not static, but not publically exposed in - * include/FLAC/ either. They are used by the test suite. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_disable_constant_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->private_->disable_constant_subframes = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_disable_fixed_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->private_->disable_fixed_subframes = value; - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_disable_verbatim_subframes(FLAC__StreamEncoder *encoder, FLAC__bool value) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_UNINITIALIZED) - return false; - encoder->private_->disable_verbatim_subframes = value; - return true; -} - -FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->state; -} - -FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->verify) - return FLAC__stream_decoder_get_state(encoder->private_->verify.decoder); - else - return FLAC__STREAM_DECODER_UNINITIALIZED; -} - -FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR) - return FLAC__StreamEncoderStateString[encoder->protected_->state]; - else - return FLAC__stream_decoder_get_resolved_state_string(encoder->private_->verify.decoder); -} - -FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - if(0 != absolute_sample) - *absolute_sample = encoder->private_->verify.error_stats.absolute_sample; - if(0 != frame_number) - *frame_number = encoder->private_->verify.error_stats.frame_number; - if(0 != channel) - *channel = encoder->private_->verify.error_stats.channel; - if(0 != sample) - *sample = encoder->private_->verify.error_stats.sample; - if(0 != expected) - *expected = encoder->private_->verify.error_stats.expected; - if(0 != got) - *got = encoder->private_->verify.error_stats.got; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->verify; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_streamable_subset(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->streamable_subset; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_md5(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_md5; -} - -FLAC_API unsigned FLAC__stream_encoder_get_channels(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->channels; -} - -FLAC_API unsigned FLAC__stream_encoder_get_bits_per_sample(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->bits_per_sample; -} - -FLAC_API unsigned FLAC__stream_encoder_get_sample_rate(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->sample_rate; -} - -FLAC_API unsigned FLAC__stream_encoder_get_blocksize(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->blocksize; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_mid_side_stereo(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_mid_side_stereo; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_loose_mid_side_stereo(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->loose_mid_side_stereo; -} - -FLAC_API unsigned FLAC__stream_encoder_get_max_lpc_order(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->max_lpc_order; -} - -FLAC_API unsigned FLAC__stream_encoder_get_qlp_coeff_precision(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->qlp_coeff_precision; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_qlp_coeff_prec_search(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_qlp_coeff_prec_search; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_escape_coding(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_escape_coding; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_get_do_exhaustive_model_search(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->do_exhaustive_model_search; -} - -FLAC_API unsigned FLAC__stream_encoder_get_min_residual_partition_order(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->min_residual_partition_order; -} - -FLAC_API unsigned FLAC__stream_encoder_get_max_residual_partition_order(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->max_residual_partition_order; -} - -FLAC_API unsigned FLAC__stream_encoder_get_rice_parameter_search_dist(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->rice_parameter_search_dist; -} - -FLAC_API FLAC__uint64 FLAC__stream_encoder_get_total_samples_estimate(const FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - return encoder->protected_->total_samples_estimate; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples) -{ - unsigned i, j = 0, channel; - const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - - do { - const unsigned n = flac_min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j); - - if(encoder->protected_->verify) - append_to_verify_fifo_(&encoder->private_->verify.input_fifo, buffer, j, channels, n); - - for(channel = 0; channel < channels; channel++) - memcpy(&encoder->private_->integer_signal[channel][encoder->private_->current_sample_number], &buffer[channel][j], sizeof(buffer[channel][0]) * n); - - if(encoder->protected_->do_mid_side_stereo) { - FLAC__ASSERT(channels == 2); - /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ - for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { - encoder->private_->integer_signal_mid_side[1][i] = buffer[0][j] - buffer[1][j]; - encoder->private_->integer_signal_mid_side[0][i] = (buffer[0][j] + buffer[1][j]) >> 1; /* NOTE: not the same as 'mid = (buffer[0][j] + buffer[1][j]) / 2' ! */ - } - } - else - j += n; - - encoder->private_->current_sample_number += n; - - /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ - if(encoder->private_->current_sample_number > blocksize) { - FLAC__ASSERT(encoder->private_->current_sample_number == blocksize+OVERREAD_); - FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ - if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) - return false; - /* move unprocessed overread samples to beginnings of arrays */ - for(channel = 0; channel < channels; channel++) - encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize]; - if(encoder->protected_->do_mid_side_stereo) { - encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize]; - encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize]; - } - encoder->private_->current_sample_number = 1; - } - } while(j < samples); - - return true; -} - -FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples) -{ - unsigned i, j, k, channel; - FLAC__int32 x, mid, side; - const unsigned channels = encoder->protected_->channels, blocksize = encoder->protected_->blocksize; - - FLAC__ASSERT(0 != encoder); - FLAC__ASSERT(0 != encoder->private_); - FLAC__ASSERT(0 != encoder->protected_); - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - - j = k = 0; - /* - * we have several flavors of the same basic loop, optimized for - * different conditions: - */ - if(encoder->protected_->do_mid_side_stereo && channels == 2) { - /* - * stereo coding: unroll channel loop - */ - do { - if(encoder->protected_->verify) - append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, flac_min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j)); - - /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ - for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { - encoder->private_->integer_signal[0][i] = mid = side = buffer[k++]; - x = buffer[k++]; - encoder->private_->integer_signal[1][i] = x; - mid += x; - side -= x; - mid >>= 1; /* NOTE: not the same as 'mid = (left + right) / 2' ! */ - encoder->private_->integer_signal_mid_side[1][i] = side; - encoder->private_->integer_signal_mid_side[0][i] = mid; - } - encoder->private_->current_sample_number = i; - /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ - if(i > blocksize) { - if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) - return false; - /* move unprocessed overread samples to beginnings of arrays */ - FLAC__ASSERT(i == blocksize+OVERREAD_); - FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ - encoder->private_->integer_signal[0][0] = encoder->private_->integer_signal[0][blocksize]; - encoder->private_->integer_signal[1][0] = encoder->private_->integer_signal[1][blocksize]; - encoder->private_->integer_signal_mid_side[0][0] = encoder->private_->integer_signal_mid_side[0][blocksize]; - encoder->private_->integer_signal_mid_side[1][0] = encoder->private_->integer_signal_mid_side[1][blocksize]; - encoder->private_->current_sample_number = 1; - } - } while(j < samples); - } - else { - /* - * independent channel coding: buffer each channel in inner loop - */ - do { - if(encoder->protected_->verify) - append_to_verify_fifo_interleaved_(&encoder->private_->verify.input_fifo, buffer, j, channels, flac_min(blocksize+OVERREAD_-encoder->private_->current_sample_number, samples-j)); - - /* "i <= blocksize" to overread 1 sample; see comment in OVERREAD_ decl */ - for(i = encoder->private_->current_sample_number; i <= blocksize && j < samples; i++, j++) { - for(channel = 0; channel < channels; channel++) - encoder->private_->integer_signal[channel][i] = buffer[k++]; - } - encoder->private_->current_sample_number = i; - /* we only process if we have a full block + 1 extra sample; final block is always handled by FLAC__stream_encoder_finish() */ - if(i > blocksize) { - if(!process_frame_(encoder, /*is_fractional_block=*/false, /*is_last_block=*/false)) - return false; - /* move unprocessed overread samples to beginnings of arrays */ - FLAC__ASSERT(i == blocksize+OVERREAD_); - FLAC__ASSERT(OVERREAD_ == 1); /* assert we only overread 1 sample which simplifies the rest of the code below */ - for(channel = 0; channel < channels; channel++) - encoder->private_->integer_signal[channel][0] = encoder->private_->integer_signal[channel][blocksize]; - encoder->private_->current_sample_number = 1; - } - } while(j < samples); - } - - return true; -} - -/*********************************************************************** - * - * Private class methods - * - ***********************************************************************/ - -void set_defaults_(FLAC__StreamEncoder *encoder) -{ - FLAC__ASSERT(0 != encoder); - -#ifdef FLAC__MANDATORY_VERIFY_WHILE_ENCODING - encoder->protected_->verify = true; -#else - encoder->protected_->verify = false; -#endif - encoder->protected_->streamable_subset = true; - encoder->protected_->do_md5 = true; - encoder->protected_->do_mid_side_stereo = false; - encoder->protected_->loose_mid_side_stereo = false; - encoder->protected_->channels = 2; - encoder->protected_->bits_per_sample = 16; - encoder->protected_->sample_rate = 44100; - encoder->protected_->blocksize = 0; -#ifndef FLAC__INTEGER_ONLY_LIBRARY - encoder->protected_->num_apodizations = 1; - encoder->protected_->apodizations[0].type = FLAC__APODIZATION_TUKEY; - encoder->protected_->apodizations[0].parameters.tukey.p = 0.5; -#endif - encoder->protected_->max_lpc_order = 0; - encoder->protected_->qlp_coeff_precision = 0; - encoder->protected_->do_qlp_coeff_prec_search = false; - encoder->protected_->do_exhaustive_model_search = false; - encoder->protected_->do_escape_coding = false; - encoder->protected_->min_residual_partition_order = 0; - encoder->protected_->max_residual_partition_order = 0; - encoder->protected_->rice_parameter_search_dist = 0; - encoder->protected_->total_samples_estimate = 0; - encoder->protected_->metadata = 0; - encoder->protected_->num_metadata_blocks = 0; - - encoder->private_->seek_table = 0; - encoder->private_->disable_constant_subframes = false; - encoder->private_->disable_fixed_subframes = false; - encoder->private_->disable_verbatim_subframes = false; -#if FLAC__HAS_OGG - encoder->private_->is_ogg = false; -#endif - encoder->private_->read_callback = 0; - encoder->private_->write_callback = 0; - encoder->private_->seek_callback = 0; - encoder->private_->tell_callback = 0; - encoder->private_->metadata_callback = 0; - encoder->private_->progress_callback = 0; - encoder->private_->client_data = 0; - -#if FLAC__HAS_OGG - FLAC__ogg_encoder_aspect_set_defaults(&encoder->protected_->ogg_encoder_aspect); -#endif - - FLAC__stream_encoder_set_compression_level(encoder, 5); -} - -void free_(FLAC__StreamEncoder *encoder) -{ - unsigned i, channel; - - FLAC__ASSERT(0 != encoder); - if(encoder->protected_->metadata) { - free(encoder->protected_->metadata); - encoder->protected_->metadata = 0; - encoder->protected_->num_metadata_blocks = 0; - } - for(i = 0; i < encoder->protected_->channels; i++) { - if(0 != encoder->private_->integer_signal_unaligned[i]) { - free(encoder->private_->integer_signal_unaligned[i]); - encoder->private_->integer_signal_unaligned[i] = 0; - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(0 != encoder->private_->real_signal_unaligned[i]) { - free(encoder->private_->real_signal_unaligned[i]); - encoder->private_->real_signal_unaligned[i] = 0; - } -#endif - } - for(i = 0; i < 2; i++) { - if(0 != encoder->private_->integer_signal_mid_side_unaligned[i]) { - free(encoder->private_->integer_signal_mid_side_unaligned[i]); - encoder->private_->integer_signal_mid_side_unaligned[i] = 0; - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(0 != encoder->private_->real_signal_mid_side_unaligned[i]) { - free(encoder->private_->real_signal_mid_side_unaligned[i]); - encoder->private_->real_signal_mid_side_unaligned[i] = 0; - } -#endif - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - for(i = 0; i < encoder->protected_->num_apodizations; i++) { - if(0 != encoder->private_->window_unaligned[i]) { - free(encoder->private_->window_unaligned[i]); - encoder->private_->window_unaligned[i] = 0; - } - } - if(0 != encoder->private_->windowed_signal_unaligned) { - free(encoder->private_->windowed_signal_unaligned); - encoder->private_->windowed_signal_unaligned = 0; - } -#endif - for(channel = 0; channel < encoder->protected_->channels; channel++) { - for(i = 0; i < 2; i++) { - if(0 != encoder->private_->residual_workspace_unaligned[channel][i]) { - free(encoder->private_->residual_workspace_unaligned[channel][i]); - encoder->private_->residual_workspace_unaligned[channel][i] = 0; - } - } - } - for(channel = 0; channel < 2; channel++) { - for(i = 0; i < 2; i++) { - if(0 != encoder->private_->residual_workspace_mid_side_unaligned[channel][i]) { - free(encoder->private_->residual_workspace_mid_side_unaligned[channel][i]); - encoder->private_->residual_workspace_mid_side_unaligned[channel][i] = 0; - } - } - } - if(0 != encoder->private_->abs_residual_partition_sums_unaligned) { - free(encoder->private_->abs_residual_partition_sums_unaligned); - encoder->private_->abs_residual_partition_sums_unaligned = 0; - } - if(0 != encoder->private_->raw_bits_per_partition_unaligned) { - free(encoder->private_->raw_bits_per_partition_unaligned); - encoder->private_->raw_bits_per_partition_unaligned = 0; - } - if(encoder->protected_->verify) { - for(i = 0; i < encoder->protected_->channels; i++) { - if(0 != encoder->private_->verify.input_fifo.data[i]) { - free(encoder->private_->verify.input_fifo.data[i]); - encoder->private_->verify.input_fifo.data[i] = 0; - } - } - } - FLAC__bitwriter_free(encoder->private_->frame); -} - -FLAC__bool resize_buffers_(FLAC__StreamEncoder *encoder, unsigned new_blocksize) -{ - FLAC__bool ok; - unsigned i, channel; - - FLAC__ASSERT(new_blocksize > 0); - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - FLAC__ASSERT(encoder->private_->current_sample_number == 0); - - /* To avoid excessive malloc'ing, we only grow the buffer; no shrinking. */ - if(new_blocksize <= encoder->private_->input_capacity) - return true; - - ok = true; - - /* WATCHOUT: FLAC__lpc_compute_residual_from_qlp_coefficients_asm_ia32_mmx() and ..._intrin_sse2() - * require that the input arrays (in our case the integer signals) - * have a buffer of up to 3 zeroes in front (at negative indices) for - * alignment purposes; we use 4 in front to keep the data well-aligned. - */ - - for(i = 0; ok && i < encoder->protected_->channels; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_unaligned[i], &encoder->private_->integer_signal[i]); - memset(encoder->private_->integer_signal[i], 0, sizeof(FLAC__int32)*4); - encoder->private_->integer_signal[i] += 4; -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#if 0 /* @@@ currently unused */ - if(encoder->protected_->max_lpc_order > 0) - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_unaligned[i], &encoder->private_->real_signal[i]); -#endif -#endif - } - for(i = 0; ok && i < 2; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize+4+OVERREAD_, &encoder->private_->integer_signal_mid_side_unaligned[i], &encoder->private_->integer_signal_mid_side[i]); - memset(encoder->private_->integer_signal_mid_side[i], 0, sizeof(FLAC__int32)*4); - encoder->private_->integer_signal_mid_side[i] += 4; -#ifndef FLAC__INTEGER_ONLY_LIBRARY -#if 0 /* @@@ currently unused */ - if(encoder->protected_->max_lpc_order > 0) - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize+OVERREAD_, &encoder->private_->real_signal_mid_side_unaligned[i], &encoder->private_->real_signal_mid_side[i]); -#endif -#endif - } -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(ok && encoder->protected_->max_lpc_order > 0) { - for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->window_unaligned[i], &encoder->private_->window[i]); - ok = ok && FLAC__memory_alloc_aligned_real_array(new_blocksize, &encoder->private_->windowed_signal_unaligned, &encoder->private_->windowed_signal); - } -#endif - for(channel = 0; ok && channel < encoder->protected_->channels; channel++) { - for(i = 0; ok && i < 2; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_unaligned[channel][i], &encoder->private_->residual_workspace[channel][i]); - } - } - for(channel = 0; ok && channel < 2; channel++) { - for(i = 0; ok && i < 2; i++) { - ok = ok && FLAC__memory_alloc_aligned_int32_array(new_blocksize, &encoder->private_->residual_workspace_mid_side_unaligned[channel][i], &encoder->private_->residual_workspace_mid_side[channel][i]); - } - } - /* the *2 is an approximation to the series 1 + 1/2 + 1/4 + ... that sums tree occupies in a flat array */ - /*@@@ new_blocksize*2 is too pessimistic, but to fix, we need smarter logic because a smaller new_blocksize can actually increase the # of partitions; would require moving this out into a separate function, then checking its capacity against the need of the current blocksize&min/max_partition_order (and maybe predictor order) */ - ok = ok && FLAC__memory_alloc_aligned_uint64_array(new_blocksize * 2, &encoder->private_->abs_residual_partition_sums_unaligned, &encoder->private_->abs_residual_partition_sums); - if(encoder->protected_->do_escape_coding) - ok = ok && FLAC__memory_alloc_aligned_unsigned_array(new_blocksize * 2, &encoder->private_->raw_bits_per_partition_unaligned, &encoder->private_->raw_bits_per_partition); - - /* now adjust the windows if the blocksize has changed */ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(ok && new_blocksize != encoder->private_->input_capacity && encoder->protected_->max_lpc_order > 0) { - for(i = 0; ok && i < encoder->protected_->num_apodizations; i++) { - switch(encoder->protected_->apodizations[i].type) { - case FLAC__APODIZATION_BARTLETT: - FLAC__window_bartlett(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_BARTLETT_HANN: - FLAC__window_bartlett_hann(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_BLACKMAN: - FLAC__window_blackman(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_BLACKMAN_HARRIS_4TERM_92DB_SIDELOBE: - FLAC__window_blackman_harris_4term_92db_sidelobe(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_CONNES: - FLAC__window_connes(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_FLATTOP: - FLAC__window_flattop(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_GAUSS: - FLAC__window_gauss(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.gauss.stddev); - break; - case FLAC__APODIZATION_HAMMING: - FLAC__window_hamming(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_HANN: - FLAC__window_hann(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_KAISER_BESSEL: - FLAC__window_kaiser_bessel(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_NUTTALL: - FLAC__window_nuttall(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_RECTANGLE: - FLAC__window_rectangle(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_TRIANGLE: - FLAC__window_triangle(encoder->private_->window[i], new_blocksize); - break; - case FLAC__APODIZATION_TUKEY: - FLAC__window_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.tukey.p); - break; - case FLAC__APODIZATION_PARTIAL_TUKEY: - FLAC__window_partial_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.multiple_tukey.p, encoder->protected_->apodizations[i].parameters.multiple_tukey.start, encoder->protected_->apodizations[i].parameters.multiple_tukey.end); - break; - case FLAC__APODIZATION_PUNCHOUT_TUKEY: - FLAC__window_punchout_tukey(encoder->private_->window[i], new_blocksize, encoder->protected_->apodizations[i].parameters.multiple_tukey.p, encoder->protected_->apodizations[i].parameters.multiple_tukey.start, encoder->protected_->apodizations[i].parameters.multiple_tukey.end); - break; - case FLAC__APODIZATION_WELCH: - FLAC__window_welch(encoder->private_->window[i], new_blocksize); - break; - default: - FLAC__ASSERT(0); - /* double protection */ - FLAC__window_hann(encoder->private_->window[i], new_blocksize); - break; - } - } - } -#endif - - if(ok) - encoder->private_->input_capacity = new_blocksize; - else - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - - return ok; -} - -FLAC__bool write_bitbuffer_(FLAC__StreamEncoder *encoder, unsigned samples, FLAC__bool is_last_block) -{ - const FLAC__byte *buffer; - size_t bytes; - - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame)); - - if(!FLAC__bitwriter_get_buffer(encoder->private_->frame, &buffer, &bytes)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - if(encoder->protected_->verify) { - encoder->private_->verify.output.data = buffer; - encoder->private_->verify.output.bytes = bytes; - if(encoder->private_->verify.state_hint == ENCODER_IN_MAGIC) { - encoder->private_->verify.needs_magic_hack = true; - } - else { - if(!FLAC__stream_decoder_process_single(encoder->private_->verify.decoder)) { - FLAC__bitwriter_release_buffer(encoder->private_->frame); - FLAC__bitwriter_clear(encoder->private_->frame); - if(encoder->protected_->state != FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA) - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; - return false; - } - } - } - - if(write_frame_(encoder, buffer, bytes, samples, is_last_block) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - FLAC__bitwriter_release_buffer(encoder->private_->frame); - FLAC__bitwriter_clear(encoder->private_->frame); - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return false; - } - - FLAC__bitwriter_release_buffer(encoder->private_->frame); - FLAC__bitwriter_clear(encoder->private_->frame); - - if(samples > 0) { - encoder->private_->streaminfo.data.stream_info.min_framesize = flac_min(bytes, (size_t) encoder->private_->streaminfo.data.stream_info.min_framesize); - encoder->private_->streaminfo.data.stream_info.max_framesize = flac_max(bytes, (size_t) encoder->private_->streaminfo.data.stream_info.max_framesize); - } - - return true; -} - -FLAC__StreamEncoderWriteStatus write_frame_(FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, FLAC__bool is_last_block) -{ - FLAC__StreamEncoderWriteStatus status; - FLAC__uint64 output_position = 0; - -#if FLAC__HAS_OGG == 0 - (void)is_last_block; -#endif - - /* FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED just means we didn't get the offset; no error */ - if(encoder->private_->tell_callback && encoder->private_->tell_callback(encoder, &output_position, encoder->private_->client_data) == FLAC__STREAM_ENCODER_TELL_STATUS_ERROR) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - } - - /* - * Watch for the STREAMINFO block and first SEEKTABLE block to go by and store their offsets. - */ - if(samples == 0) { - FLAC__MetadataType type = (FLAC__MetadataType) (buffer[0] & 0x7f); - if(type == FLAC__METADATA_TYPE_STREAMINFO) - encoder->protected_->streaminfo_offset = output_position; - else if(type == FLAC__METADATA_TYPE_SEEKTABLE && encoder->protected_->seektable_offset == 0) - encoder->protected_->seektable_offset = output_position; - } - - /* - * Mark the current seek point if hit (if audio_offset == 0 that - * means we're still writing metadata and haven't hit the first - * frame yet) - */ - if(0 != encoder->private_->seek_table && encoder->protected_->audio_offset > 0 && encoder->private_->seek_table->num_points > 0) { - const unsigned blocksize = FLAC__stream_encoder_get_blocksize(encoder); - const FLAC__uint64 frame_first_sample = encoder->private_->samples_written; - const FLAC__uint64 frame_last_sample = frame_first_sample + (FLAC__uint64)blocksize - 1; - FLAC__uint64 test_sample; - unsigned i; - for(i = encoder->private_->first_seekpoint_to_check; i < encoder->private_->seek_table->num_points; i++) { - test_sample = encoder->private_->seek_table->points[i].sample_number; - if(test_sample > frame_last_sample) { - break; - } - else if(test_sample >= frame_first_sample) { - encoder->private_->seek_table->points[i].sample_number = frame_first_sample; - encoder->private_->seek_table->points[i].stream_offset = output_position - encoder->protected_->audio_offset; - encoder->private_->seek_table->points[i].frame_samples = blocksize; - encoder->private_->first_seekpoint_to_check++; - /* DO NOT: "break;" and here's why: - * The seektable template may contain more than one target - * sample for any given frame; we will keep looping, generating - * duplicate seekpoints for them, and we'll clean it up later, - * just before writing the seektable back to the metadata. - */ - } - else { - encoder->private_->first_seekpoint_to_check++; - } - } - } - -#if FLAC__HAS_OGG - if(encoder->private_->is_ogg) { - status = FLAC__ogg_encoder_aspect_write_callback_wrapper( - &encoder->protected_->ogg_encoder_aspect, - buffer, - bytes, - samples, - encoder->private_->current_frame_number, - is_last_block, - (FLAC__OggEncoderAspectWriteCallbackProxy)encoder->private_->write_callback, - encoder, - encoder->private_->client_data - ); - } - else -#endif - status = encoder->private_->write_callback(encoder, buffer, bytes, samples, encoder->private_->current_frame_number, encoder->private_->client_data); - - if(status == FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->private_->bytes_written += bytes; - encoder->private_->samples_written += samples; - /* we keep a high watermark on the number of frames written because - * when the encoder goes back to write metadata, 'current_frame' - * will drop back to 0. - */ - encoder->private_->frames_written = flac_max(encoder->private_->frames_written, encoder->private_->current_frame_number+1); - } - else - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - - return status; -} - -/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks. */ -void update_metadata_(const FLAC__StreamEncoder *encoder) -{ - FLAC__byte b[FLAC__STREAM_METADATA_SEEKPOINT_LENGTH]; - const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo; - const FLAC__uint64 samples = metadata->data.stream_info.total_samples; - const unsigned min_framesize = metadata->data.stream_info.min_framesize; - const unsigned max_framesize = metadata->data.stream_info.max_framesize; - const unsigned bps = metadata->data.stream_info.bits_per_sample; - FLAC__StreamEncoderSeekStatus seek_status; - - FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO); - - /* All this is based on intimate knowledge of the stream header - * layout, but a change to the header format that would break this - * would also break all streams encoded in the previous format. - */ - - /* - * Write MD5 signature - */ - { - const unsigned md5_offset = - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN - ) / 8; - - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + md5_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - if(encoder->private_->write_callback(encoder, metadata->data.stream_info.md5sum, 16, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - - /* - * Write total samples - */ - { - const unsigned total_samples_byte_offset = - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN - - 4 - ) / 8; - - b[0] = ((FLAC__byte)(bps-1) << 4) | (FLAC__byte)((samples >> 32) & 0x0F); - b[1] = (FLAC__byte)((samples >> 24) & 0xFF); - b[2] = (FLAC__byte)((samples >> 16) & 0xFF); - b[3] = (FLAC__byte)((samples >> 8) & 0xFF); - b[4] = (FLAC__byte)(samples & 0xFF); - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + total_samples_byte_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - if(encoder->private_->write_callback(encoder, b, 5, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - - /* - * Write min/max framesize - */ - { - const unsigned min_framesize_offset = - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN - ) / 8; - - b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF); - b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF); - b[2] = (FLAC__byte)(min_framesize & 0xFF); - b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF); - b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF); - b[5] = (FLAC__byte)(max_framesize & 0xFF); - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->streaminfo_offset + min_framesize_offset, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - if(encoder->private_->write_callback(encoder, b, 6, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - - /* - * Write seektable - */ - if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) { - unsigned i; - - FLAC__format_seektable_sort(encoder->private_->seek_table); - - FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table)); - - if((seek_status = encoder->private_->seek_callback(encoder, encoder->protected_->seektable_offset + FLAC__STREAM_METADATA_HEADER_LENGTH, encoder->private_->client_data)) != FLAC__STREAM_ENCODER_SEEK_STATUS_OK) { - if(seek_status == FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR) - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - - for(i = 0; i < encoder->private_->seek_table->num_points; i++) { - FLAC__uint64 xx; - unsigned x; - xx = encoder->private_->seek_table->points[i].sample_number; - b[7] = (FLAC__byte)xx; xx >>= 8; - b[6] = (FLAC__byte)xx; xx >>= 8; - b[5] = (FLAC__byte)xx; xx >>= 8; - b[4] = (FLAC__byte)xx; xx >>= 8; - b[3] = (FLAC__byte)xx; xx >>= 8; - b[2] = (FLAC__byte)xx; xx >>= 8; - b[1] = (FLAC__byte)xx; xx >>= 8; - b[0] = (FLAC__byte)xx; //xx >>= 8; - xx = encoder->private_->seek_table->points[i].stream_offset; - b[15] = (FLAC__byte)xx; xx >>= 8; - b[14] = (FLAC__byte)xx; xx >>= 8; - b[13] = (FLAC__byte)xx; xx >>= 8; - b[12] = (FLAC__byte)xx; xx >>= 8; - b[11] = (FLAC__byte)xx; xx >>= 8; - b[10] = (FLAC__byte)xx; xx >>= 8; - b[9] = (FLAC__byte)xx; xx >>= 8; - b[8] = (FLAC__byte)xx; //xx >>= 8; - x = encoder->private_->seek_table->points[i].frame_samples; - b[17] = (FLAC__byte)x; x >>= 8; - b[16] = (FLAC__byte)x; //x >>= 8; - if(encoder->private_->write_callback(encoder, b, 18, 0, 0, encoder->private_->client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK) { - encoder->protected_->state = FLAC__STREAM_ENCODER_CLIENT_ERROR; - return; - } - } - } -} - -#if FLAC__HAS_OGG -/* Gets called when the encoding process has finished so that we can update the STREAMINFO and SEEKTABLE blocks. */ -void update_ogg_metadata_(FLAC__StreamEncoder *encoder) -{ - /* the # of bytes in the 1st packet that precede the STREAMINFO */ - static const unsigned FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH = - FLAC__OGG_MAPPING_PACKET_TYPE_LENGTH + - FLAC__OGG_MAPPING_MAGIC_LENGTH + - FLAC__OGG_MAPPING_VERSION_MAJOR_LENGTH + - FLAC__OGG_MAPPING_VERSION_MINOR_LENGTH + - FLAC__OGG_MAPPING_NUM_HEADERS_LENGTH + - FLAC__STREAM_SYNC_LENGTH - ; - FLAC__byte b[flac_max(6u, FLAC__STREAM_METADATA_SEEKPOINT_LENGTH)]; - const FLAC__StreamMetadata *metadata = &encoder->private_->streaminfo; - const FLAC__uint64 samples = metadata->data.stream_info.total_samples; - const unsigned min_framesize = metadata->data.stream_info.min_framesize; - const unsigned max_framesize = metadata->data.stream_info.max_framesize; - ogg_page page; - - FLAC__ASSERT(metadata->type == FLAC__METADATA_TYPE_STREAMINFO); - FLAC__ASSERT(0 != encoder->private_->seek_callback); - - /* Pre-check that client supports seeking, since we don't want the - * ogg_helper code to ever have to deal with this condition. - */ - if(encoder->private_->seek_callback(encoder, 0, encoder->private_->client_data) == FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED) - return; - - /* All this is based on intimate knowledge of the stream header - * layout, but a change to the header format that would break this - * would also break all streams encoded in the previous format. - */ - - /** - ** Write STREAMINFO stats - **/ - simple_ogg_page__init(&page); - if(!simple_ogg_page__get_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - - /* - * Write MD5 signature - */ - { - const unsigned md5_offset = - FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN - ) / 8; - - if(md5_offset + 16 > (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - memcpy(page.body + md5_offset, metadata->data.stream_info.md5sum, 16); - } - - /* - * Write total samples - */ - { - const unsigned total_samples_byte_offset = - FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN + - FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN - - 4 - ) / 8; - - if(total_samples_byte_offset + 5 > (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - b[0] = (FLAC__byte)page.body[total_samples_byte_offset] & 0xF0; - b[0] |= (FLAC__byte)((samples >> 32) & 0x0F); - b[1] = (FLAC__byte)((samples >> 24) & 0xFF); - b[2] = (FLAC__byte)((samples >> 16) & 0xFF); - b[3] = (FLAC__byte)((samples >> 8) & 0xFF); - b[4] = (FLAC__byte)(samples & 0xFF); - memcpy(page.body + total_samples_byte_offset, b, 5); - } - - /* - * Write min/max framesize - */ - { - const unsigned min_framesize_offset = - FIRST_OGG_PACKET_STREAMINFO_PREFIX_LENGTH + - FLAC__STREAM_METADATA_HEADER_LENGTH + - ( - FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN + - FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN - ) / 8; - - if(min_framesize_offset + 6 > (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - b[0] = (FLAC__byte)((min_framesize >> 16) & 0xFF); - b[1] = (FLAC__byte)((min_framesize >> 8) & 0xFF); - b[2] = (FLAC__byte)(min_framesize & 0xFF); - b[3] = (FLAC__byte)((max_framesize >> 16) & 0xFF); - b[4] = (FLAC__byte)((max_framesize >> 8) & 0xFF); - b[5] = (FLAC__byte)(max_framesize & 0xFF); - memcpy(page.body + min_framesize_offset, b, 6); - } - if(!simple_ogg_page__set_at(encoder, encoder->protected_->streaminfo_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - simple_ogg_page__clear(&page); - - /* - * Write seektable - */ - if(0 != encoder->private_->seek_table && encoder->private_->seek_table->num_points > 0 && encoder->protected_->seektable_offset > 0) { - unsigned i; - FLAC__byte *p; - - FLAC__format_seektable_sort(encoder->private_->seek_table); - - FLAC__ASSERT(FLAC__format_seektable_is_legal(encoder->private_->seek_table)); - - simple_ogg_page__init(&page); - if(!simple_ogg_page__get_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->read_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - - if((FLAC__STREAM_METADATA_HEADER_LENGTH + 18*encoder->private_->seek_table->num_points) != (unsigned)page.body_len) { - encoder->protected_->state = FLAC__STREAM_ENCODER_OGG_ERROR; - simple_ogg_page__clear(&page); - return; - } - - for(i = 0, p = page.body + FLAC__STREAM_METADATA_HEADER_LENGTH; i < encoder->private_->seek_table->num_points; i++, p += 18) { - FLAC__uint64 xx; - unsigned x; - xx = encoder->private_->seek_table->points[i].sample_number; - b[7] = (FLAC__byte)xx; xx >>= 8; - b[6] = (FLAC__byte)xx; xx >>= 8; - b[5] = (FLAC__byte)xx; xx >>= 8; - b[4] = (FLAC__byte)xx; xx >>= 8; - b[3] = (FLAC__byte)xx; xx >>= 8; - b[2] = (FLAC__byte)xx; xx >>= 8; - b[1] = (FLAC__byte)xx; xx >>= 8; - b[0] = (FLAC__byte)xx; xx >>= 8; - xx = encoder->private_->seek_table->points[i].stream_offset; - b[15] = (FLAC__byte)xx; xx >>= 8; - b[14] = (FLAC__byte)xx; xx >>= 8; - b[13] = (FLAC__byte)xx; xx >>= 8; - b[12] = (FLAC__byte)xx; xx >>= 8; - b[11] = (FLAC__byte)xx; xx >>= 8; - b[10] = (FLAC__byte)xx; xx >>= 8; - b[9] = (FLAC__byte)xx; xx >>= 8; - b[8] = (FLAC__byte)xx; xx >>= 8; - x = encoder->private_->seek_table->points[i].frame_samples; - b[17] = (FLAC__byte)x; x >>= 8; - b[16] = (FLAC__byte)x; x >>= 8; - memcpy(p, b, 18); - } - - if(!simple_ogg_page__set_at(encoder, encoder->protected_->seektable_offset, &page, encoder->private_->seek_callback, encoder->private_->write_callback, encoder->private_->client_data)) { - simple_ogg_page__clear(&page); - return; /* state already set */ - } - simple_ogg_page__clear(&page); - } -} -#endif - -FLAC__bool process_frame_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block, FLAC__bool is_last_block) -{ - FLAC__uint16 crc; - FLAC__ASSERT(encoder->protected_->state == FLAC__STREAM_ENCODER_OK); - - /* - * Accumulate raw signal to the MD5 signature - */ - if(encoder->protected_->do_md5 && !FLAC__MD5Accumulate(&encoder->private_->md5context, (const FLAC__int32 * const *)encoder->private_->integer_signal, encoder->protected_->channels, encoder->protected_->blocksize, (encoder->protected_->bits_per_sample+7) / 8)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* - * Process the frame header and subframes into the frame bitbuffer - */ - if(!process_subframes_(encoder, is_fractional_block)) { - /* the above function sets the state for us in case of an error */ - return false; - } - - /* - * Zero-pad the frame to a byte_boundary - */ - if(!FLAC__bitwriter_zero_pad_to_byte_boundary(encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* - * CRC-16 the whole thing - */ - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(encoder->private_->frame)); - if( - !FLAC__bitwriter_get_write_crc16(encoder->private_->frame, &crc) || - !FLAC__bitwriter_write_raw_uint32(encoder->private_->frame, crc, FLAC__FRAME_FOOTER_CRC_LEN) - ) { - encoder->protected_->state = FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR; - return false; - } - - /* - * Write it - */ - if(!write_bitbuffer_(encoder, encoder->protected_->blocksize, is_last_block)) { - /* the above function sets the state for us in case of an error */ - return false; - } - - /* - * Get ready for the next frame - */ - encoder->private_->current_sample_number = 0; - encoder->private_->current_frame_number++; - encoder->private_->streaminfo.data.stream_info.total_samples += (FLAC__uint64)encoder->protected_->blocksize; - - return true; -} - -FLAC__bool process_subframes_(FLAC__StreamEncoder *encoder, FLAC__bool is_fractional_block) -{ - FLAC__FrameHeader frame_header; - unsigned channel, min_partition_order = encoder->protected_->min_residual_partition_order, max_partition_order; - FLAC__bool do_independent, do_mid_side; - - /* - * Calculate the min,max Rice partition orders - */ - if(is_fractional_block) { - max_partition_order = 0; - } - else { - max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize(encoder->protected_->blocksize); - max_partition_order = flac_min(max_partition_order, encoder->protected_->max_residual_partition_order); - } - min_partition_order = flac_min(min_partition_order, max_partition_order); - - /* - * Setup the frame - */ - frame_header.blocksize = encoder->protected_->blocksize; - frame_header.sample_rate = encoder->protected_->sample_rate; - frame_header.channels = encoder->protected_->channels; - frame_header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; /* the default unless the encoder determines otherwise */ - frame_header.bits_per_sample = encoder->protected_->bits_per_sample; - frame_header.number_type = FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER; - frame_header.number.frame_number = encoder->private_->current_frame_number; - - /* - * Figure out what channel assignments to try - */ - if(encoder->protected_->do_mid_side_stereo) { - if(encoder->protected_->loose_mid_side_stereo) { - if(encoder->private_->loose_mid_side_stereo_frame_count == 0) { - do_independent = true; - do_mid_side = true; - } - else { - do_independent = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT); - do_mid_side = !do_independent; - } - } - else { - do_independent = true; - do_mid_side = true; - } - } - else { - do_independent = true; - do_mid_side = false; - } - - FLAC__ASSERT(do_independent || do_mid_side); - - /* - * Check for wasted bits; set effective bps for each subframe - */ - if(do_independent) { - for(channel = 0; channel < encoder->protected_->channels; channel++) { - const unsigned w = get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize); - encoder->private_->subframe_workspace[channel][0].wasted_bits = encoder->private_->subframe_workspace[channel][1].wasted_bits = w; - encoder->private_->subframe_bps[channel] = encoder->protected_->bits_per_sample - w; - } - } - if(do_mid_side) { - FLAC__ASSERT(encoder->protected_->channels == 2); - for(channel = 0; channel < 2; channel++) { - const unsigned w = get_wasted_bits_(encoder->private_->integer_signal_mid_side[channel], encoder->protected_->blocksize); - encoder->private_->subframe_workspace_mid_side[channel][0].wasted_bits = encoder->private_->subframe_workspace_mid_side[channel][1].wasted_bits = w; - encoder->private_->subframe_bps_mid_side[channel] = encoder->protected_->bits_per_sample - w + (channel==0? 0:1); - } - } - - /* - * First do a normal encoding pass of each independent channel - */ - if(do_independent) { - for(channel = 0; channel < encoder->protected_->channels; channel++) { - if(! - process_subframe_( - encoder, - min_partition_order, - max_partition_order, - &frame_header, - encoder->private_->subframe_bps[channel], - encoder->private_->integer_signal[channel], - encoder->private_->subframe_workspace_ptr[channel], - encoder->private_->partitioned_rice_contents_workspace_ptr[channel], - encoder->private_->residual_workspace[channel], - encoder->private_->best_subframe+channel, - encoder->private_->best_subframe_bits+channel - ) - ) - return false; - } - } - - /* - * Now do mid and side channels if requested - */ - if(do_mid_side) { - FLAC__ASSERT(encoder->protected_->channels == 2); - - for(channel = 0; channel < 2; channel++) { - if(! - process_subframe_( - encoder, - min_partition_order, - max_partition_order, - &frame_header, - encoder->private_->subframe_bps_mid_side[channel], - encoder->private_->integer_signal_mid_side[channel], - encoder->private_->subframe_workspace_ptr_mid_side[channel], - encoder->private_->partitioned_rice_contents_workspace_ptr_mid_side[channel], - encoder->private_->residual_workspace_mid_side[channel], - encoder->private_->best_subframe_mid_side+channel, - encoder->private_->best_subframe_bits_mid_side+channel - ) - ) - return false; - } - } - - /* - * Compose the frame bitbuffer - */ - if(do_mid_side) { - unsigned left_bps = 0, right_bps = 0; /* initialized only to prevent superfluous compiler warning */ - FLAC__Subframe *left_subframe = 0, *right_subframe = 0; /* initialized only to prevent superfluous compiler warning */ - FLAC__ChannelAssignment channel_assignment; - - FLAC__ASSERT(encoder->protected_->channels == 2); - - if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0) { - channel_assignment = (encoder->private_->last_channel_assignment == FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT? FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT : FLAC__CHANNEL_ASSIGNMENT_MID_SIDE); - } - else { - unsigned bits[4]; /* WATCHOUT - indexed by FLAC__ChannelAssignment */ - unsigned min_bits; - int ca; - - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT == 0); - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE == 1); - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE == 2); - FLAC__ASSERT(FLAC__CHANNEL_ASSIGNMENT_MID_SIDE == 3); - FLAC__ASSERT(do_independent && do_mid_side); - - /* We have to figure out which channel assignent results in the smallest frame */ - bits[FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT] = encoder->private_->best_subframe_bits [0] + encoder->private_->best_subframe_bits [1]; - bits[FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE ] = encoder->private_->best_subframe_bits [0] + encoder->private_->best_subframe_bits_mid_side[1]; - bits[FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE ] = encoder->private_->best_subframe_bits [1] + encoder->private_->best_subframe_bits_mid_side[1]; - bits[FLAC__CHANNEL_ASSIGNMENT_MID_SIDE ] = encoder->private_->best_subframe_bits_mid_side[0] + encoder->private_->best_subframe_bits_mid_side[1]; - - channel_assignment = FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT; - min_bits = bits[channel_assignment]; - for(ca = 1; ca <= 3; ca++) { - if(bits[ca] < min_bits) { - min_bits = bits[ca]; - channel_assignment = (FLAC__ChannelAssignment)ca; - } - } - } - - frame_header.channel_assignment = channel_assignment; - - if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - - switch(channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - left_subframe = &encoder->private_->subframe_workspace [0][encoder->private_->best_subframe [0]]; - right_subframe = &encoder->private_->subframe_workspace [1][encoder->private_->best_subframe [1]]; - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - left_subframe = &encoder->private_->subframe_workspace [0][encoder->private_->best_subframe [0]]; - right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - left_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; - right_subframe = &encoder->private_->subframe_workspace [1][encoder->private_->best_subframe [1]]; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - left_subframe = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]]; - right_subframe = &encoder->private_->subframe_workspace_mid_side[1][encoder->private_->best_subframe_mid_side[1]]; - break; - default: - FLAC__ASSERT(0); - } - - switch(channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - left_bps = encoder->private_->subframe_bps [0]; - right_bps = encoder->private_->subframe_bps [1]; - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - left_bps = encoder->private_->subframe_bps [0]; - right_bps = encoder->private_->subframe_bps_mid_side[1]; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - left_bps = encoder->private_->subframe_bps_mid_side[1]; - right_bps = encoder->private_->subframe_bps [1]; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - left_bps = encoder->private_->subframe_bps_mid_side[0]; - right_bps = encoder->private_->subframe_bps_mid_side[1]; - break; - default: - FLAC__ASSERT(0); - } - - /* note that encoder_add_subframe_ sets the state for us in case of an error */ - if(!add_subframe_(encoder, frame_header.blocksize, left_bps , left_subframe , encoder->private_->frame)) - return false; - if(!add_subframe_(encoder, frame_header.blocksize, right_bps, right_subframe, encoder->private_->frame)) - return false; - } - else { - if(!FLAC__frame_add_header(&frame_header, encoder->private_->frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - - for(channel = 0; channel < encoder->protected_->channels; channel++) { - if(!add_subframe_(encoder, frame_header.blocksize, encoder->private_->subframe_bps[channel], &encoder->private_->subframe_workspace[channel][encoder->private_->best_subframe[channel]], encoder->private_->frame)) { - /* the above function sets the state for us in case of an error */ - return false; - } - } - } - - if(encoder->protected_->loose_mid_side_stereo) { - encoder->private_->loose_mid_side_stereo_frame_count++; - if(encoder->private_->loose_mid_side_stereo_frame_count >= encoder->private_->loose_mid_side_stereo_frames) - encoder->private_->loose_mid_side_stereo_frame_count = 0; - } - - encoder->private_->last_channel_assignment = frame_header.channel_assignment; - - return true; -} - -FLAC__bool process_subframe_( - FLAC__StreamEncoder *encoder, - unsigned min_partition_order, - unsigned max_partition_order, - const FLAC__FrameHeader *frame_header, - unsigned subframe_bps, - const FLAC__int32 integer_signal[], - FLAC__Subframe *subframe[2], - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents[2], - FLAC__int32 *residual[2], - unsigned *best_subframe, - unsigned *best_bits -) -{ -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__float fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]; -#else - FLAC__fixedpoint fixed_residual_bits_per_sample[FLAC__MAX_FIXED_ORDER+1]; -#endif -#ifndef FLAC__INTEGER_ONLY_LIBRARY - FLAC__double lpc_residual_bits_per_sample; - FLAC__real autoc[FLAC__MAX_LPC_ORDER+1]; /* WATCHOUT: the size is important even though encoder->protected_->max_lpc_order might be less; some asm and x86 intrinsic routines need all the space */ - FLAC__double lpc_error[FLAC__MAX_LPC_ORDER]; - unsigned min_lpc_order, max_lpc_order, lpc_order; - unsigned min_qlp_coeff_precision, max_qlp_coeff_precision, qlp_coeff_precision; -#endif - unsigned min_fixed_order, max_fixed_order, guess_fixed_order, fixed_order; - unsigned rice_parameter; - unsigned _candidate_bits, _best_bits; - unsigned _best_subframe; - /* only use RICE2 partitions if stream bps > 16 */ - const unsigned rice_parameter_limit = FLAC__stream_encoder_get_bits_per_sample(encoder) > 16? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; - - FLAC__ASSERT(frame_header->blocksize > 0); - - /* verbatim subframe is the baseline against which we measure other compressed subframes */ - _best_subframe = 0; - if(encoder->private_->disable_verbatim_subframes && frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) - _best_bits = UINT_MAX; - else - _best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]); - - if(frame_header->blocksize >= FLAC__MAX_FIXED_ORDER) { - unsigned signal_is_constant = false; - guess_fixed_order = encoder->private_->local_fixed_compute_best_predictor(integer_signal+FLAC__MAX_FIXED_ORDER, frame_header->blocksize-FLAC__MAX_FIXED_ORDER, fixed_residual_bits_per_sample); - /* check for constant subframe */ - if( - !encoder->private_->disable_constant_subframes && -#ifndef FLAC__INTEGER_ONLY_LIBRARY - fixed_residual_bits_per_sample[1] == 0.0 -#else - fixed_residual_bits_per_sample[1] == FLAC__FP_ZERO -#endif - ) { - /* the above means it's possible all samples are the same value; now double-check it: */ - unsigned i; - signal_is_constant = true; - for(i = 1; i < frame_header->blocksize; i++) { - if(integer_signal[0] != integer_signal[i]) { - signal_is_constant = false; - break; - } - } - } - if(signal_is_constant) { - _candidate_bits = evaluate_constant_subframe_(encoder, integer_signal[0], frame_header->blocksize, subframe_bps, subframe[!_best_subframe]); - if(_candidate_bits < _best_bits) { - _best_subframe = !_best_subframe; - _best_bits = _candidate_bits; - } - } - else { - if(!encoder->private_->disable_fixed_subframes || (encoder->protected_->max_lpc_order == 0 && _best_bits == UINT_MAX)) { - /* encode fixed */ - if(encoder->protected_->do_exhaustive_model_search) { - min_fixed_order = 0; - max_fixed_order = FLAC__MAX_FIXED_ORDER; - } - else { - min_fixed_order = max_fixed_order = guess_fixed_order; - } - if(max_fixed_order >= frame_header->blocksize) - max_fixed_order = frame_header->blocksize - 1; - for(fixed_order = min_fixed_order; fixed_order <= max_fixed_order; fixed_order++) { -#ifndef FLAC__INTEGER_ONLY_LIBRARY - if(fixed_residual_bits_per_sample[fixed_order] >= (FLAC__float)subframe_bps) - continue; /* don't even try */ - rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > 0.0)? (unsigned)(fixed_residual_bits_per_sample[fixed_order]+0.5) : 0; /* 0.5 is for rounding */ -#else - if(FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]) >= (int)subframe_bps) - continue; /* don't even try */ - rice_parameter = (fixed_residual_bits_per_sample[fixed_order] > FLAC__FP_ZERO)? (unsigned)FLAC__fixedpoint_trunc(fixed_residual_bits_per_sample[fixed_order]+FLAC__FP_ONE_HALF) : 0; /* 0.5 is for rounding */ -#endif - rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ - if(rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @0\n", rice_parameter, rice_parameter_limit - 1); -#endif - rice_parameter = rice_parameter_limit - 1; - } - _candidate_bits = - evaluate_fixed_subframe_( - encoder, - integer_signal, - residual[!_best_subframe], - encoder->private_->abs_residual_partition_sums, - encoder->private_->raw_bits_per_partition, - frame_header->blocksize, - subframe_bps, - fixed_order, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - encoder->protected_->do_escape_coding, - encoder->protected_->rice_parameter_search_dist, - subframe[!_best_subframe], - partitioned_rice_contents[!_best_subframe] - ); - if(_candidate_bits < _best_bits) { - _best_subframe = !_best_subframe; - _best_bits = _candidate_bits; - } - } - } - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - /* encode lpc */ - if(encoder->protected_->max_lpc_order > 0) { - if(encoder->protected_->max_lpc_order >= frame_header->blocksize) - max_lpc_order = frame_header->blocksize-1; - else - max_lpc_order = encoder->protected_->max_lpc_order; - if(max_lpc_order > 0) { - unsigned a; - for (a = 0; a < encoder->protected_->num_apodizations; a++) { - FLAC__lpc_window_data(integer_signal, encoder->private_->window[a], encoder->private_->windowed_signal, frame_header->blocksize); - encoder->private_->local_lpc_compute_autocorrelation(encoder->private_->windowed_signal, frame_header->blocksize, max_lpc_order+1, autoc); - /* if autoc[0] == 0.0, the signal is constant and we usually won't get here, but it can happen */ - if(autoc[0] != 0.0) { - FLAC__lpc_compute_lp_coefficients(autoc, &max_lpc_order, encoder->private_->lp_coeff, lpc_error); - if(encoder->protected_->do_exhaustive_model_search) { - min_lpc_order = 1; - } - else { - const unsigned guess_lpc_order = - FLAC__lpc_compute_best_order( - lpc_error, - max_lpc_order, - frame_header->blocksize, - subframe_bps + ( - encoder->protected_->do_qlp_coeff_prec_search? - FLAC__MIN_QLP_COEFF_PRECISION : /* have to guess; use the min possible size to avoid accidentally favoring lower orders */ - encoder->protected_->qlp_coeff_precision - ) - ); - min_lpc_order = max_lpc_order = guess_lpc_order; - } - if(max_lpc_order >= frame_header->blocksize) - max_lpc_order = frame_header->blocksize - 1; - for(lpc_order = min_lpc_order; lpc_order <= max_lpc_order; lpc_order++) { - lpc_residual_bits_per_sample = FLAC__lpc_compute_expected_bits_per_residual_sample(lpc_error[lpc_order-1], frame_header->blocksize-lpc_order); - if(lpc_residual_bits_per_sample >= (FLAC__double)subframe_bps) - continue; /* don't even try */ - rice_parameter = (lpc_residual_bits_per_sample > 0.0)? (unsigned)(lpc_residual_bits_per_sample+0.5) : 0; /* 0.5 is for rounding */ - rice_parameter++; /* to account for the signed->unsigned conversion during rice coding */ - if(rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @1\n", rice_parameter, rice_parameter_limit - 1); -#endif - rice_parameter = rice_parameter_limit - 1; - } - if(encoder->protected_->do_qlp_coeff_prec_search) { - min_qlp_coeff_precision = FLAC__MIN_QLP_COEFF_PRECISION; - /* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */ - if(subframe_bps <= 16) { - max_qlp_coeff_precision = flac_min(32 - subframe_bps - FLAC__bitmath_ilog2(lpc_order), FLAC__MAX_QLP_COEFF_PRECISION); - max_qlp_coeff_precision = flac_max(max_qlp_coeff_precision, min_qlp_coeff_precision); - } - else - max_qlp_coeff_precision = FLAC__MAX_QLP_COEFF_PRECISION; - } - else { - min_qlp_coeff_precision = max_qlp_coeff_precision = encoder->protected_->qlp_coeff_precision; - } - for(qlp_coeff_precision = min_qlp_coeff_precision; qlp_coeff_precision <= max_qlp_coeff_precision; qlp_coeff_precision++) { - _candidate_bits = - evaluate_lpc_subframe_( - encoder, - integer_signal, - residual[!_best_subframe], - encoder->private_->abs_residual_partition_sums, - encoder->private_->raw_bits_per_partition, - encoder->private_->lp_coeff[lpc_order-1], - frame_header->blocksize, - subframe_bps, - lpc_order, - qlp_coeff_precision, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - encoder->protected_->do_escape_coding, - encoder->protected_->rice_parameter_search_dist, - subframe[!_best_subframe], - partitioned_rice_contents[!_best_subframe] - ); - if(_candidate_bits > 0) { /* if == 0, there was a problem quantizing the lpcoeffs */ - if(_candidate_bits < _best_bits) { - _best_subframe = !_best_subframe; - _best_bits = _candidate_bits; - } - } - } - } - } - } - } - } -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ - } - } - - /* under rare circumstances this can happen when all but lpc subframe types are disabled: */ - if(_best_bits == UINT_MAX) { - FLAC__ASSERT(_best_subframe == 0); - _best_bits = evaluate_verbatim_subframe_(encoder, integer_signal, frame_header->blocksize, subframe_bps, subframe[_best_subframe]); - } - - *best_subframe = _best_subframe; - *best_bits = _best_bits; - - return true; -} - -FLAC__bool add_subframe_( - FLAC__StreamEncoder *encoder, - unsigned blocksize, - unsigned subframe_bps, - const FLAC__Subframe *subframe, - FLAC__BitWriter *frame -) -{ - switch(subframe->type) { - case FLAC__SUBFRAME_TYPE_CONSTANT: - if(!FLAC__subframe_add_constant(&(subframe->data.constant), subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - case FLAC__SUBFRAME_TYPE_FIXED: - if(!FLAC__subframe_add_fixed(&(subframe->data.fixed), blocksize - subframe->data.fixed.order, subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - case FLAC__SUBFRAME_TYPE_LPC: - if(!FLAC__subframe_add_lpc(&(subframe->data.lpc), blocksize - subframe->data.lpc.order, subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - case FLAC__SUBFRAME_TYPE_VERBATIM: - if(!FLAC__subframe_add_verbatim(&(subframe->data.verbatim), blocksize, subframe_bps, subframe->wasted_bits, frame)) { - encoder->protected_->state = FLAC__STREAM_ENCODER_FRAMING_ERROR; - return false; - } - break; - default: - FLAC__ASSERT(0); - } - - return true; -} - -#define SPOTCHECK_ESTIMATE 0 -#if SPOTCHECK_ESTIMATE -static void spotcheck_subframe_estimate_( - FLAC__StreamEncoder *encoder, - unsigned blocksize, - unsigned subframe_bps, - const FLAC__Subframe *subframe, - unsigned estimate -) -{ - FLAC__bool ret; - FLAC__BitWriter *frame = FLAC__bitwriter_new(); - if(frame == 0) { - fprintf(stderr, "EST: can't allocate frame\n"); - return; - } - if(!FLAC__bitwriter_init(frame)) { - fprintf(stderr, "EST: can't init frame\n"); - return; - } - ret = add_subframe_(encoder, blocksize, subframe_bps, subframe, frame); - FLAC__ASSERT(ret); - { - const unsigned actual = FLAC__bitwriter_get_input_bits_unconsumed(frame); - if(estimate != actual) - fprintf(stderr, "EST: bad, frame#%u sub#%%d type=%8s est=%u, actual=%u, delta=%d\n", encoder->private_->current_frame_number, FLAC__SubframeTypeString[subframe->type], estimate, actual, (int)actual-(int)estimate); - } - FLAC__bitwriter_delete(frame); -} -#endif - -unsigned evaluate_constant_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal, - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -) -{ - unsigned estimate; - subframe->type = FLAC__SUBFRAME_TYPE_CONSTANT; - subframe->data.constant.value = signal; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + subframe_bps; - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#else - (void)encoder, (void)blocksize; -#endif - - return estimate; -} - -unsigned evaluate_fixed_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -) -{ - unsigned i, residual_bits, estimate; - const unsigned residual_samples = blocksize - order; - - FLAC__fixed_compute_residual(signal+order, residual_samples, order, residual); - - subframe->type = FLAC__SUBFRAME_TYPE_FIXED; - - subframe->data.fixed.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE; - subframe->data.fixed.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents; - subframe->data.fixed.residual = residual; - - residual_bits = - find_best_partition_order_( - encoder->private_, - residual, - abs_residual_partition_sums, - raw_bits_per_partition, - residual_samples, - order, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - subframe_bps, - do_escape_coding, - rice_parameter_search_dist, - &subframe->data.fixed.entropy_coding_method - ); - - subframe->data.fixed.order = order; - for(i = 0; i < order; i++) - subframe->data.fixed.warmup[i] = signal[i]; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (order * subframe_bps) + residual_bits; - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#endif - - return estimate; -} - -#ifndef FLAC__INTEGER_ONLY_LIBRARY -unsigned evaluate_lpc_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - const FLAC__real lp_coeff[], - unsigned blocksize, - unsigned subframe_bps, - unsigned order, - unsigned qlp_coeff_precision, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__Subframe *subframe, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents -) -{ - FLAC__int32 qlp_coeff[FLAC__MAX_LPC_ORDER]; /* WATCHOUT: the size is important; some x86 intrinsic routines need more than lpc order elements */ - unsigned i, residual_bits, estimate; - int quantization, ret; - const unsigned residual_samples = blocksize - order; - - /* try to keep qlp coeff precision such that only 32-bit math is required for decode of <=16bps streams */ - if(subframe_bps <= 16) { - FLAC__ASSERT(order > 0); - FLAC__ASSERT(order <= FLAC__MAX_LPC_ORDER); - qlp_coeff_precision = flac_min(qlp_coeff_precision, 32 - subframe_bps - FLAC__bitmath_ilog2(order)); - } - - ret = FLAC__lpc_quantize_coefficients(lp_coeff, order, qlp_coeff_precision, qlp_coeff, &quantization); - if(ret != 0) - return 0; /* this is a hack to indicate to the caller that we can't do lp at this order on this subframe */ - - if(subframe_bps + qlp_coeff_precision + FLAC__bitmath_ilog2(order) <= 32) - if(subframe_bps <= 16 && qlp_coeff_precision <= 16) - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_16bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual); - else - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients(signal+order, residual_samples, qlp_coeff, order, quantization, residual); - else - encoder->private_->local_lpc_compute_residual_from_qlp_coefficients_64bit(signal+order, residual_samples, qlp_coeff, order, quantization, residual); - - subframe->type = FLAC__SUBFRAME_TYPE_LPC; - - subframe->data.lpc.entropy_coding_method.type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE; - subframe->data.lpc.entropy_coding_method.data.partitioned_rice.contents = partitioned_rice_contents; - subframe->data.lpc.residual = residual; - - residual_bits = - find_best_partition_order_( - encoder->private_, - residual, - abs_residual_partition_sums, - raw_bits_per_partition, - residual_samples, - order, - rice_parameter, - rice_parameter_limit, - min_partition_order, - max_partition_order, - subframe_bps, - do_escape_coding, - rice_parameter_search_dist, - &subframe->data.lpc.entropy_coding_method - ); - - subframe->data.lpc.order = order; - subframe->data.lpc.qlp_coeff_precision = qlp_coeff_precision; - subframe->data.lpc.quantization_level = quantization; - memcpy(subframe->data.lpc.qlp_coeff, qlp_coeff, sizeof(FLAC__int32)*FLAC__MAX_LPC_ORDER); - for(i = 0; i < order; i++) - subframe->data.lpc.warmup[i] = signal[i]; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN + FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN + (order * (qlp_coeff_precision + subframe_bps)) + residual_bits; - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#endif - - return estimate; -} -#endif - -unsigned evaluate_verbatim_subframe_( - FLAC__StreamEncoder *encoder, - const FLAC__int32 signal[], - unsigned blocksize, - unsigned subframe_bps, - FLAC__Subframe *subframe -) -{ - unsigned estimate; - - subframe->type = FLAC__SUBFRAME_TYPE_VERBATIM; - - subframe->data.verbatim.data = signal; - - estimate = FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN + subframe->wasted_bits + (blocksize * subframe_bps); - -#if SPOTCHECK_ESTIMATE - spotcheck_subframe_estimate_(encoder, blocksize, subframe_bps, subframe, estimate); -#else - (void)encoder; -#endif - - return estimate; -} - -unsigned find_best_partition_order_( - FLAC__StreamEncoderPrivate *private_, - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned rice_parameter, - unsigned rice_parameter_limit, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps, - FLAC__bool do_escape_coding, - unsigned rice_parameter_search_dist, - FLAC__EntropyCodingMethod *best_ecm -) -{ - unsigned residual_bits, best_residual_bits = 0; - unsigned best_parameters_index = 0; - unsigned best_partition_order = 0; - const unsigned blocksize = residual_samples + predictor_order; - - max_partition_order = FLAC__format_get_max_rice_partition_order_from_blocksize_limited_max_and_predictor_order(max_partition_order, blocksize, predictor_order); - min_partition_order = flac_min(min_partition_order, max_partition_order); - - private_->local_precompute_partition_info_sums(residual, abs_residual_partition_sums, residual_samples, predictor_order, min_partition_order, max_partition_order, bps); - - if(do_escape_coding) - precompute_partition_info_escapes_(residual, raw_bits_per_partition, residual_samples, predictor_order, min_partition_order, max_partition_order); - - { - int partition_order; - unsigned sum; - - for(partition_order = (int)max_partition_order, sum = 0; partition_order >= (int)min_partition_order; partition_order--) { - if(! - set_partitioned_rice_( -#ifdef EXACT_RICE_BITS_CALCULATION - residual, -#endif - abs_residual_partition_sums+sum, - raw_bits_per_partition+sum, - residual_samples, - predictor_order, - rice_parameter, - rice_parameter_limit, - rice_parameter_search_dist, - (unsigned)partition_order, - do_escape_coding, - &private_->partitioned_rice_contents_extra[!best_parameters_index], - &residual_bits - ) - ) - { - FLAC__ASSERT(best_residual_bits != 0); - break; - } - sum += 1u << partition_order; - if(best_residual_bits == 0 || residual_bits < best_residual_bits) { - best_residual_bits = residual_bits; - best_parameters_index = !best_parameters_index; - best_partition_order = partition_order; - } - } - } - - best_ecm->data.partitioned_rice.order = best_partition_order; - - { - /* - * We are allowed to de-const the pointer based on our special - * knowledge; it is const to the outside world. - */ - FLAC__EntropyCodingMethod_PartitionedRiceContents* prc = (FLAC__EntropyCodingMethod_PartitionedRiceContents*)best_ecm->data.partitioned_rice.contents; - unsigned partition; - - /* save best parameters and raw_bits */ - FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(prc, flac_max(6u, best_partition_order)); - memcpy(prc->parameters, private_->partitioned_rice_contents_extra[best_parameters_index].parameters, sizeof(unsigned)*(1<<(best_partition_order))); - if(do_escape_coding) - memcpy(prc->raw_bits, private_->partitioned_rice_contents_extra[best_parameters_index].raw_bits, sizeof(unsigned)*(1<<(best_partition_order))); - /* - * Now need to check if the type should be changed to - * FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 based on the - * size of the rice parameters. - */ - for(partition = 0; partition < (1u<parameters[partition] >= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER) { - best_ecm->type = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2; - break; - } - } - } - - return best_residual_bits; -} - -void precompute_partition_info_sums_( - const FLAC__int32 residual[], - FLAC__uint64 abs_residual_partition_sums[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order, - unsigned bps -) -{ - const unsigned default_partition_samples = (residual_samples + predictor_order) >> max_partition_order; - unsigned partitions = 1u << max_partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - - /* first do max_partition_order */ - { - unsigned partition, residual_sample, end = (unsigned)(-(int)predictor_order); - /* WATCHOUT: "+ bps + FLAC__MAX_EXTRA_RESIDUAL_BPS" is the maximum - * assumed size of the average residual magnitude */ - if(FLAC__bitmath_ilog2(default_partition_samples) + bps + FLAC__MAX_EXTRA_RESIDUAL_BPS < 32) { - FLAC__uint32 abs_residual_partition_sum; - - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - abs_residual_partition_sum = 0; - for( ; residual_sample < end; residual_sample++) - abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ - abs_residual_partition_sums[partition] = abs_residual_partition_sum; - } - } - else { /* have to pessimistically use 64 bits for accumulator */ - FLAC__uint64 abs_residual_partition_sum; - - for(partition = residual_sample = 0; partition < partitions; partition++) { - end += default_partition_samples; - abs_residual_partition_sum = 0; - for( ; residual_sample < end; residual_sample++) - abs_residual_partition_sum += abs(residual[residual_sample]); /* abs(INT_MIN) is undefined, but if the residual is INT_MIN we have bigger problems */ - abs_residual_partition_sums[partition] = abs_residual_partition_sum; - } - } - } - - /* now merge partitions for lower orders */ - { - unsigned from_partition = 0, to_partition = partitions; - int partition_order; - for(partition_order = (int)max_partition_order - 1; partition_order >= (int)min_partition_order; partition_order--) { - unsigned i; - partitions >>= 1; - for(i = 0; i < partitions; i++) { - abs_residual_partition_sums[to_partition++] = - abs_residual_partition_sums[from_partition ] + - abs_residual_partition_sums[from_partition+1]; - from_partition += 2; - } - } - } -} - -void precompute_partition_info_escapes_( - const FLAC__int32 residual[], - unsigned raw_bits_per_partition[], - unsigned residual_samples, - unsigned predictor_order, - unsigned min_partition_order, - unsigned max_partition_order -) -{ - int partition_order; - unsigned from_partition, to_partition = 0; - const unsigned blocksize = residual_samples + predictor_order; - - /* first do max_partition_order */ - for(partition_order = (int)max_partition_order; partition_order >= 0; partition_order--) { - FLAC__int32 r; - FLAC__uint32 rmax; - unsigned partition, partition_sample, partition_samples, residual_sample; - const unsigned partitions = 1u << partition_order; - const unsigned default_partition_samples = blocksize >> partition_order; - - FLAC__ASSERT(default_partition_samples > predictor_order); - - for(partition = residual_sample = 0; partition < partitions; partition++) { - partition_samples = default_partition_samples; - if(partition == 0) - partition_samples -= predictor_order; - rmax = 0; - for(partition_sample = 0; partition_sample < partition_samples; partition_sample++) { - r = residual[residual_sample++]; - /* OPT: maybe faster: rmax |= r ^ (r>>31) */ - if(r < 0) - rmax |= ~r; - else - rmax |= r; - } - /* now we know all residual values are in the range [-rmax-1,rmax] */ - raw_bits_per_partition[partition] = rmax? FLAC__bitmath_ilog2(rmax) + 2 : 1; - } - to_partition = partitions; - break; /*@@@ yuck, should remove the 'for' loop instead */ - } - - /* now merge partitions for lower orders */ - for(from_partition = 0, --partition_order; partition_order >= (int)min_partition_order; partition_order--) { - unsigned m; - unsigned i; - const unsigned partitions = 1u << partition_order; - for(i = 0; i < partitions; i++) { - m = raw_bits_per_partition[from_partition]; - from_partition++; - raw_bits_per_partition[to_partition] = flac_max(m, raw_bits_per_partition[from_partition]); - from_partition++; - to_partition++; - } - } -} - -#ifdef EXACT_RICE_BITS_CALCULATION -static inline unsigned count_rice_bits_in_partition_( - const unsigned rice_parameter, - const unsigned partition_samples, - const FLAC__int32 *residual -) -{ - unsigned i, partition_bits = - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */ - (1+rice_parameter) * partition_samples /* 1 for unary stop bit + rice_parameter for the binary portion */ - ; - for(i = 0; i < partition_samples; i++) - partition_bits += ( (FLAC__uint32)((residual[i]<<1)^(residual[i]>>31)) >> rice_parameter ); - return partition_bits; -} -#else -static inline unsigned count_rice_bits_in_partition_( - const unsigned rice_parameter, - const unsigned partition_samples, - const FLAC__uint64 abs_residual_partition_sum -) -{ - return - FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN + /* actually could end up being FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN but err on side of 16bps */ - (1+rice_parameter) * partition_samples + /* 1 for unary stop bit + rice_parameter for the binary portion */ - ( - rice_parameter? - (unsigned)(abs_residual_partition_sum >> (rice_parameter-1)) /* rice_parameter-1 because the real coder sign-folds instead of using a sign bit */ - : (unsigned)(abs_residual_partition_sum << 1) /* can't shift by negative number, so reverse */ - ) - - (partition_samples >> 1) - /* -(partition_samples>>1) to subtract out extra contributions to the abs_residual_partition_sum. - * The actual number of bits used is closer to the sum(for all i in the partition) of abs(residual[i])>>(rice_parameter-1) - * By using the abs_residual_partition sum, we also add in bits in the LSBs that would normally be shifted out. - * So the subtraction term tries to guess how many extra bits were contributed. - * If the LSBs are randomly distributed, this should average to 0.5 extra bits per sample. - */ - ; -} -#endif - -FLAC__bool set_partitioned_rice_( -#ifdef EXACT_RICE_BITS_CALCULATION - const FLAC__int32 residual[], -#endif - const FLAC__uint64 abs_residual_partition_sums[], - const unsigned raw_bits_per_partition[], - const unsigned residual_samples, - const unsigned predictor_order, - const unsigned suggested_rice_parameter, - const unsigned rice_parameter_limit, - const unsigned rice_parameter_search_dist, - const unsigned partition_order, - const FLAC__bool search_for_escapes, - FLAC__EntropyCodingMethod_PartitionedRiceContents *partitioned_rice_contents, - unsigned *bits -) -{ - unsigned rice_parameter, partition_bits; - unsigned best_partition_bits, best_rice_parameter = 0; - unsigned bits_ = FLAC__ENTROPY_CODING_METHOD_TYPE_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN; - unsigned *parameters, *raw_bits; -#ifdef ENABLE_RICE_PARAMETER_SEARCH - unsigned min_rice_parameter, max_rice_parameter; -#else - (void)rice_parameter_search_dist; -#endif - - FLAC__ASSERT(suggested_rice_parameter < FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER); - FLAC__ASSERT(rice_parameter_limit <= FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER); - - FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size(partitioned_rice_contents, flac_max(6u, partition_order)); - parameters = partitioned_rice_contents->parameters; - raw_bits = partitioned_rice_contents->raw_bits; - - if(partition_order == 0) { - best_partition_bits = (unsigned)(-1); -#ifdef ENABLE_RICE_PARAMETER_SEARCH - if(rice_parameter_search_dist) { - if(suggested_rice_parameter < rice_parameter_search_dist) - min_rice_parameter = 0; - else - min_rice_parameter = suggested_rice_parameter - rice_parameter_search_dist; - max_rice_parameter = suggested_rice_parameter + rice_parameter_search_dist; - if(max_rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @5\n", max_rice_parameter, rice_parameter_limit - 1); -#endif - max_rice_parameter = rice_parameter_limit - 1; - } - } - else - min_rice_parameter = max_rice_parameter = suggested_rice_parameter; - - for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) { -#else - rice_parameter = suggested_rice_parameter; -#endif -#ifdef EXACT_RICE_BITS_CALCULATION - partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, residual); -#else - partition_bits = count_rice_bits_in_partition_(rice_parameter, residual_samples, abs_residual_partition_sums[0]); -#endif - if(partition_bits < best_partition_bits) { - best_rice_parameter = rice_parameter; - best_partition_bits = partition_bits; - } -#ifdef ENABLE_RICE_PARAMETER_SEARCH - } -#endif - if(search_for_escapes) { - partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[0] * residual_samples; - if(partition_bits <= best_partition_bits) { - raw_bits[0] = raw_bits_per_partition[0]; - best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */ - best_partition_bits = partition_bits; - } - else - raw_bits[0] = 0; - } - parameters[0] = best_rice_parameter; - bits_ += best_partition_bits; - } - else { - unsigned partition, residual_sample; - unsigned partition_samples; - FLAC__uint64 mean, k; - const unsigned partitions = 1u << partition_order; - for(partition = residual_sample = 0; partition < partitions; partition++) { - partition_samples = (residual_samples+predictor_order) >> partition_order; - if(partition == 0) { - if(partition_samples <= predictor_order) - return false; - else - partition_samples -= predictor_order; - } - mean = abs_residual_partition_sums[partition]; - /* we are basically calculating the size in bits of the - * average residual magnitude in the partition: - * rice_parameter = floor(log2(mean/partition_samples)) - * 'mean' is not a good name for the variable, it is - * actually the sum of magnitudes of all residual values - * in the partition, so the actual mean is - * mean/partition_samples - */ -#if 0 /* old simple code */ - for(rice_parameter = 0, k = partition_samples; k < mean; rice_parameter++, k <<= 1) - ; -#else -#if defined FLAC__CPU_X86_64 /* and other 64-bit arch, too */ - if(mean <= 0x80000000/512) { /* 512: more or less optimal for both 16- and 24-bit input */ -#else - if(mean <= 0x80000000/8) { /* 32-bit arch: use 32-bit math if possible */ -#endif - FLAC__uint32 k2, mean2 = (FLAC__uint32) mean; - rice_parameter = 0; k2 = partition_samples; - while(k2*8 < mean2) { /* requires: mean <= (2^31)/8 */ - rice_parameter += 4; k2 <<= 4; /* tuned for 16-bit input */ - } - while(k2 < mean2) { /* requires: mean <= 2^31 */ - rice_parameter++; k2 <<= 1; - } - } - else { - rice_parameter = 0; k = partition_samples; - if(mean <= FLAC__U64L(0x8000000000000000)/128) /* usually mean is _much_ smaller than this value */ - while(k*128 < mean) { /* requires: mean <= (2^63)/128 */ - rice_parameter += 8; k <<= 8; /* tuned for 24-bit input */ - } - while(k < mean) { /* requires: mean <= 2^63 */ - rice_parameter++; k <<= 1; - } - } -#endif - if(rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @6\n", rice_parameter, rice_parameter_limit - 1); -#endif - rice_parameter = rice_parameter_limit - 1; - } - - best_partition_bits = (unsigned)(-1); -#ifdef ENABLE_RICE_PARAMETER_SEARCH - if(rice_parameter_search_dist) { - if(rice_parameter < rice_parameter_search_dist) - min_rice_parameter = 0; - else - min_rice_parameter = rice_parameter - rice_parameter_search_dist; - max_rice_parameter = rice_parameter + rice_parameter_search_dist; - if(max_rice_parameter >= rice_parameter_limit) { -#ifdef DEBUG_VERBOSE - fprintf(stderr, "clipping rice_parameter (%u -> %u) @7\n", max_rice_parameter, rice_parameter_limit - 1); -#endif - max_rice_parameter = rice_parameter_limit - 1; - } - } - else - min_rice_parameter = max_rice_parameter = rice_parameter; - - for(rice_parameter = min_rice_parameter; rice_parameter <= max_rice_parameter; rice_parameter++) { -#endif -#ifdef EXACT_RICE_BITS_CALCULATION - partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, residual+residual_sample); -#else - partition_bits = count_rice_bits_in_partition_(rice_parameter, partition_samples, abs_residual_partition_sums[partition]); -#endif - if(partition_bits < best_partition_bits) { - best_rice_parameter = rice_parameter; - best_partition_bits = partition_bits; - } -#ifdef ENABLE_RICE_PARAMETER_SEARCH - } -#endif - if(search_for_escapes) { - partition_bits = FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN + FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN + raw_bits_per_partition[partition] * partition_samples; - if(partition_bits <= best_partition_bits) { - raw_bits[partition] = raw_bits_per_partition[partition]; - best_rice_parameter = 0; /* will be converted to appropriate escape parameter later */ - best_partition_bits = partition_bits; - } - else - raw_bits[partition] = 0; - } - parameters[partition] = best_rice_parameter; - bits_ += best_partition_bits; - residual_sample += partition_samples; - } - } - - *bits = bits_; - return true; -} - -unsigned get_wasted_bits_(FLAC__int32 signal[], unsigned samples) -{ - unsigned i, shift; - FLAC__int32 x = 0; - - for(i = 0; i < samples && !(x&1); i++) - x |= signal[i]; - - if(x == 0) { - shift = 0; - } - else { - for(shift = 0; !(x&1); shift++) - x >>= 1; - } - - if(shift > 0) { - for(i = 0; i < samples; i++) - signal[i] >>= shift; - } - - return shift; -} - -void append_to_verify_fifo_(verify_input_fifo *fifo, const FLAC__int32 * const input[], unsigned input_offset, unsigned channels, unsigned wide_samples) -{ - unsigned channel; - - for(channel = 0; channel < channels; channel++) - memcpy(&fifo->data[channel][fifo->tail], &input[channel][input_offset], sizeof(FLAC__int32) * wide_samples); - - fifo->tail += wide_samples; - - FLAC__ASSERT(fifo->tail <= fifo->size); -} - -void append_to_verify_fifo_interleaved_(verify_input_fifo *fifo, const FLAC__int32 input[], unsigned input_offset, unsigned channels, unsigned wide_samples) -{ - unsigned channel; - unsigned sample, wide_sample; - unsigned tail = fifo->tail; - - sample = input_offset * channels; - for(wide_sample = 0; wide_sample < wide_samples; wide_sample++) { - for(channel = 0; channel < channels; channel++) - fifo->data[channel][tail] = input[sample++]; - tail++; - } - fifo->tail = tail; - - FLAC__ASSERT(fifo->tail <= fifo->size); -} - -FLAC__StreamDecoderReadStatus verify_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data; - const size_t encoded_bytes = encoder->private_->verify.output.bytes; - (void)decoder; - - if(encoder->private_->verify.needs_magic_hack) { - FLAC__ASSERT(*bytes >= FLAC__STREAM_SYNC_LENGTH); - *bytes = FLAC__STREAM_SYNC_LENGTH; - memcpy(buffer, FLAC__STREAM_SYNC_STRING, *bytes); - encoder->private_->verify.needs_magic_hack = false; - } - else { - if(encoded_bytes == 0) { - /* - * If we get here, a FIFO underflow has occurred, - * which means there is a bug somewhere. - */ - FLAC__ASSERT(0); - return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - } - else if(encoded_bytes < *bytes) - *bytes = encoded_bytes; - memcpy(buffer, encoder->private_->verify.output.data, *bytes); - encoder->private_->verify.output.data += *bytes; - encoder->private_->verify.output.bytes -= *bytes; - } - - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; -} - -FLAC__StreamDecoderWriteStatus verify_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) -{ - FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder *)client_data; - unsigned channel; - const unsigned channels = frame->header.channels; - const unsigned blocksize = frame->header.blocksize; - const unsigned bytes_per_block = sizeof(FLAC__int32) * blocksize; - - (void)decoder; - - for(channel = 0; channel < channels; channel++) { - if(0 != memcmp(buffer[channel], encoder->private_->verify.input_fifo.data[channel], bytes_per_block)) { - unsigned i, sample = 0; - FLAC__int32 expect = 0, got = 0; - - for(i = 0; i < blocksize; i++) { - if(buffer[channel][i] != encoder->private_->verify.input_fifo.data[channel][i]) { - sample = i; - expect = (FLAC__int32)encoder->private_->verify.input_fifo.data[channel][i]; - got = (FLAC__int32)buffer[channel][i]; - break; - } - } - FLAC__ASSERT(i < blocksize); - FLAC__ASSERT(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER); - encoder->private_->verify.error_stats.absolute_sample = frame->header.number.sample_number + sample; - encoder->private_->verify.error_stats.frame_number = (unsigned)(frame->header.number.sample_number / blocksize); - encoder->private_->verify.error_stats.channel = channel; - encoder->private_->verify.error_stats.sample = sample; - encoder->private_->verify.error_stats.expected = expect; - encoder->private_->verify.error_stats.got = got; - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA; - return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT; - } - } - /* dequeue the frame from the fifo */ - encoder->private_->verify.input_fifo.tail -= blocksize; - FLAC__ASSERT(encoder->private_->verify.input_fifo.tail <= OVERREAD_); - for(channel = 0; channel < channels; channel++) - memmove(&encoder->private_->verify.input_fifo.data[channel][0], &encoder->private_->verify.input_fifo.data[channel][blocksize], encoder->private_->verify.input_fifo.tail * sizeof(encoder->private_->verify.input_fifo.data[0][0])); - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; -} - -void verify_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) -{ - (void)decoder, (void)metadata, (void)client_data; -} - -void verify_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) -{ - FLAC__StreamEncoder *encoder = (FLAC__StreamEncoder*)client_data; - (void)decoder, (void)status; - encoder->protected_->state = FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR; -} - -#if 0 -FLAC__StreamEncoderReadStatus file_read_callback_(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) -{ - (void)client_data; - - *bytes = fread(buffer, 1, *bytes, encoder->private_->file); - if (*bytes == 0) { - if (feof(encoder->private_->file)) - return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM; - else if (ferror(encoder->private_->file)) - return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; - } - return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE; -} - -FLAC__StreamEncoderSeekStatus file_seek_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) -{ - (void)client_data; - - if(fseeko(encoder->private_->file, (FLAC__off_t)absolute_byte_offset, SEEK_SET) < 0) - return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; - else - return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; -} - -FLAC__StreamEncoderTellStatus file_tell_callback_(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) -{ - FLAC__off_t offset; - - (void)client_data; - - offset = ftello(encoder->private_->file); - - if(offset < 0) { - return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; - } - else { - *absolute_byte_offset = (FLAC__uint64)offset; - return FLAC__STREAM_ENCODER_TELL_STATUS_OK; - } -} - -#ifdef FLAC__VALGRIND_TESTING -static size_t local__fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) -{ - size_t ret = fwrite(ptr, size, nmemb, stream); - if(!ferror(stream)) - fflush(stream); - return ret; -} -#else -#define local__fwrite fwrite -#endif - -FLAC__StreamEncoderWriteStatus file_write_callback_(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data) -{ - (void)client_data, (void)current_frame; - - if(local__fwrite(buffer, sizeof(FLAC__byte), bytes, encoder->private_->file) == bytes) { - FLAC__bool call_it = 0 != encoder->private_->progress_callback && ( -#if FLAC__HAS_OGG - /* We would like to be able to use 'samples > 0' in the - * clause here but currently because of the nature of our - * Ogg writing implementation, 'samples' is always 0 (see - * ogg_encoder_aspect.c). The downside is extra progress - * callbacks. - */ - encoder->private_->is_ogg? true : -#endif - samples > 0 - ); - if(call_it) { - /* NOTE: We have to add +bytes, +samples, and +1 to the stats - * because at this point in the callback chain, the stats - * have not been updated. Only after we return and control - * gets back to write_frame_() are the stats updated - */ - encoder->private_->progress_callback(encoder, encoder->private_->bytes_written+bytes, encoder->private_->samples_written+samples, encoder->private_->frames_written+(samples?1:0), encoder->private_->total_frames_estimate, encoder->private_->client_data); - } - return FLAC__STREAM_ENCODER_WRITE_STATUS_OK; - } - else - return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; -} - -/* - * This will forcibly set stdout to binary mode (for OSes that require it) - */ -FILE *get_binary_stdout_(void) -{ - /* if something breaks here it is probably due to the presence or - * absence of an underscore before the identifiers 'setmode', - * 'fileno', and/or 'O_BINARY'; check your system header files. - */ -#if defined _MSC_VER || defined __MINGW32__ - _setmode(_fileno(stdout), _O_BINARY); -#elif defined __CYGWIN__ - /* almost certainly not needed for any modern Cygwin, but let's be safe... */ - setmode(_fileno(stdout), _O_BINARY); -#elif defined __EMX__ - setmode(fileno(stdout), O_BINARY); -#endif - - return stdout; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c deleted file mode 100755 index 6d57006..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/libFLAC/stream_encoder_framing.c +++ /dev/null @@ -1,549 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include /* for strlen() */ -#include "include/private/stream_encoder_framing.h" -#include "include/private/crc.h" -#include "../assert.h" - -static FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method); -static FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order, const FLAC__bool is_extended); - -FLAC__bool FLAC__add_metadata_block(const FLAC__StreamMetadata *metadata, FLAC__BitWriter *bw) -{ - unsigned i, j; - const unsigned vendor_string_length = (unsigned)strlen(FLAC__VENDOR_STRING); - - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->is_last, FLAC__STREAM_METADATA_IS_LAST_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->type, FLAC__STREAM_METADATA_TYPE_LEN)) - return false; - - /* - * First, for VORBIS_COMMENTs, adjust the length to reflect our vendor string - */ - i = metadata->length; - if(metadata->type == FLAC__METADATA_TYPE_VORBIS_COMMENT) { - FLAC__ASSERT(metadata->data.vorbis_comment.vendor_string.length == 0 || 0 != metadata->data.vorbis_comment.vendor_string.entry); - i -= metadata->data.vorbis_comment.vendor_string.length; - i += vendor_string_length; - } - FLAC__ASSERT(i < (1u << FLAC__STREAM_METADATA_LENGTH_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, i, FLAC__STREAM_METADATA_LENGTH_LEN)) - return false; - - switch(metadata->type) { - case FLAC__METADATA_TYPE_STREAMINFO: - FLAC__ASSERT(metadata->data.stream_info.min_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MIN_BLOCK_SIZE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.max_blocksize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_blocksize, FLAC__STREAM_METADATA_STREAMINFO_MAX_BLOCK_SIZE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.min_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.min_framesize, FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.max_framesize < (1u << FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.max_framesize, FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN)) - return false; - FLAC__ASSERT(FLAC__format_sample_rate_is_valid(metadata->data.stream_info.sample_rate)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.sample_rate, FLAC__STREAM_METADATA_STREAMINFO_SAMPLE_RATE_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.channels > 0); - FLAC__ASSERT(metadata->data.stream_info.channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.channels-1, FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN)) - return false; - FLAC__ASSERT(metadata->data.stream_info.bits_per_sample > 0); - FLAC__ASSERT(metadata->data.stream_info.bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.stream_info.bits_per_sample-1, FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.stream_info.total_samples, FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.stream_info.md5sum, 16)) - return false; - break; - case FLAC__METADATA_TYPE_PADDING: - if(!FLAC__bitwriter_write_zeroes(bw, metadata->length * 8)) - return false; - break; - case FLAC__METADATA_TYPE_APPLICATION: - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.id, FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.application.data, metadata->length - (FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8))) - return false; - break; - case FLAC__METADATA_TYPE_SEEKTABLE: - for(i = 0; i < metadata->data.seek_table.num_points; i++) { - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].sample_number, FLAC__STREAM_METADATA_SEEKPOINT_SAMPLE_NUMBER_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.seek_table.points[i].stream_offset, FLAC__STREAM_METADATA_SEEKPOINT_STREAM_OFFSET_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.seek_table.points[i].frame_samples, FLAC__STREAM_METADATA_SEEKPOINT_FRAME_SAMPLES_LEN)) - return false; - } - break; - case FLAC__METADATA_TYPE_VORBIS_COMMENT: - if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, vendor_string_length)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)FLAC__VENDOR_STRING, vendor_string_length)) - return false; - if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.num_comments)) - return false; - for(i = 0; i < metadata->data.vorbis_comment.num_comments; i++) { - if(!FLAC__bitwriter_write_raw_uint32_little_endian(bw, metadata->data.vorbis_comment.comments[i].length)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.vorbis_comment.comments[i].entry, metadata->data.vorbis_comment.comments[i].length)) - return false; - } - break; - case FLAC__METADATA_TYPE_CUESHEET: - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN % 8 == 0); - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.cue_sheet.media_catalog_number, FLAC__STREAM_METADATA_CUESHEET_MEDIA_CATALOG_NUMBER_LEN/8)) - return false; - if(!FLAC__bitwriter_write_raw_uint64(bw, metadata->data.cue_sheet.lead_in, FLAC__STREAM_METADATA_CUESHEET_LEAD_IN_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.is_cd? 1 : 0, FLAC__STREAM_METADATA_CUESHEET_IS_CD_LEN)) - return false; - if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_RESERVED_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.cue_sheet.num_tracks, FLAC__STREAM_METADATA_CUESHEET_NUM_TRACKS_LEN)) - return false; - for(i = 0; i < metadata->data.cue_sheet.num_tracks; i++) { - const FLAC__StreamMetadata_CueSheet_Track *track = metadata->data.cue_sheet.tracks + i; - - if(!FLAC__bitwriter_write_raw_uint64(bw, track->offset, FLAC__STREAM_METADATA_CUESHEET_TRACK_OFFSET_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->number, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUMBER_LEN)) - return false; - FLAC__ASSERT(FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN % 8 == 0); - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)track->isrc, FLAC__STREAM_METADATA_CUESHEET_TRACK_ISRC_LEN/8)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->type, FLAC__STREAM_METADATA_CUESHEET_TRACK_TYPE_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->pre_emphasis, FLAC__STREAM_METADATA_CUESHEET_TRACK_PRE_EMPHASIS_LEN)) - return false; - if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_TRACK_RESERVED_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, track->num_indices, FLAC__STREAM_METADATA_CUESHEET_TRACK_NUM_INDICES_LEN)) - return false; - for(j = 0; j < track->num_indices; j++) { - const FLAC__StreamMetadata_CueSheet_Index *indx = track->indices + j; - - if(!FLAC__bitwriter_write_raw_uint64(bw, indx->offset, FLAC__STREAM_METADATA_CUESHEET_INDEX_OFFSET_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, indx->number, FLAC__STREAM_METADATA_CUESHEET_INDEX_NUMBER_LEN)) - return false; - if(!FLAC__bitwriter_write_zeroes(bw, FLAC__STREAM_METADATA_CUESHEET_INDEX_RESERVED_LEN)) - return false; - } - } - break; - case FLAC__METADATA_TYPE_PICTURE: - { - size_t len; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.type, FLAC__STREAM_METADATA_PICTURE_TYPE_LEN)) - return false; - len = strlen(metadata->data.picture.mime_type); - if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_MIME_TYPE_LENGTH_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, (const FLAC__byte*)metadata->data.picture.mime_type, len)) - return false; - len = strlen((const char *)metadata->data.picture.description); - if(!FLAC__bitwriter_write_raw_uint32(bw, len, FLAC__STREAM_METADATA_PICTURE_DESCRIPTION_LENGTH_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.description, len)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.width, FLAC__STREAM_METADATA_PICTURE_WIDTH_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.height, FLAC__STREAM_METADATA_PICTURE_HEIGHT_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.depth, FLAC__STREAM_METADATA_PICTURE_DEPTH_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.colors, FLAC__STREAM_METADATA_PICTURE_COLORS_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, metadata->data.picture.data_length, FLAC__STREAM_METADATA_PICTURE_DATA_LENGTH_LEN)) - return false; - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.picture.data, metadata->data.picture.data_length)) - return false; - } - break; - default: - if(!FLAC__bitwriter_write_byte_block(bw, metadata->data.unknown.data, metadata->length)) - return false; - break; - } - - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); - return true; -} - -FLAC__bool FLAC__frame_add_header(const FLAC__FrameHeader *header, FLAC__BitWriter *bw) -{ - unsigned u, blocksize_hint, sample_rate_hint; - FLAC__byte crc; - - FLAC__ASSERT(FLAC__bitwriter_is_byte_aligned(bw)); - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__FRAME_HEADER_SYNC, FLAC__FRAME_HEADER_SYNC_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_RESERVED_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, (header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER)? 0 : 1, FLAC__FRAME_HEADER_BLOCKING_STRATEGY_LEN)) - return false; - - FLAC__ASSERT(header->blocksize > 0 && header->blocksize <= FLAC__MAX_BLOCK_SIZE); - /* when this assertion holds true, any legal blocksize can be expressed in the frame header */ - FLAC__ASSERT(FLAC__MAX_BLOCK_SIZE <= 65535u); - blocksize_hint = 0; - switch(header->blocksize) { - case 192: u = 1; break; - case 576: u = 2; break; - case 1152: u = 3; break; - case 2304: u = 4; break; - case 4608: u = 5; break; - case 256: u = 8; break; - case 512: u = 9; break; - case 1024: u = 10; break; - case 2048: u = 11; break; - case 4096: u = 12; break; - case 8192: u = 13; break; - case 16384: u = 14; break; - case 32768: u = 15; break; - default: - if(header->blocksize <= 0x100) - blocksize_hint = u = 6; - else - blocksize_hint = u = 7; - break; - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BLOCK_SIZE_LEN)) - return false; - - FLAC__ASSERT(FLAC__format_sample_rate_is_valid(header->sample_rate)); - sample_rate_hint = 0; - switch(header->sample_rate) { - case 88200: u = 1; break; - case 176400: u = 2; break; - case 192000: u = 3; break; - case 8000: u = 4; break; - case 16000: u = 5; break; - case 22050: u = 6; break; - case 24000: u = 7; break; - case 32000: u = 8; break; - case 44100: u = 9; break; - case 48000: u = 10; break; - case 96000: u = 11; break; - default: - if(header->sample_rate <= 255000 && header->sample_rate % 1000 == 0) - sample_rate_hint = u = 12; - else if(header->sample_rate % 10 == 0) - sample_rate_hint = u = 14; - else if(header->sample_rate <= 0xffff) - sample_rate_hint = u = 13; - else - u = 0; - break; - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_SAMPLE_RATE_LEN)) - return false; - - FLAC__ASSERT(header->channels > 0 && header->channels <= (1u << FLAC__STREAM_METADATA_STREAMINFO_CHANNELS_LEN) && header->channels <= FLAC__MAX_CHANNELS); - switch(header->channel_assignment) { - case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT: - u = header->channels - 1; - break; - case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE: - FLAC__ASSERT(header->channels == 2); - u = 8; - break; - case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE: - FLAC__ASSERT(header->channels == 2); - u = 9; - break; - case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE: - FLAC__ASSERT(header->channels == 2); - u = 10; - break; - default: - FLAC__ASSERT(0); - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_CHANNEL_ASSIGNMENT_LEN)) - return false; - - FLAC__ASSERT(header->bits_per_sample > 0 && header->bits_per_sample <= (1u << FLAC__STREAM_METADATA_STREAMINFO_BITS_PER_SAMPLE_LEN)); - switch(header->bits_per_sample) { - case 8 : u = 1; break; - case 12: u = 2; break; - case 16: u = 4; break; - case 20: u = 5; break; - case 24: u = 6; break; - default: u = 0; break; - } - if(!FLAC__bitwriter_write_raw_uint32(bw, u, FLAC__FRAME_HEADER_BITS_PER_SAMPLE_LEN)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, 0, FLAC__FRAME_HEADER_ZERO_PAD_LEN)) - return false; - - if(header->number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER) { - if(!FLAC__bitwriter_write_utf8_uint32(bw, header->number.frame_number)) - return false; - } - else { - if(!FLAC__bitwriter_write_utf8_uint64(bw, header->number.sample_number)) - return false; - } - - if(blocksize_hint) - if(!FLAC__bitwriter_write_raw_uint32(bw, header->blocksize-1, (blocksize_hint==6)? 8:16)) - return false; - - switch(sample_rate_hint) { - case 12: - if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 1000, 8)) - return false; - break; - case 13: - if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate, 16)) - return false; - break; - case 14: - if(!FLAC__bitwriter_write_raw_uint32(bw, header->sample_rate / 10, 16)) - return false; - break; - } - - /* write the CRC */ - if(!FLAC__bitwriter_get_write_crc8(bw, &crc)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, crc, FLAC__FRAME_HEADER_CRC_LEN)) - return false; - - return true; -} - -FLAC__bool FLAC__subframe_add_constant(const FLAC__Subframe_Constant *subframe, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - FLAC__bool ok; - - ok = - FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_CONSTANT_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN) && - (wasted_bits? FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1) : true) && - FLAC__bitwriter_write_raw_int32(bw, subframe->value, subframe_bps) - ; - - return ok; -} - -FLAC__bool FLAC__subframe_add_fixed(const FLAC__Subframe_Fixed *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - unsigned i; - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_FIXED_BYTE_ALIGNED_MASK | (subframe->order<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) - return false; - if(wasted_bits) - if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) - return false; - - for(i = 0; i < subframe->order; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) - return false; - - if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) - return false; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!add_residual_partitioned_rice_( - bw, - subframe->residual, - residual_samples, - subframe->order, - subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, - subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, - subframe->entropy_coding_method.data.partitioned_rice.order, - /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 - )) - return false; - break; - default: - FLAC__ASSERT(0); - } - - return true; -} - -FLAC__bool FLAC__subframe_add_lpc(const FLAC__Subframe_LPC *subframe, unsigned residual_samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - unsigned i; - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_LPC_BYTE_ALIGNED_MASK | ((subframe->order-1)<<1) | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) - return false; - if(wasted_bits) - if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) - return false; - - for(i = 0; i < subframe->order; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->warmup[i], subframe_bps)) - return false; - - if(!FLAC__bitwriter_write_raw_uint32(bw, subframe->qlp_coeff_precision-1, FLAC__SUBFRAME_LPC_QLP_COEFF_PRECISION_LEN)) - return false; - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->quantization_level, FLAC__SUBFRAME_LPC_QLP_SHIFT_LEN)) - return false; - for(i = 0; i < subframe->order; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, subframe->qlp_coeff[i], subframe->qlp_coeff_precision)) - return false; - - if(!add_entropy_coding_method_(bw, &subframe->entropy_coding_method)) - return false; - switch(subframe->entropy_coding_method.type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!add_residual_partitioned_rice_( - bw, - subframe->residual, - residual_samples, - subframe->order, - subframe->entropy_coding_method.data.partitioned_rice.contents->parameters, - subframe->entropy_coding_method.data.partitioned_rice.contents->raw_bits, - subframe->entropy_coding_method.data.partitioned_rice.order, - /*is_extended=*/subframe->entropy_coding_method.type == FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2 - )) - return false; - break; - default: - FLAC__ASSERT(0); - } - - return true; -} - -FLAC__bool FLAC__subframe_add_verbatim(const FLAC__Subframe_Verbatim *subframe, unsigned samples, unsigned subframe_bps, unsigned wasted_bits, FLAC__BitWriter *bw) -{ - unsigned i; - const FLAC__int32 *signal = subframe->data; - - if(!FLAC__bitwriter_write_raw_uint32(bw, FLAC__SUBFRAME_TYPE_VERBATIM_BYTE_ALIGNED_MASK | (wasted_bits? 1:0), FLAC__SUBFRAME_ZERO_PAD_LEN + FLAC__SUBFRAME_TYPE_LEN + FLAC__SUBFRAME_WASTED_BITS_FLAG_LEN)) - return false; - if(wasted_bits) - if(!FLAC__bitwriter_write_unary_unsigned(bw, wasted_bits-1)) - return false; - - for(i = 0; i < samples; i++) - if(!FLAC__bitwriter_write_raw_int32(bw, signal[i], subframe_bps)) - return false; - - return true; -} - -FLAC__bool add_entropy_coding_method_(FLAC__BitWriter *bw, const FLAC__EntropyCodingMethod *method) -{ - if(!FLAC__bitwriter_write_raw_uint32(bw, method->type, FLAC__ENTROPY_CODING_METHOD_TYPE_LEN)) - return false; - switch(method->type) { - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE: - case FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2: - if(!FLAC__bitwriter_write_raw_uint32(bw, method->data.partitioned_rice.order, FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ORDER_LEN)) - return false; - break; - default: - FLAC__ASSERT(0); - } - return true; -} - -FLAC__bool add_residual_partitioned_rice_(FLAC__BitWriter *bw, const FLAC__int32 residual[], const unsigned residual_samples, const unsigned predictor_order, const unsigned rice_parameters[], const unsigned raw_bits[], const unsigned partition_order, const FLAC__bool is_extended) -{ - const unsigned plen = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_PARAMETER_LEN : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_PARAMETER_LEN; - const unsigned pesc = is_extended? FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE2_ESCAPE_PARAMETER : FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_ESCAPE_PARAMETER; - - if(partition_order == 0) { - unsigned i; - - if(raw_bits[0] == 0) { - if(!FLAC__bitwriter_write_raw_uint32(bw, rice_parameters[0], plen)) - return false; - if(!FLAC__bitwriter_write_rice_signed_block(bw, residual, residual_samples, rice_parameters[0])) - return false; - } - else { - FLAC__ASSERT(rice_parameters[0] == 0); - if(!FLAC__bitwriter_write_raw_uint32(bw, pesc, plen)) - return false; - if(!FLAC__bitwriter_write_raw_uint32(bw, raw_bits[0], FLAC__ENTROPY_CODING_METHOD_PARTITIONED_RICE_RAW_LEN)) - return false; - for(i = 0; i < residual_samples; i++) { - if(!FLAC__bitwriter_write_raw_int32(bw, residual[i], raw_bits[0])) - return false; - } - } - return true; - } - else { - unsigned i, j, k = 0, k_last = 0; - unsigned partition_samples; - const unsigned default_partition_samples = (residual_samples+predictor_order) >> partition_order; - for(i = 0; i < (1u< -#endif - -#include -#include "../assert.h" -#include "../format.h" -#include "include/private/window.h" - -#ifndef FLAC__INTEGER_ONLY_LIBRARY - - -void FLAC__window_bartlett(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - if (L & 1) { - for (n = 0; n <= N/2; n++) - window[n] = 2.0f * n / (float)N; - for (; n <= N; n++) - window[n] = 2.0f - 2.0f * n / (float)N; - } - else { - for (n = 0; n <= L/2-1; n++) - window[n] = 2.0f * n / (float)N; - for (; n <= N; n++) - window[n] = 2.0f - 2.0f * n / (float)N; - } -} - -void FLAC__window_bartlett_hann(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.62f - 0.48f * fabs((float)n/(float)N-0.5f) - 0.38f * cos(2.0f * M_PI * ((float)n/(float)N))); -} - -void FLAC__window_blackman(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.42f - 0.5f * cos(2.0f * M_PI * n / N) + 0.08f * cos(4.0f * M_PI * n / N)); -} - -/* 4-term -92dB side-lobe */ -void FLAC__window_blackman_harris_4term_92db_sidelobe(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n <= N; n++) - window[n] = (FLAC__real)(0.35875f - 0.48829f * cos(2.0f * M_PI * n / N) + 0.14128f * cos(4.0f * M_PI * n / N) - 0.01168f * cos(6.0f * M_PI * n / N)); -} - -void FLAC__window_connes(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - const double N2 = (double)N / 2.; - FLAC__int32 n; - - for (n = 0; n <= N; n++) { - double k = ((double)n - N2) / N2; - k = 1.0f - k * k; - window[n] = (FLAC__real)(k * k); - } -} - -void FLAC__window_flattop(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(1.0f - 1.93f * cos(2.0f * M_PI * n / N) + 1.29f * cos(4.0f * M_PI * n / N) - 0.388f * cos(6.0f * M_PI * n / N) + 0.0322f * cos(8.0f * M_PI * n / N)); -} - -void FLAC__window_gauss(FLAC__real *window, const FLAC__int32 L, const FLAC__real stddev) -{ - const FLAC__int32 N = L - 1; - const double N2 = (double)N / 2.; - FLAC__int32 n; - - for (n = 0; n <= N; n++) { - const double k = ((double)n - N2) / (stddev * N2); - window[n] = (FLAC__real)exp(-0.5f * k * k); - } -} - -void FLAC__window_hamming(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.54f - 0.46f * cos(2.0f * M_PI * n / N)); -} - -void FLAC__window_hann(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(2.0f * M_PI * n / N)); -} - -void FLAC__window_kaiser_bessel(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.402f - 0.498f * cos(2.0f * M_PI * n / N) + 0.098f * cos(4.0f * M_PI * n / N) - 0.001f * cos(6.0f * M_PI * n / N)); -} - -void FLAC__window_nuttall(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = (FLAC__real)(0.3635819f - 0.4891775f*cos(2.0f*M_PI*n/N) + 0.1365995f*cos(4.0f*M_PI*n/N) - 0.0106411f*cos(6.0f*M_PI*n/N)); -} - -void FLAC__window_rectangle(FLAC__real *window, const FLAC__int32 L) -{ - FLAC__int32 n; - - for (n = 0; n < L; n++) - window[n] = 1.0f; -} - -void FLAC__window_triangle(FLAC__real *window, const FLAC__int32 L) -{ - FLAC__int32 n; - - if (L & 1) { - for (n = 1; n <= (L+1)/2; n++) - window[n-1] = 2.0f * n / ((float)L + 1.0f); - for (; n <= L; n++) - window[n-1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); - } - else { - for (n = 1; n <= L/2; n++) - window[n-1] = 2.0f * n / ((float)L + 1.0f); - for (; n <= L; n++) - window[n-1] = (float)(2 * (L - n + 1)) / ((float)L + 1.0f); - } -} - -void FLAC__window_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p) -{ - if (p <= 0.0) - FLAC__window_rectangle(window, L); - else if (p >= 1.0) - FLAC__window_hann(window, L); - else { - const FLAC__int32 Np = (FLAC__int32)(p / 2.0f * L) - 1; - FLAC__int32 n; - /* start with rectangle... */ - FLAC__window_rectangle(window, L); - /* ...replace ends with hann */ - if (Np > 0) { - for (n = 0; n <= Np; n++) { - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * n / Np)); - window[L-Np-1+n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * (n+Np) / Np)); - } - } - } -} - -void FLAC__window_partial_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) -{ - const FLAC__int32 start_n = (FLAC__int32)(start * L); - const FLAC__int32 end_n = (FLAC__int32)(end * L); - const FLAC__int32 N = end_n - start_n; - FLAC__int32 Np, n, i; - - if (p <= 0.0f) - FLAC__window_partial_tukey(window, L, 0.05f, start, end); - else if (p >= 1.0f) - FLAC__window_partial_tukey(window, L, 0.95f, start, end); - else { - - Np = (FLAC__int32)(p / 2.0f * N); - - for (n = 0; n < start_n && n < L; n++) - window[n] = 0.0f; - for (i = 1; n < (start_n+Np) && n < L; n++, i++) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Np)); - for (; n < (end_n-Np) && n < L; n++) - window[n] = 1.0f; - for (i = Np; n < end_n && n < L; n++, i--) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Np)); - for (; n < L; n++) - window[n] = 0.0f; - } -} - -void FLAC__window_punchout_tukey(FLAC__real *window, const FLAC__int32 L, const FLAC__real p, const FLAC__real start, const FLAC__real end) -{ - const FLAC__int32 start_n = (FLAC__int32)(start * L); - const FLAC__int32 end_n = (FLAC__int32)(end * L); - FLAC__int32 Ns, Ne, n, i; - - if (p <= 0.0f) - FLAC__window_punchout_tukey(window, L, 0.05f, start, end); - else if (p >= 1.0f) - FLAC__window_punchout_tukey(window, L, 0.95f, start, end); - else { - - Ns = (FLAC__int32)(p / 2.0f * start_n); - Ne = (FLAC__int32)(p / 2.0f * (L - end_n)); - - for (n = 0, i = 1; n < Ns && n < L; n++, i++) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ns)); - for (; n < start_n-Ns && n < L; n++) - window[n] = 1.0f; - for (i = Ns; n < start_n && n < L; n++, i--) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ns)); - for (; n < end_n && n < L; n++) - window[n] = 0.0f; - for (i = 1; n < end_n+Ne && n < L; n++, i++) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ne)); - for (; n < L - (Ne) && n < L; n++) - window[n] = 1.0f; - for (i = Ne; n < L; n++, i--) - window[n] = (FLAC__real)(0.5f - 0.5f * cos(M_PI * i / Ne)); - } -} - -void FLAC__window_welch(FLAC__real *window, const FLAC__int32 L) -{ - const FLAC__int32 N = L - 1; - const double N2 = (double)N / 2.; - FLAC__int32 n; - - for (n = 0; n <= N; n++) { - const double k = ((double)n - N2) / N2; - window[n] = (FLAC__real)(1.0f - k * k); - } -} - -#endif /* !defined FLAC__INTEGER_ONLY_LIBRARY */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h deleted file mode 100755 index 02cfc32..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/metadata.h +++ /dev/null @@ -1,2182 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2001-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__METADATA_H -#define FLAC__METADATA_H - -#include /* for off_t */ -#include "export.h" -#include "callback.h" -#include "format.h" - -/* -------------------------------------------------------------------- - (For an example of how all these routines are used, see the source - code for the unit tests in src/test_libFLAC/metadata_*.c, or - metaflac in src/metaflac/) - ------------------------------------------------------------------*/ - -/** \file include/FLAC/metadata.h - * - * \brief - * This module provides functions for creating and manipulating FLAC - * metadata blocks in memory, and three progressively more powerful - * interfaces for traversing and editing metadata in FLAC files. - * - * See the detailed documentation for each interface in the - * \link flac_metadata metadata \endlink module. - */ - -/** \defgroup flac_metadata FLAC/metadata.h: metadata interfaces - * \ingroup flac - * - * \brief - * This module provides functions for creating and manipulating FLAC - * metadata blocks in memory, and three progressively more powerful - * interfaces for traversing and editing metadata in native FLAC files. - * Note that currently only the Chain interface (level 2) supports Ogg - * FLAC files, and it is read-only i.e. no writing back changed - * metadata to file. - * - * There are three metadata interfaces of increasing complexity: - * - * Level 0: - * Read-only access to the STREAMINFO, VORBIS_COMMENT, CUESHEET, and - * PICTURE blocks. - * - * Level 1: - * Read-write access to all metadata blocks. This level is write- - * efficient in most cases (more on this below), and uses less memory - * than level 2. - * - * Level 2: - * Read-write access to all metadata blocks. This level is write- - * efficient in all cases, but uses more memory since all metadata for - * the whole file is read into memory and manipulated before writing - * out again. - * - * What do we mean by efficient? Since FLAC metadata appears at the - * beginning of the file, when writing metadata back to a FLAC file - * it is possible to grow or shrink the metadata such that the entire - * file must be rewritten. However, if the size remains the same during - * changes or PADDING blocks are utilized, only the metadata needs to be - * overwritten, which is much faster. - * - * Efficient means the whole file is rewritten at most one time, and only - * when necessary. Level 1 is not efficient only in the case that you - * cause more than one metadata block to grow or shrink beyond what can - * be accomodated by padding. In this case you should probably use level - * 2, which allows you to edit all the metadata for a file in memory and - * write it out all at once. - * - * All levels know how to skip over and not disturb an ID3v2 tag at the - * front of the file. - * - * All levels access files via their filenames. In addition, level 2 - * has additional alternative read and write functions that take an I/O - * handle and callbacks, for situations where access by filename is not - * possible. - * - * In addition to the three interfaces, this module defines functions for - * creating and manipulating various metadata objects in memory. As we see - * from the Format module, FLAC metadata blocks in memory are very primitive - * structures for storing information in an efficient way. Reading - * information from the structures is easy but creating or modifying them - * directly is more complex. The metadata object routines here facilitate - * this by taking care of the consistency and memory management drudgery. - * - * Unless you will be using the level 1 or 2 interfaces to modify existing - * metadata however, you will not probably not need these. - * - * From a dependency standpoint, none of the encoders or decoders require - * the metadata module. This is so that embedded users can strip out the - * metadata module from libFLAC to reduce the size and complexity. - */ - -#ifdef __cplusplus -extern "C" { -#endif - - -/** \defgroup flac_metadata_level0 FLAC/metadata.h: metadata level 0 interface - * \ingroup flac_metadata - * - * \brief - * The level 0 interface consists of individual routines to read the - * STREAMINFO, VORBIS_COMMENT, CUESHEET, and PICTURE blocks, requiring - * only a filename. - * - * They try to skip any ID3v2 tag at the head of the file. - * - * \{ - */ - -/** Read the STREAMINFO metadata block of the given FLAC file. This function - * will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param streaminfo A pointer to space for the STREAMINFO block. Since - * FLAC__StreamMetadata is a simple structure with no - * memory allocation involved, you pass the address of - * an existing structure. It need not be initialized. - * \assert - * \code filename != NULL \endcode - * \code streaminfo != NULL \endcode - * \retval FLAC__bool - * \c true if a valid STREAMINFO block was read from \a filename. Returns - * \c false if there was a memory allocation error, a file decoder error, - * or the file contained no STREAMINFO block. (A memory allocation error - * is possible because this function must set up a file decoder.) - */ -FLAC_API FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetadata *streaminfo); - -/** Read the VORBIS_COMMENT metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param tags The address where the returned pointer will be - * stored. The \a tags object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \assert - * \code filename != NULL \endcode - * \code tags != NULL \endcode - * \retval FLAC__bool - * \c true if a valid VORBIS_COMMENT block was read from \a filename, - * and \a *tags will be set to the address of the metadata structure. - * Returns \c false if there was a memory allocation error, a file - * decoder error, or the file contained no VORBIS_COMMENT block, and - * \a *tags will be set to \c NULL. - */ -FLAC_API FLAC__bool FLAC__metadata_get_tags(const char *filename, FLAC__StreamMetadata **tags); - -/** Read the CUESHEET metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * - * \param filename The path to the FLAC file to read. - * \param cuesheet The address where the returned pointer will be - * stored. The \a cuesheet object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \assert - * \code filename != NULL \endcode - * \code cuesheet != NULL \endcode - * \retval FLAC__bool - * \c true if a valid CUESHEET block was read from \a filename, - * and \a *cuesheet will be set to the address of the metadata - * structure. Returns \c false if there was a memory allocation - * error, a file decoder error, or the file contained no CUESHEET - * block, and \a *cuesheet will be set to \c NULL. - */ -FLAC_API FLAC__bool FLAC__metadata_get_cuesheet(const char *filename, FLAC__StreamMetadata **cuesheet); - -/** Read a PICTURE metadata block of the given FLAC file. This - * function will try to skip any ID3v2 tag at the head of the file. - * Since there can be more than one PICTURE block in a file, this - * function takes a number of parameters that act as constraints to - * the search. The PICTURE block with the largest area matching all - * the constraints will be returned, or \a *picture will be set to - * \c NULL if there was no such block. - * - * \param filename The path to the FLAC file to read. - * \param picture The address where the returned pointer will be - * stored. The \a picture object must be deleted by - * the caller using FLAC__metadata_object_delete(). - * \param type The desired picture type. Use \c -1 to mean - * "any type". - * \param mime_type The desired MIME type, e.g. "image/jpeg". The - * string will be matched exactly. Use \c NULL to - * mean "any MIME type". - * \param description The desired description. The string will be - * matched exactly. Use \c NULL to mean "any - * description". - * \param max_width The maximum width in pixels desired. Use - * \c (unsigned)(-1) to mean "any width". - * \param max_height The maximum height in pixels desired. Use - * \c (unsigned)(-1) to mean "any height". - * \param max_depth The maximum color depth in bits-per-pixel desired. - * Use \c (unsigned)(-1) to mean "any depth". - * \param max_colors The maximum number of colors desired. Use - * \c (unsigned)(-1) to mean "any number of colors". - * \assert - * \code filename != NULL \endcode - * \code picture != NULL \endcode - * \retval FLAC__bool - * \c true if a valid PICTURE block was read from \a filename, - * and \a *picture will be set to the address of the metadata - * structure. Returns \c false if there was a memory allocation - * error, a file decoder error, or the file contained no PICTURE - * block, and \a *picture will be set to \c NULL. - */ -FLAC_API FLAC__bool FLAC__metadata_get_picture(const char *filename, FLAC__StreamMetadata **picture, FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors); - -/* \} */ - - -/** \defgroup flac_metadata_level1 FLAC/metadata.h: metadata level 1 interface - * \ingroup flac_metadata - * - * \brief - * The level 1 interface provides read-write access to FLAC file metadata and - * operates directly on the FLAC file. - * - * The general usage of this interface is: - * - * - Create an iterator using FLAC__metadata_simple_iterator_new() - * - Attach it to a file using FLAC__metadata_simple_iterator_init() and check - * the exit code. Call FLAC__metadata_simple_iterator_is_writable() to - * see if the file is writable, or only read access is allowed. - * - Use FLAC__metadata_simple_iterator_next() and - * FLAC__metadata_simple_iterator_prev() to traverse the blocks. - * This is does not read the actual blocks themselves. - * FLAC__metadata_simple_iterator_next() is relatively fast. - * FLAC__metadata_simple_iterator_prev() is slower since it needs to search - * forward from the front of the file. - * - Use FLAC__metadata_simple_iterator_get_block_type() or - * FLAC__metadata_simple_iterator_get_block() to access the actual data at - * the current iterator position. The returned object is yours to modify - * and free. - * - Use FLAC__metadata_simple_iterator_set_block() to write a modified block - * back. You must have write permission to the original file. Make sure to - * read the whole comment to FLAC__metadata_simple_iterator_set_block() - * below. - * - Use FLAC__metadata_simple_iterator_insert_block_after() to add new blocks. - * Use the object creation functions from - * \link flac_metadata_object here \endlink to generate new objects. - * - Use FLAC__metadata_simple_iterator_delete_block() to remove the block - * currently referred to by the iterator, or replace it with padding. - * - Destroy the iterator with FLAC__metadata_simple_iterator_delete() when - * finished. - * - * \note - * The FLAC file remains open the whole time between - * FLAC__metadata_simple_iterator_init() and - * FLAC__metadata_simple_iterator_delete(), so make sure you are not altering - * the file during this time. - * - * \note - * Do not modify the \a is_last, \a length, or \a type fields of returned - * FLAC__StreamMetadata objects. These are managed automatically. - * - * \note - * If any of the modification functions - * (FLAC__metadata_simple_iterator_set_block(), - * FLAC__metadata_simple_iterator_delete_block(), - * FLAC__metadata_simple_iterator_insert_block_after(), etc.) return \c false, - * you should delete the iterator as it may no longer be valid. - * - * \{ - */ - -struct FLAC__Metadata_SimpleIterator; -/** The opaque structure definition for the level 1 iterator type. - * See the - * \link flac_metadata_level1 metadata level 1 module \endlink - * for a detailed description. - */ -typedef struct FLAC__Metadata_SimpleIterator FLAC__Metadata_SimpleIterator; - -/** Status type for FLAC__Metadata_SimpleIterator. - * - * The iterator's current status can be obtained by calling FLAC__metadata_simple_iterator_status(). - */ -typedef enum { - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK = 0, - /**< The iterator is in the normal OK state */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, - /**< The data passed into a function violated the function's usage criteria */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE, - /**< The iterator could not open the target file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE, - /**< The iterator could not find the FLAC signature at the start of the file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE, - /**< The iterator tried to write to a file that was not writable */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA, - /**< The iterator encountered input that does not conform to the FLAC metadata specification */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR, - /**< The iterator encountered an error while reading the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, - /**< The iterator encountered an error while seeking in the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR, - /**< The iterator encountered an error while writing the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR, - /**< The iterator encountered an error renaming the FLAC file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR, - /**< The iterator encountered an error removing the temporary file */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR, - /**< Memory allocation failed */ - - FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR - /**< The caller violated an assertion or an unexpected error occurred */ - -} FLAC__Metadata_SimpleIteratorStatus; - -/** Maps a FLAC__Metadata_SimpleIteratorStatus to a C string. - * - * Using a FLAC__Metadata_SimpleIteratorStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__Metadata_SimpleIteratorStatusString[]; - - -/** Create a new iterator instance. - * - * \retval FLAC__Metadata_SimpleIterator* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__Metadata_SimpleIterator *FLAC__metadata_simple_iterator_new(void); - -/** Free an iterator instance. Deletes the object pointed to by \a iterator. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - */ -FLAC_API void FLAC__metadata_simple_iterator_delete(FLAC__Metadata_SimpleIterator *iterator); - -/** Get the current status of the iterator. Call this after a function - * returns \c false to get the reason for the error. Also resets the status - * to FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - * \retval FLAC__Metadata_SimpleIteratorStatus - * The current status of the iterator. - */ -FLAC_API FLAC__Metadata_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__Metadata_SimpleIterator *iterator); - -/** Initialize the iterator to point to the first metadata block in the - * given FLAC file. - * - * \param iterator A pointer to an existing iterator. - * \param filename The path to the FLAC file. - * \param read_only If \c true, the FLAC file will be opened - * in read-only mode; if \c false, the FLAC - * file will be opened for edit even if no - * edits are performed. - * \param preserve_file_stats If \c true, the owner and modification - * time will be preserved even if the FLAC - * file is written to. - * \assert - * \code iterator != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c false if a memory allocation error occurs, the file can't be - * opened, or another error occurs, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__Metadata_SimpleIterator *iterator, const char *filename, FLAC__bool read_only, FLAC__bool preserve_file_stats); - -/** Returns \c true if the FLAC file is writable. If \c false, calls to - * FLAC__metadata_simple_iterator_set_block() and - * FLAC__metadata_simple_iterator_insert_block_after() will fail. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - * \retval FLAC__bool - * See above. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__Metadata_SimpleIterator *iterator); - -/** Moves the iterator forward one metadata block, returning \c false if - * already at the end. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c false if already at the last metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__Metadata_SimpleIterator *iterator); - -/** Moves the iterator backward one metadata block, returning \c false if - * already at the beginning. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c false if already at the first metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__Metadata_SimpleIterator *iterator); - -/** Returns a flag telling if the current metadata block is the last. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if the current metadata block is the last in the file, - * else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the offset of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval off_t - * The offset of the metadata block at the current iterator position. - * This is the byte offset relative to the beginning of the file of - * the current metadata block's header. - */ -FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the type of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__MetadataType - * The type of the metadata block at the current iterator position. - */ -FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the length of the metadata block at the current position. This - * avoids reading the actual block data which can save time for large - * blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval unsigned - * The length of the metadata block at the current iterator position. - * The is same length as that in the - * metadata block header, - * i.e. the length of the metadata body that follows the header. - */ -FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator); - -/** Get the application ID of the \c APPLICATION block at the current - * position. This avoids reading the actual block data which can save - * time for large blocks. - * - * \param iterator A pointer to an existing initialized iterator. - * \param id A pointer to a buffer of at least \c 4 bytes where - * the ID will be stored. - * \assert - * \code iterator != NULL \endcode - * \code id != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if the ID was successfully read, else \c false, in which - * case you should check FLAC__metadata_simple_iterator_status() to - * find out why. If the status is - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, then the - * current metadata block is not an \c APPLICATION block. Otherwise - * if the status is - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR or - * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, an I/O error - * occurred and the iterator can no longer be used. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id); - -/** Get the metadata block at the current position. You can modify the - * block but must use FLAC__metadata_simple_iterator_set_block() to - * write it back to the FLAC file. - * - * You must call FLAC__metadata_object_delete() on the returned object - * when you are finished with it. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__StreamMetadata* - * The current metadata block, or \c NULL if there was a memory - * allocation error. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator); - -/** Write a block back to the FLAC file. This function tries to be - * as efficient as possible; how the block is actually written is - * shown by the following: - * - * Existing block is a STREAMINFO block and the new block is a - * STREAMINFO block: the new block is written in place. Make sure - * you know what you're doing when changing the values of a - * STREAMINFO block. - * - * Existing block is a STREAMINFO block and the new block is a - * not a STREAMINFO block: this is an error since the first block - * must be a STREAMINFO block. Returns \c false without altering the - * file. - * - * Existing block is not a STREAMINFO block and the new block is a - * STREAMINFO block: this is an error since there may be only one - * STREAMINFO block. Returns \c false without altering the file. - * - * Existing block and new block are the same length: the existing - * block will be replaced by the new block, written in place. - * - * Existing block is longer than new block: if use_padding is \c true, - * the existing block will be overwritten in place with the new - * block followed by a PADDING block, if possible, to make the total - * size the same as the existing block. Remember that a padding - * block requires at least four bytes so if the difference in size - * between the new block and existing block is less than that, the - * entire file will have to be rewritten, using the new block's - * exact size. If use_padding is \c false, the entire file will be - * rewritten, replacing the existing block by the new block. - * - * Existing block is shorter than new block: if use_padding is \c true, - * the function will try and expand the new block into the following - * PADDING block, if it exists and doing so won't shrink the PADDING - * block to less than 4 bytes. If there is no following PADDING - * block, or it will shrink to less than 4 bytes, or use_padding is - * \c false, the entire file is rewritten, replacing the existing block - * with the new block. Note that in this case any following PADDING - * block is preserved as is. - * - * After writing the block, the iterator will remain in the same - * place, i.e. pointing to the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block The block to set. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); - -/** This is similar to FLAC__metadata_simple_iterator_set_block() - * except that instead of writing over an existing block, it appends - * a block after the existing block. \a use_padding is again used to - * tell the function to try an expand into following padding in an - * attempt to avoid rewriting the entire file. - * - * This function will fail and return \c false if given a STREAMINFO - * block. - * - * After writing the block, the iterator will be pointing to the - * new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block The block to set. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__Metadata_SimpleIterator *iterator, FLAC__StreamMetadata *block, FLAC__bool use_padding); - -/** Deletes the block at the current position. This will cause the - * entire FLAC file to be rewritten, unless \a use_padding is \c true, - * in which case the block will be replaced by an equal-sized PADDING - * block. The iterator will be left pointing to the block before the - * one just deleted. - * - * You may not delete the STREAMINFO block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param use_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_simple_iterator_init() - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__Metadata_SimpleIterator *iterator, FLAC__bool use_padding); - -/* \} */ - - -/** \defgroup flac_metadata_level2 FLAC/metadata.h: metadata level 2 interface - * \ingroup flac_metadata - * - * \brief - * The level 2 interface provides read-write access to FLAC file metadata; - * all metadata is read into memory, operated on in memory, and then written - * to file, which is more efficient than level 1 when editing multiple blocks. - * - * Currently Ogg FLAC is supported for read only, via - * FLAC__metadata_chain_read_ogg() but a subsequent - * FLAC__metadata_chain_write() will fail. - * - * The general usage of this interface is: - * - * - Create a new chain using FLAC__metadata_chain_new(). A chain is a - * linked list of FLAC metadata blocks. - * - Read all metadata into the the chain from a FLAC file using - * FLAC__metadata_chain_read() or FLAC__metadata_chain_read_ogg() and - * check the status. - * - Optionally, consolidate the padding using - * FLAC__metadata_chain_merge_padding() or - * FLAC__metadata_chain_sort_padding(). - * - Create a new iterator using FLAC__metadata_iterator_new() - * - Initialize the iterator to point to the first element in the chain - * using FLAC__metadata_iterator_init() - * - Traverse the chain using FLAC__metadata_iterator_next and - * FLAC__metadata_iterator_prev(). - * - Get a block for reading or modification using - * FLAC__metadata_iterator_get_block(). The pointer to the object - * inside the chain is returned, so the block is yours to modify. - * Changes will be reflected in the FLAC file when you write the - * chain. You can also add and delete blocks (see functions below). - * - When done, write out the chain using FLAC__metadata_chain_write(). - * Make sure to read the whole comment to the function below. - * - Delete the chain using FLAC__metadata_chain_delete(). - * - * \note - * Even though the FLAC file is not open while the chain is being - * manipulated, you must not alter the file externally during - * this time. The chain assumes the FLAC file will not change - * between the time of FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg() - * and FLAC__metadata_chain_write(). - * - * \note - * Do not modify the is_last, length, or type fields of returned - * FLAC__StreamMetadata objects. These are managed automatically. - * - * \note - * The metadata objects returned by FLAC__metadata_iterator_get_block() - * are owned by the chain; do not FLAC__metadata_object_delete() them. - * In the same way, blocks passed to FLAC__metadata_iterator_set_block() - * become owned by the chain and they will be deleted when the chain is - * deleted. - * - * \{ - */ - -struct FLAC__Metadata_Chain; -/** The opaque structure definition for the level 2 chain type. - */ -typedef struct FLAC__Metadata_Chain FLAC__Metadata_Chain; - -struct FLAC__Metadata_Iterator; -/** The opaque structure definition for the level 2 iterator type. - */ -typedef struct FLAC__Metadata_Iterator FLAC__Metadata_Iterator; - -typedef enum { - FLAC__METADATA_CHAIN_STATUS_OK = 0, - /**< The chain is in the normal OK state */ - - FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT, - /**< The data passed into a function violated the function's usage criteria */ - - FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE, - /**< The chain could not open the target file */ - - FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE, - /**< The chain could not find the FLAC signature at the start of the file */ - - FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE, - /**< The chain tried to write to a file that was not writable */ - - FLAC__METADATA_CHAIN_STATUS_BAD_METADATA, - /**< The chain encountered input that does not conform to the FLAC metadata specification */ - - FLAC__METADATA_CHAIN_STATUS_READ_ERROR, - /**< The chain encountered an error while reading the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR, - /**< The chain encountered an error while seeking in the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR, - /**< The chain encountered an error while writing the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR, - /**< The chain encountered an error renaming the FLAC file */ - - FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR, - /**< The chain encountered an error removing the temporary file */ - - FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR, - /**< Memory allocation failed */ - - FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR, - /**< The caller violated an assertion or an unexpected error occurred */ - - FLAC__METADATA_CHAIN_STATUS_INVALID_CALLBACKS, - /**< One or more of the required callbacks was NULL */ - - FLAC__METADATA_CHAIN_STATUS_READ_WRITE_MISMATCH, - /**< FLAC__metadata_chain_write() was called on a chain read by - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * or - * FLAC__metadata_chain_write_with_callbacks()/FLAC__metadata_chain_write_with_callbacks_and_tempfile() - * was called on a chain read by - * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Matching read/write methods must always be used. */ - - FLAC__METADATA_CHAIN_STATUS_WRONG_WRITE_CALL - /**< FLAC__metadata_chain_write_with_callbacks() was called when the - * chain write requires a tempfile; use - * FLAC__metadata_chain_write_with_callbacks_and_tempfile() instead. - * Or, FLAC__metadata_chain_write_with_callbacks_and_tempfile() was - * called when the chain write does not require a tempfile; use - * FLAC__metadata_chain_write_with_callbacks() instead. - * Always check FLAC__metadata_chain_check_if_tempfile_needed() - * before writing via callbacks. */ - -} FLAC__Metadata_ChainStatus; - -/** Maps a FLAC__Metadata_ChainStatus to a C string. - * - * Using a FLAC__Metadata_ChainStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__Metadata_ChainStatusString[]; - -/*********** FLAC__Metadata_Chain ***********/ - -/** Create a new chain instance. - * - * \retval FLAC__Metadata_Chain* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__Metadata_Chain *FLAC__metadata_chain_new(void); - -/** Free a chain instance. Deletes the object pointed to by \a chain. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_chain_delete(FLAC__Metadata_Chain *chain); - -/** Get the current status of the chain. Call this after a function - * returns \c false to get the reason for the error. Also resets the - * status to FLAC__METADATA_CHAIN_STATUS_OK. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__Metadata_ChainStatus - * The current status of the chain. - */ -FLAC_API FLAC__Metadata_ChainStatus FLAC__metadata_chain_status(FLAC__Metadata_Chain *chain); - -/** Read all metadata from a FLAC file into the chain. - * - * \param chain A pointer to an existing chain. - * \param filename The path to the FLAC file to read. - * \assert - * \code chain != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a filename, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read(FLAC__Metadata_Chain *chain, const char *filename); - -/** Read all metadata from an Ogg FLAC file into the chain. - * - * \note Ogg FLAC metadata data writing is not supported yet and - * FLAC__metadata_chain_write() will fail. - * - * \param chain A pointer to an existing chain. - * \param filename The path to the Ogg FLAC file to read. - * \assert - * \code chain != NULL \endcode - * \code filename != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a filename, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg(FLAC__Metadata_Chain *chain, const char *filename); - -/** Read all metadata from a FLAC stream into the chain via I/O callbacks. - * - * The \a handle need only be open for reading, but must be seekable. - * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * \param chain A pointer to an existing chain. - * \param handle The I/O handle of the FLAC stream to read. The - * handle will NOT be closed after the metadata is read; - * that is the duty of the caller. - * \param callbacks - * A set of callbacks to use for I/O. The mandatory - * callbacks are \a read, \a seek, and \a tell. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a handle, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); - -/** Read all metadata from an Ogg FLAC stream into the chain via I/O callbacks. - * - * The \a handle need only be open for reading, but must be seekable. - * The equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * \note Ogg FLAC metadata data writing is not supported yet and - * FLAC__metadata_chain_write() will fail. - * - * \param chain A pointer to an existing chain. - * \param handle The I/O handle of the Ogg FLAC stream to read. The - * handle will NOT be closed after the metadata is read; - * that is the duty of the caller. - * \param callbacks - * A set of callbacks to use for I/O. The mandatory - * callbacks are \a read, \a seek, and \a tell. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if a valid list of metadata blocks was read from - * \a handle, else \c false. On failure, check the status with - * FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_read_ogg_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); - -/** Checks if writing the given chain would require the use of a - * temporary file, or if it could be written in place. - * - * Under certain conditions, padding can be utilized so that writing - * edited metadata back to the FLAC file does not require rewriting the - * entire file. If rewriting is required, then a temporary workfile is - * required. When writing metadata using callbacks, you must check - * this function to know whether to call - * FLAC__metadata_chain_write_with_callbacks() or - * FLAC__metadata_chain_write_with_callbacks_and_tempfile(). When - * writing with FLAC__metadata_chain_write(), the temporary file is - * handled internally. - * - * \param chain A pointer to an existing chain. - * \param use_padding - * Whether or not padding will be allowed to be used - * during the write. The value of \a use_padding given - * here must match the value later passed to - * FLAC__metadata_chain_write_with_callbacks() or - * FLAC__metadata_chain_write_with_callbacks_with_tempfile(). - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if writing the current chain would require a tempfile, or - * \c false if metadata can be written in place. - */ -FLAC_API FLAC__bool FLAC__metadata_chain_check_if_tempfile_needed(FLAC__Metadata_Chain *chain, FLAC__bool use_padding); - -/** Write all metadata out to the FLAC file. This function tries to be as - * efficient as possible; how the metadata is actually written is shown by - * the following: - * - * If the current chain is the same size as the existing metadata, the new - * data is written in place. - * - * If the current chain is longer than the existing metadata, and - * \a use_padding is \c true, and the last block is a PADDING block of - * sufficient length, the function will truncate the final padding block - * so that the overall size of the metadata is the same as the existing - * metadata, and then just rewrite the metadata. Otherwise, if not all of - * the above conditions are met, the entire FLAC file must be rewritten. - * If you want to use padding this way it is a good idea to call - * FLAC__metadata_chain_sort_padding() first so that you have the maximum - * amount of padding to work with, unless you need to preserve ordering - * of the PADDING blocks for some reason. - * - * If the current chain is shorter than the existing metadata, and - * \a use_padding is \c true, and the final block is a PADDING block, the padding - * is extended to make the overall size the same as the existing data. If - * \a use_padding is \c true and the last block is not a PADDING block, a new - * PADDING block is added to the end of the new data to make it the same - * size as the existing data (if possible, see the note to - * FLAC__metadata_simple_iterator_set_block() about the four byte limit) - * and the new data is written in place. If none of the above apply or - * \a use_padding is \c false, the entire FLAC file is rewritten. - * - * If \a preserve_file_stats is \c true, the owner and modification time will - * be preserved even if the FLAC file is written. - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(), not - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(). - * - * \param chain A pointer to an existing chain. - * \param use_padding See above. - * \param preserve_file_stats See above. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_write(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats); - -/** Write all metadata out to a FLAC stream via callbacks. - * - * (See FLAC__metadata_chain_write() for the details on how padding is - * used to write metadata in place if possible.) - * - * The \a handle must be open for updating and be seekable. The - * equivalent minimum stdio fopen() file mode is \c "r+" (or \c "r+b" - * for Windows). - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned - * \c false. - * - * \param chain A pointer to an existing chain. - * \param use_padding See FLAC__metadata_chain_write() - * \param handle The I/O handle of the FLAC stream to write. The - * handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param callbacks A set of callbacks to use for I/O. The mandatory - * callbacks are \a write and \a seek. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks); - -/** Write all metadata out to a FLAC stream via callbacks. - * - * (See FLAC__metadata_chain_write() for the details on how padding is - * used to write metadata in place if possible.) - * - * This version of the write-with-callbacks function must be used when - * FLAC__metadata_chain_check_if_tempfile_needed() returns true. In - * this function, you must supply an I/O handle corresponding to the - * FLAC file to edit, and a temporary handle to which the new FLAC - * file will be written. It is the caller's job to move this temporary - * FLAC file on top of the original FLAC file to complete the metadata - * edit. - * - * The \a handle must be open for reading and be seekable. The - * equivalent minimum stdio fopen() file mode is \c "r" (or \c "rb" - * for Windows). - * - * The \a temp_handle must be open for writing. The - * equivalent minimum stdio fopen() file mode is \c "w" (or \c "wb" - * for Windows). It should be an empty stream, or at least positioned - * at the start-of-file (in which case it is the caller's duty to - * truncate it on return). - * - * For this write function to be used, the chain must have been read with - * FLAC__metadata_chain_read_with_callbacks()/FLAC__metadata_chain_read_ogg_with_callbacks(), - * not FLAC__metadata_chain_read()/FLAC__metadata_chain_read_ogg(). - * Also, FLAC__metadata_chain_check_if_tempfile_needed() must have returned - * \c true. - * - * \param chain A pointer to an existing chain. - * \param use_padding See FLAC__metadata_chain_write() - * \param handle The I/O handle of the original FLAC stream to read. - * The handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param callbacks A set of callbacks to use for I/O on \a handle. - * The mandatory callbacks are \a read, \a seek, and - * \a eof. - * \param temp_handle The I/O handle of the FLAC stream to write. The - * handle will NOT be closed after the metadata is - * written; that is the duty of the caller. - * \param temp_callbacks - * A set of callbacks to use for I/O on temp_handle. - * The only mandatory callback is \a write. - * \assert - * \code chain != NULL \endcode - * \retval FLAC__bool - * \c true if the write succeeded, else \c false. On failure, - * check the status with FLAC__metadata_chain_status(). - */ -FLAC_API FLAC__bool FLAC__metadata_chain_write_with_callbacks_and_tempfile(FLAC__Metadata_Chain *chain, FLAC__bool use_padding, FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, FLAC__IOHandle temp_handle, FLAC__IOCallbacks temp_callbacks); - -/** Merge adjacent PADDING blocks into a single block. - * - * \note This function does not write to the FLAC file, it only - * modifies the chain. - * - * \warning Any iterator on the current chain will become invalid after this - * call. You should delete the iterator and get a new one. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_chain_merge_padding(FLAC__Metadata_Chain *chain); - -/** This function will move all PADDING blocks to the end on the metadata, - * then merge them into a single block. - * - * \note This function does not write to the FLAC file, it only - * modifies the chain. - * - * \warning Any iterator on the current chain will become invalid after this - * call. You should delete the iterator and get a new one. - * - * \param chain A pointer to an existing chain. - * \assert - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_chain_sort_padding(FLAC__Metadata_Chain *chain); - - -/*********** FLAC__Metadata_Iterator ***********/ - -/** Create a new iterator instance. - * - * \retval FLAC__Metadata_Iterator* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__Metadata_Iterator *FLAC__metadata_iterator_new(void); - -/** Free an iterator instance. Deletes the object pointed to by \a iterator. - * - * \param iterator A pointer to an existing iterator. - * \assert - * \code iterator != NULL \endcode - */ -FLAC_API void FLAC__metadata_iterator_delete(FLAC__Metadata_Iterator *iterator); - -/** Initialize the iterator to point to the first metadata block in the - * given chain. - * - * \param iterator A pointer to an existing iterator. - * \param chain A pointer to an existing and initialized (read) chain. - * \assert - * \code iterator != NULL \endcode - * \code chain != NULL \endcode - */ -FLAC_API void FLAC__metadata_iterator_init(FLAC__Metadata_Iterator *iterator, FLAC__Metadata_Chain *chain); - -/** Moves the iterator forward one metadata block, returning \c false if - * already at the end. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if already at the last metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_next(FLAC__Metadata_Iterator *iterator); - -/** Moves the iterator backward one metadata block, returning \c false if - * already at the beginning. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if already at the first metadata block of the chain, else - * \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_prev(FLAC__Metadata_Iterator *iterator); - -/** Get the type of the metadata block at the current position. - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__MetadataType - * The type of the metadata block at the current iterator position. - */ -FLAC_API FLAC__MetadataType FLAC__metadata_iterator_get_block_type(const FLAC__Metadata_Iterator *iterator); - -/** Get the metadata block at the current position. You can modify - * the block in place but must write the chain before the changes - * are reflected to the FLAC file. You do not need to call - * FLAC__metadata_iterator_set_block() to reflect the changes; - * the pointer returned by FLAC__metadata_iterator_get_block() - * points directly into the chain. - * - * \warning - * Do not call FLAC__metadata_object_delete() on the returned object; - * to delete a block use FLAC__metadata_iterator_delete_block(). - * - * \param iterator A pointer to an existing initialized iterator. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__StreamMetadata* - * The current metadata block. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_iterator_get_block(FLAC__Metadata_Iterator *iterator); - -/** Set the metadata block at the current position, replacing the existing - * block. The new block passed in becomes owned by the chain and it will be - * deleted when the chain is deleted. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \code block != NULL \endcode - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_set_block(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); - -/** Removes the current block from the chain. If \a replace_with_padding is - * \c true, the block will instead be replaced with a padding block of equal - * size. You can not delete the STREAMINFO block. The iterator will be - * left pointing to the block before the one just "deleted", even if - * \a replace_with_padding is \c true. - * - * \param iterator A pointer to an existing initialized iterator. - * \param replace_with_padding See above. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, - * otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__Metadata_Iterator *iterator, FLAC__bool replace_with_padding); - -/** Insert a new block before the current block. You cannot insert a block - * before the first STREAMINFO block. You cannot insert a STREAMINFO block - * as there can be only one, the one that already exists at the head when you - * read in a chain. The chain takes ownership of the new block and it will be - * deleted when the chain is deleted. The iterator will be left pointing to - * the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block to insert. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); - -/** Insert a new block after the current block. You cannot insert a STREAMINFO - * block as there can be only one, the one that already exists at the head when - * you read in a chain. The chain takes ownership of the new block and it will - * be deleted when the chain is deleted. The iterator will be left pointing to - * the new block. - * - * \param iterator A pointer to an existing initialized iterator. - * \param block A pointer to a metadata block to insert. - * \assert - * \code iterator != NULL \endcode - * \a iterator has been successfully initialized with - * FLAC__metadata_iterator_init() - * \retval FLAC__bool - * \c false if the conditions in the above description are not met, or - * a memory allocation error occurs, otherwise \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__Metadata_Iterator *iterator, FLAC__StreamMetadata *block); - -/* \} */ - - -/** \defgroup flac_metadata_object FLAC/metadata.h: metadata object methods - * \ingroup flac_metadata - * - * \brief - * This module contains methods for manipulating FLAC metadata objects. - * - * Since many are variable length we have to be careful about the memory - * management. We decree that all pointers to data in the object are - * owned by the object and memory-managed by the object. - * - * Use the FLAC__metadata_object_new() and FLAC__metadata_object_delete() - * functions to create all instances. When using the - * FLAC__metadata_object_set_*() functions to set pointers to data, set - * \a copy to \c true to have the function make it's own copy of the data, or - * to \c false to give the object ownership of your data. In the latter case - * your pointer must be freeable by free() and will be free()d when the object - * is FLAC__metadata_object_delete()d. It is legal to pass a null pointer as - * the data pointer to a FLAC__metadata_object_set_*() function as long as - * the length argument is 0 and the \a copy argument is \c false. - * - * The FLAC__metadata_object_new() and FLAC__metadata_object_clone() function - * will return \c NULL in the case of a memory allocation error, otherwise a new - * object. The FLAC__metadata_object_set_*() functions return \c false in the - * case of a memory allocation error. - * - * We don't have the convenience of C++ here, so note that the library relies - * on you to keep the types straight. In other words, if you pass, for - * example, a FLAC__StreamMetadata* that represents a STREAMINFO block to - * FLAC__metadata_object_application_set_data(), you will get an assertion - * failure. - * - * For convenience the FLAC__metadata_object_vorbiscomment_*() functions - * maintain a trailing NUL on each Vorbis comment entry. This is not counted - * toward the length or stored in the stream, but it can make working with plain - * comments (those that don't contain embedded-NULs in the value) easier. - * Entries passed into these functions have trailing NULs added if missing, and - * returned entries are guaranteed to have a trailing NUL. - * - * The FLAC__metadata_object_vorbiscomment_*() functions that take a Vorbis - * comment entry/name/value will first validate that it complies with the Vorbis - * comment specification and return false if it does not. - * - * There is no need to recalculate the length field on metadata blocks you - * have modified. They will be calculated automatically before they are - * written back to a file. - * - * \{ - */ - - -/** Create a new metadata object instance of the given type. - * - * The object will be "empty"; i.e. values and data pointers will be \c 0, - * with the exception of FLAC__METADATA_TYPE_VORBIS_COMMENT, which will have - * the vendor string set (but zero comments). - * - * Do not pass in a value greater than or equal to - * \a FLAC__METADATA_TYPE_UNDEFINED unless you really know what you're - * doing. - * - * \param type Type of object to create - * \retval FLAC__StreamMetadata* - * \c NULL if there was an error allocating memory or the type code is - * greater than FLAC__MAX_METADATA_TYPE_CODE, else the new instance. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_new(FLAC__MetadataType type); - -/** Create a copy of an existing metadata object. - * - * The copy is a "deep" copy, i.e. dynamically allocated data within the - * object is also copied. The caller takes ownership of the new block and - * is responsible for freeing it with FLAC__metadata_object_delete(). - * - * \param object Pointer to object to copy. - * \assert - * \code object != NULL \endcode - * \retval FLAC__StreamMetadata* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamMetadata *FLAC__metadata_object_clone(const FLAC__StreamMetadata *object); - -/** Free a metadata object. Deletes the object pointed to by \a object. - * - * The delete is a "deep" delete, i.e. dynamically allocated data within the - * object is also deleted. - * - * \param object A pointer to an existing object. - * \assert - * \code object != NULL \endcode - */ -FLAC_API void FLAC__metadata_object_delete(FLAC__StreamMetadata *object); - -/** Compares two metadata objects. - * - * The compare is "deep", i.e. dynamically allocated data within the - * object is also compared. - * - * \param block1 A pointer to an existing object. - * \param block2 A pointer to an existing object. - * \assert - * \code block1 != NULL \endcode - * \code block2 != NULL \endcode - * \retval FLAC__bool - * \c true if objects are identical, else \c false. - */ -FLAC_API FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2); - -/** Sets the application data of an APPLICATION block. - * - * If \a copy is \c true, a copy of the data is stored; otherwise, the object - * takes ownership of the pointer. The existing data will be freed if this - * function is successful, otherwise the original data will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a data if \a copy is \c true. - * - * \param object A pointer to an existing APPLICATION object. - * \param data A pointer to the data to set. - * \param length The length of \a data in bytes. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_APPLICATION \endcode - * \code (data != NULL && length > 0) || - * (data == NULL && length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, unsigned length, FLAC__bool copy); - -/** Resize the seekpoint array. - * - * If the size shrinks, elements will truncated; if it grows, new placeholder - * points will be added to the end. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param new_num_points The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code (object->data.seek_table.points == NULL && object->data.seek_table.num_points == 0) || - * (object->data.seek_table.points != NULL && object->data.seek_table.num_points > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetadata *object, unsigned new_num_points); - -/** Set a seekpoint in a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \param point The point to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points > point_num \endcode - */ -FLAC_API void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); - -/** Insert a seekpoint into a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \param point The point to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points >= point_num \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetadata *object, unsigned point_num, FLAC__StreamMetadata_SeekPoint point); - -/** Delete a seekpoint from a seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param point_num Index into seekpoint array to set. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code object->data.seek_table.num_points > point_num \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetadata *object, unsigned point_num); - -/** Check a seektable to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * seektable. - * - * \param object A pointer to an existing SEEKTABLE object. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if seek table is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_is_legal(const FLAC__StreamMetadata *object); - -/** Append a number of placeholder points to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param num The number of placeholder points to append. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_placeholders(FLAC__StreamMetadata *object, unsigned num); - -/** Append a specific seek point template to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param sample_number The sample number of the seek point template. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_point(FLAC__StreamMetadata *object, FLAC__uint64 sample_number); - -/** Append specific seek point templates to the end of a seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param sample_numbers An array of sample numbers for the seek points. - * \param num The number of seek point templates to append. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_points(FLAC__StreamMetadata *object, FLAC__uint64 sample_numbers[], unsigned num); - -/** Append a set of evenly-spaced seek point templates to the end of a - * seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param num The number of placeholder points to append. - * \param total_samples The total number of samples to be encoded; - * the seekpoints will be spaced approximately - * \a total_samples / \a num samples apart. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code total_samples > 0 \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points(FLAC__StreamMetadata *object, unsigned num, FLAC__uint64 total_samples); - -/** Append a set of evenly-spaced seek point templates to the end of a - * seek table. - * - * \note - * As with the other ..._seektable_template_... functions, you should - * call FLAC__metadata_object_seektable_template_sort() when finished - * to make the seek table legal. - * - * \param object A pointer to an existing SEEKTABLE object. - * \param samples The number of samples apart to space the placeholder - * points. The first point will be at sample \c 0, the - * second at sample \a samples, then 2*\a samples, and - * so on. As long as \a samples and \a total_samples - * are greater than \c 0, there will always be at least - * one seekpoint at sample \c 0. - * \param total_samples The total number of samples to be encoded; - * the seekpoints will be spaced - * \a samples samples apart. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \code samples > 0 \endcode - * \code total_samples > 0 \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_append_spaced_points_by_samples(FLAC__StreamMetadata *object, unsigned samples, FLAC__uint64 total_samples); - -/** Sort a seek table's seek points according to the format specification, - * removing duplicates. - * - * \param object A pointer to a seek table to be sorted. - * \param compact If \c false, behaves like FLAC__format_seektable_sort(). - * If \c true, duplicates are deleted and the seek table is - * shrunk appropriately; the number of placeholder points - * present in the seek table will be the same after the call - * as before. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_SEEKTABLE \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_seektable_template_sort(FLAC__StreamMetadata *object, FLAC__bool compact); - -/** Sets the vendor string in a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The entry to set the vendor string to. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Resize the comment array. - * - * If the size shrinks, elements will truncated; if it grows, new empty - * fields will be added to the end. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param new_num_comments The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (object->data.vorbis_comment.comments == NULL && object->data.vorbis_comment.num_comments == 0) || - * (object->data.vorbis_comment.comments != NULL && object->data.vorbis_comment.num_comments > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetadata *object, unsigned new_num_comments); - -/** Sets a comment in a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num Index into comment array to set. - * \param entry The entry to set the comment to. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code comment_num < object->data.vorbis_comment.num_comments \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Insert a comment in a VORBIS_COMMENT block at the given index. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num The index at which to insert the comment. The comments - * at and after \a comment_num move right one position. - * To append a comment to the end, set \a comment_num to - * \c object->data.vorbis_comment.num_comments . - * \param entry The comment to insert. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code object->data.vorbis_comment.num_comments >= comment_num \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetadata *object, unsigned comment_num, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Appends a comment to a VORBIS_COMMENT block. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The comment to insert. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_append_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool copy); - -/** Replaces comments in a VORBIS_COMMENT block with a new one. - * - * For convenience, a trailing NUL is added to the entry if it doesn't have - * one already. - * - * Depending on the the value of \a all, either all or just the first comment - * whose field name(s) match the given entry's name will be replaced by the - * given entry. If no comments match, \a entry will simply be appended. - * - * If \a copy is \c true, a copy of the entry is stored; otherwise, the object - * takes ownership of the \c entry.entry pointer. - * - * \note If this function returns \c false, the caller still owns the - * pointer. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param entry The comment to insert. - * \param all If \c true, all comments whose field name matches - * \a entry's field name will be removed, and \a entry will - * be inserted at the position of the first matching - * comment. If \c false, only the first comment whose - * field name matches \a entry's field name will be - * replaced with \a entry. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code (entry.entry != NULL && entry.length > 0) || - * (entry.entry == NULL && entry.length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_replace_comment(FLAC__StreamMetadata *object, FLAC__StreamMetadata_VorbisComment_Entry entry, FLAC__bool all, FLAC__bool copy); - -/** Delete a comment in a VORBIS_COMMENT block at the given index. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param comment_num The index of the comment to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code object->data.vorbis_comment.num_comments > comment_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetadata *object, unsigned comment_num); - -/** Creates a Vorbis comment entry from NUL-terminated name and value strings. - * - * On return, the filled-in \a entry->entry pointer will point to malloc()ed - * memory and shall be owned by the caller. For convenience the entry will - * have a terminating NUL. - * - * \param entry A pointer to a Vorbis comment entry. The entry's - * \c entry pointer should not point to allocated - * memory as it will be overwritten. - * \param field_name The field name in ASCII, \c NUL terminated. - * \param field_value The field value in UTF-8, \c NUL terminated. - * \assert - * \code entry != NULL \endcode - * \code field_name != NULL \endcode - * \code field_value != NULL \endcode - * \retval FLAC__bool - * \c false if malloc() fails, or if \a field_name or \a field_value does - * not comply with the Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_from_name_value_pair(FLAC__StreamMetadata_VorbisComment_Entry *entry, const char *field_name, const char *field_value); - -/** Splits a Vorbis comment entry into NUL-terminated name and value strings. - * - * The returned pointers to name and value will be allocated by malloc() - * and shall be owned by the caller. - * - * \param entry An existing Vorbis comment entry. - * \param field_name The address of where the returned pointer to the - * field name will be stored. - * \param field_value The address of where the returned pointer to the - * field value will be stored. - * \assert - * \code (entry.entry != NULL && entry.length > 0) \endcode - * \code memchr(entry.entry, '=', entry.length) != NULL \endcode - * \code field_name != NULL \endcode - * \code field_value != NULL \endcode - * \retval FLAC__bool - * \c false if memory allocation fails or \a entry does not comply with the - * Vorbis comment specification, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_to_name_value_pair(const FLAC__StreamMetadata_VorbisComment_Entry entry, char **field_name, char **field_value); - -/** Check if the given Vorbis comment entry's field name matches the given - * field name. - * - * \param entry An existing Vorbis comment entry. - * \param field_name The field name to check. - * \param field_name_length The length of \a field_name, not including the - * terminating \c NUL. - * \assert - * \code (entry.entry != NULL && entry.length > 0) \endcode - * \retval FLAC__bool - * \c true if the field names match, else \c false - */ -FLAC_API FLAC__bool FLAC__metadata_object_vorbiscomment_entry_matches(const FLAC__StreamMetadata_VorbisComment_Entry entry, const char *field_name, unsigned field_name_length); - -/** Find a Vorbis comment with the given field name. - * - * The search begins at entry number \a offset; use an offset of 0 to - * search from the beginning of the comment array. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param offset The offset into the comment array from where to start - * the search. - * \param field_name The field name of the comment to find. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \code field_name != NULL \endcode - * \retval int - * The offset in the comment array of the first comment whose field - * name matches \a field_name, or \c -1 if no match was found. - */ -FLAC_API int FLAC__metadata_object_vorbiscomment_find_entry_from(const FLAC__StreamMetadata *object, unsigned offset, const char *field_name); - -/** Remove first Vorbis comment matching the given field name. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param field_name The field name of comment to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \retval int - * \c -1 for memory allocation error, \c 0 for no matching entries, - * \c 1 for one matching entry deleted. - */ -FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entry_matching(FLAC__StreamMetadata *object, const char *field_name); - -/** Remove all Vorbis comments matching the given field name. - * - * \param object A pointer to an existing VORBIS_COMMENT object. - * \param field_name The field name of comments to delete. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_VORBIS_COMMENT \endcode - * \retval int - * \c -1 for memory allocation error, \c 0 for no matching entries, - * else the number of matching entries deleted. - */ -FLAC_API int FLAC__metadata_object_vorbiscomment_remove_entries_matching(FLAC__StreamMetadata *object, const char *field_name); - -/** Create a new CUESHEET track instance. - * - * The object will be "empty"; i.e. values and data pointers will be \c 0. - * - * \retval FLAC__StreamMetadata_CueSheet_Track* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_new(void); - -/** Create a copy of an existing CUESHEET track object. - * - * The copy is a "deep" copy, i.e. dynamically allocated data within the - * object is also copied. The caller takes ownership of the new object and - * is responsible for freeing it with - * FLAC__metadata_object_cuesheet_track_delete(). - * - * \param object Pointer to object to copy. - * \assert - * \code object != NULL \endcode - * \retval FLAC__StreamMetadata_CueSheet_Track* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamMetadata_CueSheet_Track *FLAC__metadata_object_cuesheet_track_clone(const FLAC__StreamMetadata_CueSheet_Track *object); - -/** Delete a CUESHEET track object - * - * \param object A pointer to an existing CUESHEET track object. - * \assert - * \code object != NULL \endcode - */ -FLAC_API void FLAC__metadata_object_cuesheet_track_delete(FLAC__StreamMetadata_CueSheet_Track *object); - -/** Resize a track's index point array. - * - * If the size shrinks, elements will truncated; if it grows, new blank - * indices will be added to the end. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param new_num_indices The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code (object->data.cue_sheet.tracks[track_num].indices == NULL && object->data.cue_sheet.tracks[track_num].num_indices == 0) || - * (object->data.cue_sheet.tracks[track_num].indices != NULL && object->data.cue_sheet.tracks[track_num].num_indices > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_resize_indices(FLAC__StreamMetadata *object, unsigned track_num, unsigned new_num_indices); - -/** Insert an index point in a CUESHEET track at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param index_num The index into the track's index array at which to - * insert the index point. NOTE: this is not necessarily - * the same as the index point's \a number field. The - * indices at and after \a index_num move right one - * position. To append an index point to the end, set - * \a index_num to - * \c object->data.cue_sheet.tracks[track_num].num_indices . - * \param index The index point to insert. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num, FLAC__StreamMetadata_CueSheet_Index index); - -/** Insert a blank index point in a CUESHEET track at the given index. - * - * A blank index point is one in which all field values are zero. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index of the track to modify. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param index_num The index into the track's index array at which to - * insert the index point. NOTE: this is not necessarily - * the same as the index point's \a number field. The - * indices at and after \a index_num move right one - * position. To append an index point to the end, set - * \a index_num to - * \c object->data.cue_sheet.tracks[track_num].num_indices . - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices >= index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_insert_blank_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); - -/** Delete an index point in a CUESHEET track at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index into the track array of the track to - * modify. NOTE: this is not necessarily the same - * as the track's \a number field. - * \param index_num The index into the track's index array of the index - * to delete. NOTE: this is not necessarily the same - * as the index's \a number field. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \code object->data.cue_sheet.tracks[track_num].num_indices > index_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_track_delete_index(FLAC__StreamMetadata *object, unsigned track_num, unsigned index_num); - -/** Resize the track array. - * - * If the size shrinks, elements will truncated; if it grows, new blank - * tracks will be added to the end. - * - * \param object A pointer to an existing CUESHEET object. - * \param new_num_tracks The desired length of the array; may be \c 0. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code (object->data.cue_sheet.tracks == NULL && object->data.cue_sheet.num_tracks == 0) || - * (object->data.cue_sheet.tracks != NULL && object->data.cue_sheet.num_tracks > 0) \endcode - * \retval FLAC__bool - * \c false if memory allocation error, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_resize_tracks(FLAC__StreamMetadata *object, unsigned new_num_tracks); - -/** Sets a track in a CUESHEET block. - * - * If \a copy is \c true, a copy of the track is stored; otherwise, the object - * takes ownership of the \a track pointer. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num Index into track array to set. NOTE: this is not - * necessarily the same as the track's \a number field. - * \param track The track to set the track to. You may safely pass in - * a const pointer if \a copy is \c true. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code track_num < object->data.cue_sheet.num_tracks \endcode - * \code (track->indices != NULL && track->num_indices > 0) || - * (track->indices == NULL && track->num_indices == 0) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_set_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); - -/** Insert a track in a CUESHEET block at the given index. - * - * If \a copy is \c true, a copy of the track is stored; otherwise, the object - * takes ownership of the \a track pointer. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index at which to insert the track. NOTE: this - * is not necessarily the same as the track's \a number - * field. The tracks at and after \a track_num move right - * one position. To append a track to the end, set - * \a track_num to \c object->data.cue_sheet.num_tracks . - * \param track The track to insert. You may safely pass in a const - * pointer if \a copy is \c true. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks >= track_num \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_track(FLAC__StreamMetadata *object, unsigned track_num, FLAC__StreamMetadata_CueSheet_Track *track, FLAC__bool copy); - -/** Insert a blank track in a CUESHEET block at the given index. - * - * A blank track is one in which all field values are zero. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index at which to insert the track. NOTE: this - * is not necessarily the same as the track's \a number - * field. The tracks at and after \a track_num move right - * one position. To append a track to the end, set - * \a track_num to \c object->data.cue_sheet.num_tracks . - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks >= track_num \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_insert_blank_track(FLAC__StreamMetadata *object, unsigned track_num); - -/** Delete a track in a CUESHEET block at the given index. - * - * \param object A pointer to an existing CUESHEET object. - * \param track_num The index into the track array of the track to - * delete. NOTE: this is not necessarily the same - * as the track's \a number field. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \code object->data.cue_sheet.num_tracks > track_num \endcode - * \retval FLAC__bool - * \c false if realloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_delete_track(FLAC__StreamMetadata *object, unsigned track_num); - -/** Check a cue sheet to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * cue sheet. - * - * \param object A pointer to an existing CUESHEET object. - * \param check_cd_da_subset If \c true, check CUESHEET against more - * stringent requirements for a CD-DA (audio) disc. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \retval FLAC__bool - * \c false if cue sheet is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_cuesheet_is_legal(const FLAC__StreamMetadata *object, FLAC__bool check_cd_da_subset, const char **violation); - -/** Calculate and return the CDDB/freedb ID for a cue sheet. The function - * assumes the cue sheet corresponds to a CD; the result is undefined - * if the cuesheet's is_cd bit is not set. - * - * \param object A pointer to an existing CUESHEET object. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_CUESHEET \endcode - * \retval FLAC__uint32 - * The unsigned integer representation of the CDDB/freedb ID - */ -FLAC_API FLAC__uint32 FLAC__metadata_object_cuesheet_calculate_cddb_id(const FLAC__StreamMetadata *object); - -/** Sets the MIME type of a PICTURE block. - * - * If \a copy is \c true, a copy of the string is stored; otherwise, the object - * takes ownership of the pointer. The existing string will be freed if this - * function is successful, otherwise the original string will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a mime_type if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param mime_type A pointer to the MIME type string. The string must be - * ASCII characters 0x20-0x7e, NUL-terminated. No validation - * is done. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (mime_type != NULL) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_mime_type(FLAC__StreamMetadata *object, char *mime_type, FLAC__bool copy); - -/** Sets the description of a PICTURE block. - * - * If \a copy is \c true, a copy of the string is stored; otherwise, the object - * takes ownership of the pointer. The existing string will be freed if this - * function is successful, otherwise the original string will remain if \a copy - * is \c true and malloc() fails. - * - * \note It is safe to pass a const pointer to \a description if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param description A pointer to the description string. The string must be - * valid UTF-8, NUL-terminated. No validation is done. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (description != NULL) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_description(FLAC__StreamMetadata *object, FLAC__byte *description, FLAC__bool copy); - -/** Sets the picture data of a PICTURE block. - * - * If \a copy is \c true, a copy of the data is stored; otherwise, the object - * takes ownership of the pointer. Also sets the \a data_length field of the - * metadata object to what is passed in as the \a length parameter. The - * existing data will be freed if this function is successful, otherwise the - * original data and data_length will remain if \a copy is \c true and - * malloc() fails. - * - * \note It is safe to pass a const pointer to \a data if \a copy is \c true. - * - * \param object A pointer to an existing PICTURE object. - * \param data A pointer to the data to set. - * \param length The length of \a data in bytes. - * \param copy See above. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \code (data != NULL && length > 0) || - * (data == NULL && length == 0 && copy == false) \endcode - * \retval FLAC__bool - * \c false if \a copy is \c true and malloc() fails, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_set_data(FLAC__StreamMetadata *object, FLAC__byte *data, FLAC__uint32 length, FLAC__bool copy); - -/** Check a PICTURE block to see if it conforms to the FLAC specification. - * See the format specification for limits on the contents of the - * PICTURE block. - * - * \param object A pointer to existing PICTURE block to be checked. - * \param violation Address of a pointer to a string. If there is a - * violation, a pointer to a string explanation of the - * violation will be returned here. \a violation may be - * \c NULL if you don't need the returned string. Do not - * free the returned string; it will always point to static - * data. - * \assert - * \code object != NULL \endcode - * \code object->type == FLAC__METADATA_TYPE_PICTURE \endcode - * \retval FLAC__bool - * \c false if PICTURE block is illegal, else \c true. - */ -FLAC_API FLAC__bool FLAC__metadata_object_picture_is_legal(const FLAC__StreamMetadata *object, const char **violation); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h deleted file mode 100755 index 0bab9c2..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/ordinals.h +++ /dev/null @@ -1,86 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__ORDINALS_H -#define FLAC__ORDINALS_H - -#if defined(_MSC_VER) && _MSC_VER < 1600 - -/* Microsoft Visual Studio earlier than the 2010 version did not provide - * the 1999 ISO C Standard header file . - */ - -typedef __int8 FLAC__int8; -typedef unsigned __int8 FLAC__uint8; - -typedef __int16 FLAC__int16; -typedef __int32 FLAC__int32; -typedef __int64 FLAC__int64; -typedef unsigned __int16 FLAC__uint16; -typedef unsigned __int32 FLAC__uint32; -typedef unsigned __int64 FLAC__uint64; - -#else - -/* For MSVC 2010 and everything else which provides . */ - -#include - -typedef int8_t FLAC__int8; -typedef uint8_t FLAC__uint8; - -typedef int16_t FLAC__int16; -typedef int32_t FLAC__int32; -typedef int64_t FLAC__int64; -typedef uint16_t FLAC__uint16; -typedef uint32_t FLAC__uint32; -typedef uint64_t FLAC__uint64; - -#endif - -typedef int FLAC__bool; - -typedef FLAC__uint8 FLAC__byte; - - -#ifdef true -#undef true -#endif -#ifdef false -#undef false -#endif -#ifndef __cplusplus -#define true 1 -#define false 0 -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h deleted file mode 100755 index 50cd754..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_decoder.h +++ /dev/null @@ -1,1560 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__STREAM_DECODER_H -#define FLAC__STREAM_DECODER_H - -#include /* for FILE */ -#include "export.h" -#include "format.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/** \file include/FLAC/stream_decoder.h - * - * \brief - * This module contains the functions which implement the stream - * decoder. - * - * See the detailed documentation in the - * \link flac_stream_decoder stream decoder \endlink module. - */ - -/** \defgroup flac_decoder FLAC/ \*_decoder.h: decoder interfaces - * \ingroup flac - * - * \brief - * This module describes the decoder layers provided by libFLAC. - * - * The stream decoder can be used to decode complete streams either from - * the client via callbacks, or directly from a file, depending on how - * it is initialized. When decoding via callbacks, the client provides - * callbacks for reading FLAC data and writing decoded samples, and - * handling metadata and errors. If the client also supplies seek-related - * callback, the decoder function for sample-accurate seeking within the - * FLAC input is also available. When decoding from a file, the client - * needs only supply a filename or open \c FILE* and write/metadata/error - * callbacks; the rest of the callbacks are supplied internally. For more - * info see the \link flac_stream_decoder stream decoder \endlink module. - */ - -/** \defgroup flac_stream_decoder FLAC/stream_decoder.h: stream decoder interface - * \ingroup flac_decoder - * - * \brief - * This module contains the functions which implement the stream - * decoder. - * - * The stream decoder can decode native FLAC, and optionally Ogg FLAC - * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. - * - * The basic usage of this decoder is as follows: - * - The program creates an instance of a decoder using - * FLAC__stream_decoder_new(). - * - The program overrides the default settings using - * FLAC__stream_decoder_set_*() functions. - * - The program initializes the instance to validate the settings and - * prepare for decoding using - * - FLAC__stream_decoder_init_stream() or FLAC__stream_decoder_init_FILE() - * or FLAC__stream_decoder_init_file() for native FLAC, - * - FLAC__stream_decoder_init_ogg_stream() or FLAC__stream_decoder_init_ogg_FILE() - * or FLAC__stream_decoder_init_ogg_file() for Ogg FLAC - * - The program calls the FLAC__stream_decoder_process_*() functions - * to decode data, which subsequently calls the callbacks. - * - The program finishes the decoding with FLAC__stream_decoder_finish(), - * which flushes the input and output and resets the decoder to the - * uninitialized state. - * - The instance may be used again or deleted with - * FLAC__stream_decoder_delete(). - * - * In more detail, the program will create a new instance by calling - * FLAC__stream_decoder_new(), then call FLAC__stream_decoder_set_*() - * functions to override the default decoder options, and call - * one of the FLAC__stream_decoder_init_*() functions. - * - * There are three initialization functions for native FLAC, one for - * setting up the decoder to decode FLAC data from the client via - * callbacks, and two for decoding directly from a FLAC file. - * - * For decoding via callbacks, use FLAC__stream_decoder_init_stream(). - * You must also supply several callbacks for handling I/O. Some (like - * seeking) are optional, depending on the capabilities of the input. - * - * For decoding directly from a file, use FLAC__stream_decoder_init_FILE() - * or FLAC__stream_decoder_init_file(). Then you must only supply an open - * \c FILE* or filename and fewer callbacks; the decoder will handle - * the other callbacks internally. - * - * There are three similarly-named init functions for decoding from Ogg - * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the - * library has been built with Ogg support. - * - * Once the decoder is initialized, your program will call one of several - * functions to start the decoding process: - * - * - FLAC__stream_decoder_process_single() - Tells the decoder to process at - * most one metadata block or audio frame and return, calling either the - * metadata callback or write callback, respectively, once. If the decoder - * loses sync it will return with only the error callback being called. - * - FLAC__stream_decoder_process_until_end_of_metadata() - Tells the decoder - * to process the stream from the current location and stop upon reaching - * the first audio frame. The client will get one metadata, write, or error - * callback per metadata block, audio frame, or sync error, respectively. - * - FLAC__stream_decoder_process_until_end_of_stream() - Tells the decoder - * to process the stream from the current location until the read callback - * returns FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM or - * FLAC__STREAM_DECODER_READ_STATUS_ABORT. The client will get one metadata, - * write, or error callback per metadata block, audio frame, or sync error, - * respectively. - * - * When the decoder has finished decoding (normally or through an abort), - * the instance is finished by calling FLAC__stream_decoder_finish(), which - * ensures the decoder is in the correct state and frees memory. Then the - * instance may be deleted with FLAC__stream_decoder_delete() or initialized - * again to decode another stream. - * - * Seeking is exposed through the FLAC__stream_decoder_seek_absolute() method. - * At any point after the stream decoder has been initialized, the client can - * call this function to seek to an exact sample within the stream. - * Subsequently, the first time the write callback is called it will be - * passed a (possibly partial) block starting at that sample. - * - * If the client cannot seek via the callback interface provided, but still - * has another way of seeking, it can flush the decoder using - * FLAC__stream_decoder_flush() and start feeding data from the new position - * through the read callback. - * - * The stream decoder also provides MD5 signature checking. If this is - * turned on before initialization, FLAC__stream_decoder_finish() will - * report when the decoded MD5 signature does not match the one stored - * in the STREAMINFO block. MD5 checking is automatically turned off - * (until the next FLAC__stream_decoder_reset()) if there is no signature - * in the STREAMINFO block or when a seek is attempted. - * - * The FLAC__stream_decoder_set_metadata_*() functions deserve special - * attention. By default, the decoder only calls the metadata_callback for - * the STREAMINFO block. These functions allow you to tell the decoder - * explicitly which blocks to parse and return via the metadata_callback - * and/or which to skip. Use a FLAC__stream_decoder_set_metadata_respond_all(), - * FLAC__stream_decoder_set_metadata_ignore() ... or FLAC__stream_decoder_set_metadata_ignore_all(), - * FLAC__stream_decoder_set_metadata_respond() ... sequence to exactly specify - * which blocks to return. Remember that metadata blocks can potentially - * be big (for example, cover art) so filtering out the ones you don't - * use can reduce the memory requirements of the decoder. Also note the - * special forms FLAC__stream_decoder_set_metadata_respond_application(id) - * and FLAC__stream_decoder_set_metadata_ignore_application(id) for - * filtering APPLICATION blocks based on the application ID. - * - * STREAMINFO and SEEKTABLE blocks are always parsed and used internally, but - * they still can legally be filtered from the metadata_callback. - * - * \note - * The "set" functions may only be called when the decoder is in the - * state FLAC__STREAM_DECODER_UNINITIALIZED, i.e. after - * FLAC__stream_decoder_new() or FLAC__stream_decoder_finish(), but - * before FLAC__stream_decoder_init_*(). If this is the case they will - * return \c true, otherwise \c false. - * - * \note - * FLAC__stream_decoder_finish() resets all settings to the constructor - * defaults, including the callbacks. - * - * \{ - */ - - -/** State values for a FLAC__StreamDecoder - * - * The decoder's state can be obtained by calling FLAC__stream_decoder_get_state(). - */ -typedef enum { - - FLAC__STREAM_DECODER_SEARCH_FOR_METADATA = 0, - /**< The decoder is ready to search for metadata. */ - - FLAC__STREAM_DECODER_READ_METADATA, - /**< The decoder is ready to or is in the process of reading metadata. */ - - FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC, - /**< The decoder is ready to or is in the process of searching for the - * frame sync code. - */ - - FLAC__STREAM_DECODER_READ_FRAME, - /**< The decoder is ready to or is in the process of reading a frame. */ - - FLAC__STREAM_DECODER_END_OF_STREAM, - /**< The decoder has reached the end of the stream. */ - - FLAC__STREAM_DECODER_OGG_ERROR, - /**< An error occurred in the underlying Ogg layer. */ - - FLAC__STREAM_DECODER_SEEK_ERROR, - /**< An error occurred while seeking. The decoder must be flushed - * with FLAC__stream_decoder_flush() or reset with - * FLAC__stream_decoder_reset() before decoding can continue. - */ - - FLAC__STREAM_DECODER_ABORTED, - /**< The decoder was aborted by the read callback. */ - - FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR, - /**< An error occurred allocating memory. The decoder is in an invalid - * state and can no longer be used. - */ - - FLAC__STREAM_DECODER_UNINITIALIZED - /**< The decoder is in the uninitialized state; one of the - * FLAC__stream_decoder_init_*() functions must be called before samples - * can be processed. - */ - -} FLAC__StreamDecoderState; - -/** Maps a FLAC__StreamDecoderState to a C string. - * - * Using a FLAC__StreamDecoderState as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderStateString[]; - - -/** Possible return values for the FLAC__stream_decoder_init_*() functions. - */ -typedef enum { - - FLAC__STREAM_DECODER_INIT_STATUS_OK = 0, - /**< Initialization was successful. */ - - FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER, - /**< The library was not compiled with support for the given container - * format. - */ - - FLAC__STREAM_DECODER_INIT_STATUS_INVALID_CALLBACKS, - /**< A required callback was not supplied. */ - - FLAC__STREAM_DECODER_INIT_STATUS_MEMORY_ALLOCATION_ERROR, - /**< An error occurred allocating memory. */ - - FLAC__STREAM_DECODER_INIT_STATUS_ERROR_OPENING_FILE, - /**< fopen() failed in FLAC__stream_decoder_init_file() or - * FLAC__stream_decoder_init_ogg_file(). */ - - FLAC__STREAM_DECODER_INIT_STATUS_ALREADY_INITIALIZED - /**< FLAC__stream_decoder_init_*() was called when the decoder was - * already initialized, usually because - * FLAC__stream_decoder_finish() was not called. - */ - -} FLAC__StreamDecoderInitStatus; - -/** Maps a FLAC__StreamDecoderInitStatus to a C string. - * - * Using a FLAC__StreamDecoderInitStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderInitStatusString[]; - - -/** Return values for the FLAC__StreamDecoder read callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, - /**< The read was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM, - /**< The read was attempted while at the end of the stream. Note that - * the client must only return this value when the read callback was - * called when already at the end of the stream. Otherwise, if the read - * itself moves to the end of the stream, the client should still return - * the data and \c FLAC__STREAM_DECODER_READ_STATUS_CONTINUE, and then on - * the next read callback it should return - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM with a byte count - * of \c 0. - */ - - FLAC__STREAM_DECODER_READ_STATUS_ABORT - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - -} FLAC__StreamDecoderReadStatus; - -/** Maps a FLAC__StreamDecoderReadStatus to a C string. - * - * Using a FLAC__StreamDecoderReadStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderReadStatusString[]; - - -/** Return values for the FLAC__StreamDecoder seek callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_SEEK_STATUS_OK, - /**< The seek was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_SEEK_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - - FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - /**< Client does not support seeking. */ - -} FLAC__StreamDecoderSeekStatus; - -/** Maps a FLAC__StreamDecoderSeekStatus to a C string. - * - * Using a FLAC__StreamDecoderSeekStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderSeekStatusString[]; - - -/** Return values for the FLAC__StreamDecoder tell callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_TELL_STATUS_OK, - /**< The tell was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_TELL_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - - FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - /**< Client does not support telling the position. */ - -} FLAC__StreamDecoderTellStatus; - -/** Maps a FLAC__StreamDecoderTellStatus to a C string. - * - * Using a FLAC__StreamDecoderTellStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderTellStatusString[]; - - -/** Return values for the FLAC__StreamDecoder length callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_LENGTH_STATUS_OK, - /**< The length call was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR, - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - - FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - /**< Client does not support reporting the length. */ - -} FLAC__StreamDecoderLengthStatus; - -/** Maps a FLAC__StreamDecoderLengthStatus to a C string. - * - * Using a FLAC__StreamDecoderLengthStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderLengthStatusString[]; - - -/** Return values for the FLAC__StreamDecoder write callback. - */ -typedef enum { - - FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE, - /**< The write was OK and decoding can continue. */ - - FLAC__STREAM_DECODER_WRITE_STATUS_ABORT - /**< An unrecoverable error occurred. The decoder will return from the process call. */ - -} FLAC__StreamDecoderWriteStatus; - -/** Maps a FLAC__StreamDecoderWriteStatus to a C string. - * - * Using a FLAC__StreamDecoderWriteStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderWriteStatusString[]; - - -/** Possible values passed back to the FLAC__StreamDecoder error callback. - * \c FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC is the generic catch- - * all. The rest could be caused by bad sync (false synchronization on - * data that is not the start of a frame) or corrupted data. The error - * itself is the decoder's best guess at what happened assuming a correct - * sync. For example \c FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER - * could be caused by a correct sync on the start of a frame, but some - * data in the frame header was corrupted. Or it could be the result of - * syncing on a point the stream that looked like the starting of a frame - * but was not. \c FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM - * could be because the decoder encountered a valid frame made by a future - * version of the encoder which it cannot parse, or because of a false - * sync making it appear as though an encountered frame was generated by - * a future encoder. - */ -typedef enum { - - FLAC__STREAM_DECODER_ERROR_STATUS_LOST_SYNC, - /**< An error in the stream caused the decoder to lose synchronization. */ - - FLAC__STREAM_DECODER_ERROR_STATUS_BAD_HEADER, - /**< The decoder encountered a corrupted frame header. */ - - FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH, - /**< The frame's data did not match the CRC in the footer. */ - - FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM - /**< The decoder encountered reserved fields in use in the stream. */ - -} FLAC__StreamDecoderErrorStatus; - -/** Maps a FLAC__StreamDecoderErrorStatus to a C string. - * - * Using a FLAC__StreamDecoderErrorStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamDecoderErrorStatusString[]; - - -/*********************************************************************** - * - * class FLAC__StreamDecoder - * - ***********************************************************************/ - -struct FLAC__StreamDecoderProtected; -struct FLAC__StreamDecoderPrivate; -/** The opaque structure definition for the stream decoder type. - * See the \link flac_stream_decoder stream decoder module \endlink - * for a detailed description. - */ -typedef struct { - struct FLAC__StreamDecoderProtected *protected_; /* avoid the C++ keyword 'protected' */ - struct FLAC__StreamDecoderPrivate *private_; /* avoid the C++ keyword 'private' */ -} FLAC__StreamDecoder; - -/** Signature for the read callback. - * - * A function pointer matching this signature must be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs more input data. The address of the - * buffer to be filled is supplied, along with the number of bytes the - * buffer can hold. The callback may choose to supply less data and - * modify the byte count but must be careful not to overflow the buffer. - * The callback then returns a status code chosen from - * FLAC__StreamDecoderReadStatus. - * - * Here is an example of a read callback for stdio streams: - * \code - * FLAC__StreamDecoderReadStatus read_cb(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(*bytes > 0) { - * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); - * if(ferror(file)) - * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - * else if(*bytes == 0) - * return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; - * else - * return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - * } - * else - * return FLAC__STREAM_DECODER_READ_STATUS_ABORT; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param buffer A pointer to a location for the callee to store - * data to be decoded. - * \param bytes A pointer to the size of the buffer. On entry - * to the callback, it contains the maximum number - * of bytes that may be stored in \a buffer. The - * callee must set it to the actual number of bytes - * stored (0 in case of error or end-of-stream) before - * returning. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderReadStatus - * The callee's return status. Note that the callback should return - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM if and only if - * zero bytes were read and there is no more data to be read. - */ -typedef FLAC__StreamDecoderReadStatus (*FLAC__StreamDecoderReadCallback)(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, void *client_data); - -/** Signature for the seek callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs to seek the input stream. The decoder - * will pass the absolute byte offset to seek to, 0 meaning the - * beginning of the stream. - * - * Here is an example of a seek callback for stdio streams: - * \code - * FLAC__StreamDecoderSeekStatus seek_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(file == stdin) - * return FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED; - * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) - * return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; - * else - * return FLAC__STREAM_DECODER_SEEK_STATUS_OK; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param absolute_byte_offset The offset from the beginning of the stream - * to seek to. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderSeekStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderSeekStatus (*FLAC__StreamDecoderSeekCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, void *client_data); - -/** Signature for the tell callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder wants to know the current position of the - * stream. The callback should return the byte offset from the - * beginning of the stream. - * - * Here is an example of a tell callback for stdio streams: - * \code - * FLAC__StreamDecoderTellStatus tell_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * off_t pos; - * if(file == stdin) - * return FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED; - * else if((pos = ftello(file)) < 0) - * return FLAC__STREAM_DECODER_TELL_STATUS_ERROR; - * else { - * *absolute_byte_offset = (FLAC__uint64)pos; - * return FLAC__STREAM_DECODER_TELL_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param absolute_byte_offset A pointer to storage for the current offset - * from the beginning of the stream. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderTellStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderTellStatus (*FLAC__StreamDecoderTellCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, void *client_data); - -/** Signature for the length callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder wants to know the total length of the stream - * in bytes. - * - * Here is an example of a length callback for stdio streams: - * \code - * FLAC__StreamDecoderLengthStatus length_cb(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * struct stat filestats; - * - * if(file == stdin) - * return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED; - * else if(fstat(fileno(file), &filestats) != 0) - * return FLAC__STREAM_DECODER_LENGTH_STATUS_ERROR; - * else { - * *stream_length = (FLAC__uint64)filestats.st_size; - * return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param stream_length A pointer to storage for the length of the stream - * in bytes. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderLengthStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderLengthStatus (*FLAC__StreamDecoderLengthCallback)(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, void *client_data); - -/** Signature for the EOF callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_decoder_init*_stream(). The supplied function will be - * called when the decoder needs to know if the end of the stream has - * been reached. - * - * Here is an example of a EOF callback for stdio streams: - * FLAC__bool eof_cb(const FLAC__StreamDecoder *decoder, void *client_data) - * \code - * { - * FILE *file = ((MyClientData*)client_data)->file; - * return feof(file)? true : false; - * } - * \endcode - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__bool - * \c true if the currently at the end of the stream, else \c false. - */ -typedef FLAC__bool (*FLAC__StreamDecoderEofCallback)(const FLAC__StreamDecoder *decoder, void *client_data); - -/** Signature for the write callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called when the decoder has decoded a - * single audio frame. The decoder will pass the frame metadata as well - * as an array of pointers (one for each channel) pointing to the - * decoded audio. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param frame The description of the decoded frame. See - * FLAC__Frame. - * \param buffer An array of pointers to decoded channels of data. - * Each pointer will point to an array of signed - * samples of length \a frame->header.blocksize. - * Channels will be ordered according to the FLAC - * specification; see the documentation for the - * frame header. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - * \retval FLAC__StreamDecoderWriteStatus - * The callee's return status. - */ -typedef FLAC__StreamDecoderWriteStatus (*FLAC__StreamDecoderWriteCallback)(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data); - -/** Signature for the metadata callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called when the decoder has decoded a - * metadata block. In a valid FLAC file there will always be one - * \c STREAMINFO block, followed by zero or more other metadata blocks. - * These will be supplied by the decoder in the same order as they - * appear in the stream and always before the first audio frame (i.e. - * write callback). The metadata block that is passed in must not be - * modified, and it doesn't live beyond the callback, so you should make - * a copy of it with FLAC__metadata_object_clone() if you will need it - * elsewhere. Since metadata blocks can potentially be large, by - * default the decoder only calls the metadata callback for the - * \c STREAMINFO block; you can instruct the decoder to pass or filter - * other blocks with FLAC__stream_decoder_set_metadata_*() calls. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param metadata The decoded metadata block. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - */ -typedef void (*FLAC__StreamDecoderMetadataCallback)(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); - -/** Signature for the error callback. - * - * A function pointer matching this signature must be passed to one of - * the FLAC__stream_decoder_init_*() functions. - * The supplied function will be called whenever an error occurs during - * decoding. - * - * \note In general, FLAC__StreamDecoder functions which change the - * state should not be called on the \a decoder while in the callback. - * - * \param decoder The decoder instance calling the callback. - * \param status The error encountered by the decoder. - * \param client_data The callee's client data set through - * FLAC__stream_decoder_init_*(). - */ -typedef void (*FLAC__StreamDecoderErrorCallback)(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); - - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -/** Create a new stream decoder instance. The instance is created with - * default settings; see the individual FLAC__stream_decoder_set_*() - * functions for each setting's default. - * - * \retval FLAC__StreamDecoder* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamDecoder *FLAC__stream_decoder_new(void); - -/** Free a decoder instance. Deletes the object pointed to by \a decoder. - * - * \param decoder A pointer to an existing decoder. - * \assert - * \code decoder != NULL \endcode - */ -FLAC_API void FLAC__stream_decoder_delete(FLAC__StreamDecoder *decoder); - - -/*********************************************************************** - * - * Public class method prototypes - * - ***********************************************************************/ - -/** Set the serial number for the FLAC stream within the Ogg container. - * The default behavior is to use the serial number of the first Ogg - * page. Setting a serial number here will explicitly specify which - * stream is to be decoded. - * - * \note - * This does not need to be set for native FLAC decoding. - * - * \default \c use serial number of first page - * \param decoder A decoder instance to set. - * \param serial_number See above. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_ogg_serial_number(FLAC__StreamDecoder *decoder, long serial_number); - -/** Set the "MD5 signature checking" flag. If \c true, the decoder will - * compute the MD5 signature of the unencoded audio data while decoding - * and compare it to the signature from the STREAMINFO block, if it - * exists, during FLAC__stream_decoder_finish(). - * - * MD5 signature checking will be turned off (until the next - * FLAC__stream_decoder_reset()) if there is no signature in the - * STREAMINFO block or when a seek is attempted. - * - * Clients that do not use the MD5 check should leave this off to speed - * up decoding. - * - * \default \c false - * \param decoder A decoder instance to set. - * \param value Flag value (see above). - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_md5_checking(FLAC__StreamDecoder *decoder, FLAC__bool value); - -/** Direct the decoder to pass on all metadata blocks of type \a type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param type See above. - * \assert - * \code decoder != NULL \endcode - * \a type is valid - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); - -/** Direct the decoder to pass on all APPLICATION metadata blocks of the - * given \a id. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param id See above. - * \assert - * \code decoder != NULL \endcode - * \code id != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); - -/** Direct the decoder to pass on all metadata blocks of any type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_respond_all(FLAC__StreamDecoder *decoder); - -/** Direct the decoder to filter out all metadata blocks of type \a type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param type See above. - * \assert - * \code decoder != NULL \endcode - * \a type is valid - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore(FLAC__StreamDecoder *decoder, FLAC__MetadataType type); - -/** Direct the decoder to filter out all APPLICATION metadata blocks of - * the given \a id. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \param id See above. - * \assert - * \code decoder != NULL \endcode - * \code id != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_application(FLAC__StreamDecoder *decoder, const FLAC__byte id[4]); - -/** Direct the decoder to filter out all metadata blocks of any type. - * - * \default By default, only the \c STREAMINFO block is returned via the - * metadata callback. - * \param decoder A decoder instance to set. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if the decoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_set_metadata_ignore_all(FLAC__StreamDecoder *decoder); - -/** Get the current decoder state. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderState - * The current decoder state. - */ -FLAC_API FLAC__StreamDecoderState FLAC__stream_decoder_get_state(const FLAC__StreamDecoder *decoder); - -/** Get the current decoder state as a C string. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval const char * - * The decoder state as a C string. Do not modify the contents. - */ -FLAC_API const char *FLAC__stream_decoder_get_resolved_state_string(const FLAC__StreamDecoder *decoder); - -/** Get the "MD5 signature checking" flag. - * This is the value of the setting, not whether or not the decoder is - * currently checking the MD5 (remember, it can be turned off automatically - * by a seek). When the decoder is reset the flag will be restored to the - * value returned by this function. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * See above. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_get_md5_checking(const FLAC__StreamDecoder *decoder); - -/** Get the total number of samples in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the \c STREAMINFO block. A value of \c 0 means "unknown". - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API FLAC__uint64 FLAC__stream_decoder_get_total_samples(const FLAC__StreamDecoder *decoder); - -/** Get the current number of channels in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_channels(const FLAC__StreamDecoder *decoder); - -/** Get the current channel assignment in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__ChannelAssignment - * See above. - */ -FLAC_API FLAC__ChannelAssignment FLAC__stream_decoder_get_channel_assignment(const FLAC__StreamDecoder *decoder); - -/** Get the current sample resolution in the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_bits_per_sample(const FLAC__StreamDecoder *decoder); - -/** Get the current sample rate in Hz of the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_sample_rate(const FLAC__StreamDecoder *decoder); - -/** Get the current blocksize of the stream being decoded. - * Will only be valid after decoding has started and will contain the - * value from the most recently decoded frame header. - * - * \param decoder A decoder instance to query. - * \assert - * \code decoder != NULL \endcode - * \retval unsigned - * See above. - */ -FLAC_API unsigned FLAC__stream_decoder_get_blocksize(const FLAC__StreamDecoder *decoder); - -/** Returns the decoder's current read position within the stream. - * The position is the byte offset from the start of the stream. - * Bytes before this position have been fully decoded. Note that - * there may still be undecoded bytes in the decoder's read FIFO. - * The returned position is correct even after a seek. - * - * \warning This function currently only works for native FLAC, - * not Ogg FLAC streams. - * - * \param decoder A decoder instance to query. - * \param position Address at which to return the desired position. - * \assert - * \code decoder != NULL \endcode - * \code position != NULL \endcode - * \retval FLAC__bool - * \c true if successful, \c false if the stream is not native FLAC, - * or there was an error from the 'tell' callback or it returned - * \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_get_decode_position(const FLAC__StreamDecoder *decoder, FLAC__uint64 *position); - -/** Initialize the decoder instance to decode native FLAC streams. - * - * This flavor of initialization sets up the decoder to decode from a - * native FLAC stream. I/O is performed via callbacks to the client. - * For decoding from a plain file via filename or open FILE*, - * FLAC__stream_decoder_init_file() and FLAC__stream_decoder_init_FILE() - * provide a simpler interface. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param read_callback See FLAC__StreamDecoderReadCallback. This - * pointer must not be \c NULL. - * \param seek_callback See FLAC__StreamDecoderSeekCallback. This - * pointer may be \c NULL if seeking is not - * supported. If \a seek_callback is not \c NULL then a - * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. - * Alternatively, a dummy seek callback that just - * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param tell_callback See FLAC__StreamDecoderTellCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a tell_callback must also be supplied. - * Alternatively, a dummy tell callback that just - * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param length_callback See FLAC__StreamDecoderLengthCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a length_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param eof_callback See FLAC__StreamDecoderEofCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a eof_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c false - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode Ogg FLAC streams. - * - * This flavor of initialization sets up the decoder to decode from a - * FLAC stream in an Ogg container. I/O is performed via callbacks to the - * client. For decoding from a plain file via filename or open FILE*, - * FLAC__stream_decoder_init_ogg_file() and FLAC__stream_decoder_init_ogg_FILE() - * provide a simpler interface. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param read_callback See FLAC__StreamDecoderReadCallback. This - * pointer must not be \c NULL. - * \param seek_callback See FLAC__StreamDecoderSeekCallback. This - * pointer may be \c NULL if seeking is not - * supported. If \a seek_callback is not \c NULL then a - * \a tell_callback, \a length_callback, and \a eof_callback must also be supplied. - * Alternatively, a dummy seek callback that just - * returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param tell_callback See FLAC__StreamDecoderTellCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a tell_callback must also be supplied. - * Alternatively, a dummy tell callback that just - * returns \c FLAC__STREAM_DECODER_TELL_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param length_callback See FLAC__StreamDecoderLengthCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a length_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param eof_callback See FLAC__StreamDecoderEofCallback. This - * pointer may be \c NULL if not supported by the client. If - * \a seek_callback is not \c NULL then a - * \a eof_callback must also be supplied. - * Alternatively, a dummy length callback that just - * returns \c false - * may also be supplied, all though this is slightly - * less efficient for the decoder. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_stream( - FLAC__StreamDecoder *decoder, - FLAC__StreamDecoderReadCallback read_callback, - FLAC__StreamDecoderSeekCallback seek_callback, - FLAC__StreamDecoderTellCallback tell_callback, - FLAC__StreamDecoderLengthCallback length_callback, - FLAC__StreamDecoderEofCallback eof_callback, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode native FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a - * plain native FLAC file. For non-stdio streams, you must use - * FLAC__stream_decoder_init_stream() and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param file An open FLAC file. The file should have been - * opened with mode \c "rb" and rewound. The file - * becomes owned by the decoder and should not be - * manipulated by the client while decoding. - * Unless \a file is \c stdin, it will be closed - * when FLAC__stream_decoder_finish() is called. - * Note however that seeking will not work when - * decoding from \c stdout since it is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \code file != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode Ogg FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a - * plain Ogg FLAC file. For non-stdio streams, you must use - * FLAC__stream_decoder_init_ogg_stream() and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param file An open FLAC file. The file should have been - * opened with mode \c "rb" and rewound. The file - * becomes owned by the decoder and should not be - * manipulated by the client while decoding. - * Unless \a file is \c stdin, it will be closed - * when FLAC__stream_decoder_finish() is called. - * Note however that seeking will not work when - * decoding from \c stdout since it is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \code file != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_FILE( - FLAC__StreamDecoder *decoder, - FILE *file, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode native FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a plain - * native FLAC file. If POSIX fopen() semantics are not sufficient, (for - * example, with Unicode filenames on Windows), you must use - * FLAC__stream_decoder_init_FILE(), or FLAC__stream_decoder_init_stream() - * and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \param decoder An uninitialized decoder instance. - * \param filename The name of the file to decode from. The file will - * be opened with fopen(). Use \c NULL to decode from - * \c stdin. Note that \c stdin is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Initialize the decoder instance to decode Ogg FLAC files. - * - * This flavor of initialization sets up the decoder to decode from a plain - * Ogg FLAC file. If POSIX fopen() semantics are not sufficient, (for - * example, with Unicode filenames on Windows), you must use - * FLAC__stream_decoder_init_ogg_FILE(), or FLAC__stream_decoder_init_ogg_stream() - * and provide callbacks for the I/O. - * - * This function should be called after FLAC__stream_decoder_new() and - * FLAC__stream_decoder_set_*() but before any of the - * FLAC__stream_decoder_process_*() functions. Will set and return the - * decoder state, which will be FLAC__STREAM_DECODER_SEARCH_FOR_METADATA - * if initialization succeeded. - * - * \note Support for Ogg FLAC in the library is optional. If this - * library has been built without support for Ogg FLAC, this function - * will return \c FLAC__STREAM_DECODER_INIT_STATUS_UNSUPPORTED_CONTAINER. - * - * \param decoder An uninitialized decoder instance. - * \param filename The name of the file to decode from. The file will - * be opened with fopen(). Use \c NULL to decode from - * \c stdin. Note that \c stdin is not seekable. - * \param write_callback See FLAC__StreamDecoderWriteCallback. This - * pointer must not be \c NULL. - * \param metadata_callback See FLAC__StreamDecoderMetadataCallback. This - * pointer may be \c NULL if the callback is not - * desired. - * \param error_callback See FLAC__StreamDecoderErrorCallback. This - * pointer must not be \c NULL. - * \param client_data This value will be supplied to callbacks in their - * \a client_data argument. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__StreamDecoderInitStatus - * \c FLAC__STREAM_DECODER_INIT_STATUS_OK if initialization was successful; - * see FLAC__StreamDecoderInitStatus for the meanings of other return values. - */ -FLAC_API FLAC__StreamDecoderInitStatus FLAC__stream_decoder_init_ogg_file( - FLAC__StreamDecoder *decoder, - const char *filename, - FLAC__StreamDecoderWriteCallback write_callback, - FLAC__StreamDecoderMetadataCallback metadata_callback, - FLAC__StreamDecoderErrorCallback error_callback, - void *client_data -); - -/** Finish the decoding process. - * Flushes the decoding buffer, releases resources, resets the decoder - * settings to their defaults, and returns the decoder state to - * FLAC__STREAM_DECODER_UNINITIALIZED. - * - * In the event of a prematurely-terminated decode, it is not strictly - * necessary to call this immediately before FLAC__stream_decoder_delete() - * but it is good practice to match every FLAC__stream_decoder_init_*() - * with a FLAC__stream_decoder_finish(). - * - * \param decoder An uninitialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if MD5 checking is on AND a STREAMINFO block was available - * AND the MD5 signature in the STREAMINFO block was non-zero AND the - * signature does not match the one computed by the decoder; else - * \c true. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder); - -/** Flush the stream input. - * The decoder's input buffer will be cleared and the state set to - * \c FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC. This will also turn - * off MD5 checking. - * - * \param decoder A decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false if a memory allocation - * error occurs (in which case the state will be set to - * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_flush(FLAC__StreamDecoder *decoder); - -/** Reset the decoding process. - * The decoder's input buffer will be cleared and the state set to - * \c FLAC__STREAM_DECODER_SEARCH_FOR_METADATA. This is similar to - * FLAC__stream_decoder_finish() except that the settings are - * preserved; there is no need to call FLAC__stream_decoder_init_*() - * before decoding again. MD5 checking will be restored to its original - * setting. - * - * If the decoder is seekable, or was initialized with - * FLAC__stream_decoder_init*_FILE() or FLAC__stream_decoder_init*_file(), - * the decoder will also attempt to seek to the beginning of the file. - * If this rewind fails, this function will return \c false. It follows - * that FLAC__stream_decoder_reset() cannot be used when decoding from - * \c stdin. - * - * If the decoder was initialized with FLAC__stream_encoder_init*_stream() - * and is not seekable (i.e. no seek callback was provided or the seek - * callback returns \c FLAC__STREAM_DECODER_SEEK_STATUS_UNSUPPORTED), it - * is the duty of the client to start feeding data from the beginning of - * the stream on the next FLAC__stream_decoder_process() or - * FLAC__stream_decoder_process_interleaved() call. - * - * \param decoder A decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false if a memory allocation occurs - * (in which case the state will be set to - * \c FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR) or a seek error - * occurs (the state will be unchanged). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_reset(FLAC__StreamDecoder *decoder); - -/** Decode one metadata block or audio frame. - * This version instructs the decoder to decode a either a single metadata - * block or a single frame and stop, unless the callbacks return a fatal - * error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * As the decoder needs more input it will call the read callback. - * Depending on what was decoded, the metadata or write callback will be - * called with the decoded metadata block or audio frame. - * - * Unless there is a fatal read error or end of stream, this function - * will return once one whole frame is decoded. In other words, if the - * stream is not synchronized or points to a corrupt frame header, the - * decoder will continue to try and resync until it gets to a valid - * frame, then decode one frame, then return. If the decoder points to - * a frame whose frame CRC in the frame footer does not match the - * computed frame CRC, this function will issue a - * FLAC__STREAM_DECODER_ERROR_STATUS_FRAME_CRC_MISMATCH error to the - * error callback, and return, having decoded one complete, although - * corrupt, frame. (Such corrupted frames are sent as silence of the - * correct length to the write callback.) - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder); - -/** Decode until the end of the metadata. - * This version instructs the decoder to decode from the current position - * and continue until all the metadata has been read, or until the - * callbacks return a fatal error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * As the decoder needs more input it will call the read callback. - * As each metadata block is decoded, the metadata callback will be called - * with the decoded metadata. - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder); - -/** Decode until the end of the stream. - * This version instructs the decoder to decode from the current position - * and continue until the end of stream (the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM), or until the - * callbacks return a fatal error. - * - * As the decoder needs more input it will call the read callback. - * As each metadata block and frame is decoded, the metadata or write - * callback will be called with the decoded metadata or frame. - * - * \param decoder An initialized decoder instance. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder); - -/** Skip one audio frame. - * This version instructs the decoder to 'skip' a single frame and stop, - * unless the callbacks return a fatal error or the read callback returns - * \c FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM. - * - * The decoding flow is the same as what occurs when - * FLAC__stream_decoder_process_single() is called to process an audio - * frame, except that this function does not decode the parsed data into - * PCM or call the write callback. The integrity of the frame is still - * checked the same way as in the other process functions. - * - * This function will return once one whole frame is skipped, in the - * same way that FLAC__stream_decoder_process_single() will return once - * one whole frame is decoded. - * - * This function can be used in more quickly determining FLAC frame - * boundaries when decoding of the actual data is not needed, for - * example when an application is separating a FLAC stream into frames - * for editing or storing in a container. To do this, the application - * can use FLAC__stream_decoder_skip_single_frame() to quickly advance - * to the next frame, then use - * FLAC__stream_decoder_get_decode_position() to find the new frame - * boundary. - * - * This function should only be called when the stream has advanced - * past all the metadata, otherwise it will return \c false. - * - * \param decoder An initialized decoder instance not in a metadata - * state. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c false if any fatal read, write, or memory allocation error - * occurred (meaning decoding must stop), or if the decoder - * is in the FLAC__STREAM_DECODER_SEARCH_FOR_METADATA or - * FLAC__STREAM_DECODER_READ_METADATA state, else \c true; for more - * information about the decoder, check the decoder state with - * FLAC__stream_decoder_get_state(). - */ -FLAC_API FLAC__bool FLAC__stream_decoder_skip_single_frame(FLAC__StreamDecoder *decoder); - -/** Flush the input and seek to an absolute sample. - * Decoding will resume at the given sample. Note that because of - * this, the next write callback may contain a partial block. The - * client must support seeking the input or this function will fail - * and return \c false. Furthermore, if the decoder state is - * \c FLAC__STREAM_DECODER_SEEK_ERROR, then the decoder must be flushed - * with FLAC__stream_decoder_flush() or reset with - * FLAC__stream_decoder_reset() before decoding can continue. - * - * \param decoder A decoder instance. - * \param sample The target sample number to seek to. - * \assert - * \code decoder != NULL \endcode - * \retval FLAC__bool - * \c true if successful, else \c false. - */ -FLAC_API FLAC__bool FLAC__stream_decoder_seek_absolute(FLAC__StreamDecoder *decoder, FLAC__uint64 sample); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h deleted file mode 100755 index 646efb7..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/stream_encoder.h +++ /dev/null @@ -1,1790 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2000-2009 Josh Coalson - * Copyright (C) 2011-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FLAC__STREAM_ENCODER_H -#define FLAC__STREAM_ENCODER_H - -#include /* for FILE */ -#include "export.h" -#include "format.h" -#include "stream_decoder.h" - -#ifdef __cplusplus -extern "C" { -#endif - - -/** \file include/FLAC/stream_encoder.h - * - * \brief - * This module contains the functions which implement the stream - * encoder. - * - * See the detailed documentation in the - * \link flac_stream_encoder stream encoder \endlink module. - */ - -/** \defgroup flac_encoder FLAC/ \*_encoder.h: encoder interfaces - * \ingroup flac - * - * \brief - * This module describes the encoder layers provided by libFLAC. - * - * The stream encoder can be used to encode complete streams either to the - * client via callbacks, or directly to a file, depending on how it is - * initialized. When encoding via callbacks, the client provides a write - * callback which will be called whenever FLAC data is ready to be written. - * If the client also supplies a seek callback, the encoder will also - * automatically handle the writing back of metadata discovered while - * encoding, like stream info, seek points offsets, etc. When encoding to - * a file, the client needs only supply a filename or open \c FILE* and an - * optional progress callback for periodic notification of progress; the - * write and seek callbacks are supplied internally. For more info see the - * \link flac_stream_encoder stream encoder \endlink module. - */ - -/** \defgroup flac_stream_encoder FLAC/stream_encoder.h: stream encoder interface - * \ingroup flac_encoder - * - * \brief - * This module contains the functions which implement the stream - * encoder. - * - * The stream encoder can encode to native FLAC, and optionally Ogg FLAC - * (check FLAC_API_SUPPORTS_OGG_FLAC) streams and files. - * - * The basic usage of this encoder is as follows: - * - The program creates an instance of an encoder using - * FLAC__stream_encoder_new(). - * - The program overrides the default settings using - * FLAC__stream_encoder_set_*() functions. At a minimum, the following - * functions should be called: - * - FLAC__stream_encoder_set_channels() - * - FLAC__stream_encoder_set_bits_per_sample() - * - FLAC__stream_encoder_set_sample_rate() - * - FLAC__stream_encoder_set_ogg_serial_number() (if encoding to Ogg FLAC) - * - FLAC__stream_encoder_set_total_samples_estimate() (if known) - * - If the application wants to control the compression level or set its own - * metadata, then the following should also be called: - * - FLAC__stream_encoder_set_compression_level() - * - FLAC__stream_encoder_set_verify() - * - FLAC__stream_encoder_set_metadata() - * - The rest of the set functions should only be called if the client needs - * exact control over how the audio is compressed; thorough understanding - * of the FLAC format is necessary to achieve good results. - * - The program initializes the instance to validate the settings and - * prepare for encoding using - * - FLAC__stream_encoder_init_stream() or FLAC__stream_encoder_init_FILE() - * or FLAC__stream_encoder_init_file() for native FLAC - * - FLAC__stream_encoder_init_ogg_stream() or FLAC__stream_encoder_init_ogg_FILE() - * or FLAC__stream_encoder_init_ogg_file() for Ogg FLAC - * - The program calls FLAC__stream_encoder_process() or - * FLAC__stream_encoder_process_interleaved() to encode data, which - * subsequently calls the callbacks when there is encoder data ready - * to be written. - * - The program finishes the encoding with FLAC__stream_encoder_finish(), - * which causes the encoder to encode any data still in its input pipe, - * update the metadata with the final encoding statistics if output - * seeking is possible, and finally reset the encoder to the - * uninitialized state. - * - The instance may be used again or deleted with - * FLAC__stream_encoder_delete(). - * - * In more detail, the stream encoder functions similarly to the - * \link flac_stream_decoder stream decoder \endlink, but has fewer - * callbacks and more options. Typically the client will create a new - * instance by calling FLAC__stream_encoder_new(), then set the necessary - * parameters with FLAC__stream_encoder_set_*(), and initialize it by - * calling one of the FLAC__stream_encoder_init_*() functions. - * - * Unlike the decoders, the stream encoder has many options that can - * affect the speed and compression ratio. When setting these parameters - * you should have some basic knowledge of the format (see the - * user-level documentation - * or the formal description). The - * FLAC__stream_encoder_set_*() functions themselves do not validate the - * values as many are interdependent. The FLAC__stream_encoder_init_*() - * functions will do this, so make sure to pay attention to the state - * returned by FLAC__stream_encoder_init_*() to make sure that it is - * FLAC__STREAM_ENCODER_INIT_STATUS_OK. Any parameters that are not set - * before FLAC__stream_encoder_init_*() will take on the defaults from - * the constructor. - * - * There are three initialization functions for native FLAC, one for - * setting up the encoder to encode FLAC data to the client via - * callbacks, and two for encoding directly to a file. - * - * For encoding via callbacks, use FLAC__stream_encoder_init_stream(). - * You must also supply a write callback which will be called anytime - * there is raw encoded data to write. If the client can seek the output - * it is best to also supply seek and tell callbacks, as this allows the - * encoder to go back after encoding is finished to write back - * information that was collected while encoding, like seek point offsets, - * frame sizes, etc. - * - * For encoding directly to a file, use FLAC__stream_encoder_init_FILE() - * or FLAC__stream_encoder_init_file(). Then you must only supply a - * filename or open \c FILE*; the encoder will handle all the callbacks - * internally. You may also supply a progress callback for periodic - * notification of the encoding progress. - * - * There are three similarly-named init functions for encoding to Ogg - * FLAC streams. Check \c FLAC_API_SUPPORTS_OGG_FLAC to find out if the - * library has been built with Ogg support. - * - * The call to FLAC__stream_encoder_init_*() currently will also immediately - * call the write callback several times, once with the \c fLaC signature, - * and once for each encoded metadata block. Note that for Ogg FLAC - * encoding you will usually get at least twice the number of callbacks than - * with native FLAC, one for the Ogg page header and one for the page body. - * - * After initializing the instance, the client may feed audio data to the - * encoder in one of two ways: - * - * - Channel separate, through FLAC__stream_encoder_process() - The client - * will pass an array of pointers to buffers, one for each channel, to - * the encoder, each of the same length. The samples need not be - * block-aligned, but each channel should have the same number of samples. - * - Channel interleaved, through - * FLAC__stream_encoder_process_interleaved() - The client will pass a single - * pointer to data that is channel-interleaved (i.e. channel0_sample0, - * channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). - * Again, the samples need not be block-aligned but they must be - * sample-aligned, i.e. the first value should be channel0_sample0 and - * the last value channelN_sampleM. - * - * Note that for either process call, each sample in the buffers should be a - * signed integer, right-justified to the resolution set by - * FLAC__stream_encoder_set_bits_per_sample(). For example, if the resolution - * is 16 bits per sample, the samples should all be in the range [-32768,32767]. - * - * When the client is finished encoding data, it calls - * FLAC__stream_encoder_finish(), which causes the encoder to encode any - * data still in its input pipe, and call the metadata callback with the - * final encoding statistics. Then the instance may be deleted with - * FLAC__stream_encoder_delete() or initialized again to encode another - * stream. - * - * For programs that write their own metadata, but that do not know the - * actual metadata until after encoding, it is advantageous to instruct - * the encoder to write a PADDING block of the correct size, so that - * instead of rewriting the whole stream after encoding, the program can - * just overwrite the PADDING block. If only the maximum size of the - * metadata is known, the program can write a slightly larger padding - * block, then split it after encoding. - * - * Make sure you understand how lengths are calculated. All FLAC metadata - * blocks have a 4 byte header which contains the type and length. This - * length does not include the 4 bytes of the header. See the format page - * for the specification of metadata blocks and their lengths. - * - * \note - * If you are writing the FLAC data to a file via callbacks, make sure it - * is open for update (e.g. mode "w+" for stdio streams). This is because - * after the first encoding pass, the encoder will try to seek back to the - * beginning of the stream, to the STREAMINFO block, to write some data - * there. (If using FLAC__stream_encoder_init*_file() or - * FLAC__stream_encoder_init*_FILE(), the file is managed internally.) - * - * \note - * The "set" functions may only be called when the encoder is in the - * state FLAC__STREAM_ENCODER_UNINITIALIZED, i.e. after - * FLAC__stream_encoder_new() or FLAC__stream_encoder_finish(), but - * before FLAC__stream_encoder_init_*(). If this is the case they will - * return \c true, otherwise \c false. - * - * \note - * FLAC__stream_encoder_finish() resets all settings to the constructor - * defaults. - * - * \{ - */ - - -/** State values for a FLAC__StreamEncoder. - * - * The encoder's state can be obtained by calling FLAC__stream_encoder_get_state(). - * - * If the encoder gets into any other state besides \c FLAC__STREAM_ENCODER_OK - * or \c FLAC__STREAM_ENCODER_UNINITIALIZED, it becomes invalid for encoding and - * must be deleted with FLAC__stream_encoder_delete(). - */ -typedef enum { - - FLAC__STREAM_ENCODER_OK = 0, - /**< The encoder is in the normal OK state and samples can be processed. */ - - FLAC__STREAM_ENCODER_UNINITIALIZED, - /**< The encoder is in the uninitialized state; one of the - * FLAC__stream_encoder_init_*() functions must be called before samples - * can be processed. - */ - - FLAC__STREAM_ENCODER_OGG_ERROR, - /**< An error occurred in the underlying Ogg layer. */ - - FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR, - /**< An error occurred in the underlying verify stream decoder; - * check FLAC__stream_encoder_get_verify_decoder_state(). - */ - - FLAC__STREAM_ENCODER_VERIFY_MISMATCH_IN_AUDIO_DATA, - /**< The verify decoder detected a mismatch between the original - * audio signal and the decoded audio signal. - */ - - FLAC__STREAM_ENCODER_CLIENT_ERROR, - /**< One of the callbacks returned a fatal error. */ - - FLAC__STREAM_ENCODER_IO_ERROR, - /**< An I/O error occurred while opening/reading/writing a file. - * Check \c errno. - */ - - FLAC__STREAM_ENCODER_FRAMING_ERROR, - /**< An error occurred while writing the stream; usually, the - * write_callback returned an error. - */ - - FLAC__STREAM_ENCODER_MEMORY_ALLOCATION_ERROR - /**< Memory allocation failed. */ - -} FLAC__StreamEncoderState; - -/** Maps a FLAC__StreamEncoderState to a C string. - * - * Using a FLAC__StreamEncoderState as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderStateString[]; - - -/** Possible return values for the FLAC__stream_encoder_init_*() functions. - */ -typedef enum { - - FLAC__STREAM_ENCODER_INIT_STATUS_OK = 0, - /**< Initialization was successful. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_ENCODER_ERROR, - /**< General failure to set up encoder; call FLAC__stream_encoder_get_state() for cause. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_UNSUPPORTED_CONTAINER, - /**< The library was not compiled with support for the given container - * format. - */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_CALLBACKS, - /**< A required callback was not supplied. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_NUMBER_OF_CHANNELS, - /**< The encoder has an invalid setting for number of channels. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BITS_PER_SAMPLE, - /**< The encoder has an invalid setting for bits-per-sample. - * FLAC supports 4-32 bps but the reference encoder currently supports - * only up to 24 bps. - */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_SAMPLE_RATE, - /**< The encoder has an invalid setting for the input sample rate. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_BLOCK_SIZE, - /**< The encoder has an invalid setting for the block size. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_MAX_LPC_ORDER, - /**< The encoder has an invalid setting for the maximum LPC order. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_QLP_COEFF_PRECISION, - /**< The encoder has an invalid setting for the precision of the quantized linear predictor coefficients. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_BLOCK_SIZE_TOO_SMALL_FOR_LPC_ORDER, - /**< The specified block size is less than the maximum LPC order. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_NOT_STREAMABLE, - /**< The encoder is bound to the Subset but other settings violate it. */ - - FLAC__STREAM_ENCODER_INIT_STATUS_INVALID_METADATA, - /**< The metadata input to the encoder is invalid, in one of the following ways: - * - FLAC__stream_encoder_set_metadata() was called with a null pointer but a block count > 0 - * - One of the metadata blocks contains an undefined type - * - It contains an illegal CUESHEET as checked by FLAC__format_cuesheet_is_legal() - * - It contains an illegal SEEKTABLE as checked by FLAC__format_seektable_is_legal() - * - It contains more than one SEEKTABLE block or more than one VORBIS_COMMENT block - */ - - FLAC__STREAM_ENCODER_INIT_STATUS_ALREADY_INITIALIZED - /**< FLAC__stream_encoder_init_*() was called when the encoder was - * already initialized, usually because - * FLAC__stream_encoder_finish() was not called. - */ - -} FLAC__StreamEncoderInitStatus; - -/** Maps a FLAC__StreamEncoderInitStatus to a C string. - * - * Using a FLAC__StreamEncoderInitStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderInitStatusString[]; - - -/** Return values for the FLAC__StreamEncoder read callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE, - /**< The read was OK and decoding can continue. */ - - FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM, - /**< The read was attempted at the end of the stream. */ - - FLAC__STREAM_ENCODER_READ_STATUS_ABORT, - /**< An unrecoverable error occurred. */ - - FLAC__STREAM_ENCODER_READ_STATUS_UNSUPPORTED - /**< Client does not support reading back from the output. */ - -} FLAC__StreamEncoderReadStatus; - -/** Maps a FLAC__StreamEncoderReadStatus to a C string. - * - * Using a FLAC__StreamEncoderReadStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderReadStatusString[]; - - -/** Return values for the FLAC__StreamEncoder write callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_WRITE_STATUS_OK = 0, - /**< The write was OK and encoding can continue. */ - - FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR - /**< An unrecoverable error occurred. The encoder will return from the process call. */ - -} FLAC__StreamEncoderWriteStatus; - -/** Maps a FLAC__StreamEncoderWriteStatus to a C string. - * - * Using a FLAC__StreamEncoderWriteStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderWriteStatusString[]; - - -/** Return values for the FLAC__StreamEncoder seek callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_SEEK_STATUS_OK, - /**< The seek was OK and encoding can continue. */ - - FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR, - /**< An unrecoverable error occurred. */ - - FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED - /**< Client does not support seeking. */ - -} FLAC__StreamEncoderSeekStatus; - -/** Maps a FLAC__StreamEncoderSeekStatus to a C string. - * - * Using a FLAC__StreamEncoderSeekStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderSeekStatusString[]; - - -/** Return values for the FLAC__StreamEncoder tell callback. - */ -typedef enum { - - FLAC__STREAM_ENCODER_TELL_STATUS_OK, - /**< The tell was OK and encoding can continue. */ - - FLAC__STREAM_ENCODER_TELL_STATUS_ERROR, - /**< An unrecoverable error occurred. */ - - FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED - /**< Client does not support seeking. */ - -} FLAC__StreamEncoderTellStatus; - -/** Maps a FLAC__StreamEncoderTellStatus to a C string. - * - * Using a FLAC__StreamEncoderTellStatus as the index to this array - * will give the string equivalent. The contents should not be modified. - */ -extern FLAC_API const char * const FLAC__StreamEncoderTellStatusString[]; - - -/*********************************************************************** - * - * class FLAC__StreamEncoder - * - ***********************************************************************/ - -struct FLAC__StreamEncoderProtected; -struct FLAC__StreamEncoderPrivate; -/** The opaque structure definition for the stream encoder type. - * See the \link flac_stream_encoder stream encoder module \endlink - * for a detailed description. - */ -typedef struct { - struct FLAC__StreamEncoderProtected *protected_; /* avoid the C++ keyword 'protected' */ - struct FLAC__StreamEncoderPrivate *private_; /* avoid the C++ keyword 'private' */ -} FLAC__StreamEncoder; - -/** Signature for the read callback. - * - * A function pointer matching this signature must be passed to - * FLAC__stream_encoder_init_ogg_stream() if seeking is supported. - * The supplied function will be called when the encoder needs to read back - * encoded data. This happens during the metadata callback, when the encoder - * has to read, modify, and rewrite the metadata (e.g. seekpoints) gathered - * while encoding. The address of the buffer to be filled is supplied, along - * with the number of bytes the buffer can hold. The callback may choose to - * supply less data and modify the byte count but must be careful not to - * overflow the buffer. The callback then returns a status code chosen from - * FLAC__StreamEncoderReadStatus. - * - * Here is an example of a read callback for stdio streams: - * \code - * FLAC__StreamEncoderReadStatus read_cb(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(*bytes > 0) { - * *bytes = fread(buffer, sizeof(FLAC__byte), *bytes, file); - * if(ferror(file)) - * return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; - * else if(*bytes == 0) - * return FLAC__STREAM_ENCODER_READ_STATUS_END_OF_STREAM; - * else - * return FLAC__STREAM_ENCODER_READ_STATUS_CONTINUE; - * } - * else - * return FLAC__STREAM_ENCODER_READ_STATUS_ABORT; - * } - * \endcode - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param buffer A pointer to a location for the callee to store - * data to be encoded. - * \param bytes A pointer to the size of the buffer. On entry - * to the callback, it contains the maximum number - * of bytes that may be stored in \a buffer. The - * callee must set it to the actual number of bytes - * stored (0 in case of error or end-of-stream) before - * returning. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_set_client_data(). - * \retval FLAC__StreamEncoderReadStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderReadStatus (*FLAC__StreamEncoderReadCallback)(const FLAC__StreamEncoder *encoder, FLAC__byte buffer[], size_t *bytes, void *client_data); - -/** Signature for the write callback. - * - * A function pointer matching this signature must be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * by the encoder anytime there is raw encoded data ready to write. It may - * include metadata mixed with encoded audio frames and the data is not - * guaranteed to be aligned on frame or metadata block boundaries. - * - * The only duty of the callback is to write out the \a bytes worth of data - * in \a buffer to the current position in the output stream. The arguments - * \a samples and \a current_frame are purely informational. If \a samples - * is greater than \c 0, then \a current_frame will hold the current frame - * number that is being written; otherwise it indicates that the write - * callback is being called to write metadata. - * - * \note - * Unlike when writing to native FLAC, when writing to Ogg FLAC the - * write callback will be called twice when writing each audio - * frame; once for the page header, and once for the page body. - * When writing the page header, the \a samples argument to the - * write callback will be \c 0. - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param buffer An array of encoded data of length \a bytes. - * \param bytes The byte length of \a buffer. - * \param samples The number of samples encoded by \a buffer. - * \c 0 has a special meaning; see above. - * \param current_frame The number of the current frame being encoded. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - * \retval FLAC__StreamEncoderWriteStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderWriteStatus (*FLAC__StreamEncoderWriteCallback)(const FLAC__StreamEncoder *encoder, const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame, void *client_data); - -/** Signature for the seek callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * when the encoder needs to seek the output stream. The encoder will pass - * the absolute byte offset to seek to, 0 meaning the beginning of the stream. - * - * Here is an example of a seek callback for stdio streams: - * \code - * FLAC__StreamEncoderSeekStatus seek_cb(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * if(file == stdin) - * return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; - * else if(fseeko(file, (off_t)absolute_byte_offset, SEEK_SET) < 0) - * return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR; - * else - * return FLAC__STREAM_ENCODER_SEEK_STATUS_OK; - * } - * \endcode - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param absolute_byte_offset The offset from the beginning of the stream - * to seek to. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - * \retval FLAC__StreamEncoderSeekStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderSeekStatus (*FLAC__StreamEncoderSeekCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data); - -/** Signature for the tell callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * when the encoder needs to know the current position of the output stream. - * - * \warning - * The callback must return the true current byte offset of the output to - * which the encoder is writing. If you are buffering the output, make - * sure and take this into account. If you are writing directly to a - * FILE* from your write callback, ftell() is sufficient. If you are - * writing directly to a file descriptor from your write callback, you - * can use lseek(fd, SEEK_CUR, 0). The encoder may later seek back to - * these points to rewrite metadata after encoding. - * - * Here is an example of a tell callback for stdio streams: - * \code - * FLAC__StreamEncoderTellStatus tell_cb(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data) - * { - * FILE *file = ((MyClientData*)client_data)->file; - * off_t pos; - * if(file == stdin) - * return FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED; - * else if((pos = ftello(file)) < 0) - * return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR; - * else { - * *absolute_byte_offset = (FLAC__uint64)pos; - * return FLAC__STREAM_ENCODER_TELL_STATUS_OK; - * } - * } - * \endcode - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param absolute_byte_offset The address at which to store the current - * position of the output. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - * \retval FLAC__StreamEncoderTellStatus - * The callee's return status. - */ -typedef FLAC__StreamEncoderTellStatus (*FLAC__StreamEncoderTellCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data); - -/** Signature for the metadata callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_stream(). The supplied function will be called - * once at the end of encoding with the populated STREAMINFO structure. This - * is so the client can seek back to the beginning of the file and write the - * STREAMINFO block with the correct statistics after encoding (like - * minimum/maximum frame size and total samples). - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param metadata The final populated STREAMINFO block. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - */ -typedef void (*FLAC__StreamEncoderMetadataCallback)(const FLAC__StreamEncoder *encoder, const FLAC__StreamMetadata *metadata, void *client_data); - -/** Signature for the progress callback. - * - * A function pointer matching this signature may be passed to - * FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE(). - * The supplied function will be called when the encoder has finished - * writing a frame. The \c total_frames_estimate argument to the - * callback will be based on the value from - * FLAC__stream_encoder_set_total_samples_estimate(). - * - * \note In general, FLAC__StreamEncoder functions which change the - * state should not be called on the \a encoder while in the callback. - * - * \param encoder The encoder instance calling the callback. - * \param bytes_written Bytes written so far. - * \param samples_written Samples written so far. - * \param frames_written Frames written so far. - * \param total_frames_estimate The estimate of the total number of - * frames to be written. - * \param client_data The callee's client data set through - * FLAC__stream_encoder_init_*(). - */ -typedef void (*FLAC__StreamEncoderProgressCallback)(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data); - - -/*********************************************************************** - * - * Class constructor/destructor - * - ***********************************************************************/ - -/** Create a new stream encoder instance. The instance is created with - * default settings; see the individual FLAC__stream_encoder_set_*() - * functions for each setting's default. - * - * \retval FLAC__StreamEncoder* - * \c NULL if there was an error allocating memory, else the new instance. - */ -FLAC_API FLAC__StreamEncoder *FLAC__stream_encoder_new(void); - -/** Free an encoder instance. Deletes the object pointed to by \a encoder. - * - * \param encoder A pointer to an existing encoder. - * \assert - * \code encoder != NULL \endcode - */ -FLAC_API void FLAC__stream_encoder_delete(FLAC__StreamEncoder *encoder); - - -/*********************************************************************** - * - * Public class method prototypes - * - ***********************************************************************/ - -/** Set the serial number for the FLAC stream to use in the Ogg container. - * - * \note - * This does not need to be set for native FLAC encoding. - * - * \note - * It is recommended to set a serial number explicitly as the default of '0' - * may collide with other streams. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param serial_number See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_ogg_serial_number(FLAC__StreamEncoder *encoder, long serial_number); - -/** Set the "verify" flag. If \c true, the encoder will verify it's own - * encoded output by feeding it through an internal decoder and comparing - * the original signal against the decoded signal. If a mismatch occurs, - * the process call will return \c false. Note that this will slow the - * encoding process by the extra time required for decoding and comparison. - * - * \default \c false - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_verify(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Set the Subset flag. If \c true, - * the encoder will comply with the Subset and will check the - * settings during FLAC__stream_encoder_init_*() to see if all settings - * comply. If \c false, the settings may take advantage of the full - * range that the format allows. - * - * Make sure you know what it entails before setting this to \c false. - * - * \default \c true - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_streamable_subset(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Set the number of channels to be encoded. - * - * \default \c 2 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_channels(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the sample resolution of the input to be encoded. - * - * \warning - * Do not feed the encoder data that is wider than the value you - * set here or you will generate an invalid stream. - * - * \default \c 16 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_bits_per_sample(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the sample rate (in Hz) of the input to be encoded. - * - * \default \c 44100 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_sample_rate(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the compression level - * - * The compression level is roughly proportional to the amount of effort - * the encoder expends to compress the file. A higher level usually - * means more computation but higher compression. The default level is - * suitable for most applications. - * - * Currently the levels range from \c 0 (fastest, least compression) to - * \c 8 (slowest, most compression). A value larger than \c 8 will be - * treated as \c 8. - * - * This function automatically calls the following other \c _set_ - * functions with appropriate values, so the client does not need to - * unless it specifically wants to override them: - * - FLAC__stream_encoder_set_do_mid_side_stereo() - * - FLAC__stream_encoder_set_loose_mid_side_stereo() - * - FLAC__stream_encoder_set_apodization() - * - FLAC__stream_encoder_set_max_lpc_order() - * - FLAC__stream_encoder_set_qlp_coeff_precision() - * - FLAC__stream_encoder_set_do_qlp_coeff_prec_search() - * - FLAC__stream_encoder_set_do_escape_coding() - * - FLAC__stream_encoder_set_do_exhaustive_model_search() - * - FLAC__stream_encoder_set_min_residual_partition_order() - * - FLAC__stream_encoder_set_max_residual_partition_order() - * - FLAC__stream_encoder_set_rice_parameter_search_dist() - * - * The actual values set for each level are: - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
leveldo mid-side stereoloose mid-side stereoapodizationmax lpc orderqlp coeff precisionqlp coeff prec searchescape codingexhaustive model searchmin residual partition ordermax residual partition orderrice parameter search dist
0 false false tukey(0.5) 0 0 false false false 0 3 0
1 true true tukey(0.5) 0 0 false false false 0 3 0
2 true false tukey(0.5) 0 0 false false false 0 3 0
3 false false tukey(0.5) 6 0 false false false 0 4 0
4 true true tukey(0.5) 8 0 false false false 0 4 0
5 true false tukey(0.5) 8 0 false false false 0 5 0
6 true false tukey(0.5);partial_tukey(2) 8 0 false false false 0 6 0
7 true false tukey(0.5);partial_tukey(2) 12 0 false false false 0 6 0
8 true false tukey(0.5);partial_tukey(2);punchout_tukey(3) 12 0 false false false 0 6 0
- * - * \default \c 5 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_compression_level(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the blocksize to use while encoding. - * - * The number of samples to use per frame. Use \c 0 to let the encoder - * estimate a blocksize; this is usually best. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_blocksize(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set to \c true to enable mid-side encoding on stereo input. The - * number of channels must be 2 for this to have any effect. Set to - * \c false to use only independent channel coding. - * - * \default \c false - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_do_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Set to \c true to enable adaptive switching between mid-side and - * left-right encoding on stereo input. Set to \c false to use - * exhaustive searching. Setting this to \c true requires - * FLAC__stream_encoder_set_do_mid_side_stereo() to also be set to - * \c true in order to have any effect. - * - * \default \c false - * \param encoder An encoder instance to set. - * \param value Flag value (see above). - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_loose_mid_side_stereo(FLAC__StreamEncoder *encoder, FLAC__bool value); - -/** Sets the apodization function(s) the encoder will use when windowing - * audio data for LPC analysis. - * - * The \a specification is a plain ASCII string which specifies exactly - * which functions to use. There may be more than one (up to 32), - * separated by \c ';' characters. Some functions take one or more - * comma-separated arguments in parentheses. - * - * The available functions are \c bartlett, \c bartlett_hann, - * \c blackman, \c blackman_harris_4term_92db, \c connes, \c flattop, - * \c gauss(STDDEV), \c hamming, \c hann, \c kaiser_bessel, \c nuttall, - * \c rectangle, \c triangle, \c tukey(P), \c partial_tukey(n[/ov[/P]]), - * \c punchout_tukey(n[/ov[/P]]), \c welch. - * - * For \c gauss(STDDEV), STDDEV specifies the standard deviation - * (0blocksize / (2 ^ order). - * - * Set both min and max values to \c 0 to force a single context, - * whose Rice parameter is based on the residual signal variance. - * Otherwise, set a min and max order, and the encoder will search - * all orders, using the mean of each context for its Rice parameter, - * and use the best. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_min_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set the maximum partition order to search when coding the residual. - * This is used in tandem with - * FLAC__stream_encoder_set_min_residual_partition_order(). - * - * The partition order determines the context size in the residual. - * The context size will be approximately blocksize / (2 ^ order). - * - * Set both min and max values to \c 0 to force a single context, - * whose Rice parameter is based on the residual signal variance. - * Otherwise, set a min and max order, and the encoder will search - * all orders, using the mean of each context for its Rice parameter, - * and use the best. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_max_residual_partition_order(FLAC__StreamEncoder *encoder, unsigned value); - -/** Deprecated. Setting this value has no effect. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_rice_parameter_search_dist(FLAC__StreamEncoder *encoder, unsigned value); - -/** Set an estimate of the total samples that will be encoded. - * This is merely an estimate and may be set to \c 0 if unknown. - * This value will be written to the STREAMINFO block before encoding, - * and can remove the need for the caller to rewrite the value later - * if the value is known before encoding. - * - * \default \c 0 - * \param encoder An encoder instance to set. - * \param value See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_total_samples_estimate(FLAC__StreamEncoder *encoder, FLAC__uint64 value); - -/** Set the metadata blocks to be emitted to the stream before encoding. - * A value of \c NULL, \c 0 implies no metadata; otherwise, supply an - * array of pointers to metadata blocks. The array is non-const since - * the encoder may need to change the \a is_last flag inside them, and - * in some cases update seek point offsets. Otherwise, the encoder will - * not modify or free the blocks. It is up to the caller to free the - * metadata blocks after encoding finishes. - * - * \note - * The encoder stores only copies of the pointers in the \a metadata array; - * the metadata blocks themselves must survive at least until after - * FLAC__stream_encoder_finish() returns. Do not free the blocks until then. - * - * \note - * The STREAMINFO block is always written and no STREAMINFO block may - * occur in the supplied array. - * - * \note - * By default the encoder does not create a SEEKTABLE. If one is supplied - * in the \a metadata array, but the client has specified that it does not - * support seeking, then the SEEKTABLE will be written verbatim. However - * by itself this is not very useful as the client will not know the stream - * offsets for the seekpoints ahead of time. In order to get a proper - * seektable the client must support seeking. See next note. - * - * \note - * SEEKTABLE blocks are handled specially. Since you will not know - * the values for the seek point stream offsets, you should pass in - * a SEEKTABLE 'template', that is, a SEEKTABLE object with the - * required sample numbers (or placeholder points), with \c 0 for the - * \a frame_samples and \a stream_offset fields for each point. If the - * client has specified that it supports seeking by providing a seek - * callback to FLAC__stream_encoder_init_stream() or both seek AND read - * callback to FLAC__stream_encoder_init_ogg_stream() (or by using - * FLAC__stream_encoder_init*_file() or FLAC__stream_encoder_init*_FILE()), - * then while it is encoding the encoder will fill the stream offsets in - * for you and when encoding is finished, it will seek back and write the - * real values into the SEEKTABLE block in the stream. There are helper - * routines for manipulating seektable template blocks; see metadata.h: - * FLAC__metadata_object_seektable_template_*(). If the client does - * not support seeking, the SEEKTABLE will have inaccurate offsets which - * will slow down or remove the ability to seek in the FLAC stream. - * - * \note - * The encoder instance \b will modify the first \c SEEKTABLE block - * as it transforms the template to a valid seektable while encoding, - * but it is still up to the caller to free all metadata blocks after - * encoding. - * - * \note - * A VORBIS_COMMENT block may be supplied. The vendor string in it - * will be ignored. libFLAC will use it's own vendor string. libFLAC - * will not modify the passed-in VORBIS_COMMENT's vendor string, it - * will simply write it's own into the stream. If no VORBIS_COMMENT - * block is present in the \a metadata array, libFLAC will write an - * empty one, containing only the vendor string. - * - * \note The Ogg FLAC mapping requires that the VORBIS_COMMENT block be - * the second metadata block of the stream. The encoder already supplies - * the STREAMINFO block automatically. If \a metadata does not contain a - * VORBIS_COMMENT block, the encoder will supply that too. Otherwise, if - * \a metadata does contain a VORBIS_COMMENT block and it is not the - * first, the init function will reorder \a metadata by moving the - * VORBIS_COMMENT block to the front; the relative ordering of the other - * blocks will remain as they were. - * - * \note The Ogg FLAC mapping limits the number of metadata blocks per - * stream to \c 65535. If \a num_blocks exceeds this the function will - * return \c false. - * - * \default \c NULL, 0 - * \param encoder An encoder instance to set. - * \param metadata See above. - * \param num_blocks See above. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * \c false if the encoder is already initialized, else \c true. - * \c false if the encoder is already initialized, or if - * \a num_blocks > 65535 if encoding to Ogg FLAC, else \c true. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_set_metadata(FLAC__StreamEncoder *encoder, FLAC__StreamMetadata **metadata, unsigned num_blocks); - -/** Get the current encoder state. - * - * \param encoder An encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__StreamEncoderState - * The current encoder state. - */ -FLAC_API FLAC__StreamEncoderState FLAC__stream_encoder_get_state(const FLAC__StreamEncoder *encoder); - -/** Get the state of the verify stream decoder. - * Useful when the stream encoder state is - * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. - * - * \param encoder An encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__StreamDecoderState - * The verify stream decoder state. - */ -FLAC_API FLAC__StreamDecoderState FLAC__stream_encoder_get_verify_decoder_state(const FLAC__StreamEncoder *encoder); - -/** Get the current encoder state as a C string. - * This version automatically resolves - * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR by getting the - * verify decoder's state. - * - * \param encoder A encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval const char * - * The encoder state as a C string. Do not modify the contents. - */ -FLAC_API const char *FLAC__stream_encoder_get_resolved_state_string(const FLAC__StreamEncoder *encoder); - -/** Get relevant values about the nature of a verify decoder error. - * Useful when the stream encoder state is - * \c FLAC__STREAM_ENCODER_VERIFY_DECODER_ERROR. The arguments should - * be addresses in which the stats will be returned, or NULL if value - * is not desired. - * - * \param encoder An encoder instance to query. - * \param absolute_sample The absolute sample number of the mismatch. - * \param frame_number The number of the frame in which the mismatch occurred. - * \param channel The channel in which the mismatch occurred. - * \param sample The number of the sample (relative to the frame) in - * which the mismatch occurred. - * \param expected The expected value for the sample in question. - * \param got The actual value returned by the decoder. - * \assert - * \code encoder != NULL \endcode - */ -FLAC_API void FLAC__stream_encoder_get_verify_decoder_error_stats(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_sample, unsigned *frame_number, unsigned *channel, unsigned *sample, FLAC__int32 *expected, FLAC__int32 *got); - -/** Get the "verify" flag. - * - * \param encoder An encoder instance to query. - * \assert - * \code encoder != NULL \endcode - * \retval FLAC__bool - * See FLAC__stream_encoder_set_verify(). - */ -FLAC_API FLAC__bool FLAC__stream_encoder_get_verify(const FLAC__StreamEncoder *encoder); - -/** Get the frame header. - * - * \param encoder An initialized encoder instance in the OK state. - * \param buffer An array of pointers to each channel's signal. - * \param samples The number of samples in one channel. - * \assert - * \code encoder != NULL \endcode - * \code FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK \endcode - * \retval FLAC__bool - * \c true if successful, else \c false; in this case, check the - * encoder state with FLAC__stream_encoder_get_state() to see what - * went wrong. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_process(FLAC__StreamEncoder *encoder, const FLAC__int32 * const buffer[], unsigned samples); - -/** Submit data for encoding. - * This version allows you to supply the input data where the channels - * are interleaved into a single array (i.e. channel0_sample0, - * channel1_sample0, ... , channelN_sample0, channel0_sample1, ...). - * The samples need not be block-aligned but they must be - * sample-aligned, i.e. the first value should be channel0_sample0 - * and the last value channelN_sampleM. Each sample should be a signed - * integer, right-justified to the resolution set by - * FLAC__stream_encoder_set_bits_per_sample(). For example, if the - * resolution is 16 bits per sample, the samples should all be in the - * range [-32768,32767]. - * - * For applications where channel order is important, channels must - * follow the order as described in the - * frame header. - * - * \param encoder An initialized encoder instance in the OK state. - * \param buffer An array of channel-interleaved data (see above). - * \param samples The number of samples in one channel, the same as for - * FLAC__stream_encoder_process(). For example, if - * encoding two channels, \c 1000 \a samples corresponds - * to a \a buffer of 2000 values. - * \assert - * \code encoder != NULL \endcode - * \code FLAC__stream_encoder_get_state(encoder) == FLAC__STREAM_ENCODER_OK \endcode - * \retval FLAC__bool - * \c true if successful, else \c false; in this case, check the - * encoder state with FLAC__stream_encoder_get_state() to see what - * went wrong. - */ -FLAC_API FLAC__bool FLAC__stream_encoder_process_interleaved(FLAC__StreamEncoder *encoder, const FLAC__int32 buffer[], unsigned samples); - -/* \} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/win_utf8_io.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/win_utf8_io.h deleted file mode 100755 index 8834e10..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/flac/win_utf8_io.h +++ /dev/null @@ -1,69 +0,0 @@ -/* libFLAC - Free Lossless Audio Codec library - * Copyright (C) 2013-2014 Xiph.Org Foundation - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * - Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * - Neither the name of the Xiph.org Foundation nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifdef _WIN32 - -#ifndef flac__win_utf8_io_h -#define flac__win_utf8_io_h - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include -#include - -int get_utf8_argv(int *argc, char ***argv); - -int printf_utf8(const char *format, ...); -int fprintf_utf8(FILE *stream, const char *format, ...); -int vfprintf_utf8(FILE *stream, const char *format, va_list argptr); - -FILE *fopen_utf8(const char *filename, const char *mode); -int stat_utf8(const char *path, struct stat *buffer); -int _stat64_utf8(const char *path, struct __stat64 *buffer); -int chmod_utf8(const char *filename, int pmode); -int utime_utf8(const char *filename, struct utimbuf *times); -int unlink_utf8(const char *filename); -int rename_utf8(const char *oldname, const char *newname); -size_t strlen_utf8(const char *str); -int win_get_console_width(void); -int print_console(FILE *stream, const wchar_t *text, size_t len); -HANDLE WINAPI CreateFile_utf8(const char *lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp deleted file mode 100755 index aac2633..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.cpp +++ /dev/null @@ -1,1016 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -static const char* const aiffFormatName = "AIFF file"; - -//============================================================================== -const char* const AiffAudioFormat::appleOneShot = "apple one shot"; -const char* const AiffAudioFormat::appleRootSet = "apple root set"; -const char* const AiffAudioFormat::appleRootNote = "apple root note"; -const char* const AiffAudioFormat::appleBeats = "apple beats"; -const char* const AiffAudioFormat::appleDenominator = "apple denominator"; -const char* const AiffAudioFormat::appleNumerator = "apple numerator"; -const char* const AiffAudioFormat::appleTag = "apple tag"; -const char* const AiffAudioFormat::appleKey = "apple key"; - -//============================================================================== -namespace AiffFileHelpers -{ - inline int chunkName (const char* name) noexcept { return (int) ByteOrder::littleEndianInt (name); } - - #if JUCE_MSVC - #pragma pack (push, 1) - #endif - - //============================================================================== - struct InstChunk - { - struct Loop - { - uint16 type; // these are different in AIFF and WAV - uint16 startIdentifier; - uint16 endIdentifier; - } JUCE_PACKED; - - int8 baseNote; - int8 detune; - int8 lowNote; - int8 highNote; - int8 lowVelocity; - int8 highVelocity; - int16 gain; - Loop sustainLoop; - Loop releaseLoop; - - void copyTo (StringPairArray& values) const - { - values.set ("MidiUnityNote", String (baseNote)); - values.set ("Detune", String (detune)); - - values.set ("LowNote", String (lowNote)); - values.set ("HighNote", String (highNote)); - values.set ("LowVelocity", String (lowVelocity)); - values.set ("HighVelocity", String (highVelocity)); - - values.set ("Gain", String ((int16) ByteOrder::swapIfLittleEndian ((uint16) gain))); - - values.set ("NumSampleLoops", String (2)); // always 2 with AIFF, WAV can have more - values.set ("Loop0Type", String (ByteOrder::swapIfLittleEndian (sustainLoop.type))); - values.set ("Loop0StartIdentifier", String (ByteOrder::swapIfLittleEndian (sustainLoop.startIdentifier))); - values.set ("Loop0EndIdentifier", String (ByteOrder::swapIfLittleEndian (sustainLoop.endIdentifier))); - values.set ("Loop1Type", String (ByteOrder::swapIfLittleEndian (releaseLoop.type))); - values.set ("Loop1StartIdentifier", String (ByteOrder::swapIfLittleEndian (releaseLoop.startIdentifier))); - values.set ("Loop1EndIdentifier", String (ByteOrder::swapIfLittleEndian (releaseLoop.endIdentifier))); - } - - static uint16 getValue16 (const StringPairArray& values, const char* name, const char* def) - { - return ByteOrder::swapIfLittleEndian ((uint16) values.getValue (name, def).getIntValue()); - } - - static int8 getValue8 (const StringPairArray& values, const char* name, const char* def) - { - return (int8) values.getValue (name, def).getIntValue(); - } - - static void create (MemoryBlock& block, const StringPairArray& values) - { - if (values.getAllKeys().contains ("MidiUnityNote", true)) - { - block.setSize ((sizeof (InstChunk) + 3) & ~(size_t) 3, true); - InstChunk& inst = *static_cast (block.getData()); - - inst.baseNote = getValue8 (values, "MidiUnityNote", "60"); - inst.detune = getValue8 (values, "Detune", "0"); - inst.lowNote = getValue8 (values, "LowNote", "0"); - inst.highNote = getValue8 (values, "HighNote", "127"); - inst.lowVelocity = getValue8 (values, "LowVelocity", "1"); - inst.highVelocity = getValue8 (values, "HighVelocity", "127"); - inst.gain = (int16) getValue16 (values, "Gain", "0"); - - inst.sustainLoop.type = getValue16 (values, "Loop0Type", "0"); - inst.sustainLoop.startIdentifier = getValue16 (values, "Loop0StartIdentifier", "0"); - inst.sustainLoop.endIdentifier = getValue16 (values, "Loop0EndIdentifier", "0"); - inst.releaseLoop.type = getValue16 (values, "Loop1Type", "0"); - inst.releaseLoop.startIdentifier = getValue16 (values, "Loop1StartIdentifier", "0"); - inst.releaseLoop.endIdentifier = getValue16 (values, "Loop1EndIdentifier", "0"); - } - } - - } JUCE_PACKED; - - //============================================================================== - struct BASCChunk - { - enum Key - { - minor = 1, - major = 2, - neither = 3, - both = 4 - }; - - BASCChunk (InputStream& input) - { - zerostruct (*this); - - flags = (uint32) input.readIntBigEndian(); - numBeats = (uint32) input.readIntBigEndian(); - rootNote = (uint16) input.readShortBigEndian(); - key = (uint16) input.readShortBigEndian(); - timeSigNum = (uint16) input.readShortBigEndian(); - timeSigDen = (uint16) input.readShortBigEndian(); - oneShot = (uint16) input.readShortBigEndian(); - input.read (unknown, sizeof (unknown)); - } - - void addToMetadata (StringPairArray& metadata) const - { - const bool rootNoteSet = rootNote != 0; - - setBoolFlag (metadata, AiffAudioFormat::appleOneShot, oneShot == 2); - setBoolFlag (metadata, AiffAudioFormat::appleRootSet, rootNoteSet); - - if (rootNoteSet) - metadata.set (AiffAudioFormat::appleRootNote, String (rootNote)); - - metadata.set (AiffAudioFormat::appleBeats, String (numBeats)); - metadata.set (AiffAudioFormat::appleDenominator, String (timeSigDen)); - metadata.set (AiffAudioFormat::appleNumerator, String (timeSigNum)); - - const char* keyString = nullptr; - - switch (key) - { - case minor: keyString = "major"; break; - case major: keyString = "major"; break; - case neither: keyString = "neither"; break; - case both: keyString = "both"; break; - } - - if (keyString != nullptr) - metadata.set (AiffAudioFormat::appleKey, keyString); - } - - void setBoolFlag (StringPairArray& values, const char* name, bool shouldBeSet) const - { - values.set (name, shouldBeSet ? "1" : "0"); - } - - uint32 flags; - uint32 numBeats; - uint16 rootNote; - uint16 key; - uint16 timeSigNum; - uint16 timeSigDen; - uint16 oneShot; - uint8 unknown[66]; - } JUCE_PACKED; - - #if JUCE_MSVC - #pragma pack (pop) - #endif - - //============================================================================== - namespace CATEChunk - { - static bool isValidTag (const char* d) noexcept - { - return CharacterFunctions::isLetterOrDigit (d[0]) && CharacterFunctions::isUpperCase (d[0]) - && CharacterFunctions::isLetterOrDigit (d[1]) && CharacterFunctions::isLowerCase (d[1]) - && CharacterFunctions::isLetterOrDigit (d[2]) && CharacterFunctions::isLowerCase (d[2]); - } - - static bool isAppleGenre (const String& tag) noexcept - { - static const char* appleGenres[] = - { - "Rock/Blues", - "Electronic/Dance", - "Jazz", - "Urban", - "World/Ethnic", - "Cinematic/New Age", - "Orchestral", - "Country/Folk", - "Experimental", - "Other Genre" - }; - - for (int i = 0; i < numElementsInArray (appleGenres); ++i) - if (tag == appleGenres[i]) - return true; - - return false; - } - - static String read (InputStream& input, const uint32 length) - { - MemoryBlock mb; - input.skipNextBytes (4); - input.readIntoMemoryBlock (mb, (ssize_t) length - 4); - - StringArray tagsArray; - - const char* data = static_cast (mb.getData()); - const char* dataEnd = data + mb.getSize(); - - while (data < dataEnd) - { - bool isGenre = false; - - if (isValidTag (data)) - { - const String tag = String (CharPointer_UTF8 (data), CharPointer_UTF8 (dataEnd)); - isGenre = isAppleGenre (tag); - tagsArray.add (tag); - } - - data += isGenre ? 118 : 50; - - if (data[0] == 0) - { - if (data + 52 < dataEnd && isValidTag (data + 50)) data += 50; - else if (data + 120 < dataEnd && isValidTag (data + 118)) data += 118; - else if (data + 170 < dataEnd && isValidTag (data + 168)) data += 168; - } - } - - return tagsArray.joinIntoString (";"); - } - } - - //============================================================================== - namespace MarkChunk - { - static bool metaDataContainsZeroIdentifiers (const StringPairArray& values) - { - // (zero cue identifiers are valid for WAV but not for AIFF) - const String cueString ("Cue"); - const String noteString ("CueNote"); - const String identifierString ("Identifier"); - - const StringArray& keys = values.getAllKeys(); - - for (int i = 0; i < keys.size(); ++i) - { - const String key (keys[i]); - - if (key.startsWith (noteString)) - continue; // zero identifier IS valid in a COMT chunk - - if (key.startsWith (cueString) && key.contains (identifierString)) - { - const int value = values.getValue (key, "-1").getIntValue(); - - if (value == 0) - return true; - } - } - - return false; - } - - static void create (MemoryBlock& block, const StringPairArray& values) - { - const int numCues = values.getValue ("NumCuePoints", "0").getIntValue(); - - if (numCues > 0) - { - MemoryOutputStream out (block, false); - - out.writeShortBigEndian ((short) numCues); - - const int numCueLabels = values.getValue ("NumCueLabels", "0").getIntValue(); - const int idOffset = metaDataContainsZeroIdentifiers (values) ? 1 : 0; // can't have zero IDs in AIFF - - #if JUCE_DEBUG - Array identifiers; - #endif - - for (int i = 0; i < numCues; ++i) - { - const String prefixCue ("Cue" + String (i)); - const int identifier = idOffset + values.getValue (prefixCue + "Identifier", "1").getIntValue(); - - #if JUCE_DEBUG - jassert (! identifiers.contains (identifier)); - identifiers.add (identifier); - #endif - - const int offset = values.getValue (prefixCue + "Offset", "0").getIntValue(); - String label ("CueLabel" + String (i)); - - for (int labelIndex = 0; labelIndex < numCueLabels; ++labelIndex) - { - const String prefixLabel ("CueLabel" + String (labelIndex)); - const int labelIdentifier = idOffset + values.getValue (prefixLabel + "Identifier", "1").getIntValue(); - - if (labelIdentifier == identifier) - { - label = values.getValue (prefixLabel + "Text", label); - break; - } - } - - out.writeShortBigEndian ((short) identifier); - out.writeIntBigEndian (offset); - - const size_t labelLength = jmin ((size_t) 254, label.getNumBytesAsUTF8()); // seems to need null terminator even though it's a pstring - out.writeByte ((char) labelLength + 1); - out.write (label.toUTF8(), labelLength); - out.writeByte (0); - } - - if ((out.getDataSize() & 1) != 0) - out.writeByte (0); - } - } - } - - //============================================================================== - namespace COMTChunk - { - static void create (MemoryBlock& block, const StringPairArray& values) - { - const int numNotes = values.getValue ("NumCueNotes", "0").getIntValue(); - - if (numNotes > 0) - { - MemoryOutputStream out (block, false); - out.writeShortBigEndian ((short) numNotes); - - for (int i = 0; i < numNotes; ++i) - { - const String prefix ("CueNote" + String (i)); - - out.writeIntBigEndian (values.getValue (prefix + "TimeStamp", "0").getIntValue()); - out.writeShortBigEndian ((short) values.getValue (prefix + "Identifier", "0").getIntValue()); - - const String comment (values.getValue (prefix + "Text", String())); - - const size_t commentLength = jmin (comment.getNumBytesAsUTF8(), (size_t) 65534); - out.writeShortBigEndian ((short) commentLength + 1); - out.write (comment.toUTF8(), commentLength); - out.writeByte (0); - - if ((out.getDataSize() & 1) != 0) - out.writeByte (0); - } - } - } - } -} - -//============================================================================== -class AiffAudioFormatReader : public AudioFormatReader -{ -public: - AiffAudioFormatReader (InputStream* in) - : AudioFormatReader (in, aiffFormatName) - { - using namespace AiffFileHelpers; - - if (input->readInt() == chunkName ("FORM")) - { - const int len = input->readIntBigEndian(); - const int64 end = input->getPosition() + len; - - const int nextType = input->readInt(); - if (nextType == chunkName ("AIFF") || nextType == chunkName ("AIFC")) - { - bool hasGotVer = false; - bool hasGotData = false; - bool hasGotType = false; - - while (input->getPosition() < end) - { - const int type = input->readInt(); - const uint32 length = (uint32) input->readIntBigEndian(); - const int64 chunkEnd = input->getPosition() + length; - - if (type == chunkName ("FVER")) - { - hasGotVer = true; - - const int ver = input->readIntBigEndian(); - if (ver != 0 && ver != (int) 0xa2805140) - break; - } - else if (type == chunkName ("COMM")) - { - hasGotType = true; - - numChannels = (unsigned int) input->readShortBigEndian(); - lengthInSamples = input->readIntBigEndian(); - bitsPerSample = (unsigned int) input->readShortBigEndian(); - bytesPerFrame = (int) ((numChannels * bitsPerSample) >> 3); - - unsigned char sampleRateBytes[10]; - input->read (sampleRateBytes, 10); - const int byte0 = sampleRateBytes[0]; - - if ((byte0 & 0x80) != 0 - || byte0 <= 0x3F || byte0 > 0x40 - || (byte0 == 0x40 && sampleRateBytes[1] > 0x1C)) - break; - - unsigned int sampRate = ByteOrder::bigEndianInt (sampleRateBytes + 2); - sampRate >>= (16414 - ByteOrder::bigEndianShort (sampleRateBytes)); - sampleRate = (int) sampRate; - - if (length <= 18) - { - // some types don't have a chunk large enough to include a compression - // type, so assume it's just big-endian pcm - littleEndian = false; - } - else - { - const int compType = input->readInt(); - - if (compType == chunkName ("NONE") || compType == chunkName ("twos")) - { - littleEndian = false; - } - else if (compType == chunkName ("sowt")) - { - littleEndian = true; - } - else if (compType == chunkName ("fl32") || compType == chunkName ("FL32")) - { - littleEndian = false; - usesFloatingPointData = true; - } - else - { - sampleRate = 0; - break; - } - } - } - else if (type == chunkName ("SSND")) - { - hasGotData = true; - - const int offset = input->readIntBigEndian(); - dataChunkStart = input->getPosition() + 4 + offset; - lengthInSamples = (bytesPerFrame > 0) ? jmin (lengthInSamples, ((int64) length) / (int64) bytesPerFrame) : 0; - } - else if (type == chunkName ("MARK")) - { - const uint16 numCues = (uint16) input->readShortBigEndian(); - - // these two are always the same for AIFF-read files - metadataValues.set ("NumCuePoints", String (numCues)); - metadataValues.set ("NumCueLabels", String (numCues)); - - for (uint16 i = 0; i < numCues; ++i) - { - uint16 identifier = (uint16) input->readShortBigEndian(); - uint32 offset = (uint32) input->readIntBigEndian(); - uint8 stringLength = (uint8) input->readByte(); - MemoryBlock textBlock; - input->readIntoMemoryBlock (textBlock, stringLength); - - // if the stringLength is even then read one more byte as the - // string needs to be an even number of bytes INCLUDING the - // leading length character in the pascal string - if ((stringLength & 1) == 0) - input->readByte(); - - const String prefixCue ("Cue" + String (i)); - metadataValues.set (prefixCue + "Identifier", String (identifier)); - metadataValues.set (prefixCue + "Offset", String (offset)); - - const String prefixLabel ("CueLabel" + String (i)); - metadataValues.set (prefixLabel + "Identifier", String (identifier)); - metadataValues.set (prefixLabel + "Text", textBlock.toString()); - } - } - else if (type == chunkName ("COMT")) - { - const uint16 numNotes = (uint16) input->readShortBigEndian(); - metadataValues.set ("NumCueNotes", String (numNotes)); - - for (uint16 i = 0; i < numNotes; ++i) - { - uint32 timestamp = (uint32) input->readIntBigEndian(); - uint16 identifier = (uint16) input->readShortBigEndian(); // may be zero in this case - uint16 stringLength = (uint16) input->readShortBigEndian(); - - MemoryBlock textBlock; - input->readIntoMemoryBlock (textBlock, stringLength + (stringLength & 1)); - - const String prefix ("CueNote" + String (i)); - metadataValues.set (prefix + "TimeStamp", String (timestamp)); - metadataValues.set (prefix + "Identifier", String (identifier)); - metadataValues.set (prefix + "Text", textBlock.toString()); - } - } - else if (type == chunkName ("INST")) - { - HeapBlock inst; - inst.calloc (jmax ((size_t) length + 1, sizeof (InstChunk)), 1); - input->read (inst, (int) length); - inst->copyTo (metadataValues); - } - else if (type == chunkName ("basc")) - { - AiffFileHelpers::BASCChunk (*input).addToMetadata (metadataValues); - } - else if (type == chunkName ("cate")) - { - metadataValues.set (AiffAudioFormat::appleTag, - AiffFileHelpers::CATEChunk::read (*input, length)); - } - else if ((hasGotVer && hasGotData && hasGotType) - || chunkEnd < input->getPosition() - || input->isExhausted()) - { - break; - } - - input->setPosition (chunkEnd + (chunkEnd & 1)); // (chunks should be aligned to an even byte address) - } - } - } - - if (metadataValues.size() > 0) - metadataValues.set ("MetaDataSource", "AIFF"); - } - - //============================================================================== - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override - { - clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, - startSampleInFile, numSamples, lengthInSamples); - - if (numSamples <= 0) - return true; - - input->setPosition (dataChunkStart + startSampleInFile * bytesPerFrame); - - while (numSamples > 0) - { - const int tempBufSize = 480 * 3 * 4; // (keep this a multiple of 3) - char tempBuffer [tempBufSize]; - - const int numThisTime = jmin (tempBufSize / bytesPerFrame, numSamples); - const int bytesRead = input->read (tempBuffer, numThisTime * bytesPerFrame); - - if (bytesRead < numThisTime * bytesPerFrame) - { - jassert (bytesRead >= 0); - zeromem (tempBuffer + bytesRead, (size_t) (numThisTime * bytesPerFrame - bytesRead)); - } - - if (littleEndian) - copySampleData (bitsPerSample, usesFloatingPointData, - destSamples, startOffsetInDestBuffer, numDestChannels, - tempBuffer, (int) numChannels, numThisTime); - else - copySampleData (bitsPerSample, usesFloatingPointData, - destSamples, startOffsetInDestBuffer, numDestChannels, - tempBuffer, (int) numChannels, numThisTime); - - startOffsetInDestBuffer += numThisTime; - numSamples -= numThisTime; - } - - return true; - } - - template - static void copySampleData (unsigned int bitsPerSample, const bool usesFloatingPointData, - int* const* destSamples, int startOffsetInDestBuffer, int numDestChannels, - const void* sourceData, int numChannels, int numSamples) noexcept - { - switch (bitsPerSample) - { - case 8: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; - case 16: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; - case 24: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; - case 32: if (usesFloatingPointData) ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); - else ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; - default: jassertfalse; break; - } - } - - int bytesPerFrame; - int64 dataChunkStart; - bool littleEndian; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AiffAudioFormatReader) -}; - -//============================================================================== -class AiffAudioFormatWriter : public AudioFormatWriter -{ -public: - AiffAudioFormatWriter (OutputStream* out, double rate, - unsigned int numChans, unsigned int bits, - const StringPairArray& metadataValues) - : AudioFormatWriter (out, aiffFormatName, rate, numChans, bits), - lengthInSamples (0), - bytesWritten (0), - writeFailed (false) - { - using namespace AiffFileHelpers; - - if (metadataValues.size() > 0) - { - // The meta data should have been santised for the AIFF format. - // If it was originally sourced from a WAV file the MetaDataSource - // key should be removed (or set to "AIFF") once this has been done - jassert (metadataValues.getValue ("MetaDataSource", "None") != "WAV"); - - MarkChunk::create (markChunk, metadataValues); - COMTChunk::create (comtChunk, metadataValues); - InstChunk::create (instChunk, metadataValues); - } - - headerPosition = out->getPosition(); - writeHeader(); - } - - ~AiffAudioFormatWriter() - { - if ((bytesWritten & 1) != 0) - output->writeByte (0); - - writeHeader(); - } - - //============================================================================== - bool write (const int** data, int numSamples) override - { - jassert (data != nullptr && *data != nullptr); // the input must contain at least one channel! - - if (writeFailed) - return false; - - const size_t bytes = (size_t) numSamples * numChannels * bitsPerSample / 8; - tempBlock.ensureSize ((size_t) bytes, false); - - switch (bitsPerSample) - { - case 8: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; - case 16: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; - case 24: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; - case 32: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; - default: jassertfalse; break; - } - - if (bytesWritten + bytes >= (size_t) 0xfff00000 - || ! output->write (tempBlock.getData(), bytes)) - { - // failed to write to disk, so let's try writing the header. - // If it's just run out of disk space, then if it does manage - // to write the header, we'll still have a useable file.. - writeHeader(); - writeFailed = true; - return false; - } - else - { - bytesWritten += bytes; - lengthInSamples += (uint64) numSamples; - - return true; - } - } - -private: - MemoryBlock tempBlock, markChunk, comtChunk, instChunk; - uint64 lengthInSamples, bytesWritten; - int64 headerPosition; - bool writeFailed; - - void writeHeader() - { - using namespace AiffFileHelpers; - - const bool couldSeekOk = output->setPosition (headerPosition); - (void) couldSeekOk; - - // if this fails, you've given it an output stream that can't seek! It needs - // to be able to seek back to write the header - jassert (couldSeekOk); - - const int headerLen = (int) (54 + (markChunk.getSize() > 0 ? markChunk.getSize() + 8 : 0) - + (comtChunk.getSize() > 0 ? comtChunk.getSize() + 8 : 0) - + (instChunk.getSize() > 0 ? instChunk.getSize() + 8 : 0)); - int audioBytes = (int) (lengthInSamples * ((bitsPerSample * numChannels) / 8)); - audioBytes += (audioBytes & 1); - - output->writeInt (chunkName ("FORM")); - output->writeIntBigEndian (headerLen + audioBytes - 8); - output->writeInt (chunkName ("AIFF")); - output->writeInt (chunkName ("COMM")); - output->writeIntBigEndian (18); - output->writeShortBigEndian ((short) numChannels); - output->writeIntBigEndian ((int) lengthInSamples); - output->writeShortBigEndian ((short) bitsPerSample); - - uint8 sampleRateBytes[10] = { 0 }; - - if (sampleRate <= 1) - { - sampleRateBytes[0] = 0x3f; - sampleRateBytes[1] = 0xff; - sampleRateBytes[2] = 0x80; - } - else - { - int mask = 0x40000000; - sampleRateBytes[0] = 0x40; - - if (sampleRate >= mask) - { - jassertfalse; - sampleRateBytes[1] = 0x1d; - } - else - { - int n = (int) sampleRate; - - int i; - for (i = 0; i <= 32 ; ++i) - { - if ((n & mask) != 0) - break; - - mask >>= 1; - } - - n = n << (i + 1); - - sampleRateBytes[1] = (uint8) (29 - i); - sampleRateBytes[2] = (uint8) ((n >> 24) & 0xff); - sampleRateBytes[3] = (uint8) ((n >> 16) & 0xff); - sampleRateBytes[4] = (uint8) ((n >> 8) & 0xff); - sampleRateBytes[5] = (uint8) (n & 0xff); - } - } - - output->write (sampleRateBytes, 10); - - if (markChunk.getSize() > 0) - { - output->writeInt (chunkName ("MARK")); - output->writeIntBigEndian ((int) markChunk.getSize()); - *output << markChunk; - } - - if (comtChunk.getSize() > 0) - { - output->writeInt (chunkName ("COMT")); - output->writeIntBigEndian ((int) comtChunk.getSize()); - *output << comtChunk; - } - - if (instChunk.getSize() > 0) - { - output->writeInt (chunkName ("INST")); - output->writeIntBigEndian ((int) instChunk.getSize()); - *output << instChunk; - } - - output->writeInt (chunkName ("SSND")); - output->writeIntBigEndian (audioBytes + 8); - output->writeInt (0); - output->writeInt (0); - - jassert (output->getPosition() == headerLen); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AiffAudioFormatWriter) -}; - -//============================================================================== -class MemoryMappedAiffReader : public MemoryMappedAudioFormatReader -{ -public: - MemoryMappedAiffReader (const File& f, const AiffAudioFormatReader& reader) - : MemoryMappedAudioFormatReader (f, reader, reader.dataChunkStart, - reader.bytesPerFrame * reader.lengthInSamples, reader.bytesPerFrame), - littleEndian (reader.littleEndian) - { - } - - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override - { - clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, - startSampleInFile, numSamples, lengthInSamples); - - if (map == nullptr || ! mappedSection.contains (Range (startSampleInFile, startSampleInFile + numSamples))) - { - jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. - return false; - } - - if (littleEndian) - AiffAudioFormatReader::copySampleData - (bitsPerSample, usesFloatingPointData, destSamples, startOffsetInDestBuffer, - numDestChannels, sampleToPointer (startSampleInFile), (int) numChannels, numSamples); - else - AiffAudioFormatReader::copySampleData - (bitsPerSample, usesFloatingPointData, destSamples, startOffsetInDestBuffer, - numDestChannels, sampleToPointer (startSampleInFile), (int) numChannels, numSamples); - - return true; - } - - void getSample (int64 sample, float* result) const noexcept override - { - const int num = (int) numChannels; - - if (map == nullptr || ! mappedSection.contains (sample)) - { - jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. - - zeromem (result, sizeof (float) * (size_t) num); - return; - } - - float** dest = &result; - const void* source = sampleToPointer (sample); - - if (littleEndian) - { - switch (bitsPerSample) - { - case 8: ReadHelper::read (dest, 0, 1, source, 1, num); break; - case 16: ReadHelper::read (dest, 0, 1, source, 1, num); break; - case 24: ReadHelper::read (dest, 0, 1, source, 1, num); break; - case 32: if (usesFloatingPointData) ReadHelper::read (dest, 0, 1, source, 1, num); - else ReadHelper::read (dest, 0, 1, source, 1, num); break; - default: jassertfalse; break; - } - } - else - { - switch (bitsPerSample) - { - case 8: ReadHelper::read (dest, 0, 1, source, 1, num); break; - case 16: ReadHelper::read (dest, 0, 1, source, 1, num); break; - case 24: ReadHelper::read (dest, 0, 1, source, 1, num); break; - case 32: if (usesFloatingPointData) ReadHelper::read (dest, 0, 1, source, 1, num); - else ReadHelper::read (dest, 0, 1, source, 1, num); break; - default: jassertfalse; break; - } - } - } - - void readMaxLevels (int64 startSampleInFile, int64 numSamples, Range* results, int numChannelsToRead) override - { - if (numSamples <= 0) - { - for (int i = 0; i < numChannelsToRead; ++i) - results[i] = Range(); - - return; - } - - if (map == nullptr || ! mappedSection.contains (Range (startSampleInFile, startSampleInFile + numSamples))) - { - jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. - - for (int i = 0; i < numChannelsToRead; ++i) - results[i] = Range(); - - return; - } - - switch (bitsPerSample) - { - case 8: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; - case 16: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; - case 24: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; - case 32: if (usesFloatingPointData) scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); - else scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; - default: jassertfalse; break; - } - } - -private: - const bool littleEndian; - - template - void scanMinAndMax (int64 startSampleInFile, int64 numSamples, Range* results, int numChannelsToRead) const noexcept - { - for (int i = 0; i < numChannelsToRead; ++i) - results[i] = scanMinAndMaxForChannel (i, startSampleInFile, numSamples); - } - - template - Range scanMinAndMaxForChannel (int channel, int64 startSampleInFile, int64 numSamples) const noexcept - { - return littleEndian ? scanMinAndMaxInterleaved (channel, startSampleInFile, numSamples) - : scanMinAndMaxInterleaved (channel, startSampleInFile, numSamples); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedAiffReader) -}; - -//============================================================================== -AiffAudioFormat::AiffAudioFormat() : AudioFormat (aiffFormatName, ".aiff .aif") -{ -} - -AiffAudioFormat::~AiffAudioFormat() -{ -} - -Array AiffAudioFormat::getPossibleSampleRates() -{ - const int rates[] = { 22050, 32000, 44100, 48000, 88200, 96000, 176400, 192000, 0 }; - return Array (rates); -} - -Array AiffAudioFormat::getPossibleBitDepths() -{ - const int depths[] = { 8, 16, 24, 0 }; - return Array (depths); -} - -bool AiffAudioFormat::canDoStereo() { return true; } -bool AiffAudioFormat::canDoMono() { return true; } - -#if JUCE_MAC -bool AiffAudioFormat::canHandleFile (const File& f) -{ - if (AudioFormat::canHandleFile (f)) - return true; - - const OSType type = f.getMacOSType(); - - // (NB: written as hex to avoid four-char-constant warnings) - return type == 0x41494646 /* AIFF */ || type == 0x41494643 /* AIFC */ - || type == 0x61696666 /* aiff */ || type == 0x61696663 /* aifc */; -} -#endif - -AudioFormatReader* AiffAudioFormat::createReaderFor (InputStream* sourceStream, const bool deleteStreamIfOpeningFails) -{ - ScopedPointer w (new AiffAudioFormatReader (sourceStream)); - - if (w->sampleRate > 0 && w->numChannels > 0) - return w.release(); - - if (! deleteStreamIfOpeningFails) - w->input = nullptr; - - return nullptr; -} - -MemoryMappedAudioFormatReader* AiffAudioFormat::createMemoryMappedReader (const File& file) -{ - if (FileInputStream* fin = file.createInputStream()) - { - AiffAudioFormatReader reader (fin); - - if (reader.lengthInSamples > 0) - return new MemoryMappedAiffReader (file, reader); - } - - return nullptr; -} - -AudioFormatWriter* AiffAudioFormat::createWriterFor (OutputStream* out, - double sampleRate, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int /*qualityOptionIndex*/) -{ - if (getPossibleBitDepths().contains (bitsPerSample)) - return new AiffAudioFormatWriter (out, sampleRate, numberOfChannels, (unsigned int) bitsPerSample, metadataValues); - - return nullptr; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h deleted file mode 100755 index 01d1484..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_AiffAudioFormat.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -//============================================================================== -/** - Reads and Writes AIFF format audio files. - - @see AudioFormat -*/ -class JUCE_API AiffAudioFormat : public AudioFormat -{ -public: - //============================================================================== - /** Creates an format object. */ - AiffAudioFormat(); - - /** Destructor. */ - ~AiffAudioFormat(); - - //============================================================================== - /** Metadata property name used when reading a aiff file with a basc chunk. */ - static const char* const appleOneShot; - /** Metadata property name used when reading a aiff file with a basc chunk. */ - static const char* const appleRootSet; - /** Metadata property name used when reading a aiff file with a basc chunk. */ - static const char* const appleRootNote; - /** Metadata property name used when reading a aiff file with a basc chunk. */ - static const char* const appleBeats; - /** Metadata property name used when reading a aiff file with a basc chunk. */ - static const char* const appleDenominator; - /** Metadata property name used when reading a aiff file with a basc chunk. */ - static const char* const appleNumerator; - /** Metadata property name used when reading a aiff file with a basc chunk. */ - static const char* const appleTag; - /** Metadata property name used when reading a aiff file with a basc chunk. */ - static const char* const appleKey; - - //============================================================================== - Array getPossibleSampleRates() override; - Array getPossibleBitDepths() override; - bool canDoStereo() override; - bool canDoMono() override; - - #if JUCE_MAC - bool canHandleFile (const File& fileToTest) override; - #endif - - //============================================================================== - AudioFormatReader* createReaderFor (InputStream* sourceStream, - bool deleteStreamIfOpeningFails) override; - - MemoryMappedAudioFormatReader* createMemoryMappedReader (const File&) override; - - AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(AiffAudioFormat) -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp deleted file mode 100755 index 6d3aafa..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp +++ /dev/null @@ -1,528 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_MAC || JUCE_IOS - -//============================================================================== -namespace -{ - const char* const coreAudioFormatName = "CoreAudio supported file"; - - StringArray findFileExtensionsForCoreAudioCodecs() - { - StringArray extensionsArray; - CFArrayRef extensions = nullptr; - UInt32 sizeOfArray = sizeof (extensions); - - if (AudioFileGetGlobalInfo (kAudioFileGlobalInfo_AllExtensions, 0, 0, &sizeOfArray, &extensions) == noErr) - { - const CFIndex numValues = CFArrayGetCount (extensions); - - for (CFIndex i = 0; i < numValues; ++i) - extensionsArray.add ("." + String::fromCFString ((CFStringRef) CFArrayGetValueAtIndex (extensions, i))); - - CFRelease (extensions); - } - - return extensionsArray; - } -} - -//============================================================================== -const char* const CoreAudioFormat::midiDataBase64 = "midiDataBase64"; -const char* const CoreAudioFormat::tempo = "tempo"; -const char* const CoreAudioFormat::timeSig = "time signature"; -const char* const CoreAudioFormat::keySig = "key signature"; - -//============================================================================== -struct CoreAudioFormatMetatdata -{ - static uint32 chunkName (const char* const name) noexcept { return ByteOrder::bigEndianInt (name); } - - //============================================================================== - struct FileHeader - { - FileHeader (InputStream& input) - { - fileType = (uint32) input.readIntBigEndian(); - fileVersion = (uint16) input.readShortBigEndian(); - fileFlags = (uint16) input.readShortBigEndian(); - } - - uint32 fileType; - uint16 fileVersion; - uint16 fileFlags; - }; - - //============================================================================== - struct ChunkHeader - { - ChunkHeader (InputStream& input) - { - chunkType = (uint32) input.readIntBigEndian(); - chunkSize = (int64) input.readInt64BigEndian(); - } - - uint32 chunkType; - int64 chunkSize; - }; - - //============================================================================== - struct AudioDescriptionChunk - { - AudioDescriptionChunk (InputStream& input) - { - sampleRate = input.readDoubleBigEndian(); - formatID = (uint32) input.readIntBigEndian(); - formatFlags = (uint32) input.readIntBigEndian(); - bytesPerPacket = (uint32) input.readIntBigEndian(); - framesPerPacket = (uint32) input.readIntBigEndian(); - channelsPerFrame = (uint32) input.readIntBigEndian(); - bitsPerChannel = (uint32) input.readIntBigEndian(); - } - - double sampleRate; - uint32 formatID; - uint32 formatFlags; - uint32 bytesPerPacket; - uint32 framesPerPacket; - uint32 channelsPerFrame; - uint32 bitsPerChannel; - }; - - //============================================================================== - struct UserDefinedChunk - { - UserDefinedChunk (InputStream& input, int64 size) - { - // a user defined chunk contains 16 bytes of a UUID first - uuid[1] = input.readInt64BigEndian(); - uuid[0] = input.readInt64BigEndian(); - - input.skipNextBytes (size - 16); - } - - int64 uuid[2]; - }; - - //============================================================================== - static StringPairArray parseMidiChunk (InputStream& input, int64 size) - { - const int64 originalPosition = input.getPosition(); - - MemoryBlock midiBlock; - input.readIntoMemoryBlock (midiBlock, (ssize_t) size); - MemoryInputStream midiInputStream (midiBlock, false); - - StringPairArray midiMetadata; - MidiFile midiFile; - - if (midiFile.readFrom (midiInputStream)) - { - midiMetadata.set (CoreAudioFormat::midiDataBase64, midiBlock.toBase64Encoding()); - - findTempoEvents (midiFile, midiMetadata); - findTimeSigEvents (midiFile, midiMetadata); - findKeySigEvents (midiFile, midiMetadata); - } - - input.setPosition (originalPosition + size); - return midiMetadata; - } - - static void findTempoEvents (MidiFile& midiFile, StringPairArray& midiMetadata) - { - MidiMessageSequence tempoEvents; - midiFile.findAllTempoEvents (tempoEvents); - - const int numTempoEvents = tempoEvents.getNumEvents(); - MemoryOutputStream tempoSequence; - - for (int i = 0; i < numTempoEvents; ++i) - { - const double tempo = getTempoFromTempoMetaEvent (tempoEvents.getEventPointer (i)); - - if (tempo > 0.0) - { - if (i == 0) - midiMetadata.set (CoreAudioFormat::tempo, String (tempo)); - - if (numTempoEvents > 1) - tempoSequence << String (tempo) << ',' << tempoEvents.getEventTime (i) << ';'; - } - } - - if (tempoSequence.getDataSize() > 0) - midiMetadata.set ("tempo sequence", tempoSequence.toUTF8()); - } - - static double getTempoFromTempoMetaEvent (MidiMessageSequence::MidiEventHolder* holder) - { - if (holder != nullptr) - { - const MidiMessage& midiMessage = holder->message; - - if (midiMessage.isTempoMetaEvent()) - { - const double tempoSecondsPerQuarterNote = midiMessage.getTempoSecondsPerQuarterNote(); - - if (tempoSecondsPerQuarterNote > 0.0) - return 60.0 / tempoSecondsPerQuarterNote; - } - } - - return 0.0; - } - - static void findTimeSigEvents (MidiFile& midiFile, StringPairArray& midiMetadata) - { - MidiMessageSequence timeSigEvents; - midiFile.findAllTimeSigEvents (timeSigEvents); - const int numTimeSigEvents = timeSigEvents.getNumEvents(); - - MemoryOutputStream timeSigSequence; - - for (int i = 0; i < numTimeSigEvents; ++i) - { - int numerator, denominator; - timeSigEvents.getEventPointer(i)->message.getTimeSignatureInfo (numerator, denominator); - - String timeSigString; - timeSigString << numerator << '/' << denominator; - - if (i == 0) - midiMetadata.set (CoreAudioFormat::timeSig, timeSigString); - - if (numTimeSigEvents > 1) - timeSigSequence << timeSigString << ',' << timeSigEvents.getEventTime (i) << ';'; - } - - if (timeSigSequence.getDataSize() > 0) - midiMetadata.set ("time signature sequence", timeSigSequence.toUTF8()); - } - - static void findKeySigEvents (MidiFile& midiFile, StringPairArray& midiMetadata) - { - MidiMessageSequence keySigEvents; - midiFile.findAllKeySigEvents (keySigEvents); - const int numKeySigEvents = keySigEvents.getNumEvents(); - - MemoryOutputStream keySigSequence; - - for (int i = 0; i < numKeySigEvents; ++i) - { - const MidiMessage& message (keySigEvents.getEventPointer (i)->message); - const int key = jlimit (0, 14, message.getKeySignatureNumberOfSharpsOrFlats() + 7); - const bool isMajor = message.isKeySignatureMajorKey(); - - static const char* majorKeys[] = { "Cb", "Gb", "Db", "Ab", "Eb", "Bb", "F", "C", "G", "D", "A", "E", "B", "F#", "C#" }; - static const char* minorKeys[] = { "Ab", "Eb", "Bb", "F", "C", "G", "D", "A", "E", "B", "F#", "C#", "G#", "D#", "A#" }; - - String keySigString (isMajor ? majorKeys[key] - : minorKeys[key]); - - if (! isMajor) - keySigString << 'm'; - - if (i == 0) - midiMetadata.set (CoreAudioFormat::keySig, keySigString); - - if (numKeySigEvents > 1) - keySigSequence << keySigString << ',' << keySigEvents.getEventTime (i) << ';'; - } - - if (keySigSequence.getDataSize() > 0) - midiMetadata.set ("key signature sequence", keySigSequence.toUTF8()); - } - - //============================================================================== - static StringPairArray parseInformationChunk (InputStream& input) - { - StringPairArray infoStrings; - const uint32 numEntries = (uint32) input.readIntBigEndian(); - - for (uint32 i = 0; i < numEntries; ++i) - infoStrings.set (input.readString(), input.readString()); - - return infoStrings; - } - - //============================================================================== - static bool read (InputStream& input, StringPairArray& metadataValues) - { - const int64 originalPos = input.getPosition(); - - const FileHeader cafFileHeader (input); - const bool isCafFile = cafFileHeader.fileType == chunkName ("caff"); - - if (isCafFile) - { - while (! input.isExhausted()) - { - const ChunkHeader chunkHeader (input); - - if (chunkHeader.chunkType == chunkName ("desc")) - { - AudioDescriptionChunk audioDescriptionChunk (input); - } - else if (chunkHeader.chunkType == chunkName ("uuid")) - { - UserDefinedChunk userDefinedChunk (input, chunkHeader.chunkSize); - } - else if (chunkHeader.chunkType == chunkName ("data")) - { - // -1 signifies an unknown data size so the data has to be at the - // end of the file so we must have finished the header - - if (chunkHeader.chunkSize == -1) - break; - - input.skipNextBytes (chunkHeader.chunkSize); - } - else if (chunkHeader.chunkType == chunkName ("midi")) - { - metadataValues.addArray (parseMidiChunk (input, chunkHeader.chunkSize)); - } - else if (chunkHeader.chunkType == chunkName ("info")) - { - metadataValues.addArray (parseInformationChunk (input)); - } - else - { - // we aren't decoding this chunk yet so just skip over it - input.skipNextBytes (chunkHeader.chunkSize); - } - } - } - - input.setPosition (originalPos); - - return isCafFile; - } -}; - -//============================================================================== -class CoreAudioReader : public AudioFormatReader -{ -public: - CoreAudioReader (InputStream* const inp) - : AudioFormatReader (inp, coreAudioFormatName), - ok (false), lastReadPosition (0) - { - usesFloatingPointData = true; - bitsPerSample = 32; - - if (input != nullptr) - CoreAudioFormatMetatdata::read (*input, metadataValues); - - OSStatus status = AudioFileOpenWithCallbacks (this, - &readCallback, - nullptr, // write needs to be null to avoid permisisions errors - &getSizeCallback, - nullptr, // setSize needs to be null to avoid permisisions errors - 0, // AudioFileTypeID inFileTypeHint - &audioFileID); - if (status == noErr) - { - status = ExtAudioFileWrapAudioFileID (audioFileID, false, &audioFileRef); - - if (status == noErr) - { - AudioStreamBasicDescription sourceAudioFormat; - UInt32 audioStreamBasicDescriptionSize = sizeof (AudioStreamBasicDescription); - ExtAudioFileGetProperty (audioFileRef, - kExtAudioFileProperty_FileDataFormat, - &audioStreamBasicDescriptionSize, - &sourceAudioFormat); - - numChannels = sourceAudioFormat.mChannelsPerFrame; - sampleRate = sourceAudioFormat.mSampleRate; - - UInt32 sizeOfLengthProperty = sizeof (int64); - ExtAudioFileGetProperty (audioFileRef, - kExtAudioFileProperty_FileLengthFrames, - &sizeOfLengthProperty, - &lengthInSamples); - - destinationAudioFormat.mSampleRate = sampleRate; - destinationAudioFormat.mFormatID = kAudioFormatLinearPCM; - destinationAudioFormat.mFormatFlags = kLinearPCMFormatFlagIsFloat | kLinearPCMFormatFlagIsNonInterleaved | kAudioFormatFlagsNativeEndian; - destinationAudioFormat.mBitsPerChannel = sizeof (float) * 8; - destinationAudioFormat.mChannelsPerFrame = numChannels; - destinationAudioFormat.mBytesPerFrame = sizeof (float); - destinationAudioFormat.mFramesPerPacket = 1; - destinationAudioFormat.mBytesPerPacket = destinationAudioFormat.mFramesPerPacket * destinationAudioFormat.mBytesPerFrame; - - status = ExtAudioFileSetProperty (audioFileRef, - kExtAudioFileProperty_ClientDataFormat, - sizeof (AudioStreamBasicDescription), - &destinationAudioFormat); - if (status == noErr) - { - bufferList.malloc (1, sizeof (AudioBufferList) + numChannels * sizeof (AudioBuffer)); - bufferList->mNumberBuffers = numChannels; - ok = true; - } - } - } - } - - ~CoreAudioReader() - { - ExtAudioFileDispose (audioFileRef); - AudioFileClose (audioFileID); - } - - //============================================================================== - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override - { - clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, - startSampleInFile, numSamples, lengthInSamples); - - if (numSamples <= 0) - return true; - - if (lastReadPosition != startSampleInFile) - { - OSStatus status = ExtAudioFileSeek (audioFileRef, startSampleInFile); - if (status != noErr) - return false; - - lastReadPosition = startSampleInFile; - } - - while (numSamples > 0) - { - const int numThisTime = jmin (8192, numSamples); - const size_t numBytes = sizeof (float) * (size_t) numThisTime; - - audioDataBlock.ensureSize (numBytes * numChannels, false); - float* data = static_cast (audioDataBlock.getData()); - - for (int j = (int) numChannels; --j >= 0;) - { - bufferList->mBuffers[j].mNumberChannels = 1; - bufferList->mBuffers[j].mDataByteSize = (UInt32) numBytes; - bufferList->mBuffers[j].mData = data; - data += numThisTime; - } - - UInt32 numFramesToRead = (UInt32) numThisTime; - OSStatus status = ExtAudioFileRead (audioFileRef, &numFramesToRead, bufferList); - if (status != noErr) - return false; - - for (int i = numDestChannels; --i >= 0;) - { - if (destSamples[i] != nullptr) - { - if (i < (int) numChannels) - memcpy (destSamples[i] + startOffsetInDestBuffer, bufferList->mBuffers[i].mData, numBytes); - else - zeromem (destSamples[i] + startOffsetInDestBuffer, numBytes); - } - } - - startOffsetInDestBuffer += numThisTime; - numSamples -= numThisTime; - lastReadPosition += numThisTime; - } - - return true; - } - - bool ok; - -private: - AudioFileID audioFileID; - ExtAudioFileRef audioFileRef; - AudioStreamBasicDescription destinationAudioFormat; - MemoryBlock audioDataBlock; - HeapBlock bufferList; - int64 lastReadPosition; - - static SInt64 getSizeCallback (void* inClientData) - { - return static_cast (inClientData)->input->getTotalLength(); - } - - static OSStatus readCallback (void* inClientData, - SInt64 inPosition, - UInt32 requestCount, - void* buffer, - UInt32* actualCount) - { - CoreAudioReader* const reader = static_cast (inClientData); - - reader->input->setPosition (inPosition); - *actualCount = (UInt32) reader->input->read (buffer, (int) requestCount); - - return noErr; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioReader) -}; - -//============================================================================== -CoreAudioFormat::CoreAudioFormat() - : AudioFormat (coreAudioFormatName, findFileExtensionsForCoreAudioCodecs()) -{ -} - -CoreAudioFormat::~CoreAudioFormat() {} - -Array CoreAudioFormat::getPossibleSampleRates() { return Array(); } -Array CoreAudioFormat::getPossibleBitDepths() { return Array(); } - -bool CoreAudioFormat::canDoStereo() { return true; } -bool CoreAudioFormat::canDoMono() { return true; } - -//============================================================================== -AudioFormatReader* CoreAudioFormat::createReaderFor (InputStream* sourceStream, - bool deleteStreamIfOpeningFails) -{ - ScopedPointer r (new CoreAudioReader (sourceStream)); - - if (r->ok) - return r.release(); - - if (! deleteStreamIfOpeningFails) - r->input = nullptr; - - return nullptr; -} - -AudioFormatWriter* CoreAudioFormat::createWriterFor (OutputStream*, - double /*sampleRateToUse*/, - unsigned int /*numberOfChannels*/, - int /*bitsPerSample*/, - const StringPairArray& /*metadataValues*/, - int /*qualityOptionIndex*/) -{ - jassertfalse; // not yet implemented! - return nullptr; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h deleted file mode 100755 index 60bace4..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_CoreAudioFormat.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_MAC || JUCE_IOS || DOXYGEN - -//============================================================================== -/** - OSX and iOS only - This uses the AudioToolbox framework to read any audio - format that the system has a codec for. - - This should be able to understand formats such as mp3, m4a, etc. - - @see AudioFormat - */ -class JUCE_API CoreAudioFormat : public AudioFormat -{ -public: - //============================================================================== - /** Creates a format object. */ - CoreAudioFormat(); - - /** Destructor. */ - ~CoreAudioFormat(); - - //============================================================================== - /** Metadata property name used when reading a caf file with a MIDI chunk. */ - static const char* const midiDataBase64; - /** Metadata property name used when reading a caf file with tempo information. */ - static const char* const tempo; - /** Metadata property name used when reading a caf file time signature information. */ - static const char* const timeSig; - /** Metadata property name used when reading a caf file time signature information. */ - static const char* const keySig; - - //============================================================================== - Array getPossibleSampleRates() override; - Array getPossibleBitDepths() override; - bool canDoStereo() override; - bool canDoMono() override; - - //============================================================================== - AudioFormatReader* createReaderFor (InputStream*, - bool deleteStreamIfOpeningFails) override; - - AudioFormatWriter* createWriterFor (OutputStream*, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreAudioFormat) -}; - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp deleted file mode 100755 index 58fdd8f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.cpp +++ /dev/null @@ -1,556 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_USE_FLAC - -namespace FlacNamespace -{ -#if JUCE_INCLUDE_FLAC_CODE || ! defined (JUCE_INCLUDE_FLAC_CODE) - - #undef VERSION - #define VERSION "1.2.1" - - #define FLAC__NO_DLL 1 - - #if JUCE_MSVC - #pragma warning (disable: 4267 4127 4244 4996 4100 4701 4702 4013 4133 4206 4312 4505 4365 4005 4334 181 111) - #endif - - #if JUCE_MAC - #define FLAC__SYS_DARWIN 1 - #endif - - #ifndef SIZE_MAX - #define SIZE_MAX 0xffffffff - #endif - - #if JUCE_CLANG - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Wshadow" - #pragma clang diagnostic ignored "-Wdeprecated-register" - #endif - - #if JUCE_INTEL - #if JUCE_32BIT - #define FLAC__CPU_IA32 1 - #endif - #if JUCE_64BIT - #define FLAC__CPU_X86_64 1 - #endif - #define FLAC__HAS_X86INTRIN 1 - #endif - - #undef __STDC_LIMIT_MACROS - #define __STDC_LIMIT_MACROS 1 - #define flac_max jmax - #define flac_min jmin - #include "flac/all.h" - #include "flac/libFLAC/bitmath.c" - #include "flac/libFLAC/bitreader.c" - #include "flac/libFLAC/bitwriter.c" - #include "flac/libFLAC/cpu.c" - #include "flac/libFLAC/crc.c" - #include "flac/libFLAC/fixed.c" - #include "flac/libFLAC/float.c" - #include "flac/libFLAC/format.c" - #include "flac/libFLAC/lpc_flac.c" - #include "flac/libFLAC/md5.c" - #include "flac/libFLAC/memory.c" - #include "flac/libFLAC/stream_decoder.c" - #include "flac/libFLAC/stream_encoder.c" - #include "flac/libFLAC/stream_encoder_framing.c" - #include "flac/libFLAC/window_flac.c" - #undef VERSION -#else - #include -#endif - - #if JUCE_CLANG - #pragma clang diagnostic pop - #endif -} - -#undef max -#undef min - -//============================================================================== -static const char* const flacFormatName = "FLAC file"; - - -//============================================================================== -class FlacReader : public AudioFormatReader -{ -public: - FlacReader (InputStream* const in) - : AudioFormatReader (in, flacFormatName), - reservoirStart (0), - samplesInReservoir (0), - scanningForLength (false) - { - using namespace FlacNamespace; - lengthInSamples = 0; - - decoder = FLAC__stream_decoder_new(); - - ok = FLAC__stream_decoder_init_stream (decoder, - readCallback_, seekCallback_, tellCallback_, lengthCallback_, - eofCallback_, writeCallback_, metadataCallback_, errorCallback_, - this) == FLAC__STREAM_DECODER_INIT_STATUS_OK; - - if (ok) - { - FLAC__stream_decoder_process_until_end_of_metadata (decoder); - - if (lengthInSamples == 0 && sampleRate > 0) - { - // the length hasn't been stored in the metadata, so we'll need to - // work it out the length the hard way, by scanning the whole file.. - scanningForLength = true; - FLAC__stream_decoder_process_until_end_of_stream (decoder); - scanningForLength = false; - const int64 tempLength = lengthInSamples; - - FLAC__stream_decoder_reset (decoder); - FLAC__stream_decoder_process_until_end_of_metadata (decoder); - lengthInSamples = tempLength; - } - } - } - - ~FlacReader() - { - FlacNamespace::FLAC__stream_decoder_delete (decoder); - } - - void useMetadata (const FlacNamespace::FLAC__StreamMetadata_StreamInfo& info) - { - sampleRate = info.sample_rate; - bitsPerSample = info.bits_per_sample; - lengthInSamples = (unsigned int) info.total_samples; - numChannels = info.channels; - - reservoir.setSize ((int) numChannels, 2 * (int) info.max_blocksize, false, false, true); - } - - // returns the number of samples read - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override - { - using namespace FlacNamespace; - - if (! ok) - return false; - - while (numSamples > 0) - { - if (startSampleInFile >= reservoirStart - && startSampleInFile < reservoirStart + samplesInReservoir) - { - const int num = (int) jmin ((int64) numSamples, - reservoirStart + samplesInReservoir - startSampleInFile); - - jassert (num > 0); - - for (int i = jmin (numDestChannels, reservoir.getNumChannels()); --i >= 0;) - if (destSamples[i] != nullptr) - memcpy (destSamples[i] + startOffsetInDestBuffer, - reservoir.getReadPointer (i, (int) (startSampleInFile - reservoirStart)), - sizeof (int) * (size_t) num); - - startOffsetInDestBuffer += num; - startSampleInFile += num; - numSamples -= num; - } - else - { - if (startSampleInFile >= (int) lengthInSamples) - { - samplesInReservoir = 0; - } - else if (startSampleInFile < reservoirStart - || startSampleInFile > reservoirStart + jmax (samplesInReservoir, 511)) - { - // had some problems with flac crashing if the read pos is aligned more - // accurately than this. Probably fixed in newer versions of the library, though. - reservoirStart = (int) (startSampleInFile & ~511); - samplesInReservoir = 0; - FLAC__stream_decoder_seek_absolute (decoder, (FLAC__uint64) reservoirStart); - } - else - { - reservoirStart += samplesInReservoir; - samplesInReservoir = 0; - FLAC__stream_decoder_process_single (decoder); - } - - if (samplesInReservoir == 0) - break; - } - } - - if (numSamples > 0) - { - for (int i = numDestChannels; --i >= 0;) - if (destSamples[i] != nullptr) - zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * (size_t) numSamples); - } - - return true; - } - - void useSamples (const FlacNamespace::FLAC__int32* const buffer[], int numSamples) - { - if (scanningForLength) - { - lengthInSamples += numSamples; - } - else - { - if (numSamples > reservoir.getNumSamples()) - reservoir.setSize ((int) numChannels, numSamples, false, false, true); - - const unsigned int bitsToShift = 32 - bitsPerSample; - - for (int i = 0; i < (int) numChannels; ++i) - { - const FlacNamespace::FLAC__int32* src = buffer[i]; - - int n = i; - while (src == 0 && n > 0) - src = buffer [--n]; - - if (src != nullptr) - { - int* const dest = reinterpret_cast (reservoir.getWritePointer(i)); - - for (int j = 0; j < numSamples; ++j) - dest[j] = src[j] << bitsToShift; - } - } - - samplesInReservoir = numSamples; - } - } - - //============================================================================== - static FlacNamespace::FLAC__StreamDecoderReadStatus readCallback_ (const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__byte buffer[], size_t* bytes, void* client_data) - { - using namespace FlacNamespace; - *bytes = (size_t) static_cast (client_data)->input->read (buffer, (int) *bytes); - return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; - } - - static FlacNamespace::FLAC__StreamDecoderSeekStatus seekCallback_ (const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__uint64 absolute_byte_offset, void* client_data) - { - using namespace FlacNamespace; - static_cast (client_data)->input->setPosition ((int) absolute_byte_offset); - return FLAC__STREAM_DECODER_SEEK_STATUS_OK; - } - - static FlacNamespace::FLAC__StreamDecoderTellStatus tellCallback_ (const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__uint64* absolute_byte_offset, void* client_data) - { - using namespace FlacNamespace; - *absolute_byte_offset = (uint64) static_cast (client_data)->input->getPosition(); - return FLAC__STREAM_DECODER_TELL_STATUS_OK; - } - - static FlacNamespace::FLAC__StreamDecoderLengthStatus lengthCallback_ (const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__uint64* stream_length, void* client_data) - { - using namespace FlacNamespace; - *stream_length = (uint64) static_cast (client_data)->input->getTotalLength(); - return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; - } - - static FlacNamespace::FLAC__bool eofCallback_ (const FlacNamespace::FLAC__StreamDecoder*, void* client_data) - { - return static_cast (client_data)->input->isExhausted(); - } - - static FlacNamespace::FLAC__StreamDecoderWriteStatus writeCallback_ (const FlacNamespace::FLAC__StreamDecoder*, - const FlacNamespace::FLAC__Frame* frame, - const FlacNamespace::FLAC__int32* const buffer[], - void* client_data) - { - using namespace FlacNamespace; - static_cast (client_data)->useSamples (buffer, (int) frame->header.blocksize); - return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; - } - - static void metadataCallback_ (const FlacNamespace::FLAC__StreamDecoder*, - const FlacNamespace::FLAC__StreamMetadata* metadata, - void* client_data) - { - static_cast (client_data)->useMetadata (metadata->data.stream_info); - } - - static void errorCallback_ (const FlacNamespace::FLAC__StreamDecoder*, FlacNamespace::FLAC__StreamDecoderErrorStatus, void*) - { - } - -private: - FlacNamespace::FLAC__StreamDecoder* decoder; - AudioSampleBuffer reservoir; - int reservoirStart, samplesInReservoir; - bool ok, scanningForLength; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlacReader) -}; - - -//============================================================================== -class FlacWriter : public AudioFormatWriter -{ -public: - FlacWriter (OutputStream* const out, double rate, uint32 numChans, uint32 bits, int qualityOptionIndex) - : AudioFormatWriter (out, flacFormatName, rate, numChans, bits) - { - using namespace FlacNamespace; - encoder = FLAC__stream_encoder_new(); - - if (qualityOptionIndex > 0) - FLAC__stream_encoder_set_compression_level (encoder, (uint32) jmin (8, qualityOptionIndex)); - - FLAC__stream_encoder_set_do_mid_side_stereo (encoder, numChannels == 2); - FLAC__stream_encoder_set_loose_mid_side_stereo (encoder, numChannels == 2); - FLAC__stream_encoder_set_channels (encoder, numChannels); - FLAC__stream_encoder_set_bits_per_sample (encoder, jmin ((unsigned int) 24, bitsPerSample)); - FLAC__stream_encoder_set_sample_rate (encoder, (unsigned int) sampleRate); - FLAC__stream_encoder_set_blocksize (encoder, 0); - FLAC__stream_encoder_set_do_escape_coding (encoder, true); - - ok = FLAC__stream_encoder_init_stream (encoder, - encodeWriteCallback, encodeSeekCallback, - encodeTellCallback, encodeMetadataCallback, - this) == FLAC__STREAM_ENCODER_INIT_STATUS_OK; - } - - ~FlacWriter() - { - if (ok) - { - FlacNamespace::FLAC__stream_encoder_finish (encoder); - output->flush(); - } - else - { - output = nullptr; // to stop the base class deleting this, as it needs to be returned - // to the caller of createWriter() - } - - FlacNamespace::FLAC__stream_encoder_delete (encoder); - } - - //============================================================================== - bool write (const int** samplesToWrite, int numSamples) override - { - using namespace FlacNamespace; - if (! ok) - return false; - - HeapBlock channels; - HeapBlock temp; - const int bitsToShift = 32 - (int) bitsPerSample; - - if (bitsToShift > 0) - { - temp.malloc (numChannels * (size_t) numSamples); - channels.calloc (numChannels + 1); - - for (unsigned int i = 0; i < numChannels; ++i) - { - if (samplesToWrite[i] == nullptr) - break; - - int* const destData = temp.getData() + i * (size_t) numSamples; - channels[i] = destData; - - for (int j = 0; j < numSamples; ++j) - destData[j] = (samplesToWrite[i][j] >> bitsToShift); - } - - samplesToWrite = const_cast (channels.getData()); - } - - return FLAC__stream_encoder_process (encoder, (const FLAC__int32**) samplesToWrite, (unsigned) numSamples) != 0; - } - - bool writeData (const void* const data, const int size) const - { - return output->write (data, (size_t) size); - } - - static void packUint32 (FlacNamespace::FLAC__uint32 val, FlacNamespace::FLAC__byte* b, const int bytes) - { - b += bytes; - - for (int i = 0; i < bytes; ++i) - { - *(--b) = (FlacNamespace::FLAC__byte) (val & 0xff); - val >>= 8; - } - } - - void writeMetaData (const FlacNamespace::FLAC__StreamMetadata* metadata) - { - using namespace FlacNamespace; - const FLAC__StreamMetadata_StreamInfo& info = metadata->data.stream_info; - - unsigned char buffer [FLAC__STREAM_METADATA_STREAMINFO_LENGTH]; - const unsigned int channelsMinus1 = info.channels - 1; - const unsigned int bitsMinus1 = info.bits_per_sample - 1; - - packUint32 (info.min_blocksize, buffer, 2); - packUint32 (info.max_blocksize, buffer + 2, 2); - packUint32 (info.min_framesize, buffer + 4, 3); - packUint32 (info.max_framesize, buffer + 7, 3); - buffer[10] = (uint8) ((info.sample_rate >> 12) & 0xff); - buffer[11] = (uint8) ((info.sample_rate >> 4) & 0xff); - buffer[12] = (uint8) (((info.sample_rate & 0x0f) << 4) | (channelsMinus1 << 1) | (bitsMinus1 >> 4)); - buffer[13] = (FLAC__byte) (((bitsMinus1 & 0x0f) << 4) | (unsigned int) ((info.total_samples >> 32) & 0x0f)); - packUint32 ((FLAC__uint32) info.total_samples, buffer + 14, 4); - memcpy (buffer + 18, info.md5sum, 16); - - const bool seekOk = output->setPosition (4); - (void) seekOk; - - // if this fails, you've given it an output stream that can't seek! It needs - // to be able to seek back to write the header - jassert (seekOk); - - output->writeIntBigEndian (FLAC__STREAM_METADATA_STREAMINFO_LENGTH); - output->write (buffer, FLAC__STREAM_METADATA_STREAMINFO_LENGTH); - } - - //============================================================================== - static FlacNamespace::FLAC__StreamEncoderWriteStatus encodeWriteCallback (const FlacNamespace::FLAC__StreamEncoder*, - const FlacNamespace::FLAC__byte buffer[], - size_t bytes, - unsigned int /*samples*/, - unsigned int /*current_frame*/, - void* client_data) - { - using namespace FlacNamespace; - return static_cast (client_data)->writeData (buffer, (int) bytes) - ? FLAC__STREAM_ENCODER_WRITE_STATUS_OK - : FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR; - } - - static FlacNamespace::FLAC__StreamEncoderSeekStatus encodeSeekCallback (const FlacNamespace::FLAC__StreamEncoder*, FlacNamespace::FLAC__uint64, void*) - { - using namespace FlacNamespace; - return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED; - } - - static FlacNamespace::FLAC__StreamEncoderTellStatus encodeTellCallback (const FlacNamespace::FLAC__StreamEncoder*, FlacNamespace::FLAC__uint64* absolute_byte_offset, void* client_data) - { - using namespace FlacNamespace; - if (client_data == nullptr) - return FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED; - - *absolute_byte_offset = (FLAC__uint64) static_cast (client_data)->output->getPosition(); - return FLAC__STREAM_ENCODER_TELL_STATUS_OK; - } - - static void encodeMetadataCallback (const FlacNamespace::FLAC__StreamEncoder*, const FlacNamespace::FLAC__StreamMetadata* metadata, void* client_data) - { - static_cast (client_data)->writeMetaData (metadata); - } - - bool ok; - -private: - FlacNamespace::FLAC__StreamEncoder* encoder; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlacWriter) -}; - - -//============================================================================== -FlacAudioFormat::FlacAudioFormat() - : AudioFormat (flacFormatName, ".flac") -{ -} - -FlacAudioFormat::~FlacAudioFormat() -{ -} - -Array FlacAudioFormat::getPossibleSampleRates() -{ - const int rates[] = { 8000, 11025, 12000, 16000, 22050, 32000, 44100, 48000, - 88200, 96000, 176400, 192000, 352800, 384000 }; - - return Array (rates, numElementsInArray (rates)); -} - -Array FlacAudioFormat::getPossibleBitDepths() -{ - const int depths[] = { 16, 24 }; - - return Array (depths, numElementsInArray (depths)); -} - -bool FlacAudioFormat::canDoStereo() { return true; } -bool FlacAudioFormat::canDoMono() { return true; } -bool FlacAudioFormat::isCompressed() { return true; } - -AudioFormatReader* FlacAudioFormat::createReaderFor (InputStream* in, const bool deleteStreamIfOpeningFails) -{ - ScopedPointer r (new FlacReader (in)); - - if (r->sampleRate > 0) - return r.release(); - - if (! deleteStreamIfOpeningFails) - r->input = nullptr; - - return nullptr; -} - -AudioFormatWriter* FlacAudioFormat::createWriterFor (OutputStream* out, - double sampleRate, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& /*metadataValues*/, - int qualityOptionIndex) -{ - if (getPossibleBitDepths().contains (bitsPerSample)) - { - ScopedPointer w (new FlacWriter (out, sampleRate, numberOfChannels, - (uint32) bitsPerSample, qualityOptionIndex)); - if (w->ok) - return w.release(); - } - - return nullptr; -} - -StringArray FlacAudioFormat::getQualityOptions() -{ - static const char* options[] = { "0 (Fastest)", "1", "2", "3", "4", "5 (Default)","6", "7", "8 (Highest quality)", 0 }; - return StringArray (options); -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h deleted file mode 100755 index 20bf094..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_FlacAudioFormat.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_USE_FLAC || defined (DOXYGEN) - -//============================================================================== -/** - Reads and writes the lossless-compression FLAC audio format. - - To compile this, you'll need to set the JUCE_USE_FLAC flag. - - @see AudioFormat -*/ -class JUCE_API FlacAudioFormat : public AudioFormat -{ -public: - //============================================================================== - FlacAudioFormat(); - ~FlacAudioFormat(); - - //============================================================================== - Array getPossibleSampleRates() override; - Array getPossibleBitDepths() override; - bool canDoStereo() override; - bool canDoMono() override; - bool isCompressed() override; - StringArray getQualityOptions() override; - - //============================================================================== - AudioFormatReader* createReaderFor (InputStream* sourceStream, - bool deleteStreamIfOpeningFails) override; - - AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FlacAudioFormat) -}; - - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp deleted file mode 100755 index 8a5263c..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_USE_LAME_AUDIO_FORMAT - -class LAMEEncoderAudioFormat::Writer : public AudioFormatWriter -{ -public: - Writer (OutputStream* destStream, const String& formatName, - const File& appFile, int vbr, int cbr, - double sampleRate, unsigned int numberOfChannels, - unsigned int bitsPerSample, const StringPairArray& metadata) - : AudioFormatWriter (destStream, formatName, sampleRate, - numberOfChannels, bitsPerSample), - vbrLevel (vbr), cbrBitrate (cbr), - tempWav (".wav") - { - WavAudioFormat wavFormat; - - if (FileOutputStream* out = tempWav.getFile().createOutputStream()) - { - writer = wavFormat.createWriterFor (out, sampleRate, numChannels, - bitsPerSample, metadata, 0); - - args.add (appFile.getFullPathName()); - - args.add ("--quiet"); - - if (cbrBitrate == 0) - { - args.add ("--vbr-new"); - args.add ("-V"); - args.add (String (vbrLevel)); - } - else - { - args.add ("--cbr"); - args.add ("-b"); - args.add (String (cbrBitrate)); - } - - addMetadataArg (metadata, "id3title", "--tt"); - addMetadataArg (metadata, "id3artist", "--ta"); - addMetadataArg (metadata, "id3album", "--tl"); - addMetadataArg (metadata, "id3comment", "--tc"); - addMetadataArg (metadata, "id3date", "--ty"); - addMetadataArg (metadata, "id3genre", "--tg"); - addMetadataArg (metadata, "id3trackNumber", "--tn"); - } - } - - void addMetadataArg (const StringPairArray& metadata, const char* key, const char* lameFlag) - { - const String value (metadata.getValue (key, String())); - - if (value.isNotEmpty()) - { - args.add (lameFlag); - args.add (value); - } - } - - ~Writer() - { - if (writer != nullptr) - { - writer = nullptr; - - if (! convertToMP3()) - convertToMP3(); // try again - } - } - - bool write (const int** samplesToWrite, int numSamples) - { - return writer != nullptr && writer->write (samplesToWrite, numSamples); - } - -private: - int vbrLevel, cbrBitrate; - TemporaryFile tempWav; - ScopedPointer writer; - StringArray args; - - bool runLameChildProcess (const TemporaryFile& tempMP3, const StringArray& processArgs) const - { - ChildProcess cp; - - if (cp.start (processArgs)) - { - const String childOutput (cp.readAllProcessOutput()); - DBG (childOutput); (void) childOutput; - - cp.waitForProcessToFinish (10000); - return tempMP3.getFile().getSize() > 0; - } - - return false; - } - - bool convertToMP3() const - { - TemporaryFile tempMP3 (".mp3"); - - StringArray args2 (args); - args2.add (tempWav.getFile().getFullPathName()); - args2.add (tempMP3.getFile().getFullPathName()); - - DBG (args2.joinIntoString (" ")); - - if (runLameChildProcess (tempMP3, args2)) - { - FileInputStream fis (tempMP3.getFile()); - - if (fis.openedOk() && output->writeFromInputStream (fis, -1) > 0) - { - output->flush(); - return true; - } - } - - return false; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Writer) -}; - -//============================================================================== -LAMEEncoderAudioFormat::LAMEEncoderAudioFormat (const File& lameApplication) - : AudioFormat ("MP3 file", ".mp3"), - lameApp (lameApplication) -{ -} - -LAMEEncoderAudioFormat::~LAMEEncoderAudioFormat() -{ -} - -bool LAMEEncoderAudioFormat::canHandleFile (const File&) -{ - return false; -} - -Array LAMEEncoderAudioFormat::getPossibleSampleRates() -{ - const int rates[] = { 32000, 44100, 48000, 0 }; - return Array (rates); -} - -Array LAMEEncoderAudioFormat::getPossibleBitDepths() -{ - const int depths[] = { 16, 0 }; - return Array (depths); -} - -bool LAMEEncoderAudioFormat::canDoStereo() { return true; } -bool LAMEEncoderAudioFormat::canDoMono() { return true; } -bool LAMEEncoderAudioFormat::isCompressed() { return true; } - -StringArray LAMEEncoderAudioFormat::getQualityOptions() -{ - static const char* vbrOptions[] = { "VBR quality 0 (best)", "VBR quality 1", "VBR quality 2", "VBR quality 3", - "VBR quality 4 (normal)", "VBR quality 5", "VBR quality 6", "VBR quality 7", - "VBR quality 8", "VBR quality 9 (smallest)", nullptr }; - StringArray opts (vbrOptions); - - const int cbrRates[] = { 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 }; - - for (int i = 0; i < numElementsInArray (cbrRates); ++i) - opts.add (String (cbrRates[i]) + " Kb/s CBR"); - - return opts; -} - -AudioFormatReader* LAMEEncoderAudioFormat::createReaderFor (InputStream*, const bool) -{ - return nullptr; -} - -AudioFormatWriter* LAMEEncoderAudioFormat::createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) -{ - int vbr = 4; - int cbr = 0; - - const String qual (getQualityOptions() [qualityOptionIndex]); - - if (qual.contains ("VBR")) - vbr = qual.retainCharacters ("0123456789").getIntValue(); - else - cbr = qual.getIntValue(); - - return new Writer (streamToWriteTo, getFormatName(), lameApp, vbr, cbr, - sampleRateToUse, numberOfChannels, bitsPerSample, metadataValues); -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h deleted file mode 100755 index 92e581b..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.h +++ /dev/null @@ -1,71 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_USE_LAME_AUDIO_FORMAT || defined (DOXYGEN) - -//============================================================================== -/** - An AudioFormat class which can use an installed version of the LAME mp3 - encoder to encode a file. - - This format can't read MP3s, it just writes them. Internally, the - AudioFormatWriter object that is returned writes the incoming audio data - to a temporary WAV file, and then when the writer is deleted, it invokes - the LAME executable to convert the data to an MP3, whose data is then - piped into the original OutputStream that was used when first creating - the writer. - - @see AudioFormat -*/ -class JUCE_API LAMEEncoderAudioFormat : public AudioFormat -{ -public: - /** Creates a LAMEEncoderAudioFormat that expects to find a working LAME - executable at the location given. - */ - LAMEEncoderAudioFormat (const File& lameExecutableToUse); - ~LAMEEncoderAudioFormat(); - - bool canHandleFile (const File&); - Array getPossibleSampleRates(); - Array getPossibleBitDepths(); - bool canDoStereo(); - bool canDoMono(); - bool isCompressed(); - StringArray getQualityOptions(); - - AudioFormatReader* createReaderFor (InputStream*, bool deleteStreamIfOpeningFails); - - AudioFormatWriter* createWriterFor (OutputStream*, double sampleRateToUse, - unsigned int numberOfChannels, int bitsPerSample, - const StringPairArray& metadataValues, int qualityOptionIndex); - -private: - File lameApp; - class Writer; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LAMEEncoderAudioFormat) -}; - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp deleted file mode 100755 index 6551f1f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.cpp +++ /dev/null @@ -1,3162 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -/* - IMPORTANT DISCLAIMER: By choosing to enable the JUCE_USE_MP3AUDIOFORMAT flag and - to compile this MP3 code into your software, you do so AT YOUR OWN RISK! By doing so, - you are agreeing that Raw Material Software is in no way responsible for any patent, - copyright, or other legal issues that you may suffer as a result. - - The code in juce_MP3AudioFormat.cpp is NOT guaranteed to be free from infringements of 3rd-party - intellectual property. If you wish to use it, please seek your own independent advice about the - legality of doing so. If you are not willing to accept full responsibility for the consequences - of using this code, then do not enable the JUCE_USE_MP3AUDIOFORMAT setting. -*/ -#if JUCE_USE_MP3AUDIOFORMAT - -namespace MP3Decoder -{ - -struct AllocationTable { int16 bits, d; }; - -const struct AllocationTable allocTable0[] = -{ - {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, - {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, - {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767} -}; - -const struct AllocationTable allocTable1[] = -{ - {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, - {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, - {4, 0}, {5, 3}, {3, -3}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, {3, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {16, -32767}, - {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, - {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767}, {2, 0}, {5, 3}, {7, 5}, {16, -32767} -}; - -const struct AllocationTable allocTable2[] = -{ - {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, - {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63} -}; - -const struct AllocationTable allocTable3[] = -{ - {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, - {4, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, {15, -16383}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63} -}; - -const struct AllocationTable allocTable4[] = -{ - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, - {4, 0}, {5, 3}, {7, 5}, {3, -3}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {8, -127}, {9, -255}, {10, -511}, {11, -1023}, {12, -2047}, {13, -4095}, {14, -8191}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, - {3, 0}, {5, 3}, {7, 5}, {10, 9}, {4, -7}, {5, -15}, {6, -31}, {7, -63}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, - {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, - {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, - {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, - {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, {2, 0}, {5, 3}, {7, 5}, {10, 9}, - {2, 0}, {5, 3}, {7, 5}, {10, 9} -}; - -struct BandInfoStruct -{ - int16 longIndex[23]; - int16 longDiff[22]; - int16 shortIndex[14]; - int16 shortDiff[13]; -}; - -const BandInfoStruct bandInfo[9] = -{ - { {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 52, 62, 74, 90, 110, 134, 162, 196, 238, 288, 342, 418, 576}, - {4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10, 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158}, - {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 40 * 3, 52 * 3, 66 * 3, 84 * 3, 106 * 3, 136 * 3, 192 * 3}, - {4, 4, 4, 4, 6, 8, 10, 12, 14, 18, 22, 30, 56} }, - - { {0, 4, 8, 12, 16, 20, 24, 30, 36, 42, 50, 60, 72, 88, 106, 128, 156, 190, 230, 276, 330, 384, 576}, - {4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10, 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192}, - {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 28 * 3, 38 * 3, 50 * 3, 64 * 3, 80 * 3, 100 * 3, 126 * 3, 192 * 3}, - {4, 4, 4, 4, 6, 6, 10, 12, 14, 16, 20, 26, 66} }, - - { {0, 4, 8, 12, 16, 20, 24, 30, 36, 44, 54, 66, 82, 102, 126, 156, 194, 240, 296, 364, 448, 550, 576}, - {4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12, 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26}, - {0, 4 * 3, 8 * 3, 12 * 3, 16 * 3, 22 * 3, 30 * 3, 42 * 3, 58 * 3, 78 * 3, 104 * 3, 138 * 3, 180 * 3, 192 * 3}, - {4, 4, 4, 4, 6, 8, 12, 16, 20, 26, 34, 42, 12} }, - - { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, - {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 }, - {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 24 * 3, 32 * 3, 42 * 3, 56 * 3, 74 * 3, 100 * 3, 132 * 3, 174 * 3, 192 * 3}, - {4, 4, 4, 6, 6, 8, 10, 14, 18, 26, 32, 42, 18 } }, - - { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 114, 136, 162, 194, 232, 278, 332, 394, 464, 540, 576}, - {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36 }, - {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3, 80 * 3, 104 * 3, 136 * 3, 180 * 3, 192 * 3}, - {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 32, 44, 12 } }, - - { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, - {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54 }, - {0, 4 * 3, 8 * 3, 12 * 3, 18 * 3, 26 * 3, 36 * 3, 48 * 3, 62 * 3, 80 * 3, 104 * 3, 134 * 3, 174 * 3, 192 * 3}, - {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18 } }, - - { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, - {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54}, - {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576}, - {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18} }, - - { {0, 6, 12, 18, 24, 30, 36, 44, 54, 66, 80, 96, 116, 140, 168, 200, 238, 284, 336, 396, 464, 522, 576}, - {6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16, 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54}, - {0, 12, 24, 36, 54, 78, 108, 144, 186, 240, 312, 402, 522, 576}, - {4, 4, 4, 6, 8, 10, 12, 14, 18, 24, 30, 40, 18} }, - - { {0, 12, 24, 36, 48, 60, 72, 88, 108, 132, 160, 192, 232, 280, 336, 400, 476, 566, 568, 570, 572, 574, 576}, - {12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32, 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2}, - {0, 24, 48, 72, 108, 156, 216, 288, 372, 480, 486, 492, 498, 576}, - {8, 8, 8, 12, 16, 20, 24, 28, 36, 2, 2, 2, 26} } -}; - -const double decodeWindow[] = -{ - 0.000000000, -0.000015259, -0.000015259, -0.000015259, -0.000015259, -0.000015259, -0.000015259, -0.000030518, - -0.000030518, -0.000030518, -0.000030518, -0.000045776, -0.000045776, -0.000061035, -0.000061035, -0.000076294, - -0.000076294, -0.000091553, -0.000106812, -0.000106812, -0.000122070, -0.000137329, -0.000152588, -0.000167847, - -0.000198364, -0.000213623, -0.000244141, -0.000259399, -0.000289917, -0.000320435, -0.000366211, -0.000396729, - -0.000442505, -0.000473022, -0.000534058, -0.000579834, -0.000625610, -0.000686646, -0.000747681, -0.000808716, - -0.000885010, -0.000961304, -0.001037598, -0.001113892, -0.001205444, -0.001296997, -0.001388550, -0.001480103, - -0.001586914, -0.001693726, -0.001785278, -0.001907349, -0.002014160, -0.002120972, -0.002243042, -0.002349854, - -0.002456665, -0.002578735, -0.002685547, -0.002792358, -0.002899170, -0.002990723, -0.003082275, -0.003173828, - -0.003250122, -0.003326416, -0.003387451, -0.003433228, -0.003463745, -0.003479004, -0.003479004, -0.003463745, - -0.003417969, -0.003372192, -0.003280640, -0.003173828, -0.003051758, -0.002883911, -0.002700806, -0.002487183, - -0.002227783, -0.001937866, -0.001617432, -0.001266479, -0.000869751, -0.000442505, 0.000030518, 0.000549316, - 0.001098633, 0.001693726, 0.002334595, 0.003005981, 0.003723145, 0.004486084, 0.005294800, 0.006118774, - 0.007003784, 0.007919312, 0.008865356, 0.009841919, 0.010848999, 0.011886597, 0.012939453, 0.014022827, - 0.015121460, 0.016235352, 0.017349243, 0.018463135, 0.019577026, 0.020690918, 0.021789551, 0.022857666, - 0.023910522, 0.024932861, 0.025909424, 0.026840210, 0.027725220, 0.028533936, 0.029281616, 0.029937744, - 0.030532837, 0.031005859, 0.031387329, 0.031661987, 0.031814575, 0.031845093, 0.031738281, 0.031478882, - 0.031082153, 0.030517578, 0.029785156, 0.028884888, 0.027801514, 0.026535034, 0.025085449, 0.023422241, - 0.021575928, 0.019531250, 0.017257690, 0.014801025, 0.012115479, 0.009231567, 0.006134033, 0.002822876, - -0.000686646, -0.004394531, -0.008316040, -0.012420654, -0.016708374, -0.021179199, -0.025817871, -0.030609131, - -0.035552979, -0.040634155, -0.045837402, -0.051132202, -0.056533813, -0.061996460, -0.067520142, -0.073059082, - -0.078628540, -0.084182739, -0.089706421, -0.095169067, -0.100540161, -0.105819702, -0.110946655, -0.115921021, - -0.120697021, -0.125259399, -0.129562378, -0.133590698, -0.137298584, -0.140670776, -0.143676758, -0.146255493, - -0.148422241, -0.150115967, -0.151306152, -0.151962280, -0.152069092, -0.151596069, -0.150497437, -0.148773193, - -0.146362305, -0.143264771, -0.139450073, -0.134887695, -0.129577637, -0.123474121, -0.116577148, -0.108856201, - -0.100311279, -0.090927124, -0.080688477, -0.069595337, -0.057617187, -0.044784546, -0.031082153, -0.016510010, - -0.001068115, 0.015228271, 0.032379150, 0.050354004, 0.069168091, 0.088775635, 0.109161377, 0.130310059, - 0.152206421, 0.174789429, 0.198059082, 0.221984863, 0.246505737, 0.271591187, 0.297210693, 0.323318481, - 0.349868774, 0.376800537, 0.404083252, 0.431655884, 0.459472656, 0.487472534, 0.515609741, 0.543823242, - 0.572036743, 0.600219727, 0.628295898, 0.656219482, 0.683914185, 0.711318970, 0.738372803, 0.765029907, - 0.791213989, 0.816864014, 0.841949463, 0.866363525, 0.890090942, 0.913055420, 0.935195923, 0.956481934, - 0.976852417, 0.996246338, 1.014617920, 1.031936646, 1.048156738, 1.063217163, 1.077117920, 1.089782715, - 1.101211548, 1.111373901, 1.120223999, 1.127746582, 1.133926392, 1.138763428, 1.142211914, 1.144287109, - 1.144989014 -}; - -const int16 huffmanTab0[] = { 0 }; -const int16 huffmanTab1[] = { -5,-3,-1,17,1,16,0 }; -const int16 huffmanTab2[] = { -15,-11,-9,-5,-3,-1,34,2,18,-1,33,32,17,-1,1,16,0 }; -const int16 huffmanTab3[] = { -13,-11,-9,-5,-3,-1,34,2,18,-1,33,32,16,17,-1,1,0 }; -const int16 huffmanTab5[] = { -29,-25,-23,-15,-7,-5,-3,-1,51,35,50,49,-3,-1,19,3,-1,48,34,-3,-1,18,33,-1,2,32,17,-1,1,16,0 }; -const int16 huffmanTab6[] = { -25,-19,-13,-9,-5,-3,-1,51,3,35,-1,50,48,-1,19,49,-3,-1,34,2,18,-3,-1,33,32,1,-1,17,-1,16,0 }; - -const int16 huffmanTab7[] = -{ - -69,-65,-57,-39,-29,-17,-11,-7,-3,-1,85,69,-1,84,83,-1,53,68,-3,-1,37,82,21,-5,-1,81,-1,5,52,-1,80,-1,67,51, - -5,-3,-1,36,66,20,-1,65,64,-11,-7,-3,-1,4,35,-1,50,3,-1,19,49,-3,-1,48,34,18,-5,-1,33,-1,2,32,17,-1,1,16,0 -}; - -const int16 huffmanTab8[] = -{ - -65,-63,-59,-45,-31,-19,-13,-7,-5,-3,-1,85,84,69,83,-3,-1,53,68,37,-3,-1,82,5,21,-5,-1,81,-1,52,67,-3,-1,80, - 51,36,-5,-3,-1,66,20,65,-3,-1,4,64,-1,35,50,-9,-7,-3,-1,19,49,-1,3,48,34,-1,2,32,-1,18,33,17,-3,-1,1,16,0 -}; - -const int16 huffmanTab9[] = -{ - -63,-53,-41,-29,-19,-11,-5,-3,-1,85,69,53,-1,83,-1,84,5,-3,-1,68,37,-1,82,21,-3,-1,81,52,-1,67,-1,80,4,-7,-3, - -1,36,66,-1,51,64,-1,20,65,-5,-3,-1,35,50,19,-1,49,-1,3,48,-5,-3,-1,34,2,18,-1,33,32,-3,-1,17,1,-1,16,0 -}; - -const int16 huffmanTab10[] = -{ - -125,-121,-111,-83,-55,-35,-21,-13,-7,-3,-1,119,103,-1,118,87,-3,-1,117,102,71,-3,-1,116,86,-1,101,55,-9,-3, - -1,115,70,-3,-1,85,84,99,-1,39,114,-11,-5,-3,-1,100,7,112,-1,98,-1,69,53,-5,-1,6,-1,83,68,23,-17,-5,-1,113, - -1,54,38,-5,-3,-1,37,82,21,-1,81,-1,52,67,-3,-1,22,97,-1,96,-1,5,80,-19,-11,-7,-3,-1,36,66,-1,51,4,-1,20, - 65,-3,-1,64,35,-1,50,3,-3,-1,19,49,-1,48,34,-7,-3,-1,18,33,-1,2,32,17,-1,1,16,0 -}; - -const int16 huffmanTab11[] = -{ - -121,-113,-89,-59,-43,-27,-17,-7,-3,-1,119,103,-1,118,117,-3,-1,102,71,-1,116,-1,87,85,-5,-3,-1,86,101,55, - -1,115,70,-9,-7,-3,-1,69,84,-1,53,83,39,-1,114,-1,100,7,-5,-1,113,-1,23,112,-3,-1,54,99,-1,96,-1,68,37,-13, - -7,-5,-3,-1,82,5,21,98,-3,-1,38,6,22,-5,-1,97,-1,81,52,-5,-1,80,-1,67,51,-1,36,66,-15,-11,-7,-3,-1,20,65, - -1,4,64,-1,35,50,-1,19,49,-5,-3,-1,3,48,34,33,-5,-1,18,-1,2,32,17,-3,-1,1,16,0 -}; - -const int16 huffmanTab12[] = -{ - -115,-99,-73,-45,-27,-17,-9,-5,-3,-1,119,103,118,-1,87,117,-3,-1,102,71,-1,116,101,-3,-1,86,55,-3,-1,115, - 85,39,-7,-3,-1,114,70,-1,100,23,-5,-1,113,-1,7,112,-1,54,99,-13,-9,-3,-1,69,84,-1,68,-1,6,5,-1,38,98,-5, - -1,97,-1,22,96,-3,-1,53,83,-1,37,82,-17,-7,-3,-1,21,81,-1,52,67,-5,-3,-1,80,4,36,-1,66,20,-3,-1,51,65,-1, - 35,50,-11,-7,-5,-3,-1,64,3,48,19,-1,49,34,-1,18,33,-7,-5,-3,-1,2,32,0,17,-1,1,16 -}; - -const int16 huffmanTab13[] = -{ - -509,-503,-475,-405,-333,-265,-205,-153,-115,-83,-53,-35,-21,-13,-9,-7,-5,-3,-1,254,252,253,237,255,-1,239,223, - -3,-1,238,207,-1,222,191,-9,-3,-1,251,206,-1,220,-1,175,233,-1,236,221,-9,-5,-3,-1,250,205,190,-1,235,159,-3, - -1,249,234,-1,189,219,-17,-9,-3,-1,143,248,-1,204,-1,174,158,-5,-1,142,-1,127,126,247,-5,-1,218,-1,173,188,-3, - -1,203,246,111,-15,-7,-3,-1,232,95,-1,157,217,-3,-1,245,231,-1,172,187,-9,-3,-1,79,244,-3,-1,202,230,243,-1, - 63,-1,141,216,-21,-9,-3,-1,47,242,-3,-1,110,156,15,-5,-3,-1,201,94,171,-3,-1,125,215,78,-11,-5,-3,-1,200,214, - 62,-1,185,-1,155,170,-1,31,241,-23,-13,-5,-1,240,-1,186,229,-3,-1,228,140,-1,109,227,-5,-1,226,-1,46,14,-1,30, - 225,-15,-7,-3,-1,224,93,-1,213,124,-3,-1,199,77,-1,139,184,-7,-3,-1,212,154,-1,169,108,-1,198,61,-37,-21,-9,-5, - -3,-1,211,123,45,-1,210,29,-5,-1,183,-1,92,197,-3,-1,153,122,195,-7,-5,-3,-1,167,151,75,209,-3,-1,13,208,-1, - 138,168,-11,-7,-3,-1,76,196,-1,107,182,-1,60,44,-3,-1,194,91,-3,-1,181,137,28,-43,-23,-11,-5,-1,193,-1,152,12, - -1,192,-1,180,106,-5,-3,-1,166,121,59,-1,179,-1,136,90,-11,-5,-1,43,-1,165,105,-1,164,-1,120,135,-5,-1,148,-1, - 119,118,178,-11,-3,-1,27,177,-3,-1,11,176,-1,150,74,-7,-3,-1,58,163,-1,89,149,-1,42,162,-47,-23,-9,-3,-1,26, - 161,-3,-1,10,104,160,-5,-3,-1,134,73,147,-3,-1,57,88,-1,133,103,-9,-3,-1,41,146,-3,-1,87,117,56,-5,-1,131,-1, - 102,71,-3,-1,116,86,-1,101,115,-11,-3,-1,25,145,-3,-1,9,144,-1,72,132,-7,-5,-1,114,-1,70,100,40,-1,130,24,-41, - -27,-11,-5,-3,-1,55,39,23,-1,113,-1,85,7,-7,-3,-1,112,54,-1,99,69,-3,-1,84,38,-1,98,53,-5,-1,129,-1,8,128,-3, - -1,22,97,-1,6,96,-13,-9,-5,-3,-1,83,68,37,-1,82,5,-1,21,81,-7,-3,-1,52,67,-1,80,36,-3,-1,66,51,20,-19,-11, - -5,-1,65,-1,4,64,-3,-1,35,50,19,-3,-1,49,3,-1,48,34,-3,-1,18,33,-1,2,32,-3,-1,17,1,16,0 -}; - -const int16 huffmanTab15[] = -{ - -495,-445,-355,-263,-183,-115,-77,-43,-27,-13,-7,-3,-1,255,239,-1,254,223,-1,238,-1,253,207,-7,-3,-1,252,222,-1, - 237,191,-1,251,-1,206,236,-7,-3,-1,221,175,-1,250,190,-3,-1,235,205,-1,220,159,-15,-7,-3,-1,249,234,-1,189,219, - -3,-1,143,248,-1,204,158,-7,-3,-1,233,127,-1,247,173,-3,-1,218,188,-1,111,-1,174,15,-19,-11,-3,-1,203,246, - -3,-1,142,232,-1,95,157,-3,-1,245,126,-1,231,172,-9,-3,-1,202,187,-3,-1,217,141,79,-3,-1,244,63,-1,243,216, - -33,-17,-9,-3,-1,230,47,-1,242,-1,110,240,-3,-1,31,241,-1,156,201,-7,-3,-1,94,171,-1,186,229,-3,-1,125,215, - -1,78,228,-15,-7,-3,-1,140,200,-1,62,109,-3,-1,214,227,-1,155,185,-7,-3,-1,46,170,-1,226,30,-5,-1,225,-1,14, - 224,-1,93,213,-45,-25,-13,-7,-3,-1,124,199,-1,77,139,-1,212,-1,184,154,-7,-3,-1,169,108,-1,198,61,-1,211,210, - -9,-5,-3,-1,45,13,29,-1,123,183,-5,-1,209,-1,92,208,-1,197,138,-17,-7,-3,-1,168,76,-1,196,107,-5,-1,182,-1, - 153,12,-1,60,195,-9,-3,-1,122,167,-1,166,-1,192,11,-1,194,-1,44,91,-55,-29,-15,-7,-3,-1,181,28,-1,137,152,-3, - -1,193,75,-1,180,106,-5,-3,-1,59,121,179,-3,-1,151,136,-1,43,90,-11,-5,-1,178,-1,165,27,-1,177,-1,176,105,-7, - -3,-1,150,74,-1,164,120,-3,-1,135,58,163,-17,-7,-3,-1,89,149,-1,42,162,-3,-1,26,161,-3,-1,10,160,104,-7,-3, - -1,134,73,-1,148,57,-5,-1,147,-1,119,9,-1,88,133,-53,-29,-13,-7,-3,-1,41,103,-1,118,146,-1,145,-1,25,144,-7, - -3,-1,72,132,-1,87,117,-3,-1,56,131,-1,102,71,-7,-3,-1,40,130,-1,24,129,-7,-3,-1,116,8,-1,128,86,-3,-1,101, - 55,-1,115,70,-17,-7,-3,-1,39,114,-1,100,23,-3,-1,85,113,-3,-1,7,112,54,-7,-3,-1,99,69,-1,84,38,-3,-1,98,22, - -3,-1,6,96,53,-33,-19,-9,-5,-1,97,-1,83,68,-1,37,82,-3,-1,21,81,-3,-1,5,80,52,-7,-3,-1,67,36,-1,66,51,-1, - 65,-1,20,4,-9,-3,-1,35,50,-3,-1,64,3,19,-3,-1,49,48,34,-9,-7,-3,-1,18,33,-1,2,32,17,-3,-1,1,16,0 -}; - -const int16 huffmanTab16[] = -{ - -509,-503,-461,-323,-103,-37,-27,-15,-7,-3,-1,239,254,-1,223,253,-3,-1,207,252,-1,191,251,-5,-1,175,-1,250,159, - -3,-1,249,248,143,-7,-3,-1,127,247,-1,111,246,255,-9,-5,-3,-1,95,245,79,-1,244,243,-53,-1,240,-1,63,-29,-19, - -13,-7,-5,-1,206,-1,236,221,222,-1,233,-1,234,217,-1,238,-1,237,235,-3,-1,190,205,-3,-1,220,219,174,-11,-5, - -1,204,-1,173,218,-3,-1,126,172,202,-5,-3,-1,201,125,94,189,242,-93,-5,-3,-1,47,15,31,-1,241,-49,-25,-13, - -5,-1,158,-1,188,203,-3,-1,142,232,-1,157,231,-7,-3,-1,187,141,-1,216,110,-1,230,156,-13,-7,-3,-1,171,186, - -1,229,215,-1,78,-1,228,140,-3,-1,200,62,-1,109,-1,214,155,-19,-11,-5,-3,-1,185,170,225,-1,212,-1,184,169, - -5,-1,123,-1,183,208,227,-7,-3,-1,14,224,-1,93,213,-3,-1,124,199,-1,77,139,-75,-45,-27,-13,-7,-3,-1,154, - 108,-1,198,61,-3,-1,92,197,13,-7,-3,-1,138,168,-1,153,76,-3,-1,182,122,60,-11,-5,-3,-1,91,137,28,-1,192,-1, - 152,121,-1,226,-1,46,30,-15,-7,-3,-1,211,45,-1,210,209,-5,-1,59,-1,151,136,29,-7,-3,-1,196,107,-1,195,167,-1, - 44,-1,194,181,-23,-13,-7,-3,-1,193,12,-1,75,180,-3,-1,106,166,179,-5,-3,-1,90,165,43,-1,178,27,-13,-5,-1,177, - -1,11,176,-3,-1,105,150,-1,74,164,-5,-3,-1,120,135,163,-3,-1,58,89,42,-97,-57,-33,-19,-11,-5,-3,-1,149,104,161, - -3,-1,134,119,148,-5,-3,-1,73,87,103,162,-5,-1,26,-1,10,160,-3,-1,57,147,-1,88,133,-9,-3,-1,41,146,-3,-1,118, - 9,25,-5,-1,145,-1,144,72,-3,-1,132,117,-1,56,131,-21,-11,-5,-3,-1,102,40,130,-3,-1,71,116,24,-3,-1,129,128,-3, - -1,8,86,55,-9,-5,-1,115,-1,101,70,-1,39,114,-5,-3,-1,100,85,7,23,-23,-13,-5,-1,113,-1,112,54,-3,-1,99,69,-1, - 84,38,-3,-1,98,22,-1,97,-1,6,96,-9,-5,-1,83,-1,53,68,-1,37,82,-1,81,-1,21,5,-33,-23,-13,-7,-3,-1,52,67,-1,80, - 36,-3,-1,66,51,20,-5,-1,65,-1,4,64,-1,35,50,-3,-1,19,49,-3,-1,3,48,34,-3,-1,18,33,-1,2,32,-3,-1,17,1,16,0 -}; - -const int16 huffmanTab24[] = -{ - -451,-117,-43,-25,-15,-7,-3,-1,239,254,-1,223,253,-3,-1,207,252,-1,191,251,-5,-1,250,-1,175,159,-1,249,248,-9, - -5,-3,-1,143,127,247,-1,111,246,-3,-1,95,245,-1,79,244,-71,-7,-3,-1,63,243,-1,47,242,-5,-1,241,-1,31,240,-25,-9, - -1,15,-3,-1,238,222,-1,237,206,-7,-3,-1,236,221,-1,190,235,-3,-1,205,220,-1,174,234,-15,-7,-3,-1,189,219,-1,204, - 158,-3,-1,233,173,-1,218,188,-7,-3,-1,203,142,-1,232,157,-3,-1,217,126,-1,231,172,255,-235,-143,-77,-45,-25,-15, - -7,-3,-1,202,187,-1,141,216,-5,-3,-1,14,224,13,230,-5,-3,-1,110,156,201,-1,94,186,-9,-5,-1,229,-1,171,125,-1,215, - 228,-3,-1,140,200,-3,-1,78,46,62,-15,-7,-3,-1,109,214,-1,227,155,-3,-1,185,170,-1,226,30,-7,-3,-1,225,93,-1,213,124, - -3,-1,199,77,-1,139,184,-31,-15,-7,-3,-1,212,154,-1,169,108,-3,-1,198,61,-1,211,45,-7,-3,-1,210,29,-1,123,183,-3,-1, - 209,92,-1,197,138,-17,-7,-3,-1,168,153,-1,76,196,-3,-1,107,182,-3,-1,208,12,60,-7,-3,-1,195,122,-1,167,44,-3,-1,194, - 91,-1,181,28,-57,-35,-19,-7,-3,-1,137,152,-1,193,75,-5,-3,-1,192,11,59,-3,-1,176,10,26,-5,-1,180,-1,106,166,-3,-1,121, - 151,-3,-1,160,9,144,-9,-3,-1,179,136,-3,-1,43,90,178,-7,-3,-1,165,27,-1,177,105,-1,150,164,-17,-9,-5,-3,-1,74,120,135, - -1,58,163,-3,-1,89,149,-1,42,162,-7,-3,-1,161,104,-1,134,119,-3,-1,73,148,-1,57,147,-63,-31,-15,-7,-3,-1,88,133,-1,41, - 103,-3,-1,118,146,-1,25,145,-7,-3,-1,72,132,-1,87,117,-3,-1,56,131,-1,102,40,-17,-7,-3,-1,130,24,-1,71,116,-5,-1,129, - -1,8,128,-1,86,101,-7,-5,-1,23,-1,7,112,115,-3,-1,55,39,114,-15,-7,-3,-1,70,100,-1,85,113,-3,-1,54,99,-1,69,84,-7,-3, - -1,38,98,-1,22,97,-5,-3,-1,6,96,53,-1,83,68,-51,-37,-23,-15,-9,-3,-1,37,82,-1,21,-1,5,80,-1,81,-1,52,67,-3,-1,36,66, - -1,51,20,-9,-5,-1,65,-1,4,64,-1,35,50,-1,19,49,-7,-5,-3,-1,3,48,34,18,-1,33,-1,2,32,-3,-1,17,1,-1,16,0 -}; - -struct BitsToTableMap -{ - uint32 bits; - const int16* table; -}; - -const BitsToTableMap huffmanTables1[] = -{ - { 0, huffmanTab0 }, { 0, huffmanTab1 }, { 0, huffmanTab2 }, { 0, huffmanTab3 }, - { 0, huffmanTab0 }, { 0, huffmanTab5 }, { 0, huffmanTab6 }, { 0, huffmanTab7 }, - { 0, huffmanTab8 }, { 0, huffmanTab9 }, { 0, huffmanTab10 }, { 0, huffmanTab11 }, - { 0, huffmanTab12 }, { 0, huffmanTab13 }, { 0, huffmanTab0 }, { 0, huffmanTab15 }, - { 1, huffmanTab16 }, { 2, huffmanTab16 }, { 3, huffmanTab16 }, { 4, huffmanTab16 }, - { 6, huffmanTab16 }, { 8, huffmanTab16 }, { 10, huffmanTab16 }, { 13, huffmanTab16 }, - { 4, huffmanTab24 }, { 5, huffmanTab24 }, { 6, huffmanTab24 }, { 7, huffmanTab24 }, - { 8, huffmanTab24 }, { 9, huffmanTab24 }, { 11, huffmanTab24 }, { 13, huffmanTab24 } -}; - -const int16 huffmanTabC0[] = { -29,-21,-13,-7,-3,-1,11,15,-1,13,14,-3,-1,7,5,9,-3,-1,6,3,-1,10,12,-3,-1,2,1,-1,4,8,0 }; -const int16 huffmanTabC1[] = { -15,-7,-3,-1,15,14,-1,13,12,-3,-1,11,10,-1,9,8,-7,-3,-1,7,6,-1,5,4,-3,-1,3,2,-1,1,0 }; - -const BitsToTableMap huffmanTables2[] = { { 0, huffmanTabC0 }, { 0, huffmanTabC1 } }; - -//============================================================================== -struct VBRTagData -{ - bool read (const uint8* data) noexcept - { - flags = 0; - - const int layer = (data[1] >> 1) & 3; - if (layer != 1) - return false; - - const int type = (data[1] >> 3) & 1; - const int sampleRateIndex = (data[2] >> 2) & 3; - const int mode = (data[3] >> 6) & 3; - - static const int bitRates[3][16] = - { - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1 }, // MPEG2 - { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1 }, // MPEG1 - { 0, 8, 16, 24, 32, 40, 48, 56, 64, -1, -1, -1, -1, -1, -1, -1 }, // MPEG 2.5 - }; - - const int bitrate = bitRates[type][((data[2] >> 4) & 15)]; - - const int sampleRates[3][4] = - { - { 22050, 24000, 16000, -1 }, // MPEG2 - { 44100, 48000, 32000, -1 }, // MPEG1 - { 11025, 12000, 8000, -1 }, // MPEG2.5 - }; - - if ((data[1] >> 4) == 0xe) - sampleRate = sampleRates[2][sampleRateIndex]; - else - sampleRate = sampleRates[type][sampleRateIndex]; - - data += type != 0 ? (mode != 3 ? (32 + 4) : (17 + 4)) - : (mode != 3 ? (17 + 4) : (9 + 4)); - - if (! isVbrTag (data)) - return false; - - data += 4; - flags = ByteOrder::bigEndianInt (data); - data += 4; - - if (flags & 1) - { - frames = ByteOrder::bigEndianInt (data); - data += 4; - } - - if (flags & 2) - { - bytes = ByteOrder::bigEndianInt (data); - data += 4; - } - - if (flags & 4) - { - if (toc != nullptr) - for (int i = 0; i < 100; ++i) - toc[i] = data[i]; - - data += 100; - } - - vbrScale = -1; - - if (flags & 8) - vbrScale = (int) ByteOrder::bigEndianInt (data); - - headersize = ((type + 1) * 72000 * bitrate) / sampleRate; - return true; - } - - uint8 toc[100]; - int sampleRate, vbrScale, headersize; - unsigned int flags, frames, bytes; - -private: - static bool isVbrTag (const uint8* const d) noexcept - { - return (d[0] == 'X' && d[1] == 'i' && d[2] == 'n' && d[3] == 'g') - || (d[0] == 'I' && d[1] == 'n' && d[2] == 'f' && d[3] == 'o'); - } -}; - -//============================================================================== -struct MP3Frame -{ - MP3Frame() - { - zeromem (this, sizeof (MP3Frame)); - single = -1; - } - - void selectLayer2Table() - { - static const int translate[3][2][16] = - { - { { 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 0 }, { 0, 2, 2, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } }, - { { 0, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }, - { { 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, 0 }, { 0, 3, 3, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } } - }; - - static const AllocationTable* const tables[] = { allocTable0, allocTable1, allocTable2, allocTable3, allocTable4 }; - static const int limits[] = { 27, 30, 8, 12, 30 }; - - const int index = lsf ? 4 : translate[sampleRateIndex][2 - numChannels][bitrateIndex]; - layer2SubBandLimit = limits [index]; - allocationTable = tables [index]; - } - - int getFrequency() const noexcept - { - const int frequencies[] = { 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000 }; - return frequencies [sampleRateIndex]; - } - - void decodeHeader (const uint32 header) - { - jassert (((header >> 10) & 3) != 3); - - mpeg25 = (header & (1 << 20)) == 0; - lsf = mpeg25 ? 1 : ((header & (1 << 19)) ? 0 : 1); - layer = 4 - ((header >> 17) & 3); - sampleRateIndex = mpeg25 ? (6 + ((header >> 10) & 3)) : ((int) ((header >> 10) & 3) + (lsf * 3)); - crc16FollowsHeader = ((header >> 16) & 1) == 0; - bitrateIndex = (header >> 12) & 15; - padding = (header >> 9) & 1; - mode = (header >> 6) & 3; - modeExt = (header >> 4) & 3; - //extension = (header >> 8) & 1; - //copyright = (header >> 3) & 1; - //original = (header >> 2) & 1; - //emphasis = header & 3; - numChannels = (mode == 3) ? 1 : 2; - - static const int frameSizes [2][3][16] = - { - { { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448 }, - { 0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384 }, - { 0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320 } }, - - { { 0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256 }, - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 }, - { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160 } } - }; - - if (bitrateIndex == 0) - { - jassertfalse; // This means the file is using "free format". Apparently very few decoders - // support this mode, and this one certainly doesn't handle it correctly! - frameSize = 0; - } - else - { - switch (layer) - { - case 1: frameSize = (((frameSizes[lsf][0][bitrateIndex] * 12000) / getFrequency() + padding) * 4) - 4; break; - case 2: frameSize = (frameSizes[lsf][1][bitrateIndex] * 144000) / getFrequency() + (padding - 4); break; - case 3: frameSize = (bitrateIndex == 0) ? 0 : ((frameSizes[lsf][2][bitrateIndex] * 144000) / (getFrequency() << lsf) + (padding - 4)); break; - default: break; - } - } - } - - int layer, frameSize, numChannels, single; - int lsf; // 0 = mpeg-1, 1 = mpeg-2/LSF - bool mpeg25; // true = mpeg-2.5, false = mpeg-1/2 - bool crc16FollowsHeader; - int bitrateIndex, sampleRateIndex, padding; - int mode, modeExt, layer2SubBandLimit; - enum { downSampleLimit = 32 }; - const AllocationTable* allocationTable; -}; - -//============================================================================== -struct Constants -{ - Constants() - { - cosTables[0] = cos64; cosTables[1] = cos32; cosTables[2] = cos16; cosTables[3] = cos8; cosTables[4] = cos4; - initDecodeTables(); - initLayer2Tables(); - initLayer3Tables(); - } - - const uint8* getGroupTable (const int16 d1, const uint32 index) const noexcept - { - switch (d1) - { - case 3: return &group3tab [3 * jmin (index, 3u * 3u * 3u)]; - case 5: return &group5tab [3 * jmin (index, 5u * 5u * 5u)]; - case 9: return &group9tab [3 * jmin (index, 9u * 9u * 9u)]; - default: break; - } - - static const uint8 dummy[] = { 0, 0, 0 }; - return dummy; - } - - float muls[27][64]; - float nToThe4Over3[8207]; - float antiAliasingCa[8], antiAliasingCs[8]; - float win[4][36]; - float win1[4][36]; - float powToGains[256 + 118 + 4]; - int longLimit[9][23]; - int shortLimit[9][14]; - float tan1_1[16], tan2_1[16], tan1_2[16], tan2_2[16]; - float pow1_1[2][16], pow2_1[2][16], pow1_2[2][16], pow2_2[2][16]; - int* map[9][3]; - int* mapEnd[9][3]; - uint32 nLength2[512]; - uint32 iLength2[256]; - float decodeWin[512 + 32]; - float* cosTables[5]; - -private: - int mapbuf0[9][152]; - int mapbuf1[9][156]; - int mapbuf2[9][44]; - float cos64[16], cos32[8], cos16[4], cos8[2], cos4[1]; - uint8 group3tab [32 * 3]; - uint8 group5tab [128 * 3]; - uint8 group9tab [1024 * 3]; - - void initDecodeTables() - { - int i, j, scaleval = -1; - float* table = decodeWin; - - for (i = 0; i < 5; ++i) - { - int kr = 0x10 >> i; - int divv = 0x40 >> i; - float* costab = cosTables[i]; - - for (int k = 0; k < kr; ++k) - costab[k] = (float) (1.0 / (2.0 * std::cos (double_Pi * (k * 2 + 1) / divv))); - } - - for (i = 0, j = 0; i < 256; ++i, ++j, table += 32) - { - if (table < decodeWin + 512 + 16) - table[16] = table[0] = (float) (decodeWindow[j] * scaleval); - if (i % 32 == 31) - table -= 1023; - if (i % 64 == 63) - scaleval = -scaleval; - } - - for (; i < 512; ++i, --j, table += 32) - { - if (table < decodeWin + 512 + 16) - table[16] = table[0] = (float) (decodeWindow[j] * scaleval); - - if (i % 32 == 31) table -= 1023; - if (i % 64 == 63) scaleval = -scaleval; - } - } - - void initLayer2Tables() - { - static const uint8 base[3][9] = - { - { 1, 0, 2 }, - { 17, 18, 0, 19, 20 }, - { 21, 1, 22, 23, 0, 24, 25, 2, 26 } - }; - - static const int tableLengths[] = { 3, 5, 9 }; - static uint8* tables[] = { group3tab, group5tab, group9tab }; - - for (int i = 0; i < 3; ++i) - { - uint8* table = tables[i]; - const int len = tableLengths[i]; - - for (int j = 0; j < len; ++j) - for (int k = 0; k < len; ++k) - for (int l = 0; l < len; ++l) - { - *table++ = base[i][l]; - *table++ = base[i][k]; - *table++ = base[i][j]; - } - } - - for (int k = 0; k < 27; ++k) - { - static const double multipliers[] = - { - 0, -2.0 / 3.0, 2.0 / 3.0, 2.0 / 7.0, 2.0 / 15.0, 2.0 / 31.0, 2.0 / 63.0, 2.0 / 127.0, 2.0 / 255.0, - 2.0 / 511.0, 2.0 / 1023.0, 2.0 / 2047.0, 2.0 / 4095.0, 2.0 / 8191.0, 2.0 / 16383.0, 2.0 / 32767.0, 2.0 / 65535.0, - -4.0 / 5.0, -2.0 / 5.0, 2.0 / 5.0, 4.0 / 5.0, -8.0 / 9.0, -4.0 / 9.0, -2.0 / 9.0, 2.0 / 9.0, 4.0 / 9.0, 8.0 / 9.0 - }; - - float* table = muls[k]; - for (int j = 3, i = 0; i < 63; ++i, --j) - *table++ = (float) (multipliers[k] * pow (2.0, j / 3.0)); - *table++ = 0; - } - } - - void initLayer3Tables() - { - int i, j; - for (i = -256; i < 118 + 4; ++i) - powToGains[i + 256] = (float) pow (2.0, -0.25 * (i + 210)); - - for (i = 0; i < 8207; ++i) - nToThe4Over3[i] = (float) pow ((double) i, 4.0 / 3.0); - - for (i = 0; i < 8; ++i) - { - static double Ci[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 }; - const double sq = sqrt (1.0 + Ci[i] * Ci[i]); - antiAliasingCs[i] = (float) (1.0 / sq); - antiAliasingCa[i] = (float) (Ci[i] / sq); - } - - for (i = 0; i < 18; ++i) - { - win[0][i] = win[1][i] = (float) (0.5 * std::sin (double_Pi / 72.0 * (2 * i + 1)) / std::cos (double_Pi * (2 * i + 19) / 72.0)); - win[0][i + 18] = win[3][i + 18] = (float) (0.5 * std::sin (double_Pi / 72.0 * (2 * (i + 18) + 1)) / std::cos (double_Pi * (2 * (i + 18) + 19) / 72.0)); - } - - const double piOver72 = double_Pi; - - for (i = 0; i < 6; ++i) - { - win[1][i + 18] = (float) (0.5 / std::cos (piOver72 * (2 * (i + 18) + 19))); - win[3][i + 12] = (float) (0.5 / std::cos (piOver72 * (2 * (i + 12) + 19))); - win[1][i + 24] = (float) (0.5 * std::sin (double_Pi / 24.0 * (2 * i + 13)) / std::cos (piOver72 * (2 * (i + 24) + 19))); - win[1][i + 30] = win[3][i] = 0; - win[3][i + 6] = (float) (0.5 * std::sin (double_Pi / 24.0 * (2 * i + 1)) / std::cos (piOver72 * (2 * (i + 6) + 19))); - } - - for (i = 0; i < 12; ++i) - win[2][i] = (float) (0.5 * std::sin (double_Pi / 24.0 * (2 * i + 1)) / std::cos (double_Pi * (2 * i + 7) / 24.0)); - - for (j = 0; j < 4; ++j) - { - static const int len[4] = { 36, 36, 12, 36 }; - for (i = 0; i < len[j]; i += 2) win1[j][i] = win[j][i]; - for (i = 1; i < len[j]; i += 2) win1[j][i] = -win[j][i]; - } - - const double sqrt2 = 1.41421356237309504880168872420969808; - - for (i = 0; i < 16; ++i) - { - const double t = std::tan (i * double_Pi / 12.0); - tan1_1[i] = (float) (t / (1.0 + t)); - tan2_1[i] = (float) (1.0 / (1.0 + t)); - tan1_2[i] = (float) (sqrt2 * t / (1.0 + t)); - tan2_2[i] = (float) (sqrt2 / (1.0 + t)); - - for (j = 0; j < 2; ++j) - { - double p1 = 1.0, p2 = 1.0; - - if (i > 0) - { - const double base = pow (2.0, -0.25 * (j + 1)); - - if (i & 1) - p1 = pow (base, (i + 1) * 0.5); - else - p2 = pow (base, i * 0.5); - } - - pow1_1[j][i] = (float) p1; - pow2_1[j][i] = (float) p2; - pow1_2[j][i] = (float) (sqrt2 * p1); - pow2_2[j][i] = (float) (sqrt2 * p2); - } - } - - for (j = 0; j < 9; ++j) - { - const BandInfoStruct& bi = bandInfo[j]; - int cb; - int* mp = map[j][0] = mapbuf0[j]; - const int16* bdf = bi.longDiff; - - for (i = 0, cb = 0; cb < 8; ++cb, i += *bdf++) - { - *mp++ = (*bdf) >> 1; - *mp++ = i; - *mp++ = 3; - *mp++ = cb; - } - bdf = bi.shortDiff + 3; - - for (cb = 3; cb < 13; ++cb) - { - const int l = (*bdf++) >> 1; - - for (int lwin = 0; lwin < 3; ++lwin) - { - *mp++ = l; - *mp++ = i + lwin; - *mp++ = lwin; - *mp++ = cb; - } - i += 6 * l; - } - - mapEnd[j][0] = mp; - mp = map[j][1] = mapbuf1[j]; - bdf = bi.shortDiff; - - for (i = 0, cb = 0; cb < 13; ++cb) - { - const int l = (*bdf++) >> 1; - for (int lwin = 0; lwin < 3; ++lwin) - { - *mp++ = l; - *mp++ = i + lwin; - *mp++ = lwin; - *mp++ = cb; - } - i += 6 * l; - } - mapEnd[j][1] = mp; - - mp = map[j][2] = mapbuf2[j]; - bdf = bi.longDiff; - for (cb = 0; cb < 22; ++cb) - { - *mp++ = (*bdf++) >> 1; - *mp++ = cb; - } - mapEnd[j][2] = mp; - - } - - for (j = 0; j < 9; ++j) - { - for (i = 0; i < 23; ++i) longLimit[j][i] = jmin (32, (bandInfo[j].longIndex[i] - 1 + 8) / 18 + 1); - for (i = 0; i < 14; ++i) shortLimit[j][i] = jmin (32, (bandInfo[j].shortIndex[i] - 1) / 18 + 1); - } - - for (i = 0; i < 5; ++i) - for (j = 0; j < 6; ++j) - for (int k = 0; k < 6; ++k) - { - const int n = k + j * 6 + i * 36; - iLength2[n] = (unsigned int) (i | (j << 3) | (k << 6) | (3 << 12)); - } - - for (i = 0; i < 4; ++i) - for (j = 0; j < 4; ++j) - for (int k = 0; k < 4; ++k) - { - const int n = k + j * 4 + i * 16; - iLength2[n + 180] = (unsigned int) (i | (j << 3) | (k << 6) | (4 << 12)); - } - - for (i = 0; i < 4; ++i) - for (j = 0; j < 3; ++j) - { - const int n = j + i * 3; - iLength2[n + 244] = (unsigned int) (i | (j << 3) | (5 << 12)); - nLength2[n + 500] = (unsigned int) (i | (j << 3) | (2 << 12) | (1 << 15)); - } - - for (i = 0; i < 5; ++i) - for (j = 0; j < 5; ++j) - for (int k = 0; k < 4; ++k) - for (int l = 0; l < 4; ++l) - { - const int n = l + k * 4 + j * 16 + i * 80; - nLength2[n] = (unsigned int) (i | (j << 3) | (k << 6) | (l << 9) | (0 << 12)); - } - - for (i = 0; i < 5; ++i) - for (j = 0; j < 5; ++j) - for (int k = 0; k < 4; ++k) - { - const int n = k + j * 4 + i * 20; - nLength2[n + 400] = (unsigned int) (i | (j << 3) | (k << 6) | (1 << 12)); - } - } -}; - -static const Constants constants; - - -//============================================================================== -struct Layer3SideInfo -{ - struct Info - { - void doAntialias (float xr[32][18]) const noexcept - { - float* xr1 = xr[1]; - int sb; - - if (blockType == 2) - { - if (mixedBlockFlag == 0) - return; - - sb = 1; - } - else - sb = (int) maxb - 1; - - for (; sb != 0; --sb, xr1 += 10) - { - const float* cs = constants.antiAliasingCs; - const float* ca = constants.antiAliasingCa; - float* xr2 = xr1; - - for (int ss = 7; ss >= 0; --ss) - { - const float bu = *--xr2, bd = *xr1; - *xr2 = (bu * *cs) - (bd * *ca); - *xr1++ = (bd * *cs++) + (bu * *ca++); - } - } - } - - void doIStereo (float xrBuffer[2][32][18], const int* const scaleFactors, - const int sampleRate, const bool msStereo, const int lsf) const noexcept - { - float (*xr) [32 * 18] = (float (*) [32 * 18]) xrBuffer; - const BandInfoStruct& bi = bandInfo[sampleRate]; - const float* tabl1, *tabl2; - - if (lsf != 0) - { - const int p = scaleFactorCompression & 1; - if (msStereo) - { - tabl1 = constants.pow1_2[p]; - tabl2 = constants.pow2_2[p]; - } - else - { - tabl1 = constants.pow1_1[p]; - tabl2 = constants.pow2_1[p]; - } - } - else - { - if (msStereo) - { - tabl1 = constants.tan1_2; - tabl2 = constants.tan2_2; - } - else - { - tabl1 = constants.tan1_1; - tabl2 = constants.tan2_1; - } - } - - if (blockType == 2) - { - bool doL = mixedBlockFlag != 0; - - for (uint32 lwin = 0; lwin < 3; ++lwin) - { - uint32 sfb = maxBand[lwin]; - doL = doL && (sfb <= 3); - - for (; sfb < 12; ++sfb) - { - const int p = scaleFactors[sfb * 3 + lwin - mixedBlockFlag]; - if (p != 7) - { - const float t1 = tabl1[p]; - const float t2 = tabl2[p]; - int sb = bi.shortDiff[sfb]; - uint32 index = (uint32) sb + lwin; - - for (; sb > 0; --sb, index += 3) - { - float v = xr[0][index]; - xr[0][index] = v * t1; - xr[1][index] = v * t2; - } - } - } - - const int p = scaleFactors[11 * 3 + lwin - mixedBlockFlag]; - - if (p != 7) - { - const float t1 = tabl1[p]; - const float t2 = tabl2[p]; - int sb = bi.shortDiff[12]; - uint32 index = (uint32) sb + lwin; - - for (; sb > 0; --sb, index += 3) - { - float v = xr[0][index]; - xr[0][index] = v * t1; - xr[1][index] = v * t2; - } - } - } - - if (doL) - { - int index = bi.longIndex[maxBandl]; - - for (uint32 sfb = maxBandl; sfb < 8; ++sfb) - { - int sb = bi.longDiff[sfb]; - const int p = scaleFactors[sfb]; - - if (p != 7) - { - const float t1 = tabl1[p]; - const float t2 = tabl2[p]; - - for (; sb > 0; --sb, ++index) - { - float v = xr[0][index]; - xr[0][index] = v * t1; - xr[1][index] = v * t2; - } - } - else - index += sb; - } - } - } - else - { - int index = bi.longIndex[maxBandl]; - - for (uint32 sfb = maxBandl; sfb < 21; ++sfb) - { - int sb = bi.longDiff[sfb]; - const int p = scaleFactors[sfb]; - - if (p != 7) - { - const float t1 = tabl1[p]; - const float t2 = tabl2[p]; - - for (; sb > 0; --sb, ++index) - { - const float v = xr[0][index]; - xr[0][index] = v * t1; - xr[1][index] = v * t2; - } - } - else - index += sb; - } - - const int p = scaleFactors[20]; - if (p != 7) - { - const float t1 = tabl1[p], t2 = tabl2[p]; - - for (int sb = bi.longDiff[21]; sb > 0; --sb, ++index) - { - const float v = xr[0][index]; - xr[0][index] = v * t1; - xr[1][index] = v * t2; - } - } - } - } - - int scfsi; - uint32 part2_3Length, bigValues; - uint32 scaleFactorCompression, blockType, mixedBlockFlag; - uint32 tableSelect[3]; - uint32 maxBand[3]; - uint32 maxBandl, maxb, region1Start, region2Start; - uint32 preflag, scaleFactorScale, count1TableSelect; - const float* fullGain[3]; - const float* pow2gain; - }; - - struct InfoPair { Info gr[2]; }; - InfoPair ch[2]; - - uint32 mainDataStart, privateBits; -}; - -//============================================================================== -namespace DCT -{ - enum { SBLIMIT = 32 }; - static const float cos6_1 = 0.866025388f; - static const float cos6_2 = 0.5f; - static const float cos9[] = { 1.0f, 0.98480773f, 0.939692616f, 0.866025388f, 0.766044438f, 0.642787635f, 0.5f, 0.342020154f, 0.173648179f }; - static const float cos36[] = { 0.501909912f, 0.517638087f, 0.551688969f, 0.610387266f, 0.707106769f, 0.871723413f, 1.18310082f, 1.93185163f, 5.73685646f }; - static const float cos12[] = { 0.517638087f, 0.707106769f, 1.93185163f }; - - inline void dct36_0 (const int v, float* const ts, float* const out1, float* const out2, - const float* const wintab, float sum0, const float sum1) noexcept - { - const float tmp = sum0 + sum1; - out2[9 + v] = tmp * wintab[27 + v]; - out2[8 - v] = tmp * wintab[26 - v]; - sum0 -= sum1; - ts[SBLIMIT * (8 - v)] = out1[8 - v] + sum0 * wintab[8 - v]; - ts[SBLIMIT * (9 + v)] = out1[9 + v] + sum0 * wintab[9 + v]; - } - - inline void dct36_1 (const int v, float* const ts, float* const out1, float* const out2, const float* const wintab, - const float tmp1a, const float tmp1b, const float tmp2a, const float tmp2b) noexcept - { - dct36_0 (v, ts, out1, out2, wintab, tmp1a + tmp2a, (tmp1b + tmp2b) * cos36[v]); - } - - inline void dct36_2 (const int v, float* const ts, float* const out1, float* const out2, const float* const wintab, - const float tmp1a, const float tmp1b, const float tmp2a, const float tmp2b) noexcept - { - dct36_0 (v, ts, out1, out2, wintab, tmp2a - tmp1a, (tmp2b - tmp1b) * cos36[v]); - } - - static void dct36 (float* const in, float* const out1, float* const out2, const float* const wintab, float* const ts) noexcept - { - in[17] += in[16]; in[16] += in[15]; in[15] += in[14]; in[14] += in[13]; in[13] += in[12]; - in[12] += in[11]; in[11] += in[10]; in[10] += in[9]; in[9] += in[8]; in[8] += in[7]; - in[7] += in[6]; in[6] += in[5]; in[5] += in[4]; in[4] += in[3]; in[3] += in[2]; - in[2] += in[1]; in[1] += in[0]; in[17] += in[15]; in[15] += in[13]; in[13] += in[11]; - in[11] += in[9]; in[9] += in[7]; in[7] += in[5]; in[5] += in[3]; in[3] += in[1]; - - const float ta33 = in[6] * cos9[3]; - const float ta66 = in[12] * cos9[6]; - const float tb33 = in[7] * cos9[3]; - const float tb66 = in[13] * cos9[6]; - - { - const float tmp1a = in[2] * cos9[1] + ta33 + in[10] * cos9[5] + in[14] * cos9[7]; - const float tmp1b = in[3] * cos9[1] + tb33 + in[11] * cos9[5] + in[15] * cos9[7]; - const float tmp2a = in[0] + in[4] * cos9[2] + in[8] * cos9[4] + ta66 + in[16] * cos9[8]; - const float tmp2b = in[1] + in[5] * cos9[2] + in[9] * cos9[4] + tb66 + in[17] * cos9[8]; - dct36_1 (0, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); - dct36_2 (8, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); - } - - { - const float tmp1a = (in[2] - in[10] - in[14]) * cos9[3]; - const float tmp1b = (in[3] - in[11] - in[15]) * cos9[3]; - const float tmp2a = (in[4] - in[8] - in[16]) * cos9[6] - in[12] + in[0]; - const float tmp2b = (in[5] - in[9] - in[17]) * cos9[6] - in[13] + in[1]; - dct36_1 (1, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); - dct36_2 (7, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); - } - - { - const float tmp1a = in[2] * cos9[5] - ta33 - in[10] * cos9[7] + in[14] * cos9[1]; - const float tmp1b = in[3] * cos9[5] - tb33 - in[11] * cos9[7] + in[15] * cos9[1]; - const float tmp2a = in[0] - in[4] * cos9[8] - in[8] * cos9[2] + ta66 + in[16] * cos9[4]; - const float tmp2b = in[1] - in[5] * cos9[8] - in[9] * cos9[2] + tb66 + in[17] * cos9[4]; - dct36_1 (2, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); - dct36_2 (6, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); - } - - { - const float tmp1a = in[2] * cos9[7] - ta33 + in[10] * cos9[1] - in[14] * cos9[5]; - const float tmp1b = in[3] * cos9[7] - tb33 + in[11] * cos9[1] - in[15] * cos9[5]; - const float tmp2a = in[0] - in[4] * cos9[4] + in[8] * cos9[8] + ta66 - in[16] * cos9[2]; - const float tmp2b = in[1] - in[5] * cos9[4] + in[9] * cos9[8] + tb66 - in[17] * cos9[2]; - dct36_1 (3, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); - dct36_2 (5, ts, out1, out2, wintab, tmp1a, tmp1b, tmp2a, tmp2b); - } - - const float sum0 = in[0] - in[4] + in[8] - in[12] + in[16]; - const float sum1 = (in[1] - in[5] + in[9] - in[13] + in[17]) * cos36[4]; - dct36_0 (4, ts, out1, out2, wintab, sum0, sum1); - } - - struct DCT12Inputs - { - float in0, in1, in2, in3, in4, in5; - - inline DCT12Inputs (const float* const in) noexcept - { - in5 = in[5*3] + (in4 = in[4*3]); - in4 += (in3 = in[3*3]); - in3 += (in2 = in[2*3]); - in2 += (in1 = in[1*3]); - in1 += (in0 = in[0*3]); - in5 += in3; in3 += in1; - in2 *= cos6_1; - in3 *= cos6_1; - } - - inline void process() noexcept - { - in0 += in4 * cos6_2; - in4 = in0 + in2; in0 -= in2; - in1 += in5 * cos6_2; - in5 = (in1 + in3) * cos12[0]; - in1 = (in1 - in3) * cos12[2]; - in3 = in4 + in5; in4 -= in5; - in2 = in0 + in1; in0 -= in1; - } - }; - - static void dct12 (const float* in, float* const out1, float* const out2, const float* wi, float* ts) noexcept - { - { - ts[0] = out1[0]; - ts[SBLIMIT * 1] = out1[1]; - ts[SBLIMIT * 2] = out1[2]; - ts[SBLIMIT * 3] = out1[3]; - ts[SBLIMIT * 4] = out1[4]; - ts[SBLIMIT * 5] = out1[5]; - - DCT12Inputs inputs (in); - - { - float tmp1 = (inputs.in0 - inputs.in4); - const float tmp2 = (inputs.in1 - inputs.in5) * cos12[1]; - const float tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - - ts[16 * SBLIMIT] = out1[16] + tmp0 * wi[10]; - ts[13 * SBLIMIT] = out1[13] + tmp0 * wi[7]; - ts[7 * SBLIMIT] = out1[7] + tmp1 * wi[1]; - ts[10 * SBLIMIT] = out1[10] + tmp1 * wi[4]; - } - - inputs.process(); - - ts[17 * SBLIMIT] = out1[17] + inputs.in2 * wi[11]; - ts[12 * SBLIMIT] = out1[12] + inputs.in2 * wi[6]; - ts[14 * SBLIMIT] = out1[14] + inputs.in3 * wi[8]; - ts[15 * SBLIMIT] = out1[15] + inputs.in3 * wi[9]; - - ts[6 * SBLIMIT] = out1[6] + inputs.in0 * wi[0]; - ts[11 * SBLIMIT] = out1[11] + inputs.in0 * wi[5]; - ts[8 * SBLIMIT] = out1[8] + inputs.in4 * wi[2]; - ts[9 * SBLIMIT] = out1[9] + inputs.in4 * wi[3]; - } - - { - DCT12Inputs inputs (++in); - float tmp1 = (inputs.in0 - inputs.in4); - const float tmp2 = (inputs.in1 - inputs.in5) * cos12[1]; - const float tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - out2[4] = tmp0 * wi[10]; - out2[1] = tmp0 * wi[7]; - ts[13 * SBLIMIT] += tmp1 * wi[1]; - ts[16 * SBLIMIT] += tmp1 * wi[4]; - - inputs.process(); - - out2[5] = inputs.in2 * wi[11]; - out2[0] = inputs.in2 * wi[6]; - out2[2] = inputs.in3 * wi[8]; - out2[3] = inputs.in3 * wi[9]; - ts[12 * SBLIMIT] += inputs.in0 * wi[0]; - ts[17 * SBLIMIT] += inputs.in0 * wi[5]; - ts[14 * SBLIMIT] += inputs.in4 * wi[2]; - ts[15 * SBLIMIT] += inputs.in4 * wi[5 - 2]; - } - - { - DCT12Inputs inputs (++in); - out2[12] = out2[13] = out2[14] = out2[15] = out2[16] = out2[17] = 0; - - float tmp1 = (inputs.in0 - inputs.in4); - const float tmp2 = (inputs.in1 - inputs.in5) * cos12[1]; - const float tmp0 = tmp1 + tmp2; - tmp1 -= tmp2; - - out2[10] = tmp0 * wi[10]; - out2[7] = tmp0 * wi[7]; - out2[1] += tmp1 * wi[1]; - out2[4] += tmp1 * wi[4]; - - inputs.process(); - - out2[11] = inputs.in2 * wi[11]; - out2[6] = inputs.in2 * wi[6]; - out2[8] = inputs.in3 * wi[8]; - out2[9] = inputs.in3 * wi[9]; - out2[0] += inputs.in0 * wi[0]; - out2[5] += inputs.in0 * wi[5]; - out2[2] += inputs.in4 * wi[2]; - out2[3] += inputs.in4 * wi[3]; - } - } - - static void dct64 (float* const out0, float* const out1, float* const b1, float* const b2, const float* const samples) noexcept - { - { - const float* const costab = constants.cosTables[0]; - b1[0x00] = samples[0x00] + samples[0x1F]; b1[0x1F] = (samples[0x00] - samples[0x1F]) * costab[0x0]; - b1[0x01] = samples[0x01] + samples[0x1E]; b1[0x1E] = (samples[0x01] - samples[0x1E]) * costab[0x1]; - b1[0x02] = samples[0x02] + samples[0x1D]; b1[0x1D] = (samples[0x02] - samples[0x1D]) * costab[0x2]; - b1[0x03] = samples[0x03] + samples[0x1C]; b1[0x1C] = (samples[0x03] - samples[0x1C]) * costab[0x3]; - b1[0x04] = samples[0x04] + samples[0x1B]; b1[0x1B] = (samples[0x04] - samples[0x1B]) * costab[0x4]; - b1[0x05] = samples[0x05] + samples[0x1A]; b1[0x1A] = (samples[0x05] - samples[0x1A]) * costab[0x5]; - b1[0x06] = samples[0x06] + samples[0x19]; b1[0x19] = (samples[0x06] - samples[0x19]) * costab[0x6]; - b1[0x07] = samples[0x07] + samples[0x18]; b1[0x18] = (samples[0x07] - samples[0x18]) * costab[0x7]; - b1[0x08] = samples[0x08] + samples[0x17]; b1[0x17] = (samples[0x08] - samples[0x17]) * costab[0x8]; - b1[0x09] = samples[0x09] + samples[0x16]; b1[0x16] = (samples[0x09] - samples[0x16]) * costab[0x9]; - b1[0x0A] = samples[0x0A] + samples[0x15]; b1[0x15] = (samples[0x0A] - samples[0x15]) * costab[0xA]; - b1[0x0B] = samples[0x0B] + samples[0x14]; b1[0x14] = (samples[0x0B] - samples[0x14]) * costab[0xB]; - b1[0x0C] = samples[0x0C] + samples[0x13]; b1[0x13] = (samples[0x0C] - samples[0x13]) * costab[0xC]; - b1[0x0D] = samples[0x0D] + samples[0x12]; b1[0x12] = (samples[0x0D] - samples[0x12]) * costab[0xD]; - b1[0x0E] = samples[0x0E] + samples[0x11]; b1[0x11] = (samples[0x0E] - samples[0x11]) * costab[0xE]; - b1[0x0F] = samples[0x0F] + samples[0x10]; b1[0x10] = (samples[0x0F] - samples[0x10]) * costab[0xF]; - } - - { - const float* const costab = constants.cosTables[1]; - b2[0x00] = b1[0x00] + b1[0x0F]; b2[0x0F] = (b1[0x00] - b1[0x0F]) * costab[0]; - b2[0x01] = b1[0x01] + b1[0x0E]; b2[0x0E] = (b1[0x01] - b1[0x0E]) * costab[1]; - b2[0x02] = b1[0x02] + b1[0x0D]; b2[0x0D] = (b1[0x02] - b1[0x0D]) * costab[2]; - b2[0x03] = b1[0x03] + b1[0x0C]; b2[0x0C] = (b1[0x03] - b1[0x0C]) * costab[3]; - b2[0x04] = b1[0x04] + b1[0x0B]; b2[0x0B] = (b1[0x04] - b1[0x0B]) * costab[4]; - b2[0x05] = b1[0x05] + b1[0x0A]; b2[0x0A] = (b1[0x05] - b1[0x0A]) * costab[5]; - b2[0x06] = b1[0x06] + b1[0x09]; b2[0x09] = (b1[0x06] - b1[0x09]) * costab[6]; - b2[0x07] = b1[0x07] + b1[0x08]; b2[0x08] = (b1[0x07] - b1[0x08]) * costab[7]; - b2[0x10] = b1[0x10] + b1[0x1F]; b2[0x1F] = (b1[0x1F] - b1[0x10]) * costab[0]; - b2[0x11] = b1[0x11] + b1[0x1E]; b2[0x1E] = (b1[0x1E] - b1[0x11]) * costab[1]; - b2[0x12] = b1[0x12] + b1[0x1D]; b2[0x1D] = (b1[0x1D] - b1[0x12]) * costab[2]; - b2[0x13] = b1[0x13] + b1[0x1C]; b2[0x1C] = (b1[0x1C] - b1[0x13]) * costab[3]; - b2[0x14] = b1[0x14] + b1[0x1B]; b2[0x1B] = (b1[0x1B] - b1[0x14]) * costab[4]; - b2[0x15] = b1[0x15] + b1[0x1A]; b2[0x1A] = (b1[0x1A] - b1[0x15]) * costab[5]; - b2[0x16] = b1[0x16] + b1[0x19]; b2[0x19] = (b1[0x19] - b1[0x16]) * costab[6]; - b2[0x17] = b1[0x17] + b1[0x18]; b2[0x18] = (b1[0x18] - b1[0x17]) * costab[7]; - } - - { - const float* const costab = constants.cosTables[2]; - b1[0x00] = b2[0x00] + b2[0x07]; b1[0x07] = (b2[0x00] - b2[0x07]) * costab[0]; - b1[0x01] = b2[0x01] + b2[0x06]; b1[0x06] = (b2[0x01] - b2[0x06]) * costab[1]; - b1[0x02] = b2[0x02] + b2[0x05]; b1[0x05] = (b2[0x02] - b2[0x05]) * costab[2]; - b1[0x03] = b2[0x03] + b2[0x04]; b1[0x04] = (b2[0x03] - b2[0x04]) * costab[3]; - b1[0x08] = b2[0x08] + b2[0x0F]; b1[0x0F] = (b2[0x0F] - b2[0x08]) * costab[0]; - b1[0x09] = b2[0x09] + b2[0x0E]; b1[0x0E] = (b2[0x0E] - b2[0x09]) * costab[1]; - b1[0x0A] = b2[0x0A] + b2[0x0D]; b1[0x0D] = (b2[0x0D] - b2[0x0A]) * costab[2]; - b1[0x0B] = b2[0x0B] + b2[0x0C]; b1[0x0C] = (b2[0x0C] - b2[0x0B]) * costab[3]; - b1[0x10] = b2[0x10] + b2[0x17]; b1[0x17] = (b2[0x10] - b2[0x17]) * costab[0]; - b1[0x11] = b2[0x11] + b2[0x16]; b1[0x16] = (b2[0x11] - b2[0x16]) * costab[1]; - b1[0x12] = b2[0x12] + b2[0x15]; b1[0x15] = (b2[0x12] - b2[0x15]) * costab[2]; - b1[0x13] = b2[0x13] + b2[0x14]; b1[0x14] = (b2[0x13] - b2[0x14]) * costab[3]; - b1[0x18] = b2[0x18] + b2[0x1F]; b1[0x1F] = (b2[0x1F] - b2[0x18]) * costab[0]; - b1[0x19] = b2[0x19] + b2[0x1E]; b1[0x1E] = (b2[0x1E] - b2[0x19]) * costab[1]; - b1[0x1A] = b2[0x1A] + b2[0x1D]; b1[0x1D] = (b2[0x1D] - b2[0x1A]) * costab[2]; - b1[0x1B] = b2[0x1B] + b2[0x1C]; b1[0x1C] = (b2[0x1C] - b2[0x1B]) * costab[3]; - } - - { - const float cos0 = constants.cosTables[3][0]; - const float cos1 = constants.cosTables[3][1]; - b2[0x00] = b1[0x00] + b1[0x03]; b2[0x03] = (b1[0x00] - b1[0x03]) * cos0; - b2[0x01] = b1[0x01] + b1[0x02]; b2[0x02] = (b1[0x01] - b1[0x02]) * cos1; - b2[0x04] = b1[0x04] + b1[0x07]; b2[0x07] = (b1[0x07] - b1[0x04]) * cos0; - b2[0x05] = b1[0x05] + b1[0x06]; b2[0x06] = (b1[0x06] - b1[0x05]) * cos1; - b2[0x08] = b1[0x08] + b1[0x0B]; b2[0x0B] = (b1[0x08] - b1[0x0B]) * cos0; - b2[0x09] = b1[0x09] + b1[0x0A]; b2[0x0A] = (b1[0x09] - b1[0x0A]) * cos1; - b2[0x0C] = b1[0x0C] + b1[0x0F]; b2[0x0F] = (b1[0x0F] - b1[0x0C]) * cos0; - b2[0x0D] = b1[0x0D] + b1[0x0E]; b2[0x0E] = (b1[0x0E] - b1[0x0D]) * cos1; - b2[0x10] = b1[0x10] + b1[0x13]; b2[0x13] = (b1[0x10] - b1[0x13]) * cos0; - b2[0x11] = b1[0x11] + b1[0x12]; b2[0x12] = (b1[0x11] - b1[0x12]) * cos1; - b2[0x14] = b1[0x14] + b1[0x17]; b2[0x17] = (b1[0x17] - b1[0x14]) * cos0; - b2[0x15] = b1[0x15] + b1[0x16]; b2[0x16] = (b1[0x16] - b1[0x15]) * cos1; - b2[0x18] = b1[0x18] + b1[0x1B]; b2[0x1B] = (b1[0x18] - b1[0x1B]) * cos0; - b2[0x19] = b1[0x19] + b1[0x1A]; b2[0x1A] = (b1[0x19] - b1[0x1A]) * cos1; - b2[0x1C] = b1[0x1C] + b1[0x1F]; b2[0x1F] = (b1[0x1F] - b1[0x1C]) * cos0; - b2[0x1D] = b1[0x1D] + b1[0x1E]; b2[0x1E] = (b1[0x1E] - b1[0x1D]) * cos1; - } - - { - const float cos0 = constants.cosTables[4][0]; - b1[0x00] = b2[0x00] + b2[0x01]; b1[0x01] = (b2[0x00] - b2[0x01]) * cos0; - b1[0x02] = b2[0x02] + b2[0x03]; b1[0x03] = (b2[0x03] - b2[0x02]) * cos0; b1[0x02] += b1[0x03]; - b1[0x04] = b2[0x04] + b2[0x05]; b1[0x05] = (b2[0x04] - b2[0x05]) * cos0; - b1[0x06] = b2[0x06] + b2[0x07]; b1[0x07] = (b2[0x07] - b2[0x06]) * cos0; - b1[0x06] += b1[0x07]; b1[0x04] += b1[0x06]; b1[0x06] += b1[0x05]; b1[0x05] += b1[0x07]; - b1[0x08] = b2[0x08] + b2[0x09]; b1[0x09] = (b2[0x08] - b2[0x09]) * cos0; - b1[0x0A] = b2[0x0A] + b2[0x0B]; b1[0x0B] = (b2[0x0B] - b2[0x0A]) * cos0; b1[0x0A] += b1[0x0B]; - b1[0x0C] = b2[0x0C] + b2[0x0D]; b1[0x0D] = (b2[0x0C] - b2[0x0D]) * cos0; - b1[0x0E] = b2[0x0E] + b2[0x0F]; b1[0x0F] = (b2[0x0F] - b2[0x0E]) * cos0; - b1[0x0E] += b1[0x0F]; b1[0x0C] += b1[0x0E]; b1[0x0E] += b1[0x0D]; b1[0x0D] += b1[0x0F]; - b1[0x10] = b2[0x10] + b2[0x11]; b1[0x11] = (b2[0x10] - b2[0x11]) * cos0; - b1[0x12] = b2[0x12] + b2[0x13]; b1[0x13] = (b2[0x13] - b2[0x12]) * cos0; b1[0x12] += b1[0x13]; - b1[0x14] = b2[0x14] + b2[0x15]; b1[0x15] = (b2[0x14] - b2[0x15]) * cos0; - b1[0x16] = b2[0x16] + b2[0x17]; b1[0x17] = (b2[0x17] - b2[0x16]) * cos0; - b1[0x16] += b1[0x17]; b1[0x14] += b1[0x16]; b1[0x16] += b1[0x15]; b1[0x15] += b1[0x17]; - b1[0x18] = b2[0x18] + b2[0x19]; b1[0x19] = (b2[0x18] - b2[0x19]) * cos0; - b1[0x1A] = b2[0x1A] + b2[0x1B]; b1[0x1B] = (b2[0x1B] - b2[0x1A]) * cos0; b1[0x1A] += b1[0x1B]; - b1[0x1C] = b2[0x1C] + b2[0x1D]; b1[0x1D] = (b2[0x1C] - b2[0x1D]) * cos0; - b1[0x1E] = b2[0x1E] + b2[0x1F]; b1[0x1F] = (b2[0x1F] - b2[0x1E]) * cos0; - b1[0x1E] += b1[0x1F]; b1[0x1C] += b1[0x1E]; b1[0x1E] += b1[0x1D]; b1[0x1D] += b1[0x1F]; - } - - out0[0x10 * 16] = b1[0x00]; out0[0x10 * 12] = b1[0x04]; out0[0x10 * 8] = b1[0x02]; out0[0x10 * 4] = b1[0x06]; - out0[0] = b1[0x01]; out1[0] = b1[0x01]; out1[0x10 * 4] = b1[0x05]; out1[0x10 * 8] = b1[0x03]; - out1[0x10 * 12] = b1[0x07]; - - b1[0x08] += b1[0x0C]; out0[0x10 * 14] = b1[0x08]; b1[0x0C] += b1[0x0a]; out0[0x10 * 10] = b1[0x0C]; - b1[0x0A] += b1[0x0E]; out0[0x10 * 6] = b1[0x0A]; b1[0x0E] += b1[0x09]; out0[0x10 * 2] = b1[0x0E]; - b1[0x09] += b1[0x0D]; out1[0x10 * 2] = b1[0x09]; b1[0x0D] += b1[0x0B]; out1[0x10 * 6] = b1[0x0D]; - b1[0x0B] += b1[0x0F]; out1[0x10 * 10] = b1[0x0B]; out1[0x10 * 14] = b1[0x0F]; - - b1[0x18] += b1[0x1C]; out0[0x10 * 15] = b1[0x10] + b1[0x18]; out0[0x10 * 13] = b1[0x18] + b1[0x14]; - b1[0x1C] += b1[0x1a]; out0[0x10 * 11] = b1[0x14] + b1[0x1C]; out0[0x10 * 9] = b1[0x1C] + b1[0x12]; - b1[0x1A] += b1[0x1E]; out0[0x10 * 7] = b1[0x12] + b1[0x1A]; out0[0x10 * 5] = b1[0x1A] + b1[0x16]; - b1[0x1E] += b1[0x19]; out0[0x10 * 3] = b1[0x16] + b1[0x1E]; out0[0x10 * 1] = b1[0x1E] + b1[0x11]; - b1[0x19] += b1[0x1D]; out1[0x10 * 1] = b1[0x11] + b1[0x19]; out1[0x10 * 3] = b1[0x19] + b1[0x15]; - b1[0x1D] += b1[0x1B]; out1[0x10 * 5] = b1[0x15] + b1[0x1D]; out1[0x10 * 7] = b1[0x1D] + b1[0x13]; - b1[0x1B] += b1[0x1F]; out1[0x10 * 9] = b1[0x13] + b1[0x1B]; out1[0x10 * 11] = b1[0x1B] + b1[0x17]; - out1[0x10 * 13] = b1[0x17] + b1[0x1F]; out1[0x10 * 15] = b1[0x1F]; - } - - static void dct64 (float* const a, float* const b, const float* const c) noexcept - { - float temp[64]; - dct64 (a, b, temp, temp + 32, c); - } -} - -//============================================================================== -struct MP3Stream -{ - MP3Stream (InputStream& source) - : stream (source, 8192), - numFrames (0), currentFrameIndex (0), vbrHeaderFound (false) - { - reset(); - } - - int decodeNextBlock (float* const out0, float* const out1, int& done) - { - if (! headerParsed) - { - int nextFrameOffset = scanForNextFrameHeader (false); - - if (lastFrameSize == -1 || needToSyncBitStream) - { - needToSyncBitStream = false; - readVBRHeader(); - - if (vbrHeaderFound) - return 1; - } - - if (nextFrameOffset < 0) - return -1; - - if (nextFrameOffset > 0) - { - int size; - wasFreeFormat = false; - needToSyncBitStream = true; - size = (int) (bufferPointer - (bufferSpace[bufferSpaceIndex] + 512)); - - if (size > 2880) - { - size = 0; - bufferPointer = bufferSpace[bufferSpaceIndex] + 512; - } - - const int toSkip = (size + nextFrameOffset) - 2880; - - if (toSkip > 0) - { - stream.skipNextBytes (toSkip); - nextFrameOffset -= toSkip; - } - - stream.read (bufferPointer, nextFrameOffset); - lastFrameSize += nextFrameOffset; - } - - frame.decodeHeader ((uint32) stream.readIntBigEndian()); - headerParsed = true; - frameSize = frame.frameSize; - isFreeFormat = (frameSize == 0); - sideInfoSize = frame.lsf != 0 ? ((frame.numChannels == 1) ? 9 : 17) - : ((frame.numChannels == 1) ? 17 : 32); - - if (frame.crc16FollowsHeader) - sideInfoSize += 2; - - bufferSpaceIndex = 1 - bufferSpaceIndex; - bufferPointer = bufferSpace[bufferSpaceIndex] + 512; - bitIndex = 0; - - if (lastFrameSize < 0) - return 1; - } - - if (! sideParsed) - { - if (frame.layer == 3) - { - stream.read (bufferPointer, sideInfoSize); - - if (frame.crc16FollowsHeader) - getBits (16); - - const int bits = jmax (0, decodeLayer3SideInfo()); - dataSize = (bits + 7) / 8; - - if (! isFreeFormat) - dataSize = jmin (dataSize, frame.frameSize - sideInfoSize); - } - else - { - dataSize = frame.frameSize; - sideInfoSize = 0; - } - - sideParsed = true; - } - - int result = 1; - - if (! dataParsed) - { - stream.read (bufferPointer, dataSize); - - if (out0 != nullptr) - { - if (frame.layer < 3 && frame.crc16FollowsHeader) - getBits (16); - - switch (frame.layer) - { - case 1: decodeLayer1Frame (out0, out1, done); break; - case 2: decodeLayer2Frame (out0, out1, done); break; - case 3: decodeLayer3Frame (out0, out1, done); break; - default: break; - } - } - - bufferPointer = bufferSpace[bufferSpaceIndex] + 512 + sideInfoSize + dataSize; - dataParsed = true; - result = 0; - } - - if (isFreeFormat) - { - if (wasFreeFormat) - { - frameSize = lastFrameSizeNoPadding + frame.padding; - } - else - { - const int nextFrameOffset = scanForNextFrameHeader (true); - - wasFreeFormat = isFreeFormat; - - if (nextFrameOffset < 0) - { - lastFrameSize = frameSize; - return result; - } - - frameSize = nextFrameOffset + sideInfoSize + dataSize; - lastFrameSizeNoPadding = frameSize - frame.padding; - } - } - - if (result == 0) - return result; - - int bytes = frameSize - (sideInfoSize + dataSize); - - if (bytes > 0) - { - const int toSkip = bytes - 512; - - if (toSkip > 0) - { - stream.skipNextBytes (toSkip); - bytes -= toSkip; - frameSize -= toSkip; - } - - stream.read (bufferPointer, bytes); - bufferPointer += bytes; - } - - lastFrameSize = frameSize; - wasFreeFormat = isFreeFormat; - frameSize = 0; - headerParsed = sideParsed = dataParsed = false; - return result; - } - - bool seek (int frameIndex) - { - frameIndex = jmax (0, frameIndex); - - while (frameIndex >= frameStreamPositions.size() * storedStartPosInterval) - { - int dummy = 0; - const int result = decodeNextBlock (nullptr, nullptr, dummy); - - if (result < 0) - return false; - - if (result > 0) - break; - } - - frameIndex = jmin (frameIndex & ~(storedStartPosInterval - 1), - frameStreamPositions.size() * storedStartPosInterval - 1); - stream.setPosition (frameStreamPositions.getUnchecked (frameIndex / storedStartPosInterval)); - currentFrameIndex = frameIndex; - reset(); - return true; - } - - MP3Frame frame; - VBRTagData vbrTagData; - BufferedInputStream stream; - int numFrames, currentFrameIndex; - bool vbrHeaderFound; - -private: - bool headerParsed, sideParsed, dataParsed, needToSyncBitStream; - bool isFreeFormat, wasFreeFormat; - int sideInfoSize, dataSize; - int frameSize, lastFrameSize, lastFrameSizeNoPadding; - int bufferSpaceIndex; - Layer3SideInfo sideinfo; - uint8 bufferSpace[2][2880 + 1024]; - uint8* bufferPointer; - int bitIndex, synthBo; - float hybridBlock[2][2][32 * 18]; - int hybridBlockIndex[2]; - float synthBuffers[2][2][0x110]; - float hybridIn[2][32][18]; - float hybridOut[2][18][32]; - - void reset() noexcept - { - headerParsed = sideParsed = dataParsed = isFreeFormat = wasFreeFormat = false; - lastFrameSize = -1; - needToSyncBitStream = true; - frameSize = sideInfoSize = dataSize = frameSize = bitIndex = 0; - lastFrameSizeNoPadding = bufferSpaceIndex = 0; - bufferPointer = bufferSpace[bufferSpaceIndex] + 512; - synthBo = 1; - - zerostruct (sideinfo); - zeromem (bufferSpace, sizeof (bufferSpace)); - zeromem (hybridBlock, sizeof (hybridBlock)); - zeromem (hybridBlockIndex, sizeof (hybridBlockIndex)); - zeromem (synthBuffers, sizeof (synthBuffers)); - } - - enum { storedStartPosInterval = 4 }; - Array frameStreamPositions; - - struct SideInfoLayer1 - { - uint8 allocation[32][2]; - uint8 scaleFactor[32][2]; - }; - - struct SideInfoLayer2 - { - uint8 allocation[32][2]; - uint8 scaleFactor[32][2][3]; - }; - - static bool isValidHeader (const uint32 header, const int oldLayer) noexcept - { - const int newLayer = 4 - ((header >> 17) & 3); - - return (header & 0xffe00000) == 0xffe00000 - && newLayer != 4 - && (oldLayer <= 0 || newLayer == oldLayer) - && ((header >> 12) & 15) != 15 - && ((header >> 10) & 3) != 3 - && (header & 3) != 2; - } - - bool rollBackBufferPointer (int backstep) noexcept - { - if (lastFrameSize < 0 && backstep > 0) - return false; - - const uint8* oldBuffer = bufferSpace[1 - bufferSpaceIndex] + 512; - bufferPointer -= backstep; - - if (backstep != 0) - memcpy (bufferPointer, oldBuffer + lastFrameSize - backstep, (size_t) backstep); - - bitIndex = 0; - return true; - } - - uint32 getBits (const int numBits) noexcept - { - if (numBits <= 0 || bufferPointer == nullptr) - return 0; - - const uint32 result = ((((((bufferPointer[0] << 8) | bufferPointer[1]) << 8) - | bufferPointer[2]) << bitIndex) & 0xffffff) >> (24 - numBits); - bitIndex += numBits; - bufferPointer += (bitIndex >> 3); - bitIndex &= 7; - return result; - } - - uint32 getOneBit() noexcept - { - const uint8 result = (uint8) (*bufferPointer << bitIndex); - ++bitIndex; - bufferPointer += (bitIndex >> 3); - bitIndex &= 7; - return result >> 7; - } - - uint32 getBitsUnchecked (const int numBits) noexcept - { - const uint32 result = ((((bufferPointer[0] << 8) | bufferPointer[1]) << bitIndex) & 0xffff) >> (16 - numBits); - bitIndex += numBits; - bufferPointer += (bitIndex >> 3); - bitIndex &= 7; - return result; - } - - inline uint8 getBitsUint8 (const int numBits) noexcept { return (uint8) getBitsUnchecked (numBits); } - inline uint16 getBitsUint16 (const int numBits) noexcept { return (uint16) getBitsUnchecked (numBits); } - - int scanForNextFrameHeader (const bool checkTypeAgainstLastFrame) noexcept - { - const int64 oldPos = stream.getPosition(); - int offset = -3; - uint32 header = 0; - - for (;;) - { - if (stream.isExhausted() || stream.getPosition() > oldPos + 32768) - { - offset = -1; - break; - } - - header = (header << 8) | (uint8) stream.readByte(); - - if (offset >= 0 && isValidHeader (header, frame.layer)) - { - if (! checkTypeAgainstLastFrame) - break; - - const bool mpeg25 = (header & (1 << 20)) == 0; - const uint32 lsf = mpeg25 ? 1 : ((header & (1 << 19)) ? 0 : 1); - const uint32 sampleRateIndex = mpeg25 ? (6 + ((header >> 10) & 3)) : (((header >> 10) & 3) + (lsf * 3)); - const uint32 mode = (header >> 6) & 3; - const uint32 numChannels = (mode == 3) ? 1 : 2; - - if (numChannels == (uint32) frame.numChannels && lsf == (uint32) frame.lsf - && mpeg25 == frame.mpeg25 && sampleRateIndex == (uint32) frame.sampleRateIndex) - break; - } - - ++offset; - } - - if (offset >= 0) - { - if ((currentFrameIndex & (storedStartPosInterval - 1)) == 0) - frameStreamPositions.set (currentFrameIndex / storedStartPosInterval, oldPos + offset); - - ++currentFrameIndex; - } - - stream.setPosition (oldPos); - return offset; - } - - void readVBRHeader() - { - int64 oldPos = stream.getPosition(); - uint8 xing[194]; - stream.read (xing, sizeof (xing)); - - vbrHeaderFound = vbrTagData.read (xing); - - if (vbrHeaderFound) - { - numFrames = (int) vbrTagData.frames; - oldPos += jmax (vbrTagData.headersize, 1); - } - - stream.setPosition (oldPos); - } - - void decodeLayer1Frame (float* const pcm0, float* const pcm1, int& samplesDone) noexcept - { - float fraction[2][32]; - SideInfoLayer1 si; - layer1Step1 (si); - const int single = (frame.numChannels == 1 || frame.single == 3) ? 0 : frame.single; - - if (single >= 0) - { - for (int i = 0; i < 12; ++i) - { - layer1Step2 (si, fraction); - synthesise (fraction[single], 0, pcm0, samplesDone); - } - } - else - { - for (int i = 0; i < 12; ++i) - { - layer1Step2 (si, fraction); - synthesiseStereo (fraction[0], fraction[1], pcm0, pcm1, samplesDone); - } - } - } - - void decodeLayer2Frame (float* const pcm0, float* const pcm1, int& samplesDone) - { - float fraction[2][4][32]; - frame.selectLayer2Table(); - SideInfoLayer2 si; - layer2Step1 (si); - const int single = (frame.numChannels == 1 || frame.single == 3) ? 0 : frame.single; - - if (single >= 0) - { - for (int i = 0; i < 12; ++i) - { - layer2Step2 (si, i >> 2, fraction); - for (int j = 0; j < 3; ++j) - synthesise (fraction[single][j], 0, pcm0, samplesDone); - } - } - else - { - for (int i = 0; i < 12; ++i) - { - layer2Step2 (si, i >> 2, fraction); - for (int j = 0; j < 3; ++j) - synthesiseStereo (fraction[0][j], fraction[1][j], pcm0, pcm1, samplesDone); - } - } - } - - void decodeLayer3Frame (float* const pcm0, float* const pcm1, int& samplesDone) noexcept - { - if (! rollBackBufferPointer ((int) sideinfo.mainDataStart)) - return; - - const int single = frame.numChannels == 1 ? 0 : frame.single; - const int numChans = (frame.numChannels == 1 || single >= 0) ? 1 : 2; - const bool msStereo = (frame.mode == 1) && (frame.modeExt & 2) != 0; - const bool iStereo = (frame.mode == 1) && (frame.modeExt & 1) != 0; - const int granules = frame.lsf ? 1 : 2; - int scaleFactors[2][39]; - - for (int gr = 0; gr < granules; ++gr) - { - { - Layer3SideInfo::Info& granule = sideinfo.ch[0].gr[gr]; - const int part2bits = frame.lsf ? getLayer3ScaleFactors2 (scaleFactors[0], granule, 0) - : getLayer3ScaleFactors1 (scaleFactors[0], granule); - - if (layer3DequantizeSample (hybridIn[0], scaleFactors[0], granule, frame.sampleRateIndex, part2bits)) - return; - } - - if (frame.numChannels == 2) - { - Layer3SideInfo::Info& granule = sideinfo.ch[1].gr[gr]; - const int part2bits = frame.lsf ? getLayer3ScaleFactors2 (scaleFactors[1], granule, iStereo) - : getLayer3ScaleFactors1 (scaleFactors[1], granule); - - if (layer3DequantizeSample (hybridIn[1], scaleFactors[1], granule, frame.sampleRateIndex, part2bits)) - return; - - if (msStereo) - { - for (int i = 0; i < 32 * 18; ++i) - { - const float tmp0 = ((const float*) hybridIn[0]) [i]; - const float tmp1 = ((const float*) hybridIn[1]) [i]; - ((float*) hybridIn[1]) [i] = tmp0 - tmp1; - ((float*) hybridIn[0]) [i] = tmp0 + tmp1; - } - } - - if (iStereo) - granule.doIStereo (hybridIn, scaleFactors[1], frame.sampleRateIndex, msStereo, frame.lsf); - - if (msStereo || iStereo || single == 3) - { - if (granule.maxb > sideinfo.ch[0].gr[gr].maxb) - sideinfo.ch[0].gr[gr].maxb = granule.maxb; - else - granule.maxb = sideinfo.ch[0].gr[gr].maxb; - } - - switch (single) - { - case 3: - { - float* in0 = (float*) hybridIn[0]; - const float* in1 = (const float*) hybridIn[1]; - for (int i = 0; i < (int) (18 * granule.maxb); ++i, ++in0) - *in0 = (*in0 + *in1++); - } - break; - - case 1: - { - float* in0 = (float*) hybridIn[0]; - const float* in1 = (const float*) hybridIn[1]; - for (int i = 0; i < (int) (18 * granule.maxb); ++i) - *in0++ = *in1++; - } - break; - } - } - - for (int ch = 0; ch < numChans; ++ch) - { - const Layer3SideInfo::Info& granule = sideinfo.ch[ch].gr[gr]; - granule.doAntialias (hybridIn[ch]); - layer3Hybrid (hybridIn[ch], hybridOut[ch], ch, granule); - } - - for (int ss = 0; ss < 18; ++ss) - { - if (single >= 0) - synthesise (hybridOut[0][ss], 0, pcm0, samplesDone); - else - synthesiseStereo (hybridOut[0][ss], hybridOut[1][ss], pcm0, pcm1, samplesDone); - } - } - } - - int decodeLayer3SideInfo() noexcept - { - const int numChannels = frame.numChannels; - const int sampleRate = frame.sampleRateIndex; - const int single = (numChannels == 1) ? 0 : frame.single; - const bool msStereo = (frame.mode == 1) && (frame.modeExt & 2) != 0; - const int granules = frame.lsf ? 1 : 2; - - if (frame.lsf == 0) - getLayer3SideInfo1 (numChannels, msStereo, sampleRate, single); - else - getLayer3SideInfo2 (numChannels, msStereo, sampleRate, single); - - int databits = 0; - for (int gr = 0; gr < granules; ++gr) - for (int ch = 0; ch < numChannels; ++ch) - databits += sideinfo.ch[ch].gr[gr].part2_3Length; - - return databits - 8 * (int) sideinfo.mainDataStart; - } - - void layer1Step1 (SideInfoLayer1& si) noexcept - { - zerostruct (si); - int i, jsbound = (frame.mode == 1) ? (frame.modeExt << 2) + 4 : 32; - - if (frame.numChannels == 2) - { - for (i = 0; i < jsbound; ++i) - { - si.allocation[i][0] = getBitsUint8 (4); - si.allocation[i][1] = getBitsUint8 (4); - } - - for (i = jsbound; i < 32; ++i) - si.allocation[i][0] = si.allocation[i][1] = getBitsUint8 (4); - - for (i = 0; i < 32; ++i) - { - si.scaleFactor[i][0] = si.allocation[i][0] ? getBitsUint8 (6) : 0; - si.scaleFactor[i][1] = si.allocation[i][1] ? getBitsUint8 (6) : 0; - } - } - else - { - for (i = 0; i < 32; ++i) - si.allocation[i][0] = getBitsUint8 (4); - - for (i = 0; i < 32; ++i) - si.scaleFactor[i][0] = si.allocation[i][0] ? getBitsUint8 (6) : 0; - } - } - - void layer1Step2 (SideInfoLayer1& si, float fraction[2][32]) noexcept - { - if (frame.numChannels == 2) - { - int i, jsbound = (frame.mode == 1) ? (frame.modeExt << 2) + 4 : 32; - - for (i = 0; i < jsbound; ++i) - { - const uint8 n0 = si.allocation[i][0]; - const uint8 n1 = si.allocation[i][1]; - fraction[0][i] = n0 > 0 ? (float) (((-1 << n0) + getBitsUint16 (n0 + 1) + 1) * constants.muls[n0 + 1][si.scaleFactor[i][0]]) : 0; - fraction[1][i] = n1 > 0 ? (float) (((-1 << n1) + getBitsUint16 (n1 + 1) + 1) * constants.muls[n1 + 1][si.scaleFactor[i][1]]) : 0; - } - - for (i = jsbound; i < 32; ++i) - { - const uint8 n = si.allocation[i][0]; - - if (n > 0) - { - const uint32 w = ((uint32) (-1 << n) + getBitsUint16 (n + 1) + 1); - fraction[0][i] = (float) (w * constants.muls[n + 1][si.scaleFactor[i][0]]); - fraction[1][i] = (float) (w * constants.muls[n + 1][si.scaleFactor[i][1]]); - } - else - fraction[0][i] = fraction[1][i] = 0; - } - } - else - { - for (int i = 0; i < 32; ++i) - { - const uint8 n = si.allocation[i][0]; - const uint8 j = si.scaleFactor[i][0]; - - if (n > 0) - fraction[0][i] = (float) (((-1 << n) + getBitsUint16 (n + 1) + 1) * constants.muls[n + 1][j]); - else - fraction[0][i] = 0; - } - } - } - - void layer2Step1 (SideInfoLayer2& si) noexcept - { - zerostruct (si); - const int sblimit = frame.layer2SubBandLimit; - const int jsbound = (frame.mode == 1) ? (frame.modeExt << 2) + 4 : frame.layer2SubBandLimit; - const AllocationTable* allocTable = frame.allocationTable; - uint8 scfsi[32][2]; - - if (frame.numChannels == 2) - { - for (int i = 0; i < jsbound; ++i) - { - const int16 step = allocTable->bits; - allocTable += (1 << step); - si.allocation[i][0] = getBitsUint8 (step); - si.allocation[i][1] = getBitsUint8 (step); - } - - for (int i = jsbound; i < sblimit; ++i) - { - const int16 step = allocTable->bits; - const uint8 b0 = getBitsUint8 (step); - allocTable += (1 << step); - si.allocation[i][0] = b0; - si.allocation[i][1] = b0; - } - - for (int i = 0; i < sblimit; ++i) - { - scfsi[i][0] = si.allocation[i][0] ? getBitsUint8 (2) : 0; - scfsi[i][1] = si.allocation[i][1] ? getBitsUint8 (2) : 0; - } - } - else - { - for (int i = 0; i < sblimit; ++i) - { - const int16 step = allocTable->bits; - allocTable += (1 << step); - si.allocation[i][0] = getBitsUint8 (step); - } - - for (int i = 0; i < sblimit; ++i) - scfsi[i][0] = si.allocation[i][0] ? getBitsUint8 (2) : 0; - } - - for (int i = 0; i < sblimit; ++i) - { - for (int ch = 0; ch < frame.numChannels; ++ch) - { - uint8 s0 = 0, s1 = 0, s2 = 0; - - if (si.allocation[i][ch]) - { - switch (scfsi[i][ch]) - { - case 0: - s0 = getBitsUint8 (6); - s1 = getBitsUint8 (6); - s2 = getBitsUint8 (6); - break; - case 1: - s1 = s0 = getBitsUint8 (6); - s2 = getBitsUint8 (6); - break; - case 2: - s2 = s1 = s0 = getBitsUint8 (6); - break; - case 3: - s0 = getBitsUint8 (6); - s2 = s1 = getBitsUint8 (6); - break; - default: - break; - } - } - - si.scaleFactor[i][ch][0] = s0; - si.scaleFactor[i][ch][1] = s1; - si.scaleFactor[i][ch][2] = s2; - } - } - } - - void layer2Step2 (SideInfoLayer2& si, const int gr, float fraction[2][4][32]) noexcept - { - const AllocationTable* allocTable = frame.allocationTable; - const int jsbound = (frame.mode == 1) ? (frame.modeExt << 2) + 4 : frame.layer2SubBandLimit; - - for (int i = 0; i < jsbound; ++i) - { - const int16 step = allocTable->bits; - - for (int ch = 0; ch < frame.numChannels; ++ch) - { - const uint8 ba = si.allocation[i][ch]; - if (ba != 0) - { - const uint8 x1 = jmin ((uint8) 63, si.scaleFactor[i][ch][gr]); - const AllocationTable* const alloc2 = allocTable + ba; - const int16 k = jmin ((int16) 16, alloc2->bits); - const int16 d1 = alloc2->d; - - if (d1 < 0) - { - const double cm = constants.muls[k][x1]; - fraction[ch][0][i] = (float) (((int) getBits (k) + d1) * cm); - fraction[ch][1][i] = (float) (((int) getBits (k) + d1) * cm); - fraction[ch][2][i] = (float) (((int) getBits (k) + d1) * cm); - } - else - { - const uint8* const tab = constants.getGroupTable (d1, getBits (k)); - fraction[ch][0][i] = (float) constants.muls[tab[0]][x1]; - fraction[ch][1][i] = (float) constants.muls[tab[1]][x1]; - fraction[ch][2][i] = (float) constants.muls[tab[2]][x1]; - } - } - else - { - fraction[ch][0][i] = fraction[ch][1][i] = fraction[ch][2][i] = 0; - } - } - - allocTable += (1 << step); - } - - for (int i = jsbound; i < frame.layer2SubBandLimit; ++i) - { - const int16 step = allocTable->bits; - const uint8 ba = si.allocation[i][0]; - - if (ba != 0) - { - const AllocationTable* const alloc2 = allocTable + ba; - int16 k = alloc2->bits; - int16 d1 = alloc2->d; - k = (k <= 16) ? k : 16; - - if (d1 < 0) - { - const int v0 = (int) getBits (k); - const int v1 = (int) getBits (k); - const int v2 = (int) getBits (k); - - for (int ch = 0; ch < frame.numChannels; ++ch) - { - const uint8 x1 = jmin ((uint8) 63, si.scaleFactor[i][ch][gr]); - const double cm = constants.muls[k][x1]; - fraction[ch][0][i] = (float) ((v0 + d1) * cm); - fraction[ch][1][i] = (float) ((v1 + d1) * cm); - fraction[ch][2][i] = (float) ((v2 + d1) * cm); - } - } - else - { - const uint8* const tab = constants.getGroupTable (d1, getBits (k)); - const uint8 k0 = tab[0]; - const uint8 k1 = tab[1]; - const uint8 k2 = tab[2]; - - for (int ch = 0; ch < frame.numChannels; ++ch) - { - const uint8 x1 = jmin ((uint8) 63, si.scaleFactor[i][ch][gr]); - fraction[ch][0][i] = (float) constants.muls[k0][x1]; - fraction[ch][1][i] = (float) constants.muls[k1][x1]; - fraction[ch][2][i] = (float) constants.muls[k2][x1]; - } - } - } - else - { - fraction[0][0][i] = fraction[0][1][i] = fraction[0][2][i] = 0; - fraction[1][0][i] = fraction[1][1][i] = fraction[1][2][i] = 0; - } - allocTable += (1 << step); - } - - for (int ch = 0; ch < frame.numChannels; ++ch) - for (int i = frame.layer2SubBandLimit; i < 32; ++i) - fraction[ch][0][i] = fraction[ch][1][i] = fraction[ch][2][i] = 0; - } - - void getLayer3SideInfo1 (const int stereo, const bool msStereo, const int sampleRate, const int single) noexcept - { - const int powdiff = (single == 3) ? 4 : 0; - sideinfo.mainDataStart = getBits (9); - sideinfo.privateBits = getBitsUnchecked (stereo == 1 ? 5 : 3); - - for (int ch = 0; ch < stereo; ++ch) - { - sideinfo.ch[ch].gr[0].scfsi = -1; - sideinfo.ch[ch].gr[1].scfsi = (int) getBitsUnchecked (4); - } - - for (int gr = 0; gr < 2; ++gr) - { - for (int ch = 0; ch < stereo; ++ch) - { - Layer3SideInfo::Info& granule = sideinfo.ch[ch].gr[gr]; - - granule.part2_3Length = getBits (12); - granule.bigValues = jmin (288u, getBitsUnchecked (9)); - - const int qss = (int) getBitsUnchecked (8); - granule.pow2gain = constants.powToGains + 256 - qss + powdiff; - - if (msStereo) - granule.pow2gain += 2; - - granule.scaleFactorCompression = getBitsUnchecked (4); - - if (getOneBit()) - { - granule.blockType = getBitsUnchecked (2); - granule.mixedBlockFlag = getOneBit(); - granule.tableSelect[0] = getBitsUnchecked (5); - granule.tableSelect[1] = getBitsUnchecked (5); - granule.tableSelect[2] = 0; - - for (int i = 0; i < 3; ++i) - { - const uint32 sbg = (getBitsUnchecked (3) << 3); - granule.fullGain[i] = granule.pow2gain + sbg; - } - - granule.region1Start = 36 >> 1; - granule.region2Start = 576 >> 1; - } - else - { - for (int i = 0; i < 3; ++i) - granule.tableSelect[i] = getBitsUnchecked (5); - - const int r0c = (int) getBitsUnchecked (4); - const int r1c = (int) getBitsUnchecked (3); - const int region0index = jmin (22, r0c + 1); - const int region1index = jmin (22, r0c + 1 + r1c + 1); - - granule.region1Start = (uint32) (bandInfo[sampleRate].longIndex[region0index] >> 1); - granule.region2Start = (uint32) (bandInfo[sampleRate].longIndex[region1index] >> 1); - granule.blockType = 0; - granule.mixedBlockFlag = 0; - } - - granule.preflag = getOneBit(); - granule.scaleFactorScale = getOneBit(); - granule.count1TableSelect = getOneBit(); - } - } - } - - void getLayer3SideInfo2 (const int stereo, const bool msStereo, const int sampleRate, const int single) noexcept - { - const int powdiff = (single == 3) ? 4 : 0; - sideinfo.mainDataStart = getBits (8); - sideinfo.privateBits = stereo == 1 ? getOneBit() : getBitsUnchecked (2); - - for (int ch = 0; ch < stereo; ++ch) - { - Layer3SideInfo::Info& granule = sideinfo.ch[ch].gr[0]; - - granule.part2_3Length = getBits (12); - granule.bigValues = jmin (288u, getBitsUnchecked (9)); - - const uint32 qss = getBitsUnchecked (8); - granule.pow2gain = constants.powToGains + 256 - qss + powdiff; - - if (msStereo) - granule.pow2gain += 2; - - granule.scaleFactorCompression = getBits (9); - - if (getOneBit()) - { - granule.blockType = getBitsUnchecked (2); - granule.mixedBlockFlag = getOneBit(); - granule.tableSelect[0] = getBitsUnchecked (5); - granule.tableSelect[1] = getBitsUnchecked (5); - granule.tableSelect[2] = 0; - - for (int i = 0; i < 3; ++i) - { - const uint32 sbg = (getBitsUnchecked (3) << 3); - granule.fullGain[i] = granule.pow2gain + sbg; - } - - if (granule.blockType == 0) - {} - - if (granule.blockType == 2) - granule.region1Start = sampleRate == 8 ? 36 : (36 >> 1); - else - granule.region1Start = sampleRate == 8 ? (108 >> 1) : (54 >> 1); - - granule.region2Start = 576 >> 1; - } - else - { - for (int i = 0; i < 3; ++i) - granule.tableSelect[i] = getBitsUnchecked (5); - - const int r0c = (int) getBitsUnchecked (4); - const int r1c = (int) getBitsUnchecked (3); - const int region0index = jmin (22, r0c + 1); - const int region1index = jmin (22, r0c + 1 + r1c + 1); - - granule.region1Start = (uint32) (bandInfo[sampleRate].longIndex[region0index] >> 1); - granule.region2Start = (uint32) (bandInfo[sampleRate].longIndex[region1index] >> 1); - granule.blockType = 0; - granule.mixedBlockFlag = 0; - } - granule.scaleFactorScale = getOneBit(); - granule.count1TableSelect = getOneBit(); - } - } - - int getLayer3ScaleFactors1 (int* scf, const Layer3SideInfo::Info& granule) noexcept - { - static const uint8 lengths[2][16] = - { - { 0, 0, 0, 0, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4 }, - { 0, 1, 2, 3, 0, 1, 2, 3, 1, 2, 3, 1, 2, 3, 2, 3 } - }; - - int numBits; - const int num0 = lengths[0][granule.scaleFactorCompression]; - const int num1 = lengths[1][granule.scaleFactorCompression]; - - if (granule.blockType == 2) - { - int i = 18; - numBits = (num0 + num1) * 18; - - if (granule.mixedBlockFlag) - { - for (int j = 8; --j >= 0;) *scf++ = (int) getBitsUnchecked (num0); - numBits -= num0; - i = 9; - } - - for (; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0); - for (i = 18; --i >= 0;) *scf++ = (int) getBitsUnchecked (num1); - - *scf++ = 0; - *scf++ = 0; - *scf++ = 0; - } - else - { - const int scfsi = granule.scfsi; - - if (scfsi < 0) - { - for (int i = 11; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0); - for (int j = 10; --j >= 0;) *scf++ = (int) getBitsUnchecked (num1); - numBits = (num0 + num1) * 10 + num0; - } - else - { - numBits = 0; - if ((scfsi & 8) == 0) - { - for (int i = 6; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0); - numBits += num0 * 6; - } - else - scf += 6; - - if ((scfsi & 4) == 0) - { - for (int i = 5; --i >= 0;) *scf++ = (int) getBitsUnchecked (num0); - numBits += num0 * 5; - } - else - scf += 5; - - if ((scfsi & 2) == 0) - { - for (int i = 5; --i >= 0;) *scf++ = (int) getBitsUnchecked (num1); - numBits += num1 * 5; - } - else - scf += 5; - - if ((scfsi & 1) == 0) - { - for (int i = 5; --i >= 0;) *scf++ = (int) getBitsUnchecked (num1); - numBits += num1 * 5; - } - else - scf += 5; - } - - *scf = 0; - } - - return numBits; - } - - int getLayer3ScaleFactors2 (int* scf, Layer3SideInfo::Info& granule, const bool iStereo) noexcept - { - static const uint8 scaleTable[3][6][4] = - { - { { 6, 5, 5, 5 }, { 6, 5, 7, 3 }, { 11, 10, 0, 0 }, { 7, 7, 7, 0 }, { 6, 6, 6, 3 }, { 8, 8, 5, 0 } }, - { { 9, 9, 9, 9 }, { 9, 9, 12, 6 }, { 18, 18, 0, 0 }, { 12, 12, 12, 0 }, { 12, 9, 9, 6 }, { 15, 12, 9, 0 } }, - { { 6, 9, 9, 9 }, { 6, 9, 12, 6 }, { 15, 18, 0, 0 }, { 6, 15, 12, 0 }, { 6, 12, 9, 6 }, { 6, 18, 9, 0 } } - }; - - uint32 len = iStereo ? constants.iLength2 [granule.scaleFactorCompression >> 1] - : constants.nLength2 [granule.scaleFactorCompression]; - - granule.preflag = (len >> 15) & 1; - - int n = 0; - if (granule.blockType == 2) - { - ++n; - if (granule.mixedBlockFlag) - ++n; - } - - const uint8* const data = scaleTable[n][(len >> 12) & 7]; - int i, numBits = 0; - - for (i = 0; i < 4; ++i) - { - int num = len & 7; - len >>= 3; - - if (num) - { - for (int j = 0; j < (int) (data[i]); ++j) - *scf++ = (int) getBitsUnchecked (num); - - numBits += data[i] * num; - } - else - { - for (int j = 0; j < (int) (data[i]); ++j) - *scf++ = 0; - } - } - - n = (n << 1) + 1; - for (i = 0; i < n; ++i) - *scf++ = 0; - - return numBits; - } - - bool layer3DequantizeSample (float xr[32][18], int* scf, Layer3SideInfo::Info& granule, int sampleRate, int part2bits) noexcept - { - const uint32 shift = 1 + granule.scaleFactorScale; - float* xrpnt = (float*) xr; - int part2remain = (int) granule.part2_3Length - part2bits; - - zeromem (xrpnt, sizeof (float) * (size_t) (&xr[32][0] - xrpnt)); - - const int bv = (int) granule.bigValues; - const int region1 = (int) granule.region1Start; - const int region2 = (int) granule.region2Start; - int l3 = ((576 >> 1) - bv) >> 1; - int l[3]; - - if (bv <= region1) - { - l[0] = bv; - l[1] = 0; - l[2] = 0; - } - else - { - l[0] = region1; - if (bv <= region2) - { - l[1] = bv - l[0]; - l[2] = 0; - } - else - { - l[1] = region2 - l[0]; - l[2] = bv - region2; - } - } - - for (int i = 0; i < 3; ++i) - if (l[i] < 0) - l[i] = 0; - - if (granule.blockType == 2) - { - int max[4]; - int step = 0, lwin = 0, cb = 0, mc = 0; - float v = 0; - int* map; - int* mapEnd; - - if (granule.mixedBlockFlag) - { - max[3] = -1; - max[0] = max[1] = max[2] = 2; - map = constants.map [sampleRate][0]; - mapEnd = constants.mapEnd [sampleRate][0]; - } - else - { - max[0] = max[1] = max[2] = max[3] = -1; - map = constants.map [sampleRate][1]; - mapEnd = constants.mapEnd [sampleRate][1]; - } - - for (int i = 0; i < 2; ++i) - { - const BitsToTableMap* h = huffmanTables1 + granule.tableSelect[i]; - - for (int lp = l[i]; lp != 0; --lp, --mc) - { - int x, y; - if (mc == 0) - { - mc = *map++; - xrpnt = ((float*) xr) + (*map++); - lwin = *map++; - cb = *map++; - - if (lwin == 3) - { - v = granule.pow2gain[ (*scf++) << shift]; - step = 1; - } - else - { - v = granule.fullGain[lwin][ (*scf++) << shift]; - step = 3; - } - } - - const int16* val = h->table; - - while ((y = *val++) < 0) - { - if (getOneBit()) - val -= y; - - --part2remain; - } - - x = y >> 4; - y &= 15; - - if (x == 15) - { - max[lwin] = cb; - part2remain -= h->bits + 1; - x += getBits ((int) h->bits); - *xrpnt = constants.nToThe4Over3[x] * (getOneBit() ? -v : v); - } - else if (x) - { - max[lwin] = cb; - *xrpnt = constants.nToThe4Over3[x] * (getOneBit() ? -v : v); - --part2remain; - } - else - *xrpnt = 0; - - xrpnt += step; - - if (y == 15) - { - max[lwin] = cb; - part2remain -= h->bits + 1; - y += getBits ((int) h->bits); - *xrpnt = constants.nToThe4Over3[y] * (getOneBit() ? -v : v); - } - else if (y) - { - max[lwin] = cb; - *xrpnt = constants.nToThe4Over3[y] * (getOneBit() ? -v : v); - --part2remain; - } - else - *xrpnt = 0; - - xrpnt += step; - } - } - - for (; l3 && (part2remain > 0); --l3) - { - const BitsToTableMap* h = huffmanTables2 + granule.count1TableSelect; - const int16* val = h->table; - int16 a; - - while ((a = *val++) < 0) - { - if (part2remain <= 0) - { - a = 0; - break; - } - - --part2remain; - if (getOneBit()) - val -= a; - } - - for (int i = 0; i < 4; ++i) - { - if ((i & 1) == 0) - { - if (mc == 0) - { - mc = *map++; - xrpnt = ((float*) xr) + (*map++); - lwin = *map++; - cb = *map++; - - if (lwin == 3) - { - v = granule.pow2gain[ (*scf++) << shift]; - step = 1; - } - else - { - v = granule.fullGain[lwin][ (*scf++) << shift]; - step = 3; - } - } - - --mc; - } - - if ((a & (8 >> i))) - { - max[lwin] = cb; - if (part2remain == 0) - break; - - --part2remain; - *xrpnt = getOneBit() ? -v : v; - } - else - *xrpnt = 0; - - xrpnt += step; - } - } - - while (map < mapEnd) - { - if (mc == 0) - { - mc = *map++; - xrpnt = ((float*) xr) + *map++; - step = (*map++ == 3) ? 1 : 3; - ++map; - } - - --mc; - *xrpnt = 0; xrpnt += step; - *xrpnt = 0; xrpnt += step; - } - - granule.maxBand[0] = (uint32) (max[0] + 1); - granule.maxBand[1] = (uint32) (max[1] + 1); - granule.maxBand[2] = (uint32) (max[2] + 1); - granule.maxBandl = (uint32) (max[3] + 1); - - const int rmax = jmax (max[0], max[1], max[3]) + 1; - granule.maxb = rmax ? (uint32) constants.shortLimit[sampleRate][rmax] - : (uint32) constants.longLimit[sampleRate][max[3] + 1]; - } - else - { - static const int pretab1[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0 }; - static const int pretab2[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; - - const int* pretab = (const int*) (granule.preflag ? pretab1 : pretab2); - int max = -1, cb = 0, mc = 0; - int* map = constants.map [sampleRate][2]; - float v = 0; - - for (int i = 0; i < 3; ++i) - { - const BitsToTableMap* h = huffmanTables1 + granule.tableSelect[i]; - - for (int lp = l[i]; lp != 0; --lp, --mc) - { - if (mc == 0) - { - mc = *map++; - v = granule.pow2gain [((*scf++) + (*pretab++)) << shift]; - cb = *map++; - } - - const int16* val = h->table; - int y; - - while ((y = *val++) < 0) - { - if (getOneBit()) val -= y; - --part2remain; - } - - int x = y >> 4; - y &= 15; - - if (x == 15) - { - max = cb; - part2remain -= h->bits + 1; - x += getBits ((int) h->bits); - *xrpnt++ = constants.nToThe4Over3[x] * (getOneBit() ? -v : v); - } - else if (x) - { - max = cb; - *xrpnt++ = constants.nToThe4Over3[x] * (getOneBit() ? -v : v); - --part2remain; - } - else - *xrpnt++ = 0; - - if (y == 15) - { - max = cb; - part2remain -= h->bits + 1; - y += getBits ((int) h->bits); - *xrpnt++ = constants.nToThe4Over3[y] * (getOneBit() ? -v : v); - } - else if (y) - { - max = cb; - *xrpnt++ = constants.nToThe4Over3[y] * (getOneBit() ? -v : v); - --part2remain; - } - else - *xrpnt++ = 0; - } - } - - for (; l3 && part2remain > 0; --l3) - { - const BitsToTableMap* h = huffmanTables2 + granule.count1TableSelect; - const int16* values = h->table; - int16 a; - - while ((a = *values++) < 0) - { - if (part2remain <= 0) - { - a = 0; - break; - } - - --part2remain; - if (getOneBit()) - values -= a; - } - - for (int i = 0; i < 4; ++i) - { - if ((i & 1) == 0) - { - if (mc == 0) - { - mc = *map++; - cb = *map++; - v = granule.pow2gain [((*scf++) + (*pretab++)) << shift]; - } - --mc; - } - - if ((a & (0x8 >> i))) - { - max = cb; - - if (part2remain <= 0) - break; - - --part2remain; - *xrpnt++ = getOneBit() ? -v : v; - } - else - *xrpnt++ = 0; - } - } - - zeromem (xrpnt, sizeof (float) * (size_t) (&xr[32][0] - xrpnt)); - - granule.maxBandl = (uint32) (max + 1); - granule.maxb = (uint32) constants.longLimit[sampleRate][granule.maxBandl]; - } - - while (part2remain > 16) - { - getBits (16); - part2remain -= 16; - } - - if (part2remain > 0) - getBits (part2remain); - else if (part2remain < 0) - return true; - - return false; - } - - void layer3Hybrid (float fsIn[32][18], float tsOut[18][32], int ch, const Layer3SideInfo::Info& granule) noexcept - { - float* ts = (float*) tsOut; - float* rawout1, *rawout2; - int sb = 0; - - { - int b = hybridBlockIndex[ch]; - rawout1 = hybridBlock[b][ch]; - b = 1 - b; - rawout2 = hybridBlock[b][ch]; - hybridBlockIndex[ch] = b; - } - - if (granule.mixedBlockFlag) - { - sb = 2; - DCT::dct36 (fsIn[0], rawout1, rawout2, constants.win[0], ts); - DCT::dct36 (fsIn[1], rawout1 + 18, rawout2 + 18, constants.win1[0], ts + 1); - rawout1 += 36; - rawout2 += 36; - ts += 2; - } - - const uint32 bt = granule.blockType; - if (bt == 2) - { - for (; sb < (int) granule.maxb; sb += 2, ts += 2, rawout1 += 36, rawout2 += 36) - { - DCT::dct12 (fsIn[sb], rawout1, rawout2, constants.win[2], ts); - DCT::dct12 (fsIn[sb + 1], rawout1 + 18, rawout2 + 18, constants.win1[2], ts + 1); - } - } - else - { - for (; sb < (int) granule.maxb; sb += 2, ts += 2, rawout1 += 36, rawout2 += 36) - { - DCT::dct36 (fsIn[sb], rawout1, rawout2, constants.win[bt], ts); - DCT::dct36 (fsIn[sb + 1], rawout1 + 18, rawout2 + 18, constants.win1[bt], ts + 1); - } - } - - for (; sb < 32; ++sb, ++ts) - { - for (int i = 0; i < 18; ++i) - { - ts[i * 32] = *rawout1++; - *rawout2++ = 0; - } - } - } - - void synthesiseStereo (const float* bandPtr0, const float* bandPtr1, float* out0, float* out1, int& samplesDone) noexcept - { - int dummy = samplesDone; - synthesise (bandPtr0, 0, out0, dummy); - synthesise (bandPtr1, 1, out1, samplesDone); - } - - void synthesise (const float* bandPtr, const int channel, float* out, int& samplesDone) - { - out += samplesDone; - const int bo = channel == 0 ? ((synthBo - 1) & 15) : synthBo; - float (*buf)[0x110] = synthBuffers[channel]; - float* b0; - int j, bo1 = bo; - - if (bo & 1) - { - b0 = buf[0]; - DCT::dct64 (buf[1] + ((bo + 1) & 15), buf[0] + bo, bandPtr); - } - else - { - ++bo1; - b0 = buf[1]; - DCT::dct64 (buf[0] + bo, buf[1] + bo1, bandPtr); - } - - synthBo = bo; - const float* window = constants.decodeWin + 16 - bo1; - - for (j = 16; j != 0; --j, b0 += 16, window += 32) - { - float sum = window[0] * b0[0]; sum -= window[1] * b0[1]; - sum += window[2] * b0[2]; sum -= window[3] * b0[3]; - sum += window[4] * b0[4]; sum -= window[5] * b0[5]; - sum += window[6] * b0[6]; sum -= window[7] * b0[7]; - sum += window[8] * b0[8]; sum -= window[9] * b0[9]; - sum += window[10] * b0[10]; sum -= window[11] * b0[11]; - sum += window[12] * b0[12]; sum -= window[13] * b0[13]; - sum += window[14] * b0[14]; sum -= window[15] * b0[15]; - *out++ = sum; - } - - { - float sum = window[0] * b0[0]; sum += window[2] * b0[2]; - sum += window[4] * b0[4]; sum += window[6] * b0[6]; - sum += window[8] * b0[8]; sum += window[10] * b0[10]; - sum += window[12] * b0[12]; sum += window[14] * b0[14]; - *out++ = sum; - b0 -= 16; window -= 32; - window += bo1 << 1; - } - - for (j = 15; j != 0; --j, b0 -= 16, window -= 32) - { - float sum = -window[-1] * b0[0]; sum -= window[-2] * b0[1]; - sum -= window[-3] * b0[2]; sum -= window[-4] * b0[3]; - sum -= window[-5] * b0[4]; sum -= window[-6] * b0[5]; - sum -= window[-7] * b0[6]; sum -= window[-8] * b0[7]; - sum -= window[-9] * b0[8]; sum -= window[-10] * b0[9]; - sum -= window[-11] * b0[10]; sum -= window[-12] * b0[11]; - sum -= window[-13] * b0[12]; sum -= window[-14] * b0[13]; - sum -= window[-15] * b0[14]; sum -= window[0] * b0[15]; - *out++ = sum; - } - - samplesDone += 32; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MP3Stream) -}; - -//============================================================================== -static const char* const mp3FormatName = "MP3 file"; - -//============================================================================== -class MP3Reader : public AudioFormatReader -{ -public: - MP3Reader (InputStream* const in) - : AudioFormatReader (in, mp3FormatName), - stream (*in), currentPosition (0), - decodedStart (0), decodedEnd (0) - { - skipID3(); - const int64 streamPos = stream.stream.getPosition(); - - if (readNextBlock()) - { - bitsPerSample = 32; - usesFloatingPointData = true; - sampleRate = stream.frame.getFrequency(); - numChannels = (unsigned int) stream.frame.numChannels; - lengthInSamples = findLength (streamPos); - } - } - - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override - { - jassert (destSamples != nullptr); - - if (currentPosition != startSampleInFile) - { - if (! stream.seek ((int) (startSampleInFile / 1152 - 1))) - { - currentPosition = -1; - createEmptyDecodedData(); - } - else - { - decodedStart = decodedEnd = 0; - const int64 streamPos = stream.currentFrameIndex * 1152; - int toSkip = (int) (startSampleInFile - streamPos); - jassert (toSkip >= 0); - - while (toSkip > 0) - { - if (! readNextBlock()) - { - createEmptyDecodedData(); - break; - } - - const int numReady = decodedEnd - decodedStart; - - if (numReady > toSkip) - { - decodedStart += toSkip; - break; - } - - toSkip -= numReady; - } - - currentPosition = startSampleInFile; - } - } - - while (numSamples > 0) - { - if (decodedEnd <= decodedStart && ! readNextBlock()) - { - for (int i = numDestChannels; --i >= 0;) - if (destSamples[i] != nullptr) - zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (float) * (size_t) numSamples); - - return false; - } - - const int numToCopy = jmin (decodedEnd - decodedStart, numSamples); - float* const* const dst = reinterpret_cast (destSamples); - memcpy (dst[0] + startOffsetInDestBuffer, decoded0 + decodedStart, sizeof (float) * (size_t) numToCopy); - - if (numDestChannels > 1 && dst[1] != nullptr) - memcpy (dst[1] + startOffsetInDestBuffer, (numChannels < 2 ? decoded0 : decoded1) + decodedStart, sizeof (float) * (size_t) numToCopy); - - startOffsetInDestBuffer += numToCopy; - decodedStart += numToCopy; - currentPosition += numToCopy; - numSamples -= numToCopy; - } - - return true; - } - -private: - MP3Stream stream; - int64 currentPosition; - enum { decodedDataSize = 1152 }; - float decoded0 [decodedDataSize], decoded1 [decodedDataSize]; - int decodedStart, decodedEnd; - - void createEmptyDecodedData() noexcept - { - zeromem (decoded0, sizeof (decoded0)); - zeromem (decoded1, sizeof (decoded1)); - decodedStart = 0; - decodedEnd = decodedDataSize; - } - - bool readNextBlock() - { - for (int attempts = 10; --attempts >= 0;) - { - int samplesDone = 0; - const int result = stream.decodeNextBlock (decoded0, decoded1, samplesDone); - - if (result > 0 && stream.stream.isExhausted()) - { - createEmptyDecodedData(); - return true; - } - - if (result <= 0) - { - decodedStart = 0; - decodedEnd = samplesDone; - return result == 0; - } - } - - return false; - } - - void skipID3() - { - const int64 originalPosition = stream.stream.getPosition(); - const uint32 firstWord = (uint32) stream.stream.readInt(); - - if ((firstWord & 0xffffff) == 0x334449) - { - uint8 buffer[6]; - - if (stream.stream.read (buffer, 6) == 6 - && buffer[0] != 0xff - && ((buffer[2] | buffer[3] | buffer[4] | buffer[5]) & 0x80) == 0) - { - const uint32 length = (((uint32) buffer[2]) << 21) - | (((uint32) buffer[3]) << 14) - | (((uint32) buffer[4]) << 7) - | ((uint32) buffer[5]); - - stream.stream.skipNextBytes (length); - return; - } - } - - stream.stream.setPosition (originalPosition); - } - - int64 findLength (int64 streamStartPos) - { - int64 numFrames = stream.numFrames; - - if (numFrames <= 0) - { - const int64 streamSize = stream.stream.getTotalLength(); - - if (streamSize > 0) - { - const int bytesPerFrame = stream.frame.frameSize + 4; - - if (bytesPerFrame == 417 || bytesPerFrame == 418) - numFrames = roundToInt ((streamSize - streamStartPos) / 417.95918); // more accurate for 128k - else - numFrames = (streamSize - streamStartPos) / bytesPerFrame; - } - } - - return numFrames * 1152; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MP3Reader) -}; - -} - -//============================================================================== -MP3AudioFormat::MP3AudioFormat() : AudioFormat (MP3Decoder::mp3FormatName, ".mp3") {} -MP3AudioFormat::~MP3AudioFormat() {} - -Array MP3AudioFormat::getPossibleSampleRates() { return Array(); } -Array MP3AudioFormat::getPossibleBitDepths() { return Array(); } -bool MP3AudioFormat::canDoStereo() { return true; } -bool MP3AudioFormat::canDoMono() { return true; } -bool MP3AudioFormat::isCompressed() { return true; } -StringArray MP3AudioFormat::getQualityOptions() { return StringArray(); } - -AudioFormatReader* MP3AudioFormat::createReaderFor (InputStream* sourceStream, const bool deleteStreamIfOpeningFails) -{ - ScopedPointer r (new MP3Decoder::MP3Reader (sourceStream)); - - if (r->lengthInSamples > 0) - return r.release(); - - if (! deleteStreamIfOpeningFails) - r->input = nullptr; - - return nullptr; -} - -AudioFormatWriter* MP3AudioFormat::createWriterFor (OutputStream*, double /*sampleRateToUse*/, - unsigned int /*numberOfChannels*/, int /*bitsPerSample*/, - const StringPairArray& /*metadataValues*/, int /*qualityOptionIndex*/) -{ - return nullptr; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h deleted file mode 100755 index e89c05d..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_MP3AudioFormat.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_USE_MP3AUDIOFORMAT || DOXYGEN - -//============================================================================== -/** - Software-based MP3 decoding format (doesn't currently provide an encoder). - - IMPORTANT DISCLAIMER: By choosing to enable the JUCE_USE_MP3AUDIOFORMAT flag and - to compile the MP3 code into your software, you do so AT YOUR OWN RISK! By doing so, - you are agreeing that Raw Material Software is in no way responsible for any patent, - copyright, or other legal issues that you may suffer as a result. - - The code in juce_MP3AudioFormat.cpp is NOT guaranteed to be free from infringements of 3rd-party - intellectual property. If you wish to use it, please seek your own independent advice about the - legality of doing so. If you are not willing to accept full responsibility for the consequences - of using this code, then do not enable the JUCE_USE_MP3AUDIOFORMAT setting. -*/ -class MP3AudioFormat : public AudioFormat -{ -public: - //============================================================================== - MP3AudioFormat(); - ~MP3AudioFormat(); - - //============================================================================== - Array getPossibleSampleRates() override; - Array getPossibleBitDepths() override; - bool canDoStereo() override; - bool canDoMono() override; - bool isCompressed() override; - StringArray getQualityOptions() override; - - //============================================================================== - AudioFormatReader* createReaderFor (InputStream*, bool deleteStreamIfOpeningFails) override; - - AudioFormatWriter* createWriterFor (OutputStream*, double sampleRateToUse, - unsigned int numberOfChannels, int bitsPerSample, - const StringPairArray& metadataValues, int qualityOptionIndex) override; -}; - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp deleted file mode 100755 index 7cc12a4..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp +++ /dev/null @@ -1,532 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_USE_OGGVORBIS - -#if JUCE_MAC && ! defined (__MACOSX__) - #define __MACOSX__ 1 -#endif - -namespace OggVorbisNamespace -{ -#if JUCE_INCLUDE_OGGVORBIS_CODE || ! defined (JUCE_INCLUDE_OGGVORBIS_CODE) - #if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4267 4127 4244 4996 4100 4701 4702 4013 4133 4206 4305 4189 4706 4995 4365) - #endif - - #if JUCE_CLANG - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Wshadow" - #pragma clang diagnostic ignored "-Wdeprecated-register" - #endif - - #include "oggvorbis/vorbisenc.h" - #include "oggvorbis/codec.h" - #include "oggvorbis/vorbisfile.h" - - #include "oggvorbis/bitwise.c" - #include "oggvorbis/framing.c" - #include "oggvorbis/libvorbis-1.3.2/lib/analysis.c" - #include "oggvorbis/libvorbis-1.3.2/lib/bitrate.c" - #include "oggvorbis/libvorbis-1.3.2/lib/block.c" - #include "oggvorbis/libvorbis-1.3.2/lib/codebook.c" - #include "oggvorbis/libvorbis-1.3.2/lib/envelope.c" - #include "oggvorbis/libvorbis-1.3.2/lib/floor0.c" - #include "oggvorbis/libvorbis-1.3.2/lib/floor1.c" - #include "oggvorbis/libvorbis-1.3.2/lib/info.c" - #include "oggvorbis/libvorbis-1.3.2/lib/lpc.c" - #include "oggvorbis/libvorbis-1.3.2/lib/lsp.c" - #include "oggvorbis/libvorbis-1.3.2/lib/mapping0.c" - #include "oggvorbis/libvorbis-1.3.2/lib/mdct.c" - #include "oggvorbis/libvorbis-1.3.2/lib/psy.c" - #include "oggvorbis/libvorbis-1.3.2/lib/registry.c" - #include "oggvorbis/libvorbis-1.3.2/lib/res0.c" - #include "oggvorbis/libvorbis-1.3.2/lib/sharedbook.c" - #include "oggvorbis/libvorbis-1.3.2/lib/smallft.c" - #include "oggvorbis/libvorbis-1.3.2/lib/synthesis.c" - #include "oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c" - #include "oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c" - #include "oggvorbis/libvorbis-1.3.2/lib/window.c" - - #if JUCE_MSVC - #pragma warning (pop) - #endif - - #if JUCE_CLANG - #pragma clang diagnostic pop - #endif -#else - #include - #include - #include -#endif -} - -#undef max -#undef min - -//============================================================================== -static const char* const oggFormatName = "Ogg-Vorbis file"; - -const char* const OggVorbisAudioFormat::encoderName = "encoder"; -const char* const OggVorbisAudioFormat::id3title = "id3title"; -const char* const OggVorbisAudioFormat::id3artist = "id3artist"; -const char* const OggVorbisAudioFormat::id3album = "id3album"; -const char* const OggVorbisAudioFormat::id3comment = "id3comment"; -const char* const OggVorbisAudioFormat::id3date = "id3date"; -const char* const OggVorbisAudioFormat::id3genre = "id3genre"; -const char* const OggVorbisAudioFormat::id3trackNumber = "id3trackNumber"; - - -//============================================================================== -class OggReader : public AudioFormatReader -{ -public: - OggReader (InputStream* const inp) - : AudioFormatReader (inp, oggFormatName), - reservoirStart (0), - samplesInReservoir (0) - { - using namespace OggVorbisNamespace; - sampleRate = 0; - usesFloatingPointData = true; - - callbacks.read_func = &oggReadCallback; - callbacks.seek_func = &oggSeekCallback; - callbacks.close_func = &oggCloseCallback; - callbacks.tell_func = &oggTellCallback; - - const int err = ov_open_callbacks (input, &ovFile, 0, 0, callbacks); - - if (err == 0) - { - vorbis_info* info = ov_info (&ovFile, -1); - - vorbis_comment* const comment = ov_comment (&ovFile, -1); - addMetadataItem (comment, "ENCODER", OggVorbisAudioFormat::encoderName); - addMetadataItem (comment, "TITLE", OggVorbisAudioFormat::id3title); - addMetadataItem (comment, "ARTIST", OggVorbisAudioFormat::id3artist); - addMetadataItem (comment, "ALBUM", OggVorbisAudioFormat::id3album); - addMetadataItem (comment, "COMMENT", OggVorbisAudioFormat::id3comment); - addMetadataItem (comment, "DATE", OggVorbisAudioFormat::id3date); - addMetadataItem (comment, "GENRE", OggVorbisAudioFormat::id3genre); - addMetadataItem (comment, "TRACKNUMBER", OggVorbisAudioFormat::id3trackNumber); - - lengthInSamples = (uint32) ov_pcm_total (&ovFile, -1); - numChannels = (unsigned int) info->channels; - bitsPerSample = 16; - sampleRate = info->rate; - - reservoir.setSize ((int) numChannels, (int) jmin (lengthInSamples, (int64) 4096)); - } - } - - ~OggReader() - { - OggVorbisNamespace::ov_clear (&ovFile); - } - - void addMetadataItem (OggVorbisNamespace::vorbis_comment* comment, const char* name, const char* metadataName) - { - if (const char* value = vorbis_comment_query (comment, name, 0)) - metadataValues.set (metadataName, value); - } - - //============================================================================== - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override - { - while (numSamples > 0) - { - const int numAvailable = (int) (reservoirStart + samplesInReservoir - startSampleInFile); - - if (startSampleInFile >= reservoirStart && numAvailable > 0) - { - // got a few samples overlapping, so use them before seeking.. - - const int numToUse = jmin (numSamples, numAvailable); - - for (int i = jmin (numDestChannels, reservoir.getNumChannels()); --i >= 0;) - if (destSamples[i] != nullptr) - memcpy (destSamples[i] + startOffsetInDestBuffer, - reservoir.getReadPointer (i, (int) (startSampleInFile - reservoirStart)), - sizeof (float) * (size_t) numToUse); - - startSampleInFile += numToUse; - numSamples -= numToUse; - startOffsetInDestBuffer += numToUse; - - if (numSamples == 0) - break; - } - - if (startSampleInFile < reservoirStart - || startSampleInFile + numSamples > reservoirStart + samplesInReservoir) - { - // buffer miss, so refill the reservoir - int bitStream = 0; - - reservoirStart = jmax (0, (int) startSampleInFile); - samplesInReservoir = reservoir.getNumSamples(); - - if (reservoirStart != (int) OggVorbisNamespace::ov_pcm_tell (&ovFile)) - OggVorbisNamespace::ov_pcm_seek (&ovFile, reservoirStart); - - int offset = 0; - int numToRead = samplesInReservoir; - - while (numToRead > 0) - { - float** dataIn = nullptr; - - const long samps = OggVorbisNamespace::ov_read_float (&ovFile, &dataIn, numToRead, &bitStream); - if (samps <= 0) - break; - - jassert (samps <= numToRead); - - for (int i = jmin ((int) numChannels, reservoir.getNumChannels()); --i >= 0;) - memcpy (reservoir.getWritePointer (i, offset), dataIn[i], sizeof (float) * (size_t) samps); - - numToRead -= samps; - offset += samps; - } - - if (numToRead > 0) - reservoir.clear (offset, numToRead); - } - } - - if (numSamples > 0) - { - for (int i = numDestChannels; --i >= 0;) - if (destSamples[i] != nullptr) - zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * (size_t) numSamples); - } - - return true; - } - - //============================================================================== - static size_t oggReadCallback (void* ptr, size_t size, size_t nmemb, void* datasource) - { - return (size_t) (static_cast (datasource)->read (ptr, (int) (size * nmemb))) / size; - } - - static int oggSeekCallback (void* datasource, OggVorbisNamespace::ogg_int64_t offset, int whence) - { - InputStream* const in = static_cast (datasource); - - if (whence == SEEK_CUR) - offset += in->getPosition(); - else if (whence == SEEK_END) - offset += in->getTotalLength(); - - in->setPosition (offset); - return 0; - } - - static int oggCloseCallback (void*) - { - return 0; - } - - static long oggTellCallback (void* datasource) - { - return (long) static_cast (datasource)->getPosition(); - } - -private: - OggVorbisNamespace::OggVorbis_File ovFile; - OggVorbisNamespace::ov_callbacks callbacks; - AudioSampleBuffer reservoir; - int reservoirStart, samplesInReservoir; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OggReader) -}; - -//============================================================================== -class OggWriter : public AudioFormatWriter -{ -public: - OggWriter (OutputStream* const out, - const double sampleRate_, - const unsigned int numChannels_, - const unsigned int bitsPerSample_, - const int qualityIndex, - const StringPairArray& metadata) - : AudioFormatWriter (out, oggFormatName, sampleRate_, numChannels_, bitsPerSample_), - ok (false) - { - using namespace OggVorbisNamespace; - - vorbis_info_init (&vi); - - if (vorbis_encode_init_vbr (&vi, (int) numChannels_, (int) sampleRate_, - jlimit (0.0f, 1.0f, qualityIndex * 0.1f)) == 0) - { - vorbis_comment_init (&vc); - - addMetadata (metadata, OggVorbisAudioFormat::encoderName, "ENCODER"); - addMetadata (metadata, OggVorbisAudioFormat::id3title, "TITLE"); - addMetadata (metadata, OggVorbisAudioFormat::id3artist, "ARTIST"); - addMetadata (metadata, OggVorbisAudioFormat::id3album, "ALBUM"); - addMetadata (metadata, OggVorbisAudioFormat::id3comment, "COMMENT"); - addMetadata (metadata, OggVorbisAudioFormat::id3date, "DATE"); - addMetadata (metadata, OggVorbisAudioFormat::id3genre, "GENRE"); - addMetadata (metadata, OggVorbisAudioFormat::id3trackNumber, "TRACKNUMBER"); - - vorbis_analysis_init (&vd, &vi); - vorbis_block_init (&vd, &vb); - - ogg_stream_init (&os, Random::getSystemRandom().nextInt()); - - ogg_packet header; - ogg_packet header_comm; - ogg_packet header_code; - - vorbis_analysis_headerout (&vd, &vc, &header, &header_comm, &header_code); - - ogg_stream_packetin (&os, &header); - ogg_stream_packetin (&os, &header_comm); - ogg_stream_packetin (&os, &header_code); - - for (;;) - { - if (ogg_stream_flush (&os, &og) == 0) - break; - - output->write (og.header, (size_t) og.header_len); - output->write (og.body, (size_t) og.body_len); - } - - ok = true; - } - } - - ~OggWriter() - { - using namespace OggVorbisNamespace; - if (ok) - { - // write a zero-length packet to show ogg that we're finished.. - writeSamples (0); - - ogg_stream_clear (&os); - vorbis_block_clear (&vb); - vorbis_dsp_clear (&vd); - vorbis_comment_clear (&vc); - - vorbis_info_clear (&vi); - output->flush(); - } - else - { - vorbis_info_clear (&vi); - output = nullptr; // to stop the base class deleting this, as it needs to be returned - // to the caller of createWriter() - } - } - - //============================================================================== - bool write (const int** samplesToWrite, int numSamples) override - { - if (ok) - { - using namespace OggVorbisNamespace; - - if (numSamples > 0) - { - const double gain = 1.0 / 0x80000000u; - float** const vorbisBuffer = vorbis_analysis_buffer (&vd, numSamples); - - for (int i = (int) numChannels; --i >= 0;) - { - float* const dst = vorbisBuffer[i]; - const int* const src = samplesToWrite [i]; - - if (src != nullptr && dst != nullptr) - { - for (int j = 0; j < numSamples; ++j) - dst[j] = (float) (src[j] * gain); - } - } - } - - writeSamples (numSamples); - } - - return ok; - } - - void writeSamples (int numSamples) - { - using namespace OggVorbisNamespace; - - vorbis_analysis_wrote (&vd, numSamples); - - while (vorbis_analysis_blockout (&vd, &vb) == 1) - { - vorbis_analysis (&vb, 0); - vorbis_bitrate_addblock (&vb); - - while (vorbis_bitrate_flushpacket (&vd, &op)) - { - ogg_stream_packetin (&os, &op); - - for (;;) - { - if (ogg_stream_pageout (&os, &og) == 0) - break; - - output->write (og.header, (size_t) og.header_len); - output->write (og.body, (size_t) og.body_len); - - if (ogg_page_eos (&og)) - break; - } - } - } - } - - bool ok; - -private: - OggVorbisNamespace::ogg_stream_state os; - OggVorbisNamespace::ogg_page og; - OggVorbisNamespace::ogg_packet op; - OggVorbisNamespace::vorbis_info vi; - OggVorbisNamespace::vorbis_comment vc; - OggVorbisNamespace::vorbis_dsp_state vd; - OggVorbisNamespace::vorbis_block vb; - - void addMetadata (const StringPairArray& metadata, const char* name, const char* vorbisName) - { - const String s (metadata [name]); - - if (s.isNotEmpty()) - vorbis_comment_add_tag (&vc, vorbisName, const_cast (s.toRawUTF8())); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OggWriter) -}; - - -//============================================================================== -OggVorbisAudioFormat::OggVorbisAudioFormat() : AudioFormat (oggFormatName, ".ogg") -{ -} - -OggVorbisAudioFormat::~OggVorbisAudioFormat() -{ -} - -Array OggVorbisAudioFormat::getPossibleSampleRates() -{ - const int rates[] = { 8000, 11025, 12000, 16000, 22050, 32000, - 44100, 48000, 88200, 96000, 176400, 192000 }; - - return Array (rates, numElementsInArray (rates)); -} - -Array OggVorbisAudioFormat::getPossibleBitDepths() -{ - const int depths[] = { 32 }; - - return Array (depths, numElementsInArray (depths)); -} - -bool OggVorbisAudioFormat::canDoStereo() { return true; } -bool OggVorbisAudioFormat::canDoMono() { return true; } -bool OggVorbisAudioFormat::isCompressed() { return true; } - -AudioFormatReader* OggVorbisAudioFormat::createReaderFor (InputStream* in, const bool deleteStreamIfOpeningFails) -{ - ScopedPointer r (new OggReader (in)); - - if (r->sampleRate > 0) - return r.release(); - - if (! deleteStreamIfOpeningFails) - r->input = nullptr; - - return nullptr; -} - -AudioFormatWriter* OggVorbisAudioFormat::createWriterFor (OutputStream* out, - double sampleRate, - unsigned int numChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) -{ - ScopedPointer w (new OggWriter (out, sampleRate, numChannels, - (unsigned int) bitsPerSample, qualityOptionIndex, metadataValues)); - - return w->ok ? w.release() : nullptr; -} - -StringArray OggVorbisAudioFormat::getQualityOptions() -{ - static const char* options[] = { "64 kbps", "80 kbps", "96 kbps", "112 kbps", "128 kbps", "160 kbps", - "192 kbps", "224 kbps", "256 kbps", "320 kbps", "500 kbps", 0 }; - return StringArray (options); -} - -int OggVorbisAudioFormat::estimateOggFileQuality (const File& source) -{ - if (FileInputStream* const in = source.createInputStream()) - { - ScopedPointer r (createReaderFor (in, true)); - - if (r != nullptr) - { - const double lengthSecs = r->lengthInSamples / r->sampleRate; - const int approxBitsPerSecond = (int) (source.getSize() * 8 / lengthSecs); - - const StringArray qualities (getQualityOptions()); - int bestIndex = 0; - int bestDiff = 10000; - - for (int i = qualities.size(); --i >= 0;) - { - const int diff = std::abs (qualities[i].getIntValue() - approxBitsPerSecond); - - if (diff < bestDiff) - { - bestDiff = diff; - bestIndex = i; - } - } - - return bestIndex; - } - } - - return 0; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h deleted file mode 100755 index 03bc3fb..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_USE_OGGVORBIS || defined (DOXYGEN) - -//============================================================================== -/** - Reads and writes the Ogg-Vorbis audio format. - - To compile this, you'll need to set the JUCE_USE_OGGVORBIS flag. - - @see AudioFormat, -*/ -class JUCE_API OggVorbisAudioFormat : public AudioFormat -{ -public: - //============================================================================== - OggVorbisAudioFormat(); - ~OggVorbisAudioFormat(); - - //============================================================================== - Array getPossibleSampleRates() override; - Array getPossibleBitDepths() override; - bool canDoStereo() override; - bool canDoMono() override; - bool isCompressed() override; - StringArray getQualityOptions() override; - - //============================================================================== - /** Tries to estimate the quality level of an ogg file based on its size. - - If it can't read the file for some reason, this will just return 1 (medium quality), - otherwise it will return the approximate quality setting that would have been used - to create the file. - - @see getQualityOptions - */ - int estimateOggFileQuality (const File& source); - - //============================================================================== - /** Metadata property name used by the Ogg writer - if you set a string for this - value, it will be written into the ogg file as the name of the encoder app. - - @see createWriterFor - */ - static const char* const encoderName; - - static const char* const id3title; /**< Metadata key for setting an ID3 title. */ - static const char* const id3artist; /**< Metadata key for setting an ID3 artist name. */ - static const char* const id3album; /**< Metadata key for setting an ID3 album. */ - static const char* const id3comment; /**< Metadata key for setting an ID3 comment. */ - static const char* const id3date; /**< Metadata key for setting an ID3 date. */ - static const char* const id3genre; /**< Metadata key for setting an ID3 genre. */ - static const char* const id3trackNumber; /**< Metadata key for setting an ID3 track number. */ - - //============================================================================== - AudioFormatReader* createReaderFor (InputStream* sourceStream, - bool deleteStreamIfOpeningFails) override; - - AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OggVorbisAudioFormat) -}; - - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp deleted file mode 100755 index 17a06da..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.cpp +++ /dev/null @@ -1,391 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_QUICKTIME && ! (JUCE_64BIT || JUCE_IOS) - -} // (juce namespace) - -#if ! JUCE_WINDOWS - #define Point CarbonDummyPointName // (workaround to avoid definition of "Point" by old Carbon headers) - #define Component CarbonDummyCompName - #include - #include - #include - #include - #include - #undef Point - #undef Component -#else - #if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable : 4100) - #endif - - /* If you've got an include error here, you probably need to install the QuickTime SDK and - add its header directory to your include path. - - Alternatively, if you don't need any QuickTime services, just set the JUCE_QUICKTIME flag to 0. - */ - #undef SIZE_MAX - #include - #include - #include - #include - #include - #undef SIZE_MAX - - #if JUCE_MSVC - #pragma warning (pop) - #endif -#endif - -namespace juce -{ - -bool juce_OpenQuickTimeMovieFromStream (InputStream* input, Movie& movie, Handle& dataHandle); - -static const char* const quickTimeFormatName = "QuickTime file"; - -//============================================================================== -class QTAudioReader : public AudioFormatReader -{ -public: - QTAudioReader (InputStream* const input_, const int trackNum_) - : AudioFormatReader (input_, quickTimeFormatName), - ok (false), - movie (0), - trackNum (trackNum_), - lastSampleRead (0), - lastThreadId (0), - extractor (0), - dataHandle (0) - { - JUCE_AUTORELEASEPOOL - { - bufferList.calloc (256, 1); - - #if JUCE_WINDOWS - if (InitializeQTML (0) != noErr) - return; - #endif - - if (EnterMovies() != noErr) - return; - - bool opened = juce_OpenQuickTimeMovieFromStream (input_, movie, dataHandle); - - if (! opened) - return; - - { - const int numTracks = GetMovieTrackCount (movie); - int trackCount = 0; - - for (int i = 1; i <= numTracks; ++i) - { - track = GetMovieIndTrack (movie, i); - media = GetTrackMedia (track); - - OSType mediaType; - GetMediaHandlerDescription (media, &mediaType, 0, 0); - - if (mediaType == SoundMediaType - && trackCount++ == trackNum_) - { - ok = true; - break; - } - } - } - - if (! ok) - return; - - ok = false; - - lengthInSamples = GetMediaDecodeDuration (media); - usesFloatingPointData = false; - - samplesPerFrame = (int) (GetMediaDecodeDuration (media) / GetMediaSampleCount (media)); - - trackUnitsPerFrame = GetMovieTimeScale (movie) * samplesPerFrame - / GetMediaTimeScale (media); - - MovieAudioExtractionBegin (movie, 0, &extractor); - - unsigned long output_layout_size; - OSStatus err = MovieAudioExtractionGetPropertyInfo (extractor, - kQTPropertyClass_MovieAudioExtraction_Audio, - kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, - 0, &output_layout_size, 0); - if (err != noErr) - return; - - HeapBlock qt_audio_channel_layout; - qt_audio_channel_layout.calloc (output_layout_size, 1); - - MovieAudioExtractionGetProperty (extractor, - kQTPropertyClass_MovieAudioExtraction_Audio, - kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, - output_layout_size, qt_audio_channel_layout, 0); - - qt_audio_channel_layout[0].mChannelLayoutTag = kAudioChannelLayoutTag_Stereo; - - MovieAudioExtractionSetProperty (extractor, - kQTPropertyClass_MovieAudioExtraction_Audio, - kQTMovieAudioExtractionAudioPropertyID_AudioChannelLayout, - output_layout_size, - qt_audio_channel_layout); - - err = MovieAudioExtractionGetProperty (extractor, - kQTPropertyClass_MovieAudioExtraction_Audio, - kQTMovieAudioExtractionAudioPropertyID_AudioStreamBasicDescription, - sizeof (inputStreamDesc), - &inputStreamDesc, 0); - if (err != noErr) - return; - - inputStreamDesc.mFormatFlags = kAudioFormatFlagIsSignedInteger - | kAudioFormatFlagIsPacked - | kAudioFormatFlagsNativeEndian; - inputStreamDesc.mBitsPerChannel = sizeof (SInt16) * 8; - inputStreamDesc.mChannelsPerFrame = jmin ((UInt32) 2, inputStreamDesc.mChannelsPerFrame); - inputStreamDesc.mBytesPerFrame = sizeof (SInt16) * inputStreamDesc.mChannelsPerFrame; - inputStreamDesc.mBytesPerPacket = inputStreamDesc.mBytesPerFrame; - - err = MovieAudioExtractionSetProperty (extractor, - kQTPropertyClass_MovieAudioExtraction_Audio, - kQTMovieAudioExtractionAudioPropertyID_AudioStreamBasicDescription, - sizeof (inputStreamDesc), - &inputStreamDesc); - if (err != noErr) - return; - - Boolean allChannelsDiscrete = false; - err = MovieAudioExtractionSetProperty (extractor, - kQTPropertyClass_MovieAudioExtraction_Movie, - kQTMovieAudioExtractionMoviePropertyID_AllChannelsDiscrete, - sizeof (allChannelsDiscrete), - &allChannelsDiscrete); - - if (err != noErr) - return; - - bufferList->mNumberBuffers = 1; - bufferList->mBuffers[0].mNumberChannels = inputStreamDesc.mChannelsPerFrame; - bufferList->mBuffers[0].mDataByteSize = jmax ((UInt32) 4096, (UInt32) (samplesPerFrame * inputStreamDesc.mBytesPerFrame) + 16); - - dataBuffer.malloc (bufferList->mBuffers[0].mDataByteSize); - bufferList->mBuffers[0].mData = dataBuffer; - - sampleRate = inputStreamDesc.mSampleRate; - bitsPerSample = 16; - numChannels = inputStreamDesc.mChannelsPerFrame; - - detachThread(); - ok = true; - } - } - - ~QTAudioReader() - { - JUCE_AUTORELEASEPOOL - { - checkThreadIsAttached(); - - if (dataHandle != nullptr) - DisposeHandle (dataHandle); - - if (extractor != nullptr) - { - MovieAudioExtractionEnd (extractor); - extractor = nullptr; - } - - DisposeMovie (movie); - - #if JUCE_MAC - ExitMoviesOnThread (); - #endif - } - } - - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) - { - JUCE_AUTORELEASEPOOL - { - checkThreadIsAttached(); - bool readOk = true; - - while (numSamples > 0) - { - if (lastSampleRead != startSampleInFile) - { - TimeRecord time; - time.scale = (TimeScale) inputStreamDesc.mSampleRate; - time.base = 0; - time.value.hi = 0; - time.value.lo = (UInt32) startSampleInFile; - - OSStatus err = MovieAudioExtractionSetProperty (extractor, - kQTPropertyClass_MovieAudioExtraction_Movie, - kQTMovieAudioExtractionMoviePropertyID_CurrentTime, - sizeof (time), &time); - - if (err != noErr) - { - readOk = false; - break; - } - } - - int framesToDo = jmin (numSamples, (int) (bufferList->mBuffers[0].mDataByteSize / inputStreamDesc.mBytesPerFrame)); - bufferList->mBuffers[0].mDataByteSize = inputStreamDesc.mBytesPerFrame * framesToDo; - - UInt32 outFlags = 0; - UInt32 actualNumFrames = framesToDo; - OSStatus err = MovieAudioExtractionFillBuffer (extractor, &actualNumFrames, bufferList, &outFlags); - if (err != noErr) - { - readOk = false; - break; - } - - lastSampleRead = startSampleInFile + actualNumFrames; - const int samplesReceived = actualNumFrames; - - for (int j = numDestChannels; --j >= 0;) - { - if (destSamples[j] != nullptr) - { - const short* src = ((const short*) bufferList->mBuffers[0].mData) + j; - - for (int i = 0; i < samplesReceived; ++i) - { - destSamples[j][startOffsetInDestBuffer + i] = (*src << 16); - src += numChannels; - } - } - } - - startOffsetInDestBuffer += samplesReceived; - startSampleInFile += samplesReceived; - numSamples -= samplesReceived; - - if (((outFlags & kQTMovieAudioExtractionComplete) != 0 || samplesReceived == 0) && numSamples > 0) - { - for (int j = numDestChannels; --j >= 0;) - if (destSamples[j] != nullptr) - zeromem (destSamples[j] + startOffsetInDestBuffer, sizeof (int) * numSamples); - - break; - } - } - - detachThread(); - return readOk; - } - } - - bool ok; - -private: - Movie movie; - Media media; - Track track; - const int trackNum; - double trackUnitsPerFrame; - int samplesPerFrame; - int64 lastSampleRead; - Thread::ThreadID lastThreadId; - MovieAudioExtractionRef extractor; - AudioStreamBasicDescription inputStreamDesc; - HeapBlock bufferList; - HeapBlock dataBuffer; - Handle dataHandle; - - //============================================================================== - void checkThreadIsAttached() - { - #if JUCE_MAC - if (Thread::getCurrentThreadId() != lastThreadId) - EnterMoviesOnThread (0); - AttachMovieToCurrentThread (movie); - #endif - } - - void detachThread() - { - #if JUCE_MAC - DetachMovieFromCurrentThread (movie); - #endif - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (QTAudioReader) -}; - - -//============================================================================== -QuickTimeAudioFormat::QuickTimeAudioFormat() : AudioFormat (quickTimeFormatName, ".mov .mp3 .mp4 .m4a") -{ -} - -QuickTimeAudioFormat::~QuickTimeAudioFormat() -{ -} - -Array QuickTimeAudioFormat::getPossibleSampleRates() { return Array(); } -Array QuickTimeAudioFormat::getPossibleBitDepths() { return Array(); } - -bool QuickTimeAudioFormat::canDoStereo() { return true; } -bool QuickTimeAudioFormat::canDoMono() { return true; } - -//============================================================================== -AudioFormatReader* QuickTimeAudioFormat::createReaderFor (InputStream* sourceStream, - const bool deleteStreamIfOpeningFails) -{ - ScopedPointer r (new QTAudioReader (sourceStream, 0)); - - if (r->ok) - return r.release(); - - if (! deleteStreamIfOpeningFails) - r->input = 0; - - return nullptr; -} - -AudioFormatWriter* QuickTimeAudioFormat::createWriterFor (OutputStream* /*streamToWriteTo*/, - double /*sampleRateToUse*/, - unsigned int /*numberOfChannels*/, - int /*bitsPerSample*/, - const StringPairArray& /*metadataValues*/, - int /*qualityOptionIndex*/) -{ - jassertfalse; // not yet implemented! - return nullptr; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h deleted file mode 100755 index 6ef6a4e..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_QUICKTIME - -//============================================================================== -/** - Uses QuickTime to read the audio track a movie or media file. - - As well as QuickTime movies, this should also manage to open other audio - files that quicktime can understand, like mp3, m4a, etc. - - @see AudioFormat -*/ -class JUCE_API QuickTimeAudioFormat : public AudioFormat -{ -public: - //============================================================================== - /** Creates a format object. */ - QuickTimeAudioFormat(); - - /** Destructor. */ - ~QuickTimeAudioFormat(); - - //============================================================================== - Array getPossibleSampleRates(); - Array getPossibleBitDepths(); - bool canDoStereo(); - bool canDoMono(); - - //============================================================================== - AudioFormatReader* createReaderFor (InputStream* sourceStream, - bool deleteStreamIfOpeningFails); - - AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex); - - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (QuickTimeAudioFormat) -}; - - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp deleted file mode 100755 index 1929e4c..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp +++ /dev/null @@ -1,1495 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -static const char* const wavFormatName = "WAV file"; - -//============================================================================== -const char* const WavAudioFormat::bwavDescription = "bwav description"; -const char* const WavAudioFormat::bwavOriginator = "bwav originator"; -const char* const WavAudioFormat::bwavOriginatorRef = "bwav originator ref"; -const char* const WavAudioFormat::bwavOriginationDate = "bwav origination date"; -const char* const WavAudioFormat::bwavOriginationTime = "bwav origination time"; -const char* const WavAudioFormat::bwavTimeReference = "bwav time reference"; -const char* const WavAudioFormat::bwavCodingHistory = "bwav coding history"; - -StringPairArray WavAudioFormat::createBWAVMetadata (const String& description, - const String& originator, - const String& originatorRef, - const Time date, - const int64 timeReferenceSamples, - const String& codingHistory) -{ - StringPairArray m; - - m.set (bwavDescription, description); - m.set (bwavOriginator, originator); - m.set (bwavOriginatorRef, originatorRef); - m.set (bwavOriginationDate, date.formatted ("%Y-%m-%d")); - m.set (bwavOriginationTime, date.formatted ("%H:%M:%S")); - m.set (bwavTimeReference, String (timeReferenceSamples)); - m.set (bwavCodingHistory, codingHistory); - - return m; -} - -const char* const WavAudioFormat::acidOneShot = "acid one shot"; -const char* const WavAudioFormat::acidRootSet = "acid root set"; -const char* const WavAudioFormat::acidStretch = "acid stretch"; -const char* const WavAudioFormat::acidDiskBased = "acid disk based"; -const char* const WavAudioFormat::acidizerFlag = "acidizer flag"; -const char* const WavAudioFormat::acidRootNote = "acid root note"; -const char* const WavAudioFormat::acidBeats = "acid beats"; -const char* const WavAudioFormat::acidDenominator = "acid denominator"; -const char* const WavAudioFormat::acidNumerator = "acid numerator"; -const char* const WavAudioFormat::acidTempo = "acid tempo"; - -const char* const WavAudioFormat::ISRC = "ISRC"; -const char* const WavAudioFormat::tracktionLoopInfo = "tracktion loop info"; - -//============================================================================== -namespace WavFileHelpers -{ - inline int chunkName (const char* const name) noexcept { return (int) ByteOrder::littleEndianInt (name); } - inline size_t roundUpSize (size_t sz) noexcept { return (sz + 3) & ~3u; } - - #if JUCE_MSVC - #pragma pack (push, 1) - #endif - - struct BWAVChunk - { - char description [256]; - char originator [32]; - char originatorRef [32]; - char originationDate [10]; - char originationTime [8]; - uint32 timeRefLow; - uint32 timeRefHigh; - uint16 version; - uint8 umid[64]; - uint8 reserved[190]; - char codingHistory[1]; - - void copyTo (StringPairArray& values, const int totalSize) const - { - values.set (WavAudioFormat::bwavDescription, String::fromUTF8 (description, sizeof (description))); - values.set (WavAudioFormat::bwavOriginator, String::fromUTF8 (originator, sizeof (originator))); - values.set (WavAudioFormat::bwavOriginatorRef, String::fromUTF8 (originatorRef, sizeof (originatorRef))); - values.set (WavAudioFormat::bwavOriginationDate, String::fromUTF8 (originationDate, sizeof (originationDate))); - values.set (WavAudioFormat::bwavOriginationTime, String::fromUTF8 (originationTime, sizeof (originationTime))); - - const uint32 timeLow = ByteOrder::swapIfBigEndian (timeRefLow); - const uint32 timeHigh = ByteOrder::swapIfBigEndian (timeRefHigh); - const int64 time = (((int64)timeHigh) << 32) + timeLow; - - values.set (WavAudioFormat::bwavTimeReference, String (time)); - values.set (WavAudioFormat::bwavCodingHistory, - String::fromUTF8 (codingHistory, totalSize - (int) offsetof (BWAVChunk, codingHistory))); - } - - static MemoryBlock createFrom (const StringPairArray& values) - { - MemoryBlock data (roundUpSize (sizeof (BWAVChunk) + values [WavAudioFormat::bwavCodingHistory].getNumBytesAsUTF8())); - data.fillWith (0); - - BWAVChunk* b = (BWAVChunk*) data.getData(); - - // Allow these calls to overwrite an extra byte at the end, which is fine as long - // as they get called in the right order.. - values [WavAudioFormat::bwavDescription] .copyToUTF8 (b->description, 257); - values [WavAudioFormat::bwavOriginator] .copyToUTF8 (b->originator, 33); - values [WavAudioFormat::bwavOriginatorRef] .copyToUTF8 (b->originatorRef, 33); - values [WavAudioFormat::bwavOriginationDate].copyToUTF8 (b->originationDate, 11); - values [WavAudioFormat::bwavOriginationTime].copyToUTF8 (b->originationTime, 9); - - const int64 time = values [WavAudioFormat::bwavTimeReference].getLargeIntValue(); - b->timeRefLow = ByteOrder::swapIfBigEndian ((uint32) (time & 0xffffffff)); - b->timeRefHigh = ByteOrder::swapIfBigEndian ((uint32) (time >> 32)); - - values [WavAudioFormat::bwavCodingHistory].copyToUTF8 (b->codingHistory, 0x7fffffff); - - if (b->description[0] != 0 - || b->originator[0] != 0 - || b->originationDate[0] != 0 - || b->originationTime[0] != 0 - || b->codingHistory[0] != 0 - || time != 0) - { - return data; - } - - return MemoryBlock(); - } - - } JUCE_PACKED; - - //============================================================================== - struct SMPLChunk - { - struct SampleLoop - { - uint32 identifier; - uint32 type; // these are different in AIFF and WAV - uint32 start; - uint32 end; - uint32 fraction; - uint32 playCount; - } JUCE_PACKED; - - uint32 manufacturer; - uint32 product; - uint32 samplePeriod; - uint32 midiUnityNote; - uint32 midiPitchFraction; - uint32 smpteFormat; - uint32 smpteOffset; - uint32 numSampleLoops; - uint32 samplerData; - SampleLoop loops[1]; - - template - static void setValue (StringPairArray& values, NameType name, uint32 val) - { - values.set (name, String (ByteOrder::swapIfBigEndian (val))); - } - - static void setValue (StringPairArray& values, int prefix, const char* name, uint32 val) - { - setValue (values, "Loop" + String (prefix) + name, val); - } - - void copyTo (StringPairArray& values, const int totalSize) const - { - setValue (values, "Manufacturer", manufacturer); - setValue (values, "Product", product); - setValue (values, "SamplePeriod", samplePeriod); - setValue (values, "MidiUnityNote", midiUnityNote); - setValue (values, "MidiPitchFraction", midiPitchFraction); - setValue (values, "SmpteFormat", smpteFormat); - setValue (values, "SmpteOffset", smpteOffset); - setValue (values, "NumSampleLoops", numSampleLoops); - setValue (values, "SamplerData", samplerData); - - for (int i = 0; i < (int) numSampleLoops; ++i) - { - if ((uint8*) (loops + (i + 1)) > ((uint8*) this) + totalSize) - break; - - setValue (values, i, "Identifier", loops[i].identifier); - setValue (values, i, "Type", loops[i].type); - setValue (values, i, "Start", loops[i].start); - setValue (values, i, "End", loops[i].end); - setValue (values, i, "Fraction", loops[i].fraction); - setValue (values, i, "PlayCount", loops[i].playCount); - } - } - - template - static uint32 getValue (const StringPairArray& values, NameType name, const char* def) - { - return ByteOrder::swapIfBigEndian ((uint32) values.getValue (name, def).getIntValue()); - } - - static uint32 getValue (const StringPairArray& values, int prefix, const char* name, const char* def) - { - return getValue (values, "Loop" + String (prefix) + name, def); - } - - static MemoryBlock createFrom (const StringPairArray& values) - { - MemoryBlock data; - const int numLoops = jmin (64, values.getValue ("NumSampleLoops", "0").getIntValue()); - - if (numLoops > 0) - { - data.setSize (roundUpSize (sizeof (SMPLChunk) + (size_t) (numLoops - 1) * sizeof (SampleLoop)), true); - - SMPLChunk* const s = static_cast (data.getData()); - - s->manufacturer = getValue (values, "Manufacturer", "0"); - s->product = getValue (values, "Product", "0"); - s->samplePeriod = getValue (values, "SamplePeriod", "0"); - s->midiUnityNote = getValue (values, "MidiUnityNote", "60"); - s->midiPitchFraction = getValue (values, "MidiPitchFraction", "0"); - s->smpteFormat = getValue (values, "SmpteFormat", "0"); - s->smpteOffset = getValue (values, "SmpteOffset", "0"); - s->numSampleLoops = ByteOrder::swapIfBigEndian ((uint32) numLoops); - s->samplerData = getValue (values, "SamplerData", "0"); - - for (int i = 0; i < numLoops; ++i) - { - SampleLoop& loop = s->loops[i]; - loop.identifier = getValue (values, i, "Identifier", "0"); - loop.type = getValue (values, i, "Type", "0"); - loop.start = getValue (values, i, "Start", "0"); - loop.end = getValue (values, i, "End", "0"); - loop.fraction = getValue (values, i, "Fraction", "0"); - loop.playCount = getValue (values, i, "PlayCount", "0"); - } - } - - return data; - } - } JUCE_PACKED; - - //============================================================================== - struct InstChunk - { - int8 baseNote; - int8 detune; - int8 gain; - int8 lowNote; - int8 highNote; - int8 lowVelocity; - int8 highVelocity; - - static void setValue (StringPairArray& values, const char* name, int val) - { - values.set (name, String (val)); - } - - void copyTo (StringPairArray& values) const - { - setValue (values, "MidiUnityNote", baseNote); - setValue (values, "Detune", detune); - setValue (values, "Gain", gain); - setValue (values, "LowNote", lowNote); - setValue (values, "HighNote", highNote); - setValue (values, "LowVelocity", lowVelocity); - setValue (values, "HighVelocity", highVelocity); - } - - static int8 getValue (const StringPairArray& values, const char* name, const char* def) - { - return (int8) values.getValue (name, def).getIntValue(); - } - - static MemoryBlock createFrom (const StringPairArray& values) - { - MemoryBlock data; - const StringArray& keys = values.getAllKeys(); - - if (keys.contains ("LowNote", true) && keys.contains ("HighNote", true)) - { - data.setSize (8, true); - InstChunk* const inst = static_cast (data.getData()); - - inst->baseNote = getValue (values, "MidiUnityNote", "60"); - inst->detune = getValue (values, "Detune", "0"); - inst->gain = getValue (values, "Gain", "0"); - inst->lowNote = getValue (values, "LowNote", "0"); - inst->highNote = getValue (values, "HighNote", "127"); - inst->lowVelocity = getValue (values, "LowVelocity", "1"); - inst->highVelocity = getValue (values, "HighVelocity", "127"); - } - - return data; - } - } JUCE_PACKED; - - //============================================================================== - struct CueChunk - { - struct Cue - { - uint32 identifier; - uint32 order; - uint32 chunkID; - uint32 chunkStart; - uint32 blockStart; - uint32 offset; - } JUCE_PACKED; - - uint32 numCues; - Cue cues[1]; - - static void setValue (StringPairArray& values, int prefix, const char* name, uint32 val) - { - values.set ("Cue" + String (prefix) + name, String (ByteOrder::swapIfBigEndian (val))); - } - - void copyTo (StringPairArray& values, const int totalSize) const - { - values.set ("NumCuePoints", String (ByteOrder::swapIfBigEndian (numCues))); - - for (int i = 0; i < (int) numCues; ++i) - { - if ((uint8*) (cues + (i + 1)) > ((uint8*) this) + totalSize) - break; - - setValue (values, i, "Identifier", cues[i].identifier); - setValue (values, i, "Order", cues[i].order); - setValue (values, i, "ChunkID", cues[i].chunkID); - setValue (values, i, "ChunkStart", cues[i].chunkStart); - setValue (values, i, "BlockStart", cues[i].blockStart); - setValue (values, i, "Offset", cues[i].offset); - } - } - - static MemoryBlock createFrom (const StringPairArray& values) - { - MemoryBlock data; - const int numCues = values.getValue ("NumCuePoints", "0").getIntValue(); - - if (numCues > 0) - { - data.setSize (roundUpSize (sizeof (CueChunk) + (size_t) (numCues - 1) * sizeof (Cue)), true); - - CueChunk* const c = static_cast (data.getData()); - - c->numCues = ByteOrder::swapIfBigEndian ((uint32) numCues); - - const String dataChunkID (chunkName ("data")); - int nextOrder = 0; - - #if JUCE_DEBUG - Array identifiers; - #endif - - for (int i = 0; i < numCues; ++i) - { - const String prefix ("Cue" + String (i)); - const uint32 identifier = (uint32) values.getValue (prefix + "Identifier", "0").getIntValue(); - - #if JUCE_DEBUG - jassert (! identifiers.contains (identifier)); - identifiers.add (identifier); - #endif - - const int order = values.getValue (prefix + "Order", String (nextOrder)).getIntValue(); - nextOrder = jmax (nextOrder, order) + 1; - - Cue& cue = c->cues[i]; - cue.identifier = ByteOrder::swapIfBigEndian ((uint32) identifier); - cue.order = ByteOrder::swapIfBigEndian ((uint32) order); - cue.chunkID = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "ChunkID", dataChunkID).getIntValue()); - cue.chunkStart = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "ChunkStart", "0").getIntValue()); - cue.blockStart = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "BlockStart", "0").getIntValue()); - cue.offset = ByteOrder::swapIfBigEndian ((uint32) values.getValue (prefix + "Offset", "0").getIntValue()); - } - } - - return data; - } - - } JUCE_PACKED; - - //============================================================================== - namespace ListChunk - { - static int getValue (const StringPairArray& values, const String& name) - { - return values.getValue (name, "0").getIntValue(); - } - - static int getValue (const StringPairArray& values, const String& prefix, const char* name) - { - return getValue (values, prefix + name); - } - - static void appendLabelOrNoteChunk (const StringPairArray& values, const String& prefix, - const int chunkType, MemoryOutputStream& out) - { - const String label (values.getValue (prefix + "Text", prefix)); - const int labelLength = (int) label.getNumBytesAsUTF8() + 1; - const int chunkLength = 4 + labelLength + (labelLength & 1); - - out.writeInt (chunkType); - out.writeInt (chunkLength); - out.writeInt (getValue (values, prefix, "Identifier")); - out.write (label.toUTF8(), (size_t) labelLength); - - if ((out.getDataSize() & 1) != 0) - out.writeByte (0); - } - - static void appendExtraChunk (const StringPairArray& values, const String& prefix, MemoryOutputStream& out) - { - const String text (values.getValue (prefix + "Text", prefix)); - - const int textLength = (int) text.getNumBytesAsUTF8() + 1; // include null terminator - int chunkLength = textLength + 20 + (textLength & 1); - - out.writeInt (chunkName ("ltxt")); - out.writeInt (chunkLength); - out.writeInt (getValue (values, prefix, "Identifier")); - out.writeInt (getValue (values, prefix, "SampleLength")); - out.writeInt (getValue (values, prefix, "Purpose")); - out.writeShort ((short) getValue (values, prefix, "Country")); - out.writeShort ((short) getValue (values, prefix, "Language")); - out.writeShort ((short) getValue (values, prefix, "Dialect")); - out.writeShort ((short) getValue (values, prefix, "CodePage")); - out.write (text.toUTF8(), (size_t) textLength); - - if ((out.getDataSize() & 1) != 0) - out.writeByte (0); - } - - static MemoryBlock createFrom (const StringPairArray& values) - { - const int numCueLabels = getValue (values, "NumCueLabels"); - const int numCueNotes = getValue (values, "NumCueNotes"); - const int numCueRegions = getValue (values, "NumCueRegions"); - - MemoryOutputStream out; - - if (numCueLabels + numCueNotes + numCueRegions > 0) - { - out.writeInt (chunkName ("adtl")); - - for (int i = 0; i < numCueLabels; ++i) - appendLabelOrNoteChunk (values, "CueLabel" + String (i), chunkName ("labl"), out); - - for (int i = 0; i < numCueNotes; ++i) - appendLabelOrNoteChunk (values, "CueNote" + String (i), chunkName ("note"), out); - - for (int i = 0; i < numCueRegions; ++i) - appendExtraChunk (values, "CueRegion" + String (i), out); - } - - return out.getMemoryBlock(); - } - } - - //============================================================================== - namespace ListInfoChunk - { - static bool writeValue (const StringPairArray& values, MemoryOutputStream& out, const char* paramName) - { - const String value (values.getValue (paramName, String())); - - if (value.isEmpty()) - return false; - - const int valueLength = (int) value.getNumBytesAsUTF8() + 1; - const int chunkLength = valueLength + (valueLength & 1); - - out.writeInt (chunkName (paramName)); - out.writeInt (chunkLength); - out.write (value.toUTF8(), (size_t) valueLength); - - if ((out.getDataSize() & 1) != 0) - out.writeByte (0); - - return true; - } - - static MemoryBlock createFrom (const StringPairArray& values) - { - static const char* params[] = { "INAM", "IART", "IPRD", "IPRT", "ISFT", - "ISRC", "IGNR", "ICMT", "ICOP", "ICRD" }; - - MemoryOutputStream out; - out.writeInt (chunkName ("INFO")); - bool anyParamsDefined = false; - - for (int i = 0; i < numElementsInArray (params); ++i) - if (writeValue (values, out, params[i])) - anyParamsDefined = true; - - return anyParamsDefined ? out.getMemoryBlock() : MemoryBlock(); - } - } - - //============================================================================== - struct AcidChunk - { - /** Reads an acid RIFF chunk from a stream positioned just after the size byte. */ - AcidChunk (InputStream& input, size_t length) - { - zerostruct (*this); - input.read (this, (int) jmin (sizeof (*this), length)); - } - - AcidChunk (const StringPairArray& values) - { - zerostruct (*this); - - flags = getFlagIfPresent (values, WavAudioFormat::acidOneShot, 0x01) - | getFlagIfPresent (values, WavAudioFormat::acidRootSet, 0x02) - | getFlagIfPresent (values, WavAudioFormat::acidStretch, 0x04) - | getFlagIfPresent (values, WavAudioFormat::acidDiskBased, 0x08) - | getFlagIfPresent (values, WavAudioFormat::acidizerFlag, 0x10); - - if (values[WavAudioFormat::acidRootSet].getIntValue() != 0) - rootNote = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidRootNote].getIntValue()); - - numBeats = ByteOrder::swapIfBigEndian ((uint32) values[WavAudioFormat::acidBeats].getIntValue()); - meterDenominator = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidDenominator].getIntValue()); - meterNumerator = ByteOrder::swapIfBigEndian ((uint16) values[WavAudioFormat::acidNumerator].getIntValue()); - - if (values.containsKey (WavAudioFormat::acidTempo)) - tempo = swapFloatByteOrder (values[WavAudioFormat::acidTempo].getFloatValue()); - } - - static MemoryBlock createFrom (const StringPairArray& values) - { - return AcidChunk (values).toMemoryBlock(); - } - - MemoryBlock toMemoryBlock() const - { - return (flags != 0 || rootNote != 0 || numBeats != 0 || meterDenominator != 0 || meterNumerator != 0) - ? MemoryBlock (this, sizeof (*this)) : MemoryBlock(); - } - - void addToMetadata (StringPairArray& values) const - { - setBoolFlag (values, WavAudioFormat::acidOneShot, 0x01); - setBoolFlag (values, WavAudioFormat::acidRootSet, 0x02); - setBoolFlag (values, WavAudioFormat::acidStretch, 0x04); - setBoolFlag (values, WavAudioFormat::acidDiskBased, 0x08); - setBoolFlag (values, WavAudioFormat::acidizerFlag, 0x10); - - if (flags & 0x02) // root note set - values.set (WavAudioFormat::acidRootNote, String (ByteOrder::swapIfBigEndian (rootNote))); - - values.set (WavAudioFormat::acidBeats, String (ByteOrder::swapIfBigEndian (numBeats))); - values.set (WavAudioFormat::acidDenominator, String (ByteOrder::swapIfBigEndian (meterDenominator))); - values.set (WavAudioFormat::acidNumerator, String (ByteOrder::swapIfBigEndian (meterNumerator))); - values.set (WavAudioFormat::acidTempo, String (swapFloatByteOrder (tempo))); - } - - void setBoolFlag (StringPairArray& values, const char* name, uint32 mask) const - { - values.set (name, (flags & ByteOrder::swapIfBigEndian (mask)) ? "1" : "0"); - } - - static uint32 getFlagIfPresent (const StringPairArray& values, const char* name, uint32 flag) - { - return values[name].getIntValue() != 0 ? ByteOrder::swapIfBigEndian (flag) : 0; - } - - static float swapFloatByteOrder (const float x) noexcept - { - #ifdef JUCE_BIG_ENDIAN - union { uint32 asInt; float asFloat; } n; - n.asFloat = x; - n.asInt = ByteOrder::swap (n.asInt); - return n.asFloat; - #else - return x; - #endif - } - - uint32 flags; - uint16 rootNote; - uint16 reserved1; - float reserved2; - uint32 numBeats; - uint16 meterDenominator; - uint16 meterNumerator; - float tempo; - - } JUCE_PACKED; - - //============================================================================== - struct TracktionChunk - { - static MemoryBlock createFrom (const StringPairArray& values) - { - const String s = values[WavAudioFormat::tracktionLoopInfo]; - MemoryBlock data; - - if (s.isNotEmpty()) - { - MemoryOutputStream os (data, false); - os.writeString (s); - } - - return data; - } - }; - - //============================================================================== - namespace AXMLChunk - { - static void addToMetadata (StringPairArray& destValues, const String& source) - { - ScopedPointer xml (XmlDocument::parse (source)); - - if (xml != nullptr && xml->hasTagName ("ebucore:ebuCoreMain")) - { - if (XmlElement* xml2 = xml->getChildByName ("ebucore:coreMetadata")) - { - if (XmlElement* xml3 = xml2->getChildByName ("ebucore:identifier")) - { - if (XmlElement* xml4 = xml3->getChildByName ("dc:identifier")) - { - const String ISRCCode (xml4->getAllSubText().fromFirstOccurrenceOf ("ISRC:", false, true)); - - if (ISRCCode.isNotEmpty()) - destValues.set (WavAudioFormat::ISRC, ISRCCode); - } - } - } - } - } - - static MemoryBlock createFrom (const StringPairArray& values) - { - const String ISRC (values.getValue (WavAudioFormat::ISRC, String::empty)); - MemoryOutputStream xml; - - if (ISRC.isNotEmpty()) - { - xml << "" - "" - "" - "ISRC:" << ISRC << "" - "" - "" - ""; - - xml.writeRepeatedByte (0, xml.getDataSize()); // ensures even size, null termination and room for future growing - } - - return xml.getMemoryBlock(); - } - }; - - //============================================================================== - struct ExtensibleWavSubFormat - { - uint32 data1; - uint16 data2; - uint16 data3; - uint8 data4[8]; - - bool operator== (const ExtensibleWavSubFormat& other) const noexcept { return memcmp (this, &other, sizeof (*this)) == 0; } - bool operator!= (const ExtensibleWavSubFormat& other) const noexcept { return ! operator== (other); } - - } JUCE_PACKED; - - static const ExtensibleWavSubFormat pcmFormat = { 0x00000001, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; - static const ExtensibleWavSubFormat IEEEFloatFormat = { 0x00000003, 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 } }; - static const ExtensibleWavSubFormat ambisonicFormat = { 0x00000001, 0x0721, 0x11d3, { 0x86, 0x44, 0xC8, 0xC1, 0xCA, 0x00, 0x00, 0x00 } }; - - struct DataSize64Chunk // chunk ID = 'ds64' if data size > 0xffffffff, 'JUNK' otherwise - { - uint32 riffSizeLow; // low 4 byte size of RF64 block - uint32 riffSizeHigh; // high 4 byte size of RF64 block - uint32 dataSizeLow; // low 4 byte size of data chunk - uint32 dataSizeHigh; // high 4 byte size of data chunk - uint32 sampleCountLow; // low 4 byte sample count of fact chunk - uint32 sampleCountHigh; // high 4 byte sample count of fact chunk - uint32 tableLength; // number of valid entries in array 'table' - } JUCE_PACKED; - - #if JUCE_MSVC - #pragma pack (pop) - #endif -} - -//============================================================================== -class WavAudioFormatReader : public AudioFormatReader -{ -public: - WavAudioFormatReader (InputStream* const in) - : AudioFormatReader (in, wavFormatName), - bwavChunkStart (0), - bwavSize (0), - dataLength (0), - isRF64 (false) - { - using namespace WavFileHelpers; - uint64 len = 0; - uint64 end = 0; - int cueNoteIndex = 0; - int cueLabelIndex = 0; - int cueRegionIndex = 0; - - const int firstChunkType = input->readInt(); - - if (firstChunkType == chunkName ("RF64")) - { - input->skipNextBytes (4); // size is -1 for RF64 - isRF64 = true; - } - else if (firstChunkType == chunkName ("RIFF")) - { - len = (uint64) (uint32) input->readInt(); - end = len + (uint64) input->getPosition(); - } - else - { - return; - } - - const int64 startOfRIFFChunk = input->getPosition(); - - if (input->readInt() == chunkName ("WAVE")) - { - if (isRF64 && input->readInt() == chunkName ("ds64")) - { - const uint32 length = (uint32) input->readInt(); - - if (length < 28) - return; - - const int64 chunkEnd = input->getPosition() + length + (length & 1); - len = (uint64) input->readInt64(); - end = len + (uint64) startOfRIFFChunk; - dataLength = input->readInt64(); - input->setPosition (chunkEnd); - } - - while ((uint64) input->getPosition() < end && ! input->isExhausted()) - { - const int chunkType = input->readInt(); - uint32 length = (uint32) input->readInt(); - const int64 chunkEnd = input->getPosition() + length + (length & 1); - - if (chunkType == chunkName ("fmt ")) - { - // read the format chunk - const unsigned short format = (unsigned short) input->readShort(); - numChannels = (unsigned int) input->readShort(); - sampleRate = input->readInt(); - const int bytesPerSec = input->readInt(); - input->skipNextBytes (2); - bitsPerSample = (unsigned int) (int) input->readShort(); - - if (bitsPerSample > 64) - { - bytesPerFrame = bytesPerSec / (int) sampleRate; - bitsPerSample = 8 * (unsigned int) bytesPerFrame / numChannels; - } - else - { - bytesPerFrame = numChannels * bitsPerSample / 8; - } - - if (format == 3) - { - usesFloatingPointData = true; - } - else if (format == 0xfffe /*WAVE_FORMAT_EXTENSIBLE*/) - { - if (length < 40) // too short - { - bytesPerFrame = 0; - } - else - { - input->skipNextBytes (4); // skip over size and bitsPerSample - metadataValues.set ("ChannelMask", String (input->readInt())); - - ExtensibleWavSubFormat subFormat; - subFormat.data1 = (uint32) input->readInt(); - subFormat.data2 = (uint16) input->readShort(); - subFormat.data3 = (uint16) input->readShort(); - input->read (subFormat.data4, sizeof (subFormat.data4)); - - if (subFormat == IEEEFloatFormat) - usesFloatingPointData = true; - else if (subFormat != pcmFormat && subFormat != ambisonicFormat) - bytesPerFrame = 0; - } - } - else if (format != 1) - { - bytesPerFrame = 0; - } - } - else if (chunkType == chunkName ("data")) - { - if (! isRF64) // data size is expected to be -1, actual data size is in ds64 chunk - dataLength = length; - - dataChunkStart = input->getPosition(); - lengthInSamples = (bytesPerFrame > 0) ? (dataLength / bytesPerFrame) : 0; - } - else if (chunkType == chunkName ("bext")) - { - bwavChunkStart = input->getPosition(); - bwavSize = length; - - HeapBlock bwav; - bwav.calloc (jmax ((size_t) length + 1, sizeof (BWAVChunk)), 1); - input->read (bwav, (int) length); - bwav->copyTo (metadataValues, (int) length); - } - else if (chunkType == chunkName ("smpl")) - { - HeapBlock smpl; - smpl.calloc (jmax ((size_t) length + 1, sizeof (SMPLChunk)), 1); - input->read (smpl, (int) length); - smpl->copyTo (metadataValues, (int) length); - } - else if (chunkType == chunkName ("inst") || chunkType == chunkName ("INST")) // need to check which... - { - HeapBlock inst; - inst.calloc (jmax ((size_t) length + 1, sizeof (InstChunk)), 1); - input->read (inst, (int) length); - inst->copyTo (metadataValues); - } - else if (chunkType == chunkName ("cue ")) - { - HeapBlock cue; - cue.calloc (jmax ((size_t) length + 1, sizeof (CueChunk)), 1); - input->read (cue, (int) length); - cue->copyTo (metadataValues, (int) length); - } - else if (chunkType == chunkName ("axml")) - { - MemoryBlock axml; - input->readIntoMemoryBlock (axml, (ssize_t) length); - AXMLChunk::addToMetadata (metadataValues, axml.toString()); - } - else if (chunkType == chunkName ("LIST")) - { - if (input->readInt() == chunkName ("adtl")) - { - while (input->getPosition() < chunkEnd) - { - const int adtlChunkType = input->readInt(); - const uint32 adtlLength = (uint32) input->readInt(); - const int64 adtlChunkEnd = input->getPosition() + (adtlLength + (adtlLength & 1)); - - if (adtlChunkType == chunkName ("labl") || adtlChunkType == chunkName ("note")) - { - String prefix; - - if (adtlChunkType == chunkName ("labl")) - prefix << "CueLabel" << cueLabelIndex++; - else if (adtlChunkType == chunkName ("note")) - prefix << "CueNote" << cueNoteIndex++; - - const uint32 identifier = (uint32) input->readInt(); - const int stringLength = (int) adtlLength - 4; - - MemoryBlock textBlock; - input->readIntoMemoryBlock (textBlock, stringLength); - - metadataValues.set (prefix + "Identifier", String (identifier)); - metadataValues.set (prefix + "Text", textBlock.toString()); - } - else if (adtlChunkType == chunkName ("ltxt")) - { - const String prefix ("CueRegion" + String (cueRegionIndex++)); - const uint32 identifier = (uint32) input->readInt(); - const uint32 sampleLength = (uint32) input->readInt(); - const uint32 purpose = (uint32) input->readInt(); - const uint16 country = (uint16) input->readInt(); - const uint16 language = (uint16) input->readInt(); - const uint16 dialect = (uint16) input->readInt(); - const uint16 codePage = (uint16) input->readInt(); - const uint32 stringLength = adtlLength - 20; - - MemoryBlock textBlock; - input->readIntoMemoryBlock (textBlock, (int) stringLength); - - metadataValues.set (prefix + "Identifier", String (identifier)); - metadataValues.set (prefix + "SampleLength", String (sampleLength)); - metadataValues.set (prefix + "Purpose", String (purpose)); - metadataValues.set (prefix + "Country", String (country)); - metadataValues.set (prefix + "Language", String (language)); - metadataValues.set (prefix + "Dialect", String (dialect)); - metadataValues.set (prefix + "CodePage", String (codePage)); - metadataValues.set (prefix + "Text", textBlock.toString()); - } - - input->setPosition (adtlChunkEnd); - } - } - } - else if (chunkType == chunkName ("acid")) - { - AcidChunk (*input, length).addToMetadata (metadataValues); - } - else if (chunkType == chunkName ("Trkn")) - { - MemoryBlock tracktion; - input->readIntoMemoryBlock (tracktion, (ssize_t) length); - metadataValues.set (WavAudioFormat::tracktionLoopInfo, tracktion.toString()); - } - else if (chunkEnd <= input->getPosition()) - { - break; - } - - input->setPosition (chunkEnd); - } - } - - if (cueLabelIndex > 0) metadataValues.set ("NumCueLabels", String (cueLabelIndex)); - if (cueNoteIndex > 0) metadataValues.set ("NumCueNotes", String (cueNoteIndex)); - if (cueRegionIndex > 0) metadataValues.set ("NumCueRegions", String (cueRegionIndex)); - if (metadataValues.size() > 0) metadataValues.set ("MetaDataSource", "WAV"); - } - - //============================================================================== - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override - { - clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, - startSampleInFile, numSamples, lengthInSamples); - - if (numSamples <= 0) - return true; - - input->setPosition (dataChunkStart + startSampleInFile * bytesPerFrame); - - while (numSamples > 0) - { - const int tempBufSize = 480 * 3 * 4; // (keep this a multiple of 3) - char tempBuffer [tempBufSize]; - - const int numThisTime = jmin (tempBufSize / bytesPerFrame, numSamples); - const int bytesRead = input->read (tempBuffer, numThisTime * bytesPerFrame); - - if (bytesRead < numThisTime * bytesPerFrame) - { - jassert (bytesRead >= 0); - zeromem (tempBuffer + bytesRead, (size_t) (numThisTime * bytesPerFrame - bytesRead)); - } - - copySampleData (bitsPerSample, usesFloatingPointData, - destSamples, startOffsetInDestBuffer, numDestChannels, - tempBuffer, (int) numChannels, numThisTime); - - startOffsetInDestBuffer += numThisTime; - numSamples -= numThisTime; - } - - return true; - } - - static void copySampleData (unsigned int bitsPerSample, const bool usesFloatingPointData, - int* const* destSamples, int startOffsetInDestBuffer, int numDestChannels, - const void* sourceData, int numChannels, int numSamples) noexcept - { - switch (bitsPerSample) - { - case 8: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; - case 16: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; - case 24: ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; - case 32: if (usesFloatingPointData) ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); - else ReadHelper::read (destSamples, startOffsetInDestBuffer, numDestChannels, sourceData, numChannels, numSamples); break; - default: jassertfalse; break; - } - } - - int64 bwavChunkStart, bwavSize; - int64 dataChunkStart, dataLength; - int bytesPerFrame; - bool isRF64; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavAudioFormatReader) -}; - -//============================================================================== -class WavAudioFormatWriter : public AudioFormatWriter -{ -public: - WavAudioFormatWriter (OutputStream* const out, const double rate, - const unsigned int numChans, const unsigned int bits, - const StringPairArray& metadataValues) - : AudioFormatWriter (out, wavFormatName, rate, numChans, bits), - lengthInSamples (0), - bytesWritten (0), - writeFailed (false) - { - using namespace WavFileHelpers; - - if (metadataValues.size() > 0) - { - // The meta data should have been santised for the WAV format. - // If it was originally sourced from an AIFF file the MetaDataSource - // key should be removed (or set to "WAV") once this has been done - jassert (metadataValues.getValue ("MetaDataSource", "None") != "AIFF"); - - bwavChunk = BWAVChunk::createFrom (metadataValues); - axmlChunk = AXMLChunk::createFrom (metadataValues); - smplChunk = SMPLChunk::createFrom (metadataValues); - instChunk = InstChunk::createFrom (metadataValues); - cueChunk = CueChunk ::createFrom (metadataValues); - listChunk = ListChunk::createFrom (metadataValues); - listInfoChunk = ListInfoChunk::createFrom (metadataValues); - acidChunk = AcidChunk::createFrom (metadataValues); - trckChunk = TracktionChunk::createFrom (metadataValues); - } - - headerPosition = out->getPosition(); - writeHeader(); - } - - ~WavAudioFormatWriter() - { - writeHeader(); - } - - //============================================================================== - bool write (const int** data, int numSamples) override - { - jassert (numSamples >= 0); - jassert (data != nullptr && *data != nullptr); // the input must contain at least one channel! - - if (writeFailed) - return false; - - const size_t bytes = numChannels * (unsigned int) numSamples * bitsPerSample / 8; - tempBlock.ensureSize (bytes, false); - - switch (bitsPerSample) - { - case 8: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; - case 16: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; - case 24: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; - case 32: WriteHelper::write (tempBlock.getData(), (int) numChannels, data, numSamples); break; - default: jassertfalse; break; - } - - if (! output->write (tempBlock.getData(), bytes)) - { - // failed to write to disk, so let's try writing the header. - // If it's just run out of disk space, then if it does manage - // to write the header, we'll still have a useable file.. - writeHeader(); - writeFailed = true; - return false; - } - - bytesWritten += bytes; - lengthInSamples += (uint64) numSamples; - return true; - } - - bool flush() override - { - const int64 lastWritePos = output->getPosition(); - writeHeader(); - - if (output->setPosition (lastWritePos)) - return true; - - // if this fails, you've given it an output stream that can't seek! It needs - // to be able to seek back to write the header - jassertfalse; - return false; - } - -private: - MemoryBlock tempBlock, bwavChunk, axmlChunk, smplChunk, instChunk, cueChunk, listChunk, listInfoChunk, acidChunk, trckChunk; - uint64 lengthInSamples, bytesWritten; - int64 headerPosition; - bool writeFailed; - - static int getChannelMask (const int numChannels) noexcept - { - switch (numChannels) - { - case 1: return 0; - case 2: return 1 + 2; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT - case 3: return 1 + 2 + 4; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER - case 4: return 1 + 2 + 16 + 32; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT - case 5: return 1 + 2 + 4 + 16 + 32; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT - case 6: return 1 + 2 + 4 + 8 + 16 + 32; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT - case 7: return 1 + 2 + 4 + 16 + 32 + 512 + 1024; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT - case 8: return 1 + 2 + 4 + 8 + 16 + 32 + 512 + 1024; // SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT - default: break; - } - - return 0; - } - - void writeHeader() - { - if ((bytesWritten & 1) != 0) // pad to an even length - output->writeByte (0); - - using namespace WavFileHelpers; - - if (headerPosition != output->getPosition() && ! output->setPosition (headerPosition)) - { - // if this fails, you've given it an output stream that can't seek! It needs to be - // able to seek back to go back and write the header after the data has been written. - jassertfalse; - return; - } - - const size_t bytesPerFrame = numChannels * bitsPerSample / 8; - uint64 audioDataSize = bytesPerFrame * lengthInSamples; - - const bool isRF64 = (bytesWritten >= 0x100000000LL); - const bool isWaveFmtEx = isRF64 || (numChannels > 2); - - int64 riffChunkSize = (int64) (4 /* 'RIFF' */ + 8 + 40 /* WAVEFORMATEX */ - + 8 + audioDataSize + (audioDataSize & 1) - + chunkSize (bwavChunk) - + chunkSize (axmlChunk) - + chunkSize (smplChunk) - + chunkSize (instChunk) - + chunkSize (cueChunk) - + chunkSize (listChunk) - + chunkSize (listInfoChunk) - + chunkSize (acidChunk) - + chunkSize (trckChunk) - + (8 + 28)); // (ds64 chunk) - - riffChunkSize += (riffChunkSize & 1); - - if (isRF64) - writeChunkHeader (chunkName ("RF64"), -1); - else - writeChunkHeader (chunkName ("RIFF"), (int) riffChunkSize); - - output->writeInt (chunkName ("WAVE")); - - if (! isRF64) - { - #if ! JUCE_WAV_DO_NOT_PAD_HEADER_SIZE - /* NB: This junk chunk is added for padding, so that the header is a fixed size - regardless of whether it's RF64 or not. That way, we can begin recording a file, - and when it's finished, can go back and write either a RIFF or RF64 header, - depending on whether more than 2^32 samples were written. - - The JUCE_WAV_DO_NOT_PAD_HEADER_SIZE macro allows you to disable this feature in case - you need to create files for crappy WAV players with bugs that stop them skipping chunks - which they don't recognise. But DO NOT USE THIS option unless you really have no choice, - because it means that if you write more than 2^32 samples to the file, you'll corrupt it. - */ - writeChunkHeader (chunkName ("JUNK"), 28 + (isWaveFmtEx? 0 : 24)); - output->writeRepeatedByte (0, 28 /* ds64 */ + (isWaveFmtEx? 0 : 24)); - #endif - } - else - { - #if JUCE_WAV_DO_NOT_PAD_HEADER_SIZE - // If you disable padding, then you MUST NOT write more than 2^32 samples to a file. - jassertfalse; - #endif - - writeChunkHeader (chunkName ("ds64"), 28); // chunk size for uncompressed data (no table) - output->writeInt64 (riffChunkSize); - output->writeInt64 ((int64) audioDataSize); - output->writeRepeatedByte (0, 12); - } - - if (isWaveFmtEx) - { - writeChunkHeader (chunkName ("fmt "), 40); - output->writeShort ((short) (uint16) 0xfffe); // WAVE_FORMAT_EXTENSIBLE - } - else - { - writeChunkHeader (chunkName ("fmt "), 16); - output->writeShort (bitsPerSample < 32 ? (short) 1 /*WAVE_FORMAT_PCM*/ - : (short) 3 /*WAVE_FORMAT_IEEE_FLOAT*/); - } - - output->writeShort ((short) numChannels); - output->writeInt ((int) sampleRate); - output->writeInt ((int) (bytesPerFrame * sampleRate)); // nAvgBytesPerSec - output->writeShort ((short) bytesPerFrame); // nBlockAlign - output->writeShort ((short) bitsPerSample); // wBitsPerSample - - if (isWaveFmtEx) - { - output->writeShort (22); // cbSize (size of the extension) - output->writeShort ((short) bitsPerSample); // wValidBitsPerSample - output->writeInt (getChannelMask ((int) numChannels)); - - const ExtensibleWavSubFormat& subFormat = bitsPerSample < 32 ? pcmFormat : IEEEFloatFormat; - - output->writeInt ((int) subFormat.data1); - output->writeShort ((short) subFormat.data2); - output->writeShort ((short) subFormat.data3); - output->write (subFormat.data4, sizeof (subFormat.data4)); - } - - writeChunk (bwavChunk, chunkName ("bext")); - writeChunk (axmlChunk, chunkName ("axml")); - writeChunk (smplChunk, chunkName ("smpl")); - writeChunk (instChunk, chunkName ("inst"), 7); - writeChunk (cueChunk, chunkName ("cue ")); - writeChunk (listChunk, chunkName ("LIST")); - writeChunk (listInfoChunk, chunkName ("LIST")); - writeChunk (acidChunk, chunkName ("acid")); - writeChunk (trckChunk, chunkName ("Trkn")); - - writeChunkHeader (chunkName ("data"), isRF64 ? -1 : (int) (lengthInSamples * bytesPerFrame)); - - usesFloatingPointData = (bitsPerSample == 32); - } - - static size_t chunkSize (const MemoryBlock& data) noexcept { return data.getSize() > 0 ? (8 + data.getSize()) : 0; } - - void writeChunkHeader (int chunkType, int size) const - { - output->writeInt (chunkType); - output->writeInt (size); - } - - void writeChunk (const MemoryBlock& data, int chunkType, int size = 0) const - { - if (data.getSize() > 0) - { - writeChunkHeader (chunkType, size != 0 ? size : (int) data.getSize()); - *output << data; - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavAudioFormatWriter) -}; - -//============================================================================== -class MemoryMappedWavReader : public MemoryMappedAudioFormatReader -{ -public: - MemoryMappedWavReader (const File& file, const WavAudioFormatReader& reader) - : MemoryMappedAudioFormatReader (file, reader, reader.dataChunkStart, - reader.dataLength, reader.bytesPerFrame) - { - } - - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override - { - clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, - startSampleInFile, numSamples, lengthInSamples); - - if (map == nullptr || ! mappedSection.contains (Range (startSampleInFile, startSampleInFile + numSamples))) - { - jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. - return false; - } - - WavAudioFormatReader::copySampleData (bitsPerSample, usesFloatingPointData, - destSamples, startOffsetInDestBuffer, numDestChannels, - sampleToPointer (startSampleInFile), (int) numChannels, numSamples); - return true; - } - - void getSample (int64 sample, float* result) const noexcept override - { - const int num = (int) numChannels; - - if (map == nullptr || ! mappedSection.contains (sample)) - { - jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. - - zeromem (result, sizeof (float) * (size_t) num); - return; - } - - float** dest = &result; - const void* source = sampleToPointer (sample); - - switch (bitsPerSample) - { - case 8: ReadHelper::read (dest, 0, 1, source, 1, num); break; - case 16: ReadHelper::read (dest, 0, 1, source, 1, num); break; - case 24: ReadHelper::read (dest, 0, 1, source, 1, num); break; - case 32: if (usesFloatingPointData) ReadHelper::read (dest, 0, 1, source, 1, num); - else ReadHelper::read (dest, 0, 1, source, 1, num); break; - default: jassertfalse; break; - } - } - - void readMaxLevels (int64 startSampleInFile, int64 numSamples, Range* results, int numChannelsToRead) override - { - if (numSamples <= 0) - { - for (int i = 0; i < numChannelsToRead; ++i) - results[i] = Range(); - - return; - } - - if (map == nullptr || ! mappedSection.contains (Range (startSampleInFile, startSampleInFile + numSamples))) - { - jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. - - for (int i = 0; i < numChannelsToRead; ++i) - results[i] = Range(); - - return; - } - - switch (bitsPerSample) - { - case 8: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; - case 16: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; - case 24: scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; - case 32: if (usesFloatingPointData) scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); - else scanMinAndMax (startSampleInFile, numSamples, results, numChannelsToRead); break; - default: jassertfalse; break; - } - } - -private: - template - void scanMinAndMax (int64 startSampleInFile, int64 numSamples, Range* results, int numChannelsToRead) const noexcept - { - for (int i = 0; i < numChannelsToRead; ++i) - results[i] = scanMinAndMaxInterleaved (i, startSampleInFile, numSamples); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedWavReader) -}; - -//============================================================================== -WavAudioFormat::WavAudioFormat() : AudioFormat (wavFormatName, ".wav .bwf") {} -WavAudioFormat::~WavAudioFormat() {} - -Array WavAudioFormat::getPossibleSampleRates() -{ - const int rates[] = { 8000, 11025, 12000, 16000, 22050, 32000, 44100, - 48000, 88200, 96000, 176400, 192000, 352800, 384000 }; - - return Array (rates, numElementsInArray (rates)); -} - -Array WavAudioFormat::getPossibleBitDepths() -{ - const int depths[] = { 8, 16, 24, 32 }; - - return Array (depths, numElementsInArray (depths)); -} - -bool WavAudioFormat::canDoStereo() { return true; } -bool WavAudioFormat::canDoMono() { return true; } - -AudioFormatReader* WavAudioFormat::createReaderFor (InputStream* sourceStream, - const bool deleteStreamIfOpeningFails) -{ - ScopedPointer r (new WavAudioFormatReader (sourceStream)); - - if (r->sampleRate > 0 && r->numChannels > 0 && r->bytesPerFrame > 0) - return r.release(); - - if (! deleteStreamIfOpeningFails) - r->input = nullptr; - - return nullptr; -} - -MemoryMappedAudioFormatReader* WavAudioFormat::createMemoryMappedReader (const File& file) -{ - if (FileInputStream* fin = file.createInputStream()) - { - WavAudioFormatReader reader (fin); - - if (reader.lengthInSamples > 0) - return new MemoryMappedWavReader (file, reader); - } - - return nullptr; -} - -AudioFormatWriter* WavAudioFormat::createWriterFor (OutputStream* out, double sampleRate, - unsigned int numChannels, int bitsPerSample, - const StringPairArray& metadataValues, int /*qualityOptionIndex*/) -{ - if (getPossibleBitDepths().contains (bitsPerSample)) - return new WavAudioFormatWriter (out, sampleRate, (unsigned int) numChannels, - (unsigned int) bitsPerSample, metadataValues); - - return nullptr; -} - -namespace WavFileHelpers -{ - static bool slowCopyWavFileWithNewMetadata (const File& file, const StringPairArray& metadata) - { - TemporaryFile tempFile (file); - - WavAudioFormat wav; - ScopedPointer reader (wav.createReaderFor (file.createInputStream(), true)); - - if (reader != nullptr) - { - ScopedPointer outStream (tempFile.getFile().createOutputStream()); - - if (outStream != nullptr) - { - ScopedPointer writer (wav.createWriterFor (outStream, reader->sampleRate, - reader->numChannels, (int) reader->bitsPerSample, - metadata, 0)); - - if (writer != nullptr) - { - outStream.release(); - - bool ok = writer->writeFromAudioReader (*reader, 0, -1); - writer = nullptr; - reader = nullptr; - - return ok && tempFile.overwriteTargetFileWithTemporary(); - } - } - } - - return false; - } -} - -bool WavAudioFormat::replaceMetadataInFile (const File& wavFile, const StringPairArray& newMetadata) -{ - using namespace WavFileHelpers; - ScopedPointer reader (static_cast (createReaderFor (wavFile.createInputStream(), true))); - - if (reader != nullptr) - { - const int64 bwavPos = reader->bwavChunkStart; - const int64 bwavSize = reader->bwavSize; - reader = nullptr; - - if (bwavSize > 0) - { - MemoryBlock chunk (BWAVChunk::createFrom (newMetadata)); - - if (chunk.getSize() <= (size_t) bwavSize) - { - // the new one will fit in the space available, so write it directly.. - const int64 oldSize = wavFile.getSize(); - - { - FileOutputStream out (wavFile); - - if (! out.failedToOpen()) - { - out.setPosition (bwavPos); - out << chunk; - out.setPosition (oldSize); - } - } - - jassert (wavFile.getSize() == oldSize); - - return true; - } - } - } - - return slowCopyWavFileWithNewMetadata (wavFile, newMetadata); -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h deleted file mode 100755 index 62de05a..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WavAudioFormat.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -//============================================================================== -/** - Reads and Writes WAV format audio files. - - @see AudioFormat -*/ -class JUCE_API WavAudioFormat : public AudioFormat -{ -public: - //============================================================================== - /** Creates a format object. */ - WavAudioFormat(); - - /** Destructor. */ - ~WavAudioFormat(); - - //============================================================================== - /** Metadata property name used by wav readers and writers for adding - a BWAV chunk to the file. - - @see AudioFormatReader::metadataValues, createWriterFor - */ - static const char* const bwavDescription; - - /** Metadata property name used by wav readers and writers for adding - a BWAV chunk to the file. - - @see AudioFormatReader::metadataValues, createWriterFor - */ - static const char* const bwavOriginator; - - /** Metadata property name used by wav readers and writers for adding - a BWAV chunk to the file. - - @see AudioFormatReader::metadataValues, createWriterFor - */ - static const char* const bwavOriginatorRef; - - /** Metadata property name used by wav readers and writers for adding - a BWAV chunk to the file. - - Date format is: yyyy-mm-dd - - @see AudioFormatReader::metadataValues, createWriterFor - */ - static const char* const bwavOriginationDate; - - /** Metadata property name used by wav readers and writers for adding - a BWAV chunk to the file. - - Time format is: hh-mm-ss - - @see AudioFormatReader::metadataValues, createWriterFor - */ - static const char* const bwavOriginationTime; - - /** Metadata property name used by wav readers and writers for adding - a BWAV chunk to the file. - - This is the number of samples from the start of an edit that the - file is supposed to begin at. Seems like an obvious mistake to - only allow a file to occur in an edit once, but that's the way - it is.. - - @see AudioFormatReader::metadataValues, createWriterFor - */ - static const char* const bwavTimeReference; - - /** Metadata property name used by wav readers and writers for adding - a BWAV chunk to the file. - - @see AudioFormatReader::metadataValues, createWriterFor - */ - static const char* const bwavCodingHistory; - - /** Utility function to fill out the appropriate metadata for a BWAV file. - - This just makes it easier than using the property names directly, and it - fills out the time and date in the right format. - */ - static StringPairArray createBWAVMetadata (const String& description, - const String& originator, - const String& originatorRef, - const Time dateAndTime, - const int64 timeReferenceSamples, - const String& codingHistory); - - //============================================================================== - /** Metadata property name used when reading a WAV file with an acid chunk. */ - static const char* const acidOneShot; - /** Metadata property name used when reading a WAV file with an acid chunk. */ - static const char* const acidRootSet; - /** Metadata property name used when reading a WAV file with an acid chunk. */ - static const char* const acidStretch; - /** Metadata property name used when reading a WAV file with an acid chunk. */ - static const char* const acidDiskBased; - /** Metadata property name used when reading a WAV file with an acid chunk. */ - static const char* const acidizerFlag; - /** Metadata property name used when reading a WAV file with an acid chunk. */ - static const char* const acidRootNote; - /** Metadata property name used when reading a WAV file with an acid chunk. */ - static const char* const acidBeats; - /** Metadata property name used when reading a WAV file with an acid chunk. */ - static const char* const acidDenominator; - /** Metadata property name used when reading a WAV file with an acid chunk. */ - static const char* const acidNumerator; - /** Metadata property name used when reading a WAV file with an acid chunk. */ - static const char* const acidTempo; - - //============================================================================== - /** Metadata property name used when reading an ISRC code from an AXML chunk. */ - static const char* const ISRC; - - /** Metadata property name used when reading a WAV file with a Tracktion chunk. */ - static const char* const tracktionLoopInfo; - - //============================================================================== - Array getPossibleSampleRates() override; - Array getPossibleBitDepths() override; - bool canDoStereo() override; - bool canDoMono() override; - - //============================================================================== - AudioFormatReader* createReaderFor (InputStream* sourceStream, - bool deleteStreamIfOpeningFails) override; - - MemoryMappedAudioFormatReader* createMemoryMappedReader (const File& file) override; - - AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) override; - - //============================================================================== - /** Utility function to replace the metadata in a wav file with a new set of values. - - If possible, this cheats by overwriting just the metadata region of the file, rather - than by copying the whole file again. - */ - bool replaceMetadataInFile (const File& wavFile, const StringPairArray& newMetadata); - - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavAudioFormat) -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp deleted file mode 100755 index f5f5664..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.cpp +++ /dev/null @@ -1,350 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace WindowsMediaCodec -{ - -class JuceIStream : public ComBaseClassHelper -{ -public: - JuceIStream (InputStream& in) noexcept - : ComBaseClassHelper (0), source (in) - { - } - - JUCE_COMRESULT Commit (DWORD) { return S_OK; } - JUCE_COMRESULT Write (const void*, ULONG, ULONG*) { return E_NOTIMPL; } - JUCE_COMRESULT Clone (IStream**) { return E_NOTIMPL; } - JUCE_COMRESULT SetSize (ULARGE_INTEGER) { return E_NOTIMPL; } - JUCE_COMRESULT Revert() { return E_NOTIMPL; } - JUCE_COMRESULT LockRegion (ULARGE_INTEGER, ULARGE_INTEGER, DWORD) { return E_NOTIMPL; } - JUCE_COMRESULT UnlockRegion (ULARGE_INTEGER, ULARGE_INTEGER, DWORD) { return E_NOTIMPL; } - - JUCE_COMRESULT Read (void* dest, ULONG numBytes, ULONG* bytesRead) - { - const int numRead = source.read (dest, numBytes); - - if (bytesRead != nullptr) - *bytesRead = numRead; - - return (numRead == (int) numBytes) ? S_OK : S_FALSE; - } - - JUCE_COMRESULT Seek (LARGE_INTEGER position, DWORD origin, ULARGE_INTEGER* resultPosition) - { - int64 newPos = (int64) position.QuadPart; - - if (origin == STREAM_SEEK_CUR) - { - newPos += source.getPosition(); - } - else if (origin == STREAM_SEEK_END) - { - const int64 len = source.getTotalLength(); - if (len < 0) - return E_NOTIMPL; - - newPos += len; - } - - if (resultPosition != nullptr) - resultPosition->QuadPart = newPos; - - return source.setPosition (newPos) ? S_OK : E_NOTIMPL; - } - - JUCE_COMRESULT CopyTo (IStream* destStream, ULARGE_INTEGER numBytesToDo, - ULARGE_INTEGER* bytesRead, ULARGE_INTEGER* bytesWritten) - { - uint64 totalCopied = 0; - int64 numBytes = numBytesToDo.QuadPart; - - while (numBytes > 0 && ! source.isExhausted()) - { - char buffer [1024]; - - const int numToCopy = (int) jmin ((int64) sizeof (buffer), (int64) numBytes); - const int numRead = source.read (buffer, numToCopy); - - if (numRead <= 0) - break; - - destStream->Write (buffer, numRead, nullptr); - totalCopied += numRead; - } - - if (bytesRead != nullptr) bytesRead->QuadPart = totalCopied; - if (bytesWritten != nullptr) bytesWritten->QuadPart = totalCopied; - - return S_OK; - } - - JUCE_COMRESULT Stat (STATSTG* stat, DWORD) - { - if (stat == nullptr) - return STG_E_INVALIDPOINTER; - - zerostruct (*stat); - stat->type = STGTY_STREAM; - stat->cbSize.QuadPart = jmax ((int64) 0, source.getTotalLength()); - return S_OK; - } - -private: - InputStream& source; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceIStream) -}; - -//============================================================================== -static const char* wmFormatName = "Windows Media"; -static const char* const extensions[] = { ".mp3", ".wmv", ".asf", ".wm", ".wma", 0 }; - -//============================================================================== -class WMAudioReader : public AudioFormatReader -{ -public: - WMAudioReader (InputStream* const input_) - : AudioFormatReader (input_, TRANS (wmFormatName)), - wmvCoreLib ("Wmvcore.dll") - { - JUCE_LOAD_WINAPI_FUNCTION (wmvCoreLib, WMCreateSyncReader, wmCreateSyncReader, - HRESULT, (IUnknown*, DWORD, IWMSyncReader**)) - - if (wmCreateSyncReader != nullptr) - { - checkCoInitialiseCalled(); - - HRESULT hr = wmCreateSyncReader (nullptr, WMT_RIGHT_PLAYBACK, wmSyncReader.resetAndGetPointerAddress()); - - if (SUCCEEDED (hr)) - hr = wmSyncReader->OpenStream (new JuceIStream (*input)); - - if (SUCCEEDED (hr)) - { - WORD streamNum = 1; - hr = wmSyncReader->GetStreamNumberForOutput (0, &streamNum); - hr = wmSyncReader->SetReadStreamSamples (streamNum, false); - - scanFileForDetails(); - } - } - } - - ~WMAudioReader() - { - if (wmSyncReader != nullptr) - wmSyncReader->Close(); - } - - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override - { - if (sampleRate <= 0) - return false; - - checkCoInitialiseCalled(); - - const int stride = numChannels * sizeof (int16); - - while (numSamples > 0) - { - if (! bufferedRange.contains (startSampleInFile)) - { - const bool hasJumped = (startSampleInFile != bufferedRange.getEnd()); - - if (hasJumped) - wmSyncReader->SetRange ((QWORD) (startSampleInFile * 10000000 / (int64) sampleRate), 0); - - ComSmartPtr sampleBuffer; - QWORD sampleTime, duration; - DWORD flags, outputNum; - WORD streamNum; - - HRESULT hr = wmSyncReader->GetNextSample (1, sampleBuffer.resetAndGetPointerAddress(), - &sampleTime, &duration, &flags, &outputNum, &streamNum); - - if (sampleBuffer != nullptr) - { - BYTE* rawData = nullptr; - DWORD dataLength = 0; - hr = sampleBuffer->GetBufferAndLength (&rawData, &dataLength); - - if (dataLength == 0) - return false; - - if (hasJumped) - bufferedRange.setStart ((int64) ((sampleTime * (int64) sampleRate) / 10000000)); - else - bufferedRange.setStart (bufferedRange.getEnd()); // (because the positions returned often aren't continguous) - - bufferedRange.setLength ((int64) (dataLength / stride)); - - buffer.ensureSize ((int) dataLength); - memcpy (buffer.getData(), rawData, (size_t) dataLength); - } - else if (hr == NS_E_NO_MORE_SAMPLES) - { - bufferedRange.setStart (startSampleInFile); - bufferedRange.setLength (256); - buffer.ensureSize (256 * stride); - buffer.fillWith (0); - } - else - { - return false; - } - } - - const int offsetInBuffer = (int) (startSampleInFile - bufferedRange.getStart()); - const int16* const rawData = static_cast (addBytesToPointer (buffer.getData(), offsetInBuffer * stride)); - const int numToDo = jmin (numSamples, (int) (bufferedRange.getLength() - offsetInBuffer)); - - for (int i = 0; i < numDestChannels; ++i) - { - jassert (destSamples[i] != nullptr); - - const int srcChan = jmin (i, (int) numChannels - 1); - const int16* src = rawData + srcChan; - int* const dst = destSamples[i] + startOffsetInDestBuffer; - - for (int j = 0; j < numToDo; ++j) - { - dst[j] = ((uint32) *src) << 16; - src += numChannels; - } - } - - startSampleInFile += numToDo; - startOffsetInDestBuffer += numToDo; - numSamples -= numToDo; - } - - return true; - } - -private: - DynamicLibrary wmvCoreLib; - ComSmartPtr wmSyncReader; - MemoryBlock buffer; - Range bufferedRange; - - void checkCoInitialiseCalled() - { - CoInitialize (0); - } - - void scanFileForDetails() - { - ComSmartPtr wmHeaderInfo; - HRESULT hr = wmSyncReader.QueryInterface (wmHeaderInfo); - - if (SUCCEEDED (hr)) - { - QWORD lengthInNanoseconds = 0; - WORD lengthOfLength = sizeof (lengthInNanoseconds); - WORD streamNum = 0; - WMT_ATTR_DATATYPE wmAttrDataType; - hr = wmHeaderInfo->GetAttributeByName (&streamNum, L"Duration", &wmAttrDataType, - (BYTE*) &lengthInNanoseconds, &lengthOfLength); - - ComSmartPtr wmProfile; - hr = wmSyncReader.QueryInterface (wmProfile); - - if (SUCCEEDED (hr)) - { - ComSmartPtr wmStreamConfig; - hr = wmProfile->GetStream (0, wmStreamConfig.resetAndGetPointerAddress()); - - if (SUCCEEDED (hr)) - { - ComSmartPtr wmMediaProperties; - hr = wmStreamConfig.QueryInterface (wmMediaProperties); - - if (SUCCEEDED (hr)) - { - DWORD sizeMediaType; - hr = wmMediaProperties->GetMediaType (0, &sizeMediaType); - - HeapBlock mediaType; - mediaType.malloc (sizeMediaType, 1); - hr = wmMediaProperties->GetMediaType (mediaType, &sizeMediaType); - - if (mediaType->majortype == WMMEDIATYPE_Audio) - { - const WAVEFORMATEX* const inputFormat = reinterpret_cast (mediaType->pbFormat); - - sampleRate = inputFormat->nSamplesPerSec; - numChannels = inputFormat->nChannels; - bitsPerSample = inputFormat->wBitsPerSample; - lengthInSamples = (lengthInNanoseconds * (int) sampleRate) / 10000000; - } - } - } - } - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WMAudioReader) -}; - -} - -//============================================================================== -WindowsMediaAudioFormat::WindowsMediaAudioFormat() - : AudioFormat (TRANS (WindowsMediaCodec::wmFormatName), - StringArray (WindowsMediaCodec::extensions)) -{ -} - -WindowsMediaAudioFormat::~WindowsMediaAudioFormat() {} - -Array WindowsMediaAudioFormat::getPossibleSampleRates() { return Array(); } -Array WindowsMediaAudioFormat::getPossibleBitDepths() { return Array(); } - -bool WindowsMediaAudioFormat::canDoStereo() { return true; } -bool WindowsMediaAudioFormat::canDoMono() { return true; } -bool WindowsMediaAudioFormat::isCompressed() { return true; } - -//============================================================================== -AudioFormatReader* WindowsMediaAudioFormat::createReaderFor (InputStream* sourceStream, bool deleteStreamIfOpeningFails) -{ - ScopedPointer r (new WindowsMediaCodec::WMAudioReader (sourceStream)); - - if (r->sampleRate > 0) - return r.release(); - - if (! deleteStreamIfOpeningFails) - r->input = nullptr; - - return nullptr; -} - -AudioFormatWriter* WindowsMediaAudioFormat::createWriterFor (OutputStream* /*streamToWriteTo*/, double /*sampleRateToUse*/, - unsigned int /*numberOfChannels*/, int /*bitsPerSample*/, - const StringPairArray& /*metadataValues*/, int /*qualityOptionIndex*/) -{ - jassertfalse; // not yet implemented! - return nullptr; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h deleted file mode 100755 index 8c10ee1..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_WINDOWS || DOXYGEN - -//============================================================================== -/** - Audio format which uses the Windows Media codecs (Windows only). -*/ -class WindowsMediaAudioFormat : public AudioFormat -{ -public: - //============================================================================== - WindowsMediaAudioFormat(); - ~WindowsMediaAudioFormat(); - - //============================================================================== - Array getPossibleSampleRates() override; - Array getPossibleBitDepths() override; - bool canDoStereo() override; - bool canDoMono() override; - bool isCompressed() override; - - //============================================================================== - AudioFormatReader* createReaderFor (InputStream*, bool deleteStreamIfOpeningFails) override; - - AudioFormatWriter* createWriterFor (OutputStream*, double sampleRateToUse, - unsigned int numberOfChannels, int bitsPerSample, - const StringPairArray& metadataValues, int qualityOptionIndex) override; -}; - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt deleted file mode 100755 index 254dd52..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/Ogg Vorbis Licence.txt +++ /dev/null @@ -1,47 +0,0 @@ -===================================================================== - -I've incorporated Ogg-Vorbis directly into the Juce codebase because it makes -things much easier than having to make all your builds link correctly to -the appropriate libraries on every different platform. - -I've made minimal changes to the Ogg-Vorbis code - just tweaked a few include -paths to make it build smoothly, and added some headers to allow you to exclude -it from the build. - -===================================================================== - -The following license is the BSD-style license that comes with the -Ogg-Vorbis distribution, and which applies just to the header files I've -included in this directory. For more info, and to get the rest of the -distribution, visit the Ogg-Vorbis homepage: www.vorbis.com - -===================================================================== - -Copyright (c) 2002-2004 Xiph.org Foundation - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -- Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -- Neither the name of the Xiph.org Foundation nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c deleted file mode 100755 index 710a560..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/bitwise.c +++ /dev/null @@ -1,784 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: packing variable sized words into an octet stream - last mod: $Id: bitwise.c,v 1.1 2007/06/07 17:48:18 jules_rms Exp $ - - ********************************************************************/ - -/* We're 'LSb' endian; if we write a word but read individual bits, - then we'll read the lsb first */ - -#include -#include -#include "ogg.h" - -#define BUFFER_INCREMENT 256 - -static const unsigned long mask[]= -{0x00000000,0x00000001,0x00000003,0x00000007,0x0000000f, - 0x0000001f,0x0000003f,0x0000007f,0x000000ff,0x000001ff, - 0x000003ff,0x000007ff,0x00000fff,0x00001fff,0x00003fff, - 0x00007fff,0x0000ffff,0x0001ffff,0x0003ffff,0x0007ffff, - 0x000fffff,0x001fffff,0x003fffff,0x007fffff,0x00ffffff, - 0x01ffffff,0x03ffffff,0x07ffffff,0x0fffffff,0x1fffffff, - 0x3fffffff,0x7fffffff,0xffffffff }; - -static const unsigned int mask8B[]= -{0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff}; - -void oggpack_writeinit(oggpack_buffer *b){ - memset(b,0,sizeof(*b)); - b->ptr=b->buffer=(unsigned char*) _ogg_malloc(BUFFER_INCREMENT); - b->buffer[0]='\0'; - b->storage=BUFFER_INCREMENT; -} - -void oggpackB_writeinit(oggpack_buffer *b){ - oggpack_writeinit(b); -} - -void oggpack_writetrunc(oggpack_buffer *b,long bits){ - long bytes=bits>>3; - bits-=bytes*8; - b->ptr=b->buffer+bytes; - b->endbit=bits; - b->endbyte=bytes; - *b->ptr&=mask[bits]; -} - -void oggpackB_writetrunc(oggpack_buffer *b,long bits){ - long bytes=bits>>3; - bits-=bytes*8; - b->ptr=b->buffer+bytes; - b->endbit=bits; - b->endbyte=bytes; - *b->ptr&=mask8B[bits]; -} - -/* Takes only up to 32 bits. */ -void oggpack_write(oggpack_buffer *b,unsigned long value,int bits){ - if(b->endbyte+4>=b->storage){ - b->buffer=(unsigned char*) _ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); - b->storage+=BUFFER_INCREMENT; - b->ptr=b->buffer+b->endbyte; - } - - value&=mask[bits]; - bits+=b->endbit; - - b->ptr[0]|=value<endbit; - - if(bits>=8){ - b->ptr[1]=(unsigned char)(value>>(8-b->endbit)); - if(bits>=16){ - b->ptr[2]=(unsigned char)(value>>(16-b->endbit)); - if(bits>=24){ - b->ptr[3]=(unsigned char)(value>>(24-b->endbit)); - if(bits>=32){ - if(b->endbit) - b->ptr[4]=(unsigned char)(value>>(32-b->endbit)); - else - b->ptr[4]=0; - } - } - } - } - - b->endbyte+=bits/8; - b->ptr+=bits/8; - b->endbit=bits&7; -} - -/* Takes only up to 32 bits. */ -void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits){ - if(b->endbyte+4>=b->storage){ - b->buffer=(unsigned char*) _ogg_realloc(b->buffer,b->storage+BUFFER_INCREMENT); - b->storage+=BUFFER_INCREMENT; - b->ptr=b->buffer+b->endbyte; - } - - value=(value&mask[bits])<<(32-bits); - bits+=b->endbit; - - b->ptr[0]|=value>>(24+b->endbit); - - if(bits>=8){ - b->ptr[1]=(unsigned char)(value>>(16+b->endbit)); - if(bits>=16){ - b->ptr[2]=(unsigned char)(value>>(8+b->endbit)); - if(bits>=24){ - b->ptr[3]=(unsigned char)(value>>(b->endbit)); - if(bits>=32){ - if(b->endbit) - b->ptr[4]=(unsigned char)(value<<(8-b->endbit)); - else - b->ptr[4]=0; - } - } - } - } - - b->endbyte+=bits/8; - b->ptr+=bits/8; - b->endbit=bits&7; -} - -void oggpack_writealign(oggpack_buffer *b){ - int bits=8-b->endbit; - if(bits<8) - oggpack_write(b,0,bits); -} - -void oggpackB_writealign(oggpack_buffer *b){ - int bits=8-b->endbit; - if(bits<8) - oggpackB_write(b,0,bits); -} - -static void oggpack_writecopy_helper(oggpack_buffer *b, - void *source, - long bits, - void (*w)(oggpack_buffer *, - unsigned long, - int), - int msb){ - unsigned char *ptr=(unsigned char *)source; - - long bytes=bits/8; - bits-=bytes*8; - - if(b->endbit){ - int i; - /* unaligned copy. Do it the hard way. */ - for(i=0;iendbyte+bytes+1>=b->storage){ - b->storage=b->endbyte+bytes+BUFFER_INCREMENT; - b->buffer=(unsigned char*) _ogg_realloc(b->buffer,b->storage); - b->ptr=b->buffer+b->endbyte; - } - - memmove(b->ptr,source,bytes); - b->ptr+=bytes; - b->endbyte+=bytes; - *b->ptr=0; - - } - if(bits){ - if(msb) - w(b,(unsigned long)(ptr[bytes]>>(8-bits)),bits); - else - w(b,(unsigned long)(ptr[bytes]),bits); - } -} - -void oggpack_writecopy(oggpack_buffer *b,void *source,long bits){ - oggpack_writecopy_helper(b,source,bits,oggpack_write,0); -} - -void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits){ - oggpack_writecopy_helper(b,source,bits,oggpackB_write,1); -} - -void oggpack_reset(oggpack_buffer *b){ - b->ptr=b->buffer; - b->buffer[0]=0; - b->endbit=b->endbyte=0; -} - -void oggpackB_reset(oggpack_buffer *b){ - oggpack_reset(b); -} - -void oggpack_writeclear(oggpack_buffer *b){ - _ogg_free(b->buffer); - memset(b,0,sizeof(*b)); -} - -void oggpackB_writeclear(oggpack_buffer *b){ - oggpack_writeclear(b); -} - -void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ - memset(b,0,sizeof(*b)); - b->buffer=b->ptr=buf; - b->storage=bytes; -} - -void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes){ - oggpack_readinit(b,buf,bytes); -} - -/* Read in bits without advancing the bitptr; bits <= 32 */ -long oggpack_look(oggpack_buffer *b,int bits){ - unsigned long ret; - unsigned long m=mask[bits]; - - bits+=b->endbit; - - if(b->endbyte+4>=b->storage){ - /* not the main path */ - if(b->endbyte*8+bits>b->storage*8)return(-1); - } - - ret=b->ptr[0]>>b->endbit; - if(bits>8){ - ret|=b->ptr[1]<<(8-b->endbit); - if(bits>16){ - ret|=b->ptr[2]<<(16-b->endbit); - if(bits>24){ - ret|=b->ptr[3]<<(24-b->endbit); - if(bits>32 && b->endbit) - ret|=b->ptr[4]<<(32-b->endbit); - } - } - } - return(m&ret); -} - -/* Read in bits without advancing the bitptr; bits <= 32 */ -long oggpackB_look(oggpack_buffer *b,int bits){ - unsigned long ret; - int m=32-bits; - - bits+=b->endbit; - - if(b->endbyte+4>=b->storage){ - /* not the main path */ - if(b->endbyte*8+bits>b->storage*8)return(-1); - } - - ret=b->ptr[0]<<(24+b->endbit); - if(bits>8){ - ret|=b->ptr[1]<<(16+b->endbit); - if(bits>16){ - ret|=b->ptr[2]<<(8+b->endbit); - if(bits>24){ - ret|=b->ptr[3]<<(b->endbit); - if(bits>32 && b->endbit) - ret|=b->ptr[4]>>(8-b->endbit); - } - } - } - return ((ret&0xffffffff)>>(m>>1))>>((m+1)>>1); -} - -long oggpack_look1(oggpack_buffer *b){ - if(b->endbyte>=b->storage)return(-1); - return((b->ptr[0]>>b->endbit)&1); -} - -long oggpackB_look1(oggpack_buffer *b){ - if(b->endbyte>=b->storage)return(-1); - return((b->ptr[0]>>(7-b->endbit))&1); -} - -void oggpack_adv(oggpack_buffer *b,int bits){ - bits+=b->endbit; - b->ptr+=bits/8; - b->endbyte+=bits/8; - b->endbit=bits&7; -} - -void oggpackB_adv(oggpack_buffer *b,int bits){ - oggpack_adv(b,bits); -} - -void oggpack_adv1(oggpack_buffer *b){ - if(++(b->endbit)>7){ - b->endbit=0; - b->ptr++; - b->endbyte++; - } -} - -void oggpackB_adv1(oggpack_buffer *b){ - oggpack_adv1(b); -} - -/* bits <= 32 */ -long oggpack_read(oggpack_buffer *b,int bits){ - long ret; - unsigned long m=mask[bits]; - - bits+=b->endbit; - - if(b->endbyte+4>=b->storage){ - /* not the main path */ - ret=-1L; - if(b->endbyte*8+bits>b->storage*8)goto overflow; - } - - ret=b->ptr[0]>>b->endbit; - if(bits>8){ - ret|=b->ptr[1]<<(8-b->endbit); - if(bits>16){ - ret|=b->ptr[2]<<(16-b->endbit); - if(bits>24){ - ret|=b->ptr[3]<<(24-b->endbit); - if(bits>32 && b->endbit){ - ret|=b->ptr[4]<<(32-b->endbit); - } - } - } - } - ret&=m; - - overflow: - - b->ptr+=bits/8; - b->endbyte+=bits/8; - b->endbit=bits&7; - return(ret); -} - -/* bits <= 32 */ -long oggpackB_read(oggpack_buffer *b,int bits){ - long ret; - long m=32-bits; - - bits+=b->endbit; - - if(b->endbyte+4>=b->storage){ - /* not the main path */ - ret=-1L; - if(b->endbyte*8+bits>b->storage*8)goto overflow; - } - - ret=b->ptr[0]<<(24+b->endbit); - if(bits>8){ - ret|=b->ptr[1]<<(16+b->endbit); - if(bits>16){ - ret|=b->ptr[2]<<(8+b->endbit); - if(bits>24){ - ret|=b->ptr[3]<<(b->endbit); - if(bits>32 && b->endbit) - ret|=b->ptr[4]>>(8-b->endbit); - } - } - } - ret=((ret&0xffffffffUL)>>(m>>1))>>((m+1)>>1); - - overflow: - - b->ptr+=bits/8; - b->endbyte+=bits/8; - b->endbit=bits&7; - return(ret); -} - -long oggpack_read1(oggpack_buffer *b){ - long ret; - - if(b->endbyte>=b->storage){ - /* not the main path */ - ret=-1L; - goto overflow; - } - - ret=(b->ptr[0]>>b->endbit)&1; - - overflow: - - b->endbit++; - if(b->endbit>7){ - b->endbit=0; - b->ptr++; - b->endbyte++; - } - return(ret); -} - -long oggpackB_read1(oggpack_buffer *b){ - long ret; - - if(b->endbyte>=b->storage){ - /* not the main path */ - ret=-1L; - goto overflow; - } - - ret=(b->ptr[0]>>(7-b->endbit))&1; - - overflow: - - b->endbit++; - if(b->endbit>7){ - b->endbit=0; - b->ptr++; - b->endbyte++; - } - return(ret); -} - -long oggpack_bytes(oggpack_buffer *b){ - return(b->endbyte+(b->endbit+7)/8); -} - -long oggpack_bits(oggpack_buffer *b){ - return(b->endbyte*8+b->endbit); -} - -long oggpackB_bytes(oggpack_buffer *b){ - return oggpack_bytes(b); -} - -long oggpackB_bits(oggpack_buffer *b){ - return oggpack_bits(b); -} - -unsigned char *oggpack_get_buffer(oggpack_buffer *b){ - return(b->buffer); -} - -unsigned char *oggpackB_get_buffer(oggpack_buffer *b){ - return oggpack_get_buffer(b); -} - -/* Self test of the bitwise routines; everything else is based on - them, so they damned well better be solid. */ - -#ifdef _V_SELFTEST -#include - -static int ilog(unsigned int v){ - int ret=0; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - -oggpack_buffer o; -oggpack_buffer r; - -void report(char *in){ - fprintf(stderr,"%s",in); - exit(1); -} - -void cliptest(unsigned long *b,int vals,int bits,int *comp,int compsize){ - long bytes,i; - unsigned char *buffer; - - oggpack_reset(&o); - for(i=0;i -#include -#include "ogg.h" - -/* A complete description of Ogg framing exists in docs/framing.html */ - -int ogg_page_version(ogg_page *og){ - return((int)(og->header[4])); -} - -int ogg_page_continued(ogg_page *og){ - return((int)(og->header[5]&0x01)); -} - -int ogg_page_bos(ogg_page *og){ - return((int)(og->header[5]&0x02)); -} - -int ogg_page_eos(ogg_page *og){ - return((int)(og->header[5]&0x04)); -} - -ogg_int64_t ogg_page_granulepos(ogg_page *og){ - unsigned char *page=og->header; - ogg_int64_t granulepos=page[13]&(0xff); - granulepos= (granulepos<<8)|(page[12]&0xff); - granulepos= (granulepos<<8)|(page[11]&0xff); - granulepos= (granulepos<<8)|(page[10]&0xff); - granulepos= (granulepos<<8)|(page[9]&0xff); - granulepos= (granulepos<<8)|(page[8]&0xff); - granulepos= (granulepos<<8)|(page[7]&0xff); - granulepos= (granulepos<<8)|(page[6]&0xff); - return(granulepos); -} - -int ogg_page_serialno(ogg_page *og){ - return(og->header[14] | - (og->header[15]<<8) | - (og->header[16]<<16) | - (og->header[17]<<24)); -} - -long ogg_page_pageno(ogg_page *og){ - return(og->header[18] | - (og->header[19]<<8) | - (og->header[20]<<16) | - (og->header[21]<<24)); -} - - - -/* returns the number of packets that are completed on this page (if - the leading packet is begun on a previous page, but ends on this - page, it's counted */ - -/* NOTE: -If a page consists of a packet begun on a previous page, and a new -packet begun (but not completed) on this page, the return will be: - ogg_page_packets(page) ==1, - ogg_page_continued(page) !=0 - -If a page happens to be a single packet that was begun on a -previous page, and spans to the next page (in the case of a three or -more page packet), the return will be: - ogg_page_packets(page) ==0, - ogg_page_continued(page) !=0 -*/ - -int ogg_page_packets(ogg_page *og){ - int i,n=og->header[26],count=0; - for(i=0;iheader[27+i]<255)count++; - return(count); -} - - -#if 0 -/* helper to initialize lookup for direct-table CRC (illustrative; we - use the static init below) */ - -static ogg_uint32_t _ogg_crc_entry(unsigned long index){ - int i; - unsigned long r; - - r = index << 24; - for (i=0; i<8; i++) - if (r & 0x80000000UL) - r = (r << 1) ^ 0x04c11db7; /* The same as the ethernet generator - polynomial, although we use an - unreflected alg and an init/final - of 0, not 0xffffffff */ - else - r<<=1; - return (r & 0xffffffffUL); -} -#endif - -static const ogg_uint32_t crc_lookup[256]={ - 0x00000000,0x04c11db7,0x09823b6e,0x0d4326d9, - 0x130476dc,0x17c56b6b,0x1a864db2,0x1e475005, - 0x2608edb8,0x22c9f00f,0x2f8ad6d6,0x2b4bcb61, - 0x350c9b64,0x31cd86d3,0x3c8ea00a,0x384fbdbd, - 0x4c11db70,0x48d0c6c7,0x4593e01e,0x4152fda9, - 0x5f15adac,0x5bd4b01b,0x569796c2,0x52568b75, - 0x6a1936c8,0x6ed82b7f,0x639b0da6,0x675a1011, - 0x791d4014,0x7ddc5da3,0x709f7b7a,0x745e66cd, - 0x9823b6e0,0x9ce2ab57,0x91a18d8e,0x95609039, - 0x8b27c03c,0x8fe6dd8b,0x82a5fb52,0x8664e6e5, - 0xbe2b5b58,0xbaea46ef,0xb7a96036,0xb3687d81, - 0xad2f2d84,0xa9ee3033,0xa4ad16ea,0xa06c0b5d, - 0xd4326d90,0xd0f37027,0xddb056fe,0xd9714b49, - 0xc7361b4c,0xc3f706fb,0xceb42022,0xca753d95, - 0xf23a8028,0xf6fb9d9f,0xfbb8bb46,0xff79a6f1, - 0xe13ef6f4,0xe5ffeb43,0xe8bccd9a,0xec7dd02d, - 0x34867077,0x30476dc0,0x3d044b19,0x39c556ae, - 0x278206ab,0x23431b1c,0x2e003dc5,0x2ac12072, - 0x128e9dcf,0x164f8078,0x1b0ca6a1,0x1fcdbb16, - 0x018aeb13,0x054bf6a4,0x0808d07d,0x0cc9cdca, - 0x7897ab07,0x7c56b6b0,0x71159069,0x75d48dde, - 0x6b93dddb,0x6f52c06c,0x6211e6b5,0x66d0fb02, - 0x5e9f46bf,0x5a5e5b08,0x571d7dd1,0x53dc6066, - 0x4d9b3063,0x495a2dd4,0x44190b0d,0x40d816ba, - 0xaca5c697,0xa864db20,0xa527fdf9,0xa1e6e04e, - 0xbfa1b04b,0xbb60adfc,0xb6238b25,0xb2e29692, - 0x8aad2b2f,0x8e6c3698,0x832f1041,0x87ee0df6, - 0x99a95df3,0x9d684044,0x902b669d,0x94ea7b2a, - 0xe0b41de7,0xe4750050,0xe9362689,0xedf73b3e, - 0xf3b06b3b,0xf771768c,0xfa325055,0xfef34de2, - 0xc6bcf05f,0xc27dede8,0xcf3ecb31,0xcbffd686, - 0xd5b88683,0xd1799b34,0xdc3abded,0xd8fba05a, - 0x690ce0ee,0x6dcdfd59,0x608edb80,0x644fc637, - 0x7a089632,0x7ec98b85,0x738aad5c,0x774bb0eb, - 0x4f040d56,0x4bc510e1,0x46863638,0x42472b8f, - 0x5c007b8a,0x58c1663d,0x558240e4,0x51435d53, - 0x251d3b9e,0x21dc2629,0x2c9f00f0,0x285e1d47, - 0x36194d42,0x32d850f5,0x3f9b762c,0x3b5a6b9b, - 0x0315d626,0x07d4cb91,0x0a97ed48,0x0e56f0ff, - 0x1011a0fa,0x14d0bd4d,0x19939b94,0x1d528623, - 0xf12f560e,0xf5ee4bb9,0xf8ad6d60,0xfc6c70d7, - 0xe22b20d2,0xe6ea3d65,0xeba91bbc,0xef68060b, - 0xd727bbb6,0xd3e6a601,0xdea580d8,0xda649d6f, - 0xc423cd6a,0xc0e2d0dd,0xcda1f604,0xc960ebb3, - 0xbd3e8d7e,0xb9ff90c9,0xb4bcb610,0xb07daba7, - 0xae3afba2,0xaafbe615,0xa7b8c0cc,0xa379dd7b, - 0x9b3660c6,0x9ff77d71,0x92b45ba8,0x9675461f, - 0x8832161a,0x8cf30bad,0x81b02d74,0x857130c3, - 0x5d8a9099,0x594b8d2e,0x5408abf7,0x50c9b640, - 0x4e8ee645,0x4a4ffbf2,0x470cdd2b,0x43cdc09c, - 0x7b827d21,0x7f436096,0x7200464f,0x76c15bf8, - 0x68860bfd,0x6c47164a,0x61043093,0x65c52d24, - 0x119b4be9,0x155a565e,0x18197087,0x1cd86d30, - 0x029f3d35,0x065e2082,0x0b1d065b,0x0fdc1bec, - 0x3793a651,0x3352bbe6,0x3e119d3f,0x3ad08088, - 0x2497d08d,0x2056cd3a,0x2d15ebe3,0x29d4f654, - 0xc5a92679,0xc1683bce,0xcc2b1d17,0xc8ea00a0, - 0xd6ad50a5,0xd26c4d12,0xdf2f6bcb,0xdbee767c, - 0xe3a1cbc1,0xe760d676,0xea23f0af,0xeee2ed18, - 0xf0a5bd1d,0xf464a0aa,0xf9278673,0xfde69bc4, - 0x89b8fd09,0x8d79e0be,0x803ac667,0x84fbdbd0, - 0x9abc8bd5,0x9e7d9662,0x933eb0bb,0x97ffad0c, - 0xafb010b1,0xab710d06,0xa6322bdf,0xa2f33668, - 0xbcb4666d,0xb8757bda,0xb5365d03,0xb1f740b4}; - -/* init the encode/decode logical stream state */ - -int ogg_stream_init(ogg_stream_state *os,int serialno){ - if(os){ - memset(os,0,sizeof(*os)); - os->body_storage=16*1024; - os->body_data=(unsigned char*) _ogg_malloc(os->body_storage*sizeof(*os->body_data)); - - os->lacing_storage=1024; - os->lacing_vals=(int*) _ogg_malloc(os->lacing_storage*sizeof(*os->lacing_vals)); - os->granule_vals=(ogg_int64_t*) _ogg_malloc(os->lacing_storage*sizeof(*os->granule_vals)); - - os->serialno=serialno; - - return(0); - } - return(-1); -} - -/* _clear does not free os, only the non-flat storage within */ -int ogg_stream_clear(ogg_stream_state *os){ - if(os){ - if(os->body_data)_ogg_free(os->body_data); - if(os->lacing_vals)_ogg_free(os->lacing_vals); - if(os->granule_vals)_ogg_free(os->granule_vals); - - memset(os,0,sizeof(*os)); - } - return(0); -} - -int ogg_stream_destroy(ogg_stream_state *os){ - if(os){ - ogg_stream_clear(os); - _ogg_free(os); - } - return(0); -} - -/* Helpers for ogg_stream_encode; this keeps the structure and - what's happening fairly clear */ - -static void _os_body_expand(ogg_stream_state *os,int needed){ - if(os->body_storage<=os->body_fill+needed){ - os->body_storage+=(needed+1024); - os->body_data=(unsigned char*) _ogg_realloc(os->body_data,os->body_storage*sizeof(*os->body_data)); - } -} - -static void _os_lacing_expand(ogg_stream_state *os,int needed){ - if(os->lacing_storage<=os->lacing_fill+needed){ - os->lacing_storage+=(needed+32); - os->lacing_vals=(int*)_ogg_realloc(os->lacing_vals,os->lacing_storage*sizeof(*os->lacing_vals)); - os->granule_vals=(ogg_int64_t*)_ogg_realloc(os->granule_vals,os->lacing_storage*sizeof(*os->granule_vals)); - } -} - -/* checksum the page */ -/* Direct table CRC; note that this will be faster in the future if we - perform the checksum silmultaneously with other copies */ - -void ogg_page_checksum_set(ogg_page *og){ - if(og){ - ogg_uint32_t crc_reg=0; - int i; - - /* safety; needed for API behavior, but not framing code */ - og->header[22]=0; - og->header[23]=0; - og->header[24]=0; - og->header[25]=0; - - for(i=0;iheader_len;i++) - crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->header[i]]; - for(i=0;ibody_len;i++) - crc_reg=(crc_reg<<8)^crc_lookup[((crc_reg >> 24)&0xff)^og->body[i]]; - - og->header[22]=(unsigned char)(crc_reg&0xff); - og->header[23]=(unsigned char)((crc_reg>>8)&0xff); - og->header[24]=(unsigned char)((crc_reg>>16)&0xff); - og->header[25]=(unsigned char)((crc_reg>>24)&0xff); - } -} - -/* submit data to the internal buffer of the framing engine */ -int ogg_stream_packetin(ogg_stream_state *os,ogg_packet *op){ - int lacing_vals=op->bytes/255+1,i; - - if(os->body_returned){ - /* advance packet data according to the body_returned pointer. We - had to keep it around to return a pointer into the buffer last - call */ - - os->body_fill-=os->body_returned; - if(os->body_fill) - memmove(os->body_data,os->body_data+os->body_returned, - os->body_fill); - os->body_returned=0; - } - - /* make sure we have the buffer storage */ - _os_body_expand(os,op->bytes); - _os_lacing_expand(os,lacing_vals); - - /* Copy in the submitted packet. Yes, the copy is a waste; this is - the liability of overly clean abstraction for the time being. It - will actually be fairly easy to eliminate the extra copy in the - future */ - - memcpy(os->body_data+os->body_fill,op->packet,op->bytes); - os->body_fill+=op->bytes; - - /* Store lacing vals for this packet */ - for(i=0;ilacing_vals[os->lacing_fill+i]=255; - os->granule_vals[os->lacing_fill+i]=os->granulepos; - } - os->lacing_vals[os->lacing_fill+i]=(op->bytes)%255; - os->granulepos=os->granule_vals[os->lacing_fill+i]=op->granulepos; - - /* flag the first segment as the beginning of the packet */ - os->lacing_vals[os->lacing_fill]|= 0x100; - - os->lacing_fill+=lacing_vals; - - /* for the sake of completeness */ - os->packetno++; - - if(op->e_o_s)os->e_o_s=1; - - return(0); -} - -/* This will flush remaining packets into a page (returning nonzero), - even if there is not enough data to trigger a flush normally - (undersized page). If there are no packets or partial packets to - flush, ogg_stream_flush returns 0. Note that ogg_stream_flush will - try to flush a normal sized page like ogg_stream_pageout; a call to - ogg_stream_flush does not guarantee that all packets have flushed. - Only a return value of 0 from ogg_stream_flush indicates all packet - data is flushed into pages. - - since ogg_stream_flush will flush the last page in a stream even if - it's undersized, you almost certainly want to use ogg_stream_pageout - (and *not* ogg_stream_flush) unless you specifically need to flush - an page regardless of size in the middle of a stream. */ - -int ogg_stream_flush(ogg_stream_state *os,ogg_page *og){ - int i; - int vals=0; - int maxvals=(os->lacing_fill>255?255:os->lacing_fill); - int bytes=0; - long acc=0; - ogg_int64_t granule_pos=-1; - - if(maxvals==0)return(0); - - /* construct a page */ - /* decide how many segments to include */ - - /* If this is the initial header case, the first page must only include - the initial header packet */ - if(os->b_o_s==0){ /* 'initial header page' case */ - granule_pos=0; - for(vals=0;valslacing_vals[vals]&0x0ff)<255){ - vals++; - break; - } - } - }else{ - for(vals=0;vals4096)break; - acc+=os->lacing_vals[vals]&0x0ff; - if((os->lacing_vals[vals]&0xff)<255) - granule_pos=os->granule_vals[vals]; - } - } - - /* construct the header in temp storage */ - memcpy(os->header,"OggS",4); - - /* stream structure version */ - os->header[4]=0x00; - - /* continued packet flag? */ - os->header[5]=0x00; - if((os->lacing_vals[0]&0x100)==0)os->header[5]|=0x01; - /* first page flag? */ - if(os->b_o_s==0)os->header[5]|=0x02; - /* last page flag? */ - if(os->e_o_s && os->lacing_fill==vals)os->header[5]|=0x04; - os->b_o_s=1; - - /* 64 bits of PCM position */ - for(i=6;i<14;i++){ - os->header[i]=(unsigned char)(granule_pos&0xff); - granule_pos>>=8; - } - - /* 32 bits of stream serial number */ - { - long serialno=os->serialno; - for(i=14;i<18;i++){ - os->header[i]=(unsigned char)(serialno&0xff); - serialno>>=8; - } - } - - /* 32 bits of page counter (we have both counter and page header - because this val can roll over) */ - if(os->pageno==-1)os->pageno=0; /* because someone called - stream_reset; this would be a - strange thing to do in an - encode stream, but it has - plausible uses */ - { - long pageno=os->pageno++; - for(i=18;i<22;i++){ - os->header[i]=(unsigned char)(pageno&0xff); - pageno>>=8; - } - } - - /* zero for computation; filled in later */ - os->header[22]=0; - os->header[23]=0; - os->header[24]=0; - os->header[25]=0; - - /* segment table */ - os->header[26]=(unsigned char)(vals&0xff); - for(i=0;iheader[i+27]=(unsigned char)(os->lacing_vals[i]&0xff); - - /* set pointers in the ogg_page struct */ - og->header=os->header; - og->header_len=os->header_fill=vals+27; - og->body=os->body_data+os->body_returned; - og->body_len=bytes; - - /* advance the lacing data and set the body_returned pointer */ - - os->lacing_fill-=vals; - memmove(os->lacing_vals,os->lacing_vals+vals,os->lacing_fill*sizeof(*os->lacing_vals)); - memmove(os->granule_vals,os->granule_vals+vals,os->lacing_fill*sizeof(*os->granule_vals)); - os->body_returned+=bytes; - - /* calculate the checksum */ - - ogg_page_checksum_set(og); - - /* done */ - return(1); -} - - -/* This constructs pages from buffered packet segments. The pointers -returned are to static buffers; do not free. The returned buffers are -good only until the next call (using the same ogg_stream_state) */ - -int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og){ - - if((os->e_o_s&&os->lacing_fill) || /* 'were done, now flush' case */ - os->body_fill-os->body_returned > 4096 ||/* 'page nominal size' case */ - os->lacing_fill>=255 || /* 'segment table full' case */ - (os->lacing_fill&&!os->b_o_s)){ /* 'initial header page' case */ - - return(ogg_stream_flush(os,og)); - } - - /* not enough data to construct a page and not end of stream */ - return(0); -} - -int ogg_stream_eos(ogg_stream_state *os){ - return os->e_o_s; -} - -/* DECODING PRIMITIVES: packet streaming layer **********************/ - -/* This has two layers to place more of the multi-serialno and paging - control in the application's hands. First, we expose a data buffer - using ogg_sync_buffer(). The app either copies into the - buffer, or passes it directly to read(), etc. We then call - ogg_sync_wrote() to tell how many bytes we just added. - - Pages are returned (pointers into the buffer in ogg_sync_state) - by ogg_sync_pageout(). The page is then submitted to - ogg_stream_pagein() along with the appropriate - ogg_stream_state* (ie, matching serialno). We then get raw - packets out calling ogg_stream_packetout() with a - ogg_stream_state. */ - -/* initialize the struct to a known state */ -int ogg_sync_init(ogg_sync_state *oy){ - if(oy){ - memset(oy,0,sizeof(*oy)); - } - return(0); -} - -/* clear non-flat storage within */ -int ogg_sync_clear(ogg_sync_state *oy){ - if(oy){ - if(oy->data)_ogg_free(oy->data); - ogg_sync_init(oy); - } - return(0); -} - -int ogg_sync_destroy(ogg_sync_state *oy){ - if(oy){ - ogg_sync_clear(oy); - _ogg_free(oy); - } - return(0); -} - -char *ogg_sync_buffer(ogg_sync_state *oy, long size){ - - /* first, clear out any space that has been previously returned */ - if(oy->returned){ - oy->fill-=oy->returned; - if(oy->fill>0) - memmove(oy->data,oy->data+oy->returned,oy->fill); - oy->returned=0; - } - - if(size>oy->storage-oy->fill){ - /* We need to extend the internal buffer */ - long newsize=size+oy->fill+4096; /* an extra page to be nice */ - - if(oy->data) - oy->data=(unsigned char*) _ogg_realloc(oy->data,newsize); - else - oy->data=(unsigned char*) _ogg_malloc(newsize); - oy->storage=newsize; - } - - /* expose a segment at least as large as requested at the fill mark */ - return((char *)oy->data+oy->fill); -} - -int ogg_sync_wrote(ogg_sync_state *oy, long bytes){ - if(oy->fill+bytes>oy->storage)return(-1); - oy->fill+=bytes; - return(0); -} - -/* sync the stream. This is meant to be useful for finding page - boundaries. - - return values for this: - -n) skipped n bytes - 0) page not ready; more data (no bytes skipped) - n) page synced at current location; page length n bytes - -*/ - -long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og){ - unsigned char *page=oy->data+oy->returned; - unsigned char *next; - long bytes=oy->fill-oy->returned; - - if(oy->headerbytes==0){ - int headerbytes,i; - if(bytes<27)return(0); /* not enough for a header */ - - /* verify capture pattern */ - if(memcmp(page,"OggS",4))goto sync_fail; - - headerbytes=page[26]+27; - if(bytesbodybytes+=page[27+i]; - oy->headerbytes=headerbytes; - } - - if(oy->bodybytes+oy->headerbytes>bytes)return(0); - - /* The whole test page is buffered. Verify the checksum */ - { - /* Grab the checksum bytes, set the header field to zero */ - char chksum[4]; - ogg_page log; - - memcpy(chksum,page+22,4); - memset(page+22,0,4); - - /* set up a temp page struct and recompute the checksum */ - log.header=page; - log.header_len=oy->headerbytes; - log.body=page+oy->headerbytes; - log.body_len=oy->bodybytes; - ogg_page_checksum_set(&log); - - /* Compare */ - if(memcmp(chksum,page+22,4)){ - /* D'oh. Mismatch! Corrupt page (or miscapture and not a page - at all) */ - /* replace the computed checksum with the one actually read in */ - memcpy(page+22,chksum,4); - - /* Bad checksum. Lose sync */ - goto sync_fail; - } - } - - /* yes, have a whole page all ready to go */ - { - unsigned char *page=oy->data+oy->returned; - long bytes; - - if(og){ - og->header=page; - og->header_len=oy->headerbytes; - og->body=page+oy->headerbytes; - og->body_len=oy->bodybytes; - } - - oy->unsynced=0; - oy->returned+=(bytes=oy->headerbytes+oy->bodybytes); - oy->headerbytes=0; - oy->bodybytes=0; - return(bytes); - } - - sync_fail: - - oy->headerbytes=0; - oy->bodybytes=0; - - /* search for possible capture */ - next=(unsigned char*)memchr(page+1,'O',bytes-1); - if(!next) - next=oy->data+oy->fill; - - oy->returned=next-oy->data; - return(-(next-page)); -} - -/* sync the stream and get a page. Keep trying until we find a page. - Supress 'sync errors' after reporting the first. - - return values: - -1) recapture (hole in data) - 0) need more data - 1) page returned - - Returns pointers into buffered data; invalidated by next call to - _stream, _clear, _init, or _buffer */ - -int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og){ - - /* all we need to do is verify a page at the head of the stream - buffer. If it doesn't verify, we look for the next potential - frame */ - - for(;;){ - long ret=ogg_sync_pageseek(oy,og); - if(ret>0){ - /* have a page */ - return(1); - } - if(ret==0){ - /* need more data */ - return(0); - } - - /* head did not start a synced page... skipped some bytes */ - if(!oy->unsynced){ - oy->unsynced=1; - return(-1); - } - - /* loop. keep looking */ - - } -} - -/* add the incoming page to the stream state; we decompose the page - into packet segments here as well. */ - -int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og){ - unsigned char *header=og->header; - unsigned char *body=og->body; - long bodysize=og->body_len; - int segptr=0; - - int version=ogg_page_version(og); - int continued=ogg_page_continued(og); - int bos=ogg_page_bos(og); - int eos=ogg_page_eos(og); - ogg_int64_t granulepos=ogg_page_granulepos(og); - int serialno=ogg_page_serialno(og); - long pageno=ogg_page_pageno(og); - int segments=header[26]; - - /* clean up 'returned data' */ - { - long lr=os->lacing_returned; - long br=os->body_returned; - - /* body data */ - if(br){ - os->body_fill-=br; - if(os->body_fill) - memmove(os->body_data,os->body_data+br,os->body_fill); - os->body_returned=0; - } - - if(lr){ - /* segment table */ - if(os->lacing_fill-lr){ - memmove(os->lacing_vals,os->lacing_vals+lr, - (os->lacing_fill-lr)*sizeof(*os->lacing_vals)); - memmove(os->granule_vals,os->granule_vals+lr, - (os->lacing_fill-lr)*sizeof(*os->granule_vals)); - } - os->lacing_fill-=lr; - os->lacing_packet-=lr; - os->lacing_returned=0; - } - } - - /* check the serial number */ - if(serialno!=os->serialno)return(-1); - if(version>0)return(-1); - - _os_lacing_expand(os,segments+1); - - /* are we in sequence? */ - if(pageno!=os->pageno){ - int i; - - /* unroll previous partial packet (if any) */ - for(i=os->lacing_packet;ilacing_fill;i++) - os->body_fill-=os->lacing_vals[i]&0xff; - os->lacing_fill=os->lacing_packet; - - /* make a note of dropped data in segment table */ - if(os->pageno!=-1){ - os->lacing_vals[os->lacing_fill++]=0x400; - os->lacing_packet++; - } - } - - /* are we a 'continued packet' page? If so, we may need to skip - some segments */ - if(continued){ - if(os->lacing_fill<1 || - os->lacing_vals[os->lacing_fill-1]==0x400){ - bos=0; - for(;segptrbody_data+os->body_fill,body,bodysize); - os->body_fill+=bodysize; - } - - { - int saved=-1; - while(segptrlacing_vals[os->lacing_fill]=val; - os->granule_vals[os->lacing_fill]=-1; - - if(bos){ - os->lacing_vals[os->lacing_fill]|=0x100; - bos=0; - } - - if(val<255)saved=os->lacing_fill; - - os->lacing_fill++; - segptr++; - - if(val<255)os->lacing_packet=os->lacing_fill; - } - - /* set the granulepos on the last granuleval of the last full packet */ - if(saved!=-1){ - os->granule_vals[saved]=granulepos; - } - - } - - if(eos){ - os->e_o_s=1; - if(os->lacing_fill>0) - os->lacing_vals[os->lacing_fill-1]|=0x200; - } - - os->pageno=pageno+1; - - return(0); -} - -/* clear things to an initial state. Good to call, eg, before seeking */ -int ogg_sync_reset(ogg_sync_state *oy){ - oy->fill=0; - oy->returned=0; - oy->unsynced=0; - oy->headerbytes=0; - oy->bodybytes=0; - return(0); -} - -int ogg_stream_reset(ogg_stream_state *os){ - os->body_fill=0; - os->body_returned=0; - - os->lacing_fill=0; - os->lacing_packet=0; - os->lacing_returned=0; - - os->header_fill=0; - - os->e_o_s=0; - os->b_o_s=0; - os->pageno=-1; - os->packetno=0; - os->granulepos=0; - - return(0); -} - -int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno){ - ogg_stream_reset(os); - os->serialno=serialno; - return(0); -} - -static int _packetout(ogg_stream_state *os,ogg_packet *op,int adv){ - - /* The last part of decode. We have the stream broken into packet - segments. Now we need to group them into packets (or return the - out of sync markers) */ - - int ptr=os->lacing_returned; - - if(os->lacing_packet<=ptr)return(0); - - if(os->lacing_vals[ptr]&0x400){ - /* we need to tell the codec there's a gap; it might need to - handle previous packet dependencies. */ - os->lacing_returned++; - os->packetno++; - return(-1); - } - - if(!op && !adv)return(1); /* just using peek as an inexpensive way - to ask if there's a whole packet - waiting */ - - /* Gather the whole packet. We'll have no holes or a partial packet */ - { - int size=os->lacing_vals[ptr]&0xff; - int bytes=size; - int eos=os->lacing_vals[ptr]&0x200; /* last packet of the stream? */ - int bos=os->lacing_vals[ptr]&0x100; /* first packet of the stream? */ - - while(size==255){ - int val=os->lacing_vals[++ptr]; - size=val&0xff; - if(val&0x200)eos=0x200; - bytes+=size; - } - - if(op){ - op->e_o_s=eos; - op->b_o_s=bos; - op->packet=os->body_data+os->body_returned; - op->packetno=os->packetno; - op->granulepos=os->granule_vals[ptr]; - op->bytes=bytes; - } - - if(adv){ - os->body_returned+=bytes; - os->lacing_returned=ptr+1; - os->packetno++; - } - } - return(1); -} - -int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op){ - return _packetout(os,op,1); -} - -int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op){ - return _packetout(os,op,0); -} - -void ogg_packet_clear(ogg_packet *op) { - _ogg_free(op->packet); - memset(op, 0, sizeof(*op)); -} - -#ifdef _V_SELFTEST -#include - -ogg_stream_state os_en, os_de; -ogg_sync_state oy; - -void checkpacket(ogg_packet *op,int len, int no, int pos){ - long j; - static int sequence=0; - static int lastno=0; - - if(op->bytes!=len){ - fprintf(stderr,"incorrect packet length!\n"); - exit(1); - } - if(op->granulepos!=pos){ - fprintf(stderr,"incorrect packet position!\n"); - exit(1); - } - - /* packet number just follows sequence/gap; adjust the input number - for that */ - if(no==0){ - sequence=0; - }else{ - sequence++; - if(no>lastno+1) - sequence++; - } - lastno=no; - if(op->packetno!=sequence){ - fprintf(stderr,"incorrect packet sequence %ld != %d\n", - (long)(op->packetno),sequence); - exit(1); - } - - /* Test data */ - for(j=0;jbytes;j++) - if(op->packet[j]!=((j+no)&0xff)){ - fprintf(stderr,"body data mismatch (1) at pos %ld: %x!=%lx!\n\n", - j,op->packet[j],(j+no)&0xff); - exit(1); - } -} - -void check_page(unsigned char *data,const int *header,ogg_page *og){ - long j; - /* Test data */ - for(j=0;jbody_len;j++) - if(og->body[j]!=data[j]){ - fprintf(stderr,"body data mismatch (2) at pos %ld: %x!=%x!\n\n", - j,data[j],og->body[j]); - exit(1); - } - - /* Test header */ - for(j=0;jheader_len;j++){ - if(og->header[j]!=header[j]){ - fprintf(stderr,"header content mismatch at pos %ld:\n",j); - for(j=0;jheader[j]); - fprintf(stderr,"\n"); - exit(1); - } - } - if(og->header_len!=header[26]+27){ - fprintf(stderr,"header length incorrect! (%ld!=%d)\n", - og->header_len,header[26]+27); - exit(1); - } -} - -void print_header(ogg_page *og){ - int j; - fprintf(stderr,"\nHEADER:\n"); - fprintf(stderr," capture: %c %c %c %c version: %d flags: %x\n", - og->header[0],og->header[1],og->header[2],og->header[3], - (int)og->header[4],(int)og->header[5]); - - fprintf(stderr," granulepos: %d serialno: %d pageno: %ld\n", - (og->header[9]<<24)|(og->header[8]<<16)| - (og->header[7]<<8)|og->header[6], - (og->header[17]<<24)|(og->header[16]<<16)| - (og->header[15]<<8)|og->header[14], - ((long)(og->header[21])<<24)|(og->header[20]<<16)| - (og->header[19]<<8)|og->header[18]); - - fprintf(stderr," checksum: %02x:%02x:%02x:%02x\n segments: %d (", - (int)og->header[22],(int)og->header[23], - (int)og->header[24],(int)og->header[25], - (int)og->header[26]); - - for(j=27;jheader_len;j++) - fprintf(stderr,"%d ",(int)og->header[j]); - fprintf(stderr,")\n\n"); -} - -void copy_page(ogg_page *og){ - unsigned char *temp=_ogg_malloc(og->header_len); - memcpy(temp,og->header,og->header_len); - og->header=temp; - - temp=_ogg_malloc(og->body_len); - memcpy(temp,og->body,og->body_len); - og->body=temp; -} - -void free_page(ogg_page *og){ - _ogg_free (og->header); - _ogg_free (og->body); -} - -void error(void){ - fprintf(stderr,"error!\n"); - exit(1); -} - -/* 17 only */ -const int head1_0[] = {0x4f,0x67,0x67,0x53,0,0x06, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0x15,0xed,0xec,0x91, - 1, - 17}; - -/* 17, 254, 255, 256, 500, 510, 600 byte, pad */ -const int head1_1[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0x59,0x10,0x6c,0x2c, - 1, - 17}; -const int head2_1[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x18,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x89,0x33,0x85,0xce, - 13, - 254,255,0,255,1,255,245,255,255,0, - 255,255,90}; - -/* nil packets; beginning,middle,end */ -const int head1_2[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; -const int head2_2[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x28,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x5c,0x3f,0x66,0xcb, - 17, - 17,254,255,0,0,255,1,0,255,245,255,255,0, - 255,255,90,0}; - -/* large initial packet */ -const int head1_3[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0x01,0x27,0x31,0xaa, - 18, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,10}; - -const int head2_3[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x7f,0x4e,0x8a,0xd2, - 4, - 255,4,255,0}; - - -/* continuing packet test */ -const int head1_4[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; - -const int head2_4[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x54,0x05,0x51,0xc8, - 17, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255}; - -const int head3_4[] = {0x4f,0x67,0x67,0x53,0,0x05, - 0x07,0x0c,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0xc8,0xc3,0xcb,0xed, - 5, - 10,255,4,255,0}; - - -/* page with the 255 segment limit */ -const int head1_5[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; - -const int head2_5[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0xfc,0x03,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0xed,0x2a,0x2e,0xa7, - 255, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10}; - -const int head3_5[] = {0x4f,0x67,0x67,0x53,0,0x04, - 0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0x6c,0x3b,0x82,0x3d, - 1, - 50}; - - -/* packet that overspans over an entire page */ -const int head1_6[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; - -const int head2_6[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x3c,0xd9,0x4d,0x3f, - 17, - 100,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255}; - -const int head3_6[] = {0x4f,0x67,0x67,0x53,0,0x01, - 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0x01,0xd2,0xe5,0xe5, - 17, - 255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255}; - -const int head4_6[] = {0x4f,0x67,0x67,0x53,0,0x05, - 0x07,0x10,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,3,0,0,0, - 0xef,0xdd,0x88,0xde, - 7, - 255,255,75,255,4,255,0}; - -/* packet that overspans over an entire page */ -const int head1_7[] = {0x4f,0x67,0x67,0x53,0,0x02, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,0,0,0,0, - 0xff,0x7b,0x23,0x17, - 1, - 0}; - -const int head2_7[] = {0x4f,0x67,0x67,0x53,0,0x00, - 0x07,0x04,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,1,0,0,0, - 0x3c,0xd9,0x4d,0x3f, - 17, - 100,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255}; - -const int head3_7[] = {0x4f,0x67,0x67,0x53,0,0x05, - 0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00, - 0x01,0x02,0x03,0x04,2,0,0,0, - 0xd4,0xe0,0x60,0xe5, - 1,0}; - -void test_pack(const int *pl, const int **headers, int byteskip, - int pageskip, int packetskip){ - unsigned char *data=_ogg_malloc(1024*1024); /* for scripted test cases only */ - long inptr=0; - long outptr=0; - long deptr=0; - long depacket=0; - long granule_pos=7,pageno=0; - int i,j,packets,pageout=pageskip; - int eosflag=0; - int bosflag=0; - - int byteskipcount=0; - - ogg_stream_reset(&os_en); - ogg_stream_reset(&os_de); - ogg_sync_reset(&oy); - - for(packets=0;packetsbyteskip){ - memcpy(next,og.header,byteskipcount-byteskip); - next+=byteskipcount-byteskip; - byteskipcount=byteskip; - } - - byteskipcount+=og.body_len; - if(byteskipcount>byteskip){ - memcpy(next,og.body,byteskipcount-byteskip); - next+=byteskipcount-byteskip; - byteskipcount=byteskip; - } - - ogg_sync_wrote(&oy,next-buf); - - while(1){ - int ret=ogg_sync_pageout(&oy,&og_de); - if(ret==0)break; - if(ret<0)continue; - /* got a page. Happy happy. Verify that it's good. */ - - fprintf(stderr,"(%ld), ",pageout); - - check_page(data+deptr,headers[pageout],&og_de); - deptr+=og_de.body_len; - pageout++; - - /* submit it to deconstitution */ - ogg_stream_pagein(&os_de,&og_de); - - /* packets out? */ - while(ogg_stream_packetpeek(&os_de,&op_de2)>0){ - ogg_stream_packetpeek(&os_de,NULL); - ogg_stream_packetout(&os_de,&op_de); /* just catching them all */ - - /* verify peek and out match */ - if(memcmp(&op_de,&op_de2,sizeof(op_de))){ - fprintf(stderr,"packetout != packetpeek! pos=%ld\n", - depacket); - exit(1); - } - - /* verify the packet! */ - /* check data */ - if(memcmp(data+depacket,op_de.packet,op_de.bytes)){ - fprintf(stderr,"packet data mismatch in decode! pos=%ld\n", - depacket); - exit(1); - } - /* check bos flag */ - if(bosflag==0 && op_de.b_o_s==0){ - fprintf(stderr,"b_o_s flag not set on packet!\n"); - exit(1); - } - if(bosflag && op_de.b_o_s){ - fprintf(stderr,"b_o_s flag incorrectly set on packet!\n"); - exit(1); - } - bosflag=1; - depacket+=op_de.bytes; - - /* check eos flag */ - if(eosflag){ - fprintf(stderr,"Multiple decoded packets with eos flag!\n"); - exit(1); - } - - if(op_de.e_o_s)eosflag=1; - - /* check granulepos flag */ - if(op_de.granulepos!=-1){ - fprintf(stderr," granule:%ld ",(long)op_de.granulepos); - } - } - } - } - } - } - } - _ogg_free(data); - if(headers[pageno]!=NULL){ - fprintf(stderr,"did not write last page!\n"); - exit(1); - } - if(headers[pageout]!=NULL){ - fprintf(stderr,"did not decode last page!\n"); - exit(1); - } - if(inptr!=outptr){ - fprintf(stderr,"encoded page data incomplete!\n"); - exit(1); - } - if(inptr!=deptr){ - fprintf(stderr,"decoded page data incomplete!\n"); - exit(1); - } - if(inptr!=depacket){ - fprintf(stderr,"decoded packet data incomplete!\n"); - exit(1); - } - if(!eosflag){ - fprintf(stderr,"Never got a packet with EOS set!\n"); - exit(1); - } - fprintf(stderr,"ok.\n"); -} - -int main(void){ - - ogg_stream_init(&os_en,0x04030201); - ogg_stream_init(&os_de,0x04030201); - ogg_sync_init(&oy); - - /* Exercise each code path in the framing code. Also verify that - the checksums are working. */ - - { - /* 17 only */ - const int packets[]={17, -1}; - const int *headret[]={head1_0,NULL}; - - fprintf(stderr,"testing single page encoding... "); - test_pack(packets,headret,0,0,0); - } - - { - /* 17, 254, 255, 256, 500, 510, 600 byte, pad */ - const int packets[]={17, 254, 255, 256, 500, 510, 600, -1}; - const int *headret[]={head1_1,head2_1,NULL}; - - fprintf(stderr,"testing basic page encoding... "); - test_pack(packets,headret,0,0,0); - } - - { - /* nil packets; beginning,middle,end */ - const int packets[]={0,17, 254, 255, 0, 256, 0, 500, 510, 600, 0, -1}; - const int *headret[]={head1_2,head2_2,NULL}; - - fprintf(stderr,"testing basic nil packets... "); - test_pack(packets,headret,0,0,0); - } - - { - /* large initial packet */ - const int packets[]={4345,259,255,-1}; - const int *headret[]={head1_3,head2_3,NULL}; - - fprintf(stderr,"testing initial-packet lacing > 4k... "); - test_pack(packets,headret,0,0,0); - } - - { - /* continuing packet test */ - const int packets[]={0,4345,259,255,-1}; - const int *headret[]={head1_4,head2_4,head3_4,NULL}; - - fprintf(stderr,"testing single packet page span... "); - test_pack(packets,headret,0,0,0); - } - - /* page with the 255 segment limit */ - { - - const int packets[]={0,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,50,-1}; - const int *headret[]={head1_5,head2_5,head3_5,NULL}; - - fprintf(stderr,"testing max packet segments... "); - test_pack(packets,headret,0,0,0); - } - - { - /* packet that overspans over an entire page */ - const int packets[]={0,100,9000,259,255,-1}; - const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; - - fprintf(stderr,"testing very large packets... "); - test_pack(packets,headret,0,0,0); - } - - { - /* test for the libogg 1.1.1 resync in large continuation bug - found by Josh Coalson) */ - const int packets[]={0,100,9000,259,255,-1}; - const int *headret[]={head1_6,head2_6,head3_6,head4_6,NULL}; - - fprintf(stderr,"testing continuation resync in very large packets... "); - test_pack(packets,headret,100,2,3); - } - - { - /* term only page. why not? */ - const int packets[]={0,100,4080,-1}; - const int *headret[]={head1_7,head2_7,head3_7,NULL}; - - fprintf(stderr,"testing zero data page (1 nil packet)... "); - test_pack(packets,headret,0,0,0); - } - - - - { - /* build a bunch of pages for testing */ - unsigned char *data=_ogg_malloc(1024*1024); - int pl[]={0,100,4079,2956,2057,76,34,912,0,234,1000,1000,1000,300,-1}; - int inptr=0,i,j; - ogg_page og[5]; - - ogg_stream_reset(&os_en); - - for(i=0;pl[i]!=-1;i++){ - ogg_packet op; - int len=pl[i]; - - op.packet=data+inptr; - op.bytes=len; - op.e_o_s=(pl[i+1]<0?1:0); - op.granulepos=(i+1)*1000; - - for(j=0;j0)error(); - - /* Test fractional page inputs: incomplete fixed header */ - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+3, - 20); - ogg_sync_wrote(&oy,20); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - /* Test fractional page inputs: incomplete header */ - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+23, - 5); - ogg_sync_wrote(&oy,5); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - /* Test fractional page inputs: incomplete body */ - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+28, - og[1].header_len-28); - ogg_sync_wrote(&oy,og[1].header_len-28); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body,1000); - ogg_sync_wrote(&oy,1000); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body+1000, - og[1].body_len-1000); - ogg_sync_wrote(&oy,og[1].body_len-1000); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - - fprintf(stderr,"ok.\n"); - } - - /* Test fractional page inputs: page + incomplete capture */ - { - ogg_page og_de; - fprintf(stderr,"Testing sync on 1+partial inputs... "); - ogg_sync_reset(&oy); - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - og[1].header_len); - ogg_sync_wrote(&oy,og[1].header_len); - - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); - ogg_sync_wrote(&oy,og[1].body_len); - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - 20); - ogg_sync_wrote(&oy,20); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header+20, - og[1].header_len-20); - ogg_sync_wrote(&oy,og[1].header_len-20); - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); - ogg_sync_wrote(&oy,og[1].body_len); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - - fprintf(stderr,"ok.\n"); - } - - /* Test recapture: garbage + page */ - { - ogg_page og_de; - fprintf(stderr,"Testing search for capture... "); - ogg_sync_reset(&oy); - - /* 'garbage' */ - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); - ogg_sync_wrote(&oy,og[1].body_len); - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - og[1].header_len); - ogg_sync_wrote(&oy,og[1].header_len); - - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); - ogg_sync_wrote(&oy,og[1].body_len); - - memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, - 20); - ogg_sync_wrote(&oy,20); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - - memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header+20, - og[2].header_len-20); - ogg_sync_wrote(&oy,og[2].header_len-20); - memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, - og[2].body_len); - ogg_sync_wrote(&oy,og[2].body_len); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - - fprintf(stderr,"ok.\n"); - } - - /* Test recapture: page + garbage + page */ - { - ogg_page og_de; - fprintf(stderr,"Testing recapture... "); - ogg_sync_reset(&oy); - - memcpy(ogg_sync_buffer(&oy,og[1].header_len),og[1].header, - og[1].header_len); - ogg_sync_wrote(&oy,og[1].header_len); - - memcpy(ogg_sync_buffer(&oy,og[1].body_len),og[1].body, - og[1].body_len); - ogg_sync_wrote(&oy,og[1].body_len); - - memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, - og[2].header_len); - ogg_sync_wrote(&oy,og[2].header_len); - - memcpy(ogg_sync_buffer(&oy,og[2].header_len),og[2].header, - og[2].header_len); - ogg_sync_wrote(&oy,og[2].header_len); - - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - - memcpy(ogg_sync_buffer(&oy,og[2].body_len),og[2].body, - og[2].body_len-5); - ogg_sync_wrote(&oy,og[2].body_len-5); - - memcpy(ogg_sync_buffer(&oy,og[3].header_len),og[3].header, - og[3].header_len); - ogg_sync_wrote(&oy,og[3].header_len); - - memcpy(ogg_sync_buffer(&oy,og[3].body_len),og[3].body, - og[3].body_len); - ogg_sync_wrote(&oy,og[3].body_len); - - if(ogg_sync_pageout(&oy,&og_de)>0)error(); - if(ogg_sync_pageout(&oy,&og_de)<=0)error(); - - fprintf(stderr,"ok.\n"); - } - - /* Free page data that was previously copied */ - { - for(i=0;i<5;i++){ - free_page(&og[i]); - } - } - } - - return(0); -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS deleted file mode 100755 index 0da1036..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -Monty - -and the rest of the Xiph.org Foundation. diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES deleted file mode 100755 index e7d5dd3..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/CHANGES +++ /dev/null @@ -1,126 +0,0 @@ -libvorbis 1.3.2 (2010-11-01) -- "Xiph.Org libVorbis I 20101101 (Schaufenugget)" - - * vorbis: additional proofing against invalid/malicious - streams in floor, residue, and bos/eos packet trimming - code (see SVN for details). - * vorbis: Added programming documentation tree for the - low-level calls - * vorbisfile: Correct handling of serial numbers array - element [0] on non-seekable streams - * vorbisenc: Back out an [old] AoTuV HF weighting that was - first enabled in 1.3.0; there are a few samples where I - really don't like the effect it causes. - * vorbis: return correct timestamp for granule positions - with high bit set. - * vorbisfile: the [undocumented] half-rate decode api made no - attempt to keep the pcm offset tracking consistent in seeks. - Fix and add a testing mode to seeking_example.c to torture - test seeking in halfrate mode. Also remove requirement that - halfrate mode only work with seekable files. - * vorbisfile: Fix a chaining bug in raw_seeks where seeking - out of the current link would fail due to not - reinitializing the decode machinery. - * vorbisfile: improve seeking strategy. Reduces the - necessary number of seek callbacks in an open or seek - operation by well over 2/3. - -libvorbis 1.3.1 (2010-02-26) -- "Xiph.Org libVorbis I 20100325 (Everywhere)" - - * tweak + minor arithmetic fix in floor1 fit - * revert noise norm to conservative 1.2.3 behavior pending - more listening testing - -libvorbis 1.3.0 (2010-02-25) -- unreleased staging snapshot - - * Optimized surround support for 5.1 encoding at 44.1/48kHz - * Added encoder control call to disable channel coupling - * Correct an overflow bug in very low-bitrate encoding on 32 bit - machines that caused inflated bitrates - * Numerous API hardening, leak and build fixes - * Correct bug in 22kHz compand setup that could cause a crash - * Correct bug in 16kHz codebooks that could cause unstable pure - tones at high bitrates - -libvorbis 1.2.3 (2009-07-09) -- "Xiph.Org libVorbis I 20090709" - - * correct a vorbisfile bug that prevented proper playback of - Vorbis files where all audio in a logical stream is in a - single page - * Additional decode setup hardening against malicious streams - * Add 'OV_EXCLUDE_STATIC_CALLBACKS' define for developers who - wish to avoid unused symbol warnings from the static callbacks - defined in vorbisfile.h - -libvorbis 1.2.2 (2009-06-24) -- "Xiph.Org libVorbis I 20090624" - - * define VENDOR and ENCODER strings - * seek correctly in files bigger than 2 GB (Windows) - * fix regression from CVE-2008-1420; 1.0b1 files work again - * mark all tables as constant to reduce memory occupation - * additional decoder hardening against malicious streams - * substantially reduce amount of seeking performed by Vorbisfile - * Multichannel decode bugfix - * build system updates - * minor specification clarifications/fixes - -libvorbis 1.2.1 (unreleased) -- "Xiph.Org libVorbis I 20080501" - - * Improved robustness with corrupt streams. - * New ov_read_filter() vorbisfile call allows filtering decoded - audio as floats before converting to integer samples. - * Fix an encoder bug with multichannel streams. - * Replaced RTP payload format draft with RFC 5215. - * Bare bones self test under 'make check'. - * Fix a problem encoding some streams between 14 and 28 kHz. - * Fix a numerical instability in the edge extrapolation filter. - * Build system improvements. - * Specification correction. - -libvorbis 1.2.0 (2007-07-25) -- "Xiph.Org libVorbis I 20070622" - - * new ov_fopen() convenience call that avoids the common - stdio conflicts with ov_open() and MSVC runtimes. - * libvorbisfile now handles multiplexed streams - * improve robustness to corrupt input streams - * fix a minor encoder bug - * updated RTP draft - * build system updates - * minor corrections to the specification - -libvorbis 1.1.2 (2005-11-27) -- "Xiph.Org libVorbis I 20050304" - - * fix a serious encoder bug with gcc 4 optimized builds - * documentation and spec fixes - * updated VS2003 and XCode builds - * new draft RTP encapsulation spec - -libvorbis 1.1.1 (2005-06-27) -- "Xiph.Org libVorbis I 20050304" - - * bug fix to the bitrate management encoder interface - * bug fix to properly set packetno field in the encoder - * new draft RTP encapsulation spec - * library API documentation improvements - -libvorbis 1.1.0 (2004-09-22) -- "Xiph.Org libVorbis I 20040629" - - * merges tuning improvements from Aoyumi's aoTuV with fixups - * new managed bitrate (CBR) mode support - * new vorbis_encoder_ctl() interface - * extensive documentation updates - * application/ogg mimetype is now official - * autotools cleanup from Thomas Vander Stichele - * SymbianOS build support from Colin Ward at CSIRO - * various bugfixes - * various packaging improvements - -libvorbis 1.0.1 (2003-11-17) -- "Xiph.Org libVorbis I 20030909" - - * numerous bug fixes - * specification corrections - * new crosslap and halfrate APIs for game use - * packaging and build updates - -libvorbis 1.0.0 (2002-07-19) -- "Xiph.Org libVorbis I 20020717" - - * first stable release - diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING deleted file mode 100755 index 28de72a..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2002-2008 Xiph.org Foundation - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - -- Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -- Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -- Neither the name of the Xiph.org Foundation nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION -OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README deleted file mode 100755 index 3e969e0..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/README +++ /dev/null @@ -1,134 +0,0 @@ -******************************************************************** -* * -* THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * -* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * -* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * -* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * -* * -* THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * -* by the Xiph.org Foundation, http://www.xiph.org/ * -* * -******************************************************************** - -Vorbis is a general purpose audio and music encoding format -contemporary to MPEG-4's AAC and TwinVQ, the next generation beyond -MPEG audio layer 3. Unlike the MPEG sponsored formats (and other -proprietary formats such as RealAudio G2 and Windows' flavor of the -month), the Vorbis CODEC specification belongs to the public domain. -All the technical details are published and documented, and any -software entity may make full use of the format without license -fee, royalty or patent concerns. - -This package contains: - -* libvorbis, a BSD-style license software implementation of - the Vorbis specification by the Xiph.Org Foundation - (http://www.xiph.org/) - -* libvorbisfile, a BSD-style license convenience library - built on Vorbis designed to simplify common uses - -* libvorbisenc, a BSD-style license library that provides a simple, - programmatic encoding setup interface - -* example code making use of libogg, libvorbis, libvorbisfile and - libvorbisenc - -WHAT'S HERE: - -This source distribution includes libvorbis and an example -encoder/player to demonstrate use of libvorbis as well as -documentation on the Ogg Vorbis audio coding format. - -You'll need libogg (distributed separately) to compile this library. -A more comprehensive set of utilities is available in the vorbis-tools -package. - -Directory: - -./lib The source for the libraries, a BSD-license implementation - of the public domain Ogg Vorbis audio encoding format. - -./include Library API headers - -./debian Rules/spec files for building Debian .deb packages - -./doc Vorbis documentation - -./examples Example code illustrating programmatic use of libvorbis, - libvorbisfile and libvorbisenc - -./mac Codewarrior project files and build tweaks for MacOS. - -./macosx Project files for MacOS X. - -./win32 Win32 projects files and build automation - -./vq Internal utilities for training/building new LSP/residue - and auxiliary codebooks. - -CONTACT: - -The Ogg homepage is located at 'http://www.xiph.org/ogg/'. -Vorbis's homepage is located at 'http://www.xiph.org/vorbis/'. -Up to date technical documents, contact information, source code and -pre-built utilities may be found there. - -The user website for Ogg Vorbis software and audio is http://vorbis.com/ - -BUILDING FROM TRUNK: - -Development source is under subversion revision control at -https://svn.xiph.org/trunk/vorbis/. You will also need the -newest versions of autoconf, automake, libtool and pkg-config in -order to compile Vorbis from development source. A configure script -is provided for you in the source tarball distributions. - - [update or checkout latest source] - ./autogen.sh - make - -and as root if desired: - - make install - -This will install the Vorbis libraries (static and shared) into -/usr/local/lib, includes into /usr/local/include and API manpages -(once we write some) into /usr/local/man. - -Documentation building requires xsltproc and pdfxmltex. - -BUILDING FROM TARBALL DISTRIBUTIONS: - - ./configure - make - -and optionally (as root): - make install - -BUILDING RPMS: - -after normal configuring: - - make dist - rpm -ta libvorbis-.tar.gz - -BUILDING ON MACOS 9: - -Vorbis on MacOS 9 is built using Metroworks CodeWarrior. To build it, -first verify that the Ogg libraries are already built following the -instructions in the Ogg module README. Open vorbis/mac/libvorbis.mcp, -switch to the "Targets" pane, select everything, and make the project. -Do the same thing to build libvorbisenc.mcp, and libvorbisfile.mcp (in -that order). In vorbis/mac/Output you will now have both debug and final -versions of Vorbis shared libraries to link your projects against. - -To build a project using Ogg Vorbis, add access paths to your -CodeWarrior project for the ogg/include, ogg/mac/Output, -vorbis/include, and vorbis/mac/Output folders. Be sure that -"interpret DOS and Unix paths" is turned on in your project; it can -be found in the "access paths" pane in your project settings. Now -simply add the shared libraries you need to your project (OggLib and -VorbisLib at least) and #include "ogg/ogg.h" and "vorbis/codec.h" -wherever you need to access Ogg and Vorbis functionality. - diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c deleted file mode 100755 index 4391a44..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/analysis.c +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: single-block PCM analysis mode dispatch - last mod: $Id: analysis.c 16226 2009-07-08 06:43:49Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "scales.h" -#include "os.h" -#include "misc.h" - -/* decides between modes, dispatches to the appropriate mapping. */ -int vorbis_analysis(vorbis_block *vb, ogg_packet *op){ - int ret,i; - vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal; - - vb->glue_bits=0; - vb->time_bits=0; - vb->floor_bits=0; - vb->res_bits=0; - - /* first things first. Make sure encode is ready */ - for(i=0;ipacketblob[i]); - - /* we only have one mapping type (0), and we let the mapping code - itself figure out what soft mode to use. This allows easier - bitrate management */ - - if((ret=_mapping_P[0]->forward(vb))) - return(ret); - - if(op){ - if(vorbis_bitrate_managed(vb)) - /* The app is using a bitmanaged mode... but not using the - bitrate management interface. */ - return(OV_EINVAL); - - op->packet=oggpack_get_buffer(&vb->opb); - op->bytes=oggpack_bytes(&vb->opb); - op->b_o_s=0; - op->e_o_s=vb->eofflag; - op->granulepos=vb->granulepos; - op->packetno=vb->sequence; /* for sake of completeness */ - } - return(0); -} - -#ifdef ANALYSIS -int analysis_noisy=1; - -/* there was no great place to put this.... */ -void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB,ogg_int64_t off){ - int j; - FILE *of; - char buffer[80]; - - sprintf(buffer,"%s_%d.m",base,i); - of=fopen(buffer,"w"); - - if(!of)perror("failed to open data dump file"); - - for(j=0;j -#include -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codec_internal.h" -#include "os.h" -#include "misc.h" -#include "bitrate.h" - -/* compute bitrate tracking setup */ -void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bm){ - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - bitrate_manager_info *bi=&ci->bi; - - memset(bm,0,sizeof(*bm)); - - if(bi && (bi->reservoir_bits>0)){ - long ratesamples=vi->rate; - int halfsamples=ci->blocksizes[0]>>1; - - bm->short_per_long=ci->blocksizes[1]/ci->blocksizes[0]; - bm->managed=1; - - bm->avg_bitsper= (int) rint(1.*bi->avg_rate*halfsamples/ratesamples); - bm->min_bitsper= (int) rint(1.*bi->min_rate*halfsamples/ratesamples); - bm->max_bitsper= (int) rint(1.*bi->max_rate*halfsamples/ratesamples); - - bm->avgfloat=PACKETBLOBS/2; - - /* not a necessary fix, but one that leads to a more balanced - typical initialization */ - { - long desired_fill = (long) (bi->reservoir_bits*bi->reservoir_bias); - bm->minmax_reservoir=desired_fill; - bm->avg_reservoir=desired_fill; - } - - } -} - -void vorbis_bitrate_clear(bitrate_manager_state *bm){ - memset(bm,0,sizeof(*bm)); - return; -} - -int vorbis_bitrate_managed(vorbis_block *vb){ - vorbis_dsp_state *vd=vb->vd; - private_state *b=(private_state*)vd->backend_state; - bitrate_manager_state *bm=&b->bms; - - if(bm && bm->managed)return(1); - return(0); -} - -/* finish taking in the block we just processed */ -int vorbis_bitrate_addblock(vorbis_block *vb){ - vorbis_block_internal *vbi=(vorbis_block_internal*)vb->internal; - vorbis_dsp_state *vd=vb->vd; - private_state *b=(private_state*)vd->backend_state; - bitrate_manager_state *bm=&b->bms; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - bitrate_manager_info *bi=&ci->bi; - - int choice = (int) rint(bm->avgfloat); - long this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - long min_target_bits=(vb->W?bm->min_bitsper*bm->short_per_long:bm->min_bitsper); - long max_target_bits=(vb->W?bm->max_bitsper*bm->short_per_long:bm->max_bitsper); - int samples=ci->blocksizes[vb->W]>>1; - long desired_fill = (long) (bi->reservoir_bits*bi->reservoir_bias); - if(!bm->managed){ - /* not a bitrate managed stream, but for API simplicity, we'll - buffer the packet to keep the code path clean */ - - if(bm->vb)return(-1); /* one has been submitted without - being claimed */ - bm->vb=vb; - return(0); - } - - bm->vb=vb; - - /* look ahead for avg floater */ - if(bm->avg_bitsper>0){ - double slew=0.; - long avg_target_bits=(vb->W?bm->avg_bitsper*bm->short_per_long:bm->avg_bitsper); - double slewlimit= 15./bi->slew_damp; - - /* choosing a new floater: - if we're over target, we slew down - if we're under target, we slew up - - choose slew as follows: look through packetblobs of this frame - and set slew as the first in the appropriate direction that - gives us the slew we want. This may mean no slew if delta is - already favorable. - - Then limit slew to slew max */ - - if(bm->avg_reservoir+(this_bits-avg_target_bits)>desired_fill){ - while(choice>0 && this_bits>avg_target_bits && - bm->avg_reservoir+(this_bits-avg_target_bits)>desired_fill){ - choice--; - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - } - }else if(bm->avg_reservoir+(this_bits-avg_target_bits)avg_reservoir+(this_bits-avg_target_bits)packetblob[choice])*8; - } - } - - slew=rint(choice-bm->avgfloat)/samples*vi->rate; - if(slew<-slewlimit)slew=-slewlimit; - if(slew>slewlimit)slew=slewlimit; - choice = (int) rint(bm->avgfloat+= slew/vi->rate*samples); - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - } - - - - /* enforce min(if used) on the current floater (if used) */ - if(bm->min_bitsper>0){ - /* do we need to force the bitrate up? */ - if(this_bitsminmax_reservoir-(min_target_bits-this_bits)<0){ - choice++; - if(choice>=PACKETBLOBS)break; - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - } - } - } - - /* enforce max (if used) on the current floater (if used) */ - if(bm->max_bitsper>0){ - /* do we need to force the bitrate down? */ - if(this_bits>max_target_bits){ - while(bm->minmax_reservoir+(this_bits-max_target_bits)>bi->reservoir_bits){ - choice--; - if(choice<0)break; - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - } - } - } - - /* Choice of packetblobs now made based on floater, and min/max - requirements. Now boundary check extreme choices */ - - if(choice<0){ - /* choosing a smaller packetblob is insufficient to trim bitrate. - frame will need to be truncated */ - long maxsize=(max_target_bits+(bi->reservoir_bits-bm->minmax_reservoir))/8; - bm->choice=choice=0; - - if(oggpack_bytes(vbi->packetblob[choice])>maxsize){ - - oggpack_writetrunc(vbi->packetblob[choice],maxsize*8); - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - } - }else{ - long minsize=(min_target_bits-bm->minmax_reservoir+7)/8; - if(choice>=PACKETBLOBS) - choice=PACKETBLOBS-1; - - bm->choice=choice; - - /* prop up bitrate according to demand. pad this frame out with zeroes */ - minsize-=oggpack_bytes(vbi->packetblob[choice]); - while(minsize-->0)oggpack_write(vbi->packetblob[choice],0,8); - this_bits=oggpack_bytes(vbi->packetblob[choice])*8; - - } - - /* now we have the final packet and the final packet size. Update statistics */ - /* min and max reservoir */ - if(bm->min_bitsper>0 || bm->max_bitsper>0){ - - if(max_target_bits>0 && this_bits>max_target_bits){ - bm->minmax_reservoir+=(this_bits-max_target_bits); - }else if(min_target_bits>0 && this_bitsminmax_reservoir+=(this_bits-min_target_bits); - }else{ - /* inbetween; we want to take reservoir toward but not past desired_fill */ - if(bm->minmax_reservoir>desired_fill){ - if(max_target_bits>0){ /* logical bulletproofing against initialization state */ - bm->minmax_reservoir+=(this_bits-max_target_bits); - if(bm->minmax_reservoirminmax_reservoir=desired_fill; - }else{ - bm->minmax_reservoir=desired_fill; - } - }else{ - if(min_target_bits>0){ /* logical bulletproofing against initialization state */ - bm->minmax_reservoir+=(this_bits-min_target_bits); - if(bm->minmax_reservoir>desired_fill)bm->minmax_reservoir=desired_fill; - }else{ - bm->minmax_reservoir=desired_fill; - } - } - } - } - - /* avg reservoir */ - if(bm->avg_bitsper>0){ - long avg_target_bits=(vb->W?bm->avg_bitsper*bm->short_per_long:bm->avg_bitsper); - bm->avg_reservoir+=this_bits-avg_target_bits; - } - - return(0); -} - -int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,ogg_packet *op){ - private_state *b=(private_state*)vd->backend_state; - bitrate_manager_state *bm=&b->bms; - vorbis_block *vb=bm->vb; - int choice=PACKETBLOBS/2; - if(!vb)return 0; - - if(op){ - vorbis_block_internal *vbi=(vorbis_block_internal*)vb->internal; - - if(vorbis_bitrate_managed(vb)) - choice=bm->choice; - - op->packet=oggpack_get_buffer(vbi->packetblob[choice]); - op->bytes=oggpack_bytes(vbi->packetblob[choice]); - op->b_o_s=0; - op->e_o_s=vb->eofflag; - op->granulepos=vb->granulepos; - op->packetno=vb->sequence; /* for sake of completeness */ - } - - bm->vb=0; - return(1); -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h deleted file mode 100755 index c2dd37d..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/bitrate.h +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: bitrate tracking and management - last mod: $Id: bitrate.h 13293 2007-07-24 00:09:47Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_BITRATE_H_ -#define _V_BITRATE_H_ - -#include "../../codec.h" -#include "codec_internal.h" -#include "os.h" - -/* encode side bitrate tracking */ -typedef struct bitrate_manager_state { - int managed; - - long avg_reservoir; - long minmax_reservoir; - long avg_bitsper; - long min_bitsper; - long max_bitsper; - - long short_per_long; - double avgfloat; - - vorbis_block *vb; - int choice; -} bitrate_manager_state; - -typedef struct bitrate_manager_info{ - long avg_rate; - long min_rate; - long max_rate; - long reservoir_bits; - double reservoir_bias; - - double slew_damp; - -} bitrate_manager_info; - -extern void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bs); -extern void vorbis_bitrate_clear(bitrate_manager_state *bs); -extern int vorbis_bitrate_managed(vorbis_block *vb); -extern int vorbis_bitrate_addblock(vorbis_block *vb); -extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, ogg_packet *op); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c deleted file mode 100755 index ba1acae..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/block.c +++ /dev/null @@ -1,1033 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: PCM data vector blocking, windowing and dis/reassembly - last mod: $Id: block.c 17561 2010-10-23 10:34:24Z xiphmont $ - - Handle windowing, overlap-add, etc of the PCM vectors. This is made - more amusing by Vorbis' current two allowed block sizes. - - ********************************************************************/ - -#include -#include -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codec_internal.h" - -#include "window.h" -#include "mdct.h" -#include "lpc.h" -#include "registry.h" -#include "misc.h" - -/* pcm accumulator examples (not exhaustive): - - <-------------- lW ----------------> - <--------------- W ----------------> -: .....|..... _______________ | -: .''' | '''_--- | |\ | -:.....''' |_____--- '''......| | \_______| -:.................|__________________|_______|__|______| - |<------ Sl ------>| > Sr < |endW - |beginSl |endSl | |endSr - |beginW |endlW |beginSr - - - |< lW >| - <--------------- W ----------------> - | | .. ______________ | - | | ' `/ | ---_ | - |___.'___/`. | ---_____| - |_______|__|_______|_________________| - | >|Sl|< |<------ Sr ----->|endW - | | |endSl |beginSr |endSr - |beginW | |endlW - mult[0] |beginSl mult[n] - - <-------------- lW -----------------> - |<--W-->| -: .............. ___ | | -: .''' |`/ \ | | -:.....''' |/`....\|...| -:.........................|___|___|___| - |Sl |Sr |endW - | | |endSr - | |beginSr - | |endSl - |beginSl - |beginW -*/ - -/* block abstraction setup *********************************************/ - -#ifndef WORD_ALIGN -#define WORD_ALIGN 8 -#endif - -int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb){ - int i; - memset(vb,0,sizeof(*vb)); - vb->vd=v; - vb->localalloc=0; - vb->localstore=NULL; - if(v->analysisp){ - vorbis_block_internal *vbi=(vorbis_block_internal*) - (vb->internal=(vorbis_block_internal*)_ogg_calloc(1,sizeof(vorbis_block_internal))); - vbi->ampmax=-9999; - - for(i=0;ipacketblob[i]=&vb->opb; - }else{ - vbi->packetblob[i]= - (oggpack_buffer*) _ogg_calloc(1,sizeof(oggpack_buffer)); - } - oggpack_writeinit(vbi->packetblob[i]); - } - } - - return(0); -} - -void *_vorbis_block_alloc(vorbis_block *vb,long bytes){ - bytes=(bytes+(WORD_ALIGN-1)) & ~(WORD_ALIGN-1); - if(bytes+vb->localtop>vb->localalloc){ - /* can't just _ogg_realloc... there are outstanding pointers */ - if(vb->localstore){ - struct alloc_chain *link=(struct alloc_chain*)_ogg_malloc(sizeof(*link)); - vb->totaluse+=vb->localtop; - link->next=vb->reap; - link->ptr=vb->localstore; - vb->reap=link; - } - /* highly conservative */ - vb->localalloc=bytes; - vb->localstore=_ogg_malloc(vb->localalloc); - vb->localtop=0; - } - { - void *ret=(void *)(((char *)vb->localstore)+vb->localtop); - vb->localtop+=bytes; - return ret; - } -} - -/* reap the chain, pull the ripcord */ -void _vorbis_block_ripcord(vorbis_block *vb){ - /* reap the chain */ - struct alloc_chain *reap=vb->reap; - while(reap){ - struct alloc_chain *next=reap->next; - _ogg_free(reap->ptr); - memset(reap,0,sizeof(*reap)); - _ogg_free(reap); - reap=next; - } - /* consolidate storage */ - if(vb->totaluse){ - vb->localstore=_ogg_realloc(vb->localstore,vb->totaluse+vb->localalloc); - vb->localalloc+=vb->totaluse; - vb->totaluse=0; - } - - /* pull the ripcord */ - vb->localtop=0; - vb->reap=NULL; -} - -int vorbis_block_clear(vorbis_block *vb){ - int i; - vorbis_block_internal *vbi=(vorbis_block_internal*)vb->internal; - - _vorbis_block_ripcord(vb); - if(vb->localstore)_ogg_free(vb->localstore); - - if(vbi){ - for(i=0;ipacketblob[i]); - if(i!=PACKETBLOBS/2)_ogg_free(vbi->packetblob[i]); - } - _ogg_free(vbi); - } - memset(vb,0,sizeof(*vb)); - return(0); -} - -/* Analysis side code, but directly related to blocking. Thus it's - here and not in analysis.c (which is for analysis transforms only). - The init is here because some of it is shared */ - -static int _vds_shared_init(vorbis_dsp_state *v,vorbis_info *vi,int encp){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - private_state *b=NULL; - int hs; - - if(ci==NULL) return 1; - hs=ci->halfrate_flag; - - memset(v,0,sizeof(*v)); - b=(private_state*) (v->backend_state=(private_state*)_ogg_calloc(1,sizeof(*b))); - - v->vi=vi; - b->modebits=ilog2(ci->modes); - - b->transform[0]=(vorbis_look_transform**)_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[0])); - b->transform[1]=(vorbis_look_transform**)_ogg_calloc(VI_TRANSFORMB,sizeof(*b->transform[1])); - - /* MDCT is tranform 0 */ - - b->transform[0][0]=_ogg_calloc(1,sizeof(mdct_lookup)); - b->transform[1][0]=_ogg_calloc(1,sizeof(mdct_lookup)); - mdct_init((mdct_lookup*)b->transform[0][0],ci->blocksizes[0]>>hs); - mdct_init((mdct_lookup*)b->transform[1][0],ci->blocksizes[1]>>hs); - - /* Vorbis I uses only window type 0 */ - b->window[0]=ilog2(ci->blocksizes[0])-6; - b->window[1]=ilog2(ci->blocksizes[1])-6; - - if(encp){ /* encode/decode differ here */ - - /* analysis always needs an fft */ - drft_init(&b->fft_look[0],ci->blocksizes[0]); - drft_init(&b->fft_look[1],ci->blocksizes[1]); - - /* finish the codebooks */ - if(!ci->fullbooks){ - ci->fullbooks=(codebook*) _ogg_calloc(ci->books,sizeof(*ci->fullbooks)); - for(int i=0;ibooks;i++) - vorbis_book_init_encode(ci->fullbooks+i,ci->book_param[i]); - } - - b->psy=(vorbis_look_psy*)_ogg_calloc(ci->psys,sizeof(*b->psy)); - for(int i=0;ipsys;i++){ - _vp_psy_init(b->psy+i, - ci->psy_param[i], - &ci->psy_g_param, - ci->blocksizes[ci->psy_param[i]->blockflag]/2, - vi->rate); - } - - v->analysisp=1; - }else{ - /* finish the codebooks */ - if(!ci->fullbooks){ - ci->fullbooks=(codebook*) _ogg_calloc(ci->books,sizeof(*ci->fullbooks)); - for(int i=0;ibooks;i++){ - if(ci->book_param[i]==NULL) - goto abort_books; - if(vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i])) - goto abort_books; - /* decode codebooks are now standalone after init */ - vorbis_staticbook_destroy(ci->book_param[i]); - ci->book_param[i]=NULL; - } - } - } - - /* initialize the storage vectors. blocksize[1] is small for encode, - but the correct size for decode */ - v->pcm_storage=ci->blocksizes[1]; - v->pcm=(float**)_ogg_malloc(vi->channels*sizeof(*v->pcm)); - v->pcmret=(float**)_ogg_malloc(vi->channels*sizeof(*v->pcmret)); - { - int i; - for(i=0;ichannels;i++) - v->pcm[i]=(float*)_ogg_calloc(v->pcm_storage,sizeof(*v->pcm[i])); - } - - /* all 1 (large block) or 0 (small block) */ - /* explicitly set for the sake of clarity */ - v->lW=0; /* previous window size */ - v->W=0; /* current window size */ - - /* all vector indexes */ - v->centerW=ci->blocksizes[1]/2; - - v->pcm_current=v->centerW; - - /* initialize all the backend lookups */ - b->flr=(vorbis_look_floor**)_ogg_calloc(ci->floors,sizeof(*b->flr)); - b->residue=(vorbis_look_residue**)_ogg_calloc(ci->residues,sizeof(*b->residue)); - - for(int i=0;ifloors;i++) - b->flr[i]=_floor_P[ci->floor_type[i]]-> - look(v,ci->floor_param[i]); - - for(int i=0;iresidues;i++) - b->residue[i]=_residue_P[ci->residue_type[i]]-> - look(v,ci->residue_param[i]); - - return 0; - abort_books: - for(int i=0;ibooks;i++){ - if(ci->book_param[i]!=NULL){ - vorbis_staticbook_destroy(ci->book_param[i]); - ci->book_param[i]=NULL; - } - } - vorbis_dsp_clear(v); - return -1; -} - -/* arbitrary settings and spec-mandated numbers get filled in here */ -int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi){ - private_state *b=NULL; - - if(_vds_shared_init(v,vi,1))return 1; - b=(private_state*)v->backend_state; - b->psy_g_look=_vp_global_look(vi); - - /* Initialize the envelope state storage */ - b->ve=(envelope_lookup*)_ogg_calloc(1,sizeof(*b->ve)); - _ve_envelope_init(b->ve,vi); - - vorbis_bitrate_init(vi,&b->bms); - - /* compressed audio packets start after the headers - with sequence number 3 */ - v->sequence=3; - - return(0); -} - -void vorbis_dsp_clear(vorbis_dsp_state *v){ - int i; - if(v){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=(codec_setup_info*)(vi?vi->codec_setup:NULL); - private_state *b=(private_state*)v->backend_state; - - if(b){ - - if(b->ve){ - _ve_envelope_clear(b->ve); - _ogg_free(b->ve); - } - - if(b->transform[0]){ - mdct_clear((mdct_lookup*) b->transform[0][0]); - _ogg_free(b->transform[0][0]); - _ogg_free(b->transform[0]); - } - if(b->transform[1]){ - mdct_clear((mdct_lookup*) b->transform[1][0]); - _ogg_free(b->transform[1][0]); - _ogg_free(b->transform[1]); - } - - if(b->flr){ - if(ci) - for(i=0;ifloors;i++) - _floor_P[ci->floor_type[i]]-> - free_look(b->flr[i]); - _ogg_free(b->flr); - } - if(b->residue){ - if(ci) - for(i=0;iresidues;i++) - _residue_P[ci->residue_type[i]]-> - free_look(b->residue[i]); - _ogg_free(b->residue); - } - if(b->psy){ - if(ci) - for(i=0;ipsys;i++) - _vp_psy_clear(b->psy+i); - _ogg_free(b->psy); - } - - if(b->psy_g_look)_vp_global_free(b->psy_g_look); - vorbis_bitrate_clear(&b->bms); - - drft_clear(&b->fft_look[0]); - drft_clear(&b->fft_look[1]); - - } - - if(v->pcm){ - if(vi) - for(i=0;ichannels;i++) - if(v->pcm[i])_ogg_free(v->pcm[i]); - _ogg_free(v->pcm); - if(v->pcmret)_ogg_free(v->pcmret); - } - - if(b){ - /* free header, header1, header2 */ - if(b->header)_ogg_free(b->header); - if(b->header1)_ogg_free(b->header1); - if(b->header2)_ogg_free(b->header2); - _ogg_free(b); - } - - memset(v,0,sizeof(*v)); - } -} - -float **vorbis_analysis_buffer(vorbis_dsp_state *v, int vals){ - int i; - vorbis_info *vi=v->vi; - private_state *b=(private_state*)v->backend_state; - - /* free header, header1, header2 */ - if(b->header)_ogg_free(b->header);b->header=NULL; - if(b->header1)_ogg_free(b->header1);b->header1=NULL; - if(b->header2)_ogg_free(b->header2);b->header2=NULL; - - /* Do we have enough storage space for the requested buffer? If not, - expand the PCM (and envelope) storage */ - - if(v->pcm_current+vals>=v->pcm_storage){ - v->pcm_storage=v->pcm_current+vals*2; - - for(i=0;ichannels;i++){ - v->pcm[i]=(float*)_ogg_realloc(v->pcm[i],v->pcm_storage*sizeof(*v->pcm[i])); - } - } - - for(i=0;ichannels;i++) - v->pcmret[i]=v->pcm[i]+v->pcm_current; - - return(v->pcmret); -} - -static void _preextrapolate_helper(vorbis_dsp_state *v){ - int i; - int order=32; - float *lpc=(float*)alloca(order*sizeof(*lpc)); - float *work=(float*)alloca(v->pcm_current*sizeof(*work)); - long j; - v->preextrapolate=1; - - if(v->pcm_current-v->centerW>order*2){ /* safety */ - for(i=0;ivi->channels;i++){ - /* need to run the extrapolation in reverse! */ - for(j=0;jpcm_current;j++) - work[j]=v->pcm[i][v->pcm_current-j-1]; - - /* prime as above */ - vorbis_lpc_from_data(work,lpc,v->pcm_current-v->centerW,order); - -#if 0 - if(v->vi->channels==2){ - if(i==0) - _analysis_output("predataL",0,work,v->pcm_current-v->centerW,0,0,0); - else - _analysis_output("predataR",0,work,v->pcm_current-v->centerW,0,0,0); - }else{ - _analysis_output("predata",0,work,v->pcm_current-v->centerW,0,0,0); - } -#endif - - /* run the predictor filter */ - vorbis_lpc_predict(lpc,work+v->pcm_current-v->centerW-order, - order, - work+v->pcm_current-v->centerW, - v->centerW); - - for(j=0;jpcm_current;j++) - v->pcm[i][v->pcm_current-j-1]=work[j]; - - } - } -} - - -/* call with val<=0 to set eof */ - -int vorbis_analysis_wrote(vorbis_dsp_state *v, int vals){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - - if(vals<=0){ - int order=32; - int i; - float *lpc=(float*) alloca(order*sizeof(*lpc)); - - /* if it wasn't done earlier (very short sample) */ - if(!v->preextrapolate) - _preextrapolate_helper(v); - - /* We're encoding the end of the stream. Just make sure we have - [at least] a few full blocks of zeroes at the end. */ - /* actually, we don't want zeroes; that could drop a large - amplitude off a cliff, creating spread spectrum noise that will - suck to encode. Extrapolate for the sake of cleanliness. */ - - vorbis_analysis_buffer(v,ci->blocksizes[1]*3); - v->eofflag=v->pcm_current; - v->pcm_current+=ci->blocksizes[1]*3; - - for(i=0;ichannels;i++){ - if(v->eofflag>order*2){ - /* extrapolate with LPC to fill in */ - long n; - - /* make a predictor filter */ - n=v->eofflag; - if(n>ci->blocksizes[1])n=ci->blocksizes[1]; - vorbis_lpc_from_data(v->pcm[i]+v->eofflag-n,lpc,n,order); - - /* run the predictor filter */ - vorbis_lpc_predict(lpc,v->pcm[i]+v->eofflag-order,order, - v->pcm[i]+v->eofflag,v->pcm_current-v->eofflag); - }else{ - /* not enough data to extrapolate (unlikely to happen due to - guarding the overlap, but bulletproof in case that - assumtion goes away). zeroes will do. */ - memset(v->pcm[i]+v->eofflag,0, - (v->pcm_current-v->eofflag)*sizeof(*v->pcm[i])); - - } - } - }else{ - - if(v->pcm_current+vals>v->pcm_storage) - return(OV_EINVAL); - - v->pcm_current+=vals; - - /* we may want to reverse extrapolate the beginning of a stream - too... in case we're beginning on a cliff! */ - /* clumsy, but simple. It only runs once, so simple is good. */ - if(!v->preextrapolate && v->pcm_current-v->centerW>ci->blocksizes[1]) - _preextrapolate_helper(v); - - } - return(0); -} - -/* do the deltas, envelope shaping, pre-echo and determine the size of - the next block on which to continue analysis */ -int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb){ - int i; - vorbis_info *vi=v->vi; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - private_state *b=(private_state*)v->backend_state; - vorbis_look_psy_global *g=b->psy_g_look; - long beginW=v->centerW-ci->blocksizes[v->W]/2,centerNext; - vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal; - - /* check to see if we're started... */ - if(!v->preextrapolate)return(0); - - /* check to see if we're done... */ - if(v->eofflag==-1)return(0); - - /* By our invariant, we have lW, W and centerW set. Search for - the next boundary so we can determine nW (the next window size) - which lets us compute the shape of the current block's window */ - - /* we do an envelope search even on a single blocksize; we may still - be throwing more bits at impulses, and envelope search handles - marking impulses too. */ - { - long bp=_ve_envelope_search(v); - if(bp==-1){ - - if(v->eofflag==0)return(0); /* not enough data currently to search for a - full long block */ - v->nW=0; - }else{ - - if(ci->blocksizes[0]==ci->blocksizes[1]) - v->nW=0; - else - v->nW=bp; - } - } - - centerNext=v->centerW+ci->blocksizes[v->W]/4+ci->blocksizes[v->nW]/4; - - { - /* center of next block + next block maximum right side. */ - - long blockbound=centerNext+ci->blocksizes[v->nW]/2; - if(v->pcm_currentlW=v->lW; - vb->W=v->W; - vb->nW=v->nW; - - if(v->W){ - if(!v->lW || !v->nW){ - vbi->blocktype=BLOCKTYPE_TRANSITION; - /*fprintf(stderr,"-");*/ - }else{ - vbi->blocktype=BLOCKTYPE_LONG; - /*fprintf(stderr,"_");*/ - } - }else{ - if(_ve_envelope_mark(v)){ - vbi->blocktype=BLOCKTYPE_IMPULSE; - /*fprintf(stderr,"|");*/ - - }else{ - vbi->blocktype=BLOCKTYPE_PADDING; - /*fprintf(stderr,".");*/ - - } - } - - vb->vd=v; - vb->sequence=v->sequence++; - vb->granulepos=v->granulepos; - vb->pcmend=ci->blocksizes[v->W]; - - /* copy the vectors; this uses the local storage in vb */ - - /* this tracks 'strongest peak' for later psychoacoustics */ - /* moved to the global psy state; clean this mess up */ - if(vbi->ampmax>g->ampmax)g->ampmax=vbi->ampmax; - g->ampmax=_vp_ampmax_decay(g->ampmax,v); - vbi->ampmax=g->ampmax; - - vb->pcm=(float**)_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); - vbi->pcmdelay=(float**)_vorbis_block_alloc(vb,sizeof(*vbi->pcmdelay)*vi->channels); - for(i=0;ichannels;i++){ - vbi->pcmdelay[i]= - (float*) _vorbis_block_alloc(vb,(vb->pcmend+beginW)*sizeof(*vbi->pcmdelay[i])); - memcpy(vbi->pcmdelay[i],v->pcm[i],(vb->pcmend+beginW)*sizeof(*vbi->pcmdelay[i])); - vb->pcm[i]=vbi->pcmdelay[i]+beginW; - - /* before we added the delay - vb->pcm[i]=_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); - memcpy(vb->pcm[i],v->pcm[i]+beginW,ci->blocksizes[v->W]*sizeof(*vb->pcm[i])); - */ - - } - - /* handle eof detection: eof==0 means that we've not yet received EOF - eof>0 marks the last 'real' sample in pcm[] - eof<0 'no more to do'; doesn't get here */ - - if(v->eofflag){ - if(v->centerW>=v->eofflag){ - v->eofflag=-1; - vb->eofflag=1; - return(1); - } - } - - /* advance storage vectors and clean up */ - { - int new_centerNext=ci->blocksizes[1]/2; - int movementW=centerNext-new_centerNext; - - if(movementW>0){ - - _ve_envelope_shift(b->ve,movementW); - v->pcm_current-=movementW; - - for(i=0;ichannels;i++) - memmove(v->pcm[i],v->pcm[i]+movementW, - v->pcm_current*sizeof(*v->pcm[i])); - - - v->lW=v->W; - v->W=v->nW; - v->centerW=new_centerNext; - - if(v->eofflag){ - v->eofflag-=movementW; - if(v->eofflag<=0)v->eofflag=-1; - /* do not add padding to end of stream! */ - if(v->centerW>=v->eofflag){ - v->granulepos+=movementW-(v->centerW-v->eofflag); - }else{ - v->granulepos+=movementW; - } - }else{ - v->granulepos+=movementW; - } - } - } - - /* done */ - return(1); -} - -int vorbis_synthesis_restart(vorbis_dsp_state *v){ - vorbis_info *vi=v->vi; - codec_setup_info *ci; - int hs; - - if(!v->backend_state)return -1; - if(!vi)return -1; - ci=(codec_setup_info*) vi->codec_setup; - if(!ci)return -1; - hs=ci->halfrate_flag; - - v->centerW=ci->blocksizes[1]>>(hs+1); - v->pcm_current=v->centerW>>hs; - - v->pcm_returned=-1; - v->granulepos=-1; - v->sequence=-1; - v->eofflag=0; - ((private_state *)(v->backend_state))->sample_count=-1; - - return(0); -} - -int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi){ - if(_vds_shared_init(v,vi,0)){ - vorbis_dsp_clear(v); - return 1; - } - vorbis_synthesis_restart(v); - return 0; -} - -/* Unlike in analysis, the window is only partially applied for each - block. The time domain envelope is not yet handled at the point of - calling (as it relies on the previous block). */ - -int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - private_state *b=(private_state*)v->backend_state; - int hs=ci->halfrate_flag; - int i,j; - - if(!vb)return(OV_EINVAL); - if(v->pcm_current>v->pcm_returned && v->pcm_returned!=-1)return(OV_EINVAL); - - v->lW=v->W; - v->W=vb->W; - v->nW=-1; - - if((v->sequence==-1)|| - (v->sequence+1 != vb->sequence)){ - v->granulepos=-1; /* out of sequence; lose count */ - b->sample_count=-1; - } - - v->sequence=vb->sequence; - - if(vb->pcm){ /* no pcm to process if vorbis_synthesis_trackonly - was called on block */ - int n=ci->blocksizes[v->W]>>(hs+1); - int n0=ci->blocksizes[0]>>(hs+1); - int n1=ci->blocksizes[1]>>(hs+1); - - int thisCenter; - int prevCenter; - - v->glue_bits+=vb->glue_bits; - v->time_bits+=vb->time_bits; - v->floor_bits+=vb->floor_bits; - v->res_bits+=vb->res_bits; - - if(v->centerW){ - thisCenter=n1; - prevCenter=0; - }else{ - thisCenter=0; - prevCenter=n1; - } - - /* v->pcm is now used like a two-stage double buffer. We don't want - to have to constantly shift *or* adjust memory usage. Don't - accept a new block until the old is shifted out */ - - for(j=0;jchannels;j++){ - /* the overlap/add section */ - if(v->lW){ - if(v->W){ - /* large/large */ - const float *w=_vorbis_window_get(b->window[1]-hs); - float *pcm=v->pcm[j]+prevCenter; - float *p=vb->pcm[j]; - for(i=0;iwindow[0]-hs); - float *pcm=v->pcm[j]+prevCenter+n1/2-n0/2; - float *p=vb->pcm[j]; - for(i=0;iW){ - /* small/large */ - const float *w=_vorbis_window_get(b->window[0]-hs); - float *pcm=v->pcm[j]+prevCenter; - float *p=vb->pcm[j]+n1/2-n0/2; - for(i=0;iwindow[0]-hs); - float *pcm=v->pcm[j]+prevCenter; - float *p=vb->pcm[j]; - for(i=0;ipcm[j]+thisCenter; - float *p=vb->pcm[j]+n; - for(i=0;icenterW) - v->centerW=0; - else - v->centerW=n1; - - /* deal with initial packet state; we do this using the explicit - pcm_returned==-1 flag otherwise we're sensitive to first block - being short or long */ - - if(v->pcm_returned==-1){ - v->pcm_returned=thisCenter; - v->pcm_current=thisCenter; - }else{ - v->pcm_returned=prevCenter; - v->pcm_current=prevCenter+ - ((ci->blocksizes[v->lW]/4+ - ci->blocksizes[v->W]/4)>>hs); - } - - } - - /* track the frame number... This is for convenience, but also - making sure our last packet doesn't end with added padding. If - the last packet is partial, the number of samples we'll have to - return will be past the vb->granulepos. - - This is not foolproof! It will be confused if we begin - decoding at the last page after a seek or hole. In that case, - we don't have a starting point to judge where the last frame - is. For this reason, vorbisfile will always try to make sure - it reads the last two marked pages in proper sequence */ - - if(b->sample_count==-1){ - b->sample_count=0; - }else{ - b->sample_count+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; - } - - if(v->granulepos==-1){ - if(vb->granulepos!=-1){ /* only set if we have a position to set to */ - - v->granulepos=vb->granulepos; - - /* is this a short page? */ - if(b->sample_count>v->granulepos){ - /* corner case; if this is both the first and last audio page, - then spec says the end is cut, not beginning */ - long extra = (long) (b->sample_count-vb->granulepos); - - /* we use ogg_int64_t for granule positions because a - uint64 isn't universally available. Unfortunately, - that means granposes can be 'negative' and result in - extra being negative */ - if(extra<0) - extra=0; - - if(vb->eofflag){ - /* trim the end */ - /* no preceding granulepos; assume we started at zero (we'd - have to in a short single-page stream) */ - /* granulepos could be -1 due to a seek, but that would result - in a long count, not short count */ - - /* Guard against corrupt/malicious frames that set EOP and - a backdated granpos; don't rewind more samples than we - actually have */ - if(extra > (v->pcm_current - v->pcm_returned)<pcm_current - v->pcm_returned)<pcm_current-=extra>>hs; - }else{ - /* trim the beginning */ - v->pcm_returned+=extra>>hs; - if(v->pcm_returned>v->pcm_current) - v->pcm_returned=v->pcm_current; - } - - } - - } - }else{ - v->granulepos+=ci->blocksizes[v->lW]/4+ci->blocksizes[v->W]/4; - if(vb->granulepos!=-1 && v->granulepos!=vb->granulepos){ - - if(v->granulepos>vb->granulepos){ - long extra=v->granulepos-vb->granulepos; - - if(extra) - if(vb->eofflag){ - /* partial last frame. Strip the extra samples off */ - - /* Guard against corrupt/malicious frames that set EOP and - a backdated granpos; don't rewind more samples than we - actually have */ - if(extra > (v->pcm_current - v->pcm_returned)<pcm_current - v->pcm_returned)<pcm_current-=extra>>hs; - } /* else {Shouldn't happen *unless* the bitstream is out of - spec. Either way, believe the bitstream } */ - } /* else {Shouldn't happen *unless* the bitstream is out of - spec. Either way, believe the bitstream } */ - v->granulepos=vb->granulepos; - } - } - - /* Update, cleanup */ - - if(vb->eofflag)v->eofflag=1; - return(0); - -} - -/* pcm==NULL indicates we just want the pending samples, no more */ -int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm){ - vorbis_info *vi=v->vi; - - if(v->pcm_returned>-1 && v->pcm_returnedpcm_current){ - if(pcm){ - int i; - for(i=0;ichannels;i++) - v->pcmret[i]=v->pcm[i]+v->pcm_returned; - *pcm=v->pcmret; - } - return(v->pcm_current-v->pcm_returned); - } - return(0); -} - -int vorbis_synthesis_read(vorbis_dsp_state *v,int n){ - if(n && v->pcm_returned+n>v->pcm_current)return(OV_EINVAL); - v->pcm_returned+=n; - return(0); -} - -/* intended for use with a specific vorbisfile feature; we want access - to the [usually synthetic/postextrapolated] buffer and lapping at - the end of a decode cycle, specifically, a half-short-block worth. - This funtion works like pcmout above, except it will also expose - this implicit buffer data not normally decoded. */ -int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - int hs=ci->halfrate_flag; - - int n=ci->blocksizes[v->W]>>(hs+1); - int n0=ci->blocksizes[0]>>(hs+1); - int n1=ci->blocksizes[1]>>(hs+1); - - if(v->pcm_returned<0)return 0; - - /* our returned data ends at pcm_returned; because the synthesis pcm - buffer is a two-fragment ring, that means our data block may be - fragmented by buffering, wrapping or a short block not filling - out a buffer. To simplify things, we unfragment if it's at all - possibly needed. Otherwise, we'd need to call lapout more than - once as well as hold additional dsp state. Opt for - simplicity. */ - - /* centerW was advanced by blockin; it would be the center of the - *next* block */ - if(v->centerW==n1){ - /* the data buffer wraps; swap the halves */ - /* slow, sure, small */ - for(int j=0;jchannels;j++){ - float *p=v->pcm[j]; - for(int i=0;ipcm_current-=n1; - v->pcm_returned-=n1; - v->centerW=0; - } - - /* solidify buffer into contiguous space */ - if((v->lW^v->W)==1){ - /* long/short or short/long */ - for(int j=0;jchannels;j++){ - float *s=v->pcm[j]; - float *d=v->pcm[j]+(n1-n0)/2; - for(int i=(n1+n0)/2-1;i>=0;--i) - d[i]=s[i]; - } - v->pcm_returned+=(n1-n0)/2; - v->pcm_current+=(n1-n0)/2; - }else{ - if(v->lW==0){ - /* short/short */ - for(int j=0;jchannels;j++){ - float *s=v->pcm[j]; - float *d=v->pcm[j]+n1-n0; - for(int i=n0-1;i>=0;--i) - d[i]=s[i]; - } - v->pcm_returned+=n1-n0; - v->pcm_current+=n1-n0; - } - } - - if(pcm){ - for(int i=0;ichannels;i++) - v->pcmret[i]=v->pcm[i]+v->pcm_returned; - *pcm=v->pcmret; - } - - return(n1+n-v->pcm_returned); - -} - -static float *vorbis_window(vorbis_dsp_state *v,int W){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=(codec_setup_info*) vi->codec_setup; - int hs=ci->halfrate_flag; - private_state *b=(private_state*)v->backend_state; - - if(b->window[W]-1<0)return NULL; - return _vorbis_window_get(b->window[W]-hs); -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h deleted file mode 100755 index 488c8a4..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_51.h +++ /dev/null @@ -1,12256 +0,0 @@ -static const long _vq_quantlist__44p0_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44p0_l0_0[] = { - 1, 3, 4, 7, 7, 8, 8, 9, 9, 9,10,10,10, 5, 6, 5, - 8, 7, 9, 8, 9, 9,10, 9,11,10, 5, 5, 7, 7, 8, 8, - 9, 9, 9, 9,10,10,11, 8, 9, 8,10, 9,10, 9,10, 9, - 11,10,11,10, 8, 8, 9, 9,10, 9,10, 9,11,10,11,10, - 11,10,11,11,11,11,11,11,11,11,11,11,11,11,10,11, - 11,11,12,11,11,11,11,11,11,10,12,12,12,12,12,12, - 12,11,12,12,12,11,11,11,12,12,12,12,12,12,12,11, - 12,11,12,11,11,13,12,12,12,13,12,12,12,12,11,12, - 11,11,13,13,13,12,12,12,12,12,12,11,11,11,10,13, - 13,13,12,13,12,13,11,13,10,12,11,11,13,13,12,13, - 12,12,12,12,11,12,11,11,11, -}; - -static const static_codebook _44p0_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44p0_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p0_l0_0, - 0 -}; - -static const long _vq_quantlist__44p0_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p0_l0_1[] = { - 1, 4, 4, 6, 6, 5, 5, 5, 7, 5, 5, 5, 5, 6, 7, 7, - 6, 7, 7, 7, 6, 7, 7, 7, 7, -}; - -static const static_codebook _44p0_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44p0_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p0_l0_1, - 0 -}; - -static const long _vq_quantlist__44p0_l1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p0_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p0_l1_0 = { - 2, 9, - (long *)_vq_lengthlist__44p0_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p0_l1_0, - 0 -}; - -static const long _huff_lengthlist__44p0_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p0_lfe = { - 2, 4, - (long *)_huff_lengthlist__44p0_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44p0_long[] = { - 2, 3, 6, 7,10,14,16, 3, 2, 5, 7,11,14,17, 6, 5, - 5, 7,10,12,14, 7, 7, 6, 6, 7, 9,13,10,11, 9, 6, - 6, 9,11,15,15,13,10, 9,10,12,18,18,16,14,12,13, - 16, -}; - -static const static_codebook _huff_book__44p0_long = { - 2, 49, - (long *)_huff_lengthlist__44p0_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p0_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p0_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p0_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44p0_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p0_p1_0, - 0 -}; - -static const long _vq_quantlist__44p0_p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p0_p2_0[] = { - 1, 5, 5, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0,12,12, 0, - 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 0, 6, 6, 0,11, - 11, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0,12,12, - 0,15,15, 0,12,12, 0, 5, 5, 0, 5, 5, 0, 6, 6, 0, - 7, 7, 0,11,11, 0, 6, 6, 0, 7, 7, 0,10,11, 0, 6, - 6, 0, 7, 7, 0,11,11, 0,12,12, 0,11,11, 0,15,15, - 0,10,10, 0,12,12, 0,15,15, 0,12,12, 0, 6, 6, 0, - 12,12, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0,12, - 12, 0,15,15, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 0,12,12, 0,12,12, 0,12,12, 0,15, - 15, 0,12,12, 0,11,12, 0,15,16, 0,11,11, 0, 6, 6, - 0,11,12, 0,12,12, 0,12,12, 0,16,15, 0,12,12, 0, - 13,12, 0,15,14, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p0_p2_0 = { - 5, 243, - (long *)_vq_lengthlist__44p0_p2_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p0_p2_0, - 0 -}; - -static const long _vq_quantlist__44p0_p2_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p0_p2_1[] = { - 1, 3, 3, 0, 9, 9, 0, 9, 9, 0,10,10, 0, 9, 9, 0, - 10,10, 0,10,10, 0, 9, 9, 0,10,10, 0, 7, 7, 0, 7, - 7, 0, 6, 6, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 9, - 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 9, 9, 0, 8, 8, 0, - 10,10, 0, 9, 9, 0,10,10, 0,10,10, 0, 9, 9, 0,10, - 10, 0, 9, 9, 0,11,11, 0,11,11, 0,12,12, 0,11,11, - 0,12,12, 0,13,13, 0,12,12, 0,13,12, 0, 8, 8, 0, - 12,12, 0,12,12, 0,13,13, 0,12,12, 0,13,13, 0,13, - 13, 0,13,13, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0,11,11, 0,12,12, 0,13,13, 0,12, - 12, 0,13,13, 0,13,13, 0,12,12, 0,12,12, 0, 8, 8, - 0,12,12, 0,12,12, 0,13,13, 0,13,13, 0,13,14, 0, - 14,13, 0,13,13, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p0_p2_1 = { - 5, 243, - (long *)_vq_lengthlist__44p0_p2_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p0_p2_1, - 0 -}; - -static const long _vq_quantlist__44p0_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p0_p3_0[] = { - 1, 6, 6, 7, 8, 8, 7, 8, 8, 7, 9, 9,10,12,11, 9, - 8, 8, 7, 9, 9,11,12,12, 9, 9, 9, 6, 7, 7,10,11, - 11,10,11,11,10,11,11,13,13,14,12,12,12,11,11,11, - 14,14,14,12,12,12, 6, 5, 5, 9, 6, 5, 9, 6, 6, 9, - 7, 7,12,10,10,11, 6, 6,10, 7, 7,13,10,10,12, 7, - 7, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, - 13, 9, 9,12,11,11,16,13,13,15,11,11, 8, 7, 7,12, - 12,12,12,11,11,12,11,11,14,14,14,14,12,12,12,12, - 12,16,15,15,14,12,12, 0,10,10, 0,12,12, 0,12,12, - 0,11,11, 0,14,14, 0,11,11, 0,12,12, 0,15,15, 0, - 11,11, 8, 8, 8,13,11,11,13,10,10,13,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,14,10,10, 9, 7, 7, - 13,11,11,13,11,11,12,11,11,16,14,14,14,12,12,13, - 12,12,15,14,14,15,13,12, 0,11,11, 0,12,12, 0,12, - 12, 0,12,12, 0,15,15, 0,12,12, 0,13,12, 0,14,15, - 0,12,12, -}; - -static const static_codebook _44p0_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44p0_p3_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p0_p3_0, - 0 -}; - -static const long _vq_quantlist__44p0_p3_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p0_p3_1[] = { - 2, 4, 4, 8, 8,10,12,12,11,11, 9,11,11,12,13,11, - 12,12,11,11,11,12,12,12,12,10,13,12,13,13,11,12, - 12,13,13,11,12,12,13,13,11,12,13,13,13,11,13,13, - 13,13,10,13,13,12,13,11,12,12,14,14,11,13,12,12, - 12,11,12,12,13,13,11,13,13,12,12,11,13,13,13,13, - 11,12,12,13,13,11,13,13,12,12,11,12,12,13,13,11, - 13,13,12,12,11,13,13,13,13,11,12,12,14,14,11,13, - 13,12,12,11,12,12,13,13,11,13,13,12,12,11,10,10, - 10,10,12,10,10,11,11,11, 8, 8,11,11,13,10,10,10, - 10,12,10,10,10,10,13,11,11,11,11,13,10,10,11,11, - 13,11,11,12,12,13,11,11,11,11,13,11,11,12,12,13, - 11,11,12,12,13,10,10,11,11,13,11,11,11,11,13,11, - 10,11,11,13,11,11,11,11,13,11,11,11,11,13,10,10, - 11,11,13,11,11,11,11,12,10,11,11,11,13,11,11,11, - 11,13,11,11,11,11,13,10,10,11,11,13,11,11,11,11, - 13,11,11,11,11,13,11,11,11,11,11,10,10,10,10,12, - 10,10, 9, 9,12,12,12,11,11,13,12,12, 9, 9,13,12, - 12,10,10,12,12,12,12,12,13,13,13,14,14,13,12,12, - 11,11,13,13,13,12,12,13,12,12,11,11,13,12,13,11, - 11,13,13,13,14,14,13,12,12,10,10,13,13,13,11,11, - 13,12,12,10,10,13,13,13,11,11,13,13,13,14,14,13, - 12,12,10,10,13,13,13,11,11,13,12,13,10,10,13,13, - 13,11,11,13,13,13,14,14,13,12,12,10,10,13,13,13, - 11,11,13,13,12,10,10,14,12,12, 8, 8,14,12,12, 9, - 9,14,11,11, 9, 9,14,12,12, 8, 8,14,11,11, 7, 7, - 14,13,13,10,10,15,12,12,10,10,15,13,13,10,10,15, - 12,12, 9, 9,15,13,13,10,10,15,13,13,10,10,15,12, - 12,10,10,15,13,13,10,10,14,12,12, 9, 9,14,13,13, - 9, 9,14,13,13, 9, 9,15,12,12, 9, 9,15,13,13, 9, - 9,14,12,12, 9, 9,14,13,13, 9, 9,14,13,13, 9, 9, - 15,12,12, 9, 9,14,13,13, 9, 9,14,12,12, 9, 9,14, - 13,13, 9, 9,13,12,12, 8, 8,13,13,13, 8, 8,14,13, - 13, 9, 9,13,13,13, 7, 7,14,13,13, 8, 8,14,14,14, - 10,10,14,14,14,11,11,14,14,14, 9, 9,14,14,14,10, - 10,14,14,14, 9, 9,14,14,14,10, 9,15,14,14,11,11, - 14,14,14, 9, 9,14,14,14,10,10,14,14,14, 9, 9,14, - 14,14, 9, 9,15,14,14,11,11,14,14,14, 8, 8,14,14, - 14, 9, 9,14,14,14, 8, 8,14,14,14, 9, 9,15,14,14, - 11,11,14,14,14, 8, 8,14,14,14, 9, 9,14,14,14, 8, - 8,12,12,12,13,13,16,15,15,11,11,16,15,16,12,12, - 17,16,16,11,11,17,15,15,12,11,16,16,16,12,13,16, - 15,15,13,13,16,16,16,12,12,16,16,15,13,13,16,16, - 16,12,12,16,16,16,13,13,17,16,16,14,14,17,17,16, - 12,12,17,16,16,13,13,17,17,16,12,13,16,16,17,13, - 12,17,16,16,14,13,17,16,16,12,12,17,16,16,12,12, - 17,16,17,12,12,17,17,17,13,13,16,16,16,13,14,17, - 17,16,12,12,16,16,16,13,13,17,17,17,12,12,13,14, - 14,10,10,16,14,14,12,12,16,15,15,14,14,16,14,14, - 12,12,15,14,14,13,13,17,15,15,14,13,16,16,15,15, - 15,16,15,15,14,14,16,15,15,14,14,17,15,15,14,14, - 16,15,15,14,14,16,16,15,15,15,17,15,15,13,13,16, - 15,15,14,14,17,15,15,13,13,17,15,15,14,14,16,15, - 15,15,15,16,14,14,13,13,16,15,15,14,14,16,14,14, - 13,13,17,15,15,14,14,16,16,15,15,15,17,14,14,13, - 13,16,15,15,14,14,17,14,14,13,13,13,11,11,10,10, - 16,14,14,13,13,15,14,14,13,13,16,14,14,12,12,16, - 14,14,12,12,15,15,15,14,14,16,14,14,14,14,16,15, - 14,14,14,16,14,14,14,14,16,15,15,14,13,16,15,15, - 14,14,16,14,14,14,14,17,15,15,14,14,16,14,14,14, - 14,16,15,15,13,14,16,15,15,14,14,16,14,14,14,14, - 16,15,15,13,13,16,14,14,13,13,16,15,15,13,13,16, - 15,15,14,14,16,14,14,14,14,17,15,15,13,13,16,15, - 14,13,13,17,15,15,13,13,14,14,14, 9, 9,14,14,14, - 17,17,14,15,15,18,18,14,14,14,18,19,14,14,14,18, - 18,15,15,15,19,18,15,16,15,18,20,15,15,15,18,19, - 15,15,15,19,19,15,15,15,18,20,15,15,15,18,19,15, - 15,16,20,18,15,15,15,18,18,15,15,15,19,19,15,15, - 15,18,19,15,15,15,18,19,15,15,15,19,19,14,15,14, - 19,19,15,15,15,20,19,15,14,14,19,18,14,15,15,18, - 19,15,15,16,20,20,14,14,14,18,19,15,15,15,19,18, - 14,14,14,18,18,14,12,12, 9, 9,13,14,14,18,18,14, - 13,13,18,19,14,14,14,18,18,14,14,14,18,18,15,15, - 15,19,19,15,14,14,19,18,14,15,15,19,18,15,14,14, - 18,18,15,15,15,19,18,14,15,15,19,19,15,14,14,19, - 18,14,15,15,19,18,15,14,14,19,18,14,15,15,19,18, - 15,15,15,21,18,15,14,14,19,18,14,15,15,18,19,14, - 15,14,20,19,14,15,15,18,19,14,15,15,19,19,15,14, - 14,19,20,14,15,15,18,18,14,14,14,19,19,14,15,15, - 19,18,12,12,12,13,13,16,15,15,11,11,16,15,15,12, - 12,16,16,16,11,11,16,15,15,11,11,16,16,16,13,13, - 17,16,16,13,13,17,17,17,12,12,16,16,16,13,13,17, - 16,17,13,12,15,16,16,12,12,16,15,15,13,13,17,16, - 16,12,12,16,16,15,12,12,16,16,16,12,12,17,17,16, - 13,12,16,16,16,13,13,17,16,16,12,12,17,16,16,12, - 12,17,17,16,12,12,16,17,16,12,12,17,15,15,13,13, - 17,16,16,12,12,16,16,16,12,12,16,16,16,12,12,13, - 13,13, 9, 9,15,14,14,13,13,16,15,14,14,14,16,14, - 14,13,13,15,14,14,13,13,17,15,15,14,14,16,15,15, - 15,15,16,15,15,14,14,16,15,15,15,15,17,15,15,14, - 14,16,15,15,14,14,16,15,15,15,15,17,14,15,14,14, - 16,15,15,14,14,17,15,15,13,14,17,15,15,14,14,16, - 15,15,15,15,17,14,14,13,13,16,15,15,14,14,17,14, - 14,13,13,17,15,15,14,14,16,15,16,15,15,17,14,14, - 13,13,16,15,15,14,14,18,14,14,13,13,13,11,11,11, - 11,15,14,14,12,12,15,14,14,13,13,16,14,14,12,12, - 16,13,14,12,12,16,15,15,13,13,16,14,14,14,14,16, - 15,15,13,13,16,14,14,13,13,16,14,15,13,13,15,15, - 15,13,13,16,14,14,14,13,16,14,14,13,13,16,14,14, - 13,13,16,15,15,13,13,16,15,15,13,13,16,14,14,14, - 14,16,15,15,12,12,16,14,14,13,13,16,15,15,12,12, - 16,15,15,13,13,16,14,14,14,14,17,15,14,12,12,16, - 14,14,13,13,16,15,15,12,12,14,14,14, 8, 8,14,14, - 14,17,18,14,15,15,17,18,14,14,14,17,18,14,14,14, - 18,18,14,15,15,18,18,14,16,15,19,19,15,15,15,18, - 19,15,16,15,20,19,15,15,15,18,18,14,15,15,18,19, - 15,16,16,20,19,15,15,15,19,17,14,15,15,20,18,14, - 15,15,18,18,14,15,15,18,19,14,15,15,19,20,14,14, - 14,18,18,14,15,15,18,19,14,14,14,18,19,14,15,15, - 19,18,15,16,16,20,21,14,14,15,19,19,14,15,15,19, - 19,14,14,14,19,18,13,12,12, 9, 9,13,14,14,18,19, - 14,14,14,18,19,14,14,14,18,18,14,14,14,18,18,14, - 15,15,19,19,15,14,14,19,18,15,15,15,19,19,15,14, - 14,19,20,14,15,15,18,19,14,15,15,20,18,15,14,14, - 18,18,14,15,15,18,18,14,14,14,19,19,14,15,15,18, - 18,14,15,15,19,18,15,14,14,19,19,14,15,15,19,18, - 15,14,14,19,18,14,14,15,18,19,14,15,15,19,18,15, - 14,14,18,19,14,15,14,19,20,14,14,14,19,19,14,15, - 15,19,19,12,12,12,13,13,16,16,16,11,11,16,16,16, - 12,12,17,16,16,11,11,17,15,15,11,11,16,16,16,13, - 13,17,15,16,13,13,16,16,16,12,12,17,16,16,13,13, - 17,17,16,12,12,17,17,16,13,13,17,16,16,13,13,17, - 17,17,12,12,17,16,16,13,13,17,17,17,12,12,16,16, - 16,12,12,17,15,15,13,13,17,16,16,11,11,17,16,16, - 12,12,16,16,16,11,11,16,17,16,12,12,17,16,16,13, - 13,17,17,16,12,12,17,17,16,12,12,17,16,16,11,11, - 13,14,14, 9, 9,16,14,14,13,13,16,14,15,14,14,16, - 14,14,12,12,16,14,14,13,13,17,15,15,14,14,16,15, - 15,15,15,17,15,15,14,14,16,15,15,14,14,17,15,15, - 14,14,16,15,15,14,14,16,15,15,15,16,17,14,15,14, - 14,16,15,15,14,14,17,15,15,14,14,16,15,15,14,14, - 16,15,15,15,15,17,14,14,13,13,16,15,15,14,14,16, - 14,14,13,13,17,15,15,14,14,16,16,15,15,15,17,14, - 14,13,13,16,15,15,14,14,17,14,14,13,13,13,11,11, - 10,10,16,14,14,12,12,15,13,13,13,12,16,14,14,11, - 11,16,14,14,11,11,16,14,15,13,14,16,14,14,13,13, - 16,15,15,13,13,16,14,14,13,13,16,15,15,13,13,16, - 15,15,13,13,17,14,14,14,14,17,15,15,13,13,16,14, - 15,13,13,16,15,15,13,13,16,15,15,13,13,16,14,14, - 13,13,17,15,15,12,12,16,14,14,12,12,16,15,15,12, - 12,16,15,15,13,13,16,14,14,13,13,17,15,15,12,12, - 17,14,14,12,12,16,15,15,12,12,13,14,14, 8, 8,13, - 14,14,18,18,13,15,15,17,18,14,14,14,18,19,14,14, - 14,19,18,14,15,15,19,18,15,15,16,21,18,15,15,15, - 19,19,14,16,16,19,19,14,15,15,18,19,14,15,15,19, - 20,14,16,16,19,18,15,15,15,18,19,14,15,15,19,18, - 15,15,15,18,18,15,15,15,20,18,15,16,16,20,19,14, - 15,14,18,19,14,15,16,19,20,14,15,15,19,18,15,15, - 15,19,18,15,16,16,20,19,15,14,14,18,18,14,15,15, - 19,19,14,15,15,18,18,13,12,12, 8, 8,13,14,14,19, - 18,14,13,13,20,18,14,14,14,19,18,14,13,13,18,19, - 14,15,15,20,19,15,14,14,19,19,14,15,15,19,18,15, - 14,14,20,20,15,15,15,19,18,14,15,15,19,18,15,14, - 14,19,18,14,15,15,20,19,14,14,14,20,19,14,15,15, - 19,18,15,15,15,18,18,15,14,14,18,18,14,15,15,19, - 19,14,14,14,19,19,14,15,15,19,19,15,15,15,19,18, - 15,14,14,20,19,15,15,15,19,19,14,14,14,20,19,14, - 15,15,20,20,12,12,12,13,13,17,16,16,11,11,16,16, - 15,12,12,17,16,16,11,11,17,15,15,11,11,17,17,17, - 13,13,17,16,16,13,13,17,17,17,12,12,17,16,16,13, - 13,17,17,16,12,13,16,17,16,13,13,17,16,15,13,13, - 17,16,16,12,12,17,16,16,12,13,17,16,17,12,12,17, - 17,17,12,12,17,16,15,13,13,17,16,16,12,12,17,16, - 16,12,12,17,16,16,11,11,16,16,16,12,12,17,15,15, - 13,13,17,16,15,11,11,16,16,16,12,12,17,16,16,11, - 11,13,14,14, 9, 9,16,14,14,13,13,16,14,15,14,14, - 16,14,14,12,12,16,14,14,13,13,17,15,15,14,15,16, - 15,15,15,15,17,15,15,14,14,16,15,15,15,14,16,15, - 15,14,14,16,15,15,14,14,16,15,16,15,15,17,15,14, - 14,14,16,15,15,14,14,17,15,15,13,13,16,15,15,14, - 14,16,16,16,15,15,17,14,14,13,13,16,15,15,14,14, - 18,14,15,13,13,16,15,15,14,14,16,16,15,15,15,16, - 14,14,13,13,16,15,15,14,14,17,14,15,13,13,13,11, - 11,10,10,15,14,14,12,12,15,14,14,13,13,16,14,14, - 12,12,16,13,14,12,12,16,14,15,14,13,16,14,14,14, - 14,16,15,15,13,13,16,14,14,13,13,16,15,15,13,13, - 15,15,15,13,13,16,14,14,14,14,17,15,15,13,13,16, - 14,14,13,13,16,15,15,13,13,16,15,15,13,13,16,14, - 14,13,13,17,15,15,12,12,16,14,14,12,12,16,14,15, - 12,12,16,15,15,13,13,16,14,14,13,13,17,15,15,12, - 12,16,14,14,12,12,16,15,15,12,12,14,14,14, 8, 8, - 14,14,14,17,17,14,15,15,18,18,14,14,14,18,17,14, - 14,14,18,18,14,15,15,18,20,15,16,15,19,18,15,15, - 15,19,18,15,15,16,19,18,15,15,15,18,18,14,15,15, - 18,18,15,16,16,18,19,15,15,15,18,18,15,15,15,19, - 20,15,15,15,18,18,15,15,15,18,18,15,16,16,19,19, - 15,14,15,19,19,15,15,15,19,20,14,14,15,18,18,15, - 15,15,19,19,15,16,16,19,19,15,15,14,18,19,15,15, - 15,20,20,15,15,14,18,18,13,12,12, 8, 8,13,14,14, - 18,18,14,14,14,18,18,14,14,14,18,20,14,14,14,18, - 18,14,15,15,19,18,15,14,14,18,19,15,15,15,18,19, - 15,14,14,18,19,15,15,15,18,18,14,15,14,18,19,15, - 14,14,21,19,15,15,15,19,18,14,14,14,19,18,14,15, - 15,19,18,15,15,15,20,19,15,14,14,20,18,14,15,15, - 18,19,14,14,14,19,18,14,15,15,18,19,15,15,15,18, - 19,15,14,14,19,19,15,15,15,19,19,14,14,14,19,20, - 14,15,15,18,19, -}; - -static const static_codebook _44p0_p3_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p0_p3_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p0_p3_1, - 0 -}; - -static const long _vq_quantlist__44p0_p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p0_p4_0[] = { - 2, 6, 6,14,14, 6, 8, 8,14,14, 7, 7, 7,14,14, 0, - 13,13,15,16, 0,13,13,15,15, 7, 8, 8,15,15, 9,10, - 10,16,16, 9, 8, 8,14,15, 0,13,13,17,17, 0,13,13, - 16,16, 8, 8, 8,15,15,12,11,11,16,16, 9, 8, 8,14, - 14, 0,13,13,17,17, 0,13,13,15,15, 0,14,14,16,16, - 0, 0, 0,18,19, 0,12,12,16,15, 0,16,16, 0,20, 0, - 14,14,16,16, 0,14,14,17,17, 0, 0, 0,19,19, 0,12, - 12,15,15, 0,18,17,21,21, 0,14,14,16,16, 5, 7, 7, - 12,13, 9,10, 9,14,14,11,10,10,14,14, 0, 0, 0,18, - 17, 0,20,21,18,18, 9,10,10,14,14,12,12,12,17,16, - 12,10,10,14,14, 0,20,20,18,17, 0,21,21,17,17,11, - 10,10,14,14,15,13,13,18,18,13,11,11,14,14, 0,20, - 0,18,18, 0,20,21,18,17, 0,21, 0,18,19, 0, 0, 0, - 0,21, 0,21,20,16,17, 0, 0, 0,21,21, 0, 0, 0,20, - 18, 0,20, 0,17,18, 0, 0, 0, 0, 0, 0, 0,20,16,17, - 0, 0, 0,20, 0, 0, 0, 0,18,18, 6, 6, 6,13,13, 8, - 5, 5,11,11, 9, 6, 6,13,13, 0, 9, 9,12,12, 0,10, - 10,14,14, 9, 7, 7,13,13,12, 9, 9,13,13,10, 6, 6, - 13,13, 0,10,10,14,14, 0,10,10,13,13, 9, 7, 7,13, - 13,13,10,10,13,13,11, 6, 6,13,13, 0,10,10,15,15, - 0,10,10,13,13, 0,12,11,15,15, 0,20,19,17,16, 0, - 9, 9,13,13, 0,13,13,20,19, 0,11,11,13,13, 0,11, - 11,15,15, 0,20,19,17,17, 0,10,10,13,13, 0,14,15, - 0,21, 0,12,12,13,13, 0,10,10,12,12, 0,11,11,15, - 15, 0,11,11,15,15, 0,15,15,20,20, 0,16,16, 0, 0, - 0,11,11,15,15, 0,14,14,17,17, 0,11,11,15,15, 0, - 15,15,20,21, 0,16,16,21,21, 0,12,12,15,15, 0,15, - 15,18,20, 0,11,11,16,15, 0,15,15,21,21, 0,16,16, - 0,21, 0,16,16, 0, 0, 0, 0, 0, 0, 0, 0,14,14,21, - 21, 0,17,18, 0, 0, 0,16,17,20, 0, 0,16,16, 0, 0, - 0, 0, 0, 0, 0, 0,15,15,20,20, 0,19,18, 0,21, 0, - 18,17, 0, 0, 0,10,10,11,11, 0,10,10,10,10, 0,11, - 11,12,12, 0,11,11, 9, 9, 0,13,13,12,12, 0,11,11, - 12,12, 0,13,13,12,12, 0,10,10,12,12, 0,12,12,13, - 13, 0,12,12,12,12, 0,11,11,12,12, 0,13,13,12,12, - 0,10,10,12,12, 0,13,13,13,13, 0,12,12,12,12, 0, - 14,13,13,13, 0,19,21,15,15, 0,12,11,12,12, 0,16, - 15,19,19, 0,13,13,11,11, 0,13,13,13,13, 0, 0,21, - 15,16, 0,12,12,12,12, 0,16,16,19,21, 0,13,13,12, - 12, 7, 7, 7,16,16,11, 9, 9,16,16,12, 9, 9,16,16, - 0,13,13,16,16, 0,14,14,17,16,11, 9, 9,16,16,14, - 12,11,17,17,13, 8, 9,15,15, 0,13,13,19,19, 0,13, - 13,16,15,12,10,10,17,17,15,12,12,19,18,14, 9, 9, - 17,16, 0,14,14,18, 0, 0,14,13,16,16, 0,14,15,18, - 17, 0,21, 0,19,21, 0,12,12,16,16, 0,16,16, 0, 0, - 0,14,14,16,16, 0,14,14,18,18, 0, 0,21,20, 0, 0, - 13,13,16,17, 0,18,18, 0, 0, 0,15,14,17,16, 8, 7, - 7,14,14,11,10,10,15,15,13,10,10,15,15, 0,21,20, - 19,19, 0,21, 0,17,18,11,10,10,15,16,14,12,12,18, - 18,14,11,11,15,14, 0,21,20,18,19, 0, 0,21,18,18, - 12,11,11,16,16,16,14,14,18,20,14,11,11,16,15, 0, - 20,20,19,19, 0, 0,20,18,18, 0,21, 0,18,19, 0, 0, - 0, 0, 0, 0,20,20,17,18, 0, 0, 0,20,20, 0, 0, 0, - 19,19, 0, 0, 0,20,18, 0, 0, 0, 0, 0, 0, 0,21,18, - 18, 0,21,21, 0,21, 0, 0, 0,19,20,11, 9, 9,14,14, - 13,10,10,14,14,13,11,11,15,15, 0,13,13,13,13, 0, - 14,14,16,16,13,11,11,15,15,16,12,12,15,15,14,10, - 10,14,14, 0,14,14,16,16, 0,14,14,15,15,13,10,10, - 15,15,17,13,14,15,16,15,10,10,15,15, 0,14,14,17, - 16, 0,14,14,15,15, 0,15,15,17,17, 0, 0,21,18,18, - 0,13,13,15,15, 0,16,16,21,20, 0,14,14,15,14, 0, - 15,14,16,17, 0, 0,20,20,19, 0,13,13,15,15, 0,19, - 18, 0, 0, 0,15,15,15,15, 0,11,11,14,14, 0,12,12, - 16,16, 0,12,12,16,16, 0,15,16,21,21, 0,16,17,21, - 0, 0,12,12,17,16, 0,14,14,18,19, 0,11,11,16,16, - 0,15,15,20,21, 0,16,16,21, 0, 0,12,12,17,16, 0, - 15,15,19,19, 0,12,12,16,17, 0,16,15, 0, 0, 0,16, - 16, 0, 0, 0,17,17, 0,21, 0, 0, 0, 0, 0, 0,14,15, - 20, 0, 0,17,17, 0, 0, 0,17,17, 0, 0, 0,17,16, 0, - 0, 0, 0, 0, 0, 0, 0,15,15, 0, 0, 0,18,18, 0, 0, - 0,18,17, 0, 0, 0,11,11,14,14, 0,12,12,15,15, 0, - 12,12,15,15, 0,13,13,14,14, 0,14,14,17,17, 0,12, - 12,16,16, 0,14,14,16,16, 0,11,11,15,15, 0,13,13, - 16,17, 0,13,13,16,16, 0,12,12,15,15, 0,14,14,17, - 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,16,16, - 0,15,15,17,18, 0,21,20,20,21, 0,12,12,15,15, 0, - 16,16,20,21, 0,14,14,15,15, 0,14,14,17,17, 0, 0, - 0,18,19, 0,12,13,15,15, 0,18,17,21, 0, 0,14,15, - 15,15, 8, 8, 8,16,16,12,10,10,16,16,13, 9, 9,16, - 16, 0,14,14,18,17, 0,14,14,16,17,12,10,10,18,17, - 14,12,11,18,18,14, 9, 9,16,16, 0,13,13,18,18, 0, - 13,13,17,16,12, 9, 9,16,17,17,13,13,17,17,14, 9, - 9,15,15, 0,14,14,20,19, 0,13,13,16,16, 0,15,15, - 19,18, 0, 0, 0,20,19, 0,12,13,17,17, 0,16,16,20, - 0, 0,14,14,16,17, 0,14,14,19,18, 0, 0, 0,20,20, - 0,13,13,16,16, 0,18,17, 0, 0, 0,15,15,16,16, 9, - 7, 7,14,14,12,10,10,15,15,13,10,10,15,15, 0,21, - 0,18,19, 0,20,21,19,18,12,10,10,16,15,15,13,13, - 18,18,14,11,11,15,15, 0, 0, 0,19,18, 0, 0,21,18, - 18,13,11,11,15,15,16,14,14,17,19,15,11,11,15,15, - 0,21,21,20,18, 0, 0,21,18,18, 0, 0,21,21,19, 0, - 0, 0, 0, 0, 0,19,20,18,17, 0, 0, 0,21,21, 0,21, - 0,20,18, 0, 0,21,19,19, 0, 0, 0, 0, 0, 0,20,21, - 17,17, 0, 0, 0, 0, 0, 0,21, 0,18,20, 0,10,10,14, - 14, 0,11,11,15,15, 0,11,11,15,15, 0,14,14,15,15, - 0,15,15,16,16, 0,11,12,16,16, 0,13,13,16,16, 0, - 11,11,15,15, 0,14,14,17,17, 0,14,14,15,15, 0,11, - 11,16,15, 0,14,14,15,15, 0,11,11,15,15, 0,15,15, - 17,17, 0,14,14,15,15, 0,16,16,18,18, 0, 0, 0,20, - 19, 0,14,13,16,15, 0,17,17,21, 0, 0,15,15,15,15, - 0,16,15,17,16, 0,20, 0,20,18, 0,13,14,15,15, 0, - 19,18, 0,21, 0,15,15,15,15, 0,11,11,14,14, 0,12, - 12,16,16, 0,12,12,16,16, 0,16,15,20,21, 0,17,16, - 0, 0, 0,12,12,16,16, 0,14,14,18,18, 0,11,11,16, - 16, 0,15,15,21,20, 0,16,16, 0, 0, 0,12,12,16,17, - 0,15,14,19,19, 0,11,12,16,16, 0,15,15,21, 0, 0, - 16,16, 0, 0, 0,16,17, 0, 0, 0, 0, 0, 0, 0, 0,15, - 15,21, 0, 0,17,17, 0, 0, 0,17,17, 0, 0, 0,17,16, - 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0,20, 0,19,20, 0, - 0, 0,17,17, 0, 0, 0,12,12,15,15, 0,12,12,15,15, - 0,12,12,16,16, 0,13,13,15,15, 0,15,15,17,17, 0, - 13,13,17,16, 0,14,14,17,17, 0,11,11,16,16, 0,14, - 14,17,17, 0,13,13,16,16, 0,12,12,16,16, 0,15,15, - 16,17, 0,11,11,15,16, 0,14,14,17,17, 0,13,14,16, - 16, 0,15,15,18,18, 0,21,20,20,19, 0,13,13,16,17, - 0,16,16, 0, 0, 0,14,14,16,16, 0,15,15,18,18, 0, - 0, 0,20,19, 0,13,13,16,16, 0,17,17, 0, 0, 0,14, - 14,16,16, 0,11,11,16,16, 0,13,13,18,17, 0,13,13, - 17,17, 0,16,16,17,17, 0,16,16,17,18, 0,12,12,17, - 17, 0,15,15,18,18, 0,12,12,16,16, 0,16,16,19,19, - 0,15,15,16,17, 0,12,12,17,17, 0,17,17,18,18, 0, - 12,12,17,17, 0,16,16,19,19, 0,15,16,17,17, 0,16, - 16,18,17, 0, 0, 0,21,21, 0,13,13,16,16, 0,17,17, - 0,20, 0,15,15,16,17, 0,16,16,19,18, 0, 0,21,20, - 21, 0,14,14,17,16, 0,20, 0, 0, 0, 0,15,16,16,17, - 0, 9, 9,14,14, 0,13,13,16,16, 0,14,14,15,15, 0, - 0,20,19,19, 0, 0, 0,19,19, 0,12,12,15,15, 0,15, - 16,19,18, 0,14,14,15,15, 0,21, 0,18,18, 0,20, 0, - 17,18, 0,13,13,16,16, 0,17,17,17,19, 0,14,14,16, - 15, 0,21,20,20,19, 0, 0, 0,19,19, 0, 0, 0,19,18, - 0, 0, 0, 0, 0, 0,20,20,17,18, 0, 0, 0,21,21, 0, - 0, 0,18,18, 0,21, 0,18,19, 0, 0, 0, 0, 0, 0,20, - 21,18,18, 0, 0, 0,20,21, 0, 0, 0,19,19, 0,18,18, - 15,15, 0,20,21,17,17, 0,19,21,17,17, 0, 0, 0,17, - 18, 0, 0, 0,20,19, 0,19,19,17,17, 0, 0, 0,18,18, - 0,19,20,16,17, 0, 0,21,20,20, 0,19,20,19,18, 0, - 19,20,16,16, 0, 0, 0,18,19, 0,19,20,17,17, 0, 0, - 21, 0,20, 0,21,21,17,19, 0,20, 0,19,20, 0, 0, 0, - 20, 0, 0,19,18,17,16, 0, 0, 0, 0, 0, 0, 0,20,17, - 17, 0,20,21,18,20, 0, 0, 0, 0,21, 0,19,20,17,17, - 0, 0, 0, 0, 0, 0,20,21,17,17, 0,11,11,14,14, 0, - 13,13,16,17, 0,13,13,16,16, 0,17,17, 0,21, 0,18, - 17,21, 0, 0,13,13,16,16, 0,15,15,18,18, 0,12,12, - 16,16, 0,17,16,21, 0, 0,17,17, 0, 0, 0,12,12,17, - 17, 0,17,17,19,21, 0,13,12,16,16, 0,17,17, 0, 0, - 0,17,17, 0, 0, 0,18,17, 0,21, 0, 0, 0, 0, 0, 0, - 15,15,20, 0, 0,20,18, 0, 0, 0,17,18, 0, 0, 0,16, - 17, 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0, 0, 0,19,19, - 0, 0, 0,18,18, 0, 0, 0,14,14,18,18, 0,16,16, 0, - 21, 0,16,16,21,21, 0,17,17, 0,20, 0,17,17,20, 0, - 0,16,15, 0, 0, 0,20,20, 0, 0, 0,15,15,20,20, 0, - 17,17,21, 0, 0,17,18,20,20, 0,15,15,20,20, 0,18, - 18, 0, 0, 0,15,15,19,20, 0,17,18, 0, 0, 0,17,17, - 20,20, 0,18,17,21, 0, 0, 0, 0, 0,21, 0,15,15,20, - 20, 0,19,19, 0, 0, 0,17,17,21, 0, 0,17,17, 0, 0, - 0, 0, 0,21, 0, 0,15,15,19,19, 0,20,21, 0, 0, 0, - 18,17,21,21, 0,12,12,16,16, 0,14,14,17,17, 0,13, - 13,17,18, 0,16,16,18,17, 0,16,16,18,18, 0,13,13, - 18,18, 0,15,16,19,18, 0,13,13,16,16, 0,16,16,20, - 18, 0,16,16,17,17, 0,12,13,17,17, 0,17,16,18,18, - 0,12,12,16,16, 0,17,16,20,19, 0,16,16,16,16, 0, - 16,17,18,20, 0, 0, 0,21,20, 0,14,14,17,16, 0,19, - 18, 0,20, 0,16,16,17,16, 0,16,16,17,18, 0, 0,21, - 21,21, 0,14,14,16,16, 0,20,20,21, 0, 0,16,16,16, - 16, 0,10,10,14,14, 0,14,14,15,16, 0,14,14,15,15, - 0, 0,21,18,18, 0, 0,21,18,19, 0,13,13,16,16, 0, - 16,16,18,18, 0,14,14,15,15, 0,21, 0,18,18, 0,21, - 0,18,18, 0,13,13,16,16, 0,17,17,19,20, 0,14,14, - 15,15, 0, 0, 0,18,20, 0, 0,21,18,18, 0, 0,21,19, - 18, 0, 0, 0, 0, 0, 0,20,21,18,17, 0, 0, 0,21,21, - 0, 0, 0,19,19, 0,21, 0,18,19, 0, 0, 0, 0, 0, 0, - 21,20,17,17, 0, 0,21,20, 0, 0, 0, 0,19,19, 0,19, - 20,15,16, 0, 0,20,18,17, 0,20,21,17,18, 0,21, 0, - 18,18, 0, 0, 0,19,19, 0,20,20,17,18, 0, 0, 0,18, - 19, 0,20,20,18,17, 0, 0, 0, 0,20, 0, 0,21,17,18, - 0,20,21,17,17, 0, 0, 0,18,18, 0,19,19,17,17, 0, - 0, 0,21,21, 0,20,20,17,17, 0, 0, 0,21,19, 0, 0, - 0,20,19, 0,21,20,17,18, 0, 0, 0, 0, 0, 0, 0,20, - 18,17, 0,21,20,18,18, 0, 0, 0,20,21, 0,20,20,17, - 17, 0, 0, 0, 0, 0, 0,20, 0,17,17, 0,11,11,13,14, - 0,13,13,16,16, 0,13,13,16,16, 0,17,17, 0, 0, 0, - 17,18, 0, 0, 0,13,13,16,16, 0,15,16,18,18, 0,13, - 13,16,17, 0,16,17,20, 0, 0,17,18,20, 0, 0,13,13, - 17,17, 0,16,16,20,21, 0,13,13,16,16, 0,17,17,21, - 0, 0,17,18, 0, 0, 0,17,18, 0,21, 0, 0, 0, 0, 0, - 0,15,15,20, 0, 0,19,19, 0, 0, 0,17,17, 0, 0, 0, - 18,17,21,20, 0, 0, 0, 0, 0, 0,16,16,20,21, 0,21, - 20, 0,21, 0,19,21, 0, 0, 0,15,15, 0, 0, 0,16,17, - 0,19, 0,16,16, 0, 0, 0,17,17, 0, 0, 0,19,18, 0, - 0, 0,16,16,20,20, 0,20,18,21, 0, 0,15,15,21,21, - 0,18,18, 0, 0, 0,18,19, 0, 0, 0,16,15, 0,21, 0, - 20,19, 0, 0, 0,16,16, 0, 0, 0,20,18, 0,21, 0,17, - 18,21, 0, 0,18,19, 0, 0, 0, 0, 0, 0, 0, 0,16,16, - 20,20, 0,19,20, 0, 0, 0,17,17, 0, 0, 0,18,17,20, - 21, 0, 0, 0, 0, 0, 0,16,16, 0,20, 0,20,22, 0, 0, - 0,18,18, 0,22, -}; - -static const static_codebook _44p0_p4_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p0_p4_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p0_p4_0, - 0 -}; - -static const long _vq_quantlist__44p0_p4_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44p0_p4_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p0_p4_1 = { - 1, 7, - (long *)_vq_lengthlist__44p0_p4_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p0_p4_1, - 0 -}; - -static const long _vq_quantlist__44p0_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p0_p5_0[] = { - 1, 6, 6, 6, 8, 8, 7, 8, 8, 7, 9, 8,10,11,11, 9, - 8, 8, 7, 8, 8,11,11,11, 9, 8, 8, 6, 7, 7,10,10, - 10,10,10,10,10,10,10,14,13,13,12,11,11,10,10,10, - 14,14,13,13,11,11, 6, 6, 6, 8, 5, 5, 8, 7, 7, 8, - 7, 7,11, 9, 9, 9, 7, 7, 8, 7, 7,12,10,10,10, 7, - 7, 7, 8, 8,12,11,11,12,10,10,11,10,10,14,13,13, - 13,10,10,11,10,11,16,14,14,13,10,10, 7, 8, 7,12, - 12,12,12,11,11,12,11,11,16,14,15,13,12,12,11,11, - 11,17,15,14,14,13,13,10, 9, 9,13,11,11,13,11,11, - 12,11,11,16,14,13,14,11,11,12,11,11,16,15,14,14, - 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,16,14, - 13,13,11,11,12,10,10,16,14,14,13,10,10, 8, 8, 8, - 12,12,12,12,11,11,12,11,11,16,14,15,14,12,12,12, - 11,11,16,15,15,14,12,12,10,10,10,13,11,11,13,11, - 11,12,12,12,16,14,14,14,11,11,12,11,11,17,14,15, - 14,11,11, -}; - -static const static_codebook _44p0_p5_0 = { - 5, 243, - (long *)_vq_lengthlist__44p0_p5_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p0_p5_0, - 0 -}; - -static const long _vq_quantlist__44p0_p5_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p0_p5_1[] = { - 2, 7, 7, 7, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 9, 8, - 7, 7, 8, 8, 8, 9, 9, 9, 9, 7, 7, 6, 6, 6, 9, 7, - 7, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, - 10, 8, 8,10, 8, 8, 7, 6, 6, 9, 6, 6, 9, 6, 6, 9, - 7, 7,10, 8, 8, 9, 6, 6, 9, 7, 7,10, 8, 8, 9, 7, - 7, 7, 8, 8,11, 9, 9,11, 9, 9,11, 9, 9,12, 9, 9, - 12, 8, 8,12, 9, 9,12,10, 9,12, 8, 8, 8, 7, 7,10, - 9, 9,11, 9, 9,11, 9, 9,11,11,10,11, 9, 9,11,10, - 9,11,10,11,11, 9, 9,10, 8, 8,11, 9, 9,11, 9, 9, - 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, - 9, 9, 9, 8, 8,12, 9, 9,12, 9, 9,11, 9, 9,12, 9, - 9,12, 8, 8,12, 9, 9,12, 9, 9,12, 8, 8, 9, 7, 7, - 11, 9,10,11,10, 9,11, 9, 9,11,11,11,11, 9, 9,11, - 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11,10, - 10,11,10, 9,11,10,10,11, 9, 9,11,10,10,11,10,11, - 11, 9, 9, -}; - -static const static_codebook _44p0_p5_1 = { - 5, 243, - (long *)_vq_lengthlist__44p0_p5_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p0_p5_1, - 0 -}; - -static const long _vq_quantlist__44p0_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p0_p6_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p0_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44p0_p6_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p0_p6_0, - 0 -}; - -static const long _vq_quantlist__44p0_p6_1[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p0_p6_1[] = { - 1, 3, 2, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11,12,12,12,14,14,14,15,15, -}; - -static const static_codebook _44p0_p6_1 = { - 1, 25, - (long *)_vq_lengthlist__44p0_p6_1, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p0_p6_1, - 0 -}; - -static const long _vq_quantlist__44p0_p6_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p0_p6_2[] = { - 3, 4, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p0_p6_2 = { - 1, 25, - (long *)_vq_lengthlist__44p0_p6_2, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p0_p6_2, - 0 -}; - -static const long _huff_lengthlist__44p0_short[] = { - 3, 3, 7, 8,10,13,16, 3, 2, 5, 7, 9,13,16, 6, 4, - 4, 6,10,14,15, 7, 5, 5, 7,10,13,14, 9, 8, 9, 9, - 9,11,13,12,11,12, 9, 7, 8,11,14,12,10, 6, 5, 7, - 10, -}; - -static const static_codebook _huff_book__44p0_short = { - 2, 49, - (long *)_huff_lengthlist__44p0_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p1_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44p1_l0_0[] = { - 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 4, 6, 5, - 8, 6, 9, 8,10, 9,10,10,11,10, 5, 5, 6, 6, 8, 8, - 9, 9,10,10,10,10,11, 7, 8, 8, 9, 8,10, 9,10, 9, - 11,10,11,10, 7, 8, 8, 8,10, 9,10,10,10,10,11,10, - 11, 9,10,10,11,11,11,11,12,11,12,11,12,11, 9,10, - 10,11,11,11,11,11,11,11,12,11,12,11,11,11,12,12, - 12,12,12,12,12,12,12,11,11,12,11,12,12,12,12,12, - 12,12,12,11,12,12,12,12,12,13,12,13,12,12,12,12, - 12,12,12,12,12,13,13,13,13,12,13,12,12,12,12,12, - 13,13,12,13,12,13,12,13,12,12,12,12,13,13,13,13, - 13,13,12,12,12,12,12,11,12, -}; - -static const static_codebook _44p1_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44p1_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p1_l0_0, - 0 -}; - -static const long _vq_quantlist__44p1_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p1_l0_1[] = { - 1, 4, 4, 6, 6, 5, 5, 5, 6, 6, 5, 6, 5, 6, 6, 6, - 6, 7, 7, 7, 6, 7, 6, 7, 7, -}; - -static const static_codebook _44p1_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44p1_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p1_l0_1, - 0 -}; - -static const long _vq_quantlist__44p1_l1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p1_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p1_l1_0 = { - 2, 9, - (long *)_vq_lengthlist__44p1_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p1_l1_0, - 0 -}; - -static const long _huff_lengthlist__44p1_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p1_lfe = { - 2, 4, - (long *)_huff_lengthlist__44p1_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44p1_long[] = { - 3, 3, 7, 7, 9,13,16, 3, 2, 4, 6,10,13,17, 7, 4, - 4, 6, 9,12,14, 7, 6, 6, 5, 7, 9,12,10,10, 9, 6, - 6, 9,12,14,14,13, 9, 8,10,11,18,18,15,13,11,10, - 11, -}; - -static const static_codebook _huff_book__44p1_long = { - 2, 49, - (long *)_huff_lengthlist__44p1_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p1_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p1_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p1_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44p1_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p1_p1_0, - 0 -}; - -static const long _vq_quantlist__44p1_p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p1_p2_0[] = { - 1, 4, 4, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0,12,12, 0, - 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 0, 6, 6, 0,11, - 11, 0,11,11, 0,12,12, 0,14,14, 0,11,11, 0,12,12, - 0,14,14, 0,11,11, 0, 6, 6, 0, 6, 5, 0, 7, 6, 0, - 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,10,10, 0, 7, - 7, 0, 7, 7, 0,10,10, 0,11,11, 0,11,11, 0,14,14, - 0,10,10, 0,12,12, 0,14,14, 0,12,12, 0, 6, 6, 0, - 11,11, 0,11,11, 0,12,12, 0,14,14, 0,11,11, 0,12, - 12, 0,15,15, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 0,11,11, 0,11,11, 0,12,12, 0,15, - 15, 0,12,12, 0,11,11, 0,15,15, 0,11,11, 0, 6, 6, - 0,11,11, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0, - 12,12, 0,14,14, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p1_p2_0 = { - 5, 243, - (long *)_vq_lengthlist__44p1_p2_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p1_p2_0, - 0 -}; - -static const long _vq_quantlist__44p1_p2_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p1_p2_1[] = { - 1, 3, 3, 0, 8, 8, 0, 8, 8, 0,10,10, 0, 9, 9, 0, - 10,10, 0,10,10, 0, 9, 9, 0,10,10, 0, 7, 7, 0, 7, - 7, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 9, 9, - 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, - 10,10, 0, 9, 9, 0, 9, 9, 0,10,10, 0, 9, 9, 0,10, - 10, 0, 8, 8, 0,11,11, 0,11,11, 0,12,12, 0,11,11, - 0,12,12, 0,12,12, 0,12,12, 0,12,12, 0, 8, 8, 0, - 11,11, 0,11,11, 0,13,12, 0,12,12, 0,13,12, 0,13, - 13, 0,12,12, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 0,11,11, 0,11,11, 0,13,12, 0,12, - 12, 0,12,12, 0,12,12, 0,11,11, 0,12,12, 0, 8, 8, - 0,12,12, 0,12,12, 0,13,13, 0,12,12, 0,13,13, 0, - 13,13, 0,12,13, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p1_p2_1 = { - 5, 243, - (long *)_vq_lengthlist__44p1_p2_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p1_p2_1, - 0 -}; - -static const long _vq_quantlist__44p1_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p1_p3_0[] = { - 1, 6, 6, 6, 7, 7, 7, 8, 8, 7, 8, 8,10,11,11, 9, - 8, 8, 7, 9, 9,11,12,12, 9, 8, 8, 6, 7, 7, 9,11, - 11,10,11,11,10,11,11,13,13,13,11,12,12,10,11,11, - 13,14,14,12,12,12, 6, 6, 6, 8, 6, 6, 8, 6, 6, 9, - 7, 7,12,10,10,10, 6, 6, 9, 7, 7,12,10,10,11, 7, - 6, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, - 13,10,10,12,11,11,15,13,13,14,11,11, 8, 7, 7,12, - 11,11,12,11,11,11,11,11,14,14,14,13,12,12,12,11, - 11,16,15,15,14,12,12, 0,10,10, 0,11,11, 0,12,12, - 0,11,11, 0,14,14, 0,11,11, 0,11,11, 0,15,15, 0, - 11,11, 7, 8, 8,13,10,10,12,10,10,12,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, - 12,11,11,13,11,11,12,11,11,15,14,14,14,12,12,13, - 12,12,15,14,14,15,12,12, 0,11,11, 0,12,12, 0,12, - 12, 0,12,12, 0,15,15, 0,12,12, 0,12,12, 0,15,14, - 0,12,12, -}; - -static const static_codebook _44p1_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44p1_p3_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p1_p3_0, - 0 -}; - -static const long _vq_quantlist__44p1_p3_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p1_p3_1[] = { - 2, 3, 4, 7, 7,10,12,12,12,12,10,11,11,13,13,11, - 12,12,11,11,12,12,12,12,12,11,13,13,13,13,12,12, - 12,13,14,12,13,13,13,13,12,13,13,13,13,12,13,13, - 13,13,11,13,13,13,13,12,12,12,14,14,12,13,13,12, - 12,12,12,13,13,13,12,13,13,13,13,12,13,13,13,13, - 12,12,12,14,14,12,13,13,12,12,12,13,13,13,13,12, - 13,13,12,12,12,13,13,13,13,12,12,12,14,14,12,13, - 13,12,12,12,13,13,13,13,12,13,13,12,12,10,10,11, - 10,10,11,11,11,11,11,11, 9, 9,10,10,12,11,11,10, - 10,12,10,10,10,10,13,12,12,12,12,13,11,11,11,11, - 13,12,12,12,12,13,11,11,11,11,13,12,12,12,12,13, - 12,12,12,12,13,11,11,11,11,13,12,12,12,12,13,11, - 11,11,11,13,12,12,11,11,13,12,12,11,11,13,11,11, - 11,11,13,12,12,11,11,13,11,11,11,11,13,12,12,11, - 11,13,12,12,11,11,13,11,11,11,11,13,12,12,11,11, - 13,11,11,11,11,13,12,12,11,11,11,11,11,10,10,11, - 11,11, 9, 9,11,12,12,11,11,12,12,12, 9, 9,13,13, - 13,10,10,13,13,13,11,11,13,13,13,14,14,13,13,13, - 11,10,13,13,14,12,12,13,13,13,11,11,13,13,13,11, - 11,13,13,13,14,14,13,13,13,10,10,13,13,13,11,11, - 13,13,13,10,10,13,14,13,11,11,13,14,14,14,14,13, - 13,13,10,10,13,14,14,11,11,13,13,13,10,10,13,14, - 14,11,11,13,13,13,14,14,14,13,13,10,10,13,14,14, - 11,11,13,13,13,10,10,14,12,12, 9, 9,14,12,12, 9, - 9,14,11,11, 9, 9,14,12,12, 8, 8,14,11,11, 7, 7, - 15,13,13,10,10,15,12,12,10,10,15,13,13,10,10,15, - 12,12,10,10,15,13,13,10,10,15,13,13,10,10,15,12, - 12,10,10,15,13,13,10,10,15,12,12,10,10,15,13,13, - 10,10,15,13,13,10,10,15,12,12,10,10,15,13,13, 9, - 9,15,12,12, 9, 9,14,13,13, 9, 9,15,13,13,10,10, - 15,12,12,10,10,15,13,13, 9, 9,15,12,12, 9, 9,15, - 13,13, 9, 9,13,12,12, 9, 9,13,13,13, 8, 8,13,13, - 13, 9, 9,13,13,13, 7, 7,14,13,13, 8, 8,14,14,14, - 10,10,15,14,14,11,11,14,14,14, 9, 9,15,14,14,10, - 10,15,14,14, 9, 9,14,14,14,10,10,15,14,14,11,11, - 15,14,14, 9, 9,14,14,14,10,10,14,14,14, 9, 9,15, - 14,15,10,10,15,14,14,11,11,14,14,14, 9, 9,14,14, - 14, 9, 9,14,14,14, 8, 8,15,14,14,10,10,15,14,14, - 11,11,14,14,14, 9, 9,15,14,14, 9, 9,14,14,14, 8, - 8,12,12,12,13,13,16,16,16,11,11,17,16,16,12,12, - 17,16,16,11,11,17,16,16,11,11,17,17,16,13,13,17, - 16,16,13,13,18,17,16,12,12,17,16,16,13,13,17,16, - 17,12,12,18,17,17,13,13,17,16,16,14,14,18,17,17, - 12,12,18,16,16,13,13,17,17,17,13,12,17,17,17,13, - 13,17,16,16,13,13,18,17,17,12,12,17,16,16,13,12, - 17,17,17,12,12,18,17,17,13,13,18,16,16,14,14,18, - 17,17,12,12,17,17,17,13,13,18,17,18,12,12,13,14, - 14,10,10,16,14,14,13,13,17,15,15,14,14,17,14,14, - 12,13,16,14,14,13,13,17,15,15,14,14,16,16,16,15, - 15,17,15,15,14,14,17,16,16,14,15,17,15,15,14,14, - 17,15,16,14,14,17,16,16,15,15,17,15,15,13,13,17, - 15,15,14,14,18,15,15,13,14,17,15,15,14,14,16,16, - 16,15,15,17,15,15,13,13,17,15,15,14,14,17,15,15, - 13,13,17,15,15,14,14,16,16,16,15,15,17,15,15,13, - 13,17,15,15,14,14,18,15,15,13,13,13,11,11,10,10, - 16,14,14,13,12,16,14,14,13,13,16,15,14,12,12,16, - 14,14,12,12,16,15,15,14,14,16,14,14,14,14,17,15, - 15,13,13,16,15,15,14,14,17,15,15,13,14,17,15,15, - 14,14,17,15,14,14,14,17,15,15,13,13,17,15,15,14, - 14,17,15,15,13,13,17,15,15,14,14,17,14,14,14,14, - 17,15,15,13,13,17,15,15,13,13,17,15,15,13,13,17, - 15,15,14,14,17,15,15,14,14,17,15,15,13,13,17,15, - 15,13,13,17,15,15,13,13,14,14,15, 8, 8,14,14,14, - 19,19,14,15,15,18,19,14,14,14,19,18,14,14,14,19, - 19,15,15,15,19,18,15,16,16,19,19,15,15,15,19,19, - 15,16,16,20,19,15,15,15,19,19,15,15,15,19,19,16, - 16,16,20,19,15,15,15,19,18,15,16,16,20,19,15,15, - 15,18,18,15,15,15,19,20,15,16,16,19,19,15,15,15, - 20,19,15,15,15,20,19,15,15,15,19,18,15,15,15,19, - 19,15,16,16,19,20,15,15,15,19,19,15,15,15,19,20, - 15,15,15,19,19,14,12,12, 9, 9,14,14,14,19,19,14, - 14,14,19,19,14,14,15,20,19,15,14,14,18,19,15,15, - 15,19,19,15,15,14,20,19,15,15,15,20,19,15,15,14, - 20,19,15,15,15,20,19,15,15,15,19,20,15,14,14,19, - 20,15,15,15,20,20,15,14,14,20,19,15,15,15,19,19, - 15,15,15,19,19,15,14,14,19,19,15,15,15,19,20,15, - 15,15,20,20,15,15,15,19,19,15,15,15,20,19,16,14, - 14,19,19,15,15,15,20,19,15,14,15,20,19,14,15,15, - 20,19,12,12,12,13,13,16,16,16,11,11,16,16,16,12, - 12,17,16,16,11,11,17,15,16,11,11,17,17,17,13,13, - 18,16,17,13,13,18,17,17,13,12,17,16,17,13,13,17, - 17,17,13,13,16,16,16,12,12,17,16,16,13,13,17,16, - 16,12,12,17,16,16,12,13,17,17,17,12,12,17,17,17, - 13,13,18,16,16,13,13,18,17,17,12,12,18,17,17,12, - 12,17,17,17,12,12,17,17,17,12,12,17,16,16,13,13, - 17,17,17,12,12,17,16,16,12,12,17,17,17,12,12,13, - 14,14, 9, 9,16,14,14,13,13,16,15,15,14,14,17,14, - 14,13,13,16,14,14,13,13,17,15,15,15,15,16,16,16, - 15,15,17,15,15,14,14,17,15,15,15,15,17,15,15,14, - 14,17,15,15,14,14,16,16,16,15,15,17,15,15,14,14, - 17,15,15,14,14,17,15,15,14,14,17,15,15,14,14,16, - 16,16,15,15,18,15,15,14,13,17,15,15,14,14,17,15, - 15,13,13,17,15,15,14,14,16,16,16,15,15,17,15,15, - 14,13,17,15,15,14,14,17,15,15,13,13,13,11,11,11, - 11,16,14,14,12,12,16,14,14,13,13,16,15,14,12,12, - 17,14,14,12,12,17,15,15,13,13,17,14,14,14,14,17, - 15,15,13,13,17,14,15,14,13,17,15,15,13,13,16,15, - 15,13,13,16,14,14,14,14,17,15,15,13,13,16,14,14, - 13,13,16,15,15,13,13,17,15,15,13,13,17,14,14,14, - 14,17,15,15,12,12,17,15,15,13,13,17,15,15,12,12, - 16,15,15,13,13,17,14,14,13,14,17,15,15,12,12,17, - 14,14,13,13,17,15,15,12,12,14,14,14, 8, 8,14,14, - 14,18,18,14,15,15,19,19,14,14,14,19,19,14,15,14, - 18,19,15,15,15,18,19,15,16,16,20,20,15,15,15,19, - 20,15,16,16,19,20,15,15,15,19,20,15,15,16,19,19, - 15,16,16,20,20,15,15,15,20,19,15,16,16,20,19,15, - 15,15,19,20,15,15,15,19,19,15,16,16,20,19,15,15, - 15,19,19,15,16,15,20,19,15,15,15,19,19,15,15,15, - 19,20,15,16,16,20,20,15,15,15,19,19,15,15,15,20, - 20,15,15,15,19,19,14,12,12, 9, 9,14,14,14,18,18, - 14,14,14,19,20,14,14,14,18,18,14,14,14,18,19,15, - 15,15,19,20,15,14,14,19,19,15,15,15,19,19,15,14, - 15,19,19,15,15,15,18,20,15,15,15,19,19,15,14,14, - 19,19,15,15,15,20,19,15,15,14,20,20,15,15,15,19, - 19,15,15,15,19,19,15,14,14,19,19,15,15,15,19,19, - 15,14,14,19,20,14,15,15,19,19,15,15,15,19,19,15, - 14,14,20,19,15,15,15,19,19,15,14,14,20,19,15,15, - 15,19,19,13,12,12,13,13,17,17,16,11,11,16,16,16, - 12,12,17,17,16,11,11,17,16,16,11,11,17,17,17,13, - 13,17,16,16,13,13,18,17,17,12,12,17,16,16,13,13, - 18,17,17,12,12,18,17,17,13,13,18,16,17,13,13,17, - 17,17,12,12,18,17,17,13,13,18,17,17,12,12,17,16, - 17,12,12,17,16,16,13,13,17,16,16,11,11,17,16,16, - 12,12,17,17,17,11,11,17,17,17,12,12,18,16,16,13, - 13,18,17,17,12,11,17,16,16,12,12,18,17,17,11,11, - 13,14,14, 9, 9,16,14,14,13,13,16,15,15,14,14,17, - 14,14,12,12,16,14,14,13,13,17,15,15,14,14,17,16, - 16,15,16,18,15,15,14,14,17,15,15,14,14,17,15,15, - 14,14,18,15,15,14,14,16,16,16,15,16,18,15,15,14, - 14,17,16,15,14,14,18,15,15,14,14,17,15,15,14,14, - 17,16,16,15,15,18,14,15,13,13,17,15,15,14,14,18, - 15,15,13,13,17,15,15,14,14,17,16,15,15,15,17,15, - 15,13,13,17,15,15,14,14,18,15,15,13,13,13,11,11, - 10,10,16,14,14,12,12,16,14,14,12,12,17,14,15,11, - 11,17,14,14,11,11,17,15,15,13,13,17,14,14,14,13, - 17,15,15,13,13,16,15,15,13,13,17,15,15,13,13,17, - 15,15,13,13,17,14,14,14,14,17,15,15,13,13,17,14, - 15,13,13,16,15,15,13,13,17,15,15,13,13,17,14,14, - 13,13,17,15,15,12,12,16,14,14,12,12,17,15,15,12, - 12,17,15,15,13,13,17,14,14,13,13,17,15,15,12,12, - 17,14,14,12,12,17,15,15,12,12,13,15,14, 8, 8,14, - 14,14,19,19,14,15,15,18,19,14,14,14,18,19,14,15, - 14,19,19,15,16,15,19,19,15,16,16,19,20,15,15,15, - 19,19,15,16,16,19,19,15,16,16,19,19,15,15,15,19, - 19,15,16,16,20,20,15,15,15,19,19,15,15,15,19,19, - 15,15,15,19,19,15,15,15,19,19,15,16,16,20,19,15, - 15,15,19,19,15,15,15,19,19,15,15,15,19,19,15,16, - 15,19,19,15,16,16,21,19,15,15,15,20,20,15,15,15, - 20,21,15,15,15,19,20,14,12,12, 8, 8,14,14,14,19, - 19,14,13,13,19,19,14,14,14,19,19,14,13,14,19,19, - 15,15,15,20,20,15,14,14,20,19,15,15,15,19,20,15, - 14,14,19,20,15,15,15,20,19,15,15,15,19,20,15,14, - 14,20,20,15,15,15,20,19,15,14,14,19,19,15,15,15, - 19,19,15,15,15,20,19,15,14,14,21,19,15,15,15,20, - 21,15,14,14,21,19,15,15,15,19,19,15,15,15,20,20, - 15,14,14,19,21,15,15,15,19,19,15,14,14,19,20,15, - 15,15,19,19,13,12,12,13,13,17,16,16,11,11,17,16, - 15,12,12,18,16,16,11,11,17,16,16,11,11,18,17,17, - 13,13,18,16,16,13,13,17,17,17,12,13,18,17,16,13, - 13,18,17,17,13,13,17,17,17,13,13,17,16,16,13,13, - 18,16,17,12,12,17,16,16,13,12,17,17,17,12,12,18, - 17,17,13,12,18,16,16,13,13,18,17,17,12,12,17,16, - 16,12,12,17,17,17,11,11,17,16,16,12,12,17,16,16, - 13,13,17,16,16,11,11,17,16,16,12,12,17,17,17,11, - 11,13,14,14, 9, 9,16,14,14,13,13,16,15,15,14,14, - 17,14,14,12,12,16,14,14,13,13,17,15,15,14,14,17, - 15,16,15,15,17,15,15,14,14,17,15,16,14,15,18,15, - 15,14,14,17,15,15,14,14,16,16,16,15,15,18,15,15, - 13,14,17,15,15,14,14,18,15,15,14,14,17,15,15,14, - 14,17,16,16,15,15,17,15,15,13,13,17,15,15,14,14, - 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,17, - 15,15,13,13,17,15,15,14,14,18,15,15,13,13,13,11, - 11,10,10,16,14,14,12,12,16,14,14,13,13,17,14,14, - 11,11,17,14,14,12,12,17,15,15,14,14,17,14,14,14, - 14,17,15,15,13,13,17,15,14,13,13,16,15,15,13,13, - 16,15,15,13,13,17,14,14,14,14,17,15,15,13,13,17, - 14,14,13,13,16,15,15,13,13,16,15,15,13,13,17,14, - 14,13,13,17,15,15,12,12,17,14,14,12,12,16,15,15, - 12,12,17,15,15,13,13,17,14,14,13,13,17,15,15,12, - 12,17,14,14,12,12,16,15,15,12,12,14,14,14, 8, 8, - 14,14,14,18,18,14,15,15,19,18,14,14,14,18,18,14, - 14,14,18,19,15,16,15,19,19,15,17,16,20,20,15,15, - 15,19,19,15,16,16,19,19,15,15,15,19,19,15,16,15, - 18,19,15,16,16,20,20,15,15,15,19,19,15,16,16,19, - 20,15,15,15,19,19,15,15,16,19,19,15,16,16,20,20, - 15,15,15,19,19,15,15,15,19,20,15,15,15,19,19,15, - 15,15,19,19,15,16,16,20,20,15,15,15,19,20,15,16, - 16,20,20,15,15,15,19,19,13,12,12, 8, 8,14,14,14, - 19,20,14,14,14,19,19,14,14,14,18,19,14,14,14,19, - 20,15,15,15,19,20,15,14,14,21,20,15,15,15,20,20, - 15,15,14,19,19,15,15,15,19,19,15,15,15,19,19,15, - 14,14,19,20,15,15,15,19,20,15,14,14,19,19,15,15, - 15,19,19,15,15,15,19,19,16,14,14,19,19,15,15,15, - 20,20,15,14,14,21,19,15,15,15,19,19,15,15,15,19, - 20,16,14,14,19,20,15,15,15,19,19,15,14,14,19,19, - 15,15,15,20,19, -}; - -static const static_codebook _44p1_p3_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p1_p3_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p1_p3_1, - 0 -}; - -static const long _vq_quantlist__44p1_p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p1_p4_0[] = { - 2, 6, 6,14,14, 6, 7, 7,14,14, 7, 7, 7,14,14, 0, - 13,13,16,16, 0,13,13,15,14, 7, 8, 8,15,15, 9,10, - 10,16,16, 9, 8, 8,15,15, 0,13,13,17,16, 0,13,13, - 15,16, 8, 8, 8,15,15,12,11,11,16,16, 9, 8, 8,14, - 14, 0,13,13,17,18, 0,13,13,15,15, 0,14,14,16,16, - 0, 0, 0,19,18, 0,12,12,16,15, 0,15,16, 0,20, 0, - 14,14,16,16, 0,14,14,17,17, 0, 0, 0,19,18, 0,12, - 12,15,15, 0,17,17, 0,20, 0,14,14,16,16, 5, 6, 7, - 12,12, 9, 9, 9,14,14,10,10,10,14,14, 0,21,21,18, - 17, 0,20,20,18,17, 9,10,10,14,14,12,12,12,16,16, - 12,10,10,14,14, 0,20,19,18,17, 0, 0,20,17,18,11, - 10,10,14,14,14,13,13,18,18,13,11,11,14,14, 0,20, - 20,17,18, 0,21,21,17,17, 0,21, 0,18,18, 0, 0, 0, - 0, 0, 0,20,19,16,17, 0, 0, 0,19,19, 0, 0, 0,18, - 18, 0,21,21,18,18, 0, 0, 0, 0, 0, 0,20,20,16,17, - 0, 0, 0,21,21, 0, 0, 0,18,19, 6, 6, 6,13,12, 8, - 6, 6,11,11, 8, 6, 6,13,13, 0, 9, 9,11,11, 0,11, - 10,14,14, 9, 7, 7,13,13,11, 9, 9,13,13,10, 6, 6, - 13,13, 0,10,10,14,15, 0,10,10,13,13, 9, 7, 7,13, - 13,13,10, 9,13,13,10, 6, 6,13,13, 0,10,10,15,14, - 0,10,10,13,13, 0,11,11,15,15, 0,19,20,17,17, 0, - 9, 9,13,13, 0,13,13,20,20, 0,11,11,13,13, 0,11, - 11,15,15, 0,19,19,17,17, 0,10,10,13,13, 0,15,15, - 20,20, 0,12,12,13,13, 0,10,10,12,12, 0,11,11,15, - 15, 0,11,11,15,15, 0,15,15,20, 0, 0,16,16, 0,21, - 0,11,11,15,15, 0,14,14,18,17, 0,11,11,15,15, 0, - 15,16,19,20, 0,16,16,21,21, 0,12,12,15,15, 0,15, - 14,18,18, 0,11,11,16,16, 0,15,15,21,21, 0,16,15, - 0, 0, 0,16,16,21, 0, 0, 0, 0, 0, 0, 0,14,14,20, - 20, 0,18,18, 0, 0, 0,16,17,21, 0, 0,16,16,21,21, - 0, 0, 0, 0, 0, 0,15,15,21,21, 0,20,19, 0,21, 0, - 17,17, 0, 0, 0,10,10,12,11, 0,10,10,10,11, 0,11, - 11,12,12, 0,11,11, 9, 9, 0,13,13,11,12, 0,11,11, - 12,12, 0,13,13,12,12, 0,10,10,12,12, 0,12,12,13, - 13, 0,12,12,12,12, 0,11,11,12,12, 0,13,13,12,12, - 0,10,10,12,12, 0,13,13,14,14, 0,12,12,12,12, 0, - 14,14,14,13, 0,19,20,15,15, 0,12,11,12,12, 0,15, - 15,21,20, 0,13,13,11,11, 0,13,13,13,13, 0,19, 0, - 15,15, 0,12,12,12,12, 0,17,16,19, 0, 0,13,13,12, - 12, 7, 7, 7,16,16,11, 9, 9,15,15,12, 9, 9,16,16, - 0,13,13,15,14, 0,14,14,17,16,10, 9, 9,16,16,14, - 11,11,17,16,12, 9, 8,15,15, 0,13,13,18,18, 0,13, - 13,15,15,12,10,10,18,17,15,12,12,17,17,14, 9, 9, - 16,16, 0,13,13,18,19, 0,14,13,17,16, 0,14,14,18, - 18, 0, 0, 0,20,21, 0,12,12,16,16, 0,16,16,20,21, - 0,14,14,17,16, 0,14,14,18,19, 0, 0, 0,19,21, 0, - 13,13,17,17, 0,17,17, 0,21, 0,15,15,16,16, 8, 7, - 7,14,14,11,10,10,15,15,12,10,10,15,15, 0,20,20, - 18,18, 0, 0, 0,17,17,11,10,10,16,16,14,12,12,18, - 17,14,11,11,15,15, 0,20,21,18,18, 0, 0,19,18,17, - 12,10,10,16,16,17,14,14,19,19,14,11,11,15,15, 0, - 21,21,19,19, 0,21,20,19,18, 0,21, 0,18,19, 0, 0, - 0, 0, 0, 0,20,20,18,17, 0,21, 0, 0, 0, 0, 0, 0, - 19,18, 0, 0, 0,18,19, 0, 0, 0, 0, 0, 0, 0,21,17, - 18, 0, 0, 0, 0,21, 0, 0,21,18,19,11, 9, 9,14,14, - 13,10,10,13,13,13,11,11,15,15, 0,13,13,12,12, 0, - 15,15,16,16,13,10,10,15,15,16,12,12,15,15,15,10, - 10,15,15, 0,14,13,16,15, 0,14,13,15,15,13,10,10, - 15,15,18,14,14,15,15,15,10,10,14,15, 0,14,14,16, - 16, 0,14,14,16,15, 0,15,15,17,16, 0,21, 0,18,18, - 0,12,13,15,15, 0,16,16, 0, 0, 0,14,14,15,15, 0, - 15,15,16,16, 0,21,20,18,18, 0,13,13,15,15, 0,19, - 18, 0, 0, 0,15,15,15,15, 0,11,11,13,13, 0,12,12, - 16,16, 0,12,12,16,16, 0,15,16,20, 0, 0,16,17, 0, - 0, 0,12,12,16,16, 0,14,14,18,18, 0,11,11,16,17, - 0,15,15,20, 0, 0,16,16, 0, 0, 0,12,12,16,16, 0, - 15,15,19,19, 0,11,11,17,17, 0,16,16,21, 0, 0,16, - 16, 0, 0, 0,17,17,20,20, 0, 0, 0, 0, 0, 0,15,15, - 20, 0, 0,17,18, 0, 0, 0,17,17, 0, 0, 0,16,16, 0, - 21, 0, 0, 0, 0, 0, 0,15,15,21, 0, 0,19,18, 0, 0, - 0,18,17, 0, 0, 0,11,11,14,14, 0,11,11,15,15, 0, - 12,12,16,16, 0,13,13,14,14, 0,14,14,17,17, 0,12, - 12,16,16, 0,14,14,16,16, 0,11,11,16,15, 0,13,13, - 16,17, 0,13,13,16,16, 0,12,12,15,16, 0,15,14,16, - 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,16,16, - 0,15,14,18,18, 0,21, 0,19,19, 0,13,13,15,15, 0, - 16,16,20,20, 0,14,14,16,15, 0,14,14,17,17, 0,21, - 0,20,18, 0,13,13,15,15, 0,17,17, 0, 0, 0,14,14, - 16,15, 8, 8, 8,16,16,12, 9, 9,16,16,13, 9, 9,16, - 16, 0,14,14,18,17, 0,14,14,16,17,12,10,10,18,17, - 14,11,11,18,18,14, 9, 9,16,16, 0,13,13,18,18, 0, - 13,13,17,16,12, 9, 9,16,17,17,13,13,16,16,14, 9, - 9,15,15, 0,14,14,20,20, 0,13,13,15,15, 0,15,14, - 18,18, 0, 0, 0,20,21, 0,12,13,16,17, 0,16,16,20, - 21, 0,14,14,16,17, 0,14,14,18,17, 0, 0, 0,20,21, - 0,13,13,16,16, 0,19,17, 0,21, 0,14,15,16,16, 8, - 7, 7,14,13,12,10,10,15,15,13,10,10,15,15, 0,21, - 21,18,19, 0,20,21,18,18,12,10,10,16,15,15,12,12, - 17,17,14,11,11,15,15, 0,21,21,19,18, 0, 0,21,17, - 18,13,11,11,15,15,16,13,13,18,19,15,11,11,15,14, - 0,21, 0,19,19, 0, 0,21,18,18, 0, 0,21,19,19, 0, - 0, 0, 0, 0, 0,20,19,17,17, 0, 0, 0,21, 0, 0,21, - 0,18,19, 0, 0,20,20,19, 0, 0, 0, 0, 0, 0,21,20, - 18,17, 0, 0, 0, 0,20, 0, 0, 0,18,19, 0,10,10,15, - 14, 0,11,11,14,14, 0,11,11,15,16, 0,14,14,15,15, - 0,15,15,16,16, 0,11,11,16,16, 0,14,13,16,16, 0, - 11,11,15,15, 0,14,14,16,16, 0,14,14,15,15, 0,11, - 11,15,15, 0,13,13,15,15, 0,11,11,15,15, 0,15,15, - 18,17, 0,14,14,15,15, 0,15,16,18,18, 0, 0, 0,20, - 20, 0,14,13,16,15, 0,17,17,21, 0, 0,15,15,15,15, - 0,16,15,17,17, 0, 0, 0,19,19, 0,13,13,15,15, 0, - 20,19, 0, 0, 0,15,15,15,15, 0,11,11,13,13, 0,12, - 12,16,16, 0,12,12,16,16, 0,15,15,21,21, 0,17,16, - 0, 0, 0,12,12,16,16, 0,14,14,17,17, 0,11,11,16, - 16, 0,15,15, 0, 0, 0,16,16,21, 0, 0,12,12,17,16, - 0,14,15,20,20, 0,11,11,16,16, 0,15,15, 0,20, 0, - 16,16, 0,21, 0,16,17,21, 0, 0, 0, 0, 0, 0, 0,15, - 15, 0,21, 0,18,18, 0, 0, 0,17,16, 0, 0, 0,17,17, - 21, 0, 0, 0, 0, 0, 0, 0,15,15, 0,20, 0,19,20,21, - 0, 0,17,18, 0, 0, 0,12,12,15,15, 0,12,12,15,15, - 0,12,12,16,16, 0,13,13,15,15, 0,15,15,17,17, 0, - 13,12,17,16, 0,14,14,17,16, 0,11,11,16,16, 0,14, - 14,17,17, 0,14,14,17,17, 0,12,12,16,16, 0,15,15, - 17,17, 0,11,11,16,16, 0,14,14,17,17, 0,14,14,16, - 16, 0,15,15,18,17, 0, 0, 0,19, 0, 0,13,13,16,16, - 0,16,16, 0,21, 0,14,14,16,16, 0,15,15,18,17, 0, - 0, 0,19,19, 0,13,13,16,16, 0,18,17, 0,21, 0,14, - 15,16,16, 0,11,11,16,16, 0,13,13,17,17, 0,13,13, - 17,17, 0,16,16,16,17, 0,16,16,18,18, 0,12,12,17, - 17, 0,16,15,18,17, 0,12,12,16,16, 0,16,15,19,19, - 0,16,15,17,17, 0,12,12,17,18, 0,16,16,18,18, 0, - 12,12,16,16, 0,16,16,19,19, 0,15,16,17,17, 0,15, - 16,18,18, 0, 0, 0,20,20, 0,13,13,16,16, 0,18,18, - 21,20, 0,15,15,16,16, 0,16,16,19,18, 0, 0, 0,19, - 20, 0,14,14,17,17, 0,19,19, 0,21, 0,15,16,16,16, - 0, 9, 9,14,14, 0,13,13,15,15, 0,14,14,15,15, 0, - 0,21,19,19, 0, 0,21,18,18, 0,12,12,15,15, 0,15, - 15,18,18, 0,14,13,15,15, 0,21,21,18,19, 0,21,20, - 18,18, 0,13,13,16,16, 0,17,17,18,19, 0,14,14,15, - 15, 0, 0,21,19,19, 0,21,20,18,19, 0,20,20,19,19, - 0, 0, 0, 0, 0, 0,19,20,17,17, 0, 0, 0,21,21, 0, - 21, 0,18,20, 0,21, 0,18,21, 0, 0, 0, 0, 0, 0,21, - 21,19,18, 0, 0, 0, 0, 0, 0, 0, 0,19,19, 0,18,18, - 15,15, 0,18,20,17,16, 0,20, 0,17,17, 0,21, 0,17, - 17, 0,21,20,19,20, 0,19,19,16,16, 0,21,21,17,18, - 0,19,19,17,17, 0,20,21,21,21, 0,20,20,18,18, 0, - 19,19,16,16, 0, 0,21,18,19, 0,18,19,16,17, 0,21, - 21,19,20, 0,21,19,18,18, 0,21,20,19,21, 0, 0, 0, - 20,21, 0,19,19,17,16, 0, 0, 0, 0, 0, 0,21,20,17, - 17, 0,20,21,19,18, 0, 0, 0, 0,21, 0,19,18,16,17, - 0, 0, 0, 0, 0, 0,20,20,17,17, 0,11,11,14,14, 0, - 13,13,16,16, 0,13,13,16,16, 0,17,17,21, 0, 0,17, - 18, 0, 0, 0,12,12,16,16, 0,15,15,17,18, 0,12,12, - 16,16, 0,16,16, 0,20, 0,17,17, 0,21, 0,12,12,17, - 17, 0,16,16,19,20, 0,12,12,17,17, 0,17,17, 0,20, - 0,17,17, 0, 0, 0,17,17,21, 0, 0, 0, 0, 0, 0, 0, - 15,15, 0,20, 0,19,19, 0, 0, 0,18,18, 0, 0, 0,17, - 17, 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0, 0, 0,20,19, - 0, 0, 0,19,18, 0, 0, 0,14,14,21,19, 0,16,16,20, - 21, 0,16,16,20,20, 0,17,17,20, 0, 0,17,17,20,20, - 0,15,15,20,20, 0,19,18,20, 0, 0,15,15,20,20, 0, - 17,18,21,20, 0,17,17,20,21, 0,15,15,19,19, 0,19, - 18,21,21, 0,15,15,19,20, 0,17,18, 0, 0, 0,17,17, - 20,20, 0,17,18,20,21, 0, 0, 0, 0, 0, 0,15,15,20, - 20, 0,19,19, 0, 0, 0,17,17,19,21, 0,17,17, 0,21, - 0, 0, 0, 0,21, 0,15,15,20,19, 0, 0,20, 0, 0, 0, - 17,17,21,20, 0,12,12,16,16, 0,14,14,17,17, 0,13, - 13,17,17, 0,16,16,17,18, 0,17,16,18,18, 0,13,13, - 18,17, 0,15,16,19,18, 0,13,13,16,16, 0,16,16,19, - 19, 0,16,16,17,17, 0,13,12,17,17, 0,16,16,18,17, - 0,12,12,16,16, 0,17,17,19,18, 0,16,15,16,16, 0, - 16,17,18,19, 0, 0, 0,20,20, 0,14,14,17,16, 0,18, - 18,21, 0, 0,16,16,16,16, 0,16,16,18,17, 0, 0,21, - 21,21, 0,14,14,16,16, 0,21,20,21, 0, 0,16,16,16, - 16, 0,10,10,14,14, 0,14,14,15,16, 0,14,14,15,15, - 0, 0,21,18,18, 0, 0,21,18,19, 0,13,13,16,16, 0, - 16,16,18,17, 0,14,14,15,15, 0,20, 0,18,18, 0,21, - 0,18,17, 0,13,13,16,15, 0,17,17,19,19, 0,14,14, - 15,15, 0,20,20,18,19, 0, 0, 0,18,17, 0, 0,21,18, - 18, 0, 0, 0, 0, 0, 0,20,21,18,17, 0, 0, 0, 0, 0, - 0, 0, 0,19,19, 0, 0,21,18,18, 0, 0, 0, 0, 0, 0, - 21, 0,18,17, 0, 0, 0, 0,21, 0, 0, 0,19,20, 0,19, - 19,16,16, 0, 0,21,18,17, 0,21, 0,18,18, 0,20, 0, - 19,18, 0,21,20,19,19, 0,21,19,17,18, 0, 0,21,19, - 19, 0,21,19,18,18, 0,21, 0,20,18, 0, 0,21,18,18, - 0,20,21,17,17, 0,21, 0,18,18, 0,21,19,17,17, 0, - 21, 0, 0,20, 0, 0,20,17,18, 0, 0, 0,19,20, 0, 0, - 0,20,19, 0,19,21,17,18, 0,21, 0, 0, 0, 0,21,21, - 18,17, 0, 0,21,18,18, 0, 0, 0, 0,21, 0,20,19,16, - 17, 0, 0, 0, 0, 0, 0,21,20,17,17, 0,11,11,13,13, - 0,13,13,16,16, 0,13,13,16,16, 0,17,17, 0,21, 0, - 18,19,21, 0, 0,12,12,16,16, 0,15,15,19,18, 0,13, - 13,16,16, 0,16,17,21,19, 0,17,17,21,21, 0,13,13, - 16,16, 0,16,16,20,18, 0,13,13,16,16, 0,17,17, 0, - 0, 0,18,18, 0, 0, 0,18,17, 0,20, 0, 0, 0, 0, 0, - 0,15,15,21,21, 0,19,18, 0, 0, 0,17,17,21,21, 0, - 17,17, 0, 0, 0, 0, 0, 0, 0, 0,15,15,20,21, 0,20, - 20, 0, 0, 0,19,19, 0, 0, 0,14,15,21,19, 0,16,16, - 0,21, 0,17,16,21,21, 0,17,18,21,20, 0,18,18, 0, - 21, 0,16,16, 0,20, 0,19,19, 0, 0, 0,16,15, 0,20, - 0,18,18, 0, 0, 0,17,17, 0,21, 0,16,16,20,20, 0, - 20,19, 0, 0, 0,15,16,21,22, 0,18,18, 0, 0, 0,18, - 17, 0, 0, 0,18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, - 21,20, 0,19,20, 0, 0, 0,18,17,21, 0, 0,17,18, 0, - 0, 0, 0, 0, 0, 0, 0,16,16, 0,20, 0, 0,20, 0, 0, - 0,18,18,22, 0, -}; - -static const static_codebook _44p1_p4_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p1_p4_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p1_p4_0, - 0 -}; - -static const long _vq_quantlist__44p1_p4_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44p1_p4_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p1_p4_1 = { - 1, 7, - (long *)_vq_lengthlist__44p1_p4_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p1_p4_1, - 0 -}; - -static const long _vq_quantlist__44p1_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p1_p5_0[] = { - 1, 6, 6, 7, 8, 8, 7, 8, 8, 7, 9, 8,10,11,11, 9, - 8, 8, 7, 8, 8,11,11,11, 9, 8, 8, 6, 7, 7,10,10, - 10,10,10,10,10,10,10,14,13,13,12,11,11,10,10,10, - 14,14,13,12,11,11, 6, 6, 6, 8, 5, 5, 8, 7, 7, 9, - 7, 7,11,10,10, 9, 7, 7, 9, 7, 7,12,10,10,10, 7, - 7, 7, 8, 8,12,11,10,12,10,10,11,10,10,15,13,13, - 13,10,10,11,10,10,17,14,13,13,10,10, 7, 7, 7,12, - 11,12,12,11,11,12,11,11,16,14,14,13,12,12,12,11, - 11,17,15,14,14,12,12,10, 9, 9,13,11,11,13,11,11, - 13,11,11,17,14,13,14,11,11,12,11,11,16,15,14,14, - 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,15,13, - 13,14,11,10,12,10,10,16,14,14,14,10,10, 8, 7, 7, - 12,11,11,12,11,11,12,11,11,17,14,14,14,12,12,12, - 11,11,16,15,15,14,12,12,10,10,10,13,11,11,13,11, - 11,13,11,12,16,14,14,14,11,11,13,12,11,16,15,15, - 14,11,11, -}; - -static const static_codebook _44p1_p5_0 = { - 5, 243, - (long *)_vq_lengthlist__44p1_p5_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p1_p5_0, - 0 -}; - -static const long _vq_quantlist__44p1_p5_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p1_p5_1[] = { - 2, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 8, 8, 8, - 7, 7, 8, 8, 8, 9, 8, 8, 9, 7, 7, 6, 6, 6, 9, 8, - 7, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, - 10, 8, 8,10, 8, 8, 7, 6, 6, 9, 6, 6, 9, 7, 7, 9, - 7, 7,10, 8, 8, 9, 6, 6, 9, 7, 7,10, 8, 8, 9, 7, - 7, 7, 8, 8,11, 9, 9,11, 9, 9,11, 8, 9,12, 9, 9, - 12, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7,10, - 9, 9,10,10, 9,10, 9, 9,11,10,10,11, 9, 9,11, 9, - 9,11,10,11,11, 9, 9,10, 8, 8,11, 9, 9,10, 9, 9, - 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, - 9, 9, 9, 8, 8,11, 9, 9,12, 9, 9,11, 9, 9,12, 9, - 9,12, 8, 8,12, 9, 9,12, 9, 9,12, 8, 8, 9, 7, 7, - 11, 9, 9,11,10,10,11, 9, 9,11,11,11,11, 9, 9,11, - 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11,10, - 10,11, 9, 9,11,10,10,11, 9, 9,11, 9,10,11,10,10, - 11, 9, 9, -}; - -static const static_codebook _44p1_p5_1 = { - 5, 243, - (long *)_vq_lengthlist__44p1_p5_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p1_p5_1, - 0 -}; - -static const long _vq_quantlist__44p1_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p1_p6_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p1_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44p1_p6_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p1_p6_0, - 0 -}; - -static const long _vq_quantlist__44p1_p6_1[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p1_p6_1[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,13,14,16,16,16,16, -}; - -static const static_codebook _44p1_p6_1 = { - 1, 25, - (long *)_vq_lengthlist__44p1_p6_1, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p1_p6_1, - 0 -}; - -static const long _vq_quantlist__44p1_p6_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p1_p6_2[] = { - 3, 4, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p1_p6_2 = { - 1, 25, - (long *)_vq_lengthlist__44p1_p6_2, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p1_p6_2, - 0 -}; - -static const long _huff_lengthlist__44p1_short[] = { - 4, 5, 7, 8,10,13,14, 4, 2, 4, 6, 8,11,12, 7, 4, - 3, 5, 8,12,14, 8, 5, 4, 4, 8,12,12, 9, 7, 7, 7, - 9,10,11,13,11,11, 9, 7, 8,10,13,11,10, 6, 5, 7, - 9, -}; - -static const static_codebook _huff_book__44p1_short = { - 2, 49, - (long *)_huff_lengthlist__44p1_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p2_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44p2_l0_0[] = { - 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 4, 6, 5, - 8, 7, 9, 8,10, 9,11,10,11,11, 4, 5, 6, 7, 8, 8, - 9, 9,10,10,10,10,11, 8, 9, 8,10, 8,10, 9,11,10, - 11,11,11,11, 8, 8, 9, 8,10, 9,10,10,11,11,11,11, - 11, 9,10,10,11,11,11,11,11,11,12,11,12,11, 9,10, - 10,10,11,11,11,11,11,11,12,11,12,10,11,11,12,11, - 12,12,12,12,12,12,12,12,10,11,11,11,11,12,12,12, - 13,12,12,12,12,11,12,12,12,12,13,13,12,12,12,12, - 12,12,11,12,12,12,12,13,13,12,13,12,12,12,12,12, - 13,13,13,13,13,13,12,13,12,13,12,12,12,13,13,13, - 13,13,13,13,12,13,12,12,12, -}; - -static const static_codebook _44p2_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44p2_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p2_l0_0, - 0 -}; - -static const long _vq_quantlist__44p2_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p2_l0_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, - 5, 6, 6, 6, 5, 6, 5, 6, 6, -}; - -static const static_codebook _44p2_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44p2_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p2_l0_1, - 0 -}; - -static const long _vq_quantlist__44p2_l1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p2_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p2_l1_0 = { - 2, 9, - (long *)_vq_lengthlist__44p2_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p2_l1_0, - 0 -}; - -static const long _huff_lengthlist__44p2_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p2_lfe = { - 2, 4, - (long *)_huff_lengthlist__44p2_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44p2_long[] = { - 3, 4, 9, 8, 8,10,13,16, 4, 2, 9, 5, 7,10,14,18, - 9, 7, 6, 5, 7, 9,12,16, 7, 5, 5, 3, 5, 8,11,13, - 8, 7, 7, 5, 5, 7, 9,11,10,10, 9, 8, 6, 6, 8,10, - 13,14,13,11, 9, 8, 9,10,17,18,16,14,11,10,10,10, -}; - -static const static_codebook _huff_book__44p2_long = { - 2, 64, - (long *)_huff_lengthlist__44p2_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p2_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p2_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p2_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44p2_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p2_p1_0, - 0 -}; - -static const long _vq_quantlist__44p2_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p2_p2_0[] = { - 1, 4, 4, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, - 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0,11,11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, - 6, 6, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, - 0, 0,10,10, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 11,11, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,11,10, 0, 0, 0, 0, 0, - 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0,11,11, 0, 0, - 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, - 0, 0, 0, 0, 0,10,10, 0, 0, 0,13,13, 0, 0, 0, 0, - 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, - 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, - 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, - 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, - 0, 0, 0,12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,11, 0, 0, - 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, 0, 0, - 0, 0, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, 0, 0, - 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, - 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0,11,11, 0, - 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, 0, - 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, 0, - 0, 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,10, - 10, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,14,13, - 0, 0, 0, 0, 0, 0, 0, 0,13,12, 0, 0, 0,13,13, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11, - 11, 0, 0, 0,12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, - 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,13,13, 0, 0, - 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,12,12, 0, 0, 0, - 0, 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12, - 12, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, 0,12,12, - 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, - 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,14,14, 0, 0, - 0, 0, 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, - 12,12, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0,12, - 12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,14,13, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 11,11, 0, 0, 0,12,12, 0, 0, 0,13,13, 0, 0, 0, 0, - 0, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, - 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, - 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0,14,14, 0, 0, - 0, 0, 0, 0, 0, 0,14,14, 0, 0, 0, 0, 0, 0, 0, 0, - 12,12, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -}; - -static const static_codebook _44p2_p2_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p2_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p2_p2_0, - 0 -}; - -static const long _vq_quantlist__44p2_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p2_p3_0[] = { - 1, 5, 5, 6, 7, 7, 0, 8, 8, 6, 9, 9, 8,11,11, 0, - 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 5, 7, 7, 7,10, - 10, 0,12,12, 8,11,11, 9,12,12, 0,11,12, 0,12,12, - 0,15,15, 0,12,12, 0, 6, 6, 0, 6, 6, 0, 7, 7, 0, - 7, 7, 0,10,10, 0, 7, 7, 0, 8, 8, 0,11,11, 0, 7, - 7, 6, 7, 7,10, 9, 9, 0,11,10,10, 9, 9,12,12,12, - 0,10,10, 0,11,11, 0,13,13, 0,11,11, 7, 6, 6,10, - 10,10, 0,11,11,11,11,11,12,12,12, 0,11,11, 0,12, - 12, 0,15,15, 0,11,11, 0,11,11, 0,11,11, 0,12,12, - 0,12,12, 0,14,14, 0,12,12, 0,12,12, 0,15,15, 0, - 11,11, 0, 8, 8, 0,10,10, 0,11,11, 0,11,11, 0,12, - 12, 0,12,12, 0,11,11, 0,15,15, 0,11,11, 0, 6, 6, - 0,10,10, 0,12,12, 0,10,10, 0,13,13, 0,12,12, 0, - 13,13, 0,14,14, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p2_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44p2_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p2_p3_0, - 0 -}; - -static const long _vq_quantlist__44p2_p3_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p2_p3_1[] = { - 2, 3, 3, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0, 9, 9, 0, - 9, 9, 0, 9, 9, 0, 9, 9, 0, 8, 8, 0, 6, 6, 0, 7, - 7, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, - 0, 8, 8, 0, 8, 8, 0, 6, 6, 0, 6, 6, 0, 6, 6, 0, - 8, 8, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, 6, - 6, 0, 8, 8, 0, 9, 9, 0, 9, 9, 0,10,10, 0,10,10, - 0,10,10, 0,10,10, 0,11,11, 0, 9, 9, 0, 7, 7, 0, - 10,10, 0,10,10, 0,12,11, 0,12,12, 0,11,11, 0,11, - 11, 0,12,12, 0,10,10, 0, 7, 7, 0,10,10, 0,10,10, - 0,12,12, 0,11,12, 0,11,11, 0,11,11, 0,11,11, 0, - 10,10, 0, 8, 8, 0, 9, 9, 0, 9, 9, 0,10,10, 0,10, - 10, 0,10, 9, 0,10,10, 0,10,10, 0, 9, 9, 0, 6, 6, - 0,10,10, 0,10,10, 0,11,11, 0,12,12, 0,11,11, 0, - 11,11, 0,12,12, 0,11,11, 0, 7, 7, 0, 9, 9, 0, 9, - 9, 0,11,11, 0,11,11, 0,10,10, 0,10,10, 0,11,11, - 0, 9, 9, -}; - -static const static_codebook _44p2_p3_1 = { - 5, 243, - (long *)_vq_lengthlist__44p2_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p2_p3_1, - 0 -}; - -static const long _vq_quantlist__44p2_p4_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p2_p4_0[] = { - 1, 6, 6, 6, 7, 7, 7, 8, 8, 7, 8, 8,10,11,11, 9, - 8, 8, 7, 8, 8,11,11,11, 9, 8, 8, 6, 7, 7, 9,11, - 11, 9,11,11,10,11,11,12,13,13,11,12,12,10,11,11, - 13,14,14,12,12,12, 6, 6, 6, 8, 6, 6, 8, 7, 7, 9, - 7, 7,11,10,10,10, 6, 6, 9, 7, 7,12,10,10,11, 6, - 7, 7, 7, 7,11,10,10,12,10,10,11,10,10,14,13,13, - 13,10,10,12,11,11,15,13,13,14,10,10, 8, 7, 7,12, - 11,11,12,11,11,11,11,11,14,14,14,13,12,12,12,11, - 11,15,15,15,13,12,12, 0,10,10, 0,11,11, 0,11,11, - 0,11,11, 0,14,14, 0,11,11, 0,11,11, 0,15,15, 0, - 11,11, 7, 8, 8,12,10,10,12,10,10,12,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, - 12,11,11,12,11,11,12,11,11,16,14,14,14,12,12,13, - 12,12,15,14,14,15,12,12, 0,11,11, 0,12,12, 0,12, - 12, 0,12,12, 0,15,15, 0,12,12, 0,12,12, 0,14,14, - 0,12,12, -}; - -static const static_codebook _44p2_p4_0 = { - 5, 243, - (long *)_vq_lengthlist__44p2_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p2_p4_0, - 0 -}; - -static const long _vq_quantlist__44p2_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p2_p4_1[] = { - 3, 4, 4, 8, 8,11, 9, 9,12,12,11,10,10,12,12,12, - 10,10,11,11,12,12,12,12,12,12,11,11,13,13,12,12, - 12,13,13,12,10,10,12,12,12,11,11,13,13,12,13,13, - 13,13,12,11,11,13,13,12,12,12,13,13,12,10,10,12, - 12,12,11,11,13,13,12,13,13,12,12,12,11,11,13,13, - 12,13,13,13,13,12,11,11,12,12,12,11,11,12,12,12, - 13,13,12,12,12,13,13,13,13,12,13,13,13,13,13,13, - 13,12,12,12,13,13,13,13,12,13,13,12,12,11, 8, 8, - 10,10,12,11,11,11,11,12,10,10,10,10,13,11,11,10, - 10,13,11,11,10,10,13,12,12,12,12,13,11,11,11,11, - 13,12,12,11,11,13,12,12,11,11,13,12,12,12,11,13, - 12,12,12,12,13,11,11,11,11,13,12,12,11,11,13,11, - 12,11,11,13,12,12,11,11,14,12,12,11,11,13,11,11, - 11,11,14,12,12,11,11,13,11,12,10,10,14,12,12,11, - 11,14,12,12,11,11,14,11,11,11,11,14,12,12,11,11, - 13,12,12,11,11,14,12,12,11,11,11, 8, 8,10,10,12, - 7, 7,10,10,12, 9, 9,11,11,13, 9, 9, 9, 9,13,13, - 13,10,10,13, 9, 9,12,12,13,13,13,12,12,13, 9, 8, - 11,11,13,10,10,12,12,14,13,13,11,11,13, 9, 9,11, - 11,13,13,13,12,12,13, 9, 9,10,10,13,10,10,11,11, - 13,13,13,10,10,14,10,10,11,11,14,14,14,12,12,13, - 9, 9,10,10,13,10,10,11,11,14,13,14,10,10,14,14, - 14,11,12,14,14,14,14,14,14,13,13,10,10,13,14,14, - 11,11,14,14,14,10,10,14, 9, 9, 9, 9,14, 9, 9, 9, - 9,14,10,10, 9, 9,14,10,10, 8, 8,14,11,11, 8, 8, - 15,11,11,10,10,15,12,12,10,10,15,10,10,10,10,15, - 11,11,10,10,15,13,13,10,10,15,11,11,10,10,15,12, - 12,10,10,15,10,10,10,10,15,11,11,10,10,15,13,13, - 10,10,15,11,11,10,10,15,12,12,10,10,15,11,11, 9, - 9,15,11,11, 9, 9,15,13,13, 9, 9,15,13,13,10,10, - 15,12,12,10,10,15,13,13,10,10,15,13,12, 9, 9,15, - 13,13, 9, 9,14,12,12, 9, 9,14,13,13, 9, 9,14,13, - 13, 9, 9,14,13,13, 7, 7,14,13,13, 8, 8,15,14,14, - 10,10,15,14,14,10,10,15,14,14,10,10,15,14,14,10, - 10,15,14,14, 9, 9,15,14,14,10,10,15,14,14,10,10, - 14,14,14, 9, 9,15,14,14,10,10,14,14,14, 9, 9,15, - 14,14,10,10,15,14,14,10,10,14,14,14, 9, 9,14,14, - 14, 9, 9,14,14,14, 8, 8,15,14,14,10,10,15,14,14, - 11,11,15,14,14, 9, 9,15,14,14, 9, 9,14,14,14, 8, - 8,13, 9, 9,12,12,17,11,11,12,12,17,12,12,12,12, - 17,12,12,11,11,18,15,15,12,12,17,12,12,12,12,17, - 14,15,13,13,17,12,12,12,12,17,13,13,12,13,17,15, - 15,12,12,18,13,13,13,13,18,15,15,13,13,18,12,12, - 12,12,18,13,13,13,13,18,15,15,12,12,18,13,13,12, - 12,18,15,15,13,13,18,13,13,12,12,17,13,13,12,12, - 17,15,15,12,12,18,15,15,13,13,18,15,15,13,14,18, - 15,16,12,12,18,15,15,12,12,18,16,16,12,12,13, 8, - 8,10,10,14,15,14,11,11,14,15,15,12,12,15,14,14, - 12,11,15,15,15,12,12,15,15,15,12,12,15,15,15,13, - 13,15,15,15,12,12,15,15,15,13,13,15,15,15,13,13, - 15,15,15,13,13,15,15,16,13,13,15,15,15,12,12,15, - 15,15,13,13,15,15,15,13,13,15,15,15,13,13,15,15, - 15,13,13,15,15,14,12,12,15,15,15,12,12,16,15,14, - 12,12,16,15,15,13,13,16,16,16,13,13,16,15,15,12, - 12,15,15,15,13,13,15,15,15,12,12,13,12,12,10,10, - 14,14,14,11,11,15,14,14,12,12,15,14,14,11,11,15, - 14,14,11,11,15,15,15,13,13,15,14,14,13,13,15,15, - 15,12,12,15,14,15,13,13,16,15,15,12,12,15,15,15, - 13,13,16,14,14,13,13,15,15,15,12,12,15,15,15,13, - 13,16,15,15,12,12,16,15,15,12,12,16,14,14,13,13, - 15,15,15,11,11,15,15,15,12,12,16,15,15,11,11,16, - 15,15,13,13,16,14,15,14,14,16,15,15,12,12,16,15, - 14,12,12,16,15,15,12,12,14,10,10, 9, 9,14,11,11, - 12,12,14,12,12,13,13,14,12,12,12,12,15,14,14,13, - 13,15,13,13,14,14,15,14,14,15,15,15,12,12,13,13, - 15,13,13,14,14,15,14,14,13,13,15,13,13,13,14,15, - 14,14,15,15,15,12,12,13,13,15,13,13,14,14,15,14, - 14,13,13,15,13,13,14,14,15,14,14,15,15,15,13,13, - 12,12,15,13,13,13,13,15,14,14,13,12,15,15,15,14, - 15,15,15,14,20,20,15,14,14,13,13,15,14,14,13,13, - 15,14,14,13,13,14,12,12, 9, 9,14,14,14,12,12,14, - 13,13,12,13,14,14,14,12,12,15,14,14,12,12,15,14, - 14,14,13,15,14,14,14,14,15,14,14,13,13,15,14,14, - 13,13,15,15,15,14,14,15,14,14,13,13,15,14,14,14, - 14,15,14,14,13,13,15,14,14,13,13,15,15,15,15,14, - 15,15,15,13,13,15,14,14,14,14,15,14,14,13,13,15, - 14,14,13,13,14,15,15,14,14,15,15,15,14,14,15,14, - 14,14,14,15,15,15,14,14,15,14,14,13,14,15,15,15, - 14,14,13,10,10,12,12,17,11,11,12,12,17,12,12,12, - 12,17,12,12,11,11,17,15,15,12,11,18,13,13,13,13, - 18,15,15,13,13,17,12,12,12,12,18,13,13,13,13,17, - 15,15,12,12,17,12,12,12,12,17,15,15,13,13,17,12, - 12,12,12,17,13,13,12,12,17,15,15,12,12,18,14,13, - 12,12,18,15,15,13,13,18,13,13,12,12,18,13,13,12, - 12,18,16,16,12,12,18,16,16,12,12,18,15,15,13,13, - 18,16,16,12,12,17,15,15,12,12,17,16,16,12,12,13, - 8, 8,10,10,14,14,15,12,12,14,15,15,12,12,15,14, - 14,12,12,15,15,14,12,12,15,15,15,13,13,15,15,15, - 13,13,15,15,15,12,12,16,15,15,13,13,16,15,15,13, - 13,15,15,15,12,12,15,15,15,14,14,15,15,15,12,12, - 15,15,15,13,13,16,15,15,13,13,15,15,15,13,13,16, - 15,15,13,13,15,15,14,12,12,15,15,15,12,12,16,14, - 15,13,13,16,15,15,13,13,15,16,15,13,13,16,15,14, - 13,13,16,15,15,13,13,16,15,15,13,13,13,12,12,11, - 11,14,14,14,11,11,14,14,14,12,12,15,14,14,11,11, - 16,14,14,11,11,15,15,15,12,13,16,14,14,13,13,15, - 15,15,12,12,15,14,14,13,13,16,15,15,12,12,15,15, - 15,12,12,15,14,14,13,13,15,15,15,12,12,15,14,14, - 12,12,16,15,15,12,12,16,15,15,12,12,16,14,14,13, - 13,15,15,15,11,11,15,15,14,12,12,16,15,15,11,11, - 16,15,15,12,12,16,14,14,13,13,16,15,15,11,11,16, - 14,14,12,12,16,15,15,11,11,14,10,10, 9, 9,14,11, - 11,12,12,14,12,12,13,14,14,12,12,12,12,14,14,14, - 13,13,15,13,13,14,14,15,14,14,15,15,15,12,12,13, - 13,15,13,13,14,14,15,15,15,14,14,15,13,13,14,14, - 15,15,15,15,15,15,12,12,13,13,15,13,13,14,14,15, - 14,14,13,13,15,13,13,14,14,15,14,14,15,15,15,12, - 12,13,13,15,13,13,13,13,14,14,14,13,13,15,15,15, - 14,15,15,15,15,21,19,15,14,14,13,13,15,14,14,14, - 14,14,14,14,13,13,14,12,12, 9, 9,14,14,14,12,12, - 14,14,13,13,13,14,14,14,12,12,14,14,14,12,12,15, - 14,14,13,13,15,14,14,14,14,15,14,14,13,13,15,14, - 14,13,13,15,15,15,15,15,15,14,14,13,13,15,14,14, - 14,14,15,14,14,13,13,15,14,14,13,13,14,15,15,15, - 15,15,14,15,13,13,15,14,14,14,14,15,14,14,13,13, - 15,14,14,13,13,14,15,15,14,14,15,15,15,14,14,15, - 14,14,14,14,15,15,15,15,15,15,14,14,14,13,14,15, - 15,14,14,13,10,10,12,12,18,12,12,12,12,17,12,12, - 12,12,18,13,13,11,11,18,15,14,11,11,17,13,13,13, - 13,18,15,15,12,12,18,12,12,12,12,17,13,13,12,12, - 18,15,15,12,12,18,13,13,13,12,18,15,15,13,13,18, - 13,13,12,12,18,13,13,12,12,18,15,15,12,12,17,13, - 13,12,12,17,15,15,12,12,17,12,12,11,11,17,13,13, - 11,11,17,15,15,11,11,18,16,16,12,12,18,15,15,13, - 13,18,15,15,11,11,17,15,15,12,12,18,15,15,11,11, - 13, 8, 8,10,10,14,14,14,11,11,15,15,15,12,12,15, - 14,14,11,11,16,14,14,12,12,15,15,15,12,12,15,15, - 15,13,13,15,15,15,12,12,15,15,15,12,12,16,15,15, - 13,13,15,15,15,12,12,15,15,15,13,13,16,15,15,12, - 12,15,15,15,12,12,16,15,15,13,13,16,15,15,12,12, - 15,15,15,13,13,15,14,14,12,12,15,15,15,12,12,16, - 15,14,12,12,16,15,15,13,13,16,16,16,13,13,16,14, - 15,13,13,15,15,15,13,13,16,15,15,12,12,13,12,12, - 10,10,14,14,14,11,11,15,14,14,12,12,15,14,14,11, - 11,16,14,14,11,11,15,14,15,12,12,15,14,14,13,13, - 15,15,15,12,12,15,14,14,12,12,15,14,15,12,12,15, - 15,15,12,12,16,14,14,13,13,15,15,15,11,12,16,14, - 14,12,12,16,15,15,12,12,15,15,15,12,12,16,14,14, - 12,12,15,15,15,11,11,15,14,14,11,12,15,15,14,11, - 11,16,15,15,12,12,16,14,14,13,13,16,15,15,11,11, - 16,14,14,12,12,16,15,15,11,11,13,10,10, 8, 8,14, - 12,12,12,12,14,12,12,13,13,14,12,12,12,12,14,14, - 14,13,13,15,13,13,14,14,15,15,14,15,15,15,13,13, - 13,13,15,13,13,14,14,15,14,15,14,14,15,13,13,13, - 13,15,15,15,15,15,15,12,12,13,12,15,13,13,14,14, - 15,14,14,13,13,15,13,13,14,13,15,15,15,16,16,15, - 13,13,12,12,15,13,13,13,13,14,14,14,12,12,15,15, - 15,14,14,15,15,15,20,20,15,14,14,13,13,15,15,14, - 14,14,15,14,14,13,13,13,12,12, 9, 9,14,13,13,12, - 12,14,13,13,12,12,14,14,14,12,12,14,14,14,13,13, - 15,14,14,13,13,15,14,14,14,14,15,15,14,12,12,15, - 14,14,13,13,15,14,15,14,15,15,14,14,13,13,15,14, - 14,14,14,15,14,14,12,12,15,14,14,13,13,14,15,14, - 15,14,15,14,14,13,13,15,14,14,14,14,15,14,14,12, - 12,15,14,14,13,13,15,15,15,14,14,15,15,15,14,14, - 16,14,14,14,14,15,15,15,14,14,15,14,14,14,14,14, - 15,15,14,14,13,13,13,12,13,17,15,15,12,12,17,15, - 15,12,12,18,15,15,11,11,17,16,16,11,11,18,16,16, - 13,13,18,17,16,13,13,18,16,16,12,12,18,16,16,12, - 12,18,17,17,12,12,17,16,16,12,13,17,16,16,12,13, - 17,16,16,12,12,17,16,16,12,12,18,17,16,12,12,18, - 16,16,12,12,17,16,17,12,12,18,15,15,11,11,18,15, - 15,12,12,17,17,17,11,11,17,17,17,12,12,17,16,16, - 13,13,18,16,16,11,11,18,16,16,12,12,18,17,16,11, - 11,14,14,14,10,10,16,15,14,11,11,16,15,15,12,12, - 16,14,14,12,12,17,14,14,13,13,17,15,15,13,13,17, - 15,15,14,14,16,15,15,12,12,16,15,15,13,13,18,15, - 15,14,14,16,15,15,12,12,16,15,15,14,14,16,15,15, - 12,12,16,15,15,13,13,17,15,15,13,13,17,15,15,13, - 13,17,15,15,14,14,16,14,14,12,12,17,15,15,12,12, - 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,17, - 15,14,13,13,17,15,15,14,14,17,15,15,13,13,14,12, - 12,11,11,15,14,14,12,12,16,14,14,12,12,16,14,14, - 11,11,17,14,14,12,12,16,15,14,13,13,16,14,14,13, - 13,16,15,15,12,12,16,14,14,13,13,17,15,15,13,13, - 16,15,15,13,13,17,14,14,13,13,16,15,15,12,12,16, - 14,14,12,12,16,15,15,12,12,17,15,15,12,12,17,14, - 14,13,13,16,15,15,12,12,16,14,14,12,12,16,15,15, - 12,12,17,15,15,13,13,17,14,14,13,13,17,15,15,12, - 12,17,14,14,12,12,17,15,15,12,12,14,14,14, 8, 8, - 14,14,14,13,13,14,15,15,14,14,14,14,14,14,14,15, - 15,15,19,19,15,15,15,14,14,15,15,16,20,19,15,15, - 15,14,14,15,16,16,15,15,15,15,15,19,19,15,15,15, - 14,14,15,16,16,19,20,15,15,15,14,14,15,15,15,15, - 15,15,15,15,19,19,15,15,15,15,15,15,15,16,19,20, - 15,14,15,14,14,15,15,15,15,15,15,15,15,20,19,15, - 15,15,21,19,15,16,16,20,20,15,15,14,19,19,15,15, - 16,20,21,15,15,15,20,19,13,12,12, 9, 9,14,14,14, - 12,12,14,13,13,13,13,14,14,14,13,13,15,14,14,20, - 19,15,14,14,14,13,15,14,14,19,19,15,15,14,13,13, - 15,14,14,14,14,15,15,15,19,20,15,14,14,13,13,15, - 14,14,20,19,14,15,14,13,13,15,14,14,14,13,15,15, - 15,19,20,15,15,14,14,14,15,14,14,21,19,15,15,15, - 13,13,15,14,14,14,14,14,15,15,20,20,15,15,15,21, - 20,15,14,14,19,20,15,15,15,20,20,15,14,14,19,20, - 15,15,15,21,19, -}; - -static const static_codebook _44p2_p4_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p2_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p2_p4_1, - 0 -}; - -static const long _vq_quantlist__44p2_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p2_p5_0[] = { - 2, 6, 6,14,14, 6, 7, 7,14,14, 7, 7, 7,15,15, 0, - 13,13,16,16, 0,13,13,15,15, 7, 8, 8,15,15, 9,10, - 10,17,16, 9, 8, 8,15,15, 0,13,13,18,17, 0,13,13, - 16,16, 8, 8, 8,15,15,12,11,11,16,17, 9, 8, 8,14, - 14, 0,13,13,18,17, 0,13,13,16,15, 0,14,14,18,17, - 0,20,22,18,20, 0,12,12,16,16, 0,16,16,22,20, 0, - 14,14,16,16, 0,14,14,17,17, 0,22,22,22,19, 0,12, - 13,16,16, 0,17,17, 0, 0, 0,15,15,16,16, 5, 7, 7, - 13,13, 9, 9, 9,15,14,10,10,10,14,14, 0,21,21,18, - 17, 0,21,22,18,17, 9,10,10,14,14,12,12,12,17,17, - 12,10,10,14,14, 0,19,21,18,17, 0,20,22,18,18,11, - 10,10,14,14,14,13,13,18,17,12,11,11,14,14, 0,22, - 19,17,18, 0,20, 0,18,17, 0,22,21,17,17, 0, 0, 0, - 0, 0, 0,20,22,17,17, 0,22, 0,21,19, 0,22, 0,18, - 18, 0, 0,22,18,19, 0, 0, 0, 0, 0, 0,19,21,17,17, - 0, 0, 0,20,20, 0, 0, 0,18,18, 6, 6, 6,13,12, 8, - 6, 6,11,11, 8, 6, 6,13,13, 0, 9, 9,11,11, 0,11, - 11,14,14, 9, 7, 7,13,13,11, 9, 9,13,13,10, 6, 6, - 13,13, 0,10,10,14,14, 0,10,10,13,13, 9, 7, 7,13, - 14,13, 9, 9,13,13,10, 6, 6,13,12, 0,11,11,15,15, - 0,10,10,13,13, 0,12,12,15,15, 0,19, 0,17,17, 0, - 9, 9,13,13, 0,13,14,19,20, 0,11,11,13,13, 0,11, - 11,14,14, 0,19,20,17,18, 0,10,10,13,13, 0,15,15, - 21,19, 0,12,12,13,13, 0,10,10,12,13, 0,11,11,15, - 15, 0,11,11,15,15, 0,15,15,22, 0, 0,16,17,22, 0, - 0,11,11,15,15, 0,14,14,18,17, 0,11,11,15,16, 0, - 15,15,22,21, 0,16,16, 0,20, 0,12,12,16,15, 0,15, - 14,19,19, 0,11,11,16,16, 0,15,15,21, 0, 0,16,15, - 0, 0, 0,16,16,22,21, 0, 0, 0, 0, 0, 0,15,15,20, - 20, 0,18,18, 0, 0, 0,16,17, 0, 0, 0,17,17, 0,22, - 0, 0, 0, 0, 0, 0,15,15,21,22, 0,20,18, 0, 0, 0, - 18,17,22, 0, 0,10,10,12,11, 0,10,10,10,10, 0,11, - 11,12,12, 0,11,11, 9, 9, 0,13,13,12,12, 0,11,11, - 12,12, 0,13,13,12,12, 0,10,10,12,12, 0,13,12,13, - 13, 0,12,12,12,12, 0,11,11,12,12, 0,13,13,12,12, - 0,10,10,12,12, 0,13,13,13,14, 0,12,12,12,12, 0, - 13,14,14,14, 0,20,21,15,15, 0,12,11,12,12, 0,15, - 16,20,22, 0,13,12,11,11, 0,13,13,14,13, 0,20, 0, - 16,15, 0,12,12,12,12, 0,16,16,22,21, 0,13,13,12, - 12, 6, 7, 7,16,16,11, 9, 9,15,15,12, 9, 9,16,16, - 0,13,13,14,14, 0,14,14,16,17,10, 9, 9,16,16,14, - 12,12,16,16,12, 9, 9,15,15, 0,13,13,18,18, 0,13, - 13,15,16,12,10,10,17,18,15,12,12,17,17,13, 9, 9, - 16,16, 0,13,13,17,18, 0,14,14,16,16, 0,15,15,18, - 18, 0,22, 0,20,20, 0,12,12,16,16, 0,16,16,20,22, - 0,14,14,16,16, 0,15,14,18,18, 0, 0,22,19,21, 0, - 13,13,16,17, 0,17,17,22,22, 0,15,15,16,16, 7, 7, - 7,14,14,11,10,10,15,15,12,10,10,15,14, 0,22, 0, - 18,18, 0, 0,21,17,18,11,10,10,15,15,14,12,12,17, - 17,14,11,11,15,15, 0,22,20,18,18, 0, 0,20,18,17, - 12,10,10,16,16,17,14,14,19,18,14,11,11,15,15, 0, - 21,22,19,19, 0,21,22,18,18, 0,22, 0,19,21, 0, 0, - 0, 0, 0, 0,22,22,18,17, 0, 0, 0,21,20, 0,22,22, - 20,19, 0, 0,22,20,20, 0, 0, 0, 0, 0, 0,20,21,17, - 17, 0, 0,22,21,21, 0, 0, 0,18,18,10, 9, 9,14,14, - 13,10,10,13,13,13,10,11,14,14, 0,13,13,12,12, 0, - 15,15,16,16,13,10,10,15,15,15,12,12,14,14,15,10, - 10,14,15, 0,14,14,16,15, 0,14,14,15,15,13,10,10, - 15,15,18,13,13,15,15,15,10,10,14,15, 0,14,14,16, - 16, 0,14,14,15,15, 0,15,15,16,16, 0,22, 0,18,18, - 0,12,13,14,14, 0,17,17,22, 0, 0,14,14,14,14, 0, - 15,15,16,16, 0,22, 0,18,17, 0,13,13,14,14, 0,19, - 18,21,22, 0,15,15,14,14, 0,11,11,13,13, 0,12,12, - 16,16, 0,12,12,16,16, 0,15,16,21, 0, 0,16,17, 0, - 22, 0,12,12,16,16, 0,14,14,17,18, 0,11,11,16,16, - 0,15,15,21,22, 0,16,16, 0, 0, 0,12,12,16,16, 0, - 15,15, 0,19, 0,12,12,16,17, 0,16,16,22, 0, 0,16, - 16, 0,22, 0,17,17, 0,22, 0, 0, 0, 0, 0, 0,15,15, - 20,19, 0,18,18, 0, 0, 0,17,18, 0, 0, 0,17,17, 0, - 0, 0, 0, 0, 0, 0, 0,15,15, 0,22, 0,20,18, 0, 0, - 0,18,18,22,22, 0,11,11,14,14, 0,12,12,14,14, 0, - 12,12,15,15, 0,13,13,14,14, 0,14,14,17,16, 0,12, - 12,16,16, 0,14,14,16,16, 0,11,11,15,15, 0,13,13, - 16,16, 0,13,13,15,15, 0,12,12,15,15, 0,15,14,16, - 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,15,15, - 0,15,15,17,17, 0, 0, 0,19,18, 0,13,12,15,15, 0, - 16,16, 0, 0, 0,14,14,15,15, 0,14,14,16,17, 0,22, - 0,18,18, 0,13,13,15,15, 0,17,17, 0, 0, 0,14,14, - 15,15, 8, 8, 8,16,16,12,10,10,16,16,13, 9, 9,16, - 16, 0,14,14,17,17, 0,14,14,17,16,12,10,10,18,17, - 14,11,11,18,18,14, 9,10,16,16, 0,13,13,18,19, 0, - 14,13,16,16,12, 9, 9,16,16,17,13,13,17,17,14, 9, - 9,15,15, 0,14,14,19,20, 0,13,13,15,15, 0,15,15, - 18,19, 0, 0,22,22,22, 0,13,13,17,17, 0,16,16,19, - 21, 0,14,14,16,16, 0,14,14,18,18, 0, 0, 0, 0, 0, - 0,13,13,16,16, 0,18,18, 0, 0, 0,15,15,16,16, 8, - 7, 7,14,14,12,10,10,15,15,13,10,10,15,14, 0,22, - 0,18,18, 0,22, 0,18,18,12,10,10,16,15,15,12,12, - 17,17,14,11,11,15,15, 0,20,21,19,18, 0, 0, 0,17, - 18,13,11,11,15,15,16,13,13,18,18,15,11,11,14,14, - 0,22,21,19,19, 0,21,22,18,18, 0,22,22,20,18, 0, - 0, 0, 0, 0, 0,22,19,17,17, 0, 0, 0,22,21, 0, 0, - 22,19,17, 0, 0,22,19,19, 0, 0, 0, 0, 0, 0,22,21, - 18,17, 0, 0, 0,22, 0, 0, 0, 0,19,19, 0,10,10,14, - 14, 0,11,11,15,14, 0,11,11,15,15, 0,14,14,15,14, - 0,15,15,16,16, 0,11,11,16,16, 0,13,13,16,16, 0, - 11,11,15,15, 0,14,14,17,16, 0,14,14,15,15, 0,11, - 11,16,16, 0,14,13,15,15, 0,11,11,15,15, 0,15,15, - 17,17, 0,14,14,15,14, 0,16,16,17,17, 0, 0,22,18, - 18, 0,13,13,15,15, 0,17,17,22, 0, 0,15,15,15,14, - 0,15,16,16,17, 0, 0,22,18,19, 0,13,13,15,15, 0, - 20,18,21, 0, 0,15,15,14,14, 0,11,11,13,13, 0,12, - 12,16,16, 0,12,12,16,15, 0,15,16,22,22, 0,17,17, - 0, 0, 0,12,12,16,16, 0,14,14,18,18, 0,11,11,16, - 16, 0,15,16,22,20, 0,16,16, 0,22, 0,12,12,16,16, - 0,15,15,18,20, 0,11,11,16,16, 0,15,15, 0, 0, 0, - 16,16, 0, 0, 0,17,17,22, 0, 0, 0, 0, 0, 0, 0,15, - 15, 0,21, 0,18,18, 0, 0, 0,17,16, 0, 0, 0,17,17, - 22,22, 0, 0, 0, 0, 0, 0,15,15,21, 0, 0,20,22, 0, - 0, 0,18,18, 0, 0, 0,12,12,15,15, 0,12,12,15,15, - 0,12,12,16,16, 0,13,13,15,15, 0,15,15,17,17, 0, - 13,12,16,16, 0,14,14,16,16, 0,12,11,16,16, 0,14, - 14,17,17, 0,14,14,16,16, 0,12,12,16,16, 0,15,15, - 17,16, 0,11,11,15,16, 0,14,14,17,17, 0,14,14,16, - 16, 0,15,15,18,18, 0, 0, 0,22,19, 0,13,13,15,16, - 0,16,17, 0, 0, 0,14,14,16,16, 0,15,15,18,17, 0, - 0, 0,20,20, 0,13,13,16,15, 0,17,17,22,22, 0,14, - 14,15,15, 0,11,11,16,16, 0,13,13,16,17, 0,13,13, - 17,18, 0,16,16,17,17, 0,17,17,18,18, 0,12,12,17, - 17, 0,16,15,18,18, 0,12,12,16,16, 0,16,16,18,18, - 0,15,15,17,17, 0,12,12,17,17, 0,16,16,19,18, 0, - 12,12,16,17, 0,16,16,19,19, 0,15,16,16,17, 0,16, - 16,19,17, 0, 0, 0,20,22, 0,13,13,16,16, 0,19,18, - 21, 0, 0,15,15,16,16, 0,16,16,18,18, 0, 0, 0,22, - 21, 0,14,14,16,16, 0,21,19,21,22, 0,16,16,16,16, - 0, 9, 9,14,14, 0,13,13,15,15, 0,14,14,15,15, 0, - 0,20,18,19, 0, 0,22,18,18, 0,12,12,15,15, 0,15, - 15,17,18, 0,14,13,14,14, 0,20, 0,18,18, 0,21, 0, - 18,17, 0,13,13,15,16, 0,17,17,18,18, 0,14,14,15, - 15, 0,22,22,20,19, 0,20,21,18,18, 0,20,22,19,19, - 0, 0, 0, 0, 0, 0,20,20,17,17, 0, 0,22,22,21, 0, - 22, 0,18,18, 0,20,22,19,19, 0, 0, 0, 0, 0, 0,21, - 21,17,18, 0, 0, 0,21,20, 0, 0,22,19,18, 0,18,18, - 15,15, 0,22,21,17,16, 0, 0,22,17,17, 0,20,22,18, - 18, 0, 0,22,20,20, 0,21,19,16,16, 0,21,21,18,18, - 0,19,19,17,17, 0, 0,22,19,19, 0,22,20,17,17, 0, - 21,19,16,16, 0,22,22,19,18, 0,19,20,16,16, 0,22, - 21,19,21, 0,21,22,17,18, 0,21,20,18,18, 0, 0, 0, - 19,20, 0,20,19,16,16, 0,22,22, 0, 0, 0,21,21,17, - 16, 0,22,20,19,18, 0, 0, 0,20,20, 0,20,19,16,16, - 0, 0, 0, 0, 0, 0,21,22,17,17, 0,11,11,13,13, 0, - 13,13,15,16, 0,13,13,16,16, 0,17,18,21, 0, 0,17, - 18, 0, 0, 0,12,12,15,16, 0,15,15,19,18, 0,12,12, - 16,16, 0,17,17,22, 0, 0,17,17, 0,22, 0,12,12,17, - 16, 0,16,16,19,20, 0,12,12,16,16, 0,17,17, 0, 0, - 0,17,17, 0,21, 0,17,16,22, 0, 0, 0, 0, 0, 0, 0, - 15,15,20,22, 0,20,18, 0, 0, 0,18,18, 0, 0, 0,17, - 17,21, 0, 0, 0, 0, 0, 0, 0,15,15,21,22, 0,19,20, - 22, 0, 0,19,18, 0, 0, 0,14,14,18,18, 0,16,16,22, - 20, 0,16,16,22,19, 0,17,17,20,22, 0,19,19, 0, 0, - 0,15,15,20, 0, 0,18,21, 0,20, 0,15,15,21,20, 0, - 18,17, 0, 0, 0,17,17, 0,22, 0,15,15,19,19, 0,19, - 18, 0, 0, 0,15,15,20, 0, 0,18,18,22,22, 0,17,17, - 0,20, 0,18,18, 0, 0, 0, 0,22, 0, 0, 0,15,15,19, - 20, 0,20,19, 0, 0, 0,17,17,20,21, 0,17,18,20,22, - 0, 0, 0, 0,22, 0,15,15,20,20, 0,22,20, 0, 0, 0, - 17,18,20, 0, 0,12,12,17,16, 0,14,14,17,17, 0,13, - 13,17,17, 0,16,16,18,18, 0,17,16,17,17, 0,13,13, - 17,17, 0,15,16,18,18, 0,13,13,16,16, 0,16,16,18, - 18, 0,16,16,17,16, 0,13,13,16,16, 0,17,17,18,17, - 0,12,12,15,16, 0,17,17,19,19, 0,16,16,16,16, 0, - 16,17,19,18, 0, 0, 0,21,22, 0,14,14,16,16, 0,18, - 18, 0,22, 0,16,16,16,16, 0,16,16,18,17, 0, 0, 0, - 21,20, 0,14,14,16,16, 0,21,22,22, 0, 0,16,16,16, - 16, 0, 9, 9,14,13, 0,13,14,15,16, 0,14,13,15,14, - 0,22, 0,18,18, 0,21, 0,17,18, 0,13,13,15,15, 0, - 15,16,18,17, 0,14,14,15,14, 0,20,22,18,18, 0,22, - 21,17,17, 0,13,13,15,15, 0,17,17,19,19, 0,14,14, - 14,14, 0, 0,22,18,18, 0, 0,22,17,17, 0, 0,22,19, - 20, 0, 0, 0, 0, 0, 0,21,20,17,16, 0, 0, 0,21,22, - 0, 0, 0,18,19, 0, 0, 0,18,18, 0, 0, 0, 0, 0, 0, - 22, 0,17,17, 0, 0, 0,20,22, 0, 0, 0,18,19, 0,18, - 19,16,16, 0,22,20,17,17, 0,22,22,17,18, 0,22,22, - 18,17, 0, 0,22,18,19, 0,20,20,17,18, 0, 0,22,19, - 18, 0,22,22,17,17, 0,22, 0,19,19, 0, 0,22,18,18, - 0,20,22,17,17, 0, 0,22,18,18, 0,19,20,17,17, 0, - 22, 0,20,19, 0,22,21,17,17, 0, 0, 0,18,18, 0, 0, - 0,22,19, 0,20, 0,17,17, 0,22, 0, 0,22, 0, 0,20, - 17,18, 0,22, 0,19,19, 0, 0, 0, 0,19, 0,19,21,17, - 17, 0, 0, 0, 0, 0, 0,20,21,17,16, 0,11,11,13,13, - 0,13,13,16,16, 0,13,13,15,16, 0,17,17,21,22, 0, - 17,18, 0, 0, 0,12,12,16,16, 0,15,15,18,18, 0,13, - 13,16,16, 0,17,16,21,21, 0,17,17, 0, 0, 0,13,13, - 16,16, 0,16,16,19,18, 0,13,13,16,16, 0,17,17, 0, - 22, 0,17,18,20,22, 0,17,18, 0, 0, 0, 0, 0, 0, 0, - 0,15,15,20, 0, 0,18,19, 0, 0, 0,17,17, 0, 0, 0, - 18,17,22, 0, 0, 0, 0, 0, 0, 0,15,16,21,20, 0,20, - 20, 0, 0, 0,18,19, 0, 0, 0,15,15,22,22, 0,17,16, - 20,22, 0,17,17,20,22, 0,18,18, 0,21, 0,19,18, 0, - 0, 0,16,16,20,20, 0,19,19,22, 0, 0,15,16,21,22, - 0,18,19,22, 0, 0,17,18, 0, 0, 0,16,16,22, 0, 0, - 19,19, 0,21, 0,15,16,20, 0, 0,18,18, 0,22, 0,18, - 17, 0, 0, 0,18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, - 22,21, 0,20,21, 0, 0, 0,17,18,22, 0, 0,18,18, 0, - 0, 0, 0, 0, 0, 0, 0,16,16,20,19, 0,22,21, 0, 0, - 0,18,18,22,22, -}; - -static const static_codebook _44p2_p5_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p2_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p2_p5_0, - 0 -}; - -static const long _vq_quantlist__44p2_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44p2_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p2_p5_1 = { - 1, 7, - (long *)_vq_lengthlist__44p2_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p2_p5_1, - 0 -}; - -static const long _vq_quantlist__44p2_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p2_p6_0[] = { - 1, 7, 7, 7, 8, 8, 7, 8, 8, 7, 9, 9,10,11,11, 9, - 8, 8, 7, 8, 9,11,11,11, 9, 8, 8, 6, 7, 7,10,10, - 10,10,10,10,10,10,10,14,14,14,12,11,11,10,11,11, - 15,14,14,13,11,11, 6, 6, 6, 8, 5, 5, 8, 7, 7, 8, - 7, 7,11,10,10, 9, 7, 7, 9, 7, 7,12,10,10,10, 7, - 7, 6, 8, 7,12,10,10,12,10,10,11,10,10,15,14,13, - 13,10,10,11,10,10,16,14,14,14,10,10, 7, 7, 7,12, - 11,11,12,11,11,11,11,11,16,14,14,13,12,12,11,11, - 11,17,15,15,14,12,12,10, 9, 9,13,11,11,13,11,11, - 12,11,11,16,14,13,14,11,11,12,11,11,17,15,14,14, - 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,16,13, - 14,13,10,10,11,10,10,17,14,14,14,10,10, 7, 7, 7, - 12,11,11,12,11,11,12,11,11,15,14,15,14,12,12,12, - 11,11,17,15,15,14,12,12,10,10, 9,13,11,11,13,11, - 11,13,11,11,16,14,14,14,11,11,13,11,11,16,15,15, - 15,11,11, -}; - -static const static_codebook _44p2_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44p2_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p2_p6_0, - 0 -}; - -static const long _vq_quantlist__44p2_p6_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p2_p6_1[] = { - 2, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 8, - 7, 7, 8, 8, 8, 9, 9, 9, 9, 8, 8, 6, 7, 7, 9, 8, - 8, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, - 10, 8, 9,10, 8, 8, 7, 6, 6, 8, 6, 6, 9, 6, 6, 9, - 7, 7,10, 8, 8, 9, 6, 6, 9, 7, 7,10, 9, 8, 9, 7, - 7, 7, 7, 7,11, 8, 8,11, 9, 9,10, 9, 9,12, 9, 9, - 12, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7,10, - 9, 9,10, 9, 9,10, 9, 9,11,10,11,11, 9, 9,11, 9, - 9,11,11,11,11, 9, 9,10, 8, 8,11, 9, 9,10, 9, 9, - 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,12,10,10,11, - 9, 9, 8, 8, 8,11, 9, 9,12, 9, 9,11, 9, 9,12, 9, - 9,12, 8, 8,12, 9, 9,12, 9,10,12, 8, 8, 9, 7, 7, - 11, 9, 9,11,10,10,11, 9, 9,11,11,11,11, 9, 9,11, - 10,10,12,11,11,11, 9,10,10, 9, 9,11, 9, 9,11,10, - 10,11,10,10,11,11,11,11, 9, 9,11, 9,10,11,11,11, - 11, 9, 9, -}; - -static const static_codebook _44p2_p6_1 = { - 5, 243, - (long *)_vq_lengthlist__44p2_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p2_p6_1, - 0 -}; - -static const long _vq_quantlist__44p2_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p2_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p2_p7_0 = { - 5, 243, - (long *)_vq_lengthlist__44p2_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p2_p7_0, - 0 -}; - -static const long _vq_quantlist__44p2_p7_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p2_p7_1[] = { - 1, 9, 9, 6, 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10, -}; - -static const static_codebook _44p2_p7_1 = { - 5, 243, - (long *)_vq_lengthlist__44p2_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p2_p7_1, - 0 -}; - -static const long _vq_quantlist__44p2_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p2_p7_2[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p2_p7_2 = { - 1, 25, - (long *)_vq_lengthlist__44p2_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p2_p7_2, - 0 -}; - -static const long _vq_quantlist__44p2_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p2_p7_3[] = { - 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p2_p7_3 = { - 1, 25, - (long *)_vq_lengthlist__44p2_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p2_p7_3, - 0 -}; - -static const long _huff_lengthlist__44p2_short[] = { - 4, 4,12, 9, 8,12,15,17, 4, 2,11, 6, 5, 9,13,15, - 11, 7, 8, 7, 7,10,14,13, 8, 5, 7, 5, 5, 8,12,12, - 8, 4, 7, 4, 3, 6,11,12,11, 8, 9, 7, 6, 8,11,12, - 15,13,14,12, 9, 7,10,13,16,12,17,12, 7, 5, 8,11, -}; - -static const static_codebook _huff_book__44p2_short = { - 2, 64, - (long *)_huff_lengthlist__44p2_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p3_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44p3_l0_0[] = { - 1, 4, 4, 8, 8, 8, 8, 9, 9,10,10,10,10, 4, 6, 5, - 8, 7, 9, 9, 9, 9,10, 9,11, 9, 4, 5, 6, 7, 8, 9, - 9, 9, 9, 9,10, 9,10, 8, 9, 8, 9, 8,10, 9,11, 9, - 12,10,12,10, 8, 8, 9, 8, 9, 9,10, 9,11,10,12,10, - 12, 9,10,10,11,10,12,11,12,11,12,12,12,12, 9,10, - 10,11,11,11,11,11,12,12,12,12,12,10,11,11,12,12, - 12,12,12,12,12,12,12,12,10,11,11,12,12,12,12,12, - 12,12,12,12,12,11,12,12,12,12,12,13,12,13,12,13, - 12,12,11,12,12,12,12,12,12,13,12,12,12,12,12,12, - 12,12,13,13,12,13,12,13,12,13,12,12,12,13,12,13, - 12,13,12,13,12,13,12,12,12, -}; - -static const static_codebook _44p3_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44p3_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p3_l0_0, - 0 -}; - -static const long _vq_quantlist__44p3_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p3_l0_1[] = { - 3, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, - 5, 6, 5, 6, 5, 6, 5, 6, 5, -}; - -static const static_codebook _44p3_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44p3_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p3_l0_1, - 0 -}; - -static const long _vq_quantlist__44p3_l1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p3_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p3_l1_0 = { - 2, 9, - (long *)_vq_lengthlist__44p3_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p3_l1_0, - 0 -}; - -static const long _huff_lengthlist__44p3_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p3_lfe = { - 2, 4, - (long *)_huff_lengthlist__44p3_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44p3_long[] = { - 3, 4,13, 9, 9,12,15,17, 4, 2,18, 5, 7,10,14,18, - 11, 8, 6, 5, 6, 8,11,14, 8, 5, 5, 3, 5, 8,11,13, - 9, 6, 7, 5, 5, 7, 9,10,11,10, 9, 8, 6, 6, 8,10, - 14,14,11,11, 9, 8, 9,10,17,17,14,13,10, 9,10,10, -}; - -static const static_codebook _huff_book__44p3_long = { - 2, 64, - (long *)_huff_lengthlist__44p3_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p3_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p3_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p3_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44p3_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p3_p1_0, - 0 -}; - -static const long _vq_quantlist__44p3_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p3_p2_0[] = { - 3, 7, 7, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, - 11,11, 0, 0, 0, 0, 0, 0, 0, 0,10, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,10,11, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, - 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,12,12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, - 5, 5, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, - 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 0, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, 9, 9, 0, - 0, 0,10,10, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, - 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0,11,12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, - 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, 0, - 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 7, 7, - 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, - 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 7, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,11,11, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 7, - 7, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,10,10, 0, 0, 0, 9, 9, 0, 0, 0,10,10, - 0, 0, 0,11,12, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,11, - 11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,12,12, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, - 9, 9, 0, 0, 0,10,10, 0, 0, 0,12,12, 0, 0, 0, 0, - 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, - 10,10, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -}; - -static const static_codebook _44p3_p2_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p3_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p3_p2_0, - 0 -}; - -static const long _vq_quantlist__44p3_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p3_p3_0[] = { - 1, 5, 5, 5, 8, 8, 0, 8, 8, 6, 9, 9, 8,10,10, 0, - 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 4, 7, 7, 6,10, - 10, 0,12,12, 7,11,11, 9,12,12, 0,12,12, 0,13,13, - 0,15,15, 0,12,12, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, - 8, 8, 0,10,10, 0, 7, 7, 0, 8, 8, 0,11,11, 0, 7, - 7, 5, 7, 7, 9, 9, 9, 0,11,10, 9, 9, 9,11,12,12, - 0,10,10, 0,11,11, 0,13,13, 0,11,11, 6, 7, 7, 9, - 10,10, 0,12,12,10,11,11,11,12,12, 0,12,12, 0,13, - 13, 0,15,15, 0,12,12, 0,10,10, 0,11,11, 0,11,11, - 0,12,12, 0,13,13, 0,11,11, 0,12,12, 0,15,15, 0, - 11,11, 0, 8, 8, 0,10,10, 0,12,12, 0,11,11, 0,12, - 12, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0, 7, 7, - 0,10,10, 0,12,12, 0,10,10, 0,12,13, 0,12,12, 0, - 13,13, 0,14,14, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p3_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44p3_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p3_p3_0, - 0 -}; - -static const long _vq_quantlist__44p3_p3_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p3_p3_1[] = { - 3, 4, 4, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0,10,10, 0, - 8, 8, 0, 9, 9, 0,10,10, 0, 8, 8, 0, 7, 7, 0, 8, - 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, - 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 6, 6, 0, 7, 7, 0, - 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,10,10, 0, 6, - 5, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 9, 9, - 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 6, 6, 0, - 9,10, 0,10,10, 0,10,10, 0,11,11, 0, 9, 9, 0,10, - 10, 0,11,11, 0, 9, 9, 0, 8, 8, 0, 8, 8, 0, 8, 8, - 0, 9, 9, 0, 9, 9, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0, - 7, 7, 0, 8, 8, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, 9, - 9, 0, 7, 7, 0, 7, 7, 0, 9, 9, 0, 6, 6, 0, 6, 6, - 0,10,10, 0,10,10, 0,10,10, 0,12,12, 0, 9, 9, 0, - 10,10, 0,12,12, 0, 9, 9, 0, 8, 8, 0, 7, 7, 0, 8, - 8, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, - 0, 7, 7, -}; - -static const static_codebook _44p3_p3_1 = { - 5, 243, - (long *)_vq_lengthlist__44p3_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p3_p3_1, - 0 -}; - -static const long _vq_quantlist__44p3_p4_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p3_p4_0[] = { - 1, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8,10,11,11, 9, - 8, 8, 8, 8, 8,11,11,11,10, 8, 8, 5, 7, 7, 9,11, - 11,10,11,11,10,11,11,12,13,14,11,12,12,10,11,11, - 13,14,14,12,12,12, 5, 6, 6, 8, 6, 6, 8, 7, 7, 8, - 7, 7,11,10,10,10, 7, 7, 9, 7, 7,12,11,11,11, 7, - 7, 7, 7, 7,11,10,10,12,10,10,11,10,10,15,13,13, - 13,10,10,12,11,11,15,13,13,14,11,11, 7, 7, 7,11, - 11,11,12,11,11,12,11,11,14,14,14,14,12,12,12,12, - 12,16,15,15,14,12,12, 0,10,10, 0,11,11, 0,11,12, - 0,11,11, 0,14,14, 0,11,11, 0,12,12, 0,15,15, 0, - 11,11, 8, 8, 8,12,10,10,12,10,10,13,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, - 12,11,11,13,11,11,12,11,11,15,14,14,14,12,12,13, - 12,12,15,14,14,15,12,12, 0,11,11, 0,12,12, 0,12, - 12, 0,12,12, 0,15,15, 0,12,12, 0,13,13, 0,14,15, - 0,12,12, -}; - -static const static_codebook _44p3_p4_0 = { - 5, 243, - (long *)_vq_lengthlist__44p3_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p3_p4_0, - 0 -}; - -static const long _vq_quantlist__44p3_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p3_p4_1[] = { - 3, 4, 5, 8, 8,12,10,10,12,12,12,10,10,12,12,13, - 11,11,12,12,13,12,12,12,12,13,10,10,13,13,13,13, - 13,13,13,13,10,10,13,13,13,11,11,13,13,14,13,13, - 12,12,13,10,10,13,13,13,13,13,13,13,13,10,10,12, - 12,13,11,11,13,13,13,13,13,12,12,13,12,12,13,13, - 13,13,13,13,13,14,11,11,12,12,14,12,12,13,12,14, - 14,14,12,12,13,14,14,13,13,14,13,13,13,13,14,14, - 14,12,12,14,13,13,13,13,14,14,14,12,12,12, 8, 8, - 11,11,12,12,12,11,11,12,11,11,10,10,13,12,12,10, - 10,13,12,12,10,10,13,12,12,12,12,14,12,12,12,12, - 13,13,13,11,11,14,12,12,11,11,14,12,12,12,12,14, - 12,12,12,12,13,12,12,12,12,13,13,13,11,11,14,12, - 12,11,11,14,12,12,12,12,14,13,13,12,12,14,12,12, - 12,11,14,13,13,11,11,14,13,12,11,11,14,13,13,11, - 11,14,13,13,12,12,14,12,12,12,12,15,13,13,12,12, - 14,12,12,11,11,14,13,13,11,11,12, 9, 9,10,10,12, - 7, 7,11,11,12, 9, 9,12,12,13,10,10,10,10,14,14, - 14,11,11,13, 9, 9,12,12,14,14,14,12,12,13, 8, 8, - 11,11,14, 9, 9,12,12,14,14,14,11,11,13, 9, 9,12, - 12,14,14,14,12,12,14, 8, 8,11,11,14, 9, 9,12,12, - 14,14,14,11,11,14,10,10,12,12,14,14,14,13,13,14, - 9, 9,11,11,14,10,10,12,12,14,14,14,11,11,14,14, - 15,12,12,15,14,14,14,14,15,14,14,11,11,14,14,14, - 12,12,14,14,14,11,11,14,11,11,10,10,14,10,10,10, - 10,14,10,10,10,10,15,11,11, 9, 9,14,12,12, 9, 9, - 15,11,11,11,11,15,13,13,11,11,15,10,10,10,10,15, - 11,11,10,10,15,13,13,11,11,15,11,11,11,11,15,13, - 13,11,11,15,10,10,10,10,15,11,11,10,10,15,13,13, - 11,11,15,12,12,11,11,15,13,13,11,11,15,11,11,10, - 10,15,12,12,10,10,15,13,13,10,10,15,14,14,11,11, - 15,13,13,11,11,15,14,14,10,11,15,13,13,10,10,15, - 13,14,10,10,14,13,13,10,10,14,13,13,10,10,14,13, - 13,10,10,14,13,13, 9, 9,14,14,14, 9, 9,15,14,14, - 11,11,15,14,14,10,10,15,14,14,10,10,15,14,14,11, - 11,15,14,14,10,10,15,14,14,11,11,15,14,14,10,10, - 14,14,14,10,10,15,14,14,10,10,14,14,14,10,10,15, - 14,14,11,11,15,14,14,11,11,14,14,14,10,10,15,14, - 14,10,10,14,14,14, 9, 9,15,15,15,11,11,15,14,14, - 12,12,15,15,14,10,10,15,14,14,10,10,14,15,15, 9, - 9,14,10,10,12,12,17, 9, 9,12,12,17,10,10,13,13, - 17,11,11,12,12,18,14,14,12,12,17,10,10,13,13,17, - 14,14,12,12,17, 9, 9,12,12,17,11,11,12,12,17,14, - 14,12,12,18,10,10,13,13,18,14,14,13,13,18, 9, 9, - 12,12,18,10,10,13,13,18,14,14,12,12,18,11,11,13, - 13,18,14,14,13,13,18,10,10,12,12,17,11,11,12,12, - 17,14,14,12,12,18,15,15,13,13,18,14,14,14,14,18, - 15,15,12,12,18,14,14,12,12,18,15,15,12,12,13, 7, - 7,11,11,14,15,15,11,11,14,15,15,12,12,14,15,15, - 11,11,15,15,15,11,11,14,15,15,12,12,14,15,15,12, - 12,14,15,15,11,11,14,15,15,11,11,15,15,15,12,12, - 14,15,15,12,12,14,15,15,12,12,14,15,15,11,11,14, - 15,15,11,11,15,15,15,12,12,15,15,15,12,12,14,15, - 15,12,12,14,15,14,12,12,14,15,15,11,11,15,14,14, - 12,12,15,15,15,12,12,15,16,16,12,12,15,15,15,12, - 12,15,15,15,12,12,15,15,15,12,12,13,13,13,11,10, - 14,14,15,11,11,14,14,14,12,12,15,14,14,10,10,15, - 15,15,11,11,14,15,15,12,12,14,14,14,11,11,14,15, - 15,11,11,14,15,15,12,12,15,15,15,11,11,14,15,15, - 12,12,14,14,14,12,12,14,15,15,11,11,14,15,15,12, - 12,15,15,15,11,11,15,15,15,12,12,15,14,14,12,12, - 14,15,15,11,11,14,15,15,11,11,15,15,15,10,10,15, - 15,16,12,12,15,15,15,14,14,15,15,15,11,11,15,15, - 15,12,12,15,15,15,11,11,14,11,11,10,10,15, 9, 9, - 12,12,15,10,10,12,12,15,11,11,11,11,15,14,14,12, - 12,15,10,10,13,13,15,14,14,12,12,15, 9, 9,12,12, - 15,10,10,13,13,15,13,13,12,11,15,10,10,12,12,15, - 14,14,12,12,15, 9, 9,11,11,15,11,11,12,12,15,13, - 13,11,11,15,11,11,13,13,15,13,14,13,14,15,11,11, - 11,11,15,11,11,12,12,15,14,14,11,11,15,14,14,13, - 13,15,14,14,20,20,15,14,14,12,12,15,14,14,12,12, - 15,14,14,11,11,14,13,13,10,10,14,13,13,12,12,14, - 14,13,12,12,15,14,14,12,12,15,14,14,11,11,15,14, - 14,12,12,15,14,14,13,13,15,14,14,12,11,15,14,14, - 11,11,15,14,14,13,13,15,14,14,12,12,15,14,14,13, - 13,15,14,14,12,11,15,14,14,12,12,15,14,14,13,13, - 15,14,14,13,13,15,14,14,12,12,15,14,14,12,12,15, - 14,14,12,12,15,15,15,13,13,15,15,15,13,13,15,14, - 14,13,13,15,15,15,13,13,15,14,15,12,12,15,15,15, - 13,13,14,10,10,12,13,17, 9, 9,12,12,17,10,10,13, - 13,17,11,11,12,12,18,14,14,12,12,18,10,10,13,13, - 18,14,14,12,12,17, 9, 9,12,12,18,10,11,13,13,18, - 14,14,12,12,17,10,10,12,12,17,14,14,12,12,17, 9, - 9,12,12,17,11,11,12,12,17,14,14,12,12,18,11,11, - 12,12,18,14,14,13,13,18,11,11,12,12,18,11,11,12, - 12,18,14,14,12,12,18,15,15,12,12,18,14,14,13,13, - 18,15,15,12,12,17,14,14,12,12,17,15,15,12,12,13, - 7, 7,11,11,14,15,15,11,11,14,15,15,11,11,14,15, - 14,12,12,15,15,15,12,11,14,15,15,12,12,14,15,15, - 12,12,14,15,15,11,11,14,15,15,11,11,15,15,15,13, - 13,14,15,15,11,11,14,15,15,13,12,14,15,15,11,11, - 14,15,15,11,11,15,15,15,13,13,14,15,15,12,12,15, - 15,15,12,12,15,15,15,11,11,15,15,15,11,11,15,15, - 15,12,12,15,15,15,13,13,15,16,16,12,12,15,15,15, - 12,13,15,15,15,12,12,15,15,15,12,12,13,13,13,11, - 11,14,14,14,11,11,14,14,14,12,12,14,14,14,10,10, - 15,14,14,11,11,14,15,15,12,12,14,14,14,12,12,14, - 15,15,11,11,14,15,14,12,12,15,14,14,11,11,14,15, - 15,12,12,14,14,14,11,11,14,15,15,11,11,14,14,14, - 12,12,15,15,14,11,11,15,15,15,12,12,15,14,14,12, - 12,14,15,15,11,11,14,15,14,11,11,15,15,15,10,10, - 15,15,15,12,12,15,14,14,14,13,15,15,15,11,11,15, - 15,15,11,11,15,15,15,10,10,14,11,11,10,10,15, 9, - 9,12,12,15,10,10,12,12,15,11,11,11,11,15,14,14, - 12,12,15,10,10,13,13,15,13,13,12,12,15, 9, 9,12, - 12,15,11,11,13,13,15,14,14,12,12,15,10,10,13,13, - 15,13,14,12,12,15, 9, 9,12,12,15,10,10,13,13,15, - 13,13,11,11,15,11,11,13,13,15,14,14,13,13,15,10, - 10,11,11,15,11,11,12,12,15,14,14,11,11,15,14,14, - 13,13,15,14,14,21,20,15,14,14,11,11,15,14,14,12, - 12,15,14,14,11,11,14,13,13,10,10,14,13,13,11,11, - 15,14,14,12,12,15,14,14,12,12,14,14,14,12,12,15, - 14,14,12,12,15,14,14,13,13,14,14,14,11,11,15,14, - 14,11,11,15,14,14,13,13,15,14,14,12,12,15,14,14, - 13,13,14,14,14,11,11,15,14,14,11,11,14,14,14,13, - 13,15,14,14,12,12,15,14,14,12,12,15,14,14,12,12, - 15,14,14,12,12,14,14,14,13,13,15,15,15,13,13,16, - 14,14,12,13,15,15,15,13,13,15,14,14,12,12,15,15, - 15,13,13,15,11,11,13,12,18,10,10,12,12,17,11,11, - 12,12,18,12,12,11,11,18,14,14,12,12,18,11,11,13, - 13,17,14,14,12,12,18,10,10,12,12,18,12,12,12,12, - 18,14,15,12,12,18,11,11,13,13,18,14,14,12,12,17, - 10,10,12,12,18,11,11,12,12,18,15,14,12,12,17,12, - 12,12,12,17,14,14,12,12,17,11,11,11,11,17,12,12, - 12,11,17,15,15,11,11,18,15,15,12,12,18,14,15,13, - 13,18,15,15,11,11,17,15,15,12,12,18,15,15,11,11, - 14, 9, 9,11,11,14,15,15,11,11,15,15,15,11,11,15, - 15,15,12,11,15,15,15,12,12,15,15,15,11,11,15,15, - 15,13,13,14,15,15,11,11,15,15,15,11,11,15,15,15, - 13,13,15,15,15,11,11,15,15,15,13,13,15,15,15,11, - 11,15,15,15,11,11,15,15,15,13,13,15,15,15,12,12, - 15,15,15,13,13,15,15,14,11,11,15,15,15,12,12,15, - 15,15,12,12,16,15,15,13,13,15,16,16,13,13,16,15, - 15,12,12,15,15,15,13,12,15,15,15,12,12,13,12,12, - 11,11,14,14,14,11,11,14,14,14,12,12,15,14,14,11, - 11,15,14,14,12,12,15,14,14,12,12,15,14,14,12,12, - 14,15,15,11,11,15,14,14,12,12,15,14,14,11,11,15, - 14,14,12,12,15,14,14,12,12,14,15,15,11,11,15,14, - 14,12,12,15,14,14,11,11,15,15,15,12,12,15,14,14, - 12,12,15,15,15,11,11,15,14,14,11,11,15,14,15,11, - 11,15,15,15,12,12,15,14,14,13,13,16,15,15,11,11, - 15,14,14,12,12,15,15,15,11,11,14,11,11, 9, 9,15, - 10,10,12,12,14,11,11,12,12,15,12,12,12,12,15,14, - 14,13,13,15,11,11,13,13,15,14,14,13,13,15,10,10, - 12,12,15,12,12,13,13,15,14,14,13,13,15,11,11,12, - 12,15,14,14,13,13,14,10,10,12,12,15,12,12,13,13, - 15,14,14,12,12,15,12,12,13,13,15,14,14,15,15,15, - 11,11,12,12,15,12,12,12,13,15,14,14,12,12,15,15, - 15,14,14,15,14,14,20,20,15,14,14,12,12,15,14,14, - 13,13,15,14,14,12,12,14,13,13,10,10,14,13,13,11, - 11,14,13,13,12,12,14,14,14,12,12,15,14,14,13,13, - 15,14,14,12,12,14,14,14,14,14,14,14,14,11,11,15, - 14,14,12,12,15,14,14,14,14,15,14,14,12,12,14,14, - 14,14,14,14,14,14,11,11,15,14,14,12,12,14,14,14, - 14,14,15,14,14,12,12,15,14,14,13,13,15,14,14,12, - 12,15,14,14,12,12,14,14,14,14,13,15,15,15,14,14, - 15,14,14,13,13,15,15,15,14,14,15,14,14,13,13,15, - 15,15,13,13,14,13,13,13,13,18,15,15,12,12,18,15, - 15,13,12,18,15,16,11,11,18,16,17,12,12,18,15,15, - 13,13,18,17,17,12,12,18,15,15,12,12,17,15,15,12, - 12,18,17,17,12,12,18,15,15,13,13,18,16,17,12,12, - 17,15,15,12,12,18,15,15,12,12,18,16,17,11,12,18, - 16,16,12,12,17,16,17,12,12,18,15,15,11,11,18,15, - 15,12,12,18,17,17,11,11,17,17,17,12,12,18,16,16, - 13,13,18,17,17,11,11,18,16,16,12,12,18,17,17,11, - 11,15,14,14,11,11,16,15,15,11,11,16,15,15,12,12, - 16,15,15,12,12,17,15,15,14,13,16,15,15,12,12,17, - 15,15,14,14,16,15,15,11,11,16,15,15,12,12,18,15, - 15,13,13,16,15,15,11,11,17,15,15,14,14,16,15,15, - 11,11,16,15,15,12,12,17,15,15,13,13,16,15,15,12, - 12,17,16,15,14,14,16,14,15,12,12,16,15,15,12,12, - 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,17, - 15,15,13,13,17,15,15,14,14,18,15,15,13,13,15,12, - 13,11,11,15,14,14,12,12,16,14,14,12,12,16,14,14, - 12,12,16,14,14,12,12,16,14,14,13,12,17,14,14,13, - 13,16,15,15,12,12,16,14,14,12,12,17,14,14,12,12, - 16,14,14,12,12,17,14,14,13,13,15,15,15,12,12,16, - 14,14,12,12,17,14,14,12,12,17,15,15,12,12,17,14, - 14,13,13,16,15,15,12,12,16,14,14,12,12,17,15,15, - 12,12,18,15,15,13,13,17,14,14,13,13,17,15,15,12, - 12,17,14,14,12,12,17,15,15,12,12,14,15,15, 9, 9, - 15,15,15,12,12,15,15,15,13,13,15,15,15,14,14,15, - 15,15,19,19,15,15,16,13,13,15,15,16,19,20,15,15, - 15,13,12,15,16,16,14,14,15,15,15,19,19,15,15,15, - 13,13,15,16,15,20,19,14,15,15,13,13,15,15,15,14, - 14,15,15,15,19,19,15,15,15,14,14,15,16,16,19,20, - 15,15,15,14,14,15,15,15,14,14,15,15,15,19,19,15, - 15,15,20,19,15,16,16,20,19,15,15,15,19,19,15,16, - 16,20,20,15,15,15,19,20,14,13,13,10,10,14,14,14, - 11,11,14,14,14,12,12,15,14,14,13,13,15,14,14,19, - 20,15,14,14,12,12,14,14,14,20,19,14,14,14,11,11, - 15,14,14,12,12,15,14,14,20,20,15,14,14,12,12,14, - 14,14,20,19,14,14,14,11,11,15,14,14,12,12,15,14, - 14,19,20,15,14,14,13,13,15,14,14,22,19,15,15,14, - 12,12,15,14,14,13,13,14,15,15,22,20,15,15,15,20, - 20,15,14,14,21,20,15,15,15,20,21,15,14,14,20,20, - 14,15,15,20,20, -}; - -static const static_codebook _44p3_p4_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p3_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p3_p4_1, - 0 -}; - -static const long _vq_quantlist__44p3_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p3_p5_0[] = { - 2, 6, 6,14,14, 6, 7, 7,14,14, 7, 7, 7,15,15, 0, - 12,12,15,15, 0,13,13,15,15, 7, 8, 8,15,15,10,10, - 10,16,16, 9, 8, 8,15,15, 0,13,13,18,17, 0,13,13, - 16,16, 8, 8, 8,15,15,12,11,11,16,16, 9, 8, 8,15, - 15, 0,13,13,18,18, 0,13,13,16,16, 0,14,14,17,17, - 0,20, 0,19,20, 0,12,12,16,16, 0,16,16,20,22, 0, - 14,14,16,16, 0,14,14,17,17, 0,20,22,20,19, 0,13, - 13,15,16, 0,17,18, 0,21, 0,15,15,16,16, 5, 7, 7, - 13,13, 8, 9, 9,14,14,10,10,10,14,14, 0,20,22,18, - 18, 0,22,21,18,17, 9,10,10,14,14,12,12,12,17,17, - 12,10,10,14,14, 0, 0,20,17,17, 0,22,21,17,18,11, - 10,10,14,14,14,13,13,18,18,12,11,11,14,14, 0,22, - 21,18,19, 0,20, 0,17,17, 0,22, 0,18,18, 0, 0, 0, - 0, 0, 0,20,20,17,17, 0,22, 0,22,21, 0,21, 0,19, - 18, 0,22,22,18,18, 0, 0, 0, 0, 0, 0,21, 0,17,17, - 0,22, 0,20,20, 0, 0, 0,19,18, 6, 6, 6,12,12, 8, - 6, 6,10,10, 8, 6, 6,13,12, 0,10,10,11,11, 0,11, - 11,13,13, 8, 7, 7,13,13,11, 9, 9,13,13,10, 6, 6, - 12,12, 0,10,10,14,14, 0,10,10,13,13, 9, 7, 7,13, - 13,12,10,10,13,13,10, 6, 6,12,12, 0,11,11,15,15, - 0,10,10,13,13, 0,12,12,15,14, 0,19,20,16,17, 0, - 9, 9,13,13, 0,14,14,20,21, 0,12,11,13,12, 0,12, - 12,15,14, 0,20,19,17,17, 0,10,10,12,13, 0,15,15, - 22,21, 0,12,12,12,13, 0,10,10,12,12, 0,11,11,15, - 15, 0,11,11,15,15, 0,15,15,22,22, 0,16,17, 0, 0, - 0,11,11,15,15, 0,14,14,18,18, 0,11,11,16,16, 0, - 16,15, 0,21, 0,16,16, 0, 0, 0,12,12,15,15, 0,14, - 14,19,19, 0,11,11,15,15, 0,15,15,22, 0, 0,16,16, - 22, 0, 0,16,16, 0,21, 0, 0, 0, 0, 0, 0,15,15,19, - 20, 0,18,18, 0, 0, 0,17,17, 0, 0, 0,17,17, 0, 0, - 0, 0, 0, 0, 0, 0,16,15,22,21, 0,20,20, 0, 0, 0, - 18,18, 0, 0, 0,10,10,12,12, 0,10,10,11,11, 0,11, - 11,12,12, 0,11,11, 9, 9, 0,13,12,12,12, 0,11,11, - 13,13, 0,13,13,12,12, 0,10,10,12,12, 0,13,12,13, - 13, 0,12,12,12,12, 0,11,11,13,13, 0,13,13,12,12, - 0,10,10,12,12, 0,13,13,14,13, 0,12,12,12,12, 0, - 14,13,13,14, 0,20,21,15,15, 0,11,11,12,12, 0,15, - 16,20,20, 0,12,13,10,10, 0,13,13,14,13, 0,20,20, - 15,15, 0,11,11,12,12, 0,16,17,21,21, 0,13,13,11, - 11, 6, 7, 7,16,15,11, 9, 9,14,15,12, 9, 9,16,16, - 0,13,13,15,15, 0,14,14,17,17,10, 9, 9,16,16,14, - 12,12,16,16,12, 9, 9,15,15, 0,13,13,17,18, 0,13, - 13,15,15,12,10,10,17,17,15,12,12,17,17,13, 9, 9, - 16,16, 0,13,13,18,19, 0,14,14,16,16, 0,15,15,18, - 18, 0, 0, 0,20,19, 0,12,12,17,16, 0,16,17, 0,21, - 0,14,15,16,16, 0,15,15,18,18, 0, 0,22,19,21, 0, - 13,13,16,16, 0,18,17,22,22, 0,15,15,16,16, 7, 7, - 7,13,13,11,10,10,15,15,12,10,10,14,14, 0,21, 0, - 18,17, 0,21,22,18,18,11,10,10,15,15,14,12,12,17, - 17,14,11,11,14,14, 0,21,20,18,18, 0,22,21,18,17, - 12,11,10,16,16,16,14,14,17,19,14,11,11,15,15, 0, - 0,22,19,19, 0,21,22,18,18, 0,21, 0,18,19, 0, 0, - 0,22, 0, 0,22,21,17,17, 0, 0, 0,20,22, 0, 0,21, - 18,18, 0, 0, 0,19,20, 0, 0, 0, 0, 0, 0, 0,21,17, - 17, 0, 0, 0,22,21, 0, 0, 0,19,19,10, 9, 9,14,13, - 13,10,10,12,12,13,10,10,14,14, 0,13,13,12,12, 0, - 15,14,16,15,13,10,10,14,14,15,12,12,14,14,15,10, - 10,14,14, 0,14,14,15,15, 0,14,13,14,14,13,10,10, - 15,15,17,13,13,15,15,14,10,10,14,14, 0,14,14,15, - 16, 0,14,14,15,15, 0,15,15,16,16, 0,21,22,17,18, - 0,12,12,14,14, 0,17,17,20,21, 0,14,14,14,14, 0, - 15,15,16,16, 0,21,22,18,18, 0,13,13,14,14, 0,18, - 18,22, 0, 0,15,15,14,14, 0,11,11,13,13, 0,12,12, - 16,15, 0,12,12,16,16, 0,16,16, 0, 0, 0,16,17, 0, - 22, 0,12,12,16,16, 0,14,14,17,18, 0,11,11,16,16, - 0,15,15, 0,21, 0,16,16,21,22, 0,12,12,16,16, 0, - 15,15,19,19, 0,12,12,17,16, 0,16,16,21,22, 0,16, - 16, 0, 0, 0,17,17, 0,22, 0, 0, 0, 0, 0, 0,15,15, - 19,20, 0,17,19, 0, 0, 0,17,17,22, 0, 0,17,17, 0, - 22, 0, 0, 0, 0, 0, 0,15,15,21, 0, 0,19,20, 0, 0, - 0,19,18,22, 0, 0,11,12,14,14, 0,11,11,14,14, 0, - 12,12,15,15, 0,13,13,13,13, 0,14,14,16,16, 0,12, - 12,15,15, 0,14,14,16,15, 0,11,11,15,15, 0,13,13, - 16,16, 0,13,13,15,15, 0,12,12,15,15, 0,15,14,16, - 16, 0,11,11,15,15, 0,14,14,17,17, 0,13,13,15,15, - 0,15,15,16,16, 0, 0, 0,18,18, 0,12,12,14,14, 0, - 16,16,22, 0, 0,14,14,15,15, 0,15,15,16,17, 0,21, - 22,18,18, 0,13,13,15,14, 0,18,17,22, 0, 0,14,14, - 15,15, 8, 8, 8,16,15,12,10,10,16,15,12,10,10,16, - 16, 0,14,14,16,17, 0,14,14,17,16,12,10,10,17,18, - 14,12,12,18,18,14,10,10,16,16, 0,14,14,18,18, 0, - 14,14,16,16,12, 9, 9,16,16,17,13,13,16,17,14, 9, - 9,15,15, 0,14,14,18,19, 0,13,13,15,15, 0,15,15, - 18,19, 0, 0, 0,22,21, 0,13,13,16,16, 0,16,16,22, - 0, 0,15,15,16,16, 0,14,14,18,17, 0, 0, 0,20, 0, - 0,13,13,16,16, 0,18,18, 0, 0, 0,15,15,16,16, 8, - 7, 7,13,13,12,10,10,15,15,12,10,10,14,14, 0,22, - 22,19,18, 0, 0, 0,18,18,12,10,10,15,15,14,13,13, - 17,17,14,11,11,15,15, 0,19,20,18,18, 0,22,21,17, - 18,13,11,11,15,15,16,13,13,18,18,14,11,11,14,15, - 0,22,21,20,19, 0,22,21,17,17, 0, 0,22,19,18, 0, - 0, 0, 0, 0, 0,22,20,17,17, 0, 0, 0,21,20, 0, 0, - 0,19,17, 0, 0,22,19,19, 0, 0, 0, 0, 0, 0,22,20, - 18,17, 0, 0, 0, 0, 0, 0, 0, 0,18,18, 0,10,10,14, - 14, 0,11,11,14,14, 0,11,11,15,15, 0,14,14,14,14, - 0,15,15,16,16, 0,11,11,16,16, 0,13,13,16,16, 0, - 11,11,15,15, 0,14,14,16,16, 0,14,14,15,15, 0,11, - 11,15,15, 0,13,13,15,15, 0,10,10,15,15, 0,15,15, - 17,17, 0,14,14,14,14, 0,16,16,16,16, 0, 0,22,19, - 19, 0,13,13,14,14, 0,17,17, 0, 0, 0,15,15,14,14, - 0,16,16,17,17, 0, 0,22,18,18, 0,13,13,14,14, 0, - 21,18, 0, 0, 0,15,15,14,14, 0,11,11,13,13, 0,12, - 12,15,15, 0,12,12,16,15, 0,16,16, 0, 0, 0,17,17, - 22,22, 0,12,12,16,16, 0,14,14,18,18, 0,11,12,16, - 16, 0,15,16, 0,21, 0,16,16,22,21, 0,12,12,16,16, - 0,15,15,19,20, 0,11,12,16,16, 0,15,15,20,22, 0, - 16,16, 0,22, 0,17,17,22, 0, 0, 0, 0, 0, 0, 0,15, - 15,21,22, 0,19,18, 0, 0, 0,17,17, 0, 0, 0,17,17, - 0,22, 0, 0, 0, 0, 0, 0,16,15,22, 0, 0,19,19, 0, - 0, 0,17,18, 0, 0, 0,12,12,15,15, 0,12,12,15,15, - 0,12,12,15,15, 0,13,13,14,14, 0,15,15,16,17, 0, - 12,12,16,16, 0,14,14,16,16, 0,12,11,15,16, 0,14, - 14,16,17, 0,14,14,16,16, 0,13,12,16,16, 0,15,15, - 16,16, 0,11,11,15,15, 0,14,14,16,16, 0,14,14,15, - 15, 0,15,15,18,17, 0, 0,22, 0,20, 0,13,13,15,15, - 0,16,17,22,22, 0,14,14,15,15, 0,15,15,17,18, 0, - 20, 0,19,19, 0,13,13,15,15, 0,18,18,22, 0, 0,14, - 14,15,15, 0,11,11,16,16, 0,14,14,17,16, 0,13,13, - 17,17, 0,16,16,17,17, 0,17,17,18,19, 0,12,12,16, - 17, 0,15,15,18,18, 0,12,12,16,16, 0,16,16,19,18, - 0,16,16,17,16, 0,12,13,17,17, 0,17,16,18,17, 0, - 13,12,16,16, 0,16,16,18,19, 0,16,16,16,17, 0,16, - 16,18,18, 0,22, 0,22,22, 0,13,13,16,16, 0,19,18, - 22,20, 0,16,15,16,16, 0,16,17,18,18, 0, 0, 0,22, - 20, 0,14,14,16,16, 0,19,19, 0, 0, 0,16,16,16,16, - 0, 9, 9,13,13, 0,13,13,15,15, 0,14,14,15,15, 0, - 0,22,17,18, 0,22, 0,18,19, 0,12,12,15,15, 0,15, - 16,17,17, 0,14,14,14,14, 0,22, 0,18,18, 0,21,22, - 17,17, 0,13,13,15,15, 0,17,17,17,18, 0,14,14,15, - 15, 0,22,21,21,19, 0,20,21,17,17, 0,21,21,19,18, - 0, 0, 0, 0, 0, 0,21,21,17,17, 0, 0, 0,22,22, 0, - 0,22,19,18, 0, 0,21,19,18, 0, 0, 0, 0,22, 0,19, - 20,17,17, 0, 0, 0, 0,22, 0, 0, 0,19,18, 0,19,19, - 15,16, 0,21,19,16,17, 0, 0,21,17,17, 0, 0,22,17, - 17, 0,22,22,18,19, 0,20,20,16,16, 0, 0,22,18,18, - 0,20,19,16,17, 0,22,21,20,19, 0, 0,21,17,17, 0, - 21,20,17,17, 0, 0, 0,18,18, 0,19,19,17,16, 0,22, - 0,19,19, 0,21,22,17,18, 0, 0,22,19,18, 0, 0, 0, - 19,20, 0,19,19,16,16, 0,22,22,22, 0, 0,20,22,16, - 16, 0,22,20,18,19, 0, 0, 0,20,19, 0,20,20,16,16, - 0, 0, 0, 0, 0, 0,22,20,17,16, 0,11,11,13,13, 0, - 14,13,15,15, 0,13,13,16,15, 0,18,17,21, 0, 0,18, - 18,21, 0, 0,12,12,15,15, 0,15,16,17,18, 0,12,12, - 15,15, 0,17,17,22,20, 0,17,18,22, 0, 0,12,12,17, - 16, 0,16,17,19,19, 0,13,13,16,16, 0,17,17, 0,22, - 0,17,17, 0,21, 0,18,18,20,22, 0, 0, 0, 0, 0, 0, - 15,15,21,20, 0,20,19, 0, 0, 0,18,18,22, 0, 0,17, - 17,22, 0, 0, 0, 0, 0, 0, 0,15,16,20,22, 0,20,21, - 0, 0, 0,19,18, 0, 0, 0,15,15,19,19, 0,17,16,20, - 20, 0,16,17,20,21, 0,18,17, 0, 0, 0,19,19, 0, 0, - 0,15,15,21,19, 0,19,19, 0, 0, 0,15,15,22,22, 0, - 18,18, 0,22, 0,17,18,22,21, 0,15,15,20,19, 0,19, - 19, 0, 0, 0,15,15,20,22, 0,18,19,20, 0, 0,18,17, - 21,21, 0,18,18,19,22, 0, 0, 0, 0, 0, 0,15,15,20, - 19, 0,19,19, 0, 0, 0,18,18,21,22, 0,18,18,22, 0, - 0, 0, 0, 0, 0, 0,15,15,19,20, 0,21,21, 0, 0, 0, - 17,17,20,20, 0,12,12,17,17, 0,14,14,16,17, 0,13, - 14,17,17, 0,16,16,17,17, 0,17,17,17,19, 0,13,13, - 17,17, 0,16,16,18,18, 0,13,13,16,16, 0,16,16,18, - 18, 0,16,16,17,17, 0,13,13,17,17, 0,17,17,18,17, - 0,12,12,15,16, 0,17,18,19,20, 0,16,16,16,16, 0, - 17,16,18,19, 0, 0,22,21,22, 0,14,14,16,16, 0,19, - 19, 0, 0, 0,16,16,16,16, 0,16,16,18,17, 0, 0,22, - 21,21, 0,14,14,16,16, 0,22,20,22, 0, 0,16,16,15, - 15, 0, 9, 9,13,13, 0,14,14,15,15, 0,14,14,14,14, - 0,22,22,18,18, 0, 0,22,18,18, 0,12,12,15,15, 0, - 16,16,18,17, 0,14,14,14,14, 0,20,21,18,18, 0,22, - 21,17,17, 0,13,13,15,15, 0,17,17,18,18, 0,14,14, - 14,14, 0, 0,21,18,19, 0, 0,22,17,17, 0,22,22,19, - 18, 0, 0, 0, 0, 0, 0,19,21,17,17, 0, 0, 0,22,20, - 0, 0,21,18,19, 0, 0,22,18,18, 0, 0, 0, 0,22, 0, - 20,22,17,17, 0, 0, 0,20,22, 0, 0, 0,18,18, 0,19, - 21,16,16, 0,20,22,16,17, 0,20, 0,17,17, 0,22, 0, - 18,17, 0,21, 0,18,19, 0,20,20,17,17, 0,22, 0,18, - 18, 0,21,20,17,17, 0, 0,20,20,19, 0, 0,21,18,17, - 0,21,21,17,17, 0,22, 0,18,17, 0,19,19,17,17, 0, - 0,22,20,21, 0, 0,21,17,17, 0,22, 0,18,18, 0, 0, - 0,20,22, 0,20,19,16,16, 0, 0, 0, 0, 0, 0,22,22, - 17,17, 0,22, 0,18,19, 0, 0, 0,21,20, 0,19,21,16, - 17, 0, 0, 0, 0, 0, 0,22,22,17,16, 0,11,11,13,13, - 0,13,13,15,15, 0,13,13,15,15, 0,17,17,22,21, 0, - 18,18,22, 0, 0,12,13,16,15, 0,15,16,18,18, 0,13, - 13,16,16, 0,17,17, 0,22, 0,17,17,22,22, 0,13,13, - 16,16, 0,16,16,19,18, 0,13,13,16,16, 0,18,17, 0, - 20, 0,18,17,20, 0, 0,17,17,21, 0, 0, 0, 0, 0, 0, - 0,15,15,21,22, 0,19,20, 0, 0, 0,18,18, 0, 0, 0, - 18,17, 0, 0, 0, 0, 0, 0, 0, 0,16,16,22,22, 0,20, - 20, 0, 0, 0,21,19, 0, 0, 0,15,15,20,19, 0,16,16, - 22,20, 0,17,17, 0,22, 0,18,18, 0,22, 0,19,17, 0, - 0, 0,15,16,22,20, 0,18,19, 0, 0, 0,16,16,22,20, - 0,18,18, 0,22, 0,18,18,22, 0, 0,16,16,21,20, 0, - 19,20, 0,22, 0,16,16, 0,22, 0,18,18, 0,22, 0,18, - 18, 0,21, 0,19,18, 0,22, 0, 0, 0, 0, 0, 0,16,16, - 21,20, 0,20, 0, 0, 0, 0,18,18,21, 0, 0,18,18, 0, - 0, 0, 0, 0, 0, 0, 0,16,16,21,19, 0, 0, 0, 0, 0, - 0,18,18, 0,21, -}; - -static const static_codebook _44p3_p5_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p3_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p3_p5_0, - 0 -}; - -static const long _vq_quantlist__44p3_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44p3_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p3_p5_1 = { - 1, 7, - (long *)_vq_lengthlist__44p3_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p3_p5_1, - 0 -}; - -static const long _vq_quantlist__44p3_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p3_p6_0[] = { - 1, 6, 6, 7, 7, 7, 7, 8, 8, 7, 9, 9,11,11,11, 9, - 8, 8, 8, 9, 9,12,11,11, 9, 8, 8, 6, 7, 7,10,11, - 10,10,10,10,11,11,10,14,13,14,12,11,11,11,11,11, - 15,14,14,13,12,12, 5, 6, 6, 8, 5, 5, 8, 7, 7, 8, - 8, 8,12,10,10, 9, 7, 7, 9, 7, 8,12,10,10,10, 7, - 7, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, - 13,10,10,11,10,10,16,13,14,14,10,10, 7, 7, 7,12, - 11,11,12,11,11,11,11,11,16,15,15,14,12,12,12,11, - 11,16,15,16,14,12,12,10, 9, 9,14,11,11,13,11,11, - 12,11,11,16,14,14,14,11,11,12,11,11,17,15,15,14, - 11,11, 7, 8, 8,12,11,11,12,10,10,12,10,10,16,14, - 13,14,10,10,12,10,10,17,14,14,14,10,10, 8, 7, 7, - 13,11,11,12,11,11,12,11,11,16,15,14,14,12,12,12, - 11,11,16,15,14,15,12,12,11,10,10,13,11,11,13,12, - 11,13,11,11,17,14,14,14,11,11,13,11,11,17,14,15, - 14,11,11, -}; - -static const static_codebook _44p3_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44p3_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p3_p6_0, - 0 -}; - -static const long _vq_quantlist__44p3_p6_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p3_p6_1[] = { - 2, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, - 7, 7, 8, 8, 8, 9, 9, 9, 9, 7, 8, 6, 7, 7, 8, 8, - 8, 8, 8, 8, 9, 8, 8,10, 9, 9,10, 8, 8,10, 8, 8, - 10, 9, 9,10, 8, 8, 6, 6, 6, 8, 6, 6, 8, 7, 7, 8, - 7, 7,10, 8, 8, 9, 7, 7, 9, 7, 7,10, 8, 9, 9, 7, - 7, 7, 7, 7,10, 8, 8,11, 8, 8,10, 8, 8,12, 9, 9, - 12, 8, 8,11, 9, 9,12, 9, 9,11, 8, 8, 7, 7, 7,10, - 9, 9,10, 9, 9,10, 9, 9,11,10,10,10, 9, 9,11, 9, - 9,11,10,10,11, 9, 9, 9, 8, 8,10, 9, 9,10, 9, 9, - 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, - 9, 9, 8, 8, 8,11, 9, 9,11, 9, 9,11, 9, 9,12, 9, - 9,12, 8, 8,12, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7, - 10, 9, 9,10, 9, 9,11, 9, 9,11,11,11,11, 9, 9,11, - 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11, 9, - 10,11,10, 9,11,10,10,11, 9, 9,11, 9,10,11,10,10, - 11, 9, 9, -}; - -static const static_codebook _44p3_p6_1 = { - 5, 243, - (long *)_vq_lengthlist__44p3_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p3_p6_1, - 0 -}; - -static const long _vq_quantlist__44p3_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p3_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p3_p7_0 = { - 5, 243, - (long *)_vq_lengthlist__44p3_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p3_p7_0, - 0 -}; - -static const long _vq_quantlist__44p3_p7_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p3_p7_1[] = { - 1, 9, 9, 6, 9, 9, 5, 9, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10, -}; - -static const static_codebook _44p3_p7_1 = { - 5, 243, - (long *)_vq_lengthlist__44p3_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p3_p7_1, - 0 -}; - -static const long _vq_quantlist__44p3_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p3_p7_2[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p3_p7_2 = { - 1, 25, - (long *)_vq_lengthlist__44p3_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p3_p7_2, - 0 -}; - -static const long _vq_quantlist__44p3_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p3_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p3_p7_3 = { - 1, 25, - (long *)_vq_lengthlist__44p3_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p3_p7_3, - 0 -}; - -static const long _huff_lengthlist__44p3_short[] = { - 4, 5,16, 9, 9,12,17,18, 4, 2,18, 6, 5, 9,13,15, - 10, 7, 7, 6, 7, 9,13,13, 8, 5, 6, 5, 5, 7,11,12, - 8, 4, 7, 4, 3, 6,10,12,11, 8, 9, 7, 6, 8,11,12, - 15,13,13,11, 9, 7,10,12,16,12,16,12, 6, 5, 8,11, -}; - -static const static_codebook _huff_book__44p3_short = { - 2, 64, - (long *)_huff_lengthlist__44p3_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p4_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44p4_l0_0[] = { - 1, 4, 4, 8, 8, 9, 8, 9, 9,10,10,10,10, 4, 6, 5, - 8, 7, 9, 9, 9, 9,10, 9,10,10, 4, 5, 6, 7, 8, 9, - 9, 9, 9, 9,10, 9,10, 8, 9, 8, 9, 8,10, 9,11, 9, - 12,10,11,10, 8, 8, 9, 8, 9, 9,10, 9,11,10,11,10, - 12, 9,10,10,11,10,11,11,12,11,12,12,12,12, 9,10, - 10,11,11,11,11,11,12,12,12,12,12,10,11,11,12,12, - 12,12,12,12,12,12,12,12,10,11,11,12,12,12,12,12, - 12,12,12,12,12,11,12,12,12,12,12,12,12,12,12,13, - 12,12,11,12,11,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,13,12,12,12,12,12,12,11,13,12,12, - 12,13,12,12,12,12,12,12,12, -}; - -static const static_codebook _44p4_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44p4_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p4_l0_0, - 0 -}; - -static const long _vq_quantlist__44p4_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p4_l0_1[] = { - 3, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, - 5, 6, 5, 6, 5, 6, 5, 6, 5, -}; - -static const static_codebook _44p4_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44p4_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p4_l0_1, - 0 -}; - -static const long _vq_quantlist__44p4_l1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p4_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p4_l1_0 = { - 2, 9, - (long *)_vq_lengthlist__44p4_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p4_l1_0, - 0 -}; - -static const long _huff_lengthlist__44p4_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p4_lfe = { - 2, 4, - (long *)_huff_lengthlist__44p4_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44p4_long[] = { - 3, 5,13, 9, 9,12,16,18, 4, 2,20, 6, 7,10,15,20, - 10, 7, 5, 5, 6, 8,10,13, 8, 5, 5, 3, 5, 7,10,11, - 9, 7, 6, 5, 5, 7, 9, 9,11,10, 8, 7, 6, 6, 8, 8, - 15,15,10,10, 9, 7, 8, 9,17,19,13,12,10, 8, 9, 9, -}; - -static const static_codebook _huff_book__44p4_long = { - 2, 64, - (long *)_huff_lengthlist__44p4_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p4_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p4_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p4_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44p4_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p4_p1_0, - 0 -}; - -static const long _vq_quantlist__44p4_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p4_p2_0[] = { - 3, 9, 9, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 12,12, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, - 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0,12,12, 0, 0, - 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0,12,12, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, - 5, 5, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, - 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, 9, 9, 0, - 0, 0,10,10, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, - 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0,11,11, 0, - 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, 0, - 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 7, 7, - 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, - 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, - 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 7, 7, 0, 0, 0, 8, 8, 0, - 0, 0,10,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 7, - 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0,11,11, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 7, - 7, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,10,10, 0, 0, 0, 9, 9, 0, 0, 0,10,10, - 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, - 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,11, - 11, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0,12,12, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, 0, 0, - 9, 9, 0, 0, 0,10,10, 0, 0, 0,12,12, 0, 0, 0, 0, - 0, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, - 0, 0, 0, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, - 10,10, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, -}; - -static const static_codebook _44p4_p2_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p4_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p4_p2_0, - 0 -}; - -static const long _vq_quantlist__44p4_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p4_p3_0[] = { - 1, 6, 6, 5, 7, 8, 0, 8, 8, 6, 9, 9, 7,10,10, 0, - 8, 8, 0, 9, 9, 0,12,12, 0, 8, 8, 4, 7, 7, 6,10, - 10, 0,12,12, 7,11,11, 8,12,12, 0,12,12, 0,13,12, - 0,15,15, 0,12,12, 0, 7, 7, 0, 7, 7, 0, 7, 7, 0, - 8, 8, 0,10,10, 0, 7, 7, 0, 8, 8, 0,11,11, 0, 7, - 7, 5, 7, 7, 8, 9, 9, 0,10,10, 8, 9, 9,11,11,11, - 0,10, 9, 0,11,11, 0,13,13, 0,10,10, 6, 7, 7, 8, - 10,10, 0,12,12, 9,10,10,10,12,12, 0,12,12, 0,12, - 12, 0,15,15, 0,12,12, 0,10,10, 0,11,11, 0,11,11, - 0,11,11, 0,13,13, 0,11,11, 0,11,11, 0,15,15, 0, - 10,10, 0, 8, 8, 0,10,10, 0,12,12, 0,11,11, 0,12, - 12, 0,12,12, 0,12,12, 0,15,15, 0,11,11, 0, 7, 7, - 0,10,10, 0,12,12, 0,10,10, 0,12,12, 0,12,12, 0, - 13,13, 0,14,14, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44p4_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44p4_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p4_p3_0, - 0 -}; - -static const long _vq_quantlist__44p4_p3_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p4_p3_1[] = { - 3, 5, 5, 0, 8, 8, 0, 8, 8, 0, 9, 9, 0,10,10, 0, - 8, 8, 0, 8, 8, 0,10,10, 0, 8, 8, 0, 7, 7, 0, 8, - 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 8, 8, 0, 8, 8, - 0, 8, 8, 0, 8, 8, 0, 7, 7, 0, 6, 6, 0, 7, 7, 0, - 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,10,10, 0, 5, - 5, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, 0, 9, 9, - 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 6, 6, 0, - 9,10, 0,10,10, 0,10,10, 0,11,11, 0, 9, 9, 0,10, - 10, 0,11,11, 0, 9, 9, 0, 8, 8, 0, 8, 8, 0, 8, 8, - 0, 9, 9, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0, - 7, 7, 0, 8, 8, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, 9, - 9, 0, 7, 7, 0, 7, 7, 0, 8, 8, 0, 6, 6, 0, 6, 6, - 0,10,10, 0,10,10, 0,10,10, 0,12,12, 0, 9, 9, 0, - 10,10, 0,12,12, 0, 9, 9, 0, 8, 8, 0, 7, 7, 0, 7, - 7, 0, 8, 8, 0, 9, 9, 0, 7, 7, 0, 8, 8, 0, 9, 9, - 0, 6, 6, -}; - -static const static_codebook _44p4_p3_1 = { - 5, 243, - (long *)_vq_lengthlist__44p4_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p4_p3_1, - 0 -}; - -static const long _vq_quantlist__44p4_p4_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p4_p4_0[] = { - 1, 6, 6, 6, 7, 7, 7, 8, 8, 7, 8, 8,10,11,11, 9, - 8, 8, 8, 8, 8,11,11,12, 9, 8, 8, 5, 7, 7, 9,11, - 11,10,11,11,10,11,11,12,14,14,11,12,12,10,12,12, - 13,14,14,12,12,12, 5, 6, 6, 7, 6, 6, 8, 7, 7, 8, - 7, 7,11,10,10,10, 7, 7, 9, 8, 8,12,11,11,10, 7, - 7, 7, 7, 7,11,10,10,12,10,10,11,10,10,15,13,13, - 13,10,10,12,11,11,15,13,13,14,11,11, 7, 7, 7,11, - 11,11,12,11,11,12,11,11,14,14,14,13,12,12,12,12, - 12,16,15,15,14,12,12, 0,10,10, 0,11,11, 0,12,12, - 0,11,11, 0,14,14, 0,11,11, 0,12,12, 0,15,15, 0, - 11,11, 7, 8, 8,12,11,10,12,10,10,12,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,14,10,10, 8, 7, 7, - 12,11,11,12,11,11,12,11,11,15,14,14,14,12,12,13, - 12,12,15,14,14,15,13,13, 0,11,11, 0,12,12, 0,12, - 12, 0,12,12, 0,15,15, 0,12,12, 0,13,13, 0,15,14, - 0,12,12, -}; - -static const static_codebook _44p4_p4_0 = { - 5, 243, - (long *)_vq_lengthlist__44p4_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p4_p4_0, - 0 -}; - -static const long _vq_quantlist__44p4_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p4_p4_1[] = { - 4, 5, 5, 9, 9,12, 9, 9,12,12,12,10,10,13,13,13, - 11,11,12,12,13,13,13,12,12,13,10,10,13,13,13,13, - 13,13,13,13,10,10,13,12,13,11,11,13,13,13,14,14, - 13,12,13,10,10,13,13,12,13,13,13,13,13,10,10,12, - 12,13,11,11,13,13,13,14,14,12,12,13,12,12,13,13, - 13,13,13,13,13,13,11,11,12,12,13,11,11,13,13,13, - 14,14,12,12,13,14,14,13,13,14,13,13,14,14,14,14, - 14,12,12,13,14,14,13,13,14,14,14,12,12,12, 8, 8, - 12,12,13,12,12,11,11,13,11,11,11,11,14,12,12,11, - 11,14,12,12,10,11,14,12,12,12,12,14,12,12,12,12, - 13,13,13,11,11,14,12,12,11,11,14,12,12,12,12,14, - 12,12,12,12,14,12,12,12,12,14,13,13,11,11,14,12, - 12,11,11,14,12,12,12,12,14,13,13,12,12,14,12,12, - 12,12,14,13,13,11,11,14,12,12,11,11,14,13,13,11, - 11,15,13,13,12,12,14,12,12,12,12,15,13,13,12,12, - 14,12,12,11,11,15,13,13,11,11,12, 9, 9,11,11,13, - 7, 7,11,11,13, 8, 8,12,12,14,10,10,10,10,14,14, - 14,11,11,14, 8, 8,12,12,14,14,14,12,12,14, 7, 7, - 11,11,14, 9, 9,12,12,14,14,14,11,11,14, 8, 8,12, - 12,14,14,14,12,12,14, 7, 7,11,11,14, 9, 9,12,12, - 14,14,14,11,11,14,10,10,12,12,14,14,14,13,13,14, - 9, 9,11,11,14,10,10,12,11,15,14,14,11,11,14,15, - 15,12,12,15,14,14,14,14,15,14,14,11,11,15,14,14, - 12,12,15,14,14,11,11,14,11,11,10,10,15,10,10,10, - 10,15,10,10,10,10,15,11,11, 9, 9,15,12,13, 9, 9, - 15,11,11,11,11,15,13,13,11,11,15,10,10,10,10,15, - 11,11,10,10,15,13,13,11,11,15,11,11,11,11,15,13, - 13,11,11,15,10,10,10,10,15,11,11,10,10,15,13,13, - 10,11,15,12,12,11,11,15,13,13,11,10,15,11,11,10, - 10,15,11,12,10, 9,15,13,13,10,10,15,14,14,11,11, - 15,13,13,11,11,15,14,14,10,10,15,13,13,10,10,15, - 14,14,10,10,14,13,13,10,10,15,13,13,10,10,15,13, - 13,10,10,14,14,14, 8, 9,15,14,14, 9, 9,15,14,14, - 11,11,15,14,14,10,10,15,14,14,10,10,15,14,14,11, - 11,15,14,14,10,10,15,14,14,11,11,15,14,14,10,10, - 15,14,14,10,10,15,14,14,10,10,15,14,14, 9, 9,15, - 14,14,11,11,15,14,14,11,11,15,14,14,10,10,15,14, - 14,10,10,14,14,14, 9, 9,15,15,15,11,11,15,14,14, - 12,12,15,15,15,10,10,15,14,15,10,10,15,15,15, 9, - 9,15,10,10,13,13,17, 8, 8,12,12,17,10, 9,13,13, - 18,11,11,12,12,18,14,14,12,12,17, 9, 9,13,13,17, - 13,13,12,12,18, 8, 8,12,12,18,10,10,12,12,18,14, - 14,12,12,18,10,10,13,13,18,13,13,13,13,18, 9, 9, - 12,12,18,10,10,13,13,18,14,14,12,12,18,11,11,13, - 13,18,14,14,13,13,18,10,10,12,12,17,11,11,12,12, - 18,14,14,12,12,18,14,14,13,13,18,14,14,13,13,19, - 14,15,12,12,18,14,14,12,12,18,15,15,12,12,13, 7, - 7,11,11,14,15,15,11,11,14,16,15,11,11,14,15,15, - 11,11,14,15,15,11,11,14,15,15,11,12,14,15,15,12, - 12,13,15,15,11,11,14,15,15,11,11,15,15,15,12,12, - 14,15,15,12,12,14,16,16,12,12,14,15,15,11,11,14, - 15,15,11,11,15,15,15,12,12,15,15,15,12,12,14,15, - 15,12,12,14,15,15,11,11,14,15,15,11,11,15,14,15, - 12,12,15,15,15,12,12,15,16,16,12,12,15,15,15,12, - 12,14,15,15,12,12,15,15,15,12,12,13,13,13,11,11, - 14,14,15,11,11,14,14,14,12,12,14,15,15,10,10,15, - 15,15,11,11,14,15,15,12,12,14,14,14,11,11,14,15, - 15,11,11,14,15,15,12,12,15,15,15,11,11,14,15,15, - 12,12,14,14,15,11,11,14,15,15,11,11,14,15,15,12, - 12,15,15,15,11,11,15,15,15,12,12,14,15,15,12,12, - 14,15,15,10,10,14,15,15,11,11,15,15,15,10,10,15, - 15,15,12,12,15,15,15,14,14,15,15,15,11,11,15,15, - 15,11,11,15,15,15,11,11,14,10,10,10,10,15, 9, 9, - 12,11,15,10,10,12,12,15,11,11,11,11,15,13,13,12, - 12,16,10,10,12,12,15,13,13,12,12,15, 9, 9,11,11, - 15,10,10,13,12,15,13,13,11,11,15,10,10,12,12,15, - 13,13,12,12,15, 9, 9,11,11,15,10,10,12,12,15,13, - 13,11,11,15,11,11,12,12,15,13,13,13,13,15,10,10, - 11,11,15,11,11,12,12,15,13,14,11,11,15,14,14,13, - 13,16,14,14,20,19,15,14,14,11,11,15,13,14,12,12, - 15,14,14,11,11,14,13,13,10,10,14,14,13,11,11,15, - 13,14,12,12,15,14,14,12,12,15,14,14,11,11,15,14, - 14,12,12,15,15,14,13,13,15,14,14,11,11,15,14,14, - 11,11,15,14,14,13,13,15,14,14,12,12,15,14,14,13, - 13,15,14,14,11,11,15,14,14,11,11,15,14,14,13,13, - 15,14,14,12,12,15,14,14,12,12,15,14,14,12,12,15, - 14,14,11,11,15,15,15,12,12,15,15,15,13,13,16,14, - 14,12,12,15,15,15,13,13,15,15,15,12,12,15,15,15, - 12,12,14,10,10,13,13,17, 9, 9,12,12,17, 9, 9,13, - 13,17,11,11,12,12,18,14,14,12,12,18,10,10,13,13, - 18,14,13,12,12,18, 9, 9,12,12,18,10,10,12,13,18, - 14,14,12,12,17, 9, 9,12,12,17,13,14,12,12,17, 9, - 9,12,12,17,10,10,12,12,17,14,14,11,11,18,11,11, - 12,12,18,14,14,12,13,18,10,10,12,12,18,11,11,12, - 12,18,14,14,11,11,18,15,15,12,12,18,14,14,13,13, - 18,14,15,12,12,17,14,14,12,12,17,15,15,12,12,13, - 7, 7,11,11,14,15,15,11,11,14,15,15,11,11,14,15, - 15,11,11,14,15,15,11,11,14,15,15,11,11,14,15,15, - 12,12,14,15,15,11,11,14,15,15,11,11,15,15,15,12, - 12,14,15,15,11,11,14,15,15,12,12,14,15,15,11,11, - 15,15,15,11,11,15,15,15,12,12,14,15,15,12,12,14, - 15,16,12,12,14,15,15,11,11,14,15,15,11,11,15,15, - 15,12,12,15,15,15,12,12,15,16,16,12,12,15,15,15, - 12,12,15,15,15,12,12,15,15,15,12,12,13,13,13,12, - 12,14,14,14,11,11,14,14,14,12,12,14,14,14,10,10, - 15,15,15,11,11,14,15,15,12,12,14,14,14,11,11,14, - 15,15,11,11,14,14,14,12,12,15,15,14,11,11,14,15, - 15,12,12,14,14,14,11,11,14,15,15,11,11,14,14,14, - 11,11,15,14,14,10,10,14,15,15,12,12,14,14,14,12, - 12,14,15,15,10,10,14,15,15,11,11,15,15,15,10,10, - 15,15,15,12,12,15,14,14,13,13,15,15,15,10,10,15, - 14,14,11,11,15,15,15,10,10,14,10,10,10,10,14, 9, - 9,12,12,15,10,10,12,12,14,11,11,11,11,15,13,14, - 12,12,15,10,10,13,13,15,13,13,12,12,15, 9, 9,12, - 12,15,10,10,13,13,15,13,14,11,11,15,10,10,12,12, - 15,13,13,12,12,15, 9, 9,11,11,15,10,10,12,12,15, - 13,13,11,11,15,11,11,12,12,15,13,13,13,13,15,10, - 10,11,11,15,11,11,12,12,15,14,14,11,11,15,14,14, - 13,13,15,14,14,20,19,15,14,14,11,11,15,14,14,12, - 12,15,14,14,11,11,14,13,13,11,11,15,13,13,11,11, - 15,14,13,12,12,15,14,14,11,12,15,14,14,11,11,15, - 14,14,12,12,14,14,14,13,13,15,14,14,11,11,15,14, - 14,11,11,15,14,14,13,13,15,14,14,12,12,15,14,14, - 13,13,14,14,14,11,11,15,14,14,11,11,15,14,14,13, - 13,15,14,14,12,12,15,14,14,12,12,15,14,14,12,12, - 15,14,14,11,11,14,14,14,12,12,15,15,15,13,13,16, - 14,14,12,12,15,15,15,13,13,15,14,14,12,12,15,15, - 15,12,12,15,11,11,13,13,18,10,10,12,12,17,11,11, - 12,12,18,12,12,11,11,18,14,14,12,12,18,10,10,13, - 13,18,14,14,12,12,18,10,10,12,12,18,11,11,12,12, - 18,14,14,12,12,18,11,11,12,13,18,14,14,12,12,18, - 10,10,12,12,18,11,11,12,12,18,14,14,11,11,18,11, - 11,12,12,18,14,14,12,12,17,10,10,11,11,17,12,12, - 11,11,17,14,14,11,11,18,15,15,12,12,18,14,14,13, - 13,18,15,15,11,11,18,15,14,12,12,18,15,15,11,11, - 14, 8, 8,11,11,14,15,15,10,10,14,15,15,11,11,14, - 15,15,11,11,15,15,15,12,12,15,15,15,11,11,15,15, - 15,12,12,14,15,15,10,10,15,15,15,11,11,15,15,15, - 12,12,15,15,15,11,11,15,15,15,13,13,14,15,15,10, - 10,15,15,15,11,11,15,15,15,12,12,15,15,15,12,12, - 15,16,16,12,12,15,14,14,11,11,15,15,15,11,11,15, - 15,15,12,12,16,15,15,13,13,15,16,16,13,13,16,15, - 15,12,12,15,15,15,12,12,15,15,15,12,12,14,13,13, - 11,11,14,14,14,11,11,14,14,14,12,12,15,14,14,11, - 11,15,15,14,11,11,15,14,14,12,12,15,14,14,12,12, - 14,15,15,11,11,15,14,14,12,12,15,14,14,11,11,15, - 14,15,12,12,15,14,14,12,12,14,15,15,11,11,15,14, - 14,11,11,15,14,14,11,11,15,15,14,12,12,15,14,14, - 12,12,15,15,15,10,11,15,14,14,11,11,15,15,15,10, - 10,15,15,15,12,12,16,14,14,13,13,15,15,15,11,11, - 15,14,14,11,11,15,15,15,11,11,14,11,11, 9, 9,14, - 10,10,12,12,15,11,11,12,12,15,12,12,12,12,15,14, - 14,13,13,15,11,11,12,12,15,14,14,13,13,14,10,10, - 12,12,15,11,11,13,13,15,14,14,12,12,15,10,10,12, - 12,14,14,14,13,13,14,10,10,11,11,15,11,11,12,12, - 15,14,14,12,12,15,12,12,13,13,15,14,14,14,14,15, - 11,11,11,11,15,12,11,12,12,15,14,14,11,11,15,15, - 15,13,14,15,14,14,20,19,15,14,14,12,12,15,14,14, - 13,13,15,14,14,12,12,14,13,13,10,10,14,13,13,11, - 11,14,13,13,11,11,15,14,14,12,12,15,14,14,12,12, - 15,14,14,12,11,14,14,14,13,13,15,14,14,11,11,15, - 14,14,11,11,15,14,14,14,14,15,14,14,11,12,15,14, - 14,13,13,14,14,14,11,11,15,14,14,11,11,15,14,14, - 14,14,15,14,14,12,12,15,14,14,13,13,15,14,14,11, - 11,14,14,14,12,12,15,14,14,13,13,15,15,15,13,13, - 15,14,14,13,13,15,15,15,13,13,15,14,14,13,13,15, - 15,15,13,13,15,14,14,13,13,18,15,15,12,12,18,15, - 15,12,12,18,16,16,11,11,18,17,17,12,12,18,15,15, - 13,13,18,17,17,12,12,18,15,15,12,12,18,15,16,12, - 12,18,17,17,12,12,18,15,15,13,12,17,16,17,12,12, - 17,15,15,11,12,18,15,15,12,12,18,17,17,11,11,18, - 16,16,12,12,18,17,16,12,12,18,15,15,11,11,18,15, - 15,12,12,18,17,17,11,11,18,17,17,12,12,18,16,16, - 13,13,18,17,17,11,11,17,16,16,11,11,18,17,17,11, - 11,15,15,15,11,11,16,15,15,11,11,16,15,15,11,11, - 16,15,15,12,12,17,15,15,14,14,16,15,15,11,11,17, - 15,15,14,14,16,15,15,11,11,16,15,15,12,12,18,15, - 15,13,13,16,15,15,11,11,17,15,15,14,14,16,15,15, - 11,11,16,15,15,12,12,17,15,15,13,13,16,15,15,12, - 12,17,16,15,14,14,16,15,15,11,11,16,15,15,12,12, - 18,15,15,13,13,17,15,15,14,14,17,16,16,15,15,18, - 14,15,13,13,18,15,15,14,14,18,15,15,13,13,15,13, - 13,12,12,15,14,14,12,12,16,14,14,12,12,16,14,14, - 12,12,17,14,15,12,12,16,14,14,12,12,17,14,14,13, - 13,16,15,15,12,12,16,14,14,12,12,17,14,14,12,12, - 16,14,14,12,12,17,14,14,13,13,15,15,15,11,11,16, - 14,14,12,12,17,14,14,12,12,16,15,15,12,12,17,14, - 14,13,12,16,15,15,11,11,16,14,14,12,12,17,15,15, - 11,11,17,15,15,13,13,17,14,14,13,13,18,15,15,12, - 12,17,14,14,12,12,17,15,15,12,12,14,15,15, 9, 9, - 14,15,15,12,12,15,16,15,13,13,15,15,15,14,14,15, - 15,15,21,19,15,15,15,13,13,15,15,15,19,19,15,15, - 15,12,12,15,16,16,14,14,15,15,15,19,19,15,16,15, - 13,13,15,16,16,19,20,15,15,15,12,13,15,16,16,14, - 14,15,15,15,20,19,15,15,15,14,14,15,16,16,19,19, - 15,15,15,14,13,15,15,15,14,14,15,15,15,19,19,15, - 16,16,20,19,15,17,16,21,20,15,15,15,20,19,15,16, - 16,20,20,15,15,15,19,20,14,13,13,10,10,14,14,14, - 11,11,14,14,14,12,12,15,14,14,13,13,15,15,14,20, - 20,15,14,14,12,12,14,14,14,19,19,15,14,14,11,11, - 15,14,14,12,12,15,14,14,20,19,15,14,14,12,12,14, - 14,14,20,20,14,14,14,11,11,15,14,14,12,12,15,14, - 14,20,21,15,14,14,13,13,15,14,14,20,20,15,14,14, - 12,12,15,14,14,13,13,14,15,15,20,20,15,15,15,20, - 19,15,14,14,20,19,15,15,15,20,20,15,14,14,21,20, - 15,15,15,20,20, -}; - -static const static_codebook _44p4_p4_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p4_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p4_p4_1, - 0 -}; - -static const long _vq_quantlist__44p4_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p4_p5_0[] = { - 1, 7, 6,15,15, 7, 8, 8,15,15, 8, 8, 8,15,15, 0, - 13,13,16,16, 0,14,14,16,16, 7, 9, 9,16,16,10,11, - 11,17,17,10, 8, 8,15,16, 0,14,14,18,18, 0,14,14, - 16,16, 9, 9, 9,16,16,12,11,11,17,17,10, 9, 9,15, - 15, 0,14,14,19,19, 0,14,14,16,16, 0,15,15,18,17, - 0, 0, 0,20,20, 0,13,13,16,16, 0,17,17,22,20, 0, - 15,15,17,17, 0,15,15,18,18, 0,22,21,20,21, 0,13, - 13,16,16, 0,18,18, 0,22, 0,15,15,17,17, 6, 7, 7, - 13,13, 9,10,10,15,15,11,10,10,15,15, 0,21,22,18, - 18, 0, 0, 0,18,18,10,10,10,15,15,12,13,13,17,17, - 12,11,11,15,15, 0,22,22,18,18, 0, 0,21,18,18,12, - 11,11,15,15,15,14,14,18,18,13,11,11,15,15, 0, 0, - 21,18,19, 0,21,22,18,19, 0,22, 0,18,19, 0, 0, 0, - 0, 0, 0,21,21,18,18, 0,22, 0, 0,21, 0, 0, 0,19, - 18, 0, 0, 0,18,19, 0, 0, 0, 0, 0, 0,20,20,18,17, - 0, 0,22, 0,21, 0, 0, 0,19,19, 6, 6, 6,13,13, 8, - 6, 6,11,11, 9, 7, 7,13,13, 0,10,10,11,11, 0,12, - 12,14,14, 9, 8, 8,14,14,12,10,10,13,13,10, 7, 7, - 13,13, 0,11,11,15,15, 0,11,11,13,13, 9, 8, 8,14, - 14,13,10,10,13,14,11, 7, 7,13,13, 0,11,11,15,15, - 0,11,11,13,13, 0,12,12,15,15, 0,21,21,17,17, 0, - 10,10,13,13, 0,14,14,20,20, 0,12,12,13,13, 0,12, - 12,15,15, 0,21,22,17,18, 0,10,10,13,13, 0,16,16, - 20,21, 0,12,12,13,13, 0,11,11,13,13, 0,12,12,16, - 16, 0,12,12,16,16, 0,16,16, 0,21, 0,17,18, 0, 0, - 0,12,12,15,15, 0,15,15,18,18, 0,12,12,16,16, 0, - 16,16,21,22, 0,17,17,22,21, 0,12,12,16,16, 0,15, - 15,19,19, 0,12,12,16,16, 0,16,16,22,22, 0,17,16, - 22, 0, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0,15,15,21, - 20, 0,19,20, 0,22, 0,18,18, 0, 0, 0,18,17, 0, 0, - 0, 0, 0, 0, 0, 0,16,16,22,21, 0,20,20, 0,22, 0, - 20,19, 0, 0, 0,11,11,12,12, 0,10,10,11,11, 0,11, - 11,12,12, 0,12,12,10,10, 0,13,13,12,12, 0,11,11, - 13,13, 0,13,13,12,12, 0,10,10,12,12, 0,13,13,14, - 13, 0,12,12,12,12, 0,12,12,13,13, 0,14,14,13,13, - 0,10,10,12,12, 0,13,13,14,14, 0,13,12,12,12, 0, - 14,14,14,14, 0,21,21,16,16, 0,12,12,12,12, 0,16, - 16,20,21, 0,13,13,11,11, 0,14,14,14,14, 0,20,20, - 16,15, 0,12,12,12,12, 0,17,17,20,20, 0,13,13,11, - 11, 7, 8, 8,16,16,11,10,10,15,15,12,10,10,17,17, - 0,14,14,16,15, 0,15,15,17,17,11, 9, 9,16,16,14, - 12,12,17,17,13, 9, 9,16,15, 0,14,14,19,18, 0,14, - 14,16,16,12,10,10,17,18,16,13,13,17,18,14,10,10, - 16,16, 0,14,14,19,19, 0,14,15,17,17, 0,15,15,18, - 19, 0, 0, 0,20,20, 0,13,13,17,17, 0,17,18, 0,22, - 0,15,15,16,17, 0,15,15,18,18, 0, 0, 0,20,21, 0, - 14,14,17,17, 0,19,18, 0, 0, 0,16,16,17,17, 8, 7, - 7,14,14,12,11,11,15,15,13,11,11,15,15, 0, 0, 0, - 18,19, 0,21,20,18,18,12,10,11,15,16,14,13,13,18, - 18,14,11,11,15,15, 0,20,20,19,18, 0,20, 0,18,18, - 13,11,11,16,16,17,15,15,19,19,14,12,12,15,15, 0, - 21, 0,18,20, 0,22,22,18,19, 0,22,22,19,19, 0, 0, - 0, 0, 0, 0,21,22,19,18, 0, 0, 0, 0,21, 0, 0, 0, - 19,19, 0, 0,22,20,20, 0, 0, 0, 0, 0, 0,22, 0,18, - 18, 0, 0, 0, 0,22, 0, 0, 0,19,20,11,10,10,14,14, - 14,11,11,13,13,14,11,11,15,15, 0,14,13,12,12, 0, - 15,15,16,16,13,11,11,15,15,16,13,13,15,15,15,10, - 10,14,15, 0,14,14,16,16, 0,14,14,15,15,13,11,11, - 15,15,18,14,14,15,15,15,10,10,15,14, 0,14,14,16, - 16, 0,14,14,15,15, 0,15,15,17,16, 0,21,22,18,18, - 0,13,13,14,14, 0,18,17,20,21, 0,15,15,14,14, 0, - 15,16,16,17, 0, 0, 0,19,18, 0,13,13,15,14, 0,19, - 19, 0, 0, 0,15,15,14,14, 0,12,12,14,13, 0,13,13, - 16,16, 0,12,12,16,16, 0,16,16,22, 0, 0,17,18, 0, - 22, 0,13,13,16,16, 0,15,15,18,18, 0,12,12,16,16, - 0,16,16,22,22, 0,17,17, 0, 0, 0,13,13,17,17, 0, - 16,16,19,20, 0,12,12,17,17, 0,17,17,22, 0, 0,17, - 17,22,21, 0,18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, - 21,21, 0,19,19, 0, 0, 0,18,18, 0,22, 0,18,18, 0, - 22, 0, 0, 0, 0, 0, 0,16,16,22, 0, 0,20,20, 0, 0, - 0,19,18, 0, 0, 0,12,12,15,15, 0,12,12,15,14, 0, - 13,13,15,15, 0,14,14,14,14, 0,15,15,16,16, 0,13, - 13,15,16, 0,15,15,16,16, 0,12,12,15,15, 0,14,14, - 16,16, 0,14,14,15,15, 0,13,13,15,16, 0,15,15,16, - 16, 0,12,12,15,15, 0,15,15,17,17, 0,14,14,15,15, - 0,15,15,17,17, 0,21,21,19,19, 0,13,13,14,14, 0, - 17,17,22, 0, 0,14,14,15,15, 0,15,15,17,17, 0,22, - 0,18,20, 0,13,13,15,15, 0,18,18, 0,22, 0,15,15, - 14,15, 8, 8, 8,17,16,12,10,10,16,16,13,10,10,17, - 16, 0,15,15,17,17, 0,15,15,17,17,12,11,11,18,18, - 15,12,12,18,18,15,10,10,16,17, 0,14,14,18,18, 0, - 14,14,17,17,13,10,10,16,16,17,14,14,17,17,15,10, - 10,16,15, 0,15,15,19,20, 0,14,14,15,16, 0,16,16, - 19,19, 0, 0, 0,21,22, 0,13,13,17,17, 0,18,17, 0, - 21, 0,15,15,17,17, 0,15,15,18,19, 0, 0,22, 0,21, - 0,13,13,16,17, 0,19,19, 0,22, 0,16,15,16,16, 9, - 8, 8,14,14,12,11,11,15,15,13,11,11,15,15, 0,21, - 20,19,18, 0, 0, 0,19,18,12,11,11,16,15,15,13,13, - 17,18,14,11,11,15,15, 0,22,22,19,18, 0,22,21,18, - 18,14,11,11,15,15,17,14,14,18,18,15,12,12,15,15, - 0,22,22,20,19, 0, 0,21,18,18, 0, 0,22,20,20, 0, - 0, 0, 0, 0, 0,20,21,18,18, 0, 0, 0,21,21, 0, 0, - 0,20,19, 0,22,21,19,19, 0, 0, 0, 0, 0, 0, 0,22, - 17,18, 0, 0,22, 0,22, 0,22, 0,19,19, 0,11,11,15, - 15, 0,11,11,14,14, 0,12,12,15,15, 0,15,15,14,14, - 0,16,16,16,16, 0,12,12,16,16, 0,14,14,16,16, 0, - 11,11,15,15, 0,15,15,17,17, 0,15,15,15,15, 0,12, - 12,16,16, 0,14,14,15,15, 0,11,11,15,15, 0,15,15, - 17,17, 0,15,15,14,15, 0,16,16,17,17, 0, 0, 0,19, - 19, 0,14,14,15,15, 0,18,18,21, 0, 0,15,15,14,15, - 0,16,16,17,17, 0,21, 0,19,19, 0,14,14,15,15, 0, - 20,20,22, 0, 0,16,15,14,14, 0,12,12,13,13, 0,12, - 12,16,16, 0,12,12,16,16, 0,16,16,22,21, 0,18,17, - 21, 0, 0,13,13,16,16, 0,15,15,18,19, 0,12,12,16, - 16, 0,16,17,22, 0, 0,17,17, 0,22, 0,13,13,17,16, - 0,15,15,19,19, 0,12,12,16,16, 0,16,16,21,20, 0, - 17,16,22, 0, 0,18,18,22,21, 0, 0, 0, 0, 0, 0,15, - 16,21,21, 0,19,19, 0, 0, 0,18,17, 0, 0, 0,18,18, - 21, 0, 0, 0, 0, 0, 0, 0,16,16,22,22, 0,20,21, 0, - 0, 0,18,19, 0,22, 0,13,13,16,16, 0,12,12,15,15, - 0,13,13,16,16, 0,14,14,15,15, 0,15,15,17,17, 0, - 13,13,17,16, 0,15,15,17,17, 0,12,12,16,16, 0,15, - 15,17,17, 0,14,14,16,16, 0,13,13,16,17, 0,15,15, - 17,17, 0,12,12,16,16, 0,14,14,17,17, 0,14,14,16, - 16, 0,16,16,17,17, 0,21, 0,21,19, 0,13,13,16,16, - 0,17,17, 0, 0, 0,15,15,16,16, 0,16,15,18,18, 0, - 22, 0,20,20, 0,13,13,15,15, 0,18,18, 0, 0, 0,15, - 15,15,15, 0,12,12,17,17, 0,14,14,17,17, 0,14,14, - 17,17, 0,17,17,18,17, 0,17,17,19,18, 0,13,13,17, - 17, 0,16,16,18,18, 0,13,13,16,16, 0,17,17,19,19, - 0,16,16,17,17, 0,13,13,18,18, 0,17,17,18,18, 0, - 13,13,17,17, 0,17,17,19,19, 0,16,17,17,17, 0,17, - 17,19,19, 0,21, 0,21,19, 0,14,14,16,16, 0,20,19, - 0,21, 0,16,16,16,16, 0,17,18,19,19, 0, 0, 0, 0, - 21, 0,15,15,16,17, 0,21,20, 0, 0, 0,17,18,16,17, - 0, 9, 9,14,14, 0,14,14,15,16, 0,14,14,15,15, 0, - 0, 0,18,18, 0,21, 0,18,19, 0,12,12,15,15, 0,16, - 16,17,17, 0,14,14,14,14, 0,22, 0,19,18, 0,22, 0, - 17,18, 0,14,14,16,15, 0,18,18,19,18, 0,14,15,15, - 15, 0, 0,21,20,20, 0, 0, 0,18,18, 0,21,21,19,19, - 0, 0, 0, 0, 0, 0,21,21,18,18, 0,22, 0,20,20, 0, - 22, 0,19,19, 0,22, 0,19,20, 0, 0, 0, 0, 0, 0, 0, - 21,17,18, 0, 0, 0,22,22, 0, 0, 0,19,18, 0,18,20, - 16,16, 0,21,20,17,17, 0, 0,21,18,18, 0,22,21,18, - 18, 0, 0,22,19,19, 0,20,20,17,17, 0, 0, 0,18,18, - 0,19,20,17,17, 0,22, 0,19,21, 0,22,21,18,18, 0, - 20,19,17,18, 0, 0, 0,19,19, 0,20,20,17,17, 0,22, - 22,21,21, 0,20, 0,18,18, 0,22,22,18,18, 0, 0, 0, - 20,22, 0,20,20,16,16, 0, 0, 0,21, 0, 0,21,20,16, - 17, 0,22, 0,19,20, 0, 0, 0,21,20, 0,19,21,17,17, - 0, 0, 0, 0, 0, 0,21,21,17,17, 0,12,12,13,13, 0, - 14,14,16,16, 0,14,14,16,16, 0,18,18, 0, 0, 0,19, - 18,22, 0, 0,13,13,16,16, 0,16,16,18,18, 0,13,13, - 16,16, 0,17,18,21, 0, 0,18,18,21, 0, 0,13,13,16, - 16, 0,17,17,19,20, 0,13,13,16,17, 0,18,18,21, 0, - 0,18,18,21, 0, 0,18,19, 0,21, 0, 0, 0, 0, 0, 0, - 16,16,21,20, 0,20,20, 0, 0, 0,18,19, 0, 0, 0,18, - 18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, 0,21, 0,22,22, - 0, 0, 0,19,19, 0, 0, 0,16,16,19,20, 0,17,16,22, - 21, 0,17,17,21,20, 0,19,18, 0,22, 0,19,19,22,22, - 0,16,15,22,22, 0,19,19, 0,21, 0,15,15,20,20, 0, - 18,19, 0,21, 0,18,18,22,22, 0,16,16,21,20, 0,20, - 19,21,22, 0,16,15,20,20, 0,19,19, 0,22, 0,18,18, - 21, 0, 0,19,18,21,22, 0, 0, 0, 0, 0, 0,16,16,19, - 21, 0,20,22, 0,22, 0,18,18,20,21, 0,19,18, 0,22, - 0, 0, 0,22, 0, 0,16,16,20,20, 0,21,21, 0, 0, 0, - 18,18,21, 0, 0,12,12,17,17, 0,15,14,17,17, 0,14, - 14,18,18, 0,17,17,17,18, 0,18,18,18,18, 0,13,13, - 18,18, 0,16,17,19,18, 0,13,13,16,17, 0,17,17,18, - 19, 0,17,17,17,17, 0,13,13,17,17, 0,17,18,18,18, - 0,13,13,16,16, 0,18,18,19,20, 0,16,17,17,16, 0, - 17,18,19,18, 0, 0, 0,22,21, 0,15,15,16,16, 0,20, - 20,21,22, 0,17,17,16,16, 0,16,17,18,18, 0, 0, 0, - 21,21, 0,15,15,16,16, 0,21,20, 0, 0, 0,17,17,16, - 16, 0,10,10,14,14, 0,14,14,15,15, 0,14,14,15,15, - 0,22, 0,18,18, 0, 0, 0,19,19, 0,13,13,15,16, 0, - 17,16,18,18, 0,14,14,15,15, 0,21,21,19,18, 0,22, - 21,18,17, 0,14,14,15,15, 0,18,18,19,18, 0,15,15, - 14,14, 0,22,21,19,19, 0,22,21,17,18, 0, 0, 0,19, - 19, 0, 0, 0, 0, 0, 0,20,22,17,17, 0, 0,22,22,20, - 0, 0, 0,19,18, 0,21,22,19,18, 0, 0, 0, 0, 0, 0, - 22,22,17,18, 0, 0, 0,21,22, 0, 0, 0,19,18, 0,20, - 20,17,17, 0,21,21,17,18, 0,21,22,18,18, 0,21, 0, - 18,18, 0,22, 0,19,19, 0,19,21,18,18, 0, 0,22,18, - 18, 0,22,21,17,17, 0,22, 0,20,20, 0, 0, 0,18,18, - 0,22,21,18,18, 0,21, 0,19,19, 0,20,21,17,17, 0, - 0,22,22,20, 0,21,22,17,17, 0, 0,21,19,18, 0, 0, - 0,21,21, 0,21,20,16,17, 0, 0, 0, 0, 0, 0,21, 0, - 17,17, 0,21, 0,19,20, 0, 0, 0,20,22, 0,20,20,17, - 17, 0, 0, 0, 0, 0, 0,21,21,17,17, 0,12,12,13,13, - 0,14,14,16,16, 0,14,14,16,16, 0,18,18,21, 0, 0, - 19,19,22, 0, 0,13,13,16,16, 0,16,16,18,18, 0,13, - 13,16,16, 0,18,18,21,22, 0,18,18, 0,22, 0,13,13, - 16,16, 0,17,17,20,18, 0,13,13,16,16, 0,19,18, 0, - 22, 0,18,18,22,21, 0,18,19, 0, 0, 0, 0, 0, 0, 0, - 0,16,16,21,21, 0,21,21, 0, 0, 0,18,19, 0, 0, 0, - 19,19,21, 0, 0, 0, 0, 0, 0, 0,16,16, 0,21, 0,20, - 20, 0, 0, 0,20,20, 0, 0, 0,16,16,21,20, 0,18,17, - 21,22, 0,17,18, 0,21, 0,18,19,22,22, 0,19,19, 0, - 22, 0,16,17,21,22, 0,20,19, 0, 0, 0,16,16,20,21, - 0,19,19, 0, 0, 0,19,19, 0,22, 0,17,17,21,21, 0, - 19,20, 0, 0, 0,16,16, 0,20, 0,19,20, 0,21, 0,18, - 18, 0,22, 0,19,20,22,22, 0, 0, 0, 0,22, 0,17,17, - 0,21, 0,21,21, 0, 0, 0,18,19,23,21, 0,20,19, 0, - 0, 0, 0, 0, 0, 0, 0,17,17, 0,20, 0, 0, 0, 0, 0, - 0,19,19,23,22, -}; - -static const static_codebook _44p4_p5_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p4_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p4_p5_0, - 0 -}; - -static const long _vq_quantlist__44p4_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44p4_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p4_p5_1 = { - 1, 7, - (long *)_vq_lengthlist__44p4_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p4_p5_1, - 0 -}; - -static const long _vq_quantlist__44p4_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p4_p6_0[] = { - 1, 7, 7, 7, 8, 8, 7, 8, 8, 7, 9, 9,11,11,11, 9, - 8, 8, 8, 9, 9,12,11,12, 9, 8, 8, 6, 7, 7,10,11, - 11,10,10,10,11,11,11,14,14,14,12,11,12,11,11,11, - 15,15,14,13,12,12, 5, 6, 6, 8, 5, 5, 8, 7, 7, 8, - 7, 7,12,10,10,10, 7, 6, 9, 8, 8,12,10,10,10, 6, - 6, 7, 8, 8,12,10,10,12,10,10,11,10,10,16,14,14, - 13,10,10,12,10,10,15,14,14,14,10,10, 7, 7, 7,13, - 11,11,13,11,11,12,11,11,16,14,14,14,12,12,12,11, - 11,18,15,15,14,12,12,10, 9,10,14,11,11,13,11,11, - 12,11,11,17,14,14,14,11,11,13,11,11,16,15,15,14, - 11,11, 7, 8, 8,13,11,11,12,10,10,12,10,10,16,14, - 13,13,10,10,12,10,10,17,14,14,14,10,10, 8, 7, 7, - 12,11,11,13,11,11,12,11,11,16,15,14,14,12,12,12, - 11,11,16,15,15,14,12,12,11,10,10,14,11,11,13,11, - 11,13,11,11,17,14,14,14,11,11,13,11,11,18,14,15, - 15,11,10, -}; - -static const static_codebook _44p4_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44p4_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p4_p6_0, - 0 -}; - -static const long _vq_quantlist__44p4_p6_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p4_p6_1[] = { - 2, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, - 7, 7, 8, 8, 8, 9, 9, 9, 9, 8, 8, 6, 7, 7, 8, 8, - 8, 8, 8, 8, 9, 8, 8, 9, 8, 9, 9, 8, 8,10, 8, 8, - 10, 9, 9,10, 8, 8, 6, 6, 6, 8, 6, 6, 8, 7, 7, 8, - 7, 7,10, 8, 8, 9, 7, 7, 9, 7, 7,10, 8, 8, 9, 7, - 7, 7, 7, 7,10, 8, 8,11, 9, 9,10, 9, 9,11, 9, 9, - 11, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 7, 7, 7,10, - 9, 9,10, 9, 9,10, 9, 9,11,10,10,10, 9, 9,11, 9, - 10,11,10,11,10, 9, 9, 9, 8, 8,10, 9, 9,10, 9, 9, - 11, 9, 9,11,10,10,11, 9, 9,11, 9, 9,11,10,10,11, - 9, 9, 8, 8, 8,11, 9, 9,11, 9, 9,11, 9, 9,12, 9, - 9,12, 8, 8,11, 9, 9,12, 9, 9,12, 8, 8, 8, 7, 7, - 10, 9, 9,10, 9, 9,10, 9, 9,11,11,11,11, 9, 9,11, - 10,10,11,11,11,11, 9, 9,10, 9, 9,11, 9, 9,11, 9, - 10,11,10,10,11,10,10,11, 9, 9,11,10,10,11,10,10, - 11, 9, 9, -}; - -static const static_codebook _44p4_p6_1 = { - 5, 243, - (long *)_vq_lengthlist__44p4_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p4_p6_1, - 0 -}; - -static const long _vq_quantlist__44p4_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p4_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p4_p7_0 = { - 5, 243, - (long *)_vq_lengthlist__44p4_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p4_p7_0, - 0 -}; - -static const long _vq_quantlist__44p4_p7_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p4_p7_1[] = { - 1, 9, 9, 7, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, - 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 7, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 5, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 5,10, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 8,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10, -}; - -static const static_codebook _44p4_p7_1 = { - 5, 243, - (long *)_vq_lengthlist__44p4_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p4_p7_1, - 0 -}; - -static const long _vq_quantlist__44p4_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p4_p7_2[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p4_p7_2 = { - 1, 25, - (long *)_vq_lengthlist__44p4_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p4_p7_2, - 0 -}; - -static const long _vq_quantlist__44p4_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p4_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p4_p7_3 = { - 1, 25, - (long *)_vq_lengthlist__44p4_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p4_p7_3, - 0 -}; - -static const long _huff_lengthlist__44p4_short[] = { - 3, 5,16, 9, 9,13,18,21, 4, 2,21, 6, 6,10,15,21, - 16,19, 6, 5, 7,10,13,16, 8, 6, 5, 4, 4, 8,13,16, - 8, 5, 6, 4, 4, 7,12,15,13,10, 9, 7, 7, 9,13,16, - 18,15,13,12, 9, 7,10,14,21,18,13,13, 7, 5, 8,12, -}; - -static const static_codebook _huff_book__44p4_short = { - 2, 64, - (long *)_huff_lengthlist__44p4_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p5_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44p5_l0_0[] = { - 1, 4, 4, 8, 8,10,10,10,10, 9, 8,11,11, 4, 6, 5, - 8, 6,10,10,10,10,10, 9,10, 9, 4, 5, 6, 6, 9,10, - 10,10,10, 9,10, 9,10, 8, 9, 8, 9, 8, 9, 9,10, 9, - 11,10,12,10, 8, 8, 9, 8, 9, 9, 9, 9,10,10,11,10, - 12, 9,10,10,11,10,11,10,12,11,12,11,13,11, 9,10, - 10,10,11,10,11,11,12,11,12,11,12,11,12,12,12,12, - 13,12,13,12,13,12,13,13,11,12,12,12,12,12,12,12, - 13,13,13,13,13,12,12,12,13,13,13,13,13,13,13,13, - 13,13,12,13,12,13,13,13,13,13,13,13,13,13,13,12, - 13,13,13,14,14,13,13,13,13,13,13,13,12,13,12,13, - 13,13,13,13,13,13,13,13,13, -}; - -static const static_codebook _44p5_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44p5_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p5_l0_0, - 0 -}; - -static const long _vq_quantlist__44p5_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p5_l0_1[] = { - 4, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 4, 4, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p5_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44p5_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p5_l0_1, - 0 -}; - -static const long _vq_quantlist__44p5_l1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p5_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44p5_l1_0 = { - 2, 9, - (long *)_vq_lengthlist__44p5_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p5_l1_0, - 0 -}; - -static const long _huff_lengthlist__44p5_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44p5_lfe = { - 2, 4, - (long *)_huff_lengthlist__44p5_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44p5_long[] = { - 3, 7,12,14,14,16,18,19, 6, 2, 4, 6, 8, 9,12,14, - 12, 3, 3, 5, 7, 8,11,13,13, 6, 4, 5, 7, 8,10,11, - 14, 8, 7, 7, 7, 7, 9,10,15, 9, 8, 7, 7, 6, 8, 9, - 17,11,11,10, 9, 8, 9, 9,19,14,13,11,10, 9, 9, 9, -}; - -static const static_codebook _huff_book__44p5_long = { - 2, 64, - (long *)_huff_lengthlist__44p5_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p5_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p5_p1_0[] = { - 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 8, 9, - 10, 8, 9,10, 8, 9,10, 9,10,12,10,11,11, 8,10,10, - 10,11,11, 9,11,11, 5, 8, 7, 8, 9, 9, 8,10, 9, 8, - 10,10, 9,11,11,10,11,11, 8,10, 9,10,11,11, 9,12, - 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9, 9, 9,10,11, - 9,11,11, 8,10, 9,10,11,11,10,11,11, 7, 9, 9, 9, - 10,11, 9,11,11, 9, 9,11,10,10,13,11,11,12, 9,11, - 11,11,12,13,11,13,12, 7, 9, 9, 9,11,11, 9,11,10, - 9,11,10,10,11,12,11,13,12, 9,11,11,11,12,13,11, - 13,11, 5, 8, 8, 8, 9,10, 7,10, 9, 8, 9,10,10,11, - 11,10,11,11, 7, 9, 9, 9,11,11, 9,11,10, 7, 9, 9, - 9,10,11, 9,11,11, 9,11,11,11,11,13,11,13,12, 9, - 10,11,11,12,13,10,12,11, 7, 9, 9, 9,11,11, 9,11, - 10, 9,11,11,11,12,13,11,13,12, 9,11, 9,11,12,11, - 10,13,10, -}; - -static const static_codebook _44p5_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44p5_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p5_p1_0, - 0 -}; - -static const long _vq_quantlist__44p5_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p5_p2_0[] = { - 4, 6, 6, 9, 9, 6, 7, 8,10,10, 6, 8, 7,10,10, 8, - 10,10,12,13, 8,10,10,13,12, 6, 7, 8,10,10, 7, 8, - 9,10,11, 8, 9, 9,11,11,10,10,11,12,14,10,11,11, - 14,13, 6, 8, 7,10,10, 8, 9, 9,11,11, 7, 9, 8,11, - 10,10,11,11,13,14,10,11,10,14,12, 9,10,10,12,12, - 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,13, - 14,13,15,14, 9,10,10,12,12,10,11,11,13,13,10,11, - 10,13,12,13,13,14,14,15,12,13,12,15,12, 6, 7, 8, - 10,11, 8, 9,10,11,12, 8, 9, 9,11,12,10,11,12,13, - 14,10,11,11,14,13, 8, 9,10,11,12, 9,10,11,12,13, - 9,10,11,12,13,11,12,13,13,15,12,12,13,15,14, 8, - 9, 9,12,12, 9,10,11,12,13, 9,10,10,13,12,12,12, - 13,14,15,11,12,12,14,14,11,11,12,13,14,11,12,13, - 13,15,12,13,13,14,15,14,13,15,14,16,14,15,15,16, - 16,11,12,11,14,13,12,13,13,15,14,11,13,12,14,13, - 14,15,15,15,16,13,14,14,16,14, 6, 8, 7,11,10, 8, - 9, 9,11,12, 8,10, 9,12,11,10,11,11,13,14,10,12, - 11,14,13, 8, 9, 9,12,12, 9,10,10,12,13, 9,11,10, - 13,12,11,12,12,13,14,12,13,12,15,14, 8,10, 9,12, - 11, 9,11,10,13,12, 9,11,10,13,12,12,13,12,14,15, - 11,13,12,15,13,11,11,12,13,14,11,12,13,13,15,12, - 13,13,14,15,13,14,14,14,16,14,15,15,16,16,11,12, - 11,14,13,12,13,13,15,14,11,13,12,15,13,14,15,15, - 16,16,13,15,13,16,14, 9,10,11,12,14,11,11,12,13, - 15,11,12,12,13,14,13,14,15,15,17,13,14,14,15,16, - 11,11,12,13,15,12,12,13,14,16,12,13,13,14,15,14, - 14,16,15,17,15,15,15,16,17,11,12,12,14,14,12,13, - 13,15,16,12,13,13,15,15,15,15,15,16,17,14,15,15, - 16,16,14,14,15,15,17,14,15,15,15,17,15,15,16,16, - 17,16,16,17,16,18,17,17,17,18,18,14,15,14,16,16, - 15,15,16,17,17,14,15,15,17,16,17,17,17,18,18,16, - 16,16,17,17, 9,11,10,14,12,11,12,12,14,13,11,12, - 11,15,13,13,14,14,16,15,13,15,14,17,15,11,12,12, - 15,14,12,13,13,15,15,12,13,13,15,15,14,15,15,16, - 16,15,15,15,17,16,11,12,11,15,13,12,13,13,15,14, - 12,13,12,16,14,15,15,15,17,16,14,15,14,17,15,14, - 14,15,16,16,14,15,15,16,16,15,16,15,17,17,16,16, - 16,17,17,17,17,17,18,17,14,15,14,16,15,15,15,15, - 17,16,15,15,15,17,15,17,17,17,18,18,16,17,16,18, - 16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12,11, - 10,11,11,13,14,10,12,11,14,13, 7, 9, 9,11,12, 9, - 10,10,12,13, 9,10,10,13,13,11,11,12,13,15,11,12, - 12,15,14, 8, 9, 9,12,11, 9,11,10,13,13, 9,11,10, - 13,12,12,13,12,14,15,11,13,12,15,13,10,11,12,13, - 14,11,12,12,13,15,12,12,13,14,15,13,13,14,14,16, - 14,15,15,16,16,11,12,11,14,13,12,13,13,15,14,11, - 13,12,15,13,14,15,15,15,16,13,14,14,16,14, 7, 9, - 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12,12, - 14,15,11,12,12,15,14, 9, 9,11,11,13,10,10,12,12, - 14,10,11,12,13,14,12,12,13,14,16,12,13,13,15,15, - 9,11,10,13,13,10,12,12,13,14,10,12,11,14,13,12, - 13,13,15,16,12,13,13,15,14,11,11,13,13,15,12,12, - 14,13,16,13,13,13,14,15,14,14,15,14,17,15,15,15, - 16,16,12,13,12,15,14,13,14,14,15,15,12,14,13,16, - 14,15,15,16,16,17,14,15,14,17,15, 7, 9, 9,12,11, - 9,10,10,12,13, 9,11,10,13,12,11,12,12,14,14,11, - 13,12,15,14, 9,10,10,13,12,10,10,11,12,13,10,12, - 11,14,13,12,12,13,13,15,12,14,13,16,15, 9,10,10, - 13,12,11,11,12,13,13,10,12,10,14,12,13,13,13,15, - 15,12,13,12,15,13,11,12,12,14,14,12,12,13,14,15, - 13,14,13,15,15,14,13,15,13,16,15,16,15,17,16,12, - 13,12,14,14,13,14,14,15,15,12,13,12,15,14,15,15, - 16,16,17,14,15,13,16,13,10,11,12,13,14,11,12,13, - 14,15,12,13,13,15,15,14,14,15,15,17,14,15,15,16, - 16,12,12,13,12,15,12,12,14,13,16,13,13,14,14,16, - 14,14,16,15,17,15,15,16,16,17,12,13,13,15,15,13, - 14,14,16,16,13,14,13,16,15,15,16,16,17,17,14,15, - 15,17,16,14,14,15,14,17,15,15,16,15,17,15,15,16, - 15,17,16,16,17,16,18,17,17,17,17,18,14,15,15,17, - 16,15,16,16,17,17,15,16,15,17,16,17,17,17,18,18, - 16,17,16,18,17,10,12,11,14,14,12,13,13,15,15,12, - 13,12,15,14,14,15,15,16,16,14,15,15,17,16,11,13, - 12,15,14,12,13,13,15,15,13,14,13,16,14,15,15,15, - 16,16,15,16,15,17,16,12,13,13,15,15,13,14,14,16, - 16,12,14,13,16,15,15,16,16,17,17,15,16,15,17,16, - 14,15,15,16,16,14,15,15,16,16,15,16,16,17,16,16, - 16,16,16,17,17,18,17,18,17,14,15,15,17,16,15,16, - 16,17,17,15,16,15,17,16,17,17,18,18,18,16,17,16, - 18,16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, - 11,10,11,12,13,14,10,11,11,14,13, 8, 9, 9,11,12, - 9,10,11,12,13, 9,10,11,13,13,11,12,13,13,15,12, - 12,12,15,14, 7, 9, 9,12,11, 9,10,10,13,13, 9,10, - 10,13,12,11,12,12,14,15,11,12,11,15,13,11,11,12, - 13,14,11,12,13,13,15,12,13,13,14,15,13,14,14,14, - 16,14,15,15,16,16,10,12,11,14,13,12,13,12,14,14, - 11,12,12,15,13,14,15,15,16,16,13,14,13,16,14, 7, - 9, 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12, - 13,14,15,11,12,12,14,14, 9,10,10,12,13,10,10,12, - 12,14,11,12,11,13,13,12,12,14,13,15,13,13,13,15, - 15, 9,10,10,12,13,10,11,12,13,14,10,11,10,13,12, - 13,13,14,15,16,12,13,12,15,13,12,13,13,14,14,12, - 12,13,14,15,13,14,14,15,15,14,13,15,13,16,15,16, - 15,17,16,11,12,12,14,14,13,13,14,15,15,12,13,12, - 15,14,15,15,16,16,17,14,14,13,16,13, 7, 9, 9,12, - 11, 9,10,10,12,13, 9,11,10,13,12,11,12,12,14,15, - 11,12,12,15,14, 9,10,11,13,13,10,11,12,13,14,10, - 12,12,14,13,12,13,13,14,16,12,13,13,16,15, 9,11, - 9,13,11,10,12,11,13,13,10,12,10,14,12,12,13,13, - 15,15,12,13,12,16,14,12,12,13,14,15,12,13,14,14, - 15,13,14,14,15,15,14,14,15,15,17,15,16,15,17,16, - 11,13,11,15,13,13,14,13,15,14,12,14,12,16,13,15, - 15,15,16,16,14,15,14,17,14,10,11,12,14,14,12,12, - 13,14,15,12,13,13,15,15,14,15,15,16,17,14,15,15, - 16,16,12,12,13,15,15,13,13,14,15,16,13,14,14,16, - 16,15,15,16,16,17,15,16,16,17,17,11,12,13,14,15, - 13,13,14,15,16,12,13,13,15,15,15,15,16,16,17,15, - 15,15,16,16,14,15,15,16,17,15,15,16,16,17,15,16, - 16,17,17,16,16,17,16,18,17,17,17,18,18,14,15,15, - 16,16,15,16,16,16,17,15,15,15,16,16,17,17,17,18, - 18,16,16,16,17,16,10,12,11,14,13,12,13,13,15,15, - 11,13,12,15,14,14,15,15,16,16,14,15,14,17,15,12, - 13,13,15,15,13,13,14,16,16,13,14,14,16,16,15,15, - 15,16,17,15,16,16,17,17,12,13,12,15,12,13,14,13, - 16,14,12,14,12,16,13,15,16,15,17,16,14,16,14,17, - 15,14,15,15,16,17,15,15,16,17,17,15,16,16,17,17, - 16,16,17,17,18,17,18,17,18,18,14,15,14,17,14,15, - 16,15,17,15,15,16,15,17,15,17,17,17,18,17,16,17, - 16,18,16, 9,11,11,14,14,11,12,12,14,14,11,12,12, - 15,14,13,14,14,16,16,13,15,14,16,16,10,11,12,14, - 14,11,12,13,15,15,12,13,13,15,15,13,14,15,16,17, - 14,15,15,17,16,11,12,12,15,14,12,13,13,15,15,12, - 13,13,15,15,14,15,15,16,16,14,15,15,17,16,12,13, - 14,15,16,13,14,14,15,16,13,14,15,16,16,15,15,16, - 16,18,16,16,16,18,17,14,14,14,16,15,15,15,15,17, - 16,14,15,15,17,16,16,17,17,18,17,16,16,16,18,16, - 10,12,12,14,14,11,12,13,15,15,12,13,13,15,15,13, - 14,15,16,17,14,15,15,17,16,11,12,13,14,15,12,12, - 14,15,16,13,13,14,15,16,14,14,15,16,17,15,15,16, - 17,17,12,13,13,15,15,13,14,14,16,16,13,14,13,16, - 15,15,16,15,17,17,15,16,15,17,16,13,13,15,14,17, - 14,13,16,15,17,15,14,16,15,17,15,15,17,16,18,16, - 16,17,17,18,14,15,15,17,16,15,16,16,17,17,15,16, - 15,17,16,17,17,17,18,18,16,17,16,18,17,10,12,11, - 14,14,11,12,13,15,15,12,13,12,15,15,14,15,15,16, - 16,14,15,15,17,16,11,12,12,15,15,12,13,13,15,15, - 13,14,13,16,15,14,15,15,16,16,15,16,15,17,16,11, - 13,13,15,15,13,14,14,15,15,12,14,13,16,15,15,16, - 15,17,17,15,16,15,17,16,13,15,14,16,16,14,15,14, - 16,16,15,16,15,17,16,15,16,16,16,17,16,17,16,18, - 17,14,15,15,16,16,15,16,16,17,17,15,15,15,17,16, - 17,17,17,18,18,16,16,16,18,16,12,13,13,15,16,13, - 14,14,15,16,13,14,14,16,16,15,15,16,16,18,15,16, - 16,17,17,13,13,14,15,16,14,14,15,15,17,14,15,15, - 16,17,15,15,17,16,18,16,16,17,17,17,13,14,14,16, - 16,14,15,15,17,17,14,15,14,17,16,16,17,16,17,18, - 16,17,16,18,17,15,15,16,14,17,16,15,17,14,18,16, - 16,16,15,18,16,16,18,15,19,18,18,18,17,19,15,16, - 16,18,17,16,17,17,18,17,16,17,16,18,17,18,18,18, - 19,19,17,18,16,18,17,11,12,12,15,15,13,13,14,15, - 16,13,14,13,16,15,15,16,16,16,17,15,16,16,17,16, - 12,14,13,16,15,13,13,14,15,16,14,15,14,17,15,15, - 15,16,16,17,16,17,16,18,17,12,13,14,15,16,14,15, - 15,16,16,13,14,13,16,15,16,16,16,17,17,15,16,15, - 17,15,15,16,15,17,16,15,15,15,16,16,16,17,16,18, - 16,16,15,16,15,17,17,18,17,18,17,15,15,16,17,17, - 16,16,17,17,17,15,16,15,17,16,18,18,18,18,18,16, - 17,16,18,15, 9,11,11,14,14,11,12,12,14,15,10,12, - 12,15,14,13,14,15,16,16,13,14,14,16,16,11,12,12, - 14,15,12,12,13,15,15,12,13,13,15,15,14,15,15,16, - 17,14,15,15,16,16,10,12,12,14,14,12,13,13,15,15, - 11,13,12,15,15,14,15,15,16,17,13,15,14,16,16,14, - 14,14,15,16,14,15,15,16,17,14,15,15,16,17,16,16, - 17,16,18,16,17,17,17,17,12,14,13,16,15,13,15,14, - 16,16,13,14,14,16,15,16,16,16,17,17,15,16,15,17, - 16,10,11,11,14,14,12,12,13,14,15,11,13,12,15,14, - 14,15,15,16,17,14,15,15,16,16,12,13,13,15,15,12, - 13,14,15,16,13,14,14,15,15,15,15,16,16,17,15,15, - 16,17,17,11,12,12,15,15,13,13,14,15,16,12,13,13, - 15,15,15,15,16,16,17,14,15,15,16,16,14,15,15,16, - 16,15,15,15,16,17,15,16,16,17,17,16,16,17,16,18, - 17,17,17,17,18,13,14,15,16,16,15,15,16,16,17,14, - 14,14,16,16,16,16,17,17,18,16,16,16,17,16,10,12, - 12,14,14,12,13,13,15,15,11,13,12,15,15,14,15,15, - 16,17,13,15,14,17,16,12,13,13,15,15,13,13,14,15, - 16,13,14,14,16,16,15,15,16,16,17,15,15,16,17,17, - 11,13,12,15,14,13,14,13,16,15,12,14,12,16,15,15, - 16,15,17,17,14,15,14,17,16,14,15,15,16,17,15,15, - 16,16,17,15,16,16,17,17,16,16,17,17,18,17,17,17, - 18,18,13,15,13,17,14,14,16,14,17,16,14,15,13,17, - 15,16,17,16,18,17,15,17,15,18,16,11,12,12,15,15, - 13,13,14,15,16,13,14,13,16,15,15,16,16,16,17,15, - 16,16,17,16,12,14,13,16,15,13,13,14,15,16,14,15, - 15,16,16,16,15,16,16,17,16,16,16,17,17,12,13,14, - 15,16,14,14,15,15,17,13,14,13,16,15,16,16,17,17, - 18,15,16,15,17,15,15,16,15,17,17,15,15,16,16,17, - 16,17,16,17,17,16,15,17,15,18,17,18,17,18,18,15, - 15,16,16,17,16,16,17,16,18,15,15,15,16,16,17,17, - 18,17,18,16,16,15,17,15,12,13,13,15,15,13,14,14, - 16,16,13,14,14,16,16,15,16,16,17,18,15,16,15,18, - 16,13,14,14,16,16,14,14,15,16,17,14,15,15,17,17, - 16,16,17,17,18,16,16,17,18,17,13,14,13,16,14,14, - 15,15,17,16,14,15,14,17,15,16,17,17,18,17,15,17, - 15,18,16,15,16,16,17,17,16,16,17,17,18,16,17,17, - 18,18,17,16,18,17,19,18,18,18,18,18,15,16,15,17, - 14,16,16,16,18,15,16,17,15,18,14,18,18,18,18,17, - 17,18,16,19,15, -}; - -static const static_codebook _44p5_p2_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p5_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p5_p2_0, - 0 -}; - -static const long _vq_quantlist__44p5_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p5_p3_0[] = { - 1, 5, 6, 5, 7, 8, 5, 8, 7, 5, 7, 8, 7, 8,10, 8, - 10,10, 5, 8, 7, 8,10,10, 7,10, 8, 6, 8, 9, 8,10, - 11, 9,10,10, 9,10,11,10,11,12,11,12,12, 9,11,10, - 11,12,12,10,12,11, 6, 9, 8, 9,10,10, 8,11,10, 9, - 10,11,10,11,12,11,12,12, 9,11,10,11,12,12,10,12, - 11, 6, 9, 9, 8,10,11, 9,11,10, 8,10,10,10,10,12, - 11,12,12, 9,11,10,11,12,12,10,12,11, 8,10,10,10, - 11,12,10,12,11,10,10,12,11,11,13,12,13,13,10,12, - 11,12,13,13,11,13,11, 7,10,10,10,11,12,10,12,11, - 10,12,11,11,11,12,12,14,13,10,12,12,12,14,14,11, - 13,11, 6, 9, 9, 9,10,11, 8,11,10, 9,10,11,10,11, - 12,11,12,12, 8,11,10,11,12,12,10,12,10, 7,10,10, - 10,11,12,10,12,11,10,12,12,11,11,13,12,13,13,10, - 11,12,12,13,14,11,12,11, 8,10,10,10,11,12,10,12, - 11,10,11,12,11,11,13,12,13,13,10,12,10,12,13,13, - 11,13,11, -}; - -static const static_codebook _44p5_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44p5_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p5_p3_0, - 0 -}; - -static const long _vq_quantlist__44p5_p3_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p5_p3_1[] = { - 5, 6, 6, 6, 7, 7, 6, 7, 7, 6, 7, 7, 7, 7, 8, 7, - 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, - 8, 9, 9, 8, 9, 9, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, - 8, 6, 8, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 9, - 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, - 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 7, 8, 8, 8, 8, 9, 8, 9, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, 8, - 9, 9, 6, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, - 8, 8, 9, 8, 9, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 8, - 8, 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, - 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p5_p3_1 = { - 5, 243, - (long *)_vq_lengthlist__44p5_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p5_p3_1, - 0 -}; - -static const long _vq_quantlist__44p5_p4_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p5_p4_0[] = { - 1, 5, 5, 5, 7, 9, 5, 9, 7, 5, 7, 8, 7, 7,10, 9, - 10,10, 5, 8, 7, 9,10,10, 7,10, 7, 6, 8, 9, 9,10, - 12, 9,11,11, 9,10,11,11,11,13,12,13,13, 9,11,11, - 11,12,13,11,13,11, 6, 9, 8, 9,11,11, 9,12,10, 9, - 11,11,11,11,13,11,13,12, 9,11,10,12,13,13,11,13, - 11, 6, 9, 9, 8,10,11, 9,12,11, 9,10,11,10,10,12, - 11,13,13, 9,11,11,11,13,12,11,13,11, 8,10,10, 9, - 10,12,10,12,11,10,10,12,10,10,13,12,13,13,10,12, - 11,12,13,13,10,13,10, 7,10,10,11,11,13,11,14,11, - 10,12,11,11,11,13,13,14,13,10,12,12,14,14,14,11, - 14,11, 6, 9, 9, 9,11,12, 8,11,10, 9,11,11,11,11, - 13,11,12,13, 8,11,10,11,13,13,10,12,10, 7,10,10, - 11,11,14,11,13,11,10,12,12,11,11,14,14,14,14,10, - 11,12,13,13,14,11,13,11, 8,10,10,10,11,12, 9,12, - 10,10,11,12,11,10,13,12,13,13,10,12,10,12,13,13, - 11,13,10, -}; - -static const static_codebook _44p5_p4_0 = { - 5, 243, - (long *)_vq_lengthlist__44p5_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p5_p4_0, - 0 -}; - -static const long _vq_quantlist__44p5_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p5_p4_1[] = { - 5, 7, 7,10,10, 7, 8, 9,10,11, 7, 9, 8,11,10, 9, - 10,10,11,11, 9,10,10,11,11, 7, 9, 9,10,10, 8, 9, - 10,10,11, 9,10,10,11,11,10,10,11,11,11,10,11,11, - 12,12, 7, 9, 9,10,10, 9,10,10,11,11, 8,10, 9,11, - 10,10,11,11,11,11,10,11,10,11,11,10,10,10,11,11, - 10,10,11,11,11,11,11,11,11,11,11,11,12,11,12,11, - 12,11,12,12,10,10,10,11,11,10,11,11,11,11,10,11, - 10,11,11,11,12,11,12,12,11,12,11,12,11, 8, 9, 9, - 11,11, 9,10,10,11,12, 9,10,10,11,11,10,11,11,12, - 12,10,11,11,12,12, 9,10,10,11,11,10,10,11,11,12, - 10,11,11,12,12,11,11,12,12,12,11,12,12,12,12, 9, - 10,10,11,11,10,11,11,12,12,10,11,10,12,12,11,12, - 12,12,12,11,12,12,12,12,11,11,11,12,12,11,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12, 8, 9, 9,11,11, 9, - 10,10,11,11, 9,10,10,11,11,10,11,11,12,12,10,11, - 11,12,12, 9,10,10,11,11,10,10,11,12,12,10,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12, 9,10,10,11, - 11,10,11,11,12,12,10,11,10,12,11,11,12,12,12,12, - 11,12,11,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, - 11,12,12,11,12,12,12,12,11,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,10,11,11,12,12,11,12,12,12, - 12,11,12,12,12,12,12,12,13,13,13,12,12,12,13,13, - 11,12,12,12,12,12,12,12,12,13,12,12,12,13,13,12, - 12,13,13,13,12,13,13,13,13,11,12,12,12,12,12,12, - 12,13,13,12,12,12,13,13,12,13,13,13,13,12,13,13, - 13,13,12,12,12,12,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,12,12,12,13,12, - 13,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,10,11,11,12,12,11,12,12,12,12,11,12, - 11,12,12,12,12,12,13,12,12,12,12,13,13,11,12,12, - 12,12,12,12,12,13,13,12,12,12,13,13,12,13,13,13, - 13,12,13,13,13,13,11,12,12,12,12,12,12,12,13,13, - 12,12,12,13,12,12,13,13,13,13,12,13,12,13,13,12, - 12,12,12,13,12,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,12,12,12,13,12,13,13,13, - 13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13, 8, 9, 9,11,11, 9,10,10,11,11, 9,10,10,12,11, - 10,11,11,12,12,10,11,11,12,12, 9,10,10,11,11,10, - 10,11,11,12,10,11,11,12,12,11,11,12,12,12,11,12, - 12,12,12, 9,10,10,11,11,10,11,11,12,12,10,11,10, - 12,12,11,12,12,12,12,11,12,12,12,12,11,11,11,12, - 12,11,11,12,12,12,11,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12, 9,10, - 10,11,11,10,10,11,12,12,10,11,11,12,12,11,11,12, - 12,12,11,12,12,12,12,10,10,11,11,12,11,11,12,12, - 12,11,11,12,12,12,11,11,12,12,13,12,12,12,12,12, - 10,11,11,12,12,11,12,11,12,12,11,12,11,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,12,12,12,12,12, - 12,12,12,12,12,12,12,13,12,12,13,12,13,12,12,13, - 13,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,12,12,12,12,13,12, 8,10,10,11,11, - 10,11,11,12,12,10,11,10,12,12,11,12,12,12,12,11, - 12,12,12,12,10,11,10,12,12,10,10,11,12,12,11,12, - 12,12,12,12,12,12,12,13,12,12,12,13,13,10,11,11, - 12,12,11,12,12,12,12,10,12,11,12,12,12,12,12,13, - 13,12,13,12,13,12,11,12,12,12,12,11,12,12,12,13, - 12,12,12,13,13,12,12,13,12,13,12,13,13,13,13,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,13, - 13,13,13,12,13,12,13,12,11,11,11,12,12,11,12,12, - 12,13,11,12,12,12,12,12,12,12,13,13,12,12,13,13, - 13,11,12,12,12,12,12,12,12,12,13,12,12,13,13,13, - 12,12,13,13,13,13,13,13,13,13,11,12,12,12,12,12, - 13,12,13,13,12,12,12,13,13,12,13,13,13,13,12,13, - 13,13,13,12,12,12,12,13,12,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,10,11,11,12,12,11,12,12,12,13,11, - 12,12,13,12,12,13,13,13,13,12,13,13,13,13,11,12, - 12,12,12,12,12,12,13,13,12,13,12,13,13,13,13,13, - 13,13,13,13,13,13,13,11,12,12,13,12,12,13,12,13, - 13,12,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 12,13,13,13,13,12,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13, 8, 9, 9,11,11, 9,10,10,11,12, 9,10,10,11, - 11,10,11,11,12,12,10,11,11,12,12, 9,10,10,11,11, - 10,10,11,12,12,10,11,11,12,12,11,11,12,12,12,11, - 12,12,12,12, 9,10,10,11,11,10,11,11,12,12,10,11, - 10,12,12,11,12,12,12,12,11,12,11,12,12,11,11,11, - 12,12,11,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12, 8, - 10,10,11,11,10,10,11,12,12,10,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,10,11,11,12,12,10,11,12, - 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 13,10,10,11,12,12,11,12,12,12,12,10,11,10,12,12, - 12,12,12,13,13,12,12,12,13,12,11,12,12,12,12,11, - 12,12,12,13,12,12,12,13,13,12,12,13,12,13,12,13, - 13,13,13,11,12,12,12,12,12,12,12,13,13,11,12,12, - 13,12,12,13,13,13,13,12,13,12,13,12, 9,10,10,11, - 11,10,11,11,12,12,10,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,10,11,11,12,12,11,11,12,12,12,11, - 11,12,12,12,12,12,12,12,13,12,12,12,13,12,10,11, - 10,12,11,11,12,11,12,12,11,12,11,12,12,12,12,12, - 12,12,12,12,11,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,13,12,13,12,13,13,13,13, - 11,12,11,12,12,12,12,12,13,12,12,12,12,12,12,12, - 13,12,13,13,12,12,12,13,12,10,11,11,12,12,11,12, - 12,12,13,11,12,12,13,12,12,12,13,13,13,12,13,13, - 13,13,11,12,12,12,13,12,12,13,13,13,12,12,13,13, - 13,13,13,13,13,13,13,13,13,13,13,11,12,12,12,12, - 12,12,13,13,13,12,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,12,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,13, - 13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,11,11,11,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,13,13,13,12,13,12,13,13,11, - 12,12,12,12,12,12,13,13,13,12,12,13,13,13,12,13, - 13,13,13,12,13,13,13,13,11,12,12,12,12,12,13,12, - 13,13,12,12,12,13,12,13,13,13,13,13,12,13,12,13, - 13,12,12,12,13,13,12,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,12,12,12,13,12,13, - 13,13,13,13,12,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,10,11,11,12,12,11,12,12,12,12,11,12,12, - 12,12,12,12,12,13,13,12,12,12,13,13,11,12,12,12, - 12,11,12,12,13,13,12,12,12,13,13,12,12,13,13,13, - 12,13,13,13,13,11,12,12,12,12,12,12,12,13,13,12, - 12,12,13,12,12,13,13,13,13,12,13,12,13,13,12,12, - 12,12,12,12,12,13,13,13,12,13,13,13,13,12,13,13, - 13,13,13,13,13,13,13,12,12,12,13,12,12,13,13,13, - 13,12,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 10,11,11,12,12,11,12,12,12,13,11,12,12,13,12,12, - 12,12,13,13,12,12,12,13,13,11,12,12,12,12,12,12, - 13,13,13,12,12,12,13,13,12,12,13,13,13,12,13,13, - 13,13,11,12,12,12,12,12,12,12,13,13,12,12,12,13, - 13,12,13,13,13,13,12,13,13,13,13,12,12,12,12,13, - 12,12,13,13,13,12,13,13,13,13,12,13,13,13,13,13, - 13,13,13,13,12,12,12,13,13,13,13,13,13,13,12,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,10,11,11, - 12,12,11,12,12,12,13,11,12,12,13,12,12,13,13,13, - 13,12,13,12,13,13,11,12,12,13,13,12,12,12,13,13, - 12,12,13,13,13,12,13,13,13,13,13,13,13,13,13,11, - 12,12,13,12,12,13,12,13,13,12,13,12,13,13,13,13, - 13,13,13,12,13,13,13,13,12,12,12,13,13,12,13,13, - 13,13,12,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,12,12,12,13,13,12,13,13,13,13,12,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,11,11,11,12,12,11, - 12,12,12,12,11,12,12,12,12,12,12,12,13,13,12,12, - 12,13,13,11,12,12,12,12,12,12,12,12,13,12,12,12, - 13,13,12,12,13,13,13,12,13,13,13,13,11,12,12,12, - 12,12,12,12,13,13,12,12,12,13,12,12,13,13,13,13, - 12,13,12,13,13,12,12,12,12,12,12,12,13,12,13,12, - 13,13,13,13,12,13,13,12,13,13,13,13,13,13,12,12, - 12,12,12,12,13,13,13,13,12,13,12,13,13,13,13,13, - 13,13,12,13,13,13,12,10,11,11,12,12,11,12,12,12, - 12,11,12,12,12,12,12,12,12,13,13,12,13,12,13,13, - 11,12,12,12,12,12,12,12,13,13,12,12,12,13,13,12, - 12,13,13,13,13,13,13,13,13,11,12,12,12,12,12,13, - 12,13,13,12,13,12,13,13,12,13,13,13,13,12,13,12, - 13,13,12,12,12,12,12,12,13,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,12,12,12,13,12, - 12,13,13,13,13,12,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,10,11,11,12,12,11,12,12,12,12,11,12, - 12,12,12,12,12,12,13,13,12,12,12,13,13,11,12,12, - 12,12,12,12,12,13,13,12,12,12,13,13,12,12,13,13, - 13,12,12,13,13,13,11,12,11,12,12,12,12,12,13,13, - 11,12,12,13,13,12,13,13,13,13,12,13,12,13,13,12, - 12,12,12,12,12,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,12,12,12,13,12,12,13,13, - 13,13,12,13,12,13,13,13,13,13,13,13,12,13,13,13, - 13,10,11,11,12,12,11,12,12,12,13,11,12,12,13,12, - 12,12,13,13,13,12,13,13,13,13,11,12,12,13,13,12, - 12,13,13,13,12,12,13,13,13,12,13,13,13,13,13,13, - 13,13,13,11,12,12,13,12,12,13,12,13,13,12,12,12, - 13,13,12,13,13,13,13,13,13,13,13,13,12,12,13,13, - 13,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,12,12,12,13,13,13,13,13,13,13,12, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,10,12, - 11,12,12,11,12,12,12,13,11,12,12,12,12,12,12,12, - 13,13,12,12,12,13,13,11,12,12,12,13,12,12,12,13, - 13,12,12,12,13,13,12,13,13,13,13,12,13,13,13,13, - 11,12,12,13,12,12,12,12,13,13,12,12,12,13,13,12, - 13,13,13,13,12,13,12,13,13,12,13,12,13,13,12,13, - 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,12,12,12,13,12,13,13,13,13,13,12,13,12,13, - 13,13,13,13,13,13,12,13,13,13,13,10,11,11,12,12, - 11,12,12,12,13,11,12,12,12,12,12,12,12,13,13,12, - 12,12,13,13,11,12,12,12,12,12,12,13,13,13,12,13, - 13,13,13,12,12,13,13,13,13,13,13,13,13,11,12,12, - 12,12,12,13,12,13,13,12,12,12,13,13,12,13,13,13, - 13,12,13,12,13,13,12,12,12,12,13,12,13,13,13,13, - 12,13,13,13,13,12,13,13,13,13,13,13,13,13,13,12, - 12,12,12,12,12,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,12,13,13,13,13,11,12,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 12,11,12,12,12,12,12,12,12,12,13,12,12,12,13,13, - 12,12,13,13,13,12,13,13,13,13,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,12,12,13,13,13,13,12,13, - 12,13,13,12,12,12,12,12,12,12,13,13,13,12,13,13, - 13,13,13,13,13,12,13,13,13,13,13,13,12,12,12,12, - 12,12,13,13,13,13,12,13,12,13,12,13,13,13,13,13, - 13,13,13,13,12, -}; - -static const static_codebook _44p5_p4_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p5_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p5_p4_1, - 0 -}; - -static const long _vq_quantlist__44p5_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p5_p5_0[] = { - 1, 6, 6,10,10, 6, 7, 9,11,13, 5, 9, 7,13,11, 8, - 11,12,13,15, 8,12,11,15,13, 6, 7, 8,11,11, 7, 8, - 10,11,13, 9,10,10,13,13,11,11,13,12,16,12,13,13, - 16,15, 6, 8, 7,11,11, 9,10,10,13,13, 7,10, 7,13, - 11,12,13,13,15,16,11,13,11,16,12,10,11,11,11,13, - 11,11,13,12,15,13,13,13,14,15,13,12,15,12,17,15, - 16,16,16,16,10,11,11,14,11,13,13,13,15,14,11,13, - 11,15,12,15,15,16,16,16,13,15,12,17,12, 6, 8, 9, - 12,12, 9,10,12,13,15, 9,11,11,15,14,12,13,15,16, - 18,13,14,14,17,16, 9,10,11,13,14,11,10,13,14,16, - 11,12,12,15,15,14,13,16,15,18,14,15,15,17,17, 9, - 11,11,14,14,11,12,13,15,16,11,13,11,15,14,15,15, - 15,17,18,14,15,14,17,15,13,14,14,15,16,14,14,15, - 15,17,15,16,15,17,17,16,16,17,15,19,17,18,18,19, - 18,13,14,14,16,15,15,15,16,17,17,14,15,14,18,15, - 17,17,17,19,19,16,17,15,19,16, 6, 9, 8,13,12, 9, - 11,11,14,15, 9,12,10,15,13,13,14,14,16,17,12,15, - 13,18,16, 9,11,11,14,14,11,11,13,14,15,11,13,12, - 16,15,14,14,15,15,18,14,15,15,18,17, 9,11,10,14, - 13,11,12,12,15,15,11,13,10,16,14,14,15,15,16,18, - 14,16,13,18,15,13,14,14,16,16,14,14,15,15,17,15, - 16,15,17,17,16,16,17,16,19,17,18,17,18,19,13,14, - 14,16,15,15,15,15,17,17,14,15,14,17,15,17,17,17, - 18,19,16,17,15,19,15,11,13,13,15,16,13,14,15,16, - 18,14,15,15,17,17,16,16,18,18,20,17,18,17,19,20, - 13,14,14,16,17,15,15,16,17,18,15,16,16,17,17,18, - 17,19,18,19,18,18,18,19,21,14,14,15,16,17,15,15, - 16,18,18,15,16,16,17,18,18,18,19,19,21,18,19,19, - 22,20,16,16,17,17,19,17,17,17,18,20,17,18,18,20, - 19,19,19,20,19, 0,19,19,20,20,21,17,17,17,19,18, - 18,18,20,19,19,18,18,18,20,20,19,19,20,20,20,20, - 21,20,21,19,11,13,13,16,15,14,15,15,17,17,14,15, - 14,18,16,16,18,18,20,19,16,19,17,21,18,13,14,15, - 16,17,15,15,16,18,18,15,16,15,19,18,18,18,18,19, - 19,18,18,18,22,20,13,14,14,16,16,15,16,16,18,17, - 15,16,15,18,17,18,18,18,19,19,17,18,17,21,18,16, - 17,17,18,18,17,18,19,19,19,18,20,18,19,19,19,20, - 21,19,21,20,20,20, 0,21,16,17,17,19,19,18,18,18, - 19,21,17,18,18,19,18,20,19,21,20,21,19,20,20,22, - 19, 7, 9, 9,13,13, 8,10,11,14,15, 9,12,11,15,14, - 11,13,14,16,17,13,15,14,17,16, 8,10,11,14,14,10, - 10,12,14,16,11,12,12,16,15,13,12,15,15,18,14,15, - 15,19,17, 9,11,11,14,14,11,12,12,15,15,11,13,11, - 16,14,14,15,14,17,17,14,16,14,18,15,12,13,14,15, - 16,13,13,15,14,17,15,15,15,17,17,15,14,17,14,19, - 17,18,18,19,18,13,14,14,16,16,15,15,15,17,17,14, - 15,14,18,15,17,18,17,18,17,16,18,16,19,15, 7,10, - 10,13,13, 9,10,12,14,15,10,12,11,15,14,12,13,14, - 16,17,13,15,14,18,16,10,10,12,13,14,10,10,13,13, - 16,12,12,13,15,15,13,12,15,15,18,15,15,16,18,17, - 10,11,11,14,14,12,13,13,15,16,10,13,10,16,14,14, - 15,15,17,17,14,15,13,17,15,13,13,14,15,16,14,13, - 15,14,18,15,15,16,16,17,16,15,18,15,18,17,18,18, - 18,18,13,15,14,17,16,15,16,16,17,17,14,15,13,17, - 15,17,17,18,18,18,16,17,14,20,14, 8,10,10,14,14, - 11,11,13,14,16,11,13,11,16,14,14,15,16,16,18,14, - 16,15,18,16,10,12,11,15,14,11,11,13,14,16,13,14, - 13,16,15,15,14,16,15,19,16,17,16,20,18,10,11,12, - 14,15,13,13,14,16,16,11,14,11,16,14,16,16,17,18, - 19,15,17,14,20,15,14,15,14,17,16,13,14,15,15,18, - 16,17,16,19,18,16,15,18,15,19,18,19,18,21,21,14, - 14,15,16,17,16,16,17,18,18,13,15,14,17,15,18,18, - 19,18,22,16,18,15,21,15,12,13,14,16,16,14,14,16, - 16,18,14,15,15,17,18,16,16,18,18,20,18,18,17,20, - 20,13,14,15,15,17,15,14,16,16,18,16,16,16,17,19, - 17,15,18,17,21,18,18,18,19,19,14,15,15,18,17,15, - 16,16,18,19,15,16,15,18,18,17,18,18,20,21,17,19, - 17,20,19,16,16,17,16,19,17,17,18,17,20,18,18,18, - 18,19,19,18,20,17,22,20,20,19,20,20,17,17,18,18, - 19,18,18,20,21,20,17,18,17,20,20,21,21,21,21,21, - 19,21,18,22,20,11,13,13,17,16,14,14,16,16,18,14, - 16,14,18,16,17,18,19,19,20,18,19,18,21,19,14,15, - 14,17,16,14,14,16,18,18,16,17,16,18,17,18,17,19, - 18,20,19,19,18,20,20,13,14,15,16,17,16,16,17,18, - 19,14,16,14,19,17,18,19,18,20,20,18,20,17,21,18, - 17,17,17,19,18,16,17,18,18,19,18,19,18,21,21,18, - 18,20,17,21,19,20,20,22,21,16,17,18,18,19,18,18, - 19,21,20,16,17,17,20,18,21,21,22,21,22,18,21,18, - 0,18, 7, 9, 9,13,13, 9,11,12,14,15, 8,11,10,15, - 14,13,14,15,16,18,11,14,13,17,15, 9,11,11,14,14, - 11,11,13,14,16,11,12,12,15,15,14,14,16,15,18,14, - 14,15,17,17, 8,11,10,14,14,11,12,12,15,15,10,12, - 10,16,14,14,15,15,17,18,13,15,12,18,15,13,14,14, - 16,16,14,14,15,15,17,15,15,15,16,17,16,15,17,15, - 19,17,17,17,18,18,12,14,13,16,15,15,15,15,17,17, - 13,15,13,17,14,17,18,18,18,19,15,17,14,19,14, 8, - 10,10,14,14,11,11,13,14,16,11,13,11,16,14,14,15, - 16,17,19,14,16,15,18,17,10,12,11,15,14,11,11,14, - 14,17,13,14,13,17,15,15,14,17,15,19,16,17,16,19, - 17,10,11,12,14,15,13,13,14,15,17,11,13,11,17,14, - 16,16,17,18,19,15,16,14,18,15,14,15,14,16,16,13, - 14,15,15,18,16,16,16,18,18,16,15,18,15,20,18,19, - 18,21,18,14,14,15,16,17,16,16,17,17,18,13,15,14, - 17,16,19,19,19,19,19,15,18,15,20,15, 7,10,10,13, - 13,10,11,12,14,15, 9,12,10,15,14,13,14,15,16,17, - 12,15,13,17,16,10,11,11,14,14,10,10,13,14,16,12, - 13,13,16,15,14,13,16,15,18,15,15,16,17,17,10,12, - 10,14,13,12,13,12,15,15,10,13,10,16,13,15,16,15, - 17,18,13,16,12,18,15,13,14,14,16,17,14,13,15,15, - 18,15,16,15,17,17,16,14,17,15,19,17,18,18,19,19, - 13,15,13,17,14,15,15,15,18,17,14,15,13,17,14,18, - 17,18,18,19,15,17,15,19,15,11,13,13,16,17,14,14, - 16,16,18,14,16,15,18,17,17,18,19,18,21,18,18,17, - 20,18,13,15,14,17,16,14,14,16,17,18,16,17,16,19, - 17,18,17,19,18,22,18,19,19,21,21,13,14,15,16,18, - 16,16,17,17,20,14,16,14,18,17,18,18,19,19,21,17, - 18,17,21,18,17,18,17,19,18,16,17,17,18,19,18,18, - 18,22,22,18,17,19,17, 0,20,21,19,21,20,17,17,18, - 18,21,18,18,18,19,21,17,17,17,19,19,20,20,22,21, - 21,19,20,18,20,17,12,14,13,17,16,14,15,15,17,18, - 14,16,14,18,16,17,18,18,21,20,16,18,16,21,18,14, - 15,15,17,17,15,15,16,18,18,15,17,16,18,18,17,17, - 19,19,20,18,19,18,20,19,14,15,14,17,15,15,16,16, - 18,17,15,16,14,19,15,18,18,18,19,20,17,20,15,21, - 17,16,17,18,18,19,17,17,18,18,20,18,19,18,19,21, - 19,18,19,19,21,20, 0,19,21,20,16,17,16,19,16,18, - 18,18,19,19,17,18,17,20,17,19,20,20,22, 0,19,20, - 17,21,17,11,13,14,16,17,14,15,15,17,18,14,15,15, - 18,18,16,17,17,19,20,16,18,17,19,21,13,14,15,17, - 17,14,15,16,17,19,15,16,16,18,19,16,17,18,19,21, - 17,18,20,21,21,13,15,15,17,17,15,16,16,18,19,15, - 16,16,18,19,17,17,18,19,22,17,19,18,22,19,15,16, - 17,19,19,16,17,18,18,20,17,18,18,19,20,19,18,20, - 18,22,20,19,19,22,21,16,17,17,18,19,18,18,18,19, - 20,17,18,18,20,19,20,19,20,22,20,19,20,21,21,20, - 12,14,14,16,16,13,14,16,17,18,14,16,15,18,18,15, - 17,17,19,19,17,18,18,19,19,13,14,15,16,17,14,14, - 16,16,20,15,16,16,17,19,16,15,18,17,20,18,17,19, - 19,19,14,15,15,17,17,16,16,16,18,18,15,16,15,19, - 18,17,18,18,20,21,17,18,17,21,18,16,15,17,17,19, - 17,15,18,17,20,19,17,18,19,20,18,16,19,17,22,20, - 19,20,19,20,17,17,18,19,19,18,18,19,20,20,17,18, - 17,18,18,21,21,20,20,21,18,20,17,21,19,11,14,14, - 16,17,15,14,16,17,19,14,16,14,18,17,18,18,19,19, - 21,17,19,18,20,20,13,15,14,17,17,14,14,16,17,18, - 16,17,16,19,18,18,17,19,18,20,18,21,18,20,20,13, - 15,15,16,17,16,16,17,18,19,14,16,15,19,18,19,19, - 19,21,20,18,19,17,20,18,16,17,16,19,18,16,17,17, - 19,20,17,19,18,20,19,18,17,21,18, 0,21,20,20, 0, - 20,17,17,18,18,19,18,19,19,20,22,16,17,17,20,18, - 21,22,20,20,22,18,22,18,22,18,12,14,14,17,17,14, - 15,16,17,19,14,16,15,17,17,17,17,18,18,21,17,19, - 17,20,19,14,15,15,16,18,15,14,16,16,19,16,17,16, - 19,18,17,16,20,17,20,18,20,19,19,20,14,15,15,18, - 17,16,16,17,18,19,14,16,15,19,17,18,21,18,19,21, - 17,18,17,19,18,17,17,18,17,20,17,16,18,17,21,18, - 19,19,19,19,18,17,19,17,20,20,21,20,21,20,17,17, - 17,19,19,19,18,18,20,21,16,18,16,19,18,20,20,21, - 21,20,18,19,16, 0,17,12,14,14,17,17,15,15,18,17, - 19,15,18,15,20,16,20,19,21,18,22,20,20,20,22,19, - 14,16,14,20,17,14,15,17,17,20,18,18,17,20,18,18, - 17,19,17,21,20,21,20, 0,21,14,15,16,17,19,18,17, - 19,18,21,14,18,15,21,17,21,20,21,20, 0,18,21,17, - 21,17,18,19,17,20,18,16,17,17,19,19,19,21,20, 0, - 20,18,17,21,17, 0,22, 0,21, 0,22,17,17,19,18,20, - 20,20,21,19,22,16,17,18,20,18,22,22, 0,22, 0,17, - 21,17,22,17,11,14,13,16,16,14,15,15,17,18,14,15, - 14,18,17,17,18,18,19,20,16,17,17,21,19,13,14,15, - 17,17,15,16,16,18,18,15,16,16,19,18,18,18,18,19, - 20,17,18,18,20,19,13,15,14,17,17,15,16,16,17,18, - 14,16,15,19,17,17,18,19,21,21,17,18,17,20,18,16, - 17,17,19,19,17,18,19,19,20,18,19,18,21,21,21,20, - 19,21,22,20,20,19,21,20,15,17,16,19,19,17,18,18, - 20,21,16,18,17,20,18,19,19,21,21,21,19,19,19,20, - 18,11,14,13,17,16,14,14,16,16,19,14,16,15,19,16, - 18,18,18,19,22,17,18,17,20,19,13,15,14,17,17,15, - 15,16,17,19,16,17,16,20,18,18,17,19,18,21,19,19, - 18,22, 0,13,14,15,17,18,16,16,17,17,19,14,16,15, - 19,18,18,19,19,20,21,18,18,17,20,18,17,18,17,20, - 18,16,17,17,18,20,18,19,18,20,20,18,18,21,17,21, - 20,21,21, 0,19,16,16,18,18,19,19,18,20,19,20,16, - 17,17,20,18,21,20,21,22,22,18,20,17,21,17,12,14, - 14,17,16,14,15,16,18,18,13,15,14,18,17,17,18,18, - 19,19,15,17,16,19,19,14,15,15,17,17,15,15,16,18, - 19,15,16,16,19,18,17,17,18,18,20,18,18,18,21,20, - 13,15,14,17,16,15,16,15,18,18,14,16,14,18,17,18, - 18,18,19,21,16,18,16,20,17,17,18,17,18,19,17,17, - 18,18,19,18,19,19,21,19,19,18,20,18,21,21,20,20, - 21,20,16,17,15,20,17,17,19,17,19,19,17,18,15,20, - 17,19,20,19,21,22,17,20,16, 0,17,12,14,14,17,18, - 16,15,18,16,20,16,18,15,21,17,20,18,21,19,22,19, - 21,19, 0,19,14,16,15,19,17,14,15,17,16,21,18,19, - 18,21,17,19,17,21,17,22,20,21,21, 0,21,14,15,16, - 17,19,18,17,19,18,21,14,17,15,20,17,21,22,21,20, - 22,18,21,17,21,17,17,19,17,21,18,16,17,17,19,20, - 19,21,20,21,20,17,18,20,17,21, 0,22,20,21,22,17, - 17,20,18,21,21,20,22,20,21,16,17,17,21,19, 0,22, - 0,21,21,18,22,17,21,17,12,14,14,17,16,14,15,16, - 17,18,14,16,15,18,17,17,17,20,19,20,16,18,17,21, - 18,14,15,15,17,17,14,15,16,17,19,16,17,16,18,18, - 17,16,19,18,19,18,19,18,21,20,14,15,15,18,17,16, - 16,16,19,18,15,16,14,20,16,18,18,19,19,20,16,19, - 16,21,17,17,17,18,19,19,16,16,18,18,19,19,19,18, - 20,20,18,16,19,18,20,22,21,20,19,20,16,18,17,20, - 16,18,19,18,19,18,16,18,16,20,17,21,20,21,20,20, - 18,19,17,21,16, -}; - -static const static_codebook _44p5_p5_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p5_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p5_p5_0, - 0 -}; - -static const long _vq_quantlist__44p5_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44p5_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p5_p5_1 = { - 1, 7, - (long *)_vq_lengthlist__44p5_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p5_p5_1, - 0 -}; - -static const long _vq_quantlist__44p5_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p5_p6_0[] = { - 1, 5, 5, 5, 7, 9, 5, 9, 7, 5, 7, 8, 7, 7,10, 9, - 9,10, 5, 8, 7, 9,10, 9, 7,10, 7, 6, 9, 9, 9,10, - 12,10,12,11, 9,10,11,11,10,13,12,12,13,10,11,11, - 12,13,13,11,13,11, 6, 9, 9,10,11,12, 9,12,11,10, - 11,11,11,11,13,12,13,13, 9,11,10,12,13,13,11,13, - 10, 6, 9,10, 9,11,12,10,12,11, 9,10,11,10,10,13, - 11,13,13,10,11,11,12,13,12,11,13,11, 7, 9,10, 9, - 10,12,10,11,11,10,10,11,10,10,12,12,11,12,10,11, - 10,12,12,12,10,12,10, 7,10,10,11,11,13,11,13,11, - 10,12,11,11,10,13,13,14,13,10,11,12,13,13,14,11, - 13,10, 6,10, 9,10,11,12, 9,12,11, 9,11,11,11,11, - 13,12,12,13, 9,11,10,12,13,13,10,13,10, 7,10,10, - 11,11,14,11,13,11,10,12,11,11,10,14,13,14,13,10, - 11,12,13,13,14,11,13,10, 7,10, 9,10,10,12, 9,12, - 10,10,11,11,10,10,12,12,12,12, 9,11,10,11,12,12, - 10,12, 9, -}; - -static const static_codebook _44p5_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44p5_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p5_p6_0, - 0 -}; - -static const long _vq_quantlist__44p5_p6_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p5_p6_1[] = { - 2, 6, 6, 5, 7, 8, 5, 8, 7, 6, 7, 7, 7, 7, 8, 8, - 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 7, 6, 8, 8, 8, 9, - 10, 8, 9, 9, 8, 9, 9, 9, 9,10,10,10,10, 8, 9, 9, - 10,10,10, 9,10,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 9, - 9, 9, 9, 9,10,10,10,10, 8, 9, 9,10,10,10, 9,10, - 9, 6, 8, 9, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9,10, - 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 8, 9, 8, - 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 7, 9, 9, 9,10,10, 9,10,10, - 9,10, 9, 9, 9,10,10,10,10, 9,10, 9,10,10,10, 9, - 10, 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, - 10, 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, - 9,10,10, 9,10, 9, 9, 9,10,10, 9,10,10,10,10, 9, - 9, 9,10,10,10, 9,10, 9, 7, 9, 8, 8, 9, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p5_p6_1 = { - 5, 243, - (long *)_vq_lengthlist__44p5_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p5_p6_1, - 0 -}; - -static const long _vq_quantlist__44p5_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p5_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p5_p7_0 = { - 5, 243, - (long *)_vq_lengthlist__44p5_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p5_p7_0, - 0 -}; - -static const long _vq_quantlist__44p5_p7_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p5_p7_1[] = { - 1, 7, 7, 6, 9, 9, 7, 9, 9, 6, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10, -}; - -static const static_codebook _44p5_p7_1 = { - 5, 243, - (long *)_vq_lengthlist__44p5_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p5_p7_1, - 0 -}; - -static const long _vq_quantlist__44p5_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p5_p7_2[] = { - 1, 2, 3, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11,12,12,13,13,14,14,14,14, -}; - -static const static_codebook _44p5_p7_2 = { - 1, 25, - (long *)_vq_lengthlist__44p5_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p5_p7_2, - 0 -}; - -static const long _vq_quantlist__44p5_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p5_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p5_p7_3 = { - 1, 25, - (long *)_vq_lengthlist__44p5_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p5_p7_3, - 0 -}; - -static const long _huff_lengthlist__44p5_short[] = { - 4, 7,12,14,15,18,20,20, 5, 3, 4, 6, 9,11,15,19, - 9, 4, 3, 4, 7, 9,13,18,11, 6, 3, 3, 5, 8,13,19, - 14, 9, 6, 5, 7,10,16,20,16,11, 9, 8,10,10,14,16, - 21,14,13,11, 8, 7,11,14,21,14,13, 9, 6, 5,10,12, -}; - -static const static_codebook _huff_book__44p5_short = { - 2, 64, - (long *)_huff_lengthlist__44p5_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p6_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44p6_l0_0[] = { - 1, 4, 4, 7, 7,10,10,12,12,12,12,13,12, 5, 5, 5, - 8, 6,11, 9,12,12,13,12,12,12, 4, 5, 5, 6, 8, 9, - 11,12,12,13,12,12,12, 7, 7, 8, 9, 9,11, 8,12, 9, - 12,12,12,12, 7, 8, 8, 9, 9, 8,11, 9,12,12,12,11, - 12,10,10,10,11,11,11,11,11,10,11,11,12,11,10,10, - 10,11,11,11,11,10,11,11,11,11,12,11,11,11,12,11, - 12,11,12,11,13,11,13,11,11,11,11,11,12,11,12,10, - 13,11,12,11,13,12,12,12,13,12,13,13,13,12,14,12, - 14,13,12,12,12,12,13,13,13,12,14,12,14,13,14,13, - 14,14,14,14,14,14,14,14,15,14,15,14,13,14,13,14, - 14,14,14,14,15,14,14,14,15, -}; - -static const static_codebook _44p6_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44p6_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p6_l0_0, - 0 -}; - -static const long _vq_quantlist__44p6_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p6_l0_1[] = { - 4, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, - 5, 5, 4, 5, 5, 5, 5, 5, 4, -}; - -static const static_codebook _44p6_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44p6_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p6_l0_1, - 0 -}; - -static const long _vq_quantlist__44p6_l1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p6_l1_0[] = { - 1, 3, 2, 5, 5, 6, 6, 6, 6, -}; - -static const static_codebook _44p6_l1_0 = { - 2, 9, - (long *)_vq_lengthlist__44p6_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p6_l1_0, - 0 -}; - -static const long _huff_lengthlist__44p6_lfe[] = { - 2, 3, 1, 3, -}; - -static const static_codebook _huff_book__44p6_lfe = { - 2, 4, - (long *)_huff_lengthlist__44p6_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44p6_long[] = { - 2, 7,13,15,16,17,19,20, 6, 3, 4, 7, 9,10,12,15, - 13, 4, 3, 4, 7, 8,11,13,14, 7, 4, 4, 6, 7,10,11, - 16, 9, 7, 6, 7, 8, 9,10,16, 9, 8, 7, 7, 6, 8, 8, - 18,12,10,10, 9, 8, 8, 9,20,14,13,12,11, 8, 9, 9, -}; - -static const static_codebook _huff_book__44p6_long = { - 2, 64, - (long *)_huff_lengthlist__44p6_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p6_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p6_p1_0[] = { - 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 8, 9, - 10, 8, 9, 9, 8, 9,10, 9,10,12,10,11,11, 8, 9,10, - 10,11,11, 9,11,11, 5, 8, 7, 8, 9, 9, 8,10, 9, 8, - 10, 9, 9,11,11,10,11,11, 8,10, 9,10,11,11, 9,12, - 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9, 9, 9,10,11, - 9,11,11, 8,10,10,10,11,11,10,12,11, 7, 9, 9, 9, - 10,11, 9,11,11, 9, 9,11,10,10,13,11,11,12, 9,11, - 11,11,12,13,11,13,12, 7, 9, 9, 9,11,11, 9,12,10, - 9,11,10,10,11,12,11,13,12, 9,11,11,11,13,13,11, - 13,11, 5, 8, 8, 8, 9,10, 7,10, 9, 8,10,10,10,11, - 11,10,11,11, 7, 9, 9, 9,11,11, 9,11,10, 7, 9, 9, - 9,10,12, 9,11,11, 9,11,11,11,11,13,11,13,13, 9, - 10,11,11,12,13,10,12,11, 7, 9, 9, 9,11,11, 9,11, - 10, 9,11,11,11,12,13,11,13,12, 9,11, 9,11,12,11, - 10,13,10, -}; - -static const static_codebook _44p6_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44p6_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p6_p1_0, - 0 -}; - -static const long _vq_quantlist__44p6_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p6_p2_0[] = { - 4, 6, 6, 9, 9, 6, 7, 8,10,10, 6, 8, 7,10,10, 8, - 10,10,12,13, 8,10,10,13,12, 6, 8, 8,10,10, 7, 8, - 9,10,11, 8, 9, 9,11,11,10,10,11,12,13,10,11,11, - 14,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 9, 8,11, - 10,10,11,11,13,14,10,11,10,13,12, 9,10,10,12,12, - 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,13, - 14,13,15,14, 9,10,10,13,12,10,11,11,13,13,10,11, - 10,13,12,13,13,14,14,15,12,13,12,15,12, 6, 8, 8, - 10,11, 8, 9,10,11,12, 8, 9, 9,11,11,10,11,12,13, - 14,10,11,11,14,13, 8, 9, 9,11,12, 9,10,11,12,13, - 9,10,11,12,13,11,11,13,13,15,11,12,12,14,14, 8, - 9, 9,12,12, 9,10,11,12,13, 9,10,10,13,12,11,12, - 13,14,15,11,12,12,14,14,11,11,12,13,14,11,12,13, - 13,15,12,13,13,14,15,13,13,14,14,16,14,15,15,16, - 16,11,12,11,14,13,12,13,13,14,14,11,13,12,14,13, - 14,15,15,16,16,13,14,14,16,14, 6, 8, 8,11,10, 8, - 9, 9,12,11, 8,10, 9,12,11,10,11,11,13,13,10,12, - 11,14,13, 8, 9, 9,12,12, 9,10,10,12,13, 9,11,10, - 13,12,11,12,12,14,14,11,13,12,15,14, 8, 9, 9,12, - 11, 9,10,10,13,12, 9,11,10,13,12,12,12,12,14,14, - 11,13,12,15,13,11,11,12,13,14,11,12,13,13,14,12, - 13,13,14,15,13,13,14,14,16,14,15,15,16,16,11,12, - 11,14,13,12,13,13,15,14,11,13,12,15,13,14,15,15, - 16,16,13,15,13,16,14, 9,10,11,12,13,11,11,12,13, - 14,11,12,12,13,14,13,13,14,14,16,13,14,14,15,16, - 11,11,12,13,14,12,12,13,14,15,12,13,13,14,15,14, - 14,15,15,17,14,15,15,16,17,11,12,12,14,14,12,13, - 13,14,15,12,13,12,15,15,14,15,15,16,17,14,15,15, - 16,16,13,14,14,15,16,14,14,15,15,17,15,15,15,16, - 17,16,16,17,16,18,16,17,17,18,18,13,14,14,16,15, - 14,15,15,17,16,14,15,15,16,16,16,17,17,18,18,16, - 16,16,17,16, 9,11,10,13,12,11,12,12,14,13,11,12, - 11,15,13,13,14,14,16,15,13,14,13,17,14,11,12,12, - 14,14,12,12,13,15,15,12,13,13,15,14,14,14,15,16, - 16,14,15,15,17,16,11,12,11,14,13,12,13,13,15,14, - 12,13,12,15,13,14,15,15,16,16,14,15,14,17,15,13, - 14,14,15,16,14,15,15,16,17,14,15,15,16,17,16,16, - 16,17,17,16,17,17,18,18,13,15,14,16,15,15,15,15, - 17,16,14,15,14,17,15,16,17,17,18,18,16,17,16,18, - 16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12,11, - 10,11,11,13,14,10,12,11,14,13, 7, 9, 9,11,12, 9, - 10,10,12,13, 9,10,10,13,12,11,11,12,13,15,11,12, - 12,15,14, 8, 9, 9,12,11, 9,10,10,13,13, 9,11,10, - 13,12,12,12,12,14,15,11,13,12,15,13,10,11,11,13, - 14,11,12,12,13,15,11,12,12,14,14,13,13,14,14,16, - 14,15,14,16,16,11,12,11,14,13,12,13,13,15,14,11, - 13,12,15,13,14,15,15,16,16,13,14,14,16,14, 8, 9, - 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12,13, - 14,15,11,12,12,15,14, 9, 9,11,11,13,10,10,12,12, - 14,10,10,11,13,14,12,12,13,14,16,12,13,13,15,15, - 9,11,10,13,12,10,11,11,13,14,10,12,11,14,13,12, - 13,13,15,16,12,13,13,15,15,11,11,13,13,15,12,12, - 14,13,15,13,13,14,14,15,14,14,15,14,17,15,15,15, - 16,16,12,13,12,15,14,13,14,14,15,15,12,14,13,15, - 14,15,15,15,17,17,14,15,14,17,15, 7, 9, 9,12,11, - 9,10,10,12,12, 9,11,10,13,12,11,12,12,14,14,11, - 13,12,15,14, 9,10,10,12,12,10,10,11,12,13,10,11, - 11,14,13,12,12,13,14,15,12,13,13,16,15, 9,10,10, - 13,12,10,11,11,13,13,10,11,10,14,12,13,13,13,15, - 15,12,13,12,15,14,11,12,12,14,14,12,12,13,14,15, - 13,14,13,15,15,14,13,15,14,16,15,16,15,17,16,12, - 12,12,14,14,13,13,14,15,15,12,13,12,15,14,15,15, - 16,16,17,14,15,14,17,14,10,11,12,13,14,11,12,13, - 14,15,11,12,13,14,15,13,14,15,15,17,14,15,15,16, - 16,11,12,13,12,15,12,12,14,13,16,13,13,14,13,16, - 14,14,16,14,18,15,15,16,16,17,12,13,12,15,15,13, - 14,14,15,16,13,14,13,16,15,15,15,16,17,18,15,15, - 15,17,16,14,14,15,14,17,15,14,16,14,17,15,15,16, - 15,18,16,16,17,16,19,17,17,17,17,18,14,15,15,17, - 16,15,16,16,17,17,15,16,15,18,16,17,17,18,18,18, - 16,17,16,18,17,10,11,11,14,13,11,12,12,15,14,11, - 13,12,15,14,14,15,15,16,16,14,15,15,17,16,11,12, - 12,15,14,12,13,13,15,14,13,14,13,16,14,14,15,15, - 16,16,15,16,15,18,16,11,13,12,15,15,13,14,14,15, - 15,12,14,13,16,15,15,16,16,17,17,15,16,15,17,16, - 14,15,14,16,16,14,15,15,16,16,15,16,15,17,16,16, - 16,17,16,17,17,18,17,19,18,14,15,15,17,16,15,16, - 16,17,17,15,15,15,18,16,17,18,18,18,18,16,17,16, - 19,16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, - 11,10,11,12,13,14,10,11,11,14,13, 8, 9, 9,11,12, - 9,10,11,12,13, 9,10,10,13,13,11,12,13,13,15,11, - 12,12,15,14, 7, 9, 9,12,11, 9,10,10,12,13, 9,10, - 10,13,12,11,12,12,14,15,11,12,11,14,13,11,11,12, - 13,14,11,12,13,13,15,12,13,13,14,15,13,14,14,14, - 16,14,15,15,16,16,10,11,11,14,13,11,12,12,14,14, - 11,12,12,15,13,14,14,14,16,16,13,14,13,16,14, 7, - 9, 9,11,12, 9,10,10,12,13, 9,10,10,12,12,11,12, - 13,14,15,11,12,12,14,14, 9,10,10,12,13,10,10,11, - 12,14,10,11,11,13,13,12,12,13,14,15,13,13,13,15, - 15, 9,10,10,12,12,10,11,11,13,14,10,11,10,13,12, - 12,13,13,15,16,12,13,12,15,14,11,12,13,14,14,12, - 12,13,14,15,13,14,13,15,15,14,14,15,14,17,15,16, - 15,17,16,11,12,12,14,14,13,13,13,15,15,12,13,12, - 15,14,15,15,15,16,17,14,15,14,16,14, 8, 9, 9,12, - 11, 9,10,10,12,13, 9,11,10,13,12,11,12,12,14,15, - 11,12,12,15,14, 9,10,11,13,13,10,11,12,13,14,10, - 11,11,14,13,12,13,13,15,15,12,13,13,16,15, 9,11, - 9,13,11,10,11,10,14,13,10,12,10,14,12,12,13,13, - 15,15,12,13,12,16,14,12,12,13,14,15,12,13,14,14, - 16,13,14,14,15,15,14,14,15,15,17,15,16,15,17,16, - 11,13,11,15,13,13,14,13,15,14,12,14,12,16,13,15, - 15,15,16,16,14,15,14,17,14,10,11,11,13,14,11,12, - 13,14,15,11,12,12,14,15,14,14,15,16,17,14,15,15, - 16,16,11,12,13,14,15,12,13,14,15,16,13,14,14,15, - 16,15,15,16,16,18,15,16,16,17,17,11,12,12,14,15, - 13,13,14,14,16,12,13,13,15,15,15,15,16,16,18,14, - 15,15,16,16,14,15,15,16,17,15,15,16,16,17,15,16, - 16,17,17,16,16,17,16,19,17,18,17,18,18,14,14,15, - 16,16,15,15,16,16,17,14,15,15,16,16,17,17,18,18, - 19,16,17,16,17,16,10,12,11,14,13,11,13,12,15,14, - 11,13,12,15,14,14,15,15,16,16,13,15,14,17,15,12, - 13,13,15,15,13,13,14,15,16,13,14,14,16,16,14,15, - 15,17,17,15,16,16,17,17,11,13,12,15,12,13,14,13, - 16,13,12,14,12,16,13,15,16,15,17,16,14,16,14,18, - 14,14,15,15,16,17,15,15,16,16,17,15,16,16,17,17, - 16,16,17,17,18,17,18,17,18,18,14,15,14,17,14,15, - 16,15,18,15,15,16,15,18,14,17,17,17,18,17,16,17, - 16,19,16, 9,11,11,13,13,10,12,12,14,14,11,12,12, - 15,14,13,14,14,16,16,13,14,14,16,16,10,11,12,14, - 14,11,12,13,14,15,12,13,13,15,15,13,14,15,16,16, - 14,15,15,17,16,11,12,12,15,14,12,13,13,15,15,12, - 13,12,15,15,14,15,15,16,17,14,15,14,17,16,12,13, - 14,15,16,13,13,14,15,16,13,14,15,16,16,14,15,16, - 16,18,15,16,16,18,18,13,14,14,16,15,14,15,15,17, - 16,14,15,15,17,16,16,17,17,18,18,16,17,16,18,17, - 10,12,12,14,14,11,12,13,15,15,12,13,13,15,15,13, - 14,15,16,17,14,15,15,17,16,11,11,13,14,15,12,12, - 14,15,16,13,13,14,15,16,14,14,15,16,17,15,15,16, - 17,17,12,13,12,15,15,13,14,14,16,16,13,14,13,16, - 15,15,16,15,17,17,15,16,15,18,16,13,12,15,14,17, - 14,13,16,14,17,14,14,16,15,18,15,14,17,16,18,16, - 16,17,17,18,14,15,15,17,16,15,16,16,17,17,15,16, - 15,18,16,17,17,17,18,18,16,17,16,19,17,10,11,11, - 14,14,11,12,12,15,15,11,13,12,15,15,14,15,14,16, - 16,14,15,15,17,16,11,12,12,15,14,12,12,13,15,15, - 13,14,13,16,15,14,15,15,16,16,15,16,15,18,17,11, - 13,12,15,15,13,14,13,15,15,12,14,13,16,15,15,16, - 15,17,17,15,16,15,18,16,13,14,13,16,16,14,15,14, - 16,16,14,15,15,17,16,16,16,16,16,18,16,18,17,19, - 18,14,15,15,17,16,15,16,16,17,17,15,15,15,17,16, - 17,17,18,18,19,16,17,16,18,16,12,13,13,15,16,13, - 14,14,16,17,13,14,14,16,16,15,15,16,17,18,15,16, - 16,18,17,13,13,14,14,17,14,14,15,15,17,14,14,15, - 16,17,15,15,17,16,18,16,17,17,18,18,13,14,14,17, - 16,14,15,15,17,17,14,15,14,17,16,16,17,17,18,18, - 16,17,16,18,17,15,14,16,13,18,16,15,17,14,19,16, - 16,17,15,18,17,16,18,15,19,18,18,18,17,19,15,16, - 16,18,17,16,17,17,18,18,16,17,16,19,17,18,19,18, - 19,19,17,18,17,20,18,11,12,12,15,15,13,13,14,15, - 16,13,14,13,16,15,15,16,16,17,17,15,16,16,18,17, - 12,14,13,16,15,13,13,14,15,16,14,15,14,17,16,16, - 16,16,16,17,16,17,17,19,17,12,13,14,16,16,14,15, - 15,16,17,13,15,13,17,15,16,17,17,18,18,16,17,16, - 18,16,15,16,15,17,16,15,15,15,17,17,16,17,16,18, - 17,17,16,17,16,18,18,19,18,20,18,15,16,16,17,17, - 16,17,17,18,18,15,16,15,18,17,18,18,19,19,19,17, - 18,16,19,16, 9,11,11,13,13,11,12,12,14,15,10,12, - 12,14,14,13,14,14,16,16,13,14,14,16,16,11,12,12, - 14,14,12,12,13,15,15,12,13,13,15,15,14,15,15,16, - 17,14,15,15,16,16,10,12,11,14,14,12,13,13,15,15, - 11,13,12,15,14,14,15,15,16,17,13,15,14,17,16,13, - 14,14,15,16,14,15,15,16,17,14,15,15,16,17,16,16, - 17,17,18,16,17,17,18,18,12,14,13,16,15,13,15,14, - 17,16,13,14,13,17,15,15,16,16,18,18,15,16,15,18, - 16,10,11,11,14,14,11,12,13,14,15,11,12,12,15,15, - 14,15,15,16,17,14,15,15,16,16,11,12,13,15,15,12, - 13,14,15,16,13,14,14,15,16,15,15,16,16,18,15,15, - 16,17,17,11,12,12,14,15,13,13,14,15,16,12,13,13, - 15,15,15,15,16,17,18,14,15,15,17,16,14,15,15,16, - 17,15,15,16,16,17,15,16,16,17,17,16,16,17,16,19, - 17,17,18,19,18,13,13,14,16,16,14,15,16,17,17,14, - 14,15,16,16,16,16,17,18,18,16,16,16,18,16,10,12, - 12,14,14,12,13,13,15,15,11,13,12,15,15,14,15,15, - 16,17,13,15,14,17,16,12,13,13,15,15,13,13,14,15, - 16,13,14,14,16,16,15,15,16,17,18,15,15,16,17,17, - 11,13,12,15,14,13,14,13,16,15,12,14,12,16,14,15, - 16,15,17,17,14,16,14,17,16,14,15,15,16,17,15,15, - 16,16,18,15,16,16,17,17,16,17,17,17,19,17,17,17, - 18,18,13,15,12,17,14,14,16,14,17,15,14,15,13,17, - 14,16,17,16,18,17,15,17,14,19,15,11,12,12,15,15, - 13,13,14,15,16,13,14,13,16,15,15,16,16,17,18,15, - 16,16,17,17,12,14,13,16,16,13,13,15,15,17,14,15, - 15,17,16,16,16,17,16,19,16,17,17,18,18,12,13,14, - 15,16,14,14,15,16,17,13,14,13,16,15,16,17,17,18, - 19,15,16,16,17,16,15,16,16,18,17,15,15,16,17,18, - 16,17,17,18,18,16,16,18,16,19,18,19,19,20,19,15, - 15,16,16,17,16,16,17,17,18,15,15,15,17,16,18,18, - 19,18,20,17,17,16,18,16,12,13,13,16,15,13,14,14, - 16,16,13,14,14,16,16,15,16,16,17,18,15,16,15,18, - 17,13,14,14,16,16,14,15,15,16,17,14,15,15,17,17, - 16,17,17,18,18,16,17,17,18,18,13,14,13,17,14,14, - 15,14,17,16,14,15,14,17,15,16,17,17,18,18,15,17, - 15,19,15,16,16,16,17,18,16,16,17,17,19,16,17,17, - 18,19,17,17,18,18,20,18,18,18,19,19,15,16,14,18, - 13,16,17,16,19,15,16,17,15,19,14,18,18,18,19,17, - 17,18,16,20,15, -}; - -static const static_codebook _44p6_p2_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p6_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p6_p2_0, - 0 -}; - -static const long _vq_quantlist__44p6_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p6_p3_0[] = { - 1, 5, 5, 5, 7, 8, 5, 8, 7, 5, 7, 8, 8, 8,10, 8, - 10,10, 5, 8, 7, 8,10,10, 8,10, 8, 6, 8, 9, 8,10, - 12, 9,11,11, 9,10,11,11,11,13,12,13,13, 9,11,11, - 11,13,13,11,13,12, 6, 9, 8, 9,11,11, 8,12,10, 9, - 11,11,11,12,13,11,13,13, 9,11,10,11,13,13,11,13, - 11, 5, 9, 9, 8,11,11, 9,12,11, 8,10,11,10,11,13, - 11,13,13, 9,11,11,11,13,13,11,13,12, 8,10,11,10, - 12,13,10,13,12,10,10,13,11,11,14,12,13,14,11,13, - 12,13,14,14,12,14,12, 8,11,10,11,12,13,11,14,12, - 10,13,12,12,12,13,13,15,14,11,12,13,13,14,15,12, - 14,12, 5, 9, 9, 9,11,12, 8,11,11, 9,11,11,11,12, - 13,11,13,13, 8,11,10,11,13,13,10,13,11, 8,10,11, - 11,12,14,11,13,12,11,13,12,12,12,14,13,15,14,10, - 12,13,13,14,15,12,13,12, 8,11,10,10,12,13,10,13, - 12,11,12,13,12,12,14,13,14,14,10,13,10,12,14,13, - 11,14,11, -}; - -static const static_codebook _44p6_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44p6_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p6_p3_0, - 0 -}; - -static const long _vq_quantlist__44p6_p3_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p6_p3_1[] = { - 5, 7, 7, 6, 7, 7, 6, 7, 7, 6, 7, 7, 7, 8, 8, 7, - 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 8, 7, 7, 8, 7, 8, - 8, 7, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, - 8, 9, 9, 8, 9, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 8, - 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, - 8, 6, 8, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 9, - 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, - 8, 9, 8, 9, 9, 8, 8, 9, 8, 9, 9, 9, 9, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, 9, - 9, 9, 6, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, - 8, 8, 9, 8, 9, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, - 8, 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, - 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p6_p3_1 = { - 5, 243, - (long *)_vq_lengthlist__44p6_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p6_p3_1, - 0 -}; - -static const long _vq_quantlist__44p6_p4_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p6_p4_0[] = { - 2, 5, 5, 5, 7, 8, 5, 8, 7, 5, 7, 7, 7, 7, 9, 7, - 9, 9, 5, 7, 7, 8, 9, 9, 7, 9, 7, 6, 8, 8, 8, 9, - 10, 8, 9, 9, 8, 9,10, 9, 9,11,10,11,11, 8, 9, 9, - 10,11,11, 9,11,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 8, - 9, 9, 9,10,11,10,11,10, 8,10, 9,10,11,11, 9,11, - 9, 6, 8, 8, 7, 9, 9, 8,10, 9, 7, 9, 9, 9, 9,10, - 9,10,10, 8, 9, 9, 9,10,10, 9,11,10, 7, 9, 9, 8, - 10,10, 9,10,10, 9, 9,10,10,10,11,10,11,11, 9,10, - 10,10,11,11,10,11,10, 7, 9, 9, 9, 9,10, 9,10, 9, - 8,10, 9, 9, 9,11,10,11,11, 9,10,10,10,11,11, 9, - 11, 9, 6, 8, 8, 8, 9,10, 7, 9, 9, 8, 9, 9, 9,10, - 10, 9,10,10, 7, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, - 9, 9,10, 9,10, 9, 9,10,10, 9, 9,11,10,11,11, 8, - 9,10,10,11,11, 9,11, 9, 7, 9, 9, 9,10,10, 8,10, - 10, 9,10,10,10,10,11,10,11,11, 9,10, 9,10,11,11, - 10,11,10, -}; - -static const static_codebook _44p6_p4_0 = { - 5, 243, - (long *)_vq_lengthlist__44p6_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p6_p4_0, - 0 -}; - -static const long _vq_quantlist__44p6_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p6_p4_1[] = { - 6, 8, 8,10,10, 8, 9, 9,10,11, 8,10, 9,11,10, 9, - 10,10,11,11, 9,10,10,11,11, 8, 9, 9,10,10, 9, 9, - 10,11,11,10,10,10,11,11,10,11,11,11,11,10,11,11, - 11,11, 8, 9, 9,11,10,10,10,10,11,11, 9,10, 9,11, - 11,10,11,11,11,11,10,11,10,11,11,10,10,11,11,11, - 10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,10,11,10,11,11,11,11,11,11,11,10,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11, 8, 9,10, - 11,11,10,10,11,11,11,10,10,10,11,11,10,11,11,12, - 12,10,11,11,12,12,10,10,11,11,11,10,10,11,11,12, - 11,11,11,12,12,11,11,12,12,12,11,11,12,12,12,10, - 10,10,11,11,11,11,11,12,12,10,11,11,12,12,11,12, - 12,12,12,11,12,11,12,12,11,11,11,11,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,11,12,11,11,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12, 8,10, 9,11,11,10, - 10,10,11,11,10,11,10,11,11,10,11,11,12,12,10,11, - 11,12,12,10,10,10,11,11,10,11,11,12,12,11,11,11, - 12,12,11,11,12,12,12,11,12,12,12,12,10,11,10,11, - 11,11,11,11,12,12,10,11,10,12,11,11,12,11,12,12, - 11,12,11,12,12,11,11,11,12,12,11,11,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, - 11,12,11,11,12,12,12,12,11,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,10,11,11,11,12,11,11,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 11,11,12,12,12,11,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,13,11,12,11,12,12,12,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,13,12,13,12,12,12,12,13,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,12, - 12,12,13,12,10,11,11,12,11,11,11,12,12,12,11,12, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,12,11,12,12,12,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,13,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,12,12,12,13,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,13,12,13,12,13, - 12, 8,10,10,11,11,10,10,11,11,11,10,11,10,11,11, - 10,11,11,12,12,10,11,11,12,12, 9,10,11,11,11,10, - 10,11,12,12,10,11,11,12,12,11,11,12,12,12,11,12, - 12,12,12,10,11,10,11,11,11,11,11,12,12,10,11,11, - 12,12,11,12,12,12,12,11,12,11,12,12,11,11,11,12, - 12,11,11,12,12,12,11,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12, 9,10, - 10,11,11,10,11,11,12,12,10,11,11,12,12,11,11,12, - 12,12,11,12,12,12,12,10,11,11,12,12,11,11,12,12, - 12,11,11,12,12,12,11,11,12,12,12,12,12,12,12,12, - 10,11,11,12,12,11,12,12,12,12,11,12,11,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12, 9,10,10,11,11, - 10,11,11,12,12,10,11,11,12,11,11,12,12,12,12,11, - 12,12,12,12,10,11,11,12,12,11,11,11,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,10,11,11, - 12,12,11,12,12,12,12,11,12,11,12,12,12,12,12,12, - 12,12,12,12,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,11,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,13,12,12,13,13,13,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,12,12,12,12,13,13,12,13, - 12,13,13,12,12,12,12,12,12,12,12,12,13,12,13,13, - 13,13,12,13,13,13,13,13,13,13,13,13,12,12,12,12, - 12,12,12,13,13,13,12,13,12,13,13,12,13,13,13,13, - 12,13,13,13,13,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 12,13,12,12,12,13,13,11,12,12,12,12,12,12,12,12, - 13,12,12,12,13,12,12,13,12,13,13,12,13,12,13,13, - 12,12,12,12,12,12,12,13,13,13,12,12,13,13,13,12, - 13,13,12,13,13,13,13,13,13,12,12,12,12,12,12,13, - 12,13,13,12,13,12,13,12,12,13,13,13,13,12,13,13, - 13,13, 8,10,10,11,11,10,10,11,11,11, 9,11,10,11, - 11,10,11,11,12,12,10,11,11,12,12,10,10,11,11,11, - 10,11,11,12,12,11,11,11,12,12,11,11,12,12,12,11, - 12,12,12,12, 9,11,10,11,11,10,11,11,12,12,10,11, - 10,12,12,11,12,12,12,12,11,12,11,12,12,11,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12, 9, - 10,10,11,11,10,11,11,12,12,10,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,10,11,11,12,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,10,11,11,12,12,11,11,12,12,12,11,11,11,12,12, - 12,12,12,12,12,11,12,12,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12, 9,10,10,11, - 11,10,11,11,12,12,10,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,10,11,11,12,12,11,11,12,12,12,11, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,10,11, - 11,12,12,11,12,11,12,12,11,12,11,12,12,12,12,12, - 12,12,11,12,11,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,12,12,12,13,13,12,12,13,13,13,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,12,13,13,12, - 12,12,13,12,12,12,12,12,12,12,12,13,13,13,12,12, - 13,13,13,12,13,13,12,13,12,13,13,13,13,12,12,12, - 12,12,12,12,13,13,13,12,12,12,13,12,12,13,13,13, - 13,12,13,13,13,13,11,11,11,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,13,12,12,12, - 13,13,13,12,12,12,13,13,11,12,12,12,12,12,12,12, - 13,12,12,12,12,13,12,12,13,12,13,13,12,13,12,13, - 12,12,12,12,12,12,12,12,13,13,13,12,13,13,13,13, - 12,13,13,13,13,13,13,13,13,13,12,12,12,12,12,12, - 13,12,13,12,12,13,12,13,12,13,13,13,13,13,12,13, - 13,13,13,10,11,11,12,12,11,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,11,11,12,12, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,13,13, - 12,12,12,13,13,11,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,12, - 12,12,12,12,12,12,12,13,12,12,12,12,13,12,12,13, - 12,13,12,13,13,13,13,12,12,12,12,12,12,12,12,13, - 12,12,12,12,13,12,12,13,13,13,13,12,13,12,13,13, - 11,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, - 12,12,12,13,12,12,12,13,12,11,12,12,12,12,12,12, - 12,12,13,12,12,12,12,13,12,12,13,13,13,12,12,13, - 13,13,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 12,12,13,12,13,13,12,13,12,13,13,12,12,12,12,12, - 12,12,13,12,13,12,12,13,13,13,12,12,13,13,13,13, - 13,13,13,13,12,12,12,12,12,12,13,13,13,13,12,13, - 12,13,12,12,13,13,13,13,12,13,13,13,13,11,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,13,11,12,12,12,12,12,12,12,12,13, - 12,12,12,13,13,12,12,13,13,13,12,12,13,13,13,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,13, - 12,13,13,12,13,12,13,13,12,12,12,12,12,12,12,12, - 12,13,12,13,12,13,13,12,13,13,13,13,12,13,13,13, - 13,12,12,12,12,12,12,13,12,13,13,12,12,12,13,13, - 12,13,13,13,13,12,13,12,13,13,11,12,12,12,12,11, - 12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,12,13,12,12,12,13,13,11,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13, - 12,13,12,13,13,12,12,12,12,12,12,12,13,12,13,12, - 12,13,12,13,12,12,13,12,13,12,13,13,13,13,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,12,12,13,13, - 13,13,12,13,12,13,12,11,11,11,12,12,11,12,12,12, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,13,13,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, - 13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,13,12,12,12,13,12,12,12,12,12,12,12,12, - 12,12,12,13,12,12,12,12,13,12,12,13,12,13,12,12, - 13,12,13,12,10,11,11,12,12,11,12,12,12,12,11,12, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,12,12,12,13,13,11,12,11,12,12,12,12,12,12,12, - 11,12,12,12,12,12,12,12,13,13,12,12,12,13,12,12, - 12,12,12,12,12,12,12,12,13,12,12,12,12,13,12,13, - 13,12,13,12,13,13,13,13,12,12,12,12,12,12,12,12, - 13,13,12,12,12,13,12,12,13,13,13,13,12,13,12,13, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,13,13,12,12,12,13,12,11,12,12,12,12,12, - 12,12,12,13,12,12,12,13,13,12,12,13,13,13,12,12, - 13,13,13,11,12,12,12,12,12,12,12,13,13,12,12,12, - 13,12,12,13,12,13,13,12,12,12,13,13,12,12,12,12, - 12,12,12,13,13,13,12,12,13,13,13,12,12,13,13,13, - 12,13,13,13,13,12,12,12,12,12,12,12,13,13,13,12, - 12,12,13,12,12,13,13,13,13,12,13,13,13,13,11,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, - 12,13,12,12,12,13,13,11,12,12,12,12,12,12,12,12, - 13,12,12,12,13,13,12,12,13,13,13,12,12,13,13,13, - 11,12,12,12,12,12,12,12,13,12,12,12,12,13,12,12, - 13,12,13,13,12,13,12,13,13,12,12,12,12,12,12,12, - 12,13,13,12,13,12,13,13,12,13,13,13,13,13,13,13, - 13,13,12,12,12,12,12,12,13,12,13,13,12,13,12,13, - 12,12,13,13,13,13,12,13,12,13,13,11,11,11,12,12, - 11,12,12,12,12,11,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,13,12,12,12,13,13,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 12,12,12,12,13,12,12,12,12,13,12,12,13,12,13,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,12,12,12,13,12,12,12,11,12,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,12,12,12,12,12,12,12,12,13,12,12,12,12,12, - 12,12,12,13,13,12,12,12,13,13,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,13,13,12,12, - 12,13,12,12,12,12,12,12,12,12,12,12,13,12,12,12, - 13,13,12,12,13,12,13,12,13,13,13,13,12,12,12,12, - 12,12,12,12,13,12,12,12,12,13,12,12,13,12,13,13, - 12,13,12,13,12, -}; - -static const static_codebook _44p6_p4_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p6_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p6_p4_1, - 0 -}; - -static const long _vq_quantlist__44p6_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p6_p5_0[] = { - 2, 6, 6,10,10, 5, 7, 8,11,12, 5, 8, 7,12,11, 9, - 11,11,13,15, 9,11,11,15,13, 6, 7, 8,11,11, 7, 7, - 9,11,13, 8, 9, 9,13,12,11,11,12,12,15,11,12,12, - 15,14, 6, 8, 7,11,11, 8, 9, 9,12,13, 7, 9, 7,13, - 11,11,12,12,14,15,11,12,11,15,12,10,11,11,12,14, - 10,11,12,12,15,12,13,13,14,15,13,12,14,12,16,15, - 15,15,16,16,10,11,11,14,12,12,13,13,15,14,10,12, - 11,15,12,15,15,15,16,17,13,14,12,17,12, 6, 8, 8, - 12,12, 8, 9,10,13,13, 8, 9, 9,13,13,12,12,13,15, - 16,12,13,13,16,15, 8, 9,10,12,13, 9, 9,11,13,14, - 10,11,11,14,14,13,13,14,15,16,13,14,14,16,16, 8, - 10, 9,13,13,10,11,11,14,14, 9,10,10,14,13,13,14, - 14,16,17,13,13,13,16,15,12,13,13,14,16,13,13,14, - 14,16,14,14,14,16,16,15,15,16,15,18,16,17,17,18, - 18,12,13,13,15,15,14,14,14,16,16,13,14,13,16,15, - 16,16,17,18,18,15,16,15,18,15, 6, 8, 8,12,12, 8, - 9, 9,13,13, 8,10, 9,13,13,12,13,13,15,16,12,13, - 12,16,15, 8, 9,10,13,13, 9,10,10,13,14,10,11,11, - 14,14,13,13,13,15,16,13,14,14,17,16, 8,10, 9,13, - 13,10,11,11,14,14, 9,11, 9,14,13,13,14,14,16,16, - 13,14,13,16,14,12,13,13,15,16,13,13,14,15,16,14, - 14,14,16,16,15,15,16,15,18,17,17,17,18,18,12,13, - 13,16,14,14,14,14,16,16,13,14,13,16,14,16,17,17, - 18,18,15,16,15,18,15,11,12,13,14,16,13,13,14,15, - 17,13,14,14,16,17,16,16,17,17,19,16,17,17,18,19, - 13,13,14,16,16,14,14,15,16,17,14,15,15,17,17,17, - 16,17,17,19,17,17,18,19,19,13,14,14,16,16,14,14, - 15,17,18,14,15,14,17,17,17,17,18,18,19,17,17,17, - 18,19,16,16,16,17,18,17,17,17,18,19,17,17,17,18, - 19,18,18,19,18,20,19,20,19,21,20,16,17,17,18,18, - 17,17,18,19,19,17,17,17,19,18,19,19,19,19,20,19, - 19,19,20,19,11,13,12,16,14,13,14,14,17,16,13,14, - 13,17,15,16,17,17,18,18,16,17,16,19,17,13,14,14, - 16,16,14,14,14,17,17,14,15,15,17,16,17,17,17,19, - 19,17,18,17,19,18,13,14,13,17,16,14,15,15,17,17, - 14,15,14,18,16,17,17,17,19,19,17,17,16,19,17,16, - 17,17,18,19,17,17,17,18,18,17,18,17,19,18,18,19, - 18,19,19,19,20,19,20,20,16,17,16,18,17,17,17,17, - 18,18,17,18,17,19,17,19,19,19,19,20,18,19,19,20, - 18, 6, 8, 8,12,12, 8, 9, 9,13,13, 8,10, 9,13,13, - 11,13,13,15,16,12,13,13,16,15, 8, 9, 9,13,13, 9, - 9,10,13,14,10,11,11,14,14,12,12,13,14,16,13,14, - 14,17,16, 8,10, 9,13,13,10,11,11,14,14, 9,11,10, - 14,13,13,14,14,16,16,13,14,13,16,15,12,13,13,14, - 16,12,13,14,14,16,13,14,14,16,16,15,14,16,15,18, - 16,17,17,18,17,12,13,13,16,15,14,14,14,16,16,13, - 14,13,16,15,16,16,17,17,17,15,16,15,18,15, 7, 9, - 9,13,13, 9, 9,11,13,14, 9,10,10,14,13,12,13,14, - 15,16,12,14,13,17,15, 9, 9,10,13,14,10, 9,11,13, - 15,11,11,11,14,14,13,12,14,14,17,14,14,14,17,16, - 9,10,10,14,13,11,11,11,14,14,10,11,10,15,13,14, - 14,14,16,17,13,14,13,17,14,13,13,14,14,16,13,13, - 14,14,17,14,14,14,16,16,15,14,16,15,18,17,17,17, - 18,18,13,14,13,16,15,14,14,15,17,16,13,14,13,17, - 15,17,16,17,17,17,15,16,14,18,14, 7, 9, 9,13,13, - 9,10,10,13,14, 9,11,10,14,13,13,14,14,16,16,13, - 14,14,17,15, 9,10,10,14,13, 9,10,11,13,14,11,12, - 11,15,14,13,13,14,14,16,14,15,15,17,17, 9,10,10, - 14,14,11,12,12,14,15,10,11,10,15,13,14,15,15,17, - 17,14,15,13,17,14,13,14,13,16,16,13,13,14,15,16, - 14,15,15,17,17,15,14,16,15,18,17,18,17,20,18,13, - 14,14,16,16,15,15,15,17,17,13,14,13,17,15,17,17, - 18,18,18,15,16,14,19,14,12,13,13,15,16,13,13,15, - 16,17,13,14,14,16,16,15,15,17,17,19,16,17,17,19, - 18,13,13,14,15,17,14,13,15,15,17,14,15,15,16,17, - 16,15,18,16,19,17,17,17,18,19,13,14,14,17,16,14, - 15,15,17,17,14,15,14,17,16,17,17,17,18,19,16,17, - 16,19,17,16,16,17,16,18,16,16,17,16,19,17,17,18, - 18,19,18,17,18,17,21,19,19,19,20,19,16,17,17,18, - 18,17,17,18,18,19,16,17,16,18,18,19,19,19,19,20, - 18,18,17,20,18,11,13,13,16,15,13,14,14,16,17,13, - 15,14,17,16,16,17,17,18,18,17,17,17,19,18,13,14, - 13,17,16,14,13,14,16,17,15,16,15,18,16,17,16,17, - 17,19,18,18,18,20,18,13,14,14,16,17,15,15,15,17, - 18,14,15,14,18,16,18,18,18,19,20,17,18,16,20,17, - 16,17,16,18,18,16,16,17,18,18,17,18,18,19,18,18, - 17,19,17,20,19,20,19,22,20,16,16,17,18,18,18,17, - 17,19,19,16,17,16,18,17,19,20,19,22,21,18,19,18, - 21,17, 6, 8, 8,12,12, 8, 9,10,13,13, 8, 9, 9,13, - 13,12,13,13,15,16,11,13,13,16,15, 8, 9,10,13,13, - 9,10,11,13,14,10,11,11,14,14,13,13,14,15,16,13, - 14,14,16,16, 8, 9, 9,13,13,10,11,11,14,14, 9,10, - 9,14,13,13,14,14,16,17,12,14,12,16,14,12,13,13, - 15,16,13,13,14,15,16,13,14,14,15,17,15,15,16,15, - 18,16,16,17,17,17,12,13,13,16,14,13,14,14,16,16, - 12,14,13,16,14,16,17,17,18,18,15,15,14,18,14, 7, - 9, 9,13,13, 9,10,11,13,14, 9,10,10,14,13,13,14, - 14,15,17,13,14,14,16,15, 9,10,10,14,14,10,10,11, - 13,15,11,12,12,15,14,14,13,15,14,17,14,15,15,17, - 17, 9,10,10,13,14,11,11,12,14,15, 9,11,10,14,13, - 14,15,15,16,18,13,14,13,16,14,13,14,14,16,16,13, - 13,14,15,17,15,15,15,16,17,15,14,16,15,18,17,17, - 18,19,18,13,14,14,16,16,14,15,15,17,17,13,14,13, - 16,15,17,17,18,18,18,15,16,14,18,15, 7, 9, 9,13, - 13, 9,10,10,13,14, 9,11,10,14,13,12,13,14,15,16, - 12,14,13,16,15, 9,10,10,13,14,10,10,11,13,14,11, - 11,11,15,14,13,13,14,14,16,14,14,14,17,16, 9,10, - 9,14,13,11,11,11,14,14,10,11, 9,15,13,14,14,14, - 16,16,13,14,12,17,14,13,13,14,15,16,13,13,14,15, - 16,14,15,14,16,17,15,14,16,14,18,16,17,17,18,18, - 13,14,13,16,14,14,14,14,16,16,13,14,13,17,14,17, - 17,17,18,18,15,16,14,18,15,11,13,13,16,16,13,14, - 15,16,17,13,14,14,17,16,16,17,17,18,19,17,17,17, - 19,18,13,14,14,17,17,13,13,15,16,18,15,15,15,17, - 17,17,16,18,17,20,18,17,18,19,19,13,14,14,16,17, - 15,15,16,16,18,14,15,14,16,16,17,17,18,18,20,17, - 18,16,18,17,16,17,16,19,18,16,16,17,18,19,18,18, - 18,19,19,18,17,18,17,21,20,19,19,21,21,16,16,17, - 18,18,17,17,18,19,19,16,17,16,19,18,20,20,20,19, - 21,18,18,17,20,18,12,13,13,16,15,13,14,14,16,16, - 13,14,13,17,16,16,17,17,18,18,15,17,15,19,17,13, - 14,14,16,17,14,14,15,16,17,14,15,15,17,17,16,16, - 17,17,18,17,17,17,19,19,13,14,13,17,15,14,15,15, - 17,16,14,15,13,17,15,17,18,17,19,18,16,17,15,20, - 16,16,17,17,18,18,16,16,17,18,18,17,18,17,19,18, - 17,17,18,18,20,19,20,19,20,19,16,16,16,19,16,17, - 17,17,19,18,16,17,16,19,16,19,19,19,19,19,18,19, - 17,19,17,11,13,13,16,16,13,14,14,17,17,13,14,14, - 17,17,15,17,17,19,19,16,18,17,20,19,12,14,14,17, - 17,13,14,15,17,18,14,15,15,17,18,16,16,17,18,20, - 17,18,18,20,18,13,14,14,17,17,14,15,15,17,18,14, - 15,15,17,17,17,18,17,19,19,17,18,17,19,19,15,16, - 16,18,18,15,16,17,18,19,16,17,17,19,19,17,17,18, - 18,21,18,19,19,21,19,16,17,17,18,18,17,17,18,19, - 19,17,18,17,19,19,19,19,19,20,20,18,19,18,21,19, - 12,13,13,16,16,13,14,14,16,17,13,15,14,17,16,15, - 16,17,17,19,16,17,17,19,18,13,13,14,16,17,14,13, - 15,16,17,14,15,15,17,17,15,15,17,17,20,17,17,18, - 19,18,13,14,14,17,16,15,15,15,17,18,14,15,14,17, - 16,17,17,17,18,18,16,17,16,19,17,16,15,17,17,19, - 16,15,17,16,19,17,16,17,18,19,17,16,19,16,20,19, - 18,19,19,19,16,17,17,18,18,17,17,17,18,19,16,17, - 16,19,18,20,19,19,20,19,18,18,17,20,17,11,13,13, - 16,16,13,14,15,16,17,14,15,14,18,16,17,17,17,18, - 21,17,18,17,20,19,13,14,14,17,16,13,14,15,16,18, - 15,16,15,18,17,17,16,17,17,19,17,18,18,20,19,13, - 14,14,16,17,15,15,16,17,18,14,15,14,18,17,17,18, - 18,19,20,17,18,16,19,17,16,17,15,19,18,16,16,16, - 18,18,17,18,17,20,19,18,17,18,17,20,20,20,19,22, - 20,16,17,17,18,19,18,18,18,19,20,16,17,16,19,18, - 20,19,19,20,20,18,19,17,20,17,13,14,14,16,17,14, - 14,16,16,18,14,16,15,17,16,16,16,17,17,18,17,17, - 16,19,18,14,14,15,16,17,14,14,16,16,18,16,16,16, - 17,17,16,15,17,16,19,18,18,18,19,19,14,15,15,17, - 17,15,16,16,17,18,14,16,14,18,16,17,17,18,18,19, - 16,17,16,19,17,16,16,17,16,18,16,16,17,16,19,18, - 18,18,17,18,17,16,18,16,20,19,19,19,19,19,16,17, - 17,18,18,17,17,18,19,19,16,17,16,19,17,18,19,19, - 19,20,17,18,16,20,16,11,14,13,17,17,14,14,16,16, - 18,14,16,14,19,16,18,18,19,18,19,18,19,18,21,18, - 13,15,14,18,16,14,14,16,16,18,16,17,16,19,17,18, - 16,19,17,20,19,19,19,21,19,13,14,15,17,18,17,16, - 17,17,19,14,16,14,18,16,20,19,19,20,21,18,19,16, - 21,17,17,18,16,19,17,16,16,17,18,18,19,19,18,21, - 18,17,17,18,17,20,20,20,20,22,20,17,17,18,18,20, - 19,19,19,18,20,16,17,17,19,19,21,21,21,20,21,17, - 19,17,23,17,11,13,13,16,16,13,14,14,17,17,13,14, - 14,17,17,16,17,17,19,20,15,16,16,19,19,13,14,14, - 16,17,14,15,15,17,18,14,15,15,17,17,17,17,18,19, - 19,17,17,18,19,19,13,14,14,17,16,14,15,15,17,17, - 13,15,14,18,17,17,18,18,19,20,16,17,16,19,18,16, - 16,17,18,18,17,17,17,18,19,17,18,17,19,19,19,19, - 19,19,20,19,20,19,20,20,15,16,16,18,17,16,17,17, - 20,18,15,16,16,19,17,19,19,19,20,20,17,18,17,21, - 17,11,13,13,16,16,13,14,15,16,17,13,15,14,17,16, - 17,17,18,18,20,17,17,17,19,19,13,14,14,17,17,14, - 14,15,17,18,15,15,15,18,17,17,17,18,17,20,18,18, - 17,20,18,13,14,14,16,17,15,15,16,17,18,14,15,13, - 17,17,17,18,18,19,20,17,17,16,19,17,16,17,17,18, - 18,16,16,17,18,18,18,18,18,19,19,18,17,19,18,21, - 19,20,20,20,20,16,15,17,18,18,17,17,18,18,20,16, - 16,16,18,17,20,19,20,21,22,17,18,17,20,17,12,13, - 13,16,16,13,14,15,16,17,13,14,14,17,16,16,17,18, - 18,19,15,16,16,19,18,13,14,14,16,17,14,14,15,16, - 17,14,15,15,17,17,16,16,17,17,19,17,17,17,19,18, - 13,14,13,17,16,14,15,15,17,17,13,15,13,17,16,17, - 17,17,19,19,15,17,15,19,17,16,17,17,18,18,16,16, - 17,17,19,17,18,17,19,19,18,17,19,17,19,19,19,19, - 20,19,15,17,15,19,16,17,17,16,19,18,16,17,15,18, - 16,19,19,19,20,19,17,19,16,19,16,11,14,14,17,17, - 15,14,16,16,18,15,16,14,18,16,18,18,19,18,21,18, - 19,18,20,18,13,15,14,18,17,14,14,16,16,18,16,17, - 16,19,17,17,17,19,17,22,19,19,19,21,19,13,14,15, - 17,18,17,16,17,17,19,14,16,14,18,16,19,19,19,20, - 21,18,18,16,20,17,17,18,16,19,18,15,17,17,19,19, - 19,19,18,21,19,18,17,20,17,21,22,21,20,21,21,17, - 16,19,18,20,19,18,19,18,20,16,17,16,19,18,21,20, - 21,19,23,18,19,16,20,17,13,14,14,17,16,14,14,15, - 16,18,14,16,14,17,16,16,16,17,17,19,16,17,16,19, - 17,14,15,15,17,17,14,14,16,16,17,15,16,16,18,17, - 16,16,17,17,19,17,18,17,19,18,14,15,14,17,16,16, - 16,16,17,17,14,16,14,17,16,18,18,18,18,19,16,17, - 15,19,16,17,17,17,18,18,16,15,17,17,18,18,18,18, - 19,19,17,16,18,16,19,19,19,19,19,19,16,17,16,19, - 16,18,18,17,19,18,16,17,16,19,16,19,19,20,19,19, - 17,18,16,20,16, -}; - -static const static_codebook _44p6_p5_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p6_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p6_p5_0, - 0 -}; - -static const long _vq_quantlist__44p6_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44p6_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p6_p5_1 = { - 1, 7, - (long *)_vq_lengthlist__44p6_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p6_p5_1, - 0 -}; - -static const long _vq_quantlist__44p6_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p6_p6_0[] = { - 1, 5, 5, 5, 7, 9, 5, 9, 7, 5, 7, 8, 7, 7,10, 9, - 10,10, 5, 8, 7, 9,10,10, 7,10, 7, 6, 9, 9, 9,10, - 12, 9,11,11, 9,10,11,11,11,13,12,13,13, 9,11,11, - 12,13,13,11,13,11, 6, 9, 9, 9,11,11, 9,12,10, 9, - 11,11,11,11,13,12,13,13, 9,11,10,12,13,13,11,13, - 11, 6, 9, 9, 9,11,12, 9,12,11, 9,10,11,10,10,13, - 12,13,13, 9,11,11,12,13,12,11,13,11, 7, 9,10, 9, - 10,12,10,12,11,10,10,12,10,10,12,12,12,13,10,11, - 11,12,12,13,10,12,10, 7,10,10,11,11,14,11,14,11, - 10,12,11,11,11,14,14,14,14,10,11,12,14,14,14,11, - 14,11, 6, 9, 9, 9,11,12, 9,12,11, 9,11,11,11,11, - 13,12,12,13, 9,11,10,12,13,13,10,13,10, 7,10,10, - 11,11,14,11,14,11,10,12,11,11,11,14,14,15,14,10, - 11,12,13,14,15,11,14,11, 7,10, 9,10,11,12, 9,12, - 10,10,11,11,10,10,12,12,13,12, 9,12,10,12,13,12, - 10,12,10, -}; - -static const static_codebook _44p6_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44p6_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p6_p6_0, - 0 -}; - -static const long _vq_quantlist__44p6_p6_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p6_p6_1[] = { - 2, 6, 6, 6, 7, 8, 6, 8, 7, 6, 7, 7, 7, 7, 8, 7, - 8, 8, 6, 7, 7, 7, 8, 8, 7, 8, 7, 6, 8, 8, 8, 9, - 9, 8, 9, 9, 8, 9, 9, 9, 9,10, 9,10,10, 8, 9, 9, - 9,10,10, 9,10, 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, - 9, 9, 9, 9,10, 9,10,10, 8, 9, 9, 9,10, 9, 9,10, - 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9,10, - 9, 9,10, 8, 9, 9, 9,10, 9, 9,10, 9, 7, 8, 8, 8, - 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, 9, - 9, 9,10, 9, 9, 9, 9, 7, 9, 9, 9, 9,10, 9,10, 9, - 9, 9, 9, 9, 9,10,10,10,10, 9, 9, 9,10,10,10, 9, - 10, 9, 6, 8, 8, 8, 9, 9, 8, 9, 9, 8, 9, 9, 9, 9, - 10, 9,10,10, 8, 9, 9, 9,10, 9, 9,10, 9, 7, 9, 9, - 9, 9,10, 9,10, 9, 9, 9, 9, 9, 9,10,10,10,10, 9, - 9, 9,10,10,10, 9,10, 9, 7, 8, 8, 8, 9, 9, 8, 9, - 9, 8, 9, 9, 9, 9,10, 9, 9,10, 8, 9, 8, 9, 9, 9, - 9,10, 9, -}; - -static const static_codebook _44p6_p6_1 = { - 5, 243, - (long *)_vq_lengthlist__44p6_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p6_p6_1, - 0 -}; - -static const long _vq_quantlist__44p6_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p6_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p6_p7_0 = { - 5, 243, - (long *)_vq_lengthlist__44p6_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p6_p7_0, - 0 -}; - -static const long _vq_quantlist__44p6_p7_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p6_p7_1[] = { - 1, 4, 5, 5,10,10, 5,10,10, 5,10,10,10,10,10,10, - 10,10, 5,10,10,10,10,10,10,10,10, 7,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10, 6,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10, 9,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10, 9,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, 9,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, - 11,11,11, -}; - -static const static_codebook _44p6_p7_1 = { - 5, 243, - (long *)_vq_lengthlist__44p6_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p6_p7_1, - 0 -}; - -static const long _vq_quantlist__44p6_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p6_p7_2[] = { - 1, 2, 3, 4, 5, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p6_p7_2 = { - 1, 25, - (long *)_vq_lengthlist__44p6_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p6_p7_2, - 0 -}; - -static const long _vq_quantlist__44p6_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p6_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p6_p7_3 = { - 1, 25, - (long *)_vq_lengthlist__44p6_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p6_p7_3, - 0 -}; - -static const long _huff_lengthlist__44p6_short[] = { - 2, 8,13,15,16,18,21,22, 5, 4, 6, 8,10,12,17,21, - 9, 5, 5, 6, 8,11,15,19,11, 6, 5, 5, 6, 7,12,14, - 14, 8, 7, 5, 4, 4, 9,11,16,11, 9, 7, 4, 3, 7,10, - 22,15,14,12, 8, 7, 9,11,21,16,15,12, 9, 5, 6, 8, -}; - -static const static_codebook _huff_book__44p6_short = { - 2, 64, - (long *)_huff_lengthlist__44p6_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p7_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44p7_l0_0[] = { - 2, 4, 4, 7, 7, 8, 8,10,10,11,11,12,12, 4, 5, 5, - 7, 7, 9, 9,11, 9,12,11,12,12, 4, 5, 5, 7, 7, 9, - 9, 9,10,10,11,12,12, 7, 7, 7, 7, 8, 9, 8,11, 5, - 12, 6,12,10, 7, 7, 7, 8, 7, 8, 9, 5,11, 6,12,10, - 12, 8, 9, 9, 9, 9,10,10,11, 7,11, 7,12, 9, 8, 9, - 8, 9, 9,10,10, 7,11, 7,11, 9,11,10,10,10,10,10, - 10,10,11,10,11, 8,11, 9,10,10,10,10,10,10,10,10, - 11, 8,10, 9,11,10,11,11,11,11,11,10,11,10,12,10, - 12,11,10,11,11,11,11,10,11,10,11,10,12,11,12,11, - 12,12,12,12,12,12,12,12,12,12,13,12,11,12,11,12, - 12,12,12,12,11,12,11,12,13, -}; - -static const static_codebook _44p7_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44p7_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p7_l0_0, - 0 -}; - -static const long _vq_quantlist__44p7_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p7_l0_1[] = { - 4, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p7_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44p7_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p7_l0_1, - 0 -}; - -static const long _vq_quantlist__44p7_l1_0[] = { - 54, - 29, - 79, - 0, - 108, -}; - -static const long _vq_lengthlist__44p7_l1_0[] = { - 1, 2, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44p7_l1_0 = { - 2, 25, - (long *)_vq_lengthlist__44p7_l1_0, - 1, -514516992, 1620639744, 7, 0, - (long *)_vq_quantlist__44p7_l1_0, - 0 -}; - -static const long _huff_lengthlist__44p7_lfe[] = { - 2, 3, 1, 3, -}; - -static const static_codebook _huff_book__44p7_lfe = { - 2, 4, - (long *)_huff_lengthlist__44p7_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44p7_long[] = { - 2, 7,14,16,17,17,18,20, 6, 3, 5, 8,10,11,13,15, - 13, 5, 3, 5, 8, 9,11,12,15, 7, 4, 3, 5, 7, 9,11, - 16,10, 7, 5, 6, 7, 9,10,17,11, 8, 7, 7, 6, 8, 8, - 19,13,11, 9, 9, 8, 8, 9,20,14,13,11,10, 8, 9, 9, -}; - -static const static_codebook _huff_book__44p7_long = { - 2, 64, - (long *)_huff_lengthlist__44p7_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p7_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p7_p1_0[] = { - 2, 5, 5, 4, 7, 7, 4, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 6, 7, 8, 8, 9, - 10, 8, 9,10, 8, 9,10,10,10,12,10,11,11, 8,10,10, - 10,11,12,10,11,11, 6, 8, 7, 8,10, 9, 8,10, 9, 8, - 10,10,10,11,11,10,12,11, 8,10, 9,10,11,11,10,12, - 10, 5, 8, 8, 8,10,10, 8,10,10, 7, 9,10, 9,10,11, - 9,11,11, 8,10,10,10,11,12,10,12,11, 7, 9, 9, 9, - 10,11, 9,11,11, 9, 9,11,10,11,12,11,11,12, 9,11, - 11,11,12,12,11,12,12, 7, 9, 9,10,11,11,10,12,11, - 9,11,10,11,11,12,11,13,12,10,11,11,12,13,13,11, - 13,11, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, - 12,10,12,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, - 10,11,12,10,11,11,10,11,11,11,11,13,12,13,13, 9, - 10,11,11,12,13,11,12,11, 7, 9, 9, 9,11,11, 9,11, - 10, 9,11,11,11,12,12,11,12,12, 9,11, 9,11,12,11, - 10,12,11, -}; - -static const static_codebook _44p7_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44p7_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p7_p1_0, - 0 -}; - -static const long _vq_quantlist__44p7_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p7_p2_0[] = { - 4, 6, 6, 9, 9, 6, 8, 8,10,10, 6, 8, 8,10,10, 8, - 10,10,12,13, 8,10,10,13,12, 6, 8, 8,10,10, 8, 8, - 9,10,11, 8, 9, 9,11,11,10,10,11,12,13,10,11,11, - 13,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 8, 9, 8,11, - 10,10,11,11,13,13,10,11,10,13,12, 9,10,10,12,12, - 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,13, - 13,13,15,14, 9,10,10,12,12,10,11,11,13,13,10,11, - 10,13,12,12,13,13,14,15,12,13,12,15,12, 6, 8, 8, - 10,11, 8, 9,10,11,12, 8, 9, 9,11,11,10,11,12,13, - 14,10,11,11,13,13, 8, 9, 9,11,12, 9,10,11,12,13, - 9,10,10,12,13,11,12,13,13,15,11,12,12,14,14, 8, - 9, 9,11,12, 9,10,11,12,13, 9,10,10,13,12,11,12, - 13,14,15,11,12,12,14,13,10,11,12,13,14,11,12,13, - 13,15,12,13,13,14,14,13,13,14,14,16,14,15,14,16, - 15,10,12,11,14,13,12,12,13,14,14,11,12,12,14,14, - 14,14,15,15,16,13,14,14,16,14, 6, 8, 8,11,10, 8, - 9, 9,11,11, 8,10, 9,12,11,10,11,11,13,13,10,12, - 11,14,13, 8, 9, 9,12,11, 9,10,10,12,13, 9,11,10, - 13,12,11,12,12,14,14,11,13,12,15,14, 8, 9, 9,12, - 11, 9,10,10,13,12, 9,11,10,13,12,11,12,12,14,14, - 11,13,12,15,13,10,11,12,13,14,11,12,13,13,14,12, - 13,12,14,14,13,13,14,14,16,14,15,14,16,16,10,12, - 11,14,13,12,13,13,14,14,11,13,12,15,13,14,14,15, - 16,16,13,14,13,16,14, 9,10,11,12,13,11,11,12,13, - 14,11,11,12,13,14,13,13,14,14,16,13,14,14,15,15, - 11,11,12,13,14,12,12,13,13,15,12,13,13,14,15,14, - 14,15,15,17,14,14,15,16,16,11,12,12,13,14,12,12, - 13,14,15,12,13,12,14,15,14,14,15,15,17,14,15,14, - 16,16,13,14,14,15,16,14,14,15,15,17,14,15,15,16, - 16,15,16,17,16,18,16,17,16,17,17,13,14,14,16,15, - 14,15,15,16,16,14,15,14,16,15,16,16,17,17,18,16, - 16,16,17,16, 9,11,10,13,12,11,12,11,14,13,11,12, - 11,14,13,13,14,14,16,15,13,14,13,16,14,11,12,12, - 14,13,12,12,13,14,14,12,13,13,15,14,14,14,15,16, - 16,14,15,14,17,15,11,12,11,14,13,12,13,13,15,14, - 12,13,12,15,13,14,15,14,16,16,14,15,14,17,15,13, - 14,14,15,16,14,14,15,16,16,14,15,15,16,16,15,16, - 16,16,17,16,16,16,17,17,13,14,14,16,15,14,15,15, - 17,16,14,15,14,17,15,16,17,17,17,17,16,16,16,18, - 16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12,11, - 10,11,11,13,14,10,11,11,14,13, 8, 9, 9,11,12, 9, - 10,10,12,13, 9,10,10,13,12,11,11,12,13,15,11,12, - 12,15,14, 8, 9, 9,12,11, 9,10,11,12,13, 9,11,10, - 13,12,11,12,12,14,15,11,13,12,15,14,10,11,11,13, - 14,11,12,12,13,14,11,12,12,14,14,13,13,14,14,16, - 13,14,14,16,15,11,12,11,14,13,12,13,13,14,14,11, - 13,12,14,13,14,14,15,16,16,13,14,14,16,14, 8, 9, - 9,11,12, 9,10,10,12,13, 9,10,10,13,12,11,12,12, - 14,15,11,12,12,14,14, 9, 9,10,11,13,10,10,12,12, - 14,10,10,11,13,13,12,12,13,14,16,12,12,13,15,15, - 9,10,10,13,12,10,11,11,13,14,10,12,11,14,13,12, - 13,13,15,15,12,13,13,15,15,11,11,12,13,15,12,12, - 13,13,15,12,13,13,14,15,14,14,15,15,17,14,15,15, - 16,16,11,13,12,15,14,13,13,13,15,15,12,14,13,15, - 14,15,15,15,16,16,14,15,15,17,15, 7, 9, 9,12,11, - 9,10,10,12,12, 9,11,10,13,12,11,12,12,14,14,11, - 13,12,15,14, 9,10,10,12,12,10,10,11,12,13,10,11, - 11,14,13,12,12,13,14,15,12,13,13,15,14, 9,10,10, - 12,12,10,11,11,13,13,10,11,10,14,12,12,13,13,15, - 15,12,13,12,15,13,11,12,12,14,14,12,12,13,14,15, - 12,13,13,15,15,14,13,14,13,16,14,15,15,16,16,11, - 12,12,14,14,13,13,14,15,15,12,13,12,15,14,15,15, - 15,16,16,14,15,14,17,14,10,11,12,13,14,11,12,13, - 14,15,11,12,12,14,15,13,14,15,15,17,14,14,14,16, - 16,11,12,13,12,15,12,12,14,13,16,13,13,14,13,16, - 14,14,15,14,17,15,15,15,15,17,11,13,12,15,15,13, - 13,14,15,16,12,14,13,16,15,15,15,15,17,17,15,15, - 15,17,16,14,14,15,14,16,14,14,16,14,17,15,15,15, - 14,17,16,16,17,15,18,17,17,17,16,18,14,15,15,17, - 16,15,16,16,17,17,15,16,15,17,16,17,17,17,18,18, - 16,17,16,18,17,10,11,11,14,13,11,12,12,14,14,11, - 13,12,15,14,14,14,14,16,16,14,15,14,16,15,11,12, - 12,15,13,12,13,13,15,14,13,14,13,16,14,14,15,15, - 16,16,15,16,15,17,16,11,13,12,15,14,13,13,14,15, - 15,12,14,13,16,14,15,15,15,17,17,14,16,15,17,16, - 14,14,14,16,15,14,15,15,16,16,15,16,15,17,16,16, - 16,16,16,17,16,17,17,18,17,14,15,15,16,16,15,15, - 16,17,16,14,15,15,17,16,17,17,17,18,18,16,17,16, - 18,16, 6, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, - 11,10,11,12,13,14,10,11,11,14,13, 8, 9, 9,11,12, - 9,10,11,12,13, 9,11,10,13,12,11,12,13,14,15,11, - 12,12,15,14, 8, 9, 9,12,11, 9,10,10,12,13, 9,10, - 10,13,12,11,12,12,14,15,11,12,12,14,13,11,11,12, - 13,14,11,12,13,13,15,12,13,13,14,14,13,14,14,14, - 16,14,15,14,16,16,10,11,11,14,13,11,12,12,14,14, - 11,12,12,14,13,13,14,14,15,16,13,14,13,16,14, 7, - 9, 9,11,11, 9,10,11,12,13, 9,10,10,12,12,11,12, - 13,14,15,11,12,12,14,14, 9,10,10,12,12,10,10,11, - 12,13,10,11,11,13,13,12,12,13,13,15,12,13,13,15, - 15, 9,10,10,12,12,10,11,11,13,13,10,11,10,13,12, - 12,13,13,14,15,12,13,12,15,13,11,12,12,14,14,12, - 12,13,14,15,13,14,13,15,15,14,13,15,13,16,15,15, - 15,16,16,11,12,12,14,14,12,13,13,14,15,12,13,12, - 15,14,14,15,15,16,17,13,14,13,16,13, 8, 9, 9,12, - 11, 9,10,10,12,13, 9,10,10,13,12,11,12,12,14,15, - 11,12,12,15,14, 9,10,10,12,13,10,11,12,13,14,10, - 11,11,14,13,12,13,13,15,15,12,13,13,15,15, 9,10, - 9,13,11,10,11,10,13,13,10,12,10,14,12,12,13,12, - 15,15,12,13,12,15,14,11,12,13,14,15,12,13,14,14, - 15,13,13,13,15,15,14,15,15,15,17,15,15,15,16,16, - 11,12,11,15,13,12,13,13,15,14,12,13,12,16,13,14, - 15,15,16,16,14,15,14,17,14,10,11,11,13,14,11,12, - 13,14,15,11,12,12,14,14,14,14,15,15,17,14,14,14, - 15,16,11,12,13,14,15,12,13,14,14,16,13,14,13,15, - 15,14,15,16,15,17,15,15,15,17,17,11,12,12,13,15, - 13,13,14,14,16,12,13,13,14,15,15,15,15,16,17,14, - 15,15,16,16,14,15,15,16,16,14,15,15,16,17,15,15, - 16,16,17,16,16,17,16,18,17,17,17,18,18,14,14,15, - 15,16,15,15,15,16,17,14,15,15,16,16,16,17,17,17, - 18,16,16,16,17,16,10,11,11,14,13,11,13,12,15,14, - 11,13,12,15,14,14,15,14,16,16,13,15,14,17,15,11, - 12,13,15,15,12,13,14,15,16,13,14,13,16,15,15,15, - 15,16,17,15,15,15,17,16,11,13,11,15,12,13,14,13, - 16,13,12,14,12,16,13,15,15,15,17,15,14,16,14,17, - 14,14,15,15,16,17,15,15,16,16,17,15,16,15,17,17, - 16,16,17,17,18,16,17,17,18,18,14,15,14,17,13,15, - 16,15,17,15,15,16,15,17,14,16,17,16,18,16,16,17, - 16,18,15, 9,11,11,13,13,10,12,12,14,14,11,12,12, - 14,14,13,14,14,15,16,13,14,14,16,16,10,11,12,14, - 14,11,12,13,14,15,11,13,13,15,15,13,14,14,15,16, - 14,15,15,16,16,11,12,12,14,14,12,13,13,15,15,12, - 13,12,15,14,14,15,15,16,16,14,15,14,17,16,12,13, - 13,15,16,13,13,14,15,16,13,14,14,16,16,14,15,16, - 16,17,15,16,16,17,17,13,14,14,16,15,14,15,15,17, - 16,14,15,14,17,15,16,16,17,17,17,16,16,16,18,16, - 10,11,12,14,14,11,12,13,14,15,11,13,12,15,15,13, - 14,15,16,16,14,15,15,17,16,11,11,13,14,15,12,12, - 14,14,16,12,13,14,15,15,14,14,15,16,17,15,15,15, - 17,17,12,13,12,15,15,13,14,14,16,15,13,14,13,16, - 15,15,16,15,17,17,15,16,15,17,16,13,12,15,14,16, - 14,13,15,14,17,14,13,15,15,17,15,14,17,15,18,16, - 15,17,17,18,14,15,15,17,16,15,16,16,17,17,15,16, - 15,17,16,16,17,17,18,18,16,17,16,18,17,10,11,11, - 14,14,11,12,12,14,15,11,13,12,15,14,13,14,14,16, - 16,14,15,14,16,16,11,12,12,14,14,12,12,13,15,15, - 12,13,13,15,15,14,14,15,16,16,14,15,15,17,16,11, - 12,12,15,15,13,13,13,15,15,12,13,13,15,15,15,15, - 15,17,17,14,15,15,17,16,13,14,13,16,15,14,14,14, - 16,16,14,15,14,17,16,15,15,16,16,17,16,17,16,18, - 17,14,15,15,16,16,15,15,15,17,17,14,15,15,17,16, - 16,17,17,18,18,16,17,16,18,16,12,13,13,15,15,13, - 14,14,16,16,13,14,14,16,16,14,15,16,16,18,15,16, - 16,17,17,13,13,14,14,16,14,14,15,15,17,14,14,15, - 15,17,15,15,17,15,18,16,16,17,17,18,13,14,14,16, - 16,14,15,15,16,17,14,15,15,17,16,16,17,16,17,18, - 16,17,16,18,17,15,14,16,13,18,16,15,17,14,18,16, - 15,17,14,18,17,16,18,15,19,17,17,18,16,19,15,16, - 16,17,17,16,17,17,18,18,16,17,16,18,17,18,18,18, - 19,18,17,18,17,19,17,11,12,12,15,15,13,13,14,15, - 16,13,14,13,16,15,15,15,15,16,17,15,16,15,17,16, - 12,13,13,15,15,13,13,14,15,16,14,15,14,16,15,15, - 15,16,16,17,16,16,16,18,17,12,13,13,15,15,14,14, - 15,16,16,13,14,13,16,15,16,16,16,17,17,15,16,15, - 18,16,15,15,15,17,15,14,15,15,16,16,16,17,16,17, - 16,16,16,17,16,17,17,18,17,19,18,15,15,16,17,17, - 16,16,16,17,17,15,16,15,17,16,17,18,18,18,18,16, - 17,16,18,16, 9,11,11,13,13,11,12,12,14,14,10,12, - 12,14,14,13,14,14,15,16,13,14,14,16,15,11,12,12, - 14,14,12,12,13,14,15,12,13,13,15,15,14,14,15,16, - 17,14,15,15,16,16,10,12,11,14,14,11,13,13,15,15, - 11,13,12,15,14,14,14,15,16,16,13,14,14,16,15,13, - 14,14,15,16,14,14,15,15,17,14,15,15,16,17,16,16, - 16,16,18,16,16,17,17,17,12,13,13,16,15,13,14,14, - 16,16,12,14,13,16,15,15,16,16,17,17,14,16,15,17, - 16,10,11,11,14,14,11,12,13,14,15,11,12,12,15,14, - 14,14,15,16,16,13,14,14,16,16,11,12,12,14,15,12, - 13,14,15,15,13,13,13,15,15,14,15,15,16,17,15,15, - 15,16,17,11,12,12,14,14,12,13,13,15,15,12,13,12, - 15,15,14,15,15,16,17,14,15,14,16,16,14,14,15,16, - 16,14,15,15,16,17,15,16,15,17,17,16,16,17,16,18, - 16,17,17,18,18,13,13,14,15,16,14,14,15,16,17,14, - 14,14,16,15,16,16,17,17,18,15,16,15,17,16,10,12, - 11,14,14,11,13,13,15,15,11,13,12,15,15,14,15,15, - 16,16,13,15,14,16,16,12,12,13,15,15,13,13,14,15, - 16,13,14,14,16,15,15,15,16,16,17,15,15,15,17,17, - 11,13,11,15,14,12,14,13,16,15,12,14,12,16,14,15, - 15,15,17,17,14,15,14,17,15,14,15,15,16,17,15,15, - 16,16,17,15,16,16,17,17,16,16,17,17,18,16,17,17, - 18,18,13,14,12,16,14,14,15,13,17,15,14,15,13,17, - 14,16,17,15,18,17,15,17,14,18,15,11,12,12,14,15, - 13,13,14,15,16,13,14,13,16,15,15,15,16,16,17,15, - 15,15,16,16,12,13,13,15,15,13,13,14,15,16,14,15, - 14,16,16,15,15,16,16,18,16,16,16,18,17,12,13,13, - 15,15,14,14,15,15,16,13,14,13,15,15,16,16,16,17, - 18,15,16,15,17,16,15,16,15,17,16,15,15,16,16,17, - 16,17,16,17,17,16,16,17,16,18,17,18,18,18,18,14, - 15,15,15,17,16,15,17,16,17,14,15,15,16,16,17,17, - 18,18,19,16,16,16,17,16,12,13,13,15,15,13,14,14, - 16,16,13,14,14,16,16,15,16,16,17,17,15,16,15,18, - 16,13,14,14,16,16,14,15,15,16,17,14,15,15,17,16, - 16,16,17,17,18,16,17,16,18,18,13,14,13,16,14,14, - 15,14,17,15,14,15,14,17,14,16,17,16,18,17,15,17, - 15,18,15,15,16,16,17,18,16,16,17,17,18,16,17,17, - 17,18,17,17,18,18,19,17,18,18,19,18,15,16,14,17, - 13,16,17,15,18,14,16,17,15,18,14,18,18,17,19,16, - 17,18,16,19,15, -}; - -static const static_codebook _44p7_p2_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p7_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p7_p2_0, - 0 -}; - -static const long _vq_quantlist__44p7_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p7_p3_0[] = { - 2, 5, 5, 4, 7, 7, 4, 7, 7, 5, 7, 8, 7, 8,10, 8, - 9, 9, 5, 7, 7, 8, 9, 9, 7,10, 8, 5, 7, 8, 8, 9, - 10, 8,10,10, 8, 9,10,10,10,12,10,12,12, 8,10,10, - 10,12,12,10,12,11, 5, 8, 7, 8,10,10, 8,10, 9, 8, - 10,10,10,11,12,10,12,12, 8,10, 9,10,12,12,10,12, - 10, 5, 8, 8, 7,10,10, 8,10,10, 7, 9,10, 9,10,12, - 10,12,12, 8,10,10,10,12,12,10,12,11, 7, 9,10, 9, - 11,12,10,12,11, 9, 9,12,11,10,14,12,12,13,10,12, - 11,12,13,13,11,14,12, 7,10, 9,10,11,11,10,12,11, - 9,11,11,11,11,13,12,14,13,10,12,12,12,14,14,11, - 14,12, 5, 8, 8, 8,10,10, 7,10,10, 8,10,10,10,11, - 12,10,12,12, 7,10, 9,10,12,12, 9,12,10, 7, 9,10, - 10,11,12,10,11,11,10,12,12,11,12,14,12,14,14, 9, - 11,11,12,13,14,11,13,11, 7,10, 9,10,11,12, 9,12, - 11,10,11,12,11,12,14,12,13,13, 9,12, 9,12,13,12, - 11,14,10, -}; - -static const static_codebook _44p7_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44p7_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p7_p3_0, - 0 -}; - -static const long _vq_quantlist__44p7_p3_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p7_p3_1[] = { - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 8, 7, - 8, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, 8, - 8, 8, 8, 8, 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, - 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 7, 8, 8, 8, - 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, - 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, - 9, 8, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 8, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, - 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, 8, 8, 8, 9, - 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, - 8, 9, 8, -}; - -static const static_codebook _44p7_p3_1 = { - 5, 243, - (long *)_vq_lengthlist__44p7_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p7_p3_1, - 0 -}; - -static const long _vq_quantlist__44p7_p4_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p7_p4_0[] = { - 1, 5, 5, 5, 7, 8, 5, 8, 7, 5, 7, 8, 7, 8,10, 8, - 10,10, 5, 8, 7, 8,10,10, 7,10, 8, 6, 8, 9, 9,10, - 12, 9,11,11, 9,10,11,11,11,13,11,13,13, 9,11,11, - 11,12,13,11,13,11, 6, 9, 8, 9,11,11, 9,12,10, 9, - 11,11,11,11,13,11,13,13, 9,11,10,11,13,13,11,13, - 11, 6, 9, 9, 8,10,11, 9,12,11, 8,10,11,10,11,13, - 11,13,13, 9,11,11,11,13,12,11,13,11, 8,10,10, 9, - 11,12,10,12,12,10,10,12,11,11,14,12,13,14,10,12, - 12,12,13,13,11,14,11, 8,11,10,11,12,13,11,14,12, - 10,12,11,11,12,14,13,15,14,10,12,12,13,14,15,12, - 14,12, 5, 9, 9, 9,11,12, 8,11,10, 9,11,11,11,11, - 13,11,12,13, 8,11,10,11,13,13,10,13,11, 8,10,11, - 11,12,14,11,13,12,10,12,12,12,12,14,14,15,14,10, - 11,12,13,14,15,11,14,12, 8,10,10,10,12,12, 9,12, - 11,10,12,12,11,11,14,12,13,13,10,12,10,12,14,13, - 11,13,11, -}; - -static const static_codebook _44p7_p4_0 = { - 5, 243, - (long *)_vq_lengthlist__44p7_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p7_p4_0, - 0 -}; - -static const long _vq_quantlist__44p7_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p7_p4_1[] = { - 7, 8, 8,10,10, 8, 9, 9,10,11, 8, 9, 9,10,10, 9, - 10,10,11,11, 9,10,10,11,11, 8, 9, 9,10,10, 9, 9, - 10,11,11, 9,10,10,11,11,10,10,11,11,11,10,11,11, - 11,11, 8, 9, 9,10,10, 9,10,10,11,11, 9,10, 9,11, - 11,10,11,11,11,11,10,11,10,11,11,10,10,10,11,11, - 10,11,11,11,11,10,11,11,11,11,11,11,11,11,12,11, - 11,11,11,12,10,10,10,11,11,10,11,11,11,11,10,11, - 11,11,11,11,11,11,12,11,11,11,11,12,11, 8, 9,10, - 11,11, 9,10,11,11,11, 9,10,10,11,11,10,11,11,12, - 12,10,11,11,12,12,10,10,10,11,11,10,10,11,11,12, - 10,11,11,12,12,11,11,12,12,12,11,11,12,12,12,10, - 10,10,11,11,10,11,11,12,12,10,11,11,12,11,11,12, - 12,12,12,11,12,11,12,12,11,11,11,11,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12, 8,10, 9,11,11, 9, - 10,10,11,11, 9,10,10,11,11,10,11,11,12,12,10,11, - 11,12,12,10,10,10,11,11,10,11,11,12,12,10,11,11, - 12,12,11,11,12,12,12,11,12,12,12,12,10,10,10,11, - 11,10,11,11,12,12,10,11,10,12,11,11,12,11,12,12, - 11,12,11,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, - 11,12,11,11,12,12,12,12,11,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,10,11,11,11,12,11,11,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 11,11,12,12,12,11,12,12,12,12,12,12,12,12,12,12, - 12,13,12,13,12,12,12,13,13,11,12,11,12,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,13,13,12,12,12, - 13,13,12,12,12,12,12,12,12,12,12,13,12,12,13,13, - 13,12,13,13,13,13,12,13,13,13,13,12,12,12,12,12, - 12,12,13,13,13,12,12,12,13,12,12,13,13,13,13,12, - 13,13,13,13,10,11,11,12,11,11,11,11,12,12,11,12, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,12,12,12,13,13,11,12,11,12,12,12,12,12,12,12, - 11,12,11,12,12,12,12,12,13,13,12,12,12,13,12,12, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,12,13, - 13,13,13,12,13,13,13,13,12,12,12,12,12,12,12,12, - 13,13,12,13,12,13,12,12,13,13,13,13,13,13,13,13, - 13, 8,10,10,11,11, 9,10,10,11,11, 9,10,10,11,11, - 10,11,11,12,12,10,11,11,12,12, 9,10,10,11,11,10, - 10,11,11,12,10,11,11,12,12,11,11,12,12,12,11,11, - 12,12,12,10,10,10,11,11,10,11,11,12,12,10,11,10, - 12,11,11,12,11,12,12,11,12,11,12,12,11,11,11,12, - 12,11,11,12,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,11,11,11,12,11,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12, 9,10, - 10,11,11,10,11,11,11,12,10,11,11,12,12,11,11,11, - 12,12,11,11,11,12,12,10,10,11,11,12,11,11,12,12, - 12,11,11,11,12,12,11,11,12,12,12,11,12,12,12,12, - 10,11,11,12,12,11,11,11,12,12,11,12,11,12,12,11, - 12,12,12,12,11,12,12,12,12,11,11,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,13,12,12,12, - 12,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12, 9,10,10,11,11, - 10,11,11,12,12,10,11,11,12,11,11,12,11,12,12,11, - 12,11,12,12,10,11,11,12,12,11,11,11,12,12,11,12, - 11,12,12,11,12,12,12,12,12,12,12,12,12,10,11,11, - 12,12,11,12,11,12,12,11,12,11,12,12,12,12,12,13, - 12,12,12,12,12,12,11,12,11,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12,12,12,12,13,11, - 12,12,12,12,12,12,12,13,12,11,12,12,12,12,12,12, - 12,13,12,12,12,12,13,12,10,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 13,11,11,12,12,12,12,12,12,12,13,12,12,12,12,12, - 12,12,13,12,13,12,12,13,13,13,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,12,12,13,12,13,13,12,13, - 12,13,13,12,12,12,12,12,12,12,13,12,13,12,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,13, - 13,12,13,13,13,13,12,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,10,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,11,12, - 12,12,12,12,12,12,12,13,12,12,12,13,12,12,12,13, - 13,13,12,13,13,13,13,11,12,12,12,12,12,12,12,13, - 13,12,12,12,13,12,12,13,13,13,13,12,13,12,13,13, - 12,12,12,12,12,12,13,13,13,13,12,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,12,12,12,13,12,12,13, - 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13, 8,10,10,11,11, 9,10,10,11,11, 9,10,10,11, - 11,10,11,11,12,12,10,11,11,12,12,10,10,10,11,11, - 10,11,11,11,12,10,11,11,12,12,11,11,12,12,12,11, - 11,12,12,12, 9,10,10,11,11,10,11,11,12,12,10,11, - 10,12,11,11,12,11,12,12,11,12,11,12,12,11,11,11, - 12,12,11,11,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,11,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12, 9, - 10,10,11,11,10,11,11,12,12,10,11,11,12,12,11,11, - 12,12,12,11,12,12,12,12,10,11,11,12,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,10,11,11,12,12,11,11,12,12,12,11,11,11,12,12, - 12,12,12,12,12,11,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,12,13,12,12, - 12,13,12,11,12,12,12,12,12,12,12,12,12,11,12,12, - 12,12,12,12,12,13,12,12,12,12,13,12, 9,10,10,11, - 11,10,11,11,12,12,10,11,11,12,12,11,11,11,12,12, - 11,12,11,12,12,10,11,11,12,12,11,11,12,12,12,11, - 11,11,12,12,11,12,12,12,12,11,12,12,12,12,10,11, - 10,12,11,11,11,11,12,12,11,12,11,12,12,11,12,12, - 12,12,11,12,11,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,12,12,12,13, - 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12, - 12,12,13,12,12,12,12,13,12,10,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,13,13,12,12,12, - 13,13,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 13,12,12,13,13,13,12,13,13,13,13,11,12,12,12,12, - 12,12,12,12,13,12,12,12,12,12,12,13,13,13,13,12, - 13,12,13,13,12,12,12,12,13,12,13,13,13,13,12,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12, - 12,12,12,13,13,13,13,12,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,11,11,11,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,12,13,13,12,12,12,13,12,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,12,12, - 13,13,13,12,13,13,13,13,11,12,11,12,12,12,12,12, - 13,12,12,12,12,13,12,12,13,12,13,13,12,13,12,13, - 12,12,12,12,12,13,12,12,13,13,13,12,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,12,12,12,12,12,12, - 13,13,13,13,12,13,12,13,12,13,13,13,13,13,13,13, - 13,13,13,10,11,11,12,12,10,11,11,12,12,10,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,11,11,11,12, - 12,11,11,12,12,12,11,12,12,12,12,12,12,12,13,13, - 12,12,12,13,13,11,11,11,12,12,11,12,12,12,12,11, - 12,11,13,12,12,12,12,13,13,12,12,12,13,13,11,12, - 12,12,12,12,12,12,12,13,12,12,12,13,13,12,12,13, - 13,13,12,13,12,13,13,11,12,12,12,12,12,12,12,13, - 12,12,12,12,13,12,12,13,13,13,13,12,13,13,13,13, - 10,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,13,11,11,12,12,12,11,12, - 12,12,13,12,12,12,13,13,12,12,13,13,13,12,12,13, - 13,13,11,12,12,12,12,12,12,12,13,13,12,12,12,13, - 13,12,13,13,13,13,12,13,12,13,13,12,12,12,12,13, - 12,12,13,12,13,12,12,13,13,13,12,12,13,13,13,12, - 13,13,13,13,12,12,12,12,13,12,12,13,13,13,12,12, - 12,13,13,13,13,13,13,13,12,13,13,13,13,10,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,13, - 13,12,12,12,13,13,11,12,12,12,12,11,12,12,12,13, - 12,12,12,13,13,12,12,13,13,13,12,13,13,13,13,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,12,12,13, - 12,13,13,12,13,12,13,13,12,12,12,12,12,12,12,12, - 13,13,12,13,12,13,13,12,13,13,13,13,13,13,13,13, - 13,12,12,12,13,12,12,13,13,13,13,12,13,12,13,13, - 13,13,13,13,13,13,13,13,13,13,11,11,11,12,12,11, - 12,12,12,12,11,12,12,12,12,12,12,12,13,13,12,12, - 12,13,13,11,12,12,12,12,12,12,12,12,13,12,12,12, - 13,13,12,12,13,13,13,12,12,13,13,13,11,12,12,12, - 12,12,12,12,13,13,12,12,12,13,13,12,13,13,13,13, - 12,13,12,13,13,12,12,12,12,12,12,12,13,12,13,12, - 13,13,13,13,12,13,13,12,13,13,13,13,13,13,12,12, - 12,12,12,12,13,13,13,13,12,13,12,13,13,13,13,13, - 13,13,13,13,13,13,13,10,11,11,12,12,11,12,12,12, - 13,11,12,12,13,12,12,12,12,13,13,12,12,12,13,13, - 11,12,12,12,12,12,12,12,13,13,12,13,12,13,13,12, - 12,13,13,13,12,13,13,13,13,11,12,12,12,13,12,12, - 12,13,13,12,12,12,13,12,12,13,13,13,13,12,13,12, - 13,13,12,12,12,12,12,12,12,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,12,12,12,13,12, - 12,13,13,13,13,12,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,10,11,11,12,12,10,11,11,12,12,10,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, - 12,12,11,11,12,12,13,11,12,12,12,12,12,12,12,13, - 13,12,12,12,13,13,10,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,12,12,12,13,13,12,12,12,13,12,11, - 12,12,12,12,12,12,12,12,13,12,12,12,13,13,12,12, - 13,13,13,12,13,13,13,13,11,12,12,12,12,12,12,12, - 13,13,12,12,12,13,12,12,13,13,13,13,12,13,12,13, - 13,10,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,13,13,12,12,12,13,13,11,12,12,12,12,12, - 12,12,12,13,12,12,12,13,13,12,12,13,13,13,12,12, - 13,13,13,11,12,12,12,12,12,12,12,13,13,11,12,12, - 13,12,12,13,13,13,13,12,13,12,13,13,12,12,12,12, - 13,12,12,13,13,13,12,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,12,12,12,13,12,12,12,13,13,13,12, - 12,12,13,13,13,13,13,13,13,12,13,13,13,13,10,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, - 13,13,12,12,12,13,13,11,12,12,12,12,12,12,12,12, - 13,12,12,12,13,13,12,12,13,13,13,12,12,13,13,13, - 11,12,11,12,12,12,12,12,13,13,11,12,12,13,12,12, - 13,12,13,13,12,13,12,13,13,12,12,12,12,12,12,12, - 13,13,13,12,13,12,13,13,12,13,13,13,13,13,13,13, - 13,13,12,12,12,13,12,12,13,12,13,13,12,13,12,13, - 13,13,13,13,13,13,12,13,12,13,13,10,11,11,12,12, - 11,12,12,12,12,11,12,12,13,12,12,12,12,13,13,12, - 12,12,13,13,11,12,12,12,12,12,12,12,12,13,12,12, - 12,13,13,12,12,13,13,13,12,13,13,13,13,11,12,12, - 12,12,12,12,12,13,13,12,12,12,13,12,12,13,13,13, - 13,12,13,12,13,13,12,12,12,12,13,12,12,13,13,13, - 12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12, - 12,12,12,12,12,13,13,13,13,12,13,12,13,13,13,13, - 13,13,13,13,13,13,13,13,11,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,13,13,12,12,12,13, - 13,11,12,12,12,12,12,12,12,13,13,12,12,12,13,13, - 12,12,13,13,13,12,13,13,13,13,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,12,12,13,12,13,13,12,13, - 12,13,13,12,12,12,12,12,12,13,13,13,13,12,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,12,12,12,12, - 12,12,13,13,13,13,12,13,12,13,12,13,13,13,13,13, - 13,13,13,13,12, -}; - -static const static_codebook _44p7_p4_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p7_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p7_p4_1, - 0 -}; - -static const long _vq_quantlist__44p7_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p7_p5_0[] = { - 2, 6, 6, 9, 9, 5, 7, 8,10,11, 5, 8, 7,11,10, 8, - 10,11,12,13, 8,11,10,13,12, 6, 7, 8,10,11, 7, 8, - 10,10,12, 8, 9, 9,12,11,10,10,12,11,14,10,11,12, - 14,13, 6, 8, 7,11,10, 8, 9, 9,11,12, 7,10, 8,12, - 10,10,12,12,13,14,10,12,10,14,11, 9,10,11,11,12, - 10,10,11,11,13,11,12,12,13,13,12,11,13,11,15,13, - 14,13,14,14, 9,11,10,12,11,11,12,12,13,13,10,11, - 10,13,11,13,13,14,14,14,12,13,11,14,11, 7, 8, 9, - 11,12, 9, 9,11,12,13, 9,10,10,13,12,11,12,13,13, - 15,11,12,12,14,14, 9,10,10,12,13,10,10,12,12,14, - 11,11,11,13,13,12,12,13,13,15,12,13,13,15,14, 9, - 10,10,12,13,10,11,11,13,14,10,12,11,14,13,12,13, - 13,14,15,12,13,13,15,14,12,12,13,13,14,12,13,13, - 13,15,13,14,14,14,15,14,14,15,14,16,14,15,15,16, - 16,12,13,13,14,14,13,13,14,15,14,12,13,13,15,14, - 14,15,15,15,16,14,15,14,16,14, 7, 9, 8,12,11, 9, - 10,10,12,13, 9,11, 9,13,12,11,12,12,14,14,11,13, - 12,15,13, 9,10,10,13,12,10,11,12,13,14,10,12,11, - 14,13,12,13,13,14,15,13,13,13,15,14, 9,10,10,13, - 12,11,11,11,13,13,10,12,10,14,12,13,13,13,14,15, - 12,13,12,15,13,12,13,13,14,14,12,13,13,14,15,13, - 14,13,15,15,14,14,15,14,16,14,15,15,16,15,12,13, - 12,14,13,13,13,13,15,14,12,13,13,15,13,14,15,15, - 16,15,14,15,14,16,14,11,12,12,13,14,12,13,14,14, - 15,12,13,13,14,15,14,14,15,15,16,14,15,15,16,16, - 12,13,13,14,15,13,13,14,14,16,13,14,14,15,15,15, - 15,16,15,17,15,15,15,16,16,12,13,13,14,15,13,14, - 14,15,16,13,14,14,15,15,15,15,16,16,17,15,15,15, - 17,16,14,15,15,16,16,15,15,16,15,16,15,16,16,16, - 17,16,16,17,16,18,16,16,17,18,17,14,15,15,16,16, - 15,16,16,16,17,15,16,15,17,16,16,17,17,17,18,16, - 16,16,17,16,11,12,12,14,13,12,13,13,15,14,12,14, - 13,15,14,14,15,15,16,16,14,15,14,16,15,12,13,13, - 15,14,13,14,14,15,15,13,14,14,16,15,15,15,15,16, - 16,15,16,15,17,16,12,13,13,15,14,13,14,14,15,15, - 13,14,13,16,14,15,15,15,16,16,15,15,15,17,15,14, - 15,15,16,16,15,15,15,16,16,15,16,16,17,17,16,16, - 17,17,17,16,17,17,18,17,14,15,15,16,15,15,15,16, - 16,16,15,15,15,17,15,17,17,17,18,17,16,17,16,18, - 16, 6, 9, 9,12,12, 8,10,10,12,13, 9,11,10,13,12, - 10,12,12,14,14,11,13,12,14,14, 8,10,10,12,12, 9, - 10,11,12,14,10,11,11,13,13,12,12,13,13,15,12,13, - 13,15,14, 9,10,10,13,13,10,11,11,13,13,10,12,10, - 14,13,12,13,13,14,15,12,13,13,15,14,11,12,12,13, - 14,12,12,13,13,15,12,13,13,14,14,13,13,14,13,16, - 14,15,15,16,15,11,12,12,14,14,13,13,13,15,14,12, - 13,13,15,14,14,15,15,16,15,14,14,14,16,14, 7, 9, - 10,12,12, 9,10,11,13,13, 9,11,10,13,13,11,12,13, - 14,15,12,13,13,15,14, 9,10,11,12,13,10,10,12,13, - 14,11,11,12,14,14,12,12,14,14,15,13,13,13,15,15, - 9,11,11,13,13,11,12,12,14,14,10,12,10,14,13,13, - 14,13,15,15,12,14,13,15,14,12,12,13,13,15,12,12, - 14,13,15,13,14,14,15,15,14,14,15,14,17,14,15,15, - 16,16,12,13,13,15,14,13,14,14,15,15,12,14,13,15, - 14,14,15,15,16,16,14,15,14,16,14, 7,10,10,12,12, - 10,11,11,12,13,10,12,10,14,12,12,13,13,14,15,12, - 13,13,15,14, 9,11,10,13,12,10,10,12,12,14,11,13, - 12,14,13,13,13,14,13,15,13,14,14,15,14,10,11,11, - 13,13,12,12,12,13,14,10,12,10,14,12,13,14,14,15, - 15,13,14,13,15,13,12,13,13,14,14,12,12,13,14,15, - 13,14,14,15,15,13,13,14,13,15,14,15,15,16,16,12, - 13,13,14,14,13,14,14,15,15,12,13,13,15,13,15,15, - 15,16,16,13,14,13,16,13,11,12,13,14,14,12,13,14, - 14,15,12,13,13,15,15,14,14,15,15,17,14,15,15,16, - 16,12,13,14,14,15,13,13,14,14,16,13,14,14,15,16, - 14,14,16,15,17,15,15,16,16,16,12,13,13,15,15,13, - 14,14,15,16,13,14,14,15,16,15,15,16,17,17,15,16, - 15,17,16,14,15,15,15,16,15,15,16,15,17,15,15,16, - 16,17,16,16,16,16,18,16,16,17,17,17,14,15,15,16, - 16,15,16,16,16,17,15,16,15,17,16,16,17,17,17,17, - 16,17,16,18,17,11,12,12,14,14,13,13,14,14,15,13, - 14,13,15,14,14,15,15,15,16,14,15,15,17,15,12,13, - 13,15,14,13,13,14,15,15,14,15,14,16,15,15,15,15, - 15,16,15,16,15,17,16,12,13,13,15,15,14,14,14,15, - 16,13,14,13,16,15,15,15,16,16,17,15,16,15,17,15, - 14,15,15,16,16,14,15,15,16,16,15,16,16,17,16,15, - 15,16,15,17,16,17,17,18,17,14,15,15,16,16,15,16, - 16,16,17,14,15,15,17,16,17,17,17,17,18,15,16,16, - 18,15, 6, 9, 9,12,12, 9,10,11,12,13, 8,10,10,13, - 12,11,12,13,14,14,10,12,12,14,13, 9,10,10,12,13, - 10,10,12,13,14,10,11,11,13,13,12,13,13,14,15,12, - 13,13,15,14, 8,10,10,12,12,10,11,11,13,13, 9,11, - 10,13,13,12,13,13,14,15,12,13,12,15,13,11,12,12, - 14,14,12,13,13,13,15,13,13,13,14,15,14,14,15,14, - 16,14,15,15,15,15,11,12,12,14,13,12,13,13,15,14, - 12,13,12,15,13,14,14,15,16,16,13,14,13,16,13, 7, - 10,10,12,12,10,10,12,12,14,10,11,11,13,12,12,13, - 13,13,15,12,13,13,15,14,10,11,11,13,13,10,10,12, - 12,14,12,12,12,14,13,13,13,14,13,15,13,14,14,15, - 14, 9,10,11,13,13,11,12,12,13,14,10,12,10,14,12, - 13,13,14,14,15,13,13,12,15,13,12,13,13,14,14,12, - 13,13,14,15,13,14,14,15,15,13,13,15,13,16,15,15, - 15,16,16,12,13,13,14,14,13,14,14,15,15,12,13,12, - 15,14,15,15,15,16,16,13,14,13,15,13, 7,10, 9,12, - 12, 9,10,11,13,13, 9,11,10,13,13,11,13,13,14,15, - 11,13,12,15,14, 9,11,11,13,13,10,10,12,13,14,11, - 12,12,14,14,12,13,14,14,15,13,13,13,15,15, 9,11, - 10,13,12,11,12,11,14,14,10,12,10,14,13,13,14,13, - 15,15,12,14,12,15,14,12,13,13,14,15,13,13,14,14, - 15,13,14,14,15,15,14,14,15,14,17,14,15,15,16,16, - 12,13,12,15,13,13,14,14,15,15,12,14,13,15,13,14, - 15,15,16,16,14,15,14,16,14,11,12,12,14,14,13,13, - 14,14,15,13,14,13,15,15,14,15,15,16,17,14,15,15, - 16,15,12,13,13,15,15,13,13,14,15,16,14,14,14,16, - 15,15,15,16,15,17,15,16,15,17,16,12,13,13,14,15, - 14,14,15,15,16,13,14,13,15,15,15,15,16,16,17,15, - 15,15,16,15,14,15,15,16,16,14,15,15,16,17,15,16, - 16,17,17,16,15,16,15,17,16,17,17,17,17,14,15,15, - 15,16,15,15,16,16,17,14,15,15,16,16,16,16,17,17, - 18,15,16,15,17,15,11,13,12,14,14,12,13,13,15,15, - 12,14,13,15,14,14,15,15,16,16,14,15,14,16,15,12, - 13,13,15,15,13,14,14,15,16,13,14,14,16,16,15,15, - 16,16,17,15,16,15,17,16,12,13,13,15,14,13,14,14, - 16,15,13,14,13,16,14,15,16,15,17,16,15,15,14,18, - 15,14,15,15,16,16,15,15,16,16,17,15,16,15,17,16, - 16,16,17,17,18,16,17,17,18,17,14,15,15,16,15,15, - 16,15,17,16,15,15,15,17,15,16,17,17,18,17,16,17, - 16,18,15,10,12,12,14,14,12,13,13,14,14,12,13,13, - 14,14,13,14,14,15,15,13,14,14,16,15,11,12,13,14, - 14,12,13,13,15,15,12,13,13,15,15,13,14,15,15,16, - 14,15,15,16,16,12,13,13,14,14,13,13,14,15,15,13, - 14,13,15,15,14,15,15,16,16,14,15,14,16,15,13,14, - 14,15,15,13,14,14,15,16,14,14,15,16,16,14,15,15, - 15,17,15,16,16,17,17,13,14,14,15,15,14,15,15,16, - 16,14,15,15,16,16,15,16,16,16,17,15,16,15,17,16, - 11,12,12,14,14,12,13,13,14,15,12,13,13,15,14,13, - 14,14,15,16,13,14,14,16,15,12,13,13,14,15,13,13, - 14,15,15,13,14,14,15,15,14,14,15,15,17,14,15,15, - 16,16,12,13,13,15,15,13,14,14,15,15,13,14,13,15, - 15,14,15,15,16,17,14,15,15,16,16,13,13,14,15,16, - 14,14,15,15,16,14,15,15,16,16,15,15,16,15,18,15, - 16,16,17,17,14,15,15,16,16,15,15,15,16,16,14,15, - 15,17,16,16,16,16,17,17,15,16,16,17,16,10,12,12, - 14,14,12,13,13,14,15,12,13,13,15,14,14,14,15,15, - 16,14,15,14,16,15,12,13,13,15,14,13,13,14,15,15, - 13,14,14,15,15,14,14,15,15,16,14,15,15,16,16,12, - 13,13,15,15,13,14,14,15,16,13,14,13,15,14,15,15, - 15,16,16,14,15,15,16,15,13,14,14,16,15,14,14,14, - 15,16,14,15,15,16,16,15,15,16,15,17,16,17,16,17, - 17,14,14,15,15,16,15,15,16,16,16,14,15,14,16,15, - 16,16,16,17,17,15,16,15,17,15,11,13,13,14,15,13, - 13,14,15,15,13,14,13,15,15,14,15,15,15,16,14,15, - 15,17,15,13,13,14,15,15,13,14,15,15,16,14,14,14, - 16,16,15,14,16,15,17,15,16,16,17,16,13,14,14,15, - 15,14,14,14,16,16,13,15,14,16,15,15,15,16,17,17, - 15,16,15,17,16,14,15,15,15,16,15,15,16,15,17,15, - 16,16,16,17,16,16,17,15,18,16,17,17,17,17,14,15, - 15,16,16,15,16,16,17,17,15,16,15,17,16,16,17,17, - 18,18,16,17,15,18,16,10,12,12,14,14,13,13,14,14, - 15,13,14,13,15,14,14,15,15,15,16,15,15,15,16,15, - 12,13,13,15,14,12,12,14,14,15,14,15,14,16,15,15, - 14,15,14,17,15,16,16,17,16,12,13,13,14,15,14,14, - 15,15,16,13,14,12,16,14,15,16,16,16,17,15,16,14, - 17,15,14,15,14,16,15,14,14,15,15,15,15,16,15,17, - 16,15,14,16,14,16,16,17,17,18,17,14,14,15,15,16, - 15,16,16,16,17,14,15,14,16,15,16,16,17,17,17,15, - 16,14,17,14,10,12,12,14,13,12,13,13,14,14,11,13, - 12,14,14,13,14,14,15,16,13,14,14,16,15,12,13,13, - 14,14,13,13,14,15,15,13,14,13,15,15,14,14,15,15, - 16,14,15,15,16,16,11,13,12,14,14,12,13,13,15,15, - 12,13,13,15,15,14,15,15,16,16,13,14,14,16,15,13, - 14,14,15,15,14,15,15,15,16,14,15,15,16,16,15,16, - 16,16,17,16,16,16,17,17,13,14,14,15,15,14,15,15, - 16,16,13,14,14,16,15,15,16,16,17,17,15,15,15,17, - 15,11,12,12,14,14,12,13,13,14,15,12,13,13,15,14, - 14,14,15,15,16,14,14,14,16,15,12,13,13,15,14,13, - 13,14,15,15,13,14,14,16,15,14,15,15,15,16,15,15, - 15,16,16,12,13,13,14,15,13,13,14,15,15,13,14,13, - 15,15,15,15,15,16,16,14,15,14,16,15,14,14,15,16, - 16,14,15,15,15,16,15,16,15,16,16,15,15,16,15,17, - 16,16,16,17,17,13,14,14,15,16,14,15,15,16,16,14, - 14,14,16,16,16,16,16,17,17,15,15,15,17,15,11,12, - 12,14,14,12,13,13,14,15,12,13,13,15,14,14,14,14, - 15,16,13,14,14,16,15,12,13,13,15,15,13,13,14,15, - 16,13,14,14,15,15,14,15,15,16,17,14,15,15,17,16, - 12,13,13,15,14,13,14,14,15,15,13,14,13,15,15,14, - 15,15,16,16,14,15,14,17,15,14,15,15,16,16,14,15, - 15,16,17,15,15,15,17,17,15,16,16,16,17,16,17,16, - 17,17,13,15,14,16,15,14,15,15,16,16,14,15,14,16, - 15,16,16,16,17,17,15,16,15,17,15,10,12,12,14,14, - 13,13,14,14,15,13,14,13,15,14,14,15,15,15,17,14, - 15,15,16,15,12,13,13,15,14,12,12,14,14,15,14,15, - 14,16,15,15,14,16,15,17,15,16,16,17,16,12,13,13, - 14,15,14,14,15,15,16,12,14,12,15,14,15,16,16,16, - 17,15,16,14,17,14,14,15,14,16,16,14,14,15,15,16, - 15,16,16,17,16,15,14,16,14,17,16,17,17,18,17,14, - 14,15,15,16,15,15,16,16,17,14,15,14,16,15,16,17, - 17,17,18,15,16,14,17,14,11,13,13,15,14,13,13,14, - 15,15,12,14,13,15,15,14,15,15,15,17,14,15,14,16, - 15,13,14,14,15,15,13,14,15,15,16,14,15,14,16,16, - 15,15,16,16,17,15,16,16,17,17,13,14,13,15,15,14, - 14,14,16,16,13,15,14,16,15,15,16,16,17,17,15,16, - 14,17,15,15,15,15,16,17,15,15,16,16,17,15,16,16, - 17,17,16,15,17,16,17,17,17,17,18,18,14,15,15,17, - 15,15,16,16,17,16,15,16,15,17,15,16,17,17,17,17, - 16,17,15,18,15, -}; - -static const static_codebook _44p7_p5_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p7_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p7_p5_0, - 0 -}; - -static const long _vq_quantlist__44p7_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44p7_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p7_p5_1 = { - 1, 7, - (long *)_vq_lengthlist__44p7_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p7_p5_1, - 0 -}; - -static const long _vq_quantlist__44p7_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p7_p6_0[] = { - 2, 5, 6, 5, 7, 8, 5, 8, 7, 5, 7, 7, 7, 7, 9, 8, - 9, 9, 5, 7, 7, 8, 9, 9, 7, 9, 7, 6, 8, 8, 8, 9, - 10, 8, 9, 9, 8, 9,10, 9, 9,11,10,10,11, 8,10, 9, - 10,10,11, 9,10,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 8, - 9,10, 9,10,10,10,11,10, 8,10, 9,10,11,10, 9,11, - 9, 6, 8, 8, 7, 9, 9, 8, 9, 9, 7, 9, 9, 9, 9,10, - 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, 9, - 10,10, 9,10,10, 9, 9,10,10, 9,11,10,11,11, 9,10, - 10,10,11,11,10,11,10, 6, 9, 8, 9,10,10, 9,10, 9, - 8,10,10, 9, 9,10,10,11,11, 9,10,10,10,11,11, 9, - 11, 9, 6, 8, 8, 8, 9, 9, 7, 9, 9, 8, 9, 9, 9, 9, - 10, 9,10,10, 7, 9, 9, 9,10,10, 9,10, 9, 6, 8, 9, - 9, 9,10, 9,10,10, 9,10,10, 9, 9,11,10,11,11, 8, - 10,10,10,11,11, 9,10, 9, 7, 9, 9, 9,10,10, 9,10, - 10, 9,10,10,10,10,11,10,11,11, 9,10, 9,10,11,11, - 10,11, 9, -}; - -static const static_codebook _44p7_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44p7_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p7_p6_0, - 0 -}; - -static const long _vq_quantlist__44p7_p6_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p7_p6_1[] = { - 4, 7, 7, 6, 7, 8, 6, 8, 7, 7, 7, 8, 7, 7, 8, 8, - 8, 8, 7, 7, 7, 8, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, - 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, - 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, 8, - 8, 9, 8, 9, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, - 8, 9, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, - 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, - 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 9, 9, 9, - 8, 9, 8, -}; - -static const static_codebook _44p7_p6_1 = { - 5, 243, - (long *)_vq_lengthlist__44p7_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p7_p6_1, - 0 -}; - -static const long _vq_quantlist__44p7_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p7_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p7_p7_0 = { - 5, 243, - (long *)_vq_lengthlist__44p7_p7_0, - 1, -513979392, 1633504256, 2, 0, - (long *)_vq_quantlist__44p7_p7_0, - 0 -}; - -static const long _vq_quantlist__44p7_p7_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p7_p7_1[] = { - 1, 5, 5, 4,10,10, 5,10,10, 5,10,10,10,10,10,10, - 10,10, 5,10,10,10,10,10, 9,10,10, 6,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10, 7,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,11,11, -}; - -static const static_codebook _44p7_p7_1 = { - 5, 243, - (long *)_vq_lengthlist__44p7_p7_1, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44p7_p7_1, - 0 -}; - -static const long _vq_quantlist__44p7_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p7_p7_2[] = { - 1, 3, 2, 4, 5, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p7_p7_2 = { - 1, 25, - (long *)_vq_lengthlist__44p7_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p7_p7_2, - 0 -}; - -static const long _vq_quantlist__44p7_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p7_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p7_p7_3 = { - 1, 25, - (long *)_vq_lengthlist__44p7_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p7_p7_3, - 0 -}; - -static const long _huff_lengthlist__44p7_short[] = { - 3, 9,14,16,17,19,22,22, 5, 4, 6, 9,11,13,17,20, - 9, 5, 5, 6, 9,11,15,19,11, 7, 5, 5, 7, 9,13,17, - 14, 9, 7, 6, 6, 7,11,14,16,11, 9, 7, 6, 4, 4, 8, - 19,15,13,11, 9, 4, 3, 4,21,16,16,15,12, 6, 4, 4, -}; - -static const static_codebook _huff_book__44p7_short = { - 2, 64, - (long *)_huff_lengthlist__44p7_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p8_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44p8_l0_0[] = { - 2, 4, 4, 7, 7, 8, 8,10,10,11,11,12,12, 4, 5, 5, - 7, 7, 9, 9,10, 9,12,10,12,12, 4, 5, 5, 7, 7, 9, - 9, 9,10,10,12,12,12, 7, 7, 7, 7, 8, 9, 8,11, 5, - 12, 6,12,10, 7, 7, 7, 8, 7, 8, 9, 5,11, 6,12,10, - 12, 8, 9, 9, 9, 9, 9, 9,11, 7,11, 7,11, 9, 8, 9, - 9, 9, 9, 9, 9, 7,10, 7,11, 9,11,10,10,10,10,10, - 10,10,11,10,11, 8,12, 9,10,10,10,10,10,10,10,10, - 11, 8,11, 9,12,10,11,11,11,11,11,11,11,11,12,10, - 12,11,10,11,11,11,11,11,11,11,11,10,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,11,12,12,12, - 12,12,12,12,12,12,11,12,12, -}; - -static const static_codebook _44p8_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44p8_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p8_l0_0, - 0 -}; - -static const long _vq_quantlist__44p8_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p8_l0_1[] = { - 4, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p8_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44p8_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p8_l0_1, - 0 -}; - -static const long _vq_quantlist__44p8_l1_0[] = { - 54, - 29, - 79, - 0, - 108, -}; - -static const long _vq_lengthlist__44p8_l1_0[] = { - 1, 2, 3, 6, 7, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44p8_l1_0 = { - 2, 25, - (long *)_vq_lengthlist__44p8_l1_0, - 1, -514516992, 1620639744, 7, 0, - (long *)_vq_quantlist__44p8_l1_0, - 0 -}; - -static const long _huff_lengthlist__44p8_lfe[] = { - 2, 3, 1, 3, -}; - -static const static_codebook _huff_book__44p8_lfe = { - 2, 4, - (long *)_huff_lengthlist__44p8_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44p8_long[] = { - 2, 7,14,16,17,18,20,21, 7, 4, 6, 8,11,12,14,16, - 13, 5, 4, 4, 8, 9,11,13,15, 8, 4, 3, 5, 7, 9,10, - 17,11, 8, 4, 4, 6, 9, 9,17,11, 9, 7, 6, 5, 7, 8, - 19,13,11, 9, 9, 7, 8, 8,21,15,13,11,10, 8, 8, 7, -}; - -static const static_codebook _huff_book__44p8_long = { - 2, 64, - (long *)_huff_lengthlist__44p8_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p8_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p8_p1_0[] = { - 2, 5, 5, 4, 7, 7, 4, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 6, 7, 8, 8, 9, - 10, 8, 9,10, 8, 9,10,10,10,12,10,11,12, 8,10,10, - 10,11,12,10,11,11, 6, 8, 7, 8,10, 9, 8,10, 9, 8, - 10,10,10,11,11,10,12,11, 8,10, 9,10,12,11,10,12, - 10, 5, 8, 8, 8,10,10, 8,10,10, 7, 9,10, 9,10,11, - 9,11,11, 8,10,10,10,12,12,10,12,11, 7, 9, 9, 9, - 10,11, 9,11,11, 9, 9,11,10,11,12,10,11,12, 9,11, - 11,11,12,12,11,12,12, 7, 9, 9,10,11,11,10,12,11, - 9,11,10,11,11,12,11,13,12,10,11,11,12,13,13,11, - 13,11, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, - 12,10,12,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, - 10,11,12,10,11,11,10,11,11,11,11,13,12,13,13, 9, - 10,11,12,12,13,11,12,11, 7, 9, 9, 9,11,11, 9,11, - 10, 9,11,11,11,12,12,11,12,12, 9,11, 9,10,12,11, - 10,12,11, -}; - -static const static_codebook _44p8_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44p8_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p8_p1_0, - 0 -}; - -static const long _vq_quantlist__44p8_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p8_p2_0[] = { - 4, 6, 6, 9, 9, 6, 8, 8,10,10, 6, 8, 8,10,10, 8, - 9,10,12,12, 8,10, 9,12,12, 6, 8, 8,10,10, 8, 8, - 9,10,11, 8, 9, 9,11,11, 9,10,11,12,13,10,11,11, - 13,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 8, 9, 8,11, - 10,10,11,11,13,13, 9,11,10,13,12, 9,10,10,12,12, - 10,10,11,12,13,10,11,11,13,13,12,12,13,12,15,12, - 13,13,15,14, 9,10,10,12,12,10,11,11,13,13,10,11, - 10,13,12,12,13,13,14,15,12,13,12,15,12, 7, 8, 8, - 10,11, 8, 9,10,11,12, 8, 9, 9,11,11,10,11,11,13, - 14,10,11,11,13,13, 8, 9, 9,11,12, 9,10,11,11,13, - 9,10,10,12,12,11,11,12,13,15,11,12,12,14,14, 8, - 9, 9,11,11, 9,10,11,12,13, 9,10,10,12,12,11,12, - 12,14,15,11,12,12,14,14,10,11,12,13,13,11,12,12, - 13,14,12,12,12,14,14,13,13,14,14,16,14,14,14,16, - 15,10,11,11,13,13,12,12,12,14,14,11,12,12,14,13, - 14,14,14,15,16,13,14,13,16,14, 7, 8, 8,11,10, 8, - 9, 9,11,11, 8,10, 9,12,11,10,11,11,13,13,10,11, - 11,14,13, 8, 9, 9,12,11, 9,10,10,12,12, 9,11,10, - 13,12,11,12,12,13,14,11,12,12,15,14, 8, 9, 9,12, - 11, 9,10,10,12,12, 9,11,10,13,11,11,12,12,14,14, - 11,12,12,14,13,10,11,11,13,13,11,12,12,13,14,12, - 13,12,14,14,13,13,14,14,16,13,14,14,16,15,10,11, - 11,13,13,12,12,12,14,14,11,12,12,14,13,13,14,14, - 15,15,13,14,13,16,14, 9,10,11,12,13,11,11,12,12, - 14,11,11,12,13,14,13,13,14,14,16,13,13,14,15,15, - 11,11,12,12,14,12,12,13,13,15,12,12,13,13,15,14, - 14,15,15,16,14,14,14,15,16,11,12,12,13,14,12,12, - 13,14,15,12,13,12,14,14,14,14,15,15,16,14,14,14, - 16,16,13,13,14,15,16,14,14,15,15,16,14,15,15,16, - 16,15,15,16,16,18,16,16,16,17,17,13,14,14,15,15, - 14,14,15,16,16,14,15,14,16,16,16,16,16,17,18,15, - 16,16,17,16, 9,11,10,13,12,11,12,11,14,13,11,12, - 11,14,12,13,14,13,15,14,13,14,13,16,14,11,12,12, - 14,13,12,12,13,14,14,12,13,12,15,14,14,14,14,16, - 16,14,15,14,17,15,11,12,11,14,12,12,13,12,15,13, - 12,13,12,15,13,14,14,14,16,15,14,15,14,16,15,13, - 14,14,15,15,14,14,15,16,16,14,15,14,16,16,15,15, - 16,16,17,16,16,16,17,17,13,14,14,16,15,14,15,15, - 16,16,14,15,14,17,15,16,16,16,17,17,15,16,15,18, - 16, 7, 8, 8,10,11, 8, 9, 9,11,12, 8, 9, 9,12,11, - 10,11,11,13,14,10,11,11,14,13, 8, 9, 9,11,11, 9, - 10,10,12,12, 9,10,10,12,12,11,12,12,13,14,11,12, - 12,14,14, 8, 9, 9,12,11, 9,10,11,12,13, 9,11,10, - 13,12,11,12,12,14,14,11,12,12,14,13,10,11,11,13, - 13,11,12,12,13,14,11,12,12,14,14,13,13,14,14,16, - 13,14,14,16,15,10,12,11,13,13,12,12,12,14,14,11, - 12,12,14,13,14,14,14,15,16,13,14,14,16,14, 8, 9, - 9,11,11, 9,10,10,12,12, 9,10,10,12,12,11,11,12, - 13,14,11,12,12,14,14, 9, 9,10,11,12,10,10,11,12, - 13,10,10,11,12,13,12,12,13,14,15,12,12,13,14,15, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, - 13,13,15,15,12,13,13,15,14,11,11,12,13,14,12,12, - 13,13,15,12,12,13,14,15,14,14,15,14,16,14,14,15, - 15,16,11,12,12,14,14,12,13,13,15,15,12,13,13,15, - 14,14,15,15,16,16,14,15,14,17,15, 8, 9, 9,11,11, - 9,10,10,12,12, 9,11,10,13,12,11,12,12,14,14,11, - 13,12,15,13, 9,10,10,12,12,10,10,11,12,13,10,12, - 11,13,13,12,12,13,13,15,12,13,13,15,14, 9,10,10, - 12,12,11,11,12,13,13,10,12,10,13,12,12,13,13,15, - 15,12,13,13,15,13,11,12,12,14,14,12,12,13,14,14, - 12,13,13,15,14,13,13,14,13,16,14,15,14,16,16,11, - 12,12,14,14,13,13,13,15,15,12,13,12,15,14,14,15, - 15,16,17,14,15,13,16,13,10,11,11,13,14,11,12,12, - 13,15,11,12,12,14,14,13,14,14,15,16,13,14,14,16, - 16,11,11,12,12,14,12,12,13,13,15,12,13,13,13,15, - 14,14,15,14,17,14,14,15,15,16,11,12,12,14,14,12, - 13,13,15,15,12,13,13,15,15,14,15,15,16,17,14,15, - 15,16,16,13,14,14,14,16,14,14,15,14,17,14,15,15, - 14,17,16,16,17,15,18,16,16,17,16,18,13,14,14,16, - 16,14,15,15,17,16,14,15,15,17,16,16,17,17,18,18, - 16,17,16,18,17,10,11,11,14,13,11,12,12,14,14,11, - 13,12,15,14,14,14,14,16,15,14,15,14,16,15,11,12, - 12,14,13,12,13,13,15,14,13,14,13,15,14,14,15,15, - 16,16,14,15,15,17,15,11,12,12,14,14,13,13,13,15, - 15,12,13,13,15,14,15,15,15,17,17,14,15,15,17,15, - 13,14,14,16,15,14,15,15,16,16,15,15,15,17,16,16, - 16,16,16,17,16,17,16,18,17,14,14,14,16,16,15,15, - 15,16,16,14,15,14,17,16,16,17,17,17,18,16,17,16, - 18,16, 7, 8, 8,11,11, 8, 9, 9,11,12, 8, 9, 9,12, - 11,10,11,11,13,14,10,11,11,14,13, 8, 9, 9,11,12, - 9,10,11,12,13, 9,11,10,13,12,11,12,12,13,14,11, - 12,12,14,14, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,13,12,11,12,12,14,14,11,12,11,14,13,10,11,12, - 13,13,11,12,12,13,14,12,13,12,14,14,13,13,14,14, - 16,13,14,14,16,15,10,11,11,13,13,11,12,12,14,14, - 11,12,12,14,13,13,14,14,15,16,13,14,13,16,14, 8, - 9, 9,11,11, 9,10,11,12,13, 9,10,10,12,12,11,12, - 13,13,14,11,12,12,14,14, 9,10,10,12,12,10,10,11, - 12,13,11,12,11,13,13,12,12,13,13,15,12,13,13,15, - 15, 9,10,10,12,12,10,11,12,13,14,10,11,10,13,12, - 12,13,13,14,15,12,13,12,15,13,12,12,12,14,14,12, - 12,13,14,15,13,13,13,15,15,14,14,15,13,16,14,15, - 15,16,16,11,12,12,14,14,12,13,13,14,15,12,13,12, - 14,14,14,14,15,16,16,13,14,13,16,14, 8, 9, 9,11, - 11, 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,14, - 11,12,11,14,14, 9,10,10,12,12,10,11,11,13,13,10, - 11,11,13,13,12,13,13,14,15,12,13,13,15,14, 9,10, - 9,12,11,10,11,10,13,12,10,11,10,13,12,12,13,12, - 15,14,12,13,12,15,14,11,12,12,14,14,12,13,13,14, - 15,12,13,13,15,15,14,14,15,15,17,14,15,15,16,16, - 11,12,11,14,13,12,13,12,15,14,12,13,12,15,13,14, - 15,14,16,15,13,15,14,17,14,10,11,11,13,14,11,12, - 13,13,15,11,12,12,14,14,14,14,15,15,17,13,14,14, - 15,16,11,12,12,14,14,12,12,13,14,15,13,13,13,15, - 15,14,15,15,15,17,15,15,15,16,16,11,12,12,13,14, - 13,13,14,14,15,12,13,13,14,15,14,15,15,16,17,14, - 15,15,16,16,14,14,14,16,16,14,14,15,15,17,15,15, - 15,17,16,16,16,17,16,18,16,17,17,18,17,13,14,14, - 15,16,14,15,15,16,17,14,15,15,16,16,16,17,17,17, - 18,16,16,16,17,16,10,11,11,14,13,11,12,12,14,14, - 11,12,12,15,13,13,14,14,16,15,13,14,14,16,15,11, - 12,12,14,14,12,13,13,15,15,12,13,13,15,15,14,15, - 15,16,17,14,15,15,17,16,11,12,11,14,12,12,13,13, - 15,13,12,13,12,15,13,14,15,15,16,15,14,15,14,17, - 14,13,14,14,16,16,14,15,15,16,17,14,15,15,16,17, - 16,16,17,17,18,16,17,17,18,18,13,14,14,16,13,14, - 15,15,17,14,14,15,14,17,14,16,17,16,17,16,16,17, - 16,18,15, 8,11,11,13,13,10,12,12,14,14,11,12,12, - 14,14,13,13,14,15,16,13,14,14,16,15,10,11,11,14, - 14,11,12,12,14,15,11,12,12,15,14,13,14,14,15,16, - 13,14,14,16,16,11,12,12,14,14,12,13,13,15,15,12, - 13,12,15,14,14,14,15,16,16,14,15,14,16,16,12,13, - 13,15,15,12,13,14,15,16,13,14,14,16,16,14,15,15, - 16,17,15,15,16,17,17,13,14,14,16,15,14,15,15,16, - 16,14,15,14,16,16,16,16,16,17,17,15,16,16,18,16, - 10,11,11,13,14,11,12,12,14,15,11,12,12,15,14,13, - 14,14,16,16,13,14,14,16,16,11,11,12,14,14,12,12, - 13,14,15,12,13,13,15,15,14,14,15,15,17,14,14,15, - 16,16,11,12,12,15,14,12,13,13,15,15,12,13,13,15, - 15,14,15,15,17,17,14,15,15,17,16,13,12,14,14,16, - 13,13,15,14,17,14,13,15,15,17,15,14,16,15,18,16, - 15,16,16,18,13,14,14,16,16,14,15,15,17,17,14,15, - 15,17,16,16,17,17,18,18,16,17,16,18,17,10,11,11, - 14,13,11,12,12,14,14,11,13,12,15,14,13,14,14,15, - 16,13,14,14,16,16,11,12,12,14,14,12,13,13,14,15, - 12,13,13,15,15,14,14,15,15,16,14,15,15,17,16,11, - 12,12,14,14,13,13,13,15,15,12,13,13,15,14,14,15, - 15,16,17,14,15,14,17,15,13,14,13,16,15,14,14,14, - 15,16,14,15,14,16,16,15,15,16,16,17,16,16,16,18, - 17,14,14,14,16,16,15,15,15,17,16,14,15,14,17,16, - 16,16,17,17,18,16,17,16,18,16,11,13,13,15,15,12, - 13,14,15,16,12,14,14,15,15,14,15,15,16,17,14,15, - 15,17,17,12,13,14,14,16,13,14,14,14,16,14,14,14, - 15,16,15,15,16,15,18,15,16,16,17,17,13,14,14,16, - 16,14,14,15,16,16,14,15,14,16,16,15,16,16,17,18, - 15,16,16,18,17,14,14,16,13,17,15,15,16,14,18,15, - 15,16,14,18,16,16,18,15,19,17,17,18,16,18,15,16, - 15,17,17,15,16,17,18,18,16,16,16,18,17,17,18,18, - 19,19,17,18,17,19,18,11,12,12,15,14,13,13,14,15, - 16,13,14,13,16,14,15,15,15,16,17,15,16,15,17,16, - 12,13,13,15,14,13,13,14,15,15,14,15,14,16,15,15, - 15,16,16,17,16,16,16,18,17,12,13,13,15,15,14,14, - 15,16,16,13,14,13,16,15,16,16,16,17,18,15,16,15, - 17,16,14,15,14,17,15,14,15,15,16,16,15,16,15,17, - 16,16,15,16,15,17,17,18,17,18,17,15,15,15,16,17, - 16,16,16,17,17,15,16,15,17,16,17,18,18,18,18,16, - 17,16,18,15, 8,11,11,13,13,11,12,12,14,14,10,12, - 12,14,14,13,14,14,15,16,13,14,13,16,15,11,12,12, - 14,14,12,12,13,14,15,12,13,13,15,15,14,14,15,15, - 16,14,14,14,16,16,10,11,11,14,14,11,12,12,14,15, - 11,12,12,15,14,13,14,14,16,16,13,14,14,16,15,13, - 14,14,15,16,14,14,15,16,16,14,15,15,16,16,15,16, - 16,16,18,16,16,16,17,17,12,13,13,15,15,13,14,14, - 16,16,12,14,13,16,15,15,16,15,17,17,14,16,15,17, - 16,10,11,11,13,14,11,12,13,14,15,11,13,12,14,14, - 14,14,15,16,16,13,14,14,16,16,11,12,12,14,14,12, - 13,13,14,15,13,14,13,15,15,14,15,15,16,17,14,15, - 15,17,16,11,12,12,14,14,12,13,13,15,15,12,13,12, - 15,14,14,15,15,16,17,14,15,15,16,16,14,14,14,16, - 16,14,14,15,16,16,15,15,15,16,16,16,16,17,16,18, - 16,17,17,18,18,13,13,14,15,16,14,14,15,16,17,13, - 14,14,16,16,16,16,17,17,18,15,16,15,17,16,10,11, - 11,14,13,11,12,12,14,14,11,12,12,15,14,13,14,14, - 16,16,13,14,14,16,16,11,12,12,14,14,12,13,13,15, - 15,12,13,13,15,15,14,15,15,16,17,14,15,15,17,16, - 11,12,11,14,14,12,13,13,15,15,12,13,12,15,14,14, - 15,14,16,16,14,15,14,17,16,14,14,14,16,16,14,15, - 15,16,17,14,15,15,17,17,16,16,17,17,18,16,17,17, - 18,18,13,14,12,16,14,14,15,13,17,15,13,15,13,17, - 14,16,16,15,18,16,15,17,14,18,15,11,12,12,14,15, - 13,13,14,14,16,13,14,13,15,14,15,15,16,16,17,15, - 16,15,17,16,12,13,13,15,15,13,13,14,15,16,14,15, - 14,16,16,15,15,16,15,18,16,16,16,18,17,12,13,13, - 15,15,14,14,15,15,16,13,14,13,15,15,16,16,16,16, - 18,15,16,15,17,16,15,15,15,17,16,15,15,16,16,17, - 16,16,16,18,17,16,16,17,15,18,17,18,17,19,18,14, - 14,15,15,17,15,15,16,16,17,14,15,15,16,16,17,17, - 18,17,19,16,17,15,17,15,11,13,12,15,15,12,14,14, - 15,15,12,14,13,16,15,15,15,15,17,17,14,15,15,17, - 16,12,14,14,16,16,14,14,15,16,16,14,14,14,16,16, - 15,16,17,17,18,15,16,16,18,17,12,14,13,16,14,13, - 14,14,16,15,13,15,14,16,14,15,16,16,17,17,15,16, - 15,18,15,15,15,16,17,17,15,16,16,17,18,16,16,16, - 18,18,17,17,18,18,19,17,17,18,19,19,14,15,14,17, - 13,15,16,15,18,14,15,16,15,18,14,17,18,17,18,16, - 16,18,16,19,15, -}; - -static const static_codebook _44p8_p2_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p8_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p8_p2_0, - 0 -}; - -static const long _vq_quantlist__44p8_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p8_p3_0[] = { - 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 7, 9, - 10, 8, 9, 9, 8, 9,10, 9,10,12,10,11,11, 8,10, 9, - 10,11,12, 9,11,10, 5, 8, 7, 8,10, 9, 7,10, 9, 8, - 9,10, 9,10,11,10,12,11, 8,10, 9,10,11,11, 9,12, - 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9,10, 9,10,11, - 9,11,11, 8,10, 9,10,11,11,10,12,10, 7, 9,10, 9, - 10,12, 9,11,11, 9, 9,12,11,10,13,11,11,13,10,12, - 11,11,13,13,11,13,12, 7, 9, 9, 9,11,11, 9,12,11, - 9,11,10,10,11,12,11,13,12, 9,11,11,12,13,13,11, - 13,11, 5, 8, 8, 8, 9,10, 7,10, 9, 8, 9,10,10,10, - 12,10,11,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, - 9,11,12, 9,11,11, 9,11,11,11,11,13,12,13,13, 9, - 10,11,11,12,13,10,12,11, 7,10, 9, 9,11,11, 9,12, - 10,10,11,12,11,12,13,12,13,13, 9,12, 9,11,13,11, - 10,13,10, -}; - -static const static_codebook _44p8_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44p8_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p8_p3_0, - 0 -}; - -static const long _vq_quantlist__44p8_p3_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p8_p3_1[] = { - 6, 7, 7, 7, 7, 8, 7, 8, 7, 7, 7, 8, 7, 8, 8, 8, - 8, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, - 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 9, 9, 8, - 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, - 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 8, - 8, 9, 8, -}; - -static const static_codebook _44p8_p3_1 = { - 5, 243, - (long *)_vq_lengthlist__44p8_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p8_p3_1, - 0 -}; - -static const long _vq_quantlist__44p8_p4_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p8_p4_0[] = { - 2, 5, 5, 4, 7, 8, 4, 8, 7, 5, 7, 8, 7, 7,10, 8, - 9, 9, 5, 7, 7, 8, 9, 9, 7,10, 7, 5, 7, 8, 8, 9, - 11, 8,10,10, 8, 9,10,10,10,12,11,12,12, 8,10,10, - 10,12,12,10,12,11, 5, 8, 7, 8,10,10, 8,11, 9, 8, - 10,10,10,11,12,10,12,12, 8,10, 9,11,12,12,10,12, - 10, 5, 8, 8, 7,10,10, 8,11,10, 7, 9,10, 9,10,12, - 10,12,12, 8,10,10,10,12,12,10,12,11, 7, 9,10, 9, - 11,12,10,12,11, 9, 9,12,10,10,13,12,12,13,10,12, - 11,12,13,13,11,13,11, 7,10, 9,10,11,12,10,13,11, - 9,11,11,11,11,13,12,14,13,10,11,11,12,14,14,11, - 14,11, 5, 8, 8, 8,10,11, 7,10,10, 8,10,10,10,11, - 12,10,12,12, 7,10, 9,10,12,12, 9,12,10, 7, 9,10, - 10,11,13,10,12,11,10,11,11,11,11,14,12,14,14, 9, - 11,11,12,13,14,11,13,11, 7,10, 9,10,11,12, 9,12, - 10,10,11,12,11,11,13,12,13,13, 9,12, 9,12,13,12, - 10,13,10, -}; - -static const static_codebook _44p8_p4_0 = { - 5, 243, - (long *)_vq_lengthlist__44p8_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p8_p4_0, - 0 -}; - -static const long _vq_quantlist__44p8_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p8_p4_1[] = { - 7, 9, 9,10,10, 9,10,10,10,11, 9,10,10,11,10, 9, - 10,10,11,11, 9,10,10,11,11, 9,10,10,11,11,10,10, - 10,11,11,10,10,10,11,11,10,11,11,11,11,10,11,11, - 11,11, 9,10,10,11,11,10,10,10,11,11, 9,10,10,11, - 11,10,11,11,11,11,10,11,11,11,11,10,11,11,11,11, - 10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,12,10,11,11,11,11,11,11,11,11,11,10,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11, 9,10,10, - 11,11,10,10,11,11,11,10,10,11,11,11,10,11,11,11, - 12,10,11,11,12,12,10,10,11,11,11,10,11,11,11,12, - 11,11,11,12,12,11,11,12,12,12,11,11,12,12,12,10, - 11,11,11,11,11,11,11,12,12,10,11,11,12,12,11,12, - 11,12,12,11,12,11,12,12,11,11,11,11,12,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12, 9,10,10,11,11,10, - 11,10,11,11,10,11,10,11,11,10,11,11,12,12,10,11, - 11,12,11,10,11,11,11,11,10,11,11,11,12,11,11,11, - 12,12,11,11,12,12,12,11,11,11,12,12,10,11,10,11, - 11,11,11,11,12,12,10,11,11,12,11,11,12,11,12,12, - 11,12,11,12,12,11,11,11,12,12,11,11,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, - 11,12,11,11,12,12,12,12,11,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,10,11,11,11,11,11,11,11,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 11,11,11,12,12,11,11,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,13,12,13,12,12,12,12,13,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,10,11,11,11,11,11,11,11,12,12,11,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,12,13,12,13, - 12, 9,10,10,11,11,10,10,11,11,11,10,11,10,11,11, - 10,11,11,12,12,10,11,11,12,12,10,10,11,11,11,10, - 11,11,11,12,10,11,11,12,12,11,11,12,12,12,11,11, - 11,12,12,10,11,10,11,11,11,11,11,12,12,10,11,11, - 12,11,11,12,11,12,12,11,12,11,12,12,11,11,11,11, - 12,11,11,12,12,12,11,12,12,12,12,11,12,12,12,12, - 11,12,12,12,12,11,11,11,12,11,11,12,12,12,12,11, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,10,10, - 11,11,11,10,11,11,12,12,10,11,11,12,12,11,11,11, - 12,12,11,11,12,12,12,10,11,11,11,12,11,11,12,12, - 12,11,11,12,12,12,11,11,12,12,12,11,12,12,12,12, - 11,11,11,12,12,11,12,12,12,12,11,12,11,12,12,11, - 12,12,12,12,11,12,12,12,12,11,11,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12, 9,10,10,11,11, - 10,11,11,11,12,10,11,11,12,11,11,12,11,12,12,11, - 12,11,12,12,10,11,11,12,11,11,11,11,12,12,11,12, - 11,12,12,11,12,12,12,12,11,12,12,12,12,10,11,11, - 12,12,11,12,11,12,12,11,12,11,12,12,12,12,12,12, - 12,11,12,12,12,12,11,12,11,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,11,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,12,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,13,13,12,12, - 12,13,13,12,12,12,12,12,12,12,12,12,13,12,12,12, - 12,13,12,12,13,12,13,12,13,13,13,13,12,12,12,12, - 12,12,12,12,13,12,12,12,12,13,12,12,13,13,13,13, - 12,13,13,13,13,10,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,11,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,13,12,12,12,12,13,13,12,12,12,13,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,12, - 13,13,12,13,12,13,13,13,13,12,12,12,12,12,12,12, - 12,13,12,12,12,12,13,12,12,13,13,13,13,12,13,13, - 13,13, 9,10,10,11,11,10,10,11,11,11,10,11,10,11, - 11,10,11,11,12,12,10,11,11,12,12,10,11,11,11,11, - 10,11,11,12,12,11,11,11,12,12,11,11,12,12,12,11, - 11,12,12,12,10,11,10,11,11,10,11,11,12,12,10,11, - 11,12,11,11,12,11,12,12,11,11,11,12,12,11,11,11, - 11,12,11,11,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,11,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12, 9, - 10,10,11,11,10,11,11,11,12,10,11,11,12,11,11,11, - 12,12,12,11,11,12,12,12,10,11,11,12,12,11,11,12, - 12,12,11,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,10,11,11,12,12,11,11,11,12,12,11,11,11,12,12, - 11,12,12,12,12,11,12,12,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,11,11,12,12,12,12,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,10,11,10,11, - 11,10,11,11,12,12,10,11,11,12,12,11,11,11,12,12, - 11,12,11,12,12,11,11,11,12,12,11,11,12,12,12,11, - 11,12,12,12,11,12,12,12,12,11,12,12,12,12,10,11, - 11,12,11,11,12,11,12,12,11,12,11,12,12,11,12,12, - 12,12,11,12,11,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,11, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,13,12,12,12,12, - 12,12,12,12,13,13,12,12,12,13,13,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,12, - 12,12,12,12,12,12,12,12,12,12,12,13,12,13,12,12, - 12,13,13,12,13,13,12,13,12,13,13,13,13,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13, - 13,12,13,12,13,12,11,11,11,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,13,13,12,12,12,13,13,11,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,12,12,12,13, - 12,12,12,12,12,12,12,12,12,13,13,12,12,12,12,13, - 12,13,13,13,13,12,13,13,13,13,12,12,12,12,12,12, - 12,12,13,12,12,12,12,13,12,12,13,13,13,13,12,13, - 13,13,12,10,11,11,12,12,11,11,11,12,12,11,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,11,11,11,12, - 12,11,11,12,12,12,11,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,13,12,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12,12,12,12,12,12, - 11,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,11,12,12,12,12,11,11,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,13,12,12,12, - 13,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,13,12,12,12,13,13,12,12,12,12,12, - 12,12,12,12,13,12,12,12,12,13,12,12,13,12,13,12, - 12,13,13,13,12,12,12,12,12,12,12,12,12,13,12,12, - 12,13,12,12,13,13,13,13,12,13,13,13,13,10,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,11,12,12,12, - 12,12,12,12,12,12,11,11,12,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12,12,12,13,13,11, - 12,11,12,12,12,12,12,12,12,11,12,12,12,12,12,12, - 12,13,13,12,12,12,13,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,13,12,12,12,12,12,13,12,13,12,13, - 13,12,12,12,12,12,12,12,12,13,12,12,12,12,13,12, - 12,13,12,13,13,12,13,12,13,12,11,11,11,12,12,11, - 12,12,12,12,11,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,12,13,12,12,13,13,13,11,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12,12,12,12,13,13, - 12,12,12,13,12,12,12,12,12,12,12,12,13,12,13,12, - 12,12,12,13,12,12,13,12,13,12,13,13,12,13,12,12, - 12,12,12,12,13,13,13,12,12,12,12,13,12,12,13,13, - 13,13,12,13,13,13,12,11,11,11,12,12,11,12,12,12, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,13,12,12,13,13,13,11,12,12,12,12,12,12, - 12,12,13,12,12,12,13,12,12,13,12,13,13,12,13,12, - 13,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,13,12,13,12,13,13,13,12,12,12,12,12,12, - 12,13,12,13,12,12,12,12,13,12,12,13,13,13,12,12, - 13,12,13,12,10,11,11,12,12,11,11,11,12,12,11,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,11,11,11, - 12,12,11,11,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,11,11,12,12,11,12,12,12,12, - 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,12,12,12,12,11,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,10,11,11,12,12,11,11,12,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,11,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,13,12,12, - 12,13,13,11,11,11,12,12,12,12,12,12,12,11,12,12, - 12,12,12,12,12,13,13,12,12,12,13,13,12,12,12,12, - 12,12,12,12,12,13,12,12,12,12,13,12,12,13,12,13, - 12,12,13,13,13,12,12,12,12,12,12,12,12,12,13,12, - 12,12,12,12,12,12,13,13,13,12,12,12,13,12,11,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,13,12,12,12,13,13, - 11,12,11,12,12,12,12,12,12,12,11,12,12,12,12,12, - 12,12,13,13,12,12,12,13,12,12,12,12,12,12,12,12, - 12,12,13,12,12,12,13,13,12,13,13,13,13,12,13,13, - 13,13,12,12,12,12,12,12,12,12,13,12,12,12,12,13, - 12,12,13,12,13,13,12,13,12,13,12,11,11,11,12,12, - 11,12,12,12,12,11,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,11,12,12,12,12,12,12,12,12,13,12,12, - 12,13,13,12,12,13,12,13,12,12,13,13,13,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,12,12,12,13,12,12,12,12,12,12,12,12,12,12,13, - 12,12,12,13,13,12,12,13,12,13,12,13,13,13,13,12, - 12,12,12,12,12,12,13,12,13,12,12,12,12,12,12,13, - 13,12,12,12,13,12,12,12,11,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,12,12,12,12,12,12,12,12,13,12,12,12,12,13, - 12,12,13,13,13,12,12,12,13,13,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,13,13,12,13, - 12,13,12,12,12,12,12,12,12,12,12,12,13,12,13,12, - 13,13,12,13,13,12,13,12,13,13,13,13,12,12,12,12, - 12,12,12,12,13,12,12,13,12,13,12,12,13,12,13,12, - 12,13,12,13,12, -}; - -static const static_codebook _44p8_p4_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p8_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p8_p4_1, - 0 -}; - -static const long _vq_quantlist__44p8_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p8_p5_0[] = { - 2, 6, 6, 9, 9, 5, 7, 8,10,11, 5, 8, 7,11,10, 8, - 10,11,12,13, 8,11,10,13,12, 6, 7, 8,10,11, 7, 8, - 10,10,12, 8, 9, 9,12,12,10,10,12,12,14,10,12,12, - 14,13, 6, 8, 7,11,10, 8, 9, 9,12,12, 7,10, 8,12, - 11,10,12,12,13,14,10,12,10,14,12, 9,10,11,11,13, - 10,10,11,11,13,11,12,12,13,14,12,12,13,11,15,13, - 14,14,15,14, 9,11,10,13,11,11,12,12,13,13,10,11, - 10,13,11,13,14,14,15,15,12,13,12,15,11, 6, 8, 9, - 11,12, 8, 9,11,12,13, 8,10,10,13,13,11,12,13,14, - 15,11,12,13,14,14, 9, 9,10,12,13,10,10,12,12,14, - 10,11,11,13,14,12,12,14,14,15,13,13,14,15,15, 9, - 10,10,13,13,10,11,11,13,14,10,11,10,14,13,13,13, - 14,15,15,12,14,13,15,14,12,12,13,13,14,12,13,14, - 13,15,13,14,14,15,15,14,14,15,14,16,15,15,15,16, - 16,12,13,13,14,14,13,14,14,15,15,12,14,13,15,14, - 14,15,15,16,16,14,15,14,16,14, 6, 9, 8,12,11, 8, - 10,10,13,13, 8,11, 9,13,12,11,12,12,14,14,11,13, - 12,15,14, 9,10,10,13,13,10,10,11,13,14,10,12,11, - 14,13,12,13,14,14,15,13,13,13,15,14, 9,10, 9,13, - 12,10,11,11,14,13,10,12,10,14,12,13,14,13,15,15, - 12,14,12,15,14,12,13,13,14,14,13,13,13,14,15,13, - 14,14,15,15,14,14,15,14,16,14,15,15,16,16,12,13, - 12,14,13,13,14,14,15,15,12,14,13,15,13,15,15,15, - 16,16,14,15,14,16,14,11,12,12,13,14,12,13,14,14, - 16,12,13,13,15,15,14,14,16,15,17,14,15,15,16,16, - 12,13,14,14,15,13,13,15,15,16,14,14,14,15,16,15, - 15,16,16,17,15,15,16,16,17,13,13,13,15,15,14,14, - 15,15,16,13,14,14,15,16,15,15,16,16,17,15,16,15, - 17,16,14,15,15,16,16,15,15,16,16,17,15,16,16,17, - 17,16,16,17,16,18,16,17,17,17,17,15,15,15,16,16, - 15,16,16,17,17,15,16,16,17,16,16,17,17,18,18,16, - 17,16,17,16,11,12,12,15,13,13,13,13,15,15,12,14, - 13,16,14,14,15,15,16,16,14,15,14,17,15,13,13,13, - 15,14,13,14,14,16,15,14,14,14,16,15,15,15,16,16, - 17,15,16,15,17,16,12,14,13,15,14,14,14,14,16,15, - 13,14,13,16,15,15,16,16,17,16,15,16,15,17,16,15, - 15,15,16,16,15,15,16,16,17,15,16,16,17,17,16,16, - 17,17,17,17,17,17,18,17,14,15,15,16,16,15,16,16, - 17,16,15,16,15,17,16,17,17,17,18,17,16,17,16,18, - 16, 6, 9, 9,12,12, 8,10,10,12,13, 8,10,10,13,12, - 10,12,12,14,15,11,13,12,15,14, 8, 9,10,12,13, 9, - 10,11,13,14,10,11,11,14,13,12,12,13,14,15,12,13, - 13,15,15, 8,10,10,13,13,10,11,11,13,14,10,12,10, - 14,13,12,13,13,15,15,12,14,13,15,14,11,12,12,13, - 14,12,12,13,13,15,12,13,13,15,15,14,13,15,14,16, - 14,15,15,16,16,12,13,13,14,14,13,13,14,15,14,12, - 14,13,15,14,14,15,15,16,15,14,15,14,16,14, 7, 9, - 10,12,12, 9,10,11,13,14, 9,11,10,13,13,11,12,13, - 14,15,12,13,13,15,14, 9,10,11,12,13,10,10,12,13, - 14,11,11,12,14,14,12,12,14,14,15,13,13,14,15,15, - 9,11,11,13,13,11,12,12,14,14,10,12,10,14,13,13, - 14,14,15,15,13,14,13,16,14,12,12,13,14,15,13,13, - 14,14,16,13,14,14,15,15,14,14,15,14,17,14,15,15, - 16,16,12,13,13,15,14,13,14,14,15,15,13,14,13,16, - 14,15,15,15,16,16,14,15,14,16,14, 7,10, 9,13,12, - 10,11,12,12,14,10,12,11,14,12,12,13,13,14,15,12, - 14,13,15,14, 9,11,10,13,13,10,11,12,13,14,12,13, - 12,15,13,13,13,14,13,15,13,14,14,16,15,10,11,11, - 13,13,12,12,13,14,14,11,12,11,14,13,14,14,14,15, - 16,13,14,13,16,13,12,13,13,14,14,12,13,13,14,15, - 14,14,14,15,15,14,13,15,13,16,15,15,15,17,16,13, - 13,13,14,14,14,14,14,15,15,12,13,13,15,14,15,16, - 16,16,16,14,15,14,16,13,11,12,13,14,15,12,13,14, - 15,16,13,14,14,15,15,14,14,15,15,17,14,15,15,16, - 16,13,13,14,14,15,13,13,15,14,16,14,14,15,15,16, - 15,14,16,15,17,15,16,16,16,17,13,14,14,15,15,14, - 14,15,16,16,13,15,14,16,16,15,16,16,17,17,15,16, - 15,17,16,14,15,15,15,17,15,15,16,15,17,15,16,16, - 16,17,16,16,17,16,18,17,17,17,17,18,15,15,15,17, - 16,15,16,16,17,17,15,16,16,17,16,16,17,17,18,18, - 16,17,16,18,17,11,13,12,15,14,13,13,14,15,15,13, - 14,13,16,14,15,15,15,16,16,15,16,15,17,16,13,14, - 13,15,14,13,13,14,15,15,14,15,14,16,15,15,15,16, - 16,16,15,16,15,18,16,13,14,14,15,15,14,15,15,15, - 16,13,15,13,16,15,15,16,16,17,17,15,16,15,17,16, - 15,15,15,16,16,15,15,15,16,17,16,16,16,17,16,16, - 16,17,16,17,17,17,17,18,17,15,15,15,16,16,16,16, - 16,17,17,15,16,15,17,16,17,17,17,18,18,16,17,16, - 17,15, 6, 9, 9,12,12, 8,10,10,12,13, 8,10,10,13, - 12,11,12,13,14,15,10,12,12,14,14, 9,10,10,13,13, - 10,10,12,13,14,10,11,11,14,13,12,13,14,14,15,12, - 13,13,15,15, 8,10, 9,13,12,10,11,11,13,14, 9,11, - 10,14,13,12,13,13,15,15,12,13,12,15,14,12,13,13, - 14,14,12,13,13,14,15,13,14,14,14,15,14,14,15,14, - 16,14,15,15,16,16,11,12,12,14,13,13,13,13,15,15, - 12,13,12,15,13,14,15,15,16,16,14,15,14,16,14, 7, - 9,10,12,13,10,10,12,12,14,10,12,11,14,13,12,13, - 14,14,15,12,13,13,15,14,10,11,11,13,13,11,11,12, - 13,14,12,13,12,14,14,13,13,14,13,16,14,14,14,15, - 15, 9,10,11,13,14,12,12,13,13,15,10,12,10,14,13, - 13,14,14,15,16,13,14,13,15,13,13,14,13,14,15,12, - 13,13,14,15,14,14,14,15,15,14,13,15,13,16,15,16, - 16,16,16,12,13,13,14,14,14,14,14,15,15,12,13,13, - 15,14,15,15,16,16,16,14,15,13,16,13, 7,10, 9,12, - 12, 9,10,11,13,13, 9,11,10,14,13,12,13,13,14,15, - 11,13,12,15,14, 9,11,11,13,13,10,10,12,13,14,11, - 12,12,14,14,13,13,14,14,16,13,14,14,16,15, 9,11, - 10,13,12,11,12,11,14,14,10,12,10,14,13,13,14,13, - 15,15,12,14,12,16,14,12,13,13,14,15,13,13,14,14, - 16,13,14,14,15,15,14,14,15,14,16,15,15,15,16,16, - 12,13,12,15,14,13,14,14,15,15,12,14,13,16,14,14, - 15,15,16,16,14,15,14,17,14,11,12,13,14,15,13,13, - 14,14,16,13,14,13,15,15,15,15,16,16,17,15,15,15, - 16,16,13,14,13,15,15,13,13,15,15,16,14,15,15,16, - 16,15,15,16,15,17,16,16,16,17,17,13,13,14,14,15, - 14,14,15,15,16,13,14,13,15,15,15,16,16,16,17,15, - 16,15,16,16,15,15,15,16,16,15,15,16,16,17,16,16, - 16,17,17,16,16,17,16,18,17,17,17,18,18,15,15,15, - 16,16,16,16,16,17,17,15,15,15,16,16,17,17,17,17, - 18,16,16,16,17,15,11,13,12,15,14,13,13,14,15,15, - 12,14,13,16,14,14,15,15,16,16,14,15,14,16,15,13, - 14,14,15,15,13,14,14,16,16,14,15,14,16,16,15,15, - 16,17,17,15,16,16,17,17,13,14,13,15,14,14,14,14, - 16,15,13,15,13,16,14,15,16,15,17,16,15,16,14,17, - 15,14,16,15,16,17,15,16,16,16,17,15,16,16,17,17, - 16,16,17,17,18,16,17,17,18,17,14,15,15,17,15,15, - 16,16,17,16,15,16,15,17,15,16,17,17,18,17,16,17, - 16,18,15,10,12,12,14,14,12,13,13,15,15,12,13,13, - 15,15,13,14,14,15,16,14,15,14,16,16,12,13,13,15, - 15,12,13,14,15,15,13,14,14,15,15,14,14,15,16,17, - 14,15,15,17,16,12,13,13,15,15,13,14,14,15,16,13, - 14,14,16,15,14,15,15,16,17,14,15,15,17,16,13,14, - 14,15,16,14,14,15,15,16,14,15,15,16,16,15,15,16, - 16,17,15,16,16,17,17,14,15,15,16,16,15,15,15,16, - 16,15,15,15,16,16,16,17,16,17,17,16,16,16,18,16, - 11,12,12,14,14,12,13,14,15,15,12,13,13,15,15,13, - 14,15,16,16,14,15,15,16,16,12,13,13,15,15,13,13, - 14,15,16,13,14,14,15,16,14,14,15,16,17,15,15,15, - 16,17,12,13,13,15,15,13,14,14,15,16,13,14,14,16, - 15,15,15,15,16,17,15,16,15,17,16,14,14,15,15,16, - 14,14,15,15,17,15,15,16,16,17,15,15,16,15,18,16, - 16,16,17,17,14,15,15,16,16,15,16,16,17,17,15,15, - 15,17,16,16,17,16,17,17,16,16,16,18,16,11,12,12, - 14,14,13,13,14,15,15,13,14,13,15,15,14,15,15,16, - 16,14,15,15,16,16,12,13,13,15,15,13,13,14,15,15, - 14,14,14,16,15,15,15,15,15,16,15,16,15,17,16,12, - 13,13,15,15,14,14,15,15,16,13,14,13,16,15,15,15, - 16,16,17,15,16,15,17,15,14,15,14,16,16,14,15,15, - 16,16,15,16,15,17,16,15,15,16,15,17,16,17,16,17, - 17,14,15,15,16,16,15,16,16,16,17,14,15,15,16,16, - 16,17,17,17,18,16,16,16,17,16,12,13,13,15,15,13, - 13,14,15,16,13,14,14,16,15,14,15,15,16,17,14,15, - 15,17,16,13,14,14,15,16,14,14,15,15,17,14,15,15, - 16,16,15,14,16,15,17,15,16,16,17,17,13,14,14,16, - 16,14,15,15,16,16,14,15,14,16,16,15,16,16,17,17, - 15,16,15,17,16,15,15,16,15,17,15,15,16,15,17,15, - 16,16,16,17,16,15,17,15,18,17,17,17,17,17,15,15, - 15,17,17,16,16,16,17,17,15,16,15,17,17,16,17,17, - 18,18,16,17,15,18,15,11,12,12,15,15,13,13,15,14, - 16,13,14,13,16,14,15,15,16,16,17,15,16,15,17,15, - 12,14,13,16,14,13,13,14,14,16,14,15,14,16,15,15, - 15,16,15,17,16,16,16,17,16,12,13,14,15,16,15,15, - 15,15,16,13,15,13,16,14,16,16,16,17,17,15,16,15, - 17,15,15,16,15,16,15,14,14,15,16,16,16,16,16,17, - 16,15,15,16,15,17,17,17,17,18,17,15,15,15,16,16, - 16,16,16,16,17,14,15,15,17,16,17,17,17,17,18,15, - 16,15,18,14,10,12,12,14,14,12,13,13,15,15,12,13, - 13,15,15,14,14,15,15,16,13,15,14,16,16,12,13,13, - 15,15,13,14,14,15,16,13,14,14,15,15,14,15,15,16, - 17,14,15,15,17,16,12,13,13,15,15,13,14,14,15,15, - 12,14,13,15,15,14,15,15,16,17,14,15,14,17,15,14, - 15,15,16,16,14,15,15,16,17,15,15,15,17,16,16,16, - 16,16,17,16,16,16,17,17,13,14,14,16,15,14,15,15, - 16,16,14,15,14,16,16,15,16,16,17,17,15,16,15,17, - 16,11,12,12,14,15,13,13,14,14,15,13,14,13,15,15, - 14,15,15,16,16,14,15,15,16,16,12,14,13,15,15,13, - 13,14,15,16,14,15,14,16,15,15,15,16,15,17,15,16, - 16,17,16,12,13,13,15,15,14,14,15,15,16,13,14,13, - 16,15,15,15,16,16,17,15,15,15,16,16,14,15,15,16, - 16,14,15,15,16,16,15,16,16,17,17,16,16,16,16,17, - 16,17,17,18,17,14,14,15,15,16,15,15,16,16,17,14, - 15,15,16,16,16,16,16,17,17,15,16,15,17,15,11,12, - 12,14,14,12,13,14,15,15,12,13,13,15,15,14,15,15, - 16,16,13,15,14,16,16,12,13,13,15,15,13,14,14,15, - 16,13,14,14,16,16,15,15,15,16,17,15,15,15,17,16, - 12,13,13,15,15,13,14,14,16,15,13,14,13,16,15,15, - 16,15,17,17,14,15,14,17,16,14,15,15,16,16,15,15, - 16,16,17,15,16,16,17,17,16,16,16,16,18,16,17,16, - 18,17,14,15,14,16,15,15,15,15,17,16,14,15,14,17, - 15,16,17,16,17,17,15,16,15,17,15,11,12,12,15,15, - 13,13,15,14,16,13,15,13,16,14,15,15,16,15,17,15, - 16,15,17,16,12,14,13,15,15,13,13,15,15,16,15,15, - 15,16,15,15,15,16,15,17,16,16,16,17,16,12,13,14, - 15,16,14,14,15,15,16,13,14,13,16,14,16,16,16,16, - 17,15,16,15,17,15,15,16,15,16,16,14,15,15,16,16, - 16,16,16,17,16,15,15,16,15,17,17,17,17,18,17,15, - 15,15,15,16,16,16,16,16,17,14,15,14,16,15,17,17, - 17,17,18,15,16,15,17,15,12,13,13,15,15,13,14,14, - 15,16,13,14,14,16,15,14,15,15,16,17,14,15,15,17, - 16,13,14,14,16,15,13,14,15,16,16,14,15,15,16,16, - 15,15,16,16,17,15,16,16,17,17,13,14,13,16,15,14, - 15,15,16,16,13,15,14,16,15,15,16,16,17,17,15,16, - 14,17,15,15,15,16,17,17,15,15,16,16,17,16,16,16, - 17,17,16,15,17,16,18,17,17,17,18,18,15,15,15,17, - 14,16,16,16,17,16,15,16,15,17,15,16,17,17,18,17, - 16,17,15,18,15, -}; - -static const static_codebook _44p8_p5_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p8_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p8_p5_0, - 0 -}; - -static const long _vq_quantlist__44p8_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44p8_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p8_p5_1 = { - 1, 7, - (long *)_vq_lengthlist__44p8_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p8_p5_1, - 0 -}; - -static const long _vq_quantlist__44p8_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p8_p6_0[] = { - 2, 6, 6, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 7, 9, 7, - 9, 9, 6, 7, 7, 8, 9, 9, 7, 9, 7, 6, 8, 8, 8, 9, - 10, 8, 9, 9, 8, 9,10, 9, 9,10,10,10,10, 8, 9, 9, - 10,10,11, 9,10,10, 6, 8, 8, 8, 9, 9, 8,10, 9, 8, - 9, 9, 9,10,10,10,11,10, 8,10, 9,10,11,10, 9,11, - 9, 6, 8, 8, 7, 9, 9, 7, 9, 9, 7, 9, 9, 8, 9,10, - 9,10,10, 8, 9, 9, 9,10,10, 9,10, 9, 7, 9, 9, 9, - 9,10, 9,10,10, 9, 9,10,10, 9,11,10,11,11, 9,10, - 10,10,11,11,10,11,10, 6, 9, 8, 9, 9,10, 9,10, 9, - 8,10,10, 9, 9,10,10,11,11, 9,10,10,10,11,11, 9, - 11, 9, 6, 8, 8, 7, 9, 9, 7, 9, 9, 8, 9, 9, 9, 9, - 10, 9,10,10, 7, 9, 9, 9,10,10, 8,10, 9, 6, 8, 9, - 9, 9,10, 9,10, 9, 9,10,10, 9, 9,11,10,11,11, 8, - 9,10,10,11,11, 9,10, 9, 7, 9, 9, 9,10,10, 9,10, - 9, 9,10,10,10,10,11,10,11,11, 9,10, 9,10,11,11, - 10,11, 9, -}; - -static const static_codebook _44p8_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44p8_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p8_p6_0, - 0 -}; - -static const long _vq_quantlist__44p8_p6_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p8_p6_1[] = { - 4, 7, 7, 7, 7, 8, 7, 8, 7, 7, 7, 8, 7, 8, 8, 8, - 8, 8, 7, 8, 7, 8, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, 8, - 8, 9, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, - 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 8, 8, 9, 8, 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, 8, - 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 8, 9, 8, 8, 8, 8, 8, 9, 9, 8, - 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 9, 9, 8, 8, 8, 8, 9, 8, 8, 9, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, - 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, - 8, 9, 8, -}; - -static const static_codebook _44p8_p6_1 = { - 5, 243, - (long *)_vq_lengthlist__44p8_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p8_p6_1, - 0 -}; - -static const long _vq_quantlist__44p8_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p8_p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p8_p7_0 = { - 5, 243, - (long *)_vq_lengthlist__44p8_p7_0, - 1, -512202240, 1635281408, 2, 0, - (long *)_vq_quantlist__44p8_p7_0, - 0 -}; - -static const long _vq_quantlist__44p8_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p8_p7_1[] = { - 1, 7, 7,12,12, 5,11,12,12,12, 5,12,11,12,12,12, - 12,12,12,12,12,13,13,13,13, 7,11,11,13,13,13,12, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13, 7,13,10,13,13,13,13,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13, 7,13,12, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,12, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13, 8,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13, 8,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,12,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,10,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13, 8,13,12,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,11, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,11,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13, -}; - -static const static_codebook _44p8_p7_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p8_p7_1, - 1, -514619392, 1630767104, 3, 0, - (long *)_vq_quantlist__44p8_p7_1, - 0 -}; - -static const long _vq_quantlist__44p8_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p8_p7_2[] = { - 1, 3, 2, 4, 5, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44p8_p7_2 = { - 1, 25, - (long *)_vq_lengthlist__44p8_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p8_p7_2, - 0 -}; - -static const long _vq_quantlist__44p8_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p8_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p8_p7_3 = { - 1, 25, - (long *)_vq_lengthlist__44p8_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p8_p7_3, - 0 -}; - -static const long _huff_lengthlist__44p8_short[] = { - 3, 9,15,17,20,21,22,23, 5, 5, 7, 9,11,13,17,20, - 9, 5, 5, 6, 8,10,15,18,11, 7, 5, 4, 6, 9,13,17, - 14, 9, 7, 5, 6, 7,10,14,17,10, 8, 6, 6, 4, 5, 8, - 20,14,13,10, 8, 4, 3, 4,23,17,16,14,12, 6, 4, 4, -}; - -static const static_codebook _huff_book__44p8_short = { - 2, 64, - (long *)_huff_lengthlist__44p8_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p9_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44p9_l0_0[] = { - 2, 5, 5, 7, 6, 8, 8, 9, 9,10,10,11,11, 4, 5, 5, - 6, 7, 8, 8, 9, 9,10,10,11,10, 4, 5, 5, 7, 6, 8, - 8, 9, 9,10,10,10,10, 6, 6, 7, 6, 7, 8, 8, 9, 9, - 10, 9,11, 9, 6, 6, 6, 7, 6, 8, 8, 9, 9, 9,10, 9, - 11, 7, 7, 8, 8, 8, 8, 9, 9, 9,10, 9,11, 9, 7, 8, - 8, 8, 8, 9, 8, 9, 9, 9,10, 9,11, 8, 9, 9, 9, 9, - 9, 9,10,10,11,10,12,10, 8, 9, 9, 9, 9, 9, 9,10, - 9,10,11,11,12, 9,10,10,10,10,10,10,10,11,11,11, - 11,12, 9,10,10,10,10,11,10,11,10,11,11,12,11,11, - 11,11,11,11,11,11,11,12,11,12,11,12,11,11,11,11, - 11,11,11,12,11,12,11,12,11, -}; - -static const static_codebook _44p9_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44p9_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44p9_l0_0, - 0 -}; - -static const long _vq_quantlist__44p9_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p9_l0_1[] = { - 4, 4, 4, 5, 5, 4, 4, 5, 5, 5, 4, 5, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p9_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44p9_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p9_l0_1, - 0 -}; - -static const long _vq_quantlist__44p9_l1_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p9_l1_0[] = { - 1, 2, 3, 5, 9, 9, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44p9_l1_0 = { - 2, 25, - (long *)_vq_lengthlist__44p9_l1_0, - 1, -514619392, 1630767104, 3, 0, - (long *)_vq_quantlist__44p9_l1_0, - 0 -}; - -static const long _huff_lengthlist__44p9_lfe[] = { - 1, 1, -}; - -static const static_codebook _huff_book__44p9_lfe = { - 1, 2, - (long *)_huff_lengthlist__44p9_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44p9_long[] = { - 3, 3, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _huff_book__44p9_long = { - 1, 8, - (long *)_huff_lengthlist__44p9_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44p9_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p9_p1_0[] = { - 1, 5, 5, 4, 8, 8, 4, 8, 8, 5, 7, 8, 8, 9,10, 8, - 10,10, 5, 8, 7, 8,10,10, 8,10, 9, 7, 9, 9, 9,11, - 11, 9,11,11, 9,11,11,11,12,13,11,13,13, 9,11,11, - 11,13,13,11,13,13, 7, 9, 9, 9,11,11, 9,11,11, 9, - 11,11,11,13,13,11,13,13, 9,11,11,11,13,13,11,13, - 12, 5, 9, 9, 9,11,11, 9,11,11, 9,11,11,11,12,13, - 11,13,13, 9,11,11,11,13,13,11,13,13, 9,11,12,11, - 13,13,12,13,13,11,12,13,13,14,15,13,14,14,12,13, - 13,13,15,15,13,15,14, 8,10,10,11,13,13,12,14,13, - 11,12,12,13,14,15,13,15,15,11,12,12,13,15,15,13, - 15,14, 5, 9, 9, 9,11,11, 9,11,11, 9,11,11,11,13, - 13,11,13,13, 9,11,10,11,13,13,11,13,12, 8,10,10, - 11,13,13,12,13,13,11,12,12,13,14,15,14,15,15,10, - 12,12,13,14,15,13,15,14, 9,12,11,12,13,13,11,13, - 13,12,13,13,13,15,15,13,14,15,11,13,12,13,15,14, - 13,15,14, -}; - -static const static_codebook _44p9_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44p9_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p9_p1_0, - 0 -}; - -static const long _vq_quantlist__44p9_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p9_p2_0[] = { - 4, 6, 6, 8, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 6, - 8, 8,11,11, 6, 8, 8,11,11, 6, 7, 7, 9, 9, 7, 8, - 9,10,11, 7, 9, 9,11,10, 8, 9,10,12,12, 8,10,10, - 12,12, 6, 7, 7, 9, 9, 7, 9, 9,10,10, 7, 9, 8,11, - 10, 8,10,10,12,12, 8,10, 9,12,12, 8, 9, 9,11,11, - 9,10,10,12,12, 9,11,11,12,13,11,12,12,13,14,11, - 12,12,14,14, 8, 9, 9,11,11, 9,11,10,13,12, 9,10, - 10,13,12,11,12,12,14,14,11,12,12,14,13, 7, 8, 9, - 10,10, 8,10,10,11,11, 8,10,10,11,11,10,11,11,13, - 13,10,11,11,13,13, 8, 9,10,10,11,10,11,11,12,13, - 10,11,11,12,12,11,11,12,13,14,11,12,12,14,14, 8, - 10,10,11,11,10,11,11,12,13,10,11,11,12,12,11,12, - 12,14,14,11,12,12,14,14,10,11,11,12,13,11,12,12, - 13,14,12,13,13,14,14,13,13,14,14,16,13,14,14,15, - 16,10,11,11,13,13,12,12,12,14,14,11,12,12,14,14, - 13,14,14,15,16,13,14,14,16,15, 7, 8, 8,10,10, 8, - 10,10,11,11, 8,10,10,12,11,10,11,11,13,13,10,11, - 11,13,13, 8,10,10,11,11,10,11,11,12,12,10,11,11, - 12,12,11,12,12,14,14,11,12,12,14,14, 8,10, 9,11, - 10,10,11,11,13,12,10,11,10,13,12,11,12,12,14,14, - 11,12,11,14,13,10,11,11,13,13,11,12,12,14,14,12, - 12,12,14,14,13,14,14,15,16,13,14,14,15,15,10,11, - 11,13,12,12,12,12,14,14,11,12,12,14,13,13,14,14, - 16,15,13,14,13,16,14,10,11,11,13,13,12,12,13,14, - 15,12,13,13,14,15,13,14,15,15,16,13,14,14,16,16, - 11,12,13,14,14,13,13,14,15,16,13,14,14,15,16,14, - 15,15,16,17,14,15,16,17,17,11,12,12,14,14,13,14, - 14,15,16,13,14,14,15,15,14,15,15,16,18,14,15,15, - 17,16,13,14,15,15,16,15,15,16,16,18,15,15,15,17, - 17,16,16,17,17,18,16,16,16,18,18,14,14,14,16,16, - 15,15,15,16,17,15,15,15,16,17,16,17,17,18,18,16, - 16,17,18,17,10,11,11,14,13,12,13,13,15,14,11,13, - 13,15,14,13,15,15,16,16,13,14,14,16,16,11,12,12, - 14,14,13,13,13,15,15,13,14,13,15,15,15,15,15,17, - 16,14,15,15,17,16,11,13,12,14,14,13,14,13,15,15, - 13,14,13,15,15,14,15,15,17,17,14,15,15,17,16,14, - 14,14,16,16,14,15,15,17,17,15,15,16,17,16,17,16, - 17,18,18,16,17,17,18,18,13,14,14,16,15,15,15,15, - 17,17,14,16,15,16,16,17,17,17,18,18,16,17,16,20, - 19, 6, 8, 8,10,10, 8,10,10,11,11, 8,10,10,12,11, - 10,11,11,13,13,10,11,11,13,13, 8, 9,10,11,11,10, - 11,11,12,12,10,11,11,13,12,11,12,12,14,14,11,12, - 12,14,14, 9,10,10,11,11,10,11,11,12,12,10,11,11, - 13,12,11,12,12,14,14,11,12,12,14,14,10,10,11,12, - 13,11,12,12,14,14,11,12,12,14,14,13,14,14,15,16, - 13,14,14,15,16,10,11,11,13,13,12,12,12,14,14,12, - 13,12,14,14,13,14,14,16,16,13,14,14,15,15, 9,10, - 10,11,12,10,11,11,12,13,10,11,11,13,12,11,12,12, - 14,14,11,12,12,14,14,10,10,11,12,13,11,12,12,13, - 14,11,12,12,13,14,12,13,14,14,15,12,13,13,15,15, - 10,11,11,13,13,11,12,12,13,14,11,12,12,14,13,12, - 13,13,15,15,12,13,13,15,15,12,11,13,12,14,13,13, - 14,14,15,13,13,14,14,15,14,15,15,16,17,14,15,15, - 16,17,12,13,12,14,14,13,14,14,15,15,13,14,14,15, - 15,14,15,15,16,17,14,15,15,16,17, 8, 9, 9,11,11, - 10,11,11,12,13,10,11,11,13,12,12,13,13,14,15,11, - 13,12,15,14, 9,11,10,12,12,11,12,12,13,14,11,12, - 12,14,13,13,13,14,15,15,13,14,13,15,15, 9,11,11, - 12,12,11,12,12,14,14,11,12,12,14,13,13,14,14,15, - 16,13,14,13,15,14,11,12,12,14,13,12,13,13,14,15, - 13,14,14,16,15,15,15,15,15,16,15,16,15,17,17,11, - 12,12,14,14,13,14,14,15,15,12,13,13,15,14,15,15, - 15,17,17,14,15,15,17,15,11,12,12,14,14,12,13,13, - 15,15,12,13,13,15,15,14,15,15,17,17,14,15,15,16, - 16,12,13,13,14,15,13,14,14,16,16,14,14,14,15,16, - 15,16,16,17,17,15,16,16,17,17,12,13,13,15,15,14, - 14,14,16,16,14,14,15,16,16,15,16,16,17,17,15,16, - 16,17,17,14,15,15,15,16,15,15,16,16,18,15,16,16, - 17,17,17,17,17,18,18,16,17,17,19,18,14,15,15,16, - 17,15,16,16,17,17,15,16,16,18,17,16,17,17,19,18, - 17,17,17,19,18,10,12,12,14,14,13,13,14,15,15,12, - 14,13,16,15,15,15,15,17,17,14,15,15,17,16,12,13, - 13,15,14,13,14,14,16,16,14,14,15,17,16,15,16,16, - 17,17,15,16,16,18,17,12,13,13,15,14,14,15,15,16, - 16,13,15,14,16,15,16,17,16,19,17,15,16,16,17,17, - 14,15,15,17,15,15,16,15,17,17,16,17,16,18,17,17, - 17,18,18,18,17,17,18,19,18,14,15,15,16,16,15,16, - 16,17,18,15,16,16,18,16,17,18,18,19,19,17,18,17, - 18,19, 6, 8, 8,10,10, 8,10,10,11,11, 8,10,10,12, - 11,10,11,11,13,13, 9,11,11,13,13, 9,10,10,11,11, - 10,11,11,12,12,10,11,11,12,12,11,12,12,14,14,11, - 12,12,14,14, 8,10, 9,11,11,10,11,11,12,12,10,11, - 11,12,12,11,12,12,14,14,11,12,12,14,14,10,11,11, - 13,13,11,12,13,14,14,12,12,12,14,14,13,14,14,15, - 16,13,14,14,16,16,10,11,10,13,12,11,12,12,14,14, - 11,12,12,14,14,13,14,14,15,16,13,14,14,16,15, 8, - 9, 9,11,11,10,11,11,12,13,10,11,11,13,12,12,13, - 13,14,15,12,13,13,15,14,10,11,11,12,12,11,11,12, - 13,14,11,12,12,14,14,13,13,14,15,16,13,14,14,15, - 15, 9,10,11,12,12,11,12,12,13,14,11,12,12,14,13, - 13,14,14,15,16,12,14,13,15,15,11,12,12,14,14,12, - 13,13,14,15,13,14,14,16,15,14,15,15,15,17,15,15, - 16,16,17,11,12,12,13,14,13,14,14,15,15,12,13,13, - 15,14,15,16,15,16,17,14,16,15,17,15, 9,10,10,12, - 11,10,11,11,13,13,10,11,11,13,12,11,12,12,14,14, - 11,12,12,14,14,10,11,11,12,13,11,12,12,13,14,11, - 12,12,14,14,12,13,13,15,15,12,13,13,15,15,10,11, - 10,13,12,11,12,12,13,13,11,12,12,14,13,12,13,13, - 15,15,12,13,13,15,14,12,13,12,14,14,13,14,14,15, - 15,13,14,14,15,15,14,15,15,16,16,14,15,15,16,16, - 11,13,11,14,12,13,13,13,15,14,12,14,13,15,14,15, - 15,15,17,16,14,15,14,17,15,10,12,12,14,14,13,13, - 14,15,16,12,14,13,15,15,14,15,16,17,17,14,15,16, - 17,17,12,13,13,14,15,13,14,14,16,16,14,14,15,16, - 16,16,16,16,17,17,16,16,16,18,18,12,13,13,14,15, - 14,14,15,16,16,13,14,14,16,15,16,16,16,17,18,15, - 16,16,17,17,14,15,15,16,16,15,15,16,17,17,15,16, - 16,17,18,17,18,18,18,19,17,18,18,19,19,14,15,15, - 16,16,15,16,16,17,17,15,16,16,17,17,17,17,18,20, - 18,17,18,17,18,18,11,12,12,14,14,12,13,14,15,15, - 12,13,13,15,15,14,15,15,16,17,14,15,15,16,17,12, - 13,13,15,15,14,14,14,16,16,14,14,14,16,16,15,16, - 16,17,17,15,16,16,17,17,12,13,13,15,14,13,14,14, - 16,15,14,15,14,16,15,15,16,16,17,17,15,16,16,17, - 16,14,15,15,16,16,15,16,16,17,17,16,16,16,17,17, - 17,17,17,19,18,17,17,17,18,19,14,15,14,17,15,15, - 16,16,17,17,15,16,15,17,17,16,17,17,18,18,16,17, - 17,18,17, 6,11,11,13,13,11,12,12,14,14,11,12,12, - 14,14,13,14,14,16,16,13,14,14,16,16,11,12,12,14, - 14,12,13,13,15,15,12,13,13,15,15,14,15,15,16,17, - 14,15,15,17,18,11,12,12,14,14,12,13,13,15,15,12, - 13,13,15,15,14,15,15,17,17,14,15,15,16,16,13,14, - 14,15,16,14,15,15,16,17,14,15,15,17,16,15,16,17, - 18,17,16,16,16,18,17,14,14,15,16,16,14,15,15,18, - 16,14,15,15,17,16,16,17,17,18,18,16,17,16,18,17, - 11,12,12,14,14,12,13,13,15,15,12,13,13,15,15,14, - 15,15,17,17,14,15,15,16,16,12,13,13,15,15,13,14, - 14,15,16,13,14,14,16,16,15,16,16,17,17,15,15,16, - 17,17,12,13,13,15,15,14,14,14,16,16,13,14,14,16, - 16,15,16,16,17,17,15,16,16,17,17,14,14,15,15,16, - 15,15,16,16,17,15,15,16,16,17,16,17,17,17,18,16, - 17,17,18,18,14,15,15,16,16,15,16,16,17,17,15,16, - 16,17,17,17,17,17,18,19,17,17,17,18,18,10,12,12, - 14,14,12,13,14,15,16,13,14,13,15,15,14,15,15,17, - 17,14,15,16,17,17,12,13,13,15,15,13,14,14,15,15, - 14,15,14,16,16,15,16,16,17,18,15,17,16,18,17,12, - 13,13,15,15,14,14,14,16,16,13,14,14,16,15,15,16, - 16,17,18,15,16,16,17,17,14,14,14,16,16,15,15,16, - 17,17,15,16,16,17,17,17,17,17,18,20,17,17,17,19, - 19,14,15,15,16,16,15,17,16,18,18,15,16,15,17,16, - 17,18,19,19,19,17,17,17,18,17,13,14,14,16,16,14, - 15,15,17,17,14,15,15,16,17,15,17,17,18,18,16,16, - 17,18,17,14,15,15,16,17,15,16,16,17,17,15,16,16, - 17,17,16,17,17,18,18,17,17,17,18,19,14,15,15,16, - 17,15,16,16,17,17,15,16,16,17,17,16,17,17,18,18, - 17,17,17,19,19,16,16,16,16,18,16,17,17,17,18,17, - 17,17,17,19,18,18,18,19,19,18,18,18,19,20,16,16, - 17,18,18,16,18,17,18,18,17,17,17,20,19,18,18,19, - 21,20,18,20,18,18,19,10,12,12,14,14,14,14,15,15, - 17,14,15,14,17,15,16,16,17,18,18,16,18,17,19,18, - 12,14,13,16,15,14,14,15,15,17,15,16,16,18,17,16, - 17,18,17,19,17,19,18,20,19,12,13,13,15,15,15,16, - 17,17,18,14,16,14,17,16,17,18,18,19,19,17,17,17, - 18,18,15,15,15,17,16,15,16,16,17,17,17,19,17,18, - 18,18,18,18,18,21,19,20,19,20,19,15,15,16,16,17, - 17,17,18,20,20,15,16,16,18,17,18,19,19,19,20,18, - 19,18,19,17, 6,11,11,13,13,11,12,12,14,14,11,12, - 12,14,14,13,14,14,16,16,13,14,14,16,16,11,12,12, - 14,14,12,13,13,15,15,12,13,13,15,15,14,15,15,17, - 17,14,15,15,17,16,11,12,12,14,14,12,13,13,15,15, - 12,13,13,15,15,14,15,15,16,16,14,15,15,16,16,13, - 14,14,16,16,15,15,15,16,16,14,15,15,17,16,16,17, - 17,19,18,16,17,17,18,18,13,14,14,15,15,14,15,15, - 17,16,14,15,15,17,16,16,17,16,17,18,15,16,16,18, - 18,10,12,12,14,14,12,13,14,15,15,12,13,13,15,15, - 14,15,15,17,17,14,15,15,17,16,12,13,13,15,15,14, - 14,14,15,16,14,15,15,16,16,15,16,16,17,18,16,16, - 16,18,18,12,13,13,14,14,14,14,15,16,16,13,14,14, - 16,16,15,16,16,18,18,15,16,16,19,17,14,15,15,16, - 17,15,15,16,17,17,16,17,16,17,18,17,17,18,17,19, - 17,17,18,18,19,14,14,14,16,16,15,16,16,17,17,15, - 16,15,17,17,17,17,17,19,20,16,17,17,18,18,11,12, - 12,14,14,12,13,13,15,15,12,13,13,15,15,14,15,15, - 16,16,14,15,14,16,16,12,13,13,15,15,14,14,14,16, - 16,13,14,14,16,16,15,16,16,18,17,15,16,16,17,17, - 12,13,13,15,15,13,14,14,16,16,13,14,14,16,16,15, - 16,15,18,18,15,16,15,17,16,14,15,15,16,16,15,16, - 16,17,17,15,16,16,18,17,16,17,17,18,18,16,17,17, - 18,18,14,15,14,16,15,15,16,15,17,17,15,16,15,17, - 16,16,17,17,18,18,17,17,16,19,17,10,12,12,14,15, - 14,14,15,15,17,14,15,14,17,15,16,17,17,17,18,16, - 17,17,18,18,12,14,13,16,15,14,14,16,15,17,15,17, - 16,18,17,17,17,18,17,19,18,18,18,19,18,12,13,14, - 15,15,15,16,16,16,17,14,15,14,18,16,18,17,18,19, - 19,17,18,17,20,18,15,15,15,17,17,15,16,16,17,18, - 18,18,18,19,18,18,18,19,18,20,18,19,19,21,21,15, - 15,16,16,17,17,18,18,18,18,15,16,16,17,17,17,19, - 20,19,20,17,18,18,19,17,13,14,14,16,16,14,15,15, - 16,17,14,15,15,17,17,16,16,17,17,18,15,17,16,17, - 17,14,15,15,16,16,15,16,16,17,17,16,16,16,17,17, - 17,17,18,17,18,17,17,17,18,20,14,15,15,17,16,15, - 16,16,17,17,15,16,16,17,17,17,17,17,18,18,16,17, - 17,19,18,16,16,17,17,17,17,18,17,19,18,17,17,17, - 18,19,17,20,18,19,21,17,19,18,19,20,15,17,15,17, - 16,16,17,17,18,18,17,17,17,18,17,18,19,18,19,21, - 18,18,17,19,19, -}; - -static const static_codebook _44p9_p2_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p9_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p9_p2_0, - 0 -}; - -static const long _vq_quantlist__44p9_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p9_p3_0[] = { - 2, 5, 4, 4, 7, 7, 4, 7, 6, 5, 6, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 6, 7, 9, 9, 7, 9, 8, 6, 8, 8, 8,10, - 10, 8,10,10, 8, 9,10,10,11,12,10,12,12, 8,10,10, - 10,12,12,10,12,11, 6, 8, 8, 8,10,10, 8,10,10, 8, - 10,10,10,11,12,10,12,12, 8,10, 9,10,12,11,10,12, - 11, 5, 8, 8, 8,10,10, 8,10,10, 8, 9,10,10,11,11, - 10,11,11, 8,10,10,10,11,12,10,12,11, 8,10,10,10, - 11,11,10,11,11,10,11,11,11,12,13,11,12,13,10,11, - 11,11,13,13,11,13,13, 7, 9, 9,10,11,12,10,12,11, - 9,11,11,11,12,13,12,14,13, 9,11,11,12,13,14,11, - 13,12, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, - 12,10,12,12, 8,10, 9,10,12,11, 9,11,11, 7, 9, 9, - 10,11,12,10,12,11, 9,11,11,11,12,13,12,14,13, 9, - 11,11,12,13,14,11,13,12, 8,10,10,10,11,11,10,11, - 11,10,11,11,11,13,13,11,13,13,10,11,10,11,13,12, - 11,13,12, -}; - -static const static_codebook _44p9_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44p9_p3_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44p9_p3_0, - 0 -}; - -static const long _vq_quantlist__44p9_p3_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p9_p3_1[] = { - 4, 6, 6, 6, 7, 7, 6, 7, 7, 6, 7, 7, 7, 7, 8, 7, - 7, 8, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, - 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, - 9, 5, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, - 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, - 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 7, 8, 8, 8, 9, 9, 8, 9, 9, - 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 9, 8, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, - 8, 9, 9, 8, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 8, - 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 8, 9, - 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44p9_p3_1 = { - 5, 243, - (long *)_vq_lengthlist__44p9_p3_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44p9_p3_1, - 0 -}; - -static const long _vq_quantlist__44p9_p4_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p9_p4_0[] = { - 2, 5, 5, 4, 7, 7, 4, 7, 6, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 6, 7, 8, 8, 9, - 10, 8,10,10, 8, 9,10,10,11,12,10,11,12, 8,10,10, - 10,11,12,10,12,11, 6, 8, 7, 8,10,10, 8,10, 9, 8, - 10,10,10,11,12,10,12,12, 8,10, 9,10,12,11,10,12, - 11, 5, 8, 8, 8,10,10, 8,10,10, 7, 9,10, 9,10,11, - 10,11,11, 8,10,10,10,12,12,10,12,11, 7, 9, 9, 9, - 11,11, 9,11,11, 9,10,11,11,11,12,11,12,12, 9,11, - 11,11,12,12,11,12,12, 7, 9, 9,10,11,12,10,12,11, - 9,11,10,11,11,12,12,13,13, 9,11,11,12,13,13,11, - 13,11, 5, 8, 8, 8,10,10, 8,10,10, 8,10,10,10,11, - 12,10,12,12, 7, 9, 9, 9,11,11, 9,11,10, 7, 9, 9, - 10,11,12,10,12,11, 9,11,11,11,11,13,12,13,13, 9, - 10,11,12,13,13,11,12,11, 7, 9, 9, 9,11,11, 9,11, - 11, 9,11,11,11,12,12,11,12,12, 9,11,10,11,12,12, - 10,12,11, -}; - -static const static_codebook _44p9_p4_0 = { - 5, 243, - (long *)_vq_lengthlist__44p9_p4_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44p9_p4_0, - 0 -}; - -static const long _vq_quantlist__44p9_p4_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p9_p4_1[] = { - 6, 8, 8,10, 9, 8, 9, 9,10,10, 8, 9, 9,10,10, 8, - 10,10,10,10, 8,10,10,10,10, 9, 9, 9,10,10, 9,10, - 10,10,11, 9,10,10,11,11,10,10,10,11,11,10,10,10, - 11,11, 9, 9, 9,10,10, 9,10,10,11,11, 9,10,10,11, - 10,10,10,10,11,11,10,10,10,11,11,10,10,10,10,11, - 10,10,11,11,11,10,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,10,10,10,11,10,10,11,11,11,11,10,11, - 10,11,11,11,11,11,11,11,10,11,11,11,11, 9,10,10, - 10,11,10,10,11,11,11,10,11,11,11,11,10,11,11,11, - 11,10,11,11,11,11,10,10,11,11,11,11,11,11,11,11, - 11,11,11,11,12,11,11,12,12,12,11,11,11,12,12,10, - 11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11, - 11,12,12,11,11,11,12,12,11,11,11,11,11,11,12,12, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,11,11,11,11,11,11,12,12,12,12,11,12,11,12,12, - 11,12,12,12,12,12,12,12,12,12, 9,10,10,11,10,10, - 11,11,11,11,10,11,11,11,11,10,11,11,11,11,10,11, - 11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11, - 12,12,11,11,12,12,12,11,11,11,12,12,10,11,10,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12, - 11,11,11,12,12,11,11,11,11,11,11,12,12,12,12,11, - 12,12,12,12,11,12,12,12,12,12,12,12,12,12,11,11, - 11,11,11,11,12,12,12,12,11,12,11,12,12,12,12,12, - 12,12,11,12,12,12,12,11,11,11,11,11,11,12,12,12, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,13,12,12,12,13,13,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, - 13,13,12,12,12,12,12,12,12,12,12,13,12,12,12,13, - 13,12,13,13,13,13,12,13,13,13,13,12,12,12,12,12, - 12,12,12,13,13,12,12,12,13,13,12,13,13,13,13,12, - 13,13,13,13,11,11,11,11,11,11,12,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,12,12,12,13,13,11,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,13,13,12,12,12,13,13,12, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,12,13, - 13,13,13,12,13,13,13,13,12,12,12,12,12,12,12,12, - 13,13,12,12,12,13,12,12,13,13,13,13,12,13,13,13, - 13, 7,10,10,11,11,10,10,11,11,11,10,11,11,11,11, - 10,11,11,11,11,10,11,11,11,11,10,10,10,11,11,10, - 11,11,11,11,11,11,11,11,12,11,11,11,12,12,11,11, - 11,12,12,10,11,11,11,11,11,11,11,12,11,11,11,11, - 12,11,11,11,11,12,12,11,11,11,12,12,11,11,11,11, - 11,11,11,11,12,12,11,11,12,12,12,11,12,12,12,12, - 11,12,12,12,12,11,11,11,11,11,11,12,12,12,12,11, - 11,12,12,12,11,12,12,12,12,11,12,12,12,12,10,11, - 11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11, - 12,12,11,11,11,12,12,11,11,11,11,11,11,11,12,12, - 12,11,11,11,12,12,11,12,12,12,12,11,12,12,12,12, - 11,11,11,11,11,11,12,11,12,12,11,11,11,12,12,11, - 12,12,12,12,11,12,12,12,12,11,11,11,11,12,11,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,11,11,12,12,11,12,12,12,12,11,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,10,11,10,11,11, - 11,11,11,12,12,11,11,11,12,12,11,12,12,12,12,11, - 12,12,12,12,10,11,11,12,11,11,11,12,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,11,11,11, - 12,11,11,12,12,12,12,11,12,11,12,12,12,12,12,12, - 12,12,12,12,12,12,11,12,11,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,13,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,12,12,13,12,11,11,11,12,12,12,12,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,13,13,12,12,12,13,13,11,12,12,12,12,12, - 12,12,12,13,12,12,12,12,12,12,12,13,13,13,12,13, - 12,13,13,12,12,12,12,12,12,12,12,13,13,12,12,12, - 13,13,12,13,13,13,13,12,13,13,13,13,12,12,12,12, - 12,12,12,12,13,13,12,13,12,13,13,12,13,13,13,13, - 12,13,13,13,13,11,11,11,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,11,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,12,13,12, - 13,13,12,13,13,13,13,11,12,12,12,12,12,12,12,13, - 13,12,12,12,13,12,12,13,13,13,13,12,13,13,13,13, - 12,12,12,12,12,12,12,13,13,13,12,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,12,12,12,12,12,12,13, - 13,13,13,12,12,12,13,13,13,13,13,13,13,13,13,13, - 13,13, 7,10,10,11,11,10,11,11,11,11,10,11,11,11, - 11,10,11,11,11,11,10,11,11,11,11,10,11,11,11,11, - 11,11,11,11,11,11,11,11,12,11,11,11,12,12,12,11, - 11,11,12,12,10,10,10,11,11,11,11,11,12,11,10,11, - 11,11,11,11,11,11,12,12,11,11,11,12,12,11,11,11, - 11,11,11,11,12,12,12,11,12,11,12,12,11,12,12,12, - 12,11,12,12,12,12,11,11,11,11,11,11,11,11,12,12, - 11,12,11,12,12,11,12,12,12,12,11,12,12,12,12,10, - 10,10,11,11,11,11,11,12,12,11,11,11,12,12,11,12, - 12,12,12,11,12,12,12,12,11,11,11,11,11,11,11,12, - 12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,11,11,11,11,11,11,12,12,12,12,11,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,13,12,12, - 12,13,12,11,11,11,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,10,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12, - 11,11,11,12,12,11,11,11,11,11,11,11,12,12,12,11, - 12,11,12,12,11,12,12,12,12,11,12,12,12,12,11,11, - 11,11,11,11,11,11,12,12,11,11,11,12,12,11,12,12, - 12,12,11,12,12,12,12,11,11,11,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 11,11,11,12,11,11,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,11,11,11,12,12,11,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, - 13,12,11,12,12,12,12,12,12,12,12,13,12,12,12,13, - 13,12,13,13,13,13,12,13,13,13,13,11,12,12,12,12, - 12,12,12,12,13,12,12,12,12,12,12,13,13,13,13,12, - 13,13,13,13,12,12,12,12,12,12,12,13,13,13,12,13, - 12,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12, - 12,12,12,13,13,13,13,12,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,11,11,11,12,12,11,12,12,12,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 12,13,13,12,12,12,13,13,11,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,13,12,13,12,13, - 13,12,12,12,12,12,12,12,12,13,13,12,12,12,13,13, - 13,13,13,13,13,12,13,13,13,13,12,12,12,12,12,12, - 13,12,13,13,12,13,12,13,12,12,13,13,13,13,12,13, - 13,13,13, 8,11,11,12,12,11,12,12,12,12,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,11,11,11,12, - 12,11,12,12,12,12,12,12,12,12,12,12,12,12,13,13, - 12,12,12,13,13,11,11,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,13,13,12,12,12,13,13,11,12, - 12,12,12,12,12,12,12,13,12,12,12,12,12,12,12,13, - 13,13,12,12,13,13,13,11,12,12,12,12,12,12,12,13, - 12,12,12,12,13,13,12,13,13,13,13,12,13,13,13,13, - 11,11,11,12,12,11,12,12,12,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,13,13,12,12,12, - 13,13,11,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,12,13,13,12,13,12,13,13,12,12,12,12,12, - 12,12,12,12,13,12,12,12,13,13,12,13,13,13,13,12, - 13,13,13,13,12,12,12,12,12,12,12,12,13,13,12,12, - 12,13,13,12,13,13,13,13,12,13,13,13,13,11,11,11, - 12,12,11,12,12,12,12,11,12,12,12,12,12,12,12,13, - 12,12,12,12,12,13,11,12,12,12,12,12,12,12,12,13, - 12,12,12,12,13,12,13,13,13,13,12,13,13,13,13,11, - 12,12,12,12,12,12,12,12,13,12,12,12,13,12,12,13, - 13,13,13,12,13,13,13,13,12,12,12,12,12,12,12,12, - 13,13,12,12,13,13,13,12,13,13,13,13,12,13,13,13, - 13,12,12,12,12,12,12,13,13,13,13,12,13,12,13,13, - 12,13,13,13,13,13,13,13,13,13,11,11,11,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,13,13,13,12,13,13,13,13,11,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13, - 12,13,12,13,13,12,12,12,12,12,12,12,12,13,13,12, - 12,12,13,13,12,13,13,13,13,12,13,13,13,13,12,12, - 12,12,12,12,13,12,13,13,12,12,12,13,13,13,13,13, - 13,13,12,13,13,13,13,11,11,11,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,12,12,12,13,12, - 11,12,12,12,12,12,12,12,12,12,12,12,12,13,13,12, - 12,13,13,13,12,13,13,13,13,11,12,12,12,12,12,12, - 12,12,13,12,12,12,13,12,12,13,13,13,13,12,13,13, - 13,13,12,12,12,12,12,12,12,12,13,13,12,12,12,13, - 13,13,13,13,13,13,13,13,13,13,13,12,12,12,12,12, - 12,13,13,13,13,12,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13, 8,11,11,11,11,11,12,12,12,12,11,12, - 12,12,12,12,12,12,12,12,11,12,12,12,12,11,11,11, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,12,12,12,13,13,11,11,11,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,13,13,12,12,12,13,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,13,13,12,13, - 13,13,13,12,13,13,13,13,11,12,12,12,12,12,12,12, - 12,13,12,12,12,13,12,12,13,13,13,13,12,13,12,13, - 13,11,11,11,12,12,12,12,12,12,12,11,12,12,12,12, - 12,12,12,13,13,12,12,12,13,12,11,12,12,12,12,12, - 12,12,12,12,12,12,12,13,13,12,12,13,13,13,12,13, - 13,13,13,11,12,12,12,12,12,12,12,13,13,12,12,12, - 12,12,12,13,13,13,13,12,13,13,13,13,12,12,12,12, - 12,12,12,13,13,13,12,12,13,13,13,13,13,13,13,13, - 12,13,13,13,13,12,12,12,12,12,12,13,12,13,13,12, - 12,12,13,13,13,13,13,13,13,12,13,13,13,13,11,11, - 11,12,12,11,12,12,12,12,11,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,11,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,13,12,13,13,12,12,12,13,13, - 11,12,12,12,12,12,12,12,12,13,12,12,12,12,12,12, - 12,12,13,13,12,13,12,13,13,12,12,12,12,12,12,12, - 12,13,12,12,12,12,13,13,12,13,13,13,13,12,13,13, - 13,13,12,12,12,12,12,12,12,12,13,13,12,12,12,13, - 12,12,13,13,13,13,12,13,13,13,13,11,11,11,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,13,13,11,12,12,12,12,12,12,12,12,13,12,12, - 12,12,12,12,13,13,13,13,12,13,13,13,13,11,12,12, - 12,12,12,12,12,12,13,12,12,12,12,12,12,13,13,13, - 13,12,13,13,13,13,12,12,12,12,12,12,12,12,13,13, - 12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,12, - 12,12,12,12,12,13,13,13,13,12,12,12,13,12,13,13, - 13,13,13,12,13,13,13,13,11,11,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 13,11,12,12,12,12,12,12,12,12,12,12,12,12,13,12, - 12,12,12,13,13,12,13,13,13,13,11,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,13,13,13,13,12,13, - 12,13,13,12,12,12,12,12,12,12,13,13,13,12,13,12, - 13,13,12,13,13,13,13,13,13,13,13,13,12,12,12,12, - 12,12,12,12,12,13,12,12,12,13,13,13,13,13,13,13, - 12,13,13,13,13, -}; - -static const static_codebook _44p9_p4_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p9_p4_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44p9_p4_1, - 0 -}; - -static const long _vq_quantlist__44p9_p5_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p9_p5_0[] = { - 4, 6, 6, 9, 9, 6, 7, 8,10,11, 6, 8, 7,10,10, 8, - 10,10,12,12, 8,10,10,12,12, 6, 7, 8,10,10, 7, 8, - 9,10,11, 8, 9, 9,11,11,10,10,11,12,13,10,11,11, - 13,13, 6, 8, 7,10,10, 8, 9, 9,11,11, 7, 9, 8,11, - 10,10,11,11,13,13,10,11,10,13,12, 9,10,10,11,12, - 10,10,11,12,13,10,11,11,12,13,12,12,13,12,14,12, - 13,13,14,14, 9,10,10,12,11,10,11,11,13,12,10,11, - 10,13,12,12,13,13,14,14,12,13,12,14,12, 7, 8, 8, - 10,11, 8, 9,10,11,12, 8, 9, 9,11,12,10,11,12,13, - 14,10,11,11,13,13, 8, 9,10,11,12, 9,10,11,12,13, - 10,10,11,12,12,11,12,12,13,14,11,12,12,14,14, 8, - 9, 9,11,12,10,10,11,12,13, 9,10,10,12,12,11,12, - 12,14,14,11,12,12,14,13,11,11,12,12,13,11,12,12, - 13,14,12,12,13,14,14,13,13,14,14,16,13,14,14,15, - 15,11,12,11,13,13,12,12,12,14,14,11,12,12,14,13, - 13,14,14,15,15,13,14,13,15,14, 7, 8, 8,11,10, 8, - 10, 9,12,11, 8,10, 9,12,11,10,11,11,13,13,10,12, - 11,14,13, 8, 9, 9,12,11, 9,10,10,12,12,10,11,10, - 13,12,11,12,12,13,14,11,12,12,14,14, 8,10, 9,12, - 11,10,11,10,12,12, 9,11,10,13,11,11,12,12,14,14, - 11,12,12,14,13,11,11,12,13,13,11,12,12,13,14,12, - 12,12,14,14,13,13,14,14,15,13,14,14,15,15,11,12, - 11,13,12,12,12,12,14,14,11,12,12,14,13,13,14,14, - 15,15,13,14,13,15,14,10,11,11,12,13,11,12,12,13, - 14,11,12,12,13,14,13,13,14,14,16,13,14,14,15,15, - 11,12,12,12,14,12,12,13,13,15,12,13,13,13,15,14, - 14,15,15,16,14,14,15,15,16,11,12,12,13,14,12,13, - 13,14,15,12,13,13,14,14,14,14,15,15,16,14,14,14, - 15,15,13,14,14,14,15,14,14,15,15,16,14,15,15,15, - 16,15,15,16,16,18,16,16,16,17,17,13,14,14,15,15, - 14,14,15,16,16,14,14,14,16,15,16,16,16,17,17,15, - 16,16,17,16,10,11,11,13,12,11,12,12,14,13,11,12, - 12,14,13,13,14,14,15,15,13,14,13,16,14,11,12,12, - 14,13,12,13,13,14,14,12,13,13,15,14,14,14,14,15, - 15,14,15,14,16,15,11,12,12,14,12,12,13,13,15,14, - 12,13,12,15,13,14,15,14,16,15,14,15,14,16,15,13, - 14,14,15,15,14,14,14,15,16,14,15,14,16,16,15,16, - 16,16,17,16,16,16,17,17,13,14,14,15,14,14,15,15, - 16,15,14,15,14,16,15,16,16,16,17,17,15,16,15,18, - 16, 6, 8, 8,11,11, 8, 9,10,11,12, 8,10, 9,12,12, - 10,11,11,13,13,10,12,11,14,13, 8, 9, 9,11,12, 9, - 10,10,12,12, 9,10,10,12,12,11,11,12,13,14,11,12, - 12,14,14, 8,10, 9,12,11,10,11,11,12,12, 9,11,10, - 13,12,11,12,12,14,14,11,12,12,14,13,10,11,11,13, - 13,11,12,12,13,14,11,12,12,14,14,13,13,14,13,15, - 13,14,14,15,15,11,12,11,13,13,12,12,12,14,14,11, - 12,12,14,13,13,14,14,15,15,13,14,13,15,14, 8, 9, - 9,11,11, 9,10,10,12,12, 9,10,10,12,12,11,12,12, - 13,14,11,12,12,14,14, 9, 9,10,11,12,10,10,11,12, - 13,10,10,11,12,13,12,12,13,13,15,12,12,13,14,14, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, - 13,13,14,15,12,13,12,14,14,11,11,12,12,14,12,12, - 13,13,14,12,12,13,13,14,13,13,14,14,16,14,14,14, - 15,15,11,12,12,14,13,12,13,13,14,14,12,13,13,15, - 14,14,14,14,16,16,13,14,14,16,14, 7, 9, 9,12,11, - 9,10,10,12,12, 9,11,10,13,12,11,12,12,13,14,11, - 13,12,14,13, 9,10,10,12,12,10,10,11,12,13,10,12, - 11,13,13,12,12,13,13,14,12,13,13,15,14, 9,10,10, - 12,12,11,11,11,13,13,10,12,10,13,12,12,13,13,14, - 15,12,13,12,15,13,11,12,12,14,13,12,12,13,13,14, - 12,13,13,15,14,13,13,14,13,16,14,15,14,16,15,12, - 12,12,14,14,13,13,13,14,14,12,13,12,14,13,14,15, - 15,16,16,13,14,13,16,13,10,11,12,13,14,11,12,13, - 13,15,12,12,13,14,14,13,14,14,15,16,13,14,14,16, - 15,12,12,13,12,14,12,12,13,13,15,13,13,13,13,15, - 14,14,15,14,16,14,15,15,15,16,12,13,12,14,14,13, - 13,13,15,15,12,13,13,15,15,14,15,15,16,16,14,15, - 15,16,16,13,14,14,13,16,14,14,15,14,16,14,14,15, - 14,16,15,15,16,15,18,16,16,16,16,17,14,14,14,16, - 15,14,15,15,16,16,14,15,15,16,16,16,16,16,17,17, - 15,16,16,17,16,10,12,11,14,13,12,13,13,14,14,12, - 13,12,15,14,14,14,14,15,15,14,15,14,16,15,12,13, - 12,14,13,12,13,13,15,14,13,14,13,15,14,14,15,15, - 16,16,14,15,15,17,15,12,13,12,14,14,13,14,14,15, - 15,13,14,13,15,14,15,15,15,16,16,14,15,15,17,15, - 14,14,14,16,15,14,15,15,16,16,14,15,15,16,15,16, - 16,16,16,17,16,17,16,18,17,14,14,14,16,15,15,15, - 15,16,16,14,15,14,16,15,16,16,17,17,17,15,16,15, - 17,16, 6, 8, 8,11,11, 8, 9,10,12,12, 8,10, 9,12, - 11,10,11,12,13,13,10,11,11,13,13, 8, 9,10,11,12, - 9,10,11,12,13,10,11,11,12,12,11,12,12,13,14,11, - 12,12,14,14, 8, 9, 9,12,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,12,14,14,11,12,11,14,13,11,11,12, - 13,13,11,12,12,13,14,12,12,12,14,14,13,13,14,14, - 15,13,14,14,15,15,10,11,11,13,13,11,12,12,14,14, - 11,12,12,14,13,13,14,14,15,15,13,14,13,15,13, 7, - 9, 9,11,12, 9,10,11,12,13, 9,10,10,12,12,11,12, - 13,13,14,11,12,12,14,14, 9,10,10,12,12,10,10,11, - 12,13,11,12,11,13,13,12,12,13,13,15,12,13,13,15, - 14, 9,10,10,12,12,10,11,12,13,13,10,11,10,13,12, - 12,13,13,14,15,12,13,12,14,13,12,12,12,14,14,12, - 12,13,13,14,13,13,13,15,14,14,13,14,13,16,14,15, - 15,16,16,11,12,12,13,14,12,13,13,14,15,12,13,12, - 14,13,14,14,15,15,16,13,14,13,15,13, 8, 9, 9,11, - 11, 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,14, - 11,12,11,14,13, 9,10,10,12,12,10,11,11,13,13,10, - 11,11,13,13,12,12,13,14,15,12,13,13,15,14, 9,10, - 9,12,11,10,11,10,13,12,10,11,10,13,12,12,13,12, - 14,14,12,13,12,15,13,11,12,12,13,14,12,13,13,14, - 14,12,13,13,14,14,14,14,14,14,16,14,14,14,16,15, - 11,12,11,14,12,12,13,12,15,13,12,13,12,15,13,14, - 14,14,16,15,13,14,13,16,14,10,11,12,13,14,12,12, - 13,13,15,12,13,13,14,14,14,14,15,15,16,14,14,14, - 15,16,12,12,13,14,14,12,13,14,14,15,13,14,14,15, - 15,14,15,15,15,17,15,15,15,16,16,12,12,13,13,14, - 13,13,14,14,15,12,13,13,14,15,15,15,15,15,17,14, - 15,15,15,15,14,14,14,16,16,14,15,15,15,16,15,15, - 15,16,16,16,15,16,16,18,16,16,17,17,17,14,14,14, - 15,16,15,15,15,16,17,14,15,14,16,16,16,16,17,17, - 18,16,16,15,17,16,10,12,11,14,13,12,12,12,14,14, - 11,13,12,14,13,13,14,14,15,15,13,14,13,16,15,12, - 12,13,14,14,12,13,13,15,15,13,13,13,15,15,14,15, - 15,16,16,14,15,15,17,16,12,13,12,14,12,13,13,13, - 15,13,12,13,12,15,13,14,15,15,16,15,14,15,14,16, - 14,14,14,14,16,16,14,15,15,16,16,14,15,15,16,16, - 15,16,16,16,17,16,17,16,18,17,13,14,14,16,13,14, - 15,15,16,14,14,15,14,16,14,16,16,16,17,16,15,16, - 15,18,15, 9,11,11,13,13,11,12,12,14,14,11,12,12, - 14,14,13,14,14,15,15,13,14,14,15,15,11,12,12,14, - 14,11,12,13,14,15,12,13,13,15,14,13,14,14,15,16, - 13,14,14,16,16,11,12,12,14,14,12,13,13,15,15,12, - 13,13,15,14,14,14,14,16,16,14,15,14,16,15,12,13, - 13,14,15,12,13,14,15,16,13,14,14,16,16,14,14,15, - 16,17,15,15,15,17,17,13,14,14,15,15,14,15,14,16, - 16,14,15,14,16,15,15,16,16,17,17,15,16,15,17,16, - 10,12,12,13,14,11,12,13,14,14,12,13,12,14,14,13, - 14,14,15,16,13,14,14,16,15,11,12,12,14,14,12,12, - 13,14,15,12,13,13,15,15,13,13,15,15,17,14,14,15, - 16,16,12,13,12,14,14,12,13,13,15,15,12,13,13,15, - 14,14,15,15,16,16,14,15,14,16,16,13,12,14,13,16, - 13,13,15,14,16,14,13,15,15,16,14,14,16,15,17,15, - 15,16,16,17,13,14,14,16,15,14,15,15,16,16,14,15, - 14,16,15,16,16,16,17,17,15,16,16,18,16,10,12,12, - 14,14,12,12,13,14,14,12,13,12,15,14,13,14,14,15, - 16,14,15,14,16,15,11,12,12,14,14,12,13,13,14,15, - 13,14,13,15,15,14,14,15,15,16,14,15,15,17,16,12, - 13,13,14,14,13,13,14,15,15,12,14,13,15,15,14,15, - 15,16,16,14,15,15,17,15,13,14,13,15,15,13,14,14, - 15,16,14,15,14,17,16,15,15,15,15,17,16,16,16,18, - 17,14,14,14,16,16,15,15,15,16,16,14,15,14,16,16, - 16,16,17,17,17,16,16,16,17,16,11,12,13,14,14,12, - 13,13,15,15,12,13,13,15,15,14,15,15,16,16,14,15, - 15,17,16,12,13,13,14,15,13,13,14,14,16,13,14,14, - 15,16,15,14,16,15,17,15,15,16,16,17,12,13,13,15, - 15,13,14,14,16,16,13,14,14,16,15,15,15,16,17,17, - 15,16,15,17,16,14,14,15,13,16,15,14,16,14,17,15, - 15,16,14,17,16,15,17,15,18,16,16,17,16,18,14,15, - 15,17,16,15,16,16,17,17,15,16,15,17,16,16,17,17, - 18,18,16,17,15,18,16,11,12,12,14,14,13,13,14,14, - 15,13,14,13,16,14,15,15,15,16,16,15,16,15,17,16, - 12,13,13,15,14,13,13,14,15,15,14,15,14,16,15,15, - 15,16,15,16,16,16,16,18,16,12,13,13,15,15,14,14, - 15,15,16,13,14,13,16,15,16,16,16,17,17,15,16,15, - 17,15,14,15,14,16,15,14,15,15,16,16,15,16,15,17, - 16,16,15,16,15,17,17,18,17,18,17,15,15,15,16,16, - 16,16,16,17,17,14,15,15,17,16,17,17,18,18,18,16, - 17,15,18,15, 9,11,11,13,13,11,12,12,14,14,11,12, - 12,14,14,13,14,14,15,16,13,14,14,15,15,11,12,12, - 14,14,12,13,13,14,15,12,13,13,14,14,14,14,15,15, - 16,14,14,14,16,16,11,12,12,14,14,12,13,13,14,15, - 11,13,12,14,14,13,14,14,16,16,13,14,14,16,15,13, - 14,14,15,15,14,14,15,15,16,14,15,14,16,16,15,15, - 16,16,17,15,16,16,17,17,12,13,13,15,15,13,14,14, - 16,15,12,14,13,16,15,15,16,15,17,17,14,15,15,17, - 15,10,12,12,14,14,12,12,13,14,15,12,13,12,14,14, - 14,14,15,15,16,13,14,14,16,16,12,13,13,14,14,13, - 13,14,14,15,13,14,13,15,15,14,15,15,15,17,14,15, - 15,16,16,11,12,12,14,14,13,13,14,15,15,12,13,13, - 15,14,14,15,15,16,17,14,15,14,16,15,14,14,14,16, - 16,14,15,15,16,16,15,15,15,16,16,15,16,16,16,18, - 16,17,16,18,17,13,13,14,15,15,14,14,15,16,16,13, - 14,14,16,15,16,16,17,17,17,15,15,15,17,15,10,12, - 12,14,13,12,12,13,14,14,11,13,12,14,14,13,14,14, - 16,16,13,14,14,16,15,12,12,13,14,14,12,13,13,14, - 15,13,13,13,15,15,14,14,15,16,16,14,15,15,16,16, - 11,12,12,14,14,12,13,13,15,15,12,13,12,15,14,14, - 15,14,16,16,13,15,13,16,15,13,14,14,15,16,14,15, - 15,15,17,14,15,15,16,16,16,15,16,16,17,16,16,16, - 17,17,13,14,12,16,13,14,15,13,16,15,13,15,13,16, - 14,15,16,15,17,16,15,16,14,17,15,11,12,12,14,15, - 13,13,14,14,16,13,14,13,15,14,15,15,16,16,17,15, - 15,15,16,16,12,13,13,15,15,13,13,14,15,16,14,15, - 14,16,15,15,15,16,15,17,16,16,16,17,17,12,13,13, - 14,15,14,14,15,15,16,13,14,13,15,15,16,16,16,17, - 17,15,16,15,16,15,15,15,15,16,16,14,15,15,16,17, - 16,16,16,17,17,16,15,17,15,18,17,18,17,18,18,14, - 14,15,15,17,15,15,16,16,17,14,15,15,16,16,17,17, - 17,17,18,16,16,15,17,15,11,12,12,14,14,12,13,13, - 15,15,12,13,13,15,15,14,15,15,16,16,14,15,14,17, - 16,13,13,13,15,15,13,14,14,15,16,13,14,14,16,16, - 15,15,16,16,17,15,16,16,17,17,12,13,13,15,14,13, - 14,14,16,15,13,14,13,16,14,15,16,16,17,16,15,16, - 14,17,15,14,15,15,16,17,15,15,16,16,17,15,16,16, - 17,17,16,15,17,16,18,16,17,17,18,18,14,15,14,16, - 13,15,16,15,17,14,15,16,14,17,14,16,17,16,18,16, - 16,17,15,18,15, -}; - -static const static_codebook _44p9_p5_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p9_p5_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44p9_p5_0, - 0 -}; - -static const long _vq_quantlist__44p9_p5_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44p9_p5_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44p9_p5_1 = { - 1, 7, - (long *)_vq_lengthlist__44p9_p5_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44p9_p5_1, - 0 -}; - -static const long _vq_quantlist__44p9_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p9_p6_0[] = { - 2, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 8, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 8, 5, 7, 8, 8, 9, - 10, 8, 9,10, 8, 9,10,10,10,12,10,11,11, 8,10,10, - 10,11,12,10,11,10, 5, 8, 7, 8,10,10, 8,10, 9, 8, - 10,10,10,10,11,10,12,11, 8,10, 9,10,11,11,10,12, - 10, 5, 8, 8, 7, 9,10, 8,10, 9, 7, 9,10, 9,10,11, - 9,11,11, 8,10, 9,10,11,11, 9,11,10, 7, 9, 9, 9, - 10,11, 9,11,11, 9, 9,11,10,10,13,11,12,12, 9,11, - 11,11,12,13,11,13,11, 7, 9, 9, 9,10,11, 9,11,10, - 9,11,10,10,10,12,11,13,12, 9,11,11,11,12,12,10, - 12,10, 5, 8, 8, 8, 9,10, 7,10, 9, 8, 9,10, 9,10, - 11,10,11,11, 7,10, 9, 9,11,11, 9,11,10, 7, 9, 9, - 9,10,11, 9,11,10, 9,11,11,10,10,12,11,12,12, 9, - 10,11,11,12,13,10,12,10, 7, 9, 9, 9,11,11, 9,11, - 10, 9,11,11,11,11,13,11,13,12, 9,11, 9,11,12,12, - 10,13,10, -}; - -static const static_codebook _44p9_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44p9_p6_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44p9_p6_0, - 0 -}; - -static const long _vq_quantlist__44p9_p6_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44p9_p6_1[] = { - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 8, 7, - 8, 8, 7, 8, 7, 7, 8, 8, 7, 8, 8, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, - 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 8, 8, - 8, 8, 9, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 9, 9, 8, - 9, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 8, 9, 9, 8, - 8, 8, 8, 8, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 8, 9, 9, 8, 8, 8, 8, 9, 8, - 8, 9, 8, -}; - -static const static_codebook _44p9_p6_1 = { - 5, 243, - (long *)_vq_lengthlist__44p9_p6_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44p9_p6_1, - 0 -}; - -static const long _vq_quantlist__44p9_p7_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p9_p7_0[] = { - 1,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13, -}; - -static const static_codebook _44p9_p7_0 = { - 5, 3125, - (long *)_vq_lengthlist__44p9_p7_0, - 1, -510105088, 1635281408, 3, 0, - (long *)_vq_quantlist__44p9_p7_0, - 0 -}; - -static const long _vq_quantlist__44p9_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44p9_p7_1[] = { - 1, 4, 4,16,16, 4, 9,11,15,16, 4,12, 8,16,16,12, - 16,16,16,16,13,16,16,16,16, 5, 8,10,16,16, 9, 9, - 14,15,16,12,14,14,16,16,16,16,16,16,16,16,16,16, - 16,16, 5,11, 8,16,15,12,14,16,16,16, 9,15, 9,16, - 16,16,16,16,16,16,16,16,16,16,16,15,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16, 6,11,11, - 16,16,12,13,16,16,16,12,16,14,16,16,16,16,16,16, - 16,16,16,16,16,16,11,15,15,16,16,14,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,12, - 15,16,16,16,16,16,16,16,16,14,16,15,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16, 5,11,11,16,16,12, - 15,16,16,16,12,16,14,16,16,16,16,16,16,16,16,16, - 16,16,16,12,15,15,16,16,14,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,11,15,15,16, - 16,16,16,16,16,16,15,16,14,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16, 6,11,12,16,16,11,15,16,16,16,13,16,14,16,16, - 16,16,16,16,16,16,16,16,16,16,11,16,14,16,16,14, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,12,14,14,16,16,16,16,16,16,16,15,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,15,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16, 8,13, - 15,16,16,15,15,16,16,16,14,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,14,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16, 7,12,12,16,16, - 13,12,16,16,16,14,16,14,16,16,16,16,16,16,16,16, - 16,16,16,16,13,16,16,16,16,14,14,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,12,14,16, - 16,16,16,16,16,16,16,14,16,14,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16, 6,11,11,16,16,13,15,16,16,16,11,15,14,16, - 16,16,16,16,16,16,14,16,16,16,16,11,16,16,16,16, - 16,16,16,16,16,15,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,11,16,14,16,16,14,16,16,16,16,13,15, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, 7, - 11,11,16,16,13,13,16,16,16,13,16,13,16,16,16,16, - 16,16,16,16,16,16,16,16,12,16,15,16,16,14,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,12,14,16,16,16,16,16,16,16,16,14,16,13,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16, 8,13,14,16, - 16,15,16,16,16,16,14,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,15,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,16, - 15,16,16,16,16,16,16,16,16,16,15,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,15,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16, -}; - -static const static_codebook _44p9_p7_1 = { - 5, 3125, - (long *)_vq_lengthlist__44p9_p7_1, - 1, -514619392, 1630767104, 3, 0, - (long *)_vq_quantlist__44p9_p7_1, - 0 -}; - -static const long _vq_quantlist__44p9_p7_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p9_p7_2[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9,10,10,10,11,11,11, - 12,12,12,13,13,13,13,13,13, -}; - -static const static_codebook _44p9_p7_2 = { - 1, 25, - (long *)_vq_lengthlist__44p9_p7_2, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44p9_p7_2, - 0 -}; - -static const long _vq_quantlist__44p9_p7_3[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44p9_p7_3[] = { - 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44p9_p7_3 = { - 1, 25, - (long *)_vq_lengthlist__44p9_p7_3, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44p9_p7_3, - 0 -}; - -static const long _huff_lengthlist__44p9_short[] = { - 3, 3, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _huff_book__44p9_short = { - 1, 8, - (long *)_huff_lengthlist__44p9_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44pn1_l0_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44pn1_l0_0[] = { - 1, 3, 3, 8, 8,10,10,10,10,10,10,10,10, 5, 7, 5, - 9, 8,10,10,10,10,11,10,11,10, 5, 5, 7, 8, 9,10, - 10,11,10,10,11,10,11,10,10,10,11,11,11,11,11,11, - 11,10,11,11,10,10,10,10,11,11,11,11,11,10,11,11, - 11,11,11,11,11,11,12,11,10,11,11,11,11,11,11,11, - 11,11,11,11,11,10,10,11,11,12,11,11,11,11,11,11, - 12,11,11,11,10,11,11,11,11,11,11,11,11,10,11,11, - 10,11,10,11,11,11,11,11,11,11,11,11,11,12,11,11, - 12,12,11,11,11,11,11,11,11,11,11,11,11,11,12,11, - 10,11,11,11,11,11,11,11,12,11,13,11,11,11,11,11, - 11,11,11,11,11,11,12,11,13, -}; - -static const static_codebook _44pn1_l0_0 = { - 2, 169, - (long *)_vq_lengthlist__44pn1_l0_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44pn1_l0_0, - 0 -}; - -static const long _vq_quantlist__44pn1_l0_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44pn1_l0_1[] = { - 1, 4, 4, 7, 7, 4, 5, 6, 7, 7, 4, 6, 5, 7, 7, 7, - 6, 7, 6, 7, 7, 7, 6, 7, 6, -}; - -static const static_codebook _44pn1_l0_1 = { - 2, 25, - (long *)_vq_lengthlist__44pn1_l0_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44pn1_l0_1, - 0 -}; - -static const long _vq_quantlist__44pn1_l1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44pn1_l1_0[] = { - 1, 4, 4, 4, 4, 4, 4, 4, 4, -}; - -static const static_codebook _44pn1_l1_0 = { - 2, 9, - (long *)_vq_lengthlist__44pn1_l1_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44pn1_l1_0, - 0 -}; - -static const long _huff_lengthlist__44pn1_lfe[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book__44pn1_lfe = { - 2, 4, - (long *)_huff_lengthlist__44pn1_lfe, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44pn1_long[] = { - 2, 3, 6, 7, 9,13,17, 3, 2, 5, 7, 9,13,17, 6, 5, - 5, 6, 9,12,16, 7, 7, 6, 6, 7,10,13,10,10, 9, 7, - 6,10,13,13,13,12,10,10,11,15,17,17,17,14,14,15, - 17, -}; - -static const static_codebook _huff_book__44pn1_long = { - 2, 49, - (long *)_huff_lengthlist__44pn1_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44pn1_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44pn1_p1_0[] = { - 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44pn1_p1_0 = { - 5, 243, - (long *)_vq_lengthlist__44pn1_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44pn1_p1_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44pn1_p2_0[] = { - 1, 5, 5, 0, 7, 7, 0, 8, 8, 0, 9, 9, 0,12,12, 0, - 8, 8, 0, 9, 9, 0,13,13, 0, 8, 8, 0, 6, 6, 0,11, - 11, 0,12,12, 0,12,12, 0,14,14, 0,11,12, 0,12,12, - 0,15,15, 0,12,12, 0, 5, 5, 0, 5, 5, 0, 6, 6, 0, - 7, 7, 0,10,10, 0, 6, 6, 0, 7, 7, 0,11,11, 0, 6, - 6, 0, 7, 7, 0,11,11, 0,12,11, 0,11,11, 0,14,14, - 0,10,10, 0,12,12, 0,15,15, 0,12,12, 0, 6, 6, 0, - 12,12, 0,12,12, 0,12,12, 0,14,14, 0,11,11, 0,12, - 12, 0,16,16, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 8, 8, 0,12,12, 0,12,12, 0,12,12, 0,15, - 15, 0,12,12, 0,11,11, 0,16,16, 0,11,11, 0, 6, 6, - 0,12,12, 0,12,12, 0,13,13, 0,15,15, 0,12,12, 0, - 13,13, 0,15,15, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44pn1_p2_0 = { - 5, 243, - (long *)_vq_lengthlist__44pn1_p2_0, - 1, -533200896, 1614282752, 2, 0, - (long *)_vq_quantlist__44pn1_p2_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p2_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44pn1_p2_1[] = { - 1, 3, 3, 0, 9, 9, 0, 9, 9, 0,10,10, 0, 9, 9, 0, - 10,10, 0,10,10, 0,10,10, 0,10,10, 0, 7, 7, 0, 7, - 7, 0, 6, 6, 0, 8, 8, 0, 7, 7, 0, 8, 8, 0, 8, 8, - 0, 7, 7, 0, 8, 8, 0, 7, 7, 0, 9, 9, 0, 8, 9, 0, - 10,10, 0, 9, 9, 0,10,10, 0,10,11, 0, 9, 9, 0,10, - 10, 0, 9, 9, 0,11,11, 0,12,12, 0,12,12, 0,11,11, - 0,12,12, 0,13,13, 0,12,12, 0,13,13, 0, 8, 8, 0, - 12,12, 0,12,12, 0,13,13, 0,13,13, 0,13,13, 0,13, - 13, 0,13,13, 0,13,13, 0, 7, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 0,11,11, 0,12,12, 0,13,13, 0,12, - 12, 0,13,13, 0,13,13, 0,12,12, 0,12,12, 0, 9, 9, - 0,12,12, 0,13,13, 0,14,14, 0,13,13, 0,14,14, 0, - 14,14, 0,13,13, 0,14,14, 0, 7, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -}; - -static const static_codebook _44pn1_p2_1 = { - 5, 243, - (long *)_vq_lengthlist__44pn1_p2_1, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44pn1_p2_1, - 0 -}; - -static const long _vq_quantlist__44pn1_p3_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44pn1_p3_0[] = { - 1, 6, 6, 6, 8, 8, 6, 8, 8, 7, 9, 9,10,11,11, 8, - 8, 8, 7, 9, 9,11,12,12, 9, 9, 9, 6, 7, 7,10,11, - 11,10,11,11,10,11,11,13,13,13,12,12,12,10,12,11, - 14,14,14,12,12,12, 6, 5, 5, 9, 6, 6, 9, 6, 6, 9, - 7, 7,12,10,10,11, 7, 6, 9, 7, 7,13,11,11,12, 7, - 7, 7, 8, 8,12,10,10,12,10,10,11,10,10,15,13,13, - 13, 9, 9,12,11,11,15,14,14,15,11,11, 8, 7, 7,12, - 11,11,12,11,11,11,11,11,14,13,14,14,12,12,12,11, - 11,16,15,15,14,12,12, 0,10,10, 0,12,12, 0,12,12, - 0,11,11, 0,14,14, 0,11,11, 0,11,11, 0,15,15, 0, - 11,11, 7, 8, 8,13,11,11,12,10,10,12,11,11,15,13, - 13,14,11,11,12,10,10,16,14,14,15,10,10, 9, 7, 7, - 13,11,12,13,12,11,12,11,11,15,14,14,14,12,12,13, - 12,12,16,15,15,15,12,12, 0,11,11, 0,12,12, 0,12, - 13, 0,12,12, 0,15,15, 0,12,12, 0,12,12, 0,16,15, - 0,12,12, -}; - -static const static_codebook _44pn1_p3_0 = { - 5, 243, - (long *)_vq_lengthlist__44pn1_p3_0, - 1, -531365888, 1616117760, 2, 0, - (long *)_vq_quantlist__44pn1_p3_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p3_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44pn1_p3_1[] = { - 2, 3, 4, 9, 9,10,12,12,12,11,10,12,12,13,12,11, - 13,12,11,11,11,12,12,12,11,11,13,13,13,13,11,12, - 12,14,14,12,13,13,13,13,11,13,13,13,13,11,13,13, - 13,13,11,13,13,13,13,11,12,12,14,14,12,13,13,12, - 12,11,13,13,13,13,11,13,13,12,12,11,13,13,13,13, - 12,12,13,14,14,12,13,13,12,12,11,13,13,13,13,11, - 13,13,12,12,11,13,13,13,13,12,13,13,14,14,12,13, - 13,12,12,11,13,13,13,13,11,13,13,12,12,11,10,10, - 10,10,12,10,10,11,11,12, 9, 9,11,11,13,11,11,10, - 10,13,10,10,10,10,13,11,11,12,12,13,10,10,12,12, - 14,12,11,12,12,13,11,11,11,12,13,12,12,12,12,13, - 11,11,12,12,13,10,10,12,12,14,11,11,12,12,13,11, - 11,12,12,13,11,11,12,12,14,12,12,12,12,14,10,10, - 11,11,14,12,11,11,11,13,11,11,11,11,13,12,12,11, - 11,14,12,12,12,11,14,10,10,11,11,14,12,11,11,11, - 13,11,11,11,11,13,12,12,11,11,11,11,11,10,10,12, - 10,11, 9, 9,12,12,12,11,11,13,12,12, 9, 9,13,13, - 13,10,10,13,13,13,12,12,13,13,13,14,14,13,12,12, - 11,11,14,13,13,12,12,14,13,13,11,11,13,13,13,12, - 11,13,13,13,14,14,13,12,12,10,10,14,13,13,11,11, - 13,13,13,10,10,13,13,13,11,11,14,13,13,14,14,14, - 12,12,10,10,13,13,13,11,11,13,13,13,10,10,13,13, - 13,11,11,14,13,13,14,14,14,13,13,10,10,13,13,13, - 11,11,13,13,13,10,10,14,12,12, 8, 8,14,12,12, 9, - 9,14,11,11, 9, 9,14,12,12, 8, 8,14,12,12, 7, 7, - 15,13,13,10,10,15,12,12,10,10,15,13,13,10,10,15, - 12,13, 9, 9,15,13,13,10,10,15,13,13,10,10,15,12, - 12,10,10,15,13,13,10,10,15,13,13, 9, 9,15,13,13, - 10,10,15,13,13,10,10,15,12,12,10,10,15,13,13, 9, - 9,14,13,12, 9, 9,14,13,13, 9, 9,15,13,13,10,10, - 15,12,12,10,10,15,13,13, 9, 9,15,13,13, 9, 9,14, - 13,13, 9, 9,14,12,12, 8, 8,13,13,13, 8, 8,14,14, - 13, 9, 9,14,14,13, 7, 7,14,14,14, 8, 8,14,14,14, - 10,10,15,14,14,12,12,14,14,14, 9, 9,15,14,14,10, - 10,14,14,14, 9, 9,14,14,14,10, 9,15,14,14,12,12, - 14,14,14, 9, 9,15,14,14,10,10,14,14,14, 9, 9,15, - 14,15, 9, 9,15,14,14,11,11,14,14,14, 8, 8,14,14, - 14, 9, 9,14,14,14, 8, 8,14,15,14,10,10,15,14,14, - 11,11,14,14,14, 8, 8,15,14,14, 9, 9,14,14,14, 8, - 8,12,12,12,13,13,16,16,15,12,12,17,16,16,13,13, - 17,16,16,11,11,17,16,16,12,12,17,16,17,13,13,17, - 16,16,14,14,17,17,16,12,12,18,16,16,13,13,17,16, - 17,12,12,17,17,17,13,13,18,16,16,14,14,18,17,17, - 12,12,17,17,17,13,13,18,17,17,13,13,17,17,17,13, - 13,17,16,16,14,14,17,17,17,12,12,16,16,17,13,13, - 17,17,16,12,12,18,17,17,13,13,18,16,16,14,14,18, - 17,17,12,12,19,16,17,13,13,17,16,17,12,12,13,14, - 14,10,10,16,14,14,13,13,17,15,15,14,14,17,14,14, - 13,13,16,14,14,13,13,17,16,15,14,14,16,16,16,15, - 15,17,15,15,14,14,17,15,15,14,14,17,15,15,14,14, - 17,16,15,14,14,16,16,16,15,15,18,15,15,13,13,16, - 16,15,14,14,17,15,15,14,13,17,15,15,14,14,16,16, - 16,15,15,18,15,14,13,13,17,15,15,14,14,18,14,15, - 13,13,18,15,15,14,14,16,16,16,15,15,17,15,15,13, - 13,17,15,15,14,14,17,15,15,13,13,13,11,11,10,10, - 16,14,14,13,13,17,14,15,14,14,17,15,15,12,12,17, - 14,14,12,12,16,15,15,14,14,16,14,14,14,14,16,15, - 15,14,14,16,15,15,14,14,16,15,15,14,14,16,15,15, - 14,14,16,15,14,15,15,17,15,15,14,14,17,15,15,14, - 14,17,15,15,14,14,17,15,16,14,14,16,14,14,14,14, - 17,15,15,13,13,17,15,15,13,13,16,15,15,13,13,17, - 16,16,14,14,17,15,14,15,14,17,15,15,13,13,17,15, - 15,13,13,17,15,15,13,13,14,14,14, 9, 9,14,14,14, - 18,19,14,15,15,19,18,14,14,14,19,19,15,14,14,19, - 19,15,16,16,19,19,15,16,16,19,19,15,15,15,19,19, - 15,16,16,19,20,15,15,15,19,19,15,15,15,19,19,15, - 16,16,20,20,15,15,15,18,19,15,15,16,19,20,15,15, - 15,19,18,15,15,15,18,18,15,16,16,21,20,15,15,15, - 19,19,15,15,15,19,19,15,15,14,19,20,15,15,15,20, - 19,15,16,16,19,20,15,15,15,19,19,15,15,15,20,21, - 15,14,15,19,19,14,12,12, 9, 9,14,14,15,21,19,14, - 14,14,18,19,14,15,15,19,20,14,14,14,19,19,15,15, - 15,19,20,15,15,14,21,19,15,15,15,20,19,15,14,15, - 20,21,15,15,15,18,18,15,15,15,20,21,16,14,14,18, - 19,15,15,15,20,19,15,15,15,18,21,15,15,15,19,19, - 15,15,15,19,20,16,15,14,20,19,15,16,15,19,19,15, - 15,15,19, 0,14,15,15,19,19,15,15,15,19,19,15,15, - 14,20,19,15,15,15,20,19,15,15,15,19,19,15,15,15, - 20,19,12,12,12,13,13,16,15,16,11,11,16,16,16,12, - 12,17,16,16,11,11,17,16,16,12,11,17,17,17,13,13, - 18,16,16,14,14,18,18,17,13,13,17,16,16,13,13,17, - 17,17,13,13,17,16,17,12,12,17,15,16,13,13,17,16, - 17,12,12,17,16,16,13,12,17,16,16,12,12,18,17,17, - 13,13,18,16,16,13,14,18,17,17,12,12,17,16,16,12, - 12,17,17,17,12,12,18,17,17,13,13,17,16,16,14,14, - 17,17,17,12,12,17,16,16,12,12,18,17,17,12,12,13, - 14,14, 9, 9,16,14,14,13,13,16,15,15,14,14,16,14, - 14,13,13,16,14,14,13,13,17,16,15,15,15,16,15,16, - 16,15,17,15,15,14,14,17,15,15,15,15,17,15,15,14, - 14,17,15,15,14,14,16,15,16,16,16,17,15,15,14,14, - 16,15,15,14,15,16,15,15,14,14,17,15,15,15,15,16, - 16,16,15,16,18,15,14,13,14,17,15,15,14,14,17,14, - 14,13,13,17,15,15,14,14,16,15,15,15,15,17,15,14, - 14,14,17,15,15,14,14,17,14,14,13,13,13,11,11,11, - 11,16,14,14,12,12,16,14,14,13,13,16,14,14,12,12, - 16,14,14,12,12,16,15,15,13,13,17,14,14,14,14,17, - 15,15,13,13,16,15,15,14,13,16,15,15,13,13,16,15, - 15,13,13,16,14,14,14,14,16,15,15,13,13,16,14,15, - 13,13,17,15,15,13,13,17,15,15,13,13,16,14,14,14, - 14,17,15,15,12,12,17,14,15,13,13,17,15,15,12,12, - 16,15,15,13,13,17,14,14,14,14,17,15,15,12,12,17, - 15,15,13,13,16,15,15,12,12,14,15,15, 8, 8,14,14, - 14,19,18,14,15,15,19,20,14,14,14,19,19,14,14,15, - 19,20,15,16,15,19,21,15,16,16,21,19,15,15,15,20, - 19,15,16,16,19,20,15,15,15,19,18,15,16,15,20,19, - 15,16,16,19,20,15,15,15,19,19,15,16,15,20,20,14, - 15,15,19,19,15,15,15,21,19,15,17,16,19,20,15,14, - 15, 0,21,15,15,15,19,20,14,14,14,19,19,15,15,15, - 20,19,15,16,16,19,19,15,15,15,19,18,15,15,15,20, - 19,14,14,15,18,18,14,12,12, 9, 9,14,14,14,18,18, - 14,14,14,18,18,14,15,14,19,18,14,14,14,19,18,15, - 15,15,19,20,15,14,14,18,18,15,15,15,20,19,15,15, - 15,18,20,15,15,15,19,18,15,15,15,19,19,15,14,14, - 19,21,15,15,15,20,20,15,15,15,18,19,14,15,15,19, - 20,15,15,15,20,19,15,14,14,19,21,15,15,15,18,19, - 15,14,15,20,19,14,15,15,21,21,14,15,15,19,20,15, - 14,14,19,20,15,15,15,19,20,15,15,14,20,20,14,15, - 15,20,19,13,12,12,13,13,17,16,16,11,11,17,16,16, - 12,12,18,17,16,11,11,18,16,16,11,11,17,17,17,13, - 13,18,16,16,13,13,18,17,17,12,12,18,16,16,13,13, - 18,17,17,12,12,18,17,17,13,13,18,16,16,14,14,18, - 16,17,12,12,18,17,17,13,13,17,17,17,12,12,17,17, - 17,12,12,17,16,15,13,13,18,16,16,11,11,17,16,16, - 12,12,17,16,17,11,11,18,17,17,13,12,17,16,16,13, - 13,17,17,17,12,12,17,16,17,12,12,18,17,17,11,11, - 14,14,14, 9, 9,16,14,14,13,13,17,15,15,14,14,17, - 14,14,13,13,16,14,14,13,13,17,15,15,14,14,16,16, - 16,16,15,18,15,15,14,14,17,16,15,15,15,17,15,15, - 14,14,17,15,15,14,15,16,16,16,15,16,18,15,15,14, - 14,17,15,15,14,15,17,15,15,14,14,17,15,15,14,14, - 16,16,16,15,16,17,14,14,13,13,17,15,15,14,14,18, - 15,15,13,13,17,15,15,14,14,16,16,16,15,15,17,14, - 14,13,13,17,15,15,14,14,17,14,14,13,13,13,11,11, - 11,11,16,14,14,12,12,16,14,14,12,13,17,15,14,11, - 11,17,14,14,11,11,17,15,15,13,14,17,14,14,14,14, - 17,15,15,13,13,17,14,14,13,13,17,15,15,13,13,17, - 15,15,13,13,17,14,14,14,14,17,15,15,13,13,18,14, - 15,13,13,17,15,15,13,13,16,15,15,13,13,17,14,14, - 13,13,17,15,15,12,12,16,14,14,12,12,16,15,15,12, - 12,17,16,15,13,13,17,14,14,13,13,17,15,15,12,12, - 16,15,15,12,12,16,15,15,12,12,13,15,15, 8, 8,14, - 14,14,18,19,14,15,15,19,20,14,14,14,18,18,14,15, - 15,18,18,15,16,16,19,19,15,16,17,20,20,15,15,15, - 19,19,15,16,16,18,20,15,15,15,19,19,15,15,16,18, - 18,15,17,16,19,19,15,15,15,18,21,15,16,16,21,20, - 15,15,15,19,21,15,16,15,20,19,15,16,17,20,20,15, - 15,15,19,19,15,16,16,21,20,15,15,15,19,20,15,15, - 15,19,19,15,16,16,20,19,15,15,15,19,19,15,16,15, - 20,21,15,15,15,21,19,14,12,12, 8, 8,14,14,14,20, - 18,14,13,13,19,19,14,14,14,19,18,15,14,14,19,20, - 14,15,15,20,20,15,14,14,21,20,15,15,15,20,20,15, - 15,14,21,19,15,15,15,19,19,15,15,15,19,20,15,14, - 14,20,20,15,15,15,19,20,15,14,14,19,20,15,15,15, - 20,20,15,15,15,20,19,15,14,14,20,21,15,15,15,20, - 21,15,14,14,20, 0,15,16,15,20,21,15,15,15,19,20, - 15,14,14,19,19,15,15,15,19,20,15,15,15,19,19,15, - 15,15,18,20,13,12,12,13,13,18,16,17,12,12,17,16, - 16,12,12,17,17,16,11,11,18,16,16,11,11,17,17,18, - 13,13,18,16,16,14,14,18,17,17,13,13,18,16,16,13, - 13,18,17,17,12,12,17,17,16,13,13,17,16,16,13,14, - 18,17,17,12,12,18,16,16,12,13,17,16,17,12,12,17, - 18,17,13,13,18,16,16,13,13,18,17,17,12,12,17,16, - 16,12,12,17,17,17,11,11,17,16,17,12,12,17,16,16, - 13,13,17,16,16,11,11,17,16,16,12,12,18,16,17,11, - 11,14,14,14, 9, 9,16,14,15,13,13,17,15,15,14,14, - 17,14,14,12,12,16,14,14,13,13,18,15,15,15,15,17, - 15,16,15,16,18,15,15,14,14,17,15,16,15,15,17,15, - 15,14,14,18,15,15,14,14,16,16,16,16,15,17,15,15, - 14,14,16,15,15,14,14,17,15,15,14,14,17,15,15,14, - 14,17,16,16,15,15,17,15,14,13,13,17,15,15,14,14, - 17,15,15,13,13,17,15,15,14,14,16,16,16,15,15,18, - 15,14,14,14,17,15,15,14,14,18,15,15,13,13,13,12, - 12,11,11,16,14,14,12,12,16,14,14,13,13,17,15,15, - 12,12,17,14,14,12,12,17,15,15,14,14,17,14,14,14, - 14,17,15,15,13,13,17,15,14,13,13,17,15,15,13,13, - 17,15,15,13,13,16,14,14,14,14,17,15,15,13,13,16, - 14,14,13,13,16,15,15,13,13,17,15,16,13,13,17,14, - 14,14,13,17,15,15,12,12,16,15,14,12,12,17,15,15, - 12,12,16,15,16,13,13,16,14,14,14,13,17,15,15,12, - 12,16,14,14,12,12,17,15,15,12,12,14,15,15, 8, 8, - 14,14,14,18,18,14,15,15,19,18,14,14,14,18,18,14, - 15,15,19,20,15,16,15,21,18,15,16,16,18, 0,15,15, - 15,19,20,15,16,16,20, 0,15,16,15,19,18,15,15,15, - 19,19,15,16,16,21,19,15,15,15,19,19,15,16,16,20, - 20,15,15,15,19,19,15,15,15,19,18,15,16,16,20,20, - 15,14,15,20,19,15,15,15,19,20,15,15,15,19,19,15, - 16,15,19,20,15,16,16,19,20,15,15,15,19,19,15,16, - 15,20,20,15,15,15,20,18,13,12,12, 8, 8,14,14,14, - 19,20,14,14,14,19,19,14,15,15,20,20,14,14,14,18, - 19,15,15,15,20, 0,15,14,14,18,20,15,15,15,19,19, - 15,15,15,21,19,15,15,15,19,20,15,15,15,20,21,15, - 14,14,20,19,15,15,15,20,19,15,15,14,21,19,15,15, - 15,19,18,15,15,15,20,19,15,14,14,19,19,15,15,16, - 20,19,15,15,15,20, 0,15,15,15,19,21,15,15,15,22, - 20,15,14,14,22,19,15,15,15,19,20,15,14,14,20,19, - 14,15,15,19,21, -}; - -static const static_codebook _44pn1_p3_1 = { - 5, 3125, - (long *)_vq_lengthlist__44pn1_p3_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44pn1_p3_1, - 0 -}; - -static const long _vq_quantlist__44pn1_p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44pn1_p4_0[] = { - 1, 7, 7,14,14, 6, 8, 8,15,16, 7, 8, 8,16,15, 0, - 14,14,17,17, 0,14,14,16,16, 7, 9, 9,16,16,10,11, - 11,17,18, 9, 8, 8,16,16, 0,14,14,19,19, 0,14,14, - 17,16, 8, 9, 9,16,16,12,12,12,17,17,10, 9, 9,16, - 16, 0,15,14,18,20, 0,14,14,17,17, 0,15,15,18,17, - 0,21, 0, 0,21, 0,13,13,17,17, 0,17,17, 0, 0, 0, - 15,15,17,17, 0,15,15,17,18, 0, 0, 0, 0,21, 0,13, - 13,17,17, 0,18,18, 0,21, 0,16,15,17,18, 6, 7, 7, - 14,14, 9,10,10,16,16,11,10,10,15,15, 0,21, 0,20, - 21, 0, 0, 0,18,20,10,10,10,15,16,12,13,13,18,18, - 12,11,11,15,15, 0, 0, 0,20,20, 0, 0,21,19,19,12, - 11,11,15,15,15,14,14,18,18,13,11,11,15,16, 0, 0, - 0,20,19, 0, 0, 0,20,21, 0, 0,20,19,19, 0, 0, 0, - 0, 0, 0,20, 0,17,18, 0, 0,21, 0, 0, 0, 0, 0,21, - 0, 0,21, 0,20,19, 0, 0, 0, 0, 0, 0,21, 0,18,18, - 0, 0, 0,21, 0, 0, 0, 0, 0,20, 7, 6, 6,13,13, 9, - 6, 6,12,12, 9, 7, 7,14,14, 0,10,10,12,12, 0,11, - 11,15,15, 9, 7, 7,14,14,12, 9, 9,14,14,10, 7, 7, - 14,13, 0,11,11,16,15, 0,11,11,14,14, 9, 7, 7,14, - 14,13,10,10,14,14,11, 7, 7,14,13, 0,11,11,16,16, - 0,11,11,14,14, 0,12,12,16,16, 0,19, 0,17,18, 0, - 10,10,14,14, 0,15,14, 0, 0, 0,12,12,14,14, 0,12, - 12,15,15, 0,20, 0,18,19, 0,10,10,14,14, 0,16,15, - 0,20, 0,13,13,14,14, 0,11,11,13,13, 0,12,13,16, - 16, 0,12,12,16,16, 0,16,16, 0,21, 0,17,18, 0, 0, - 0,12,12,16,16, 0,15,15,18, 0, 0,12,12,16,16, 0, - 17,16,21,21, 0,16,17, 0, 0, 0,13,13,17,16, 0,16, - 16,20,21, 0,12,12,17,16, 0,17,17, 0,21, 0,17,17, - 21,21, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0,15,15, 0, - 0, 0,18,21, 0, 0, 0,18,19, 0, 0, 0,18,17,21,21, - 0, 0, 0, 0, 0, 0,16,16, 0, 0, 0, 0, 0, 0, 0, 0, - 19,19, 0, 0, 0,11,11,12,12, 0,11,11,10,10, 0,12, - 12,13,13, 0,12,12, 9, 9, 0,14,14,13,13, 0,12,12, - 13,13, 0,14,14,12,13, 0,11,11,12,12, 0,13,13,13, - 13, 0,13,13,13,13, 0,12,12,13,13, 0,14,14,12,12, - 0,11,11,12,12, 0,14,13,14,14, 0,13,13,13,13, 0, - 15,15,14,15, 0, 0, 0,16,16, 0,12,12,13,13, 0,16, - 17,20,21, 0,14,13,12,12, 0,14,14,14,14, 0,21, 0, - 16,16, 0,12,12,13,13, 0,18,17,21, 0, 0,14,14,13, - 13, 7, 8, 8,17,17,11,10,10,18,18,12,10,10,17,17, - 0,15,15,20,18, 0,15,15,17,17,11, 9, 9,17,17,14, - 12,12,19,19,13, 9, 9,16,16, 0,15,14, 0,19, 0,14, - 14,16,16,12,10,10,20,18,16,13,13,21,20,14,10,10, - 17,17, 0,15,15,21,20, 0,15,14,17,17, 0,15,15,21, - 21, 0, 0,21, 0, 0, 0,13,13,18,18, 0,19,16, 0, 0, - 0,15,15,17,16, 0,16,16, 0,21, 0, 0, 0, 0,21, 0, - 13,14,18,17, 0,20,19, 0, 0, 0,15,15,18,18, 8, 7, - 7,15,15,12,11,11,17,16,13,11,11,16,16, 0, 0, 0, - 21,20, 0, 0, 0, 0,20,11,10,10,17,17,14,13,13,19, - 18,14,11,11,16,16, 0,20, 0,21,19, 0, 0,21, 0,20, - 12,11,11,17,17,16,15,15, 0,19,14,11,11,17,16, 0, - 21, 0, 0,19, 0, 0, 0,21,20, 0, 0,21,20, 0, 0, 0, - 0, 0, 0, 0, 0, 0,19,21, 0, 0, 0, 0, 0, 0, 0, 0, - 19,20, 0, 0, 0,20,21, 0, 0, 0, 0, 0, 0,20, 0,19, - 21, 0, 0, 0, 0, 0, 0, 0, 0,21,20,11,10, 9,15,15, - 14,11,11,15,15,14,11,11,16,16, 0,14,14,14,14, 0, - 16,15,17,16,13,11,11,16,16,16,13,13,16,16,15,10, - 10,15,15, 0,14,15,17,17, 0,14,14,16,15,13,11,11, - 16,16,17,15,14,16,16,15,10,10,15,15, 0,15,15,17, - 18, 0,15,15,16,16, 0,16,16,17,17, 0,21, 0,21,20, - 0,13,13,15,15, 0,18,18, 0,21, 0,15,15,15,15, 0, - 16,16,17,17, 0, 0, 0, 0,18, 0,13,13,15,15, 0,19, - 18, 0, 0, 0,15,15,16,16, 0,12,12,15,15, 0,13,13, - 17,17, 0,13,13,17,18, 0,16,17,21, 0, 0,20,18, 0, - 0, 0,13,13,17,17, 0,15,15, 0,18, 0,12,12,17,18, - 0,16,16, 0, 0, 0,17,17,21, 0, 0,13,13,18,18, 0, - 16,16,21,21, 0,12,12,17,18, 0,16,17,21, 0, 0,17, - 17, 0,21, 0,17,18, 0, 0, 0, 0, 0, 0, 0, 0,16,15, - 0,21, 0,21,19, 0, 0, 0,18,18, 0, 0, 0,18,19, 0, - 0, 0, 0, 0, 0, 0, 0,16,16,21,21, 0,20,19, 0, 0, - 0,19,21, 0,21, 0,12,12,15,15, 0,12,12,15,16, 0, - 13,13,16,16, 0,14,14,15,15, 0,16,15,17,17, 0,13, - 13,17,17, 0,15,15,16,18, 0,12,12,16,16, 0,14,14, - 17,17, 0,15,14,16,16, 0,13,13,16,16, 0,16,15,17, - 17, 0,12,12,16,16, 0,15,15,18,18, 0,14,14,17,16, - 0,16,16,17,18, 0, 0, 0,20,21, 0,13,13,16,17, 0, - 17,17, 0, 0, 0,15,15,16,16, 0,15,16,17,17, 0, 0, - 0,19, 0, 0,13,13,15,16, 0,19,18, 0, 0, 0,16,15, - 16,17, 8, 8, 8,17,17,13,11,10,17,18,13,10,10,17, - 17, 0,15,15,20,19, 0,15,15,17,17,12,10,10,19,18, - 15,12,12,20,18,14,10,10,17,16, 0,15,15,20,20, 0, - 14,15,16,16,13,10,10,17,17,17,14,14, 0,18,15,10, - 10,17,17, 0,16,15,20,20, 0,14,14,17,17, 0,15,16, - 20,20, 0, 0,21, 0, 0, 0,13,13,17,17, 0,18,17, 0, - 0, 0,15,16,17,18, 0,15,15,18,21, 0, 0, 0,21, 0, - 0,13,13,18,18, 0,19,19, 0, 0, 0,16,16,18,17, 9, - 8, 8,15,15,12,11,11,16,16,13,11,11,16,15, 0, 0, - 0, 0,21, 0,21, 0,19,19,12,11,11,17,18,15,13,13, - 18,19,14,11,11,16,16, 0, 0,21,21,19, 0, 0, 0,21, - 20,13,11,11,18,17,17,14,15,20,21,15,11,12,16,16, - 0, 0, 0,20, 0, 0, 0,21, 0,19, 0, 0, 0, 0,19, 0, - 0, 0, 0, 0, 0,21,21,19,19, 0, 0, 0,21, 0, 0, 0, - 0,19,21, 0, 0, 0,19,20, 0, 0, 0,21, 0, 0, 0,21, - 19,19, 0, 0, 0, 0, 0, 0, 0, 0,21,20, 0,11,11,15, - 15, 0,12,12,15,16, 0,12,12,16,16, 0,15,15,16,15, - 0,16,16,17,17, 0,12,12,17,17, 0,14,14,17,17, 0, - 11,11,16,16, 0,15,15,19,18, 0,15,15,16,16, 0,12, - 12,17,16, 0,14,15,16,16, 0,11,11,15,15, 0,16,16, - 18,19, 0,15,15,15,16, 0,17,17,18,20, 0,21, 0,21, - 19, 0,14,14,16,16, 0,18,18, 0, 0, 0,16,16,15,15, - 0,16,16,18,17, 0, 0, 0,19,20, 0,14,14,16,16, 0, - 19,19, 0, 0, 0,16,17,15,15, 0,12,12,14,15, 0,13, - 13,16,17, 0,12,12,17,17, 0,17,16, 0, 0, 0,18,17, - 21, 0, 0,13,13,19,17, 0,15,15,20,21, 0,12,12,17, - 17, 0,17,17, 0, 0, 0,17,17, 0, 0, 0,13,13,17,18, - 0,16,16,21, 0, 0,12,12,17,17, 0,17,17, 0, 0, 0, - 17,17, 0, 0, 0,18,21, 0, 0, 0, 0, 0, 0, 0, 0,15, - 15,21, 0, 0,20,21, 0, 0, 0,18,19, 0, 0, 0,18,17, - 0, 0, 0, 0, 0, 0, 0, 0,16,16,21, 0, 0,21,21, 0, - 0, 0,18,19, 0, 0, 0,12,12,16,16, 0,13,13,16,17, - 0,13,13,17,16, 0,14,14,16,16, 0,16,15,19,18, 0, - 13,13,17,17, 0,15,15,18,18, 0,12,12,16,16, 0,15, - 15,18,19, 0,15,15,17,16, 0,13,13,17,17, 0,16,16, - 18,17, 0,12,12,17,16, 0,15,15,18,18, 0,15,15,17, - 17, 0,16,16, 0,19, 0, 0, 0, 0, 0, 0,14,14,16,17, - 0,18,18, 0, 0, 0,15,15,17,17, 0,16,16,21,19, 0, - 21, 0,21,21, 0,13,14,16,16, 0,19,19, 0, 0, 0,15, - 16,16,16, 0,11,11,17,16, 0,15,14,19,18, 0,14,14, - 19,19, 0,18,17,18,20, 0,17,17,18,19, 0,13,13,17, - 17, 0,16,17,21,18, 0,13,13,17,16, 0,18,17,19, 0, - 0,16,17,18,18, 0,12,12,19,18, 0,18,18,20,20, 0, - 13,13,17,17, 0,17,17,21, 0, 0,16,17,17,18, 0,18, - 17,19,18, 0, 0, 0, 0, 0, 0,14,14,17,17, 0,19,19, - 21, 0, 0,16,16,16,17, 0,17,17,19,20, 0, 0, 0, 0, - 21, 0,15,15,17,18, 0,21,21, 0, 0, 0,17,17,17,18, - 0,10,10,15,15, 0,15,14,17,18, 0,14,14,16,16, 0, - 0, 0,18, 0, 0,21, 0,19, 0, 0,13,13,17,16, 0,17, - 17,18, 0, 0,14,14,16,15, 0, 0, 0,21, 0, 0,21, 0, - 19,18, 0,13,13,17,17, 0,18,18,20,20, 0,15,15,16, - 16, 0, 0, 0,21,21, 0, 0, 0,20,20, 0, 0, 0,19, 0, - 0, 0, 0, 0, 0, 0,21,20,18,18, 0, 0, 0, 0, 0, 0, - 0, 0, 0,20, 0, 0, 0, 0,20, 0, 0, 0, 0, 0, 0, 0, - 0,19,18, 0, 0, 0, 0,21, 0, 0, 0,18,20, 0,18,19, - 16,17, 0,21,19,17,17, 0, 0,21,18,18, 0, 0,21,20, - 19, 0, 0, 0,20,20, 0, 0,21,17,17, 0, 0, 0,19,19, - 0,20,20,17,17, 0, 0, 0, 0,20, 0, 0,20,18,18, 0, - 21,20,17,17, 0, 0, 0,20,21, 0,19, 0,17,17, 0, 0, - 21, 0, 0, 0,20, 0,18,19, 0, 0, 0,21,21, 0, 0, 0, - 0,21, 0,20,20,17,17, 0, 0, 0, 0, 0, 0,21, 0,18, - 17, 0, 0, 0,20,19, 0, 0, 0, 0,21, 0,20,20,17,17, - 0, 0, 0, 0, 0, 0,21,21,18,18, 0,12,12,15,14, 0, - 14,14,17,17, 0,14,14,17,16, 0,18,18,21, 0, 0,19, - 20, 0, 0, 0,13,13,18,17, 0,16,16,19,18, 0,13,13, - 17,17, 0,17,17, 0, 0, 0,17,17,21, 0, 0,13,13,17, - 17, 0,17,17,21,20, 0,13,13,18,17, 0,18,19,21,21, - 0,19,18, 0, 0, 0,18,17, 0, 0, 0, 0, 0, 0, 0, 0, - 15,16, 0, 0, 0,21,21, 0, 0, 0,20,18,21, 0, 0,17, - 18, 0, 0, 0, 0, 0, 0, 0, 0,15,16, 0, 0, 0, 0,20, - 0, 0, 0, 0,19, 0, 0, 0,15,15,18,19, 0,18,17,21, - 0, 0,16,18, 0,20, 0,17,18,21, 0, 0,18,20, 0, 0, - 0,16,16,21,21, 0,19,20,21, 0, 0,16,15, 0,21, 0, - 18,20, 0, 0, 0,18,19, 0, 0, 0,16,15,21,21, 0,21, - 0, 0, 0, 0,16,15,21, 0, 0,20,19, 0, 0, 0,18,21, - 21, 0, 0,20,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, 0, - 20, 0,21, 0, 0, 0, 0,17,18,20,21, 0,18,18,21,21, - 0, 0, 0, 0, 0, 0,16,16,20, 0, 0, 0,21, 0, 0, 0, - 21,18, 0, 0, 0,12,12,20,17, 0,15,15,19,18, 0,14, - 14,19,18, 0,18,17,21,19, 0,17,17,21,17, 0,13,13, - 21,19, 0,16,17,20,19, 0,13,13,16,16, 0,17,17,20, - 21, 0,16,16,19,17, 0,13,13,18,18, 0,17,19,19,19, - 0,13,13,17,17, 0,18,18, 0,19, 0,16,17,18,18, 0, - 16,17,19,21, 0, 0, 0, 0, 0, 0,15,15,16,17, 0,20, - 19,21, 0, 0,17,17,17,17, 0,17,17,21,19, 0, 0, 0, - 0, 0, 0,15,15,17,17, 0,21, 0, 0, 0, 0,18,18,17, - 17, 0,10,10,15,15, 0,15,15,17,17, 0,15,14,16,16, - 0, 0, 0,21,19, 0,21,21,19,21, 0,13,13,17,16, 0, - 17,17,18,19, 0,14,15,16,15, 0, 0, 0,21,19, 0,21, - 21,18,19, 0,14,14,16,17, 0,18,18,18,19, 0,15,15, - 15,16, 0, 0,21, 0,21, 0, 0, 0,19,20, 0, 0, 0,21, - 19, 0, 0, 0, 0, 0, 0,21,21,19,17, 0, 0, 0, 0, 0, - 0, 0, 0,21,21, 0,21, 0, 0,21, 0, 0, 0, 0, 0, 0, - 21,21,19,18, 0, 0, 0, 0, 0, 0, 0, 0, 0,19, 0,21, - 18,18,17, 0,21, 0,20,20, 0, 0, 0,18,20, 0, 0,21, - 18,21, 0, 0, 0,21,18, 0, 0, 0, 0,19, 0, 0, 0,21, - 21, 0,20,21,17,19, 0,21, 0,21, 0, 0,21, 0,18,18, - 0,20,21,17,18, 0, 0, 0,21,19, 0,20,21,17,18, 0, - 0, 0,21,21, 0, 0, 0,20,19, 0, 0, 0,21,21, 0, 0, - 0, 0, 0, 0,21,21,19,18, 0, 0, 0, 0, 0, 0, 0,21, - 19,18, 0,21,21,19, 0, 0, 0, 0,21, 0, 0,21,21,18, - 17, 0, 0, 0, 0, 0, 0,21, 0,21,18, 0,12,12,14,14, - 0,15,14,17,17, 0,14,14,17,16, 0,19,17, 0, 0, 0, - 19,19, 0, 0, 0,13,13,17,17, 0,17,17,20,20, 0,13, - 13,18,18, 0,18,17, 0, 0, 0,18,21, 0, 0, 0,13,13, - 17,17, 0,18,18,21,20, 0,14,14,18,19, 0,19,18,21, - 0, 0,19,19, 0, 0, 0,20,18,20, 0, 0, 0, 0, 0, 0, - 0,15,16, 0, 0, 0,21,21, 0, 0, 0,19,19, 0, 0, 0, - 18,18, 0, 0, 0, 0, 0, 0, 0, 0,16,16, 0,21, 0, 0, - 0, 0, 0, 0,19,20, 0, 0, 0,15,15,20,21, 0,17,17, - 21,21, 0,17,17, 0, 0, 0,19,18, 0, 0, 0,18,19, 0, - 0, 0,17,16, 0,21, 0, 0,20, 0, 0, 0,16,16, 0,20, - 0,19,19, 0,21, 0,19,18, 0,21, 0,16,16, 0, 0, 0, - 21,21, 0, 0, 0,16,16, 0, 0, 0,21,21, 0, 0, 0,19, - 19, 0, 0, 0,20, 0, 0, 0, 0, 0, 0, 0, 0, 0,17,17, - 0,21, 0, 0,20, 0, 0, 0,20,18,21,21, 0,19,18, 0, - 20, 0, 0, 0, 0, 0, 0,16,17,21, 0, 0, 0,21, 0, 0, - 0,19,20,21,20, -}; - -static const static_codebook _44pn1_p4_0 = { - 5, 3125, - (long *)_vq_lengthlist__44pn1_p4_0, - 1, -528744448, 1616642048, 3, 0, - (long *)_vq_quantlist__44pn1_p4_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p4_1[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44pn1_p4_1[] = { - 2, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _44pn1_p4_1 = { - 1, 7, - (long *)_vq_lengthlist__44pn1_p4_1, - 1, -533200896, 1611661312, 3, 0, - (long *)_vq_quantlist__44pn1_p4_1, - 0 -}; - -static const long _vq_quantlist__44pn1_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44pn1_p5_0[] = { - 1, 7, 7, 6, 8, 8, 7, 8, 8, 7, 9, 9,11,11,11, 9, - 8, 8, 7, 9, 9,11,12,11, 9, 9, 9, 6, 7, 7,10,11, - 11,10,10,10,10,11,11,15,14,14,12,12,12,11,11,11, - 14,14,14,12,12,12, 5, 6, 6, 8, 5, 5, 8, 7, 7, 8, - 8, 8,12,10,10,10, 7, 7, 8, 7, 7,12,10,10,10, 7, - 7, 6, 7, 7,12,11,11,12,10,10,11,10,10,14,14,13, - 13,10,10,11,10,10,16,14,14,14,11,10, 7, 7, 7,13, - 12,12,12,12,11,11,11,11,15,14,17,13,12,12,12,11, - 11,15,15,15,14,13,13,10, 9, 9,14,12,11,13,11,11, - 12,11,11,16,15,14,14,11,11,12,11,11,17,14,14,15, - 11,11, 7, 8, 8,12,11,11,13,10,10,11,10,10,17,14, - 13,14,10,10,12,10,10,18,15,15,14,10,10, 8, 7, 7, - 13,12,12,13,11,11,12,11,11,16,14,15,14,12,12,12, - 11,11,18,16,16,14,12,12,11,10,10,13,12,11,13,11, - 11,13,12,12, 0,15,14,14,11,11,13,11,11,16,15,15, - 15,11,11, -}; - -static const static_codebook _44pn1_p5_0 = { - 5, 243, - (long *)_vq_lengthlist__44pn1_p5_0, - 1, -527106048, 1620377600, 2, 0, - (long *)_vq_quantlist__44pn1_p5_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p5_1[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44pn1_p5_1[] = { - 2, 6, 7, 6, 8, 8, 7, 7, 8, 7, 8, 8, 9, 9, 9, 8, - 7, 7, 8, 8, 8, 9, 9, 9, 9, 8, 8, 6, 6, 6, 9, 7, - 7, 9, 7, 7, 9, 8, 8,10, 8, 8,10, 8, 8,10, 8, 8, - 10, 9, 8,10, 8, 8, 7, 6, 6, 9, 6, 6, 9, 6, 6, 9, - 7, 7,10, 8, 8,10, 6, 6, 9, 7, 7,10, 8, 8,10, 6, - 6, 7, 7, 7,11, 9, 9,11, 9, 9,10, 9, 9,12,10,10, - 12, 8, 8,11, 9, 9,13, 9,10,12, 8, 8, 8, 7, 7,11, - 9,10,11,10,10,10, 9, 9,11,11,11,11, 9, 9,11,10, - 9,12,11,11,11, 9,10,10, 8, 8,11, 9,10,11, 9, 9, - 11, 9, 9,12,10,10,11, 9, 9,11, 9, 9,12,10,11,11, - 9, 9, 8, 8, 8,12, 9, 9,12, 9, 9,11, 9, 9,13, 9, - 9,13, 8, 8,12, 9, 9,13,10,10,12, 8, 8, 9, 7, 7, - 11,10,10,11,10,10,11,10,10,12,11,11,11,10, 9,11, - 10,10,11,11,11,11, 9, 9,11, 9, 9,12,10,10,11,10, - 10,12,10,10,11,11,11,11, 9, 9,11,10,10,12,11,11, - 11, 9, 9, -}; - -static const static_codebook _44pn1_p5_1 = { - 5, 243, - (long *)_vq_lengthlist__44pn1_p5_1, - 1, -530841600, 1616642048, 2, 0, - (long *)_vq_quantlist__44pn1_p5_1, - 0 -}; - -static const long _vq_quantlist__44pn1_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44pn1_p6_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, -}; - -static const static_codebook _44pn1_p6_0 = { - 5, 243, - (long *)_vq_lengthlist__44pn1_p6_0, - 1, -516716544, 1630767104, 2, 0, - (long *)_vq_quantlist__44pn1_p6_0, - 0 -}; - -static const long _vq_quantlist__44pn1_p6_1[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44pn1_p6_1[] = { - 1, 3, 2, 5, 4, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _44pn1_p6_1 = { - 1, 25, - (long *)_vq_lengthlist__44pn1_p6_1, - 1, -518864896, 1620639744, 5, 0, - (long *)_vq_quantlist__44pn1_p6_1, - 0 -}; - -static const long _vq_quantlist__44pn1_p6_2[] = { - 12, - 11, - 13, - 10, - 14, - 9, - 15, - 8, - 16, - 7, - 17, - 6, - 18, - 5, - 19, - 4, - 20, - 3, - 21, - 2, - 22, - 1, - 23, - 0, - 24, -}; - -static const long _vq_lengthlist__44pn1_p6_2[] = { - 3, 5, 4, 5, 4, 5, 4, 5, 5, 5, 4, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44pn1_p6_2 = { - 1, 25, - (long *)_vq_lengthlist__44pn1_p6_2, - 1, -529006592, 1611661312, 5, 0, - (long *)_vq_quantlist__44pn1_p6_2, - 0 -}; - -static const long _huff_lengthlist__44pn1_short[] = { - 4, 3, 7, 9,12,16,16, 3, 2, 5, 7,11,14,15, 7, 4, - 5, 6, 9,12,15, 8, 5, 5, 5, 8,10,14, 9, 7, 6, 6, - 8,10,12,12,10,10, 7, 6, 8,10,15,12,10, 6, 4, 7, - 9, -}; - -static const static_codebook _huff_book__44pn1_short = { - 2, 49, - (long *)_huff_lengthlist__44pn1_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h deleted file mode 100755 index e13b06a..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/coupled/res_books_stereo.h +++ /dev/null @@ -1,15782 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: static codebooks autogenerated by huff/huffbuld - last modified: $Id: res_books_stereo.h 17025 2010-03-25 04:56:56Z xiphmont $ - - ********************************************************************/ - -#include "../../codebook.h" - -static const long _vq_quantlist__16c0_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16c0_s_p1_0[] = { - 1, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, - 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, - 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, 0, - 0, 0, 0, 9, 9,12, 0, 0, 0, 0, 0, 0,10,12,11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, - 0, 0, 0, 0, 9,12,10, 0, 0, 0, 0, 0, 0,10,11,12, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, - 0, 0, 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,12,11, 0, - 0, 0, 0, 0, 0, 9,10,12, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,11,12, - 0, 0, 0, 0, 0, 0, 9,12, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c0_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__16c0_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16c0_s_p1_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16c0_s_p3_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 7, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 6, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c0_s_p3_0 = { - 4, 625, - (long *)_vq_lengthlist__16c0_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c0_s_p3_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__16c0_s_p4_0[] = { - 1, 3, 2, 7, 8, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c0_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__16c0_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16c0_s_p4_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__16c0_s_p5_0[] = { - 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, - 8, 8, 0, 0, 0, 7, 7, 7, 7, 8, 8, 0, 0, 0, 7, 7, - 8, 8, 9, 9, 0, 0, 0, 7, 7, 8, 8, 9, 9, 0, 0, 0, - 8, 9, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _16c0_s_p5_0 = { - 2, 81, - (long *)_vq_lengthlist__16c0_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16c0_s_p5_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__16c0_s_p6_0[] = { - 1, 3, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,11, - 11,11, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11, - 11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, - 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, - 10,11,11,12,12,12,13, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0,10,10,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,11,12,12,13,13,13,14, 0, 0, 0, 0, 0, - 10,10,10,11,11,11,12,12,13,13,13,14, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,13,13,14,14, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,13,13,13,13,14,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,12,13,13,14,15,14, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,14,14,15, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,14,13,14, - 14, -}; - -static const static_codebook _16c0_s_p6_0 = { - 2, 289, - (long *)_vq_lengthlist__16c0_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__16c0_s_p6_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16c0_s_p7_0[] = { - 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,11,10,10,11, - 11,10, 4, 7, 7,10,10,10,11,10,10, 6,10,10,11,11, - 11,11,11,10, 6, 9, 9,11,12,12,11, 9, 9, 6, 9,10, - 11,12,12,11, 9,10, 7,11,11,11,11,11,12,13,12, 6, - 9,10,11,10,10,12,13,13, 6,10, 9,11,10,10,11,12, - 13, -}; - -static const static_codebook _16c0_s_p7_0 = { - 4, 81, - (long *)_vq_lengthlist__16c0_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__16c0_s_p7_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__16c0_s_p7_1[] = { - 1, 3, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, - 8, 8, 8, 9, 9, 9,10,10,10, 6, 7, 8, 8, 8, 8, 9, - 8,10,10,10, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, 7, - 7, 8, 8, 9, 9, 8, 9,10,10,10, 8, 8, 9, 9, 9, 9, - 9, 9,11,11,11, 8, 8, 9, 9, 9, 9, 9,10,10,11,11, - 9, 9, 9, 9, 9, 9, 9,10,11,11,11,10,11, 9, 9, 9, - 9,10, 9,11,11,11,10,11,10,10, 9, 9,10,10,11,11, - 11,11,11, 9, 9, 9, 9,10,10, -}; - -static const static_codebook _16c0_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__16c0_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16c0_s_p7_1, - 0 -}; - -static const long _vq_quantlist__16c0_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__16c0_s_p8_0[] = { - 1, 4, 4, 7, 7, 7, 7, 7, 6, 8, 8,10,10, 6, 5, 6, - 8, 8, 8, 8, 8, 8, 8, 9,10,10, 7, 6, 6, 8, 8, 8, - 8, 8, 8, 8, 8,10,10, 0, 8, 8, 8, 8, 9, 8, 9, 9, - 9,10,10,10, 0, 9, 8, 8, 8, 9, 9, 8, 8, 9, 9,10, - 10, 0,12,11, 8, 8, 9, 9, 9, 9,10,10,11,10, 0,12, - 13, 8, 8, 9,10, 9, 9,11,11,11,12, 0, 0, 0, 8, 8, - 8, 8,10, 9,12,13,12,14, 0, 0, 0, 8, 8, 8, 9,10, - 10,12,12,13,14, 0, 0, 0,13,13, 9, 9,11,11, 0, 0, - 14, 0, 0, 0, 0,14,14,10,10,12,11,12,14,14,14, 0, - 0, 0, 0, 0,11,11,13,13,14,13,14,14, 0, 0, 0, 0, - 0,12,13,13,12,13,14,14,14, -}; - -static const static_codebook _16c0_s_p8_0 = { - 2, 169, - (long *)_vq_lengthlist__16c0_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__16c0_s_p8_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16c0_s_p8_1[] = { - 1, 4, 3, 5, 5, 7, 7, 7, 6, 6, 7, 7, 7, 5, 5, 7, - 7, 7, 6, 6, 7, 7, 7, 6, 6, -}; - -static const static_codebook _16c0_s_p8_1 = { - 2, 25, - (long *)_vq_lengthlist__16c0_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c0_s_p8_1, - 0 -}; - -static const long _vq_quantlist__16c0_s_p9_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16c0_s_p9_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _16c0_s_p9_0 = { - 4, 81, - (long *)_vq_lengthlist__16c0_s_p9_0, - 1, -518803456, 1628680192, 2, 0, - (long *)_vq_quantlist__16c0_s_p9_0, - 0 -}; - -static const long _vq_quantlist__16c0_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__16c0_s_p9_1[] = { - 1, 5, 5, 5, 5, 9,11,11,10,10,10,10,10,10,10, 7, - 6, 6, 6, 6,10,10,10,10,10,10,10,10,10,10, 7, 6, - 6, 6, 6,10, 9,10,10,10,10,10,10,10,10,10, 7, 7, - 8, 9,10,10,10,10,10,10,10,10,10,10,10, 8, 7,10, - 10,10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _16c0_s_p9_1 = { - 2, 225, - (long *)_vq_lengthlist__16c0_s_p9_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__16c0_s_p9_1, - 0 -}; - -static const long _vq_quantlist__16c0_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__16c0_s_p9_2[] = { - 1, 5, 5, 7, 8, 8, 7, 9, 9, 9,12,12,11,12,12,10, - 10,11,12,12,12,11,12,12, 8, 9, 8, 7, 9,10,10,11, - 11,10,11,12,10,12,10,12,12,12,11,12,11, 9, 8, 8, - 9,10, 9, 8, 9,10,12,12,11,11,12,11,10,11,12,11, - 12,12, 8, 9, 9, 9,10,11,12,11,12,11,11,11,11,12, - 12,11,11,12,12,11,11, 9, 9, 8, 9, 9,11, 9, 9,10, - 9,11,11,11,11,12,11,11,10,12,12,12, 9,12,11,10, - 11,11,11,11,12,12,12,11,11,11,12,10,12,12,12,10, - 10, 9,10, 9,10,10, 9, 9, 9,10,10,12,10,11,11, 9, - 11,11,10,11,11,11,10,10,10, 9, 9,10,10, 9, 9,10, - 11,11,10,11,10,11,10,11,11,10,11,11,11,10, 9,10, - 10, 9,10, 9, 9,11, 9, 9,11,10,10,11,11,10,10,11, - 10,11, 8, 9,11,11,10, 9,10,11,11,10,11,11,10,10, - 10,11,10, 9,10,10,11, 9,10,10, 9,11,10,10,10,10, - 11,10,11,11, 9,11,10,11,10,10,11,11,10,10,10, 9, - 10,10,11,11,11, 9,10,10,10,10,10,11,10,10,10, 9, - 10,10,11,10,10,10,10,10, 9,10,11,10,10,10,10,11, - 11,11,10,10,10,10,10,11,10,11,10,11,10,10,10, 9, - 11,11,10,10,10,11,11,10,10,10,10,10,10,10,10,11, - 11, 9,10,10,10,11,10,11,10,10,10,11, 9,10,11,10, - 11,10,10, 9,10,10,10,11,10,11,10,10,10,10,10,11, - 11,10,11,11,10,10,11,11,10, 9, 9,10,10,10,10,10, - 9,11, 9,10,10,10,11,11,10,10,10,10,11,11,11,10, - 9, 9,10,10,11,10,10,10,10,10,11,11,11,10,10,10, - 11,11,11, 9,10,10,10,10, 9,10, 9,10,11,10,11,10, - 10,11,11,10,11,11,11,11,11,10,11,10,10,10, 9,11, - 11,10,11,11,11,11,11,11,11,11,11,10,11,10,10,10, - 10,11,10,10,11, 9,10,10,10, -}; - -static const static_codebook _16c0_s_p9_2 = { - 2, 441, - (long *)_vq_lengthlist__16c0_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__16c0_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__16c0_s_single[] = { - 3, 4,19, 7, 9, 7, 8,11, 9,12, 4, 1,19, 6, 7, 7, - 8,10,11,13,18,18,18,18,18,18,18,18,18,18, 8, 6, - 18, 8, 9, 9,11,12,14,18, 9, 6,18, 9, 7, 8, 9,11, - 12,18, 7, 6,18, 8, 7, 7, 7, 9,11,17, 8, 8,18, 9, - 7, 6, 6, 8,11,17,10,10,18,12, 9, 8, 7, 9,12,18, - 13,15,18,15,13,11,10,11,15,18,14,18,18,18,18,18, - 16,16,18,18, -}; - -static const static_codebook _huff_book__16c0_s_single = { - 2, 100, - (long *)_huff_lengthlist__16c0_s_single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__16c1_s_long[] = { - 2, 5,20, 7,10, 7, 8,10,11,11, 4, 2,20, 5, 8, 6, - 7, 9,10,10,20,20,20,20,19,19,19,19,19,19, 7, 5, - 19, 6,10, 7, 9,11,13,17,11, 8,19,10, 7, 7, 8,10, - 11,15, 7, 5,19, 7, 7, 5, 6, 9,11,16, 7, 6,19, 8, - 7, 6, 6, 7, 9,13, 9, 9,19,11, 9, 8, 6, 7, 8,13, - 12,14,19,16,13,10, 9, 8, 9,13,14,17,19,18,18,17, - 12,11,11,13, -}; - -static const static_codebook _huff_book__16c1_s_long = { - 2, 100, - (long *)_huff_lengthlist__16c1_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__16c1_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16c1_s_p1_0[] = { - 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, - 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 9,11,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,11, 9, 0, 0, 0, 0, 0, 0, 9,10,11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, - 0, 0, 0, 0, 0, 8, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,11, - 0, 0, 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c1_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__16c1_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16c1_s_p1_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16c1_s_p3_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c1_s_p3_0 = { - 4, 625, - (long *)_vq_lengthlist__16c1_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c1_s_p3_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__16c1_s_p4_0[] = { - 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c1_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__16c1_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16c1_s_p4_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__16c1_s_p5_0[] = { - 1, 3, 3, 5, 5, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, - 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 8, 8, - 8, 8, 9, 9, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, - 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _16c1_s_p5_0 = { - 2, 81, - (long *)_vq_lengthlist__16c1_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16c1_s_p5_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__16c1_s_p6_0[] = { - 1, 3, 3, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11,12, - 12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, - 12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, - 11,12,12, 0, 0, 0, 8, 8, 8, 9,10, 9,10,10,10,10, - 11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10,11, - 11,11,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, - 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, - 10,11,11,12,12,13,13, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,11,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,13,13,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, - 14, -}; - -static const static_codebook _16c1_s_p6_0 = { - 2, 289, - (long *)_vq_lengthlist__16c1_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__16c1_s_p6_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16c1_s_p7_0[] = { - 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9,10,10, - 10, 9, 4, 7, 7,10,10,10,11,10,10, 6,10,10,11,11, - 11,11,10,10, 6,10, 9,11,11,11,11,10,10, 6,10,10, - 11,11,11,11,10,10, 7,11,11,11,11,11,12,12,11, 6, - 10,10,11,10,10,11,11,11, 6,10,10,10,11,10,11,11, - 11, -}; - -static const static_codebook _16c1_s_p7_0 = { - 4, 81, - (long *)_vq_lengthlist__16c1_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__16c1_s_p7_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__16c1_s_p7_1[] = { - 2, 3, 3, 5, 6, 7, 7, 7, 7, 8, 8,10,10,10, 6, 6, - 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 9, 9,10,10,10,10,10, 8, 8, 8, - 8, 9, 9,10,10,10,10,10, 9, 9, 8, 8, 9, 9,10,10, - 10,10,10, 8, 8, 8, 8, 9, 9, -}; - -static const static_codebook _16c1_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__16c1_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16c1_s_p7_1, - 0 -}; - -static const long _vq_quantlist__16c1_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__16c1_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 6, 5, 5, - 7, 8, 8, 9, 8, 8, 9, 9,10,11, 6, 5, 5, 8, 8, 9, - 9, 8, 8, 9,10,10,11, 0, 8, 8, 8, 9, 9, 9, 9, 9, - 10,10,11,11, 0, 9, 9, 9, 8, 9, 9, 9, 9,10,10,11, - 11, 0,13,13, 9, 9,10,10,10,10,11,11,12,12, 0,14, - 13, 9, 9,10,10,10,10,11,11,12,12, 0, 0, 0,10,10, - 9, 9,11,11,12,12,13,12, 0, 0, 0,10,10, 9, 9,10, - 10,12,12,13,13, 0, 0, 0,13,14,11,10,11,11,12,12, - 13,14, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,12,12,12,12,13,13,14,15, 0, 0, 0, 0, - 0,12,12,12,12,13,13,14,15, -}; - -static const static_codebook _16c1_s_p8_0 = { - 2, 169, - (long *)_vq_lengthlist__16c1_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__16c1_s_p8_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16c1_s_p8_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _16c1_s_p8_1 = { - 2, 25, - (long *)_vq_lengthlist__16c1_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c1_s_p8_1, - 0 -}; - -static const long _vq_quantlist__16c1_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__16c1_s_p9_0[] = { - 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _16c1_s_p9_0 = { - 2, 169, - (long *)_vq_lengthlist__16c1_s_p9_0, - 1, -513964032, 1628680192, 4, 0, - (long *)_vq_quantlist__16c1_s_p9_0, - 0 -}; - -static const long _vq_quantlist__16c1_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__16c1_s_p9_1[] = { - 1, 4, 4, 4, 4, 8, 8,12,13,14,14,14,14,14,14, 6, - 6, 6, 6, 6,10, 9,14,14,14,14,14,14,14,14, 7, 6, - 5, 6, 6,10, 9,12,13,13,13,13,13,13,13,13, 7, 7, - 9, 9,11,11,12,13,13,13,13,13,13,13,13, 7, 7, 8, - 8,11,12,13,13,13,13,13,13,13,13,13,12,12,10,10, - 13,12,13,13,13,13,13,13,13,13,13,12,12,10,10,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,12, - 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13, -}; - -static const static_codebook _16c1_s_p9_1 = { - 2, 225, - (long *)_vq_lengthlist__16c1_s_p9_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__16c1_s_p9_1, - 0 -}; - -static const long _vq_quantlist__16c1_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__16c1_s_p9_2[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9,10, - 10,10, 9,10,10,11,12,12, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,10,10,10,11,11,10,12,11,11,13,11, 7, 7, 8, - 8, 8, 8, 9, 9, 9,10,10,10,10, 9,10,10,11,11,12, - 11,11, 8, 8, 8, 8, 9, 9,10,10,10,10,11,11,11,11, - 11,11,11,12,11,12,12, 8, 8, 9, 9, 9, 9, 9,10,10, - 10,10,10,10,11,11,11,11,11,11,12,11, 9, 9, 9, 9, - 10,10,10,10,11,10,11,11,11,11,11,11,12,12,12,12, - 11, 9, 9, 9, 9,10,10,10,10,11,11,11,11,11,11,11, - 11,11,12,12,12,13, 9,10,10, 9,11,10,10,10,10,11, - 11,11,11,11,10,11,12,11,12,12,11,12,11,10, 9,10, - 10,11,10,11,11,11,11,11,11,11,11,11,12,12,11,12, - 12,12,10,10,10,11,10,11,11,11,11,11,11,11,11,11, - 11,11,12,13,12,12,11, 9,10,10,11,11,10,11,11,11, - 12,11,11,11,11,11,12,12,13,13,12,13,10,10,12,10, - 11,11,11,11,11,11,11,11,11,12,12,11,13,12,12,12, - 12,13,12,11,11,11,11,11,11,12,11,12,11,11,11,11, - 12,12,13,12,11,12,12,11,11,11,11,11,12,11,11,11, - 11,12,11,11,12,11,12,13,13,12,12,12,12,11,11,11, - 11,11,12,11,11,12,11,12,11,11,11,11,13,12,12,12, - 12,13,11,11,11,12,12,11,11,11,12,11,12,12,12,11, - 12,13,12,11,11,12,12,11,12,11,11,11,12,12,11,12, - 11,11,11,12,12,12,12,13,12,13,12,12,12,12,11,11, - 12,11,11,11,11,11,11,12,12,12,13,12,11,13,13,12, - 12,11,12,10,11,11,11,11,12,11,12,12,11,12,12,13, - 12,12,13,12,12,12,12,12,11,12,12,12,11,12,11,11, - 11,12,13,12,13,13,13,13,13,12,13,13,12,12,13,11, - 11,11,11,11,12,11,11,12,11, -}; - -static const static_codebook _16c1_s_p9_2 = { - 2, 441, - (long *)_vq_lengthlist__16c1_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__16c1_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__16c1_s_short[] = { - 5, 6,17, 8,12, 9,10,10,12,13, 5, 2,17, 4, 9, 5, - 7, 8,11,13,16,16,16,16,16,16,16,16,16,16, 6, 4, - 16, 5,10, 5, 7,10,14,16,13, 9,16,11, 8, 7, 8, 9, - 13,16, 7, 4,16, 5, 7, 4, 6, 8,11,13, 8, 6,16, 7, - 8, 5, 5, 7, 9,13, 9, 8,16, 9, 8, 6, 6, 7, 9,13, - 11,11,16,10,10, 7, 7, 7, 9,13,13,13,16,13,13, 9, - 9, 9,10,13, -}; - -static const static_codebook _huff_book__16c1_s_short = { - 2, 100, - (long *)_huff_lengthlist__16c1_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__16c2_s_long[] = { - 4, 7, 9, 9, 9, 8, 9,10,13,16, 5, 4, 5, 6, 7, 7, - 8, 9,12,16, 6, 5, 5, 5, 7, 7, 9,10,12,15, 7, 6, - 5, 4, 5, 6, 8, 9,10,13, 8, 7, 7, 5, 5, 5, 7, 9, - 10,12, 7, 7, 7, 6, 5, 5, 6, 7,10,12, 8, 8, 8, 7, - 7, 5, 5, 6, 9,11, 8, 9, 9, 8, 8, 6, 6, 5, 8,11, - 10,11,12,12,11, 9, 9, 8, 9,12,13,14,15,15,14,12, - 12,11,11,13, -}; - -static const static_codebook _huff_book__16c2_s_long = { - 2, 100, - (long *)_huff_lengthlist__16c2_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__16c2_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16c2_s_p1_0[] = { - 1, 3, 3, 0, 0, 0, 0, 0, 0, 4, 5, 5, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c2_s_p1_0 = { - 4, 81, - (long *)_vq_lengthlist__16c2_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16c2_s_p1_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16c2_s_p2_0[] = { - 2, 4, 4, 7, 7, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, - 0, 0, 8, 8, 0, 0, 0, 8, 8, 4, 4, 4, 8, 7, 0, 0, - 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, - 9, 9, 4, 4, 4, 7, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, - 8, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 7, 8, 8,10, 9, - 0, 0, 0,12,11, 0, 0, 0,11,12, 0, 0, 0,14,13, 0, - 0, 0,14,14, 7, 8, 8, 9,10, 0, 0, 0,11,12, 0, 0, - 0,11,11, 0, 0, 0,14,14, 0, 0, 0,14,14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8,11,11, 0, 0, 0, - 12,11, 0, 0, 0,12,12, 0, 0, 0,13,12, 0, 0, 0,13, - 13, 8, 8, 8,11,11, 0, 0, 0,11,11, 0, 0, 0,12,12, - 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 8, 9, 8,12,11, 0, 0, 0,12,12, 0, - 0, 0,12,11, 0, 0, 0,13,13, 0, 0, 0,13,13, 8, 8, - 8,11,12, 0, 0, 0,11,12, 0, 0, 0,11,12, 0, 0, 0, - 13,14, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 8, 9, 9,14,14, 0, 0, 0,13,13, 0, 0, 0,13, - 13, 0, 0, 0,13,12, 0, 0, 0,13,13, 8, 9, 9,14,14, - 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, 0,12,13, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, - 9, 9,14,14, 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, - 0,13,13, 0, 0, 0,13,12, 8, 9, 9,14,14, 0, 0, 0, - 13,13, 0, 0, 0,13,13, 0, 0, 0,13,13, 0, 0, 0,12, - 12, -}; - -static const static_codebook _16c2_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__16c2_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c2_s_p2_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__16c2_s_p3_0[] = { - 1, 3, 3, 5, 5, 7, 7, 8, 8, 0, 0, 0, 6, 6, 8, 8, - 9, 9, 0, 0, 0, 6, 6, 8, 8, 9, 9, 0, 0, 0, 7, 7, - 8, 9,10,10, 0, 0, 0, 7, 7, 9, 9,10,10, 0, 0, 0, - 8, 8, 9, 9,11,11, 0, 0, 0, 7, 7, 9, 9,11,11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c2_s_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__16c2_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16c2_s_p3_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__16c2_s_p4_0[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, - 9, 0, 0, 0, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10, - 11,10, 0, 0, 0, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10, - 10,10,10, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11, 0, 0, 0, 7, 6, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, - 11,11,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, - 10,11,11,11,11,12,12, 0, 0, 0, 7, 8, 8, 8, 9, 9, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, - 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _16c2_s_p4_0 = { - 2, 289, - (long *)_vq_lengthlist__16c2_s_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__16c2_s_p4_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16c2_s_p5_0[] = { - 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 6,10,11,10,10, - 10,11, 4, 6, 6,10,10,11,10,11,10, 5,10,10, 9,12, - 11,10,12,12, 7,10,10,12,12,12,12,13,13, 7,11,10, - 11,12,12,12,13,13, 6,11,10,10,12,12,11,12,12, 7, - 11,10,12,13,13,12,12,12, 7,10,11,12,13,13,12,12, - 12, -}; - -static const static_codebook _16c2_s_p5_0 = { - 4, 81, - (long *)_vq_lengthlist__16c2_s_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__16c2_s_p5_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__16c2_s_p5_1[] = { - 2, 3, 3, 6, 6, 6, 6, 7, 7, 7, 7,11,10,10, 6, 6, - 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, - 8,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9,11,11,11, 6, - 7, 8, 8, 8, 8, 9, 9,11,11,11, 7, 7, 8, 8, 8, 8, - 8, 8,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9,11,11,11, - 8, 8, 8, 8, 8, 8, 8, 8,11,11,11,11,11, 8, 8, 8, - 8, 8, 8,12,11,11,11,11, 8, 8, 8, 8, 8, 8,12,11, - 11,11,11, 7, 7, 8, 8, 8, 8, -}; - -static const static_codebook _16c2_s_p5_1 = { - 2, 121, - (long *)_vq_lengthlist__16c2_s_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16c2_s_p5_1, - 0 -}; - -static const long _vq_quantlist__16c2_s_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__16c2_s_p6_0[] = { - 1, 4, 4, 6, 6, 8, 7, 8, 8, 9, 9,10,10, 5, 5, 5, - 7, 7, 9, 9, 9, 9,11,11,12,12, 6, 5, 5, 7, 7, 9, - 9,10, 9,11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10, - 11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10,11,11,12, - 12, 0,11,11, 8, 8,10,10,11,11,12,12,13,13, 0,12, - 12, 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static const static_codebook _16c2_s_p6_0 = { - 2, 169, - (long *)_vq_lengthlist__16c2_s_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__16c2_s_p6_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16c2_s_p6_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _16c2_s_p6_1 = { - 2, 25, - (long *)_vq_lengthlist__16c2_s_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16c2_s_p6_1, - 0 -}; - -static const long _vq_quantlist__16c2_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__16c2_s_p7_0[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 8,10, 9,10,10, 5, 5, 5, - 7, 7, 9, 9,10,10,11,10,12,11, 6, 5, 5, 7, 7, 9, - 9,10,10,11,11,12,12,20, 7, 7, 7, 7, 9, 9,10,10, - 11,11,12,12,20, 7, 7, 7, 7, 9, 9,11,10,12,11,12, - 12,20,11,11, 8, 8,10,10,11,11,12,12,13,13,20,12, - 12, 8, 8, 9, 9,11,11,12,12,13,13,20,20,21,10,10, - 10,10,11,11,12,12,13,13,21,21,21,10,10,10,10,11, - 11,12,12,13,13,21,21,21,14,14,11,11,12,12,13,13, - 13,14,21,21,21,16,15,11,11,12,11,13,13,14,14,21, - 21,21,21,21,13,13,12,12,13,13,14,14,21,21,21,21, - 21,13,13,12,12,13,13,14,14, -}; - -static const static_codebook _16c2_s_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__16c2_s_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__16c2_s_p7_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__16c2_s_p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 7, 9, 9, 9, 6, 7, - 7, 7, 7, 7, 8, 8, 9, 9, 9, 6, 6, 7, 7, 7, 7, 8, - 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, - 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, - 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, - 7, 7, 8, 8, 7, 7, 8, 8, 9, 9, 9, 9, 9, 8, 8, 7, - 7, 8, 8, 9, 9, 9, 9, 9, 8, 8, 7, 7, 8, 8, 9, 9, - 9, 9, 9, 7, 7, 7, 7, 8, 8, -}; - -static const static_codebook _16c2_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__16c2_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16c2_s_p7_1, - 0 -}; - -static const long _vq_quantlist__16c2_s_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__16c2_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9,10,10, 6, - 6, 6, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11,11, 6, 5, - 5, 8, 7, 9, 9, 8, 8, 9, 9,10,10,11,11,20, 8, 8, - 8, 8, 9, 9, 9, 9,10,10,11,10,12,11,20, 8, 8, 8, - 8, 9, 9, 9, 9,10,10,11,11,12,12,20,12,12, 9, 9, - 10,10,10,10,11,11,12,12,13,12,20,13,13, 9, 9,10, - 10,10,10,11,11,12,12,13,13,20,20,20, 9, 9, 9, 9, - 10,10,11,11,12,12,13,12,20,20,20, 9, 9, 9, 8,10, - 10,12,11,12,12,13,13,20,20,20,13,13,10,10,11,11, - 12,12,13,13,13,13,20,20,20,13,13,10,10,11,10,12, - 11,13,13,14,14,20,20,20,20,20,11,11,11,11,12,12, - 13,13,14,14,20,20,20,20,20,11,10,11,11,13,11,13, - 13,14,14,20,20,21,21,21,14,14,11,12,13,13,13,13, - 14,14,21,21,21,21,21,15,15,12,11,13,12,14,13,15, - 14, -}; - -static const static_codebook _16c2_s_p8_0 = { - 2, 225, - (long *)_vq_lengthlist__16c2_s_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__16c2_s_p8_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__16c2_s_p8_1[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,10, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, - 11,11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10, 9,10,10,10,10,11,11,11, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11, - 11, 8, 8, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10, - 10,10,10,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9,10,10, - 10,10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10,11,11,11, - 11,11, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10, - 10,10,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,11,11,11,11,11,10, 9,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,11,11,11,11,11,11,11,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, - 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, - 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, - 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,11, - 11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, - 10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _16c2_s_p8_1 = { - 2, 441, - (long *)_vq_lengthlist__16c2_s_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__16c2_s_p8_1, - 0 -}; - -static const long _vq_quantlist__16c2_s_p9_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__16c2_s_p9_0[] = { - 1, 4, 3,10, 8,10,10,10,10,10,10,10,10,10,10,10, - 10, 6,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10, 6,10, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _16c2_s_p9_0 = { - 2, 289, - (long *)_vq_lengthlist__16c2_s_p9_0, - 1, -509798400, 1631393792, 5, 0, - (long *)_vq_quantlist__16c2_s_p9_0, - 0 -}; - -static const long _vq_quantlist__16c2_s_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const long _vq_lengthlist__16c2_s_p9_1[] = { - 1, 4, 4, 7, 7, 7, 7, 7, 7, 8, 8,10, 9,11,10,13, - 11,14,13, 6, 6, 6, 8, 8, 8, 8, 8, 7, 9, 8,11, 9, - 13,11,14,12,14,13, 5, 6, 6, 8, 8, 8, 8, 8, 8, 9, - 9,11,11,13,11,14,13,15,15,17, 8, 8, 8, 8, 9, 9, - 9, 8,11, 9,12,10,13,11,14,12,14,13,17, 8, 8, 8, - 8, 9, 9, 9, 9,10,10,11,11,13,13,13,14,16,15,17, - 12,12, 8, 8, 9, 9,10,10,11,11,12,11,13,12,13,12, - 14,13,16,12,12, 8, 8, 9, 9,10,10,11,11,12,12,13, - 13,14,14,15,15,17,17,17, 9, 9, 9, 9,11,11,12,12, - 12,13,13,13,16,14,14,14,17,17,17, 9, 8, 9, 8,11, - 10,12,12,13,13,14,14,15,15,16,16,17,17,17,12,12, - 10,10,11,12,12,13,13,14,13,15,15,14,16,15,17,17, - 17,12,12,10, 8,12, 9,13,12,14,14,15,14,15,16,16, - 16,17,17,17,17,17,11,11,12,12,14,14,14,16,15,16, - 15,16,15,17,17,17,17,17,17,11, 9,12,10,13,11,15, - 14,16,16,17,16,16,15,17,17,17,17,17,15,15,12,12, - 14,14,15,16,16,15,16,16,17,17,17,17,17,17,17,14, - 14,12,10,14,11,15,12,17,16,15,16,17,16,17,17,17, - 17,17,17,17,13,13,14,14,14,16,17,17,16,17,17,17, - 17,17,17,17,17,17,17,13, 9,13,12,15,13,16,16,17, - 17,17,17,17,17,17,17,17,17,17,15,17,14,14,15,16, - 16,17,16,17,16,17,17,17,17,17,17,17,17,17,17,14, - 13,15,16,16,17,16,17,17,17, -}; - -static const static_codebook _16c2_s_p9_1 = { - 2, 361, - (long *)_vq_lengthlist__16c2_s_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__16c2_s_p9_1, - 0 -}; - -static const long _vq_quantlist__16c2_s_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const long _vq_lengthlist__16c2_s_p9_2[] = { - 2, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _16c2_s_p9_2 = { - 1, 49, - (long *)_vq_lengthlist__16c2_s_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__16c2_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__16c2_s_short[] = { - 7,10,12,11,12,13,15,16,18,15,10, 8, 8, 8, 9,10, - 12,13,14,17,10, 7, 7, 7, 7, 8,10,12,15,18,10, 7, - 7, 5, 5, 6, 8,10,13,15,10, 7, 6, 5, 4, 4, 6, 9, - 12,15,11, 7, 7, 5, 4, 3, 4, 7,11,13,12, 9, 8, 7, - 5, 4, 4, 5,10,13,11,11,11, 9, 7, 5, 5, 5, 9,12, - 13,12,13,12,10, 8, 8, 7, 9,13,14,14,14,14,13,11, - 11,10,10,13, -}; - -static const static_codebook _huff_book__16c2_s_short = { - 2, 100, - (long *)_huff_lengthlist__16c2_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__8c0_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8c0_s_p1_0[] = { - 1, 5, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, - 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10, 9, 0, 0, 0, - 0, 0, 0, 8, 9,11, 0, 0, 0, 0, 0, 0, 9,11,11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9,10, 0, 0, - 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 9,11,11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,11, 0, - 0, 0, 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 9,11,11, - 0, 0, 0, 0, 0, 0, 8,11, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _8c0_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__8c0_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8c0_s_p1_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__8c0_s_p3_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 8, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 7, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _8c0_s_p3_0 = { - 4, 625, - (long *)_vq_lengthlist__8c0_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8c0_s_p3_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__8c0_s_p4_0[] = { - 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _8c0_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__8c0_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8c0_s_p4_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__8c0_s_p5_0[] = { - 1, 3, 3, 5, 5, 7, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, - 8, 8, 0, 0, 0, 7, 7, 7, 7, 8, 9, 0, 0, 0, 8, 8, - 8, 8, 9, 9, 0, 0, 0, 8, 8, 8, 8, 9, 9, 0, 0, 0, - 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _8c0_s_p5_0 = { - 2, 81, - (long *)_vq_lengthlist__8c0_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8c0_s_p5_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__8c0_s_p6_0[] = { - 1, 3, 3, 6, 6, 8, 8, 9, 9, 8, 8,10, 9,10,10,11, - 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, - 11,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, - 11,12,11, 0, 0, 0, 8, 8, 9, 9,10,10, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10, 9, 9,11, - 10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10,10,10, - 11,11,11,12,12,12, 0, 0, 0, 9, 9, 9, 9,10,10,10, - 10,11,11,12,12,13,13, 0, 0, 0,10,10,10,10,11,11, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0,10, 9,10, - 11,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10, 9,10,11,12,12,13,13,14,13, 0, 0, 0, 0, 0, 9, - 9, 9,10,10,10,11,11,13,12,13,13, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,12,12,13,13,14,14, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,13,13,13,14, 0, 0, 0, - 0, 0, 0, 0,11,11,11,11,12,12,13,14,14,14, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,14,13, 0, - 0, 0, 0, 0, 0, 0,11,11,12,12,13,13,14,14,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, - 14, -}; - -static const static_codebook _8c0_s_p6_0 = { - 2, 289, - (long *)_vq_lengthlist__8c0_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__8c0_s_p6_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8c0_s_p7_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,11, 9,10,12, - 9,10, 4, 7, 7,10,10,10,11, 9, 9, 6,11,10,11,11, - 12,11,11,11, 6,10,10,11,11,12,11,10,10, 6, 9,10, - 11,11,11,11,10,10, 7,10,11,12,11,11,12,11,12, 6, - 9, 9,10, 9, 9,11,10,10, 6, 9, 9,10,10,10,11,10, - 10, -}; - -static const static_codebook _8c0_s_p7_0 = { - 4, 81, - (long *)_vq_lengthlist__8c0_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__8c0_s_p7_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__8c0_s_p7_1[] = { - 1, 3, 3, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, 7, 7, - 8, 8, 9, 9, 9, 9,10,10, 9, 7, 7, 8, 8, 9, 9, 9, - 9,10,10,10, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10, 8, - 8, 9, 9, 9, 9, 8, 9,10,10,10, 8, 8, 9, 9, 9,10, - 10,10,10,10,10, 9, 9, 9, 9, 9, 9,10,10,11,10,11, - 9, 9, 9, 9,10,10,10,10,11,11,11,10,10, 9, 9,10, - 10,10, 9,11,10,10,10,10,10,10, 9, 9,10,10,11,11, - 10,10,10, 9, 9, 9,10,10,10, -}; - -static const static_codebook _8c0_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__8c0_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__8c0_s_p7_1, - 0 -}; - -static const long _vq_quantlist__8c0_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__8c0_s_p8_0[] = { - 1, 4, 4, 7, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 6, 6, - 7, 7, 8, 8, 7, 7, 8, 9,10,10, 7, 6, 6, 7, 7, 8, - 7, 7, 7, 9, 9,10,12, 0, 8, 8, 8, 8, 8, 9, 8, 8, - 9, 9,10,10, 0, 8, 8, 8, 8, 8, 9, 8, 9, 9, 9,11, - 10, 0, 0,13, 9, 8, 9, 9, 9, 9,10,10,11,11, 0,13, - 0, 9, 9, 9, 9, 9, 9,11,10,11,11, 0, 0, 0, 8, 9, - 10, 9,10,10,13,11,12,12, 0, 0, 0, 8, 9, 9, 9,10, - 10,13,12,12,13, 0, 0, 0,12, 0,10,10,12,11,10,11, - 12,12, 0, 0, 0,13,13,10,10,10,11,12, 0,13, 0, 0, - 0, 0, 0, 0,13,11, 0,12,12,12,13,12, 0, 0, 0, 0, - 0, 0,13,13,11,13,13,11,12, -}; - -static const static_codebook _8c0_s_p8_0 = { - 2, 169, - (long *)_vq_lengthlist__8c0_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__8c0_s_p8_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__8c0_s_p8_1[] = { - 1, 3, 4, 5, 5, 7, 6, 6, 6, 5, 7, 7, 7, 6, 6, 7, - 7, 7, 6, 6, 7, 7, 7, 6, 6, -}; - -static const static_codebook _8c0_s_p8_1 = { - 2, 25, - (long *)_vq_lengthlist__8c0_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8c0_s_p8_1, - 0 -}; - -static const long _vq_quantlist__8c0_s_p9_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8c0_s_p9_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _8c0_s_p9_0 = { - 4, 81, - (long *)_vq_lengthlist__8c0_s_p9_0, - 1, -518803456, 1628680192, 2, 0, - (long *)_vq_quantlist__8c0_s_p9_0, - 0 -}; - -static const long _vq_quantlist__8c0_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__8c0_s_p9_1[] = { - 1, 4, 4, 5, 5,10, 8,11,11,11,11,11,11,11,11, 6, - 6, 6, 7, 6,11,10,11,11,11,11,11,11,11,11, 7, 5, - 6, 6, 6, 8, 7,11,11,11,11,11,11,11,11,11, 7, 8, - 8, 8, 9, 9,11,11,11,11,11,11,11,11,11, 9, 8, 7, - 8, 9,11,11,11,11,11,11,11,11,11,11,11,10,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11, -}; - -static const static_codebook _8c0_s_p9_1 = { - 2, 225, - (long *)_vq_lengthlist__8c0_s_p9_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__8c0_s_p9_1, - 0 -}; - -static const long _vq_quantlist__8c0_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__8c0_s_p9_2[] = { - 1, 5, 5, 7, 7, 8, 7, 8, 8,10,10, 9, 9,10,10,10, - 11,11,10,12,11,12,12,12, 9, 8, 8, 8, 8, 8, 9,10, - 10,10,10,11,11,11,10,11,11,12,12,11,12, 8, 8, 7, - 7, 8, 9,10,10,10, 9,10,10, 9,10,10,11,11,11,11, - 11,11, 9, 9, 9, 9, 8, 9,10,10,11,10,10,11,11,12, - 10,10,12,12,11,11,10, 9, 9,10, 8, 9,10,10,10, 9, - 10,10,11,11,10,11,10,10,10,12,12,12, 9,10, 9,10, - 9, 9,10,10,11,11,11,11,10,10,10,11,12,11,12,11, - 12,10,11,10,11, 9,10, 9,10, 9,10,10, 9,10,10,11, - 10,11,11,11,11,12,11, 9,10,10,10,10,11,11,11,11, - 11,10,11,11,11,11,10,12,10,12,12,11,12,10,10,11, - 10, 9,11,10,11, 9,10,11,10,10,10,11,11,11,11,12, - 12,10, 9, 9,11,10, 9,12,11,10,12,12,11,11,11,11, - 10,11,11,12,11,10,12, 9,11,10,11,10,10,11,10,11, - 9,10,10,10,11,12,11,11,12,11,10,10,11,11, 9,10, - 10,12,10,11,10,10,10, 9,10,10,10,10, 9,10,10,11, - 11,11,11,12,11,10,10,10,10,11,11,10,11,11, 9,11, - 10,12,10,12,11,10,11,10,10,10,11,10,10,11,11,10, - 11,10,10,10,10,11,11,12,10,10,10,11,10,11,12,11, - 10,11,10,10,11,11,10,12,10, 9,10,10,11,11,11,10, - 12,10,10,11,11,11,10,10,11,10,10,10,11,10,11,10, - 12,11,11,10,10,10,12,10,10,11, 9,10,11,11,11,10, - 10,11,10,10, 9,11,11,12,12,11,12,11,11,11,11,11, - 11, 9,10,11,10,12,10,10,10,10,11,10,10,11,10,10, - 12,10,10,10,10,10, 9,12,10,10,10,10,12, 9,11,10, - 10,11,10,12,12,10,12,12,12,10,10,10,10, 9,10,11, - 10,10,12,10,10,12,11,10,11,10,10,12,11,10,12,10, - 10,11, 9,11,10, 9,10, 9,10, -}; - -static const static_codebook _8c0_s_p9_2 = { - 2, 441, - (long *)_vq_lengthlist__8c0_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__8c0_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__8c0_s_single[] = { - 4, 5,18, 7,10, 6, 7, 8, 9,10, 5, 2,18, 5, 7, 5, - 6, 7, 8,11,17,17,17,17,17,17,17,17,17,17, 7, 4, - 17, 6, 9, 6, 8,10,12,15,11, 7,17, 9, 6, 6, 7, 9, - 11,15, 6, 4,17, 6, 6, 4, 5, 8,11,16, 6, 6,17, 8, - 6, 5, 6, 9,13,16, 8, 9,17,11, 9, 8, 8,11,13,17, - 9,12,17,15,14,13,12,13,14,17,12,15,17,17,17,17, - 17,16,17,17, -}; - -static const static_codebook _huff_book__8c0_s_single = { - 2, 100, - (long *)_huff_lengthlist__8c0_s_single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__8c1_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8c1_s_p1_0[] = { - 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, - 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 8, 8,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 8,10, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _8c1_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__8c1_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8c1_s_p1_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__8c1_s_p3_0[] = { - 2, 4, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _8c1_s_p3_0 = { - 4, 625, - (long *)_vq_lengthlist__8c1_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8c1_s_p3_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__8c1_s_p4_0[] = { - 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _8c1_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__8c1_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8c1_s_p4_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__8c1_s_p5_0[] = { - 1, 3, 3, 4, 5, 6, 6, 8, 8, 0, 0, 0, 8, 8, 7, 7, - 9, 9, 0, 0, 0, 8, 8, 7, 7, 9, 9, 0, 0, 0, 9,10, - 8, 8, 9, 9, 0, 0, 0,10,10, 8, 8, 9, 9, 0, 0, 0, - 11,10, 8, 8,10,10, 0, 0, 0,11,11, 8, 8,10,10, 0, - 0, 0,12,12, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _8c1_s_p5_0 = { - 2, 81, - (long *)_vq_lengthlist__8c1_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8c1_s_p5_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__8c1_s_p6_0[] = { - 1, 3, 3, 5, 5, 8, 8, 8, 8, 9, 9,10,10,11,11,11, - 11, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11,11, - 12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11,12,12, 0, 0, 0, 9, 9, 8, 8,10,10,10,10,11,11, - 12,12,12,12, 0, 0, 0, 9, 9, 8, 8,10,10,10,10,11, - 11,12,12,12,12, 0, 0, 0,10,10, 9, 9,10,10,10,10, - 11,11,12,12,13,13, 0, 0, 0,10,10, 9, 9,10,10,10, - 10,11,11,12,12,13,13, 0, 0, 0,11,11, 9, 9,10,10, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,11,12,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,11,11,11,11,12,12,13,12,13,13, 0, 0, 0, 0, - 0, 0, 0,11,10,11,11,12,12,13,13,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, - 14, -}; - -static const static_codebook _8c1_s_p6_0 = { - 2, 289, - (long *)_vq_lengthlist__8c1_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__8c1_s_p6_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8c1_s_p7_0[] = { - 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, - 9, 9, 5, 7, 7,10, 9, 9,10, 9, 9, 6,10,10,10,10, - 10,11,10,10, 6, 9, 9,10, 9,10,11,10,10, 6, 9, 9, - 10, 9, 9,11, 9,10, 7,10,10,11,11,11,11,10,10, 6, - 9, 9,10,10,10,11, 9, 9, 6, 9, 9,10,10,10,10, 9, - 9, -}; - -static const static_codebook _8c1_s_p7_0 = { - 4, 81, - (long *)_vq_lengthlist__8c1_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__8c1_s_p7_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__8c1_s_p7_1[] = { - 2, 3, 3, 5, 5, 7, 7, 7, 7, 7, 7,10,10, 9, 7, 7, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, - 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 8, 8, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _8c1_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__8c1_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__8c1_s_p7_1, - 0 -}; - -static const long _vq_quantlist__8c1_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__8c1_s_p8_0[] = { - 1, 4, 4, 6, 6, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 5, - 7, 7, 8, 8, 8, 8, 9,10,11,11, 7, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9, 9,10, 9,10,11,11,11, 0,13, - 12, 9, 8, 9, 9,10,10,11,11,12,11, 0, 0, 0, 9, 9, - 9, 9,10,10,11,11,12,12, 0, 0, 0,10,10, 9, 9,10, - 10,11,11,12,12, 0, 0, 0,13,13,10,10,11,11,12,11, - 13,12, 0, 0, 0,14,14,10,10,11,10,11,11,12,12, 0, - 0, 0, 0, 0,12,12,11,11,12,12,13,13, 0, 0, 0, 0, - 0,12,12,11,10,12,11,13,12, -}; - -static const static_codebook _8c1_s_p8_0 = { - 2, 169, - (long *)_vq_lengthlist__8c1_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__8c1_s_p8_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__8c1_s_p8_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _8c1_s_p8_1 = { - 2, 25, - (long *)_vq_lengthlist__8c1_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8c1_s_p8_1, - 0 -}; - -static const long _vq_quantlist__8c1_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__8c1_s_p9_0[] = { - 1, 3, 3,10,10,10,10,10,10,10,10,10,10, 5, 6, 6, - 10,10,10,10,10,10,10,10,10,10, 6, 7, 8,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10, 9, 9, 9, 9, -}; - -static const static_codebook _8c1_s_p9_0 = { - 2, 169, - (long *)_vq_lengthlist__8c1_s_p9_0, - 1, -513964032, 1628680192, 4, 0, - (long *)_vq_quantlist__8c1_s_p9_0, - 0 -}; - -static const long _vq_quantlist__8c1_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__8c1_s_p9_1[] = { - 1, 4, 4, 5, 5, 7, 7, 9, 9,11,11,12,12,13,13, 6, - 5, 5, 6, 6, 9, 9,10,10,12,12,12,13,15,14, 6, 5, - 5, 7, 7, 9, 9,10,10,12,12,12,13,14,13,17, 7, 7, - 8, 8,10,10,11,11,12,13,13,13,13,13,17, 7, 7, 8, - 8,10,10,11,11,13,13,13,13,14,14,17,11,11, 9, 9, - 11,11,12,12,12,13,13,14,15,13,17,12,12, 9, 9,11, - 11,12,12,13,13,13,13,14,16,17,17,17,11,12,12,12, - 13,13,13,14,15,14,15,15,17,17,17,12,12,11,11,13, - 13,14,14,15,14,15,15,17,17,17,15,15,13,13,14,14, - 15,14,15,15,16,15,17,17,17,15,15,13,13,13,14,14, - 15,15,15,15,16,17,17,17,17,16,14,15,14,14,15,14, - 14,15,15,15,17,17,17,17,17,14,14,16,14,15,15,15, - 15,15,15,17,17,17,17,17,17,16,16,15,17,15,15,14, - 17,15,17,16,17,17,17,17,16,15,14,15,15,15,15,15, - 15, -}; - -static const static_codebook _8c1_s_p9_1 = { - 2, 225, - (long *)_vq_lengthlist__8c1_s_p9_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__8c1_s_p9_1, - 0 -}; - -static const long _vq_quantlist__8c1_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__8c1_s_p9_2[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, - 9, 9, 9, 9, 9,11,11,12, 7, 7, 7, 7, 8, 8, 9, 9, - 9, 9,10,10,10,10,10,10,10,10,11,11,11, 7, 7, 7, - 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,11, - 11,12, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10, - 10,10,10,10,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,11,11,11, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11, - 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,10, - 10,10,10,11,12,11, 9, 9, 8, 9, 9, 9, 9, 9,10,10, - 10,10,10,10,10,10,10,10,11,11,11,11,11, 8, 8, 9, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10,11,12,11, - 12,11, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, - 10,10,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,12,11,12,11,11, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10,12,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,12,11,11,12,11,10,10,10,10,10,10,10,10, - 10,10,10,10,11,10,11,11,11,11,11,11,11,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,11,11,12,11,12, - 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,12,11,12,11,11,11,11,10,10,10,10,10,10,10, - 10,10,10,10,10,11,11,12,11,11,12,11,11,12,10,10, - 11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,12, - 12,11,12,11,11,12,12,12,11,11,10,10,10,10,10,10, - 10,10,10,11,12,12,11,12,12,11,12,11,11,11,11,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _8c1_s_p9_2 = { - 2, 441, - (long *)_vq_lengthlist__8c1_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__8c1_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__8c1_s_single[] = { - 4, 6,18, 8,11, 8, 8, 9, 9,10, 4, 4,18, 5, 9, 5, - 6, 7, 8,10,18,18,18,18,17,17,17,17,17,17, 7, 5, - 17, 6,11, 6, 7, 8, 9,12,12, 9,17,12, 8, 8, 9,10, - 10,13, 7, 5,17, 6, 8, 4, 5, 6, 8,10, 6, 5,17, 6, - 8, 5, 4, 5, 7, 9, 7, 7,17, 8, 9, 6, 5, 5, 6, 8, - 8, 8,17, 9,11, 8, 6, 6, 6, 7, 9,10,17,12,12,10, - 9, 7, 7, 8, -}; - -static const static_codebook _huff_book__8c1_s_single = { - 2, 100, - (long *)_huff_lengthlist__8c1_s_single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c2_s_long[] = { - 6, 6,12,10,10,10, 9,10,12,12, 6, 1,10, 5, 6, 6, - 7, 9,11,14,12, 9, 8,11, 7, 8, 9,11,13,15,10, 5, - 12, 7, 8, 7, 9,12,14,15,10, 6, 7, 8, 5, 6, 7, 9, - 12,14, 9, 6, 8, 7, 6, 6, 7, 9,12,12, 9, 7, 9, 9, - 7, 6, 6, 7,10,10,10, 9,10,11, 8, 7, 6, 6, 8,10, - 12,11,13,13,11,10, 8, 8, 8,10,11,13,15,15,14,13, - 10, 8, 8, 9, -}; - -static const static_codebook _huff_book__44c2_s_long = { - 2, 100, - (long *)_huff_lengthlist__44c2_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c2_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c2_s_p1_0[] = { - 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 0, - 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 6, 8, 7, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, - 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c2_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__44c2_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c2_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c2_s_p2_0[] = { - 1, 4, 4, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 0, 8, - 8, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 4, 6, 6, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0,11,11, 0, 0, - 0,11,11, 0, 0, 0,12,11, 0, 0, 0, 0, 0, 0, 0, 7, - 8, 8, 0, 0, 0,10,11, 0, 0, 0,11,11, 0, 0, 0,11, - 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0,11,11, 0, 0, 0,11,11, - 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, - 0, 0,10,11, 0, 0, 0,10,11, 0, 0, 0,11,11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 9, 0, 0, 0,11,12, 0, 0, 0,11,12, 0, 0, 0, - 12,11, 0, 0, 0, 0, 0, 0, 0, 8,10, 9, 0, 0, 0,12, - 11, 0, 0, 0,12,11, 0, 0, 0,11,12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c2_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c2_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c2_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c2_s_p3_0[] = { - 2, 4, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c2_s_p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44c2_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c2_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c2_s_p4_0[] = { - 1, 3, 3, 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 6, 0, 0, - 0, 0, 0, 6, 6, 6, 6, 0, 0, 0, 0, 0, 7, 7, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c2_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__44c2_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c2_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c2_s_p5_0[] = { - 1, 3, 3, 6, 6, 7, 7, 9, 9, 0, 7, 7, 7, 7, 7, 7, - 9, 9, 0, 7, 7, 7, 7, 7, 7, 9, 9, 0, 8, 8, 7, 7, - 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, - 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, - 11, -}; - -static const static_codebook _44c2_s_p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44c2_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c2_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c2_s_p6_0[] = { - 1, 4, 3, 6, 6, 8, 8, 9, 9, 9, 9, 9, 9,10,10,11, - 11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, - 12,11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, - 11,11,12, 0, 8, 8, 7, 7, 9, 9,10,10, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 7, 7, 9, 9,10,10,10, 9,10, - 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, - 11,11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, - 10,11,11,12,12,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,12,12,13,12,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,13,13,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, - 14, -}; - -static const static_codebook _44c2_s_p6_0 = { - 2, 289, - (long *)_vq_lengthlist__44c2_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c2_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c2_s_p7_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,10, 9, 9, 7,10,10,11,10, - 11,11,10,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,10,11,11,11,12,11,11, 6, - 9, 9,11,10,10,11,11,10, 6, 9, 9,11,10,10,12,10, - 11, -}; - -static const static_codebook _44c2_s_p7_0 = { - 4, 81, - (long *)_vq_lengthlist__44c2_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c2_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c2_s_p7_1[] = { - 2, 3, 4, 6, 6, 7, 7, 7, 7, 7, 7, 9, 7, 7, 6, 6, - 7, 7, 8, 8, 8, 8, 9, 6, 6, 6, 6, 7, 7, 8, 8, 8, - 8,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 8, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c2_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44c2_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c2_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c2_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c2_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 6, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 6, 5, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, - 13, 9, 9,10,10,10,10,11,11,12,12, 0, 0, 0,10,10, - 10,10,11,11,12,12,12,13, 0, 0, 0,10,10,10,10,11, - 11,12,12,12,12, 0, 0, 0,14,14,10,11,11,11,12,12, - 13,13, 0, 0, 0,14,14,11,10,11,11,13,12,13,13, 0, - 0, 0, 0, 0,12,12,11,12,13,12,14,14, 0, 0, 0, 0, - 0,12,12,12,12,13,12,14,14, -}; - -static const static_codebook _44c2_s_p8_0 = { - 2, 169, - (long *)_vq_lengthlist__44c2_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c2_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c2_s_p8_1[] = { - 2, 4, 4, 5, 4, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c2_s_p8_1 = { - 2, 25, - (long *)_vq_lengthlist__44c2_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c2_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c2_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c2_s_p9_0[] = { - 1, 5, 4,12,12,12,12,12,12,12,12,12,12, 4, 9, 8, - 11,11,11,11,11,11,11,11,11,11, 2, 8, 7,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _44c2_s_p9_0 = { - 2, 169, - (long *)_vq_lengthlist__44c2_s_p9_0, - 1, -514541568, 1627103232, 4, 0, - (long *)_vq_quantlist__44c2_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c2_s_p9_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c2_s_p9_1[] = { - 1, 4, 4, 6, 6, 7, 6, 8, 8,10, 9,10,10, 6, 5, 5, - 7, 7, 8, 7,10, 9,11,11,12,13, 6, 5, 5, 7, 7, 8, - 8,10,10,11,11,13,13,18, 8, 8, 8, 8, 9, 9,10,10, - 12,12,12,13,18, 8, 8, 8, 8, 9, 9,10,10,12,12,13, - 13,18,11,11, 8, 8,10,10,11,11,12,11,13,12,18,11, - 11, 9, 7,10,10,11,11,11,12,12,13,17,17,17,10,10, - 11,11,12,12,12,10,12,12,17,17,17,11,10,11,10,13, - 12,11,12,12,12,17,17,17,15,14,11,11,12,11,13,10, - 13,12,17,17,17,14,14,12,10,11,11,13,13,13,13,17, - 17,16,17,16,13,13,12,10,13,10,14,13,17,16,17,16, - 17,13,12,12,10,13,11,14,14, -}; - -static const static_codebook _44c2_s_p9_1 = { - 2, 169, - (long *)_vq_lengthlist__44c2_s_p9_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44c2_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c2_s_p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c2_s_p9_2[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, - 8,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9,10, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 8, 7, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9,10,11,11, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9,10, 9, 9, 9,10,11,10, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9,10,10,10,10,11,10, 8, 8, 9, 9, 9, 9, - 9, 9,10, 9, 9,10, 9,10,11,10,11,11,11, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,11,11,11,11,11, 9, 9, - 9, 9, 9, 9,10, 9, 9, 9,10,10,11,11,11,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,11,11,11,11,11, - 9, 9, 9, 9,10,10, 9, 9, 9,10,10,10,11,11,11,11, - 11,11,11, 9, 9, 9,10, 9, 9,10,10,10,10,11,11,10, - 11,11,11,11,10, 9,10,10, 9, 9, 9, 9,10,10,11,10, - 11,11,11,11,11, 9, 9, 9, 9,10, 9,10,10,10,10,11, - 10,11,11,11,11,11,10,10, 9, 9,10, 9,10,10,10,10, - 10,10,10,11,11,11,11,11,11, 9, 9,10, 9,10, 9,10, - 10, -}; - -static const static_codebook _44c2_s_p9_2 = { - 2, 289, - (long *)_vq_lengthlist__44c2_s_p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c2_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__44c2_s_short[] = { - 11, 9,13,12,12,11,12,12,13,15, 8, 2,11, 4, 8, 5, - 7,10,12,15,13, 7,10, 9, 8, 8,10,13,17,17,11, 4, - 12, 5, 9, 5, 8,11,14,16,12, 6, 8, 7, 6, 6, 8,11, - 13,16,11, 4, 9, 5, 6, 4, 6,10,13,16,11, 6,11, 7, - 7, 6, 7,10,13,15,13, 9,12, 9, 8, 6, 8,10,12,14, - 14,10,10, 8, 6, 5, 6, 9,11,13,15,11,11, 9, 6, 5, - 6, 8, 9,12, -}; - -static const static_codebook _huff_book__44c2_s_short = { - 2, 100, - (long *)_huff_lengthlist__44c2_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c3_s_long[] = { - 5, 6,11,11,11,11,10,10,12,11, 5, 2,11, 5, 6, 6, - 7, 9,11,13,13,10, 7,11, 6, 7, 8, 9,10,12,11, 5, - 11, 6, 8, 7, 9,11,14,15,11, 6, 6, 8, 4, 5, 7, 8, - 10,13,10, 5, 7, 7, 5, 5, 6, 8,10,11,10, 7, 7, 8, - 6, 5, 5, 7, 9, 9,11, 8, 8,11, 8, 7, 6, 6, 7, 9, - 12,11,10,13, 9, 9, 7, 7, 7, 9,11,13,12,15,12,11, - 9, 8, 8, 8, -}; - -static const static_codebook _huff_book__44c3_s_long = { - 2, 100, - (long *)_huff_lengthlist__44c3_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c3_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c3_s_p1_0[] = { - 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 0, - 0, 0, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 6, 8, 7, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c3_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__44c3_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c3_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c3_s_p2_0[] = { - 2, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, - 7, 8, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 7, - 7, 0, 0, 0, 7, 7, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 5, 6, 6, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, - 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, - 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, - 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8,10,10, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 0, 0, 0, - 10,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0, 9, - 9, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c3_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c3_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c3_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c3_s_p3_0[] = { - 2, 4, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c3_s_p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44c3_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c3_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c3_s_p4_0[] = { - 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c3_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__44c3_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c3_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c3_s_p5_0[] = { - 1, 3, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 7, 7, 7, 8, - 9, 9, 0, 5, 5, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, - 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, - 9, 9, 9, 9,10,10, 0, 0, 0, 9, 9, 9, 9,10,10, 0, - 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0,10,10,11, - 11, -}; - -static const static_codebook _44c3_s_p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44c3_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c3_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c3_s_p6_0[] = { - 2, 3, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 10, 0, 5, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, - 11,11, 0, 5, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, - 9,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,10,11,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 8, - 9, 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, - 8, 9, 9,10,10,11,11,12,11,12,12, 0, 0, 0, 0, 0, - 9,10,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, - 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,13, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13, - 13, -}; - -static const static_codebook _44c3_s_p6_0 = { - 2, 289, - (long *)_vq_lengthlist__44c3_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c3_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c3_s_p7_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, - 10,12,11,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,10,11,10,10, 7,11,11,11,11,11,12,11,11, 6, - 9, 9,11,10,10,11,10,10, 6, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44c3_s_p7_0 = { - 4, 81, - (long *)_vq_lengthlist__44c3_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c3_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c3_s_p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 8, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 8, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 9, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c3_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44c3_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c3_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c3_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c3_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 5, 7, 7, 8, - 8, 8, 8, 9, 9,11,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,12, 0,13, - 13, 9, 9,10,10,10,10,11,11,12,12, 0, 0, 0,10,10, - 10,10,11,11,12,12,12,12, 0, 0, 0,10,10,10,10,11, - 11,12,12,12,12, 0, 0, 0,14,14,11,11,11,11,12,12, - 13,13, 0, 0, 0,14,14,11,11,11,11,12,12,13,13, 0, - 0, 0, 0, 0,12,12,12,12,13,13,14,13, 0, 0, 0, 0, - 0,13,13,12,12,13,12,14,13, -}; - -static const static_codebook _44c3_s_p8_0 = { - 2, 169, - (long *)_vq_lengthlist__44c3_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c3_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c3_s_p8_1[] = { - 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 4, 5, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c3_s_p8_1 = { - 2, 25, - (long *)_vq_lengthlist__44c3_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c3_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c3_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c3_s_p9_0[] = { - 1, 4, 4,12,12,12,12,12,12,12,12,12,12, 4, 9, 8, - 12,12,12,12,12,12,12,12,12,12, 2, 9, 7,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,11,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _44c3_s_p9_0 = { - 2, 169, - (long *)_vq_lengthlist__44c3_s_p9_0, - 1, -514332672, 1627381760, 4, 0, - (long *)_vq_quantlist__44c3_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c3_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44c3_s_p9_1[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 7, 9, 9,10,10,10,10, 6, - 5, 5, 7, 7, 8, 8,10, 8,11,10,12,12,13,13, 6, 5, - 5, 7, 7, 8, 8,10, 9,11,11,12,12,13,12,18, 8, 8, - 8, 8, 9, 9,10, 9,11,10,12,12,13,13,18, 8, 8, 8, - 8, 9, 9,10,10,11,11,13,12,14,13,18,11,11, 9, 9, - 10,10,11,11,11,12,13,12,13,14,18,11,11, 9, 8,11, - 10,11,11,11,11,12,12,14,13,18,18,18,10,11,10,11, - 12,12,12,12,13,12,14,13,18,18,18,10,11,11, 9,12, - 11,12,12,12,13,13,13,18,18,17,14,14,11,11,12,12, - 13,12,14,12,14,13,18,18,18,14,14,11,10,12, 9,12, - 13,13,13,13,13,18,18,17,16,18,13,13,12,12,13,11, - 14,12,14,14,17,18,18,17,18,13,12,13,10,12,11,14, - 14,14,14,17,18,18,18,18,15,16,12,12,13,10,14,12, - 14,15,18,18,18,16,17,16,14,12,11,13,10,13,13,14, - 15, -}; - -static const static_codebook _44c3_s_p9_1 = { - 2, 225, - (long *)_vq_lengthlist__44c3_s_p9_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__44c3_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c3_s_p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c3_s_p9_2[] = { - 2, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, - 8,10, 6, 6, 7, 7, 8, 7, 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9,10, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10, 9,10,10,10,11,11, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,11,11,11, 9, 9, - 9, 9, 9, 9,10,10, 9, 9,10, 9,11,10,11,11,11, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10, 9,11,11,11,11,11, - 9, 9, 9, 9,10,10, 9, 9, 9, 9,10, 9,11,11,11,11, - 11,11,11, 9, 9, 9, 9, 9, 9,10,10,10,10,11,11,11, - 11,11,11,11,10, 9,10,10, 9,10, 9, 9,10, 9,11,10, - 10,11,11,11,11, 9,10, 9, 9, 9, 9,10,10,10,10,11, - 11,11,11,11,11,10,10,10, 9, 9,10, 9,10, 9,10,10, - 10,10,11,11,11,11,11,11,11, 9, 9, 9, 9, 9,10,10, - 10, -}; - -static const static_codebook _44c3_s_p9_2 = { - 2, 289, - (long *)_vq_lengthlist__44c3_s_p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c3_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__44c3_s_short[] = { - 10, 9,13,11,14,10,12,13,13,14, 7, 2,12, 5,10, 5, - 7,10,12,14,12, 6, 9, 8, 7, 7, 9,11,13,16,10, 4, - 12, 5,10, 6, 8,12,14,16,12, 6, 8, 7, 6, 5, 7,11, - 12,16,10, 4, 8, 5, 6, 4, 6, 9,13,16,10, 6,10, 7, - 7, 6, 7, 9,13,15,12, 9,11, 9, 8, 6, 7,10,12,14, - 14,11,10, 9, 6, 5, 6, 9,11,13,15,13,11,10, 6, 5, - 6, 8, 9,11, -}; - -static const static_codebook _huff_book__44c3_s_short = { - 2, 100, - (long *)_huff_lengthlist__44c3_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c4_s_long[] = { - 4, 7,11,11,11,11,10,11,12,11, 5, 2,11, 5, 6, 6, - 7, 9,11,12,11, 9, 6,10, 6, 7, 8, 9,10,11,11, 5, - 11, 7, 8, 8, 9,11,13,14,11, 6, 5, 8, 4, 5, 7, 8, - 10,11,10, 6, 7, 7, 5, 5, 6, 8, 9,11,10, 7, 8, 9, - 6, 6, 6, 7, 8, 9,11, 9, 9,11, 7, 7, 6, 6, 7, 9, - 12,12,10,13, 9, 8, 7, 7, 7, 8,11,13,11,14,11,10, - 9, 8, 7, 7, -}; - -static const static_codebook _huff_book__44c4_s_long = { - 2, 100, - (long *)_huff_lengthlist__44c4_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c4_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c4_s_p1_0[] = { - 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 0, - 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 6, 8, 7, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, - 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c4_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__44c4_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c4_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c4_s_p2_0[] = { - 2, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, - 7, 7, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 7, - 7, 0, 0, 0, 7, 7, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 5, 6, 6, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 7, 7, 0, 0, - 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, - 7, 8, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, - 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, - 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7,10,10, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 0, 0, 0, - 10,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0, 9, - 9, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c4_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c4_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c4_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c4_s_p3_0[] = { - 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c4_s_p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44c4_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c4_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c4_s_p4_0[] = { - 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 8, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c4_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__44c4_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c4_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c4_s_p5_0[] = { - 2, 3, 3, 6, 6, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, - 9, 9, 0, 4, 5, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, - 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10, 9, 0, 0, 0, - 9, 8, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _44c4_s_p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44c4_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c4_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c4_s_p6_0[] = { - 2, 4, 4, 6, 6, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11, - 11, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11, - 11,11, 0, 4, 4, 7, 6, 8, 8, 9, 9, 9, 9,10,10,11, - 11,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, - 9,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9, - 9,10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, - 9, 9, 9,10,10,11,11,11,12,12,12, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,11,11,12,12,13,12, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,11,11,12,12,12,12, 0, 0, 0, - 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,12,12,13,13,13,13, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,12,13,13, - 13, -}; - -static const static_codebook _44c4_s_p6_0 = { - 2, 289, - (long *)_vq_lengthlist__44c4_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c4_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c4_s_p7_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, - 10,11,11,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,10,11,10,10, 7,11,11,12,11,11,12,11,11, 6, - 9, 9,11,10,10,11,10,10, 6, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44c4_s_p7_0 = { - 4, 81, - (long *)_vq_lengthlist__44c4_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c4_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c4_s_p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 8, 8, 8, 8, 8, 8,10,10,10, 8, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 9, 8,10,10, - 10,10,10, 8, 8, 8, 8, 9, 9, -}; - -static const static_codebook _44c4_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44c4_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c4_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c4_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c4_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, - 7, 7, 8, 8, 8, 8, 9,10,11,11, 7, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9, 9,10,10,10,10,11,11, 0,13, - 13, 9, 9,10, 9,10,10,11,11,11,12, 0, 0, 0,10,10, - 10,10,10,10,11,11,12,12, 0, 0, 0,10,10,10,10,10, - 10,11,11,12,12, 0, 0, 0,14,14,11,11,11,11,12,12, - 12,12, 0, 0, 0,14,14,11,11,11,11,12,12,12,13, 0, - 0, 0, 0, 0,12,12,12,12,12,12,13,13, 0, 0, 0, 0, - 0,13,12,12,12,12,12,13,13, -}; - -static const static_codebook _44c4_s_p8_0 = { - 2, 169, - (long *)_vq_lengthlist__44c4_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c4_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c4_s_p8_1[] = { - 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 5, 4, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c4_s_p8_1 = { - 2, 25, - (long *)_vq_lengthlist__44c4_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c4_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c4_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c4_s_p9_0[] = { - 1, 3, 3,12,12,12,12,12,12,12,12,12,12, 4, 7, 7, - 12,12,12,12,12,12,12,12,12,12, 3, 8, 8,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12, -}; - -static const static_codebook _44c4_s_p9_0 = { - 2, 169, - (long *)_vq_lengthlist__44c4_s_p9_0, - 1, -513964032, 1628680192, 4, 0, - (long *)_vq_quantlist__44c4_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c4_s_p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44c4_s_p9_1[] = { - 1, 4, 4, 5, 5, 7, 7, 9, 8,10, 9,10,10,10,10, 6, - 5, 5, 7, 7, 9, 8,10, 9,11,10,12,12,13,13, 6, 5, - 5, 7, 7, 9, 9,10,10,11,11,12,12,12,13,19, 8, 8, - 8, 8, 9, 9,10,10,12,11,12,12,13,13,19, 8, 8, 8, - 8, 9, 9,11,11,12,12,13,13,13,13,19,12,12, 9, 9, - 11,11,11,11,12,11,13,12,13,13,18,12,12, 9, 9,11, - 10,11,11,12,12,12,13,13,14,19,18,18,11,11,11,11, - 12,12,13,12,13,13,14,14,16,18,18,11,11,11,10,12, - 11,13,13,13,13,13,14,17,18,18,14,15,11,12,12,13, - 13,13,13,14,14,14,18,18,18,15,15,12,10,13,10,13, - 13,13,13,13,14,18,17,18,17,18,12,13,12,13,13,13, - 14,14,16,14,18,17,18,18,17,13,12,13,10,12,12,14, - 14,14,14,17,18,18,18,18,14,15,12,12,13,12,14,14, - 15,15,18,18,18,17,18,15,14,12,11,12,12,14,14,14, - 15, -}; - -static const static_codebook _44c4_s_p9_1 = { - 2, 225, - (long *)_vq_lengthlist__44c4_s_p9_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44c4_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c4_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__44c4_s_p9_2[] = { - 2, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 9, 9, 9, 9,11, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10,11, 6, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,11, - 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10,10,10,12,11,11, 7, 7, 8, 8, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,12,11,12, 8, 8, 8, 8, - 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,11,11, - 11, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10,10,10,10, - 10,10,10,11,11,12, 9, 9, 9, 9, 9, 9,10, 9,10,10, - 10,10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,10,10,10,10,11,12,11, - 11,11, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,11,11,11,12,12,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,11,12,11,12, - 11,11,11, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,11,12,11,11,11,11,11,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,11,11,11,12,11,11,11,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,12,11,11,12,11, - 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, - 10,10,10,10,10,11,11,11,11,12,12,11,11,11,11,11, - 11,11,10,10,10,10,10,10,10,10,12,12,12,11,11,11, - 12,11,11,11,10,10,10,10,10,10,10,10,10,10,10,12, - 11,12,12,12,12,12,11,12,11,11,10,10,10,10,10,10, - 10,10,10,10,12,12,12,12,11,11,11,11,11,11,11,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c4_s_p9_2 = { - 2, 441, - (long *)_vq_lengthlist__44c4_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c4_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__44c4_s_short[] = { - 4, 7,14,10,15,10,12,15,16,15, 4, 2,11, 5,10, 6, - 8,11,14,14,14,10, 7,11, 6, 8,10,11,13,15, 9, 4, - 11, 5, 9, 6, 9,12,14,15,14, 9, 6, 9, 4, 5, 7,10, - 12,13, 9, 5, 7, 6, 5, 5, 7,10,13,13,10, 8, 9, 8, - 7, 6, 8,10,14,14,13,11,10,10, 7, 7, 8,11,14,15, - 13,12, 9, 9, 6, 5, 7,10,14,17,15,13,11,10, 6, 6, - 7, 9,12,17, -}; - -static const static_codebook _huff_book__44c4_s_short = { - 2, 100, - (long *)_huff_lengthlist__44c4_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c5_s_long[] = { - 3, 8, 9,13,10,12,12,12,12,12, 6, 4, 6, 8, 6, 8, - 10,10,11,12, 8, 5, 4,10, 4, 7, 8, 9,10,11,13, 8, - 10, 8, 9, 9,11,12,13,14,10, 6, 4, 9, 3, 5, 6, 8, - 10,11,11, 8, 6, 9, 5, 5, 6, 7, 9,11,12, 9, 7,11, - 6, 6, 6, 7, 8,10,12,11, 9,12, 7, 7, 6, 6, 7, 9, - 13,12,10,13, 9, 8, 7, 7, 7, 8,11,15,11,15,11,10, - 9, 8, 7, 7, -}; - -static const static_codebook _huff_book__44c5_s_long = { - 2, 100, - (long *)_huff_lengthlist__44c5_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c5_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c5_s_p1_0[] = { - 2, 4, 4, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, - 0, 0, 4, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, - 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, - 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c5_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__44c5_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c5_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c5_s_p2_0[] = { - 2, 4, 4, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, - 8, 7, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 0, 8, - 8, 0, 0, 0, 8, 7, 0, 0, 0,10,10, 0, 0, 0, 0, 0, - 0, 0, 4, 6, 6, 0, 0, 0, 8, 8, 0, 0, 0, 7, 8, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 8, 8, 0, 0, - 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 5, - 7, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0,10, - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, - 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, - 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8,10,10, 0, 0, 0,10,10, 0, 0, 0, 9,10, 0, 0, 0, - 11,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0,10, - 10, 0, 0, 0,10,10, 0, 0, 0,10,11, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c5_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c5_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c5_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c5_s_p3_0[] = { - 2, 4, 3, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 5, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 8, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 6, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c5_s_p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44c5_s_p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c5_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c5_s_p4_0[] = { - 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, - 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, - 7, 7, 0, 0, 0, 0, 0, 0, 0, 8, 7, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c5_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__44c5_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c5_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c5_s_p5_0[] = { - 2, 4, 3, 6, 6, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, - 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, - 7, 7, 9, 9, 0, 0, 0, 7, 6, 7, 7, 9, 9, 0, 0, 0, - 8, 8, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, - 0, 0, 9, 9, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _44c5_s_p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44c5_s_p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c5_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p6_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c5_s_p6_0[] = { - 2, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10,10,11, - 11, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11, - 12,12, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11, - 11,12,12, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 7, 7, 9, 9,10,10,10,10, - 11,11,11,11,12,12, 0, 0, 0, 7, 7, 8, 9,10,10,10, - 10,11,11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10, - 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, - 10,10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, - 9, 9,10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,11,12,12,12,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,11,11,12,12,12,13,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,12,13,13,13,13, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13, - 13, -}; - -static const static_codebook _44c5_s_p6_0 = { - 2, 289, - (long *)_vq_lengthlist__44c5_s_p6_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c5_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c5_s_p7_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, - 10,11,11,11, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,10,11,10,10, 7,11,11,12,11,11,12,11,11, 6, - 9, 9,11,10,10,11,10,10, 6, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44c5_s_p7_0 = { - 4, 81, - (long *)_vq_lengthlist__44c5_s_p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c5_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c5_s_p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 9,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c5_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44c5_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c5_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c5_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c5_s_p8_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, - 7, 7, 8, 8, 8, 9,10,10,10,10, 7, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9,10,10,10,10,10,11,11, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,11,11, 0, 0, 0,10,10, - 10,10,10,10,11,11,11,11, 0, 0, 0,10,10,10,10,10, - 10,11,11,12,12, 0, 0, 0,14,14,11,11,11,11,12,12, - 12,12, 0, 0, 0,14,14,11,11,11,11,12,12,12,12, 0, - 0, 0, 0, 0,12,12,12,12,12,12,13,13, 0, 0, 0, 0, - 0,12,12,12,12,12,12,13,13, -}; - -static const static_codebook _44c5_s_p8_0 = { - 2, 169, - (long *)_vq_lengthlist__44c5_s_p8_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c5_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p8_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c5_s_p8_1[] = { - 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 4, 5, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c5_s_p8_1 = { - 2, 25, - (long *)_vq_lengthlist__44c5_s_p8_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c5_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c5_s_p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44c5_s_p9_0[] = { - 1, 3, 3,13,13,13,13,13,13,13,13,13,13,13,13, 4, - 7, 7,13,13,13,13,13,13,13,13,13,13,13,13, 3, 8, - 6,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,12,12,12,12,12,12,12, - 12, -}; - -static const static_codebook _44c5_s_p9_0 = { - 2, 225, - (long *)_vq_lengthlist__44c5_s_p9_0, - 1, -512522752, 1628852224, 4, 0, - (long *)_vq_quantlist__44c5_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c5_s_p9_1[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c5_s_p9_1[] = { - 1, 4, 4, 5, 5, 7, 7, 9, 8,10, 9,10,10,11,10,11, - 11, 6, 5, 5, 7, 7, 8, 9,10,10,11,10,12,11,12,11, - 13,12, 6, 5, 5, 7, 7, 9, 9,10,10,11,11,12,12,13, - 12,13,13,18, 8, 8, 8, 8, 9, 9,10,11,11,11,12,11, - 13,11,13,12,18, 8, 8, 8, 8,10,10,11,11,12,12,13, - 13,13,13,13,14,18,12,12, 9, 9,11,11,11,11,12,12, - 13,12,13,12,13,13,20,13,12, 9, 9,11,11,11,11,12, - 12,13,13,13,14,14,13,20,18,19,11,12,11,11,12,12, - 13,13,13,13,13,13,14,13,18,19,19,12,11,11,11,12, - 12,13,12,13,13,13,14,14,13,18,17,19,14,15,12,12, - 12,13,13,13,14,14,14,14,14,14,19,19,19,16,15,12, - 11,13,12,14,14,14,13,13,14,14,14,19,18,19,18,19, - 13,13,13,13,14,14,14,13,14,14,14,14,18,17,19,19, - 19,13,13,13,11,13,11,13,14,14,14,14,14,19,17,17, - 18,18,16,16,13,13,13,13,14,13,15,15,14,14,19,19, - 17,17,18,16,16,13,11,14,10,13,12,14,14,14,14,19, - 19,19,19,19,18,17,13,14,13,11,14,13,14,14,15,15, - 19,19,19,17,19,18,18,14,13,12,11,14,11,15,15,15, - 15, -}; - -static const static_codebook _44c5_s_p9_1 = { - 2, 289, - (long *)_vq_lengthlist__44c5_s_p9_1, - 1, -520814592, 1620377600, 5, 0, - (long *)_vq_quantlist__44c5_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c5_s_p9_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__44c5_s_p9_2[] = { - 3, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 9,11, 5, 6, 7, 7, 8, 7, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, 5, 5, 7, 7, 7, - 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, - 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10, 9,10,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9,10,10,10,10,10,10,11,11,11, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,11,11, - 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,10, - 10,10,10,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, - 9, 9, 9,10, 9,10,10,10,10,10,10,10,10,11,11,11, - 11,11, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10, - 10,10,11,11,11,11,11, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10,10,10,10,10,10,11,11,11,11,11, 9, 9,10, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11, - 11,11,11, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,11,11,11,11,11,11,11,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, - 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, - 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, - 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,11, - 11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, - 10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c5_s_p9_2 = { - 2, 441, - (long *)_vq_lengthlist__44c5_s_p9_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c5_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__44c5_s_short[] = { - 5, 8,10,14,11,11,12,16,15,17, 5, 5, 7, 9, 7, 8, - 10,13,17,17, 7, 5, 5,10, 5, 7, 8,11,13,15,10, 8, - 10, 8, 8, 8,11,15,18,18, 8, 5, 5, 8, 3, 4, 6,10, - 14,16, 9, 7, 6, 7, 4, 3, 5, 9,14,18,10, 9, 8,10, - 6, 5, 6, 9,14,18,12,12,11,12, 8, 7, 8,11,14,18, - 14,13,12,10, 7, 5, 6, 9,14,18,14,14,13,10, 6, 5, - 6, 8,11,16, -}; - -static const static_codebook _huff_book__44c5_s_short = { - 2, 100, - (long *)_huff_lengthlist__44c5_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c6_s_long[] = { - 3, 8,11,13,14,14,13,13,16,14, 6, 3, 4, 7, 9, 9, - 10,11,14,13,10, 4, 3, 5, 7, 7, 9,10,13,15,12, 7, - 4, 4, 6, 6, 8,10,13,15,12, 8, 6, 6, 6, 6, 8,10, - 13,14,11, 9, 7, 6, 6, 6, 7, 8,12,11,13,10, 9, 8, - 7, 6, 6, 7,11,11,13,11,10, 9, 9, 7, 7, 6,10,11, - 13,13,13,13,13,11, 9, 8,10,12,12,15,15,16,15,12, - 11,10,10,12, -}; - -static const static_codebook _huff_book__44c6_s_long = { - 2, 100, - (long *)_huff_lengthlist__44c6_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c6_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c6_s_p1_0[] = { - 1, 5, 5, 0, 5, 5, 0, 5, 5, 5, 8, 7, 0, 9, 9, 0, - 9, 8, 5, 7, 8, 0, 9, 9, 0, 8, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, - 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 9, 9, 0, 8, 8, 0, 8, 8, 5, 9, 9, 0, 8, 8, 0, 8, - 8, -}; -static const static_codebook _44c6_s_p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44c6_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c6_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c6_s_p2_0[] = { - 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, - 7, 7, 9, 9, 0, 0, 0, 9, 9, 5, 7, 7, 9, 9, 0, 8, - 8,10,10, 0, 8, 7,10, 9, 0,10,10,11,11, 0, 0, 0, - 11,11, 5, 7, 7, 9, 9, 0, 8, 8,10,10, 0, 7, 8, 9, - 10, 0,10,10,11,11, 0, 0, 0,11,11, 8, 9, 9,11,11, - 0,11,11,12,12, 0,11,10,12,12, 0,13,14,14,14, 0, - 0, 0,14,13, 8, 9, 9,11,11, 0,11,11,12,12, 0,10, - 11,12,12, 0,14,13,14,14, 0, 0, 0,13,14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, - 0, 7, 7,10,10, 0, 9, 9,11,10, 0, 0, 0,11,11, 5, - 7, 8,10,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, - 9,10,11, 0, 0, 0,11,11, 8,10, 9,12,12, 0,10,10, - 12,12, 0,10,10,12,12, 0,12,12,13,13, 0, 0, 0,13, - 13, 8, 9,10,12,12, 0,10,10,11,12, 0,10,10,12,12, - 0,12,12,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 8, 8,11,11, 0, 7, 7,10,10, 0, 7, 7, - 10,10, 0, 9, 9,10,11, 0, 0, 0,11,10, 5, 8, 8,11, - 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 9,11,11, - 0, 0, 0,10,11, 8,10,10,12,12, 0,10,10,12,12, 0, - 10,10,12,12, 0,12,13,13,13, 0, 0, 0,14,13, 8,10, - 10,12,12, 0,10,10,12,12, 0,10,10,12,12, 0,13,12, - 13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7,10,10,14,13, 0, 9, 9,13,12, 0, 9, 9,12,12, 0, - 10,10,12,12, 0, 0, 0,12,12, 7,10,10,13,14, 0, 9, - 9,12,13, 0, 9, 9,12,12, 0,10,10,12,12, 0, 0, 0, - 12,12, 9,11,11,14,13, 0,11,10,14,13, 0,11,11,13, - 13, 0,12,12,13,13, 0, 0, 0,13,13, 9,11,11,13,14, - 0,10,11,13,14, 0,11,11,13,13, 0,12,12,13,13, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 11,11,14,14, 0,11,11,13,13, 0,11,10,13,13, 0,12, - 12,13,13, 0, 0, 0,13,13, 9,11,11,14,14, 0,11,11, - 13,13, 0,10,11,13,13, 0,12,12,14,13, 0, 0, 0,13, - 13, -}; - -static const static_codebook _44c6_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c6_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c6_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c6_s_p3_0[] = { - 2, 3, 4, 6, 6, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, - 9,10, 0, 4, 4, 6, 6, 7, 7,10, 9, 0, 5, 5, 7, 7, - 8, 8,10,10, 0, 0, 0, 7, 6, 8, 8,10,10, 0, 0, 0, - 7, 7, 9, 9,11,11, 0, 0, 0, 7, 7, 9, 9,11,11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c6_s_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44c6_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c6_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c6_s_p4_0[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9,10,10, - 10, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10,10, - 11,11, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,11, 0, 0, 0, 7, 7, 9, 9,10,10,10,10, - 11,11,11,11,12,12, 0, 0, 0, 7, 7, 9, 9,10,10,10, - 10,11,11,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, - 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, 8, 9, - 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c6_s_p4_0 = { - 2, 289, - (long *)_vq_lengthlist__44c6_s_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c6_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c6_s_p5_0[] = { - 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 6, 9, 9,10,10, - 10, 9, 4, 6, 6, 9,10, 9,10, 9,10, 6, 9, 9,10,12, - 11,10,11,11, 7,10, 9,11,12,12,12,12,12, 7,10,10, - 11,12,12,12,12,12, 6,10,10,10,12,12,11,12,12, 7, - 9,10,11,12,12,12,12,12, 7,10, 9,12,12,12,12,12, - 12, -}; - -static const static_codebook _44c6_s_p5_0 = { - 4, 81, - (long *)_vq_lengthlist__44c6_s_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c6_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c6_s_p5_1[] = { - 3, 5, 4, 6, 6, 7, 7, 8, 8, 8, 8,11, 4, 4, 6, 6, - 7, 7, 8, 8, 8, 8,11, 4, 4, 6, 6, 7, 7, 8, 8, 8, - 8,11, 6, 6, 6, 6, 8, 8, 8, 8, 9, 9,11,11,11, 6, - 6, 7, 8, 8, 8, 8, 9,11,11,11, 7, 7, 8, 8, 8, 8, - 8, 8,11,11,11, 7, 7, 8, 8, 8, 8, 8, 8,11,11,11, - 8, 8, 8, 8, 8, 8, 8, 8,11,11,11,10,10, 8, 8, 8, - 8, 8, 8,11,11,11,10,10, 8, 8, 8, 8, 8, 8,11,11, - 11,10,10, 7, 7, 8, 8, 8, 8, -}; - -static const static_codebook _44c6_s_p5_1 = { - 2, 121, - (long *)_vq_lengthlist__44c6_s_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c6_s_p5_1, - 0 -}; - -static const long _vq_quantlist__44c6_s_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c6_s_p6_0[] = { - 1, 4, 4, 6, 6, 8, 8, 8, 8,10, 9,10,10, 6, 5, 5, - 7, 7, 9, 9, 9, 9,10,10,11,11, 6, 5, 5, 7, 7, 9, - 9,10, 9,11,10,11,11, 0, 6, 6, 7, 7, 9, 9,10,10, - 11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10,11,11,12, - 12, 0,11,11, 8, 8,10,10,11,11,12,12,12,12, 0,11, - 12, 9, 8,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static const static_codebook _44c6_s_p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44c6_s_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c6_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c6_s_p6_1[] = { - 3, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c6_s_p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44c6_s_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c6_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c6_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c6_s_p7_0[] = { - 1, 4, 4, 6, 6, 8, 8, 8, 8,10,10,11,10, 6, 5, 5, - 7, 7, 8, 8, 9, 9,10,10,12,11, 6, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,12,11,21, 7, 7, 7, 7, 9, 9,10,10, - 11,11,12,12,21, 7, 7, 7, 7, 9, 9,10,10,11,11,12, - 12,21,12,12, 9, 9,10,10,11,11,11,11,12,12,21,12, - 12, 9, 9,10,10,11,11,12,12,12,12,21,21,21,11,11, - 10,10,11,12,12,12,13,13,21,21,21,11,11,10,10,12, - 12,12,12,13,13,21,21,21,15,15,11,11,12,12,13,13, - 13,13,21,21,21,15,16,11,11,12,12,13,13,14,14,21, - 21,21,21,20,13,13,13,13,13,13,14,14,20,20,20,20, - 20,13,13,13,13,13,13,14,14, -}; - -static const static_codebook _44c6_s_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44c6_s_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44c6_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c6_s_p7_1[] = { - 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 9, 5, 5, 6, 6, - 7, 7, 7, 7, 8, 7, 8, 5, 5, 6, 6, 7, 7, 7, 7, 7, - 7, 9, 6, 6, 7, 7, 7, 7, 8, 7, 7, 8, 9, 9, 9, 7, - 7, 7, 7, 7, 7, 7, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, - 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, - 8, 8, 8, 8, 7, 7, 8, 8, 9, 9, 9, 9, 8, 8, 8, 7, - 7, 8, 8, 9, 9, 9, 8, 8, 8, 8, 7, 7, 8, 8, 9, 9, - 9, 8, 8, 7, 7, 7, 7, 8, 8, -}; - -static const static_codebook _44c6_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44c6_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c6_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c6_s_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44c6_s_p8_0[] = { - 1, 4, 4, 7, 7, 8, 8, 7, 7, 8, 7, 9, 8,10, 9, 6, - 5, 5, 8, 8, 9, 9, 8, 8, 9, 9,11,10,11,10, 6, 5, - 5, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11,11,18, 8, 8, - 9, 8,10,10, 9, 9,10,10,10,10,11,10,18, 8, 8, 9, - 9,10,10, 9, 9,10,10,11,11,12,12,18,12,13, 9,10, - 10,10, 9,10,10,10,11,11,12,11,18,13,13, 9, 9,10, - 10,10,10,10,10,11,11,12,12,18,18,18,10,10, 9, 9, - 11,11,11,11,11,12,12,12,18,18,18,10, 9,10, 9,11, - 10,11,11,11,11,13,12,18,18,18,14,13,10,10,11,11, - 12,12,12,12,12,12,18,18,18,14,13,10,10,11,10,12, - 12,12,12,12,12,18,18,18,18,18,12,12,11,11,12,12, - 13,13,13,14,18,18,18,18,18,12,12,11,11,12,11,13, - 13,14,13,18,18,18,18,18,16,16,11,12,12,13,13,13, - 14,13,18,18,18,18,18,16,15,12,11,12,11,13,11,15, - 14, -}; - -static const static_codebook _44c6_s_p8_0 = { - 2, 225, - (long *)_vq_lengthlist__44c6_s_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44c6_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__44c6_s_p8_1[] = { - 3, 5, 5, 6, 6, 7, 7, 7, 7, 8, 7, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, - 8, 8, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9,10, - 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,11,11, 8, 7, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11, - 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,11,11,11,11,11, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,11,11,11, - 11,11, 9, 9, 9, 9, 9, 9,10, 9, 9,10, 9,10, 9, 9, - 10, 9,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9,10,10, - 10,10, 9,10,10, 9,10,11,11,11,11,11, 9, 9, 9, 9, - 10,10,10, 9,10,10,10,10, 9,10,10, 9,11,11,11,11, - 11,11,11, 9, 9, 9, 9,10,10,10,10, 9,10,10,10,10, - 10,11,11,11,11,11,11,11,10, 9,10,10,10,10,10,10, - 10, 9,10, 9,10,10,11,11,11,11,11,11,11,10, 9,10, - 9,10,10, 9,10,10,10,10,10,10,10,11,11,11,11,11, - 11,11,10,10,10,10,10,10,10, 9,10,10,10,10,10, 9, - 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, - 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, - 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, - 11,11,11,10,10,10,10,10,10,10,10,10, 9,10,10,11, - 11,11,11,11,11,11,11,11,10,10,10, 9,10,10,10,10, - 10,10,10,10,10,11,11,11,11,11,11,11,11,10,11, 9, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c6_s_p8_1 = { - 2, 441, - (long *)_vq_lengthlist__44c6_s_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c6_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c6_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c6_s_p9_0[] = { - 1, 3, 3,11,11,11,11,11,11,11,11,11,11, 4, 7, 7, - 11,11,11,11,11,11,11,11,11,11, 5, 8, 9,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c6_s_p9_0 = { - 2, 169, - (long *)_vq_lengthlist__44c6_s_p9_0, - 1, -511845376, 1630791680, 4, 0, - (long *)_vq_quantlist__44c6_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c6_s_p9_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c6_s_p9_1[] = { - 1, 4, 4, 7, 7, 7, 7, 7, 6, 8, 8, 8, 8, 6, 6, 6, - 8, 8, 8, 8, 8, 7, 9, 8,10,10, 5, 6, 6, 8, 8, 9, - 9, 8, 8,10,10,10,10,16, 9, 9, 9, 9, 9, 9, 9, 8, - 10, 9,11,11,16, 8, 9, 9, 9, 9, 9, 9, 9,10,10,11, - 11,16,13,13, 9, 9,10, 9, 9,10,11,11,11,12,16,13, - 14, 9, 8,10, 8, 9, 9,10,10,12,11,16,14,16, 9, 9, - 9, 9,11,11,12,11,12,11,16,16,16, 9, 7, 9, 6,11, - 11,11,10,11,11,16,16,16,11,12, 9,10,11,11,12,11, - 13,13,16,16,16,12,11,10, 7,12,10,12,12,12,12,16, - 16,15,16,16,10,11,10,11,13,13,14,12,16,16,16,15, - 15,12,10,11,11,13,11,12,13, -}; - -static const static_codebook _44c6_s_p9_1 = { - 2, 169, - (long *)_vq_lengthlist__44c6_s_p9_1, - 1, -518889472, 1622704128, 4, 0, - (long *)_vq_quantlist__44c6_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c6_s_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const long _vq_lengthlist__44c6_s_p9_2[] = { - 2, 4, 3, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44c6_s_p9_2 = { - 1, 49, - (long *)_vq_lengthlist__44c6_s_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44c6_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__44c6_s_short[] = { - 3, 9,11,11,13,14,19,17,17,19, 5, 4, 5, 8,10,10, - 13,16,18,19, 7, 4, 4, 5, 8, 9,12,14,17,19, 8, 6, - 5, 5, 7, 7,10,13,16,18,10, 8, 7, 6, 5, 5, 8,11, - 17,19,11, 9, 7, 7, 5, 4, 5, 8,17,19,13,11, 8, 7, - 7, 5, 5, 7,16,18,14,13, 8, 6, 6, 5, 5, 7,16,18, - 18,16,10, 8, 8, 7, 7, 9,16,18,18,18,12,10,10, 9, - 9,10,17,18, -}; - -static const static_codebook _huff_book__44c6_s_short = { - 2, 100, - (long *)_huff_lengthlist__44c6_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c7_s_long[] = { - 3, 8,11,13,15,14,14,13,15,14, 6, 4, 5, 7, 9,10, - 11,11,14,13,10, 4, 3, 5, 7, 8, 9,10,13,13,12, 7, - 4, 4, 5, 6, 8, 9,12,14,13, 9, 6, 5, 5, 6, 8, 9, - 12,14,12, 9, 7, 6, 5, 5, 6, 8,11,11,12,11, 9, 8, - 7, 6, 6, 7,10,11,13,11,10, 9, 8, 7, 6, 6, 9,11, - 13,13,12,12,12,10, 9, 8, 9,11,12,14,15,15,14,12, - 11,10,10,12, -}; - -static const static_codebook _huff_book__44c7_s_long = { - 2, 100, - (long *)_huff_lengthlist__44c7_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c7_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c7_s_p1_0[] = { - 1, 5, 5, 0, 5, 5, 0, 5, 5, 5, 8, 7, 0, 9, 9, 0, - 9, 8, 5, 7, 8, 0, 9, 9, 0, 8, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 9, 9, 0, 8, 8, 0, 8, 8, 5, 8, 9, - 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 9, 9, 0, 8, 8, 0, 8, 8, 5, 8, 9, 0, 8, 8, 0, 8, - 8, -}; - -static const static_codebook _44c7_s_p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44c7_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c7_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c7_s_p2_0[] = { - 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, - 7, 7, 9, 9, 0, 0, 0, 9, 9, 5, 7, 7, 9, 9, 0, 8, - 8,10,10, 0, 8, 7,10, 9, 0,10,10,11,11, 0, 0, 0, - 11,11, 5, 7, 7, 9, 9, 0, 8, 8,10,10, 0, 7, 8, 9, - 10, 0,10,10,11,11, 0, 0, 0,11,11, 8, 9, 9,11,10, - 0,11,11,12,12, 0,11,10,12,12, 0,13,14,14,14, 0, - 0, 0,14,13, 8, 9, 9,10,11, 0,11,11,12,12, 0,10, - 11,12,12, 0,13,13,14,14, 0, 0, 0,13,14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, - 0, 7, 7,10,10, 0, 9, 9,11,10, 0, 0, 0,11,11, 5, - 7, 8,10,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, - 9,10,11, 0, 0, 0,11,11, 8,10, 9,12,12, 0,10,10, - 12,12, 0,10,10,12,12, 0,12,12,13,13, 0, 0, 0,13, - 13, 8, 9,10,12,12, 0,10,10,12,12, 0,10,10,11,12, - 0,12,12,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 8, 8,11,11, 0, 7, 7,10,10, 0, 7, 7, - 10,10, 0, 9, 9,10,11, 0, 0, 0,11,10, 5, 8, 8,10, - 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 9,11,10, - 0, 0, 0,10,11, 9,10,10,12,12, 0,10,10,12,12, 0, - 10,10,12,12, 0,12,13,13,13, 0, 0, 0,13,12, 9,10, - 10,12,12, 0,10,10,12,12, 0,10,10,12,12, 0,13,12, - 13,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7,10,10,14,13, 0, 9, 9,12,12, 0, 9, 9,12,12, 0, - 10,10,12,12, 0, 0, 0,12,12, 7,10,10,13,14, 0, 9, - 9,12,13, 0, 9, 9,12,12, 0,10,10,12,12, 0, 0, 0, - 12,12, 9,11,11,14,13, 0,11,10,13,12, 0,11,11,13, - 13, 0,12,12,13,13, 0, 0, 0,13,13, 9,11,11,13,14, - 0,10,11,12,13, 0,11,11,13,13, 0,12,12,13,13, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 11,11,14,14, 0,10,11,13,13, 0,11,10,13,13, 0,12, - 12,13,13, 0, 0, 0,13,12, 9,11,11,14,14, 0,11,10, - 13,13, 0,10,11,13,13, 0,12,12,14,13, 0, 0, 0,13, - 13, -}; - -static const static_codebook _44c7_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c7_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c7_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c7_s_p3_0[] = { - 2, 4, 4, 5, 5, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, - 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 6, 6, - 8, 8,10,10, 0, 0, 0, 6, 6, 8, 8,10,10, 0, 0, 0, - 7, 7, 9, 9,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c7_s_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44c7_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c7_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c7_s_p4_0[] = { - 3, 4, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11, - 12,12, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11,12,12, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10, - 11,12,12,12, 0, 0, 0, 6, 6, 8, 7, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, - 11,11,12,12,13,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, - 10,11,11,12,12,12,13, 0, 0, 0, 7, 7, 8, 8, 9, 9, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, - 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c7_s_p4_0 = { - 2, 289, - (long *)_vq_lengthlist__44c7_s_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c7_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c7_s_p5_0[] = { - 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 7,10,10,10,10, - 10, 9, 4, 6, 6,10,10,10,10, 9,10, 5,10,10, 9,11, - 12,10,11,12, 7,10,10,11,12,12,12,12,12, 7,10,10, - 11,12,12,12,12,12, 6,10,10,10,12,12,11,12,12, 7, - 10,10,12,12,12,12,11,12, 7,10,10,11,12,12,12,12, - 12, -}; - -static const static_codebook _44c7_s_p5_0 = { - 4, 81, - (long *)_vq_lengthlist__44c7_s_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c7_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c7_s_p5_1[] = { - 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11, 4, 4, 6, 6, - 7, 7, 8, 8, 9, 9,11, 4, 4, 6, 6, 7, 7, 8, 8, 9, - 9,12, 5, 5, 6, 6, 7, 7, 9, 9, 9, 9,12,12,12, 6, - 6, 7, 7, 9, 9, 9, 9,11,11,11, 7, 7, 7, 7, 8, 8, - 9, 9,11,11,11, 7, 7, 7, 7, 8, 8, 9, 9,11,11,11, - 7, 7, 8, 8, 8, 8, 9, 9,11,11,11,11,11, 8, 8, 8, - 8, 8, 9,11,11,11,11,11, 8, 8, 8, 8, 8, 8,11,11, - 11,11,11, 7, 7, 8, 8, 8, 8, -}; - -static const static_codebook _44c7_s_p5_1 = { - 2, 121, - (long *)_vq_lengthlist__44c7_s_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c7_s_p5_1, - 0 -}; - -static const long _vq_quantlist__44c7_s_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c7_s_p6_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 7, 9, 8,10,10, 6, 5, 5, - 7, 7, 8, 8, 9, 9, 9,10,11,11, 7, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,11,11, 0, 7, 7, 7, 7, 9, 8, 9, 9, - 10,10,11,11, 0, 8, 8, 7, 7, 8, 9, 9, 9,10,10,11, - 11, 0,11,11, 9, 9,10,10,11,10,11,11,12,12, 0,12, - 12, 9, 9,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static const static_codebook _44c7_s_p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44c7_s_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c7_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c7_s_p6_1[] = { - 3, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c7_s_p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44c7_s_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c7_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c7_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c7_s_p7_0[] = { - 1, 4, 4, 6, 6, 7, 8, 9, 9,10,10,12,11, 6, 5, 5, - 7, 7, 8, 8, 9,10,11,11,12,12, 7, 5, 5, 7, 7, 8, - 8,10,10,11,11,12,12,20, 7, 7, 7, 7, 8, 9,10,10, - 11,11,12,13,20, 7, 7, 7, 7, 9, 9,10,10,11,12,13, - 13,20,11,11, 8, 8, 9, 9,11,11,12,12,13,13,20,11, - 11, 8, 8, 9, 9,11,11,12,12,13,13,20,20,20,10,10, - 10,10,12,12,13,13,13,13,20,20,20,10,10,10,10,12, - 12,13,13,13,14,20,20,20,14,14,11,11,12,12,13,13, - 14,14,20,20,20,14,14,11,11,12,12,13,13,14,14,20, - 20,20,20,19,13,13,13,13,14,14,15,14,19,19,19,19, - 19,13,13,13,13,14,14,15,15, -}; - -static const static_codebook _44c7_s_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44c7_s_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44c7_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c7_s_p7_1[] = { - 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 8, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 8, 6, 6, 6, 7, 7, 7, 7, 7, 7, - 7, 8, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, - 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, - 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 8, 8, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _44c7_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44c7_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c7_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c7_s_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44c7_s_p8_0[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 7, 9, 8, 9, 9,10,10, 6, - 5, 5, 7, 7, 9, 9, 8, 8,10, 9,11,10,12,11, 6, 5, - 5, 8, 7, 9, 9, 8, 8,10,10,11,11,12,11,19, 8, 8, - 8, 8,10,10, 9, 9,10,10,11,11,12,11,19, 8, 8, 8, - 8,10,10, 9, 9,10,10,11,11,12,12,19,12,12, 9, 9, - 10,10, 9,10,10,10,11,11,12,12,19,12,12, 9, 9,10, - 10,10,10,10,10,12,12,12,12,19,19,19, 9, 9, 9, 9, - 11,10,11,11,12,11,13,13,19,19,19, 9, 9, 9, 9,11, - 10,11,11,11,12,13,13,19,19,19,13,13,10,10,11,11, - 12,12,12,12,13,12,19,19,19,14,13,10,10,11,11,12, - 12,12,13,13,13,19,19,19,19,19,12,12,12,11,12,13, - 14,13,13,13,19,19,19,19,19,12,12,12,11,12,12,13, - 14,13,14,19,19,19,19,19,16,16,12,13,12,13,13,14, - 15,14,19,18,18,18,18,16,15,12,11,12,11,14,12,14, - 14, -}; - -static const static_codebook _44c7_s_p8_0 = { - 2, 225, - (long *)_vq_lengthlist__44c7_s_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44c7_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__44c7_s_p8_1[] = { - 3, 5, 5, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, - 10, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,11,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10, 9, 9,10, 9, 9,10,11,10, - 11,10, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9,10, 9, 9, - 9, 9,11,10,11,10,10, 9, 9, 9, 9, 9, 9,10, 9, 9, - 10, 9, 9,10, 9, 9,10,11,10,10,11,10, 9, 9, 9, 9, - 9,10,10, 9,10,10,10,10, 9,10,10,10,10,10,10,11, - 11,11,10, 9, 9, 9,10,10,10,10,10,10,10,10,10,10, - 10,10,10,11,11,10,10,10,10,10,10,10,10,10,10,10, - 10, 9,10,10, 9,10,11,11,10,11,10,11,10, 9,10,10, - 9,10,10,10,10,10,10,10,10,10,10,11,11,11,11,10, - 11,11,10,10,10,10,10,10, 9,10, 9,10,10, 9,10, 9, - 10,10,10,11,10,11,10,11,11,10,10,10,10,10,10, 9, - 10,10,10,10,10,10,10,11,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,11,10,11, - 11,10,10,10,10, 9, 9,10,10, 9, 9,10, 9,10,10,10, - 10,11,11,10,10,10,10,10,10,10, 9, 9,10,10,10, 9, - 9,10,10,10,10,10,11,10,11,10,10,10,10,10,10, 9, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c7_s_p8_1 = { - 2, 441, - (long *)_vq_lengthlist__44c7_s_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c7_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c7_s_p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c7_s_p9_0[] = { - 1, 3, 3,11,11,11,11,11,11,11,11,11,11, 4, 6, 6, - 11,11,11,11,11,11,11,11,11,11, 4, 7, 7,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _44c7_s_p9_0 = { - 2, 169, - (long *)_vq_lengthlist__44c7_s_p9_0, - 1, -511845376, 1630791680, 4, 0, - (long *)_vq_quantlist__44c7_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c7_s_p9_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c7_s_p9_1[] = { - 1, 4, 4, 7, 7, 7, 7, 7, 6, 8, 8, 8, 8, 6, 6, 6, - 8, 8, 9, 8, 8, 7, 9, 8,11,10, 5, 6, 6, 8, 8, 9, - 8, 8, 8,10, 9,11,11,16, 8, 8, 9, 8, 9, 9, 9, 8, - 10, 9,11,10,16, 8, 8, 9, 9,10,10, 9, 9,10,10,11, - 11,16,13,13, 9, 9,10,10, 9,10,11,11,12,11,16,13, - 13, 9, 8,10, 9,10,10,10,10,11,11,16,14,16, 8, 9, - 9, 9,11,10,11,11,12,11,16,16,16, 9, 7,10, 7,11, - 10,11,11,12,11,16,16,16,12,12, 9,10,11,11,12,11, - 12,12,16,16,16,12,10,10, 7,11, 8,12,11,12,12,16, - 16,15,16,16,11,12,10,10,12,11,12,12,16,16,16,15, - 15,11,11,10,10,12,12,12,12, -}; - -static const static_codebook _44c7_s_p9_1 = { - 2, 169, - (long *)_vq_lengthlist__44c7_s_p9_1, - 1, -518889472, 1622704128, 4, 0, - (long *)_vq_quantlist__44c7_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c7_s_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const long _vq_lengthlist__44c7_s_p9_2[] = { - 2, 4, 3, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44c7_s_p9_2 = { - 1, 49, - (long *)_vq_lengthlist__44c7_s_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44c7_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__44c7_s_short[] = { - 4,11,12,14,15,15,17,17,18,18, 5, 6, 6, 8, 9,10, - 13,17,18,19, 7, 5, 4, 6, 8, 9,11,15,19,19, 8, 6, - 5, 5, 6, 7,11,14,16,17, 9, 7, 7, 6, 7, 7,10,13, - 15,19,10, 8, 7, 6, 7, 6, 7, 9,14,16,12,10, 9, 7, - 7, 6, 4, 5,10,15,14,13,11, 7, 6, 6, 4, 2, 7,13, - 16,16,15, 9, 8, 8, 8, 6, 9,13,19,19,17,12,11,10, - 10, 9,11,14, -}; - -static const static_codebook _huff_book__44c7_s_short = { - 2, 100, - (long *)_huff_lengthlist__44c7_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c8_s_long[] = { - 3, 8,12,13,14,14,14,13,14,14, 6, 4, 5, 8,10,10, - 11,11,14,13, 9, 5, 4, 5, 7, 8, 9,10,13,13,12, 7, - 5, 4, 5, 6, 8, 9,12,13,13, 9, 6, 5, 5, 5, 7, 9, - 11,14,12,10, 7, 6, 5, 4, 6, 7,10,11,12,11, 9, 8, - 7, 5, 5, 6,10,10,13,12,10, 9, 8, 6, 6, 5, 8,10, - 14,13,12,12,11,10, 9, 7, 8,10,12,13,14,14,13,12, - 11, 9, 9,10, -}; - -static const static_codebook _huff_book__44c8_s_long = { - 2, 100, - (long *)_huff_lengthlist__44c8_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c8_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c8_s_p1_0[] = { - 1, 5, 5, 0, 5, 5, 0, 5, 5, 5, 7, 7, 0, 9, 8, 0, - 9, 8, 6, 7, 7, 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, - 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, 0, 8, 8, 0, 8, - 8, -}; - -static const static_codebook _44c8_s_p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44c8_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c8_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c8_s_p2_0[] = { - 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, - 7, 7, 9, 9, 0, 0, 0, 9, 9, 5, 7, 7, 9, 9, 0, 8, - 7,10, 9, 0, 8, 7,10, 9, 0,10,10,11,11, 0, 0, 0, - 11,11, 5, 7, 7, 9, 9, 0, 7, 8, 9,10, 0, 7, 8, 9, - 10, 0,10,10,11,11, 0, 0, 0,11,11, 8, 9, 9,11,10, - 0,11,10,12,11, 0,11,10,12,12, 0,13,13,14,14, 0, - 0, 0,14,13, 8, 9, 9,10,11, 0,10,11,12,12, 0,10, - 11,12,12, 0,13,13,14,14, 0, 0, 0,13,14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, - 0, 7, 7,10,10, 0, 9, 9,10,10, 0, 0, 0,11,10, 5, - 7, 8,10,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, - 9,10,10, 0, 0, 0,10,10, 8,10, 9,12,12, 0,10,10, - 12,11, 0,10,10,12,12, 0,12,12,13,12, 0, 0, 0,13, - 12, 8, 9,10,12,12, 0,10,10,11,12, 0,10,10,11,12, - 0,12,12,13,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 7,11,10, 0, 7, 7,10,10, 0, 7, 7, - 10,10, 0, 9, 9,10,11, 0, 0, 0,10,10, 6, 7, 8,10, - 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 9,10,10, - 0, 0, 0,10,10, 9,10, 9,12,12, 0,10,10,12,12, 0, - 10,10,12,11, 0,12,12,13,13, 0, 0, 0,13,12, 8, 9, - 10,12,12, 0,10,10,12,12, 0,10,10,11,12, 0,12,12, - 13,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7,10,10,13,13, 0, 9, 9,12,12, 0, 9, 9,12,12, 0, - 10,10,12,12, 0, 0, 0,12,12, 7,10,10,13,13, 0, 9, - 9,12,12, 0, 9, 9,12,12, 0,10,10,12,12, 0, 0, 0, - 12,12, 9,11,11,14,13, 0,10,10,13,12, 0,11,10,13, - 12, 0,12,12,13,12, 0, 0, 0,13,13, 9,11,11,13,14, - 0,10,11,12,13, 0,10,11,13,13, 0,12,12,12,13, 0, - 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 11,11,14,14, 0,10,11,13,13, 0,11,10,13,13, 0,11, - 12,13,13, 0, 0, 0,13,12, 9,11,11,14,14, 0,11,10, - 13,13, 0,10,11,13,13, 0,12,12,13,13, 0, 0, 0,12, - 13, -}; - -static const static_codebook _44c8_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c8_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c8_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c8_s_p3_0[] = { - 2, 4, 4, 5, 5, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, - 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 6, 6, - 8, 8,10,10, 0, 0, 0, 6, 6, 8, 8,10,10, 0, 0, 0, - 7, 7, 9, 9,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c8_s_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44c8_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c8_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c8_s_p4_0[] = { - 3, 4, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 8,10,10,11,11, - 11,11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11,11,11, 0, 6, 5, 6, 6, 7, 7, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 6, 6, 7, 7, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, - 11,11,11,12,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, - 10,11,11,11,12,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, - 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c8_s_p4_0 = { - 2, 289, - (long *)_vq_lengthlist__44c8_s_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c8_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c8_s_p5_0[] = { - 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 7, 6,10,10,10,10, - 10,10, 4, 6, 6,10,10,10,10, 9,10, 5,10,10, 9,11, - 11,10,11,11, 7,10,10,11,12,12,12,12,12, 7,10,10, - 11,12,12,12,12,12, 6,10,10,10,12,12,10,12,12, 7, - 10,10,11,12,12,12,12,12, 7,10,10,11,12,12,12,12, - 12, -}; - -static const static_codebook _44c8_s_p5_0 = { - 4, 81, - (long *)_vq_lengthlist__44c8_s_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c8_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c8_s_p5_1[] = { - 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11, 4, 5, 6, 6, - 7, 7, 8, 8, 8, 8,11, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 9,12, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,12,12,12, 6, - 6, 7, 7, 8, 8, 9, 9,11,11,11, 6, 6, 7, 7, 8, 8, - 8, 8,11,11,11, 6, 6, 7, 7, 8, 8, 8, 8,11,11,11, - 7, 7, 7, 8, 8, 8, 8, 8,11,11,11,11,11, 7, 7, 8, - 8, 8, 8,11,11,11,11,11, 7, 7, 7, 7, 8, 8,11,11, - 11,11,11, 7, 7, 7, 7, 8, 8, -}; - -static const static_codebook _44c8_s_p5_1 = { - 2, 121, - (long *)_vq_lengthlist__44c8_s_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c8_s_p5_1, - 0 -}; - -static const long _vq_quantlist__44c8_s_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c8_s_p6_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, - 7, 7, 8, 8, 9, 9,10,10,11,11, 6, 5, 5, 7, 7, 8, - 8, 9, 9,10,10,11,11, 0, 7, 7, 7, 7, 9, 9,10,10, - 10,10,11,11, 0, 7, 7, 7, 7, 9, 9,10,10,10,10,11, - 11, 0,11,11, 9, 9,10,10,11,11,11,11,12,12, 0,12, - 12, 9, 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static const static_codebook _44c8_s_p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44c8_s_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c8_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c8_s_p6_1[] = { - 3, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c8_s_p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44c8_s_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c8_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c8_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c8_s_p7_0[] = { - 1, 4, 4, 6, 6, 8, 7, 9, 9,10,10,12,12, 6, 5, 5, - 7, 7, 8, 8,10,10,11,11,12,12, 7, 5, 5, 7, 7, 8, - 8,10,10,11,11,12,12,21, 7, 7, 7, 7, 8, 9,10,10, - 11,11,12,12,21, 7, 7, 7, 7, 9, 9,10,10,12,12,13, - 13,21,11,11, 8, 8, 9, 9,11,11,12,12,13,13,21,11, - 11, 8, 8, 9, 9,11,11,12,12,13,13,21,21,21,10,10, - 10,10,11,11,12,13,13,13,21,21,21,10,10,10,10,11, - 11,13,13,14,13,21,21,21,13,13,11,11,12,12,13,13, - 14,14,21,21,21,14,14,11,11,12,12,13,13,14,14,21, - 21,21,21,20,13,13,13,12,14,14,16,15,20,20,20,20, - 20,13,13,13,13,14,13,15,15, -}; - -static const static_codebook _44c8_s_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44c8_s_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44c8_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c8_s_p7_1[] = { - 4, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 6, 6, 6, 7, - 7, 7, 7, 7, 7, 7, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, - 7, 8, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, - 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, - 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 8, 8, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _44c8_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44c8_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c8_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c8_s_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44c8_s_p8_0[] = { - 1, 4, 4, 7, 6, 8, 8, 8, 7, 9, 8,10,10,11,10, 6, - 5, 5, 7, 7, 9, 9, 8, 8,10,10,11,11,12,11, 6, 5, - 5, 7, 7, 9, 9, 9, 9,10,10,11,11,12,12,20, 8, 8, - 8, 8, 9, 9, 9, 9,10,10,11,11,12,12,20, 8, 8, 8, - 8,10, 9, 9, 9,10,10,11,11,12,12,20,12,12, 9, 9, - 10,10,10,10,10,11,12,12,12,12,20,12,12, 9, 9,10, - 10,10,10,11,11,12,12,13,13,20,20,20, 9, 9, 9, 9, - 11,10,11,11,12,12,12,13,20,19,19, 9, 9, 9, 9,11, - 11,11,12,12,12,13,13,19,19,19,13,13,10,10,11,11, - 12,12,13,13,13,13,19,19,19,14,13,11,10,11,11,12, - 12,12,13,13,13,19,19,19,19,19,12,12,12,12,13,13, - 13,13,14,13,19,19,19,19,19,12,12,12,11,12,12,13, - 14,14,14,19,19,19,19,19,16,15,13,12,13,13,13,14, - 14,14,19,19,19,19,19,17,17,13,12,13,11,14,13,15, - 15, -}; - -static const static_codebook _44c8_s_p8_0 = { - 2, 225, - (long *)_vq_lengthlist__44c8_s_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44c8_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__44c8_s_p8_1[] = { - 4, 5, 5, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, - 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, - 10, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10, 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, 9, 9, - 9, 9,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9,10,10,10,10, - 10,10,10, 9, 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10, 9,10,10, 9,10,10,10,10, - 9,10, 9,10,10, 9,10,10,10,10,10,10,10, 9,10,10, - 10,10,10,10, 9, 9,10,10, 9,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, 9, 9, 9,10, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, - 10, 9,10, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10, 9, 9,10, 9, 9, 9,10,10,10,10,10,10, - 10,10,10,10,10, 9, 9, 9, 9, 9, 9,10, 9, 9,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9,10, 9, - 9,10, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10, 9, 9,10,10, 9,10, 9, 9, -}; - -static const static_codebook _44c8_s_p8_1 = { - 2, 441, - (long *)_vq_lengthlist__44c8_s_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c8_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c8_s_p9_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c8_s_p9_0[] = { - 1, 4, 3,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11, 4, 7, 7,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11, 4, 8,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _44c8_s_p9_0 = { - 2, 289, - (long *)_vq_lengthlist__44c8_s_p9_0, - 1, -509798400, 1631393792, 5, 0, - (long *)_vq_quantlist__44c8_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c8_s_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const long _vq_lengthlist__44c8_s_p9_1[] = { - 1, 4, 4, 7, 6, 7, 7, 7, 7, 8, 8, 9, 9,10,10,10, - 10,11,11, 6, 6, 6, 8, 8, 9, 8, 8, 7,10, 8,11,10, - 12,11,12,12,13,13, 5, 5, 6, 8, 8, 9, 9, 8, 8,10, - 9,11,11,12,12,13,13,13,13,17, 8, 8, 9, 9, 9, 9, - 9, 9,10, 9,12,10,12,12,13,12,13,13,17, 9, 8, 9, - 9, 9, 9, 9, 9,10,10,12,12,12,12,13,13,13,13,17, - 13,13, 9, 9,10,10,10,10,11,11,12,11,13,12,13,13, - 14,15,17,13,13, 9, 8,10, 9,10,10,11,11,12,12,14, - 13,15,13,14,15,17,17,17, 9,10, 9,10,11,11,12,12, - 12,12,13,13,14,14,15,15,17,17,17, 9, 8, 9, 8,11, - 11,12,12,12,12,14,13,14,14,14,15,17,17,17,12,14, - 9,10,11,11,12,12,14,13,13,14,15,13,15,15,17,17, - 17,13,11,10, 8,11, 9,13,12,13,13,13,13,13,14,14, - 14,17,17,17,17,17,11,12,11,11,13,13,14,13,15,14, - 13,15,16,15,17,17,17,17,17,11,11,12, 8,13,12,14, - 13,17,14,15,14,15,14,17,17,17,17,17,15,15,12,12, - 12,12,13,14,14,14,15,14,17,14,17,17,17,17,17,16, - 17,12,12,13,12,13,13,14,14,14,14,14,14,17,17,17, - 17,17,17,17,14,14,13,12,13,13,15,15,14,13,15,17, - 17,17,17,17,17,17,17,13,14,13,13,13,13,14,15,15, - 15,14,15,17,17,17,17,17,17,17,16,15,13,14,13,13, - 14,14,15,14,14,16,17,17,17,17,17,17,17,16,16,13, - 14,13,13,14,14,15,14,15,14, -}; - -static const static_codebook _44c8_s_p9_1 = { - 2, 361, - (long *)_vq_lengthlist__44c8_s_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__44c8_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c8_s_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const long _vq_lengthlist__44c8_s_p9_2[] = { - 2, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44c8_s_p9_2 = { - 1, 49, - (long *)_vq_lengthlist__44c8_s_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44c8_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__44c8_s_short[] = { - 4,11,13,14,15,15,18,17,19,17, 5, 6, 8, 9,10,10, - 12,15,19,19, 6, 6, 6, 6, 8, 8,11,14,18,19, 8, 6, - 5, 4, 6, 7,10,13,16,17, 9, 7, 6, 5, 6, 7, 9,12, - 15,19,10, 8, 7, 6, 6, 6, 7, 9,13,15,12,10, 9, 8, - 7, 6, 4, 5,10,15,13,13,11, 8, 6, 6, 4, 2, 7,12, - 17,15,16,10, 8, 8, 7, 6, 9,12,19,18,17,13,11,10, - 10, 9,11,14, -}; - -static const static_codebook _huff_book__44c8_s_short = { - 2, 100, - (long *)_huff_lengthlist__44c8_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c9_s_long[] = { - 3, 8,12,14,15,15,15,13,15,15, 6, 5, 8,10,12,12, - 13,12,14,13,10, 6, 5, 6, 8, 9,11,11,13,13,13, 8, - 5, 4, 5, 6, 8,10,11,13,14,10, 7, 5, 4, 5, 7, 9, - 11,12,13,11, 8, 6, 5, 4, 5, 7, 9,11,12,11,10, 8, - 7, 5, 4, 5, 9,10,13,13,11,10, 8, 6, 5, 4, 7, 9, - 15,14,13,12,10, 9, 8, 7, 8, 9,12,12,14,13,12,11, - 10, 9, 8, 9, -}; - -static const static_codebook _huff_book__44c9_s_long = { - 2, 100, - (long *)_huff_lengthlist__44c9_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c9_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c9_s_p1_0[] = { - 1, 5, 5, 0, 5, 5, 0, 5, 5, 6, 8, 8, 0, 9, 8, 0, - 9, 8, 6, 8, 8, 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 8, 8, 0, 7, 7, 0, 8, 8, 5, 8, 8, - 0, 7, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, - 9, 8, 0, 8, 8, 0, 7, 7, 5, 8, 9, 0, 8, 8, 0, 7, - 7, -}; - -static const static_codebook _44c9_s_p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44c9_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c9_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c9_s_p2_0[] = { - 3, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, 5, 5, 8, 8, 0, - 7, 7, 9, 9, 0, 0, 0, 9, 9, 6, 7, 7, 9, 8, 0, 8, - 8, 9, 9, 0, 8, 7, 9, 9, 0, 9,10,10,10, 0, 0, 0, - 11,10, 6, 7, 7, 8, 9, 0, 8, 8, 9, 9, 0, 7, 8, 9, - 9, 0,10, 9,11,10, 0, 0, 0,10,10, 8, 9, 8,10,10, - 0,10,10,12,11, 0,10,10,11,11, 0,12,13,13,13, 0, - 0, 0,13,12, 8, 8, 9,10,10, 0,10,10,11,12, 0,10, - 10,11,11, 0,13,12,13,13, 0, 0, 0,13,13, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 6, 8, 7,10,10, 0, 7, 7,10, 9, - 0, 7, 7,10,10, 0, 9, 9,10,10, 0, 0, 0,10,10, 6, - 7, 8,10,10, 0, 7, 7, 9,10, 0, 7, 7,10,10, 0, 9, - 9,10,10, 0, 0, 0,10,10, 8, 9, 9,11,11, 0,10,10, - 11,11, 0,10,10,11,11, 0,12,12,12,12, 0, 0, 0,12, - 12, 8, 9,10,11,11, 0, 9,10,11,11, 0,10,10,11,11, - 0,12,12,12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 5, 8, 7,10,10, 0, 7, 7,10,10, 0, 7, 7, - 10, 9, 0, 9, 9,10,10, 0, 0, 0,10,10, 6, 7, 8,10, - 10, 0, 7, 7,10,10, 0, 7, 7, 9,10, 0, 9, 9,10,10, - 0, 0, 0,10,10, 8,10, 9,12,11, 0,10,10,12,11, 0, - 10, 9,11,11, 0,11,12,12,12, 0, 0, 0,12,12, 8, 9, - 10,11,12, 0,10,10,11,11, 0, 9,10,11,11, 0,12,11, - 12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 7,10, 9,12,12, 0, 9, 9,12,11, 0, 9, 9,11,11, 0, - 10,10,12,11, 0, 0, 0,11,12, 7, 9,10,12,12, 0, 9, - 9,11,12, 0, 9, 9,11,11, 0,10,10,11,12, 0, 0, 0, - 11,11, 9,11,10,13,12, 0,10,10,12,12, 0,10,10,12, - 12, 0,11,11,12,12, 0, 0, 0,13,12, 9,10,11,12,13, - 0,10,10,12,12, 0,10,10,12,12, 0,11,12,12,12, 0, - 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 11,10,13,13, 0,10,10,12,12, 0,10,10,12,12, 0,11, - 12,12,12, 0, 0, 0,12,12, 9,10,11,13,13, 0,10,10, - 12,12, 0,10,10,12,12, 0,12,11,13,12, 0, 0, 0,12, - 12, -}; - -static const static_codebook _44c9_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c9_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c9_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c9_s_p3_0[] = { - 3, 4, 4, 5, 5, 6, 6, 8, 8, 0, 4, 4, 5, 5, 6, 7, - 8, 8, 0, 4, 4, 5, 5, 7, 7, 8, 8, 0, 5, 5, 6, 6, - 7, 7, 9, 9, 0, 0, 0, 6, 6, 7, 7, 9, 9, 0, 0, 0, - 7, 7, 8, 8, 9, 9, 0, 0, 0, 7, 7, 8, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c9_s_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44c9_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c9_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c9_s_p4_0[] = { - 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10, - 10, 0, 5, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10,10, - 11,11, 0, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10, - 10,11,11, 0, 6, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10, - 11,11,11,12, 0, 0, 0, 6, 6, 7, 7, 8, 8, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 7, 7, 7, 7, 9, 9, 9, 9, - 10,10,11,11,12,12, 0, 0, 0, 7, 7, 7, 8, 9, 9, 9, - 9,10,10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, - 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c9_s_p4_0 = { - 2, 289, - (long *)_vq_lengthlist__44c9_s_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c9_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c9_s_p5_0[] = { - 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 7, 6, 9,10,10,10, - 10, 9, 4, 6, 7, 9,10,10,10, 9,10, 5, 9, 9, 9,11, - 11,10,11,11, 7,10, 9,11,12,11,12,12,12, 7, 9,10, - 11,11,12,12,12,12, 6,10,10,10,12,12,10,12,11, 7, - 10,10,11,12,12,11,12,12, 7,10,10,11,12,12,12,12, - 12, -}; - -static const static_codebook _44c9_s_p5_0 = { - 4, 81, - (long *)_vq_lengthlist__44c9_s_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c9_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c9_s_p5_1[] = { - 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7,11, 5, 5, 6, 6, - 7, 7, 7, 7, 8, 8,11, 5, 5, 6, 6, 7, 7, 7, 7, 8, - 8,11, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11,11,11, 6, - 6, 7, 7, 7, 8, 8, 8,11,11,11, 6, 6, 7, 7, 7, 8, - 8, 8,11,11,11, 6, 6, 7, 7, 7, 7, 8, 8,11,11,11, - 7, 7, 7, 7, 7, 7, 8, 8,11,11,11,10,10, 7, 7, 7, - 7, 8, 8,11,11,11,11,11, 7, 7, 7, 7, 7, 7,11,11, - 11,11,11, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _44c9_s_p5_1 = { - 2, 121, - (long *)_vq_lengthlist__44c9_s_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c9_s_p5_1, - 0 -}; - -static const long _vq_quantlist__44c9_s_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c9_s_p6_0[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 5, 4, 4, - 6, 6, 8, 8, 9, 9, 9, 9,10,10, 6, 4, 4, 6, 6, 8, - 8, 9, 9, 9, 9,10,10, 0, 6, 6, 7, 7, 8, 8, 9, 9, - 10,10,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11, 0,10,10, 8, 8, 9, 9,10,10,11,11,12,12, 0,11, - 11, 8, 8, 9, 9,10,10,11,11,12,12, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, -}; - -static const static_codebook _44c9_s_p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44c9_s_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c9_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c9_s_p6_1[] = { - 4, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44c9_s_p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44c9_s_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c9_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c9_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c9_s_p7_0[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8,10,10,11,11, 6, 4, 4, - 6, 6, 8, 8, 9, 9,10,10,12,12, 6, 4, 5, 6, 6, 8, - 8, 9, 9,10,10,12,12,20, 6, 6, 6, 6, 8, 8, 9,10, - 11,11,12,12,20, 6, 6, 6, 6, 8, 8,10,10,11,11,12, - 12,20,10,10, 7, 7, 9, 9,10,10,11,11,12,12,20,11, - 11, 7, 7, 9, 9,10,10,11,11,12,12,20,20,20, 9, 9, - 9, 9,11,11,12,12,13,13,20,20,20, 9, 9, 9, 9,11, - 11,12,12,13,13,20,20,20,13,13,10,10,11,11,12,13, - 13,13,20,20,20,13,13,10,10,11,11,12,13,13,13,20, - 20,20,20,19,12,12,12,12,13,13,14,15,19,19,19,19, - 19,12,12,12,12,13,13,14,14, -}; - -static const static_codebook _44c9_s_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44c9_s_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44c9_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c9_s_p7_1[] = { - 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, - 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 7, 7, - 7, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 6, - 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, - 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, - 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 8, 8, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _44c9_s_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44c9_s_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c9_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c9_s_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44c9_s_p8_0[] = { - 1, 4, 4, 7, 6, 8, 8, 8, 8, 9, 9,10,10,11,10, 6, - 5, 5, 7, 7, 9, 9, 8, 9,10,10,11,11,12,12, 6, 5, - 5, 7, 7, 9, 9, 9, 9,10,10,11,11,12,12,21, 7, 8, - 8, 8, 9, 9, 9, 9,10,10,11,11,12,12,21, 8, 8, 8, - 8, 9, 9, 9, 9,10,10,11,11,12,12,21,11,12, 9, 9, - 10,10,10,10,10,11,11,12,12,12,21,12,12, 9, 8,10, - 10,10,10,11,11,12,12,13,13,21,21,21, 9, 9, 9, 9, - 11,11,11,11,12,12,12,13,21,20,20, 9, 9, 9, 9,10, - 11,11,11,12,12,13,13,20,20,20,13,13,10,10,11,11, - 12,12,13,13,13,13,20,20,20,13,13,10,10,11,11,12, - 12,13,13,13,13,20,20,20,20,20,12,12,12,12,12,12, - 13,13,14,14,20,20,20,20,20,12,12,12,11,13,12,13, - 13,14,14,20,20,20,20,20,15,16,13,12,13,13,14,13, - 14,14,20,20,20,20,20,16,15,12,12,13,12,14,13,14, - 14, -}; - -static const static_codebook _44c9_s_p8_0 = { - 2, 225, - (long *)_vq_lengthlist__44c9_s_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44c9_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__44c9_s_p8_1[] = { - 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, - 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, - 10, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10,10,10,10, - 10,10,10, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10, 9, 9, 9,10,10,10,10,10, - 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, 9, 9,10, - 9,10, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10, - 10,10,10,10, 9, 9,10,10, 9, 9, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10, 9, 9,10, 9, 9, 9, 9, 9,10,10,10,10,10,10, - 10,10,10,10,10, 9, 9,10,10, 9, 9,10, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10, 9, 9,10, 9, 9, 9, - 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, 9, - 9, 9, 9,10, 9, 9, 9, 9, 9, -}; - -static const static_codebook _44c9_s_p8_1 = { - 2, 441, - (long *)_vq_lengthlist__44c9_s_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44c9_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c9_s_p9_0[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const long _vq_lengthlist__44c9_s_p9_0[] = { - 1, 4, 3,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12, 4, 5, 6,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12, 4, 6, 6,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,11,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _44c9_s_p9_0 = { - 2, 361, - (long *)_vq_lengthlist__44c9_s_p9_0, - 1, -508535424, 1631393792, 5, 0, - (long *)_vq_quantlist__44c9_s_p9_0, - 0 -}; - -static const long _vq_quantlist__44c9_s_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const long _vq_lengthlist__44c9_s_p9_1[] = { - 1, 4, 4, 7, 7, 7, 7, 8, 7, 9, 8, 9, 9,10,10,11, - 11,11,11, 6, 5, 5, 8, 8, 9, 9, 9, 8,10, 9,11,10, - 12,12,13,12,13,13, 5, 5, 5, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12,13,12,13,13,17, 8, 8, 9, 9, 9, 9, - 9, 9,10,10,12,11,13,12,13,13,13,13,18, 8, 8, 9, - 9, 9, 9, 9, 9,11,11,12,12,13,13,13,13,13,13,17, - 13,12, 9, 9,10,10,10,10,11,11,12,12,12,13,13,13, - 14,14,18,13,12, 9, 9,10,10,10,10,11,11,12,12,13, - 13,13,14,14,14,17,18,18,10,10,10,10,11,11,11,12, - 12,12,14,13,14,13,13,14,18,18,18,10, 9,10, 9,11, - 11,12,12,12,12,13,13,15,14,14,14,18,18,16,13,14, - 10,11,11,11,12,13,13,13,13,14,13,13,14,14,18,18, - 18,14,12,11, 9,11,10,13,12,13,13,13,14,14,14,13, - 14,18,18,17,18,18,11,12,12,12,13,13,14,13,14,14, - 13,14,14,14,18,18,18,18,17,12,10,12, 9,13,11,13, - 14,14,14,14,14,15,14,18,18,17,17,18,14,15,12,13, - 13,13,14,13,14,14,15,14,15,14,18,17,18,18,18,15, - 15,12,10,14,10,14,14,13,13,14,14,14,14,18,16,18, - 18,18,18,17,14,14,13,14,14,13,13,14,14,14,15,15, - 18,18,18,18,17,17,17,14,14,14,12,14,13,14,14,15, - 14,15,14,18,18,18,18,18,18,18,17,16,13,13,13,14, - 14,14,14,15,16,15,18,18,18,18,18,18,18,17,17,13, - 13,13,13,14,13,14,15,15,15, -}; - -static const static_codebook _44c9_s_p9_1 = { - 2, 361, - (long *)_vq_lengthlist__44c9_s_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__44c9_s_p9_1, - 0 -}; - -static const long _vq_quantlist__44c9_s_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const long _vq_lengthlist__44c9_s_p9_2[] = { - 2, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44c9_s_p9_2 = { - 1, 49, - (long *)_vq_lengthlist__44c9_s_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44c9_s_p9_2, - 0 -}; - -static const long _huff_lengthlist__44c9_s_short[] = { - 5,13,18,16,17,17,19,18,19,19, 5, 7,10,11,12,12, - 13,16,17,18, 6, 6, 7, 7, 9, 9,10,14,17,19, 8, 7, - 6, 5, 6, 7, 9,12,19,17, 8, 7, 7, 6, 5, 6, 8,11, - 15,19, 9, 8, 7, 6, 5, 5, 6, 8,13,15,11,10, 8, 8, - 7, 5, 4, 4,10,14,12,13,11, 9, 7, 6, 4, 2, 6,12, - 18,16,16,13, 8, 7, 7, 5, 8,13,16,17,18,15,11, 9, - 9, 8,10,13, -}; - -static const static_codebook _huff_book__44c9_s_short = { - 2, 100, - (long *)_huff_lengthlist__44c9_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c0_s_long[] = { - 5, 4, 8, 9, 8, 9,10,12,15, 4, 1, 5, 5, 6, 8,11, - 12,12, 8, 5, 8, 9, 9,11,13,12,12, 9, 5, 8, 5, 7, - 9,12,13,13, 8, 6, 8, 7, 7, 9,11,11,11, 9, 7, 9, - 7, 7, 7, 7,10,12,10,10,11, 9, 8, 7, 7, 9,11,11, - 12,13,12,11, 9, 8, 9,11,13,16,16,15,15,12,10,11, - 12, -}; - -static const static_codebook _huff_book__44c0_s_long = { - 2, 81, - (long *)_huff_lengthlist__44c0_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c0_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c0_s_p1_0[] = { - 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 9,11,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0, 9,10,11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, - 0, 0, 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 9,10,11, - 0, 0, 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c0_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__44c0_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c0_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c0_s_p2_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c0_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c0_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c0_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c0_s_p3_0[] = { - 1, 3, 2, 8, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c0_s_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44c0_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c0_s_p4_0[] = { - 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, - 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 7, 7, - 7, 8, 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, - 9, 9, 8, 8,10,10, 0, 0, 0, 8, 9, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, - 10, -}; - -static const static_codebook _44c0_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__44c0_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c0_s_p5_0[] = { - 1, 4, 3, 6, 6, 8, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9, 9,10,10,10, - 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,11, 0, 0, 0, 8, 8, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9, 9,10, - 10,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,11,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9, - 10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,11,11,11,11,11,12,12,12,13,13, 0, 0, 0, 0, - 0, 0, 0,11,10,11,11,11,11,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,11,12,12,12,12,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,12,12,12,12,13,13,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,12,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, - 14, -}; - -static const static_codebook _44c0_s_p5_0 = { - 2, 289, - (long *)_vq_lengthlist__44c0_s_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c0_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c0_s_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, - 9, 9, 4, 6, 7,10, 9, 9,11, 9, 9, 7,10,10,11,11, - 11,12,10,11, 6, 9, 9,11,10,11,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,10,12,11,11,11,11,11, 7, - 9, 9,10,10,10,11,11,10, 6, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44c0_s_p6_0 = { - 4, 81, - (long *)_vq_lengthlist__44c0_s_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c0_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c0_s_p6_1[] = { - 2, 3, 3, 6, 6, 7, 7, 7, 7, 7, 8,10,10,10, 6, 6, - 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c0_s_p6_1 = { - 2, 121, - (long *)_vq_lengthlist__44c0_s_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c0_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c0_s_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 6, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,11,12, 0, 0, 0,10,10, - 10,10,11,11,11,11,12,12, 0, 0, 0,10,10, 9, 9,11, - 11,11,12,12,12, 0, 0, 0,13,13,10,10,11,11,12,12, - 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,11,11,11,11,13,12,13,13, 0, 0, 0, 0, - 0,12,12,11,11,12,12,13,13, -}; - -static const static_codebook _44c0_s_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44c0_s_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c0_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c0_s_p7_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c0_s_p7_1 = { - 2, 25, - (long *)_vq_lengthlist__44c0_s_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c0_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c0_s_p8_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c0_s_p8_0[] = { - 1, 5, 5,10,10, 6, 9, 8,10,10, 6,10, 9,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 8,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11, -}; - -static const static_codebook _44c0_s_p8_0 = { - 4, 625, - (long *)_vq_lengthlist__44c0_s_p8_0, - 1, -518283264, 1627103232, 3, 0, - (long *)_vq_quantlist__44c0_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c0_s_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c0_s_p8_1[] = { - 1, 4, 4, 6, 6, 7, 7, 9, 9,11,12,13,12, 6, 5, 5, - 7, 7, 8, 8,10, 9,12,12,12,12, 6, 5, 5, 7, 7, 8, - 8,10, 9,12,11,11,13,16, 7, 7, 8, 8, 9, 9,10,10, - 12,12,13,12,16, 7, 7, 8, 7, 9, 9,10,10,11,12,12, - 13,16,10,10, 8, 8,10,10,11,12,12,12,13,13,16,11, - 10, 8, 7,11,10,11,11,12,11,13,13,16,16,16,10,10, - 10,10,11,11,13,12,13,13,16,16,16,11, 9,11, 9,15, - 13,12,13,13,13,16,16,16,15,13,11,11,12,13,12,12, - 14,13,16,16,16,14,13,11,11,13,12,14,13,13,13,16, - 16,16,16,16,13,13,13,12,14,13,14,14,16,16,16,16, - 16,13,13,12,12,14,14,15,13, -}; - -static const static_codebook _44c0_s_p8_1 = { - 2, 169, - (long *)_vq_lengthlist__44c0_s_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44c0_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c0_s_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c0_s_p8_2[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10,10,10, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, - 9,10, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, - 9,10, 9, 9,10,10,10,10, 8, 8, 8, 8, 9, 8, 9, 9, - 9, 9, 9,10, 9,10,10,10,10, 7, 7, 8, 8, 9, 9, 9, - 9, 9, 9,10, 9,10,10,10,10,10, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 9,11,10,10,10,10, 8, 8, 9, - 9, 9, 9, 9,10, 9, 9, 9,10,10,10,10,11,11, 9, 9, - 9, 9, 9, 9, 9, 9,10, 9, 9,10,11,10,10,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,10,10,11, - 11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 11,11,11,11, 9,10, 9,10, 9, 9, 9, 9,10, 9,10,11, - 10,11,10,10,10,10,10, 9, 9, 9,10, 9, 9, 9,10,11, - 11,10,11,11,10,11,10,10,10, 9, 9, 9, 9,10, 9, 9, - 10,11,10,11,11,11,11,10,11,10,10, 9,10, 9, 9, 9, - 10, -}; - -static const static_codebook _44c0_s_p8_2 = { - 2, 289, - (long *)_vq_lengthlist__44c0_s_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c0_s_p8_2, - 0 -}; - -static const long _huff_lengthlist__44c0_s_short[] = { - 9, 8,12,11,12,13,14,14,16, 6, 1, 5, 6, 6, 9,12, - 14,17, 9, 4, 5, 9, 7, 9,13,15,16, 8, 5, 8, 6, 8, - 10,13,17,17, 9, 6, 7, 7, 8, 9,13,15,17,11, 8, 9, - 9, 9,10,12,16,16,13, 7, 8, 7, 7, 9,12,14,15,13, - 6, 7, 5, 5, 7,10,13,13,14, 7, 8, 5, 6, 7, 9,10, - 12, -}; - -static const static_codebook _huff_book__44c0_s_short = { - 2, 81, - (long *)_huff_lengthlist__44c0_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c0_sm_long[] = { - 5, 4, 9,10, 9,10,11,12,13, 4, 1, 5, 7, 7, 9,11, - 12,14, 8, 5, 7, 9, 8,10,13,13,13,10, 7, 9, 4, 6, - 7,10,12,14, 9, 6, 7, 6, 6, 7,10,12,12, 9, 8, 9, - 7, 6, 7, 8,11,12,11,11,11, 9, 8, 7, 8,10,12,12, - 13,14,12,11, 9, 9, 9,12,12,17,17,15,16,12,10,11, - 13, -}; - -static const static_codebook _huff_book__44c0_sm_long = { - 2, 81, - (long *)_huff_lengthlist__44c0_sm_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c0_sm_p1_0[] = { - 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, - 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 9,10,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 9,10,10, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c0_sm_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__44c0_sm_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c0_sm_p1_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c0_sm_p2_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c0_sm_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c0_sm_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c0_sm_p2_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c0_sm_p3_0[] = { - 1, 3, 3, 7, 7, 0, 0, 0, 0, 0, 5, 4, 7, 7, 0, 0, - 0, 0, 0, 5, 5, 7, 7, 0, 0, 0, 0, 0, 6, 7, 8, 8, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 9,10, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, - 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c0_sm_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44c0_sm_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_sm_p3_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c0_sm_p4_0[] = { - 1, 4, 3, 6, 6, 7, 7, 9, 9, 0, 5, 5, 7, 7, 8, 7, - 9, 9, 0, 5, 5, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, - 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, - 9, 9, 9, 9,11,11, 0, 0, 0, 9, 9, 9, 9,11,11, 0, - 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0, 9, 9,11, - 11, -}; - -static const static_codebook _44c0_sm_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__44c0_sm_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_sm_p4_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c0_sm_p5_0[] = { - 1, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,11, - 11,11, 0, 5, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, - 11,11,11, 0, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, - 11,11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, - 10,11,11,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,12,13, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,12,12,12,13,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,12,13,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,11,12,12,13,13,13,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, - 14, -}; - -static const static_codebook _44c0_sm_p5_0 = { - 2, 289, - (long *)_vq_lengthlist__44c0_sm_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c0_sm_p5_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c0_sm_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,10,11, - 11,11,10,10, 6, 9, 9,11,11,10,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,10,11,11,11,11,11,11, 6, - 9, 9,11,10,10,11,11,10, 6, 9, 9,11,10,10,11,10, - 11, -}; - -static const static_codebook _44c0_sm_p6_0 = { - 4, 81, - (long *)_vq_lengthlist__44c0_sm_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c0_sm_p6_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c0_sm_p6_1[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 8, 9, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8, 9, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, - 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c0_sm_p6_1 = { - 2, 121, - (long *)_vq_lengthlist__44c0_sm_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c0_sm_p6_1, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c0_sm_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 6, 5, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,11,12, 0, 0, 0, 9,10, - 10,10,11,11,12,11,12,12, 0, 0, 0,10,10, 9, 9,11, - 11,12,12,12,12, 0, 0, 0,13,13,10,10,11,11,12,12, - 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,11,12,11,11,13,12,13,13, 0, 0, 0, 0, - 0,12,12,11,11,13,12,14,14, -}; - -static const static_codebook _44c0_sm_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44c0_sm_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c0_sm_p7_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c0_sm_p7_1[] = { - 2, 4, 4, 4, 4, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c0_sm_p7_1 = { - 2, 25, - (long *)_vq_lengthlist__44c0_sm_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c0_sm_p7_1, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p8_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c0_sm_p8_0[] = { - 1, 3, 3,11,11,11,11,11,11, 3, 7, 6,11,11,11,11, - 11,11, 4, 8, 7,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12, -}; - -static const static_codebook _44c0_sm_p8_0 = { - 2, 81, - (long *)_vq_lengthlist__44c0_sm_p8_0, - 1, -516186112, 1627103232, 4, 0, - (long *)_vq_quantlist__44c0_sm_p8_0, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c0_sm_p8_1[] = { - 1, 4, 4, 6, 6, 7, 7, 9, 9,10,11,12,12, 6, 5, 5, - 7, 7, 8, 8,10,10,12,11,12,12, 6, 5, 5, 7, 7, 8, - 8,10,10,12,11,12,12,17, 7, 7, 8, 8, 9, 9,10,10, - 12,12,13,13,18, 7, 7, 8, 7, 9, 9,10,10,12,12,12, - 13,19,10,10, 8, 8,10,10,11,11,12,12,13,14,19,11, - 10, 8, 7,10,10,11,11,12,12,13,12,19,19,19,10,10, - 10,10,11,11,12,12,13,13,19,19,19,11, 9,11, 9,14, - 12,13,12,13,13,19,20,18,13,14,11,11,12,12,13,13, - 14,13,20,20,20,15,13,11,10,13,11,13,13,14,13,20, - 20,20,20,20,13,14,12,12,13,13,13,13,20,20,20,20, - 20,13,13,12,12,16,13,15,13, -}; - -static const static_codebook _44c0_sm_p8_1 = { - 2, 169, - (long *)_vq_lengthlist__44c0_sm_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44c0_sm_p8_1, - 0 -}; - -static const long _vq_quantlist__44c0_sm_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c0_sm_p8_2[] = { - 2, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8,10, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10, 6, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, - 9,10, 9, 9,10,10,10,11, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9,10, 9,10,10,10,10, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,11,10,10, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10,10,11,11, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,11,11,11,11,11, 9, 9, - 9, 9, 9, 9, 9, 9,10, 9,10, 9,11,11,10,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11,10,11,11, - 11,11,11, 9, 9,10, 9, 9, 9, 9, 9, 9, 9,10,11,10, - 11,11,11,11,10,10,10,10, 9, 9, 9, 9, 9, 9,10,11, - 11,11,11,11,11, 9,10, 9, 9, 9, 9, 9, 9, 9, 9,11, - 11,10,11,11,11,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, - 10,11,10,11,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _44c0_sm_p8_2 = { - 2, 289, - (long *)_vq_lengthlist__44c0_sm_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c0_sm_p8_2, - 0 -}; - -static const long _huff_lengthlist__44c0_sm_short[] = { - 6, 6,12,13,13,14,16,17,17, 4, 2, 5, 8, 7, 9,12, - 15,15, 9, 4, 5, 9, 7, 9,12,16,18,11, 6, 7, 4, 6, - 8,11,14,18,10, 5, 6, 5, 5, 7,10,14,17,10, 5, 7, - 7, 6, 7,10,13,16,11, 5, 7, 7, 7, 8,10,12,15,13, - 6, 7, 5, 5, 7, 9,12,13,16, 8, 9, 6, 6, 7, 9,10, - 12, -}; - -static const static_codebook _huff_book__44c0_sm_short = { - 2, 81, - (long *)_huff_lengthlist__44c0_sm_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c1_s_long[] = { - 5, 5, 9,10, 9, 9,10,11,12, 5, 1, 5, 6, 6, 7,10, - 12,14, 9, 5, 6, 8, 8,10,12,14,14,10, 5, 8, 5, 6, - 8,11,13,14, 9, 5, 7, 6, 6, 8,10,12,11, 9, 7, 9, - 7, 6, 6, 7,10,10,10, 9,12, 9, 8, 7, 7,10,12,11, - 11,13,12,10, 9, 8, 9,11,11,14,15,15,13,11, 9, 9, - 11, -}; - -static const static_codebook _huff_book__44c1_s_long = { - 2, 81, - (long *)_huff_lengthlist__44c1_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c1_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c1_s_p1_0[] = { - 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 6, 0, 0, 0, 0, - 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, - 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, - 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, - 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, - 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8,10, 9, 0, - 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, - 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c1_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__44c1_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c1_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c1_s_p2_0[] = { - 2, 3, 4, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 8, 8, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c1_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c1_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c1_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c1_s_p3_0[] = { - 1, 3, 2, 7, 7, 0, 0, 0, 0, 0,13,13, 6, 6, 0, 0, - 0, 0, 0,12, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0,11,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c1_s_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44c1_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c1_s_p4_0[] = { - 1, 3, 3, 6, 5, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, - 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 7, 7, - 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, - 9, 9, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, - 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, - 11, -}; - -static const static_codebook _44c1_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__44c1_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c1_s_p5_0[] = { - 1, 4, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, - 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,11, 0, 0, 0, 8, 8, 9, 9, 9,10,10,10, - 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10, 9,10, - 10,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, - 10,10,10,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, - 0, 0, 0, 0, 0, 0,12,12,12,12,12,12,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, - 14, -}; - -static const static_codebook _44c1_s_p5_0 = { - 2, 289, - (long *)_vq_lengthlist__44c1_s_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c1_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c1_s_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 6,10,10,11,11, - 11,11,10,10, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,10,11,11,11,12,11,11, 7, - 9, 9,11,10,10,11,11,10, 6, 9, 9,10,10,10,12,10, - 11, -}; - -static const static_codebook _44c1_s_p6_0 = { - 4, 81, - (long *)_vq_lengthlist__44c1_s_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c1_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c1_s_p6_1[] = { - 2, 3, 3, 6, 6, 7, 7, 7, 7, 8, 8,10,10,10, 6, 6, - 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c1_s_p6_1 = { - 2, 121, - (long *)_vq_lengthlist__44c1_s_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44c1_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c1_s_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 9, 7, 5, 6, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 5, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,10, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9,10,10,10,11,11,11,11, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,11,11, 0, 0, 0,10,10, - 10,10,11,11,12,11,12,12, 0, 0, 0,10,10,10, 9,11, - 11,12,11,13,12, 0, 0, 0,13,13,10,10,11,11,12,12, - 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,11,12,11,11,12,12,14,13, 0, 0, 0, 0, - 0,12,11,11,11,13,10,14,13, -}; - -static const static_codebook _44c1_s_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44c1_s_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c1_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c1_s_p7_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c1_s_p7_1 = { - 2, 25, - (long *)_vq_lengthlist__44c1_s_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c1_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44c1_s_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c1_s_p8_0[] = { - 1, 4, 3,10,10,10,10,10,10,10,10,10,10, 4, 8, 6, - 10,10,10,10,10,10,10,10,10,10, 4, 8, 7,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44c1_s_p8_0 = { - 2, 169, - (long *)_vq_lengthlist__44c1_s_p8_0, - 1, -514541568, 1627103232, 4, 0, - (long *)_vq_quantlist__44c1_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44c1_s_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c1_s_p8_1[] = { - 1, 4, 4, 6, 5, 7, 7, 9, 9,10,10,12,12, 6, 5, 5, - 7, 7, 8, 8,10,10,12,11,12,12, 6, 5, 5, 7, 7, 8, - 8,10,10,11,11,12,12,15, 7, 7, 8, 8, 9, 9,11,11, - 12,12,13,12,15, 8, 8, 8, 7, 9, 9,10,10,12,12,13, - 13,16,11,10, 8, 8,10,10,11,11,12,12,13,13,16,11, - 11, 9, 8,11,10,11,11,12,12,13,12,16,16,16,10,11, - 10,11,12,12,12,12,13,13,16,16,16,11, 9,11, 9,14, - 12,12,12,13,13,16,16,16,12,14,11,12,12,12,13,13, - 14,13,16,16,16,15,13,12,10,13,10,13,14,13,13,16, - 16,16,16,16,13,14,12,13,13,12,13,13,16,16,16,16, - 16,13,12,12,11,14,12,15,13, -}; - -static const static_codebook _44c1_s_p8_1 = { - 2, 169, - (long *)_vq_lengthlist__44c1_s_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44c1_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44c1_s_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c1_s_p8_2[] = { - 2, 4, 4, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8,10,10,10, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10,10,10, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, - 9,10, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, - 9,10, 9, 9,10,10,11,11, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9,10, 9, 9,10,10,10,10, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,11,11,11, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10,11,11,11, 8, 8, 9, - 9, 9, 9,10, 9, 9, 9, 9, 9,11,11,11,11,11, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,10,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,10,10,11,11, - 11,11,11, 9, 9, 9,10, 9, 9, 9, 9, 9, 9,10,11,11, - 11,11,11,11,10,10,10,10, 9, 9, 9, 9, 9, 9,10,11, - 11,11,11,11,11, 9,10, 9, 9, 9, 9,10, 9, 9, 9,11, - 11,11,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9,10, 9, - 11,11,10,11,11,11,11,10,11, 9, 9, 9, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _44c1_s_p8_2 = { - 2, 289, - (long *)_vq_lengthlist__44c1_s_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c1_s_p8_2, - 0 -}; - -static const long _huff_lengthlist__44c1_s_short[] = { - 6, 8,13,12,13,14,15,16,16, 4, 2, 4, 7, 6, 8,11, - 13,15,10, 4, 4, 8, 6, 8,11,14,17,11, 5, 6, 5, 6, - 8,12,14,17,11, 5, 5, 6, 5, 7,10,13,16,12, 6, 7, - 8, 7, 8,10,13,15,13, 8, 8, 7, 7, 8,10,12,15,15, - 7, 7, 5, 5, 7, 9,12,14,15, 8, 8, 6, 6, 7, 8,10, - 11, -}; - -static const static_codebook _huff_book__44c1_s_short = { - 2, 81, - (long *)_huff_lengthlist__44c1_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44c1_sm_long[] = { - 5, 4, 8,10, 9, 9,10,11,12, 4, 2, 5, 6, 6, 8,10, - 11,13, 8, 4, 6, 8, 7, 9,12,12,14,10, 6, 8, 4, 5, - 6, 9,11,12, 9, 5, 6, 5, 5, 6, 9,11,11, 9, 7, 9, - 6, 5, 5, 7,10,10,10, 9,11, 8, 7, 6, 7, 9,11,11, - 12,13,10,10, 9, 8, 9,11,11,15,15,12,13,11, 9,10, - 11, -}; - -static const static_codebook _huff_book__44c1_sm_long = { - 2, 81, - (long *)_huff_lengthlist__44c1_sm_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c1_sm_p1_0[] = { - 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, - 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, - 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 9,10, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c1_sm_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__44c1_sm_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44c1_sm_p1_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c1_sm_p2_0[] = { - 2, 3, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 6, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c1_sm_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44c1_sm_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c1_sm_p2_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c1_sm_p3_0[] = { - 1, 3, 3, 7, 7, 0, 0, 0, 0, 0, 5, 5, 6, 6, 0, 0, - 0, 0, 0, 5, 5, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 8, 9, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44c1_sm_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44c1_sm_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_sm_p3_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44c1_sm_p4_0[] = { - 1, 3, 3, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, 8, 8, - 9, 9, 0, 6, 6, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, - 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, - 8, 8, 9, 9,11,11, 0, 0, 0, 9, 9, 9, 9,11,11, 0, - 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0, 9, 9,11, - 11, -}; - -static const static_codebook _44c1_sm_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__44c1_sm_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_sm_p4_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c1_sm_p5_0[] = { - 2, 3, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10,10, - 11,11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9,10,10, - 10,11,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9,10, - 10,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9, 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 9, 9,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, - 0, 0, 0,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, 0, - 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, - 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, - 14, -}; - -static const static_codebook _44c1_sm_p5_0 = { - 2, 289, - (long *)_vq_lengthlist__44c1_sm_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c1_sm_p5_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44c1_sm_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,11, - 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,10,11, - 11,11,10,10, 6, 9, 9,11,11,10,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,11,11,11,11,11,11,11, 6, - 9, 9,11,10,10,11,11,10, 6, 9, 9,10,10,10,11,10, - 11, -}; - -static const static_codebook _44c1_sm_p6_0 = { - 4, 81, - (long *)_vq_lengthlist__44c1_sm_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44c1_sm_p6_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44c1_sm_p6_1[] = { - 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, - 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 9, 8,10,10,10,10,10, 8, 8, 8, - 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, - 10,10,10, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44c1_sm_p6_1 = { - 2, 121, - (long *)_vq_lengthlist__44c1_sm_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44c1_sm_p6_1, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c1_sm_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 6, 7, 7, 8, - 8, 8, 8, 9, 9,11,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9,10,10,10,10,11,11,11,11, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,12,12, 0, 0, 0, 9,10, - 9,10,11,11,12,11,13,12, 0, 0, 0,10,10, 9, 9,11, - 11,12,12,13,12, 0, 0, 0,13,13,10,10,11,11,12,12, - 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,11,12,11,11,12,13,14,13, 0, 0, 0, 0, - 0,12,12,11,11,13,12,14,13, -}; - -static const static_codebook _44c1_sm_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44c1_sm_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44c1_sm_p7_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44c1_sm_p7_1[] = { - 2, 4, 4, 4, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44c1_sm_p7_1 = { - 2, 25, - (long *)_vq_lengthlist__44c1_sm_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44c1_sm_p7_1, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p8_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c1_sm_p8_0[] = { - 1, 3, 3,13,13,13,13,13,13,13,13,13,13, 3, 6, 6, - 13,13,13,13,13,13,13,13,13,13, 4, 8, 7,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13, -}; - -static const static_codebook _44c1_sm_p8_0 = { - 2, 169, - (long *)_vq_lengthlist__44c1_sm_p8_0, - 1, -514541568, 1627103232, 4, 0, - (long *)_vq_quantlist__44c1_sm_p8_0, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44c1_sm_p8_1[] = { - 1, 4, 4, 6, 6, 7, 7, 9, 9,10,11,12,12, 6, 5, 5, - 7, 7, 8, 7,10,10,11,11,12,12, 6, 5, 5, 7, 7, 8, - 8,10,10,11,11,12,12,16, 7, 7, 8, 8, 9, 9,11,11, - 12,12,13,13,17, 7, 7, 8, 7, 9, 9,11,10,12,12,13, - 13,19,11,10, 8, 8,10,10,11,11,12,12,13,13,19,11, - 11, 9, 7,11,10,11,11,12,12,13,12,19,19,19,10,10, - 10,10,11,12,12,12,13,14,18,19,19,11, 9,11, 9,13, - 12,12,12,13,13,19,20,19,13,15,11,11,12,12,13,13, - 14,13,18,19,20,15,13,12,10,13,10,13,13,13,14,20, - 20,20,20,20,13,14,12,12,13,12,13,13,20,20,20,20, - 20,13,12,12,12,14,12,14,13, -}; - -static const static_codebook _44c1_sm_p8_1 = { - 2, 169, - (long *)_vq_lengthlist__44c1_sm_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44c1_sm_p8_1, - 0 -}; - -static const long _vq_quantlist__44c1_sm_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44c1_sm_p8_2[] = { - 2, 5, 5, 6, 6, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, - 8,10, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9,10,11,11, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9,10,10, 9,10,10,10,10, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,11,10,10, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10, 9,10,10,10,11,11, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,11,11,11, 9, 9, - 9, 9, 9, 9, 9, 9,10, 9,10, 9,11,11,11,11,11, 9, - 8, 9, 9, 9, 9, 9, 9, 9,10,10, 9,11,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,11,11,11,11, - 11,11,11, 9, 9,10, 9, 9, 9, 9,10, 9,10,10,11,10, - 11,11,11,11, 9,10,10,10, 9, 9, 9, 9, 9, 9,10,11, - 11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,11, - 11,10,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9,10, 9, - 10,11,10,11,11,11,11,11,11, 9, 9,10, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _44c1_sm_p8_2 = { - 2, 289, - (long *)_vq_lengthlist__44c1_sm_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44c1_sm_p8_2, - 0 -}; - -static const long _huff_lengthlist__44c1_sm_short[] = { - 4, 7,13,14,14,15,16,18,18, 4, 2, 5, 8, 7, 9,12, - 15,15,10, 4, 5,10, 6, 8,11,15,17,12, 5, 7, 5, 6, - 8,11,14,17,11, 5, 6, 6, 5, 6, 9,13,17,12, 6, 7, - 6, 5, 6, 8,12,14,14, 7, 8, 6, 6, 7, 9,11,14,14, - 8, 9, 6, 5, 6, 9,11,13,16,10,10, 7, 6, 7, 8,10, - 11, -}; - -static const static_codebook _huff_book__44c1_sm_short = { - 2, 81, - (long *)_huff_lengthlist__44c1_sm_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44cn1_s_long[] = { - 4, 4, 7, 8, 7, 8,10,12,17, 3, 1, 6, 6, 7, 8,10, - 12,15, 7, 6, 9, 9, 9,11,12,14,17, 8, 6, 9, 6, 7, - 9,11,13,17, 7, 6, 9, 7, 7, 8, 9,12,15, 8, 8,10, - 8, 7, 7, 7,10,14, 9,10,12,10, 8, 8, 8,10,14,11, - 13,15,13,12,11,11,12,16,17,18,18,19,20,18,16,16, - 20, -}; - -static const static_codebook _huff_book__44cn1_s_long = { - 2, 81, - (long *)_huff_lengthlist__44cn1_s_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44cn1_s_p1_0[] = { - 1, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7,10, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, - 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8, 9,10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, 0, - 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0,10,11,11, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, - 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0,10,11,11, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, - 0, 0, 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,11,11, 0, - 0, 0, 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,11,11, - 0, 0, 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44cn1_s_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__44cn1_s_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44cn1_s_p1_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44cn1_s_p2_0[] = { - 1, 4, 4, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 6, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44cn1_s_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44cn1_s_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44cn1_s_p2_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44cn1_s_p3_0[] = { - 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, - 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, - 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, - 9, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44cn1_s_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44cn1_s_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_s_p3_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44cn1_s_p4_0[] = { - 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 6, 6, 7, 7, - 9, 9, 0, 0, 0, 6, 6, 7, 7, 9, 9, 0, 0, 0, 7, 7, - 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, - 9, 9, 9, 9,10,10, 0, 0, 0, 9, 9, 9, 9,10,10, 0, - 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0,10,10,11, - 11, -}; - -static const static_codebook _44cn1_s_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__44cn1_s_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_s_p4_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44cn1_s_p5_0[] = { - 1, 4, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,10, - 10, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, - 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, - 10,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,11, 0, 0, 0, 8, 8, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9, 9,10, - 10,10,11,11,11,12,12, 0, 0, 0, 9, 9,10, 9,10,10, - 10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, - 10,10,10,11,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, - 10,10,11,10,11,11,11,12,13,12,13,13, 0, 0, 0, 0, - 0, 0, 0,11,10,11,11,12,12,12,12,13,13, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, - 0, 0, 0, 0, 0, 0,12,12,12,13,13,13,13,13,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,12,13,13,14, - 14, -}; - -static const static_codebook _44cn1_s_p5_0 = { - 2, 289, - (long *)_vq_lengthlist__44cn1_s_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44cn1_s_p5_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44cn1_s_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 6, 6,10, 9, 9,11, - 9, 9, 4, 6, 6,10, 9, 9,10, 9, 9, 7,10,10,11,11, - 11,12,11,11, 7, 9, 9,11,11,10,11,10,10, 7, 9, 9, - 11,10,11,11,10,10, 7,10,10,11,11,11,12,11,11, 7, - 9, 9,11,10,10,11,10,10, 7, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44cn1_s_p6_0 = { - 4, 81, - (long *)_vq_lengthlist__44cn1_s_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44cn1_s_p6_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44cn1_s_p6_1[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,10, 7, 6, - 8, 8, 8, 8, 8, 8,10,10,10, 7, 6, 7, 7, 8, 8, 8, - 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 8, 8, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 9, 9, - 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, - 9, 9, 9,10,10,10,10,10, 9, 9, 9, 9, 9, 9,10,10, - 10,10,10, 9, 9, 9, 9, 9, 9, -}; - -static const static_codebook _44cn1_s_p6_1 = { - 2, 121, - (long *)_vq_lengthlist__44cn1_s_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_s_p6_1, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44cn1_s_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, - 7, 7, 8, 8, 8, 8, 9, 9,11,11, 7, 5, 5, 7, 7, 8, - 8, 8, 8, 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9,10,10,10,11,11,11,12, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,11,12, 0, 0, 0,10,10, - 10,10,11,11,12,12,12,13, 0, 0, 0,10,10,10,10,11, - 11,12,12,13,12, 0, 0, 0,14,14,11,10,11,12,12,13, - 13,14, 0, 0, 0,15,15,11,11,12,11,12,12,14,13, 0, - 0, 0, 0, 0,12,12,12,12,13,13,14,14, 0, 0, 0, 0, - 0,13,13,12,12,13,13,13,14, -}; - -static const static_codebook _44cn1_s_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44cn1_s_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44cn1_s_p7_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44cn1_s_p7_1[] = { - 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, - 6, 6, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44cn1_s_p7_1 = { - 2, 25, - (long *)_vq_lengthlist__44cn1_s_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44cn1_s_p7_1, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p8_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44cn1_s_p8_0[] = { - 1, 7, 7,11,11, 8,11,11,11,11, 4,11, 3,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11, 7,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11, 8,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12, -}; - -static const static_codebook _44cn1_s_p8_0 = { - 4, 625, - (long *)_vq_lengthlist__44cn1_s_p8_0, - 1, -518283264, 1627103232, 3, 0, - (long *)_vq_quantlist__44cn1_s_p8_0, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44cn1_s_p8_1[] = { - 1, 4, 4, 6, 6, 8, 8, 9,10,10,11,11,11, 6, 5, 5, - 7, 7, 8, 8, 9,10, 9,11,11,12, 5, 5, 5, 7, 7, 8, - 9,10,10,12,12,14,13,15, 7, 7, 8, 8, 9,10,11,11, - 10,12,10,11,15, 7, 8, 8, 8, 9, 9,11,11,13,12,12, - 13,15,10,10, 8, 8,10,10,12,12,11,14,10,10,15,11, - 11, 8, 8,10,10,12,13,13,14,15,13,15,15,15,10,10, - 10,10,12,12,13,12,13,10,15,15,15,10,10,11,10,13, - 11,13,13,15,13,15,15,15,13,13,10,11,11,11,12,10, - 14,11,15,15,14,14,13,10,10,12,11,13,13,14,14,15, - 15,15,15,15,11,11,11,11,12,11,15,12,15,15,15,15, - 15,12,12,11,11,14,12,13,14, -}; - -static const static_codebook _44cn1_s_p8_1 = { - 2, 169, - (long *)_vq_lengthlist__44cn1_s_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44cn1_s_p8_1, - 0 -}; - -static const long _vq_quantlist__44cn1_s_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44cn1_s_p8_2[] = { - 3, 4, 3, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9,10,11,11, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10,10,10, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9,10,10,10, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, - 9, 9,10, 9,10,11,10, 7, 6, 7, 7, 8, 8, 9, 9, 9, - 9, 9, 9, 9,10,10,10,11, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9,10,11,11,11, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9,11,10,10,11,11, 8, 8, 8, - 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,11,11, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,10,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,10,11, - 11,11,11, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,11,11, - 10,11,11,11, 9,10,10, 9, 9, 9, 9, 9, 9, 9,10,11, - 11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, - 11,11,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9, 9, 9, - 11,11,11,10,11,11,11,11,11, 9, 9, 9,10, 9, 9, 9, - 9, -}; - -static const static_codebook _44cn1_s_p8_2 = { - 2, 289, - (long *)_vq_lengthlist__44cn1_s_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44cn1_s_p8_2, - 0 -}; - -static const long _huff_lengthlist__44cn1_s_short[] = { - 10, 9,12,15,12,13,16,14,16, 7, 1, 5,14, 7,10,13, - 16,16, 9, 4, 6,16, 8,11,16,16,16,14, 4, 7,16, 9, - 12,14,16,16,10, 5, 7,14, 9,12,14,15,15,13, 8, 9, - 14,10,12,13,14,15,13, 9, 9, 7, 6, 8,11,12,12,14, - 8, 8, 5, 4, 5, 8,11,12,16,10,10, 6, 5, 6, 8, 9, - 10, -}; - -static const static_codebook _huff_book__44cn1_s_short = { - 2, 81, - (long *)_huff_lengthlist__44cn1_s_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44cn1_sm_long[] = { - 3, 3, 8, 8, 8, 8,10,12,14, 3, 2, 6, 7, 7, 8,10, - 12,16, 7, 6, 7, 9, 8,10,12,14,16, 8, 6, 8, 4, 5, - 7, 9,11,13, 7, 6, 8, 5, 6, 7, 9,11,14, 8, 8,10, - 7, 7, 6, 8,10,13, 9,11,12, 9, 9, 7, 8,10,12,10, - 13,15,11,11,10, 9,10,13,13,16,17,14,15,14,13,14, - 17, -}; - -static const static_codebook _huff_book__44cn1_sm_long = { - 2, 81, - (long *)_huff_lengthlist__44cn1_sm_long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44cn1_sm_p1_0[] = { - 1, 4, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, - 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, - 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, - 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, - 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10, 9, 0, 0, 0, - 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, - 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, - 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, - 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, - 0, 0, 0, 0, 0, 0, 9,10, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44cn1_sm_p1_0 = { - 8, 6561, - (long *)_vq_lengthlist__44cn1_sm_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44cn1_sm_p1_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44cn1_sm_p2_0[] = { - 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44cn1_sm_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44cn1_sm_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44cn1_sm_p2_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44cn1_sm_p3_0[] = { - 1, 3, 4, 7, 7, 0, 0, 0, 0, 0, 4, 4, 7, 7, 0, 0, - 0, 0, 0, 4, 5, 7, 7, 0, 0, 0, 0, 0, 6, 7, 8, 8, - 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, - 9, 9, 0, 0, 0, 0, 0, 0, 0,10, 9, 0, 0, 0, 0, 0, - 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, -}; - -static const static_codebook _44cn1_sm_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44cn1_sm_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p3_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p4_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44cn1_sm_p4_0[] = { - 1, 4, 3, 6, 6, 7, 7, 9, 9, 0, 5, 5, 7, 7, 8, 7, - 9, 9, 0, 5, 5, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 8, - 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, - 9, 9, 9, 9,10,10, 0, 0, 0, 9, 9, 9, 9,10,10, 0, - 0, 0,10,10,10,10,11,11, 0, 0, 0, 0, 0,10,10,11, - 11, -}; - -static const static_codebook _44cn1_sm_p4_0 = { - 2, 81, - (long *)_vq_lengthlist__44cn1_sm_p4_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p4_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p5_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44cn1_sm_p5_0[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11, - 11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, - 12,12, 0, 6, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, - 11,12,12, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10,11, - 11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, - 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, - 10,11,11,12,12,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, - 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, - 10,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, 0, 9, - 9,10,10,11,11,12,12,12,13,13,13, 0, 0, 0, 0, 0, - 10,10,11,11,11,11,12,12,13,13,14,14, 0, 0, 0, 0, - 0, 0, 0,11,11,11,11,12,12,13,13,14,14, 0, 0, 0, - 0, 0, 0, 0,11,11,12,12,13,13,13,13,14,14, 0, 0, - 0, 0, 0, 0, 0,11,11,12,12,13,13,13,13,14,14, 0, - 0, 0, 0, 0, 0, 0,12,12,12,13,13,13,14,14,14,14, - 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,14,14,14, - 14, -}; - -static const static_codebook _44cn1_sm_p5_0 = { - 2, 289, - (long *)_vq_lengthlist__44cn1_sm_p5_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44cn1_sm_p5_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p6_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44cn1_sm_p6_0[] = { - 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 6,10, 9, 9,11, - 9, 9, 4, 6, 7,10, 9, 9,11, 9, 9, 7,10,10,10,11, - 11,11,11,10, 6, 9, 9,11,10,10,11,10,10, 6, 9, 9, - 11,10,11,11,10,10, 7,11,11,11,11,11,12,11,11, 7, - 9, 9,11,10,10,12,10,10, 7, 9, 9,11,10,10,11,10, - 10, -}; - -static const static_codebook _44cn1_sm_p6_0 = { - 4, 81, - (long *)_vq_lengthlist__44cn1_sm_p6_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44cn1_sm_p6_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p6_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44cn1_sm_p6_1[] = { - 2, 4, 4, 5, 5, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8,10, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, - 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, - 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, - 8, 8, 8, 8, 8, 8, 9, 9,10,10,10,10,10, 8, 8, 8, - 8, 9, 9,10,10,10,10,10, 9, 9, 9, 9, 8, 9,10,10, - 10,10,10, 8, 9, 8, 8, 9, 8, -}; - -static const static_codebook _44cn1_sm_p6_1 = { - 2, 121, - (long *)_vq_lengthlist__44cn1_sm_p6_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p6_1, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44cn1_sm_p7_0[] = { - 1, 4, 4, 6, 6, 7, 7, 7, 7, 9, 9,10,10, 7, 5, 5, - 7, 7, 8, 8, 8, 8,10, 9,11,10, 7, 5, 5, 7, 7, 8, - 8, 8, 8, 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, - 11, 0,12,12, 9, 9, 9,10,10,10,11,11,12,12, 0,13, - 13, 9, 9, 9, 9,10,10,11,11,12,12, 0, 0, 0,10,10, - 10,10,11,11,12,12,12,13, 0, 0, 0,10,10,10,10,11, - 11,12,12,12,12, 0, 0, 0,14,14,11,11,11,11,12,13, - 13,13, 0, 0, 0,14,14,11,10,11,11,12,12,13,13, 0, - 0, 0, 0, 0,12,12,12,12,13,13,13,14, 0, 0, 0, 0, - 0,13,12,12,12,13,13,13,14, -}; - -static const static_codebook _44cn1_sm_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44cn1_sm_p7_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p7_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p7_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44cn1_sm_p7_1[] = { - 2, 4, 4, 4, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, - 5, 5, 5, 5, 6, 6, 6, 5, 5, -}; - -static const static_codebook _44cn1_sm_p7_1 = { - 2, 25, - (long *)_vq_lengthlist__44cn1_sm_p7_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44cn1_sm_p7_1, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p8_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44cn1_sm_p8_0[] = { - 1, 4, 4,12,11,13,13,14,14, 4, 7, 7,11,13,14,14, - 14,14, 3, 8, 3,14,14,14,14,14,14,14,10,12,14,14, - 14,14,14,14,14,14, 5,14, 8,14,14,14,14,14,12,14, - 13,14,14,14,14,14,14,14,13,14,10,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14, -}; - -static const static_codebook _44cn1_sm_p8_0 = { - 2, 81, - (long *)_vq_lengthlist__44cn1_sm_p8_0, - 1, -516186112, 1627103232, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p8_0, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p8_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44cn1_sm_p8_1[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9,10,11,11,11, 6, 5, 5, - 7, 7, 8, 8,10,10,10,11,11,11, 6, 5, 5, 7, 7, 8, - 8,10,10,11,12,12,12,14, 7, 7, 7, 8, 9, 9,11,11, - 11,12,11,12,17, 7, 7, 8, 7, 9, 9,11,11,12,12,12, - 12,14,11,11, 8, 8,10,10,11,12,12,13,11,12,14,11, - 11, 8, 8,10,10,11,12,12,13,13,12,14,15,14,10,10, - 10,10,11,12,12,12,12,11,14,13,16,10,10,10, 9,12, - 11,12,12,13,14,14,15,14,14,13,10,10,11,11,12,11, - 13,11,14,12,15,13,14,11,10,12,10,12,12,13,13,13, - 13,14,15,15,12,12,11,11,12,11,13,12,14,14,14,14, - 17,12,12,11,10,13,11,13,13, -}; - -static const static_codebook _44cn1_sm_p8_1 = { - 2, 169, - (long *)_vq_lengthlist__44cn1_sm_p8_1, - 1, -522616832, 1620115456, 4, 0, - (long *)_vq_quantlist__44cn1_sm_p8_1, - 0 -}; - -static const long _vq_quantlist__44cn1_sm_p8_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44cn1_sm_p8_2[] = { - 3, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9,10, 6, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9,10, 6, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9,10,10,10, 7, 7, 7, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9,11,10,11, 8, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,11,11, 8, 8, 8, - 8, 9, 9, 9, 9, 9, 9, 9, 9,11,10,11,11,11, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,10,11,11, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,11,10,11,11, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,11,11, - 11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11,11, - 11,11,11,11, 9,10,10,10, 9, 9, 9, 9, 9, 9,11,10, - 11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, - 11,11,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9, 9, 9, - 10,11,11,11,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _44cn1_sm_p8_2 = { - 2, 289, - (long *)_vq_lengthlist__44cn1_sm_p8_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44cn1_sm_p8_2, - 0 -}; - -static const long _huff_lengthlist__44cn1_sm_short[] = { - 5, 6,12,14,12,14,16,17,18, 4, 2, 5,11, 7,10,12, - 14,15, 9, 4, 5,11, 7,10,13,15,18,15, 6, 7, 5, 6, - 8,11,13,16,11, 5, 6, 5, 5, 6, 9,13,15,12, 5, 7, - 6, 5, 6, 9,12,14,12, 6, 7, 8, 6, 7, 9,12,13,14, - 8, 8, 7, 5, 5, 8,10,12,16, 9, 9, 8, 6, 6, 7, 9, - 9, -}; - -static const static_codebook _huff_book__44cn1_sm_short = { - 2, 81, - (long *)_huff_lengthlist__44cn1_sm_short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h deleted file mode 100755 index 609b97b..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/floor/floor_books.h +++ /dev/null @@ -1,1546 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: static codebooks autogenerated by huff/huffbuld - last modified: $Id: floor_books.h 16939 2010-03-01 08:38:14Z xiphmont $ - - ********************************************************************/ - -#include "../../codebook.h" - -static const long _huff_lengthlist_line_256x7_0sub1[] = { - 0, 2, 3, 3, 3, 3, 4, 3, 4, -}; - -static const static_codebook _huff_book_line_256x7_0sub1 = { - 1, 9, - (long *)_huff_lengthlist_line_256x7_0sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x7_0sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 5, 3, - 6, 3, 6, 4, 6, 4, 7, 5, 7, -}; - -static const static_codebook _huff_book_line_256x7_0sub2 = { - 1, 25, - (long *)_huff_lengthlist_line_256x7_0sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x7_0sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 2, 5, 3, 5, 3, - 6, 3, 6, 4, 7, 6, 7, 8, 7, 9, 8, 9, 9, 9,10, 9, - 11,13,11,13,10,10,13,13,13,13,13,13,12,12,12,12, -}; - -static const static_codebook _huff_book_line_256x7_0sub3 = { - 1, 64, - (long *)_huff_lengthlist_line_256x7_0sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x7_1sub1[] = { - 0, 3, 3, 3, 3, 2, 4, 3, 4, -}; - -static const static_codebook _huff_book_line_256x7_1sub1 = { - 1, 9, - (long *)_huff_lengthlist_line_256x7_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x7_1sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 4, 3, 4, 4, - 5, 4, 6, 5, 6, 7, 6, 8, 8, -}; - -static const static_codebook _huff_book_line_256x7_1sub2 = { - 1, 25, - (long *)_huff_lengthlist_line_256x7_1sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x7_1sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 4, 3, 6, 3, 7, - 3, 8, 5, 8, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, -}; - -static const static_codebook _huff_book_line_256x7_1sub3 = { - 1, 64, - (long *)_huff_lengthlist_line_256x7_1sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x7_class0[] = { - 7, 5, 5, 9, 9, 6, 6, 9,12, 8, 7, 8,11, 8, 9,15, - 6, 3, 3, 7, 7, 4, 3, 6, 9, 6, 5, 6, 8, 6, 8,15, - 8, 5, 5, 9, 8, 5, 4, 6,10, 7, 5, 5,11, 8, 7,15, - 14,15,13,13,13,13, 8,11,15,10, 7, 6,11, 9,10,15, -}; - -static const static_codebook _huff_book_line_256x7_class0 = { - 1, 64, - (long *)_huff_lengthlist_line_256x7_class0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x7_class1[] = { - 5, 6, 8,15, 6, 9,10,15,10,11,12,15,15,15,15,15, - 4, 6, 7,15, 6, 7, 8,15, 9, 8, 9,15,15,15,15,15, - 6, 8, 9,15, 7, 7, 8,15,10, 9,10,15,15,15,15,15, - 15,13,15,15,15,10,11,15,15,13,13,15,15,15,15,15, - 4, 6, 7,15, 6, 8, 9,15,10,10,12,15,15,15,15,15, - 2, 5, 6,15, 5, 6, 7,15, 8, 6, 7,15,15,15,15,15, - 5, 6, 8,15, 5, 6, 7,15, 9, 6, 7,15,15,15,15,15, - 14,12,13,15,12,10,11,15,15,15,15,15,15,15,15,15, - 7, 8, 9,15, 9,10,10,15,15,14,14,15,15,15,15,15, - 5, 6, 7,15, 7, 8, 9,15,12, 9,10,15,15,15,15,15, - 7, 7, 9,15, 7, 7, 8,15,12, 8, 9,15,15,15,15,15, - 13,13,14,15,12,11,12,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 13,13,13,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,12,13,15,15,12,13,15,15,14,15,15,15,15,15,15, - 15,15,15,15,15,15,13,15,15,15,15,15,15,15,15,15, -}; - -static const static_codebook _huff_book_line_256x7_class1 = { - 1, 256, - (long *)_huff_lengthlist_line_256x7_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_0sub0[] = { - 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 6, 5, 6, 6, 6, 6, 5, 6, 6, 7, 6, 7, 6, 7, 6, - 7, 6, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 9, 7, 9, 7, - 9, 7, 9, 8, 9, 8,10, 8,10, 8,10, 7,10, 6,10, 8, - 10, 8,11, 7,10, 7,11, 8,11,11,12,12,11,11,12,11, - 13,11,13,11,13,12,15,12,13,13,14,14,14,14,14,15, - 15,15,16,14,17,19,19,18,18,18,18,18,18,18,18,18, - 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -}; - -static const static_codebook _huff_book_line_512x17_0sub0 = { - 1, 128, - (long *)_huff_lengthlist_line_512x17_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_1sub0[] = { - 2, 4, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 6, 5, - 6, 5, 6, 6, 7, 6, 7, 6, 8, 7, 8, 7, 8, 7, 8, 7, -}; - -static const static_codebook _huff_book_line_512x17_1sub0 = { - 1, 32, - (long *)_huff_lengthlist_line_512x17_1sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_1sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 3, 5, 3, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 6, 5, - 6, 5, 7, 5, 8, 6, 8, 6, 8, 6, 8, 6, 8, 7, 9, 7, - 9, 7,11, 9,11,11,12,11,14,12,14,16,14,16,13,16, - 14,16,12,15,13,16,14,16,13,14,12,15,13,15,13,13, - 13,15,12,14,14,15,13,15,12,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, -}; - -static const static_codebook _huff_book_line_512x17_1sub1 = { - 1, 128, - (long *)_huff_lengthlist_line_512x17_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_2sub1[] = { - 0, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 5, 4, 5, 3, - 5, 3, -}; - -static const static_codebook _huff_book_line_512x17_2sub1 = { - 1, 18, - (long *)_huff_lengthlist_line_512x17_2sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_2sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 3, 4, 3, 4, 4, 5, 4, 5, 4, 6, 4, 6, 5, - 6, 5, 7, 5, 7, 6, 8, 6, 8, 6, 8, 7, 8, 7, 9, 7, - 9, 8, -}; - -static const static_codebook _huff_book_line_512x17_2sub2 = { - 1, 50, - (long *)_huff_lengthlist_line_512x17_2sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_2sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 3, 3, 4, 3, 4, 4, 5, 5, 6, 6, 7, 7, - 7, 8, 8,11, 8, 9, 9, 9,10,11,11,11, 9,10,10,11, - 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _huff_book_line_512x17_2sub3 = { - 1, 128, - (long *)_huff_lengthlist_line_512x17_2sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_3sub1[] = { - 0, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 5, 4, 5, - 5, 5, -}; - -static const static_codebook _huff_book_line_512x17_3sub1 = { - 1, 18, - (long *)_huff_lengthlist_line_512x17_3sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_3sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 3, 3, 4, 3, 5, 4, 6, 4, 6, 5, 7, 6, 7, - 6, 8, 6, 8, 7, 9, 8,10, 8,12, 9,13,10,15,10,15, - 11,14, -}; - -static const static_codebook _huff_book_line_512x17_3sub2 = { - 1, 50, - (long *)_huff_lengthlist_line_512x17_3sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_3sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 8, 4, 8, 4, 8, 4, 8, 5, 8, 5, 8, 6, 8, - 4, 8, 4, 8, 5, 8, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _huff_book_line_512x17_3sub3 = { - 1, 128, - (long *)_huff_lengthlist_line_512x17_3sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_class1[] = { - 1, 2, 3, 6, 5, 4, 7, 7, -}; - -static const static_codebook _huff_book_line_512x17_class1 = { - 1, 8, - (long *)_huff_lengthlist_line_512x17_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_class2[] = { - 3, 3, 3,14, 5, 4, 4,11, 8, 6, 6,10,17,12,11,17, - 6, 5, 5,15, 5, 3, 4,11, 8, 5, 5, 8,16, 9,10,14, - 10, 8, 9,17, 8, 6, 6,13,10, 7, 7,10,16,11,13,14, - 17,17,17,17,17,16,16,16,16,15,16,16,16,16,16,16, -}; - -static const static_codebook _huff_book_line_512x17_class2 = { - 1, 64, - (long *)_huff_lengthlist_line_512x17_class2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_512x17_class3[] = { - 2, 4, 6,17, 4, 5, 7,17, 8, 7,10,17,17,17,17,17, - 3, 4, 6,15, 3, 3, 6,15, 7, 6, 9,17,17,17,17,17, - 6, 8,10,17, 6, 6, 8,16, 9, 8,10,17,17,15,16,17, - 17,17,17,17,12,15,15,16,12,15,15,16,16,16,16,16, -}; - -static const static_codebook _huff_book_line_512x17_class3 = { - 1, 64, - (long *)_huff_lengthlist_line_512x17_class3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x4_class0[] = { - 7, 7, 7,11, 6, 6, 7,11, 7, 6, 6,10,12,10,10,13, - 7, 7, 8,11, 7, 7, 7,11, 7, 6, 7,10,11,10,10,13, - 10,10, 9,12, 9, 9, 9,11, 8, 8, 8,11,13,11,10,14, - 15,15,14,15,15,14,13,14,15,12,12,17,17,17,17,17, - 7, 7, 6, 9, 6, 6, 6, 9, 7, 6, 6, 8,11,11,10,12, - 7, 7, 7, 9, 7, 6, 6, 9, 7, 6, 6, 9,13,10,10,11, - 10, 9, 8,10, 9, 8, 8,10, 8, 8, 7, 9,13,12,10,11, - 17,14,14,13,15,14,12,13,17,13,12,15,17,17,14,17, - 7, 6, 6, 7, 6, 6, 5, 7, 6, 6, 6, 6,11, 9, 9, 9, - 7, 7, 6, 7, 7, 6, 6, 7, 6, 6, 6, 6,10, 9, 8, 9, - 10, 9, 8, 8, 9, 8, 7, 8, 8, 7, 6, 8,11,10, 9,10, - 17,17,12,15,15,15,12,14,14,14,10,12,15,13,12,13, - 11,10, 8,10,11,10, 8, 8,10, 9, 7, 7,10, 9, 9,11, - 11,11, 9,10,11,10, 8, 9,10, 8, 6, 8,10, 9, 9,11, - 14,13,10,12,12,11,10,10, 8, 7, 8,10,10,11,11,12, - 17,17,15,17,17,17,17,17,17,13,12,17,17,17,14,17, -}; - -static const static_codebook _huff_book_line_128x4_class0 = { - 1, 256, - (long *)_huff_lengthlist_line_128x4_class0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x4_0sub0[] = { - 2, 2, 2, 2, -}; - -static const static_codebook _huff_book_line_128x4_0sub0 = { - 1, 4, - (long *)_huff_lengthlist_line_128x4_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x4_0sub1[] = { - 0, 0, 0, 0, 3, 2, 3, 2, 3, 3, -}; - -static const static_codebook _huff_book_line_128x4_0sub1 = { - 1, 10, - (long *)_huff_lengthlist_line_128x4_0sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x4_0sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 4, 3, 4, 3, - 4, 4, 5, 4, 5, 4, 6, 5, 6, -}; - -static const static_codebook _huff_book_line_128x4_0sub2 = { - 1, 25, - (long *)_huff_lengthlist_line_128x4_0sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x4_0sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 3, 5, 3, 5, 3, - 5, 4, 6, 5, 6, 5, 7, 6, 6, 7, 7, 9, 9,11,11,16, - 11,14,10,11,11,13,16,15,15,15,15,15,15,15,15,15, -}; - -static const static_codebook _huff_book_line_128x4_0sub3 = { - 1, 64, - (long *)_huff_lengthlist_line_128x4_0sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x4_class0[] = { - 6, 7, 7,12, 6, 6, 7,12, 7, 6, 6,10,15,12,11,13, - 7, 7, 8,13, 7, 7, 8,12, 7, 7, 7,11,12,12,11,13, - 10, 9, 9,11, 9, 9, 9,10,10, 8, 8,12,14,12,12,14, - 11,11,12,14,11,12,11,15,15,12,13,15,15,15,15,15, - 6, 6, 7,10, 6, 6, 6,11, 7, 6, 6, 9,14,12,11,13, - 7, 7, 7,10, 6, 6, 7, 9, 7, 7, 6,10,13,12,10,12, - 9, 9, 9,11, 9, 9, 8, 9, 9, 8, 8,10,13,12,10,12, - 12,12,11,13,12,12,11,12,15,13,12,15,15,15,14,14, - 6, 6, 6, 8, 6, 6, 5, 6, 7, 7, 6, 5,11,10, 9, 8, - 7, 6, 6, 7, 6, 6, 5, 6, 7, 7, 6, 6,11,10, 9, 8, - 8, 8, 8, 9, 8, 8, 7, 8, 8, 8, 6, 7,11,10, 9, 9, - 14,11,10,14,14,11,10,15,13,11, 9,11,15,12,12,11, - 11, 9, 8, 8,10, 9, 8, 9,11,10, 9, 8,12,11,12,11, - 13,10, 8, 9,11,10, 8, 9,10, 9, 8, 9,10, 8,12,12, - 15,11,10,10,13,11,10,10, 8, 8, 7,12,10, 9,11,12, - 15,12,11,15,13,11,11,15,12,14,11,13,15,15,13,13, -}; - -static const static_codebook _huff_book_line_256x4_class0 = { - 1, 256, - (long *)_huff_lengthlist_line_256x4_class0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x4_0sub0[] = { - 2, 2, 2, 2, -}; - -static const static_codebook _huff_book_line_256x4_0sub0 = { - 1, 4, - (long *)_huff_lengthlist_line_256x4_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x4_0sub1[] = { - 0, 0, 0, 0, 2, 2, 3, 3, 3, 3, -}; - -static const static_codebook _huff_book_line_256x4_0sub1 = { - 1, 10, - (long *)_huff_lengthlist_line_256x4_0sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x4_0sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 4, 3, 4, 3, - 5, 3, 5, 4, 5, 4, 6, 4, 6, -}; - -static const static_codebook _huff_book_line_256x4_0sub2 = { - 1, 25, - (long *)_huff_lengthlist_line_256x4_0sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x4_0sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 3, 5, 3, 5, 3, - 6, 4, 7, 4, 7, 5, 7, 6, 7, 6, 7, 8,10,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,12,12,12,12,12, -}; - -static const static_codebook _huff_book_line_256x4_0sub3 = { - 1, 64, - (long *)_huff_lengthlist_line_256x4_0sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x7_class0[] = { - 10, 7, 8,13, 9, 6, 7,11,10, 8, 8,12,17,17,17,17, - 7, 5, 5, 9, 6, 4, 4, 8, 8, 5, 5, 8,16,14,13,16, - 7, 5, 5, 7, 6, 3, 3, 5, 8, 5, 4, 7,14,12,12,15, - 10, 7, 8, 9, 7, 5, 5, 6, 9, 6, 5, 5,15,12, 9,10, -}; - -static const static_codebook _huff_book_line_128x7_class0 = { - 1, 64, - (long *)_huff_lengthlist_line_128x7_class0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x7_class1[] = { - 8,13,17,17, 8,11,17,17,11,13,17,17,17,17,17,17, - 6,10,16,17, 6,10,15,17, 8,10,16,17,17,17,17,17, - 9,13,15,17, 8,11,17,17,10,12,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 6,11,15,17, 7,10,15,17, 8,10,17,17,17,15,17,17, - 4, 8,13,17, 4, 7,13,17, 6, 8,15,17,16,15,17,17, - 6,11,15,17, 6, 9,13,17, 8,10,17,17,15,17,17,17, - 16,17,17,17,12,14,15,17,13,14,15,17,17,17,17,17, - 5,10,14,17, 5, 9,14,17, 7, 9,15,17,15,15,17,17, - 3, 7,12,17, 3, 6,11,17, 5, 7,13,17,12,12,17,17, - 5, 9,14,17, 3, 7,11,17, 5, 8,13,17,13,11,16,17, - 12,17,17,17, 9,14,15,17,10,11,14,17,16,14,17,17, - 8,12,17,17, 8,12,17,17,10,12,17,17,17,17,17,17, - 5,10,17,17, 5, 9,15,17, 7, 9,17,17,13,13,17,17, - 7,11,17,17, 6,10,15,17, 7, 9,15,17,12,11,17,17, - 12,15,17,17,11,14,17,17,11,10,15,17,17,16,17,17, -}; - -static const static_codebook _huff_book_line_128x7_class1 = { - 1, 256, - (long *)_huff_lengthlist_line_128x7_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x7_0sub1[] = { - 0, 3, 3, 3, 3, 3, 3, 3, 3, -}; - -static const static_codebook _huff_book_line_128x7_0sub1 = { - 1, 9, - (long *)_huff_lengthlist_line_128x7_0sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x7_0sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, 4, 4, 4, - 5, 4, 5, 4, 5, 4, 6, 4, 6, -}; - -static const static_codebook _huff_book_line_128x7_0sub2 = { - 1, 25, - (long *)_huff_lengthlist_line_128x7_0sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x7_0sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 3, 5, 3, 5, 4, - 5, 4, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 7, 8, 9,11,13,13,13,13,13,13,13,13,13,13,13,13, -}; - -static const static_codebook _huff_book_line_128x7_0sub3 = { - 1, 64, - (long *)_huff_lengthlist_line_128x7_0sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x7_1sub1[] = { - 0, 3, 3, 2, 3, 3, 4, 3, 4, -}; - -static const static_codebook _huff_book_line_128x7_1sub1 = { - 1, 9, - (long *)_huff_lengthlist_line_128x7_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x7_1sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 6, 3, 6, 3, - 6, 3, 7, 3, 8, 4, 9, 4, 9, -}; - -static const static_codebook _huff_book_line_128x7_1sub2 = { - 1, 25, - (long *)_huff_lengthlist_line_128x7_1sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x7_1sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 2, 7, 3, 8, 4, - 9, 5, 9, 8,10,11,11,12,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,13,13,13,13, -}; - -static const static_codebook _huff_book_line_128x7_1sub3 = { - 1, 64, - (long *)_huff_lengthlist_line_128x7_1sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_class1[] = { - 1, 6, 3, 7, 2, 4, 5, 7, -}; - -static const static_codebook _huff_book_line_128x11_class1 = { - 1, 8, - (long *)_huff_lengthlist_line_128x11_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_class2[] = { - 1, 6,12,16, 4,12,15,16, 9,15,16,16,16,16,16,16, - 2, 5,11,16, 5,11,13,16, 9,13,16,16,16,16,16,16, - 4, 8,12,16, 5, 9,12,16, 9,13,15,16,16,16,16,16, - 15,16,16,16,11,14,13,16,12,15,16,16,16,16,16,15, -}; - -static const static_codebook _huff_book_line_128x11_class2 = { - 1, 64, - (long *)_huff_lengthlist_line_128x11_class2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_class3[] = { - 7, 6, 9,17, 7, 6, 8,17,12, 9,11,16,16,16,16,16, - 5, 4, 7,16, 5, 3, 6,14, 9, 6, 8,15,16,16,16,16, - 5, 4, 6,13, 3, 2, 4,11, 7, 4, 6,13,16,11,10,14, - 12,12,12,16, 9, 7,10,15,12, 9,11,16,16,15,15,16, -}; - -static const static_codebook _huff_book_line_128x11_class3 = { - 1, 64, - (long *)_huff_lengthlist_line_128x11_class3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_0sub0[] = { - 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 6, 6, 7, 6, - 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 8, 6, 8, 6, 8, 7, - 8, 7, 8, 7, 8, 7, 9, 7, 9, 8, 9, 8, 9, 8,10, 8, - 10, 9,10, 9,10, 9,11, 9,11, 9,10,10,11,10,11,10, - 11,11,11,11,11,11,12,13,14,14,14,15,15,16,16,16, - 17,15,16,15,16,16,17,17,16,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, -}; - -static const static_codebook _huff_book_line_128x11_0sub0 = { - 1, 128, - (long *)_huff_lengthlist_line_128x11_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_1sub0[] = { - 2, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, - 6, 5, 6, 5, 6, 5, 7, 6, 7, 6, 7, 6, 8, 6, 8, 6, -}; - -static const static_codebook _huff_book_line_128x11_1sub0 = { - 1, 32, - (long *)_huff_lengthlist_line_128x11_1sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_1sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 3, 5, 3, 6, 4, 6, 4, 7, 4, 7, 4, 7, 4, 8, 4, - 8, 4, 9, 5, 9, 5, 9, 5, 9, 6,10, 6,10, 6,11, 7, - 10, 7,10, 8,11, 9,11, 9,11,10,11,11,12,11,11,12, - 15,15,12,14,11,14,12,14,11,14,13,14,12,14,11,14, - 11,14,12,14,11,14,11,14,13,13,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, -}; - -static const static_codebook _huff_book_line_128x11_1sub1 = { - 1, 128, - (long *)_huff_lengthlist_line_128x11_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_2sub1[] = { - 0, 4, 5, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, 4, 4, - 5, 5, -}; - -static const static_codebook _huff_book_line_128x11_2sub1 = { - 1, 18, - (long *)_huff_lengthlist_line_128x11_2sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_2sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 3, 4, 4, 4, 4, 5, 4, 5, 4, 6, 5, 7, - 5, 7, 6, 8, 6, 8, 6, 9, 7, 9, 7,10, 7, 9, 8,11, - 8,11, -}; - -static const static_codebook _huff_book_line_128x11_2sub2 = { - 1, 50, - (long *)_huff_lengthlist_line_128x11_2sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_2sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 8, 3, 8, 4, 8, 4, 8, 6, 8, 5, 8, 4, 8, - 4, 8, 6, 8, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _huff_book_line_128x11_2sub3 = { - 1, 128, - (long *)_huff_lengthlist_line_128x11_2sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_3sub1[] = { - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, - 5, 4, -}; - -static const static_codebook _huff_book_line_128x11_3sub1 = { - 1, 18, - (long *)_huff_lengthlist_line_128x11_3sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_3sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 3, 5, 4, 6, 4, 6, 4, 7, 4, 7, 4, 8, 4, - 8, 4, 9, 4, 9, 4,10, 4,10, 5,10, 5,11, 5,12, 6, - 12, 6, -}; - -static const static_codebook _huff_book_line_128x11_3sub2 = { - 1, 50, - (long *)_huff_lengthlist_line_128x11_3sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x11_3sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 1, 6, 3, 7, 3, 8, 4, 8, 5, 8, 8, 8, 9, - 7, 8, 8, 7, 7, 7, 8, 9,10, 9, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, -}; - -static const static_codebook _huff_book_line_128x11_3sub3 = { - 1, 128, - (long *)_huff_lengthlist_line_128x11_3sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_class1[] = { - 1, 3, 4, 7, 2, 5, 6, 7, -}; - -static const static_codebook _huff_book_line_128x17_class1 = { - 1, 8, - (long *)_huff_lengthlist_line_128x17_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_class2[] = { - 1, 4,10,19, 3, 8,13,19, 7,12,19,19,19,19,19,19, - 2, 6,11,19, 8,13,19,19, 9,11,19,19,19,19,19,19, - 6, 7,13,19, 9,13,19,19,10,13,18,18,18,18,18,18, - 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, -}; - -static const static_codebook _huff_book_line_128x17_class2 = { - 1, 64, - (long *)_huff_lengthlist_line_128x17_class2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_class3[] = { - 3, 6,10,17, 4, 8,11,20, 8,10,11,20,20,20,20,20, - 2, 4, 8,18, 4, 6, 8,17, 7, 8,10,20,20,17,20,20, - 3, 5, 8,17, 3, 4, 6,17, 8, 8,10,17,17,12,16,20, - 13,13,15,20,10,10,12,20,15,14,15,20,20,20,19,19, -}; - -static const static_codebook _huff_book_line_128x17_class3 = { - 1, 64, - (long *)_huff_lengthlist_line_128x17_class3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_0sub0[] = { - 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 7, 5, 7, 5, 7, 5, 7, 5, 7, 5, 7, 5, 8, 5, 8, 5, - 8, 5, 8, 5, 8, 6, 8, 6, 8, 6, 9, 6, 9, 6, 9, 6, - 9, 6, 9, 7, 9, 7, 9, 7, 9, 7,10, 7,10, 8,10, 8, - 10, 8,10, 8,10, 8,11, 8,11, 8,11, 8,11, 8,11, 9, - 12, 9,12, 9,12, 9,12, 9,12,10,12,10,13,11,13,11, - 14,12,14,13,15,14,16,14,17,15,18,16,20,20,20,20, - 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -}; - -static const static_codebook _huff_book_line_128x17_0sub0 = { - 1, 128, - (long *)_huff_lengthlist_line_128x17_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_1sub0[] = { - 2, 5, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 6, 5, - 6, 5, 6, 5, 7, 6, 7, 6, 7, 6, 8, 6, 9, 7, 9, 7, -}; - -static const static_codebook _huff_book_line_128x17_1sub0 = { - 1, 32, - (long *)_huff_lengthlist_line_128x17_1sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_1sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 3, 5, 3, 5, 3, 6, 3, 6, 4, 6, 4, 7, 4, 7, 5, - 8, 5, 8, 6, 9, 7, 9, 7, 9, 8,10, 9,10, 9,11,10, - 11,11,11,11,11,11,12,12,12,13,12,13,12,14,12,15, - 12,14,12,16,13,17,13,17,14,17,14,16,13,17,14,17, - 14,17,15,17,15,15,16,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,16,16,16,16,16,16,16,16,16,16, -}; - -static const static_codebook _huff_book_line_128x17_1sub1 = { - 1, 128, - (long *)_huff_lengthlist_line_128x17_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_2sub1[] = { - 0, 4, 5, 4, 6, 4, 8, 3, 9, 3, 9, 2, 9, 3, 8, 4, - 9, 4, -}; - -static const static_codebook _huff_book_line_128x17_2sub1 = { - 1, 18, - (long *)_huff_lengthlist_line_128x17_2sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_2sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 1, 5, 3, 5, 3, 5, 4, 7, 5,10, 7,10, 7, - 12,10,14,10,14, 9,14,11,14,14,14,13,13,13,13,13, - 13,13, -}; - -static const static_codebook _huff_book_line_128x17_2sub2 = { - 1, 50, - (long *)_huff_lengthlist_line_128x17_2sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_2sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, -}; - -static const static_codebook _huff_book_line_128x17_2sub3 = { - 1, 128, - (long *)_huff_lengthlist_line_128x17_2sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_3sub1[] = { - 0, 4, 4, 4, 4, 4, 4, 4, 5, 3, 5, 3, 5, 4, 6, 4, - 6, 4, -}; - -static const static_codebook _huff_book_line_128x17_3sub1 = { - 1, 18, - (long *)_huff_lengthlist_line_128x17_3sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_3sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 5, 3, 6, 3, 6, 4, 7, 4, 7, 4, 7, 4, 8, 4, - 8, 4, 8, 4, 8, 4, 9, 4, 9, 5,10, 5,10, 7,10, 8, - 10, 8, -}; - -static const static_codebook _huff_book_line_128x17_3sub2 = { - 1, 50, - (long *)_huff_lengthlist_line_128x17_3sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_128x17_3sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 2, 4, 3, 4, 4, 4, 5, 4, 7, 5, 8, 5,11, - 6,10, 6,12, 7,12, 7,12, 8,12, 8,12,10,12,12,12, - 12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _huff_book_line_128x17_3sub3 = { - 1, 128, - (long *)_huff_lengthlist_line_128x17_3sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_class1[] = { - 2,10, 8,14, 7,12,11,14, 1, 5, 3, 7, 4, 9, 7,13, -}; - -static const static_codebook _huff_book_line_1024x27_class1 = { - 1, 16, - (long *)_huff_lengthlist_line_1024x27_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_class2[] = { - 1, 4, 2, 6, 3, 7, 5, 7, -}; - -static const static_codebook _huff_book_line_1024x27_class2 = { - 1, 8, - (long *)_huff_lengthlist_line_1024x27_class2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_class3[] = { - 1, 5, 7,21, 5, 8, 9,21,10, 9,12,20,20,16,20,20, - 4, 8, 9,20, 6, 8, 9,20,11,11,13,20,20,15,17,20, - 9,11,14,20, 8,10,15,20,11,13,15,20,20,20,20,20, - 20,20,20,20,13,20,20,20,18,18,20,20,20,20,20,20, - 3, 6, 8,20, 6, 7, 9,20,10, 9,12,20,20,20,20,20, - 5, 7, 9,20, 6, 6, 9,20,10, 9,12,20,20,20,20,20, - 8,10,13,20, 8, 9,12,20,11,10,12,20,20,20,20,20, - 18,20,20,20,15,17,18,20,18,17,18,20,20,20,20,20, - 7,10,12,20, 8, 9,11,20,14,13,14,20,20,20,20,20, - 6, 9,12,20, 7, 8,11,20,12,11,13,20,20,20,20,20, - 9,11,15,20, 8,10,14,20,12,11,14,20,20,20,20,20, - 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, - 11,16,18,20,15,15,17,20,20,17,20,20,20,20,20,20, - 9,14,16,20,12,12,15,20,17,15,18,20,20,20,20,20, - 16,19,18,20,15,16,20,20,17,17,20,20,20,20,20,20, - 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, -}; - -static const static_codebook _huff_book_line_1024x27_class3 = { - 1, 256, - (long *)_huff_lengthlist_line_1024x27_class3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_class4[] = { - 2, 3, 7,13, 4, 4, 7,15, 8, 6, 9,17,21,16,15,21, - 2, 5, 7,11, 5, 5, 7,14, 9, 7,10,16,17,15,16,21, - 4, 7,10,17, 7, 7, 9,15,11, 9,11,16,21,18,15,21, - 18,21,21,21,15,17,17,19,21,19,18,20,21,21,21,20, -}; - -static const static_codebook _huff_book_line_1024x27_class4 = { - 1, 64, - (long *)_huff_lengthlist_line_1024x27_class4, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_0sub0[] = { - 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 6, 5, 6, 5, 6, 5, 6, 5, 7, 5, 7, 5, 7, 5, 7, 5, - 8, 6, 8, 6, 8, 6, 9, 6, 9, 6,10, 6,10, 6,11, 6, - 11, 7,11, 7,12, 7,12, 7,12, 7,12, 7,12, 7,12, 7, - 12, 7,12, 8,13, 8,12, 8,12, 8,13, 8,13, 9,13, 9, - 13, 9,13, 9,12,10,12,10,13,10,14,11,14,12,14,13, - 14,13,14,14,15,16,15,15,15,14,15,17,21,22,22,21, - 22,22,22,22,22,22,21,21,21,21,21,21,21,21,21,21, -}; - -static const static_codebook _huff_book_line_1024x27_0sub0 = { - 1, 128, - (long *)_huff_lengthlist_line_1024x27_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_1sub0[] = { - 2, 5, 5, 4, 5, 4, 5, 4, 5, 4, 6, 5, 6, 5, 6, 5, - 6, 5, 7, 5, 7, 6, 8, 6, 8, 6, 8, 6, 9, 6, 9, 6, -}; - -static const static_codebook _huff_book_line_1024x27_1sub0 = { - 1, 32, - (long *)_huff_lengthlist_line_1024x27_1sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_1sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 8, 5, 8, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 4, - 9, 4, 9, 4, 9, 4, 8, 4, 8, 4, 9, 5, 9, 5, 9, 5, - 9, 5, 9, 6,10, 6,10, 7,10, 8,11, 9,11,11,12,13, - 12,14,13,15,13,15,14,16,14,17,15,17,15,15,16,16, - 15,16,16,16,15,18,16,15,17,17,19,19,19,19,19,19, - 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, -}; - -static const static_codebook _huff_book_line_1024x27_1sub1 = { - 1, 128, - (long *)_huff_lengthlist_line_1024x27_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_2sub0[] = { - 1, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 6, 6, 7, 7, 7, 7, 8, 7, 8, 8, 9, 8,10, 9,10, 9, -}; - -static const static_codebook _huff_book_line_1024x27_2sub0 = { - 1, 32, - (long *)_huff_lengthlist_line_1024x27_2sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_2sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 4, 3, 4, 3, 4, 4, 5, 4, 5, 4, 5, 5, 6, 5, 6, 5, - 7, 5, 7, 6, 7, 6, 8, 7, 8, 7, 8, 7, 9, 8, 9, 9, - 9, 9,10,10,10,11, 9,12, 9,12, 9,15,10,14, 9,13, - 10,13,10,12,10,12,10,13,10,12,11,13,11,14,12,13, - 13,14,14,13,14,15,14,16,13,13,14,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,15,15, -}; - -static const static_codebook _huff_book_line_1024x27_2sub1 = { - 1, 128, - (long *)_huff_lengthlist_line_1024x27_2sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_3sub1[] = { - 0, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, 4, 4, 4, 5, - 5, 5, -}; - -static const static_codebook _huff_book_line_1024x27_3sub1 = { - 1, 18, - (long *)_huff_lengthlist_line_1024x27_3sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_3sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 4, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, - 5, 7, 5, 8, 6, 8, 6, 9, 7,10, 7,10, 8,10, 8,11, - 9,11, -}; - -static const static_codebook _huff_book_line_1024x27_3sub2 = { - 1, 50, - (long *)_huff_lengthlist_line_1024x27_3sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_3sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 7, 3, 8, 3,10, 3, 8, 3, 9, 3, 8, 4, 9, - 4, 9, 5, 9, 6,10, 6, 9, 7,11, 7,12, 9,13,10,13, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, -}; - -static const static_codebook _huff_book_line_1024x27_3sub3 = { - 1, 128, - (long *)_huff_lengthlist_line_1024x27_3sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_4sub1[] = { - 0, 4, 5, 4, 5, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, - 5, 4, -}; - -static const static_codebook _huff_book_line_1024x27_4sub1 = { - 1, 18, - (long *)_huff_lengthlist_line_1024x27_4sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_4sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 4, 2, 4, 2, 5, 3, 5, 4, 6, 6, 6, 7, 7, 8, - 7, 8, 7, 8, 7, 9, 8, 9, 8, 9, 8,10, 8,11, 9,12, - 9,12, -}; - -static const static_codebook _huff_book_line_1024x27_4sub2 = { - 1, 50, - (long *)_huff_lengthlist_line_1024x27_4sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_1024x27_4sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 2, 5, 2, 6, 3, 6, 4, 7, 4, 7, 5, 9, 5,11, - 6,11, 6,11, 7,11, 6,11, 6,11, 9,11, 8,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10, -}; - -static const static_codebook _huff_book_line_1024x27_4sub3 = { - 1, 128, - (long *)_huff_lengthlist_line_1024x27_4sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_class1[] = { - 2, 6, 8, 9, 7,11,13,13, 1, 3, 5, 5, 6, 6,12,10, -}; - -static const static_codebook _huff_book_line_2048x27_class1 = { - 1, 16, - (long *)_huff_lengthlist_line_2048x27_class1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_class2[] = { - 1, 2, 3, 6, 4, 7, 5, 7, -}; - -static const static_codebook _huff_book_line_2048x27_class2 = { - 1, 8, - (long *)_huff_lengthlist_line_2048x27_class2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_class3[] = { - 3, 3, 6,16, 5, 5, 7,16, 9, 8,11,16,16,16,16,16, - 5, 5, 8,16, 5, 5, 7,16, 8, 7, 9,16,16,16,16,16, - 9, 9,12,16, 6, 8,11,16, 9,10,11,16,16,16,16,16, - 16,16,16,16,13,16,16,16,15,16,16,16,16,16,16,16, - 5, 4, 7,16, 6, 5, 8,16, 9, 8,10,16,16,16,16,16, - 5, 5, 7,15, 5, 4, 6,15, 7, 6, 8,16,16,16,16,16, - 9, 9,11,15, 7, 7, 9,16, 8, 8, 9,16,16,16,16,16, - 16,16,16,16,15,15,15,16,15,15,14,16,16,16,16,16, - 8, 8,11,16, 8, 9,10,16,11,10,14,16,16,16,16,16, - 6, 8,10,16, 6, 7,10,16, 8, 8,11,16,14,16,16,16, - 10,11,14,16, 9, 9,11,16,10,10,11,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,15,16,16,16,16,16,16,16,16,16,16,16, - 12,16,15,16,12,14,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, -}; - -static const static_codebook _huff_book_line_2048x27_class3 = { - 1, 256, - (long *)_huff_lengthlist_line_2048x27_class3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_class4[] = { - 2, 4, 7,13, 4, 5, 7,15, 8, 7,10,16,16,14,16,16, - 2, 4, 7,16, 3, 4, 7,14, 8, 8,10,16,16,16,15,16, - 6, 8,11,16, 7, 7, 9,16,11, 9,13,16,16,16,15,16, - 16,16,16,16,14,16,16,16,16,16,16,16,16,16,16,16, -}; - -static const static_codebook _huff_book_line_2048x27_class4 = { - 1, 64, - (long *)_huff_lengthlist_line_2048x27_class4, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_0sub0[] = { - 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, - 6, 5, 7, 5, 7, 5, 7, 5, 8, 5, 8, 5, 8, 5, 9, 5, - 9, 6,10, 6,10, 6,11, 6,11, 6,11, 6,11, 6,11, 6, - 11, 6,11, 6,12, 7,11, 7,11, 7,11, 7,11, 7,10, 7, - 11, 7,11, 7,12, 7,11, 8,11, 8,11, 8,11, 8,13, 8, - 12, 9,11, 9,11, 9,11,10,12,10,12, 9,12,10,12,11, - 14,12,16,12,12,11,14,16,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,16,16,16,16, -}; - -static const static_codebook _huff_book_line_2048x27_0sub0 = { - 1, 128, - (long *)_huff_lengthlist_line_2048x27_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_1sub0[] = { - 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 6, 6, 6, 6, 6, 6, 7, 6, 7, 6, 7, 6, 7, 6, -}; - -static const static_codebook _huff_book_line_2048x27_1sub0 = { - 1, 32, - (long *)_huff_lengthlist_line_2048x27_1sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_1sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 5, 7, 5, 7, 4, 7, 4, 8, 4, 8, 4, 8, 4, 8, 3, - 8, 4, 9, 4, 9, 4, 9, 4, 9, 4, 9, 5, 9, 5, 9, 6, - 9, 7, 9, 8, 9, 9, 9,10, 9,11, 9,14, 9,15,10,15, - 10,15,10,15,10,15,11,15,10,14,12,14,11,14,13,14, - 13,15,15,15,12,15,15,15,13,15,13,15,13,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,14, -}; - -static const static_codebook _huff_book_line_2048x27_1sub1 = { - 1, 128, - (long *)_huff_lengthlist_line_2048x27_1sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_2sub0[] = { - 2, 4, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 6, 5, - 6, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, -}; - -static const static_codebook _huff_book_line_2048x27_2sub0 = { - 1, 32, - (long *)_huff_lengthlist_line_2048x27_2sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_2sub1[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 3, 4, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 6, 6, 6, 7, - 6, 8, 6, 8, 6, 9, 7,10, 7,10, 7,10, 7,12, 7,12, - 7,12, 9,12,11,12,10,12,10,12,11,12,12,12,10,12, - 10,12,10,12, 9,12,11,12,12,12,12,12,11,12,11,12, - 12,12,12,12,12,12,12,12,10,10,12,12,12,12,12,10, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, -}; - -static const static_codebook _huff_book_line_2048x27_2sub1 = { - 1, 128, - (long *)_huff_lengthlist_line_2048x27_2sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_3sub1[] = { - 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 5, 5, -}; - -static const static_codebook _huff_book_line_2048x27_3sub1 = { - 1, 18, - (long *)_huff_lengthlist_line_2048x27_3sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_3sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, - 6, 7, 6, 7, 6, 8, 6, 9, 7, 9, 7, 9, 9,11, 9,12, - 10,12, -}; - -static const static_codebook _huff_book_line_2048x27_3sub2 = { - 1, 50, - (long *)_huff_lengthlist_line_2048x27_3sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_3sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 6, 3, 7, 3, 7, 5, 7, 7, 7, 7, 7, 6, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, -}; - -static const static_codebook _huff_book_line_2048x27_3sub3 = { - 1, 128, - (long *)_huff_lengthlist_line_2048x27_3sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_4sub1[] = { - 0, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, 5, 4, 5, 4, - 4, 5, -}; - -static const static_codebook _huff_book_line_2048x27_4sub1 = { - 1, 18, - (long *)_huff_lengthlist_line_2048x27_4sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_4sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 2, 4, 3, 4, 4, 4, 5, 5, 6, 5, 6, 5, 7, - 6, 6, 6, 7, 7, 7, 8, 9, 9, 9,12,10,11,10,10,12, - 10,10, -}; - -static const static_codebook _huff_book_line_2048x27_4sub2 = { - 1, 50, - (long *)_huff_lengthlist_line_2048x27_4sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_2048x27_4sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 6, 5, 7, 5, 7, 7, 7, 7, 7, 5, 7, 5, 7, - 5, 7, 5, 7, 7, 7, 7, 7, 4, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, -}; - -static const static_codebook _huff_book_line_2048x27_4sub3 = { - 1, 128, - (long *)_huff_lengthlist_line_2048x27_4sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x4low_class0[] = { - 4, 5, 6,11, 5, 5, 6,10, 7, 7, 6, 6,14,13, 9, 9, - 6, 6, 6,10, 6, 6, 6, 9, 8, 7, 7, 9,14,12, 8,11, - 8, 7, 7,11, 8, 8, 7,11, 9, 9, 7, 9,13,11, 9,13, - 19,19,18,19,15,16,16,19,11,11,10,13,10,10, 9,15, - 5, 5, 6,13, 6, 6, 6,11, 8, 7, 6, 7,14,11,10,11, - 6, 6, 6,12, 7, 6, 6,11, 8, 7, 7,11,13,11, 9,11, - 9, 7, 6,12, 8, 7, 6,12, 9, 8, 8,11,13,10, 7,13, - 19,19,17,19,17,14,14,19,12,10, 8,12,13,10, 9,16, - 7, 8, 7,12, 7, 7, 7,11, 8, 7, 7, 8,12,12,11,11, - 8, 8, 7,12, 8, 7, 6,11, 8, 7, 7,10,10,11,10,11, - 9, 8, 8,13, 9, 8, 7,12,10, 9, 7,11, 9, 8, 7,11, - 18,18,15,18,18,16,17,18,15,11,10,18,11, 9, 9,18, - 16,16,13,16,12,11,10,16,12,11, 9, 6,15,12,11,13, - 16,16,14,14,13,11,12,16,12, 9, 9,13,13,10,10,12, - 17,18,17,17,14,15,14,16,14,12,14,15,12,10,11,12, - 18,18,18,18,18,18,18,18,18,12,13,18,16,11, 9,18, -}; - -static const static_codebook _huff_book_line_256x4low_class0 = { - 1, 256, - (long *)_huff_lengthlist_line_256x4low_class0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x4low_0sub0[] = { - 1, 3, 2, 3, -}; - -static const static_codebook _huff_book_line_256x4low_0sub0 = { - 1, 4, - (long *)_huff_lengthlist_line_256x4low_0sub0, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x4low_0sub1[] = { - 0, 0, 0, 0, 2, 3, 2, 3, 3, 3, -}; - -static const static_codebook _huff_book_line_256x4low_0sub1 = { - 1, 10, - (long *)_huff_lengthlist_line_256x4low_0sub1, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x4low_0sub2[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, 3, 4, - 4, 4, 4, 4, 5, 5, 5, 6, 6, -}; - -static const static_codebook _huff_book_line_256x4low_0sub2 = { - 1, 25, - (long *)_huff_lengthlist_line_256x4low_0sub2, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist_line_256x4low_0sub3[] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 2, 4, 3, 5, 4, - 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 6, 9, - 7,12,11,16,13,16,12,15,13,15,12,14,12,15,15,15, -}; - -static const static_codebook _huff_book_line_256x4low_0sub3 = { - 1, 64, - (long *)_huff_lengthlist_line_256x4low_0sub3, - 0, 0, 0, 0, 0, - NULL, - 0 -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h deleted file mode 100755 index 7d7d7bb..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/books/uncoupled/res_books_uncoupled.h +++ /dev/null @@ -1,7757 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: static codebooks autogenerated by huff/huffbuld - last modified: $Id: res_books_uncoupled.h 17022 2010-03-25 03:45:42Z xiphmont $ - - ********************************************************************/ - -#include "../../codebook.h" - -static const long _vq_quantlist__16u0__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16u0__p1_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 8, 5, 8, 8, 8,10,10, 8, - 10,11, 5, 8, 8, 8,10,10, 8,10,10, 4, 9, 9, 9,12, - 11, 8,11,11, 8,12,11,10,12,14,10,13,13, 7,11,11, - 10,14,12,11,14,14, 4, 9, 9, 8,11,11, 9,11,12, 7, - 11,11,10,13,14,10,12,14, 8,11,12,10,14,14,10,13, - 12, -}; - -static const static_codebook _16u0__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__16u0__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16u0__p1_0, - 0 -}; - -static const long _vq_quantlist__16u0__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16u0__p2_0[] = { - 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 9, 7, - 8, 9, 5, 7, 7, 7, 9, 8, 7, 9, 7, 4, 7, 7, 7, 9, - 9, 7, 8, 8, 6, 9, 8, 7, 8,11, 9,11,10, 6, 8, 9, - 8,11, 8, 9,10,11, 4, 7, 7, 7, 8, 8, 7, 9, 9, 6, - 9, 8, 9,11,10, 8, 8,11, 6, 8, 9, 9,10,11, 8,11, - 8, -}; - -static const static_codebook _16u0__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__16u0__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16u0__p2_0, - 0 -}; - -static const long _vq_quantlist__16u0__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16u0__p3_0[] = { - 1, 5, 5, 7, 7, 6, 7, 7, 8, 8, 6, 7, 8, 8, 8, 8, - 9, 9,11,11, 8, 9, 9,11,11, 6, 9, 8,10,10, 8,10, - 10,11,11, 8,10,10,11,11,10,11,10,13,12, 9,11,10, - 13,13, 6, 8, 9,10,10, 8,10,10,11,11, 8,10,10,11, - 11, 9,10,11,13,12,10,10,11,12,12, 8,11,11,14,13, - 10,12,11,15,13, 9,12,11,15,14,12,14,13,16,14,12, - 13,13,17,14, 8,11,11,13,14, 9,11,12,14,15,10,11, - 12,13,15,11,13,13,14,16,12,13,14,14,16, 5, 9, 9, - 11,11, 9,11,11,12,12, 8,11,11,12,12,11,12,12,15, - 14,10,12,12,15,15, 8,11,11,13,12,10,12,12,13,13, - 10,12,12,14,13,12,12,13,14,15,11,13,13,17,16, 7, - 11,11,13,13,10,12,12,14,13,10,12,12,13,14,12,13, - 12,15,14,11,13,13,15,14, 9,12,12,16,15,11,13,13, - 17,16,10,13,13,16,16,13,14,15,15,16,13,15,14,19, - 17, 9,12,12,14,16,11,13,13,15,16,10,13,13,17,16, - 13,14,13,17,15,12,15,15,16,17, 5, 9, 9,11,11, 8, - 11,11,13,12, 9,11,11,12,12,10,12,12,14,15,11,12, - 12,14,14, 7,11,10,13,12,10,12,12,14,13,10,11,12, - 13,13,11,13,13,15,16,12,12,13,15,15, 7,11,11,13, - 13,10,13,13,14,14,10,12,12,13,13,11,13,13,16,15, - 12,13,13,15,14, 9,12,12,15,15,10,13,13,17,16,11, - 12,13,15,15,12,15,14,18,18,13,14,14,16,17, 9,12, - 12,15,16,10,13,13,15,16,11,13,13,15,16,13,15,15, - 17,17,13,15,14,16,15, 7,11,11,15,16,10,13,12,16, - 17,10,12,13,15,17,15,16,16,18,17,13,15,15,17,18, - 8,12,12,16,16,11,13,14,17,18,11,13,13,18,16,15, - 17,16,17,19,14,15,15,17,16, 8,12,12,16,15,11,14, - 13,18,17,11,13,14,18,17,15,16,16,18,17,13,16,16, - 18,18,11,15,14,18,17,13,14,15,18, 0,12,15,15, 0, - 17,17,16,17,17,18,14,16,18,18, 0,11,14,14,17, 0, - 12,15,14,17,19,12,15,14,18, 0,15,18,16, 0,17,14, - 18,16,18, 0, 7,11,11,16,15,10,12,12,18,16,10,13, - 13,16,15,13,15,14,17,17,14,16,16,19,18, 8,12,12, - 16,16,11,13,13,18,16,11,13,14,17,16,14,15,15,19, - 18,15,16,16, 0,19, 8,12,12,16,17,11,13,13,17,17, - 11,14,13,17,17,13,15,15,17,19,15,17,17,19, 0,11, - 14,15,19,17,12,15,16,18,18,12,14,15,19,17,14,16, - 17, 0,18,16,16,19,17, 0,11,14,14,18,19,12,15,14, - 17,17,13,16,14,17,16,14,17,16,18,18,15,18,15, 0, - 18, -}; - -static const static_codebook _16u0__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__16u0__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u0__p3_0, - 0 -}; - -static const long _vq_quantlist__16u0__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16u0__p4_0[] = { - 3, 5, 5, 8, 8, 6, 6, 6, 9, 9, 6, 6, 6, 9, 9, 9, - 10, 9,11,11, 9, 9, 9,11,11, 6, 7, 7,10,10, 7, 7, - 8,10,10, 7, 7, 8,10,10,10,10,10,11,12, 9,10,10, - 11,12, 6, 7, 7,10,10, 7, 8, 7,10,10, 7, 8, 7,10, - 10,10,11,10,12,11,10,10,10,13,10, 9,10,10,12,12, - 10,11,10,14,12, 9,11,11,13,13,11,12,13,13,13,11, - 12,12,15,13, 9,10,10,12,13, 9,11,10,12,13,10,10, - 11,12,13,11,12,12,12,13,11,12,12,13,13, 5, 7, 7, - 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,10,12, - 13,10,10,11,12,12, 6, 8, 8,11,10, 7, 8, 9,10,12, - 8, 9, 9,11,11,11,10,11,11,12,10,11,11,13,12, 7, - 8, 8,10,11, 8, 9, 8,11,10, 8, 9, 9,11,11,10,12, - 10,13,11,10,11,11,13,13,10,11,10,14,13,10,10,11, - 13,13,10,12,11,14,13,12,11,13,12,13,13,12,13,14, - 14,10,11,11,13,13,10,11,10,12,13,10,12,12,12,14, - 12,12,12,14,12,12,13,12,17,15, 5, 7, 7,10,10, 7, - 8, 8,10,10, 7, 8, 8,11,10,10,10,11,12,12,10,11, - 11,12,13, 6, 8, 8,11,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,11,11,11,12,12,10,10,11,12,13, 6, 8, 8,10, - 11, 8, 9, 9,11,11, 7, 9, 7,11,10,10,12,12,13,13, - 11,11,10,13,11, 9,11,10,14,13,11,11,11,15,13,10, - 10,11,13,13,12,13,13,14,14,12,11,12,12,13,10,11, - 11,12,13,10,11,12,13,13,10,11,10,13,12,12,12,13, - 14, 0,12,13,11,13,11, 8,10,10,13,13,10,11,11,14, - 13,10,11,11,13,12,13,14,14,14,15,12,12,12,15,14, - 9,11,10,13,12,10,10,11,13,14,11,11,11,15,12,13, - 12,14,15,16,13,13,13,14,13, 9,11,11,12,12,10,12, - 11,13,13,10,11,11,13,14,13,13,13,15,15,13,13,14, - 17,15,11,12,12,14,14,10,11,12,13,15,12,13,13, 0, - 15,13,11,14,12,16,14,16,14, 0,15,11,12,12,14,16, - 11,13,12,16,15,12,13,13,14,15,12,14,12,15,13,15, - 14,14,16,16, 8,10,10,13,13,10,11,10,13,14,10,11, - 11,13,13,13,13,12,14,14,14,13,13,16,17, 9,10,10, - 12,14,10,12,11,14,13,10,11,12,13,14,12,12,12,15, - 15,13,13,13,14,14, 9,10,10,13,13,10,11,12,12,14, - 10,11,10,13,13,13,13,13,14,16,13,13,13,14,14,11, - 12,13,15,13,12,14,13,14,16,12,12,13,13,14,13,14, - 14,17,15,13,12,17,13,16,11,12,13,14,15,12,13,14, - 14,17,11,12,11,14,14,13,16,14,16, 0,14,15,11,15, - 11, -}; - -static const static_codebook _16u0__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__16u0__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u0__p4_0, - 0 -}; - -static const long _vq_quantlist__16u0__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__16u0__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, - 9, 9, 4, 6, 6, 8, 8, 8, 8, 9, 9, 7, 8, 8, 9, 9, - 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,11, 7, 8, 8, - 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 9, 9,10,10,11,11,12,12, 9, 9, 9,10,10,11,11,12, - 12, -}; - -static const static_codebook _16u0__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__16u0__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16u0__p5_0, - 0 -}; - -static const long _vq_quantlist__16u0__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__16u0__p6_0[] = { - 1, 4, 4, 7, 7,10,10,12,12,13,13,18,17, 3, 6, 6, - 9, 9,11,11,13,13,14,14,18,17, 3, 6, 6, 9, 9,11, - 11,13,13,14,14,17,18, 7, 9, 9,11,11,13,13,14,14, - 15,15, 0, 0, 7, 9, 9,11,11,13,13,14,14,15,16,19, - 18,10,11,11,13,13,14,14,16,15,17,18, 0, 0,10,11, - 11,13,13,14,14,15,15,16,18, 0, 0,11,13,13,14,14, - 15,15,17,17, 0,19, 0, 0,11,13,13,14,14,14,15,16, - 18, 0,19, 0, 0,13,14,14,15,15,18,17,18,18, 0,19, - 0, 0,13,14,14,15,16,16,16,18,18,19, 0, 0, 0,16, - 17,17, 0,17,19,19, 0,19, 0, 0, 0, 0,16,19,16,17, - 18, 0,19, 0, 0, 0, 0, 0, 0, -}; - -static const static_codebook _16u0__p6_0 = { - 2, 169, - (long *)_vq_lengthlist__16u0__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__16u0__p6_0, - 0 -}; - -static const long _vq_quantlist__16u0__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16u0__p6_1[] = { - 1, 4, 5, 6, 6, 4, 6, 6, 6, 6, 4, 6, 6, 6, 6, 6, - 6, 6, 7, 7, 6, 6, 6, 7, 7, -}; - -static const static_codebook _16u0__p6_1 = { - 2, 25, - (long *)_vq_lengthlist__16u0__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u0__p6_1, - 0 -}; - -static const long _vq_quantlist__16u0__p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16u0__p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _16u0__p7_0 = { - 4, 81, - (long *)_vq_lengthlist__16u0__p7_0, - 1, -518803456, 1628680192, 2, 0, - (long *)_vq_quantlist__16u0__p7_0, - 0 -}; - -static const long _vq_quantlist__16u0__p7_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__16u0__p7_1[] = { - 1, 5, 5, 6, 5, 9,10,11,11,10,10,10,10,10,10, 5, - 8, 8, 8,10,10,10,10,10,10,10,10,10,10,10, 5, 8, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10, 5,10, 8, - 10,10,10,10,10,10,10,10,10,10,10,10, 4, 8, 9,10, - 10,10,10,10,10,10,10,10,10,10,10, 9,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _16u0__p7_1 = { - 2, 225, - (long *)_vq_lengthlist__16u0__p7_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__16u0__p7_1, - 0 -}; - -static const long _vq_quantlist__16u0__p7_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__16u0__p7_2[] = { - 1, 6, 6, 7, 8, 7, 7,10, 9,10, 9,11,10, 9,11,10, - 9, 9, 9, 9,10, 6, 8, 7, 9, 9, 8, 8,10,10, 9,11, - 11,12,12,10, 9,11, 9,12,10, 9, 6, 9, 8, 9,12, 8, - 8,11, 9,11,11,12,11,12,12,10,11,11,10,10,11, 7, - 10, 9, 9, 9, 9, 9,10, 9,10, 9,10,10,12,10,10,10, - 11,12,10,10, 7, 9, 9, 9,10, 9, 9,10,10, 9, 9, 9, - 11,11,10,10,10,10, 9, 9,12, 7, 9,10, 9,11, 9,10, - 9,10,11,11,11,10,11,12, 9,12,11,10,10,10, 7, 9, - 9, 9, 9,10,12,10, 9,11,12,10,11,12,12,11, 9,10, - 11,10,11, 7, 9,10,10,11,10, 9,10,11,11,11,10,12, - 12,12,11,11,10,11,11,12, 8, 9,10,12,11,10,10,12, - 12,12,12,12,10,11,11, 9,11,10,12,11,11, 8, 9,10, - 10,11,12,11,11,10,10,10,12,12,12, 9,10,12,12,12, - 12,12, 8,10,11,10,10,12, 9,11,12,12,11,12,12,12, - 12,10,12,10,10,10,10, 8,12,11,11,11,10,10,11,12, - 12,12,12,11,12,12,12,11,11,11,12,10, 9,10,10,12, - 10,12,10,12,12,10,10,10,11,12,12,12,11,12,12,12, - 11,10,11,12,12,12,11,12,12,11,12,12,11,12,12,12, - 12,11,12,12,10,10,10,10,11,11,12,11,12,12,12,12, - 12,12,12,11,12,11,10,11,11,12,11,11, 9,10,10,10, - 12,10,10,11, 9,11,12,11,12,11,12,12,10,11,10,12, - 9, 9, 9,12,11,10,11,10,12,10,12,10,12,12,12,11, - 11,11,11,11,10, 9,10,10,11,10,11,11,12,11,10,11, - 12,12,12,11,11, 9,12,10,12, 9,10,12,10,10,11,10, - 11,11,12,11,10,11,10,11,11,11,11,12,11,11,10, 9, - 10,10,10, 9,11,11,10, 9,12,10,11,12,11,12,12,11, - 12,11,12,11,10,11,10,12,11,12,11,12,11,12,10,11, - 10,10,12,11,10,11,11,11,10, -}; - -static const static_codebook _16u0__p7_2 = { - 2, 441, - (long *)_vq_lengthlist__16u0__p7_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__16u0__p7_2, - 0 -}; - -static const long _huff_lengthlist__16u0__single[] = { - 3, 5, 8, 7,14, 8, 9,19, 5, 2, 5, 5, 9, 6, 9,19, - 8, 4, 5, 7, 8, 9,13,19, 7, 4, 6, 5, 9, 6, 9,19, - 12, 8, 7, 9,10,11,13,19, 8, 5, 8, 6, 9, 6, 7,19, - 8, 8,10, 7, 7, 4, 5,19,12,17,19,15,18,13,11,18, -}; - -static const static_codebook _huff_book__16u0__single = { - 2, 64, - (long *)_huff_lengthlist__16u0__single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__16u1__long[] = { - 3, 6,10, 8,12, 8,14, 8,14,19, 5, 3, 5, 5, 7, 6, - 11, 7,16,19, 7, 5, 6, 7, 7, 9,11,12,19,19, 6, 4, - 7, 5, 7, 6,10, 7,18,18, 8, 6, 7, 7, 7, 7, 8, 9, - 18,18, 7, 5, 8, 5, 7, 5, 8, 6,18,18,12, 9,10, 9, - 9, 9, 8, 9,18,18, 8, 7,10, 6, 8, 5, 6, 4,11,18, - 11,15,16,12,11, 8, 8, 6, 9,18,14,18,18,18,16,16, - 16,13,16,18, -}; - -static const static_codebook _huff_book__16u1__long = { - 2, 100, - (long *)_huff_lengthlist__16u1__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__16u1__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16u1__p1_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 7, 7,10,10, 7, - 9,10, 5, 7, 8, 7,10, 9, 7,10,10, 5, 8, 8, 8,10, - 10, 8,10,10, 7,10,10,10,11,12,10,12,13, 7,10,10, - 9,13,11,10,12,13, 5, 8, 8, 8,10,10, 8,10,10, 7, - 10,10,10,12,12, 9,11,12, 7,10,11,10,12,12,10,13, - 11, -}; - -static const static_codebook _16u1__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__16u1__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16u1__p1_0, - 0 -}; - -static const long _vq_quantlist__16u1__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16u1__p2_0[] = { - 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 7, 8, 6, - 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 7, 5, 6, 6, 6, 8, - 8, 6, 8, 8, 6, 8, 8, 7, 7,10, 8, 9, 9, 6, 8, 8, - 7, 9, 8, 8, 9,10, 5, 6, 6, 6, 8, 8, 7, 8, 8, 6, - 8, 8, 8,10, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 7,10, - 8, -}; - -static const static_codebook _16u1__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__16u1__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16u1__p2_0, - 0 -}; - -static const long _vq_quantlist__16u1__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16u1__p3_0[] = { - 1, 5, 5, 8, 8, 6, 7, 7, 9, 9, 5, 7, 7, 9, 9, 9, - 10, 9,11,11, 9, 9,10,11,11, 6, 8, 8,10,10, 8, 9, - 10,11,11, 8, 9,10,11,11,10,11,11,12,13,10,11,11, - 13,13, 6, 8, 8,10,10, 8,10, 9,11,11, 8,10, 9,11, - 11,10,11,11,13,13,10,11,11,13,12, 9,11,11,14,13, - 10,12,12,15,14,10,12,11,14,13,12,13,13,15,15,12, - 13,13,16,14, 9,11,11,13,14,10,11,12,14,14,10,12, - 12,14,15,12,13,13,14,15,12,13,14,15,16, 5, 8, 8, - 11,11, 8,10,10,12,12, 8,10,10,12,12,11,12,12,14, - 14,11,12,12,14,14, 8,10,10,12,12, 9,11,12,12,13, - 10,12,12,13,13,12,12,13,14,15,11,13,13,15,15, 7, - 10,10,12,12, 9,12,11,13,12,10,11,12,13,13,12,13, - 12,15,14,11,12,13,15,15,10,12,12,15,14,11,13,13, - 16,15,11,13,13,16,15,14,13,14,15,16,13,15,15,17, - 17,10,12,12,14,15,11,12,12,15,15,11,13,13,15,16, - 13,15,13,16,15,13,15,15,16,17, 5, 8, 8,11,11, 8, - 10,10,12,12, 8,10,10,12,12,11,12,12,14,14,11,12, - 12,14,14, 7,10,10,12,12,10,12,12,14,13, 9,11,12, - 12,13,12,13,13,15,15,12,12,13,13,15, 7,10,10,12, - 13,10,11,12,13,13,10,12,11,13,13,11,13,13,15,15, - 12,13,12,15,14, 9,12,12,15,14,11,13,13,15,15,11, - 12,13,15,15,13,14,14,17,19,13,13,14,16,16,10,12, - 12,14,15,11,13,13,15,16,11,13,12,16,15,13,15,15, - 17,18,14,15,13,16,15, 8,11,11,15,14,10,12,12,16, - 15,10,12,12,16,16,14,15,15,18,17,13,14,15,16,18, - 9,12,12,15,15,11,12,14,16,17,11,13,13,16,15,15, - 15,15,17,18,14,15,16,17,17, 9,12,12,15,15,11,14, - 13,16,16,11,13,13,16,16,15,16,15,17,18,14,16,15, - 17,16,12,14,14,17,16,12,14,15,18,17,13,15,15,17, - 17,15,15,18,16,20,15,16,17,18,18,11,14,14,16,17, - 13,15,14,18,17,13,15,15,17,17,15,17,15,18,17,15, - 17,16,19,18, 8,11,11,14,15,10,12,12,15,15,10,12, - 12,16,16,13,14,14,17,16,14,15,15,17,17, 9,12,12, - 15,16,11,13,13,16,16,11,12,13,16,16,14,16,15,20, - 17,14,16,16,17,17, 9,12,12,15,16,11,13,13,16,17, - 11,13,13,17,16,14,15,15,17,18,15,15,15,18,18,11, - 14,14,17,16,13,15,15,17,17,13,14,14,18,17,15,16, - 16,18,19,15,15,17,17,19,11,14,14,16,17,13,15,14, - 17,19,13,15,14,18,17,15,17,16,18,18,15,17,15,18, - 16, -}; - -static const static_codebook _16u1__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__16u1__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u1__p3_0, - 0 -}; - -static const long _vq_quantlist__16u1__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16u1__p4_0[] = { - 4, 5, 5, 8, 8, 6, 6, 7, 9, 9, 6, 6, 6, 9, 9, 9, - 10, 9,11,11, 9, 9,10,11,11, 6, 7, 7,10, 9, 7, 7, - 8, 9,10, 7, 7, 8,10,10,10,10,10,10,12, 9, 9,10, - 11,12, 6, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 7,10, - 10, 9,10, 9,12,11,10,10, 9,12,10, 9,10,10,12,11, - 10,10,10,12,12, 9,10,10,12,12,12,11,12,13,13,11, - 11,12,12,13, 9,10,10,11,12, 9,10,10,12,12,10,10, - 10,12,12,11,12,11,14,13,11,12,12,14,13, 5, 7, 7, - 10,10, 7, 8, 8,10,10, 7, 8, 7,10,10,10,10,10,12, - 12,10,10,10,12,12, 6, 8, 7,10,10, 7, 7, 9,10,11, - 8, 9, 9,11,10,10,10,11,11,13,10,10,11,12,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,10,11,10,11, - 10,13,11,10,11,10,12,12,10,11,10,12,11,10,10,10, - 12,13,10,11,11,13,12,11,11,13,11,14,12,12,13,14, - 14, 9,10,10,12,13,10,11,10,13,12,10,11,11,12,13, - 11,12,11,14,12,12,13,13,15,14, 5, 7, 7,10,10, 7, - 7, 8,10,10, 7, 8, 8,10,10,10,10,10,11,12,10,10, - 10,12,12, 7, 8, 8,10,10, 8, 9, 8,11,10, 7, 8, 9, - 10,11,10,11,11,12,12,10,10,11,11,13, 7, 7, 8,10, - 10, 8, 8, 9,10,11, 7, 9, 7,11,10,10,11,11,13,12, - 11,11,10,13,11, 9,10,10,12,12,10,11,11,13,12,10, - 10,11,12,12,12,13,13,14,14,11,11,12,12,14,10,10, - 11,12,12,10,11,11,12,13,10,10,10,13,12,12,13,13, - 15,14,12,13,10,14,11, 8,10,10,12,12,10,11,10,13, - 13, 9,10,10,12,12,12,13,13,15,14,11,12,12,13,13, - 9,10,10,13,12,10,10,11,13,13,10,11,10,13,12,12, - 12,13,14,15,12,13,12,15,13, 9,10,10,12,13,10,11, - 10,13,12,10,10,11,12,13,12,14,12,15,13,12,12,13, - 14,15,11,12,11,14,13,11,11,12,14,15,12,13,12,15, - 14,13,11,15,11,16,13,14,14,16,15,11,12,12,14,14, - 11,12,11,14,13,12,12,13,14,15,13,14,12,16,12,14, - 14,14,15,15, 8,10,10,12,12, 9,10,10,12,12,10,10, - 11,13,13,11,12,12,13,13,12,13,13,14,15, 9,10,10, - 13,12,10,11,11,13,12,10,10,11,13,13,12,13,12,15, - 14,12,12,13,13,16, 9, 9,10,12,13,10,10,11,12,13, - 10,11,10,13,13,12,12,13,13,15,13,13,12,15,13,11, - 12,12,14,14,12,13,12,15,14,11,11,12,13,14,14,14, - 14,16,15,13,12,15,12,16,11,11,12,13,14,12,13,13, - 14,15,10,12,11,14,13,14,15,14,16,16,13,14,11,15, - 11, -}; - -static const static_codebook _16u1__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__16u1__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u1__p4_0, - 0 -}; - -static const long _vq_quantlist__16u1__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__16u1__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, - 10,10, 4, 5, 6, 8, 8, 8, 8,10,10, 7, 8, 8, 9, 9, - 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 7, 8, 8, - 10, 9,11,11,12,11, 7, 8, 8, 9, 9,11,11,12,12, 9, - 10,10,11,11,12,12,13,12, 9,10,10,11,11,12,12,12, - 13, -}; - -static const static_codebook _16u1__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__16u1__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16u1__p5_0, - 0 -}; - -static const long _vq_quantlist__16u1__p6_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__16u1__p6_0[] = { - 3, 4, 4, 6, 6, 7, 7, 9, 9, 4, 4, 4, 6, 6, 8, 8, - 9, 9, 4, 4, 4, 6, 6, 7, 7, 9, 9, 6, 6, 6, 7, 7, - 8, 8,10, 9, 6, 6, 6, 7, 7, 8, 8, 9,10, 7, 8, 7, - 8, 8, 9, 9,10,10, 7, 8, 8, 8, 8, 9, 9,10,10, 9, - 9, 9,10,10,10,10,11,11, 9, 9, 9,10,10,10,10,11, - 11, -}; - -static const static_codebook _16u1__p6_0 = { - 2, 81, - (long *)_vq_lengthlist__16u1__p6_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16u1__p6_0, - 0 -}; - -static const long _vq_quantlist__16u1__p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16u1__p7_0[] = { - 1, 4, 4, 4, 8, 8, 4, 8, 8, 5,11, 9, 8,12,11, 8, - 12,11, 5,10,11, 8,11,12, 8,11,12, 4,11,11,11,14, - 13,10,13,13, 8,14,13,12,14,16,12,16,15, 8,14,14, - 13,16,14,12,15,16, 4,11,11,10,14,13,11,14,14, 8, - 15,14,12,15,15,12,14,16, 8,14,14,11,16,15,12,15, - 13, -}; - -static const static_codebook _16u1__p7_0 = { - 4, 81, - (long *)_vq_lengthlist__16u1__p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__16u1__p7_0, - 0 -}; - -static const long _vq_quantlist__16u1__p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__16u1__p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 6, 5, 7, 7, - 8, 8, 8, 8, 8, 8, 4, 5, 6, 7, 7, 8, 8, 8, 8, 8, - 8, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 7, 8, 8, 8, 8, 9, 9, 9,10, - 9,10, 7, 8, 8, 8, 8, 9, 9, 9, 9,10, 9, 8, 8, 8, - 9, 9,10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9,10, - 10,10,10, 8, 8, 8, 9, 9, 9,10,10,10,10,10, 8, 8, - 8, 9, 9,10,10,10,10,10,10, -}; - -static const static_codebook _16u1__p7_1 = { - 2, 121, - (long *)_vq_lengthlist__16u1__p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16u1__p7_1, - 0 -}; - -static const long _vq_quantlist__16u1__p8_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__16u1__p8_0[] = { - 1, 4, 4, 5, 5, 8, 8,10,10,12,12, 4, 7, 7, 8, 8, - 9, 9,12,11,14,13, 4, 7, 7, 7, 8, 9,10,11,11,13, - 12, 5, 8, 8, 9, 9,11,11,12,13,15,14, 5, 7, 8, 9, - 9,11,11,13,13,17,15, 8, 9,10,11,11,12,13,17,14, - 17,16, 8,10, 9,11,11,12,12,13,15,15,17,10,11,11, - 12,13,14,15,15,16,16,17, 9,11,11,12,12,14,15,17, - 15,15,16,11,14,12,14,15,16,15,16,16,16,15,11,13, - 13,14,14,15,15,16,16,15,16, -}; - -static const static_codebook _16u1__p8_0 = { - 2, 121, - (long *)_vq_lengthlist__16u1__p8_0, - 1, -524582912, 1618345984, 4, 0, - (long *)_vq_quantlist__16u1__p8_0, - 0 -}; - -static const long _vq_quantlist__16u1__p8_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__16u1__p8_1[] = { - 2, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 4, 6, 6, 7, 7, - 8, 7, 8, 8, 8, 8, 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, - 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, - 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 8, - 8, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static const static_codebook _16u1__p8_1 = { - 2, 121, - (long *)_vq_lengthlist__16u1__p8_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16u1__p8_1, - 0 -}; - -static const long _vq_quantlist__16u1__p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__16u1__p9_0[] = { - 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, -}; - -static const static_codebook _16u1__p9_0 = { - 2, 225, - (long *)_vq_lengthlist__16u1__p9_0, - 1, -514071552, 1627381760, 4, 0, - (long *)_vq_quantlist__16u1__p9_0, - 0 -}; - -static const long _vq_quantlist__16u1__p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__16u1__p9_1[] = { - 1, 6, 5, 9, 9,10,10, 6, 7, 9, 9,10,10,10,10, 5, - 10, 8,10, 8,10,10, 8, 8,10, 9,10,10,10,10, 5, 8, - 9,10,10,10,10, 8,10,10,10,10,10,10,10, 9,10,10, - 10,10,10,10, 9, 9,10,10,10,10,10,10, 9, 9, 8, 9, - 10,10,10, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10, 8,10,10,10,10, - 10,10,10,10,10,10,10,10,10, 6, 8, 8,10,10,10, 8, - 10,10,10,10,10,10,10,10, 5, 8, 8,10,10,10, 9, 9, - 10,10,10,10,10,10,10,10, 9,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _16u1__p9_1 = { - 2, 225, - (long *)_vq_lengthlist__16u1__p9_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__16u1__p9_1, - 0 -}; - -static const long _vq_quantlist__16u1__p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__16u1__p9_2[] = { - 1, 6, 6, 7, 8, 8,11,10, 9, 9,11, 9,10, 9,11,11, - 9, 6, 7, 6,11, 8,11, 9,10,10,11, 9,11,10,10,10, - 11, 9, 5, 7, 7, 8, 8,10,11, 8, 8,11, 9, 9,10,11, - 9,10,11, 8, 9, 6, 8, 8, 9, 9,10,10,11,11,11, 9, - 11,10, 9,11, 8, 8, 8, 9, 8, 9,10,11, 9, 9,11,11, - 10, 9, 9,11,10, 8,11, 8, 9, 8,11, 9,10, 9,10,11, - 11,10,10, 9,10,10, 8, 8, 9,10,10,10, 9,11, 9,10, - 11,11,11,11,10, 9,11, 9, 9,11,11,10, 8,11,11,11, - 9,10,10,11,10,11,11, 9,11,10, 9,11,10,10,10,10, - 9,11,10,11,10, 9, 9,10,11, 9, 8,10,11,11,10,10, - 11, 9,11,10,11,11,10,11, 9, 9, 8,10, 8, 9,11, 9, - 8,10,10, 9,11,10,11,10,11, 9,11, 8,10,11,11,11, - 11,10,10,11,11,11,11,10,11,11,10, 9, 8,10,10, 9, - 11,10,11,11,11, 9, 9, 9,11,11,11,10,10, 9, 9,10, - 9,11,11,11,11, 8,10,11,10,11,11,10,11,11, 9, 9, - 9,10, 9,11, 9,11,11,11,11,11,10,11,11,10,11,10, - 11,11, 9,11,10,11,10, 9,10, 9,10,10,11,11,11,11, - 9,10, 9,10,11,11,10,11,11,11,11,11,11,10,11,11, - 10, -}; - -static const static_codebook _16u1__p9_2 = { - 2, 289, - (long *)_vq_lengthlist__16u1__p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__16u1__p9_2, - 0 -}; - -static const long _huff_lengthlist__16u1__short[] = { - 5, 7,10, 9,11,10,15,11,13,16, 6, 4, 6, 6, 7, 7, - 10, 9,12,16,10, 6, 5, 6, 6, 7,10,11,16,16, 9, 6, - 7, 6, 7, 7,10, 8,14,16,11, 6, 5, 4, 5, 6, 8, 9, - 15,16, 9, 6, 6, 5, 6, 6, 9, 8,14,16,12, 7, 6, 6, - 5, 6, 6, 7,13,16, 8, 6, 7, 6, 5, 5, 4, 4,11,16, - 9, 8, 9, 9, 7, 7, 6, 5,13,16,14,14,16,15,16,15, - 16,16,16,16, -}; - -static const static_codebook _huff_book__16u1__short = { - 2, 100, - (long *)_huff_lengthlist__16u1__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__16u2__long[] = { - 5, 8,10,10,10,11,11,12,14,18, 7, 5, 5, 6, 8, 9, - 10,12,14,17, 9, 5, 4, 5, 6, 8,10,11,13,19, 9, 5, - 4, 4, 5, 6, 9,10,12,17, 8, 6, 5, 4, 4, 5, 7,10, - 11,15, 8, 7, 7, 6, 5, 5, 6, 9,11,14, 8, 9, 8, 7, - 6, 5, 6, 7,11,14, 9,11,11, 9, 7, 6, 6, 6, 9,14, - 11,14,15,13, 9, 8, 7, 7, 9,14,13,15,19,17,12,11, - 10, 9,10,14, -}; - -static const static_codebook _huff_book__16u2__long = { - 2, 100, - (long *)_huff_lengthlist__16u2__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__16u2_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16u2_p1_0[] = { - 1, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 9, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 8, 9, 9, 5, 7, 7, 8, 9, - 9, 7, 9, 9, 7, 9, 9, 9,10,11, 9,10,10, 7, 9, 9, - 9,10, 9, 9,10,11, 5, 8, 7, 7, 9, 9, 8, 9, 9, 7, - 9, 9, 9,11,10, 9, 9,10, 7, 9, 9, 9,10,10, 9,11, - 10, -}; - -static const static_codebook _16u2_p1_0 = { - 4, 81, - (long *)_vq_lengthlist__16u2_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__16u2_p1_0, - 0 -}; - -static const long _vq_quantlist__16u2_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16u2_p2_0[] = { - 3, 5, 5, 8, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 9, - 10, 9,11,11, 9, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 8, 8,10,10,10,10,10,12,12, 9,10,10, - 11,12, 5, 7, 7, 9, 9, 7, 8, 8,10,10, 7, 8, 8,10, - 10, 9,10,10,12,11,10,10,10,12,12, 9,10,10,12,12, - 10,10,10,12,12, 9,10,10,12,12,12,12,12,14,14,11, - 12,12,13,14, 9,10,10,12,12, 9,10,10,12,12,10,10, - 10,12,12,11,12,12,14,13,12,12,12,14,13, 5, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, - 12,10,10,10,12,12, 7, 8, 8,11,10, 8, 9, 9,11,11, - 8, 9, 9,11,11,10,11,11,12,13,10,11,11,12,13, 7, - 8, 8,10,10, 8, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,12,10,11,11,13,13,10,11,10,13,12,10,11,11, - 13,13,10,11,11,13,13,12,12,13,13,14,12,13,13,14, - 14, 9,10,10,12,12,10,11,10,13,12,10,11,11,13,13, - 12,13,12,14,13,12,13,13,14,15, 5, 7, 7, 9,10, 7, - 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12,12,10,10, - 11,12,12, 7, 8, 8,10,10, 8, 9, 9,11,11, 8, 8, 9, - 10,11,10,11,11,13,13,10,10,11,12,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,11,13,12, - 10,11,11,13,12, 9,10,10,12,12,10,11,11,13,13,10, - 10,11,12,13,12,13,13,15,14,12,12,13,12,14, 9,10, - 11,12,13,10,11,11,13,13,10,11,11,13,13,12,13,13, - 14,14,12,13,12,14,13, 8,10,10,12,12, 9,11,10,13, - 12, 9,10,10,12,13,12,13,13,14,14,12,12,12,14,14, - 9,10,10,13,13,10,11,11,13,13,10,11,11,13,13,13, - 13,13,14,15,12,13,13,14,15, 9,10,10,12,13,10,11, - 10,13,13,10,11,11,12,13,12,13,12,15,14,12,13,13, - 14,15,11,12,12,15,14,12,12,13,14,15,12,13,13,15, - 14,13,13,15,14,16,14,14,14,16,15,11,12,12,14,14, - 11,12,12,14,14,12,13,13,14,15,13,14,13,15,13,14, - 14,14,15,16, 8, 9,10,12,12, 9,10,10,13,12, 9,10, - 11,12,13,12,12,12,14,14,12,13,13,14,14, 9,10,10, - 13,12,10,11,11,13,13,10,10,11,13,13,12,13,13,15, - 14,12,12,13,14,15, 9,10,10,13,13,10,11,11,13,13, - 10,11,11,13,13,12,13,13,14,14,13,13,13,15,15,11, - 12,12,14,13,12,13,13,15,14,11,12,12,14,14,14,14, - 14,16,15,13,13,14,13,16,11,12,12,14,14,12,13,13, - 14,15,12,13,12,14,14,14,14,14,16,16,14,15,13,16, - 14, -}; - -static const static_codebook _16u2_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__16u2_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u2_p2_0, - 0 -}; - -static const long _vq_quantlist__16u2_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__16u2_p3_0[] = { - 2, 4, 4, 6, 6, 7, 7, 9, 9, 4, 5, 5, 6, 6, 8, 7, - 9, 9, 4, 5, 5, 6, 6, 7, 8, 9, 9, 6, 6, 6, 7, 7, - 8, 8,10,10, 6, 6, 6, 7, 7, 8, 8,10,10, 7, 8, 7, - 8, 8, 9, 9,11,10, 7, 7, 8, 8, 8, 9, 9,10,11, 9, - 9, 9,10,10,11,10,11,11, 9, 9, 9,10,10,10,11,11, - 11, -}; - -static const static_codebook _16u2_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__16u2_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__16u2_p3_0, - 0 -}; - -static const long _vq_quantlist__16u2_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__16u2_p4_0[] = { - 2, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11,11, - 11, 5, 5, 5, 7, 6, 8, 7, 9, 9, 9, 9,10,10,11,11, - 12,12, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,11, - 11,12,12, 6, 7, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10, - 11,11,11,11,12,12, 7, 7, 8, 8, 8, 9, 9, 9, 9,10, - 10,11,11,11,11,12,12, 8, 9, 9, 9, 9, 9, 9,10,10, - 10,10,11,11,12,12,12,12, 8, 9, 9, 9, 9, 9, 9,10, - 10,10,10,11,11,12,12,12,12, 9, 9, 9, 9, 9,10,10, - 10,10,10,11,11,11,12,12,13,13, 9, 9, 9, 9, 9,10, - 10,10,10,11,10,11,11,12,12,13,13,10,10,10,10,10, - 11,11,11,11,11,11,11,12,12,12,13,13,10,10,10,10, - 10,11,11,11,11,11,11,12,11,12,12,13,13,11,11,11, - 11,11,11,11,12,12,12,12,12,12,13,13,13,13,11,11, - 11,11,11,11,11,12,12,12,12,13,12,13,13,13,13,11, - 12,12,12,12,12,12,12,12,13,13,13,13,13,13,14,14, - 11,12,12,12,12,12,12,12,13,13,13,13,13,13,13,14, - 14, -}; - -static const static_codebook _16u2_p4_0 = { - 2, 289, - (long *)_vq_lengthlist__16u2_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__16u2_p4_0, - 0 -}; - -static const long _vq_quantlist__16u2_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__16u2_p5_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 7, 9, 9, 7, - 9,10, 5, 8, 8, 7,10, 9, 7,10, 9, 5, 8, 8, 8,11, - 10, 8,10,10, 7,10,10, 9, 9,12,10,12,12, 7,10,10, - 9,12,10,10,11,12, 5, 8, 8, 8,10,10, 8,11,11, 7, - 11,10,10,12,11, 9,10,12, 7,10,11,10,12,12, 9,12, - 9, -}; - -static const static_codebook _16u2_p5_0 = { - 4, 81, - (long *)_vq_lengthlist__16u2_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__16u2_p5_0, - 0 -}; - -static const long _vq_quantlist__16u2_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__16u2_p5_1[] = { - 2, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 5, 6, 6, 7, 7, - 7, 7, 8, 8, 8, 8, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, - 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 9, 9, -}; - -static const static_codebook _16u2_p5_1 = { - 2, 121, - (long *)_vq_lengthlist__16u2_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16u2_p5_1, - 0 -}; - -static const long _vq_quantlist__16u2_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__16u2_p6_0[] = { - 1, 5, 4, 7, 7, 8, 8, 8, 8,10,10,11,11, 4, 6, 6, - 7, 7, 9, 9, 9, 9,10,10,11,11, 4, 6, 6, 7, 7, 9, - 9, 9, 9,10,10,11,11, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 7, 7, 7, 9, 8,10, 9,10,10,11,11,12, - 12, 8, 9, 9, 9,10,10,10,11,11,12,12,13,13, 8, 9, - 9,10, 9,10,10,11,11,12,12,13,13, 8, 9, 9,10,10, - 11,11,11,11,12,12,13,13, 8, 9, 9,10,10,11,11,12, - 11,12,12,13,13,10,10,10,11,11,12,12,12,12,13,13, - 14,14,10,10,10,11,11,12,12,12,12,13,13,14,14,11, - 11,11,12,12,13,13,13,13,14,14,14,14,11,11,11,12, - 12,13,13,13,13,14,14,14,14, -}; - -static const static_codebook _16u2_p6_0 = { - 2, 169, - (long *)_vq_lengthlist__16u2_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__16u2_p6_0, - 0 -}; - -static const long _vq_quantlist__16u2_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__16u2_p6_1[] = { - 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _16u2_p6_1 = { - 2, 25, - (long *)_vq_lengthlist__16u2_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__16u2_p6_1, - 0 -}; - -static const long _vq_quantlist__16u2_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__16u2_p7_0[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 8, 9, 9,10,10, 4, 6, 6, - 8, 8, 9, 9, 9, 9,10,10,11,10, 4, 6, 6, 8, 8, 9, - 9, 9, 9,10,10,11,11, 7, 8, 8,10, 9,10,10,10,10, - 11,11,12,12, 7, 8, 8,10,10,10,10,10,10,11,11,12, - 12, 8, 9, 9,10,10,11,11,11,11,12,12,13,13, 8, 9, - 9,10,10,11,11,11,11,12,12,13,13, 8, 9, 9,11,10, - 11,11,12,12,13,13,14,13, 8, 9, 9,10,10,11,11,12, - 12,13,13,13,13, 9,10,10,11,11,12,12,13,13,13,13, - 14,14, 9,10,10,11,11,12,12,13,13,13,13,14,14,10, - 11,11,12,12,13,13,14,13,14,14,15,14,10,11,11,12, - 12,13,13,14,13,14,14,15,14, -}; - -static const static_codebook _16u2_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__16u2_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__16u2_p7_0, - 0 -}; - -static const long _vq_quantlist__16u2_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__16u2_p7_1[] = { - 2, 5, 5, 7, 7, 7, 7, 7, 7, 8, 8, 5, 6, 6, 7, 7, - 7, 7, 8, 8, 8, 8, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, - 8, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _16u2_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__16u2_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__16u2_p7_1, - 0 -}; - -static const long _vq_quantlist__16u2_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__16u2_p8_0[] = { - 1, 4, 4, 7, 7, 8, 8, 7, 7, 9, 8,10, 9,11,11, 4, - 7, 6, 9, 8, 9, 9, 9, 9,10, 9,11, 9,12, 9, 4, 6, - 7, 8, 8, 9, 9, 9, 9,10,10,10,11,11,12, 7, 9, 8, - 10,10,11,11,10,10,11,11,12,12,13,12, 7, 8, 8,10, - 10,10,11,10,10,11,11,11,12,12,13, 8, 9, 9,11,11, - 11,11,11,11,12,12,13,13,13,13, 8, 9, 9,11,11,11, - 11,11,11,12,12,13,13,13,14, 8, 9, 9,10,10,11,11, - 12,11,13,13,14,13,14,14, 8, 9, 9,10,10,11,11,12, - 12,12,12,13,13,14,14, 9,10,10,11,11,12,12,13,12, - 13,13,14,14,15,15, 9,10,10,11,11,12,12,12,13,13, - 13,14,14,14,15,10,11,11,12,12,13,13,14,13,14,14, - 15,14,15,15,10,11,11,12,12,13,12,13,14,14,14,14, - 14,15,15,11,12,12,13,13,13,13,14,14,15,14,15,15, - 16,16,11,12,12,13,13,13,13,14,14,14,15,15,15,16, - 16, -}; - -static const static_codebook _16u2_p8_0 = { - 2, 225, - (long *)_vq_lengthlist__16u2_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__16u2_p8_0, - 0 -}; - -static const long _vq_quantlist__16u2_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__16u2_p8_1[] = { - 3, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10, 5, 6, 6, 7, 7, 8, - 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, - 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9,10,10,10,10, - 10,10,10,10, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9,10, 9,10,10,10, 9,10, 9, 8, 8, 8, 9, 8, 9, 9, - 9, 9,10, 9,10,10,10,10,10,10,10,10,10,10, 8, 8, - 8, 8, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, - 10,10,10, 8, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10, - 10,10,10,10,10,10,10,10, 8, 9, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10, 9, 9, 9,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10, 9, 9,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10, 9,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _16u2_p8_1 = { - 2, 441, - (long *)_vq_lengthlist__16u2_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__16u2_p8_1, - 0 -}; - -static const long _vq_quantlist__16u2_p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__16u2_p9_0[] = { - 1, 5, 3, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, - 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 7, - 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _16u2_p9_0 = { - 2, 225, - (long *)_vq_lengthlist__16u2_p9_0, - 1, -510036736, 1631393792, 4, 0, - (long *)_vq_quantlist__16u2_p9_0, - 0 -}; - -static const long _vq_quantlist__16u2_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const long _vq_lengthlist__16u2_p9_1[] = { - 1, 4, 4, 7, 7, 7, 7, 7, 6, 9, 7,10, 8,12,12,13, - 13,14,14, 4, 7, 7, 9, 9, 9, 8, 9, 8,10, 9,11, 9, - 14, 9,14,10,13,11, 4, 7, 7, 9, 9, 9, 9, 8, 9,10, - 10,11,11,12,13,12,13,14,15, 7, 9, 9,10,11,10,10, - 10,10,11,12,13,13,13,14,17,14,15,16, 7, 9, 9,10, - 10,10,10,10,10,11,12,13,13,14,14,15,15,18,18, 8, - 9, 9,11,10,11,11,11,12,13,12,14,14,16,15,15,17, - 18,15, 8, 9, 9,10,10,11,11,11,11,13,13,14,14,15, - 15,15,16,16,18, 7, 9, 8,10,10,11,11,12,12,14,14, - 15,15,16,16,15,17,16,18, 8, 9, 9,10,10,11,12,12, - 12,13,13,16,15,17,16,17,18,17,18, 9,10,10,12,11, - 13,13,14,13,14,14,15,17,16,18,17,18,17,18, 9,10, - 10,12,11,12,13,13,14,15,16,14,15,16,18,18,18,18, - 17,11,11,11,13,13,14,14,16,15,15,15,16,15,15,18, - 18,18,17,16,11,11,12,13,13,15,14,15,16,16,16,17, - 16,15,18,17,18,16,18,12,13,13,15,15,15,16,18,16, - 17,16,17,16,17,17,17,18,18,17,13,13,13,15,13,16, - 15,17,16,16,16,18,18,18,18,16,17,17,18,13,15,14, - 15,15,18,17,18,18,18,16,18,17,18,17,18,16,17,17, - 14,14,14,15,16,17,16,18,18,18,17,18,17,18,18,18, - 16,16,16,14,17,16,17,15,16,18,18,17,18,17,18,17, - 18,18,18,17,18,17,15,16,15,18,15,18,17,16,18,18, - 18,18,18,18,17,18,16,18,17, -}; - -static const static_codebook _16u2_p9_1 = { - 2, 361, - (long *)_vq_lengthlist__16u2_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__16u2_p9_1, - 0 -}; - -static const long _vq_quantlist__16u2_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const long _vq_lengthlist__16u2_p9_2[] = { - 2, 3, 4, 4, 4, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 7, 8, 8, 8, 8, 8, - 8, -}; - -static const static_codebook _16u2_p9_2 = { - 1, 49, - (long *)_vq_lengthlist__16u2_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__16u2_p9_2, - 0 -}; - -static const long _huff_lengthlist__16u2__short[] = { - 8,11,13,13,15,16,19,19,19,19,11, 8, 8, 9, 9,11, - 13,15,19,20,14, 8, 7, 7, 8, 9,12,13,15,20,15, 9, - 6, 5, 5, 7,10,12,14,18,14, 9, 7, 5, 3, 4, 7,10, - 12,16,13,10, 8, 6, 3, 3, 5, 8,11,14,11,10, 9, 7, - 5, 4, 4, 6,11,14,10,10,10, 8, 6, 5, 5, 6,10,14, - 10,10,10, 9, 8, 7, 7, 7,10,14,11,12,12,12,11,10, - 10,10,12,16, -}; - -static const static_codebook _huff_book__16u2__short = { - 2, 100, - (long *)_huff_lengthlist__16u2__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__8u0__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8u0__p1_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, - 10,10, 5, 8, 8, 7,10,10, 8,10,10, 4, 9, 8, 8,11, - 11, 8,11,11, 7,11,11,10,11,13,10,13,13, 7,11,11, - 10,13,12,10,13,13, 5, 9, 8, 8,11,11, 8,11,11, 7, - 11,11, 9,13,13,10,12,13, 7,11,11,10,13,13,10,13, - 11, -}; - -static const static_codebook _8u0__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__8u0__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8u0__p1_0, - 0 -}; - -static const long _vq_quantlist__8u0__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8u0__p2_0[] = { - 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 6, 7, 8, 6, - 7, 8, 5, 7, 7, 6, 8, 8, 7, 9, 7, 5, 7, 7, 7, 9, - 9, 7, 8, 8, 6, 9, 8, 7, 7,10, 8,10,10, 6, 8, 8, - 8,10, 8, 8,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 9, 6, - 8, 8, 8,10,10, 8, 8,10, 6, 8, 9, 8,10,10, 7,10, - 8, -}; - -static const static_codebook _8u0__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__8u0__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8u0__p2_0, - 0 -}; - -static const long _vq_quantlist__8u0__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__8u0__p3_0[] = { - 1, 5, 5, 7, 7, 6, 7, 7, 9, 9, 6, 7, 7, 9, 9, 8, - 10, 9,11,11, 8, 9, 9,11,11, 6, 8, 8,10,10, 8,10, - 10,11,11, 8,10,10,11,11,10,11,11,12,12,10,11,11, - 12,13, 6, 8, 8,10,10, 8,10,10,11,11, 8,10,10,11, - 11, 9,10,11,12,12,10,11,11,12,12, 8,11,11,14,13, - 10,12,11,15,13,10,12,11,14,14,12,13,12,16,14,12, - 14,12,16,15, 8,11,11,13,14,10,11,12,13,15,10,11, - 12,13,15,11,12,13,14,15,12,12,14,14,16, 5, 8, 8, - 11,11, 9,11,11,12,12, 8,10,11,12,12,11,12,12,15, - 14,11,12,12,14,14, 7,11,10,13,12,10,11,12,13,14, - 10,12,12,14,13,12,13,13,14,15,12,13,13,15,15, 7, - 10,11,12,13,10,12,11,14,13,10,12,13,13,15,12,13, - 12,14,14,11,13,13,15,16, 9,12,12,15,14,11,13,13, - 15,16,11,13,13,16,16,13,14,15,15,15,12,14,15,17, - 16, 9,12,12,14,15,11,13,13,15,16,11,13,13,16,18, - 13,14,14,17,16,13,15,15,17,18, 5, 8, 9,11,11, 8, - 11,11,12,12, 8,10,11,12,12,11,12,12,14,14,11,12, - 12,14,15, 7,11,10,12,13,10,12,12,14,13,10,11,12, - 13,14,11,13,13,15,14,12,13,13,14,15, 7,10,11,13, - 13,10,12,12,13,14,10,12,12,13,13,11,13,13,16,16, - 12,13,13,15,14, 9,12,12,16,15,10,13,13,15,15,11, - 13,13,17,15,12,15,15,18,17,13,14,14,15,16, 9,12, - 12,15,15,11,13,13,15,16,11,13,13,15,15,12,15,15, - 16,16,13,15,14,17,15, 7,11,11,15,15,10,13,13,16, - 15,10,13,13,15,16,14,15,15,17,19,13,15,14,15,18, - 9,12,12,16,16,11,13,14,17,16,11,13,13,17,16,15, - 15,16,17,19,13,15,16, 0,18, 9,12,12,16,15,11,14, - 13,17,17,11,13,14,16,16,15,16,16,19,18,13,15,15, - 17,19,11,14,14,19,16,12,14,15, 0,18,12,16,15,18, - 17,15,15,18,16,19,14,15,17,19,19,11,14,14,18,19, - 13,15,14,19,19,12,16,15,18,17,15,17,15, 0,16,14, - 17,16,19, 0, 7,11,11,14,14,10,12,12,15,15,10,13, - 13,16,15,13,15,15,17, 0,14,15,15,16,19, 9,12,12, - 16,16,11,14,14,16,16,11,13,13,16,16,14,17,16,19, - 0,14,18,17,17,19, 9,12,12,15,16,11,13,13,15,17, - 12,14,13,19,16,13,15,15,17,19,15,17,16,17,19,11, - 14,14,19,16,12,15,15,19,17,13,14,15,17,19,14,16, - 17,19,19,16,15,16,17,19,11,15,14,16,16,12,15,15, - 19, 0,12,14,15,19,19,14,16,16, 0,18,15,19,14,18, - 16, -}; - -static const static_codebook _8u0__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__8u0__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8u0__p3_0, - 0 -}; - -static const long _vq_quantlist__8u0__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__8u0__p4_0[] = { - 3, 5, 5, 8, 8, 5, 6, 7, 9, 9, 6, 7, 6, 9, 9, 9, - 9, 9,10,11, 9, 9, 9,11,10, 6, 7, 7,10,10, 7, 7, - 8,10,10, 7, 8, 8,10,10,10,10,10,10,11, 9,10,10, - 11,12, 6, 7, 7,10,10, 7, 8, 8,10,10, 7, 8, 7,10, - 10, 9,10,10,12,11,10,10,10,11,10, 9,10,10,12,11, - 10,10,10,13,11, 9,10,10,12,12,11,11,12,12,13,11, - 11,11,12,13, 9,10,10,12,12,10,10,11,12,12,10,10, - 11,12,12,11,11,11,13,13,11,12,12,13,13, 5, 7, 7, - 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,11,12, - 12,10,11,10,12,12, 7, 8, 8,11,11, 7, 8, 9,10,11, - 8, 9, 9,11,11,11,10,11,10,12,10,11,11,12,13, 7, - 8, 8,10,11, 8, 9, 8,12,10, 8, 9, 9,11,12,10,11, - 10,13,11,10,11,11,13,12, 9,11,10,13,12,10,10,11, - 12,12,10,11,11,13,13,12,10,13,11,14,11,12,12,15, - 13, 9,11,11,13,13,10,11,11,13,12,10,11,11,12,14, - 12,13,11,14,12,12,12,12,14,14, 5, 7, 7,10,10, 7, - 8, 8,10,10, 7, 8, 8,11,10,10,11,11,12,12,10,11, - 10,12,12, 7, 8, 8,10,11, 8, 9, 9,12,11, 8, 8, 9, - 10,11,10,11,11,12,13,11,10,11,11,13, 6, 8, 8,10, - 11, 8, 9, 9,11,11, 7, 9, 7,11,10,10,11,11,12,12, - 10,11,10,13,10, 9,11,10,13,12,10,12,11,13,13,10, - 10,11,12,13,11,12,13,15,14,11,11,13,12,13, 9,10, - 11,12,13,10,11,11,12,13,10,11,10,13,12,12,13,13, - 13,14,12,12,11,14,11, 8,10,10,12,13,10,11,11,13, - 13,10,11,10,13,13,12,13,14,15,14,12,12,12,14,13, - 9,10,10,13,12,10,10,12,13,13,10,11,11,15,12,12, - 12,13,15,14,12,13,13,15,13, 9,10,11,12,13,10,12, - 10,13,12,10,11,11,12,13,12,14,12,15,13,12,12,12, - 15,14,11,12,11,14,13,11,11,12,14,14,12,13,13,14, - 13,13,11,15,11,15,14,14,14,16,15,11,12,12,13,14, - 11,13,11,14,14,12,12,13,14,15,12,14,12,15,12,13, - 15,14,16,15, 8,10,10,12,12,10,10,10,12,13,10,11, - 11,13,13,12,12,12,13,14,13,13,13,15,15, 9,10,10, - 12,12,10,11,11,13,12,10,10,11,13,13,12,12,12,14, - 14,12,12,13,15,14, 9,10,10,13,12,10,10,12,12,13, - 10,11,10,13,13,12,13,13,14,14,12,13,12,14,13,11, - 12,12,14,13,12,13,12,14,14,10,12,12,14,14,14,14, - 14,16,14,13,12,14,12,15,10,12,12,14,15,12,13,13, - 14,16,11,12,11,15,14,13,14,14,14,15,13,14,11,14, - 12, -}; - -static const static_codebook _8u0__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__8u0__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8u0__p4_0, - 0 -}; - -static const long _vq_quantlist__8u0__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__8u0__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 7, 8, 8, - 10,10, 4, 6, 6, 8, 8, 8, 8,10,10, 6, 8, 8, 9, 9, - 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 7, 8, 8, - 9, 9,10,10,12,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 10,10,11,11,11,12,12,12, 9,10,10,11,11,12,12,12, - 12, -}; - -static const static_codebook _8u0__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__8u0__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8u0__p5_0, - 0 -}; - -static const long _vq_quantlist__8u0__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__8u0__p6_0[] = { - 1, 4, 4, 7, 7, 9, 9,11,11,12,12,16,16, 3, 6, 6, - 9, 9,11,11,12,12,13,14,18,16, 3, 6, 7, 9, 9,11, - 11,13,12,14,14,17,16, 7, 9, 9,11,11,12,12,14,14, - 14,14,17,16, 7, 9, 9,11,11,13,12,13,13,14,14,17, - 0, 9,11,11,12,13,14,14,14,13,15,14,17,17, 9,11, - 11,12,12,14,14,13,14,14,15, 0, 0,11,12,12,15,14, - 15,14,15,14,15,16,17, 0,11,12,13,13,13,14,14,15, - 14,15,15, 0, 0,12,14,14,15,15,14,16,15,15,17,16, - 0,18,13,14,14,15,14,15,14,15,16,17,16, 0, 0,17, - 17,18, 0,16,18,16, 0, 0, 0,17, 0, 0,16, 0, 0,16, - 16, 0,15, 0,17, 0, 0, 0, 0, -}; - -static const static_codebook _8u0__p6_0 = { - 2, 169, - (long *)_vq_lengthlist__8u0__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__8u0__p6_0, - 0 -}; - -static const long _vq_quantlist__8u0__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__8u0__p6_1[] = { - 1, 4, 4, 6, 6, 4, 6, 5, 7, 7, 4, 5, 6, 7, 7, 6, - 7, 7, 7, 7, 6, 7, 7, 7, 7, -}; - -static const static_codebook _8u0__p6_1 = { - 2, 25, - (long *)_vq_lengthlist__8u0__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8u0__p6_1, - 0 -}; - -static const long _vq_quantlist__8u0__p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8u0__p7_0[] = { - 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _8u0__p7_0 = { - 4, 81, - (long *)_vq_lengthlist__8u0__p7_0, - 1, -518803456, 1628680192, 2, 0, - (long *)_vq_quantlist__8u0__p7_0, - 0 -}; - -static const long _vq_quantlist__8u0__p7_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__8u0__p7_1[] = { - 1, 5, 5, 5, 5,10,10,11,11,11,11,11,11,11,11, 5, - 7, 6, 8, 8, 9,10,11,11,11,11,11,11,11,11, 6, 6, - 7, 9, 7,11,10,11,11,11,11,11,11,11,11, 5, 6, 6, - 11, 8,11,11,11,11,11,11,11,11,11,11, 5, 6, 6, 9, - 10,11,10,11,11,11,11,11,11,11,11, 7,10,10,11,11, - 11,11,11,11,11,11,11,11,11,11, 7,11, 8,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _8u0__p7_1 = { - 2, 225, - (long *)_vq_lengthlist__8u0__p7_1, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__8u0__p7_1, - 0 -}; - -static const long _vq_quantlist__8u0__p7_2[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__8u0__p7_2[] = { - 1, 6, 5, 7, 7, 9, 9, 9, 9,10,12,12,10,11,11,10, - 11,11,11,10,11, 6, 8, 8, 9, 9,10,10, 9,10,11,11, - 10,11,11,11,11,10,11,11,11,11, 6, 7, 8, 9, 9, 9, - 10,11,10,11,12,11,10,11,11,11,11,11,11,12,10, 8, - 9, 9,10, 9,10,10, 9,10,10,10,10,10, 9,10,10,10, - 10, 9,10,10, 9, 9, 9, 9,10,10, 9, 9,10,10,11,10, - 9,12,10,11,10, 9,10,10,10, 8, 9, 9,10, 9,10, 9, - 9,10,10, 9,10, 9,11,10,10,10,10,10, 9,10, 8, 8, - 9, 9,10, 9,11, 9, 8, 9, 9,10,11,10,10,10,11,12, - 9, 9,11, 8, 9, 8,11,10,11,10,10, 9,11,10,10,10, - 10,10,10,10,11,11,11,11, 8, 9, 9, 9,10,10,10,11, - 11,12,11,12,11,10,10,10,12,11,11,11,10, 8,10, 9, - 11,10,10,11,12,10,11,12,11,11,12,11,12,12,10,11, - 11,10, 9, 9,10,11,12,10,10,10,11,10,11,11,10,12, - 12,10,11,10,11,12,10, 9,10,10,11,10,11,11,11,11, - 11,12,11,11,11, 9,11,10,11,10,11,10, 9, 9,10,11, - 11,11,10,10,11,12,12,11,12,11,11,11,12,12,12,12, - 11, 9,11,11,12,10,11,11,11,11,11,11,12,11,11,12, - 11,11,11,10,11,11, 9,11,10,11,11,11,10,10,10,11, - 11,11,12,10,11,10,11,11,11,11,12, 9,11,10,11,11, - 10,10,11,11, 9,11,11,12,10,10,10,10,10,11,11,10, - 9,10,11,11,12,11,10,10,12,11,11,12,11,12,11,11, - 10,10,11,11,10,12,11,10,11,10,11,10,10,10,11,11, - 10,10,11,11,11,11,10,10,10,12,11,11,11,11,10, 9, - 10,11,11,11,12,11,11,11,12,10,11,11,11, 9,10,11, - 11,11,11,11,11,10,10,11,11,12,11,10,11,12,11,10, - 10,11, 9,10,11,11,11,11,11,10,11,11,10,12,11,11, - 11,12,11,11,11,10,10,11,11, -}; - -static const static_codebook _8u0__p7_2 = { - 2, 441, - (long *)_vq_lengthlist__8u0__p7_2, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__8u0__p7_2, - 0 -}; - -static const long _huff_lengthlist__8u0__single[] = { - 4, 7,11, 9,12, 8, 7,10, 6, 4, 5, 5, 7, 5, 6,16, - 9, 5, 5, 6, 7, 7, 9,16, 7, 4, 6, 5, 7, 5, 7,17, - 10, 7, 7, 8, 7, 7, 8,18, 7, 5, 6, 4, 5, 4, 5,15, - 7, 6, 7, 5, 6, 4, 5,15,12,13,18,12,17,11, 9,17, -}; - -static const static_codebook _huff_book__8u0__single = { - 2, 64, - (long *)_huff_lengthlist__8u0__single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__8u1__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8u1__p1_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 7, 9,10, 7, - 9, 9, 5, 8, 8, 7,10, 9, 7, 9, 9, 5, 8, 8, 8,10, - 10, 8,10,10, 7,10,10, 9,10,12,10,12,12, 7,10,10, - 9,12,11,10,12,12, 5, 8, 8, 8,10,10, 8,10,10, 7, - 10,10,10,12,12, 9,11,12, 7,10,10,10,12,12, 9,12, - 10, -}; - -static const static_codebook _8u1__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__8u1__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8u1__p1_0, - 0 -}; - -static const long _vq_quantlist__8u1__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8u1__p2_0[] = { - 3, 4, 5, 5, 6, 6, 5, 6, 6, 5, 7, 6, 6, 7, 8, 6, - 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 7, 5, 6, 6, 7, 8, - 8, 6, 7, 7, 6, 8, 7, 7, 7, 9, 8, 9, 9, 6, 7, 8, - 7, 9, 7, 8, 9, 9, 5, 6, 6, 6, 7, 7, 7, 8, 8, 6, - 8, 7, 8, 9, 9, 7, 7, 9, 6, 7, 8, 8, 9, 9, 7, 9, - 7, -}; - -static const static_codebook _8u1__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__8u1__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__8u1__p2_0, - 0 -}; - -static const long _vq_quantlist__8u1__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__8u1__p3_0[] = { - 1, 5, 5, 7, 7, 6, 7, 7, 9, 9, 6, 7, 7, 9, 9, 8, - 10, 9,11,11, 9, 9, 9,11,11, 6, 8, 8,10,10, 8,10, - 10,11,11, 8, 9,10,11,11,10,11,11,12,12,10,11,11, - 12,13, 6, 8, 8,10,10, 8,10, 9,11,11, 8,10, 9,11, - 11,10,11,11,12,12,10,11,11,12,12, 9,11,11,14,13, - 10,12,11,14,14,10,12,11,14,13,12,13,13,15,14,12, - 13,13,15,14, 8,11,11,13,14,10,11,12,13,15,10,11, - 12,14,14,12,13,13,14,15,12,13,13,14,15, 5, 8, 8, - 11,11, 8,10,10,12,12, 8,10,10,12,12,11,12,12,14, - 13,11,12,12,13,14, 8,10,10,12,12, 9,11,12,13,14, - 10,12,12,13,13,12,12,13,14,14,11,13,13,15,15, 7, - 10,10,12,12, 9,12,11,14,12,10,11,12,13,14,12,13, - 12,14,14,12,13,13,15,16,10,12,12,15,14,11,12,13, - 15,15,11,13,13,15,16,14,14,15,15,16,13,14,15,17, - 15, 9,12,12,14,15,11,13,12,15,15,11,13,13,15,15, - 13,14,13,15,14,13,14,14,17, 0, 5, 8, 8,11,11, 8, - 10,10,12,12, 8,10,10,12,12,11,12,12,14,14,11,12, - 12,14,14, 7,10,10,12,12,10,12,12,13,13, 9,11,12, - 12,13,11,12,13,15,15,11,12,13,14,15, 8,10,10,12, - 12,10,12,11,13,13,10,12,11,13,13,11,13,13,15,14, - 12,13,12,15,13, 9,12,12,14,14,11,13,13,16,15,11, - 12,13,16,15,13,14,15,16,16,13,13,15,15,16,10,12, - 12,15,14,11,13,13,14,16,11,13,13,15,16,13,15,15, - 16,17,13,15,14,16,15, 8,11,11,14,15,10,12,12,15, - 15,10,12,12,15,16,14,15,15,16,17,13,14,14,16,16, - 9,12,12,15,15,11,13,14,15,17,11,13,13,15,16,14, - 15,16,19,17,13,15,15, 0,17, 9,12,12,15,15,11,14, - 13,16,15,11,13,13,15,16,15,15,15,18,17,13,15,15, - 17,17,11,15,14,18,16,12,14,15,17,17,12,15,15,18, - 18,15,15,16,15,19,14,16,16, 0, 0,11,14,14,16,17, - 12,15,14,18,17,12,15,15,18,18,15,17,15,18,16,14, - 16,16,18,18, 7,11,11,14,14,10,12,12,15,15,10,12, - 13,15,15,13,14,15,16,16,14,15,15,18,18, 9,12,12, - 15,15,11,13,13,16,15,11,12,13,16,16,14,15,15,17, - 16,15,16,16,17,17, 9,12,12,15,15,11,13,13,15,17, - 11,14,13,16,15,13,15,15,17,17,15,15,15,18,17,11, - 14,14,17,15,12,14,15,17,18,13,13,15,17,17,14,16, - 16,19,18,16,15,17,17, 0,11,14,14,17,17,12,15,15, - 18, 0,12,15,14,18,16,14,17,17,19, 0,16,18,15, 0, - 16, -}; - -static const static_codebook _8u1__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__8u1__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8u1__p3_0, - 0 -}; - -static const long _vq_quantlist__8u1__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__8u1__p4_0[] = { - 4, 5, 5, 9, 9, 6, 7, 7, 9, 9, 6, 7, 7, 9, 9, 9, - 9, 9,11,11, 9, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 7, - 8, 9,10, 7, 7, 8, 9,10, 9, 9,10,10,11, 9, 9,10, - 10,12, 6, 7, 7, 9, 9, 7, 8, 7,10, 9, 7, 8, 7,10, - 9, 9,10, 9,12,11,10,10, 9,12,10, 9,10,10,12,11, - 9,10,10,12,11, 9,10,10,12,12,11,11,12,12,13,11, - 11,12,12,13, 9, 9,10,12,11, 9,10,10,12,12,10,10, - 10,12,12,11,12,11,13,12,11,12,11,13,12, 6, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 7,10, 9,10,10,10,12, - 12,10,10,10,12,11, 7, 8, 7,10,10, 7, 7, 9,10,11, - 8, 9, 9,11,10,10,10,11,10,12,10,10,11,12,12, 7, - 8, 8,10,10, 7, 9, 8,11,10, 8, 8, 9,11,11,10,11, - 10,12,11,10,11,11,12,12, 9,10,10,12,12, 9,10,10, - 12,12,10,11,11,13,12,11,10,12,10,14,12,12,12,13, - 14, 9,10,10,12,12, 9,11,10,12,12,10,11,11,12,12, - 11,12,11,14,12,12,12,12,14,14, 5, 7, 7, 9, 9, 7, - 7, 7, 9,10, 7, 8, 8,10,10,10,10,10,11,11,10,10, - 10,12,12, 7, 8, 8,10,10, 8, 9, 8,11,10, 7, 8, 9, - 10,11,10,10,10,11,12,10,10,11,11,13, 6, 7, 8,10, - 10, 8, 9, 9,10,10, 7, 9, 7,11,10,10,11,10,12,12, - 10,11,10,12,10, 9,10,10,12,12,10,11,11,13,12, 9, - 10,10,12,12,12,12,12,14,13,11,11,12,11,14, 9,10, - 10,11,12,10,11,11,12,13, 9,10,10,12,12,12,12,12, - 14,13,11,12,10,14,11, 9, 9,10,11,12, 9,10,10,12, - 12, 9,10,10,12,12,12,12,12,14,14,11,12,12,13,12, - 9,10, 9,12,12, 9,10,11,12,13,10,11,10,13,11,12, - 12,13,13,14,12,12,12,13,13, 9,10,10,12,12,10,11, - 10,13,12,10,10,11,12,13,12,13,12,14,13,12,12,12, - 13,14,11,12,11,14,13,10,10,11,13,13,12,12,12,14, - 13,12,10,14,10,15,13,14,14,14,14,11,11,12,13,14, - 10,12,11,13,13,12,12,12,13,15,12,13,11,15,12,13, - 13,14,14,14, 9,10, 9,12,12, 9,10,10,12,12,10,10, - 10,12,12,11,11,12,12,13,12,12,12,14,14, 9,10,10, - 12,12,10,11,10,13,12,10,10,11,12,13,12,12,12,14, - 13,12,12,13,13,14, 9,10,10,12,13,10,10,11,11,12, - 9,11,10,13,12,12,12,12,13,14,12,13,12,14,13,11, - 12,11,13,13,12,13,12,14,13,10,11,12,13,13,13,13, - 13,14,15,12,11,14,12,14,11,11,12,12,13,12,12,12, - 13,14,10,12,10,14,13,13,13,13,14,15,12,14,11,15, - 10, -}; - -static const static_codebook _8u1__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__8u1__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__8u1__p4_0, - 0 -}; - -static const long _vq_quantlist__8u1__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__8u1__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 5, 8, 7, 8, 8, - 10,10, 4, 6, 6, 8, 8, 8, 8,10,10, 7, 8, 8, 9, 9, - 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 8, 8, 8, - 9, 9,10,10,12,11, 8, 8, 8, 9, 9,10,10,11,11, 9, - 10,10,11,11,11,11,13,12, 9,10,10,11,11,12,12,12, - 13, -}; - -static const static_codebook _8u1__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__8u1__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8u1__p5_0, - 0 -}; - -static const long _vq_quantlist__8u1__p6_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__8u1__p6_0[] = { - 3, 4, 4, 6, 6, 7, 7, 9, 9, 4, 4, 5, 6, 6, 7, 7, - 9, 9, 4, 4, 4, 6, 6, 7, 7, 9, 9, 6, 6, 6, 7, 7, - 8, 8, 9, 9, 6, 6, 6, 7, 7, 8, 8, 9, 9, 7, 7, 7, - 8, 8, 8, 9,10,10, 7, 7, 7, 8, 8, 9, 8,10,10, 9, - 9, 9, 9, 9,10,10,10,10, 9, 9, 9, 9, 9,10,10,10, - 10, -}; - -static const static_codebook _8u1__p6_0 = { - 2, 81, - (long *)_vq_lengthlist__8u1__p6_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__8u1__p6_0, - 0 -}; - -static const long _vq_quantlist__8u1__p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__8u1__p7_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 9, 8,10,10, 8, - 10,10, 5, 9, 9, 7,10,10, 8,10,10, 4,10,10, 9,12, - 12, 9,11,11, 7,12,11,10,11,13,10,13,13, 7,12,12, - 10,13,12,10,13,13, 4,10,10, 9,12,12, 9,12,12, 7, - 12,12,10,13,13,10,12,13, 7,11,12,10,13,13,10,13, - 11, -}; - -static const static_codebook _8u1__p7_0 = { - 4, 81, - (long *)_vq_lengthlist__8u1__p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__8u1__p7_0, - 0 -}; - -static const long _vq_quantlist__8u1__p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__8u1__p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 7, 7, - 8, 8, 9, 9, 9, 9, 4, 5, 5, 7, 7, 8, 8, 9, 9, 9, - 9, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 9, 9, - 9, 9, 9, 9,10,10,10,10, 8, 9, 9, 9, 9, 9, 9,10, - 10,10,10, 8, 9, 9, 9, 9, 9, 9,10,10,10,10, 8, 9, - 9, 9, 9, 9, 9,10,10,10,10, -}; - -static const static_codebook _8u1__p7_1 = { - 2, 121, - (long *)_vq_lengthlist__8u1__p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__8u1__p7_1, - 0 -}; - -static const long _vq_quantlist__8u1__p8_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__8u1__p8_0[] = { - 1, 4, 4, 6, 6, 8, 8,10,10,11,11, 4, 6, 6, 7, 7, - 9, 9,11,11,13,12, 4, 6, 6, 7, 7, 9, 9,11,11,12, - 12, 6, 7, 7, 9, 9,11,11,12,12,13,13, 6, 7, 7, 9, - 9,11,11,12,12,13,13, 8, 9, 9,11,11,12,12,13,13, - 14,14, 8, 9, 9,11,11,12,12,13,13,14,14, 9,11,11, - 12,12,13,13,14,14,15,15, 9,11,11,12,12,13,13,14, - 14,15,14,11,12,12,13,13,14,14,15,15,16,16,11,12, - 12,13,13,14,14,15,15,15,15, -}; - -static const static_codebook _8u1__p8_0 = { - 2, 121, - (long *)_vq_lengthlist__8u1__p8_0, - 1, -524582912, 1618345984, 4, 0, - (long *)_vq_quantlist__8u1__p8_0, - 0 -}; - -static const long _vq_quantlist__8u1__p8_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__8u1__p8_1[] = { - 2, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 5, 6, 6, 7, 7, - 7, 7, 8, 8, 8, 8, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, - 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 8, 9, 9, 7, 8, 8, 8, 8, 8, 8, 9, - 8, 9, 9, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, - 8, 8, 8, 8, 8, 9, 9, 9, 9, -}; - -static const static_codebook _8u1__p8_1 = { - 2, 121, - (long *)_vq_lengthlist__8u1__p8_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__8u1__p8_1, - 0 -}; - -static const long _vq_quantlist__8u1__p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__8u1__p9_0[] = { - 1, 4, 4,11,11,11,11,11,11,11,11,11,11,11,11, 3, - 11, 8,11,11,11,11,11,11,11,11,11,11,11,11, 3, 9, - 9,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _8u1__p9_0 = { - 2, 225, - (long *)_vq_lengthlist__8u1__p9_0, - 1, -514071552, 1627381760, 4, 0, - (long *)_vq_quantlist__8u1__p9_0, - 0 -}; - -static const long _vq_quantlist__8u1__p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__8u1__p9_1[] = { - 1, 4, 4, 7, 7, 9, 9, 7, 7, 8, 8,10,10,11,11, 4, - 7, 7, 9, 9,10,10, 8, 8,10,10,10,11,10,11, 4, 7, - 7, 9, 9,10,10, 8, 8,10, 9,11,11,11,11, 7, 9, 9, - 12,12,11,12,10,10,11,10,12,11,11,11, 7, 9, 9,11, - 11,13,12, 9, 9,11,10,11,11,12,11, 9,10,10,12,12, - 14,14,10,10,11,12,12,11,11,11, 9,10,11,11,13,14, - 13,10,11,11,11,12,11,12,12, 7, 8, 8,10, 9,11,10, - 11,12,12,11,12,14,12,13, 7, 8, 8, 9,10,10,11,12, - 12,12,11,12,12,12,13, 9, 9, 9,11,11,13,12,12,12, - 12,11,12,12,13,12, 8,10,10,11,10,11,12,12,12,12, - 12,12,14,12,12, 9,11,11,11,12,12,12,12,13,13,12, - 12,13,13,12,10,11,11,12,11,12,12,12,11,12,13,12, - 12,12,13,11,11,12,12,12,13,12,12,11,12,13,13,12, - 12,13,12,11,12,12,13,13,12,13,12,13,13,13,13,14, - 13, -}; - -static const static_codebook _8u1__p9_1 = { - 2, 225, - (long *)_vq_lengthlist__8u1__p9_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__8u1__p9_1, - 0 -}; - -static const long _vq_quantlist__8u1__p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__8u1__p9_2[] = { - 2, 5, 4, 6, 6, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 5, 6, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10,10, 9, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10, 8, 8, 8, 9, 9, 9, 9,10,10,10, 9, - 10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10,10,10, - 10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9,10, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _8u1__p9_2 = { - 2, 289, - (long *)_vq_lengthlist__8u1__p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__8u1__p9_2, - 0 -}; - -static const long _huff_lengthlist__8u1__single[] = { - 4, 7,13, 9,15, 9,16, 8,10,13, 7, 5, 8, 6, 9, 7, - 10, 7,10,11,11, 6, 7, 8, 8, 9, 9, 9,12,16, 8, 5, - 8, 6, 8, 6, 9, 7,10,12,11, 7, 7, 7, 6, 7, 7, 7, - 11,15, 7, 5, 8, 6, 7, 5, 7, 6, 9,13,13, 9, 9, 8, - 6, 6, 5, 5, 9,14, 8, 6, 8, 6, 6, 4, 5, 3, 5,13, - 9, 9,11, 8,10, 7, 8, 4, 5,12,11,16,17,15,17,12, - 13, 8, 8,15, -}; - -static const static_codebook _huff_book__8u1__single = { - 2, 100, - (long *)_huff_lengthlist__8u1__single, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u0__long[] = { - 5, 8,13,10,17,11,11,15, 7, 2, 4, 5, 8, 7, 9,16, - 13, 4, 3, 5, 6, 8,11,20,10, 4, 5, 5, 7, 6, 8,18, - 15, 7, 6, 7, 8,10,14,20,10, 6, 7, 6, 9, 7, 8,17, - 9, 8,10, 8,10, 5, 4,11,12,17,19,14,16,10, 7,12, -}; - -static const static_codebook _huff_book__44u0__long = { - 2, 64, - (long *)_huff_lengthlist__44u0__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u0__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u0__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,11,11, 8, - 10,10, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, - 11, 8,11,11, 8,12,11,11,13,13,11,13,14, 7,11,11, - 10,13,12,11,13,14, 4, 8, 8, 8,11,11, 8,11,12, 8, - 11,11,11,13,13,10,12,13, 8,11,11,11,14,13,11,14, - 13, -}; - -static const static_codebook _44u0__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44u0__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u0__p1_0, - 0 -}; - -static const long _vq_quantlist__44u0__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u0__p2_0[] = { - 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 8, 6, - 8, 8, 5, 7, 7, 6, 8, 8, 7, 8, 8, 4, 7, 7, 7, 8, - 8, 7, 8, 8, 7, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, - 8,10, 8, 8,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 8, 6, - 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, - 9, -}; - -static const static_codebook _44u0__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__44u0__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u0__p2_0, - 0 -}; - -static const long _vq_quantlist__44u0__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u0__p3_0[] = { - 1, 5, 5, 8, 8, 5, 8, 7, 9, 9, 5, 7, 8, 9, 9, 9, - 10, 9,12,12, 9, 9,10,12,12, 6, 8, 8,11,10, 8,10, - 10,11,11, 8, 9,10,11,11,10,11,11,14,13,10,11,11, - 13,13, 5, 8, 8,10,10, 8,10,10,11,11, 8,10,10,11, - 11,10,11,11,13,13,10,11,11,13,13, 9,11,11,15,14, - 10,12,12,15,14,10,12,11,15,14,13,14,14,16,16,12, - 14,13,17,15, 9,11,11,14,15,10,11,12,14,16,10,11, - 12,14,16,12,13,14,16,16,13,13,15,15,18, 5, 8, 8, - 11,11, 8,10,10,12,12, 8,10,10,12,13,11,12,12,14, - 14,11,12,12,15,15, 8,10,10,13,13,10,12,12,13,13, - 10,12,12,14,14,12,13,13,15,15,12,13,13,16,16, 7, - 10,10,12,12,10,12,11,13,13,10,12,12,13,14,12,13, - 12,15,14,12,13,13,16,16,10,12,12,17,16,12,13,13, - 16,15,11,13,13,17,17,15,15,15,16,17,14,15,15,19, - 19,10,12,12,15,16,11,13,12,15,18,11,13,13,16,16, - 14,15,15,17,17,14,15,15,17,19, 5, 8, 8,11,11, 8, - 10,10,12,12, 8,10,10,12,12,11,12,12,16,15,11,12, - 12,14,15, 7,10,10,13,13,10,12,12,14,13,10,11,12, - 13,13,12,13,13,16,16,12,12,13,15,15, 8,10,10,13, - 13,10,12,12,14,14,10,12,12,13,13,12,13,13,16,16, - 12,13,13,15,15,10,12,12,16,15,11,13,13,17,16,11, - 12,13,16,15,13,15,15,19,17,14,15,14,17,16,10,12, - 12,16,16,11,13,13,16,17,12,13,13,15,17,14,15,15, - 17,19,14,15,15,17,17, 8,11,11,16,16,10,13,12,17, - 17,10,12,13,16,16,15,17,16,20,19,14,15,17,18,19, - 9,12,12,16,17,11,13,14,17,18,11,13,13,19,18,16, - 17,18,19,19,15,16,16,19,19, 9,12,12,16,17,11,14, - 13,18,17,11,13,13,17,17,16,17,16,20,19,14,16,16, - 18,18,12,15,15,19,17,14,15,16, 0,20,13,15,16,20, - 17,18,16,20, 0, 0,15,16,19,20, 0,12,15,14,18,19, - 13,16,15,20,19,13,16,15,20,18,17,18,17, 0,20,16, - 17,16, 0, 0, 8,11,11,16,15,10,12,12,17,17,10,13, - 13,17,16,14,16,15,18,20,15,16,16,19,19, 9,12,12, - 16,16,11,13,13,17,16,11,13,14,17,18,15,15,16,20, - 20,16,16,17,19,19, 9,13,12,16,17,11,14,13,17,17, - 11,14,14,18,17,14,16,15,18,19,16,17,18,18,19,12, - 14,15,19,18,13,15,16,18, 0,13,14,15, 0, 0,16,16, - 17,20, 0,17,17,20,20, 0,12,15,15,19,20,13,15,15, - 0, 0,14,16,15, 0, 0,15,18,16, 0, 0,17,18,16, 0, - 19, -}; - -static const static_codebook _44u0__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44u0__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u0__p3_0, - 0 -}; - -static const long _vq_quantlist__44u0__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u0__p4_0[] = { - 4, 5, 5, 9, 9, 5, 6, 6, 9, 9, 5, 6, 6, 9, 9, 9, - 10, 9,12,12, 9, 9,10,12,12, 5, 7, 7,10,10, 7, 7, - 8,10,10, 6, 7, 8,10,10,10,10,10,11,13,10, 9,10, - 12,13, 5, 7, 7,10,10, 6, 8, 7,10,10, 7, 8, 7,10, - 10, 9,10,10,12,12,10,10,10,13,11, 9,10,10,13,13, - 10,11,10,13,13,10,10,10,13,13,12,12,13,14,14,12, - 12,13,14,14, 9,10,10,13,13,10,10,10,13,13,10,10, - 10,13,13,12,13,12,15,14,12,13,12,15,15, 5, 7, 6, - 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,10,13, - 13,10,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,10,11, - 8, 9, 9,11,11,11,10,11,11,14,11,11,11,13,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,14,11,10,11,11,13,13,10,11,11,14,13,10,10,11, - 14,13,10,11,11,14,14,12,11,13,12,16,13,14,14,15, - 15,10,10,11,13,14,10,11,10,14,13,10,11,11,14,14, - 12,13,12,15,13,13,13,14,15,16, 5, 7, 7,10,10, 7, - 8, 8,10,10, 7, 8, 8,10,10,10,10,10,13,13,10,10, - 11,12,13, 6, 8, 8,11,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,13,13,10,10,11,11,13, 6, 8, 8,10, - 11, 8, 9, 9,11,11, 8, 9, 8,12,10,10,11,11,13,13, - 10,11,10,14,11,10,10,10,14,13,10,11,11,14,13,10, - 10,11,13,13,12,14,14,16,16,12,12,13,13,15,10,11, - 11,13,14,10,11,11,14,15,10,11,10,13,13,13,14,13, - 16,16,12,13,11,15,12, 9,10,10,13,13,10,11,11,14, - 13,10,10,11,13,14,13,14,13,16,16,13,13,13,15,16, - 9,10,10,13,13,10,10,11,13,14,10,11,11,15,13,13, - 13,14,14,18,13,13,14,16,15, 9,10,10,13,14,10,11, - 10,14,13,10,11,11,13,14,13,14,13,16,15,13,13,14, - 15,16,12,13,12,16,14,11,11,13,15,15,13,14,13,16, - 15,15,12,16,12,17,14,15,15,17,17,12,13,13,14,16, - 11,13,11,16,15,12,13,14,15,16,14,15,13, 0,14,14, - 16,16, 0, 0, 9,10,10,13,13,10,11,10,14,14,10,11, - 11,13,13,12,13,13,14,16,13,14,14,16,16, 9,10,10, - 14,14,11,11,11,14,13,10,10,11,14,14,13,13,13,16, - 16,13,13,14,14,17, 9,10,10,13,14,10,11,11,13,15, - 10,11,10,14,14,13,13,13,14,17,13,14,13,17,14,12, - 13,13,16,14,13,14,13,16,15,12,12,13,15,16,15,15, - 16,18,16,15,13,15,14, 0,12,12,13,14,16,13,13,14, - 15,16,11,12,11,16,14,15,16,16,17,17,14,15,12,17, - 12, -}; - -static const static_codebook _44u0__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__44u0__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u0__p4_0, - 0 -}; - -static const long _vq_quantlist__44u0__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u0__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, - 9, 9, 4, 6, 6, 8, 8, 8, 8, 9, 9, 7, 8, 8, 9, 9, - 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,10, 7, 8, 8, - 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 9, 9,10,10,11,11,12,12, 9, 9, 9,10,11,11,11,12, - 12, -}; - -static const static_codebook _44u0__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44u0__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u0__p5_0, - 0 -}; - -static const long _vq_quantlist__44u0__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u0__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8,10, 9,11,10,14,13, 4, 6, 5, - 8, 8, 9, 9,11,10,11,11,14,14, 4, 5, 6, 8, 8, 9, - 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, - 12,12,16,15, 7, 8, 8, 9, 9,10,10,11,11,12,12,15, - 15, 9,10,10,10,10,11,11,12,12,12,12,15,15, 9,10, - 9,10,11,11,11,12,12,12,13,15,15,10,10,11,11,11, - 12,12,13,12,13,13,16,15,10,11,11,11,11,12,12,13, - 12,13,13,16,17,11,11,12,12,12,13,13,13,14,14,15, - 17,17,11,11,12,12,12,13,13,13,14,14,14,16,18,14, - 15,15,15,15,16,16,16,16,17,18, 0, 0,14,15,15,15, - 15,17,16,17,18,17,17,18, 0, -}; - -static const static_codebook _44u0__p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44u0__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u0__p6_0, - 0 -}; - -static const long _vq_quantlist__44u0__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u0__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 5, 6, 6, 6, 6, -}; - -static const static_codebook _44u0__p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44u0__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u0__p6_1, - 0 -}; - -static const long _vq_quantlist__44u0__p7_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u0__p7_0[] = { - 1, 4, 4,11,11, 9,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11, 9,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _44u0__p7_0 = { - 4, 625, - (long *)_vq_lengthlist__44u0__p7_0, - 1, -518709248, 1626677248, 3, 0, - (long *)_vq_quantlist__44u0__p7_0, - 0 -}; - -static const long _vq_quantlist__44u0__p7_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u0__p7_1[] = { - 1, 4, 4, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 5, 7, 7, - 8, 7, 7, 7, 9, 8,10, 9,10,11, 5, 7, 7, 8, 8, 7, - 7, 8, 9,10,10,11,11, 6, 8, 8, 9, 9, 9, 9,11,10, - 12,12,15,12, 6, 8, 8, 9, 9, 9, 9,11,11,12,11,14, - 12, 7, 8, 8,10,10,12,12,13,13,13,15,13,13, 7, 8, - 8,10,10,11,11,13,12,14,15,15,15, 9,10,10,11,12, - 13,13,14,15,14,15,14,15, 8,10,10,12,12,14,14,15, - 14,14,15,15,14,10,12,12,14,14,15,14,15,15,15,14, - 15,15,10,12,12,13,14,15,14,15,15,14,15,15,15,12, - 15,13,15,14,15,15,15,15,15,15,15,15,13,13,15,15, - 15,15,15,15,15,15,15,15,15, -}; - -static const static_codebook _44u0__p7_1 = { - 2, 169, - (long *)_vq_lengthlist__44u0__p7_1, - 1, -523010048, 1618608128, 4, 0, - (long *)_vq_quantlist__44u0__p7_1, - 0 -}; - -static const long _vq_quantlist__44u0__p7_2[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u0__p7_2[] = { - 2, 5, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 5, 5, 6, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 5, 6, 5, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, 8, 8, 8, 9, 8, - 9, 9, 9, 9, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, - 8, 9, 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10, 9,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, - 9, 9, 9,10, 9, 9,10,10, 9, -}; - -static const static_codebook _44u0__p7_2 = { - 2, 169, - (long *)_vq_lengthlist__44u0__p7_2, - 1, -531103744, 1611661312, 4, 0, - (long *)_vq_quantlist__44u0__p7_2, - 0 -}; - -static const long _huff_lengthlist__44u0__short[] = { - 12,13,14,13,17,12,15,17, 5, 5, 6,10,10,11,15,16, - 4, 3, 3, 7, 5, 7,10,16, 7, 7, 7,10, 9,11,12,16, - 6, 5, 5, 9, 5, 6,10,16, 8, 7, 7, 9, 6, 7, 9,16, - 11, 7, 3, 6, 4, 5, 8,16,12, 9, 4, 8, 5, 7, 9,16, -}; - -static const static_codebook _huff_book__44u0__short = { - 2, 64, - (long *)_huff_lengthlist__44u0__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u1__long[] = { - 5, 8,13,10,17,11,11,15, 7, 2, 4, 5, 8, 7, 9,16, - 13, 4, 3, 5, 6, 8,11,20,10, 4, 5, 5, 7, 6, 8,18, - 15, 7, 6, 7, 8,10,14,20,10, 6, 7, 6, 9, 7, 8,17, - 9, 8,10, 8,10, 5, 4,11,12,17,19,14,16,10, 7,12, -}; - -static const static_codebook _huff_book__44u1__long = { - 2, 64, - (long *)_huff_lengthlist__44u1__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u1__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u1__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,11,11, 8, - 10,10, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, - 11, 8,11,11, 8,12,11,11,13,13,11,13,14, 7,11,11, - 10,13,12,11,13,14, 4, 8, 8, 8,11,11, 8,11,12, 8, - 11,11,11,13,13,10,12,13, 8,11,11,11,14,13,11,14, - 13, -}; - -static const static_codebook _44u1__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44u1__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u1__p1_0, - 0 -}; - -static const long _vq_quantlist__44u1__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u1__p2_0[] = { - 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 8, 6, - 8, 8, 5, 7, 7, 6, 8, 8, 7, 8, 8, 4, 7, 7, 7, 8, - 8, 7, 8, 8, 7, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, - 8,10, 8, 8,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 8, 6, - 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, - 9, -}; - -static const static_codebook _44u1__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__44u1__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u1__p2_0, - 0 -}; - -static const long _vq_quantlist__44u1__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u1__p3_0[] = { - 1, 5, 5, 8, 8, 5, 8, 7, 9, 9, 5, 7, 8, 9, 9, 9, - 10, 9,12,12, 9, 9,10,12,12, 6, 8, 8,11,10, 8,10, - 10,11,11, 8, 9,10,11,11,10,11,11,14,13,10,11,11, - 13,13, 5, 8, 8,10,10, 8,10,10,11,11, 8,10,10,11, - 11,10,11,11,13,13,10,11,11,13,13, 9,11,11,15,14, - 10,12,12,15,14,10,12,11,15,14,13,14,14,16,16,12, - 14,13,17,15, 9,11,11,14,15,10,11,12,14,16,10,11, - 12,14,16,12,13,14,16,16,13,13,15,15,18, 5, 8, 8, - 11,11, 8,10,10,12,12, 8,10,10,12,13,11,12,12,14, - 14,11,12,12,15,15, 8,10,10,13,13,10,12,12,13,13, - 10,12,12,14,14,12,13,13,15,15,12,13,13,16,16, 7, - 10,10,12,12,10,12,11,13,13,10,12,12,13,14,12,13, - 12,15,14,12,13,13,16,16,10,12,12,17,16,12,13,13, - 16,15,11,13,13,17,17,15,15,15,16,17,14,15,15,19, - 19,10,12,12,15,16,11,13,12,15,18,11,13,13,16,16, - 14,15,15,17,17,14,15,15,17,19, 5, 8, 8,11,11, 8, - 10,10,12,12, 8,10,10,12,12,11,12,12,16,15,11,12, - 12,14,15, 7,10,10,13,13,10,12,12,14,13,10,11,12, - 13,13,12,13,13,16,16,12,12,13,15,15, 8,10,10,13, - 13,10,12,12,14,14,10,12,12,13,13,12,13,13,16,16, - 12,13,13,15,15,10,12,12,16,15,11,13,13,17,16,11, - 12,13,16,15,13,15,15,19,17,14,15,14,17,16,10,12, - 12,16,16,11,13,13,16,17,12,13,13,15,17,14,15,15, - 17,19,14,15,15,17,17, 8,11,11,16,16,10,13,12,17, - 17,10,12,13,16,16,15,17,16,20,19,14,15,17,18,19, - 9,12,12,16,17,11,13,14,17,18,11,13,13,19,18,16, - 17,18,19,19,15,16,16,19,19, 9,12,12,16,17,11,14, - 13,18,17,11,13,13,17,17,16,17,16,20,19,14,16,16, - 18,18,12,15,15,19,17,14,15,16, 0,20,13,15,16,20, - 17,18,16,20, 0, 0,15,16,19,20, 0,12,15,14,18,19, - 13,16,15,20,19,13,16,15,20,18,17,18,17, 0,20,16, - 17,16, 0, 0, 8,11,11,16,15,10,12,12,17,17,10,13, - 13,17,16,14,16,15,18,20,15,16,16,19,19, 9,12,12, - 16,16,11,13,13,17,16,11,13,14,17,18,15,15,16,20, - 20,16,16,17,19,19, 9,13,12,16,17,11,14,13,17,17, - 11,14,14,18,17,14,16,15,18,19,16,17,18,18,19,12, - 14,15,19,18,13,15,16,18, 0,13,14,15, 0, 0,16,16, - 17,20, 0,17,17,20,20, 0,12,15,15,19,20,13,15,15, - 0, 0,14,16,15, 0, 0,15,18,16, 0, 0,17,18,16, 0, - 19, -}; - -static const static_codebook _44u1__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44u1__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u1__p3_0, - 0 -}; - -static const long _vq_quantlist__44u1__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u1__p4_0[] = { - 4, 5, 5, 9, 9, 5, 6, 6, 9, 9, 5, 6, 6, 9, 9, 9, - 10, 9,12,12, 9, 9,10,12,12, 5, 7, 7,10,10, 7, 7, - 8,10,10, 6, 7, 8,10,10,10,10,10,11,13,10, 9,10, - 12,13, 5, 7, 7,10,10, 6, 8, 7,10,10, 7, 8, 7,10, - 10, 9,10,10,12,12,10,10,10,13,11, 9,10,10,13,13, - 10,11,10,13,13,10,10,10,13,13,12,12,13,14,14,12, - 12,13,14,14, 9,10,10,13,13,10,10,10,13,13,10,10, - 10,13,13,12,13,12,15,14,12,13,12,15,15, 5, 7, 6, - 10,10, 7, 8, 8,10,10, 7, 8, 8,10,10,10,11,10,13, - 13,10,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,10,11, - 8, 9, 9,11,11,11,10,11,11,14,11,11,11,13,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,14,11,10,11,11,13,13,10,11,11,14,13,10,10,11, - 14,13,10,11,11,14,14,12,11,13,12,16,13,14,14,15, - 15,10,10,11,13,14,10,11,10,14,13,10,11,11,14,14, - 12,13,12,15,13,13,13,14,15,16, 5, 7, 7,10,10, 7, - 8, 8,10,10, 7, 8, 8,10,10,10,10,10,13,13,10,10, - 11,12,13, 6, 8, 8,11,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,13,13,10,10,11,11,13, 6, 8, 8,10, - 11, 8, 9, 9,11,11, 8, 9, 8,12,10,10,11,11,13,13, - 10,11,10,14,11,10,10,10,14,13,10,11,11,14,13,10, - 10,11,13,13,12,14,14,16,16,12,12,13,13,15,10,11, - 11,13,14,10,11,11,14,15,10,11,10,13,13,13,14,13, - 16,16,12,13,11,15,12, 9,10,10,13,13,10,11,11,14, - 13,10,10,11,13,14,13,14,13,16,16,13,13,13,15,16, - 9,10,10,13,13,10,10,11,13,14,10,11,11,15,13,13, - 13,14,14,18,13,13,14,16,15, 9,10,10,13,14,10,11, - 10,14,13,10,11,11,13,14,13,14,13,16,15,13,13,14, - 15,16,12,13,12,16,14,11,11,13,15,15,13,14,13,16, - 15,15,12,16,12,17,14,15,15,17,17,12,13,13,14,16, - 11,13,11,16,15,12,13,14,15,16,14,15,13, 0,14,14, - 16,16, 0, 0, 9,10,10,13,13,10,11,10,14,14,10,11, - 11,13,13,12,13,13,14,16,13,14,14,16,16, 9,10,10, - 14,14,11,11,11,14,13,10,10,11,14,14,13,13,13,16, - 16,13,13,14,14,17, 9,10,10,13,14,10,11,11,13,15, - 10,11,10,14,14,13,13,13,14,17,13,14,13,17,14,12, - 13,13,16,14,13,14,13,16,15,12,12,13,15,16,15,15, - 16,18,16,15,13,15,14, 0,12,12,13,14,16,13,13,14, - 15,16,11,12,11,16,14,15,16,16,17,17,14,15,12,17, - 12, -}; - -static const static_codebook _44u1__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__44u1__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u1__p4_0, - 0 -}; - -static const long _vq_quantlist__44u1__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u1__p5_0[] = { - 1, 4, 4, 7, 7, 7, 7, 9, 9, 4, 6, 6, 8, 8, 8, 8, - 9, 9, 4, 6, 6, 8, 8, 8, 8, 9, 9, 7, 8, 8, 9, 9, - 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,10, 7, 8, 8, - 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 9, 9,10,10,11,11,12,12, 9, 9, 9,10,11,11,11,12, - 12, -}; - -static const static_codebook _44u1__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44u1__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u1__p5_0, - 0 -}; - -static const long _vq_quantlist__44u1__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u1__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8,10, 9,11,10,14,13, 4, 6, 5, - 8, 8, 9, 9,11,10,11,11,14,14, 4, 5, 6, 8, 8, 9, - 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, - 12,12,16,15, 7, 8, 8, 9, 9,10,10,11,11,12,12,15, - 15, 9,10,10,10,10,11,11,12,12,12,12,15,15, 9,10, - 9,10,11,11,11,12,12,12,13,15,15,10,10,11,11,11, - 12,12,13,12,13,13,16,15,10,11,11,11,11,12,12,13, - 12,13,13,16,17,11,11,12,12,12,13,13,13,14,14,15, - 17,17,11,11,12,12,12,13,13,13,14,14,14,16,18,14, - 15,15,15,15,16,16,16,16,17,18, 0, 0,14,15,15,15, - 15,17,16,17,18,17,17,18, 0, -}; - -static const static_codebook _44u1__p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44u1__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u1__p6_0, - 0 -}; - -static const long _vq_quantlist__44u1__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u1__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 5, 6, 6, 6, 6, -}; - -static const static_codebook _44u1__p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44u1__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u1__p6_1, - 0 -}; - -static const long _vq_quantlist__44u1__p7_0[] = { - 3, - 2, - 4, - 1, - 5, - 0, - 6, -}; - -static const long _vq_lengthlist__44u1__p7_0[] = { - 1, 3, 2, 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, -}; - -static const static_codebook _44u1__p7_0 = { - 2, 49, - (long *)_vq_lengthlist__44u1__p7_0, - 1, -518017024, 1626677248, 3, 0, - (long *)_vq_quantlist__44u1__p7_0, - 0 -}; - -static const long _vq_quantlist__44u1__p7_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u1__p7_1[] = { - 1, 4, 4, 6, 6, 6, 6, 7, 7, 8, 8, 9, 9, 5, 7, 7, - 8, 7, 7, 7, 9, 8,10, 9,10,11, 5, 7, 7, 8, 8, 7, - 7, 8, 9,10,10,11,11, 6, 8, 8, 9, 9, 9, 9,11,10, - 12,12,15,12, 6, 8, 8, 9, 9, 9, 9,11,11,12,11,14, - 12, 7, 8, 8,10,10,12,12,13,13,13,15,13,13, 7, 8, - 8,10,10,11,11,13,12,14,15,15,15, 9,10,10,11,12, - 13,13,14,15,14,15,14,15, 8,10,10,12,12,14,14,15, - 14,14,15,15,14,10,12,12,14,14,15,14,15,15,15,14, - 15,15,10,12,12,13,14,15,14,15,15,14,15,15,15,12, - 15,13,15,14,15,15,15,15,15,15,15,15,13,13,15,15, - 15,15,15,15,15,15,15,15,15, -}; - -static const static_codebook _44u1__p7_1 = { - 2, 169, - (long *)_vq_lengthlist__44u1__p7_1, - 1, -523010048, 1618608128, 4, 0, - (long *)_vq_quantlist__44u1__p7_1, - 0 -}; - -static const long _vq_quantlist__44u1__p7_2[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u1__p7_2[] = { - 2, 5, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 5, 5, 6, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 5, 6, 5, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 6, 7, 7, 8, 8, 8, 8, 9, 8, - 9, 9, 9, 9, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, - 8, 9, 8, 9, 8, 9, 9, 9, 9, 9, 9, 8, 9, 8, 9, 9, - 9, 9, 9, 9, 9, 9,10,10, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9,10, 9,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9, 9, 9, 9, 9, - 9, 9, 9,10, 9, 9,10,10, 9, -}; - -static const static_codebook _44u1__p7_2 = { - 2, 169, - (long *)_vq_lengthlist__44u1__p7_2, - 1, -531103744, 1611661312, 4, 0, - (long *)_vq_quantlist__44u1__p7_2, - 0 -}; - -static const long _huff_lengthlist__44u1__short[] = { - 12,13,14,13,17,12,15,17, 5, 5, 6,10,10,11,15,16, - 4, 3, 3, 7, 5, 7,10,16, 7, 7, 7,10, 9,11,12,16, - 6, 5, 5, 9, 5, 6,10,16, 8, 7, 7, 9, 6, 7, 9,16, - 11, 7, 3, 6, 4, 5, 8,16,12, 9, 4, 8, 5, 7, 9,16, -}; - -static const static_codebook _huff_book__44u1__short = { - 2, 64, - (long *)_huff_lengthlist__44u1__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u2__long[] = { - 5, 9,14,12,15,13,10,13, 7, 4, 5, 6, 8, 7, 8,12, - 13, 4, 3, 5, 5, 6, 9,15,12, 6, 5, 6, 6, 6, 7,14, - 14, 7, 4, 6, 4, 6, 8,15,12, 6, 6, 5, 5, 5, 6,14, - 9, 7, 8, 6, 7, 5, 4,10,10,13,14,14,15,10, 6, 8, -}; - -static const static_codebook _huff_book__44u2__long = { - 2, 64, - (long *)_huff_lengthlist__44u2__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u2__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u2__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,11,11, 8, - 10,11, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, - 11, 8,11,11, 8,11,11,11,13,14,11,13,13, 7,11,11, - 10,13,12,11,14,14, 4, 8, 8, 8,11,11, 8,11,11, 8, - 11,11,11,14,13,10,12,13, 8,11,11,11,13,13,11,13, - 13, -}; - -static const static_codebook _44u2__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44u2__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u2__p1_0, - 0 -}; - -static const long _vq_quantlist__44u2__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u2__p2_0[] = { - 2, 5, 5, 5, 6, 6, 5, 6, 6, 5, 6, 6, 7, 8, 8, 6, - 8, 8, 5, 6, 6, 6, 8, 7, 7, 8, 8, 5, 6, 6, 7, 8, - 8, 6, 8, 8, 6, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, - 7,10, 8, 8,10,10, 5, 6, 6, 6, 8, 8, 7, 8, 8, 6, - 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, - 9, -}; - -static const static_codebook _44u2__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__44u2__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u2__p2_0, - 0 -}; - -static const long _vq_quantlist__44u2__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u2__p3_0[] = { - 2, 4, 4, 7, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 8, - 9, 9,12,11, 8, 9, 9,11,12, 5, 7, 7,10,10, 7, 9, - 9,11,11, 7, 9, 9,10,11,10,11,11,13,13, 9,10,11, - 12,13, 5, 7, 7,10,10, 7, 9, 9,11,10, 7, 9, 9,11, - 11, 9,11,10,13,13,10,11,11,13,13, 8,10,10,14,13, - 10,11,11,15,14, 9,11,11,15,14,13,14,13,16,14,12, - 13,13,15,16, 8,10,10,13,14, 9,11,11,14,15,10,11, - 11,14,15,12,13,13,15,15,12,13,14,15,16, 5, 7, 7, - 10,10, 7, 9, 9,11,11, 7, 9, 9,11,12,10,11,11,14, - 13,10,11,11,14,14, 7, 9, 9,12,12, 9,11,11,13,13, - 9,11,11,13,13,12,13,12,14,14,11,12,13,15,15, 7, - 9, 9,12,12, 8,11,10,13,12, 9,11,11,13,13,11,13, - 12,15,13,11,13,13,15,16, 9,12,11,15,15,11,12,12, - 16,15,11,12,13,16,16,13,14,15,16,15,13,15,15,17, - 17, 9,11,11,14,15,10,12,12,15,15,11,13,12,15,16, - 13,15,14,16,16,13,15,15,17,19, 5, 7, 7,10,10, 7, - 9, 9,12,11, 7, 9, 9,11,11,10,11,11,14,14,10,11, - 11,13,14, 7, 9, 9,12,12, 9,11,11,13,13, 9,10,11, - 12,13,11,13,12,16,15,11,12,12,14,15, 7, 9, 9,12, - 12, 9,11,11,13,13, 9,11,11,13,12,11,13,12,15,16, - 12,13,13,15,14, 9,11,11,15,14,11,13,12,16,15,10, - 11,12,15,15,13,14,14,18,17,13,14,14,15,17,10,11, - 11,14,15,11,13,12,15,17,11,13,12,15,16,13,15,14, - 18,17,14,15,15,16,18, 7,10,10,14,14,10,12,12,15, - 15,10,12,12,15,15,14,15,15,18,17,13,15,15,16,16, - 9,11,11,16,15,11,13,13,16,18,11,13,13,16,16,15, - 16,16, 0, 0,14,15,16,18,17, 9,11,11,15,15,10,13, - 12,17,16,11,12,13,16,17,14,15,16,19,19,14,15,15, - 0,20,12,14,14, 0, 0,13,14,16,19,18,13,15,16,20, - 17,16,18, 0, 0, 0,15,16,17,18,19,11,14,14, 0,19, - 12,15,14,17,17,13,15,15, 0, 0,16,17,15,20,19,15, - 17,16,19, 0, 8,10,10,14,15,10,12,11,15,15,10,11, - 12,16,15,13,14,14,19,17,14,15,15, 0, 0, 9,11,11, - 16,15,11,13,13,17,16,10,12,13,16,17,14,15,15,18, - 18,14,15,16,20,19, 9,12,12, 0,15,11,13,13,16,17, - 11,13,13,19,17,14,16,16,18,17,15,16,16,17,19,11, - 14,14,18,18,13,14,15, 0, 0,12,14,15,19,18,15,16, - 19, 0,19,15,16,19,19,17,12,14,14,16,19,13,15,15, - 0,17,13,15,14,18,18,15,16,15, 0,18,16,17,17, 0, - 0, -}; - -static const static_codebook _44u2__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44u2__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u2__p3_0, - 0 -}; - -static const long _vq_quantlist__44u2__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u2__p4_0[] = { - 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 9, - 9, 9,11,11, 9, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 7, 8,10,10,10,10,10,11,12, 9,10,10, - 11,12, 5, 7, 7, 9, 9, 6, 8, 7,10,10, 7, 8, 8,10, - 10, 9,10,10,12,11, 9,10,10,12,11, 9,10,10,12,12, - 10,10,10,13,12, 9,10,10,12,13,12,12,12,14,14,11, - 12,12,13,14, 9,10,10,12,12, 9,10,10,12,13,10,10, - 10,12,13,11,12,12,14,13,12,12,12,14,13, 5, 7, 7, - 10, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, - 12,10,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,11,11, - 8, 9, 9,11,11,10,11,11,12,13,10,11,11,13,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,11,10,11,11,13,13, 9,10,10,13,13,10,11,11, - 13,13,10,11,11,14,13,12,11,13,12,15,12,13,13,15, - 15, 9,10,10,12,13,10,11,10,13,13,10,11,11,13,13, - 12,13,11,15,13,12,13,13,15,15, 5, 7, 7, 9,10, 7, - 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12,12,10,10, - 11,12,12, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,13,13,10,10,11,11,13, 7, 8, 8,10, - 11, 8, 9, 9,11,11, 8, 9, 8,11,11,10,11,11,13,13, - 10,11,11,13,12, 9,10,10,13,12,10,11,11,14,13,10, - 10,11,13,13,12,13,13,15,15,12,11,13,12,14, 9,10, - 10,12,13,10,11,11,13,14,10,11,11,13,13,12,13,13, - 15,15,12,13,12,15,12, 8, 9, 9,12,12, 9,11,10,13, - 13, 9,10,10,13,13,12,13,13,15,15,12,12,12,14,14, - 9,10,10,13,13,10,11,11,13,14,10,11,11,14,12,13, - 13,14,14,16,12,13,13,15,14, 9,10,10,13,13,10,11, - 10,14,13,10,11,11,13,14,12,14,13,16,14,13,13,13, - 14,15,11,13,12,15,14,11,12,13,14,15,12,13,13,16, - 15,14,12,15,12,16,14,15,15,17,16,11,12,12,14,15, - 11,13,11,15,14,12,13,13,15,16,13,15,12,17,13,14, - 15,15,16,16, 8, 9, 9,12,12, 9,10,10,13,13, 9,10, - 10,13,13,12,13,12,14,14,12,13,13,15,15, 9,10,10, - 13,13,10,11,11,14,13,10,10,11,13,14,12,13,13,15, - 14,12,12,14,14,16, 9,10,10,13,13,10,11,11,13,14, - 10,11,11,14,13,13,13,13,15,15,13,14,13,16,14,11, - 12,12,14,14,12,13,13,16,15,11,12,13,14,15,14,15, - 15,16,16,14,13,15,13,17,11,12,12,14,15,12,13,13, - 15,16,11,13,12,15,15,14,15,14,16,16,14,15,12,17, - 13, -}; - -static const static_codebook _44u2__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__44u2__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u2__p4_0, - 0 -}; - -static const long _vq_quantlist__44u2__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u2__p5_0[] = { - 1, 4, 4, 7, 7, 8, 8, 9, 9, 4, 6, 5, 8, 8, 8, 8, - 10,10, 4, 5, 6, 8, 8, 8, 8,10,10, 7, 8, 8, 9, 9, - 9, 9,11,11, 7, 8, 8, 9, 9, 9, 9,11,11, 8, 8, 8, - 9, 9,10,11,12,12, 8, 8, 8, 9, 9,10,10,12,12,10, - 10,10,11,11,12,12,13,13,10,10,10,11,11,12,12,13, - 13, -}; - -static const static_codebook _44u2__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44u2__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u2__p5_0, - 0 -}; - -static const long _vq_quantlist__44u2__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u2__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8,10,10,11,11,14,13, 4, 6, 5, - 8, 8, 9, 9,11,10,12,11,15,14, 4, 5, 6, 8, 8, 9, - 9,11,11,11,11,14,14, 6, 8, 8,10, 9,11,11,11,11, - 12,12,15,15, 6, 8, 8, 9, 9,11,11,11,12,12,12,15, - 15, 8,10,10,11,11,11,11,12,12,13,13,15,16, 8,10, - 10,11,11,11,11,12,12,13,13,16,16,10,11,11,12,12, - 12,12,13,13,13,13,17,16,10,11,11,12,12,12,12,13, - 13,13,14,16,17,11,12,12,13,13,13,13,14,14,15,14, - 18,17,11,12,12,13,13,13,13,14,14,14,15,19,18,14, - 15,15,15,15,16,16,18,19,18,18, 0, 0,14,15,15,16, - 15,17,17,16,18,17,18, 0, 0, -}; - -static const static_codebook _44u2__p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44u2__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u2__p6_0, - 0 -}; - -static const long _vq_quantlist__44u2__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u2__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, - 6, 5, 6, 6, 5, 5, 6, 6, 6, -}; - -static const static_codebook _44u2__p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44u2__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u2__p6_1, - 0 -}; - -static const long _vq_quantlist__44u2__p7_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u2__p7_0[] = { - 1, 3, 2,12,12,12,12,12,12, 4,12,12,12,12,12,12, - 12,12, 5,12,12,12,12,12,12,12,12,12,12,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11, -}; - -static const static_codebook _44u2__p7_0 = { - 2, 81, - (long *)_vq_lengthlist__44u2__p7_0, - 1, -516612096, 1626677248, 4, 0, - (long *)_vq_quantlist__44u2__p7_0, - 0 -}; - -static const long _vq_quantlist__44u2__p7_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u2__p7_1[] = { - 1, 4, 4, 7, 6, 7, 6, 8, 7, 9, 7, 9, 8, 4, 7, 6, - 8, 8, 9, 8,10, 9,10,10,11,11, 4, 7, 7, 8, 8, 8, - 8, 9,10,11,11,11,11, 6, 8, 8,10,10,10,10,11,11, - 12,12,12,12, 7, 8, 8,10,10,10,10,11,11,12,12,13, - 13, 7, 9, 9,11,10,12,12,13,13,14,13,14,14, 7, 9, - 9,10,11,11,12,13,13,13,13,16,14, 9,10,10,12,12, - 13,13,14,14,15,16,15,16, 9,10,10,12,12,12,13,14, - 14,14,15,16,15,10,12,12,13,13,15,13,16,16,15,17, - 17,17,10,11,11,12,14,14,14,15,15,17,17,15,17,11, - 12,12,14,14,14,15,15,15,17,16,17,17,10,12,12,13, - 14,14,14,17,15,17,17,17,17, -}; - -static const static_codebook _44u2__p7_1 = { - 2, 169, - (long *)_vq_lengthlist__44u2__p7_1, - 1, -523010048, 1618608128, 4, 0, - (long *)_vq_quantlist__44u2__p7_1, - 0 -}; - -static const long _vq_quantlist__44u2__p7_2[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u2__p7_2[] = { - 2, 5, 5, 6, 6, 7, 7, 8, 7, 8, 8, 8, 8, 5, 6, 6, - 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 5, 6, 6, 7, 7, 8, - 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, 8, 8, 8, 8, 8, - 9, 9, 9, 9, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 7, 8, - 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static const static_codebook _44u2__p7_2 = { - 2, 169, - (long *)_vq_lengthlist__44u2__p7_2, - 1, -531103744, 1611661312, 4, 0, - (long *)_vq_quantlist__44u2__p7_2, - 0 -}; - -static const long _huff_lengthlist__44u2__short[] = { - 13,15,17,17,15,15,12,17,11, 9, 7,10,10, 9,12,17, - 10, 6, 3, 6, 5, 7,10,17,15,10, 6, 9, 8, 9,11,17, - 15, 8, 4, 7, 3, 5, 9,16,16,10, 5, 8, 4, 5, 8,16, - 13,11, 5, 8, 3, 3, 5,14,13,12, 7,10, 5, 5, 7,14, -}; - -static const static_codebook _huff_book__44u2__short = { - 2, 64, - (long *)_huff_lengthlist__44u2__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u3__long[] = { - 6, 9,13,12,14,11,10,13, 8, 4, 5, 7, 8, 7, 8,12, - 11, 4, 3, 5, 5, 7, 9,14,11, 6, 5, 6, 6, 6, 7,13, - 13, 7, 5, 6, 4, 5, 7,14,11, 7, 6, 6, 5, 5, 6,13, - 9, 7, 8, 6, 7, 5, 3, 9, 9,12,13,12,14,10, 6, 7, -}; - -static const static_codebook _huff_book__44u3__long = { - 2, 64, - (long *)_huff_lengthlist__44u3__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u3__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u3__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,10,11, 8, - 10,11, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, - 11, 8,11,11, 8,11,11,11,13,14,11,14,14, 8,11,11, - 10,14,12,11,14,14, 4, 8, 8, 8,11,11, 8,11,11, 7, - 11,11,11,14,14,10,12,14, 8,11,11,11,14,14,11,14, - 13, -}; - -static const static_codebook _44u3__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44u3__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u3__p1_0, - 0 -}; - -static const long _vq_quantlist__44u3__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u3__p2_0[] = { - 2, 5, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 7, 8, 8, 6, - 8, 8, 5, 6, 6, 6, 8, 8, 7, 8, 8, 5, 7, 6, 7, 8, - 8, 6, 8, 8, 7, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, - 8,10, 8, 8,10,10, 5, 6, 6, 6, 8, 8, 7, 8, 8, 6, - 8, 8, 8,10,10, 8, 8,10, 7, 8, 8, 8,10,10, 8,10, - 9, -}; - -static const static_codebook _44u3__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__44u3__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u3__p2_0, - 0 -}; - -static const long _vq_quantlist__44u3__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u3__p3_0[] = { - 2, 4, 4, 7, 7, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 8, - 9, 9,12,12, 8, 9, 9,11,12, 5, 7, 7,10,10, 7, 9, - 9,11,11, 7, 9, 9,10,11,10,11,11,13,13, 9,10,11, - 13,13, 5, 7, 7,10,10, 7, 9, 9,11,10, 7, 9, 9,11, - 11, 9,11,10,13,13,10,11,11,14,13, 8,10,10,14,13, - 10,11,11,15,14, 9,11,11,14,14,13,14,13,16,16,12, - 13,13,15,15, 8,10,10,13,14, 9,11,11,14,14,10,11, - 11,14,15,12,13,13,15,15,13,14,14,15,16, 5, 7, 7, - 10,10, 7, 9, 9,11,11, 7, 9, 9,11,12,10,11,11,14, - 14,10,11,11,14,14, 7, 9, 9,12,12, 9,11,11,13,13, - 9,11,11,13,13,12,12,13,15,15,11,12,13,15,16, 7, - 9, 9,11,11, 8,11,10,13,12, 9,11,11,13,13,11,13, - 12,15,13,11,13,13,15,16, 9,12,11,15,14,11,12,13, - 16,15,11,13,13,15,16,14,14,15,17,16,13,15,16, 0, - 17, 9,11,11,15,15,10,13,12,15,15,11,13,13,15,16, - 13,15,13,16,15,14,16,15, 0,19, 5, 7, 7,10,10, 7, - 9, 9,11,11, 7, 9, 9,11,11,10,12,11,14,14,10,11, - 12,14,14, 7, 9, 9,12,12, 9,11,11,14,13, 9,10,11, - 12,13,11,13,13,16,16,11,12,13,13,16, 7, 9, 9,12, - 12, 9,11,11,13,13, 9,11,11,13,13,11,13,13,15,15, - 12,13,12,15,14, 9,11,11,15,14,11,13,12,16,16,10, - 12,12,15,15,13,15,15,17,19,13,14,15,16,17,10,12, - 12,15,15,11,13,13,16,16,11,13,13,15,16,13,15,15, - 0, 0,14,15,15,16,16, 8,10,10,14,14,10,12,12,15, - 15,10,12,11,15,16,14,15,15,19,20,13,14,14,18,16, - 9,11,11,15,15,11,13,13,17,16,11,13,13,16,16,15, - 17,17,20,20,14,15,16,17,20, 9,11,11,15,15,10,13, - 12,16,15,11,13,13,15,17,14,16,15,18, 0,14,16,15, - 18,20,12,14,14, 0, 0,14,14,16, 0, 0,13,16,15, 0, - 0,17,17,18, 0, 0,16,17,19,19, 0,12,14,14,18, 0, - 12,16,14, 0,17,13,15,15,18, 0,16,18,17, 0,17,16, - 18,17, 0, 0, 7,10,10,14,14,10,12,11,15,15,10,12, - 12,16,15,13,15,15,18, 0,14,15,15,17, 0, 9,11,11, - 15,15,11,13,13,16,16,11,12,13,16,16,14,15,16,17, - 17,14,16,16,16,18, 9,11,12,16,16,11,13,13,17,17, - 11,14,13,20,17,15,16,16,19, 0,15,16,17, 0,19,11, - 13,14,17,16,14,15,15,20,18,13,14,15,17,19,16,18, - 18, 0,20,16,16,19,17, 0,12,15,14,17, 0,14,15,15, - 18,19,13,16,15,19,20,15,18,18, 0,20,17, 0,16, 0, - 0, -}; - -static const static_codebook _44u3__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44u3__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u3__p3_0, - 0 -}; - -static const long _vq_quantlist__44u3__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u3__p4_0[] = { - 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 9, - 9, 9,11,11, 9, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 7, 8,10,10, 9,10,10,11,12, 9,10,10, - 11,12, 5, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 8,10, - 10, 9,10, 9,12,11, 9,10,10,12,11, 9,10, 9,12,12, - 9,10,10,13,12, 9,10,10,12,13,12,12,12,14,14,11, - 12,12,13,14, 9, 9,10,12,12, 9,10,10,12,12, 9,10, - 10,12,13,11,12,11,14,13,12,12,12,14,13, 5, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, - 12, 9,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,11,11, - 8, 9, 9,11,11,11,11,11,12,13,10,11,11,13,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,11,10,11,11,13,13, 9,11,10,13,12,10,11,11, - 13,13,10,11,11,13,13,12,12,13,12,15,12,13,13,15, - 15, 9,10,10,12,13,10,11,10,13,12,10,11,11,13,14, - 12,13,11,15,13,12,13,13,15,15, 5, 7, 7, 9, 9, 7, - 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12,10,10, - 11,12,12, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,13,13,10,10,11,11,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,11,13,13, - 11,11,11,13,12, 9,10,10,13,12,10,11,11,14,13,10, - 10,11,12,13,12,13,13,15,15,12,11,13,13,14, 9,10, - 11,12,13,10,11,11,13,13,10,11,11,13,13,12,13,13, - 15,15,12,13,12,15,12, 8, 9, 9,12,12, 9,11,10,13, - 13, 9,10,10,13,13,12,13,13,15,14,12,12,12,14,13, - 9,10,10,13,12,10,11,11,13,13,10,11,11,14,12,13, - 13,14,14,16,12,13,13,15,15, 9,10,10,13,13,10,11, - 10,14,13,10,11,11,13,14,12,14,13,15,14,13,13,13, - 15,15,11,13,12,15,14,11,12,13,14,15,12,13,13,16, - 14,14,12,15,12,16,14,15,15,17,15,11,12,12,14,14, - 11,13,11,15,14,12,13,13,15,15,13,15,12,17,13,14, - 15,15,16,16, 8, 9, 9,12,12, 9,10,10,12,13, 9,10, - 10,13,13,12,12,12,14,14,12,13,13,15,15, 9,10,10, - 13,12,10,11,11,14,13,10,10,11,13,14,12,13,13,15, - 15,12,12,13,14,16, 9,10,10,13,13,10,11,11,13,14, - 10,11,11,14,13,12,13,13,14,15,13,14,13,16,14,11, - 12,12,14,14,12,13,13,15,14,11,12,13,14,15,14,15, - 15,16,16,13,13,15,13,16,11,12,12,14,15,12,13,13, - 14,15,11,13,12,15,14,14,15,15,16,16,14,15,12,16, - 13, -}; - -static const static_codebook _44u3__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__44u3__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u3__p4_0, - 0 -}; - -static const long _vq_quantlist__44u3__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u3__p5_0[] = { - 2, 3, 3, 6, 6, 7, 7, 9, 9, 4, 5, 5, 7, 7, 8, 8, - 10,10, 4, 5, 5, 7, 7, 8, 8,10,10, 6, 7, 7, 8, 8, - 9, 9,11,10, 6, 7, 7, 8, 8, 9, 9,10,10, 7, 8, 8, - 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 10,10,11,10,11,11,12,12, 9,10,10,10,10,11,11,12, - 12, -}; - -static const static_codebook _44u3__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44u3__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u3__p5_0, - 0 -}; - -static const long _vq_quantlist__44u3__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u3__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9,10,11,13,14, 4, 6, 5, - 8, 8, 9, 9,10,10,11,11,14,14, 4, 6, 6, 8, 8, 9, - 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, - 12,12,15,15, 6, 8, 8, 9, 9,10,11,11,11,12,12,15, - 15, 8, 9, 9,11,10,11,11,12,12,13,13,15,16, 8, 9, - 9,10,11,11,11,12,12,13,13,16,16,10,10,11,11,11, - 12,12,13,13,13,14,17,16, 9,10,11,12,11,12,12,13, - 13,13,13,16,18,11,12,11,12,12,13,13,13,14,15,14, - 17,17,11,11,12,12,12,13,13,13,14,14,15,18,17,14, - 15,15,15,15,16,16,17,17,19,18, 0,20,14,15,14,15, - 15,16,16,16,17,18,16,20,18, -}; - -static const static_codebook _44u3__p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44u3__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u3__p6_0, - 0 -}; - -static const long _vq_quantlist__44u3__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u3__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, - 6, 5, 6, 6, 5, 5, 6, 6, 6, -}; - -static const static_codebook _44u3__p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44u3__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u3__p6_1, - 0 -}; - -static const long _vq_quantlist__44u3__p7_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u3__p7_0[] = { - 1, 3, 3,10,10,10,10,10,10, 4,10,10,10,10,10,10, - 10,10, 4,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, -}; - -static const static_codebook _44u3__p7_0 = { - 2, 81, - (long *)_vq_lengthlist__44u3__p7_0, - 1, -515907584, 1627381760, 4, 0, - (long *)_vq_quantlist__44u3__p7_0, - 0 -}; - -static const long _vq_quantlist__44u3__p7_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44u3__p7_1[] = { - 1, 4, 4, 6, 6, 7, 6, 8, 7, 9, 8,10, 9,11,11, 4, - 7, 7, 8, 7, 9, 9,10,10,11,11,11,11,12,12, 4, 7, - 7, 7, 7, 9, 9,10,10,11,11,12,12,12,11, 6, 8, 8, - 9, 9,10,10,11,11,12,12,13,12,13,13, 6, 8, 8, 9, - 9,10,11,11,11,12,12,13,14,13,13, 8, 9, 9,11,11, - 12,12,12,13,14,13,14,14,14,15, 8, 9, 9,11,11,11, - 12,13,14,13,14,15,17,14,15, 9,10,10,12,12,13,13, - 13,14,15,15,15,16,16,16, 9,11,11,12,12,13,13,14, - 14,14,15,16,16,16,16,10,12,12,13,13,14,14,15,15, - 15,16,17,17,17,17,10,12,11,13,13,15,14,15,14,16, - 17,16,16,16,16,11,13,12,14,14,14,14,15,16,17,16, - 17,17,17,17,11,13,12,14,14,14,15,17,16,17,17,17, - 17,17,17,12,13,13,15,16,15,16,17,17,16,16,17,17, - 17,17,12,13,13,15,15,15,16,17,17,17,16,17,16,17, - 17, -}; - -static const static_codebook _44u3__p7_1 = { - 2, 225, - (long *)_vq_lengthlist__44u3__p7_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__44u3__p7_1, - 0 -}; - -static const long _vq_quantlist__44u3__p7_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44u3__p7_2[] = { - 2, 5, 5, 7, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 10,10, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, - 9,10, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 10,10,10,10, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10, - 9,10,10,10,10, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10, 7, 8, 8, 9, 8, 9, 9, 9, 9,10, - 9,10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10,10, 8, 9, 8, 9, 9, 9, 9,10, - 9,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9,10, - 9,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, - 9,10,10,10,10,10,10,10,10,10,10, 9, 9, 9,10, 9, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,11, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,11, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9,10,10,10,10,10,10,10,10,10,10,10,11,11,11,10, - 11, -}; - -static const static_codebook _44u3__p7_2 = { - 2, 289, - (long *)_vq_lengthlist__44u3__p7_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u3__p7_2, - 0 -}; - -static const long _huff_lengthlist__44u3__short[] = { - 14,14,14,15,13,15,12,16,10, 8, 7, 9, 9, 8,12,16, - 10, 5, 4, 6, 5, 6, 9,16,14, 8, 6, 8, 7, 8,10,16, - 14, 7, 4, 6, 3, 5, 8,16,15, 9, 5, 7, 4, 4, 7,16, - 13,10, 6, 7, 4, 3, 4,13,13,12, 7, 9, 5, 5, 6,12, -}; - -static const static_codebook _huff_book__44u3__short = { - 2, 64, - (long *)_huff_lengthlist__44u3__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u4__long[] = { - 3, 8,12,12,13,12,11,13, 5, 4, 6, 7, 8, 8, 9,13, - 9, 5, 4, 5, 5, 7, 9,13, 9, 6, 5, 6, 6, 7, 8,12, - 12, 7, 5, 6, 4, 5, 8,13,11, 7, 6, 6, 5, 5, 6,12, - 10, 8, 8, 7, 7, 5, 3, 8,10,12,13,12,12, 9, 6, 7, -}; - -static const static_codebook _huff_book__44u4__long = { - 2, 64, - (long *)_huff_lengthlist__44u4__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u4__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u4__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,10,11, 8, - 10,11, 5, 8, 8, 8,11,10, 8,11,11, 4, 8, 8, 8,11, - 11, 8,11,11, 8,11,11,11,13,14,11,15,14, 8,11,11, - 10,13,12,11,14,14, 4, 8, 8, 8,11,11, 8,11,11, 7, - 11,11,11,15,14,10,12,14, 8,11,11,11,14,14,11,14, - 13, -}; - -static const static_codebook _44u4__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44u4__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u4__p1_0, - 0 -}; - -static const long _vq_quantlist__44u4__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u4__p2_0[] = { - 2, 5, 5, 5, 6, 6, 5, 6, 6, 5, 6, 6, 7, 8, 8, 6, - 8, 8, 5, 6, 6, 6, 8, 8, 7, 8, 8, 5, 7, 6, 6, 8, - 8, 6, 8, 8, 6, 8, 8, 8, 9,10, 8,10,10, 6, 8, 8, - 8,10, 8, 8,10,10, 5, 6, 6, 6, 8, 8, 6, 8, 8, 6, - 8, 8, 8,10,10, 8, 8,10, 6, 8, 8, 8,10,10, 8,10, - 9, -}; - -static const static_codebook _44u4__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__44u4__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u4__p2_0, - 0 -}; - -static const long _vq_quantlist__44u4__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u4__p3_0[] = { - 2, 4, 4, 8, 8, 5, 7, 7, 9, 9, 5, 7, 7, 9, 9, 8, - 10, 9,12,12, 8, 9,10,12,12, 5, 7, 7,10,10, 7, 9, - 9,11,11, 7, 9, 9,11,11,10,12,11,14,14, 9,10,11, - 13,14, 5, 7, 7,10,10, 7, 9, 9,11,11, 7, 9, 9,11, - 11, 9,11,10,14,13,10,11,11,14,14, 8,10,10,14,13, - 10,12,12,15,14, 9,11,11,15,14,13,14,14,17,17,12, - 14,14,16,16, 8,10,10,14,14, 9,11,11,14,15,10,12, - 12,14,15,12,14,13,16,16,13,14,15,15,18, 4, 7, 7, - 10,10, 7, 9, 9,12,11, 7, 9, 9,11,12,10,12,11,15, - 14,10,11,12,14,15, 7, 9, 9,12,12, 9,11,12,13,13, - 9,11,12,13,13,12,13,13,15,16,11,13,13,15,16, 7, - 9, 9,12,12, 9,11,10,13,12, 9,11,12,13,14,11,13, - 12,16,14,12,13,13,15,16,10,12,12,16,15,11,13,13, - 17,16,11,13,13,17,16,14,15,15,17,17,14,16,16,18, - 20, 9,11,11,15,16,11,13,12,16,16,11,13,13,16,17, - 14,15,14,18,16,14,16,16,17,20, 5, 7, 7,10,10, 7, - 9, 9,12,11, 7, 9,10,11,12,10,12,11,15,15,10,12, - 12,14,14, 7, 9, 9,12,12, 9,12,11,14,13, 9,10,11, - 12,13,12,13,14,16,16,11,12,13,14,16, 7, 9, 9,12, - 12, 9,12,11,13,13, 9,12,11,13,13,11,13,13,16,16, - 12,13,13,16,15, 9,11,11,16,14,11,13,13,16,16,11, - 12,13,16,16,14,16,16,17,17,13,14,15,16,17,10,12, - 12,15,15,11,13,13,16,17,11,13,13,16,16,14,16,15, - 19,19,14,15,15,17,18, 8,10,10,14,14,10,12,12,15, - 15,10,12,12,16,16,14,16,15,20,19,13,15,15,17,16, - 9,12,12,16,16,11,13,13,16,18,11,14,13,16,17,16, - 17,16,20, 0,15,16,18,18,20, 9,11,11,15,15,11,14, - 12,17,16,11,13,13,17,17,15,17,15,20,20,14,16,16, - 17, 0,13,15,14,18,16,14,15,16, 0,18,14,16,16, 0, - 0,18,16, 0, 0,20,16,18,18, 0, 0,12,14,14,17,18, - 13,15,14,20,18,14,16,15,19,19,16,20,16, 0,18,16, - 19,17,19, 0, 8,10,10,14,14,10,12,12,16,15,10,12, - 12,16,16,13,15,15,18,17,14,16,16,19, 0, 9,11,11, - 16,15,11,14,13,18,17,11,12,13,17,18,14,17,16,18, - 18,15,16,17,18,18, 9,12,12,16,16,11,13,13,16,18, - 11,14,13,17,17,15,16,16,18,20,16,17,17,20,20,12, - 14,14,18,17,14,16,16, 0,19,13,14,15,18, 0,16, 0, - 0, 0, 0,16,16, 0,19,20,13,15,14, 0, 0,14,16,16, - 18,19,14,16,15, 0,20,16,20,18, 0,20,17,20,17, 0, - 0, -}; - -static const static_codebook _44u4__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44u4__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u4__p3_0, - 0 -}; - -static const long _vq_quantlist__44u4__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u4__p4_0[] = { - 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 9, - 9, 9,11,11, 8, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 7, 8,10,10, 9,10,10,11,12, 9,10,10, - 11,12, 5, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 8,10, - 10, 9,10,10,12,11, 9,10,10,12,11, 9,10, 9,12,12, - 9,10,10,13,12, 9,10,10,12,12,12,12,12,14,14,11, - 12,12,13,14, 9, 9,10,12,12, 9,10,10,13,13, 9,10, - 10,12,13,11,12,12,14,13,11,12,12,14,14, 5, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10,10,10,10,12, - 12, 9,10,10,12,12, 7, 8, 8,11,10, 8, 8, 9,11,11, - 8, 9, 9,11,11,11,11,11,12,13,10,11,11,13,13, 6, - 8, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,11,10,11,11,13,13, 9,11,10,13,12,10,11,11, - 13,14,10,11,11,14,13,12,12,13,12,15,12,13,13,15, - 15, 9,10,10,12,13,10,11,10,13,12,10,11,11,13,14, - 12,13,11,15,13,13,13,13,15,15, 5, 7, 7, 9, 9, 7, - 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12,10,10, - 11,12,13, 6, 8, 8,10,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,13,13,10,10,11,11,13, 7, 8, 8,10, - 11, 8, 9, 9,11,11, 8, 9, 8,11,11,10,11,11,13,13, - 11,12,11,13,12, 9,10,10,13,12,10,11,11,14,13,10, - 10,11,12,13,12,13,13,15,15,12,11,13,13,14, 9,10, - 11,12,13,10,11,11,13,14,10,11,11,13,13,12,13,13, - 15,15,12,13,12,15,12, 8, 9, 9,12,12, 9,11,10,13, - 13, 9,10,10,13,13,12,13,13,15,15,12,12,12,14,14, - 9,10,10,13,13,10,11,11,13,14,10,11,11,14,13,13, - 13,14,14,16,13,13,13,15,15, 9,10,10,13,13,10,11, - 10,14,13,10,11,11,13,14,12,14,13,16,14,12,13,13, - 14,15,11,12,12,15,14,11,12,13,14,15,12,13,13,16, - 15,14,12,15,12,16,14,15,15,16,16,11,12,12,14,14, - 11,13,12,15,14,12,13,13,15,16,13,15,13,17,13,14, - 15,15,16,17, 8, 9, 9,12,12, 9,10,10,12,13, 9,10, - 10,13,13,12,12,12,14,14,12,13,13,15,15, 9,10,10, - 13,12,10,11,11,14,13,10,10,11,13,14,13,13,13,15, - 15,12,13,14,14,16, 9,10,10,13,13,10,11,11,13,14, - 10,11,11,14,14,13,13,13,15,15,13,14,13,16,14,11, - 12,12,15,14,12,13,13,16,15,11,12,13,14,15,14,15, - 15,17,16,13,13,15,13,16,11,12,13,14,15,13,13,13, - 15,16,11,13,12,15,14,14,15,15,16,16,14,15,12,17, - 13, -}; - -static const static_codebook _44u4__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__44u4__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u4__p4_0, - 0 -}; - -static const long _vq_quantlist__44u4__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u4__p5_0[] = { - 2, 3, 3, 6, 6, 7, 7, 9, 9, 4, 5, 5, 7, 7, 8, 8, - 10, 9, 4, 5, 5, 7, 7, 8, 8,10,10, 6, 7, 7, 8, 8, - 9, 9,11,10, 6, 7, 7, 8, 8, 9, 9,10,11, 7, 8, 8, - 9, 9,10,10,11,11, 7, 8, 8, 9, 9,10,10,11,11, 9, - 10,10,11,10,11,11,12,12, 9,10,10,10,11,11,11,12, - 12, -}; - -static const static_codebook _44u4__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44u4__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u4__p5_0, - 0 -}; - -static const long _vq_quantlist__44u4__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u4__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9,11,10,13,13, 4, 6, 5, - 8, 8, 9, 9,10,10,11,11,14,14, 4, 6, 6, 8, 8, 9, - 9,10,10,11,11,14,14, 6, 8, 8, 9, 9,10,10,11,11, - 12,12,15,15, 6, 8, 8, 9, 9,10,11,11,11,12,12,15, - 15, 8, 9, 9,11,10,11,11,12,12,13,13,16,16, 8, 9, - 9,10,10,11,11,12,12,13,13,16,16,10,10,10,12,11, - 12,12,13,13,14,14,16,16,10,10,10,11,12,12,12,13, - 13,13,14,16,17,11,12,11,12,12,13,13,14,14,15,14, - 18,17,11,11,12,12,12,13,13,14,14,14,15,19,18,14, - 15,14,15,15,17,16,17,17,17,17,21, 0,14,15,15,16, - 16,16,16,17,17,18,17,20,21, -}; - -static const static_codebook _44u4__p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44u4__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u4__p6_0, - 0 -}; - -static const long _vq_quantlist__44u4__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u4__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 6, 5, 4, 5, 5, 5, 6, 5, - 6, 5, 6, 6, 5, 5, 6, 6, 6, -}; - -static const static_codebook _44u4__p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44u4__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u4__p6_1, - 0 -}; - -static const long _vq_quantlist__44u4__p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u4__p7_0[] = { - 1, 3, 3,12,12,12,12,12,12,12,12,12,12, 3,12,11, - 12,12,12,12,12,12,12,12,12,12, 4,11,10,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11, -}; - -static const static_codebook _44u4__p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44u4__p7_0, - 1, -514332672, 1627381760, 4, 0, - (long *)_vq_quantlist__44u4__p7_0, - 0 -}; - -static const long _vq_quantlist__44u4__p7_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44u4__p7_1[] = { - 1, 4, 4, 6, 6, 7, 7, 9, 8,10, 8,10, 9,11,11, 4, - 7, 6, 8, 7, 9, 9,10,10,11,10,11,10,12,10, 4, 6, - 7, 8, 8, 9, 9,10,10,11,11,11,11,12,12, 6, 8, 8, - 10, 9,11,10,12,11,12,12,12,12,13,13, 6, 8, 8,10, - 10,10,11,11,11,12,12,13,12,13,13, 8, 9, 9,11,11, - 12,11,12,12,13,13,13,13,13,13, 8, 9, 9,11,11,11, - 12,12,12,13,13,13,13,13,13, 9,10,10,12,11,13,13, - 13,13,14,13,13,14,14,14, 9,10,11,11,12,12,13,13, - 13,13,13,14,15,14,14,10,11,11,12,12,13,13,14,14, - 14,14,14,15,16,16,10,11,11,12,13,13,13,13,15,14, - 14,15,16,15,16,10,12,12,13,13,14,14,14,15,15,15, - 15,15,15,16,11,12,12,13,13,14,14,14,15,15,15,16, - 15,17,16,11,12,12,13,13,13,15,15,14,16,16,16,16, - 16,17,11,12,12,13,13,14,14,15,14,15,15,17,17,16, - 16, -}; - -static const static_codebook _44u4__p7_1 = { - 2, 225, - (long *)_vq_lengthlist__44u4__p7_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__44u4__p7_1, - 0 -}; - -static const long _vq_quantlist__44u4__p7_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44u4__p7_2[] = { - 2, 5, 5, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 10,10,10,10, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9,10, - 9,10, 9,10,10, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9,10,10,10,10,10,10, 8, 9, 8, 9, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10,10, - 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,11,10,10,10, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, - 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9,10, 9,10,10,10,10,10,10,10,10,10,10,11,10,10, - 10, -}; - -static const static_codebook _44u4__p7_2 = { - 2, 289, - (long *)_vq_lengthlist__44u4__p7_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u4__p7_2, - 0 -}; - -static const long _huff_lengthlist__44u4__short[] = { - 14,17,15,17,16,14,13,16,10, 7, 7,10,13,10,15,16, - 9, 4, 4, 6, 5, 7, 9,16,12, 8, 7, 8, 8, 8,11,16, - 14, 7, 4, 6, 3, 5, 8,15,13, 8, 5, 7, 4, 5, 7,16, - 12, 9, 6, 8, 3, 3, 5,16,14,13, 7,10, 5, 5, 7,15, -}; - -static const static_codebook _huff_book__44u4__short = { - 2, 64, - (long *)_huff_lengthlist__44u4__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u5__long[] = { - 3, 8,13,12,14,12,16,11,13,14, 5, 4, 5, 6, 7, 8, - 10, 9,12,15,10, 5, 5, 5, 6, 8, 9, 9,13,15,10, 5, - 5, 6, 6, 7, 8, 8,11,13,12, 7, 5, 6, 4, 6, 7, 7, - 11,14,11, 7, 7, 6, 6, 6, 7, 6,10,14,14, 9, 8, 8, - 6, 7, 7, 7,11,16,11, 8, 8, 7, 6, 6, 7, 4, 7,12, - 10,10,12,10,10, 9,10, 5, 6, 9,10,12,15,13,14,14, - 14, 8, 7, 8, -}; - -static const static_codebook _huff_book__44u5__long = { - 2, 100, - (long *)_huff_lengthlist__44u5__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u5__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u5__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, - 9,10, 5, 8, 8, 7,10, 9, 8,10,10, 5, 8, 8, 8,10, - 10, 8,10,10, 8,10,10,10,12,13,10,13,13, 7,10,10, - 10,13,11,10,13,13, 4, 8, 8, 8,11,10, 8,10,10, 7, - 10,10,10,13,13,10,11,13, 8,10,11,10,13,13,10,13, - 12, -}; - -static const static_codebook _44u5__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44u5__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u5__p1_0, - 0 -}; - -static const long _vq_quantlist__44u5__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u5__p2_0[] = { - 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 8, 8, 6, - 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 8, 5, 6, 6, 6, 8, - 8, 6, 8, 8, 6, 8, 8, 8, 9, 9, 8, 9, 9, 6, 8, 7, - 7, 9, 8, 8, 9, 9, 5, 6, 6, 6, 8, 7, 6, 8, 8, 6, - 8, 7, 8, 9, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 8, 9, - 9, -}; - -static const static_codebook _44u5__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__44u5__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u5__p2_0, - 0 -}; - -static const long _vq_quantlist__44u5__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u5__p3_0[] = { - 2, 4, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, - 10, 9,13,12, 8, 9,10,12,12, 5, 7, 7,10,10, 7, 9, - 9,11,11, 6, 8, 9,11,11,10,11,11,14,14, 9,10,11, - 13,14, 5, 7, 7, 9,10, 7, 9, 8,11,11, 7, 9, 9,11, - 11, 9,11,10,14,13,10,11,11,14,14, 8,10,10,13,13, - 10,11,11,15,14, 9,11,11,14,14,13,14,14,17,16,12, - 13,13,15,16, 8,10,10,13,13, 9,11,11,14,15,10,11, - 11,14,15,12,14,13,16,16,13,15,14,15,17, 5, 7, 7, - 10,10, 7, 9, 9,11,11, 7, 9, 9,11,11,10,11,11,14, - 14,10,11,12,14,14, 7, 9, 9,12,11, 9,11,11,13,13, - 9,11,11,13,13,12,13,13,15,16,11,12,13,15,16, 6, - 9, 9,11,11, 8,11,10,13,12, 9,11,11,13,14,11,13, - 12,16,14,11,13,13,16,17,10,12,11,15,15,11,13,13, - 16,16,11,13,13,17,16,14,15,15,17,17,14,16,16,17, - 18, 9,11,11,14,15,10,12,12,15,15,11,13,13,16,17, - 13,15,13,17,15,14,15,16,18, 0, 5, 7, 7,10,10, 7, - 9, 9,11,11, 7, 9, 9,11,11,10,11,11,14,14,10,11, - 12,14,15, 6, 9, 9,12,11, 9,11,11,13,13, 8,10,11, - 12,13,11,13,13,16,15,11,12,13,14,15, 7, 9, 9,11, - 12, 9,11,11,13,13, 9,11,11,13,13,11,13,13,15,16, - 11,13,13,15,14, 9,11,11,15,14,11,13,13,17,15,10, - 12,12,15,15,14,16,16,17,17,13,13,15,15,17,10,11, - 12,15,15,11,13,13,16,16,11,13,13,15,15,14,15,15, - 18,18,14,15,15,17,17, 8,10,10,13,13,10,12,11,15, - 15,10,11,12,15,15,14,15,15,18,18,13,14,14,18,18, - 9,11,11,15,16,11,13,13,17,17,11,13,13,16,16,15, - 15,16,17, 0,14,15,17, 0, 0, 9,11,11,15,15,10,13, - 12,18,16,11,13,13,15,16,14,16,15,20,20,14,15,16, - 17, 0,13,14,14,20,16,14,15,16,19,18,14,15,15,19, - 0,18,16, 0,20,20,16,18,18, 0, 0,12,14,14,18,18, - 13,15,14,18,16,14,15,16,18,20,16,19,16, 0,17,17, - 18,18,19, 0, 8,10,10,14,14,10,11,11,14,15,10,11, - 12,15,15,13,15,14,19,17,13,15,15,17, 0, 9,11,11, - 16,15,11,13,13,16,16,10,12,13,15,17,14,16,16,18, - 18,14,15,15,18, 0, 9,11,11,15,15,11,13,13,16,17, - 11,13,13,18,17,14,18,16,18,18,15,17,17,18, 0,12, - 14,14,18,18,14,15,15,20, 0,13,14,15,17, 0,16,18, - 17, 0, 0,16,16, 0,17,20,12,14,14,18,18,14,16,15, - 0,18,14,16,15,18, 0,16,19,17, 0, 0,17,18,16, 0, - 0, -}; - -static const static_codebook _44u5__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44u5__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u5__p3_0, - 0 -}; - -static const long _vq_quantlist__44u5__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u5__p4_0[] = { - 4, 5, 5, 8, 8, 6, 7, 6, 9, 9, 6, 6, 7, 9, 9, 8, - 9, 9,11,11, 8, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 8, - 8,10,10, 6, 7, 8, 9,10, 9,10,10,11,12, 9, 9,10, - 11,12, 6, 7, 7, 9, 9, 6, 8, 7,10, 9, 7, 8, 8,10, - 10, 9,10, 9,12,11, 9,10,10,12,11, 8, 9, 9,12,11, - 9,10,10,12,12, 9,10,10,12,12,11,12,12,13,14,11, - 11,12,13,14, 8, 9, 9,11,12, 9,10,10,12,12, 9,10, - 10,12,12,11,12,11,14,13,11,12,12,13,13, 5, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12, - 12, 9,10,10,12,12, 7, 8, 8,10,10, 8, 8, 9,10,11, - 8, 9, 9,11,11,10,10,11,11,13,10,11,11,12,13, 6, - 7, 8,10,10, 7, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,11,10,11,11,12,12, 9,10,10,12,12,10,10,11, - 12,13,10,11,11,13,13,12,11,13,12,15,12,13,13,14, - 15, 9,10,10,12,12, 9,11,10,13,12,10,11,11,13,13, - 11,13,11,14,12,12,13,13,14,15, 5, 7, 7, 9, 9, 7, - 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12, 9,10, - 10,12,12, 6, 8, 7,10,10, 8, 9, 9,11,11, 7, 8, 9, - 10,11,10,11,11,12,12,10,10,11,11,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 8,11,10,10,11,11,13,12, - 10,11,10,13,11, 9,10,10,12,12,10,11,11,13,12, 9, - 10,10,12,13,12,13,13,14,15,11,11,13,12,14, 9,10, - 10,12,12,10,11,11,13,13,10,11,10,13,12,12,13,13, - 14,14,12,13,11,14,12, 8, 9, 9,12,12, 9,10,10,12, - 12, 9,10,10,12,12,12,12,12,14,14,11,12,12,14,13, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,12,12, - 12,13,14,15,12,13,13,15,14, 9,10,10,12,12,10,11, - 10,13,12,10,11,11,12,13,12,13,12,15,13,12,13,13, - 14,15,11,12,12,14,13,11,12,12,14,15,12,13,13,15, - 14,13,12,14,12,16,13,14,14,15,15,11,11,12,14,14, - 11,12,11,14,13,12,13,13,14,15,13,14,12,16,12,14, - 14,15,16,16, 8, 9, 9,11,12, 9,10,10,12,12, 9,10, - 10,12,13,11,12,12,13,13,12,12,13,14,14, 9,10,10, - 12,12,10,11,10,13,12,10,10,11,12,13,12,13,13,15, - 14,12,12,13,13,15, 9,10,10,12,13,10,11,11,12,13, - 10,11,11,13,13,12,13,13,14,15,12,13,12,15,14,11, - 12,11,14,13,12,13,13,15,14,11,11,12,13,14,14,15, - 14,16,15,13,12,14,13,16,11,12,12,13,14,12,13,13, - 14,15,11,12,11,14,14,14,14,14,15,16,13,15,12,16, - 12, -}; - -static const static_codebook _44u5__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__44u5__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u5__p4_0, - 0 -}; - -static const long _vq_quantlist__44u5__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u5__p5_0[] = { - 2, 3, 3, 6, 6, 8, 8,10,10, 4, 5, 5, 8, 7, 8, 8, - 11,10, 3, 5, 5, 7, 8, 8, 8,10,11, 6, 8, 7,10, 9, - 10,10,11,11, 6, 7, 8, 9, 9, 9,10,11,12, 8, 8, 8, - 10,10,11,11,13,12, 8, 8, 9, 9,10,11,11,12,13,10, - 11,10,12,11,13,12,14,14,10,10,11,11,12,12,13,14, - 14, -}; - -static const static_codebook _44u5__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44u5__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u5__p5_0, - 0 -}; - -static const long _vq_quantlist__44u5__p6_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u5__p6_0[] = { - 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 7, 7, - 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, - 8, 8,10,10, 6, 6, 6, 7, 7, 8, 8,10,10, 7, 7, 7, - 8, 8, 9, 9,11,10, 7, 7, 7, 8, 8, 9, 9,10,11, 9, - 9, 9,10,10,11,10,11,11, 9, 9, 9,10,10,11,10,11, - 11, -}; - -static const static_codebook _44u5__p6_0 = { - 2, 81, - (long *)_vq_lengthlist__44u5__p6_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u5__p6_0, - 0 -}; - -static const long _vq_quantlist__44u5__p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u5__p7_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 9, 8,11,10, 7, - 11,10, 5, 9, 9, 7,10,10, 8,10,11, 4, 9, 9, 9,12, - 12, 9,12,12, 8,12,12,11,12,12,10,12,13, 7,12,12, - 11,12,12,10,12,13, 4, 9, 9, 9,12,12, 9,12,12, 7, - 12,11,10,13,13,11,12,12, 7,12,12,10,13,13,11,12, - 12, -}; - -static const static_codebook _44u5__p7_0 = { - 4, 81, - (long *)_vq_lengthlist__44u5__p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44u5__p7_0, - 0 -}; - -static const long _vq_quantlist__44u5__p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u5__p7_1[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 7, 7, - 8, 8, 9, 8, 8, 9, 4, 5, 5, 7, 7, 8, 8, 9, 9, 8, - 9, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 6, 7, 7, 8, - 8, 9, 9, 9, 9, 9, 9, 7, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 7, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, - 9, 9, 9, 9,10,10,10,10, 8, 9, 9, 9, 9, 9, 9,10, - 10,10,10, 8, 9, 9, 9, 9, 9, 9,10,10,10,10, 8, 9, - 9, 9, 9, 9, 9,10,10,10,10, -}; - -static const static_codebook _44u5__p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44u5__p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u5__p7_1, - 0 -}; - -static const long _vq_quantlist__44u5__p8_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u5__p8_0[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9,10,10, 4, 6, 6, 7, 7, - 9, 9,10,10,11,11, 4, 6, 6, 7, 7, 9, 9,10,10,11, - 11, 6, 8, 7, 9, 9,10,10,11,11,13,12, 6, 8, 8, 9, - 9,10,10,11,11,12,13, 8, 9, 9,10,10,12,12,13,12, - 14,13, 8, 9, 9,10,10,12,12,13,13,14,14, 9,11,11, - 12,12,13,13,14,14,15,14, 9,11,11,12,12,13,13,14, - 14,15,14,11,12,12,13,13,14,14,15,14,15,14,11,11, - 12,13,13,14,14,14,14,15,15, -}; - -static const static_codebook _44u5__p8_0 = { - 2, 121, - (long *)_vq_lengthlist__44u5__p8_0, - 1, -524582912, 1618345984, 4, 0, - (long *)_vq_quantlist__44u5__p8_0, - 0 -}; - -static const long _vq_quantlist__44u5__p8_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u5__p8_1[] = { - 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 5, 7, 6, - 7, 7, 8, 8, 8, 8, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, - 8, 6, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8, 6, 6, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44u5__p8_1 = { - 2, 121, - (long *)_vq_lengthlist__44u5__p8_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u5__p8_1, - 0 -}; - -static const long _vq_quantlist__44u5__p9_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u5__p9_0[] = { - 1, 3, 2,12,10,13,13,13,13,13,13,13,13, 4, 9, 9, - 13,13,13,13,13,13,13,13,13,13, 5,10, 9,13,13,13, - 13,13,13,13,13,13,13,12,13,13,13,13,13,13,13,13, - 13,13,13,13,11,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12, -}; - -static const static_codebook _44u5__p9_0 = { - 2, 169, - (long *)_vq_lengthlist__44u5__p9_0, - 1, -514332672, 1627381760, 4, 0, - (long *)_vq_quantlist__44u5__p9_0, - 0 -}; - -static const long _vq_quantlist__44u5__p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44u5__p9_1[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 7, 8, 7, 9, 8, 9, 9, 4, - 7, 6, 9, 8,10,10, 9, 8, 9, 9, 9, 9, 9, 8, 5, 6, - 6, 8, 9,10,10, 9, 9, 9,10,10,10,10,11, 7, 8, 8, - 10,10,11,11,10,10,11,11,11,12,11,11, 7, 8, 8,10, - 10,11,11,10,10,11,11,12,11,11,11, 8, 9, 9,11,11, - 12,12,11,11,12,11,12,12,12,12, 8, 9,10,11,11,12, - 12,11,11,12,12,12,12,12,12, 8, 9, 9,10,10,12,11, - 12,12,12,12,12,12,12,13, 8, 9, 9,11,11,11,11,12, - 12,12,12,13,12,13,13, 9,10,10,11,11,12,12,12,13, - 12,13,13,13,14,13, 9,10,10,11,11,12,12,12,13,13, - 12,13,13,14,13, 9,11,10,12,11,13,12,12,13,13,13, - 13,13,13,14, 9,10,10,12,12,12,12,12,13,13,13,13, - 13,14,14,10,11,11,12,12,12,13,13,13,14,14,13,14, - 14,14,10,11,11,12,12,12,12,13,12,13,14,13,14,14, - 14, -}; - -static const static_codebook _44u5__p9_1 = { - 2, 225, - (long *)_vq_lengthlist__44u5__p9_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__44u5__p9_1, - 0 -}; - -static const long _vq_quantlist__44u5__p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44u5__p9_2[] = { - 2, 5, 5, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 5, 6, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 5, 6, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 7, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 7, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9,10, 9,10,10,10, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, - 9, 9,10, 9,10, 9,10, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10, 9,10,10,10,10,10, 8, 9, 9, 9, 9, 9, 9,10, - 9,10, 9,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, 9, - 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, - 9,10, 9,10, 9,10,10,10,10,10,10, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 9, 9,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 9,10,10, 9,10,10,10,10,10,10,10,10,10,10, 9, 9, - 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 9, 9, 9,10, 9,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _44u5__p9_2 = { - 2, 289, - (long *)_vq_lengthlist__44u5__p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u5__p9_2, - 0 -}; - -static const long _huff_lengthlist__44u5__short[] = { - 4,10,17,13,17,13,17,17,17,17, 3, 6, 8, 9,11, 9, - 15,12,16,17, 6, 5, 5, 7, 7, 8,10,11,17,17, 7, 8, - 7, 9, 9,10,13,13,17,17, 8, 6, 5, 7, 4, 7, 5, 8, - 14,17, 9, 9, 8, 9, 7, 9, 8,10,16,17,12,10, 7, 8, - 4, 7, 4, 7,16,17,12,11, 9,10, 6, 9, 5, 7,14,17, - 14,13,10,15, 4, 8, 3, 5,14,17,17,14,11,15, 6,10, - 6, 8,15,17, -}; - -static const static_codebook _huff_book__44u5__short = { - 2, 100, - (long *)_huff_lengthlist__44u5__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u6__long[] = { - 3, 9,14,13,14,13,16,12,13,14, 5, 4, 6, 6, 8, 9, - 11,10,12,15,10, 5, 5, 6, 6, 8,10,10,13,16,10, 6, - 6, 6, 6, 8, 9, 9,12,14,13, 7, 6, 6, 4, 6, 6, 7, - 11,14,10, 7, 7, 7, 6, 6, 6, 7,10,13,15,10, 9, 8, - 5, 6, 5, 6,10,14,10, 9, 8, 8, 6, 6, 5, 4, 6,11, - 11,11,12,11,10, 9, 9, 5, 5, 9,10,12,15,13,13,13, - 13, 8, 7, 7, -}; - -static const static_codebook _huff_book__44u6__long = { - 2, 100, - (long *)_huff_lengthlist__44u6__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u6__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u6__p1_0[] = { - 1, 4, 4, 4, 8, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, - 9,10, 5, 8, 8, 7,10, 9, 8,10,10, 5, 8, 8, 8,10, - 10, 8,10,10, 8,10,10,10,12,13,10,13,13, 7,10,10, - 10,13,11,10,13,13, 5, 8, 8, 8,11,10, 8,10,10, 7, - 10,10,10,13,13,10,11,13, 8,10,11,10,13,13,10,13, - 12, -}; - -static const static_codebook _44u6__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44u6__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u6__p1_0, - 0 -}; - -static const long _vq_quantlist__44u6__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u6__p2_0[] = { - 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 8, 8, 6, - 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 8, 5, 6, 6, 6, 8, - 8, 6, 8, 8, 6, 8, 8, 8, 9, 9, 8, 9, 9, 6, 7, 7, - 7, 9, 8, 8, 9, 9, 5, 6, 6, 6, 8, 7, 6, 8, 8, 6, - 8, 8, 8, 9, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 8, 9, - 9, -}; - -static const static_codebook _44u6__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__44u6__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u6__p2_0, - 0 -}; - -static const long _vq_quantlist__44u6__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u6__p3_0[] = { - 2, 5, 4, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, - 9, 9,13,12, 8, 9,10,12,13, 5, 7, 7,10, 9, 7, 9, - 9,11,11, 7, 8, 9,11,11,10,11,11,14,14, 9,10,11, - 13,14, 5, 7, 7, 9,10, 6, 9, 8,11,11, 7, 9, 9,11, - 11, 9,11,10,14,13,10,11,11,14,13, 8,10,10,13,13, - 10,11,11,15,15, 9,11,11,14,14,13,14,14,17,16,12, - 13,14,16,16, 8,10,10,13,14, 9,11,11,14,15,10,11, - 12,14,15,12,14,13,16,15,13,14,14,15,17, 5, 7, 7, - 10,10, 7, 9, 9,11,11, 7, 9, 9,11,11,10,12,11,14, - 14,10,11,11,14,14, 7, 9, 9,12,11, 9,11,11,13,13, - 9,11,11,13,13,11,13,13,14,15,11,12,13,15,16, 6, - 9, 9,11,12, 8,11,10,13,12, 9,11,11,13,14,11,13, - 12,16,14,11,13,13,15,16,10,12,11,14,15,11,13,13, - 15,17,11,13,13,17,16,15,15,16,17,16,14,15,16,18, - 0, 9,11,11,14,15,10,12,12,16,15,11,13,13,16,16, - 13,15,14,18,15,14,16,16, 0, 0, 5, 7, 7,10,10, 7, - 9, 9,11,11, 7, 9, 9,11,11,10,11,11,14,14,10,11, - 12,14,14, 6, 9, 9,11,11, 9,11,11,13,13, 8,10,11, - 12,13,11,13,13,16,15,11,12,13,14,16, 7, 9, 9,11, - 12, 9,11,11,13,13, 9,11,11,13,13,11,13,13,16,15, - 11,13,12,15,15, 9,11,11,15,14,11,13,13,17,16,10, - 12,13,15,16,14,16,16, 0,18,14,14,15,15,17,10,11, - 12,15,15,11,13,13,16,16,11,13,13,16,16,14,16,16, - 19,17,14,15,15,17,17, 8,10,10,14,14,10,12,11,15, - 15,10,11,12,16,15,14,15,15,18,20,13,14,16,17,18, - 9,11,11,15,16,11,13,13,17,17,11,13,13,17,16,15, - 16,16, 0, 0,15,16,16, 0, 0, 9,11,11,15,15,10,13, - 12,17,15,11,13,13,17,16,15,17,15,20,19,15,16,16, - 19, 0,13,15,14, 0,17,14,15,16, 0,20,15,16,16, 0, - 19,17,18, 0, 0, 0,16,17,18, 0, 0,12,14,14,19,18, - 13,15,14, 0,17,14,15,16,19,19,16,18,16, 0,19,19, - 20,17,20, 0, 8,10,10,13,14,10,11,11,15,15,10,12, - 12,15,16,14,15,14,19,16,14,15,15, 0,18, 9,11,11, - 16,15,11,13,13, 0,16,11,12,13,16,17,14,16,17, 0, - 19,15,16,16,18, 0, 9,11,11,15,16,11,13,13,16,16, - 11,14,13,18,17,15,16,16,18,20,15,17,19, 0, 0,12, - 14,14,17,17,14,16,15, 0, 0,13,14,15,19, 0,16,18, - 20, 0, 0,16,16,18,18, 0,12,14,14,17,20,14,16,16, - 19, 0,14,16,14, 0,20,16,20,17, 0, 0,17, 0,15, 0, - 19, -}; - -static const static_codebook _44u6__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44u6__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u6__p3_0, - 0 -}; - -static const long _vq_quantlist__44u6__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u6__p4_0[] = { - 4, 5, 5, 8, 8, 6, 7, 6, 9, 9, 6, 6, 7, 9, 9, 8, - 9, 9,11,11, 8, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 7, 8, 9,10, 9,10,10,11,11, 9, 9,10, - 11,12, 6, 7, 7, 9, 9, 7, 8, 7,10, 9, 7, 8, 8,10, - 10, 9,10, 9,12,11, 9,10,10,12,11, 8, 9, 9,11,11, - 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,13,11, - 11,12,13,13, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,11,13,12,11,12,12,13,13, 5, 7, 7, - 9, 9, 7, 8, 7,10,10, 7, 7, 8,10,10, 9,10,10,12, - 11, 9,10,10,11,12, 7, 8, 8,10,10, 8, 8, 9,11,11, - 8, 9, 9,11,11,10,10,11,12,13,10,10,11,12,12, 6, - 7, 7,10,10, 7, 9, 8,11,10, 8, 8, 9,10,11,10,11, - 10,13,11,10,11,11,12,12, 9,10,10,12,12,10,10,11, - 13,13,10,11,11,12,13,12,12,12,13,14,12,12,13,14, - 14, 9,10,10,12,12, 9,10,10,13,12,10,11,11,13,13, - 11,12,11,14,12,12,13,13,14,14, 6, 7, 7, 9, 9, 7, - 8, 7,10,10, 7, 8, 8,10,10, 9,10,10,12,11, 9,10, - 10,11,12, 6, 7, 7,10,10, 8, 9, 8,11,10, 7, 8, 9, - 10,11,10,11,11,12,12,10,10,11,11,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 8,11,11,10,11,10,13,12, - 10,11,11,13,12, 9,10,10,12,12,10,11,11,13,12, 9, - 10,10,12,13,12,13,12,14,14,11,11,12,12,14, 9,10, - 10,12,12,10,11,11,13,13,10,11,10,13,12,12,12,12, - 14,14,12,13,12,14,13, 8, 9, 9,11,11, 9,10,10,12, - 12, 9,10,10,12,12,11,12,12,14,13,11,12,12,13,14, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, - 12,13,14,15,12,12,13,14,14, 9,10,10,12,12, 9,11, - 10,13,12,10,10,11,12,13,12,13,12,14,13,12,12,13, - 14,15,11,12,12,14,13,11,12,12,14,14,12,13,13,14, - 14,13,13,14,14,16,13,14,14,15,15,11,12,11,13,13, - 11,12,11,14,13,12,12,13,14,15,12,14,12,15,12,13, - 14,15,15,16, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,12,14,13,11,12,12,13,13, 9,10,10, - 12,12,10,11,10,13,12, 9,10,11,12,13,12,13,12,14, - 14,12,12,13,13,14, 9,10,10,12,12,10,11,11,13,13, - 10,11,11,13,13,12,13,12,14,14,12,13,13,14,14,11, - 11,11,13,13,12,13,12,14,14,11,11,12,13,14,14,14, - 14,16,15,12,12,14,12,15,11,12,12,13,14,12,13,13, - 14,15,11,12,12,14,14,13,14,14,16,16,13,14,13,16, - 13, -}; - -static const static_codebook _44u6__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__44u6__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u6__p4_0, - 0 -}; - -static const long _vq_quantlist__44u6__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u6__p5_0[] = { - 2, 3, 3, 6, 6, 8, 8,10,10, 4, 5, 5, 8, 7, 8, 8, - 11,11, 3, 5, 5, 7, 8, 8, 8,11,11, 6, 8, 7, 9, 9, - 10, 9,12,11, 6, 7, 8, 9, 9, 9,10,11,12, 8, 8, 8, - 10, 9,12,11,13,13, 8, 8, 9, 9,10,11,12,13,13,10, - 11,11,12,12,13,13,14,14,10,10,11,11,12,13,13,14, - 14, -}; - -static const static_codebook _44u6__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44u6__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u6__p5_0, - 0 -}; - -static const long _vq_quantlist__44u6__p6_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u6__p6_0[] = { - 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 7, 7, - 9, 9, 4, 4, 5, 6, 6, 7, 8, 9, 9, 5, 6, 6, 7, 7, - 8, 8,10,10, 5, 6, 6, 7, 7, 8, 8,10,10, 7, 8, 7, - 8, 8,10, 9,11,11, 7, 7, 8, 8, 8, 9,10,10,11, 9, - 9, 9,10,10,11,11,12,11, 9, 9, 9,10,10,11,11,11, - 12, -}; - -static const static_codebook _44u6__p6_0 = { - 2, 81, - (long *)_vq_lengthlist__44u6__p6_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u6__p6_0, - 0 -}; - -static const long _vq_quantlist__44u6__p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u6__p7_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 8, 7,10,10, 8, - 10,10, 5, 8, 9, 7,10,10, 7,10, 9, 4, 8, 8, 9,11, - 11, 8,11,11, 7,11,11,10,10,13,10,13,13, 7,11,11, - 10,13,12,10,13,13, 5, 9, 8, 8,11,11, 9,11,11, 7, - 11,11,10,13,13,10,12,13, 7,11,11,10,13,13, 9,13, - 10, -}; - -static const static_codebook _44u6__p7_0 = { - 4, 81, - (long *)_vq_lengthlist__44u6__p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44u6__p7_0, - 0 -}; - -static const long _vq_quantlist__44u6__p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u6__p7_1[] = { - 3, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 7, 6, - 8, 8, 8, 8, 8, 8, 4, 5, 5, 6, 7, 8, 8, 8, 8, 8, - 8, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, - 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, -}; - -static const static_codebook _44u6__p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44u6__p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u6__p7_1, - 0 -}; - -static const long _vq_quantlist__44u6__p8_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u6__p8_0[] = { - 1, 4, 4, 6, 6, 8, 8, 9, 9,10,10, 4, 6, 6, 7, 7, - 9, 9,10,10,11,11, 4, 6, 6, 7, 7, 9, 9,10,10,11, - 11, 6, 8, 8, 9, 9,10,10,11,11,12,12, 6, 8, 8, 9, - 9,10,10,11,11,12,12, 8, 9, 9,10,10,11,11,12,12, - 13,13, 8, 9, 9,10,10,11,11,12,12,13,13,10,10,10, - 11,11,13,13,13,13,15,14, 9,10,10,12,11,12,13,13, - 13,14,15,11,12,12,13,13,13,13,15,14,15,15,11,11, - 12,13,13,14,14,14,15,15,15, -}; - -static const static_codebook _44u6__p8_0 = { - 2, 121, - (long *)_vq_lengthlist__44u6__p8_0, - 1, -524582912, 1618345984, 4, 0, - (long *)_vq_quantlist__44u6__p8_0, - 0 -}; - -static const long _vq_quantlist__44u6__p8_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u6__p8_1[] = { - 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 5, 7, 7, - 7, 7, 8, 7, 8, 8, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, - 8, 6, 7, 7, 7, 7, 8, 7, 8, 8, 8, 8, 6, 6, 7, 7, - 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44u6__p8_1 = { - 2, 121, - (long *)_vq_lengthlist__44u6__p8_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u6__p8_1, - 0 -}; - -static const long _vq_quantlist__44u6__p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44u6__p9_0[] = { - 1, 3, 2, 9, 8,15,15,15,15,15,15,15,15,15,15, 4, - 8, 9,13,14,14,14,14,14,14,14,14,14,14,14, 5, 8, - 9,14,14,14,14,14,14,14,14,14,14,14,14,11,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,11,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14, -}; - -static const static_codebook _44u6__p9_0 = { - 2, 225, - (long *)_vq_lengthlist__44u6__p9_0, - 1, -514071552, 1627381760, 4, 0, - (long *)_vq_quantlist__44u6__p9_0, - 0 -}; - -static const long _vq_quantlist__44u6__p9_1[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44u6__p9_1[] = { - 1, 4, 4, 7, 7, 8, 9, 8, 8, 9, 8, 9, 8, 9, 9, 4, - 7, 6, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 7, - 6, 9, 9,10,10, 9, 9,10,10,10,10,11,11, 7, 9, 8, - 10,10,11,11,10,10,11,11,11,11,11,11, 7, 8, 9,10, - 10,11,11,10,10,11,11,11,11,11,12, 8,10,10,11,11, - 12,12,11,11,12,12,12,12,13,12, 8,10,10,11,11,12, - 11,11,11,11,12,12,12,12,13, 8, 9, 9,11,10,11,11, - 12,12,12,12,13,12,13,12, 8, 9, 9,11,11,11,11,12, - 12,12,12,12,13,13,13, 9,10,10,11,12,12,12,12,12, - 13,13,13,13,13,13, 9,10,10,11,11,12,12,12,12,13, - 13,13,13,14,13,10,10,10,12,11,12,12,13,13,13,13, - 13,13,13,13,10,10,11,11,11,12,12,13,13,13,13,13, - 13,13,13,10,11,11,12,12,13,12,12,13,13,13,13,13, - 13,14,10,11,11,12,12,13,12,13,13,13,14,13,13,14, - 13, -}; - -static const static_codebook _44u6__p9_1 = { - 2, 225, - (long *)_vq_lengthlist__44u6__p9_1, - 1, -522338304, 1620115456, 4, 0, - (long *)_vq_quantlist__44u6__p9_1, - 0 -}; - -static const long _vq_quantlist__44u6__p9_2[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44u6__p9_2[] = { - 3, 5, 5, 7, 7, 8, 8, 8, 8, 8, 8, 9, 8, 8, 9, 9, - 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, - 9, 9, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, - 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10, 9, 9,10, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 9,10, 9,10,10, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,10,10, 9, 9, - 10, -}; - -static const static_codebook _44u6__p9_2 = { - 2, 289, - (long *)_vq_lengthlist__44u6__p9_2, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u6__p9_2, - 0 -}; - -static const long _huff_lengthlist__44u6__short[] = { - 4,11,16,13,17,13,17,16,17,17, 4, 7, 9, 9,13,10, - 16,12,16,17, 7, 6, 5, 7, 8, 9,12,12,16,17, 6, 9, - 7, 9,10,10,15,15,17,17, 6, 7, 5, 7, 5, 7, 7,10, - 16,17, 7, 9, 8, 9, 8,10,11,11,15,17, 7, 7, 7, 8, - 5, 8, 8, 9,15,17, 8, 7, 9, 9, 7, 8, 7, 2, 7,15, - 14,13,13,15, 5,10, 4, 3, 6,17,17,15,13,17, 7,11, - 7, 6, 9,16, -}; - -static const static_codebook _huff_book__44u6__short = { - 2, 100, - (long *)_huff_lengthlist__44u6__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u7__long[] = { - 3, 9,14,13,15,14,16,13,13,14, 5, 5, 7, 7, 8, 9, - 11,10,12,15,10, 6, 5, 6, 6, 9,10,10,13,16,10, 6, - 6, 6, 6, 8, 9, 9,12,15,14, 7, 6, 6, 5, 6, 6, 8, - 12,15,10, 8, 7, 7, 6, 7, 7, 7,11,13,14,10, 9, 8, - 5, 6, 4, 5, 9,12,10, 9, 9, 8, 6, 6, 5, 3, 6,11, - 12,11,12,12,10, 9, 8, 5, 5, 8,10,11,15,13,13,13, - 12, 8, 6, 7, -}; - -static const static_codebook _huff_book__44u7__long = { - 2, 100, - (long *)_huff_lengthlist__44u7__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u7__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u7__p1_0[] = { - 1, 4, 4, 4, 7, 7, 5, 7, 7, 5, 8, 8, 8,10,10, 7, - 10,10, 5, 8, 8, 7,10,10, 8,10,10, 5, 8, 8, 8,11, - 10, 8,10,10, 8,10,10,10,12,13,10,13,13, 7,10,10, - 10,13,12,10,13,13, 5, 8, 8, 8,11,10, 8,10,11, 7, - 10,10,10,13,13,10,12,13, 8,11,11,10,13,13,10,13, - 12, -}; - -static const static_codebook _44u7__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44u7__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u7__p1_0, - 0 -}; - -static const long _vq_quantlist__44u7__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u7__p2_0[] = { - 3, 4, 4, 5, 6, 6, 5, 6, 6, 5, 6, 6, 6, 8, 8, 6, - 7, 8, 5, 6, 6, 6, 8, 7, 6, 8, 8, 5, 6, 6, 6, 8, - 7, 6, 8, 8, 6, 8, 8, 8, 9, 9, 8, 9, 9, 6, 8, 7, - 7, 9, 8, 8, 9, 9, 5, 6, 6, 6, 8, 7, 6, 8, 8, 6, - 8, 8, 8, 9, 9, 7, 8, 9, 6, 8, 8, 8, 9, 9, 8, 9, - 9, -}; - -static const static_codebook _44u7__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__44u7__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u7__p2_0, - 0 -}; - -static const long _vq_quantlist__44u7__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u7__p3_0[] = { - 2, 5, 4, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, - 9, 9,13,12, 8, 9,10,12,13, 5, 7, 7,10, 9, 7, 9, - 9,11,11, 6, 8, 9,11,11,10,11,11,14,14, 9,10,11, - 13,14, 5, 7, 7, 9, 9, 7, 9, 8,11,11, 7, 9, 9,11, - 11, 9,11,10,14,13,10,11,11,14,14, 8,10,10,14,13, - 10,11,12,15,14, 9,11,11,15,14,13,14,14,16,16,12, - 13,14,17,16, 8,10,10,13,13, 9,11,11,14,15,10,11, - 12,14,15,12,14,13,16,16,13,14,15,15,17, 5, 7, 7, - 10,10, 7, 9, 9,11,11, 7, 9, 9,11,11,10,12,11,15, - 14,10,11,12,14,14, 7, 9, 9,12,12, 9,11,11,13,13, - 9,11,11,13,13,11,13,13,14,17,11,13,13,15,16, 6, - 9, 9,11,11, 8,11,10,13,12, 9,11,11,13,13,11,13, - 12,16,14,11,13,13,16,16,10,12,12,15,15,11,13,13, - 16,16,11,13,13,16,15,14,16,17,17,19,14,16,16,18, - 0, 9,11,11,14,15,10,13,12,16,15,11,13,13,16,16, - 14,15,14, 0,16,14,16,16,18, 0, 5, 7, 7,10,10, 7, - 9, 9,12,11, 7, 9, 9,11,12,10,11,11,15,14,10,11, - 12,14,14, 6, 9, 9,11,11, 9,11,11,13,13, 8,10,11, - 12,13,11,13,13,17,15,11,12,13,14,15, 7, 9, 9,11, - 12, 9,11,11,13,13, 9,11,11,13,13,11,13,12,16,16, - 11,13,13,15,14, 9,11,11,14,15,11,13,13,16,15,10, - 12,13,16,16,15,16,16, 0, 0,14,13,15,16,18,10,11, - 11,15,15,11,13,14,16,18,11,13,13,16,15,15,16,16, - 19, 0,14,15,15,16,16, 8,10,10,13,13,10,12,11,16, - 15,10,11,11,16,15,13,15,16,18, 0,13,14,15,17,17, - 9,11,11,15,15,11,13,13,16,18,11,13,13,16,17,15, - 16,16, 0, 0,15,18,16, 0,17, 9,11,11,15,15,11,13, - 12,17,15,11,13,14,16,17,15,18,15, 0,17,15,16,16, - 18,19,13,15,14, 0,18,14,16,16,19,18,14,16,15,19, - 19,16,18,19, 0, 0,16,17, 0, 0, 0,12,14,14,17,17, - 13,16,14, 0,18,14,16,15,18, 0,16,18,16,19,17,18, - 19,17, 0, 0, 8,10,10,14,14, 9,12,11,15,15,10,11, - 12,15,17,13,15,15,18,16,14,16,15,18,17, 9,11,11, - 16,15,11,13,13, 0,16,11,12,13,16,15,15,16,16, 0, - 17,15,15,16,18,17, 9,12,11,15,17,11,13,13,16,16, - 11,14,13,16,16,15,15,16,18,19,16,18,16, 0, 0,12, - 14,14, 0,16,14,16,16, 0,18,13,14,15,16, 0,17,16, - 18, 0, 0,16,16,17,19, 0,13,14,14,17, 0,14,17,16, - 0,19,14,15,15,18,19,17,16,18, 0, 0,15,19,16, 0, - 0, -}; - -static const static_codebook _44u7__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44u7__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u7__p3_0, - 0 -}; - -static const long _vq_quantlist__44u7__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u7__p4_0[] = { - 4, 5, 5, 8, 8, 6, 7, 6, 9, 9, 6, 6, 7, 9, 9, 8, - 9, 9,11,11, 8, 9, 9,10,11, 6, 7, 7, 9, 9, 7, 8, - 8,10,10, 6, 7, 8, 9,10, 9,10,10,12,12, 9, 9,10, - 11,12, 6, 7, 7, 9, 9, 6, 8, 7,10, 9, 7, 8, 8,10, - 10, 9,10, 9,12,11, 9,10,10,12,11, 8, 9, 9,11,11, - 9,10,10,12,12, 9,10,10,12,12,11,12,12,13,14,11, - 11,12,13,13, 8, 9, 9,11,11, 9,10,10,12,11, 9,10, - 10,12,12,11,12,11,13,13,11,12,12,13,13, 6, 7, 7, - 9, 9, 7, 8, 7,10,10, 7, 7, 8,10,10, 9,10,10,12, - 11, 9,10,10,12,12, 7, 8, 8,10,10, 8, 8, 9,11,11, - 8, 9, 9,11,11,10,11,11,12,12,10,10,11,12,13, 6, - 7, 7,10,10, 7, 9, 8,11,10, 8, 8, 9,10,11,10,11, - 10,13,11,10,11,11,12,12, 9,10,10,12,12,10,10,11, - 13,13,10,11,11,13,12,12,12,13,13,14,12,12,13,14, - 14, 9,10,10,12,12, 9,10,10,12,12,10,11,11,13,13, - 11,12,11,14,12,12,13,13,14,14, 6, 7, 7, 9, 9, 7, - 8, 7,10,10, 7, 7, 8,10,10, 9,10,10,12,11, 9,10, - 10,11,12, 6, 7, 7,10,10, 8, 9, 8,11,10, 7, 8, 9, - 10,11,10,11,11,13,12,10,10,11,11,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,10,13,12, - 10,11,11,12,12, 9,10,10,12,12,10,11,11,13,12, 9, - 10,10,12,13,12,13,12,14,14,11,11,12,12,14, 9,10, - 10,12,12,10,11,11,13,13,10,11,11,13,13,12,13,12, - 14,14,12,13,12,14,13, 8, 9, 9,11,11, 9,10,10,12, - 12, 9,10,10,12,12,11,12,12,14,13,11,12,12,13,13, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,12,12, - 13,13,14,14,12,12,13,14,14, 9,10,10,12,12, 9,11, - 10,13,12,10,10,11,12,13,11,13,12,14,13,12,12,13, - 14,14,11,12,12,13,13,11,12,13,14,14,12,13,13,14, - 14,13,13,14,14,16,13,14,14,16,16,11,11,11,13,13, - 11,12,11,14,13,12,12,13,14,15,13,14,12,16,13,14, - 14,14,15,16, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,12,14,13,11,12,12,13,14, 9,10,10, - 12,12,10,11,10,13,12, 9,10,11,12,13,12,13,12,14, - 14,12,12,13,13,14, 9,10,10,12,12,10,11,11,12,13, - 10,11,11,13,13,12,13,12,14,14,12,13,13,14,14,11, - 12,12,13,13,12,13,12,14,14,11,11,12,13,14,13,15, - 14,16,15,13,12,14,13,16,11,12,12,13,13,12,13,13, - 14,14,12,12,12,14,14,13,14,14,15,15,13,14,13,16, - 14, -}; - -static const static_codebook _44u7__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__44u7__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u7__p4_0, - 0 -}; - -static const long _vq_quantlist__44u7__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u7__p5_0[] = { - 2, 3, 3, 6, 6, 7, 8,10,10, 4, 5, 5, 8, 7, 8, 8, - 11,11, 3, 5, 5, 7, 7, 8, 9,11,11, 6, 8, 7, 9, 9, - 10,10,12,12, 6, 7, 8, 9,10,10,10,12,12, 8, 8, 8, - 10,10,12,11,13,13, 8, 8, 9,10,10,11,11,13,13,10, - 11,11,12,12,13,13,14,14,10,11,11,12,12,13,13,14, - 14, -}; - -static const static_codebook _44u7__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44u7__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u7__p5_0, - 0 -}; - -static const long _vq_quantlist__44u7__p6_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u7__p6_0[] = { - 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 8, 7, - 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, - 8, 8,10,10, 5, 6, 6, 7, 7, 8, 8,10,10, 7, 8, 7, - 8, 8,10, 9,11,11, 7, 7, 8, 8, 8, 9,10,11,11, 9, - 9, 9,10,10,11,10,12,11, 9, 9, 9,10,10,11,11,11, - 12, -}; - -static const static_codebook _44u7__p6_0 = { - 2, 81, - (long *)_vq_lengthlist__44u7__p6_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u7__p6_0, - 0 -}; - -static const long _vq_quantlist__44u7__p7_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u7__p7_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 9, 8, 8, 9, 9, 7, - 10,10, 5, 8, 9, 7, 9,10, 8, 9, 9, 4, 9, 9, 9,11, - 10, 8,10,10, 7,11,10,10,10,12,10,12,12, 7,10,10, - 10,12,11,10,12,12, 5, 9, 9, 8,10,10, 9,11,11, 7, - 11,10,10,12,12,10,11,12, 7,10,11,10,12,12,10,12, - 10, -}; - -static const static_codebook _44u7__p7_0 = { - 4, 81, - (long *)_vq_lengthlist__44u7__p7_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44u7__p7_0, - 0 -}; - -static const long _vq_quantlist__44u7__p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u7__p7_1[] = { - 3, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 4, 5, 5, 6, 6, - 8, 7, 8, 8, 8, 8, 4, 5, 5, 6, 6, 7, 8, 8, 8, 8, - 8, 6, 7, 6, 7, 7, 8, 8, 9, 9, 9, 9, 6, 6, 7, 7, - 7, 8, 8, 9, 9, 9, 9, 7, 8, 7, 8, 8, 9, 9, 9, 9, - 9, 9, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 8, 8, 8, - 9, 9, 9, 9,10, 9, 9, 9, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9,10, 8, 8, 8, 9, 9, 9, 9,10, 9,10,10, 8, 8, - 8, 9, 9, 9, 9, 9,10,10,10, -}; - -static const static_codebook _44u7__p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44u7__p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u7__p7_1, - 0 -}; - -static const long _vq_quantlist__44u7__p8_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u7__p8_0[] = { - 1, 4, 4, 6, 6, 8, 8,10,10,11,11, 4, 6, 6, 7, 7, - 9, 9,11,10,12,12, 5, 6, 5, 7, 7, 9, 9,10,11,12, - 12, 6, 7, 7, 8, 8,10,10,11,11,13,13, 6, 7, 7, 8, - 8,10,10,11,12,13,13, 8, 9, 9,10,10,11,11,12,12, - 14,14, 8, 9, 9,10,10,11,11,12,12,14,14,10,10,10, - 11,11,13,12,14,14,15,15,10,10,10,12,12,13,13,14, - 14,15,15,11,12,12,13,13,14,14,15,14,16,15,11,12, - 12,13,13,14,14,15,15,15,16, -}; - -static const static_codebook _44u7__p8_0 = { - 2, 121, - (long *)_vq_lengthlist__44u7__p8_0, - 1, -524582912, 1618345984, 4, 0, - (long *)_vq_quantlist__44u7__p8_0, - 0 -}; - -static const long _vq_quantlist__44u7__p8_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u7__p8_1[] = { - 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, - 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 6, 7, 7, 7, - 7, 7, 7, 7, 7, 8, 8, 7, 7, 7, 7, 7, 8, 7, 8, 8, - 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, - 7, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, - 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44u7__p8_1 = { - 2, 121, - (long *)_vq_lengthlist__44u7__p8_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u7__p8_1, - 0 -}; - -static const long _vq_quantlist__44u7__p9_0[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u7__p9_0[] = { - 1, 3, 3,10,10,10,10,10,10,10,10, 4,10,10,10,10, - 10,10,10,10,10,10, 4,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, -}; - -static const static_codebook _44u7__p9_0 = { - 2, 121, - (long *)_vq_lengthlist__44u7__p9_0, - 1, -512171520, 1630791680, 4, 0, - (long *)_vq_quantlist__44u7__p9_0, - 0 -}; - -static const long _vq_quantlist__44u7__p9_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u7__p9_1[] = { - 1, 4, 4, 6, 5, 8, 6, 9, 8,10, 9,11,10, 4, 6, 6, - 8, 8, 9, 9,11,10,11,11,11,11, 4, 6, 6, 8, 8,10, - 9,11,11,11,11,11,12, 6, 8, 8,10,10,11,11,12,12, - 13,12,13,13, 6, 8, 8,10,10,11,11,12,12,12,13,14, - 13, 8,10,10,11,11,12,13,14,14,14,14,15,15, 8,10, - 10,11,12,12,13,13,14,14,14,14,15, 9,11,11,13,13, - 14,14,15,14,16,15,17,15, 9,11,11,12,13,14,14,15, - 14,15,15,15,16,10,12,12,13,14,15,15,15,15,16,17, - 16,17,10,13,12,13,14,14,16,16,16,16,15,16,17,11, - 13,13,14,15,14,17,15,16,17,17,17,17,11,13,13,14, - 15,15,15,15,17,17,16,17,16, -}; - -static const static_codebook _44u7__p9_1 = { - 2, 169, - (long *)_vq_lengthlist__44u7__p9_1, - 1, -518889472, 1622704128, 4, 0, - (long *)_vq_quantlist__44u7__p9_1, - 0 -}; - -static const long _vq_quantlist__44u7__p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const long _vq_lengthlist__44u7__p9_2[] = { - 2, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, - 8, -}; - -static const static_codebook _44u7__p9_2 = { - 1, 49, - (long *)_vq_lengthlist__44u7__p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44u7__p9_2, - 0 -}; - -static const long _huff_lengthlist__44u7__short[] = { - 5,12,17,16,16,17,17,17,17,17, 4, 7,11,11,12, 9, - 17,10,17,17, 7, 7, 8, 9, 7, 9,11,10,15,17, 7, 9, - 10,11,10,12,14,12,16,17, 7, 8, 5, 7, 4, 7, 7, 8, - 16,16, 6,10, 9,10, 7,10,11,11,16,17, 6, 8, 8, 9, - 5, 7, 5, 8,16,17, 5, 5, 8, 7, 6, 7, 7, 6, 6,14, - 12,10,12,11, 7,11, 4, 4, 2, 7,17,15,15,15, 8,15, - 6, 8, 5, 9, -}; - -static const static_codebook _huff_book__44u7__short = { - 2, 100, - (long *)_huff_lengthlist__44u7__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u8__long[] = { - 3, 9,13,14,14,15,14,14,15,15, 5, 4, 6, 8,10,12, - 12,14,15,15, 9, 5, 4, 5, 8,10,11,13,16,16,10, 7, - 4, 3, 5, 7, 9,11,13,13,10, 9, 7, 4, 4, 6, 8,10, - 12,14,13,11, 9, 6, 5, 5, 6, 8,12,14,13,11,10, 8, - 7, 6, 6, 7,10,14,13,11,12,10, 8, 7, 6, 6, 9,13, - 12,11,14,12,11, 9, 8, 7, 9,11,11,12,14,13,14,11, - 10, 8, 8, 9, -}; - -static const static_codebook _huff_book__44u8__long = { - 2, 100, - (long *)_huff_lengthlist__44u8__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u8__short[] = { - 6,14,18,18,17,17,17,17,17,17, 4, 7, 9, 9,10,13, - 15,17,17,17, 6, 7, 5, 6, 8,11,16,17,16,17, 5, 7, - 5, 4, 6,10,14,17,17,17, 6, 6, 6, 5, 7,10,13,16, - 17,17, 7, 6, 7, 7, 7, 8, 7,10,15,16,12, 9, 9, 6, - 6, 5, 3, 5,11,15,14,14,13, 5, 5, 7, 3, 4, 8,15, - 17,17,13, 7, 7,10, 6, 6,10,15,17,17,16,10,11,14, - 10,10,15,17, -}; - -static const static_codebook _huff_book__44u8__short = { - 2, 100, - (long *)_huff_lengthlist__44u8__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u8_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u8_p1_0[] = { - 1, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 8, 9, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 8, 9, 9, 5, 7, 7, 7, 9, - 9, 7, 9, 9, 7, 9, 9, 9,10,11, 9,11,10, 7, 9, 9, - 9,11,10, 9,10,11, 5, 7, 7, 7, 9, 9, 7, 9, 9, 7, - 9, 9, 9,11,10, 9,10,10, 8, 9, 9, 9,11,11, 9,11, - 10, -}; - -static const static_codebook _44u8_p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44u8_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u8_p1_0, - 0 -}; - -static const long _vq_quantlist__44u8_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u8_p2_0[] = { - 4, 5, 5, 8, 8, 5, 7, 6, 9, 9, 5, 6, 7, 9, 9, 8, - 9, 9,11,11, 8, 9, 9,11,11, 5, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12, 9,10,10, - 11,12, 5, 7, 7, 9, 9, 7, 8, 7,10,10, 7, 8, 8,10, - 10, 9,10, 9,12,11, 9,10,10,12,12, 8, 9, 9,12,11, - 9,10,10,12,12, 9,10,10,12,12,11,12,12,14,14,11, - 11,12,13,14, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,11,13,13,11,12,12,14,14, 5, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12, - 12, 9,10,10,11,12, 7, 8, 8,10,10, 8, 9, 9,11,11, - 8, 9, 9,11,11,10,11,11,12,13,10,11,11,12,13, 6, - 8, 8,10,10, 8, 9, 8,11,10, 8, 9, 9,11,11,10,11, - 10,13,12,10,11,11,13,13, 9,10,10,12,12,10,11,11, - 13,13,10,11,11,13,13,12,12,13,13,14,12,13,13,14, - 14, 9,10,10,12,12,10,11,10,13,12,10,11,11,13,13, - 11,13,12,14,13,12,13,13,14,14, 5, 7, 7, 9, 9, 7, - 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12,12, 9,10, - 10,12,12, 7, 8, 8,10,10, 8, 9, 9,11,11, 8, 8, 9, - 10,11,10,11,11,13,13,10,10,11,12,13, 7, 8, 8,10, - 10, 8, 9, 9,11,11, 8, 9, 9,11,11,10,11,11,13,13, - 10,11,11,13,12, 9,10,10,12,12,10,11,11,13,13,10, - 10,11,12,13,12,13,13,14,14,12,12,13,13,14, 9,10, - 10,12,12,10,11,11,13,13,10,11,11,13,13,12,13,13, - 15,14,12,13,13,14,13, 8, 9, 9,11,11, 9,10,10,12, - 12, 9,10,10,12,12,12,12,12,14,13,11,12,12,14,14, - 9,10,10,12,12,10,11,11,13,13,10,11,11,13,13,12, - 13,13,14,15,12,13,13,14,15, 9,10,10,12,12,10,11, - 10,13,12,10,11,11,13,13,12,13,12,15,14,12,13,13, - 14,15,11,12,12,14,14,12,13,13,14,14,12,13,13,15, - 14,14,14,14,14,16,14,14,15,16,16,11,12,12,14,14, - 11,12,12,14,14,12,13,13,14,15,13,14,13,16,14,14, - 14,14,16,16, 8, 9, 9,11,11, 9,10,10,12,12, 9,10, - 10,12,12,11,12,12,14,13,11,12,12,14,14, 9,10,10, - 12,12,10,11,11,13,13,10,10,11,12,13,12,13,13,15, - 14,12,12,13,13,14, 9,10,10,12,12,10,11,11,13,13, - 10,11,11,13,13,12,13,13,14,14,12,13,13,15,14,11, - 12,12,14,13,12,13,13,15,14,11,12,12,13,14,14,15, - 14,16,15,13,13,14,13,16,11,12,12,14,14,12,13,13, - 14,15,12,13,12,15,14,14,14,14,16,15,14,15,13,16, - 14, -}; - -static const static_codebook _44u8_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44u8_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u8_p2_0, - 0 -}; - -static const long _vq_quantlist__44u8_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u8_p3_0[] = { - 3, 4, 4, 5, 5, 7, 7, 9, 9, 4, 5, 4, 6, 6, 7, 7, - 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, - 8, 8,10,10, 6, 6, 6, 7, 7, 8, 8,10,10, 7, 7, 7, - 8, 8, 9, 9,11,10, 7, 7, 7, 8, 8, 9, 9,10,11, 9, - 9, 9,10,10,11,10,12,11, 9, 9, 9, 9,10,11,11,11, - 12, -}; - -static const static_codebook _44u8_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44u8_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u8_p3_0, - 0 -}; - -static const long _vq_quantlist__44u8_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44u8_p4_0[] = { - 4, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,11,11,11, - 11, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11,11, - 12,12, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, - 11,12,12, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, - 11,11,12,12, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10, - 10,11,11,12,12, 7, 7, 7, 8, 8, 9, 8,10, 9,10, 9, - 11,10,12,11,13,12, 7, 7, 7, 8, 8, 8, 9, 9,10, 9, - 10,10,11,11,12,12,13, 8, 8, 8, 9, 9, 9, 9,10,10, - 11,10,11,11,12,12,13,13, 8, 8, 8, 9, 9, 9,10,10, - 10,10,11,11,11,12,12,12,13, 8, 9, 9, 9, 9,10, 9, - 11,10,11,11,12,11,13,12,13,13, 8, 9, 9, 9, 9, 9, - 10,10,11,11,11,11,12,12,13,13,13,10,10,10,10,10, - 11,10,11,11,12,11,13,12,13,13,14,13,10,10,10,10, - 10,10,11,11,11,11,12,12,13,13,13,13,14,11,11,11, - 11,11,12,11,12,12,13,12,13,13,14,13,14,14,11,11, - 11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,11, - 12,12,12,12,13,12,13,12,13,13,14,13,14,14,14,14, - 11,12,12,12,12,12,12,13,13,13,13,13,14,14,14,14, - 14, -}; - -static const static_codebook _44u8_p4_0 = { - 2, 289, - (long *)_vq_lengthlist__44u8_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u8_p4_0, - 0 -}; - -static const long _vq_quantlist__44u8_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u8_p5_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 8, 9, 9, 7, - 9, 9, 5, 8, 8, 7, 9, 9, 8, 9, 9, 5, 8, 8, 8,10, - 10, 8,10,10, 7,10,10, 9,10,12, 9,12,11, 7,10,10, - 9,11,10, 9,11,12, 5, 8, 8, 8,10,10, 8,10,10, 7, - 10,10, 9,11,11, 9,10,11, 7,10,10, 9,11,11,10,12, - 10, -}; - -static const static_codebook _44u8_p5_0 = { - 4, 81, - (long *)_vq_lengthlist__44u8_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44u8_p5_0, - 0 -}; - -static const long _vq_quantlist__44u8_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u8_p5_1[] = { - 4, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 5, 5, 5, 6, 6, - 7, 7, 8, 8, 8, 8, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, - 8, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 6, 6, 6, 7, - 7, 7, 7, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 7, 8, 7, - 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 9, 9, -}; - -static const static_codebook _44u8_p5_1 = { - 2, 121, - (long *)_vq_lengthlist__44u8_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u8_p5_1, - 0 -}; - -static const long _vq_quantlist__44u8_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u8_p6_0[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 4, 6, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 4, 6, 6, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 6, 7, 7, 7, 8, 8, 8, 8, 9, - 9,10,10,10, 6, 7, 7, 8, 8, 8, 8, 9, 8,10, 9,11, - 10, 7, 8, 8, 8, 8, 8, 9, 9, 9,10,10,11,11, 7, 8, - 8, 8, 8, 9, 8, 9, 9,10,10,11,11, 8, 8, 8, 9, 9, - 9, 9, 9,10,10,10,11,11, 8, 8, 8, 9, 9, 9, 9,10, - 9,10,10,11,11, 9, 9, 9, 9,10,10,10,10,10,10,11, - 11,12, 9, 9, 9,10, 9,10,10,10,10,11,10,12,11,10, - 10,10,10,10,11,11,11,11,11,12,12,12,10,10,10,10, - 11,11,11,11,11,12,11,12,12, -}; - -static const static_codebook _44u8_p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44u8_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u8_p6_0, - 0 -}; - -static const long _vq_quantlist__44u8_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u8_p6_1[] = { - 3, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44u8_p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44u8_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u8_p6_1, - 0 -}; - -static const long _vq_quantlist__44u8_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u8_p7_0[] = { - 1, 4, 5, 6, 6, 7, 7, 8, 8,10,10,11,11, 5, 6, 6, - 7, 7, 8, 8, 9, 9,11,10,12,11, 5, 6, 6, 7, 7, 8, - 8, 9, 9,10,11,11,12, 6, 7, 7, 8, 8, 9, 9,10,10, - 11,11,12,12, 6, 7, 7, 8, 8, 9, 9,10,10,11,12,13, - 12, 7, 8, 8, 9, 9,10,10,11,11,12,12,13,13, 8, 8, - 8, 9, 9,10,10,11,11,12,12,13,13, 9, 9, 9,10,10, - 11,11,12,12,13,13,14,14, 9, 9, 9,10,10,11,11,12, - 12,13,13,14,14,10,11,11,12,11,13,12,13,13,14,14, - 15,15,10,11,11,11,12,12,13,13,14,14,14,15,15,11, - 12,12,13,13,14,13,15,14,15,15,16,15,11,11,12,13, - 13,13,14,14,14,15,15,15,16, -}; - -static const static_codebook _44u8_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44u8_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44u8_p7_0, - 0 -}; - -static const long _vq_quantlist__44u8_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u8_p7_1[] = { - 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, - 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 6, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 8, 8, - 8, 8, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 7, 7, 7, - 8, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 8, 8, 8, - 8, 8, 8, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 7, - 7, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44u8_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44u8_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u8_p7_1, - 0 -}; - -static const long _vq_quantlist__44u8_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44u8_p8_0[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 7, 9, 8,10, 9,11,10, 4, - 6, 6, 8, 8,10, 9, 9, 9,10,10,11,10,12,10, 4, 6, - 6, 8, 8,10,10, 9, 9,10,10,11,11,11,12, 7, 8, 8, - 10,10,11,11,11,10,12,11,12,12,13,11, 7, 8, 8,10, - 10,11,11,10,10,11,11,12,12,13,13, 8,10,10,11,11, - 12,11,12,11,13,12,13,12,14,13, 8,10, 9,11,11,12, - 12,12,12,12,12,13,13,14,13, 8, 9, 9,11,10,12,11, - 13,12,13,13,14,13,14,13, 8, 9, 9,10,11,12,12,12, - 12,13,13,14,15,14,14, 9,10,10,12,11,13,12,13,13, - 14,13,14,14,14,14, 9,10,10,12,12,12,12,13,13,14, - 14,14,15,14,14,10,11,11,13,12,13,12,14,14,14,14, - 14,14,15,15,10,11,11,12,12,13,13,14,14,14,15,15, - 14,16,15,11,12,12,13,12,14,14,14,13,15,14,15,15, - 15,17,11,12,12,13,13,14,14,14,15,15,14,15,15,14, - 17, -}; - -static const static_codebook _44u8_p8_0 = { - 2, 225, - (long *)_vq_lengthlist__44u8_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44u8_p8_0, - 0 -}; - -static const long _vq_quantlist__44u8_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__44u8_p8_1[] = { - 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 6, 6, 7, 7, 8, - 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, - 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, 9,10, 8, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10, - 10, 9,10, 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9,10, 9, - 10,10,10,10,10,10,10,10, 8, 9, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10, 9,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10,10, - 10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10, - 10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9,10, 9, - 10,10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10, - 10, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, - 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10, 9, 9, 9,10, 9,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9,10, - 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10, 9, 9, 9,10, 9,10, 9,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44u8_p8_1 = { - 2, 441, - (long *)_vq_lengthlist__44u8_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44u8_p8_1, - 0 -}; - -static const long _vq_quantlist__44u8_p9_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u8_p9_0[] = { - 1, 3, 3, 9, 9, 9, 9, 9, 9, 4, 9, 9, 9, 9, 9, 9, - 9, 9, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, - 8, -}; - -static const static_codebook _44u8_p9_0 = { - 2, 81, - (long *)_vq_lengthlist__44u8_p9_0, - 1, -511895552, 1631393792, 4, 0, - (long *)_vq_quantlist__44u8_p9_0, - 0 -}; - -static const long _vq_quantlist__44u8_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const long _vq_lengthlist__44u8_p9_1[] = { - 1, 4, 4, 7, 7, 8, 7, 8, 6, 9, 7,10, 8,11,10,11, - 11,11,11, 4, 7, 6, 9, 9,10, 9, 9, 9,10,10,11,10, - 11,10,11,11,13,11, 4, 7, 7, 9, 9, 9, 9, 9, 9,10, - 10,11,10,11,11,11,12,11,12, 7, 9, 8,11,11,11,11, - 10,10,11,11,12,12,12,12,12,12,14,13, 7, 8, 9,10, - 11,11,11,10,10,11,11,11,11,12,12,14,12,13,14, 8, - 9, 9,11,11,11,11,11,11,12,12,14,12,15,14,14,14, - 15,14, 8, 9, 9,11,11,11,11,12,11,12,12,13,13,13, - 13,13,13,14,14, 8, 9, 9,11,10,12,11,12,12,13,13, - 13,13,15,14,14,14,16,16, 8, 9, 9,10,11,11,12,12, - 12,13,13,13,14,14,14,15,16,15,15, 9,10,10,11,12, - 12,13,13,13,14,14,16,14,14,16,16,16,16,15, 9,10, - 10,11,11,12,13,13,14,15,14,16,14,15,16,16,16,16, - 15,10,11,11,12,13,13,14,15,15,15,15,15,16,15,16, - 15,16,15,15,10,11,11,13,13,14,13,13,15,14,15,15, - 16,15,15,15,16,15,16,10,12,12,14,14,14,14,14,16, - 16,15,15,15,16,16,16,16,16,16,11,12,12,14,14,14, - 14,15,15,16,15,16,15,16,15,16,16,16,16,12,12,13, - 14,14,15,16,16,16,16,16,16,15,16,16,16,16,16,16, - 12,13,13,14,14,14,14,15,16,15,16,16,16,16,16,16, - 16,16,16,12,13,14,14,14,16,15,16,15,16,16,16,16, - 16,16,16,16,16,16,12,14,13,14,15,15,15,16,15,16, - 16,15,16,16,16,16,16,16,16, -}; - -static const static_codebook _44u8_p9_1 = { - 2, 361, - (long *)_vq_lengthlist__44u8_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__44u8_p9_1, - 0 -}; - -static const long _vq_quantlist__44u8_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const long _vq_lengthlist__44u8_p9_2[] = { - 2, 3, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44u8_p9_2 = { - 1, 49, - (long *)_vq_lengthlist__44u8_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44u8_p9_2, - 0 -}; - -static const long _huff_lengthlist__44u9__long[] = { - 3, 9,13,13,14,15,14,14,15,15, 5, 5, 9,10,12,12, - 13,14,16,15,10, 6, 6, 6, 8,11,12,13,16,15,11, 7, - 5, 3, 5, 8,10,12,15,15,10,10, 7, 4, 3, 5, 8,10, - 12,12,12,12, 9, 7, 5, 4, 6, 8,10,13,13,12,11, 9, - 7, 5, 5, 6, 9,12,14,12,12,10, 8, 6, 6, 6, 7,11, - 13,12,14,13,10, 8, 7, 7, 7,10,11,11,12,13,12,11, - 10, 8, 8, 9, -}; - -static const static_codebook _huff_book__44u9__long = { - 2, 100, - (long *)_huff_lengthlist__44u9__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _huff_lengthlist__44u9__short[] = { - 9,16,18,18,17,17,17,17,17,17, 5, 8,11,12,11,12, - 17,17,16,16, 6, 6, 8, 8, 9,10,14,15,16,16, 6, 7, - 7, 4, 6, 9,13,16,16,16, 6, 6, 7, 4, 5, 8,11,15, - 17,16, 7, 6, 7, 6, 6, 8, 9,10,14,16,11, 8, 8, 7, - 6, 6, 3, 4,10,15,14,12,12,10, 5, 6, 3, 3, 8,13, - 15,17,15,11, 6, 8, 6, 6, 9,14,17,15,15,12, 8,10, - 9, 9,12,15, -}; - -static const static_codebook _huff_book__44u9__short = { - 2, 100, - (long *)_huff_lengthlist__44u9__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44u9_p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u9_p1_0[] = { - 1, 5, 5, 5, 7, 7, 5, 7, 7, 5, 7, 7, 7, 9, 9, 7, - 9, 9, 5, 7, 7, 7, 9, 9, 7, 9, 9, 5, 7, 7, 7, 9, - 9, 7, 9, 9, 8, 9, 9, 9,10,11, 9,11,11, 7, 9, 9, - 9,11,10, 9,11,11, 5, 7, 7, 7, 9, 9, 8, 9,10, 7, - 9, 9, 9,11,11, 9,10,11, 7, 9,10, 9,11,11, 9,11, - 10, -}; - -static const static_codebook _44u9_p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44u9_p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44u9_p1_0, - 0 -}; - -static const long _vq_quantlist__44u9_p2_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u9_p2_0[] = { - 3, 5, 5, 8, 8, 5, 7, 7, 9, 9, 6, 7, 7, 9, 9, 8, - 9, 9,11,10, 8, 9, 9,11,11, 6, 7, 7, 9, 9, 7, 8, - 8,10,10, 7, 8, 8, 9,10, 9,10,10,11,11, 9, 9,10, - 11,11, 6, 7, 7, 9, 9, 7, 8, 8,10, 9, 7, 8, 8,10, - 10, 9,10, 9,11,11, 9,10,10,11,11, 8, 9, 9,11,11, - 9,10,10,12,11, 9,10,10,11,12,11,11,11,13,13,11, - 11,11,12,13, 8, 9, 9,11,11, 9,10,10,11,11, 9,10, - 10,12,11,11,12,11,13,12,11,11,12,13,13, 6, 7, 7, - 9, 9, 7, 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,12, - 11, 9,10,10,11,12, 7, 8, 8,10,10, 8, 9, 9,11,11, - 8, 9, 9,10,10,10,11,11,12,12,10,10,11,12,12, 7, - 8, 8,10,10, 8, 9, 8,10,10, 8, 9, 9,10,10,10,11, - 10,12,11,10,10,11,12,12, 9,10,10,11,12,10,11,11, - 12,12,10,11,10,12,12,12,12,12,13,13,11,12,12,13, - 13, 9,10,10,11,11, 9,10,10,12,12,10,11,11,12,13, - 11,12,11,13,12,12,12,12,13,14, 6, 7, 7, 9, 9, 7, - 8, 8,10,10, 7, 8, 8,10,10, 9,10,10,11,11, 9,10, - 10,11,12, 7, 8, 8,10,10, 8, 9, 9,11,10, 8, 8, 9, - 10,10,10,11,10,12,12,10,10,11,11,12, 7, 8, 8,10, - 10, 8, 9, 9,10,10, 8, 9, 9,10,10,10,11,10,12,12, - 10,11,10,12,12, 9,10,10,12,11,10,11,11,12,12, 9, - 10,10,12,12,12,12,12,13,13,11,11,12,12,14, 9,10, - 10,11,12,10,11,11,12,12,10,11,11,12,12,11,12,12, - 14,14,12,12,12,13,13, 8, 9, 9,11,11, 9,10,10,12, - 11, 9,10,10,12,12,11,12,11,13,13,11,11,12,13,13, - 9,10,10,12,12,10,11,11,12,12,10,11,11,12,12,12, - 12,12,14,14,12,12,12,13,13, 9,10,10,12,11,10,11, - 10,12,12,10,11,11,12,12,11,12,12,14,13,12,12,12, - 13,14,11,12,11,13,13,11,12,12,13,13,12,12,12,14, - 14,13,13,13,13,15,13,13,14,15,15,11,11,11,13,13, - 11,12,11,13,13,11,12,12,13,13,12,13,12,15,13,13, - 13,14,14,15, 8, 9, 9,11,11, 9,10,10,11,12, 9,10, - 10,11,12,11,12,11,13,13,11,12,12,13,13, 9,10,10, - 11,12,10,11,10,12,12,10,10,11,12,13,12,12,12,14, - 13,11,12,12,13,14, 9,10,10,12,12,10,11,11,12,12, - 10,11,11,12,12,12,12,12,14,13,12,12,12,14,13,11, - 11,11,13,13,11,12,12,14,13,11,11,12,13,13,13,13, - 13,15,14,12,12,13,13,15,11,12,12,13,13,12,12,12, - 13,14,11,12,12,13,13,13,13,14,14,15,13,13,13,14, - 14, -}; - -static const static_codebook _44u9_p2_0 = { - 4, 625, - (long *)_vq_lengthlist__44u9_p2_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u9_p2_0, - 0 -}; - -static const long _vq_quantlist__44u9_p3_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44u9_p3_0[] = { - 3, 4, 4, 5, 5, 7, 7, 8, 8, 4, 5, 5, 6, 6, 7, 7, - 9, 9, 4, 4, 5, 6, 6, 7, 7, 9, 9, 5, 6, 6, 7, 7, - 8, 8, 9, 9, 5, 6, 6, 7, 7, 8, 8, 9, 9, 7, 7, 7, - 8, 8, 9, 9,10,10, 7, 7, 7, 8, 8, 9, 9,10,10, 8, - 9, 9,10, 9,10,10,11,11, 8, 9, 9, 9,10,10,10,11, - 11, -}; - -static const static_codebook _44u9_p3_0 = { - 2, 81, - (long *)_vq_lengthlist__44u9_p3_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44u9_p3_0, - 0 -}; - -static const long _vq_quantlist__44u9_p4_0[] = { - 8, - 7, - 9, - 6, - 10, - 5, - 11, - 4, - 12, - 3, - 13, - 2, - 14, - 1, - 15, - 0, - 16, -}; - -static const long _vq_lengthlist__44u9_p4_0[] = { - 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, - 11, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10, - 11,11, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10, - 10,11,11, 6, 6, 6, 7, 6, 7, 7, 8, 8, 9, 9,10,10, - 11,11,12,11, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9,10, - 10,11,11,11,12, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, - 10,10,11,11,12,12, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, - 9,10,10,11,11,12,12, 8, 8, 8, 8, 8, 9, 8,10, 9, - 10,10,11,10,12,11,13,12, 8, 8, 8, 8, 8, 9, 9, 9, - 10,10,10,10,11,11,12,12,12, 8, 8, 8, 9, 9, 9, 9, - 10,10,11,10,12,11,12,12,13,12, 8, 8, 8, 9, 9, 9, - 9,10,10,10,11,11,11,12,12,12,13, 9, 9, 9,10,10, - 10,10,11,10,11,11,12,11,13,12,13,13, 9, 9,10,10, - 10,10,10,10,11,11,11,11,12,12,13,13,13,10,11,10, - 11,11,11,11,12,11,12,12,13,12,13,13,14,13,10,10, - 10,11,11,11,11,11,12,12,12,12,13,13,13,13,14,11, - 11,11,12,11,12,12,12,12,13,13,13,13,14,13,14,14, - 11,11,11,11,12,12,12,12,12,12,13,13,13,13,14,14, - 14, -}; - -static const static_codebook _44u9_p4_0 = { - 2, 289, - (long *)_vq_lengthlist__44u9_p4_0, - 1, -529530880, 1611661312, 5, 0, - (long *)_vq_quantlist__44u9_p4_0, - 0 -}; - -static const long _vq_quantlist__44u9_p5_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44u9_p5_0[] = { - 1, 4, 4, 5, 7, 7, 5, 7, 7, 5, 8, 8, 8, 9, 9, 7, - 9, 9, 5, 8, 8, 7, 9, 9, 8, 9, 9, 5, 8, 8, 8,10, - 10, 8,10,10, 7,10,10, 9,10,12, 9,11,11, 7,10,10, - 9,11,10, 9,11,12, 5, 8, 8, 8,10,10, 8,10,10, 7, - 10,10, 9,12,11, 9,10,11, 7,10,10, 9,11,11,10,12, - 10, -}; - -static const static_codebook _44u9_p5_0 = { - 4, 81, - (long *)_vq_lengthlist__44u9_p5_0, - 1, -529137664, 1618345984, 2, 0, - (long *)_vq_quantlist__44u9_p5_0, - 0 -}; - -static const long _vq_quantlist__44u9_p5_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u9_p5_1[] = { - 5, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 5, 6, 6, 6, 6, - 7, 7, 7, 7, 8, 7, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, - 7, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 6, 6, 6, 7, - 7, 7, 7, 7, 7, 8, 8, 7, 7, 7, 7, 7, 8, 7, 8, 8, - 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, - 8, 7, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 7, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, -}; - -static const static_codebook _44u9_p5_1 = { - 2, 121, - (long *)_vq_lengthlist__44u9_p5_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u9_p5_1, - 0 -}; - -static const long _vq_quantlist__44u9_p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u9_p6_0[] = { - 2, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 4, 6, 5, - 7, 7, 8, 8, 8, 8, 9, 9,10,10, 4, 5, 6, 7, 7, 8, - 8, 8, 8, 9, 9,10,10, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 10,10,10,10, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,10, - 10, 7, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11,11, 7, 8, - 8, 8, 8, 9, 9, 9, 9,10,10,11,11, 8, 8, 8, 9, 9, - 9, 9, 9,10,10,10,11,11, 8, 8, 8, 9, 9, 9, 9,10, - 9,10,10,11,11, 9, 9, 9,10,10,10,10,10,11,11,11, - 11,12, 9, 9, 9,10,10,10,10,10,10,11,10,12,11,10, - 10,10,10,10,11,11,11,11,11,12,12,12,10,10,10,10, - 10,11,11,11,11,12,11,12,12, -}; - -static const static_codebook _44u9_p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44u9_p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44u9_p6_0, - 0 -}; - -static const long _vq_quantlist__44u9_p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44u9_p6_1[] = { - 4, 4, 4, 5, 5, 4, 5, 4, 5, 5, 4, 4, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, -}; - -static const static_codebook _44u9_p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44u9_p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44u9_p6_1, - 0 -}; - -static const long _vq_quantlist__44u9_p7_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44u9_p7_0[] = { - 1, 4, 5, 6, 6, 7, 7, 8, 9,10,10,11,11, 5, 6, 6, - 7, 7, 8, 8, 9, 9,10,10,11,11, 5, 6, 6, 7, 7, 8, - 8, 9, 9,10,10,11,11, 6, 7, 7, 8, 8, 9, 9,10,10, - 11,11,12,12, 6, 7, 7, 8, 8, 9, 9,10,10,11,11,12, - 12, 8, 8, 8, 9, 9,10,10,11,11,12,12,13,13, 8, 8, - 8, 9, 9,10,10,11,11,12,12,13,13, 9, 9, 9,10,10, - 11,11,12,12,13,13,13,13, 9, 9, 9,10,10,11,11,12, - 12,13,13,14,14,10,10,10,11,11,12,12,13,13,14,13, - 15,14,10,10,10,11,11,12,12,13,13,14,14,14,14,11, - 11,12,12,12,13,13,14,14,14,14,15,15,11,11,12,12, - 12,13,13,14,14,14,15,15,15, -}; - -static const static_codebook _44u9_p7_0 = { - 2, 169, - (long *)_vq_lengthlist__44u9_p7_0, - 1, -523206656, 1618345984, 4, 0, - (long *)_vq_quantlist__44u9_p7_0, - 0 -}; - -static const long _vq_quantlist__44u9_p7_1[] = { - 5, - 4, - 6, - 3, - 7, - 2, - 8, - 1, - 9, - 0, - 10, -}; - -static const long _vq_lengthlist__44u9_p7_1[] = { - 5, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 7, 7, - 7, 7, 7, 7, 7, 7, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 8, 8, 7, 7, 7, 7, 7, 7, 7, 8, 7, 8, 8, 7, 7, - 7, 7, 7, 7, 7, 8, 8, 8, 8, -}; - -static const static_codebook _44u9_p7_1 = { - 2, 121, - (long *)_vq_lengthlist__44u9_p7_1, - 1, -531365888, 1611661312, 4, 0, - (long *)_vq_quantlist__44u9_p7_1, - 0 -}; - -static const long _vq_quantlist__44u9_p8_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44u9_p8_0[] = { - 1, 4, 4, 7, 7, 8, 8, 8, 8, 9, 9,10, 9,11,10, 4, - 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,10,12,10, 4, 6, - 6, 8, 8, 9,10, 9, 9,10,10,11,11,12,12, 7, 8, 8, - 10,10,11,11,10,10,11,11,12,12,13,12, 7, 8, 8,10, - 10,11,11,10,10,11,11,12,12,12,13, 8,10, 9,11,11, - 12,12,11,11,12,12,13,13,14,13, 8, 9, 9,11,11,12, - 12,11,12,12,12,13,13,14,13, 8, 9, 9,10,10,12,11, - 13,12,13,13,14,13,15,14, 8, 9, 9,10,10,11,12,12, - 12,13,13,13,14,14,14, 9,10,10,12,11,13,12,13,13, - 14,13,14,14,14,15, 9,10,10,11,12,12,12,13,13,14, - 14,14,15,15,15,10,11,11,12,12,13,13,14,14,14,14, - 15,14,16,15,10,11,11,12,12,13,13,13,14,14,14,14, - 14,15,16,11,12,12,13,13,14,13,14,14,15,14,15,16, - 16,16,11,12,12,13,13,14,13,14,14,15,15,15,16,15, - 15, -}; - -static const static_codebook _44u9_p8_0 = { - 2, 225, - (long *)_vq_lengthlist__44u9_p8_0, - 1, -520986624, 1620377600, 4, 0, - (long *)_vq_quantlist__44u9_p8_0, - 0 -}; - -static const long _vq_quantlist__44u9_p8_1[] = { - 10, - 9, - 11, - 8, - 12, - 7, - 13, - 6, - 14, - 5, - 15, - 4, - 16, - 3, - 17, - 2, - 18, - 1, - 19, - 0, - 20, -}; - -static const long _vq_lengthlist__44u9_p8_1[] = { - 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 6, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 6, 6, 7, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, - 7, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9,10,10, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 10, 9,10, 9,10,10,10,10, 8, 8, 8, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9,10,10, 9,10,10,10,10,10, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10,10, - 10,10, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, - 10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, - 10, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10,10, - 10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9,10,10, - 10,10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 9, 9, 9, 9,10, 9, 9,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10, 9, 9, 9,10, 9,10, 9,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10, 9, 9, 9,10, 9,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, - 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10, 9, 9, 9,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10, -}; - -static const static_codebook _44u9_p8_1 = { - 2, 441, - (long *)_vq_lengthlist__44u9_p8_1, - 1, -529268736, 1611661312, 5, 0, - (long *)_vq_quantlist__44u9_p8_1, - 0 -}; - -static const long _vq_quantlist__44u9_p9_0[] = { - 7, - 6, - 8, - 5, - 9, - 4, - 10, - 3, - 11, - 2, - 12, - 1, - 13, - 0, - 14, -}; - -static const long _vq_lengthlist__44u9_p9_0[] = { - 1, 3, 3,11,11,11,11,11,11,11,11,11,11,11,11, 4, - 10,11,11,11,11,11,11,11,11,11,11,11,11,11, 4,10, - 10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _44u9_p9_0 = { - 2, 225, - (long *)_vq_lengthlist__44u9_p9_0, - 1, -510036736, 1631393792, 4, 0, - (long *)_vq_quantlist__44u9_p9_0, - 0 -}; - -static const long _vq_quantlist__44u9_p9_1[] = { - 9, - 8, - 10, - 7, - 11, - 6, - 12, - 5, - 13, - 4, - 14, - 3, - 15, - 2, - 16, - 1, - 17, - 0, - 18, -}; - -static const long _vq_lengthlist__44u9_p9_1[] = { - 1, 4, 4, 7, 7, 8, 7, 8, 7, 9, 8,10, 9,10,10,11, - 11,12,12, 4, 7, 6, 9, 9,10, 9, 9, 8,10,10,11,10, - 12,10,13,12,13,12, 4, 6, 6, 9, 9, 9, 9, 9, 9,10, - 10,11,11,11,12,12,12,12,12, 7, 9, 8,11,10,10,10, - 11,10,11,11,12,12,13,12,13,13,13,13, 7, 8, 9,10, - 10,11,11,10,10,11,11,11,12,13,13,13,13,14,14, 8, - 9, 9,11,11,12,11,12,12,13,12,12,13,13,14,15,14, - 14,14, 8, 9, 9,10,11,11,11,12,12,13,12,13,13,14, - 14,14,15,14,16, 8, 9, 9,11,10,12,12,12,12,15,13, - 13,13,17,14,15,15,15,14, 8, 9, 9,10,11,11,12,13, - 12,13,13,13,14,15,14,14,14,16,15, 9,11,10,12,12, - 13,13,13,13,14,14,16,15,14,14,14,15,15,17, 9,10, - 10,11,11,13,13,13,14,14,13,15,14,15,14,15,16,15, - 16,10,11,11,12,12,13,14,15,14,15,14,14,15,17,16, - 15,15,17,17,10,12,11,13,12,14,14,13,14,15,15,15, - 15,16,17,17,15,17,16,11,12,12,14,13,15,14,15,16, - 17,15,17,15,17,15,15,16,17,15,11,11,12,14,14,14, - 14,14,15,15,16,15,17,17,17,16,17,16,15,12,12,13, - 14,14,14,15,14,15,15,16,16,17,16,17,15,17,17,16, - 12,14,12,14,14,15,15,15,14,14,16,16,16,15,16,16, - 15,17,15,12,13,13,14,15,14,15,17,15,17,16,17,17, - 17,16,17,16,17,17,12,13,13,14,16,15,15,15,16,15, - 17,17,15,17,15,17,16,16,17, -}; - -static const static_codebook _44u9_p9_1 = { - 2, 361, - (long *)_vq_lengthlist__44u9_p9_1, - 1, -518287360, 1622704128, 5, 0, - (long *)_vq_quantlist__44u9_p9_1, - 0 -}; - -static const long _vq_quantlist__44u9_p9_2[] = { - 24, - 23, - 25, - 22, - 26, - 21, - 27, - 20, - 28, - 19, - 29, - 18, - 30, - 17, - 31, - 16, - 32, - 15, - 33, - 14, - 34, - 13, - 35, - 12, - 36, - 11, - 37, - 10, - 38, - 9, - 39, - 8, - 40, - 7, - 41, - 6, - 42, - 5, - 43, - 4, - 44, - 3, - 45, - 2, - 46, - 1, - 47, - 0, - 48, -}; - -static const long _vq_lengthlist__44u9_p9_2[] = { - 2, 4, 4, 5, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 7, 6, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, -}; - -static const static_codebook _44u9_p9_2 = { - 1, 49, - (long *)_vq_lengthlist__44u9_p9_2, - 1, -526909440, 1611661312, 6, 0, - (long *)_vq_quantlist__44u9_p9_2, - 0 -}; - -static const long _huff_lengthlist__44un1__long[] = { - 5, 6,12, 9,14, 9, 9,19, 6, 1, 5, 5, 8, 7, 9,19, - 12, 4, 4, 7, 7, 9,11,18, 9, 5, 6, 6, 8, 7, 8,17, - 14, 8, 7, 8, 8,10,12,18, 9, 6, 8, 6, 8, 6, 8,18, - 9, 8,11, 8,11, 7, 5,15,16,18,18,18,17,15,11,18, -}; - -static const static_codebook _huff_book__44un1__long = { - 2, 64, - (long *)_huff_lengthlist__44un1__long, - 0, 0, 0, 0, 0, - NULL, - 0 -}; - -static const long _vq_quantlist__44un1__p1_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44un1__p1_0[] = { - 1, 4, 4, 5, 8, 7, 5, 7, 8, 5, 8, 8, 8,10,11, 8, - 10,11, 5, 8, 8, 8,11,10, 8,11,10, 4, 9, 9, 8,11, - 11, 8,11,11, 8,12,11,10,12,14,11,13,13, 7,11,11, - 10,13,11,11,13,14, 4, 8, 9, 8,11,11, 8,11,12, 7, - 11,11,11,14,13,10,11,13, 8,11,12,11,13,13,10,14, - 12, -}; - -static const static_codebook _44un1__p1_0 = { - 4, 81, - (long *)_vq_lengthlist__44un1__p1_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44un1__p1_0, - 0 -}; - -static const long _vq_quantlist__44un1__p2_0[] = { - 1, - 0, - 2, -}; - -static const long _vq_lengthlist__44un1__p2_0[] = { - 2, 4, 4, 5, 6, 6, 5, 6, 6, 5, 7, 7, 7, 8, 8, 6, - 7, 9, 5, 7, 7, 6, 8, 7, 7, 9, 8, 4, 7, 7, 7, 9, - 8, 7, 8, 8, 7, 9, 8, 8, 8,10, 9,10,10, 6, 8, 8, - 7,10, 8, 9,10,10, 5, 7, 7, 7, 8, 8, 7, 8, 9, 6, - 8, 8, 9,10,10, 7, 8,10, 6, 8, 9, 9,10,10, 8,10, - 8, -}; - -static const static_codebook _44un1__p2_0 = { - 4, 81, - (long *)_vq_lengthlist__44un1__p2_0, - 1, -535822336, 1611661312, 2, 0, - (long *)_vq_quantlist__44un1__p2_0, - 0 -}; - -static const long _vq_quantlist__44un1__p3_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44un1__p3_0[] = { - 1, 5, 5, 8, 8, 5, 8, 7, 9, 9, 5, 7, 8, 9, 9, 9, - 10, 9,12,12, 9, 9,10,11,12, 6, 8, 8,10,10, 8,10, - 10,11,11, 8, 9,10,11,11,10,11,11,13,13,10,11,11, - 12,13, 6, 8, 8,10,10, 8,10, 9,11,11, 8,10,10,11, - 11,10,11,11,13,12,10,11,11,13,12, 9,11,11,15,13, - 10,12,11,15,13,10,11,11,15,14,12,14,13,16,15,12, - 13,13,17,16, 9,11,11,13,15,10,11,12,14,15,10,11, - 12,14,15,12,13,13,15,16,12,13,13,16,16, 5, 8, 8, - 11,11, 8,10,10,12,12, 8,10,10,12,12,11,12,12,14, - 14,11,12,12,14,14, 8,11,10,13,12,10,11,12,12,13, - 10,12,12,13,13,12,12,13,13,15,11,12,13,15,14, 7, - 10,10,12,12, 9,12,11,13,12,10,12,12,13,14,12,13, - 12,15,13,11,13,12,14,15,10,12,12,16,14,11,12,12, - 16,15,11,13,12,17,16,13,13,15,15,17,13,15,15,20, - 17,10,12,12,14,16,11,12,12,15,15,11,13,13,15,18, - 13,14,13,15,15,13,15,14,16,16, 5, 8, 8,11,11, 8, - 10,10,12,12, 8,10,10,12,12,11,12,12,14,14,11,12, - 12,14,15, 7,10,10,13,12,10,12,12,14,13, 9,10,12, - 12,13,11,13,13,15,15,11,12,13,13,15, 8,10,10,12, - 13,10,12,12,13,13,10,12,11,13,13,11,13,12,15,15, - 12,13,12,15,13,10,12,12,16,14,11,12,12,16,15,10, - 12,12,16,14,14,15,14,18,16,13,13,14,15,16,10,12, - 12,14,16,11,13,13,16,16,11,13,12,14,16,13,15,15, - 18,18,13,15,13,16,14, 8,11,11,16,16,10,13,13,17, - 16,10,12,12,16,15,14,16,15,20,17,13,14,14,17,17, - 9,12,12,16,16,11,13,14,16,17,11,13,13,16,16,15, - 15,19,18, 0,14,15,15,18,18, 9,12,12,17,16,11,13, - 12,17,16,11,12,13,15,17,15,16,15, 0,19,14,15,14, - 19,18,12,14,14, 0,16,13,14,14,19,18,13,15,16,17, - 16,15,15,17,18, 0,14,16,16,19, 0,12,14,14,16,18, - 13,15,13,17,18,13,15,14,17,18,15,18,14,18,18,16, - 17,16, 0,17, 8,11,11,15,15,10,12,12,16,16,10,13, - 13,16,16,13,15,14,17,17,14,15,17,17,18, 9,12,12, - 16,15,11,13,13,16,16,11,12,13,17,17,14,14,15,17, - 17,14,15,16, 0,18, 9,12,12,16,17,11,13,13,16,17, - 11,14,13,18,17,14,16,14,17,17,15,17,17,18,18,12, - 14,14, 0,16,13,15,15,19, 0,12,13,15, 0, 0,14,17, - 16,19, 0,16,15,18,18, 0,12,14,14,17, 0,13,14,14, - 17, 0,13,15,14, 0,18,15,16,16, 0,18,15,18,15, 0, - 17, -}; - -static const static_codebook _44un1__p3_0 = { - 4, 625, - (long *)_vq_lengthlist__44un1__p3_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44un1__p3_0, - 0 -}; - -static const long _vq_quantlist__44un1__p4_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44un1__p4_0[] = { - 3, 5, 5, 9, 9, 5, 6, 6,10, 9, 5, 6, 6, 9,10,10, - 10,10,12,11, 9,10,10,12,12, 5, 7, 7,10,10, 7, 7, - 8,10,11, 7, 7, 8,10,11,10,10,11,11,13,10,10,11, - 11,13, 6, 7, 7,10,10, 7, 8, 7,11,10, 7, 8, 7,10, - 10,10,11, 9,13,11,10,11,10,13,11,10,10,10,14,13, - 10,11,11,14,13,10,10,11,13,14,12,12,13,15,15,12, - 12,13,13,14,10,10,10,12,13,10,11,10,13,13,10,11, - 11,13,13,12,13,12,14,13,12,13,13,14,13, 5, 7, 7, - 10,10, 7, 8, 8,11,10, 7, 8, 8,10,10,11,11,11,13, - 13,10,11,11,12,12, 7, 8, 8,11,11, 7, 8, 9,10,12, - 8, 9, 9,11,11,11,10,12,11,14,11,11,12,13,13, 6, - 8, 8,10,11, 7, 9, 7,12,10, 8, 9,10,11,12,10,12, - 10,14,11,11,12,11,13,13,10,11,11,14,14,10,10,11, - 13,14,11,12,12,15,13,12,11,14,12,16,12,13,14,15, - 16,10,10,11,13,14,10,11,10,14,12,11,12,12,13,14, - 12,13,11,15,12,14,14,14,15,15, 5, 7, 7,10,10, 7, - 8, 8,10,10, 7, 8, 8,10,11,10,11,10,12,12,10,11, - 11,12,13, 6, 8, 8,11,11, 8, 9, 9,12,11, 7, 7, 9, - 10,12,11,11,11,12,13,11,10,12,11,15, 7, 8, 8,11, - 11, 8, 9, 9,11,11, 7, 9, 8,12,10,11,12,11,13,12, - 11,12,10,15,11,10,11,10,14,12,11,12,11,14,13,10, - 10,11,13,14,13,13,13,17,15,12,11,14,12,15,10,10, - 11,13,14,11,12,12,14,14,10,11,10,14,13,13,14,13, - 16,17,12,14,11,16,12, 9,10,10,14,13,10,11,10,14, - 14,10,11,11,13,13,13,14,14,16,15,12,13,13,14,14, - 9,11,10,14,13,10,10,12,13,14,11,12,11,14,13,13, - 14,14,14,15,13,14,14,15,15, 9,10,11,13,14,10,11, - 10,15,13,11,11,12,12,15,13,14,12,15,14,13,13,14, - 14,15,12,13,12,16,14,11,11,12,15,14,13,15,13,16, - 14,13,12,15,12,17,15,16,15,16,16,12,12,13,13,15, - 11,13,11,15,14,13,13,14,15,17,13,14,12, 0,13,14, - 15,14,15, 0, 9,10,10,13,13,10,11,11,13,13,10,11, - 11,13,13,12,13,12,14,14,13,14,14,15,17, 9,10,10, - 13,13,11,12,11,15,12,10,10,11,13,16,13,14,13,15, - 14,13,13,14,15,16,10,10,11,13,14,11,11,12,13,14, - 10,12,11,14,14,13,13,13,14,15,13,15,13,16,15,12, - 13,12,15,13,12,15,13,15,15,11,11,13,14,15,15,15, - 15,15,17,13,12,14,13,17,12,12,14,14,15,13,13,14, - 14,16,11,13,11,16,15,14,16,16,17, 0,14,13,11,16, - 12, -}; - -static const static_codebook _44un1__p4_0 = { - 4, 625, - (long *)_vq_lengthlist__44un1__p4_0, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44un1__p4_0, - 0 -}; - -static const long _vq_quantlist__44un1__p5_0[] = { - 4, - 3, - 5, - 2, - 6, - 1, - 7, - 0, - 8, -}; - -static const long _vq_lengthlist__44un1__p5_0[] = { - 1, 4, 4, 7, 7, 8, 8, 9, 9, 4, 6, 5, 8, 7, 8, 8, - 10, 9, 4, 6, 6, 8, 8, 8, 8,10,10, 7, 8, 7, 9, 9, - 9, 9,11,10, 7, 8, 8, 9, 9, 9, 9,10,11, 8, 8, 8, - 9, 9,10,10,11,11, 8, 8, 8, 9, 9,10,10,11,11, 9, - 10,10,11,10,11,11,12,12, 9,10,10,10,11,11,11,12, - 12, -}; - -static const static_codebook _44un1__p5_0 = { - 2, 81, - (long *)_vq_lengthlist__44un1__p5_0, - 1, -531628032, 1611661312, 4, 0, - (long *)_vq_quantlist__44un1__p5_0, - 0 -}; - -static const long _vq_quantlist__44un1__p6_0[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44un1__p6_0[] = { - 1, 4, 4, 6, 6, 8, 8,10,10,11,11,15,15, 4, 5, 5, - 8, 8, 9, 9,11,11,12,12,16,16, 4, 5, 6, 8, 8, 9, - 9,11,11,12,12,14,14, 7, 8, 8, 9, 9,10,10,11,12, - 13,13,16,17, 7, 8, 8, 9, 9,10,10,12,12,12,13,15, - 15, 9,10,10,10,10,11,11,12,12,13,13,15,16, 9, 9, - 9,10,10,11,11,13,12,13,13,17,17,10,11,11,11,12, - 12,12,13,13,14,15, 0,18,10,11,11,12,12,12,13,14, - 13,14,14,17,16,11,12,12,13,13,14,14,14,14,15,16, - 17,16,11,12,12,13,13,14,14,14,14,15,15,17,17,14, - 15,15,16,16,16,17,17,16, 0,17, 0,18,14,15,15,16, - 16, 0,15,18,18, 0,16, 0, 0, -}; - -static const static_codebook _44un1__p6_0 = { - 2, 169, - (long *)_vq_lengthlist__44un1__p6_0, - 1, -526516224, 1616117760, 4, 0, - (long *)_vq_quantlist__44un1__p6_0, - 0 -}; - -static const long _vq_quantlist__44un1__p6_1[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44un1__p6_1[] = { - 2, 4, 4, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 6, 5, 5, - 6, 5, 6, 6, 5, 6, 6, 6, 6, -}; - -static const static_codebook _44un1__p6_1 = { - 2, 25, - (long *)_vq_lengthlist__44un1__p6_1, - 1, -533725184, 1611661312, 3, 0, - (long *)_vq_quantlist__44un1__p6_1, - 0 -}; - -static const long _vq_quantlist__44un1__p7_0[] = { - 2, - 1, - 3, - 0, - 4, -}; - -static const long _vq_lengthlist__44un1__p7_0[] = { - 1, 5, 3,11,11,11,11,11,11,11, 8,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11, 8,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11, 7,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10, -}; - -static const static_codebook _44un1__p7_0 = { - 4, 625, - (long *)_vq_lengthlist__44un1__p7_0, - 1, -518709248, 1626677248, 3, 0, - (long *)_vq_quantlist__44un1__p7_0, - 0 -}; - -static const long _vq_quantlist__44un1__p7_1[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44un1__p7_1[] = { - 1, 4, 4, 6, 6, 6, 6, 9, 8, 9, 8, 8, 8, 5, 7, 7, - 7, 7, 8, 8, 8,10, 8,10, 8, 9, 5, 7, 7, 8, 7, 7, - 8,10,10,11,10,12,11, 7, 8, 8, 9, 9, 9,10,11,11, - 11,11,11,11, 7, 8, 8, 8, 9, 9, 9,10,10,10,11,11, - 12, 7, 8, 8, 9, 9,10,11,11,12,11,12,11,11, 7, 8, - 8, 9, 9,10,10,11,11,11,12,12,11, 8,10,10,10,10, - 11,11,14,11,12,12,12,13, 9,10,10,10,10,12,11,14, - 11,14,11,12,13,10,11,11,11,11,13,11,14,14,13,13, - 13,14,11,11,11,12,11,12,12,12,13,14,14,13,14,12, - 11,12,12,12,12,13,13,13,14,13,14,14,11,12,12,14, - 12,13,13,12,13,13,14,14,14, -}; - -static const static_codebook _44un1__p7_1 = { - 2, 169, - (long *)_vq_lengthlist__44un1__p7_1, - 1, -523010048, 1618608128, 4, 0, - (long *)_vq_quantlist__44un1__p7_1, - 0 -}; - -static const long _vq_quantlist__44un1__p7_2[] = { - 6, - 5, - 7, - 4, - 8, - 3, - 9, - 2, - 10, - 1, - 11, - 0, - 12, -}; - -static const long _vq_lengthlist__44un1__p7_2[] = { - 3, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9, 9, 8, 4, 5, 5, - 6, 6, 8, 8, 9, 8, 9, 9, 9, 9, 4, 5, 5, 7, 6, 8, - 8, 8, 8, 9, 8, 9, 8, 6, 7, 7, 7, 8, 8, 8, 9, 9, - 9, 9, 9, 9, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, - 9, 7, 8, 8, 8, 8, 9, 8, 9, 9,10, 9, 9,10, 7, 8, - 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10, 8, 9, 9, 9, 9, - 9, 9, 9, 9,10,10, 9,10, 8, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9,10,10, 9, 9, 9,10, 9, 9,10, 9, 9,10,10, - 10,10, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10, 9, - 9, 9,10, 9, 9,10,10, 9,10,10,10,10, 9, 9, 9,10, - 9, 9, 9,10,10,10,10,10,10, -}; - -static const static_codebook _44un1__p7_2 = { - 2, 169, - (long *)_vq_lengthlist__44un1__p7_2, - 1, -531103744, 1611661312, 4, 0, - (long *)_vq_quantlist__44un1__p7_2, - 0 -}; - -static const long _huff_lengthlist__44un1__short[] = { - 12,12,14,12,14,14,14,14,12, 6, 6, 8, 9, 9,11,14, - 12, 4, 2, 6, 6, 7,11,14,13, 6, 5, 7, 8, 9,11,14, - 13, 8, 5, 8, 6, 8,12,14,12, 7, 7, 8, 8, 8,10,14, - 12, 6, 3, 4, 4, 4, 7,14,11, 7, 4, 6, 6, 6, 8,14, -}; - -static const static_codebook _huff_book__44un1__short = { - 2, 64, - (long *)_huff_lengthlist__44un1__short, - 0, 0, 0, 0, 0, - NULL, - 0 -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c deleted file mode 100755 index 4876970..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.c +++ /dev/null @@ -1,479 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: basic codebook pack/unpack/code/decode operations - last mod: $Id: codebook.c 17553 2010-10-21 17:54:26Z tterribe $ - - ********************************************************************/ - -#include -#include -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codebook.h" -#include "scales.h" -#include "misc.h" -#include "os.h" - -/* packs the given codebook into the bitstream **************************/ - -int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *opb){ - long i,j; - int ordered=0; - - /* first the basic parameters */ - oggpack_write(opb,0x564342,24); - oggpack_write(opb,c->dim,16); - oggpack_write(opb,c->entries,24); - - /* pack the codewords. There are two packings; length ordered and - length random. Decide between the two now. */ - - for(i=1;ientries;i++) - if(c->lengthlist[i-1]==0 || c->lengthlist[i]lengthlist[i-1])break; - if(i==c->entries)ordered=1; - - if(ordered){ - /* length ordered. We only need to say how many codewords of - each length. The actual codewords are generated - deterministically */ - - long count=0; - oggpack_write(opb,1,1); /* ordered */ - oggpack_write(opb,c->lengthlist[0]-1,5); /* 1 to 32 */ - - for(i=1;ientries;i++){ - long thisx=c->lengthlist[i]; - long last=c->lengthlist[i-1]; - if(thisx>last){ - for(j=last;jentries-count)); - count=i; - } - } - } - oggpack_write(opb,i-count,_ilog(c->entries-count)); - - }else{ - /* length random. Again, we don't code the codeword itself, just - the length. This time, though, we have to encode each length */ - oggpack_write(opb,0,1); /* unordered */ - - /* algortihmic mapping has use for 'unused entries', which we tag - here. The algorithmic mapping happens as usual, but the unused - entry has no codeword. */ - for(i=0;ientries;i++) - if(c->lengthlist[i]==0)break; - - if(i==c->entries){ - oggpack_write(opb,0,1); /* no unused entries */ - for(i=0;ientries;i++) - oggpack_write(opb,c->lengthlist[i]-1,5); - }else{ - oggpack_write(opb,1,1); /* we have unused entries; thus we tag */ - for(i=0;ientries;i++){ - if(c->lengthlist[i]==0){ - oggpack_write(opb,0,1); - }else{ - oggpack_write(opb,1,1); - oggpack_write(opb,c->lengthlist[i]-1,5); - } - } - } - } - - /* is the entry number the desired return value, or do we have a - mapping? If we have a mapping, what type? */ - oggpack_write(opb,c->maptype,4); - switch(c->maptype){ - case 0: - /* no mapping */ - break; - case 1:case 2: - /* implicitly populated value mapping */ - /* explicitly populated value mapping */ - - if(!c->quantlist){ - /* no quantlist? error */ - return(-1); - } - - /* values that define the dequantization */ - oggpack_write(opb,c->q_min,32); - oggpack_write(opb,c->q_delta,32); - oggpack_write(opb,c->q_quant-1,4); - oggpack_write(opb,c->q_sequencep,1); - - { - int quantvals; - switch(c->maptype){ - case 1: - /* a single column of (c->entries/c->dim) quantized values for - building a full value list algorithmically (square lattice) */ - quantvals=_book_maptype1_quantvals(c); - break; - case 2: - /* every value (c->entries*c->dim total) specified explicitly */ - quantvals=c->entries*c->dim; - break; - default: /* NOT_REACHABLE */ - quantvals=-1; - } - - /* quantized values */ - for(i=0;iquantlist[i]),c->q_quant); - - } - break; - default: - /* error case; we don't have any other map types now */ - return(-1); - } - - return(0); -} - -/* unpacks a codebook from the packet buffer into the codebook struct, - readies the codebook auxiliary structures for decode *************/ -static_codebook *vorbis_staticbook_unpack(oggpack_buffer *opb){ - long i,j; - static_codebook *s=(static_codebook*)_ogg_calloc(1,sizeof(*s)); - s->allocedp=1; - - /* make sure alignment is correct */ - if(oggpack_read(opb,24)!=0x564342)goto _eofout; - - /* first the basic parameters */ - s->dim=oggpack_read(opb,16); - s->entries=oggpack_read(opb,24); - if(s->entries==-1)goto _eofout; - - if(_ilog(s->dim)+_ilog(s->entries)>24)goto _eofout; - - /* codeword ordering.... length ordered or unordered? */ - switch((int)oggpack_read(opb,1)){ - case 0:{ - long unused; - /* allocated but unused entries? */ - unused=oggpack_read(opb,1); - if((s->entries*(unused?1:5)+7)>>3>opb->storage-oggpack_bytes(opb)) - goto _eofout; - /* unordered */ - s->lengthlist=(long*)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); - - /* allocated but unused entries? */ - if(unused){ - /* yes, unused entries */ - - for(i=0;ientries;i++){ - if(oggpack_read(opb,1)){ - long num=oggpack_read(opb,5); - if(num==-1)goto _eofout; - s->lengthlist[i]=num+1; - }else - s->lengthlist[i]=0; - } - }else{ - /* all entries used; no tagging */ - for(i=0;ientries;i++){ - long num=oggpack_read(opb,5); - if(num==-1)goto _eofout; - s->lengthlist[i]=num+1; - } - } - - break; - } - case 1: - /* ordered */ - { - long length=oggpack_read(opb,5)+1; - if(length==0)goto _eofout; - s->lengthlist=(long*)_ogg_malloc(sizeof(*s->lengthlist)*s->entries); - - for(i=0;ientries;){ - long num=oggpack_read(opb,_ilog(s->entries-i)); - if(num==-1)goto _eofout; - if(length>32 || num>s->entries-i || - (num>0 && (num-1)>>(length-1)>1)){ - goto _errout; - } - if(length>32)goto _errout; - for(j=0;jlengthlist[i]=length; - length++; - } - } - break; - default: - /* EOF */ - goto _eofout; - } - - /* Do we have a mapping to unpack? */ - switch((s->maptype=oggpack_read(opb,4))){ - case 0: - /* no mapping */ - break; - case 1: case 2: - /* implicitly populated value mapping */ - /* explicitly populated value mapping */ - - s->q_min=oggpack_read(opb,32); - s->q_delta=oggpack_read(opb,32); - s->q_quant=oggpack_read(opb,4)+1; - s->q_sequencep=oggpack_read(opb,1); - if(s->q_sequencep==-1)goto _eofout; - - { - int quantvals=0; - switch(s->maptype){ - case 1: - quantvals=(s->dim==0?0:_book_maptype1_quantvals(s)); - break; - case 2: - quantvals=s->entries*s->dim; - break; - } - - /* quantized values */ - if(((quantvals * s->q_quant + 7) >> 3) > opb->storage-oggpack_bytes(opb)) - goto _eofout; - s->quantlist=(long*)_ogg_malloc(sizeof(*s->quantlist)*quantvals); - for(i=0;iquantlist[i]=oggpack_read(opb,s->q_quant); - - if(quantvals&&s->quantlist[quantvals-1]==-1)goto _eofout; - } - break; - default: - goto _errout; - } - - /* all set */ - return(s); - - _errout: - _eofout: - vorbis_staticbook_destroy(s); - return(NULL); -} - -/* returns the number of bits ************************************************/ -int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b){ - if(a<0 || a>=book->c->entries)return(0); - oggpack_write(b,book->codelist[a],book->c->lengthlist[a]); - return(book->c->lengthlist[a]); -} - -/* the 'eliminate the decode tree' optimization actually requires the - codewords to be MSb first, not LSb. This is an annoying inelegancy - (and one of the first places where carefully thought out design - turned out to be wrong; Vorbis II and future Ogg codecs should go - to an MSb bitpacker), but not actually the huge hit it appears to - be. The first-stage decode table catches most words so that - bitreverse is not in the main execution path. */ - -static ogg_uint32_t bitreverse(ogg_uint32_t x){ - x= ((x>>16)&0x0000ffff) | ((x<<16)&0xffff0000); - x= ((x>> 8)&0x00ff00ff) | ((x<< 8)&0xff00ff00); - x= ((x>> 4)&0x0f0f0f0f) | ((x<< 4)&0xf0f0f0f0); - x= ((x>> 2)&0x33333333) | ((x<< 2)&0xcccccccc); - return((x>> 1)&0x55555555) | ((x<< 1)&0xaaaaaaaa); -} - -STIN long decode_packed_entry_number(codebook *book, oggpack_buffer *b){ - int read=book->dec_maxlength; - long lo,hi; - long lok = oggpack_look(b,book->dec_firsttablen); - - if (lok >= 0) { - long entry = book->dec_firsttable[lok]; - if(entry&0x80000000UL){ - lo=(entry>>15)&0x7fff; - hi=book->used_entries-(entry&0x7fff); - }else{ - oggpack_adv(b, book->dec_codelengths[entry-1]); - return(entry-1); - } - }else{ - lo=0; - hi=book->used_entries; - } - - lok = oggpack_look(b, read); - - while(lok<0 && read>1) - lok = oggpack_look(b, --read); - if(lok<0)return -1; - - /* bisect search for the codeword in the ordered list */ - { - ogg_uint32_t testword=bitreverse((ogg_uint32_t)lok); - - while(hi-lo>1){ - long p=(hi-lo)>>1; - long test=book->codelist[lo+p]>testword; - lo+=p&(test-1); - hi-=p&(-test); - } - - if(book->dec_codelengths[lo]<=read){ - oggpack_adv(b, book->dec_codelengths[lo]); - return(lo); - } - } - - oggpack_adv(b, read); - - return(-1); -} - -/* Decode side is specced and easier, because we don't need to find - matches using different criteria; we simply read and map. There are - two things we need to do 'depending': - - We may need to support interleave. We don't really, but it's - convenient to do it here rather than rebuild the vector later. - - Cascades may be additive or multiplicitive; this is not inherent in - the codebook, but set in the code using the codebook. Like - interleaving, it's easiest to do it here. - addmul==0 -> declarative (set the value) - addmul==1 -> additive - addmul==2 -> multiplicitive */ - -/* returns the [original, not compacted] entry number or -1 on eof *********/ -long vorbis_book_decode(codebook *book, oggpack_buffer *b){ - if(book->used_entries>0){ - long packed_entry=decode_packed_entry_number(book,b); - if(packed_entry>=0) - return(book->dec_index[packed_entry]); - } - - /* if there's no dec_index, the codebook unpacking isn't collapsed */ - return(-1); -} - -/* returns 0 on OK or -1 on eof *************************************/ -long vorbis_book_decodevs_add(codebook *book,float *a,oggpack_buffer *b,int n){ - if(book->used_entries>0){ - int step=n/book->dim; - long *entry = (long*)alloca(sizeof(*entry)*step); - float **t = (float**)alloca(sizeof(*t)*step); - int i,j,o; - - for (i = 0; i < step; i++) { - entry[i]=decode_packed_entry_number(book,b); - if(entry[i]==-1)return(-1); - t[i] = book->valuelist+entry[i]*book->dim; - } - for(i=0,o=0;idim;i++,o+=step) - for (j=0;jused_entries>0){ - int i,j,entry; - float *t; - - if(book->dim>8){ - for(i=0;ivaluelist+entry*book->dim; - for (j=0;jdim;) - a[i++]+=t[j++]; - } - }else{ - for(i=0;ivaluelist+entry*book->dim; - j=0; - switch((int)book->dim){ - case 8: - a[i++]+=t[j++]; - case 7: - a[i++]+=t[j++]; - case 6: - a[i++]+=t[j++]; - case 5: - a[i++]+=t[j++]; - case 4: - a[i++]+=t[j++]; - case 3: - a[i++]+=t[j++]; - case 2: - a[i++]+=t[j++]; - case 1: - a[i++]+=t[j++]; - case 0: - break; - } - } - } - } - return(0); -} - -long vorbis_book_decodev_set(codebook *book,float *a,oggpack_buffer *b,int n){ - if(book->used_entries>0){ - int i,j,entry; - float *t; - - for(i=0;ivaluelist+entry*book->dim; - for (j=0;jdim;) - a[i++]=t[j++]; - } - }else{ - int i,j; - - for(i=0;idim;) - a[i++]=0.f; - } - } - return(0); -} - -long vorbis_book_decodevv_add(codebook *book,float **a,long offset,int ch, - oggpack_buffer *b,int n){ - - long i,j,entry; - int chptr=0; - if(book->used_entries>0){ - for(i=offset/ch;i<(offset+n)/ch;){ - entry = decode_packed_entry_number(book,b); - if(entry==-1)return(-1); - { - const float *t = book->valuelist+entry*book->dim; - for (j=0;jdim;j++){ - a[chptr++][i]+=t[j]; - if(chptr==ch){ - chptr=0; - i++; - } - } - } - } - } - return(0); -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h deleted file mode 100755 index 3476527..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codebook.h +++ /dev/null @@ -1,119 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: basic shared codebook operations - last mod: $Id: codebook.h 17030 2010-03-25 06:52:55Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_CODEBOOK_H_ -#define _V_CODEBOOK_H_ - -#include "../../ogg.h" - -/* This structure encapsulates huffman and VQ style encoding books; it - doesn't do anything specific to either. - - valuelist/quantlist are nonNULL (and q_* significant) only if - there's entry->value mapping to be done. - - If encode-side mapping must be done (and thus the entry needs to be - hunted), the auxiliary encode pointer will point to a decision - tree. This is true of both VQ and huffman, but is mostly useful - with VQ. - -*/ - -typedef struct static_codebook{ - long dim; /* codebook dimensions (elements per vector) */ - long entries; /* codebook entries */ - long *lengthlist; /* codeword lengths in bits */ - - /* mapping ***************************************************************/ - int maptype; /* 0=none - 1=implicitly populated values from map column - 2=listed arbitrary values */ - - /* The below does a linear, single monotonic sequence mapping. */ - long q_min; /* packed 32 bit float; quant value 0 maps to minval */ - long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ - int q_quant; /* bits: 0 < quant <= 16 */ - int q_sequencep; /* bitflag */ - - long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map - map == 2: list of dim*entries quantized entry vals - */ - int allocedp; -} static_codebook; - -typedef struct codebook{ - long dim; /* codebook dimensions (elements per vector) */ - long entries; /* codebook entries */ - long used_entries; /* populated codebook entries */ - const static_codebook *c; - - /* for encode, the below are entry-ordered, fully populated */ - /* for decode, the below are ordered by bitreversed codeword and only - used entries are populated */ - float *valuelist; /* list of dim*entries actual entry values */ - ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */ - - int *dec_index; /* only used if sparseness collapsed */ - char *dec_codelengths; - ogg_uint32_t *dec_firsttable; - int dec_firsttablen; - int dec_maxlength; - - /* The current encoder uses only centered, integer-only lattice books. */ - int quantvals; - int minval; - int delta; -} codebook; - -extern void vorbis_staticbook_destroy(static_codebook *b); -extern int vorbis_book_init_encode(codebook *dest,const static_codebook *source); -extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source); -extern void vorbis_book_clear(codebook *b); - -extern float *_book_unquantize(const static_codebook *b,int n,int *map); -extern float *_book_logdist(const static_codebook *b,float *vals); -extern float _float32_unpack(long val); -extern long _float32_pack(float val); -extern int _best(codebook *book, float *a, int step); -extern int _ilog(unsigned int v); -extern long _book_maptype1_quantvals(const static_codebook *b); - -extern int vorbis_book_besterror(codebook *book,float *a,int step,int addmul); -extern long vorbis_book_codeword(codebook *book,int entry); -extern long vorbis_book_codelen(codebook *book,int entry); - - - -extern int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *b); -extern static_codebook *vorbis_staticbook_unpack(oggpack_buffer *b); - -extern int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b); - -extern long vorbis_book_decode(codebook *book, oggpack_buffer *b); -extern long vorbis_book_decodevs_add(codebook *book, float *a, - oggpack_buffer *b,int n); -extern long vorbis_book_decodev_set(codebook *book, float *a, - oggpack_buffer *b,int n); -extern long vorbis_book_decodev_add(codebook *book, float *a, - oggpack_buffer *b,int n); -extern long vorbis_book_decodevv_add(codebook *book, float **a, - long off,int ch, - oggpack_buffer *b,int n); - - - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h deleted file mode 100755 index e466486..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/codec_internal.h +++ /dev/null @@ -1,187 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: libvorbis codec headers - last mod: $Id: codec_internal.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_CODECI_H_ -#define _V_CODECI_H_ - -#include "envelope.h" -#include "codebook.h" - -#define BLOCKTYPE_IMPULSE 0 -#define BLOCKTYPE_PADDING 1 -#define BLOCKTYPE_TRANSITION 0 -#define BLOCKTYPE_LONG 1 - -#define PACKETBLOBS 15 - -typedef struct vorbis_block_internal{ - float **pcmdelay; /* this is a pointer into local storage */ - float ampmax; - int blocktype; - - oggpack_buffer *packetblob[PACKETBLOBS]; /* initialized, must be freed; - blob [PACKETBLOBS/2] points to - the oggpack_buffer in the - main vorbis_block */ -} vorbis_block_internal; - -typedef void vorbis_look_floor; -typedef void vorbis_look_residue; -typedef void vorbis_look_transform; - -/* mode ************************************************************/ -typedef struct { - int blockflag; - int windowtype; - int transformtype; - int mapping; -} vorbis_info_mode; - -typedef void vorbis_info_floor; -typedef void vorbis_info_residue; -typedef void vorbis_info_mapping; - -#include "psy.h" -#include "bitrate.h" - -static int ilog(unsigned int v){ - int ret=0; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - -static int ilog2(unsigned int v){ - int ret=0; - if(v)--v; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - - -typedef struct private_state { - /* local lookup storage */ - envelope_lookup *ve; /* envelope lookup */ - int window[2]; - vorbis_look_transform **transform[2]; /* block, type */ - drft_lookup fft_look[2]; - - int modebits; - vorbis_look_floor **flr; - vorbis_look_residue **residue; - vorbis_look_psy *psy; - vorbis_look_psy_global *psy_g_look; - - /* local storage, only used on the encoding side. This way the - application does not need to worry about freeing some packets' - memory and not others'; packet storage is always tracked. - Cleared next call to a _dsp_ function */ - unsigned char *header; - unsigned char *header1; - unsigned char *header2; - - bitrate_manager_state bms; - - ogg_int64_t sample_count; -} private_state; - -/* codec_setup_info contains all the setup information specific to the - specific compression/decompression mode in progress (eg, - psychoacoustic settings, channel setup, options, codebook - etc). -*********************************************************************/ - -#include "highlevel.h" -typedef struct codec_setup_info { - - /* Vorbis supports only short and long blocks, but allows the - encoder to choose the sizes */ - - long blocksizes[2]; - - /* modes are the primary means of supporting on-the-fly different - blocksizes, different channel mappings (LR or M/A), - different residue backends, etc. Each mode consists of a - blocksize flag and a mapping (along with the mapping setup */ - - int modes; - int maps; - int floors; - int residues; - int books; - int psys; /* encode only */ - - vorbis_info_mode *mode_param[64]; - int map_type[64]; - vorbis_info_mapping *map_param[64]; - int floor_type[64]; - vorbis_info_floor *floor_param[64]; - int residue_type[64]; - vorbis_info_residue *residue_param[64]; - static_codebook *book_param[256]; - codebook *fullbooks; - - vorbis_info_psy *psy_param[4]; /* encode only */ - vorbis_info_psy_global psy_g_param; - - bitrate_manager_info bi; - highlevel_encode_setup hi; /* used only by vorbisenc.c. It's a - highly redundant structure, but - improves clarity of program flow. */ - int halfrate_flag; /* painless downsample for decode */ -} codec_setup_info; - -extern vorbis_look_psy_global *_vp_global_look(vorbis_info *vi); -extern void _vp_global_free(vorbis_look_psy_global *look); - - - -typedef struct { - int sorted_index[VIF_POSIT+2]; - int forward_index[VIF_POSIT+2]; - int reverse_index[VIF_POSIT+2]; - - int hineighbor[VIF_POSIT]; - int loneighbor[VIF_POSIT]; - int posts; - - int n; - int quant_q; - vorbis_info_floor1 *vi; - - long phrasebits; - long postbits; - long frames; -} vorbis_look_floor1; - - - -extern int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look, - const float *logmdct, /* in */ - const float *logmask); -extern int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look, - int *A,int *B, - int del); -extern int floor1_encode(oggpack_buffer *opb,vorbis_block *vb, - vorbis_look_floor1 *look, - int *post,int *ilogmask); -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c deleted file mode 100755 index 72c4db6..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.c +++ /dev/null @@ -1,375 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: PCM data envelope analysis - last mod: $Id: envelope.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codec_internal.h" - -#include "os.h" -#include "scales.h" -#include "envelope.h" -#include "mdct.h" -#include "misc.h" - -void _ve_envelope_init(envelope_lookup *e,vorbis_info *vi){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy_global *gi=&ci->psy_g_param; - int ch=vi->channels; - int i,j; - int n=e->winlength=128; - e->searchstep=64; /* not random */ - - e->minenergy=gi->preecho_minenergy; - e->ch=ch; - e->storage=128; - e->cursor=ci->blocksizes[1]/2; - e->mdct_win=(float*)_ogg_calloc(n,sizeof(*e->mdct_win)); - mdct_init(&e->mdct,n); - - for(i=0;imdct_win[i]=sin(i/(n-1.)*M_PI); - e->mdct_win[i]*=e->mdct_win[i]; - } - - /* magic follows */ - e->band[0].begin=2; e->band[0].end=4; - e->band[1].begin=4; e->band[1].end=5; - e->band[2].begin=6; e->band[2].end=6; - e->band[3].begin=9; e->band[3].end=8; - e->band[4].begin=13; e->band[4].end=8; - e->band[5].begin=17; e->band[5].end=8; - e->band[6].begin=22; e->band[6].end=8; - - for(j=0;jband[j].end; - e->band[j].window=(float*)_ogg_malloc(n*sizeof(*e->band[0].window)); - for(i=0;iband[j].window[i]=sin((i+.5)/n*M_PI); - e->band[j].total+=e->band[j].window[i]; - } - e->band[j].total=1./e->band[j].total; - } - - e->filter=(envelope_filter_state*)_ogg_calloc(VE_BANDS*ch,sizeof(*e->filter)); - e->mark=(int*)_ogg_calloc(e->storage,sizeof(*e->mark)); - -} - -void _ve_envelope_clear(envelope_lookup *e){ - int i; - mdct_clear(&e->mdct); - for(i=0;iband[i].window); - _ogg_free(e->mdct_win); - _ogg_free(e->filter); - _ogg_free(e->mark); - memset(e,0,sizeof(*e)); -} - -/* fairly straight threshhold-by-band based until we find something - that works better and isn't patented. */ - -static int _ve_amp(envelope_lookup *ve, - vorbis_info_psy_global *gi, - float *data, - envelope_band *bands, - envelope_filter_state *filters){ - long n=ve->winlength; - int ret=0; - long i,j; - float decay; - - /* we want to have a 'minimum bar' for energy, else we're just - basing blocks on quantization noise that outweighs the signal - itself (for low power signals) */ - - float minV=ve->minenergy; - float *vec=(float*) alloca(n*sizeof(*vec)); - - /* stretch is used to gradually lengthen the number of windows - considered prevoius-to-potential-trigger */ - int stretch=max(VE_MINSTRETCH,ve->stretch/2); - float penalty=gi->stretch_penalty-(ve->stretch/2-VE_MINSTRETCH); - if(penalty<0.f)penalty=0.f; - if(penalty>gi->stretch_penalty)penalty=gi->stretch_penalty; - - /*_analysis_output_always("lpcm",seq2,data,n,0,0, - totalshift+pos*ve->searchstep);*/ - - /* window and transform */ - for(i=0;imdct_win[i]; - mdct_forward(&ve->mdct,vec,vec); - - /*_analysis_output_always("mdct",seq2,vec,n/2,0,1,0); */ - - /* near-DC spreading function; this has nothing to do with - psychoacoustics, just sidelobe leakage and window size */ - { - float temp=vec[0]*vec[0]+.7*vec[1]*vec[1]+.2*vec[2]*vec[2]; - int ptr=filters->nearptr; - - /* the accumulation is regularly refreshed from scratch to avoid - floating point creep */ - if(ptr==0){ - decay=filters->nearDC_acc=filters->nearDC_partialacc+temp; - filters->nearDC_partialacc=temp; - }else{ - decay=filters->nearDC_acc+=temp; - filters->nearDC_partialacc+=temp; - } - filters->nearDC_acc-=filters->nearDC[ptr]; - filters->nearDC[ptr]=temp; - - decay*=(1./(VE_NEARDC+1)); - filters->nearptr++; - if(filters->nearptr>=VE_NEARDC)filters->nearptr=0; - decay=todB(&decay)*.5-15.f; - } - - /* perform spreading and limiting, also smooth the spectrum. yes, - the MDCT results in all real coefficients, but it still *behaves* - like real/imaginary pairs */ - for(i=0;i>1]=val; - decay-=8.; - } - - /*_analysis_output_always("spread",seq2++,vec,n/4,0,0,0);*/ - - /* perform preecho/postecho triggering by band */ - for(j=0;j=VE_AMP)filters[j].ampptr=0; - } - - /* look at min/max, decide trigger */ - if(valmax>gi->preecho_thresh[j]+penalty){ - ret|=1; - ret|=4; - } - if(valminpostecho_thresh[j]-penalty)ret|=2; - } - - return(ret); -} - -#if 0 -static int seq=0; -static ogg_int64_t totalshift=-1024; -#endif - -long _ve_envelope_search(vorbis_dsp_state *v){ - vorbis_info *vi=v->vi; - codec_setup_info *ci=(codec_setup_info *)vi->codec_setup; - vorbis_info_psy_global *gi=&ci->psy_g_param; - envelope_lookup *ve=((private_state *)(v->backend_state))->ve; - long i,j; - - int first=ve->current/ve->searchstep; - int last=v->pcm_current/ve->searchstep-VE_WIN; - if(first<0)first=0; - - /* make sure we have enough storage to match the PCM */ - if(last+VE_WIN+VE_POST>ve->storage){ - ve->storage=last+VE_WIN+VE_POST; /* be sure */ - ve->mark=(int*)_ogg_realloc(ve->mark,ve->storage*sizeof(*ve->mark)); - } - - for(j=first;jstretch++; - if(ve->stretch>VE_MAXSTRETCH*2) - ve->stretch=VE_MAXSTRETCH*2; - - for(i=0;ich;i++){ - float *pcm=v->pcm[i]+ve->searchstep*(j); - ret|=_ve_amp(ve,gi,pcm,ve->band,ve->filter+i*VE_BANDS); - } - - ve->mark[j+VE_POST]=0; - if(ret&1){ - ve->mark[j]=1; - ve->mark[j+1]=1; - } - - if(ret&2){ - ve->mark[j]=1; - if(j>0)ve->mark[j-1]=1; - } - - if(ret&4)ve->stretch=-1; - } - - ve->current=last*ve->searchstep; - - { - long centerW=v->centerW; - long testW= - centerW+ - ci->blocksizes[v->W]/4+ - ci->blocksizes[1]/2+ - ci->blocksizes[0]/4; - - j=ve->cursor; - - while(jcurrent-(ve->searchstep)){/* account for postecho - working back one window */ - if(j>=testW)return(1); - - ve->cursor=j; - - if(ve->mark[j/ve->searchstep]){ - if(j>centerW){ - -#if 0 - if(j>ve->curmark){ - float *marker=(float*)alloca(v->pcm_current*sizeof(*marker)); - int l,m; - memset(marker,0,sizeof(*marker)*v->pcm_current); - fprintf(stderr,"mark! seq=%d, cursor:%fs time:%fs\n", - seq, - (totalshift+ve->cursor)/44100., - (totalshift+j)/44100.); - _analysis_output_always("pcmL",seq,v->pcm[0],v->pcm_current,0,0,totalshift); - _analysis_output_always("pcmR",seq,v->pcm[1],v->pcm_current,0,0,totalshift); - - _analysis_output_always("markL",seq,v->pcm[0],j,0,0,totalshift); - _analysis_output_always("markR",seq,v->pcm[1],j,0,0,totalshift); - - for(m=0;msearchstep]=ve->filter[m].markers[l]*.1; - _analysis_output_always(buf,seq,marker,v->pcm_current,0,0,totalshift); - } - - for(m=0;msearchstep]=ve->filter[m+VE_BANDS].markers[l]*.1; - _analysis_output_always(buf,seq,marker,v->pcm_current,0,0,totalshift); - } - - for(l=0;lsearchstep]=ve->mark[l]*.4; - _analysis_output_always("mark",seq,marker,v->pcm_current,0,0,totalshift); - - - seq++; - - } -#endif - - ve->curmark=j; - if(j>=testW)return(1); - return(0); - } - } - j+=ve->searchstep; - } - } - - return(-1); -} - -int _ve_envelope_mark(vorbis_dsp_state *v){ - envelope_lookup *ve=((private_state *)(v->backend_state))->ve; - vorbis_info *vi=v->vi; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - long centerW=v->centerW; - long beginW=centerW-ci->blocksizes[v->W]/4; - long endW=centerW+ci->blocksizes[v->W]/4; - if(v->W){ - beginW-=ci->blocksizes[v->lW]/4; - endW+=ci->blocksizes[v->nW]/4; - }else{ - beginW-=ci->blocksizes[0]/4; - endW+=ci->blocksizes[0]/4; - } - - if(ve->curmark>=beginW && ve->curmarksearchstep; - long last=endW/ve->searchstep; - long i; - for(i=first;imark[i])return(1); - } - return(0); -} - -void _ve_envelope_shift(envelope_lookup *e,long shift){ - int smallsize=e->current/e->searchstep+VE_POST; /* adjust for placing marks - ahead of ve->current */ - int smallshift=shift/e->searchstep; - - memmove(e->mark,e->mark+smallshift,(smallsize-smallshift)*sizeof(*e->mark)); - -#if 0 - for(i=0;ich;i++) - memmove(e->filter[i].markers, - e->filter[i].markers+smallshift, - (1024-smallshift)*sizeof(*(*e->filter).markers)); - totalshift+=shift; -#endif - - e->current-=shift; - if(e->curmark>=0) - e->curmark-=shift; - e->cursor-=shift; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h deleted file mode 100755 index 8237b90..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/envelope.h +++ /dev/null @@ -1,80 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: PCM data envelope analysis and manipulation - last mod: $Id: envelope.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_ENVELOPE_ -#define _V_ENVELOPE_ - -#include "mdct.h" - -#define VE_PRE 16 -#define VE_WIN 4 -#define VE_POST 2 -#define VE_AMP (VE_PRE+VE_POST-1) - -#define VE_BANDS 7 -#define VE_NEARDC 15 - -#define VE_MINSTRETCH 2 /* a bit less than short block */ -#define VE_MAXSTRETCH 12 /* one-third full block */ - -typedef struct { - float ampbuf[VE_AMP]; - int ampptr; - - float nearDC[VE_NEARDC]; - float nearDC_acc; - float nearDC_partialacc; - int nearptr; - -} envelope_filter_state; - -typedef struct { - int begin; - int end; - float *window; - float total; -} envelope_band; - -typedef struct { - int ch; - int winlength; - int searchstep; - float minenergy; - - mdct_lookup mdct; - float *mdct_win; - - envelope_band band[VE_BANDS]; - envelope_filter_state *filter; - int stretch; - - int *mark; - - long storage; - long current; - long curmark; - long cursor; -} envelope_lookup; - -extern void _ve_envelope_init(envelope_lookup *e,vorbis_info *vi); -extern void _ve_envelope_clear(envelope_lookup *e); -extern long _ve_envelope_search(vorbis_dsp_state *v); -extern void _ve_envelope_shift(envelope_lookup *e,long shift); -extern int _ve_envelope_mark(vorbis_dsp_state *v); - - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c deleted file mode 100755 index 4eac09c..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor0.c +++ /dev/null @@ -1,223 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: floor backend 0 implementation - last mod: $Id: floor0.c 17558 2010-10-22 00:24:41Z tterribe $ - - ********************************************************************/ - - -#include -#include -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "lpc.h" -#include "lsp.h" -#include "codebook.h" -#include "scales.h" -#include "misc.h" -#include "os.h" - -#include "misc.h" -#include - -typedef struct { - int ln; - int m; - int **linearmap; - int n[2]; - - vorbis_info_floor0 *vi; - - long bits; - long frames; -} vorbis_look_floor0; - - -/***********************************************/ - -static void floor0_free_info(vorbis_info_floor *i){ - vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -static void floor0_free_look(vorbis_look_floor *i){ - vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; - if(look){ - - if(look->linearmap){ - - if(look->linearmap[0])_ogg_free(look->linearmap[0]); - if(look->linearmap[1])_ogg_free(look->linearmap[1]); - - _ogg_free(look->linearmap); - } - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -static vorbis_info_floor *floor0_unpack (vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - int j; - - vorbis_info_floor0 *info=(vorbis_info_floor0*)_ogg_malloc(sizeof(*info)); - info->order=oggpack_read(opb,8); - info->rate=oggpack_read(opb,16); - info->barkmap=oggpack_read(opb,16); - info->ampbits=oggpack_read(opb,6); - info->ampdB=oggpack_read(opb,8); - info->numbooks=oggpack_read(opb,4)+1; - - if(info->order<1)goto err_out; - if(info->rate<1)goto err_out; - if(info->barkmap<1)goto err_out; - if(info->numbooks<1)goto err_out; - - for(j=0;jnumbooks;j++){ - info->books[j]=oggpack_read(opb,8); - if(info->books[j]<0 || info->books[j]>=ci->books)goto err_out; - if(ci->book_param[info->books[j]]->maptype==0)goto err_out; - if(ci->book_param[info->books[j]]->dim<1)goto err_out; - } - return(info); - - err_out: - floor0_free_info(info); - return(NULL); -} - -/* initialize Bark scale and normalization lookups. We could do this - with static tables, but Vorbis allows a number of possible - combinations, so it's best to do it computationally. - - The below is authoritative in terms of defining scale mapping. - Note that the scale depends on the sampling rate as well as the - linear block and mapping sizes */ - -static void floor0_map_lazy_init(vorbis_block *vb, - vorbis_info_floor *infoX, - vorbis_look_floor0 *look){ - if(!look->linearmap[vb->W]){ - vorbis_dsp_state *vd=vb->vd; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_floor0 *info=(vorbis_info_floor0 *)infoX; - int W=vb->W; - int n=ci->blocksizes[W]/2,j; - - /* we choose a scaling constant so that: - floor(bark(rate/2-1)*C)=mapped-1 - floor(bark(rate/2)*C)=mapped */ - float scale=look->ln/toBARK(info->rate/2.f); - - /* the mapping from a linear scale to a smaller bark scale is - straightforward. We do *not* make sure that the linear mapping - does not skip bark-scale bins; the decoder simply skips them and - the encoder may do what it wishes in filling them. They're - necessary in some mapping combinations to keep the scale spacing - accurate */ - look->linearmap[W]=(int*)_ogg_malloc((n+1)*sizeof(**look->linearmap)); - for(j=0;jrate/2.f)/n*j) - *scale); /* bark numbers represent band edges */ - if(val>=look->ln)val=look->ln-1; /* guard against the approximation */ - look->linearmap[W][j]=val; - } - look->linearmap[W][j]=-1; - look->n[W]=n; - } -} - -static vorbis_look_floor *floor0_look(vorbis_dsp_state* /* vd */, - vorbis_info_floor *i){ - vorbis_info_floor0 *info=(vorbis_info_floor0 *)i; - vorbis_look_floor0 *look=(vorbis_look_floor0*)_ogg_calloc(1,sizeof(*look)); - look->m=info->order; - look->ln=info->barkmap; - look->vi=info; - - look->linearmap=(int**)_ogg_calloc(2,sizeof(*look->linearmap)); - - return look; -} - -static void *floor0_inverse1(vorbis_block *vb,vorbis_look_floor *i){ - vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; - vorbis_info_floor0 *info=look->vi; - int j,k; - - int ampraw=oggpack_read(&vb->opb,info->ampbits); - if(ampraw>0){ /* also handles the -1 out of data case */ - long maxval=(1<ampbits)-1; - float amp=(float)ampraw/maxval*info->ampdB; - int booknum=oggpack_read(&vb->opb,_ilog(info->numbooks)); - - if(booknum!=-1 && booknumnumbooks){ /* be paranoid */ - codec_setup_info *ci=(codec_setup_info *)vb->vd->vi->codec_setup; - codebook *b=ci->fullbooks+info->books[booknum]; - float last=0.f; - - /* the additional b->dim is a guard against any possible stack - smash; b->dim is provably more than we can overflow the - vector */ - float *lsp=(float*)_vorbis_block_alloc(vb,sizeof(*lsp)*(look->m+b->dim+1)); - - for(j=0;jm;j+=b->dim) - if(vorbis_book_decodev_set(b,lsp+j,&vb->opb,b->dim)==-1)goto eop; - for(j=0;jm;){ - for(k=0;kdim;k++,j++)lsp[j]+=last; - last=lsp[j-1]; - } - - lsp[look->m]=amp; - return(lsp); - } - } - eop: - return(NULL); -} - -static int floor0_inverse2(vorbis_block *vb,vorbis_look_floor *i, - void *memo,float *out){ - vorbis_look_floor0 *look=(vorbis_look_floor0 *)i; - vorbis_info_floor0 *info=look->vi; - - floor0_map_lazy_init(vb,info,look); - - if(memo){ - float *lsp=(float *)memo; - float amp=lsp[look->m]; - - /* take the coefficients back to a spectral envelope curve */ - vorbis_lsp_to_curve(out, - look->linearmap[vb->W], - look->n[vb->W], - look->ln, - lsp,look->m,amp,(float)info->ampdB); - return(1); - } - memset(out,0,sizeof(*out)*look->n[vb->W]); - return(0); -} - -/* export hooks */ -const vorbis_func_floor floor0_exportbundle={ - NULL,&floor0_unpack,&floor0_look,&floor0_free_info, - &floor0_free_look,&floor0_inverse1,&floor0_inverse2 -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c deleted file mode 100755 index 8ea1978..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/floor1.c +++ /dev/null @@ -1,1080 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: floor backend 1 implementation - last mod: $Id: floor1.c 17555 2010-10-21 18:14:51Z tterribe $ - - ********************************************************************/ - -#include -#include -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "codebook.h" -#include "misc.h" -#include "scales.h" - -#include - -#define floor1_rangedB 140 /* floor 1 fixed at -140dB to 0dB range */ - -typedef struct lsfit_acc{ - int x0; - int x1; - - int xa; - int ya; - int x2a; - int y2a; - int xya; - int an; - - int xb; - int yb; - int x2b; - int y2b; - int xyb; - int bn; -} lsfit_acc; - -/***********************************************/ - -static void floor1_free_info(vorbis_info_floor *i){ - vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -static void floor1_free_look(vorbis_look_floor *i){ - vorbis_look_floor1 *look=(vorbis_look_floor1 *)i; - if(look){ - /*fprintf(stderr,"floor 1 bit usage %f:%f (%f total)\n", - (float)look->phrasebits/look->frames, - (float)look->postbits/look->frames, - (float)(look->postbits+look->phrasebits)/look->frames);*/ - - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -static void floor1_pack (vorbis_info_floor *i,oggpack_buffer *opb){ - vorbis_info_floor1 *info=(vorbis_info_floor1 *)i; - int j,k; - int count=0; - int rangebits; - int maxposit=info->postlist[1]; - int maxclass=-1; - - /* save out partitions */ - oggpack_write(opb,info->partitions,5); /* only 0 to 31 legal */ - for(j=0;jpartitions;j++){ - oggpack_write(opb,info->partitionclass[j],4); /* only 0 to 15 legal */ - if(maxclasspartitionclass[j])maxclass=info->partitionclass[j]; - } - - /* save out partition classes */ - for(j=0;jclass_dim[j]-1,3); /* 1 to 8 */ - oggpack_write(opb,info->class_subs[j],2); /* 0 to 3 */ - if(info->class_subs[j])oggpack_write(opb,info->class_book[j],8); - for(k=0;k<(1<class_subs[j]);k++) - oggpack_write(opb,info->class_subbook[j][k]+1,8); - } - - /* save out the post list */ - oggpack_write(opb,info->mult-1,2); /* only 1,2,3,4 legal now */ - oggpack_write(opb,ilog2(maxposit),4); - rangebits=ilog2(maxposit); - - for(j=0,k=0;jpartitions;j++){ - count+=info->class_dim[info->partitionclass[j]]; - for(;kpostlist[k+2],rangebits); - } -} - -static int icomp(const void *a,const void *b){ - return(**(int **)a-**(int **)b); -} - -static vorbis_info_floor *floor1_unpack (vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - int j,k,count=0,maxclass=-1,rangebits; - - vorbis_info_floor1 *info=(vorbis_info_floor1*)_ogg_calloc(1,sizeof(*info)); - /* read partitions */ - info->partitions=oggpack_read(opb,5); /* only 0 to 31 legal */ - for(j=0;jpartitions;j++){ - info->partitionclass[j]=oggpack_read(opb,4); /* only 0 to 15 legal */ - if(info->partitionclass[j]<0)goto err_out; - if(maxclasspartitionclass[j])maxclass=info->partitionclass[j]; - } - - /* read partition classes */ - for(j=0;jclass_dim[j]=oggpack_read(opb,3)+1; /* 1 to 8 */ - info->class_subs[j]=oggpack_read(opb,2); /* 0,1,2,3 bits */ - if(info->class_subs[j]<0) - goto err_out; - if(info->class_subs[j])info->class_book[j]=oggpack_read(opb,8); - if(info->class_book[j]<0 || info->class_book[j]>=ci->books) - goto err_out; - for(k=0;k<(1<class_subs[j]);k++){ - info->class_subbook[j][k]=oggpack_read(opb,8)-1; - if(info->class_subbook[j][k]<-1 || info->class_subbook[j][k]>=ci->books) - goto err_out; - } - } - - /* read the post list */ - info->mult=oggpack_read(opb,2)+1; /* only 1,2,3,4 legal now */ - rangebits=oggpack_read(opb,4); - if(rangebits<0)goto err_out; - - for(j=0,k=0;jpartitions;j++){ - count+=info->class_dim[info->partitionclass[j]]; - for(;kpostlist[k+2]=oggpack_read(opb,rangebits); - if(t<0 || t>=(1<postlist[0]=0; - info->postlist[1]=1<postlist+j; - qsort(sortpointer,count+2,sizeof(*sortpointer),icomp); - - for(j=1;jvi=info; - look->n=info->postlist[1]; - - /* we drop each position value in-between already decoded values, - and use linear interpolation to predict each new value past the - edges. The positions are read in the order of the position - list... we precompute the bounding positions in the lookup. Of - course, the neighbors can change (if a position is declined), but - this is an initial mapping */ - - for(i=0;ipartitions;i++)n+=info->class_dim[info->partitionclass[i]]; - n+=2; - look->posts=n; - - /* also store a sorted position index */ - for(i=0;ipostlist+i; - qsort(sortpointer,n,sizeof(*sortpointer),icomp); - - /* points from sort order back to range number */ - for(i=0;iforward_index[i]=sortpointer[i]-info->postlist; - /* points from range order to sorted position */ - for(i=0;ireverse_index[look->forward_index[i]]=i; - /* we actually need the post values too */ - for(i=0;isorted_index[i]=info->postlist[look->forward_index[i]]; - - /* quantize values to multiplier spec */ - switch(info->mult){ - case 1: /* 1024 -> 256 */ - look->quant_q=256; - break; - case 2: /* 1024 -> 128 */ - look->quant_q=128; - break; - case 3: /* 1024 -> 86 */ - look->quant_q=86; - break; - case 4: /* 1024 -> 64 */ - look->quant_q=64; - break; - } - - /* discover our neighbors for decode where we don't use fit flags - (that would push the neighbors outward) */ - for(i=0;in; - int currentx=info->postlist[i+2]; - for(j=0;jpostlist[j]; - if(x>lx && xcurrentx){ - hi=j; - hx=x; - } - } - look->loneighbor[i]=lo; - look->hineighbor[i]=hi; - } - - return(look); -} - -static int render_point(int x0,int x1,int y0,int y1,int x){ - y0&=0x7fff; /* mask off flag */ - y1&=0x7fff; - - { - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int err=ady*(x-x0); - - int off=err/adx; - if(dy<0)return(y0-off); - return(y0+off); - } -} - -static int vorbis_dBquant(const float *x){ - int i= *x*7.3142857f+1023.5f; - if(i>1023)return(1023); - if(i<0)return(0); - return i; -} - -static const float FLOOR1_fromdB_LOOKUP[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.128753e-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.F, -}; - -static void render_line(int n, int x0,int x1,int y0,int y1,float *d){ - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int base=dy/adx; - int sy=(dy<0?base-1:base+1); - int x=x0; - int y=y0; - int err=0; - - ady-=abs(base*adx); - - if(n>x1)n=x1; - - if(x=adx){ - err-=adx; - y+=sy; - }else{ - y+=base; - } - d[x]*=FLOOR1_fromdB_LOOKUP[y]; - } -} - -static void render_line0(int n, int x0,int x1,int y0,int y1,int *d){ - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int base=dy/adx; - int sy=(dy<0?base-1:base+1); - int x=x0; - int y=y0; - int err=0; - - ady-=abs(base*adx); - - if(n>x1)n=x1; - - if(x=adx){ - err-=adx; - y+=sy; - }else{ - y+=base; - } - d[x]=y; - } -} - -/* the floor has already been filtered to only include relevant sections */ -static int accumulate_fit(const float *flr,const float *mdct, - int x0, int x1,lsfit_acc *a, - int n,vorbis_info_floor1 *info){ - long i; - - int xa=0,ya=0,x2a=0,y2a=0,xya=0,na=0, xb=0,yb=0,x2b=0,y2b=0,xyb=0,nb=0; - - memset(a,0,sizeof(*a)); - a->x0=x0; - a->x1=x1; - if(x1>=n)x1=n-1; - - for(i=x0;i<=x1;i++){ - int quantized=vorbis_dBquant(flr+i); - if(quantized){ - if(mdct[i]+info->twofitatten>=flr[i]){ - xa += i; - ya += quantized; - x2a += i*i; - y2a += quantized*quantized; - xya += i*quantized; - na++; - }else{ - xb += i; - yb += quantized; - x2b += i*i; - y2b += quantized*quantized; - xyb += i*quantized; - nb++; - } - } - } - - a->xa=xa; - a->ya=ya; - a->x2a=x2a; - a->y2a=y2a; - a->xya=xya; - a->an=na; - - a->xb=xb; - a->yb=yb; - a->x2b=x2b; - a->y2b=y2b; - a->xyb=xyb; - a->bn=nb; - - return(na); -} - -static int fit_line(lsfit_acc *a,int fits,int *y0,int *y1, - vorbis_info_floor1 *info){ - double xb=0,yb=0,x2b=0,y2b=0,xyb=0,bn=0; - int i; - int x0=a[0].x0; - int x1=a[fits-1].x1; - - for(i=0;itwofitweight/(a[i].an+1)+1.; - - xb+=a[i].xb + a[i].xa * weight; - yb+=a[i].yb + a[i].ya * weight; - x2b+=a[i].x2b + a[i].x2a * weight; - y2b+=a[i].y2b + a[i].y2a * weight; - xyb+=a[i].xyb + a[i].xya * weight; - bn+=a[i].bn + a[i].an * weight; - } - - if(*y0>=0){ - xb+= x0; - yb+= *y0; - x2b+= x0 * x0; - //y2b+= *y0 * *y0; - xyb+= *y0 * x0; - bn++; - } - - if(*y1>=0){ - xb+= x1; - yb+= *y1; - x2b+= x1 * x1; - //y2b+= *y1 * *y1; - xyb+= *y1 * x1; - bn++; - } - - { - double denom=(bn*x2b-xb*xb); - - if(denom>0.){ - double a=(yb*x2b-xyb*xb)/denom; - double b=(bn*xyb-xb*yb)/denom; - *y0=rint(a+b*x0); - *y1=rint(a+b*x1); - - /* limit to our range! */ - if(*y0>1023)*y0=1023; - if(*y1>1023)*y1=1023; - if(*y0<0)*y0=0; - if(*y1<0)*y1=0; - - return 0; - }else{ - *y0=0; - *y1=0; - return 1; - } - } -} - -static int inspect_error(int x0,int x1,int y0,int y1,const float *mask, - const float *mdct, - vorbis_info_floor1 *info){ - int dy=y1-y0; - int adx=x1-x0; - int ady=abs(dy); - int base=dy/adx; - int sy=(dy<0?base-1:base+1); - int x=x0; - int y=y0; - int err=0; - int val=vorbis_dBquant(mask+x); - int mse=0; - int n=0; - - ady-=abs(base*adx); - - mse=(y-val); - mse*=mse; - n++; - if(mdct[x]+info->twofitatten>=mask[x]){ - if(y+info->maxovermaxunder>val)return(1); - } - - while(++x=adx){ - err-=adx; - y+=sy; - }else{ - y+=base; - } - - val=vorbis_dBquant(mask+x); - mse+=((y-val)*(y-val)); - n++; - if(mdct[x]+info->twofitatten>=mask[x]){ - if(val){ - if(y+info->maxovermaxunder>val)return(1); - } - } - } - - if(info->maxover*info->maxover/n>info->maxerr)return(0); - if(info->maxunder*info->maxunder/n>info->maxerr)return(0); - if(mse/n>info->maxerr)return(1); - return(0); -} - -static int post_Y(int *A,int *B,int pos){ - if(A[pos]<0) - return B[pos]; - if(B[pos]<0) - return A[pos]; - - return (A[pos]+B[pos])>>1; -} - -int *floor1_fit(vorbis_block *vb,vorbis_look_floor1 *look, - const float *logmdct, /* in */ - const float *logmask){ - long i,j; - vorbis_info_floor1 *info=look->vi; - long n=look->n; - long posts=look->posts; - long nonzero=0; - lsfit_acc fits[VIF_POSIT+1]; - int fit_valueA[VIF_POSIT+2]; /* index by range list position */ - int fit_valueB[VIF_POSIT+2]; /* index by range list position */ - - int loneighbor[VIF_POSIT+2]; /* sorted index of range list position (+2) */ - int hineighbor[VIF_POSIT+2]; - int *output=NULL; - int memo[VIF_POSIT+2]; - - for(i=0;isorted_index[i], - look->sorted_index[i+1],fits+i, - n,info); - } - - if(nonzero){ - /* start by fitting the implicit base case.... */ - int y0=-200; - int y1=-200; - fit_line(fits,posts-1,&y0,&y1,info); - - fit_valueA[0]=y0; - fit_valueB[0]=y0; - fit_valueB[1]=y1; - fit_valueA[1]=y1; - - /* Non degenerate case */ - /* start progressive splitting. This is a greedy, non-optimal - algorithm, but simple and close enough to the best - answer. */ - for(i=2;ireverse_index[i]; - int ln=loneighbor[sortpos]; - int hn=hineighbor[sortpos]; - - /* eliminate repeat searches of a particular range with a memo */ - if(memo[ln]!=hn){ - /* haven't performed this error search yet */ - int lsortpos=look->reverse_index[ln]; - int hsortpos=look->reverse_index[hn]; - memo[ln]=hn; - - { - /* A note: we want to bound/minimize *local*, not global, error */ - int lx=info->postlist[ln]; - int hx=info->postlist[hn]; - int ly=post_Y(fit_valueA,fit_valueB,ln); - int hy=post_Y(fit_valueA,fit_valueB,hn); - - if(ly==-1 || hy==-1){ - exit(1); - } - - if(inspect_error(lx,hx,ly,hy,logmask,logmdct,info)){ - /* outside error bounds/begin search area. Split it. */ - int ly0=-200; - int ly1=-200; - int hy0=-200; - int hy1=-200; - int ret0=fit_line(fits+lsortpos,sortpos-lsortpos,&ly0,&ly1,info); - int ret1=fit_line(fits+sortpos,hsortpos-sortpos,&hy0,&hy1,info); - - if(ret0){ - ly0=ly; - ly1=hy0; - } - if(ret1){ - hy0=ly1; - hy1=hy; - } - - if(ret0 && ret1){ - fit_valueA[i]=-200; - fit_valueB[i]=-200; - }else{ - /* store new edge values */ - fit_valueB[ln]=ly0; - if(ln==0)fit_valueA[ln]=ly0; - fit_valueA[i]=ly1; - fit_valueB[i]=hy0; - fit_valueA[hn]=hy1; - if(hn==1)fit_valueB[hn]=hy1; - - if(ly1>=0 || hy0>=0){ - /* store new neighbor values */ - for(j=sortpos-1;j>=0;j--) - if(hineighbor[j]==hn) - hineighbor[j]=i; - else - break; - for(j=sortpos+1;jloneighbor[i-2]; - int hn=look->hineighbor[i-2]; - int x0=info->postlist[ln]; - int x1=info->postlist[hn]; - int y0=output[ln]; - int y1=output[hn]; - - int predicted=render_point(x0,x1,y0,y1,info->postlist[i]); - int vx=post_Y(fit_valueA,fit_valueB,i); - - if(vx>=0 && predicted!=vx){ - output[i]=vx; - }else{ - output[i]= predicted|0x8000; - } - } - } - - return(output); - -} - -int *floor1_interpolate_fit(vorbis_block *vb,vorbis_look_floor1 *look, - int *A,int *B, - int del){ - - long i; - long posts=look->posts; - int *output=NULL; - - if(A && B){ - output=(int*)_vorbis_block_alloc(vb,sizeof(*output)*posts); - - /* overly simpleminded--- look again post 1.2 */ - for(i=0;i>16; - if(A[i]&0x8000 && B[i]&0x8000)output[i]|=0x8000; - } - } - - return(output); -} - - -int floor1_encode(oggpack_buffer *opb,vorbis_block *vb, - vorbis_look_floor1 *look, - int *post,int *ilogmask){ - - long i,j; - vorbis_info_floor1 *info=look->vi; - long posts=look->posts; - codec_setup_info *ci=(codec_setup_info*)vb->vd->vi->codec_setup; - int out[VIF_POSIT+2]; - static_codebook **sbooks=ci->book_param; - codebook *books=ci->fullbooks; - - /* quantize values to multiplier spec */ - if(post){ - for(i=0;imult){ - case 1: /* 1024 -> 256 */ - val>>=2; - break; - case 2: /* 1024 -> 128 */ - val>>=3; - break; - case 3: /* 1024 -> 86 */ - val/=12; - break; - case 4: /* 1024 -> 64 */ - val>>=4; - break; - } - post[i]=val | (post[i]&0x8000); - } - - out[0]=post[0]; - out[1]=post[1]; - - /* find prediction values for each post and subtract them */ - for(i=2;iloneighbor[i-2]; - int hn=look->hineighbor[i-2]; - int x0=info->postlist[ln]; - int x1=info->postlist[hn]; - int y0=post[ln]; - int y1=post[hn]; - - int predicted=render_point(x0,x1,y0,y1,info->postlist[i]); - - if((post[i]&0x8000) || (predicted==post[i])){ - post[i]=predicted|0x8000; /* in case there was roundoff jitter - in interpolation */ - out[i]=0; - }else{ - int headroom=(look->quant_q-predictedquant_q-predicted:predicted); - - int val=post[i]-predicted; - - /* at this point the 'deviation' value is in the range +/- max - range, but the real, unique range can always be mapped to - only [0-maxrange). So we want to wrap the deviation into - this limited range, but do it in the way that least screws - an essentially gaussian probability distribution. */ - - if(val<0) - if(val<-headroom) - val=headroom-val-1; - else - val=-1-(val<<1); - else - if(val>=headroom) - val= val+headroom; - else - val<<=1; - - out[i]=val; - post[ln]&=0x7fff; - post[hn]&=0x7fff; - } - } - - /* we have everything we need. pack it out */ - /* mark nontrivial floor */ - oggpack_write(opb,1,1); - - /* beginning/end post */ - look->frames++; - look->postbits+=ilog(look->quant_q-1)*2; - oggpack_write(opb,out[0],ilog(look->quant_q-1)); - oggpack_write(opb,out[1],ilog(look->quant_q-1)); - - - /* partition by partition */ - for(i=0,j=2;ipartitions;i++){ - int classx=info->partitionclass[i]; - int cdim=info->class_dim[classx]; - int csubbits=info->class_subs[classx]; - int csub=1<class_subbook[classx][k]; - if(booknum<0){ - maxval[k]=1; - }else{ - maxval[k]=sbooks[info->class_subbook[classx][k]]->entries; - } - } - for(k=0;kphrasebits+= - vorbis_book_encode(books+info->class_book[classx],cval,opb); - -#ifdef TRAIN_FLOOR1 - { - FILE *of; - char buffer[80]; - sprintf(buffer,"line_%dx%ld_class%d.vqd", - vb->pcmend/2,posts-2,class); - of=fopen(buffer,"a"); - fprintf(of,"%d\n",cval); - fclose(of); - } -#endif - } - - /* write post values */ - for(k=0;kclass_subbook[classx][bookas[k]]; - if(book>=0){ - /* hack to allow training with 'bad' books */ - if(out[j+k]<(books+book)->entries) - look->postbits+=vorbis_book_encode(books+book, - out[j+k],opb); - /*else - fprintf(stderr,"+!");*/ - -#ifdef TRAIN_FLOOR1 - { - FILE *of; - char buffer[80]; - sprintf(buffer,"line_%dx%ld_%dsub%d.vqd", - vb->pcmend/2,posts-2,class,bookas[k]); - of=fopen(buffer,"a"); - fprintf(of,"%d\n",out[j+k]); - fclose(of); - } -#endif - } - } - j+=cdim; - } - - { - /* generate quantized floor equivalent to what we'd unpack in decode */ - /* render the lines */ - int hx=0; - int lx=0; - int ly=post[0]*info->mult; - int n=ci->blocksizes[vb->W]/2; - - for(j=1;jposts;j++){ - int current=look->forward_index[j]; - int hy=post[current]&0x7fff; - if(hy==post[current]){ - - hy*=info->mult; - hx=info->postlist[current]; - - render_line0(n,lx,hx,ly,hy,ilogmask); - - lx=hx; - ly=hy; - } - } - for(j=hx;jpcmend/2;j++)ilogmask[j]=ly; /* be certain */ - return(1); - } - }else{ - oggpack_write(opb,0,1); - memset(ilogmask,0,vb->pcmend/2*sizeof(*ilogmask)); - return(0); - } -} - -static void *floor1_inverse1(vorbis_block *vb,vorbis_look_floor *in){ - vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; - vorbis_info_floor1 *info=look->vi; - codec_setup_info *ci=(codec_setup_info*)vb->vd->vi->codec_setup; - - int i,j,k; - codebook *books=ci->fullbooks; - - /* unpack wrapped/predicted values from stream */ - if(oggpack_read(&vb->opb,1)==1){ - int *fit_value=(int*)_vorbis_block_alloc(vb,(look->posts)*sizeof(*fit_value)); - - fit_value[0]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); - fit_value[1]=oggpack_read(&vb->opb,ilog(look->quant_q-1)); - - /* partition by partition */ - for(i=0,j=2;ipartitions;i++){ - int classx=info->partitionclass[i]; - int cdim=info->class_dim[classx]; - int csubbits=info->class_subs[classx]; - int csub=1<class_book[classx],&vb->opb); - - if(cval==-1)goto eop; - } - - for(k=0;kclass_subbook[classx][cval&(csub-1)]; - cval>>=csubbits; - if(book>=0){ - if((fit_value[j+k]=vorbis_book_decode(books+book,&vb->opb))==-1) - goto eop; - }else{ - fit_value[j+k]=0; - } - } - j+=cdim; - } - - /* unwrap positive values and reconsitute via linear interpolation */ - for(i=2;iposts;i++){ - int predicted=render_point(info->postlist[look->loneighbor[i-2]], - info->postlist[look->hineighbor[i-2]], - fit_value[look->loneighbor[i-2]], - fit_value[look->hineighbor[i-2]], - info->postlist[i]); - int hiroom=look->quant_q-predicted; - int loroom=predicted; - int room=(hiroom=room){ - if(hiroom>loroom){ - val = val-loroom; - }else{ - val = -1-(val-hiroom); - } - }else{ - if(val&1){ - val= -((val+1)>>1); - }else{ - val>>=1; - } - } - - fit_value[i] = (val + predicted) & 0x7fff; - fit_value[look->loneighbor[i-2]]&=0x7fff; - fit_value[look->hineighbor[i-2]]&=0x7fff; - - }else{ - fit_value[i]=predicted|0x8000; - } - - } - - return(fit_value); - } - eop: - return(NULL); -} - -static int floor1_inverse2(vorbis_block *vb,vorbis_look_floor *in,void *memo, - float *out){ - vorbis_look_floor1 *look=(vorbis_look_floor1 *)in; - vorbis_info_floor1 *info=look->vi; - - codec_setup_info *ci=(codec_setup_info*)vb->vd->vi->codec_setup; - int n=ci->blocksizes[vb->W]/2; - int j; - - if(memo){ - /* render the lines */ - int *fit_value=(int *)memo; - int hx=0; - int lx=0; - int ly=fit_value[0]*info->mult; - /* guard lookup against out-of-range values */ - ly=(ly<0?0:ly>255?255:ly); - - for(j=1;jposts;j++){ - int current=look->forward_index[j]; - int hy=fit_value[current]&0x7fff; - if(hy==fit_value[current]){ - - hx=info->postlist[current]; - hy*=info->mult; - /* guard lookup against out-of-range values */ - hy=(hy<0?0:hy>255?255:hy); - - render_line(n,lx,hx,ly,hy,out); - - lx=hx; - ly=hy; - } - } - for(j=hx;j header packets - last mod: $Id: info.c 17584 2010-11-01 19:26:16Z xiphmont $ - - ********************************************************************/ - -/* general handling of the header and the vorbis_info structure (and - substructures) */ - -#include -#include -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codec_internal.h" -#include "codebook.h" -#include "registry.h" -#include "window.h" -#include "psy.h" -#include "misc.h" -#include "os.h" - -#define GENERAL_VENDOR_STRING "Xiph.Org libVorbis 1.3.2" -#define ENCODE_VENDOR_STRING "Xiph.Org libVorbis I 20101101 (Schaufenugget)" - -/* helpers */ - -static void _v_writestring(oggpack_buffer *o,const char *s, int bytes){ - - while(bytes--){ - oggpack_write(o,*s++,8); - } -} - -static void _v_readstring(oggpack_buffer *o,char *buf,int bytes){ - while(bytes--){ - *buf++=oggpack_read(o,8); - } -} - -void vorbis_comment_init(vorbis_comment *vc){ - memset(vc,0,sizeof(*vc)); -} - -void vorbis_comment_add(vorbis_comment *vc,const char *comment){ - vc->user_comments=(char**)_ogg_realloc(vc->user_comments, - (vc->comments+2)*sizeof(*vc->user_comments)); - vc->comment_lengths=(int*)_ogg_realloc(vc->comment_lengths, - (vc->comments+2)*sizeof(*vc->comment_lengths)); - vc->comment_lengths[vc->comments]=strlen(comment); - vc->user_comments[vc->comments]=(char*)_ogg_malloc(vc->comment_lengths[vc->comments]+1); - strcpy(vc->user_comments[vc->comments], comment); - vc->comments++; - vc->user_comments[vc->comments]=NULL; -} - -void vorbis_comment_add_tag(vorbis_comment *vc, const char *tag, const char *contents){ - char *comment=(char*)alloca(strlen(tag)+strlen(contents)+2); /* +2 for = and \0 */ - strcpy(comment, tag); - strcat(comment, "="); - strcat(comment, contents); - vorbis_comment_add(vc, comment); -} - -/* This is more or less the same as strncasecmp - but that doesn't exist - * everywhere, and this is a fairly trivial function, so we include it */ -static int tagcompare(const char *s1, const char *s2, int n){ - int c=0; - while(c < n){ - if(toupper(s1[c]) != toupper(s2[c])) - return !0; - c++; - } - return 0; -} - -char *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count){ - long i; - int found = 0; - int taglen = strlen(tag)+1; /* +1 for the = we append */ - char *fulltag = (char*)alloca(taglen+ 1); - - strcpy(fulltag, tag); - strcat(fulltag, "="); - - for(i=0;icomments;i++){ - if(!tagcompare(vc->user_comments[i], fulltag, taglen)){ - if(count == found) - /* We return a pointer to the data, not a copy */ - return vc->user_comments[i] + taglen; - else - found++; - } - } - return NULL; /* didn't find anything */ -} - -int vorbis_comment_query_count(vorbis_comment *vc, const char *tag){ - int i,count=0; - int taglen = strlen(tag)+1; /* +1 for the = we append */ - char *fulltag = (char*)alloca(taglen+1); - strcpy(fulltag,tag); - strcat(fulltag, "="); - - for(i=0;icomments;i++){ - if(!tagcompare(vc->user_comments[i], fulltag, taglen)) - count++; - } - - return count; -} - -void vorbis_comment_clear(vorbis_comment *vc){ - if(vc){ - long i; - if(vc->user_comments){ - for(i=0;icomments;i++) - if(vc->user_comments[i])_ogg_free(vc->user_comments[i]); - _ogg_free(vc->user_comments); - } - if(vc->comment_lengths)_ogg_free(vc->comment_lengths); - if(vc->vendor)_ogg_free(vc->vendor); - memset(vc,0,sizeof(*vc)); - } -} - -/* blocksize 0 is guaranteed to be short, 1 is guaranteed to be long. - They may be equal, but short will never ge greater than long */ -int vorbis_info_blocksize(vorbis_info *vi,int zo){ - codec_setup_info *ci = (codec_setup_info*)vi->codec_setup; - return ci ? ci->blocksizes[zo] : -1; -} - -/* used by synthesis, which has a full, alloced vi */ -void vorbis_info_init(vorbis_info *vi){ - memset(vi,0,sizeof(*vi)); - vi->codec_setup=_ogg_calloc(1,sizeof(codec_setup_info)); -} - -void vorbis_info_clear(vorbis_info *vi){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - int i; - - if(ci){ - - for(i=0;imodes;i++) - if(ci->mode_param[i])_ogg_free(ci->mode_param[i]); - - for(i=0;imaps;i++) /* unpack does the range checking */ - if(ci->map_param[i]) /* this may be cleaning up an aborted - unpack, in which case the below type - cannot be trusted */ - _mapping_P[ci->map_type[i]]->free_info(ci->map_param[i]); - - for(i=0;ifloors;i++) /* unpack does the range checking */ - if(ci->floor_param[i]) /* this may be cleaning up an aborted - unpack, in which case the below type - cannot be trusted */ - _floor_P[ci->floor_type[i]]->free_info(ci->floor_param[i]); - - for(i=0;iresidues;i++) /* unpack does the range checking */ - if(ci->residue_param[i]) /* this may be cleaning up an aborted - unpack, in which case the below type - cannot be trusted */ - _residue_P[ci->residue_type[i]]->free_info(ci->residue_param[i]); - - for(i=0;ibooks;i++){ - if(ci->book_param[i]){ - /* knows if the book was not alloced */ - vorbis_staticbook_destroy(ci->book_param[i]); - } - if(ci->fullbooks) - vorbis_book_clear(ci->fullbooks+i); - } - if(ci->fullbooks) - _ogg_free(ci->fullbooks); - - for(i=0;ipsys;i++) - _vi_psy_free(ci->psy_param[i]); - - _ogg_free(ci); - } - - memset(vi,0,sizeof(*vi)); -} - -/* Header packing/unpacking ********************************************/ - -static int _vorbis_unpack_info(vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - if(!ci)return(OV_EFAULT); - - vi->version=oggpack_read(opb,32); - if(vi->version!=0)return(OV_EVERSION); - - vi->channels=oggpack_read(opb,8); - vi->rate=oggpack_read(opb,32); - - vi->bitrate_upper=oggpack_read(opb,32); - vi->bitrate_nominal=oggpack_read(opb,32); - vi->bitrate_lower=oggpack_read(opb,32); - - ci->blocksizes[0]=1<blocksizes[1]=1<rate<1)goto err_out; - if(vi->channels<1)goto err_out; - if(ci->blocksizes[0]<64)goto err_out; - if(ci->blocksizes[1]blocksizes[0])goto err_out; - if(ci->blocksizes[1]>8192)goto err_out; - - if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ - - return(0); - err_out: - vorbis_info_clear(vi); - return(OV_EBADHEADER); -} - -static int _vorbis_unpack_comment(vorbis_comment *vc,oggpack_buffer *opb){ - int i; - int vendorlen=oggpack_read(opb,32); - if(vendorlen<0)goto err_out; - if(vendorlen>opb->storage-8)goto err_out; - vc->vendor=(char*)_ogg_calloc(vendorlen+1,1); - _v_readstring(opb,vc->vendor,vendorlen); - i=oggpack_read(opb,32); - if(i<0)goto err_out; - if(i>((opb->storage-oggpack_bytes(opb))>>2))goto err_out; - vc->comments=i; - vc->user_comments=(char**)_ogg_calloc(vc->comments+1,sizeof(*vc->user_comments)); - vc->comment_lengths=(int*)_ogg_calloc(vc->comments+1, sizeof(*vc->comment_lengths)); - - for(i=0;icomments;i++){ - int len=oggpack_read(opb,32); - if(len<0)goto err_out; - if(len>opb->storage-oggpack_bytes(opb))goto err_out; - vc->comment_lengths[i]=len; - vc->user_comments[i]=(char*)_ogg_calloc(len+1,1); - _v_readstring(opb,vc->user_comments[i],len); - } - if(oggpack_read(opb,1)!=1)goto err_out; /* EOP check */ - - return(0); - err_out: - vorbis_comment_clear(vc); - return(OV_EBADHEADER); -} - -/* all of the real encoding details are here. The modes, books, - everything */ -static int _vorbis_unpack_books(vorbis_info *vi,oggpack_buffer *opb){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - int i; - if(!ci)return(OV_EFAULT); - - /* codebooks */ - ci->books=oggpack_read(opb,8)+1; - if(ci->books<=0)goto err_out; - for(i=0;ibooks;i++){ - ci->book_param[i]=vorbis_staticbook_unpack(opb); - if(!ci->book_param[i])goto err_out; - } - - /* time backend settings; hooks are unused */ - { - int times=oggpack_read(opb,6)+1; - if(times<=0)goto err_out; - for(i=0;i=VI_TIMEB)goto err_out; - } - } - - /* floor backend settings */ - ci->floors=oggpack_read(opb,6)+1; - if(ci->floors<=0)goto err_out; - for(i=0;ifloors;i++){ - ci->floor_type[i]=oggpack_read(opb,16); - if(ci->floor_type[i]<0 || ci->floor_type[i]>=VI_FLOORB)goto err_out; - ci->floor_param[i]=_floor_P[ci->floor_type[i]]->unpack(vi,opb); - if(!ci->floor_param[i])goto err_out; - } - - /* residue backend settings */ - ci->residues=oggpack_read(opb,6)+1; - if(ci->residues<=0)goto err_out; - for(i=0;iresidues;i++){ - ci->residue_type[i]=oggpack_read(opb,16); - if(ci->residue_type[i]<0 || ci->residue_type[i]>=VI_RESB)goto err_out; - ci->residue_param[i]=_residue_P[ci->residue_type[i]]->unpack(vi,opb); - if(!ci->residue_param[i])goto err_out; - } - - /* map backend settings */ - ci->maps=oggpack_read(opb,6)+1; - if(ci->maps<=0)goto err_out; - for(i=0;imaps;i++){ - ci->map_type[i]=oggpack_read(opb,16); - if(ci->map_type[i]<0 || ci->map_type[i]>=VI_MAPB)goto err_out; - ci->map_param[i]=_mapping_P[ci->map_type[i]]->unpack(vi,opb); - if(!ci->map_param[i])goto err_out; - } - - /* mode settings */ - ci->modes=oggpack_read(opb,6)+1; - if(ci->modes<=0)goto err_out; - for(i=0;imodes;i++){ - ci->mode_param[i]=(vorbis_info_mode*)_ogg_calloc(1,sizeof(*ci->mode_param[i])); - ci->mode_param[i]->blockflag=oggpack_read(opb,1); - ci->mode_param[i]->windowtype=oggpack_read(opb,16); - ci->mode_param[i]->transformtype=oggpack_read(opb,16); - ci->mode_param[i]->mapping=oggpack_read(opb,8); - - if(ci->mode_param[i]->windowtype>=VI_WINDOWB)goto err_out; - if(ci->mode_param[i]->transformtype>=VI_WINDOWB)goto err_out; - if(ci->mode_param[i]->mapping>=ci->maps)goto err_out; - if(ci->mode_param[i]->mapping<0)goto err_out; - } - - if(oggpack_read(opb,1)!=1)goto err_out; /* top level EOP check */ - - return(0); - err_out: - vorbis_info_clear(vi); - return(OV_EBADHEADER); -} - -/* Is this packet a vorbis ID header? */ -int vorbis_synthesis_idheader(ogg_packet *op){ - oggpack_buffer opb; - char buffer[6]; - - if(op){ - oggpack_readinit(&opb,op->packet,op->bytes); - - if(!op->b_o_s) - return(0); /* Not the initial packet */ - - if(oggpack_read(&opb,8) != 1) - return 0; /* not an ID header */ - - memset(buffer,0,6); - _v_readstring(&opb,buffer,6); - if(memcmp(buffer,"vorbis",6)) - return 0; /* not vorbis */ - - return 1; - } - - return 0; -} - -/* The Vorbis header is in three packets; the initial small packet in - the first page that identifies basic parameters, a second packet - with bitstream comments and a third packet that holds the - codebook. */ - -int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,ogg_packet *op){ - oggpack_buffer opb; - - if(op){ - oggpack_readinit(&opb,op->packet,op->bytes); - - /* Which of the three types of header is this? */ - /* Also verify header-ness, vorbis */ - { - char buffer[6]; - int packtype=oggpack_read(&opb,8); - memset(buffer,0,6); - _v_readstring(&opb,buffer,6); - if(memcmp(buffer,"vorbis",6)){ - /* not a vorbis header */ - return(OV_ENOTVORBIS); - } - switch(packtype){ - case 0x01: /* least significant *bit* is read first */ - if(!op->b_o_s){ - /* Not the initial packet */ - return(OV_EBADHEADER); - } - if(vi->rate!=0){ - /* previously initialized info header */ - return(OV_EBADHEADER); - } - - return(_vorbis_unpack_info(vi,&opb)); - - case 0x03: /* least significant *bit* is read first */ - if(vi->rate==0){ - /* um... we didn't get the initial header */ - return(OV_EBADHEADER); - } - - return(_vorbis_unpack_comment(vc,&opb)); - - case 0x05: /* least significant *bit* is read first */ - if(vi->rate==0 || vc->vendor==NULL){ - /* um... we didn;t get the initial header or comments yet */ - return(OV_EBADHEADER); - } - - return(_vorbis_unpack_books(vi,&opb)); - - default: - /* Not a valid vorbis header type */ - return(OV_EBADHEADER); - break; - } - } - } - return(OV_EBADHEADER); -} - -/* pack side **********************************************************/ - -static int _vorbis_pack_info(oggpack_buffer *opb,vorbis_info *vi){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - if(!ci)return(OV_EFAULT); - - /* preamble */ - oggpack_write(opb,0x01,8); - _v_writestring(opb,"vorbis", 6); - - /* basic information about the stream */ - oggpack_write(opb,0x00,32); - oggpack_write(opb,vi->channels,8); - oggpack_write(opb,vi->rate,32); - - oggpack_write(opb,vi->bitrate_upper,32); - oggpack_write(opb,vi->bitrate_nominal,32); - oggpack_write(opb,vi->bitrate_lower,32); - - oggpack_write(opb,ilog2(ci->blocksizes[0]),4); - oggpack_write(opb,ilog2(ci->blocksizes[1]),4); - oggpack_write(opb,1,1); - - return(0); -} - -static int _vorbis_pack_comment(oggpack_buffer *opb,vorbis_comment *vc){ - int bytes = strlen(ENCODE_VENDOR_STRING); - - /* preamble */ - oggpack_write(opb,0x03,8); - _v_writestring(opb,"vorbis", 6); - - /* vendor */ - oggpack_write(opb,bytes,32); - _v_writestring(opb,ENCODE_VENDOR_STRING, bytes); - - /* comments */ - - oggpack_write(opb,vc->comments,32); - if(vc->comments){ - int i; - for(i=0;icomments;i++){ - if(vc->user_comments[i]){ - oggpack_write(opb,vc->comment_lengths[i],32); - _v_writestring(opb,vc->user_comments[i], vc->comment_lengths[i]); - }else{ - oggpack_write(opb,0,32); - } - } - } - oggpack_write(opb,1,1); - - return(0); -} - -static int _vorbis_pack_books(oggpack_buffer *opb,vorbis_info *vi){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - int i; - if(!ci)return(OV_EFAULT); - - oggpack_write(opb,0x05,8); - _v_writestring(opb,"vorbis", 6); - - /* books */ - oggpack_write(opb,ci->books-1,8); - for(i=0;ibooks;i++) - if(vorbis_staticbook_pack(ci->book_param[i],opb))goto err_out; - - /* times; hook placeholders */ - oggpack_write(opb,0,6); - oggpack_write(opb,0,16); - - /* floors */ - oggpack_write(opb,ci->floors-1,6); - for(i=0;ifloors;i++){ - oggpack_write(opb,ci->floor_type[i],16); - if(_floor_P[ci->floor_type[i]]->pack) - _floor_P[ci->floor_type[i]]->pack(ci->floor_param[i],opb); - else - goto err_out; - } - - /* residues */ - oggpack_write(opb,ci->residues-1,6); - for(i=0;iresidues;i++){ - oggpack_write(opb,ci->residue_type[i],16); - _residue_P[ci->residue_type[i]]->pack(ci->residue_param[i],opb); - } - - /* maps */ - oggpack_write(opb,ci->maps-1,6); - for(i=0;imaps;i++){ - oggpack_write(opb,ci->map_type[i],16); - _mapping_P[ci->map_type[i]]->pack(vi,ci->map_param[i],opb); - } - - /* modes */ - oggpack_write(opb,ci->modes-1,6); - for(i=0;imodes;i++){ - oggpack_write(opb,ci->mode_param[i]->blockflag,1); - oggpack_write(opb,ci->mode_param[i]->windowtype,16); - oggpack_write(opb,ci->mode_param[i]->transformtype,16); - oggpack_write(opb,ci->mode_param[i]->mapping,8); - } - oggpack_write(opb,1,1); - - return(0); -err_out: - return(-1); -} - -int vorbis_commentheader_out(vorbis_comment *vc, - ogg_packet *op){ - - oggpack_buffer opb; - - oggpack_writeinit(&opb); - if(_vorbis_pack_comment(&opb,vc)) return OV_EIMPL; - - op->packet = (unsigned char*) _ogg_malloc(oggpack_bytes(&opb)); - memcpy(op->packet, opb.buffer, oggpack_bytes(&opb)); - - op->bytes=oggpack_bytes(&opb); - op->b_o_s=0; - op->e_o_s=0; - op->granulepos=0; - op->packetno=1; - - return 0; -} - -int vorbis_analysis_headerout(vorbis_dsp_state *v, - vorbis_comment *vc, - ogg_packet *op, - ogg_packet *op_comm, - ogg_packet *op_code){ - int ret=OV_EIMPL; - vorbis_info *vi=v->vi; - oggpack_buffer opb; - private_state *b=(private_state*)v->backend_state; - - if(!b){ - ret=OV_EFAULT; - goto err_out; - } - - /* first header packet **********************************************/ - - oggpack_writeinit(&opb); - if(_vorbis_pack_info(&opb,vi))goto err_out; - - /* build the packet */ - if(b->header)_ogg_free(b->header); - b->header=(unsigned char*) _ogg_malloc(oggpack_bytes(&opb)); - memcpy(b->header,opb.buffer,oggpack_bytes(&opb)); - op->packet=b->header; - op->bytes=oggpack_bytes(&opb); - op->b_o_s=1; - op->e_o_s=0; - op->granulepos=0; - op->packetno=0; - - /* second header packet (comments) **********************************/ - - oggpack_reset(&opb); - if(_vorbis_pack_comment(&opb,vc))goto err_out; - - if(b->header1)_ogg_free(b->header1); - b->header1=(unsigned char*) _ogg_malloc(oggpack_bytes(&opb)); - memcpy(b->header1,opb.buffer,oggpack_bytes(&opb)); - op_comm->packet=b->header1; - op_comm->bytes=oggpack_bytes(&opb); - op_comm->b_o_s=0; - op_comm->e_o_s=0; - op_comm->granulepos=0; - op_comm->packetno=1; - - /* third header packet (modes/codebooks) ****************************/ - - oggpack_reset(&opb); - if(_vorbis_pack_books(&opb,vi))goto err_out; - - if(b->header2)_ogg_free(b->header2); - b->header2=(unsigned char*) _ogg_malloc(oggpack_bytes(&opb)); - memcpy(b->header2,opb.buffer,oggpack_bytes(&opb)); - op_code->packet=b->header2; - op_code->bytes=oggpack_bytes(&opb); - op_code->b_o_s=0; - op_code->e_o_s=0; - op_code->granulepos=0; - op_code->packetno=2; - - oggpack_writeclear(&opb); - return(0); - err_out: - memset(op,0,sizeof(*op)); - memset(op_comm,0,sizeof(*op_comm)); - memset(op_code,0,sizeof(*op_code)); - - if(b){ - oggpack_writeclear(&opb); - if(b->header)_ogg_free(b->header); - if(b->header1)_ogg_free(b->header1); - if(b->header2)_ogg_free(b->header2); - b->header=NULL; - b->header1=NULL; - b->header2=NULL; - } - return(ret); -} - -double vorbis_granule_time(vorbis_dsp_state *v,ogg_int64_t granulepos){ - if(granulepos == -1) return -1; - - /* We're not guaranteed a 64 bit unsigned type everywhere, so we - have to put the unsigned granpo in a signed type. */ - if(granulepos>=0){ - return((double)granulepos/v->vi->rate); - }else{ - ogg_int64_t granuleoff=0xffffffff; - granuleoff<<=31; - -#ifdef __GNUC__ - granuleoff |= 0x7ffffffffLL; -#else - granuleoff |= 0x7ffffffff; -#endif - return(((double)granulepos+2+granuleoff+granuleoff)/v->vi->rate); - } -} - -const char *vorbis_version_string(void){ - return GENERAL_VENDOR_STRING; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c deleted file mode 100755 index 953e71a..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.c +++ /dev/null @@ -1,94 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: lookup based functions - last mod: $Id: lookup.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#include -#include "lookup.h" -#include "lookup_data.h" -#include "os.h" -#include "misc.h" - -#ifdef FLOAT_LOOKUP - -/* interpolated lookup based cos function, domain 0 to PI only */ -float vorbis_coslook(float a){ - double d=a*(.31830989*(float)COS_LOOKUP_SZ); - int i=vorbis_ftoi(d-.5); - - return COS_LOOKUP[i]+ (d-i)*(COS_LOOKUP[i+1]-COS_LOOKUP[i]); -} - -/* interpolated 1./sqrt(p) where .5 <= p < 1. */ -float vorbis_invsqlook(float a){ - double d=a*(2.f*(float)INVSQ_LOOKUP_SZ)-(float)INVSQ_LOOKUP_SZ; - int i=vorbis_ftoi(d-.5f); - return INVSQ_LOOKUP[i]+ (d-i)*(INVSQ_LOOKUP[i+1]-INVSQ_LOOKUP[i]); -} - -/* interpolated 1./sqrt(p) where .5 <= p < 1. */ -float vorbis_invsq2explook(int a){ - return INVSQ2EXP_LOOKUP[a-INVSQ2EXP_LOOKUP_MIN]; -} - -#include -/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ -float vorbis_fromdBlook(float a){ - int i=vorbis_ftoi(a*((float)(-(1<=(FROMdB_LOOKUP_SZ<>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); -} - -#endif - -#ifdef INT_LOOKUP -/* interpolated 1./sqrt(p) where .5 <= a < 1. (.100000... to .111111...) in - 16.16 format - - returns in m.8 format */ -long vorbis_invsqlook_i(long a,long e){ - long i=(a&0x7fff)>>(INVSQ_LOOKUP_I_SHIFT-1); - long d=(a&INVSQ_LOOKUP_I_MASK)<<(16-INVSQ_LOOKUP_I_SHIFT); /* 0.16 */ - long val=INVSQ_LOOKUP_I[i]- /* 1.16 */ - (((INVSQ_LOOKUP_I[i]-INVSQ_LOOKUP_I[i+1])* /* 0.16 */ - d)>>16); /* result 1.16 */ - - e+=32; - if(e&1)val=(val*5792)>>13; /* multiply val by 1/sqrt(2) */ - e=(e>>1)-8; - - return(val>>e); -} - -/* interpolated lookup based fromdB function, domain -140dB to 0dB only */ -/* a is in n.12 format */ -float vorbis_fromdBlook_i(long a){ - int i=(-a)>>(12-FROMdB2_SHIFT); - return (i<0)?1.f: - ((i>=(FROMdB_LOOKUP_SZ<>FROMdB_SHIFT]*FROMdB2_LOOKUP[i&FROMdB2_MASK]); -} - -/* interpolated lookup based cos function, domain 0 to PI only */ -/* a is in 0.16 format, where 0==0, 2^^16-1==PI, return 0.14 */ -long vorbis_coslook_i(long a){ - int i=a>>COS_LOOKUP_I_SHIFT; - int d=a&COS_LOOKUP_I_MASK; - return COS_LOOKUP_I[i]- ((d*(COS_LOOKUP_I[i]-COS_LOOKUP_I[i+1]))>> - COS_LOOKUP_I_SHIFT); -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h deleted file mode 100755 index 0f8fdf4..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup.h +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: lookup based functions - last mod: $Id: lookup.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_LOOKUP_H_ - -#ifdef FLOAT_LOOKUP -extern float vorbis_coslook(float a); -extern float vorbis_invsqlook(float a); -extern float vorbis_invsq2explook(int a); -extern float vorbis_fromdBlook(float a); -#endif -#ifdef INT_LOOKUP -extern long vorbis_invsqlook_i(long a,long e); -extern long vorbis_coslook_i(long a); -extern float vorbis_fromdBlook_i(long a); -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h deleted file mode 100755 index b12d79a..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lookup_data.h +++ /dev/null @@ -1,192 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: lookup data; generated by lookups.pl; edit there - last mod: $Id: lookup_data.h 16037 2009-05-26 21:10:58Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_LOOKUP_DATA_H_ - -#ifdef FLOAT_LOOKUP -#define COS_LOOKUP_SZ 128 -static const float COS_LOOKUP[COS_LOOKUP_SZ+1]={ - +1.0000000000000f,+0.9996988186962f,+0.9987954562052f,+0.9972904566787f, - +0.9951847266722f,+0.9924795345987f,+0.9891765099648f,+0.9852776423889f, - +0.9807852804032f,+0.9757021300385f,+0.9700312531945f,+0.9637760657954f, - +0.9569403357322f,+0.9495281805930f,+0.9415440651830f,+0.9329927988347f, - +0.9238795325113f,+0.9142097557035f,+0.9039892931234f,+0.8932243011955f, - +0.8819212643484f,+0.8700869911087f,+0.8577286100003f,+0.8448535652497f, - +0.8314696123025f,+0.8175848131516f,+0.8032075314806f,+0.7883464276266f, - +0.7730104533627f,+0.7572088465065f,+0.7409511253550f,+0.7242470829515f, - +0.7071067811865f,+0.6895405447371f,+0.6715589548470f,+0.6531728429538f, - +0.6343932841636f,+0.6152315905806f,+0.5956993044924f,+0.5758081914178f, - +0.5555702330196f,+0.5349976198871f,+0.5141027441932f,+0.4928981922298f, - +0.4713967368260f,+0.4496113296546f,+0.4275550934303f,+0.4052413140050f, - +0.3826834323651f,+0.3598950365350f,+0.3368898533922f,+0.3136817403989f, - +0.2902846772545f,+0.2667127574749f,+0.2429801799033f,+0.2191012401569f, - +0.1950903220161f,+0.1709618887603f,+0.1467304744554f,+0.1224106751992f, - +0.0980171403296f,+0.0735645635997f,+0.0490676743274f,+0.0245412285229f, - +0.0000000000000f,-0.0245412285229f,-0.0490676743274f,-0.0735645635997f, - -0.0980171403296f,-0.1224106751992f,-0.1467304744554f,-0.1709618887603f, - -0.1950903220161f,-0.2191012401569f,-0.2429801799033f,-0.2667127574749f, - -0.2902846772545f,-0.3136817403989f,-0.3368898533922f,-0.3598950365350f, - -0.3826834323651f,-0.4052413140050f,-0.4275550934303f,-0.4496113296546f, - -0.4713967368260f,-0.4928981922298f,-0.5141027441932f,-0.5349976198871f, - -0.5555702330196f,-0.5758081914178f,-0.5956993044924f,-0.6152315905806f, - -0.6343932841636f,-0.6531728429538f,-0.6715589548470f,-0.6895405447371f, - -0.7071067811865f,-0.7242470829515f,-0.7409511253550f,-0.7572088465065f, - -0.7730104533627f,-0.7883464276266f,-0.8032075314806f,-0.8175848131516f, - -0.8314696123025f,-0.8448535652497f,-0.8577286100003f,-0.8700869911087f, - -0.8819212643484f,-0.8932243011955f,-0.9039892931234f,-0.9142097557035f, - -0.9238795325113f,-0.9329927988347f,-0.9415440651830f,-0.9495281805930f, - -0.9569403357322f,-0.9637760657954f,-0.9700312531945f,-0.9757021300385f, - -0.9807852804032f,-0.9852776423889f,-0.9891765099648f,-0.9924795345987f, - -0.9951847266722f,-0.9972904566787f,-0.9987954562052f,-0.9996988186962f, - -1.0000000000000f, -}; - -#define INVSQ_LOOKUP_SZ 32 -static const float INVSQ_LOOKUP[INVSQ_LOOKUP_SZ+1]={ - 1.414213562373f,1.392621247646f,1.371988681140f,1.352246807566f, - 1.333333333333f,1.315191898443f,1.297771369046f,1.281025230441f, - 1.264911064067f,1.249390095109f,1.234426799697f,1.219988562661f, - 1.206045378311f,1.192569588000f,1.179535649239f,1.166919931983f, - 1.154700538379f,1.142857142857f,1.131370849898f,1.120224067222f, - 1.109400392450f,1.098884511590f,1.088662107904f,1.078719779941f, - 1.069044967650f,1.059625885652f,1.050451462878f,1.041511287847f, - 1.032795558989f,1.024295039463f,1.016001016002f,1.007905261358f, - 1.000000000000f, -}; - -#define INVSQ2EXP_LOOKUP_MIN (-32) -#define INVSQ2EXP_LOOKUP_MAX 32 -static const float INVSQ2EXP_LOOKUP[INVSQ2EXP_LOOKUP_MAX-\ - INVSQ2EXP_LOOKUP_MIN+1]={ - 65536.f, 46340.95001f, 32768.f, 23170.47501f, - 16384.f, 11585.2375f, 8192.f, 5792.618751f, - 4096.f, 2896.309376f, 2048.f, 1448.154688f, - 1024.f, 724.0773439f, 512.f, 362.038672f, - 256.f, 181.019336f, 128.f, 90.50966799f, - 64.f, 45.254834f, 32.f, 22.627417f, - 16.f, 11.3137085f, 8.f, 5.656854249f, - 4.f, 2.828427125f, 2.f, 1.414213562f, - 1.f, 0.7071067812f, 0.5f, 0.3535533906f, - 0.25f, 0.1767766953f, 0.125f, 0.08838834765f, - 0.0625f, 0.04419417382f, 0.03125f, 0.02209708691f, - 0.015625f, 0.01104854346f, 0.0078125f, 0.005524271728f, - 0.00390625f, 0.002762135864f, 0.001953125f, 0.001381067932f, - 0.0009765625f, 0.000690533966f, 0.00048828125f, 0.000345266983f, - 0.000244140625f,0.0001726334915f,0.0001220703125f,8.631674575e-05f, - 6.103515625e-05f,4.315837288e-05f,3.051757812e-05f,2.157918644e-05f, - 1.525878906e-05f, -}; - -#endif - -#define FROMdB_LOOKUP_SZ 35 -#define FROMdB2_LOOKUP_SZ 32 -#define FROMdB_SHIFT 5 -#define FROMdB2_SHIFT 3 -#define FROMdB2_MASK 31 - -#ifdef FLOAT_LOOKUP -static const float FROMdB_LOOKUP[FROMdB_LOOKUP_SZ]={ - 1.f, 0.6309573445f, 0.3981071706f, 0.2511886432f, - 0.1584893192f, 0.1f, 0.06309573445f, 0.03981071706f, - 0.02511886432f, 0.01584893192f, 0.01f, 0.006309573445f, - 0.003981071706f, 0.002511886432f, 0.001584893192f, 0.001f, - 0.0006309573445f,0.0003981071706f,0.0002511886432f,0.0001584893192f, - 0.0001f,6.309573445e-05f,3.981071706e-05f,2.511886432e-05f, - 1.584893192e-05f, 1e-05f,6.309573445e-06f,3.981071706e-06f, - 2.511886432e-06f,1.584893192e-06f, 1e-06f,6.309573445e-07f, - 3.981071706e-07f,2.511886432e-07f,1.584893192e-07f, -}; - -static const float FROMdB2_LOOKUP[FROMdB2_LOOKUP_SZ]={ - 0.9928302478f, 0.9786445908f, 0.9646616199f, 0.9508784391f, - 0.9372921937f, 0.92390007f, 0.9106992942f, 0.8976871324f, - 0.8848608897f, 0.8722179097f, 0.8597555737f, 0.8474713009f, - 0.835362547f, 0.8234268041f, 0.8116616003f, 0.8000644989f, - 0.7886330981f, 0.7773650302f, 0.7662579617f, 0.755309592f, - 0.7445176537f, 0.7338799116f, 0.7233941627f, 0.7130582353f, - 0.7028699885f, 0.6928273125f, 0.6829281272f, 0.6731703824f, - 0.6635520573f, 0.6540711597f, 0.6447257262f, 0.6355138211f, -}; -#endif - -#ifdef INT_LOOKUP - -#define INVSQ_LOOKUP_I_SHIFT 10 -#define INVSQ_LOOKUP_I_MASK 1023 -static const long INVSQ_LOOKUP_I[64+1]={ - 92682l, 91966l, 91267l, 90583l, - 89915l, 89261l, 88621l, 87995l, - 87381l, 86781l, 86192l, 85616l, - 85051l, 84497l, 83953l, 83420l, - 82897l, 82384l, 81880l, 81385l, - 80899l, 80422l, 79953l, 79492l, - 79039l, 78594l, 78156l, 77726l, - 77302l, 76885l, 76475l, 76072l, - 75674l, 75283l, 74898l, 74519l, - 74146l, 73778l, 73415l, 73058l, - 72706l, 72359l, 72016l, 71679l, - 71347l, 71019l, 70695l, 70376l, - 70061l, 69750l, 69444l, 69141l, - 68842l, 68548l, 68256l, 67969l, - 67685l, 67405l, 67128l, 66855l, - 66585l, 66318l, 66054l, 65794l, - 65536l, -}; - -#define COS_LOOKUP_I_SHIFT 9 -#define COS_LOOKUP_I_MASK 511 -#define COS_LOOKUP_I_SZ 128 -static const long COS_LOOKUP_I[COS_LOOKUP_I_SZ+1]={ - 16384l, 16379l, 16364l, 16340l, - 16305l, 16261l, 16207l, 16143l, - 16069l, 15986l, 15893l, 15791l, - 15679l, 15557l, 15426l, 15286l, - 15137l, 14978l, 14811l, 14635l, - 14449l, 14256l, 14053l, 13842l, - 13623l, 13395l, 13160l, 12916l, - 12665l, 12406l, 12140l, 11866l, - 11585l, 11297l, 11003l, 10702l, - 10394l, 10080l, 9760l, 9434l, - 9102l, 8765l, 8423l, 8076l, - 7723l, 7366l, 7005l, 6639l, - 6270l, 5897l, 5520l, 5139l, - 4756l, 4370l, 3981l, 3590l, - 3196l, 2801l, 2404l, 2006l, - 1606l, 1205l, 804l, 402l, - 0l, -401l, -803l, -1204l, - -1605l, -2005l, -2403l, -2800l, - -3195l, -3589l, -3980l, -4369l, - -4755l, -5138l, -5519l, -5896l, - -6269l, -6638l, -7004l, -7365l, - -7722l, -8075l, -8422l, -8764l, - -9101l, -9433l, -9759l, -10079l, - -10393l, -10701l, -11002l, -11296l, - -11584l, -11865l, -12139l, -12405l, - -12664l, -12915l, -13159l, -13394l, - -13622l, -13841l, -14052l, -14255l, - -14448l, -14634l, -14810l, -14977l, - -15136l, -15285l, -15425l, -15556l, - -15678l, -15790l, -15892l, -15985l, - -16068l, -16142l, -16206l, -16260l, - -16304l, -16339l, -16363l, -16378l, - -16383l, -}; - -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c deleted file mode 100755 index a2325e6..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/lpc.c +++ /dev/null @@ -1,160 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: LPC low level routines - last mod: $Id: lpc.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -/* Some of these routines (autocorrelator, LPC coefficient estimator) - are derived from code written by Jutta Degener and Carsten Bormann; - thus we include their copyright below. The entirety of this file - is freely redistributable on the condition that both of these - copyright notices are preserved without modification. */ - -/* Preserved Copyright: *********************************************/ - -/* Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, -Technische Universita"t Berlin - -Any use of this software is permitted provided that this notice is not -removed and that neither the authors nor the Technische Universita"t -Berlin are deemed to have made any representations as to the -suitability of this software for any purpose nor are held responsible -for any defects of this software. THERE IS ABSOLUTELY NO WARRANTY FOR -THIS SOFTWARE. - -As a matter of courtesy, the authors request to be informed about uses -this software has found, about bugs in this software, and about any -improvements that may be of general interest. - -Berlin, 28.11.1994 -Jutta Degener -Carsten Bormann - -*********************************************************************/ - -#include -#include -#include -#include "os.h" -#include "smallft.h" -#include "lpc.h" -#include "scales.h" -#include "misc.h" - -/* Autocorrelation LPC coeff generation algorithm invented by - N. Levinson in 1947, modified by J. Durbin in 1959. */ - -/* Input : n elements of time doamin data - Output: m lpc coefficients, excitation energy */ - -float vorbis_lpc_from_data(float *data,float *lpci,int n,int m){ - double *aut=(double*)alloca(sizeof(*aut)*(m+1)); - double *lpc=(double*)alloca(sizeof(*lpc)*(m)); - double error; - double epsilon; - int i,j; - - /* autocorrelation, p+1 lag coefficients */ - j=m+1; - while(j--){ - double d=0; /* double needed for accumulator depth */ - for(i=j;i -#include -#include -#include "lsp.h" -#include "os.h" -#include "misc.h" -#include "lookup.h" -#include "scales.h" - -/* three possible LSP to f curve functions; the exact computation - (float), a lookup based float implementation, and an integer - implementation. The float lookup is likely the optimal choice on - any machine with an FPU. The integer implementation is *not* fixed - point (due to the need for a large dynamic range and thus a - separately tracked exponent) and thus much more complex than the - relatively simple float implementations. It's mostly for future - work on a fully fixed point implementation for processors like the - ARM family. */ - -/* define either of these (preferably FLOAT_LOOKUP) to have faster - but less precise implementation. */ -#undef FLOAT_LOOKUP -#undef INT_LOOKUP - -#ifdef FLOAT_LOOKUP -#include "lookup.c" /* catch this in the build system; we #include for - compilers (like gcc) that can't inline across - modules */ - -/* side effect: changes *lsp to cosines of lsp */ -void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, - float amp,float ampoffset){ - int i; - float wdel=M_PI/ln; - vorbis_fpu_control fpu; - - vorbis_fpu_setround(&fpu); - for(i=0;i>1; - - while(c--){ - q*=ftmp[0]-w; - p*=ftmp[1]-w; - ftmp+=2; - } - - if(m&1){ - /* odd order filter; slightly assymetric */ - /* the last coefficient */ - q*=ftmp[0]-w; - q*=q; - p*=p*(1.f-w*w); - }else{ - /* even order filter; still symmetric */ - q*=q*(1.f+w); - p*=p*(1.f-w); - } - - q=frexp(p+q,&qexp); - q=vorbis_fromdBlook(amp* - vorbis_invsqlook(q)* - vorbis_invsq2explook(qexp+m)- - ampoffset); - - do{ - curve[i++]*=q; - }while(map[i]==k); - } - vorbis_fpu_restore(fpu); -} - -#else - -#ifdef INT_LOOKUP -#include "lookup.c" /* catch this in the build system; we #include for - compilers (like gcc) that can't inline across - modules */ - -static const int MLOOP_1[64]={ - 0,10,11,11, 12,12,12,12, 13,13,13,13, 13,13,13,13, - 14,14,14,14, 14,14,14,14, 14,14,14,14, 14,14,14,14, - 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, - 15,15,15,15, 15,15,15,15, 15,15,15,15, 15,15,15,15, -}; - -static const int MLOOP_2[64]={ - 0,4,5,5, 6,6,6,6, 7,7,7,7, 7,7,7,7, - 8,8,8,8, 8,8,8,8, 8,8,8,8, 8,8,8,8, - 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, - 9,9,9,9, 9,9,9,9, 9,9,9,9, 9,9,9,9, -}; - -static const int MLOOP_3[8]={0,1,2,2,3,3,3,3}; - - -/* side effect: changes *lsp to cosines of lsp */ -void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, - float amp,float ampoffset){ - - /* 0 <= m < 256 */ - - /* set up for using all int later */ - int i; - int ampoffseti=rint(ampoffset*4096.f); - int ampi=rint(amp*16.f); - long *ilsp=(long*)alloca(m*sizeof(*ilsp)); - for(i=0;i>25])) - if(!(shift=MLOOP_2[(pi|qi)>>19])) - shift=MLOOP_3[(pi|qi)>>16]; - qi=(qi>>shift)*labs(ilsp[j-1]-wi); - pi=(pi>>shift)*labs(ilsp[j]-wi); - qexp+=shift; - } - if(!(shift=MLOOP_1[(pi|qi)>>25])) - if(!(shift=MLOOP_2[(pi|qi)>>19])) - shift=MLOOP_3[(pi|qi)>>16]; - - /* pi,qi normalized collectively, both tracked using qexp */ - - if(m&1){ - /* odd order filter; slightly assymetric */ - /* the last coefficient */ - qi=(qi>>shift)*labs(ilsp[j-1]-wi); - pi=(pi>>shift)<<14; - qexp+=shift; - - if(!(shift=MLOOP_1[(pi|qi)>>25])) - if(!(shift=MLOOP_2[(pi|qi)>>19])) - shift=MLOOP_3[(pi|qi)>>16]; - - pi>>=shift; - qi>>=shift; - qexp+=shift-14*((m+1)>>1); - - pi=((pi*pi)>>16); - qi=((qi*qi)>>16); - qexp=qexp*2+m; - - pi*=(1<<14)-((wi*wi)>>14); - qi+=pi>>14; - - }else{ - /* even order filter; still symmetric */ - - /* p*=p(1-w), q*=q(1+w), let normalization drift because it isn't - worth tracking step by step */ - - pi>>=shift; - qi>>=shift; - qexp+=shift-7*m; - - pi=((pi*pi)>>16); - qi=((qi*qi)>>16); - qexp=qexp*2+m; - - pi*=(1<<14)-wi; - qi*=(1<<14)+wi; - qi=(qi+pi)>>14; - - } - - - /* we've let the normalization drift because it wasn't important; - however, for the lookup, things must be normalized again. We - need at most one right shift or a number of left shifts */ - - if(qi&0xffff0000){ /* checks for 1.xxxxxxxxxxxxxxxx */ - qi>>=1; qexp++; - }else - while(qi && !(qi&0x8000)){ /* checks for 0.0xxxxxxxxxxxxxxx or less*/ - qi<<=1; qexp--; - } - - amp=vorbis_fromdBlook_i(ampi* /* n.4 */ - vorbis_invsqlook_i(qi,qexp)- - /* m.8, m+n<=8 */ - ampoffseti); /* 8.12[0] */ - - curve[i]*=amp; - while(map[++i]==k)curve[i]*=amp; - } -} - -#else - -/* old, nonoptimized but simple version for any poor sap who needs to - figure out what the hell this code does, or wants the other - fraction of a dB precision */ - -/* side effect: changes *lsp to cosines of lsp */ -void vorbis_lsp_to_curve(float *curve,int *map,int n,int ln,float *lsp,int m, - float amp,float ampoffset){ - int i; - float wdel=M_PI/ln; - for(i=0;i= i; j--) { - g[j-2] -= g[j]; - g[j] += g[j]; - } - } -} - -static int JUCE_CDECL comp(const void *a,const void *b){ - return (*(float *)a<*(float *)b)-(*(float *)a>*(float *)b); -} - -/* Newton-Raphson-Maehly actually functioned as a decent root finder, - but there are root sets for which it gets into limit cycles - (exacerbated by zero suppression) and fails. We can't afford to - fail, even if the failure is 1 in 100,000,000, so we now use - Laguerre and later polish with Newton-Raphson (which can then - afford to fail) */ - -#define EPSILON 10e-7 -static int Laguerre_With_Deflation(float *a,int ord,float *r){ - int i,m; - double *defl=(double*)alloca(sizeof(*defl)*(ord+1)); - for(i=0;i<=ord;i++)defl[i]=a[i]; - - for(m=ord;m>0;m--){ - double newx=0.f,delta; - - /* iterate a root */ - while(1){ - double p=defl[m],pp=0.f,ppp=0.f,denom; - - /* eval the polynomial and its first two derivatives */ - for(i=m;i>0;i--){ - ppp = newx*ppp + pp; - pp = newx*pp + p; - p = newx*p + defl[i-1]; - } - - /* Laguerre's method */ - denom=(m-1) * ((m-1)*pp*pp - m*p*ppp); - if(denom<0) - return(-1); /* complex root! The LPC generator handed us a bad filter */ - - if(pp>0){ - denom = pp + sqrt(denom); - if(denom-(EPSILON))denom=-(EPSILON); - } - - delta = m*p/denom; - newx -= delta; - - if(delta<0.f)delta*=-1; - - if(fabs(delta/newx)<10e-12)break; - } - - r[m-1]=newx; - - /* forward deflation */ - - for(i=m;i>0;i--) - defl[i-1]+=newx*defl[i]; - defl++; - - } - return(0); -} - - -/* for spit-and-polish only */ -static int Newton_Raphson(float *a,int ord,float *r){ - int i, k, count=0; - double error=1.f; - double *root=(double*)alloca(ord*sizeof(*root)); - - for(i=0; i1e-20){ - error=0; - - for(i=0; i= 0; k--) { - - pp= pp* rooti + p; - p = p * rooti + a[k]; - } - - delta = p/pp; - root[i] -= delta; - error+= delta*delta; - } - - if(count>40)return(-1); - - count++; - } - - /* Replaced the original bubble sort with a real sort. With your - help, we can eliminate the bubble sort in our lifetime. --Monty */ - - for(i=0; i>1; - int g1_order,g2_order; - float *g1=(float*)alloca(sizeof(*g1)*(order2+1)); - float *g2=(float*)alloca(sizeof(*g2)*(order2+1)); - float *g1r=(float*)alloca(sizeof(*g1r)*(order2+1)); - float *g2r=(float*)alloca(sizeof(*g2r)*(order2+1)); - int i; - - /* even and odd are slightly different base cases */ - g1_order=(m+1)>>1; - g2_order=(m) >>1; - - /* Compute the lengths of the x polynomials. */ - /* Compute the first half of K & R F1 & F2 polynomials. */ - /* Compute half of the symmetric and antisymmetric polynomials. */ - /* Remove the roots at +1 and -1. */ - - g1[g1_order] = 1.f; - for(i=1;i<=g1_order;i++) g1[g1_order-i] = lpc[i-1]+lpc[m-i]; - g2[g2_order] = 1.f; - for(i=1;i<=g2_order;i++) g2[g2_order-i] = lpc[i-1]-lpc[m-i]; - - if(g1_order>g2_order){ - for(i=2; i<=g2_order;i++) g2[g2_order-i] += g2[g2_order-i+2]; - }else{ - for(i=1; i<=g1_order;i++) g1[g1_order-i] -= g1[g1_order-i+1]; - for(i=1; i<=g2_order;i++) g2[g2_order-i] += g2[g2_order-i+1]; - } - - /* Convert into polynomials in cos(alpha) */ - cheby(g1,g1_order); - cheby(g2,g2_order); - - /* Find the roots of the 2 even polynomials.*/ - if(Laguerre_With_Deflation(g1,g1_order,g1r) || - Laguerre_With_Deflation(g2,g2_order,g2r)) - return(-1); - - Newton_Raphson(g1,g1_order,g1r); /* if it fails, it leaves g1r alone */ - Newton_Raphson(g2,g2_order,g2r); /* if it fails, it leaves g2r alone */ - - qsort(g1r,g1_order,sizeof(*g1r),comp); - qsort(g2r,g2_order,sizeof(*g2r),comp); - - for(i=0;i -#include -#include -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codec_internal.h" -#include "codebook.h" -#include "window.h" -#include "registry.h" -#include "psy.h" -#include "misc.h" - -/* simplistic, wasteful way of doing this (unique lookup for each - mode/submapping); there should be a central repository for - identical lookups. That will require minor work, so I'm putting it - off as low priority. - - Why a lookup for each backend in a given mode? Because the - blocksize is set by the mode, and low backend lookups may require - parameters from other areas of the mode/mapping */ - -static void mapping0_free_info(vorbis_info_mapping *i){ - vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -static int ilog3(unsigned int v){ - int ret=0; - if(v)--v; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - -static void mapping0_pack(vorbis_info *vi,vorbis_info_mapping *vm, - oggpack_buffer *opb){ - int i; - vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)vm; - - /* another 'we meant to do it this way' hack... up to beta 4, we - packed 4 binary zeros here to signify one submapping in use. We - now redefine that to mean four bitflags that indicate use of - deeper features; bit0:submappings, bit1:coupling, - bit2,3:reserved. This is backward compatable with all actual uses - of the beta code. */ - - if(info->submaps>1){ - oggpack_write(opb,1,1); - oggpack_write(opb,info->submaps-1,4); - }else - oggpack_write(opb,0,1); - - if(info->coupling_steps>0){ - oggpack_write(opb,1,1); - oggpack_write(opb,info->coupling_steps-1,8); - - for(i=0;icoupling_steps;i++){ - oggpack_write(opb,info->coupling_mag[i],ilog3(vi->channels)); - oggpack_write(opb,info->coupling_ang[i],ilog3(vi->channels)); - } - }else - oggpack_write(opb,0,1); - - oggpack_write(opb,0,2); /* 2,3:reserved */ - - /* we don't write the channel submappings if we only have one... */ - if(info->submaps>1){ - for(i=0;ichannels;i++) - oggpack_write(opb,info->chmuxlist[i],4); - } - for(i=0;isubmaps;i++){ - oggpack_write(opb,0,8); /* time submap unused */ - oggpack_write(opb,info->floorsubmap[i],8); - oggpack_write(opb,info->residuesubmap[i],8); - } -} - -/* also responsible for range checking */ -static vorbis_info_mapping *mapping0_unpack(vorbis_info *vi,oggpack_buffer *opb){ - int i,b; - vorbis_info_mapping0 *info=(vorbis_info_mapping0*)_ogg_calloc(1,sizeof(*info)); - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - memset(info,0,sizeof(*info)); - - b=oggpack_read(opb,1); - if(b<0)goto err_out; - if(b){ - info->submaps=oggpack_read(opb,4)+1; - if(info->submaps<=0)goto err_out; - }else - info->submaps=1; - - b=oggpack_read(opb,1); - if(b<0)goto err_out; - if(b){ - info->coupling_steps=oggpack_read(opb,8)+1; - if(info->coupling_steps<=0)goto err_out; - for(i=0;icoupling_steps;i++){ - int testM=info->coupling_mag[i]=oggpack_read(opb,ilog3(vi->channels)); - int testA=info->coupling_ang[i]=oggpack_read(opb,ilog3(vi->channels)); - - if(testM<0 || - testA<0 || - testM==testA || - testM>=vi->channels || - testA>=vi->channels) goto err_out; - } - - } - - if(oggpack_read(opb,2)!=0)goto err_out; /* 2,3:reserved */ - - if(info->submaps>1){ - for(i=0;ichannels;i++){ - info->chmuxlist[i]=oggpack_read(opb,4); - if(info->chmuxlist[i]>=info->submaps || info->chmuxlist[i]<0)goto err_out; - } - } - for(i=0;isubmaps;i++){ - oggpack_read(opb,8); /* time submap unused */ - info->floorsubmap[i]=oggpack_read(opb,8); - if(info->floorsubmap[i]>=ci->floors || info->floorsubmap[i]<0)goto err_out; - info->residuesubmap[i]=oggpack_read(opb,8); - if(info->residuesubmap[i]>=ci->residues || info->residuesubmap[i]<0)goto err_out; - } - - return info; - - err_out: - mapping0_free_info(info); - return(NULL); -} - -#include "os.h" -#include "lpc.h" -#include "lsp.h" -#include "envelope.h" -#include "mdct.h" -#include "psy.h" -#include "scales.h" - -#if 0 -static long seq=0; -static ogg_int64_t total=0; -static float FLOOR1_fromdB_LOOKUP[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.128753e-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.F, -}; - -#endif - - -static int mapping0_forward(vorbis_block *vb){ - vorbis_dsp_state *vd=vb->vd; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - private_state *b=(private_state*)vb->vd->backend_state; - vorbis_block_internal *vbi=(vorbis_block_internal *)vb->internal; - int n=vb->pcmend; - int i,j,k; - - int *nonzero = (int*)alloca(sizeof(*nonzero)*vi->channels); - float **gmdct = (float**)_vorbis_block_alloc(vb,vi->channels*sizeof(*gmdct)); - int **iwork = (int**)_vorbis_block_alloc(vb,vi->channels*sizeof(*iwork)); - int ***floor_posts = (int***)_vorbis_block_alloc(vb,vi->channels*sizeof(*floor_posts)); - - float global_ampmax=vbi->ampmax; - float *local_ampmax=(float*)alloca(sizeof(*local_ampmax)*vi->channels); - int blocktype=vbi->blocktype; - - int modenumber=vb->W; - vorbis_info_mapping0 *info=(vorbis_info_mapping0*)ci->map_param[modenumber]; - vorbis_look_psy *psy_look=b->psy+blocktype+(vb->W?2:0); - - vb->mode=modenumber; - - for(i=0;ichannels;i++){ - float scale=4.f/n; - float scale_dB; - - float *pcm =vb->pcm[i]; - float *logfft =pcm; - - iwork[i]=(int*)_vorbis_block_alloc(vb,n/2*sizeof(**iwork)); - gmdct[i]=(float*)_vorbis_block_alloc(vb,n/2*sizeof(**gmdct)); - - scale_dB=todB(&scale) + .345; /* + .345 is a hack; the original - todB estimation used on IEEE 754 - compliant machines had a bug that - returned dB values about a third - of a decibel too high. The bug - was harmless because tunings - implicitly took that into - account. However, fixing the bug - in the estimator requires - changing all the tunings as well. - For now, it's easier to sync - things back up here, and - recalibrate the tunings in the - next major model upgrade. */ - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("pcmL",seq,pcm,n,0,0,total-n/2); - else - _analysis_output("pcmR",seq,pcm,n,0,0,total-n/2); - }else{ - _analysis_output("pcm",seq,pcm,n,0,0,total-n/2); - } -#endif - - /* window the PCM data */ - _vorbis_apply_window(pcm,b->window,ci->blocksizes,vb->lW,vb->W,vb->nW); - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("windowedL",seq,pcm,n,0,0,total-n/2); - else - _analysis_output("windowedR",seq,pcm,n,0,0,total-n/2); - }else{ - _analysis_output("windowed",seq,pcm,n,0,0,total-n/2); - } -#endif - - /* transform the PCM data */ - /* only MDCT right now.... */ - mdct_forward((mdct_lookup*) b->transform[vb->W][0],pcm,gmdct[i]); - - /* FFT yields more accurate tonal estimation (not phase sensitive) */ - drft_forward(&b->fft_look[vb->W],pcm); - logfft[0]=scale_dB+todB(pcm) + .345; /* + .345 is a hack; the - original todB estimation used on - IEEE 754 compliant machines had a - bug that returned dB values about - a third of a decibel too high. - The bug was harmless because - tunings implicitly took that into - account. However, fixing the bug - in the estimator requires - changing all the tunings as well. - For now, it's easier to sync - things back up here, and - recalibrate the tunings in the - next major model upgrade. */ - local_ampmax[i]=logfft[0]; - for(j=1;j>1]=scale_dB+.5f*todB(&temp) + .345; /* + - .345 is a hack; the original todB - estimation used on IEEE 754 - compliant machines had a bug that - returned dB values about a third - of a decibel too high. The bug - was harmless because tunings - implicitly took that into - account. However, fixing the bug - in the estimator requires - changing all the tunings as well. - For now, it's easier to sync - things back up here, and - recalibrate the tunings in the - next major model upgrade. */ - if(temp>local_ampmax[i])local_ampmax[i]=temp; - } - - if(local_ampmax[i]>0.f)local_ampmax[i]=0.f; - if(local_ampmax[i]>global_ampmax)global_ampmax=local_ampmax[i]; - -#if 0 - if(vi->channels==2){ - if(i==0){ - _analysis_output("fftL",seq,logfft,n/2,1,0,0); - }else{ - _analysis_output("fftR",seq,logfft,n/2,1,0,0); - } - }else{ - _analysis_output("fft",seq,logfft,n/2,1,0,0); - } -#endif - - } - - { - float *noise = (float*)_vorbis_block_alloc(vb,n/2*sizeof(*noise)); - float *tone = (float*)_vorbis_block_alloc(vb,n/2*sizeof(*tone)); - - for(i=0;ichannels;i++){ - /* the encoder setup assumes that all the modes used by any - specific bitrate tweaking use the same floor */ - - int submap=info->chmuxlist[i]; - - /* the following makes things clearer to *me* anyway */ - float *mdct =gmdct[i]; - float *logfft =vb->pcm[i]; - - float *logmdct =logfft+n/2; - float *logmask =logfft; - - vb->mode=modenumber; - - floor_posts[i]=(int**)_vorbis_block_alloc(vb,PACKETBLOBS*sizeof(**floor_posts)); - memset(floor_posts[i],0,sizeof(**floor_posts)*PACKETBLOBS); - - for(j=0;jchannels==2){ - if(i==0) - _analysis_output("mdctL",seq,logmdct,n/2,1,0,0); - else - _analysis_output("mdctR",seq,logmdct,n/2,1,0,0); - }else{ - _analysis_output("mdct",seq,logmdct,n/2,1,0,0); - } -#endif - - /* first step; noise masking. Not only does 'noise masking' - give us curves from which we can decide how much resolution - to give noise parts of the spectrum, it also implicitly hands - us a tonality estimate (the larger the value in the - 'noise_depth' vector, the more tonal that area is) */ - - _vp_noisemask(psy_look, - logmdct, - noise); /* noise does not have by-frequency offset - bias applied yet */ -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("noiseL",seq,noise,n/2,1,0,0); - else - _analysis_output("noiseR",seq,noise,n/2,1,0,0); - }else{ - _analysis_output("noise",seq,noise,n/2,1,0,0); - } -#endif - - /* second step: 'all the other crap'; all the stuff that isn't - computed/fit for bitrate management goes in the second psy - vector. This includes tone masking, peak limiting and ATH */ - - _vp_tonemask(psy_look, - logfft, - tone, - global_ampmax, - local_ampmax[i]); - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("toneL",seq,tone,n/2,1,0,0); - else - _analysis_output("toneR",seq,tone,n/2,1,0,0); - }else{ - _analysis_output("tone",seq,tone,n/2,1,0,0); - } -#endif - - /* third step; we offset the noise vectors, overlay tone - masking. We then do a floor1-specific line fit. If we're - performing bitrate management, the line fit is performed - multiple times for up/down tweakage on demand. */ - -#if 0 - { - float aotuv[psy_look->n]; -#endif - - _vp_offset_and_mix(psy_look, - noise, - tone, - 1, - logmask, - mdct, - logmdct); - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("aotuvM1_L",seq,aotuv,psy_look->n,1,1,0); - else - _analysis_output("aotuvM1_R",seq,aotuv,psy_look->n,1,1,0); - }else{ - _analysis_output("aotuvM1",seq,aotuv,psy_look->n,1,1,0); - } - } -#endif - - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("mask1L",seq,logmask,n/2,1,0,0); - else - _analysis_output("mask1R",seq,logmask,n/2,1,0,0); - }else{ - _analysis_output("mask1",seq,logmask,n/2,1,0,0); - } -#endif - - /* this algorithm is hardwired to floor 1 for now; abort out if - we're *not* floor1. This won't happen unless someone has - broken the encode setup lib. Guard it anyway. */ - if(ci->floor_type[info->floorsubmap[submap]]!=1)return(-1); - - floor_posts[i][PACKETBLOBS/2]= - floor1_fit(vb,(vorbis_look_floor1*)(b->flr[info->floorsubmap[submap]]), - logmdct, - logmask); - - /* are we managing bitrate? If so, perform two more fits for - later rate tweaking (fits represent hi/lo) */ - if(vorbis_bitrate_managed(vb) && floor_posts[i][PACKETBLOBS/2]){ - /* higher rate by way of lower noise curve */ - - _vp_offset_and_mix(psy_look, - noise, - tone, - 2, - logmask, - mdct, - logmdct); - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("mask2L",seq,logmask,n/2,1,0,0); - else - _analysis_output("mask2R",seq,logmask,n/2,1,0,0); - }else{ - _analysis_output("mask2",seq,logmask,n/2,1,0,0); - } -#endif - - floor_posts[i][PACKETBLOBS-1]= - floor1_fit(vb,(vorbis_look_floor1*)(b->flr[info->floorsubmap[submap]]), - logmdct, - logmask); - - /* lower rate by way of higher noise curve */ - _vp_offset_and_mix(psy_look, - noise, - tone, - 0, - logmask, - mdct, - logmdct); - -#if 0 - if(vi->channels==2){ - if(i==0) - _analysis_output("mask0L",seq,logmask,n/2,1,0,0); - else - _analysis_output("mask0R",seq,logmask,n/2,1,0,0); - }else{ - _analysis_output("mask0",seq,logmask,n/2,1,0,0); - } -#endif - - floor_posts[i][0]= - floor1_fit(vb,(vorbis_look_floor1*)(b->flr[info->floorsubmap[submap]]), - logmdct, - logmask); - - /* we also interpolate a range of intermediate curves for - intermediate rates */ - for(k=1;kflr[info->floorsubmap[submap]]), - floor_posts[i][0], - floor_posts[i][PACKETBLOBS/2], - k*65536/(PACKETBLOBS/2)); - for(k=PACKETBLOBS/2+1;kflr[info->floorsubmap[submap]]), - floor_posts[i][PACKETBLOBS/2], - floor_posts[i][PACKETBLOBS-1], - (k-PACKETBLOBS/2)*65536/(PACKETBLOBS/2)); - } - } - } - vbi->ampmax=global_ampmax; - - /* - the next phases are performed once for vbr-only and PACKETBLOB - times for bitrate managed modes. - - 1) encode actual mode being used - 2) encode the floor for each channel, compute coded mask curve/res - 3) normalize and couple. - 4) encode residue - 5) save packet bytes to the packetblob vector - - */ - - /* iterate over the many masking curve fits we've created */ - - { - int **couple_bundle=(int**)alloca(sizeof(*couple_bundle)*vi->channels); - int *zerobundle=(int*)alloca(sizeof(*zerobundle)*vi->channels); - - for(k=(vorbis_bitrate_managed(vb)?0:PACKETBLOBS/2); - k<=(vorbis_bitrate_managed(vb)?PACKETBLOBS-1:PACKETBLOBS/2); - k++){ - oggpack_buffer *opb=vbi->packetblob[k]; - - /* start out our new packet blob with packet type and mode */ - /* Encode the packet type */ - oggpack_write(opb,0,1); - /* Encode the modenumber */ - /* Encode frame mode, pre,post windowsize, then dispatch */ - oggpack_write(opb,modenumber,b->modebits); - if(vb->W){ - oggpack_write(opb,vb->lW,1); - oggpack_write(opb,vb->nW,1); - } - - /* encode floor, compute masking curve, sep out residue */ - for(i=0;ichannels;i++){ - int submap=info->chmuxlist[i]; - int *ilogmask=iwork[i]; - - nonzero[i]=floor1_encode(opb,vb,(vorbis_look_floor1*)(b->flr[info->floorsubmap[submap]]), - floor_posts[i][k], - ilogmask); -#if 0 - { - char buf[80]; - sprintf(buf,"maskI%c%d",i?'R':'L',k); - float work[n/2]; - for(j=0;jpsy_g_param, - psy_look, - info, - gmdct, - iwork, - nonzero, - ci->psy_g_param.sliding_lowpass[vb->W][k], - vi->channels); - -#if 0 - for(i=0;ichannels;i++){ - char buf[80]; - sprintf(buf,"res%c%d",i?'R':'L',k); - float work[n/2]; - for(j=0;jsubmaps;i++){ - int ch_in_bundle=0; - long **classifications; - int resnum=info->residuesubmap[i]; - - for(j=0;jchannels;j++){ - if(info->chmuxlist[j]==i){ - zerobundle[ch_in_bundle]=0; - if(nonzero[j])zerobundle[ch_in_bundle]=1; - couple_bundle[ch_in_bundle++]=iwork[j]; - } - } - - classifications=_residue_P[ci->residue_type[resnum]]-> - classx(vb,b->residue[resnum],couple_bundle,zerobundle,ch_in_bundle); - - ch_in_bundle=0; - for(j=0;jchannels;j++) - if(info->chmuxlist[j]==i) - couple_bundle[ch_in_bundle++]=iwork[j]; - - _residue_P[ci->residue_type[resnum]]-> - forward(opb,vb,b->residue[resnum], - couple_bundle,zerobundle,ch_in_bundle,classifications,i); - } - - /* ok, done encoding. Next protopacket. */ - } - - } - -#if 0 - seq++; - total+=ci->blocksizes[vb->W]/4+ci->blocksizes[vb->nW]/4; -#endif - return(0); -} - -static int mapping0_inverse(vorbis_block *vb,vorbis_info_mapping *l){ - vorbis_dsp_state *vd=vb->vd; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - private_state *b=(private_state*)vd->backend_state; - vorbis_info_mapping0 *info=(vorbis_info_mapping0 *)l; - - int i,j; - long n=vb->pcmend=ci->blocksizes[vb->W]; - - float **pcmbundle=(float**) alloca(sizeof(*pcmbundle)*vi->channels); - int *zerobundle=(int*) alloca(sizeof(*zerobundle)*vi->channels); - - int *nonzero =(int*) alloca(sizeof(*nonzero)*vi->channels); - void **floormemo=(void**) alloca(sizeof(*floormemo)*vi->channels); - - /* recover the spectral envelope; store it in the PCM vector for now */ - for(i=0;ichannels;i++){ - int submap=info->chmuxlist[i]; - floormemo[i]=_floor_P[ci->floor_type[info->floorsubmap[submap]]]-> - inverse1(vb,b->flr[info->floorsubmap[submap]]); - if(floormemo[i]) - nonzero[i]=1; - else - nonzero[i]=0; - memset(vb->pcm[i],0,sizeof(*vb->pcm[i])*n/2); - } - - /* channel coupling can 'dirty' the nonzero listing */ - for(i=0;icoupling_steps;i++){ - if(nonzero[info->coupling_mag[i]] || - nonzero[info->coupling_ang[i]]){ - nonzero[info->coupling_mag[i]]=1; - nonzero[info->coupling_ang[i]]=1; - } - } - - /* recover the residue into our working vectors */ - for(i=0;isubmaps;i++){ - int ch_in_bundle=0; - for(j=0;jchannels;j++){ - if(info->chmuxlist[j]==i){ - if(nonzero[j]) - zerobundle[ch_in_bundle]=1; - else - zerobundle[ch_in_bundle]=0; - pcmbundle[ch_in_bundle++]=vb->pcm[j]; - } - } - - _residue_P[ci->residue_type[info->residuesubmap[i]]]-> - inverse(vb,b->residue[info->residuesubmap[i]], - pcmbundle,zerobundle,ch_in_bundle); - } - - /* channel coupling */ - for(i=info->coupling_steps-1;i>=0;i--){ - float *pcmM=vb->pcm[info->coupling_mag[i]]; - float *pcmA=vb->pcm[info->coupling_ang[i]]; - - for(j=0;j0) - if(ang>0){ - pcmM[j]=mag; - pcmA[j]=mag-ang; - }else{ - pcmA[j]=mag; - pcmM[j]=mag+ang; - } - else - if(ang>0){ - pcmM[j]=mag; - pcmA[j]=mag+ang; - }else{ - pcmA[j]=mag; - pcmM[j]=mag-ang; - } - } - } - - /* compute and apply spectral envelope */ - for(i=0;ichannels;i++){ - float *pcm=vb->pcm[i]; - int submap=info->chmuxlist[i]; - _floor_P[ci->floor_type[info->floorsubmap[submap]]]-> - inverse2(vb,b->flr[info->floorsubmap[submap]], - floormemo[i],pcm); - } - - /* transform the PCM data; takes PCM vector, vb; modifies PCM vector */ - /* only MDCT right now.... */ - for(i=0;ichannels;i++){ - float *pcm=vb->pcm[i]; - mdct_backward((mdct_lookup*) b->transform[vb->W][0],pcm,pcm); - } - - /* all done! */ - return(0); -} - -/* export hooks */ -const vorbis_func_mapping mapping0_exportbundle={ - &mapping0_pack, - &mapping0_unpack, - &mapping0_free_info, - &mapping0_forward, - &mapping0_inverse -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h deleted file mode 100755 index 31c825f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/masking.h +++ /dev/null @@ -1,785 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: masking curve data for psychoacoustics - last mod: $Id: masking.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_MASKING_H_ -#define _V_MASKING_H_ - -/* more detailed ATH; the bass if flat to save stressing the floor - overly for only a bin or two of savings. */ - -#define MAX_ATH 88 -static const float ATH[]={ - /*15*/ -51, -52, -53, -54, -55, -56, -57, -58, - /*31*/ -59, -60, -61, -62, -63, -64, -65, -66, - /*63*/ -67, -68, -69, -70, -71, -72, -73, -74, - /*125*/ -75, -76, -77, -78, -80, -81, -82, -83, - /*250*/ -84, -85, -86, -87, -88, -88, -89, -89, - /*500*/ -90, -91, -91, -92, -93, -94, -95, -96, - /*1k*/ -96, -97, -98, -98, -99, -99,-100,-100, - /*2k*/ -101,-102,-103,-104,-106,-107,-107,-107, - /*4k*/ -107,-105,-103,-102,-101, -99, -98, -96, - /*8k*/ -95, -95, -96, -97, -96, -95, -93, -90, - /*16k*/ -80, -70, -50, -40, -30, -30, -30, -30 -}; - -/* The tone masking curves from Ehmer's and Fielder's papers have been - replaced by an empirically collected data set. The previously - published values were, far too often, simply on crack. */ - -#define EHMER_OFFSET 16 -#define EHMER_MAX 56 - -/* masking tones from -50 to 0dB, 62.5 through 16kHz at half octaves - test tones from -2 octaves to +5 octaves sampled at eighth octaves */ -/* (Vorbis 0dB, the loudest possible tone, is assumed to be ~100dB SPL - for collection of these curves) */ - -static const float tonemasks[P_BANDS][6][EHMER_MAX]={ - /* 62.5 Hz */ - {{ -60, -60, -60, -60, -60, -60, -60, -60, - -60, -60, -60, -60, -62, -62, -65, -73, - -69, -68, -68, -67, -70, -70, -72, -74, - -75, -79, -79, -80, -83, -88, -93, -100, - -110, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -48, -48, -48, -48, -48, -48, -48, -48, - -48, -48, -48, -48, -48, -53, -61, -66, - -66, -68, -67, -70, -76, -76, -72, -73, - -75, -76, -78, -79, -83, -88, -93, -100, - -110, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -37, -37, -37, -37, -37, -37, -37, -37, - -38, -40, -42, -46, -48, -53, -55, -62, - -65, -58, -56, -56, -61, -60, -65, -67, - -69, -71, -77, -77, -78, -80, -82, -84, - -88, -93, -98, -106, -112, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -25, -25, -25, -25, -25, -25, -25, -25, - -25, -26, -27, -29, -32, -38, -48, -52, - -52, -50, -48, -48, -51, -52, -54, -60, - -67, -67, -66, -68, -69, -73, -73, -76, - -80, -81, -81, -85, -85, -86, -88, -93, - -100, -110, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -16, -16, -16, -16, -16, -16, -16, -16, - -17, -19, -20, -22, -26, -28, -31, -40, - -47, -39, -39, -40, -42, -43, -47, -51, - -57, -52, -55, -55, -60, -58, -62, -63, - -70, -67, -69, -72, -73, -77, -80, -82, - -83, -87, -90, -94, -98, -104, -115, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -8, -8, -8, -8, -8, -8, -8, -8, - -8, -8, -10, -11, -15, -19, -25, -30, - -34, -31, -30, -31, -29, -32, -35, -42, - -48, -42, -44, -46, -50, -50, -51, -52, - -59, -54, -55, -55, -58, -62, -63, -66, - -72, -73, -76, -75, -78, -80, -80, -81, - -84, -88, -90, -94, -98, -101, -106, -110}}, - /* 88Hz */ - {{ -66, -66, -66, -66, -66, -66, -66, -66, - -66, -66, -66, -66, -66, -67, -67, -67, - -76, -72, -71, -74, -76, -76, -75, -78, - -79, -79, -81, -83, -86, -89, -93, -97, - -100, -105, -110, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -47, -47, -47, -47, -47, -47, -47, -47, - -47, -47, -47, -48, -51, -55, -59, -66, - -66, -66, -67, -66, -68, -69, -70, -74, - -79, -77, -77, -78, -80, -81, -82, -84, - -86, -88, -91, -95, -100, -108, -116, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -36, -36, -36, -36, -36, -36, -36, -36, - -36, -37, -37, -41, -44, -48, -51, -58, - -62, -60, -57, -59, -59, -60, -63, -65, - -72, -71, -70, -72, -74, -77, -76, -78, - -81, -81, -80, -83, -86, -91, -96, -100, - -105, -110, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -28, -28, -28, -28, -28, -28, -28, -28, - -28, -30, -32, -32, -33, -35, -41, -49, - -50, -49, -47, -48, -48, -52, -51, -57, - -65, -61, -59, -61, -64, -69, -70, -74, - -77, -77, -78, -81, -84, -85, -87, -90, - -92, -96, -100, -107, -112, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -19, -19, -19, -19, -19, -19, -19, -19, - -20, -21, -23, -27, -30, -35, -36, -41, - -46, -44, -42, -40, -41, -41, -43, -48, - -55, -53, -52, -53, -56, -59, -58, -60, - -67, -66, -69, -71, -72, -75, -79, -81, - -84, -87, -90, -93, -97, -101, -107, -114, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -9, -9, -9, -9, -9, -9, -9, -9, - -11, -12, -12, -15, -16, -20, -23, -30, - -37, -34, -33, -34, -31, -32, -32, -38, - -47, -44, -41, -40, -47, -49, -46, -46, - -58, -50, -50, -54, -58, -62, -64, -67, - -67, -70, -72, -76, -79, -83, -87, -91, - -96, -100, -104, -110, -999, -999, -999, -999}}, - /* 125 Hz */ - {{ -62, -62, -62, -62, -62, -62, -62, -62, - -62, -62, -63, -64, -66, -67, -66, -68, - -75, -72, -76, -75, -76, -78, -79, -82, - -84, -85, -90, -94, -101, -110, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -59, -59, -59, -59, -59, -59, -59, -59, - -59, -59, -59, -60, -60, -61, -63, -66, - -71, -68, -70, -70, -71, -72, -72, -75, - -81, -78, -79, -82, -83, -86, -90, -97, - -103, -113, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -53, -53, -53, -53, -53, -53, -53, -53, - -53, -54, -55, -57, -56, -57, -55, -61, - -65, -60, -60, -62, -63, -63, -66, -68, - -74, -73, -75, -75, -78, -80, -80, -82, - -85, -90, -96, -101, -108, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -46, -46, -46, -46, -46, -46, -46, -46, - -46, -46, -47, -47, -47, -47, -48, -51, - -57, -51, -49, -50, -51, -53, -54, -59, - -66, -60, -62, -67, -67, -70, -72, -75, - -76, -78, -81, -85, -88, -94, -97, -104, - -112, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -36, -36, -36, -36, -36, -36, -36, -36, - -39, -41, -42, -42, -39, -38, -41, -43, - -52, -44, -40, -39, -37, -37, -40, -47, - -54, -50, -48, -50, -55, -61, -59, -62, - -66, -66, -66, -69, -69, -73, -74, -74, - -75, -77, -79, -82, -87, -91, -95, -100, - -108, -115, -999, -999, -999, -999, -999, -999}, - { -28, -26, -24, -22, -20, -20, -23, -29, - -30, -31, -28, -27, -28, -28, -28, -35, - -40, -33, -32, -29, -30, -30, -30, -37, - -45, -41, -37, -38, -45, -47, -47, -48, - -53, -49, -48, -50, -49, -49, -51, -52, - -58, -56, -57, -56, -60, -61, -62, -70, - -72, -74, -78, -83, -88, -93, -100, -106}}, - /* 177 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -110, -105, -100, -95, -91, -87, -83, - -80, -78, -76, -78, -78, -81, -83, -85, - -86, -85, -86, -87, -90, -97, -107, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -110, -105, -100, -95, -90, - -85, -81, -77, -73, -70, -67, -67, -68, - -75, -73, -70, -69, -70, -72, -75, -79, - -84, -83, -84, -86, -88, -89, -89, -93, - -98, -105, -112, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-105, -100, -95, -90, -85, -80, -76, -71, - -68, -68, -65, -63, -63, -62, -62, -64, - -65, -64, -61, -62, -63, -64, -66, -68, - -73, -73, -74, -75, -76, -81, -83, -85, - -88, -89, -92, -95, -100, -108, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -80, -75, -71, -68, -65, -63, -62, -61, - -61, -61, -61, -59, -56, -57, -53, -50, - -58, -52, -50, -50, -52, -53, -54, -58, - -67, -63, -67, -68, -72, -75, -78, -80, - -81, -81, -82, -85, -89, -90, -93, -97, - -101, -107, -114, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - { -65, -61, -59, -57, -56, -55, -55, -56, - -56, -57, -55, -53, -52, -47, -44, -44, - -50, -44, -41, -39, -39, -42, -40, -46, - -51, -49, -50, -53, -54, -63, -60, -61, - -62, -66, -66, -66, -70, -73, -74, -75, - -76, -75, -79, -85, -89, -91, -96, -102, - -110, -999, -999, -999, -999, -999, -999, -999}, - { -52, -50, -49, -49, -48, -48, -48, -49, - -50, -50, -49, -46, -43, -39, -35, -33, - -38, -36, -32, -29, -32, -32, -32, -35, - -44, -39, -38, -38, -46, -50, -45, -46, - -53, -50, -50, -50, -54, -54, -53, -53, - -56, -57, -59, -66, -70, -72, -74, -79, - -83, -85, -90, -97, -114, -999, -999, -999}}, - /* 250 Hz */ - {{-999, -999, -999, -999, -999, -999, -110, -105, - -100, -95, -90, -86, -80, -75, -75, -79, - -80, -79, -80, -81, -82, -88, -95, -103, - -110, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -108, -103, -98, -93, - -88, -83, -79, -78, -75, -71, -67, -68, - -73, -73, -72, -73, -75, -77, -80, -82, - -88, -93, -100, -107, -114, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -110, -105, -101, -96, -90, - -86, -81, -77, -73, -69, -66, -61, -62, - -66, -64, -62, -65, -66, -70, -72, -76, - -81, -80, -84, -90, -95, -102, -110, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -107, -103, -97, -92, -88, - -83, -79, -74, -70, -66, -59, -53, -58, - -62, -55, -54, -54, -54, -58, -61, -62, - -72, -70, -72, -75, -78, -80, -81, -80, - -83, -83, -88, -93, -100, -107, -115, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -105, -100, -95, -90, -85, - -80, -75, -70, -66, -62, -56, -48, -44, - -48, -46, -46, -43, -46, -48, -48, -51, - -58, -58, -59, -60, -62, -62, -61, -61, - -65, -64, -65, -68, -70, -74, -75, -78, - -81, -86, -95, -110, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -105, -100, -95, -90, -85, -80, - -75, -70, -65, -61, -55, -49, -39, -33, - -40, -35, -32, -38, -40, -33, -35, -37, - -46, -41, -45, -44, -46, -42, -45, -46, - -52, -50, -50, -50, -54, -54, -55, -57, - -62, -64, -66, -68, -70, -76, -81, -90, - -100, -110, -999, -999, -999, -999, -999, -999}}, - /* 354 hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -105, -98, -90, -85, -82, -83, -80, -78, - -84, -79, -80, -83, -87, -89, -91, -93, - -99, -106, -117, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -105, -98, -90, -85, -80, -75, -70, -68, - -74, -72, -74, -77, -80, -82, -85, -87, - -92, -89, -91, -95, -100, -106, -112, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -105, -98, -90, -83, -75, -71, -63, -64, - -67, -62, -64, -67, -70, -73, -77, -81, - -84, -83, -85, -89, -90, -93, -98, -104, - -109, -114, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -103, -96, -88, -81, -75, -68, -58, -54, - -56, -54, -56, -56, -58, -60, -63, -66, - -74, -69, -72, -72, -75, -74, -77, -81, - -81, -82, -84, -87, -93, -96, -99, -104, - -110, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -108, -102, -96, - -91, -85, -80, -74, -68, -60, -51, -46, - -48, -46, -43, -45, -47, -47, -49, -48, - -56, -53, -55, -58, -57, -63, -58, -60, - -66, -64, -67, -70, -70, -74, -77, -84, - -86, -89, -91, -93, -94, -101, -109, -118, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -108, -103, -98, -93, -88, - -83, -78, -73, -68, -60, -53, -44, -35, - -38, -38, -34, -34, -36, -40, -41, -44, - -51, -45, -46, -47, -46, -54, -50, -49, - -50, -50, -50, -51, -54, -57, -58, -60, - -66, -66, -66, -64, -65, -68, -77, -82, - -87, -95, -110, -999, -999, -999, -999, -999}}, - /* 500 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -107, -102, -97, -92, -87, -83, -78, -75, - -82, -79, -83, -85, -89, -92, -95, -98, - -101, -105, -109, -113, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -106, - -100, -95, -90, -86, -81, -78, -74, -69, - -74, -74, -76, -79, -83, -84, -86, -89, - -92, -97, -93, -100, -103, -107, -110, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -106, -100, - -95, -90, -87, -83, -80, -75, -69, -60, - -66, -66, -68, -70, -74, -78, -79, -81, - -81, -83, -84, -87, -93, -96, -99, -103, - -107, -110, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -108, -103, -98, - -93, -89, -85, -82, -78, -71, -62, -55, - -58, -58, -54, -54, -55, -59, -61, -62, - -70, -66, -66, -67, -70, -72, -75, -78, - -84, -84, -84, -88, -91, -90, -95, -98, - -102, -103, -106, -110, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -108, -103, -98, -94, - -90, -87, -82, -79, -73, -67, -58, -47, - -50, -45, -41, -45, -48, -44, -44, -49, - -54, -51, -48, -47, -49, -50, -51, -57, - -58, -60, -63, -69, -70, -69, -71, -74, - -78, -82, -90, -95, -101, -105, -110, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -105, -101, -97, -93, -90, - -85, -80, -77, -72, -65, -56, -48, -37, - -40, -36, -34, -40, -50, -47, -38, -41, - -47, -38, -35, -39, -38, -43, -40, -45, - -50, -45, -44, -47, -50, -55, -48, -48, - -52, -66, -70, -76, -82, -90, -97, -105, - -110, -999, -999, -999, -999, -999, -999, -999}}, - /* 707 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -108, -103, -98, -93, -86, -79, -76, - -83, -81, -85, -87, -89, -93, -98, -102, - -107, -112, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -108, -103, -98, -93, -86, -79, -71, - -77, -74, -77, -79, -81, -84, -85, -90, - -92, -93, -92, -98, -101, -108, -112, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -108, -103, -98, -93, -87, -78, -68, -65, - -66, -62, -65, -67, -70, -73, -75, -78, - -82, -82, -83, -84, -91, -93, -98, -102, - -106, -110, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -105, -100, -95, -90, -82, -74, -62, -57, - -58, -56, -51, -52, -52, -54, -54, -58, - -66, -59, -60, -63, -66, -69, -73, -79, - -83, -84, -80, -81, -81, -82, -88, -92, - -98, -105, -113, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -107, - -102, -97, -92, -84, -79, -69, -57, -47, - -52, -47, -44, -45, -50, -52, -42, -42, - -53, -43, -43, -48, -51, -56, -55, -52, - -57, -59, -61, -62, -67, -71, -78, -83, - -86, -94, -98, -103, -110, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -105, -100, - -95, -90, -84, -78, -70, -61, -51, -41, - -40, -38, -40, -46, -52, -51, -41, -40, - -46, -40, -38, -38, -41, -46, -41, -46, - -47, -43, -43, -45, -41, -45, -56, -67, - -68, -83, -87, -90, -95, -102, -107, -113, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 1000 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -109, -105, -101, -96, -91, -84, -77, - -82, -82, -85, -89, -94, -100, -106, -110, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -106, -103, -98, -92, -85, -80, -71, - -75, -72, -76, -80, -84, -86, -89, -93, - -100, -107, -113, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -107, - -104, -101, -97, -92, -88, -84, -80, -64, - -66, -63, -64, -66, -69, -73, -77, -83, - -83, -86, -91, -98, -104, -111, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -107, - -104, -101, -97, -92, -90, -84, -74, -57, - -58, -52, -55, -54, -50, -52, -50, -52, - -63, -62, -69, -76, -77, -78, -78, -79, - -82, -88, -94, -100, -106, -111, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -106, -102, - -98, -95, -90, -85, -83, -78, -70, -50, - -50, -41, -44, -49, -47, -50, -50, -44, - -55, -46, -47, -48, -48, -54, -49, -49, - -58, -62, -71, -81, -87, -92, -97, -102, - -108, -114, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -106, -102, - -98, -95, -90, -85, -83, -78, -70, -45, - -43, -41, -47, -50, -51, -50, -49, -45, - -47, -41, -44, -41, -39, -43, -38, -37, - -40, -41, -44, -50, -58, -65, -73, -79, - -85, -92, -97, -101, -105, -109, -113, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 1414 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -107, -100, -95, -87, -81, - -85, -83, -88, -93, -100, -107, -114, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -107, -101, -95, -88, -83, -76, - -73, -72, -79, -84, -90, -95, -100, -105, - -110, -115, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -104, -98, -92, -87, -81, -70, - -65, -62, -67, -71, -74, -80, -85, -91, - -95, -99, -103, -108, -111, -114, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -103, -97, -90, -85, -76, -60, - -56, -54, -60, -62, -61, -56, -63, -65, - -73, -74, -77, -75, -78, -81, -86, -87, - -88, -91, -94, -98, -103, -110, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -105, - -100, -97, -92, -86, -81, -79, -70, -57, - -51, -47, -51, -58, -60, -56, -53, -50, - -58, -52, -50, -50, -53, -55, -64, -69, - -71, -85, -82, -78, -81, -85, -95, -102, - -112, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -105, - -100, -97, -92, -85, -83, -79, -72, -49, - -40, -43, -43, -54, -56, -51, -50, -40, - -43, -38, -36, -35, -37, -38, -37, -44, - -54, -60, -57, -60, -70, -75, -84, -92, - -103, -112, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 2000 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -102, -95, -89, -82, - -83, -84, -90, -92, -99, -107, -113, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -107, -101, -95, -89, -83, -72, - -74, -78, -85, -88, -88, -90, -92, -98, - -105, -111, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -109, -103, -97, -93, -87, -81, -70, - -70, -67, -75, -73, -76, -79, -81, -83, - -88, -89, -97, -103, -110, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -107, -100, -94, -88, -83, -75, -63, - -59, -59, -63, -66, -60, -62, -67, -67, - -77, -76, -81, -88, -86, -92, -96, -102, - -109, -116, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -105, -98, -92, -86, -81, -73, -56, - -52, -47, -55, -60, -58, -52, -51, -45, - -49, -50, -53, -54, -61, -71, -70, -69, - -78, -79, -87, -90, -96, -104, -112, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -103, -96, -90, -86, -78, -70, -51, - -42, -47, -48, -55, -54, -54, -53, -42, - -35, -28, -33, -38, -37, -44, -47, -49, - -54, -63, -68, -78, -82, -89, -94, -99, - -104, -109, -114, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 2828 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -110, -100, -90, -79, - -85, -81, -82, -82, -89, -94, -99, -103, - -109, -115, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -105, -97, -85, -72, - -74, -70, -70, -70, -76, -85, -91, -93, - -97, -103, -109, -115, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -112, -93, -81, -68, - -62, -60, -60, -57, -63, -70, -77, -82, - -90, -93, -98, -104, -109, -113, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -113, -100, -93, -84, -63, - -58, -48, -53, -54, -52, -52, -57, -64, - -66, -76, -83, -81, -85, -85, -90, -95, - -98, -101, -103, -106, -108, -111, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -105, -95, -86, -74, -53, - -50, -38, -43, -49, -43, -42, -39, -39, - -46, -52, -57, -56, -72, -69, -74, -81, - -87, -92, -94, -97, -99, -102, -105, -108, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -108, -99, -90, -76, -66, -45, - -43, -41, -44, -47, -43, -47, -40, -30, - -31, -31, -39, -33, -40, -41, -43, -53, - -59, -70, -73, -77, -79, -82, -84, -87, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 4000 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -91, -76, - -75, -85, -93, -98, -104, -110, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -91, -70, - -70, -75, -86, -89, -94, -98, -101, -106, - -110, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -110, -95, -80, -60, - -65, -64, -74, -83, -88, -91, -95, -99, - -103, -107, -110, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -110, -95, -80, -58, - -55, -49, -66, -68, -71, -78, -78, -80, - -88, -85, -89, -97, -100, -105, -110, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -110, -95, -80, -53, - -52, -41, -59, -59, -49, -58, -56, -63, - -86, -79, -90, -93, -98, -103, -107, -112, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -97, -91, -73, -45, - -40, -33, -53, -61, -49, -54, -50, -50, - -60, -52, -67, -74, -81, -92, -96, -100, - -105, -110, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 5657 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -113, -106, -99, -92, -77, - -80, -88, -97, -106, -115, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -116, -109, -102, -95, -89, -74, - -72, -88, -87, -95, -102, -109, -116, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -116, -109, -102, -95, -89, -75, - -66, -74, -77, -78, -86, -87, -90, -96, - -105, -115, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -115, -108, -101, -94, -88, -66, - -56, -61, -70, -65, -78, -72, -83, -84, - -93, -98, -105, -110, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -110, -105, -95, -89, -82, -57, - -52, -52, -59, -56, -59, -58, -69, -67, - -88, -82, -82, -89, -94, -100, -108, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -110, -101, -96, -90, -83, -77, -54, - -43, -38, -50, -48, -52, -48, -42, -42, - -51, -52, -53, -59, -65, -71, -78, -85, - -95, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 8000 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -120, -105, -86, -68, - -78, -79, -90, -100, -110, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -120, -105, -86, -66, - -73, -77, -88, -96, -105, -115, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -120, -105, -92, -80, -61, - -64, -68, -80, -87, -92, -100, -110, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -120, -104, -91, -79, -52, - -60, -54, -64, -69, -77, -80, -82, -84, - -85, -87, -88, -90, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -118, -100, -87, -77, -49, - -50, -44, -58, -61, -61, -67, -65, -62, - -62, -62, -65, -68, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -115, -98, -84, -62, -49, - -44, -38, -46, -49, -49, -46, -39, -37, - -39, -40, -42, -43, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 11314 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -88, -74, - -77, -82, -82, -85, -90, -94, -99, -104, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -88, -66, - -70, -81, -80, -81, -84, -88, -91, -93, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -88, -61, - -63, -70, -71, -74, -77, -80, -83, -85, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -110, -86, -62, - -63, -62, -62, -58, -52, -50, -50, -52, - -54, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -118, -108, -84, -53, - -50, -50, -50, -55, -47, -45, -40, -40, - -40, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -118, -100, -73, -43, - -37, -42, -43, -53, -38, -37, -35, -35, - -38, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}}, - /* 16000 Hz */ - {{-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -91, -84, -74, - -80, -80, -80, -80, -80, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -91, -84, -74, - -68, -68, -68, -68, -68, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -86, -78, -70, - -60, -45, -30, -21, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -87, -78, -67, - -48, -38, -29, -21, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -86, -69, -56, - -45, -35, -33, -29, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}, - {-999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -110, -100, -83, -71, -48, - -27, -38, -37, -34, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999, - -999, -999, -999, -999, -999, -999, -999, -999}} -}; - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c deleted file mode 100755 index d41dc86..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.c +++ /dev/null @@ -1,563 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: normalized modified discrete cosine transform - power of two length transform only [64 <= n ] - last mod: $Id: mdct.c 16227 2009-07-08 06:58:46Z xiphmont $ - - Original algorithm adapted long ago from _The use of multirate filter - banks for coding of high quality digital audio_, by T. Sporer, - K. Brandenburg and B. Edler, collection of the European Signal - Processing Conference (EUSIPCO), Amsterdam, June 1992, Vol.1, pp - 211-214 - - The below code implements an algorithm that no longer looks much like - that presented in the paper, but the basic structure remains if you - dig deep enough to see it. - - This module DOES NOT INCLUDE code to generate/apply the window - function. Everybody has their own weird favorite including me... I - happen to like the properties of y=sin(.5PI*sin^2(x)), but others may - vehemently disagree. - - ********************************************************************/ - -/* this can also be run as an integer transform by uncommenting a - define in mdct.h; the integerization is a first pass and although - it's likely stable for Vorbis, the dynamic range is constrained and - roundoff isn't done (so it's noisy). Consider it functional, but - only a starting point. There's no point on a machine with an FPU */ - -#include -#include -#include -#include -#include "../../codec.h" -#include "mdct.h" -#include "os.h" -#include "misc.h" - -/* build lookups for trig functions; also pre-figure scaling and - some window function algebra. */ - -void mdct_init(mdct_lookup *lookup,int n){ - int *bitrev=(int*) _ogg_malloc(sizeof(*bitrev)*(n/4)); - DATA_TYPE *T=(DATA_TYPE*) _ogg_malloc(sizeof(*T)*(n+n/4)); - - int i; - int n2=n>>1; - int log2n=lookup->log2n=rint(log((float)n)/log(2.f)); - lookup->n=n; - lookup->trig=T; - lookup->bitrev=bitrev; - -/* trig lookups... */ - - for(i=0;i>j;j++) - if((msb>>j)&i)acc|=1<scale=FLOAT_CONV(4.f/n); -} - -/* 8 point butterfly (in place, 4 register) */ -STIN void mdct_butterfly_8(DATA_TYPE *x){ - REG_TYPE r0 = x[6] + x[2]; - REG_TYPE r1 = x[6] - x[2]; - REG_TYPE r2 = x[4] + x[0]; - REG_TYPE r3 = x[4] - x[0]; - - x[6] = r0 + r2; - x[4] = r0 - r2; - - r0 = x[5] - x[1]; - r2 = x[7] - x[3]; - x[0] = r1 + r0; - x[2] = r1 - r0; - - r0 = x[5] + x[1]; - r1 = x[7] + x[3]; - x[3] = r2 + r3; - x[1] = r2 - r3; - x[7] = r1 + r0; - x[5] = r1 - r0; - -} - -/* 16 point butterfly (in place, 4 register) */ -STIN void mdct_butterfly_16(DATA_TYPE *x){ - REG_TYPE r0 = x[1] - x[9]; - REG_TYPE r1 = x[0] - x[8]; - - x[8] += x[0]; - x[9] += x[1]; - x[0] = MULT_NORM((r0 + r1) * cPI2_8); - x[1] = MULT_NORM((r0 - r1) * cPI2_8); - - r0 = x[3] - x[11]; - r1 = x[10] - x[2]; - x[10] += x[2]; - x[11] += x[3]; - x[2] = r0; - x[3] = r1; - - r0 = x[12] - x[4]; - r1 = x[13] - x[5]; - x[12] += x[4]; - x[13] += x[5]; - x[4] = MULT_NORM((r0 - r1) * cPI2_8); - x[5] = MULT_NORM((r0 + r1) * cPI2_8); - - r0 = x[14] - x[6]; - r1 = x[15] - x[7]; - x[14] += x[6]; - x[15] += x[7]; - x[6] = r0; - x[7] = r1; - - mdct_butterfly_8(x); - mdct_butterfly_8(x+8); -} - -/* 32 point butterfly (in place, 4 register) */ -STIN void mdct_butterfly_32(DATA_TYPE *x){ - REG_TYPE r0 = x[30] - x[14]; - REG_TYPE r1 = x[31] - x[15]; - - x[30] += x[14]; - x[31] += x[15]; - x[14] = r0; - x[15] = r1; - - r0 = x[28] - x[12]; - r1 = x[29] - x[13]; - x[28] += x[12]; - x[29] += x[13]; - x[12] = MULT_NORM( r0 * cPI1_8 - r1 * cPI3_8 ); - x[13] = MULT_NORM( r0 * cPI3_8 + r1 * cPI1_8 ); - - r0 = x[26] - x[10]; - r1 = x[27] - x[11]; - x[26] += x[10]; - x[27] += x[11]; - x[10] = MULT_NORM(( r0 - r1 ) * cPI2_8); - x[11] = MULT_NORM(( r0 + r1 ) * cPI2_8); - - r0 = x[24] - x[8]; - r1 = x[25] - x[9]; - x[24] += x[8]; - x[25] += x[9]; - x[8] = MULT_NORM( r0 * cPI3_8 - r1 * cPI1_8 ); - x[9] = MULT_NORM( r1 * cPI3_8 + r0 * cPI1_8 ); - - r0 = x[22] - x[6]; - r1 = x[7] - x[23]; - x[22] += x[6]; - x[23] += x[7]; - x[6] = r1; - x[7] = r0; - - r0 = x[4] - x[20]; - r1 = x[5] - x[21]; - x[20] += x[4]; - x[21] += x[5]; - x[4] = MULT_NORM( r1 * cPI1_8 + r0 * cPI3_8 ); - x[5] = MULT_NORM( r1 * cPI3_8 - r0 * cPI1_8 ); - - r0 = x[2] - x[18]; - r1 = x[3] - x[19]; - x[18] += x[2]; - x[19] += x[3]; - x[2] = MULT_NORM(( r1 + r0 ) * cPI2_8); - x[3] = MULT_NORM(( r1 - r0 ) * cPI2_8); - - r0 = x[0] - x[16]; - r1 = x[1] - x[17]; - x[16] += x[0]; - x[17] += x[1]; - x[0] = MULT_NORM( r1 * cPI3_8 + r0 * cPI1_8 ); - x[1] = MULT_NORM( r1 * cPI1_8 - r0 * cPI3_8 ); - - mdct_butterfly_16(x); - mdct_butterfly_16(x+16); - -} - -/* N point first stage butterfly (in place, 2 register) */ -STIN void mdct_butterfly_first(DATA_TYPE *T, - DATA_TYPE *x, - int points){ - - DATA_TYPE *x1 = x + points - 8; - DATA_TYPE *x2 = x + (points>>1) - 8; - REG_TYPE r0; - REG_TYPE r1; - - do{ - - r0 = x1[6] - x2[6]; - r1 = x1[7] - x2[7]; - x1[6] += x2[6]; - x1[7] += x2[7]; - x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]); - x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]); - - r0 = x1[4] - x2[4]; - r1 = x1[5] - x2[5]; - x1[4] += x2[4]; - x1[5] += x2[5]; - x2[4] = MULT_NORM(r1 * T[5] + r0 * T[4]); - x2[5] = MULT_NORM(r1 * T[4] - r0 * T[5]); - - r0 = x1[2] - x2[2]; - r1 = x1[3] - x2[3]; - x1[2] += x2[2]; - x1[3] += x2[3]; - x2[2] = MULT_NORM(r1 * T[9] + r0 * T[8]); - x2[3] = MULT_NORM(r1 * T[8] - r0 * T[9]); - - r0 = x1[0] - x2[0]; - r1 = x1[1] - x2[1]; - x1[0] += x2[0]; - x1[1] += x2[1]; - x2[0] = MULT_NORM(r1 * T[13] + r0 * T[12]); - x2[1] = MULT_NORM(r1 * T[12] - r0 * T[13]); - - x1-=8; - x2-=8; - T+=16; - - }while(x2>=x); -} - -/* N/stage point generic N stage butterfly (in place, 2 register) */ -STIN void mdct_butterfly_generic(DATA_TYPE *T, - DATA_TYPE *x, - int points, - int trigint){ - - DATA_TYPE *x1 = x + points - 8; - DATA_TYPE *x2 = x + (points>>1) - 8; - REG_TYPE r0; - REG_TYPE r1; - - do{ - - r0 = x1[6] - x2[6]; - r1 = x1[7] - x2[7]; - x1[6] += x2[6]; - x1[7] += x2[7]; - x2[6] = MULT_NORM(r1 * T[1] + r0 * T[0]); - x2[7] = MULT_NORM(r1 * T[0] - r0 * T[1]); - - T+=trigint; - - r0 = x1[4] - x2[4]; - r1 = x1[5] - x2[5]; - x1[4] += x2[4]; - x1[5] += x2[5]; - x2[4] = MULT_NORM(r1 * T[1] + r0 * T[0]); - x2[5] = MULT_NORM(r1 * T[0] - r0 * T[1]); - - T+=trigint; - - r0 = x1[2] - x2[2]; - r1 = x1[3] - x2[3]; - x1[2] += x2[2]; - x1[3] += x2[3]; - x2[2] = MULT_NORM(r1 * T[1] + r0 * T[0]); - x2[3] = MULT_NORM(r1 * T[0] - r0 * T[1]); - - T+=trigint; - - r0 = x1[0] - x2[0]; - r1 = x1[1] - x2[1]; - x1[0] += x2[0]; - x1[1] += x2[1]; - x2[0] = MULT_NORM(r1 * T[1] + r0 * T[0]); - x2[1] = MULT_NORM(r1 * T[0] - r0 * T[1]); - - T+=trigint; - x1-=8; - x2-=8; - - }while(x2>=x); -} - -STIN void mdct_butterflies(mdct_lookup *init, - DATA_TYPE *x, - int points){ - - DATA_TYPE *T=init->trig; - int stages=init->log2n-5; - int i,j; - - if(--stages>0){ - mdct_butterfly_first(T,x,points); - } - - for(i=1;--stages>0;i++){ - for(j=0;j<(1<>i)*j,points>>i,4<trig)_ogg_free(l->trig); - if(l->bitrev)_ogg_free(l->bitrev); - memset(l,0,sizeof(*l)); - } -} - -STIN void mdct_bitreverse(mdct_lookup *init, - DATA_TYPE *x){ - int n = init->n; - int *bit = init->bitrev; - DATA_TYPE *w0 = x; - DATA_TYPE *w1 = x = w0+(n>>1); - DATA_TYPE *T = init->trig+n; - - do{ - DATA_TYPE *x0 = x+bit[0]; - DATA_TYPE *x1 = x+bit[1]; - - REG_TYPE r0 = x0[1] - x1[1]; - REG_TYPE r1 = x0[0] + x1[0]; - REG_TYPE r2 = MULT_NORM(r1 * T[0] + r0 * T[1]); - REG_TYPE r3 = MULT_NORM(r1 * T[1] - r0 * T[0]); - - w1 -= 4; - - r0 = HALVE(x0[1] + x1[1]); - r1 = HALVE(x0[0] - x1[0]); - - w0[0] = r0 + r2; - w1[2] = r0 - r2; - w0[1] = r1 + r3; - w1[3] = r3 - r1; - - x0 = x+bit[2]; - x1 = x+bit[3]; - - r0 = x0[1] - x1[1]; - r1 = x0[0] + x1[0]; - r2 = MULT_NORM(r1 * T[2] + r0 * T[3]); - r3 = MULT_NORM(r1 * T[3] - r0 * T[2]); - - r0 = HALVE(x0[1] + x1[1]); - r1 = HALVE(x0[0] - x1[0]); - - w0[2] = r0 + r2; - w1[0] = r0 - r2; - w0[3] = r1 + r3; - w1[1] = r3 - r1; - - T += 4; - bit += 4; - w0 += 4; - - }while(w0n; - int n2=n>>1; - int n4=n>>2; - - /* rotate */ - - DATA_TYPE *iX = in+n2-7; - DATA_TYPE *oX = out+n2+n4; - DATA_TYPE *T = init->trig+n4; - - do{ - oX -= 4; - oX[0] = MULT_NORM(-iX[2] * T[3] - iX[0] * T[2]); - oX[1] = MULT_NORM (iX[0] * T[3] - iX[2] * T[2]); - oX[2] = MULT_NORM(-iX[6] * T[1] - iX[4] * T[0]); - oX[3] = MULT_NORM (iX[4] * T[1] - iX[6] * T[0]); - iX -= 8; - T += 4; - }while(iX>=in); - - iX = in+n2-8; - oX = out+n2+n4; - T = init->trig+n4; - - do{ - T -= 4; - oX[0] = MULT_NORM (iX[4] * T[3] + iX[6] * T[2]); - oX[1] = MULT_NORM (iX[4] * T[2] - iX[6] * T[3]); - oX[2] = MULT_NORM (iX[0] * T[1] + iX[2] * T[0]); - oX[3] = MULT_NORM (iX[0] * T[0] - iX[2] * T[1]); - iX -= 8; - oX += 4; - }while(iX>=in); - - mdct_butterflies(init,out+n2,n2); - mdct_bitreverse(init,out); - - /* roatate + window */ - - { - DATA_TYPE *oX1=out+n2+n4; - DATA_TYPE *oX2=out+n2+n4; - DATA_TYPE *iX =out; - T =init->trig+n2; - - do{ - oX1-=4; - - oX1[3] = MULT_NORM (iX[0] * T[1] - iX[1] * T[0]); - oX2[0] = -MULT_NORM (iX[0] * T[0] + iX[1] * T[1]); - - oX1[2] = MULT_NORM (iX[2] * T[3] - iX[3] * T[2]); - oX2[1] = -MULT_NORM (iX[2] * T[2] + iX[3] * T[3]); - - oX1[1] = MULT_NORM (iX[4] * T[5] - iX[5] * T[4]); - oX2[2] = -MULT_NORM (iX[4] * T[4] + iX[5] * T[5]); - - oX1[0] = MULT_NORM (iX[6] * T[7] - iX[7] * T[6]); - oX2[3] = -MULT_NORM (iX[6] * T[6] + iX[7] * T[7]); - - oX2+=4; - iX += 8; - T += 8; - }while(iXoX2); - } -} - -void mdct_forward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out){ - int n=init->n; - int n2=n>>1; - int n4=n>>2; - int n8=n>>3; - DATA_TYPE *w=(DATA_TYPE*) alloca(n*sizeof(*w)); /* forward needs working space */ - DATA_TYPE *w2=w+n2; - - /* rotate */ - - /* window + rotate + step 1 */ - - REG_TYPE r0; - REG_TYPE r1; - DATA_TYPE *x0=in+n2+n4; - DATA_TYPE *x1=x0+1; - DATA_TYPE *T=init->trig+n2; - - int i=0; - - for(i=0;itrig+n2; - x0=out+n2; - - for(i=0;iscale); - x0[0] =MULT_NORM((w[0]*T[1]-w[1]*T[0])*init->scale); - w+=2; - T+=2; - } -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h deleted file mode 100755 index af3e49e..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/mdct.h +++ /dev/null @@ -1,71 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: modified discrete cosine transform prototypes - last mod: $Id: mdct.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _OGG_mdct_H_ -#define _OGG_mdct_H_ - -#include "../../codec.h" - - - - - -/*#define MDCT_INTEGERIZED <- be warned there could be some hurt left here*/ -#ifdef MDCT_INTEGERIZED - -#define DATA_TYPE int -#define REG_TYPE register int -#define TRIGBITS 14 -#define cPI3_8 6270 -#define cPI2_8 11585 -#define cPI1_8 15137 - -#define FLOAT_CONV(x) ((int)((x)*(1<>TRIGBITS) -#define HALVE(x) ((x)>>1) - -#else - -#define DATA_TYPE float -#define REG_TYPE float -#define cPI3_8 .38268343236508977175F -#define cPI2_8 .70710678118654752441F -#define cPI1_8 .92387953251128675613F - -#define FLOAT_CONV(x) (x) -#define MULT_NORM(x) (x) -#define HALVE(x) ((x)*.5f) - -#endif - - -typedef struct { - int n; - int log2n; - - DATA_TYPE *trig; - int *bitrev; - - DATA_TYPE scale; -} mdct_lookup; - -extern void mdct_init(mdct_lookup *lookup,int n); -extern void mdct_clear(mdct_lookup *l); -extern void mdct_forward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out); -extern void mdct_backward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h deleted file mode 100755 index 044a543..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/misc.h +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: miscellaneous prototypes - last mod: $Id: misc.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_RANDOM_H_ -#define _V_RANDOM_H_ -#include "../../codec.h" - -extern void *_vorbis_block_alloc(vorbis_block *vb,long bytes); -extern void _vorbis_block_ripcord(vorbis_block *vb); - -#ifdef ANALYSIS -extern int analysis_noisy; -extern void _analysis_output(char *base,int i,float *v,int n,int bark,int dB, - ogg_int64_t off); -extern void _analysis_output_always(char *base,int i,float *v,int n,int bark,int dB, - ogg_int64_t off); -#endif - -#ifdef DEBUG_MALLOC - -#define _VDBG_GRAPHFILE "malloc.m" -#undef _VDBG_GRAPHFILE -extern void *_VDBG_malloc(void *ptr,long bytes,char *file,long line); -extern void _VDBG_free(void *ptr,char *file,long line); - -#ifndef MISC_C -#undef _ogg_malloc -#undef _ogg_calloc -#undef _ogg_realloc -#undef _ogg_free - -#define _ogg_malloc(x) _VDBG_malloc(NULL,(x),__FILE__,__LINE__) -#define _ogg_calloc(x,y) _VDBG_malloc(NULL,(x)*(y),__FILE__,__LINE__) -#define _ogg_realloc(x,y) _VDBG_malloc((x),(y),__FILE__,__LINE__) -#define _ogg_free(x) _VDBG_free((x),__FILE__,__LINE__) -#endif -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h deleted file mode 100755 index e1c80e2..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/floor_all.h +++ /dev/null @@ -1,260 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: key floor settings - last mod: $Id: floor_all.h 17050 2010-03-26 01:34:42Z xiphmont $ - - ********************************************************************/ - -#include "../../../codec.h" -#include "../backends.h" -#include "../books/floor/floor_books.h" - -static const static_codebook*const _floor_128x4_books[]={ - &_huff_book_line_128x4_class0, - &_huff_book_line_128x4_0sub0, - &_huff_book_line_128x4_0sub1, - &_huff_book_line_128x4_0sub2, - &_huff_book_line_128x4_0sub3, -}; -static const static_codebook*const _floor_256x4_books[]={ - &_huff_book_line_256x4_class0, - &_huff_book_line_256x4_0sub0, - &_huff_book_line_256x4_0sub1, - &_huff_book_line_256x4_0sub2, - &_huff_book_line_256x4_0sub3, -}; -static const static_codebook*const _floor_128x7_books[]={ - &_huff_book_line_128x7_class0, - &_huff_book_line_128x7_class1, - - &_huff_book_line_128x7_0sub1, - &_huff_book_line_128x7_0sub2, - &_huff_book_line_128x7_0sub3, - &_huff_book_line_128x7_1sub1, - &_huff_book_line_128x7_1sub2, - &_huff_book_line_128x7_1sub3, -}; -static const static_codebook*const _floor_256x7_books[]={ - &_huff_book_line_256x7_class0, - &_huff_book_line_256x7_class1, - - &_huff_book_line_256x7_0sub1, - &_huff_book_line_256x7_0sub2, - &_huff_book_line_256x7_0sub3, - &_huff_book_line_256x7_1sub1, - &_huff_book_line_256x7_1sub2, - &_huff_book_line_256x7_1sub3, -}; -static const static_codebook*const _floor_128x11_books[]={ - &_huff_book_line_128x11_class1, - &_huff_book_line_128x11_class2, - &_huff_book_line_128x11_class3, - - &_huff_book_line_128x11_0sub0, - &_huff_book_line_128x11_1sub0, - &_huff_book_line_128x11_1sub1, - &_huff_book_line_128x11_2sub1, - &_huff_book_line_128x11_2sub2, - &_huff_book_line_128x11_2sub3, - &_huff_book_line_128x11_3sub1, - &_huff_book_line_128x11_3sub2, - &_huff_book_line_128x11_3sub3, -}; -static const static_codebook*const _floor_128x17_books[]={ - &_huff_book_line_128x17_class1, - &_huff_book_line_128x17_class2, - &_huff_book_line_128x17_class3, - - &_huff_book_line_128x17_0sub0, - &_huff_book_line_128x17_1sub0, - &_huff_book_line_128x17_1sub1, - &_huff_book_line_128x17_2sub1, - &_huff_book_line_128x17_2sub2, - &_huff_book_line_128x17_2sub3, - &_huff_book_line_128x17_3sub1, - &_huff_book_line_128x17_3sub2, - &_huff_book_line_128x17_3sub3, -}; -static const static_codebook*const _floor_256x4low_books[]={ - &_huff_book_line_256x4low_class0, - &_huff_book_line_256x4low_0sub0, - &_huff_book_line_256x4low_0sub1, - &_huff_book_line_256x4low_0sub2, - &_huff_book_line_256x4low_0sub3, -}; -static const static_codebook*const _floor_1024x27_books[]={ - &_huff_book_line_1024x27_class1, - &_huff_book_line_1024x27_class2, - &_huff_book_line_1024x27_class3, - &_huff_book_line_1024x27_class4, - - &_huff_book_line_1024x27_0sub0, - &_huff_book_line_1024x27_1sub0, - &_huff_book_line_1024x27_1sub1, - &_huff_book_line_1024x27_2sub0, - &_huff_book_line_1024x27_2sub1, - &_huff_book_line_1024x27_3sub1, - &_huff_book_line_1024x27_3sub2, - &_huff_book_line_1024x27_3sub3, - &_huff_book_line_1024x27_4sub1, - &_huff_book_line_1024x27_4sub2, - &_huff_book_line_1024x27_4sub3, -}; -static const static_codebook*const _floor_2048x27_books[]={ - &_huff_book_line_2048x27_class1, - &_huff_book_line_2048x27_class2, - &_huff_book_line_2048x27_class3, - &_huff_book_line_2048x27_class4, - - &_huff_book_line_2048x27_0sub0, - &_huff_book_line_2048x27_1sub0, - &_huff_book_line_2048x27_1sub1, - &_huff_book_line_2048x27_2sub0, - &_huff_book_line_2048x27_2sub1, - &_huff_book_line_2048x27_3sub1, - &_huff_book_line_2048x27_3sub2, - &_huff_book_line_2048x27_3sub3, - &_huff_book_line_2048x27_4sub1, - &_huff_book_line_2048x27_4sub2, - &_huff_book_line_2048x27_4sub3, -}; - -static const static_codebook*const _floor_512x17_books[]={ - &_huff_book_line_512x17_class1, - &_huff_book_line_512x17_class2, - &_huff_book_line_512x17_class3, - - &_huff_book_line_512x17_0sub0, - &_huff_book_line_512x17_1sub0, - &_huff_book_line_512x17_1sub1, - &_huff_book_line_512x17_2sub1, - &_huff_book_line_512x17_2sub2, - &_huff_book_line_512x17_2sub3, - &_huff_book_line_512x17_3sub1, - &_huff_book_line_512x17_3sub2, - &_huff_book_line_512x17_3sub3, -}; - -static const static_codebook*const _floor_Xx0_books[]={ - 0 -}; - -static const static_codebook*const *const _floor_books[11]={ - _floor_128x4_books, - _floor_256x4_books, - _floor_128x7_books, - _floor_256x7_books, - _floor_128x11_books, - _floor_128x17_books, - _floor_256x4low_books, - _floor_1024x27_books, - _floor_2048x27_books, - _floor_512x17_books, - _floor_Xx0_books, -}; - -static const vorbis_info_floor1 _floor[11]={ - /* 0: 128 x 4 */ - { - 1,{0},{4},{2},{0}, - {{1,2,3,4}}, - 4,{0,128, 33,8,16,70}, - - 60,30,500, 1.,18., 128 - }, - /* 1: 256 x 4 */ - { - 1,{0},{4},{2},{0}, - {{1,2,3,4}}, - 4,{0,256, 66,16,32,140}, - - 60,30,500, 1.,18., 256 - }, - /* 2: 128 x 7 */ - { - 2,{0,1},{3,4},{2,2},{0,1}, - {{-1,2,3,4},{-1,5,6,7}}, - 4,{0,128, 14,4,58, 2,8,28,90}, - - 60,30,500, 1.,18., 128 - }, - /* 3: 256 x 7 */ - { - 2,{0,1},{3,4},{2,2},{0,1}, - {{-1,2,3,4},{-1,5,6,7}}, - 4,{0,256, 28,8,116, 4,16,56,180}, - - 60,30,500, 1.,18., 256 - }, - /* 4: 128 x 11 */ - { - 4,{0,1,2,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, - {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, - - 2,{0,128, 8,33, 4,16,70, 2,6,12, 23,46,90}, - - 60,30,500, 1,18., 128 - }, - /* 5: 128 x 17 */ - { - 6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, - {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, - 2,{0,128, 12,46, 4,8,16, 23,33,70, 2,6,10, 14,19,28, 39,58,90}, - - 60,30,500, 1,18., 128 - }, - /* 6: 256 x 4 (low bitrate version) */ - { - 1,{0},{4},{2},{0}, - {{1,2,3,4}}, - 4,{0,256, 66,16,32,140}, - - 60,30,500, 1.,18., 256 - }, - /* 7: 1024 x 27 */ - { - 8,{0,1,2,2,3,3,4,4},{3,4,3,4,3},{0,1,1,2,2},{-1,0,1,2,3}, - {{4},{5,6},{7,8},{-1,9,10,11},{-1,12,13,14}}, - 2,{0,1024, 93,23,372, 6,46,186,750, 14,33,65, 130,260,556, - 3,10,18,28, 39,55,79,111, 158,220,312, 464,650,850}, - - 60,30,500, 3,18., 1024 - }, - /* 8: 2048 x 27 */ - { - 8,{0,1,2,2,3,3,4,4},{3,4,3,4,3},{0,1,1,2,2},{-1,0,1,2,3}, - {{4},{5,6},{7,8},{-1,9,10,11},{-1,12,13,14}}, - 2,{0,2048, 186,46,744, 12,92,372,1500, 28,66,130, 260,520,1112, - 6,20,36,56, 78,110,158,222, 316,440,624, 928,1300,1700}, - - 60,30,500, 3,18., 2048 - }, - /* 9: 512 x 17 */ - { - 6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, - {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, - 2,{0,512, 46,186, 16,33,65, 93,130,278, - 7,23,39, 55,79,110, 156,232,360}, - - 60,30,500, 1,18., 512 - }, - - /* 10: X x 0 (LFE floor; edge posts only) */ - { - 0,{0}, {0},{0},{-1}, - {{-1}}, - 2,{0,12}, - 60,30,500, 1.,18., 10 - }, - -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h deleted file mode 100755 index 0d0d2ae..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_11.h +++ /dev/null @@ -1,50 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 11kHz settings - last mod: $Id: psych_11.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -static const double _psy_lowpass_11[3]={4.5,5.5,30.,}; - -static const att3 _psy_tone_masteratt_11[3]={ - {{ 30, 25, 12}, 0, 0}, /* 0 */ - {{ 30, 25, 12}, 0, 0}, /* 0 */ - {{ 20, 0, -14}, 0, 0}, /* 0 */ -}; - -static const vp_adjblock _vp_tonemask_adj_11[3]={ - /* adjust for mode zero */ - /* 63 125 250 500 1 2 4 8 16 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 2, 0,99,99,99}}, /* 0 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 5, 0, 0,99,99,99}}, /* 1 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 0, 0, 0,99,99,99}}, /* 2 */ -}; - - -static const noise3 _psy_noisebias_11[3]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 10, 10, 12, 12, 12, 99, 99, 99}, - {-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 4, 5, 5, 10, 99, 99, 99}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, - - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 10, 10, 12, 12, 12, 99, 99, 99}, - {-15,-15,-15,-15,-10,-10, -5, -5, -5, 0, 0, 0, 0, 0, 99, 99, 99}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 99, 99, 99}, - {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10, 99, 99, 99}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24, 99, 99, 99}}}, -}; - -static const double _noise_thresh_11[3]={ .3,.5,.5 }; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h deleted file mode 100755 index 0c6593b..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_16.h +++ /dev/null @@ -1,133 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 16kHz settings - last mod: $Id: psych_16.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -/* stereo mode by base quality level */ -static const adj_stereo _psy_stereo_modes_16[4]={ - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */ - {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 4, 4}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 4, 4, 4, 4}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - {{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 5, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, -}; - -static const double _psy_lowpass_16[4]={6.5,8,30.,99.}; - -static const att3 _psy_tone_masteratt_16[4]={ - {{ 30, 25, 12}, 0, 0}, /* 0 */ - {{ 25, 22, 12}, 0, 0}, /* 0 */ - {{ 20, 12, 0}, 0, 0}, /* 0 */ - {{ 15, 0, -14}, 0, 0}, /* 0 */ -}; - -static const vp_adjblock _vp_tonemask_adj_16[4]={ - /* adjust for mode zero */ - /* 63 125 250 500 1 2 4 8 16 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 0, 0, 0, 0, 0}}, /* 0 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0,10, 0, 0, 0, 0, 0}}, /* 1 */ - {{-20,-20,-20,-20,-20,-16,-10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 2 */ - {{-30,-30,-30,-30,-30,-26,-20,-10, -5, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 2 */ -}; - - -static const noise3 _psy_noisebias_16_short[4]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 10, 10, 10, 10, 12, 12, 14, 20}, - {-15,-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 5, 5, 6, 8, 8, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, - - {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 6, 6, 6, 6, 8, 10, 12, 20}, - {-15,-15,-15,-15,-15,-15,-15,-10, -5, -5, -5, 4, 5, 6, 8, 8, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10,-10,-10,-10,-10,-10,-10,-10,-10}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 12}, - {-20,-20,-20,-20,-16,-12,-20,-14,-10,-10, -8, 0, 0, 0, 0, 2, 5}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10,-10,-10, -6}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, -}; - -static const noise3 _psy_noisebias_16_impulse[4]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 10, 10, 10, 10, 12, 12, 14, 20}, - {-15,-15,-15,-15,-15,-10,-10, -5, 0, 0, 4, 5, 5, 6, 8, 8, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, - - {{{-15,-15,-15,-15,-15,-10,-10,-5, 4, 4, 4, 4, 5, 5, 6, 8, 15}, - {-15,-15,-15,-15,-15,-15,-15,-10, -5, -5, -5, 0, 0, 0, 0, 4, 10}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10,-10,-10,-10,-10,-10,-10,-10,-10}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 4, 10}, - {-20,-20,-20,-20,-16,-12,-20,-14,-10,-10,-10,-10,-10,-10,-10, -7, -5}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6}, - {-30,-30,-30,-30,-26,-22,-20,-18,-18,-18,-20,-20,-20,-20,-20,-20,-16}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, -}; - -static const noise3 _psy_noisebias_16[4]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 6, 8, 8, 10, 10, 10, 14, 20}, - {-10,-10,-10,-10,-10, -5, -2, -2, 0, 0, 0, 4, 5, 6, 8, 8, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, - - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 6, 6, 6, 6, 8, 10, 12, 20}, - {-15,-15,-15,-15,-15,-10, -5, -5, 0, 0, 0, 4, 5, 6, 8, 8, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -6, -6}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 12}, - {-20,-20,-20,-20,-16,-12,-20,-10, -5, -5, 0, 0, 0, 0, 0, 2, 5}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, -5, -5, -5, -5, -5, 0, 0, 0, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10,-10,-10, -6}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24,-20,-20,-20}}}, -}; - -static const noiseguard _psy_noiseguards_16[4]={ - {10,10,-1}, - {10,10,-1}, - {20,20,-1}, - {20,20,-1}, -}; - -static const double _noise_thresh_16[4]={ .3,.5,.5,.5 }; - -static const int _noise_start_16[3]={ 256,256,9999 }; -static const int _noise_part_16[4]={ 8,8,8,8 }; - -static const int _psy_ath_floater_16[4]={ - -100,-100,-100,-105, -}; - -static const int _psy_ath_abs_16[4]={ - -130,-130,-130,-140, -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h deleted file mode 100755 index d0cbb60..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_44.h +++ /dev/null @@ -1,642 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: key psychoacoustic settings for 44.1/48kHz - last mod: $Id: psych_44.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - - -/* preecho trigger settings *****************************************/ - -static const vorbis_info_psy_global _psy_global_44[5]={ - - {8, /* lines per eighth octave */ - {20.f,14.f,12.f,12.f,12.f,12.f,12.f}, - {-60.f,-30.f,-40.f,-40.f,-40.f,-40.f,-40.f}, 2,-75.f, - -6.f, - {99},{{99},{99}},{0},{0},{{0},{0}} - }, - {8, /* lines per eighth octave */ - {14.f,10.f,10.f,10.f,10.f,10.f,10.f}, - {-40.f,-30.f,-25.f,-25.f,-25.f,-25.f,-25.f}, 2,-80.f, - -6.f, - {99},{{99},{99}},{0},{0},{{0},{0}} - }, - {8, /* lines per eighth octave */ - {12.f,10.f,10.f,10.f,10.f,10.f,10.f}, - {-20.f,-20.f,-15.f,-15.f,-15.f,-15.f,-15.f}, 0,-80.f, - -6.f, - {99},{{99},{99}},{0},{0},{{0},{0}} - }, - {8, /* lines per eighth octave */ - {10.f,8.f,8.f,8.f,8.f,8.f,8.f}, - {-20.f,-15.f,-12.f,-12.f,-12.f,-12.f,-12.f}, 0,-80.f, - -6.f, - {99},{{99},{99}},{0},{0},{{0},{0}} - }, - {8, /* lines per eighth octave */ - {10.f,6.f,6.f,6.f,6.f,6.f,6.f}, - {-15.f,-15.f,-12.f,-12.f,-12.f,-12.f,-12.f}, 0,-85.f, - -6.f, - {99},{{99},{99}},{0},{0},{{0},{0}} - }, -}; - -/* noise compander lookups * low, mid, high quality ****************/ -static const compandblock _psy_compand_44[6]={ - /* sub-mode Z short */ - {{ - 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ - 8, 9,10,11,12,13,14, 15, /* 15dB */ - 16,17,18,19,20,21,22, 23, /* 23dB */ - 24,25,26,27,28,29,30, 31, /* 31dB */ - 32,33,34,35,36,37,38, 39, /* 39dB */ - }}, - /* mode_Z nominal short */ - {{ - 0, 1, 2, 3, 4, 5, 6, 6, /* 7dB */ - 7, 7, 7, 7, 6, 6, 6, 7, /* 15dB */ - 7, 8, 9,10,11,12,13, 14, /* 23dB */ - 15,16,17,17,17,18,18, 19, /* 31dB */ - 19,19,20,21,22,23,24, 25, /* 39dB */ - }}, - /* mode A short */ - {{ - 0, 1, 2, 3, 4, 5, 5, 5, /* 7dB */ - 6, 6, 6, 5, 4, 4, 4, 4, /* 15dB */ - 4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */ - 7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */ - 11,12,13,14,15,16,17, 18, /* 39dB */ - }}, - /* sub-mode Z long */ - {{ - 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ - 8, 9,10,11,12,13,14, 15, /* 15dB */ - 16,17,18,19,20,21,22, 23, /* 23dB */ - 24,25,26,27,28,29,30, 31, /* 31dB */ - 32,33,34,35,36,37,38, 39, /* 39dB */ - }}, - /* mode_Z nominal long */ - {{ - 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ - 8, 9,10,11,12,12,13, 13, /* 15dB */ - 13,14,14,14,15,15,15, 15, /* 23dB */ - 16,16,17,17,17,18,18, 19, /* 31dB */ - 19,19,20,21,22,23,24, 25, /* 39dB */ - }}, - /* mode A long */ - {{ - 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ - 8, 8, 7, 6, 5, 4, 4, 4, /* 15dB */ - 4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */ - 7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */ - 11,12,13,14,15,16,17, 18, /* 39dB */ - }} -}; - -/* tonal masking curve level adjustments *************************/ - -static const vp_adjblock _vp_tonemask_adj_longblock[12]={ - - /* 63 125 250 500 1 2 4 8 16 */ - - {{ -3, -8,-13,-15,-10,-10,-10,-10,-10,-10,-10, 0, 0, 0, 0, 0, 0}}, /* -1 */ - -/* {{-15,-15,-15,-15,-10, -8, -4, -2, 0, 0, 0, 10, 0, 0, 0, 0, 0}}, 0 */ - {{ -4,-10,-14,-16,-15,-14,-13,-12,-12,-12,-11, -1, -1, -1, -1, -1, 0}}, /* 0 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 5, 0, 0, 0, 0, 0}}, 1 */ - {{ -6,-12,-14,-16,-15,-15,-14,-13,-13,-12,-12, -2, -2, -1, -1, -1, 0}}, /* 1 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 2 */ - {{-12,-13,-14,-16,-16,-16,-15,-14,-13,-12,-12, -6, -3, -1, -1, -1, 0}}, /* 2 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 3 */ - {{-15,-15,-15,-16,-16,-16,-16,-14,-13,-13,-13,-10, -4, -2, -1, -1, 0}}, /* 3 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, *//* 4 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 4 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 5 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 5 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 6 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -8, -4, -2, -2, 0}}, /* 6 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 7 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 7 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 8 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 8 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 9 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 9 */ - -/* {{-15,-15,-15,-15,-15,-12,-10, -8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, 10 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 10 */ -}; - -static const vp_adjblock _vp_tonemask_adj_otherblock[12]={ - /* 63 125 250 500 1 2 4 8 16 */ - - {{ -3, -8,-13,-15,-10,-10, -9, -9, -9, -9, -9, 1, 1, 1, 1, 1, 1}}, /* -1 */ - -/* {{-20,-20,-20,-20,-14,-12,-10, -8, -4, 0, 0, 10, 0, 0, 0, 0, 0}}, 0 */ - {{ -4,-10,-14,-16,-14,-13,-12,-12,-11,-11,-10, 0, 0, 0, 0, 0, 0}}, /* 0 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 5, 0, 0, 0, 0, 0}}, 1 */ - {{ -6,-12,-14,-16,-15,-15,-14,-13,-13,-12,-12, -2, -2, -1, 0, 0, 0}}, /* 1 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 2 */ - {{-12,-13,-14,-16,-16,-16,-15,-14,-13,-12,-12, -5, -2, -1, 0, 0, 0}}, /* 2 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 3 */ - {{-15,-15,-15,-16,-16,-16,-16,-14,-13,-13,-13,-10, -4, -2, 0, 0, 0}}, /* 3 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 4 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 4 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 5 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-13,-11, -7 -3, -1, -1 , 0}}, /* 5 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 6 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -8, -4, -2, -2, 0}}, /* 6 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 7 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 7 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 8 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 8 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 9 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 9 */ - -/* {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, 10 */ - {{-16,-16,-16,-16,-16,-16,-16,-15,-14,-14,-14,-12, -9, -4, -2, -2, 0}}, /* 10 */ -}; - -/* noise bias (transition block) */ -static const noise3 _psy_noisebias_trans[12]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - /* -1 */ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, - /* 0 - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14, -8, -4, 0, 0, 0, 0, 2, 4, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -4, -4, -4, -2}}},*/ - {{{-15,-15,-15,-15,-15,-12, -6, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14, -8, -4, 0, 0, 0, 0, 2, 3, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -4, -4, -4, -2}}}, - /* 1 - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 8}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}},*/ - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 1, 4}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}}, - /* 2 - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, */ - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -2, -1, 0, 3}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -7, -4}}}, - /* 3 - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -2, 0, 2}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, - /* 4 - {{{-20,-20,-20,-20,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 5}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ - {{{-20,-20,-20,-20,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -2, -1, 1}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, - /* 5 - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -4, -4, -4, -4, -2, -1, 2}, - {-34,-34,-34,-34,-30,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}}, */ - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -4, -4, -4, -4, -3, -1, 0}, - {-34,-34,-34,-34,-30,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}}, - /* 6 - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-24,-18,-14, -8, -6, -6, -6, -6, -4, -2, 1}, - {-34,-34,-34,-34,-30,-26,-24,-18,-17,-15,-15,-15,-15,-13,-13,-12, -8}}},*/ - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-24,-18,-14, -8, -6, -6, -6, -6, -5, -2, 0}, - {-34,-34,-34,-34,-30,-26,-26,-24,-22,-19,-19,-19,-19,-18,-17,-16,-12}}}, - /* 7 - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-24,-18,-14,-12,-10, -8, -8, -8, -6, -4, 0}, - {-34,-34,-34,-34,-30,-26,-26,-24,-22,-19,-19,-19,-19,-18,-17,-16,-12}}},*/ - {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, - {-32,-32,-32,-32,-28,-24,-24,-24,-18,-14,-12,-10,-10,-10, -8, -6, -2}, - {-34,-34,-34,-34,-30,-26,-26,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}}, - /* 8 - {{{-24,-24,-24,-24,-22,-20,-15,-10, -8, -2, 0, 0, 0, 1, 2, 3, 7}, - {-36,-36,-36,-36,-30,-30,-30,-24,-18,-14,-12,-10,-10,-10, -8, -6, -2}, - {-36,-36,-36,-36,-34,-30,-28,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}},*/ - {{{-24,-24,-24,-24,-22,-20,-15,-10, -8, -2, 0, 0, 0, 1, 2, 3, 7}, - {-36,-36,-36,-36,-30,-30,-30,-24,-20,-16,-16,-16,-16,-14,-12,-10, -7}, - {-36,-36,-36,-36,-34,-30,-28,-26,-24,-30,-30,-30,-30,-30,-30,-24,-20}}}, - /* 9 - {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, - {-36,-36,-36,-36,-34,-32,-32,-28,-20,-16,-16,-16,-16,-14,-12,-10, -7}, - {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}},*/ - {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, - {-38,-38,-38,-38,-36,-34,-34,-30,-24,-20,-20,-20,-20,-18,-16,-12,-10}, - {-40,-40,-40,-40,-40,-40,-40,-38,-35,-35,-35,-35,-35,-35,-35,-35,-30}}}, - /* 10 */ - {{{-30,-30,-30,-30,-30,-30,-30,-28,-20,-14,-14,-14,-14,-14,-14,-12,-10}, - {-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-30,-30,-30,-30,-30,-30,-20}, - {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, -}; - -/* noise bias (long block) */ -static const noise3 _psy_noisebias_long[12]={ - /*63 125 250 500 1k 2k 4k 8k 16k*/ - /* -1 */ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 0, 6, 6, 6, 6, 10, 10, 12, 20}, - {-20,-20,-20,-20,-20,-20,-10, -2, 0, 0, 0, 0, 0, 2, 4, 6, 15}, - {-20,-20,-20,-20,-20,-20,-20,-10, -6, -6, -6, -6, -6, -4, -4, -4, -2}}}, - - /* 0 */ - /* {{{-10,-10,-10,-10,-10,-10, -8, 2, 2, 2, 4, 4, 5, 5, 5, 8, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14, -6, 0, 0, 0, 0, 0, 2, 4, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14, -8, -6, -6, -6, -6, -4, -4, -4, -2}}},*/ - {{{-10,-10,-10,-10,-10,-10, -8, 2, 2, 2, 4, 4, 5, 5, 5, 8, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14, -6, 0, 0, 0, 0, 0, 2, 3, 6}, - {-20,-20,-20,-20,-20,-20,-20,-14, -8, -6, -6, -6, -6, -4, -4, -4, -2}}}, - /* 1 */ - /* {{{-10,-10,-10,-10,-10,-10, -8, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 8}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}},*/ - {{{-10,-10,-10,-10,-10,-10, -8, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 1, 4}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}}, - /* 2 */ - /* {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 6}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ - {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -2, -1, 0, 3}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, - /* 3 */ - /* {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 6}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ - {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -2, 0, 2}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -5}}}, - /* 4 */ - /* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 5}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}},*/ - {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -2, -1, 1}, - {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -7}}}, - /* 5 */ - /* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-22,-22,-22,-22,-22,-22,-22,-16,-12, -6, -4, -4, -4, -4, -2, -1, 2}, - {-24,-24,-24,-24,-24,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}},*/ - {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-22,-22,-22,-22,-22,-22,-22,-16,-12, -6, -4, -4, -4, -4, -3, -1, 0}, - {-24,-24,-24,-24,-24,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -8}}}, - /* 6 */ - /* {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-24,-24,-24,-24,-24,-24,-24,-18,-14, -8, -6, -6, -6, -6, -4, -2, 1}, - {-26,-26,-26,-26,-26,-26,-26,-18,-16,-15,-15,-15,-15,-13,-13,-12, -8}}},*/ - {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-24,-24,-24,-24,-24,-24,-24,-18,-14, -8, -6, -6, -6, -6, -5, -2, 0}, - {-26,-26,-26,-26,-26,-26,-26,-18,-16,-15,-15,-15,-15,-13,-13,-12,-10}}}, - /* 7 */ - {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, - {-24,-24,-24,-24,-24,-24,-24,-18,-14,-10, -8, -8, -8, -8, -6, -4, 0}, - {-26,-26,-26,-26,-26,-26,-26,-22,-20,-19,-19,-19,-19,-18,-17,-16,-12}}}, - /* 8 */ - {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 0, 0, 0, 0, 1, 2, 3, 7}, - {-26,-26,-26,-26,-26,-26,-26,-20,-16,-12,-10,-10,-10,-10, -8, -6, -2}, - {-28,-28,-28,-28,-28,-28,-28,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}}, - /* 9 */ - {{{-22,-22,-22,-22,-22,-22,-22,-18,-14, -8, -4, -4, -4, -4, -4, -2, 2}, - {-26,-26,-26,-26,-26,-26,-26,-22,-18,-16,-16,-16,-16,-14,-12,-10, -7}, - {-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-24,-20}}}, - /* 10 */ - {{{-24,-24,-24,-24,-24,-24,-24,-24,-24,-18,-14,-14,-14,-14,-14,-12,-10}, - {-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-30,-20}, - {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, -}; - -/* noise bias (impulse block) */ -static const noise3 _psy_noisebias_impulse[12]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - /* -1 */ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, - - /* 0 */ - /* {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 4, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-22,-20,-14, -6, -2, 0, 0, 0, 0, 2, 4, 10}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}},*/ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 4, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-22,-20,-14, -6, -2, 0, 0, 0, 0, 2, 3, 6}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, - /* 1 */ - {{{-12,-12,-12,-12,-12, -8, -6, -4, 0, 4, 4, 4, 4, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -4, -4, -2, -2, -2, -2, 2}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8,-10,-10, -8, -8, -8, -6, -4}}}, - /* 2 */ - {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}}, - /* 3 */ - {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 6, 8, 8, 14}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}}, - /* 4 */ - {{{-16,-16,-16,-16,-16,-12,-10, -6, -2, 0, 0, 0, 0, 4, 6, 6, 12}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -4, -4, -4, -2, 0}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10,-10,-10, -8, -4}}}, - /* 5 */ - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11}, - {-32,-32,-32,-32,-28,-24,-22,-16,-10, -6, -8, -8, -6, -6, -6, -4, -2}, - {-34,-34,-34,-34,-30,-26,-24,-18,-14,-12,-12,-12,-12,-12,-10, -9, -5}}}, - /* 6 - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11}, - {-34,-34,-34,-34,-30,-30,-24,-20,-12,-12,-14,-14,-10, -9, -8, -6, -4}, - {-34,-34,-34,-34,-34,-30,-26,-20,-16,-15,-15,-15,-15,-15,-13,-12, -8}}},*/ - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 4, 6, 11}, - {-34,-34,-34,-34,-30,-30,-30,-24,-16,-16,-16,-16,-16,-16,-14,-14,-12}, - {-36,-36,-36,-36,-36,-34,-28,-24,-20,-20,-20,-20,-20,-20,-20,-18,-16}}}, - /* 7 */ - /* {{{-22,-22,-22,-22,-22,-20,-14,-10, -6, 0, 0, 0, 0, 4, 4, 6, 11}, - {-34,-34,-34,-34,-30,-30,-24,-20,-14,-14,-16,-16,-14,-12,-10,-10,-10}, - {-34,-34,-34,-34,-32,-32,-30,-24,-20,-19,-19,-19,-19,-19,-17,-16,-12}}},*/ - {{{-22,-22,-22,-22,-22,-20,-14,-10, -6, 0, 0, 0, 0, 4, 4, 6, 11}, - {-34,-34,-34,-34,-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-24,-22}, - {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-30,-24}}}, - /* 8 */ - /* {{{-24,-24,-24,-24,-24,-22,-14,-10, -6, -1, -1, -1, -1, 3, 3, 5, 10}, - {-34,-34,-34,-34,-30,-30,-30,-24,-20,-20,-20,-20,-20,-18,-16,-16,-14}, - {-36,-36,-36,-36,-36,-34,-28,-24,-24,-24,-24,-24,-24,-24,-24,-20,-16}}},*/ - {{{-24,-24,-24,-24,-24,-22,-14,-10, -6, -1, -1, -1, -1, 3, 3, 5, 10}, - {-34,-34,-34,-34,-34,-32,-32,-30,-26,-26,-26,-26,-26,-26,-26,-26,-24}, - {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-30,-24}}}, - /* 9 */ - /* {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, - {-36,-36,-36,-36,-34,-32,-32,-30,-26,-26,-26,-26,-26,-22,-20,-20,-18}, - {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}},*/ - {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, - {-36,-36,-36,-36,-34,-32,-32,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26}, - {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}}, - /* 10 */ - {{{-30,-30,-30,-30,-30,-26,-24,-24,-24,-20,-16,-16,-16,-16,-16,-14,-12}, - {-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-30,-30,-30,-30,-30,-30,-26}, - {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, -}; - -/* noise bias (padding block) */ -static const noise3 _psy_noisebias_padding[12]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - - /* -1 */ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 3, 6, 6, 15}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, - - /* 0 */ - {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, 2, 3, 6, 6, 8, 10}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -4, -4, -4, -4, -2, 0, 2}}}, - /* 1 */ - {{{-12,-12,-12,-12,-12, -8, -6, -4, 0, 4, 4, 4, 4, 10, 12, 14, 20}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, 0, 0, 0, 2, 2, 4, 8}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -6, -4, -2, 0}}}, - /* 2 */ - /* {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, 0, 0, 0, 2, 2, 4, 8}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}},*/ - {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 8, 10, 10, 16}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, 0, 0, 2, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}}, - /* 3 */ - {{{-14,-14,-14,-14,-14,-10, -8, -6, -2, 2, 2, 2, 2, 6, 8, 8, 14}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, 0, 0, 2, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}}, - /* 4 */ - {{{-16,-16,-16,-16,-16,-12,-10, -6, -2, 0, 0, 0, 0, 4, 6, 6, 12}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -1, -1, -1, -1, 0, 2, 6}, - {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -8, -6, -4, -2}}}, - /* 5 */ - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12}, - {-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -3, -3, -3, -3, -2, 0, 4}, - {-34,-34,-34,-34,-30,-26,-24,-18,-14,-10,-10,-10,-10,-10, -8, -5, -3}}}, - /* 6 */ - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12}, - {-34,-34,-34,-34,-30,-30,-24,-20,-14, -8, -4, -4, -4, -4, -3, -1, 4}, - {-34,-34,-34,-34,-34,-30,-26,-20,-16,-13,-13,-13,-13,-13,-11, -8, -6}}}, - /* 7 */ - {{{-20,-20,-20,-20,-20,-18,-14,-10, -4, 0, 0, 0, 0, 4, 6, 6, 12}, - {-34,-34,-34,-34,-30,-30,-30,-24,-16,-10, -8, -6, -6, -6, -5, -3, 1}, - {-34,-34,-34,-34,-32,-32,-28,-22,-18,-16,-16,-16,-16,-16,-14,-12,-10}}}, - /* 8 */ - {{{-22,-22,-22,-22,-22,-20,-14,-10, -4, 0, 0, 0, 0, 3, 5, 5, 11}, - {-34,-34,-34,-34,-30,-30,-30,-24,-16,-12,-10, -8, -8, -8, -7, -5, -2}, - {-36,-36,-36,-36,-36,-34,-28,-22,-20,-20,-20,-20,-20,-20,-20,-16,-14}}}, - /* 9 */ - {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -2, -2, -2, -2, 0, 2, 6}, - {-36,-36,-36,-36,-34,-32,-32,-24,-16,-12,-12,-12,-12,-12,-10, -8, -5}, - {-40,-40,-40,-40,-40,-40,-40,-32,-26,-24,-24,-24,-24,-24,-24,-20,-18}}}, - /* 10 */ - {{{-30,-30,-30,-30,-30,-26,-24,-24,-24,-20,-12,-12,-12,-12,-12,-10, -8}, - {-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-25,-25,-25,-25,-25,-25,-15}, - {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, -}; - - -static const noiseguard _psy_noiseguards_44[4]={ - {3,3,15}, - {3,3,15}, - {10,10,100}, - {10,10,100}, -}; - -static const int _psy_tone_suppress[12]={ - -20,-20,-20,-20,-20,-24,-30,-40,-40,-45,-45,-45, -}; -static const int _psy_tone_0dB[12]={ - 90,90,95,95,95,95,105,105,105,105,105,105, -}; -static const int _psy_noise_suppress[12]={ - -20,-20,-24,-24,-24,-24,-30,-40,-40,-45,-45,-45, -}; - -static const vorbis_info_psy _psy_info_template={ - /* blockflag */ - -1, - /* ath_adjatt, ath_maxatt */ - -140.,-140., - /* tonemask att boost/decay,suppr,curves */ - {0.f,0.f,0.f}, 0.,0., -40.f, {0.}, - - /*noisemaskp,supp, low/high window, low/hi guard, minimum */ - 1, -0.f, .5f, .5f, 0,0,0, - /* noiseoffset*3, noisecompand, max_curve_dB */ - {{-1},{-1},{-1}},{-1},105.f, - /* noise normalization - noise_p, start, partition, thresh. */ - 0,-1,-1,0., -}; - -/* ath ****************/ - -static const int _psy_ath_floater[12]={ - -100,-100,-100,-100,-100,-100,-105,-105,-105,-105,-110,-120, -}; -static const int _psy_ath_abs[12]={ - -130,-130,-130,-130,-140,-140,-140,-140,-140,-140,-140,-150, -}; - -/* stereo setup. These don't map directly to quality level, there's - an additional indirection as several of the below may be used in a - single bitmanaged stream - -****************/ - -/* various stereo possibilities */ - -/* stereo mode by base quality level */ -static const adj_stereo _psy_stereo_modes_44[12]={ - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 -1 */ - {{ 4, 4, 4, 4, 4, 4, 4, 3, 2, 2, 1, 0, 0, 0, 0}, - { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 5, 4, 3}, - { 1, 2, 3, 4, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 8}, - { 12,12.5, 13,13.5, 14,14.5, 15, 99, 99, 99, 99, 99, 99, 99, 99}}, - -/* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 */ - {{ 4, 4, 4, 4, 4, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0}, - { 8, 8, 8, 8, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 3}, - { 1, 2, 3, 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 8, 8}, - { 12,12.5, 13,13.5, 14,14.5, 15, 99, 99, 99, 99, 99, 99, 99, 99}}, - - - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 */ - {{ 3, 3, 3, 3, 3, 3, 3, 3, 2, 1, 0, 0, 0, 0, 0}, - { 8, 8, 8, 8, 6, 6, 5, 5, 5, 5, 5, 5, 5, 4, 3}, - { 1, 2, 3, 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 8, 8}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - - - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 */ - {{ 3, 3, 3, 3, 3, 3, 3, 2, 1, 1, 0, 0, 0, 0, 0}, - { 8, 8, 6, 6, 5, 5, 4, 4, 4, 4, 4, 4, 3, 2, 1}, - { 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 8, 8, 8, 8}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 3 */ - {{ 2, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0}, - { 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 2, 1}, - { 4, 4, 5, 6, 6, 6, 6, 6, 8, 8, 10, 10, 10, 10, 10}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 4 */ - {{ 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 2, 1, 0}, - { 6, 6, 6, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 10}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5 */ - {{ 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0}, - { 6, 7, 8, 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 6 */ - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 3, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 8, 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 7 */ - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 3, 3, 3, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 8, 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 8 */ - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 8, 10, 10, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 9 */ - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 10 */ - {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, -}; - -/* tone master attenuation by base quality mode and bitrate tweak */ -static const att3 _psy_tone_masteratt_44[12]={ - {{ 35, 21, 9}, 0, 0}, /* -1 */ - {{ 30, 20, 8}, -2, 1.25}, /* 0 */ - /* {{ 25, 14, 4}, 0, 0}, *//* 1 */ - {{ 25, 12, 2}, 0, 0}, /* 1 */ - /* {{ 20, 10, -2}, 0, 0}, *//* 2 */ - {{ 20, 9, -3}, 0, 0}, /* 2 */ - {{ 20, 9, -4}, 0, 0}, /* 3 */ - {{ 20, 9, -4}, 0, 0}, /* 4 */ - {{ 20, 6, -6}, 0, 0}, /* 5 */ - {{ 20, 3, -10}, 0, 0}, /* 6 */ - {{ 18, 1, -14}, 0, 0}, /* 7 */ - {{ 18, 0, -16}, 0, 0}, /* 8 */ - {{ 18, -2, -16}, 0, 0}, /* 9 */ - {{ 12, -2, -20}, 0, 0}, /* 10 */ -}; - -/* lowpass by mode **************/ -static const double _psy_lowpass_44[12]={ - /* 15.1,15.8,16.5,17.9,20.5,48.,999.,999.,999.,999.,999. */ - 13.9,15.1,15.8,16.5,17.2,18.9,20.1,48.,999.,999.,999.,999. -}; - -/* noise normalization **********/ - -static const int _noise_start_short_44[11]={ - /* 16,16,16,16,32,32,9999,9999,9999,9999 */ - 32,16,16,16,32,9999,9999,9999,9999,9999,9999 -}; -static const int _noise_start_long_44[11]={ - /* 128,128,128,256,512,512,9999,9999,9999,9999 */ - 256,128,128,256,512,9999,9999,9999,9999,9999,9999 -}; - -static const int _noise_part_short_44[11]={ - 8,8,8,8,8,8,8,8,8,8,8 -}; -static const int _noise_part_long_44[11]={ - 32,32,32,32,32,32,32,32,32,32,32 -}; - -static const double _noise_thresh_44[11]={ - /* .2,.2,.3,.4,.5,.5,9999.,9999.,9999.,9999., */ - .2,.2,.2,.4,.6,9999.,9999.,9999.,9999.,9999.,9999., -}; - -static const double _noise_thresh_5only[2]={ - .5,.5, -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h deleted file mode 100755 index 9cb9f31..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/psych_8.h +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 8kHz psychoacoustic settings - last mod: $Id: psych_8.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -static const att3 _psy_tone_masteratt_8[3]={ - {{ 32, 25, 12}, 0, 0}, /* 0 */ - {{ 30, 25, 12}, 0, 0}, /* 0 */ - {{ 20, 0, -14}, 0, 0}, /* 0 */ -}; - -static const vp_adjblock _vp_tonemask_adj_8[3]={ - /* adjust for mode zero */ - /* 63 125 250 500 1 2 4 8 16 */ - {{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0,10, 0, 0,99,99,99}}, /* 1 */ - {{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0,10, 0, 0,99,99,99}}, /* 1 */ - {{-15,-15,-15,-15,-10,-10, -6, 0, 0, 0, 0, 0, 0, 0,99,99,99}}, /* 1 */ -}; - - -static const noise3 _psy_noisebias_8[3]={ - /* 63 125 250 500 1k 2k 4k 8k 16k*/ - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 8, 8, 8, 10, 10, 99, 99, 99}, - {-10,-10,-10,-10, -5, -5, -5, 0, 0, 4, 4, 4, 4, 4, 99, 99, 99}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, - - {{{-10,-10,-10,-10, -5, -5, -5, 0, 4, 8, 8, 8, 10, 10, 99, 99, 99}, - {-10,-10,-10,-10,-10,-10, -5, -5, -5, 0, 0, 0, 0, 0, 99, 99, 99}, - {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, 99, 99, 99}}}, - - {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 99, 99, 99}, - {-30,-30,-30,-30,-26,-22,-20,-14,-12,-12,-10,-10,-10,-10, 99, 99, 99}, - {-30,-30,-30,-30,-26,-26,-26,-26,-26,-26,-26,-26,-26,-24, 99, 99, 99}}}, -}; - -/* stereo mode by base quality level */ -static const adj_stereo _psy_stereo_modes_8[3]={ - /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 */ - {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - {{ 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, - {{ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}, - { 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}, - { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, - { 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99}}, -}; - -static const noiseguard _psy_noiseguards_8[2]={ - {10,10,-1}, - {10,10,-1}, -}; - -static const compandblock _psy_compand_8[2]={ - {{ - 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ - 8, 8, 9, 9,10,10,11, 11, /* 15dB */ - 12,12,13,13,14,14,15, 15, /* 23dB */ - 16,16,17,17,17,18,18, 19, /* 31dB */ - 19,19,20,21,22,23,24, 25, /* 39dB */ - }}, - {{ - 0, 1, 2, 3, 4, 5, 6, 6, /* 7dB */ - 7, 7, 6, 6, 5, 5, 4, 4, /* 15dB */ - 3, 3, 3, 4, 5, 6, 7, 8, /* 23dB */ - 9,10,11,12,13,14,15, 16, /* 31dB */ - 17,18,19,20,21,22,23, 24, /* 39dB */ - }}, -}; - -static const double _psy_lowpass_8[3]={3.,4.,4.}; -static const int _noise_start_8[2]={ - 64,64, -}; -static const int _noise_part_8[2]={ - 8,8, -}; - -static const int _psy_ath_floater_8[3]={ - -100,-100,-105, -}; - -static const int _psy_ath_abs_8[3]={ - -130,-130,-140, -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h deleted file mode 100755 index 4d7c71a..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_16.h +++ /dev/null @@ -1,163 +0,0 @@ -/******************************************************************** - * * - * This FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel residue templates 16/22kHz - last mod: $Id: residue_16.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -/***** residue backends *********************************************/ - -static const static_bookblock _resbook_16s_0={ - { - {0}, - {0,0,&_16c0_s_p1_0}, - {0}, - {0,0,&_16c0_s_p3_0}, - {0,0,&_16c0_s_p4_0}, - {0,0,&_16c0_s_p5_0}, - {0,0,&_16c0_s_p6_0}, - {&_16c0_s_p7_0,&_16c0_s_p7_1}, - {&_16c0_s_p8_0,&_16c0_s_p8_1}, - {&_16c0_s_p9_0,&_16c0_s_p9_1,&_16c0_s_p9_2} - } -}; -static const static_bookblock _resbook_16s_1={ - { - {0}, - {0,0,&_16c1_s_p1_0}, - {0}, - {0,0,&_16c1_s_p3_0}, - {0,0,&_16c1_s_p4_0}, - {0,0,&_16c1_s_p5_0}, - {0,0,&_16c1_s_p6_0}, - {&_16c1_s_p7_0,&_16c1_s_p7_1}, - {&_16c1_s_p8_0,&_16c1_s_p8_1}, - {&_16c1_s_p9_0,&_16c1_s_p9_1,&_16c1_s_p9_2} - } -}; -static const static_bookblock _resbook_16s_2={ - { - {0}, - {0,0,&_16c2_s_p1_0}, - {0,0,&_16c2_s_p2_0}, - {0,0,&_16c2_s_p3_0}, - {0,0,&_16c2_s_p4_0}, - {&_16c2_s_p5_0,&_16c2_s_p5_1}, - {&_16c2_s_p6_0,&_16c2_s_p6_1}, - {&_16c2_s_p7_0,&_16c2_s_p7_1}, - {&_16c2_s_p8_0,&_16c2_s_p8_1}, - {&_16c2_s_p9_0,&_16c2_s_p9_1,&_16c2_s_p9_2} - } -}; - -static const vorbis_residue_template _res_16s_0[]={ - {2,0,32, &_residue_44_mid, - &_huff_book__16c0_s_single,&_huff_book__16c0_s_single, - &_resbook_16s_0,&_resbook_16s_0}, -}; -static const vorbis_residue_template _res_16s_1[]={ - {2,0,32, &_residue_44_mid, - &_huff_book__16c1_s_short,&_huff_book__16c1_s_short, - &_resbook_16s_1,&_resbook_16s_1}, - - {2,0,32, &_residue_44_mid, - &_huff_book__16c1_s_long,&_huff_book__16c1_s_long, - &_resbook_16s_1,&_resbook_16s_1} -}; -static const vorbis_residue_template _res_16s_2[]={ - {2,0,32, &_residue_44_high, - &_huff_book__16c2_s_short,&_huff_book__16c2_s_short, - &_resbook_16s_2,&_resbook_16s_2}, - - {2,0,32, &_residue_44_high, - &_huff_book__16c2_s_long,&_huff_book__16c2_s_long, - &_resbook_16s_2,&_resbook_16s_2} -}; - -static const vorbis_mapping_template _mapres_template_16_stereo[3]={ - { _map_nominal, _res_16s_0 }, /* 0 */ - { _map_nominal, _res_16s_1 }, /* 1 */ - { _map_nominal, _res_16s_2 }, /* 2 */ -}; - -static const static_bookblock _resbook_16u_0={ - { - {0}, - {0,0,&_16u0__p1_0}, - {0,0,&_16u0__p2_0}, - {0,0,&_16u0__p3_0}, - {0,0,&_16u0__p4_0}, - {0,0,&_16u0__p5_0}, - {&_16u0__p6_0,&_16u0__p6_1}, - {&_16u0__p7_0,&_16u0__p7_1,&_16u0__p7_2} - } -}; -static const static_bookblock _resbook_16u_1={ - { - {0}, - {0,0,&_16u1__p1_0}, - {0,0,&_16u1__p2_0}, - {0,0,&_16u1__p3_0}, - {0,0,&_16u1__p4_0}, - {0,0,&_16u1__p5_0}, - {0,0,&_16u1__p6_0}, - {&_16u1__p7_0,&_16u1__p7_1}, - {&_16u1__p8_0,&_16u1__p8_1}, - {&_16u1__p9_0,&_16u1__p9_1,&_16u1__p9_2} - } -}; -static const static_bookblock _resbook_16u_2={ - { - {0}, - {0,0,&_16u2_p1_0}, - {0,0,&_16u2_p2_0}, - {0,0,&_16u2_p3_0}, - {0,0,&_16u2_p4_0}, - {&_16u2_p5_0,&_16u2_p5_1}, - {&_16u2_p6_0,&_16u2_p6_1}, - {&_16u2_p7_0,&_16u2_p7_1}, - {&_16u2_p8_0,&_16u2_p8_1}, - {&_16u2_p9_0,&_16u2_p9_1,&_16u2_p9_2} - } -}; - -static const vorbis_residue_template _res_16u_0[]={ - {1,0,32, &_residue_44_low_un, - &_huff_book__16u0__single,&_huff_book__16u0__single, - &_resbook_16u_0,&_resbook_16u_0}, -}; -static const vorbis_residue_template _res_16u_1[]={ - {1,0,32, &_residue_44_mid_un, - &_huff_book__16u1__short,&_huff_book__16u1__short, - &_resbook_16u_1,&_resbook_16u_1}, - - {1,0,32, &_residue_44_mid_un, - &_huff_book__16u1__long,&_huff_book__16u1__long, - &_resbook_16u_1,&_resbook_16u_1} -}; -static const vorbis_residue_template _res_16u_2[]={ - {1,0,32, &_residue_44_hi_un, - &_huff_book__16u2__short,&_huff_book__16u2__short, - &_resbook_16u_2,&_resbook_16u_2}, - - {1,0,32, &_residue_44_hi_un, - &_huff_book__16u2__long,&_huff_book__16u2__long, - &_resbook_16u_2,&_resbook_16u_2} -}; - - -static const vorbis_mapping_template _mapres_template_16_uncoupled[3]={ - { _map_nominal_u, _res_16u_0 }, /* 0 */ - { _map_nominal_u, _res_16u_1 }, /* 1 */ - { _map_nominal_u, _res_16u_2 }, /* 2 */ -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h deleted file mode 100755 index b01ce47..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44.h +++ /dev/null @@ -1,292 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel residue templates for 32/44.1/48kHz - last mod: $Id: residue_44.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -#include "../../../codec.h" -#include "../backends.h" -#include "../books/coupled/res_books_stereo.h" - -/***** residue backends *********************************************/ - -static const vorbis_info_residue0 _residue_44_low={ - 0,-1, -1, 9,-1,-1, - /* 0 1 2 3 4 5 6 7 */ - {0}, - {-1}, - { 0, 1, 2, 2, 4, 8, 16, 32}, - { 0, 0, 0,999, 4, 8, 16, 32}, -}; - -static const vorbis_info_residue0 _residue_44_mid={ - 0,-1, -1, 10,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 0, 1, 1, 2, 2, 4, 8, 16, 32}, - { 0, 0,999, 0,999, 4, 8, 16, 32}, -}; - -static const vorbis_info_residue0 _residue_44_high={ - 0,-1, -1, 10,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 0, 1, 2, 4, 8, 16, 32, 71,157}, - { 0, 1, 2, 3, 4, 8, 16, 71,157}, -}; - -static const static_bookblock _resbook_44s_n1={ - { - {0},{0,0,&_44cn1_s_p1_0},{0,0,&_44cn1_s_p2_0}, - {0,0,&_44cn1_s_p3_0},{0,0,&_44cn1_s_p4_0},{0,0,&_44cn1_s_p5_0}, - {&_44cn1_s_p6_0,&_44cn1_s_p6_1},{&_44cn1_s_p7_0,&_44cn1_s_p7_1}, - {&_44cn1_s_p8_0,&_44cn1_s_p8_1,&_44cn1_s_p8_2} - } -}; -static const static_bookblock _resbook_44sm_n1={ - { - {0},{0,0,&_44cn1_sm_p1_0},{0,0,&_44cn1_sm_p2_0}, - {0,0,&_44cn1_sm_p3_0},{0,0,&_44cn1_sm_p4_0},{0,0,&_44cn1_sm_p5_0}, - {&_44cn1_sm_p6_0,&_44cn1_sm_p6_1},{&_44cn1_sm_p7_0,&_44cn1_sm_p7_1}, - {&_44cn1_sm_p8_0,&_44cn1_sm_p8_1,&_44cn1_sm_p8_2} - } -}; - -static const static_bookblock _resbook_44s_0={ - { - {0},{0,0,&_44c0_s_p1_0},{0,0,&_44c0_s_p2_0}, - {0,0,&_44c0_s_p3_0},{0,0,&_44c0_s_p4_0},{0,0,&_44c0_s_p5_0}, - {&_44c0_s_p6_0,&_44c0_s_p6_1},{&_44c0_s_p7_0,&_44c0_s_p7_1}, - {&_44c0_s_p8_0,&_44c0_s_p8_1,&_44c0_s_p8_2} - } -}; -static const static_bookblock _resbook_44sm_0={ - { - {0},{0,0,&_44c0_sm_p1_0},{0,0,&_44c0_sm_p2_0}, - {0,0,&_44c0_sm_p3_0},{0,0,&_44c0_sm_p4_0},{0,0,&_44c0_sm_p5_0}, - {&_44c0_sm_p6_0,&_44c0_sm_p6_1},{&_44c0_sm_p7_0,&_44c0_sm_p7_1}, - {&_44c0_sm_p8_0,&_44c0_sm_p8_1,&_44c0_sm_p8_2} - } -}; - -static const static_bookblock _resbook_44s_1={ - { - {0},{0,0,&_44c1_s_p1_0},{0,0,&_44c1_s_p2_0}, - {0,0,&_44c1_s_p3_0},{0,0,&_44c1_s_p4_0},{0,0,&_44c1_s_p5_0}, - {&_44c1_s_p6_0,&_44c1_s_p6_1},{&_44c1_s_p7_0,&_44c1_s_p7_1}, - {&_44c1_s_p8_0,&_44c1_s_p8_1,&_44c1_s_p8_2} - } -}; -static const static_bookblock _resbook_44sm_1={ - { - {0},{0,0,&_44c1_sm_p1_0},{0,0,&_44c1_sm_p2_0}, - {0,0,&_44c1_sm_p3_0},{0,0,&_44c1_sm_p4_0},{0,0,&_44c1_sm_p5_0}, - {&_44c1_sm_p6_0,&_44c1_sm_p6_1},{&_44c1_sm_p7_0,&_44c1_sm_p7_1}, - {&_44c1_sm_p8_0,&_44c1_sm_p8_1,&_44c1_sm_p8_2} - } -}; - -static const static_bookblock _resbook_44s_2={ - { - {0},{0,0,&_44c2_s_p1_0},{0,0,&_44c2_s_p2_0},{0,0,&_44c2_s_p3_0}, - {0,0,&_44c2_s_p4_0},{0,0,&_44c2_s_p5_0},{0,0,&_44c2_s_p6_0}, - {&_44c2_s_p7_0,&_44c2_s_p7_1},{&_44c2_s_p8_0,&_44c2_s_p8_1}, - {&_44c2_s_p9_0,&_44c2_s_p9_1,&_44c2_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_3={ - { - {0},{0,0,&_44c3_s_p1_0},{0,0,&_44c3_s_p2_0},{0,0,&_44c3_s_p3_0}, - {0,0,&_44c3_s_p4_0},{0,0,&_44c3_s_p5_0},{0,0,&_44c3_s_p6_0}, - {&_44c3_s_p7_0,&_44c3_s_p7_1},{&_44c3_s_p8_0,&_44c3_s_p8_1}, - {&_44c3_s_p9_0,&_44c3_s_p9_1,&_44c3_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_4={ - { - {0},{0,0,&_44c4_s_p1_0},{0,0,&_44c4_s_p2_0},{0,0,&_44c4_s_p3_0}, - {0,0,&_44c4_s_p4_0},{0,0,&_44c4_s_p5_0},{0,0,&_44c4_s_p6_0}, - {&_44c4_s_p7_0,&_44c4_s_p7_1},{&_44c4_s_p8_0,&_44c4_s_p8_1}, - {&_44c4_s_p9_0,&_44c4_s_p9_1,&_44c4_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_5={ - { - {0},{0,0,&_44c5_s_p1_0},{0,0,&_44c5_s_p2_0},{0,0,&_44c5_s_p3_0}, - {0,0,&_44c5_s_p4_0},{0,0,&_44c5_s_p5_0},{0,0,&_44c5_s_p6_0}, - {&_44c5_s_p7_0,&_44c5_s_p7_1},{&_44c5_s_p8_0,&_44c5_s_p8_1}, - {&_44c5_s_p9_0,&_44c5_s_p9_1,&_44c5_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_6={ - { - {0},{0,0,&_44c6_s_p1_0},{0,0,&_44c6_s_p2_0},{0,0,&_44c6_s_p3_0}, - {0,0,&_44c6_s_p4_0}, - {&_44c6_s_p5_0,&_44c6_s_p5_1}, - {&_44c6_s_p6_0,&_44c6_s_p6_1}, - {&_44c6_s_p7_0,&_44c6_s_p7_1}, - {&_44c6_s_p8_0,&_44c6_s_p8_1}, - {&_44c6_s_p9_0,&_44c6_s_p9_1,&_44c6_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_7={ - { - {0},{0,0,&_44c7_s_p1_0},{0,0,&_44c7_s_p2_0},{0,0,&_44c7_s_p3_0}, - {0,0,&_44c7_s_p4_0}, - {&_44c7_s_p5_0,&_44c7_s_p5_1}, - {&_44c7_s_p6_0,&_44c7_s_p6_1}, - {&_44c7_s_p7_0,&_44c7_s_p7_1}, - {&_44c7_s_p8_0,&_44c7_s_p8_1}, - {&_44c7_s_p9_0,&_44c7_s_p9_1,&_44c7_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_8={ - { - {0},{0,0,&_44c8_s_p1_0},{0,0,&_44c8_s_p2_0},{0,0,&_44c8_s_p3_0}, - {0,0,&_44c8_s_p4_0}, - {&_44c8_s_p5_0,&_44c8_s_p5_1}, - {&_44c8_s_p6_0,&_44c8_s_p6_1}, - {&_44c8_s_p7_0,&_44c8_s_p7_1}, - {&_44c8_s_p8_0,&_44c8_s_p8_1}, - {&_44c8_s_p9_0,&_44c8_s_p9_1,&_44c8_s_p9_2} - } -}; -static const static_bookblock _resbook_44s_9={ - { - {0},{0,0,&_44c9_s_p1_0},{0,0,&_44c9_s_p2_0},{0,0,&_44c9_s_p3_0}, - {0,0,&_44c9_s_p4_0}, - {&_44c9_s_p5_0,&_44c9_s_p5_1}, - {&_44c9_s_p6_0,&_44c9_s_p6_1}, - {&_44c9_s_p7_0,&_44c9_s_p7_1}, - {&_44c9_s_p8_0,&_44c9_s_p8_1}, - {&_44c9_s_p9_0,&_44c9_s_p9_1,&_44c9_s_p9_2} - } -}; - -static const vorbis_residue_template _res_44s_n1[]={ - {2,0,32, &_residue_44_low, - &_huff_book__44cn1_s_short,&_huff_book__44cn1_sm_short, - &_resbook_44s_n1,&_resbook_44sm_n1}, - - {2,0,32, &_residue_44_low, - &_huff_book__44cn1_s_long,&_huff_book__44cn1_sm_long, - &_resbook_44s_n1,&_resbook_44sm_n1} -}; -static const vorbis_residue_template _res_44s_0[]={ - {2,0,16, &_residue_44_low, - &_huff_book__44c0_s_short,&_huff_book__44c0_sm_short, - &_resbook_44s_0,&_resbook_44sm_0}, - - {2,0,32, &_residue_44_low, - &_huff_book__44c0_s_long,&_huff_book__44c0_sm_long, - &_resbook_44s_0,&_resbook_44sm_0} -}; -static const vorbis_residue_template _res_44s_1[]={ - {2,0,16, &_residue_44_low, - &_huff_book__44c1_s_short,&_huff_book__44c1_sm_short, - &_resbook_44s_1,&_resbook_44sm_1}, - - {2,0,32, &_residue_44_low, - &_huff_book__44c1_s_long,&_huff_book__44c1_sm_long, - &_resbook_44s_1,&_resbook_44sm_1} -}; - -static const vorbis_residue_template _res_44s_2[]={ - {2,0,16, &_residue_44_mid, - &_huff_book__44c2_s_short,&_huff_book__44c2_s_short, - &_resbook_44s_2,&_resbook_44s_2}, - - {2,0,32, &_residue_44_mid, - &_huff_book__44c2_s_long,&_huff_book__44c2_s_long, - &_resbook_44s_2,&_resbook_44s_2} -}; -static const vorbis_residue_template _res_44s_3[]={ - {2,0,16, &_residue_44_mid, - &_huff_book__44c3_s_short,&_huff_book__44c3_s_short, - &_resbook_44s_3,&_resbook_44s_3}, - - {2,0,32, &_residue_44_mid, - &_huff_book__44c3_s_long,&_huff_book__44c3_s_long, - &_resbook_44s_3,&_resbook_44s_3} -}; -static const vorbis_residue_template _res_44s_4[]={ - {2,0,16, &_residue_44_mid, - &_huff_book__44c4_s_short,&_huff_book__44c4_s_short, - &_resbook_44s_4,&_resbook_44s_4}, - - {2,0,32, &_residue_44_mid, - &_huff_book__44c4_s_long,&_huff_book__44c4_s_long, - &_resbook_44s_4,&_resbook_44s_4} -}; -static const vorbis_residue_template _res_44s_5[]={ - {2,0,16, &_residue_44_mid, - &_huff_book__44c5_s_short,&_huff_book__44c5_s_short, - &_resbook_44s_5,&_resbook_44s_5}, - - {2,0,32, &_residue_44_mid, - &_huff_book__44c5_s_long,&_huff_book__44c5_s_long, - &_resbook_44s_5,&_resbook_44s_5} -}; -static const vorbis_residue_template _res_44s_6[]={ - {2,0,16, &_residue_44_high, - &_huff_book__44c6_s_short,&_huff_book__44c6_s_short, - &_resbook_44s_6,&_resbook_44s_6}, - - {2,0,32, &_residue_44_high, - &_huff_book__44c6_s_long,&_huff_book__44c6_s_long, - &_resbook_44s_6,&_resbook_44s_6} -}; -static const vorbis_residue_template _res_44s_7[]={ - {2,0,16, &_residue_44_high, - &_huff_book__44c7_s_short,&_huff_book__44c7_s_short, - &_resbook_44s_7,&_resbook_44s_7}, - - {2,0,32, &_residue_44_high, - &_huff_book__44c7_s_long,&_huff_book__44c7_s_long, - &_resbook_44s_7,&_resbook_44s_7} -}; -static const vorbis_residue_template _res_44s_8[]={ - {2,0,16, &_residue_44_high, - &_huff_book__44c8_s_short,&_huff_book__44c8_s_short, - &_resbook_44s_8,&_resbook_44s_8}, - - {2,0,32, &_residue_44_high, - &_huff_book__44c8_s_long,&_huff_book__44c8_s_long, - &_resbook_44s_8,&_resbook_44s_8} -}; -static const vorbis_residue_template _res_44s_9[]={ - {2,0,16, &_residue_44_high, - &_huff_book__44c9_s_short,&_huff_book__44c9_s_short, - &_resbook_44s_9,&_resbook_44s_9}, - - {2,0,32, &_residue_44_high, - &_huff_book__44c9_s_long,&_huff_book__44c9_s_long, - &_resbook_44s_9,&_resbook_44s_9} -}; - -static const vorbis_mapping_template _mapres_template_44_stereo[]={ - { _map_nominal, _res_44s_n1 }, /* -1 */ - { _map_nominal, _res_44s_0 }, /* 0 */ - { _map_nominal, _res_44s_1 }, /* 1 */ - { _map_nominal, _res_44s_2 }, /* 2 */ - { _map_nominal, _res_44s_3 }, /* 3 */ - { _map_nominal, _res_44s_4 }, /* 4 */ - { _map_nominal, _res_44s_5 }, /* 5 */ - { _map_nominal, _res_44s_6 }, /* 6 */ - { _map_nominal, _res_44s_7 }, /* 7 */ - { _map_nominal, _res_44s_8 }, /* 8 */ - { _map_nominal, _res_44s_9 }, /* 9 */ -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h deleted file mode 100755 index 081fe8e..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44p51.h +++ /dev/null @@ -1,451 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel residue templates for 32/44.1/48kHz uncoupled - last mod: $Id$ - - ********************************************************************/ - -#include "../../../codec.h" -#include "../backends.h" - -#include "../books/coupled/res_books_51.h" - -/***** residue backends *********************************************/ - -static const vorbis_info_residue0 _residue_44p_lo={ - 0,-1, -1, 7,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 0, 1, 2, 7, 17, 31}, - { 0, 0, 99, 7, 17, 31}, -}; - -static const vorbis_info_residue0 _residue_44p={ - 0,-1, -1, 8,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 0, 1, 1, 2, 7, 17, 31}, - { 0, 0, 99, 99, 7, 17, 31}, -}; - -static const vorbis_info_residue0 _residue_44p_hi={ - 0,-1, -1, 8,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 0, 1, 2, 4, 7, 17, 31}, - { 0, 1, 2, 4, 7, 17, 31}, -}; - -static const vorbis_info_residue0 _residue_44p_lfe={ - 0,-1, -1, 2,-1,-1, - /* 0 1 2 3 4 5 6 7 8 */ - {0}, - {-1}, - { 32}, - { -1} -}; - -static const static_bookblock _resbook_44p_n1={ - { - {0}, - {0,&_44pn1_p1_0}, - - {&_44pn1_p2_0,&_44pn1_p2_1,0}, - {&_44pn1_p3_0,&_44pn1_p3_1,0}, - {&_44pn1_p4_0,&_44pn1_p4_1,0}, - - {&_44pn1_p5_0,&_44pn1_p5_1,&_44pn1_p4_1}, - {&_44pn1_p6_0,&_44pn1_p6_1,&_44pn1_p6_2}, - } -}; - -static const static_bookblock _resbook_44p_0={ - { - {0}, - {0,&_44p0_p1_0}, - - {&_44p0_p2_0,&_44p0_p2_1,0}, - {&_44p0_p3_0,&_44p0_p3_1,0}, - {&_44p0_p4_0,&_44p0_p4_1,0}, - - {&_44p0_p5_0,&_44p0_p5_1,&_44p0_p4_1}, - {&_44p0_p6_0,&_44p0_p6_1,&_44p0_p6_2}, - } -}; - -static const static_bookblock _resbook_44p_1={ - { - {0}, - {0,&_44p1_p1_0}, - - {&_44p1_p2_0,&_44p1_p2_1,0}, - {&_44p1_p3_0,&_44p1_p3_1,0}, - {&_44p1_p4_0,&_44p1_p4_1,0}, - - {&_44p1_p5_0,&_44p1_p5_1,&_44p1_p4_1}, - {&_44p1_p6_0,&_44p1_p6_1,&_44p1_p6_2}, - } -}; - -static const static_bookblock _resbook_44p_2={ - { - {0}, - {0,0,&_44p2_p1_0}, - {0,&_44p2_p2_0,0}, - - {&_44p2_p3_0,&_44p2_p3_1,0}, - {&_44p2_p4_0,&_44p2_p4_1,0}, - {&_44p2_p5_0,&_44p2_p5_1,0}, - - {&_44p2_p6_0,&_44p2_p6_1,&_44p2_p5_1}, - {&_44p2_p7_0,&_44p2_p7_1,&_44p2_p7_2,&_44p2_p7_3} - } -}; -static const static_bookblock _resbook_44p_3={ - { - {0}, - {0,0,&_44p3_p1_0}, - {0,&_44p3_p2_0,0}, - - {&_44p3_p3_0,&_44p3_p3_1,0}, - {&_44p3_p4_0,&_44p3_p4_1,0}, - {&_44p3_p5_0,&_44p3_p5_1,0}, - - {&_44p3_p6_0,&_44p3_p6_1,&_44p3_p5_1}, - {&_44p3_p7_0,&_44p3_p7_1,&_44p3_p7_2,&_44p3_p7_3} - } -}; -static const static_bookblock _resbook_44p_4={ - { - {0}, - {0,0,&_44p4_p1_0}, - {0,&_44p4_p2_0,0}, - - {&_44p4_p3_0,&_44p4_p3_1,0}, - {&_44p4_p4_0,&_44p4_p4_1,0}, - {&_44p4_p5_0,&_44p4_p5_1,0}, - - {&_44p4_p6_0,&_44p4_p6_1,&_44p4_p5_1}, - {&_44p4_p7_0,&_44p4_p7_1,&_44p4_p7_2,&_44p4_p7_3} - } -}; -static const static_bookblock _resbook_44p_5={ - { - {0}, - {0,0,&_44p5_p1_0}, - {0,&_44p5_p2_0,0}, - - {&_44p5_p3_0,&_44p5_p3_1,0}, - {&_44p5_p4_0,&_44p5_p4_1,0}, - {&_44p5_p5_0,&_44p5_p5_1,0}, - - {&_44p5_p6_0,&_44p5_p6_1,&_44p5_p5_1}, - {&_44p5_p7_0,&_44p5_p7_1,&_44p5_p7_2,&_44p5_p7_3} - } -}; -static const static_bookblock _resbook_44p_6={ - { - {0}, - {0,0,&_44p6_p1_0}, - {0,&_44p6_p2_0,0}, - - {&_44p6_p3_0,&_44p6_p3_1,0}, - {&_44p6_p4_0,&_44p6_p4_1,0}, - {&_44p6_p5_0,&_44p6_p5_1,0}, - - {&_44p6_p6_0,&_44p6_p6_1,&_44p6_p5_1}, - {&_44p6_p7_0,&_44p6_p7_1,&_44p6_p7_2,&_44p6_p7_3} - } -}; -static const static_bookblock _resbook_44p_7={ - { - {0}, - {0,0,&_44p7_p1_0}, - {0,&_44p7_p2_0,0}, - - {&_44p7_p3_0,&_44p7_p3_1,0}, - {&_44p7_p4_0,&_44p7_p4_1,0}, - {&_44p7_p5_0,&_44p7_p5_1,0}, - - {&_44p7_p6_0,&_44p7_p6_1,&_44p7_p5_1}, - {&_44p7_p7_0,&_44p7_p7_1,&_44p7_p7_2,&_44p7_p7_3} - } -}; -static const static_bookblock _resbook_44p_8={ - { - {0}, - {0,0,&_44p8_p1_0}, - {0,&_44p8_p2_0,0}, - - {&_44p8_p3_0,&_44p8_p3_1,0}, - {&_44p8_p4_0,&_44p8_p4_1,0}, - {&_44p8_p5_0,&_44p8_p5_1,0}, - - {&_44p8_p6_0,&_44p8_p6_1,&_44p8_p5_1}, - {&_44p8_p7_0,&_44p8_p7_1,&_44p8_p7_2,&_44p8_p7_3} - } -}; -static const static_bookblock _resbook_44p_9={ - { - {0}, - {0,0,&_44p9_p1_0}, - {0,&_44p9_p2_0,0}, - - {&_44p9_p3_0,&_44p9_p3_1,0}, - {&_44p9_p4_0,&_44p9_p4_1,0}, - {&_44p9_p5_0,&_44p9_p5_1,0}, - - {&_44p9_p6_0,&_44p9_p6_1,&_44p9_p5_1}, - {&_44p9_p7_0,&_44p9_p7_1,&_44p9_p7_2,&_44p9_p7_3} - } -}; - -static const static_bookblock _resbook_44p_ln1={ - { - {&_44pn1_l0_0,&_44pn1_l0_1,0}, - {&_44pn1_l1_0,&_44pn1_p6_1,&_44pn1_p6_2}, - } -}; -static const static_bookblock _resbook_44p_l0={ - { - {&_44p0_l0_0,&_44p0_l0_1,0}, - {&_44p0_l1_0,&_44p0_p6_1,&_44p0_p6_2}, - } -}; -static const static_bookblock _resbook_44p_l1={ - { - {&_44p1_l0_0,&_44p1_l0_1,0}, - {&_44p1_l1_0,&_44p1_p6_1,&_44p1_p6_2}, - } -}; -static const static_bookblock _resbook_44p_l2={ - { - {&_44p2_l0_0,&_44p2_l0_1,0}, - {&_44p2_l1_0,&_44p2_p7_2,&_44p2_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l3={ - { - {&_44p3_l0_0,&_44p3_l0_1,0}, - {&_44p3_l1_0,&_44p3_p7_2,&_44p3_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l4={ - { - {&_44p4_l0_0,&_44p4_l0_1,0}, - {&_44p4_l1_0,&_44p4_p7_2,&_44p4_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l5={ - { - {&_44p5_l0_0,&_44p5_l0_1,0}, - {&_44p5_l1_0,&_44p5_p7_2,&_44p5_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l6={ - { - {&_44p6_l0_0,&_44p6_l0_1,0}, - {&_44p6_l1_0,&_44p6_p7_2,&_44p6_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l7={ - { - {&_44p7_l0_0,&_44p7_l0_1,0}, - {&_44p7_l1_0,&_44p7_p7_2,&_44p7_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l8={ - { - {&_44p8_l0_0,&_44p8_l0_1,0}, - {&_44p8_l1_0,&_44p8_p7_2,&_44p8_p7_3}, - } -}; -static const static_bookblock _resbook_44p_l9={ - { - {&_44p9_l0_0,&_44p9_l0_1,0}, - {&_44p9_l1_0,&_44p9_p7_2,&_44p9_p7_3}, - } -}; - - -static const vorbis_info_mapping0 _map_nominal_51[2]={ - {2, {0,0,0,0,0,1}, {0,2}, {0,2}, 4,{0,3,0,0},{2,4,1,3}}, - {2, {0,0,0,0,0,1}, {1,2}, {1,2}, 4,{0,3,0,0},{2,4,1,3}} -}; -static const vorbis_info_mapping0 _map_nominal_51u[2]={ - {2, {0,0,0,0,0,1}, {0,2}, {0,2}, 0,{0},{0}}, - {2, {0,0,0,0,0,1}, {1,2}, {1,2}, 0,{0},{0}} -}; - -static const vorbis_residue_template _res_44p51_n1[]={ - {2,0,30, &_residue_44p_lo, - &_huff_book__44pn1_short,&_huff_book__44pn1_short, - &_resbook_44p_n1,&_resbook_44p_n1}, - - {2,0,30, &_residue_44p_lo, - &_huff_book__44pn1_long,&_huff_book__44pn1_long, - &_resbook_44p_n1,&_resbook_44p_n1}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44pn1_lfe,&_huff_book__44pn1_lfe, - &_resbook_44p_ln1,&_resbook_44p_ln1} -}; -static const vorbis_residue_template _res_44p51_0[]={ - {2,0,15, &_residue_44p_lo, - &_huff_book__44p0_short,&_huff_book__44p0_short, - &_resbook_44p_0,&_resbook_44p_0}, - - {2,0,30, &_residue_44p_lo, - &_huff_book__44p0_long,&_huff_book__44p0_long, - &_resbook_44p_0,&_resbook_44p_0}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p0_lfe,&_huff_book__44p0_lfe, - &_resbook_44p_l0,&_resbook_44p_l0} -}; -static const vorbis_residue_template _res_44p51_1[]={ - {2,0,15, &_residue_44p_lo, - &_huff_book__44p1_short,&_huff_book__44p1_short, - &_resbook_44p_1,&_resbook_44p_1}, - - {2,0,30, &_residue_44p_lo, - &_huff_book__44p1_long,&_huff_book__44p1_long, - &_resbook_44p_1,&_resbook_44p_1}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p1_lfe,&_huff_book__44p1_lfe, - &_resbook_44p_l1,&_resbook_44p_l1} -}; -static const vorbis_residue_template _res_44p51_2[]={ - {2,0,15, &_residue_44p, - &_huff_book__44p2_short,&_huff_book__44p2_short, - &_resbook_44p_2,&_resbook_44p_2}, - - {2,0,30, &_residue_44p, - &_huff_book__44p2_long,&_huff_book__44p2_long, - &_resbook_44p_2,&_resbook_44p_2}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p2_lfe,&_huff_book__44p2_lfe, - &_resbook_44p_l2,&_resbook_44p_l2} -}; -static const vorbis_residue_template _res_44p51_3[]={ - {2,0,15, &_residue_44p, - &_huff_book__44p3_short,&_huff_book__44p3_short, - &_resbook_44p_3,&_resbook_44p_3}, - - {2,0,30, &_residue_44p, - &_huff_book__44p3_long,&_huff_book__44p3_long, - &_resbook_44p_3,&_resbook_44p_3}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p3_lfe,&_huff_book__44p3_lfe, - &_resbook_44p_l3,&_resbook_44p_l3} -}; -static const vorbis_residue_template _res_44p51_4[]={ - {2,0,15, &_residue_44p, - &_huff_book__44p4_short,&_huff_book__44p4_short, - &_resbook_44p_4,&_resbook_44p_4}, - - {2,0,30, &_residue_44p, - &_huff_book__44p4_long,&_huff_book__44p4_long, - &_resbook_44p_4,&_resbook_44p_4}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p4_lfe,&_huff_book__44p4_lfe, - &_resbook_44p_l4,&_resbook_44p_l4} -}; -static const vorbis_residue_template _res_44p51_5[]={ - {2,0,15, &_residue_44p_hi, - &_huff_book__44p5_short,&_huff_book__44p5_short, - &_resbook_44p_5,&_resbook_44p_5}, - - {2,0,30, &_residue_44p_hi, - &_huff_book__44p5_long,&_huff_book__44p5_long, - &_resbook_44p_5,&_resbook_44p_5}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p5_lfe,&_huff_book__44p5_lfe, - &_resbook_44p_l5,&_resbook_44p_l5} -}; -static const vorbis_residue_template _res_44p51_6[]={ - {2,0,15, &_residue_44p_hi, - &_huff_book__44p6_short,&_huff_book__44p6_short, - &_resbook_44p_6,&_resbook_44p_6}, - - {2,0,30, &_residue_44p_hi, - &_huff_book__44p6_long,&_huff_book__44p6_long, - &_resbook_44p_6,&_resbook_44p_6}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, - &_resbook_44p_l6,&_resbook_44p_l6} -}; - - -static const vorbis_residue_template _res_44p51_7[]={ - {2,0,15, &_residue_44p_hi, - &_huff_book__44p7_short,&_huff_book__44p7_short, - &_resbook_44p_7,&_resbook_44p_7}, - - {2,0,30, &_residue_44p_hi, - &_huff_book__44p7_long,&_huff_book__44p7_long, - &_resbook_44p_7,&_resbook_44p_7}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, - &_resbook_44p_l6,&_resbook_44p_l6} -}; -static const vorbis_residue_template _res_44p51_8[]={ - {2,0,15, &_residue_44p_hi, - &_huff_book__44p8_short,&_huff_book__44p8_short, - &_resbook_44p_8,&_resbook_44p_8}, - - {2,0,30, &_residue_44p_hi, - &_huff_book__44p8_long,&_huff_book__44p8_long, - &_resbook_44p_8,&_resbook_44p_8}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, - &_resbook_44p_l6,&_resbook_44p_l6} -}; -static const vorbis_residue_template _res_44p51_9[]={ - {2,0,15, &_residue_44p_hi, - &_huff_book__44p9_short,&_huff_book__44p9_short, - &_resbook_44p_9,&_resbook_44p_9}, - - {2,0,30, &_residue_44p_hi, - &_huff_book__44p9_long,&_huff_book__44p9_long, - &_resbook_44p_9,&_resbook_44p_9}, - - {1,2,6, &_residue_44p_lfe, - &_huff_book__44p6_lfe,&_huff_book__44p6_lfe, - &_resbook_44p_l6,&_resbook_44p_l6} -}; - -static const vorbis_mapping_template _mapres_template_44_51[]={ - { _map_nominal_51, _res_44p51_n1 }, /* -1 */ - { _map_nominal_51, _res_44p51_0 }, /* 0 */ - { _map_nominal_51, _res_44p51_1 }, /* 1 */ - { _map_nominal_51, _res_44p51_2 }, /* 2 */ - { _map_nominal_51, _res_44p51_3 }, /* 3 */ - { _map_nominal_51, _res_44p51_4 }, /* 4 */ - { _map_nominal_51u, _res_44p51_5 }, /* 5 */ - { _map_nominal_51u, _res_44p51_6 }, /* 6 */ - { _map_nominal_51u, _res_44p51_7 }, /* 7 */ - { _map_nominal_51u, _res_44p51_8 }, /* 8 */ - { _map_nominal_51u, _res_44p51_9 }, /* 9 */ -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h deleted file mode 100755 index 5b31322..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_44u.h +++ /dev/null @@ -1,318 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel residue templates for 32/44.1/48kHz uncoupled - last mod: $Id: residue_44u.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -#include "../../../codec.h" -#include "../backends.h" -#include "../books/uncoupled/res_books_uncoupled.h" - -/***** residue backends *********************************************/ - - -static const vorbis_info_residue0 _residue_44_low_un={ - 0,-1, -1, 8,-1,-1, - {0}, - {-1}, - { 0, 1, 1, 2, 2, 4, 28}, - { -1, 25, -1, 45, -1, -1, -1} -}; - -static const vorbis_info_residue0 _residue_44_mid_un={ - 0,-1, -1, 10,-1,-1, - /* 0 1 2 3 4 5 6 7 8 9 */ - {0}, - {-1}, - { 0, 1, 1, 2, 2, 4, 4, 16, 60}, - { -1, 30, -1, 50, -1, 80, -1, -1, -1} -}; - -static const vorbis_info_residue0 _residue_44_hi_un={ - 0,-1, -1, 10,-1,-1, - /* 0 1 2 3 4 5 6 7 8 9 */ - {0}, - {-1}, - { 0, 1, 2, 4, 8, 16, 32, 71,157}, - { -1, -1, -1, -1, -1, -1, -1, -1, -1} -}; - -/* mapping conventions: - only one submap (this would change for efficient 5.1 support for example)*/ -/* Four psychoacoustic profiles are used, one for each blocktype */ -static const vorbis_info_mapping0 _map_nominal_u[2]={ - {1, {0,0,0,0,0,0}, {0}, {0}, 0,{0},{0}}, - {1, {0,0,0,0,0,0}, {1}, {1}, 0,{0},{0}} -}; - -static const static_bookblock _resbook_44u_n1={ - { - {0}, - {0,0,&_44un1__p1_0}, - {0,0,&_44un1__p2_0}, - {0,0,&_44un1__p3_0}, - {0,0,&_44un1__p4_0}, - {0,0,&_44un1__p5_0}, - {&_44un1__p6_0,&_44un1__p6_1}, - {&_44un1__p7_0,&_44un1__p7_1,&_44un1__p7_2} - } -}; -static const static_bookblock _resbook_44u_0={ - { - {0}, - {0,0,&_44u0__p1_0}, - {0,0,&_44u0__p2_0}, - {0,0,&_44u0__p3_0}, - {0,0,&_44u0__p4_0}, - {0,0,&_44u0__p5_0}, - {&_44u0__p6_0,&_44u0__p6_1}, - {&_44u0__p7_0,&_44u0__p7_1,&_44u0__p7_2} - } -}; -static const static_bookblock _resbook_44u_1={ - { - {0}, - {0,0,&_44u1__p1_0}, - {0,0,&_44u1__p2_0}, - {0,0,&_44u1__p3_0}, - {0,0,&_44u1__p4_0}, - {0,0,&_44u1__p5_0}, - {&_44u1__p6_0,&_44u1__p6_1}, - {&_44u1__p7_0,&_44u1__p7_1,&_44u1__p7_2} - } -}; -static const static_bookblock _resbook_44u_2={ - { - {0}, - {0,0,&_44u2__p1_0}, - {0,0,&_44u2__p2_0}, - {0,0,&_44u2__p3_0}, - {0,0,&_44u2__p4_0}, - {0,0,&_44u2__p5_0}, - {&_44u2__p6_0,&_44u2__p6_1}, - {&_44u2__p7_0,&_44u2__p7_1,&_44u2__p7_2} - } -}; -static const static_bookblock _resbook_44u_3={ - { - {0}, - {0,0,&_44u3__p1_0}, - {0,0,&_44u3__p2_0}, - {0,0,&_44u3__p3_0}, - {0,0,&_44u3__p4_0}, - {0,0,&_44u3__p5_0}, - {&_44u3__p6_0,&_44u3__p6_1}, - {&_44u3__p7_0,&_44u3__p7_1,&_44u3__p7_2} - } -}; -static const static_bookblock _resbook_44u_4={ - { - {0}, - {0,0,&_44u4__p1_0}, - {0,0,&_44u4__p2_0}, - {0,0,&_44u4__p3_0}, - {0,0,&_44u4__p4_0}, - {0,0,&_44u4__p5_0}, - {&_44u4__p6_0,&_44u4__p6_1}, - {&_44u4__p7_0,&_44u4__p7_1,&_44u4__p7_2} - } -}; -static const static_bookblock _resbook_44u_5={ - { - {0}, - {0,0,&_44u5__p1_0}, - {0,0,&_44u5__p2_0}, - {0,0,&_44u5__p3_0}, - {0,0,&_44u5__p4_0}, - {0,0,&_44u5__p5_0}, - {0,0,&_44u5__p6_0}, - {&_44u5__p7_0,&_44u5__p7_1}, - {&_44u5__p8_0,&_44u5__p8_1}, - {&_44u5__p9_0,&_44u5__p9_1,&_44u5__p9_2} - } -}; -static const static_bookblock _resbook_44u_6={ - { - {0}, - {0,0,&_44u6__p1_0}, - {0,0,&_44u6__p2_0}, - {0,0,&_44u6__p3_0}, - {0,0,&_44u6__p4_0}, - {0,0,&_44u6__p5_0}, - {0,0,&_44u6__p6_0}, - {&_44u6__p7_0,&_44u6__p7_1}, - {&_44u6__p8_0,&_44u6__p8_1}, - {&_44u6__p9_0,&_44u6__p9_1,&_44u6__p9_2} - } -}; -static const static_bookblock _resbook_44u_7={ - { - {0}, - {0,0,&_44u7__p1_0}, - {0,0,&_44u7__p2_0}, - {0,0,&_44u7__p3_0}, - {0,0,&_44u7__p4_0}, - {0,0,&_44u7__p5_0}, - {0,0,&_44u7__p6_0}, - {&_44u7__p7_0,&_44u7__p7_1}, - {&_44u7__p8_0,&_44u7__p8_1}, - {&_44u7__p9_0,&_44u7__p9_1,&_44u7__p9_2} - } -}; -static const static_bookblock _resbook_44u_8={ - { - {0}, - {0,0,&_44u8_p1_0}, - {0,0,&_44u8_p2_0}, - {0,0,&_44u8_p3_0}, - {0,0,&_44u8_p4_0}, - {&_44u8_p5_0,&_44u8_p5_1}, - {&_44u8_p6_0,&_44u8_p6_1}, - {&_44u8_p7_0,&_44u8_p7_1}, - {&_44u8_p8_0,&_44u8_p8_1}, - {&_44u8_p9_0,&_44u8_p9_1,&_44u8_p9_2} - } -}; -static const static_bookblock _resbook_44u_9={ - { - {0}, - {0,0,&_44u9_p1_0}, - {0,0,&_44u9_p2_0}, - {0,0,&_44u9_p3_0}, - {0,0,&_44u9_p4_0}, - {&_44u9_p5_0,&_44u9_p5_1}, - {&_44u9_p6_0,&_44u9_p6_1}, - {&_44u9_p7_0,&_44u9_p7_1}, - {&_44u9_p8_0,&_44u9_p8_1}, - {&_44u9_p9_0,&_44u9_p9_1,&_44u9_p9_2} - } -}; - -static const vorbis_residue_template _res_44u_n1[]={ - {1,0,32, &_residue_44_low_un, - &_huff_book__44un1__short,&_huff_book__44un1__short, - &_resbook_44u_n1,&_resbook_44u_n1}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44un1__long,&_huff_book__44un1__long, - &_resbook_44u_n1,&_resbook_44u_n1} -}; -static const vorbis_residue_template _res_44u_0[]={ - {1,0,16, &_residue_44_low_un, - &_huff_book__44u0__short,&_huff_book__44u0__short, - &_resbook_44u_0,&_resbook_44u_0}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44u0__long,&_huff_book__44u0__long, - &_resbook_44u_0,&_resbook_44u_0} -}; -static const vorbis_residue_template _res_44u_1[]={ - {1,0,16, &_residue_44_low_un, - &_huff_book__44u1__short,&_huff_book__44u1__short, - &_resbook_44u_1,&_resbook_44u_1}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44u1__long,&_huff_book__44u1__long, - &_resbook_44u_1,&_resbook_44u_1} -}; -static const vorbis_residue_template _res_44u_2[]={ - {1,0,16, &_residue_44_low_un, - &_huff_book__44u2__short,&_huff_book__44u2__short, - &_resbook_44u_2,&_resbook_44u_2}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44u2__long,&_huff_book__44u2__long, - &_resbook_44u_2,&_resbook_44u_2} -}; -static const vorbis_residue_template _res_44u_3[]={ - {1,0,16, &_residue_44_low_un, - &_huff_book__44u3__short,&_huff_book__44u3__short, - &_resbook_44u_3,&_resbook_44u_3}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44u3__long,&_huff_book__44u3__long, - &_resbook_44u_3,&_resbook_44u_3} -}; -static const vorbis_residue_template _res_44u_4[]={ - {1,0,16, &_residue_44_low_un, - &_huff_book__44u4__short,&_huff_book__44u4__short, - &_resbook_44u_4,&_resbook_44u_4}, - - {1,0,32, &_residue_44_low_un, - &_huff_book__44u4__long,&_huff_book__44u4__long, - &_resbook_44u_4,&_resbook_44u_4} -}; - -static const vorbis_residue_template _res_44u_5[]={ - {1,0,16, &_residue_44_mid_un, - &_huff_book__44u5__short,&_huff_book__44u5__short, - &_resbook_44u_5,&_resbook_44u_5}, - - {1,0,32, &_residue_44_mid_un, - &_huff_book__44u5__long,&_huff_book__44u5__long, - &_resbook_44u_5,&_resbook_44u_5} -}; - -static const vorbis_residue_template _res_44u_6[]={ - {1,0,16, &_residue_44_mid_un, - &_huff_book__44u6__short,&_huff_book__44u6__short, - &_resbook_44u_6,&_resbook_44u_6}, - - {1,0,32, &_residue_44_mid_un, - &_huff_book__44u6__long,&_huff_book__44u6__long, - &_resbook_44u_6,&_resbook_44u_6} -}; - -static const vorbis_residue_template _res_44u_7[]={ - {1,0,16, &_residue_44_mid_un, - &_huff_book__44u7__short,&_huff_book__44u7__short, - &_resbook_44u_7,&_resbook_44u_7}, - - {1,0,32, &_residue_44_mid_un, - &_huff_book__44u7__long,&_huff_book__44u7__long, - &_resbook_44u_7,&_resbook_44u_7} -}; - -static const vorbis_residue_template _res_44u_8[]={ - {1,0,16, &_residue_44_hi_un, - &_huff_book__44u8__short,&_huff_book__44u8__short, - &_resbook_44u_8,&_resbook_44u_8}, - - {1,0,32, &_residue_44_hi_un, - &_huff_book__44u8__long,&_huff_book__44u8__long, - &_resbook_44u_8,&_resbook_44u_8} -}; -static const vorbis_residue_template _res_44u_9[]={ - {1,0,16, &_residue_44_hi_un, - &_huff_book__44u9__short,&_huff_book__44u9__short, - &_resbook_44u_9,&_resbook_44u_9}, - - {1,0,32, &_residue_44_hi_un, - &_huff_book__44u9__long,&_huff_book__44u9__long, - &_resbook_44u_9,&_resbook_44u_9} -}; - -static const vorbis_mapping_template _mapres_template_44_uncoupled[]={ - { _map_nominal_u, _res_44u_n1 }, /* -1 */ - { _map_nominal_u, _res_44u_0 }, /* 0 */ - { _map_nominal_u, _res_44u_1 }, /* 1 */ - { _map_nominal_u, _res_44u_2 }, /* 2 */ - { _map_nominal_u, _res_44u_3 }, /* 3 */ - { _map_nominal_u, _res_44u_4 }, /* 4 */ - { _map_nominal_u, _res_44u_5 }, /* 5 */ - { _map_nominal_u, _res_44u_6 }, /* 6 */ - { _map_nominal_u, _res_44u_7 }, /* 7 */ - { _map_nominal_u, _res_44u_8 }, /* 8 */ - { _map_nominal_u, _res_44u_9 }, /* 9 */ -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h deleted file mode 100755 index 2943694..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/residue_8.h +++ /dev/null @@ -1,109 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel residue templates 8/11kHz - last mod: $Id: residue_8.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -#include "../../../codec.h" -#include "../backends.h" - -/***** residue backends *********************************************/ - -static const static_bookblock _resbook_8s_0={ - { - {0}, - {0,0,&_8c0_s_p1_0}, - {0}, - {0,0,&_8c0_s_p3_0}, - {0,0,&_8c0_s_p4_0}, - {0,0,&_8c0_s_p5_0}, - {0,0,&_8c0_s_p6_0}, - {&_8c0_s_p7_0,&_8c0_s_p7_1}, - {&_8c0_s_p8_0,&_8c0_s_p8_1}, - {&_8c0_s_p9_0,&_8c0_s_p9_1,&_8c0_s_p9_2} - } -}; -static const static_bookblock _resbook_8s_1={ - { - {0}, - {0,0,&_8c1_s_p1_0}, - {0}, - {0,0,&_8c1_s_p3_0}, - {0,0,&_8c1_s_p4_0}, - {0,0,&_8c1_s_p5_0}, - {0,0,&_8c1_s_p6_0}, - {&_8c1_s_p7_0,&_8c1_s_p7_1}, - {&_8c1_s_p8_0,&_8c1_s_p8_1}, - {&_8c1_s_p9_0,&_8c1_s_p9_1,&_8c1_s_p9_2} - } -}; - -static const vorbis_residue_template _res_8s_0[]={ - {2,0,32, &_residue_44_mid, - &_huff_book__8c0_s_single,&_huff_book__8c0_s_single, - &_resbook_8s_0,&_resbook_8s_0}, -}; -static const vorbis_residue_template _res_8s_1[]={ - {2,0,32, &_residue_44_mid, - &_huff_book__8c1_s_single,&_huff_book__8c1_s_single, - &_resbook_8s_1,&_resbook_8s_1}, -}; - -static const vorbis_mapping_template _mapres_template_8_stereo[2]={ - { _map_nominal, _res_8s_0 }, /* 0 */ - { _map_nominal, _res_8s_1 }, /* 1 */ -}; - -static const static_bookblock _resbook_8u_0={ - { - {0}, - {0,0,&_8u0__p1_0}, - {0,0,&_8u0__p2_0}, - {0,0,&_8u0__p3_0}, - {0,0,&_8u0__p4_0}, - {0,0,&_8u0__p5_0}, - {&_8u0__p6_0,&_8u0__p6_1}, - {&_8u0__p7_0,&_8u0__p7_1,&_8u0__p7_2} - } -}; -static const static_bookblock _resbook_8u_1={ - { - {0}, - {0,0,&_8u1__p1_0}, - {0,0,&_8u1__p2_0}, - {0,0,&_8u1__p3_0}, - {0,0,&_8u1__p4_0}, - {0,0,&_8u1__p5_0}, - {0,0,&_8u1__p6_0}, - {&_8u1__p7_0,&_8u1__p7_1}, - {&_8u1__p8_0,&_8u1__p8_1}, - {&_8u1__p9_0,&_8u1__p9_1,&_8u1__p9_2} - } -}; - -static const vorbis_residue_template _res_8u_0[]={ - {1,0,32, &_residue_44_low_un, - &_huff_book__8u0__single,&_huff_book__8u0__single, - &_resbook_8u_0,&_resbook_8u_0}, -}; -static const vorbis_residue_template _res_8u_1[]={ - {1,0,32, &_residue_44_mid_un, - &_huff_book__8u1__single,&_huff_book__8u1__single, - &_resbook_8u_1,&_resbook_8u_1}, -}; - -static const vorbis_mapping_template _mapres_template_8_uncoupled[2]={ - { _map_nominal_u, _res_8u_0 }, /* 0 */ - { _map_nominal_u, _res_8u_1 }, /* 1 */ -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h deleted file mode 100755 index 6637249..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_11.h +++ /dev/null @@ -1,143 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 11kHz settings - last mod: $Id: setup_11.h 16894 2010-02-12 20:32:12Z xiphmont $ - - ********************************************************************/ - -#include "psych_11.h" - -static const int blocksize_11[2]={ - 512,512 -}; - -static const int _floor_mapping_11a[]={ - 6,6 -}; -static const int *_floor_mapping_11[]={ - _floor_mapping_11a -}; - -static const double rate_mapping_11[3]={ - 8000.,13000.,44000., -}; - -static const double rate_mapping_11_uncoupled[3]={ - 12000.,20000.,50000., -}; - -static const double quality_mapping_11[3]={ - -.1,.0,1. -}; - -static const ve_setup_data_template ve_setup_11_stereo={ - 2, - rate_mapping_11, - quality_mapping_11, - 2, - 9000, - 15000, - - blocksize_11, - blocksize_11, - - _psy_tone_masteratt_11, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_11, - NULL, - _vp_tonemask_adj_11, - - _psy_noiseguards_8, - _psy_noisebias_11, - _psy_noisebias_11, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_11, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_11, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_11, - - _mapres_template_8_stereo -}; - -static const ve_setup_data_template ve_setup_11_uncoupled={ - 2, - rate_mapping_11_uncoupled, - quality_mapping_11, - -1, - 9000, - 15000, - - blocksize_11, - blocksize_11, - - _psy_tone_masteratt_11, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_11, - NULL, - _vp_tonemask_adj_11, - - _psy_noiseguards_8, - _psy_noisebias_11, - _psy_noisebias_11, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_11, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_11, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_11, - - _mapres_template_8_uncoupled -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h deleted file mode 100755 index 6fec1c2..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_16.h +++ /dev/null @@ -1,153 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 16kHz settings - last mod: $Id: setup_16.h 16894 2010-02-12 20:32:12Z xiphmont $ - - ********************************************************************/ - -#include "psych_16.h" -#include "residue_16.h" - -static const int blocksize_16_short[3]={ - 1024,512,512 -}; -static const int blocksize_16_long[3]={ - 1024,1024,1024 -}; - -static const int _floor_mapping_16a[]={ - 9,3,3 -}; -static const int _floor_mapping_16b[]={ - 9,9,9 -}; -static const int *_floor_mapping_16[]={ - _floor_mapping_16a, - _floor_mapping_16b -}; - -static const double rate_mapping_16[4]={ - 12000.,20000.,44000.,86000. -}; - -static const double rate_mapping_16_uncoupled[4]={ - 16000.,28000.,64000.,100000. -}; - -static const double _global_mapping_16[4]={ 1., 2., 3., 4. }; - -static const double quality_mapping_16[4]={ -.1,.05,.5,1. }; - -static const double _psy_compand_16_mapping[4]={ 0., .8, 1., 1.}; - -static const ve_setup_data_template ve_setup_16_stereo={ - 3, - rate_mapping_16, - quality_mapping_16, - 2, - 15000, - 19000, - - blocksize_16_short, - blocksize_16_long, - - _psy_tone_masteratt_16, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - - _psy_noiseguards_16, - _psy_noisebias_16_impulse, - _psy_noisebias_16_short, - _psy_noisebias_16_short, - _psy_noisebias_16, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_16_mapping, - _psy_compand_16_mapping, - - {_noise_start_16,_noise_start_16}, - { _noise_part_16, _noise_part_16}, - _noise_thresh_16, - - _psy_ath_floater_16, - _psy_ath_abs_16, - - _psy_lowpass_16, - - _psy_global_44, - _global_mapping_16, - _psy_stereo_modes_16, - - _floor_books, - _floor, - 2, - _floor_mapping_16, - - _mapres_template_16_stereo -}; - -static const ve_setup_data_template ve_setup_16_uncoupled={ - 3, - rate_mapping_16_uncoupled, - quality_mapping_16, - -1, - 15000, - 19000, - - blocksize_16_short, - blocksize_16_long, - - _psy_tone_masteratt_16, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - - _psy_noiseguards_16, - _psy_noisebias_16_impulse, - _psy_noisebias_16_short, - _psy_noisebias_16_short, - _psy_noisebias_16, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_16_mapping, - _psy_compand_16_mapping, - - {_noise_start_16,_noise_start_16}, - { _noise_part_16, _noise_part_16}, - _noise_thresh_16, - - _psy_ath_floater_16, - _psy_ath_abs_16, - - _psy_lowpass_16, - - _psy_global_44, - _global_mapping_16, - _psy_stereo_modes_16, - - _floor_books, - _floor, - 2, - _floor_mapping_16, - - _mapres_template_16_uncoupled -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h deleted file mode 100755 index c164a9b..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_22.h +++ /dev/null @@ -1,128 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 22kHz settings - last mod: $Id: setup_22.h 17026 2010-03-25 05:00:27Z xiphmont $ - - ********************************************************************/ - -static const double rate_mapping_22[4]={ - 15000.,20000.,44000.,86000. -}; - -static const double rate_mapping_22_uncoupled[4]={ - 16000.,28000.,50000.,90000. -}; - -static const double _psy_lowpass_22[4]={9.5,11.,30.,99.}; - -static const ve_setup_data_template ve_setup_22_stereo={ - 3, - rate_mapping_22, - quality_mapping_16, - 2, - 19000, - 26000, - - blocksize_16_short, - blocksize_16_long, - - _psy_tone_masteratt_16, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - - _psy_noiseguards_16, - _psy_noisebias_16_impulse, - _psy_noisebias_16_short, - _psy_noisebias_16_short, - _psy_noisebias_16, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_16_mapping, - _psy_compand_16_mapping, - - {_noise_start_16,_noise_start_16}, - { _noise_part_16, _noise_part_16}, - _noise_thresh_16, - - _psy_ath_floater_16, - _psy_ath_abs_16, - - _psy_lowpass_22, - - _psy_global_44, - _global_mapping_16, - _psy_stereo_modes_16, - - _floor_books, - _floor, - 2, - _floor_mapping_16, - - _mapres_template_16_stereo -}; - -static const ve_setup_data_template ve_setup_22_uncoupled={ - 3, - rate_mapping_22_uncoupled, - quality_mapping_16, - -1, - 19000, - 26000, - - blocksize_16_short, - blocksize_16_long, - - _psy_tone_masteratt_16, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - _vp_tonemask_adj_16, - - _psy_noiseguards_16, - _psy_noisebias_16_impulse, - _psy_noisebias_16_short, - _psy_noisebias_16_short, - _psy_noisebias_16, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_16_mapping, - _psy_compand_16_mapping, - - {_noise_start_16,_noise_start_16}, - { _noise_part_16, _noise_part_16}, - _noise_thresh_16, - - _psy_ath_floater_16, - _psy_ath_abs_16, - - _psy_lowpass_22, - - _psy_global_44, - _global_mapping_16, - _psy_stereo_modes_16, - - _floor_books, - _floor, - 2, - _floor_mapping_16, - - _mapres_template_16_uncoupled -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h deleted file mode 100755 index 301f020..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_32.h +++ /dev/null @@ -1,132 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel settings for 32kHz - last mod: $Id: setup_32.h 16894 2010-02-12 20:32:12Z xiphmont $ - - ********************************************************************/ - -static const double rate_mapping_32[12]={ - 18000.,28000.,35000.,45000.,56000.,60000., - 75000.,90000.,100000.,115000.,150000.,190000., -}; - -static const double rate_mapping_32_un[12]={ - 30000.,42000.,52000.,64000.,72000.,78000., - 86000.,92000.,110000.,120000.,140000.,190000., -}; - -static const double _psy_lowpass_32[12]={ - 12.3,13.,13.,14.,15.,99.,99.,99.,99.,99.,99.,99. -}; - -static const ve_setup_data_template ve_setup_32_stereo={ - 11, - rate_mapping_32, - quality_mapping_44, - 2, - 26000, - 40000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_32, - - _psy_global_44, - _global_mapping_44, - _psy_stereo_modes_44, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_stereo -}; - -static const ve_setup_data_template ve_setup_32_uncoupled={ - 11, - rate_mapping_32_un, - quality_mapping_44, - -1, - 26000, - 40000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_32, - - _psy_global_44, - _global_mapping_44, - NULL, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_uncoupled -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h deleted file mode 100755 index 45250e0..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44.h +++ /dev/null @@ -1,117 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel settings for 44.1/48kHz - last mod: $Id: setup_44.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -#include "floor_all.h" -#include "residue_44.h" -#include "psych_44.h" - -static const double rate_mapping_44_stereo[12]={ - 22500.,32000.,40000.,48000.,56000.,64000., - 80000.,96000.,112000.,128000.,160000.,250001. -}; - -static const double quality_mapping_44[12]={ - -.1,.0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1.0 -}; - -static const int blocksize_short_44[11]={ - 512,256,256,256,256,256,256,256,256,256,256 -}; -static const int blocksize_long_44[11]={ - 4096,2048,2048,2048,2048,2048,2048,2048,2048,2048,2048 -}; - -static const double _psy_compand_short_mapping[12]={ - 0.5, 1., 1., 1.3, 1.6, 2., 2., 2., 2., 2., 2., 2. -}; -static const double _psy_compand_long_mapping[12]={ - 3.5, 4., 4., 4.3, 4.6, 5., 5., 5., 5., 5., 5., 5. -}; - -static const double _global_mapping_44[12]={ - /* 1., 1., 1.5, 2., 2., 2.5, 2.7, 3.0, 3.5, 4., 4. */ - 0., 1., 1., 1.5, 2., 2., 2.5, 2.7, 3.0, 3.7, 4., 4. -}; - -static const int _floor_mapping_44a[11]={ - 1,0,0,2,2,4,5,5,5,5,5 -}; - -static const int _floor_mapping_44b[11]={ - 8,7,7,7,7,7,7,7,7,7,7 -}; - -static const int _floor_mapping_44c[11]={ - 10,10,10,10,10,10,10,10,10,10,10 -}; - -static const int *_floor_mapping_44[]={ - _floor_mapping_44a, - _floor_mapping_44b, - _floor_mapping_44c, -}; - -static const ve_setup_data_template ve_setup_44_stereo={ - 11, - rate_mapping_44_stereo, - quality_mapping_44, - 2, - 40000, - 50000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_44, - - _psy_global_44, - _global_mapping_44, - _psy_stereo_modes_44, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_stereo -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h deleted file mode 100755 index a26cee8..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44p51.h +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel settings for 44.1/48kHz 5.1 surround modes - last mod: $Id$ - - ********************************************************************/ - -#include "residue_44p51.h" - -static const double rate_mapping_44p51[12]={ - 14000.,20000.,28000.,38000.,46000.,54000., - 75000.,96000.,120000.,140000.,180000.,240001. -}; - -static const ve_setup_data_template ve_setup_44_51={ - 11, - rate_mapping_44p51, - quality_mapping_44, - 6, - 40000, - 70000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_44, - - _psy_global_44, - _global_mapping_44, - _psy_stereo_modes_44, - - _floor_books, - _floor, - 3, - _floor_mapping_44, - - _mapres_template_44_51 -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h deleted file mode 100755 index 7dfdd55..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_44u.h +++ /dev/null @@ -1,74 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: toplevel settings for 44.1/48kHz uncoupled modes - last mod: $Id: setup_44u.h 16962 2010-03-11 07:30:34Z xiphmont $ - - ********************************************************************/ - -#include "residue_44u.h" - -static const double rate_mapping_44_un[12]={ - 32000.,48000.,60000.,70000.,80000.,86000., - 96000.,110000.,120000.,140000.,160000.,240001. -}; - -static const ve_setup_data_template ve_setup_44_uncoupled={ - 11, - rate_mapping_44_un, - quality_mapping_44, - -1, - 40000, - 50000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_44, - - _psy_global_44, - _global_mapping_44, - _psy_stereo_modes_44, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_uncoupled -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h deleted file mode 100755 index 4e71205..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_8.h +++ /dev/null @@ -1,149 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: 8kHz settings - last mod: $Id: setup_8.h 16894 2010-02-12 20:32:12Z xiphmont $ - - ********************************************************************/ - -#include "psych_8.h" -#include "residue_8.h" - -static const int blocksize_8[2]={ - 512,512 -}; - -static const int _floor_mapping_8a[]={ - 6,6 -}; - -static const int *_floor_mapping_8[]={ - _floor_mapping_8a -}; - -static const double rate_mapping_8[3]={ - 6000.,9000.,32000., -}; - -static const double rate_mapping_8_uncoupled[3]={ - 8000.,14000.,42000., -}; - -static const double quality_mapping_8[3]={ - -.1,.0,1. -}; - -static const double _psy_compand_8_mapping[3]={ 0., 1., 1.}; - -static const double _global_mapping_8[3]={ 1., 2., 3. }; - -static const ve_setup_data_template ve_setup_8_stereo={ - 2, - rate_mapping_8, - quality_mapping_8, - 2, - 8000, - 9000, - - blocksize_8, - blocksize_8, - - _psy_tone_masteratt_8, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_8, - NULL, - _vp_tonemask_adj_8, - - _psy_noiseguards_8, - _psy_noisebias_8, - _psy_noisebias_8, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_5only, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_8, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_8, - - _mapres_template_8_stereo -}; - -static const ve_setup_data_template ve_setup_8_uncoupled={ - 2, - rate_mapping_8_uncoupled, - quality_mapping_8, - -1, - 8000, - 9000, - - blocksize_8, - blocksize_8, - - _psy_tone_masteratt_8, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_8, - NULL, - _vp_tonemask_adj_8, - - _psy_noiseguards_8, - _psy_noisebias_8, - _psy_noisebias_8, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_5only, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_8, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_8, - - _mapres_template_8_uncoupled -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h deleted file mode 100755 index be5e2c3..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/modes/setup_X.h +++ /dev/null @@ -1,225 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: catch-all toplevel settings for q modes only - last mod: $Id: setup_X.h 16894 2010-02-12 20:32:12Z xiphmont $ - - ********************************************************************/ - -static const double rate_mapping_X[12]={ - -1.,-1.,-1.,-1.,-1.,-1., - -1.,-1.,-1.,-1.,-1.,-1. -}; - -static const ve_setup_data_template ve_setup_X_stereo={ - 11, - rate_mapping_X, - quality_mapping_44, - 2, - 50000, - 200000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_44, - - _psy_global_44, - _global_mapping_44, - _psy_stereo_modes_44, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_stereo -}; - -static const ve_setup_data_template ve_setup_X_uncoupled={ - 11, - rate_mapping_X, - quality_mapping_44, - -1, - 50000, - 200000, - - blocksize_short_44, - blocksize_long_44, - - _psy_tone_masteratt_44, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_otherblock, - _vp_tonemask_adj_longblock, - _vp_tonemask_adj_otherblock, - - _psy_noiseguards_44, - _psy_noisebias_impulse, - _psy_noisebias_padding, - _psy_noisebias_trans, - _psy_noisebias_long, - _psy_noise_suppress, - - _psy_compand_44, - _psy_compand_short_mapping, - _psy_compand_long_mapping, - - {_noise_start_short_44,_noise_start_long_44}, - {_noise_part_short_44,_noise_part_long_44}, - _noise_thresh_44, - - _psy_ath_floater, - _psy_ath_abs, - - _psy_lowpass_44, - - _psy_global_44, - _global_mapping_44, - NULL, - - _floor_books, - _floor, - 2, - _floor_mapping_44, - - _mapres_template_44_uncoupled -}; - -static const ve_setup_data_template ve_setup_XX_stereo={ - 2, - rate_mapping_X, - quality_mapping_8, - 2, - 0, - 8000, - - blocksize_8, - blocksize_8, - - _psy_tone_masteratt_8, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_8, - NULL, - _vp_tonemask_adj_8, - - _psy_noiseguards_8, - _psy_noisebias_8, - _psy_noisebias_8, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_5only, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_8, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_8, - - _mapres_template_8_stereo -}; - -static const ve_setup_data_template ve_setup_XX_uncoupled={ - 2, - rate_mapping_X, - quality_mapping_8, - -1, - 0, - 8000, - - blocksize_8, - blocksize_8, - - _psy_tone_masteratt_8, - _psy_tone_0dB, - _psy_tone_suppress, - - _vp_tonemask_adj_8, - NULL, - _vp_tonemask_adj_8, - - _psy_noiseguards_8, - _psy_noisebias_8, - _psy_noisebias_8, - NULL, - NULL, - _psy_noise_suppress, - - _psy_compand_8, - _psy_compand_8_mapping, - NULL, - - {_noise_start_8,_noise_start_8}, - {_noise_part_8,_noise_part_8}, - _noise_thresh_5only, - - _psy_ath_floater_8, - _psy_ath_abs_8, - - _psy_lowpass_8, - - _psy_global_44, - _global_mapping_8, - _psy_stereo_modes_8, - - _floor_books, - _floor, - 1, - _floor_mapping_8, - - _mapres_template_8_uncoupled -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h deleted file mode 100755 index 6217472..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/os.h +++ /dev/null @@ -1,186 +0,0 @@ -#ifndef _OS_H -#define _OS_H -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: #ifdef jail to whip a few platforms into the UNIX ideal. - last mod: $Id: os.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "../../os_types.h" - -#include "misc.h" - -#ifndef _V_IFDEFJAIL_H_ -# define _V_IFDEFJAIL_H_ - -# ifdef __GNUC__ -# define STIN static __inline__ -# elif _WIN32 -# define STIN static __inline -# else -# define STIN static -# endif - -#ifdef DJGPP -# define rint(x) (floor((x)+0.5f)) -#endif - -#ifndef M_PI -# define M_PI (3.1415926536f) -#endif - -#if defined(_WIN32) && !defined(__SYMBIAN32__) -# include -# define rint(x) (floor((x)+0.5f)) -# define NO_FLOAT_MATH_LIB -# define FAST_HYPOT(a, b) sqrt((a)*(a) + (b)*(b)) -#endif - -#if defined(__SYMBIAN32__) && defined(__WINS__) -void *_alloca(size_t size); -# define alloca _alloca -#endif - -#ifndef FAST_HYPOT -# define FAST_HYPOT hypot -#endif - -#endif - -#ifdef HAVE_ALLOCA_H -# include -#endif - -#ifdef USE_MEMORY_H -# include -#endif - -#ifndef min -# define min(x,y) ((x)>(y)?(y):(x)) -#endif - -#ifndef max -# define max(x,y) ((x)<(y)?(y):(x)) -#endif - - -/* Special i386 GCC implementation */ -#if defined(__i386__) && defined(__GNUC__) && !defined(__BEOS__) -# define VORBIS_FPU_CONTROL -/* both GCC and MSVC are kinda stupid about rounding/casting to int. - Because of encapsulation constraints (GCC can't see inside the asm - block and so we end up doing stupid things like a store/load that - is collectively a noop), we do it this way */ - -/* we must set up the fpu before this works!! */ - -typedef ogg_int16_t vorbis_fpu_control; - -static inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){ - ogg_int16_t ret; - ogg_int16_t temp = 0; - __asm__ __volatile__("fnstcw %0\n\t" - "movw %0,%%dx\n\t" - "andw $62463,%%dx\n\t" - "movw %%dx,%1\n\t" - "fldcw %1\n\t":"=m"(ret):"m"(temp): "dx"); - *fpu=ret; -} - -static inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ - __asm__ __volatile__("fldcw %0":: "m"(fpu)); -} - -/* assumes the FPU is in round mode! */ -static inline int vorbis_ftoi(double f){ /* yes, double! Otherwise, - we get extra fst/fld to - truncate precision */ - int i; - __asm__("fistl %0": "=m"(i) : "t"(f)); - return(i); -} -#endif /* Special i386 GCC implementation */ - - -/* MSVC inline assembly. 32 bit only; inline ASM isn't implemented in the - * 64 bit compiler */ -#if defined(_MSC_VER) && !defined(_WIN64) && !defined(_WIN32_WCE) -# define VORBIS_FPU_CONTROL - -typedef ogg_int16_t vorbis_fpu_control; - -static __inline int vorbis_ftoi(double f){ - int i; - __asm{ - fld f - fistp i - } - return i; -} - -static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){ -} - -static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ -} - -#endif /* Special MSVC 32 bit implementation */ - - -/* Optimized code path for x86_64 builds. Uses SSE2 intrinsics. This can be - done safely because all x86_64 CPUs supports SSE2. */ -#if (defined(_MSC_VER) && defined(_WIN64)) || (defined(__GNUC__) && defined (__x86_64__)) -# define VORBIS_FPU_CONTROL - -typedef ogg_int16_t vorbis_fpu_control; - -#include -static __inline int vorbis_ftoi(double f){ - return _mm_cvtsd_si32(_mm_load_sd(&f)); -} - -static __inline void vorbis_fpu_setround(vorbis_fpu_control*){ -} - -static __inline void vorbis_fpu_restore(vorbis_fpu_control){ -} - -#endif /* Special MSVC x64 implementation */ - - -/* If no special implementation was found for the current compiler / platform, - use the default implementation here: */ -#ifndef VORBIS_FPU_CONTROL - -typedef int vorbis_fpu_control; - -static int vorbis_ftoi(double f){ - /* Note: MSVC and GCC (at least on some systems) round towards zero, thus, - the floor() call is required to ensure correct roudning of - negative numbers */ - return (int)floor(f+.5); -} - -/* We don't have special code for this compiler/arch, so do it the slow way */ -# define vorbis_fpu_setround(vorbis_fpu_control) {} -# define vorbis_fpu_restore(vorbis_fpu_control) {} - -#endif /* default implementation */ - -#endif /* _OS_H */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c deleted file mode 100755 index a60f88f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.c +++ /dev/null @@ -1,1205 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: psychoacoustics not including preecho - last mod: $Id: psy.c 17569 2010-10-26 17:09:47Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include -#include "../../codec.h" -#include "codec_internal.h" - -#include "masking.h" -#include "psy.h" -#include "os.h" -#include "lpc.h" -#include "smallft.h" -#include "scales.h" -#include "misc.h" - -#define NEGINF -9999.f -static const double stereo_threshholds[]={0.0, .5, 1.0, 1.5, 2.5, 4.5, 8.5, 16.5, 9e10}; -static const double stereo_threshholds_limited[]={0.0, .5, 1.0, 1.5, 2.0, 2.5, 4.5, 8.5, 9e10}; - -vorbis_look_psy_global *_vp_global_look(vorbis_info *vi){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy_global *gi=&ci->psy_g_param; - vorbis_look_psy_global *look=(vorbis_look_psy_global*)_ogg_calloc(1,sizeof(*look)); - - look->channels=vi->channels; - - look->ampmax=-9999.; - look->gi=gi; - return(look); -} - -void _vp_global_free(vorbis_look_psy_global *look){ - if(look){ - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -static inline void _vi_gpsy_free(vorbis_info_psy_global *i){ - if(i){ - memset(i,0,sizeof(*i)); - _ogg_free(i); - } -} - -void _vi_psy_free(vorbis_info_psy *i){ - if(i){ - memset(i,0,sizeof(*i)); - _ogg_free(i); - } -} - -static void min_curve(float *c, - float *c2){ - int i; - for(i=0;ic[i])c[i]=c2[i]; -} - -static void attenuate_curve(float *c,float att){ - int i; - for(i=0;iATH[j+k+ath_offset])min=ATH[j+k+ath_offset]; - }else{ - if(min>ATH[MAX_ATH-1])min=ATH[MAX_ATH-1]; - } - ath[j]=min; - } - - /* copy curves into working space, replicate the 50dB curve to 30 - and 40, replicate the 100dB curve to 110 */ - for(j=0;j<6;j++) - memcpy(workc[i][j+2],tonemasks[i][j],EHMER_MAX*sizeof(*tonemasks[i][j])); - memcpy(workc[i][0],tonemasks[i][0],EHMER_MAX*sizeof(*tonemasks[i][0])); - memcpy(workc[i][1],tonemasks[i][0],EHMER_MAX*sizeof(*tonemasks[i][0])); - - /* apply centered curve boost/decay */ - for(j=0;j0)adj=0.; - if(adj>0. && center_boost<0)adj=0.; - workc[i][j][k]+=adj; - } - } - - /* normalize curves so the driving amplitude is 0dB */ - /* make temp curves with the ATH overlayed */ - for(j=0;j an eighth of an octave and that the eighth - octave values may also be composited. */ - - /* which octave curves will we be compositing? */ - bin=floor(fromOC(i*.5)/binHz); - lo_curve= ceil(toOC(bin*binHz+1)*2); - hi_curve= floor(toOC((bin+1)*binHz)*2); - if(lo_curve>i)lo_curve=i; - if(lo_curve<0)lo_curve=0; - if(hi_curve>=P_BANDS)hi_curve=P_BANDS-1; - - for(m=0;mn)lo_bin=n; - if(lo_binn)hi_bin=n; - - for(;lworkc[k][m][j]) - brute_buffer[l]=workc[k][m][j]; - } - - for(;lworkc[k][m][EHMER_MAX-1]) - brute_buffer[l]=workc[k][m][EHMER_MAX-1]; - - } - - /* be equally paranoid about being valid up to next half ocatve */ - if(i+1n)lo_bin=n; - if(lo_binn)hi_bin=n; - - for(;lworkc[k][m][j]) - brute_buffer[l]=workc[k][m][j]; - } - - for(;lworkc[k][m][EHMER_MAX-1]) - brute_buffer[l]=workc[k][m][EHMER_MAX-1]; - - } - - - for(j=0;j=n){ - ret[i][m][j+2]=-999.; - }else{ - ret[i][m][j+2]=brute_buffer[bin]; - } - } - } - - /* add fenceposts */ - for(j=0;j-200.f)break; - ret[i][m][0]=j; - - for(j=EHMER_MAX-1;j>EHMER_OFFSET+1;j--) - if(ret[i][m][j+2]>-200.f) - break; - ret[i][m][1]=j; - - } - } - - return(ret); -} - -void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi, - vorbis_info_psy_global *gi,int n,long rate){ - long i,j,lo=-99,hi=1; - long maxoc; - memset(p,0,sizeof(*p)); - - p->eighth_octave_lines=gi->eighth_octave_lines; - p->shiftoc=rint(log(gi->eighth_octave_lines*8.f)/log(2.f))-1; - - p->firstoc=toOC(.25f*rate*.5/n)*(1<<(p->shiftoc+1))-gi->eighth_octave_lines; - maxoc=toOC((n+.25f)*rate*.5/n)*(1<<(p->shiftoc+1))+.5f; - p->total_octave_lines=maxoc-p->firstoc+1; - p->ath=(float*)_ogg_malloc(n*sizeof(*p->ath)); - - p->octave=(long*)_ogg_malloc(n*sizeof(*p->octave)); - p->bark=(long*)_ogg_malloc(n*sizeof(*p->bark)); - p->vi=vi; - p->n=n; - p->rate=rate; - - /* AoTuV HF weighting */ - p->m_val = 1.; - if(rate < 26000) p->m_val = 0; - else if(rate < 38000) p->m_val = .94; /* 32kHz */ - else if(rate > 46000) p->m_val = 1.275; /* 48kHz */ - - /* set up the lookups for a given blocksize and sample rate */ - - for(i=0,j=0;iath[j]=base+100.; - base+=delta; - } - } - } - - for(;jath[j]=p->ath[j-1]; - } - - for(i=0;inoisewindowlominnoisewindowlo);lo++); - - for(;hi<=n && (hinoisewindowhimin || - toBARK(rate/(2*n)*hi)<(bark+vi->noisewindowhi));hi++); - - p->bark[i]=((lo-1)<<16)+(hi-1); - - } - - for(i=0;ioctave[i]=toOC((i+.25f)*.5*rate/n)*(1<<(p->shiftoc+1))+.5f; - - p->tonecurves=setup_tone_curves(vi->toneatt,rate*.5/n,n, - vi->tone_centerboost,vi->tone_decay); - - /* set up rolling noise median */ - p->noiseoffset=(float**)_ogg_malloc(P_NOISECURVES*sizeof(*p->noiseoffset)); - for(i=0;inoiseoffset[i]=(float*)_ogg_malloc(n*sizeof(**p->noiseoffset)); - - for(i=0;i=P_BANDS-1)halfoc=P_BANDS-1; - inthalfoc=(int)halfoc; - del=halfoc-inthalfoc; - - for(j=0;jnoiseoffset[j][i]= - p->vi->noiseoff[j][inthalfoc]*(1.-del) + - p->vi->noiseoff[j][inthalfoc+1]*del; - - } -#if 0 - { - static int ls=0; - _analysis_output_always("noiseoff0",ls,p->noiseoffset[0],n,1,0,0); - _analysis_output_always("noiseoff1",ls,p->noiseoffset[1],n,1,0,0); - _analysis_output_always("noiseoff2",ls++,p->noiseoffset[2],n,1,0,0); - } -#endif -} - -void _vp_psy_clear(vorbis_look_psy *p){ - int i,j; - if(p){ - if(p->ath)_ogg_free(p->ath); - if(p->octave)_ogg_free(p->octave); - if(p->bark)_ogg_free(p->bark); - if(p->tonecurves){ - for(i=0;itonecurves[i][j]); - } - _ogg_free(p->tonecurves[i]); - } - _ogg_free(p->tonecurves); - } - if(p->noiseoffset){ - for(i=0;inoiseoffset[i]); - } - _ogg_free(p->noiseoffset); - } - memset(p,0,sizeof(*p)); - } -} - -/* octave/(8*eighth_octave_lines) x scale and dB y scale */ -static void seed_curve(float *seed, - const float **curves, - float amp, - int oc, int n, - int linesper,float dBoffset){ - int i,post1; - int seedptr; - const float *posts,*curve; - - int choice=(int)((amp+dBoffset-P_LEVEL_0)*.1f); - choice=max(choice,0); - choice=min(choice,P_LEVELS-1); - posts=curves[choice]; - curve=posts+2; - post1=(int)posts[1]; - seedptr=oc+(posts[0]-EHMER_OFFSET)*linesper-(linesper>>1); - - for(i=posts[0];i0){ - float lin=amp+curve[i]; - if(seed[seedptr]=n)break; - } -} - -static void seed_loop(vorbis_look_psy *p, - const float ***curves, - const float *f, - const float *flr, - float *seed, - float specmax){ - vorbis_info_psy *vi=p->vi; - long n=p->n,i; - float dBoffset=vi->max_curve_dB-specmax; - - /* prime the working vector with peak values */ - - for(i=0;ioctave[i]; - while(i+1octave[i+1]==oc){ - i++; - if(f[i]>max)max=f[i]; - } - - if(max+6.f>flr[i]){ - oc=oc>>p->shiftoc; - - if(oc>=P_BANDS)oc=P_BANDS-1; - if(oc<0)oc=0; - - seed_curve(seed, - curves[oc], - max, - p->octave[i]-p->firstoc, - p->total_octave_lines, - p->eighth_octave_lines, - dBoffset); - } - } -} - -static void seed_chase(float *seeds, int linesper, long n){ - long *posstack=(long*)alloca(n*sizeof(*posstack)); - float *ampstack=(float*)alloca(n*sizeof(*ampstack)); - long stack=0; - long pos=0; - long i; - - for(i=0;i1 && ampstack[stack-1]<=ampstack[stack-2] && - iampstack[i]){ - endpos=posstack[i+1]; - }else{ - endpos=posstack[i]+linesper+1; /* +1 is important, else bin 0 is - discarded in short frames */ - } - if(endpos>n)endpos=n; - for(;pos -static void max_seeds(vorbis_look_psy *p, - float *seed, - float *flr){ - long n=p->total_octave_lines; - int linesper=p->eighth_octave_lines; - long linpos=0; - long pos; - - seed_chase(seed,linesper,n); /* for masking */ - - pos=p->octave[0]-p->firstoc-(linesper>>1); - - while(linpos+1n){ - float minV=seed[pos]; - long end=((p->octave[linpos]+p->octave[linpos+1])>>1)-p->firstoc; - if(minV>p->vi->tone_abs_limit)minV=p->vi->tone_abs_limit; - while(pos+1<=end){ - pos++; - if((seed[pos]>NEGINF && seed[pos]firstoc; - for(;linposn && p->octave[linpos]<=end;linpos++) - if(flr[linpos]total_octave_lines-1]; - for(;linposn;linpos++) - if(flr[linpos]> 16; - if( lo>=0 ) break; - hi = b[i] & 0xffff; - - tN = N[hi] + N[-lo]; - tX = X[hi] - X[-lo]; - tXX = XX[hi] + XX[-lo]; - tY = Y[hi] + Y[-lo]; - tXY = XY[hi] - XY[-lo]; - - A = tY * tXX - tX * tXY; - B = tN * tXY - tX * tY; - D = tN * tXX - tX * tX; - R = (A + x * B) / D; - if (R < 0.f) - R = 0.f; - - noise[i] = R - offset; - } - - for ( ;; i++, x += 1.f) { - - lo = b[i] >> 16; - hi = b[i] & 0xffff; - if(hi>=n)break; - - tN = N[hi] - N[lo]; - tX = X[hi] - X[lo]; - tXX = XX[hi] - XX[lo]; - tY = Y[hi] - Y[lo]; - tXY = XY[hi] - XY[lo]; - - A = tY * tXX - tX * tXY; - B = tN * tXY - tX * tY; - D = tN * tXX - tX * tX; - R = (A + x * B) / D; - if (R < 0.f) R = 0.f; - - noise[i] = R - offset; - } - for ( ; i < n; i++, x += 1.f) { - - R = (A + x * B) / D; - if (R < 0.f) R = 0.f; - - noise[i] = R - offset; - } - - if (fixed <= 0) return; - - for (i = 0, x = 0.f;; i++, x += 1.f) { - hi = i + fixed / 2; - lo = hi - fixed; - if(lo>=0)break; - - tN = N[hi] + N[-lo]; - tX = X[hi] - X[-lo]; - tXX = XX[hi] + XX[-lo]; - tY = Y[hi] + Y[-lo]; - tXY = XY[hi] - XY[-lo]; - - - A = tY * tXX - tX * tXY; - B = tN * tXY - tX * tY; - D = tN * tXX - tX * tX; - R = (A + x * B) / D; - - if (R - offset < noise[i]) noise[i] = R - offset; - } - for ( ;; i++, x += 1.f) { - - hi = i + fixed / 2; - lo = hi - fixed; - if(hi>=n)break; - - tN = N[hi] - N[lo]; - tX = X[hi] - X[lo]; - tXX = XX[hi] - XX[lo]; - tY = Y[hi] - Y[lo]; - tXY = XY[hi] - XY[lo]; - - A = tY * tXX - tX * tXY; - B = tN * tXY - tX * tY; - D = tN * tXX - tX * tX; - R = (A + x * B) / D; - - if (R - offset < noise[i]) noise[i] = R - offset; - } - for ( ; i < n; i++, x += 1.f) { - R = (A + x * B) / D; - if (R - offset < noise[i]) noise[i] = R - offset; - } -} - -void _vp_noisemask(vorbis_look_psy *p, - float *logmdct, - float *logmask){ - - int i,n=p->n; - float *work=(float*) alloca(n*sizeof(*work)); - - bark_noise_hybridmp(n,p->bark,logmdct,logmask, - 140.,-1); - - for(i=0;ibark,work,logmask,0., - p->vi->noisewindowfixed); - - for(i=0;i=NOISE_COMPAND_LEVELS)dB=NOISE_COMPAND_LEVELS-1; - if(dB<0)dB=0; - logmask[i]= work[i]+p->vi->noisecompand[dB]; - } - -} - -void _vp_tonemask(vorbis_look_psy *p, - float *logfft, - float *logmask, - float global_specmax, - float local_specmax){ - - int i,n=p->n; - - float *seed=(float*) alloca(sizeof(*seed)*p->total_octave_lines); - float att=local_specmax+p->vi->ath_adjatt; - for(i=0;itotal_octave_lines;i++)seed[i]=NEGINF; - - /* set the ATH (floating below localmax, not global max by a - specified att) */ - if(attvi->ath_maxatt)att=p->vi->ath_maxatt; - - for(i=0;iath[i]+att; - - /* tone masking */ - seed_loop(p,(const float ***)p->tonecurves,logfft,logmask,seed,global_specmax); - max_seeds(p,seed,logmask); - -} - -void _vp_offset_and_mix(vorbis_look_psy *p, - float *noise, - float *tone, - int offset_select, - float *logmask, - float *mdct, - float *logmdct){ - int i,n=p->n; - float de, coeffi, cx;/* AoTuV */ - float toneatt=p->vi->tone_masteratt[offset_select]; - - cx = p->m_val; - - for(i=0;inoiseoffset[offset_select][i]; - if(val>p->vi->noisemaxsupp)val=p->vi->noisemaxsupp; - logmask[i]=max(val,tone[i]+toneatt); - - - /* AoTuV */ - /** @ M1 ** - The following codes improve a noise problem. - A fundamental idea uses the value of masking and carries out - the relative compensation of the MDCT. - However, this code is not perfect and all noise problems cannot be solved. - by Aoyumi @ 2004/04/18 - */ - - if(offset_select == 1) { - coeffi = -17.2; /* coeffi is a -17.2dB threshold */ - val = val - logmdct[i]; /* val == mdct line value relative to floor in dB */ - - if(val > coeffi){ - /* mdct value is > -17.2 dB below floor */ - - de = 1.0-((val-coeffi)*0.005*cx); - /* pro-rated attenuation: - -0.00 dB boost if mdct value is -17.2dB (relative to floor) - -0.77 dB boost if mdct value is 0dB (relative to floor) - -1.64 dB boost if mdct value is +17.2dB (relative to floor) - etc... */ - - if(de < 0) de = 0.0001; - }else - /* mdct value is <= -17.2 dB below floor */ - - de = 1.0-((val-coeffi)*0.0003*cx); - /* pro-rated attenuation: - +0.00 dB atten if mdct value is -17.2dB (relative to floor) - +0.45 dB atten if mdct value is -34.4dB (relative to floor) - etc... */ - - mdct[i] *= de; - - } - } -} - -float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd){ - vorbis_info *vi=vd->vi; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy_global *gi=&ci->psy_g_param; - - int n=ci->blocksizes[vd->W]/2; - float secs=(float)n/vi->rate; - - amp+=secs*gi->ampmax_att_per_sec; - if(amp<-9999)amp=-9999; - return(amp); -} - -#if 0 -static float FLOOR1_fromdB_LOOKUP[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.128753e-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.F, -}; -#endif - -/* this is for per-channel noise normalization */ -static int apsort(const void *a, const void *b){ - float f1=**(float**)a; - float f2=**(float**)b; - return (f1f2); -} - -static void flag_lossless(int limit, float prepoint, float postpoint, float *mdct, - float *floor, int *flag, int i, int jn){ - int j; - for(j=0;j=limit-i ? postpoint : prepoint; - float r = fabs(mdct[j])/floor[j]; - if(rvi; - float **sort = (float**)alloca(n*sizeof(*sort)); - int j,count=0; - int start = (vi->normal_p ? vi->normal_start-i : n); - if(start>n)start=n; - - /* force classic behavior where only energy in the current band is considered */ - acc=0.f; - - /* still responsible for populating *out where noise norm not in - effect. There's no need to [re]populate *q in these areas */ - for(j=0;j pointlimit */ - if(ve<.25f && (!flags || j>=limit-i)){ - acc += ve; - sort[count++]=q+j; /* q is fabs(r) for unflagged element */ - }else{ - /* For now: no acc adjustment for nonzero quantization. populate *out and q as this value is final. */ - if(r[j]<0) - out[j] = -rint(sqrt(ve)); - else - out[j] = rint(sqrt(ve)); - q[j] = out[j]*out[j]*f[j]; - } - }/* else{ - again, no energy adjustment for error in nonzero quant-- for now - }*/ - } - - if(count){ - /* noise norm to do */ - qsort(sort,count,sizeof(*sort),apsort); - for(j=0;j=vi->normal_thresh){ - out[k]=unitnorm(r[k]); - acc-=1.f; - q[k]=f[k]; - }else{ - out[k]=0; - q[k]=0.f; - } - } - } - - return acc; -} - -/* Noise normalization, quantization and coupling are not wholly - seperable processes in depth>1 coupling. */ -void _vp_couple_quantize_normalize(int blobno, - vorbis_info_psy_global *g, - vorbis_look_psy *p, - vorbis_info_mapping0 *vi, - float **mdct, - int **iwork, - int *nonzero, - int sliding_lowpass, - int ch){ - - int i; - int n = p->n; - int partition=(p->vi->normal_p ? p->vi->normal_partition : 16); - int limit = g->coupling_pointlimit[p->vi->blockflag][blobno]; - float prepoint=stereo_threshholds[g->coupling_prepointamp[blobno]]; - float postpoint=stereo_threshholds[g->coupling_postpointamp[blobno]]; - //float de=0.1*p->m_val; /* a blend of the AoTuV M2 and M3 code here and below */ - - /* mdct is our raw mdct output, floor not removed. */ - /* inout passes in the ifloor, passes back quantized result */ - - /* unquantized energy (negative indicates amplitude has negative sign) */ - float **raw = (float**)alloca(ch*sizeof(*raw)); - - /* dual pupose; quantized energy (if flag set), othersize fabs(raw) */ - float **quant = (float**)alloca(ch*sizeof(*quant)); - - /* floor energy */ - float **floor = (float**)alloca(ch*sizeof(*floor)); - - /* flags indicating raw/quantized status of elements in raw vector */ - int **flag = (int**)alloca(ch*sizeof(*flag)); - - /* non-zero flag working vector */ - int *nz = (int*)alloca(ch*sizeof(*nz)); - - /* energy surplus/defecit tracking */ - float *acc = (float*)alloca((ch+vi->coupling_steps)*sizeof(*acc)); - - /* The threshold of a stereo is changed with the size of n */ - if(n > 1000) - postpoint=stereo_threshholds_limited[g->coupling_postpointamp[blobno]]; - - raw[0] = (float*)alloca(ch*partition*sizeof(**raw)); - quant[0] = (float*)alloca(ch*partition*sizeof(**quant)); - floor[0] = (float*)alloca(ch*partition*sizeof(**floor)); - flag[0] = (int*)alloca(ch*partition*sizeof(**flag)); - - for(i=1;icoupling_steps;i++) - acc[i]=0.f; - - for(i=0;i n-i ? n-i : partition; - int step,track = 0; - - memcpy(nz,nonzero,sizeof(*nz)*ch); - - /* prefill */ - memset(flag[0],0,ch*partition*sizeof(**flag)); - for(k=0;kcoupling_steps;step++){ - int Mi = vi->coupling_mag[step]; - int Ai = vi->coupling_ang[step]; - int *iM = &iwork[Mi][i]; - int *iA = &iwork[Ai][i]; - float *reM = raw[Mi]; - float *reA = raw[Ai]; - float *qeM = quant[Mi]; - float *qeA = quant[Ai]; - float *floorM = floor[Mi]; - float *floorA = floor[Ai]; - int *fM = flag[Mi]; - int *fA = flag[Ai]; - - if(nz[Mi] || nz[Ai]){ - nz[Mi] = nz[Ai] = 1; - - for(j=0;jabs(B)){ - iA[j]=(A>0?A-B:B-A); - }else{ - iA[j]=(B>0?A-B:B-A); - iM[j]=B; - } - - /* collapse two equivalent tuples to one */ - if(iA[j]>=abs(iM[j])*2){ - iA[j]= -iA[j]; - iM[j]= -iM[j]; - } - - } - - }else{ - /* lossy (point) coupling */ - if(jcoupling_steps;i++){ - /* make sure coupling a zero and a nonzero channel results in two - nonzero channels. */ - if(nonzero[vi->coupling_mag[i]] || - nonzero[vi->coupling_ang[i]]){ - nonzero[vi->coupling_mag[i]]=1; - nonzero[vi->coupling_ang[i]]=1; - } - } -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h deleted file mode 100755 index fd7201f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/psy.h +++ /dev/null @@ -1,154 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: random psychoacoustics (not including preecho) - last mod: $Id: psy.h 16946 2010-03-03 16:12:40Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_PSY_H_ -#define _V_PSY_H_ -#include "smallft.h" - -#include "backends.h" -#include "envelope.h" - -#ifndef EHMER_MAX -#define EHMER_MAX 56 -#endif - -/* psychoacoustic setup ********************************************/ -#define P_BANDS 17 /* 62Hz to 16kHz */ -#define P_LEVELS 8 /* 30dB to 100dB */ -#define P_LEVEL_0 30. /* 30 dB */ -#define P_NOISECURVES 3 - -#define NOISE_COMPAND_LEVELS 40 -typedef struct vorbis_info_psy{ - int blockflag; - - float ath_adjatt; - float ath_maxatt; - - float tone_masteratt[P_NOISECURVES]; - float tone_centerboost; - float tone_decay; - float tone_abs_limit; - float toneatt[P_BANDS]; - - int noisemaskp; - float noisemaxsupp; - float noisewindowlo; - float noisewindowhi; - int noisewindowlomin; - int noisewindowhimin; - int noisewindowfixed; - float noiseoff[P_NOISECURVES][P_BANDS]; - float noisecompand[NOISE_COMPAND_LEVELS]; - - float max_curve_dB; - - int normal_p; - int normal_start; - int normal_partition; - double normal_thresh; -} vorbis_info_psy; - -typedef struct{ - int eighth_octave_lines; - - /* for block long/short tuning; encode only */ - float preecho_thresh[VE_BANDS]; - float postecho_thresh[VE_BANDS]; - float stretch_penalty; - float preecho_minenergy; - - float ampmax_att_per_sec; - - /* channel coupling config */ - int coupling_pkHz[PACKETBLOBS]; - int coupling_pointlimit[2][PACKETBLOBS]; - int coupling_prepointamp[PACKETBLOBS]; - int coupling_postpointamp[PACKETBLOBS]; - int sliding_lowpass[2][PACKETBLOBS]; - -} vorbis_info_psy_global; - -typedef struct { - float ampmax; - int channels; - - vorbis_info_psy_global *gi; - int coupling_pointlimit[2][P_NOISECURVES]; -} vorbis_look_psy_global; - - -typedef struct { - int n; - struct vorbis_info_psy *vi; - - float ***tonecurves; - float **noiseoffset; - - float *ath; - long *octave; /* in n.ocshift format */ - long *bark; - - long firstoc; - long shiftoc; - int eighth_octave_lines; /* power of two, please */ - int total_octave_lines; - long rate; /* cache it */ - - float m_val; /* Masking compensation value */ - -} vorbis_look_psy; - -extern void _vp_psy_init(vorbis_look_psy *p,vorbis_info_psy *vi, - vorbis_info_psy_global *gi,int n,long rate); -extern void _vp_psy_clear(vorbis_look_psy *p); -extern void *_vi_psy_dup(void *source); - -extern void _vi_psy_free(vorbis_info_psy *i); -extern vorbis_info_psy *_vi_psy_copy(vorbis_info_psy *i); - -extern void _vp_noisemask(vorbis_look_psy *p, - float *logmdct, - float *logmask); - -extern void _vp_tonemask(vorbis_look_psy *p, - float *logfft, - float *logmask, - float global_specmax, - float local_specmax); - -extern void _vp_offset_and_mix(vorbis_look_psy *p, - float *noise, - float *tone, - int offset_select, - float *logmask, - float *mdct, - float *logmdct); - -extern float _vp_ampmax_decay(float amp,vorbis_dsp_state *vd); - -extern void _vp_couple_quantize_normalize(int blobno, - vorbis_info_psy_global *g, - vorbis_look_psy *p, - vorbis_info_mapping0 *vi, - float **mdct, - int **iwork, - int *nonzero, - int sliding_lowpass, - int ch); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c deleted file mode 100755 index c783878..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.c +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: registry for time, floor, res backends and channel mappings - last mod: $Id: registry.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#include "../../codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "misc.h" -/* seems like major overkill now; the backend numbers will grow into - the infrastructure soon enough */ - -extern const vorbis_func_floor floor0_exportbundle; -extern const vorbis_func_floor floor1_exportbundle; -extern const vorbis_func_residue residue0_exportbundle; -extern const vorbis_func_residue residue1_exportbundle; -extern const vorbis_func_residue residue2_exportbundle; -extern const vorbis_func_mapping mapping0_exportbundle; - -const vorbis_func_floor *const _floor_P[]={ - &floor0_exportbundle, - &floor1_exportbundle, -}; - -const vorbis_func_residue *const _residue_P[]={ - &residue0_exportbundle, - &residue1_exportbundle, - &residue2_exportbundle, -}; - -const vorbis_func_mapping *const _mapping_P[]={ - &mapping0_exportbundle, -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h deleted file mode 100755 index 3c2497f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/registry.h +++ /dev/null @@ -1,32 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: registry for time, floor, res backends and channel mappings - last mod: $Id: registry.h 15531 2008-11-24 23:50:06Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_REG_H_ -#define _V_REG_H_ - -#define VI_TRANSFORMB 1 -#define VI_WINDOWB 1 -#define VI_TIMEB 1 -#define VI_FLOORB 2 -#define VI_RESB 3 -#define VI_MAPB 1 - -extern const vorbis_func_floor *const _floor_P[]; -extern const vorbis_func_residue *const _residue_P[]; -extern const vorbis_func_mapping *const _mapping_P[]; - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c deleted file mode 100755 index 67cfe13..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/res0.c +++ /dev/null @@ -1,891 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2010 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: residue backend 0, 1 and 2 implementation - last mod: $Id: res0.c 17556 2010-10-21 18:25:19Z tterribe $ - - ********************************************************************/ - -/* Slow, slow, slow, simpleminded and did I mention it was slow? The - encode/decode loops are coded for clarity and performance is not - yet even a nagging little idea lurking in the shadows. Oh and BTW, - it's slow. */ - -#include -#include -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "codebook.h" -#include "misc.h" -#include "os.h" - -//#define TRAIN_RES 1 -//#define TRAIN_RESAUX 1 - -#if defined(TRAIN_RES) || defined (TRAIN_RESAUX) -#include -#endif - -typedef struct { - vorbis_info_residue0 *info; - - int parts; - int stages; - codebook *fullbooks; - codebook *phrasebook; - codebook ***partbooks; - - int partvals; - int **decodemap; - - long postbits; - long phrasebits; - long frames; - -#if defined(TRAIN_RES) || defined(TRAIN_RESAUX) - int train_seq; - long *training_data[8][64]; - float training_max[8][64]; - float training_min[8][64]; - float tmin; - float tmax; - int submap; -#endif - -} vorbis_look_residue0; - -static void res0_free_info(vorbis_info_residue *i){ - vorbis_info_residue0 *info=(vorbis_info_residue0 *)i; - if(info){ - memset(info,0,sizeof(*info)); - _ogg_free(info); - } -} - -static void res0_free_look(vorbis_look_residue *i){ - int j; - if(i){ - - vorbis_look_residue0 *look=(vorbis_look_residue0 *)i; - -#ifdef TRAIN_RES - { - int j,k,l; - for(j=0;jparts;j++){ - /*fprintf(stderr,"partition %d: ",j);*/ - for(k=0;k<8;k++) - if(look->training_data[k][j]){ - char buffer[80]; - FILE *of; - codebook *statebook=look->partbooks[j][k]; - - /* long and short into the same bucket by current convention */ - sprintf(buffer,"res_sub%d_part%d_pass%d.vqd",look->submap,j,k); - of=fopen(buffer,"a"); - - for(l=0;lentries;l++) - fprintf(of,"%d:%ld\n",l,look->training_data[k][j][l]); - - fclose(of); - - /*fprintf(stderr,"%d(%.2f|%.2f) ",k, - look->training_min[k][j],look->training_max[k][j]);*/ - - _ogg_free(look->training_data[k][j]); - look->training_data[k][j]=NULL; - } - /*fprintf(stderr,"\n");*/ - } - } - fprintf(stderr,"min/max residue: %g::%g\n",look->tmin,look->tmax); - - /*fprintf(stderr,"residue bit usage %f:%f (%f total)\n", - (float)look->phrasebits/look->frames, - (float)look->postbits/look->frames, - (float)(look->postbits+look->phrasebits)/look->frames);*/ -#endif - - - /*vorbis_info_residue0 *info=look->info; - - fprintf(stderr, - "%ld frames encoded in %ld phrasebits and %ld residue bits " - "(%g/frame) \n",look->frames,look->phrasebits, - look->resbitsflat, - (look->phrasebits+look->resbitsflat)/(float)look->frames); - - for(j=0;jparts;j++){ - long acc=0; - fprintf(stderr,"\t[%d] == ",j); - for(k=0;kstages;k++) - if((info->secondstages[j]>>k)&1){ - fprintf(stderr,"%ld,",look->resbits[j][k]); - acc+=look->resbits[j][k]; - } - - fprintf(stderr,":: (%ld vals) %1.2fbits/sample\n",look->resvals[j], - acc?(float)acc/(look->resvals[j]*info->grouping):0); - } - fprintf(stderr,"\n");*/ - - for(j=0;jparts;j++) - if(look->partbooks[j])_ogg_free(look->partbooks[j]); - _ogg_free(look->partbooks); - for(j=0;jpartvals;j++) - _ogg_free(look->decodemap[j]); - _ogg_free(look->decodemap); - - memset(look,0,sizeof(*look)); - _ogg_free(look); - } -} - -#if 0 -static int ilog(unsigned int v){ - int ret=0; - while(v){ - ret++; - v>>=1; - } - return(ret); -} -#endif - -static int icount(unsigned int v){ - int ret=0; - while(v){ - ret+=v&1; - v>>=1; - } - return(ret); -} - - -static void res0_pack(vorbis_info_residue *vr,oggpack_buffer *opb){ - vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr; - int j,acc=0; - oggpack_write(opb,info->begin,24); - oggpack_write(opb,info->end,24); - - oggpack_write(opb,info->grouping-1,24); /* residue vectors to group and - code with a partitioned book */ - oggpack_write(opb,info->partitions-1,6); /* possible partition choices */ - oggpack_write(opb,info->groupbook,8); /* group huffman book */ - - /* secondstages is a bitmask; as encoding progresses pass by pass, a - bitmask of one indicates this partition class has bits to write - this pass */ - for(j=0;jpartitions;j++){ - if(ilog(info->secondstages[j])>3){ - /* yes, this is a minor hack due to not thinking ahead */ - oggpack_write(opb,info->secondstages[j],3); - oggpack_write(opb,1,1); - oggpack_write(opb,info->secondstages[j]>>3,5); - }else - oggpack_write(opb,info->secondstages[j],4); /* trailing zero */ - acc+=icount(info->secondstages[j]); - } - for(j=0;jbooklist[j],8); - -} - -/* vorbis_info is for range checking */ -static vorbis_info_residue *res0_unpack(vorbis_info *vi,oggpack_buffer *opb){ - int j,acc=0; - vorbis_info_residue0 *info=(vorbis_info_residue0*) _ogg_calloc(1,sizeof(*info)); - codec_setup_info *ci=(codec_setup_info*) vi->codec_setup; - - info->begin=oggpack_read(opb,24); - info->end=oggpack_read(opb,24); - info->grouping=oggpack_read(opb,24)+1; - info->partitions=oggpack_read(opb,6)+1; - info->groupbook=oggpack_read(opb,8); - - /* check for premature EOP */ - if(info->groupbook<0)goto errout; - - for(j=0;jpartitions;j++){ - int cascade=oggpack_read(opb,3); - int cflag=oggpack_read(opb,1); - if(cflag<0) goto errout; - if(cflag){ - int c=oggpack_read(opb,5); - if(c<0) goto errout; - cascade|=(c<<3); - } - info->secondstages[j]=cascade; - - acc+=icount(cascade); - } - for(j=0;jbooklist[j]=book; - } - - if(info->groupbook>=ci->books)goto errout; - for(j=0;jbooklist[j]>=ci->books)goto errout; - if(ci->book_param[info->booklist[j]]->maptype==0)goto errout; - } - - /* verify the phrasebook is not specifying an impossible or - inconsistent partitioning scheme. */ - /* modify the phrasebook ranging check from r16327; an early beta - encoder had a bug where it used an oversized phrasebook by - accident. These files should continue to be playable, but don't - allow an exploit */ - { - int entries = ci->book_param[info->groupbook]->entries; - int dim = ci->book_param[info->groupbook]->dim; - int partvals = 1; - if (dim<1) goto errout; - while(dim>0){ - partvals *= info->partitions; - if(partvals > entries) goto errout; - dim--; - } - info->partvals = partvals; - } - - return(info); - errout: - res0_free_info(info); - return(NULL); -} - -static vorbis_look_residue *res0_look(vorbis_dsp_state *vd, - vorbis_info_residue *vr){ - vorbis_info_residue0 *info=(vorbis_info_residue0 *)vr; - vorbis_look_residue0 *look=(vorbis_look_residue0 *)_ogg_calloc(1,sizeof(*look)); - codec_setup_info *ci=(codec_setup_info*)vd->vi->codec_setup; - - int j,k,acc=0; - int dim; - int maxstage=0; - look->info=info; - - look->parts=info->partitions; - look->fullbooks=ci->fullbooks; - look->phrasebook=ci->fullbooks+info->groupbook; - dim=look->phrasebook->dim; - - look->partbooks=(codebook***)_ogg_calloc(look->parts,sizeof(*look->partbooks)); - - for(j=0;jparts;j++){ - int stages=ilog(info->secondstages[j]); - if(stages){ - if(stages>maxstage)maxstage=stages; - look->partbooks[j]=(codebook**) _ogg_calloc(stages,sizeof(*look->partbooks[j])); - for(k=0;ksecondstages[j]&(1<partbooks[j][k]=ci->fullbooks+info->booklist[acc++]; -#ifdef TRAIN_RES - look->training_data[k][j]=_ogg_calloc(look->partbooks[j][k]->entries, - sizeof(***look->training_data)); -#endif - } - } - } - - look->partvals=1; - for(j=0;jpartvals*=look->parts; - - look->stages=maxstage; - look->decodemap=(int**)_ogg_malloc(look->partvals*sizeof(*look->decodemap)); - for(j=0;jpartvals;j++){ - long val=j; - long mult=look->partvals/look->parts; - look->decodemap[j]=(int*)_ogg_malloc(dim*sizeof(*look->decodemap[j])); - for(k=0;kparts; - look->decodemap[j][k]=deco; - } - } -#if defined(TRAIN_RES) || defined (TRAIN_RESAUX) - { - static int train_seq=0; - look->train_seq=train_seq++; - } -#endif - return(look); -} - -/* break an abstraction and copy some code for performance purposes */ -static int local_book_besterror(codebook *book,int *a){ - int dim=book->dim; - int i,j,o; - int minval=book->minval; - int del=book->delta; - int qv=book->quantvals; - int ze=(qv>>1); - int index=0; - /* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */ - int p[8]={0,0,0,0,0,0,0,0}; - - if(del!=1){ - for(i=0,o=dim;i>1))/del; - int m = (v=qv?qv-1:m)); - p[o]=v*del+minval; - } - }else{ - for(i=0,o=dim;i=qv?qv-1:m)); - p[o]=v*del+minval; - } - } - - if(book->c->lengthlist[index]<=0){ - const static_codebook *c=book->c; - int best=-1; - /* assumes integer/centered encoder codebook maptype 1 no more than dim 8 */ - int e[8]={0,0,0,0,0,0,0,0}; - int maxval = book->minval + book->delta*(book->quantvals-1); - for(i=0;ientries;i++){ - if(c->lengthlist[i]>0){ - int thisx=0; - for(j=0;j=maxval) - e[j++]=0; - if(e[j]>=0) - e[j]+=book->delta; - e[j]= -e[j]; - } - } - - if(index>-1){ - for(i=0;idim; - int step=n/dim; - - for(i=0;i=0) - acc[entry]++; -#endif - - bits+=vorbis_book_encode(book,entry,opb); - - } - - return(bits); -} - -static long **_01class(vorbis_block *vb,vorbis_look_residue *vl, - int **in,int ch){ - long i,j,k; - vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; - vorbis_info_residue0 *info=look->info; - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int possible_partitions=info->partitions; - int n=info->end-info->begin; - - int partvals=n/samples_per_partition; - long **partword=(long**)_vorbis_block_alloc(vb,ch*sizeof(*partword)); - float scale=100.0f/samples_per_partition; - - /* we find the partition type for each partition of each - channel. We'll go back and do the interleaved encoding in a - bit. For now, clarity */ - - for(i=0;ibegin; - for(j=0;jmax)max=abs(in[j][offset+k]); - ent+=abs(in[j][offset+k]); - } - ent*=scale; - - for(k=0;kclassmetric1[k] && - (info->classmetric2[k]<0 || entclassmetric2[k])) - break; - - partword[j][i]=k; - } - } - -#ifdef TRAIN_RESAUX - { - FILE *of; - char buffer[80]; - - for(i=0;itrain_seq); - of=fopen(buffer,"a"); - for(j=0;jframes++; - - return(partword); -} - -/* designed for stereo or other modes where the partition size is an - integer multiple of the number of channels encoded in the current - submap */ -static long **_2class(vorbis_block *vb,vorbis_look_residue *vl,int **in, - int ch){ - long i,j,k,l; - vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; - vorbis_info_residue0 *info=look->info; - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int possible_partitions=info->partitions; - int n=info->end-info->begin; - - int partvals=n/samples_per_partition; - long **partword=(long**)_vorbis_block_alloc(vb,sizeof(*partword)); - -#if defined(TRAIN_RES) || defined (TRAIN_RESAUX) - FILE *of; - char buffer[80]; -#endif - - partword[0]=(long*)_vorbis_block_alloc(vb,partvals*sizeof(*partword[0])); - memset(partword[0],0,partvals*sizeof(*partword[0])); - - for(i=0,l=info->begin/ch;imagmax)magmax=abs(in[0][l]); - for(k=1;kangmax)angmax=abs(in[k][l]); - l++; - } - - for(j=0;jclassmetric1[j] && - angmax<=info->classmetric2[j]) - break; - - partword[0][i]=j; - - } - -#ifdef TRAIN_RESAUX - sprintf(buffer,"resaux_%d.vqd",look->train_seq); - of=fopen(buffer,"a"); - for(i=0;iframes++; - - return(partword); -} - -static int _01forward(oggpack_buffer *opb, - vorbis_block*, vorbis_look_residue *vl, - int **in,int ch, - long **partword, - int (*encode)(oggpack_buffer *,int *,int, - codebook *,long *), - int /* submap */){ - long i,j,k,s; - vorbis_look_residue0 *look=(vorbis_look_residue0 *)vl; - vorbis_info_residue0 *info=look->info; - -#ifdef TRAIN_RES - look->submap=submap; -#endif - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int possible_partitions=info->partitions; - int partitions_per_word=look->phrasebook->dim; - int n=info->end-info->begin; - - int partvals=n/samples_per_partition; - long resbits[128]; - long resvals[128]; - -#ifdef TRAIN_RES - for(i=0;ibegin;jend;j++){ - if(in[i][j]>look->tmax)look->tmax=in[i][j]; - if(in[i][j]tmin)look->tmin=in[i][j]; - } -#endif - - memset(resbits,0,sizeof(resbits)); - memset(resvals,0,sizeof(resvals)); - - /* we code the partition words for each channel, then the residual - words for a partition per channel until we've written all the - residual words for that partition word. Then write the next - partition channel words... */ - - for(s=0;sstages;s++){ - - for(i=0;iphrasebook->entries) - look->phrasebits+=vorbis_book_encode(look->phrasebook,val,opb); -#if 0 /*def TRAIN_RES*/ - else - fprintf(stderr,"!"); -#endif - - } - } - - /* now we encode interleaved residual values for the partitions */ - for(k=0;kbegin; - - for(j=0;jsecondstages[partword[j][i]]&(1<partbooks[partword[j][i]][s]; - if(statebook){ - int ret; - long *accumulator=NULL; - -#ifdef TRAIN_RES - accumulator=look->training_data[s][partword[j][i]]; - { - int l; - int *samples=in[j]+offset; - for(l=0;ltraining_min[s][partword[j][i]]) - look->training_min[s][partword[j][i]]=samples[l]; - if(samples[l]>look->training_max[s][partword[j][i]]) - look->training_max[s][partword[j][i]]=samples[l]; - } - } -#endif - - ret=encode(opb,in[j]+offset,samples_per_partition, - statebook,accumulator); - - look->postbits+=ret; - resbits[partword[j][i]]+=ret; - } - } - } - } - } - } - - /*{ - long total=0; - long totalbits=0; - fprintf(stderr,"%d :: ",vb->mode); - for(k=0;kinfo; - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int partitions_per_word=look->phrasebook->dim; - int max=vb->pcmend>>1; - int end=(info->endend:max); - int n=end-info->begin; - - if(n>0){ - int partvals=n/samples_per_partition; - int partwords=(partvals+partitions_per_word-1)/partitions_per_word; - int ***partword=(int***)alloca(ch*sizeof(*partword)); - - for(j=0;jstages;s++){ - - /* each loop decodes on partition codeword containing - partitions_per_word partitions */ - for(i=0,l=0;iphrasebook,&vb->opb); - - if(temp==-1 || temp>=info->partvals)goto eopbreak; - partword[j][l]=look->decodemap[temp]; - if(partword[j][l]==NULL)goto errout; - } - } - - /* now we decode residual values for the partitions */ - for(k=0;kbegin+i*samples_per_partition; - if(info->secondstages[partword[j][l][k]]&(1<partbooks[partword[j][l][k]][s]; - if(stagebook){ - if(decodepart(stagebook,in[j]+offset,&vb->opb, - samples_per_partition)==-1)goto eopbreak; - } - } - } - } - } - } - errout: - eopbreak: - return(0); -} - -static int res0_inverse(vorbis_block *vb,vorbis_look_residue *vl, - float **in,int *nonzero,int ch){ - int i,used=0; - for(i=0;ipcmend/2,used=0; - - /* don't duplicate the code; use a working vector hack for now and - reshape ourselves into a single channel res1 */ - /* ugly; reallocs for each coupling pass :-( */ - int *work=(int*)_vorbis_block_alloc(vb,ch*n*sizeof(*work)); - for(i=0;iinfo; - - /* move all this setup out later */ - int samples_per_partition=info->grouping; - int partitions_per_word=look->phrasebook->dim; - int max=(vb->pcmend*ch)>>1; - int end=(info->endend:max); - int n=end-info->begin; - - if(n>0){ - int partvals=n/samples_per_partition; - int partwords=(partvals+partitions_per_word-1)/partitions_per_word; - int **partword=(int**)_vorbis_block_alloc(vb,partwords*sizeof(*partword)); - - for(i=0;istages;s++){ - for(i=0,l=0;iphrasebook,&vb->opb); - if(temp==-1 || temp>=info->partvals)goto eopbreak; - partword[l]=look->decodemap[temp]; - if(partword[l]==NULL)goto errout; - } - - /* now we decode residual values for the partitions */ - for(k=0;ksecondstages[partword[l][k]]&(1<partbooks[partword[l][k]][s]; - - if(stagebook){ - if(vorbis_book_decodevv_add(stagebook,in, - i*samples_per_partition+info->begin,ch, - &vb->opb,samples_per_partition)==-1) - goto eopbreak; - } - } - } - } - } - errout: - eopbreak: - return(0); -} - - -const vorbis_func_residue residue0_exportbundle={ - NULL, - &res0_unpack, - &res0_look, - &res0_free_info, - &res0_free_look, - NULL, - NULL, - &res0_inverse -}; - -const vorbis_func_residue residue1_exportbundle={ - &res0_pack, - &res0_unpack, - &res0_look, - &res0_free_info, - &res0_free_look, - &res1_class, - &res1_forward, - &res1_inverse -}; - -const vorbis_func_residue residue2_exportbundle={ - &res0_pack, - &res0_unpack, - &res0_look, - &res0_free_info, - &res0_free_look, - &res2_class, - &res2_forward, - &res2_inverse -}; diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h deleted file mode 100755 index 4adfd78..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/scales.h +++ /dev/null @@ -1,90 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: linear scale -> dB, Bark and Mel scales - last mod: $Id: scales.h 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_SCALES_H_ -#define _V_SCALES_H_ - -#include -#include "os.h" - -#ifdef _MSC_VER -/* MS Visual Studio doesn't have C99 inline keyword. */ -#define inline __inline -#endif - -/* 20log10(x) */ -#define VORBIS_IEEE_FLOAT32 1 -#ifdef VORBIS_IEEE_FLOAT32 - -static inline float unitnorm(float x){ - union { - ogg_uint32_t i; - float f; - } ix; - ix.f = x; - ix.i = (ix.i & 0x80000000U) | (0x3f800000U); - return ix.f; -} - -/* Segher was off (too high) by ~ .3 decibel. Center the conversion correctly. */ -static inline float todB(const float *x){ - union { - ogg_uint32_t i; - float f; - } ix; - ix.f = *x; - ix.i = ix.i&0x7fffffff; - return (float)(ix.i * 7.17711438e-7f -764.6161886f); -} - -#define todB_nn(x) todB(x) - -#else - -static float unitnorm(float x){ - if(x<0)return(-1.f); - return(1.f); -} - -#define todB(x) (*(x)==0?-400.f:log(*(x)**(x))*4.34294480f) -#define todB_nn(x) (*(x)==0.f?-400.f:log(*(x))*8.6858896f) - -#endif - -#define fromdB(x) (exp((x)*.11512925f)) - -/* The bark scale equations are approximations, since the original - table was somewhat hand rolled. The below are chosen to have the - best possible fit to the rolled tables, thus their somewhat odd - appearance (these are more accurate and over a longer range than - the oft-quoted bark equations found in the texts I have). The - approximations are valid from 0 - 30kHz (nyquist) or so. - - all f in Hz, z in Bark */ - -#define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n)) -#define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f) -#define toMEL(n) (log(1.f+(n)*.001f)*1442.695f) -#define fromMEL(m) (1000.f*exp((m)/1442.695f)-1000.f) - -/* Frequency to octave. We arbitrarily declare 63.5 Hz to be octave - 0.0 */ - -#define toOC(n) (log(n)*1.442695f-5.965784f) -#define fromOC(o) (exp(((o)+5.965784f)*.693147f)) - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c deleted file mode 100755 index 2f27b86..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/sharedbook.c +++ /dev/null @@ -1,581 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: basic shared codebook operations - last mod: $Id: sharedbook.c 17030 2010-03-25 06:52:55Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include -#include "../../ogg.h" -#include "os.h" -#include "misc.h" -#include "../../codec.h" -#include "codebook.h" -#include "scales.h" - -/**** pack/unpack helpers ******************************************/ -int _ilog(unsigned int v){ - int ret=0; - while(v){ - ret++; - v>>=1; - } - return(ret); -} - -/* 32 bit float (not IEEE; nonnormalized mantissa + - biased exponent) : neeeeeee eeemmmmm mmmmmmmm mmmmmmmm - Why not IEEE? It's just not that important here. */ - -#define VQ_FEXP 10 -#define VQ_FMAN 21 -#define VQ_FEXP_BIAS 768 /* bias toward values smaller than 1. */ - -/* doesn't currently guard under/overflow */ -long _float32_pack(float val){ - int sign=0; - long exp; - long mant; - if(val<0){ - sign=0x80000000; - val= -val; - } - exp= floor(log(val)/log(2.f)+.001); //+epsilon - mant=rint(ldexp(val,(VQ_FMAN-1)-exp)); - exp=(exp+VQ_FEXP_BIAS)<>VQ_FMAN; - if(sign)mant= -mant; - return(ldexp(mant,exp-(VQ_FMAN-1)-VQ_FEXP_BIAS)); -} - -/* given a list of word lengths, generate a list of codewords. Works - for length ordered or unordered, always assigns the lowest valued - codewords first. Extended to handle unused entries (length 0) */ -static ogg_uint32_t *_make_words(long *l,long n,long sparsecount){ - long i,j,count=0; - ogg_uint32_t marker[33]; - ogg_uint32_t *r=(ogg_uint32_t*)_ogg_malloc((sparsecount?sparsecount:n)*sizeof(*r)); - memset(marker,0,sizeof(marker)); - - for(i=0;i0){ - ogg_uint32_t entry=marker[length]; - - /* when we claim a node for an entry, we also claim the nodes - below it (pruning off the imagined tree that may have dangled - from it) as well as blocking the use of any nodes directly - above for leaves */ - - /* update ourself */ - if(length<32 && (entry>>length)){ - /* error condition; the lengths must specify an overpopulated tree */ - _ogg_free(r); - return(NULL); - } - r[count++]=entry; - - /* Look to see if the next shorter marker points to the node - above. if so, update it and repeat. */ - { - for(j=length;j>0;j--){ - - if(marker[j]&1){ - /* have to jump branches */ - if(j==1) - marker[1]++; - else - marker[j]=marker[j-1]<<1; - break; /* invariant says next upper marker would already - have been moved if it was on the same path */ - } - marker[j]++; - } - } - - /* prune the tree; the implicit invariant says all the longer - markers were dangling from our just-taken node. Dangle them - from our *new* node. */ - for(j=length+1;j<33;j++) - if((marker[j]>>1) == entry){ - entry=marker[j]; - marker[j]=marker[j-1]<<1; - }else - break; - }else - if(sparsecount==0)count++; - } - - /* sanity check the huffman tree; an underpopulated tree must be - rejected. The only exception is the one-node pseudo-nil tree, - which appears to be underpopulated because the tree doesn't - really exist; there's only one possible 'codeword' or zero bits, - but the above tree-gen code doesn't mark that. */ - if(sparsecount != 1){ - for(i=1;i<33;i++) - if(marker[i] & (0xffffffffUL>>(32-i))){ - _ogg_free(r); - return(NULL); - } - } - - /* bitreverse the words because our bitwise packer/unpacker is LSb - endian */ - for(i=0,count=0;i>j)&1; - } - - if(sparsecount){ - if(l[i]) - r[count++]=temp; - }else - r[count++]=temp; - } - - return(r); -} - -/* there might be a straightforward one-line way to do the below - that's portable and totally safe against roundoff, but I haven't - thought of it. Therefore, we opt on the side of caution */ -long _book_maptype1_quantvals(const static_codebook *b){ - long vals=floor(pow((float)b->entries,1.f/b->dim)); - - /* the above *should* be reliable, but we'll not assume that FP is - ever reliable when bitstream sync is at stake; verify via integer - means that vals really is the greatest value of dim for which - vals^b->bim <= b->entries */ - /* treat the above as an initial guess */ - while(1){ - long acc=1; - long acc1=1; - int i; - for(i=0;idim;i++){ - acc*=vals; - acc1*=vals+1; - } - if(acc<=b->entries && acc1>b->entries){ - return(vals); - }else{ - if(acc>b->entries){ - vals--; - }else{ - vals++; - } - } - } -} - -/* unpack the quantized list of values for encode/decode ***********/ -/* we need to deal with two map types: in map type 1, the values are - generated algorithmically (each column of the vector counts through - the values in the quant vector). in map type 2, all the values came - in in an explicit list. Both value lists must be unpacked */ -float *_book_unquantize(const static_codebook *b,int n,int *sparsemap){ - long j,k,count=0; - if(b->maptype==1 || b->maptype==2){ - int quantvals; - float mindel=_float32_unpack(b->q_min); - float delta=_float32_unpack(b->q_delta); - float *r=(float*)_ogg_calloc(n*b->dim,sizeof(*r)); - - /* maptype 1 and 2 both use a quantized value vector, but - different sizes */ - switch(b->maptype){ - case 1: - /* most of the time, entries%dimensions == 0, but we need to be - well defined. We define that the possible vales at each - scalar is values == entries/dim. If entries%dim != 0, we'll - have 'too few' values (values*dimentries;j++){ - if((sparsemap && b->lengthlist[j]) || !sparsemap){ - float last=0.f; - int indexdiv=1; - for(k=0;kdim;k++){ - int index= (j/indexdiv)%quantvals; - float val=b->quantlist[index]; - val=fabs(val)*delta+mindel+last; - if(b->q_sequencep)last=val; - if(sparsemap) - r[sparsemap[count]*b->dim+k]=val; - else - r[count*b->dim+k]=val; - indexdiv*=quantvals; - } - count++; - } - - } - break; - case 2: - for(j=0;jentries;j++){ - if((sparsemap && b->lengthlist[j]) || !sparsemap){ - float last=0.f; - - for(k=0;kdim;k++){ - float val=b->quantlist[j*b->dim+k]; - val=fabs(val)*delta+mindel+last; - if(b->q_sequencep)last=val; - if(sparsemap) - r[sparsemap[count]*b->dim+k]=val; - else - r[count*b->dim+k]=val; - } - count++; - } - } - break; - } - - return(r); - } - return(NULL); -} - -void vorbis_staticbook_destroy(static_codebook *b){ - if(b->allocedp){ - if(b->quantlist)_ogg_free(b->quantlist); - if(b->lengthlist)_ogg_free(b->lengthlist); - memset(b,0,sizeof(*b)); - _ogg_free(b); - } /* otherwise, it is in static memory */ -} - -void vorbis_book_clear(codebook *b){ - /* static book is not cleared; we're likely called on the lookup and - the static codebook belongs to the info struct */ - if(b->valuelist)_ogg_free(b->valuelist); - if(b->codelist)_ogg_free(b->codelist); - - if(b->dec_index)_ogg_free(b->dec_index); - if(b->dec_codelengths)_ogg_free(b->dec_codelengths); - if(b->dec_firsttable)_ogg_free(b->dec_firsttable); - - memset(b,0,sizeof(*b)); -} - -int vorbis_book_init_encode(codebook *c,const static_codebook *s){ - - memset(c,0,sizeof(*c)); - c->c=s; - c->entries=s->entries; - c->used_entries=s->entries; - c->dim=s->dim; - c->codelist=_make_words(s->lengthlist,s->entries,0); - //c->valuelist=_book_unquantize(s,s->entries,NULL); - c->quantvals=_book_maptype1_quantvals(s); - c->minval=(int)rint(_float32_unpack(s->q_min)); - c->delta=(int)rint(_float32_unpack(s->q_delta)); - - return(0); -} - -#if 0 -static ogg_uint32_t bitreverse(ogg_uint32_t x){ - x= ((x>>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL); - x= ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL); - x= ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL); - x= ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL); - return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL); -} -#endif - -static int JUCE_CDECL sort32a(const void *a,const void *b){ - return ( **(ogg_uint32_t **)a>**(ogg_uint32_t **)b)- - ( **(ogg_uint32_t **)a<**(ogg_uint32_t **)b); -} - -/* decode codebook arrangement is more heavily optimized than encode */ -int vorbis_book_init_decode(codebook *c,const static_codebook *s){ - int i,j,n=0,tabn; - int *sortindex; - memset(c,0,sizeof(*c)); - - /* count actually used entries */ - for(i=0;ientries;i++) - if(s->lengthlist[i]>0) - n++; - - c->entries=s->entries; - c->used_entries=n; - c->dim=s->dim; - - if(n>0){ - - /* two different remappings go on here. - - First, we collapse the likely sparse codebook down only to - actually represented values/words. This collapsing needs to be - indexed as map-valueless books are used to encode original entry - positions as integers. - - Second, we reorder all vectors, including the entry index above, - by sorted bitreversed codeword to allow treeless decode. */ - - /* perform sort */ - ogg_uint32_t *codes=_make_words(s->lengthlist,s->entries,c->used_entries); - ogg_uint32_t **codep=(ogg_uint32_t**)alloca(sizeof(*codep)*n); - - if(codes==NULL)goto err_out; - - for(i=0;icodelist=(ogg_uint32_t*)_ogg_malloc(n*sizeof(*c->codelist)); - /* the index is a reverse index */ - for(i=0;icodelist[sortindex[i]]=codes[i]; - _ogg_free(codes); - - - c->valuelist=_book_unquantize(s,n,sortindex); - c->dec_index=(int*)_ogg_malloc(n*sizeof(*c->dec_index)); - - for(n=0,i=0;ientries;i++) - if(s->lengthlist[i]>0) - c->dec_index[sortindex[n++]]=i; - - c->dec_codelengths=(char*)_ogg_malloc(n*sizeof(*c->dec_codelengths)); - for(n=0,i=0;ientries;i++) - if(s->lengthlist[i]>0) - c->dec_codelengths[sortindex[n++]]=s->lengthlist[i]; - - c->dec_firsttablen=_ilog(c->used_entries)-4; /* this is magic */ - if(c->dec_firsttablen<5)c->dec_firsttablen=5; - if(c->dec_firsttablen>8)c->dec_firsttablen=8; - - tabn=1<dec_firsttablen; - c->dec_firsttable=(ogg_uint32_t*)_ogg_calloc(tabn,sizeof(*c->dec_firsttable)); - c->dec_maxlength=0; - - for(i=0;idec_maxlengthdec_codelengths[i]) - c->dec_maxlength=c->dec_codelengths[i]; - if(c->dec_codelengths[i]<=c->dec_firsttablen){ - ogg_uint32_t orig=bitreverse(c->codelist[i]); - for(j=0;j<(1<<(c->dec_firsttablen-c->dec_codelengths[i]));j++) - c->dec_firsttable[orig|(j<dec_codelengths[i])]=i+1; - } - } - - /* now fill in 'unused' entries in the firsttable with hi/lo search - hints for the non-direct-hits */ - { - ogg_uint32_t mask=0xfffffffeUL<<(31-c->dec_firsttablen); - long lo=0,hi=0; - - for(i=0;idec_firsttablen); - if(c->dec_firsttable[bitreverse(word)]==0){ - while((lo+1)codelist[lo+1]<=word)lo++; - while( hi=(c->codelist[hi]&mask))hi++; - - /* we only actually have 15 bits per hint to play with here. - In order to overflow gracefully (nothing breaks, efficiency - just drops), encode as the difference from the extremes. */ - { - unsigned long loval=lo; - unsigned long hival=n-hi; - - if(loval>0x7fff)loval=0x7fff; - if(hival>0x7fff)hival=0x7fff; - c->dec_firsttable[bitreverse(word)]= - 0x80000000UL | (loval<<15) | hival; - } - } - } - } - } - - return(0); - err_out: - vorbis_book_clear(c); - return(-1); -} - -long vorbis_book_codeword(codebook *book,int entry){ - if(book->c) /* only use with encode; decode optimizations are - allowed to break this */ - return book->codelist[entry]; - return -1; -} - -long vorbis_book_codelen(codebook *book,int entry){ - if(book->c) /* only use with encode; decode optimizations are - allowed to break this */ - return book->c->lengthlist[entry]; - return -1; -} - -#ifdef _V_SELFTEST - -/* Unit tests of the dequantizer; this stuff will be OK - cross-platform, I simply want to be sure that special mapping cases - actually work properly; a bug could go unnoticed for a while */ - -#include - -/* cases: - - no mapping - full, explicit mapping - algorithmic mapping - - nonsequential - sequential -*/ - -static long full_quantlist1[]={0,1,2,3, 4,5,6,7, 8,3,6,1}; -static long partial_quantlist1[]={0,7,2}; - -/* no mapping */ -static_codebook test1={ - 4,16, - NULL, - 0, - 0,0,0,0, - NULL, - 0 -}; -static float *test1_result=NULL; - -/* linear, full mapping, nonsequential */ -static_codebook test2={ - 4,3, - NULL, - 2, - -533200896,1611661312,4,0, - full_quantlist1, - 0 -}; -static float test2_result[]={-3,-2,-1,0, 1,2,3,4, 5,0,3,-2}; - -/* linear, full mapping, sequential */ -static_codebook test3={ - 4,3, - NULL, - 2, - -533200896,1611661312,4,1, - full_quantlist1, - 0 -}; -static float test3_result[]={-3,-5,-6,-6, 1,3,6,10, 5,5,8,6}; - -/* linear, algorithmic mapping, nonsequential */ -static_codebook test4={ - 3,27, - NULL, - 1, - -533200896,1611661312,4,0, - partial_quantlist1, - 0 -}; -static float test4_result[]={-3,-3,-3, 4,-3,-3, -1,-3,-3, - -3, 4,-3, 4, 4,-3, -1, 4,-3, - -3,-1,-3, 4,-1,-3, -1,-1,-3, - -3,-3, 4, 4,-3, 4, -1,-3, 4, - -3, 4, 4, 4, 4, 4, -1, 4, 4, - -3,-1, 4, 4,-1, 4, -1,-1, 4, - -3,-3,-1, 4,-3,-1, -1,-3,-1, - -3, 4,-1, 4, 4,-1, -1, 4,-1, - -3,-1,-1, 4,-1,-1, -1,-1,-1}; - -/* linear, algorithmic mapping, sequential */ -static_codebook test5={ - 3,27, - NULL, - 1, - -533200896,1611661312,4,1, - partial_quantlist1, - 0 -}; -static float test5_result[]={-3,-6,-9, 4, 1,-2, -1,-4,-7, - -3, 1,-2, 4, 8, 5, -1, 3, 0, - -3,-4,-7, 4, 3, 0, -1,-2,-5, - -3,-6,-2, 4, 1, 5, -1,-4, 0, - -3, 1, 5, 4, 8,12, -1, 3, 7, - -3,-4, 0, 4, 3, 7, -1,-2, 2, - -3,-6,-7, 4, 1, 0, -1,-4,-5, - -3, 1, 0, 4, 8, 7, -1, 3, 2, - -3,-4,-5, 4, 3, 2, -1,-2,-3}; - -void run_test(static_codebook *b,float *comp){ - float *out=_book_unquantize(b,b->entries,NULL); - int i; - - if(comp){ - if(!out){ - fprintf(stderr,"_book_unquantize incorrectly returned NULL\n"); - exit(1); - } - - for(i=0;ientries*b->dim;i++) - if(fabs(out[i]-comp[i])>.0001){ - fprintf(stderr,"disagreement in unquantized and reference data:\n" - "position %d, %g != %g\n",i,out[i],comp[i]); - exit(1); - } - - }else{ - if(out){ - fprintf(stderr,"_book_unquantize returned a value array: \n" - " correct result should have been NULL\n"); - exit(1); - } - } -} - -int main(){ - /* run the nine dequant tests, and compare to the hand-rolled results */ - fprintf(stderr,"Dequant test 1... "); - run_test(&test1,test1_result); - fprintf(stderr,"OK\nDequant test 2... "); - run_test(&test2,test2_result); - fprintf(stderr,"OK\nDequant test 3... "); - run_test(&test3,test3_result); - fprintf(stderr,"OK\nDequant test 4... "); - run_test(&test4,test4_result); - fprintf(stderr,"OK\nDequant test 5... "); - run_test(&test5,test5_result); - fprintf(stderr,"OK\n\n"); - - return(0); -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c deleted file mode 100755 index 03e166a..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.c +++ /dev/null @@ -1,1255 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: *unnormalized* fft transform - last mod: $Id: smallft.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -/* FFT implementation from OggSquish, minus cosine transforms, - * minus all but radix 2/4 case. In Vorbis we only need this - * cut-down version. - * - * To do more than just power-of-two sized vectors, see the full - * version I wrote for NetLib. - * - * Note that the packing is a little strange; rather than the FFT r/i - * packing following R_0, I_n, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, - * it follows R_0, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, I_n like the - * FORTRAN version - */ - -#include -#include -#include -#include "smallft.h" -#include "os.h" -#include "misc.h" - -static void drfti1(int n, float *wa, int *ifac){ - static int ntryh[4] = { 4,2,3,5 }; - static float tpi = 6.28318530717958648f; - float arg,argh,argld,fi; - int ntry=0,i,j=-1; - int k1, l1, l2, ib; - int ld, ii, ip, is, nq, nr; - int ido, ipm, nfm1; - int nl=n; - int nf=0; - - L101: - j++; - if (j < 4) - ntry=ntryh[j]; - else - ntry+=2; - - L104: - nq=nl/ntry; - nr=nl-ntry*nq; - if (nr!=0) goto L101; - - nf++; - ifac[nf+1]=ntry; - nl=nq; - if(ntry!=2)goto L107; - if(nf==1)goto L107; - - for (i=1;i>1; - ipp2=ip; - idp2=ido; - nbd=(ido-1)>>1; - t0=l1*ido; - t10=ip*ido; - - if(ido==1)goto L119; - for(ik=0;ikl1){ - for(j=1;j>1; - ipp2=ip; - ipph=(ip+1)>>1; - if(idol1)goto L139; - - is= -ido-1; - t1=0; - for(j=1;jn==1)return; - drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); -} - -void drft_backward(drft_lookup *l,float *data){ - if (l->n==1)return; - drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); -} - -void drft_init(drft_lookup *l,int n){ - l->n=n; - l->trigcache=(float*)_ogg_calloc(3*n,sizeof(*l->trigcache)); - l->splitcache=(int*)_ogg_calloc(32,sizeof(*l->splitcache)); - fdrffti(n, l->trigcache, l->splitcache); -} - -void drft_clear(drft_lookup *l){ - if(l){ - if(l->trigcache)_ogg_free(l->trigcache); - if(l->splitcache)_ogg_free(l->splitcache); - memset(l,0,sizeof(*l)); - } -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h deleted file mode 100755 index 420a6ab..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/smallft.h +++ /dev/null @@ -1,34 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: fft transform - last mod: $Id: smallft.h 13293 2007-07-24 00:09:47Z xiphmont $ - - ********************************************************************/ - -#ifndef _V_SMFT_H_ -#define _V_SMFT_H_ - -#include "../../codec.h" - -typedef struct { - int n; - float *trigcache; - int *splitcache; -} drft_lookup; - -extern void drft_forward(drft_lookup *l,float *data); -extern void drft_backward(drft_lookup *l,float *data); -extern void drft_init(drft_lookup *l,int n); -extern void drft_clear(drft_lookup *l); - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c deleted file mode 100755 index a9fca68..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/synthesis.c +++ /dev/null @@ -1,184 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: single-block PCM synthesis - last mod: $Id: synthesis.c 17474 2010-09-30 03:41:41Z gmaxwell $ - - ********************************************************************/ - -#include -#include "../../ogg.h" -#include "../../codec.h" -#include "codec_internal.h" -#include "registry.h" -#include "misc.h" -#include "os.h" - -int vorbis_synthesis(vorbis_block *vb,ogg_packet *op){ - vorbis_dsp_state *vd= vb ? vb->vd : 0; - private_state *b= vd ? (private_state*)vd->backend_state : 0; - vorbis_info *vi= vd ? vd->vi : 0; - codec_setup_info *ci= vi ? (codec_setup_info*)vi->codec_setup : 0; - oggpack_buffer *opb=vb ? &vb->opb : 0; - int type,mode,i; - - if (!vd || !b || !vi || !ci || !opb) { - return OV_EBADPACKET; - } - - /* first things first. Make sure decode is ready */ - _vorbis_block_ripcord(vb); - oggpack_readinit(opb,op->packet,op->bytes); - - /* Check the packet type */ - if(oggpack_read(opb,1)!=0){ - /* Oops. This is not an audio data packet */ - return(OV_ENOTAUDIO); - } - - /* read our mode and pre/post windowsize */ - mode=oggpack_read(opb,b->modebits); - if(mode==-1){ - return(OV_EBADPACKET); - } - - vb->mode=mode; - if(!ci->mode_param[mode]){ - return(OV_EBADPACKET); - } - - vb->W=ci->mode_param[mode]->blockflag; - if(vb->W){ - - /* this doesn;t get mapped through mode selection as it's used - only for window selection */ - vb->lW=oggpack_read(opb,1); - vb->nW=oggpack_read(opb,1); - if(vb->nW==-1){ - return(OV_EBADPACKET); - } - }else{ - vb->lW=0; - vb->nW=0; - } - - /* more setup */ - vb->granulepos=op->granulepos; - vb->sequence=op->packetno; - vb->eofflag=op->e_o_s; - - /* alloc pcm passback storage */ - vb->pcmend=ci->blocksizes[vb->W]; - vb->pcm=(float**)_vorbis_block_alloc(vb,sizeof(*vb->pcm)*vi->channels); - for(i=0;ichannels;i++) - vb->pcm[i]=(float*)_vorbis_block_alloc(vb,vb->pcmend*sizeof(*vb->pcm[i])); - - /* unpack_header enforces range checking */ - type=ci->map_type[ci->mode_param[mode]->mapping]; - - return(_mapping_P[type]->inverse(vb,ci->map_param[ci->mode_param[mode]-> - mapping])); -} - -/* used to track pcm position without actually performing decode. - Useful for sequential 'fast forward' */ -int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op){ - vorbis_dsp_state *vd=vb->vd; - private_state *b=(private_state*)vd->backend_state; - vorbis_info *vi=vd->vi; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - oggpack_buffer *opb=&vb->opb; - int mode; - - /* first things first. Make sure decode is ready */ - _vorbis_block_ripcord(vb); - oggpack_readinit(opb,op->packet,op->bytes); - - /* Check the packet type */ - if(oggpack_read(opb,1)!=0){ - /* Oops. This is not an audio data packet */ - return(OV_ENOTAUDIO); - } - - /* read our mode and pre/post windowsize */ - mode=oggpack_read(opb,b->modebits); - if(mode==-1)return(OV_EBADPACKET); - - vb->mode=mode; - if(!ci->mode_param[mode]){ - return(OV_EBADPACKET); - } - - vb->W=ci->mode_param[mode]->blockflag; - if(vb->W){ - vb->lW=oggpack_read(opb,1); - vb->nW=oggpack_read(opb,1); - if(vb->nW==-1) return(OV_EBADPACKET); - }else{ - vb->lW=0; - vb->nW=0; - } - - /* more setup */ - vb->granulepos=op->granulepos; - vb->sequence=op->packetno; - vb->eofflag=op->e_o_s; - - /* no pcm */ - vb->pcmend=0; - vb->pcm=NULL; - - return(0); -} - -long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - oggpack_buffer opb; - int mode; - - oggpack_readinit(&opb,op->packet,op->bytes); - - /* Check the packet type */ - if(oggpack_read(&opb,1)!=0){ - /* Oops. This is not an audio data packet */ - return(OV_ENOTAUDIO); - } - - { - int modebits=0; - int v=ci->modes; - while(v>1){ - modebits++; - v>>=1; - } - - /* read our mode and pre/post windowsize */ - mode=oggpack_read(&opb,modebits); - } - if(mode==-1)return(OV_EBADPACKET); - return(ci->blocksizes[ci->mode_param[mode]->blockflag]); -} - -int vorbis_synthesis_halfrate(vorbis_info *vi,int flag){ - /* set / clear half-sample-rate mode */ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - - /* right now, our MDCT can't handle < 64 sample windows. */ - if(ci->blocksizes[0]<=64 && flag)return -1; - ci->halfrate_flag=(flag?1:0); - return 0; -} - -int vorbis_synthesis_halfrate_p(vorbis_info *vi){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - return ci->halfrate_flag; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c deleted file mode 100755 index 4c5e55d..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisenc.c +++ /dev/null @@ -1,1215 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: simple programmatic interface for encoder mode setup - last mod: $Id: vorbisenc.c 17028 2010-03-25 05:22:15Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include - -#include "../../codec.h" -#include "../../vorbisenc.h" - -#include "codec_internal.h" - -#include "os.h" -#include "misc.h" - -/* careful with this; it's using static array sizing to make managing - all the modes a little less annoying. If we use a residue backend - with > 12 partition types, or a different division of iteration, - this needs to be updated. */ -typedef struct { - const static_codebook *books[12][4]; -} static_bookblock; - -typedef struct { - int res_type; - int limit_type; /* 0 lowpass limited, 1 point stereo limited */ - int grouping; - const vorbis_info_residue0 *res; - const static_codebook *book_aux; - const static_codebook *book_aux_managed; - const static_bookblock *books_base; - const static_bookblock *books_base_managed; -} vorbis_residue_template; - -typedef struct { - const vorbis_info_mapping0 *map; - const vorbis_residue_template *res; -} vorbis_mapping_template; - -typedef struct vp_adjblock{ - int block[P_BANDS]; -} vp_adjblock; - -typedef struct { - int data[NOISE_COMPAND_LEVELS]; -} compandblock; - -/* high level configuration information for setting things up - step-by-step with the detailed vorbis_encode_ctl interface. - There's a fair amount of redundancy such that interactive setup - does not directly deal with any vorbis_info or codec_setup_info - initialization; it's all stored (until full init) in this highlevel - setup, then flushed out to the real codec setup structs later. */ - -typedef struct { - int att[P_NOISECURVES]; - float boost; - float decay; -} att3; -typedef struct { int data[P_NOISECURVES]; } adj3; - -typedef struct { - int pre[PACKETBLOBS]; - int post[PACKETBLOBS]; - float kHz[PACKETBLOBS]; - float lowpasskHz[PACKETBLOBS]; -} adj_stereo; - -typedef struct { - int lo; - int hi; - int fixed; -} noiseguard; -typedef struct { - int data[P_NOISECURVES][17]; -} noise3; - -typedef struct { - int mappings; - const double *rate_mapping; - const double *quality_mapping; - int coupling_restriction; - long samplerate_min_restriction; - long samplerate_max_restriction; - - - const int *blocksize_short; - const int *blocksize_long; - - const att3 *psy_tone_masteratt; - const int *psy_tone_0dB; - const int *psy_tone_dBsuppress; - - const vp_adjblock *psy_tone_adj_impulse; - const vp_adjblock *psy_tone_adj_long; - const vp_adjblock *psy_tone_adj_other; - - const noiseguard *psy_noiseguards; - const noise3 *psy_noise_bias_impulse; - const noise3 *psy_noise_bias_padding; - const noise3 *psy_noise_bias_trans; - const noise3 *psy_noise_bias_long; - const int *psy_noise_dBsuppress; - - const compandblock *psy_noise_compand; - const double *psy_noise_compand_short_mapping; - const double *psy_noise_compand_long_mapping; - - const int *psy_noise_normal_start[2]; - const int *psy_noise_normal_partition[2]; - const double *psy_noise_normal_thresh; - - const int *psy_ath_float; - const int *psy_ath_abs; - - const double *psy_lowpass; - - const vorbis_info_psy_global *global_params; - const double *global_mapping; - const adj_stereo *stereo_modes; - - const static_codebook *const *const * floor_books; - const vorbis_info_floor1 *floor_params; - int floor_mappings; - const int **floor_mapping_list; - - const vorbis_mapping_template *maps; -} ve_setup_data_template; - -/* a few static coder conventions */ -static const vorbis_info_mode _mode_template[2]={ - {0,0,0,0}, - {1,0,0,1} -}; - -static const vorbis_info_mapping0 _map_nominal[2]={ - {1, {0,0}, {0}, {0}, 1,{0},{1}}, - {1, {0,0}, {1}, {1}, 1,{0},{1}} -}; - -#include "modes/setup_44.h" -#include "modes/setup_44u.h" -#include "modes/setup_44p51.h" -#include "modes/setup_32.h" -#include "modes/setup_8.h" -#include "modes/setup_11.h" -#include "modes/setup_16.h" -#include "modes/setup_22.h" -#include "modes/setup_X.h" - -static const ve_setup_data_template *const setup_list[]={ - &ve_setup_44_stereo, - &ve_setup_44_51, - &ve_setup_44_uncoupled, - - &ve_setup_32_stereo, - &ve_setup_32_uncoupled, - - &ve_setup_22_stereo, - &ve_setup_22_uncoupled, - &ve_setup_16_stereo, - &ve_setup_16_uncoupled, - - &ve_setup_11_stereo, - &ve_setup_11_uncoupled, - &ve_setup_8_stereo, - &ve_setup_8_uncoupled, - - &ve_setup_X_stereo, - &ve_setup_X_uncoupled, - &ve_setup_XX_stereo, - &ve_setup_XX_uncoupled, - 0 -}; - -static void vorbis_encode_floor_setup(vorbis_info *vi,int s, - const static_codebook *const *const *const books, - const vorbis_info_floor1 *in, - const int *x){ - int i,k,is=s; - vorbis_info_floor1 *f=(vorbis_info_floor1*) _ogg_calloc(1,sizeof(*f)); - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - - memcpy(f,in+x[is],sizeof(*f)); - - /* books */ - { - int partitions=f->partitions; - int maxclass=-1; - int maxbook=-1; - for(i=0;ipartitionclass[i]>maxclass)maxclass=f->partitionclass[i]; - for(i=0;i<=maxclass;i++){ - if(f->class_book[i]>maxbook)maxbook=f->class_book[i]; - f->class_book[i]+=ci->books; - for(k=0;k<(1<class_subs[i]);k++){ - if(f->class_subbook[i][k]>maxbook)maxbook=f->class_subbook[i][k]; - if(f->class_subbook[i][k]>=0)f->class_subbook[i][k]+=ci->books; - } - } - - for(i=0;i<=maxbook;i++) - ci->book_param[ci->books++]=(static_codebook *)books[x[is]][i]; - } - - /* for now, we're only using floor 1 */ - ci->floor_type[ci->floors]=1; - ci->floor_param[ci->floors]=f; - ci->floors++; - - return; -} - -static void vorbis_encode_global_psych_setup(vorbis_info *vi,double s, - const vorbis_info_psy_global *in, - const double *x){ - int i,is=s; - double ds=s-is; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy_global *g=&ci->psy_g_param; - - memcpy(g,in+(int)x[is],sizeof(*g)); - - ds=x[is]*(1.-ds)+x[is+1]*ds; - is=(int)ds; - ds-=is; - if(ds==0 && is>0){ - is--; - ds=1.; - } - - /* interpolate the trigger threshholds */ - for(i=0;i<4;i++){ - g->preecho_thresh[i]=in[is].preecho_thresh[i]*(1.-ds)+in[is+1].preecho_thresh[i]*ds; - g->postecho_thresh[i]=in[is].postecho_thresh[i]*(1.-ds)+in[is+1].postecho_thresh[i]*ds; - } - g->ampmax_att_per_sec=ci->hi.amplitude_track_dBpersec; - return; -} - -static void vorbis_encode_global_stereo(vorbis_info *vi, - const highlevel_encode_setup *const hi, - const adj_stereo *p){ - float s=hi->stereo_point_setting; - int i,is=s; - double ds=s-is; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy_global *g=&ci->psy_g_param; - - if(p){ - memcpy(g->coupling_prepointamp,p[is].pre,sizeof(*p[is].pre)*PACKETBLOBS); - memcpy(g->coupling_postpointamp,p[is].post,sizeof(*p[is].post)*PACKETBLOBS); - - if(hi->managed){ - /* interpolate the kHz threshholds */ - for(i=0;icoupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; - g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; - g->coupling_pkHz[i]=kHz; - - kHz=p[is].lowpasskHz[i]*(1.-ds)+p[is+1].lowpasskHz[i]*ds; - g->sliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; - g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; - - } - }else{ - float kHz=p[is].kHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].kHz[PACKETBLOBS/2]*ds; - for(i=0;icoupling_pointlimit[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; - g->coupling_pointlimit[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; - g->coupling_pkHz[i]=kHz; - } - - kHz=p[is].lowpasskHz[PACKETBLOBS/2]*(1.-ds)+p[is+1].lowpasskHz[PACKETBLOBS/2]*ds; - for(i=0;isliding_lowpass[0][i]=kHz*1000./vi->rate*ci->blocksizes[0]; - g->sliding_lowpass[1][i]=kHz*1000./vi->rate*ci->blocksizes[1]; - } - } - }else{ - for(i=0;isliding_lowpass[0][i]=ci->blocksizes[0]; - g->sliding_lowpass[1][i]=ci->blocksizes[1]; - } - } - return; -} - -static void vorbis_encode_psyset_setup(vorbis_info *vi,double s, - const int *nn_start, - const int *nn_partition, - const double *nn_thresh, - int block){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - highlevel_encode_setup *hi=&ci->hi; - int is=s; - - if(block>=ci->psys) - ci->psys=block+1; - if(!p){ - p=(vorbis_info_psy*)_ogg_calloc(1,sizeof(*p)); - ci->psy_param[block]=p; - } - - memcpy(p,&_psy_info_template,sizeof(*p)); - p->blockflag=block>>1; - - if(hi->noise_normalize_p){ - p->normal_p=1; - p->normal_start=nn_start[is]; - p->normal_partition=nn_partition[is]; - p->normal_thresh=nn_thresh[is]; - } - - return; -} - -static void vorbis_encode_tonemask_setup(vorbis_info *vi,double s,int block, - const att3 *att, - const int *max, - const vp_adjblock *in){ - int i,is=s; - double ds=s-is; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - - /* 0 and 2 are only used by bitmanagement, but there's no harm to always - filling the values in here */ - p->tone_masteratt[0]=att[is].att[0]*(1.-ds)+att[is+1].att[0]*ds; - p->tone_masteratt[1]=att[is].att[1]*(1.-ds)+att[is+1].att[1]*ds; - p->tone_masteratt[2]=att[is].att[2]*(1.-ds)+att[is+1].att[2]*ds; - p->tone_centerboost=att[is].boost*(1.-ds)+att[is+1].boost*ds; - p->tone_decay=att[is].decay*(1.-ds)+att[is+1].decay*ds; - - p->max_curve_dB=max[is]*(1.-ds)+max[is+1]*ds; - - for(i=0;itoneatt[i]=in[is].block[i]*(1.-ds)+in[is+1].block[i]*ds; - return; -} - - -static void vorbis_encode_compand_setup(vorbis_info *vi,double s,int block, - const compandblock *in, - const double *x){ - int i,is=s; - double ds=s-is; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - - ds=x[is]*(1.-ds)+x[is+1]*ds; - is=(int)ds; - ds-=is; - if(ds==0 && is>0){ - is--; - ds=1.; - } - - /* interpolate the compander settings */ - for(i=0;inoisecompand[i]=in[is].data[i]*(1.-ds)+in[is+1].data[i]*ds; - return; -} - -static void vorbis_encode_peak_setup(vorbis_info *vi,double s,int block, - const int *suppress){ - int is=s; - double ds=s-is; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - - p->tone_abs_limit=suppress[is]*(1.-ds)+suppress[is+1]*ds; - - return; -} - -static void vorbis_encode_noisebias_setup(vorbis_info *vi,double s,int block, - const int *suppress, - const noise3 *in, - const noiseguard *guard, - double userbias){ - int i,is=s,j; - double ds=s-is; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - - p->noisemaxsupp=suppress[is]*(1.-ds)+suppress[is+1]*ds; - p->noisewindowlomin=guard[block].lo; - p->noisewindowhimin=guard[block].hi; - p->noisewindowfixed=guard[block].fixed; - - for(j=0;jnoiseoff[j][i]=in[is].data[j][i]*(1.-ds)+in[is+1].data[j][i]*ds; - - /* impulse blocks may take a user specified bias to boost the - nominal/high noise encoding depth */ - for(j=0;jnoiseoff[j][0]+6; /* the lowest it can go */ - for(i=0;inoiseoff[j][i]+=userbias; - if(p->noiseoff[j][i]noiseoff[j][i]=min; - } - } - - return; -} - -static void vorbis_encode_ath_setup(vorbis_info *vi,int block){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - vorbis_info_psy *p=ci->psy_param[block]; - - p->ath_adjatt=ci->hi.ath_floating_dB; - p->ath_maxatt=ci->hi.ath_absolute_dB; - return; -} - - -static int book_dup_or_new(codec_setup_info *ci,const static_codebook *book){ - int i; - for(i=0;ibooks;i++) - if(ci->book_param[i]==book)return(i); - - return(ci->books++); -} - -static void vorbis_encode_blocksize_setup(vorbis_info *vi,double s, - const int *shortb,const int *longb){ - - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - int is=s; - - int blockshort=shortb[is]; - int blocklong=longb[is]; - ci->blocksizes[0]=blockshort; - ci->blocksizes[1]=blocklong; - -} - -static void vorbis_encode_residue_setup(vorbis_info *vi, - int number, int block, - const vorbis_residue_template *res){ - - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - int i; - - vorbis_info_residue0 *r=(vorbis_info_residue0*)(ci->residue_param[number]= - (vorbis_info_residue0*)_ogg_malloc(sizeof(*r))); - - memcpy(r,res->res,sizeof(*r)); - if(ci->residues<=number)ci->residues=number+1; - - r->grouping=res->grouping; - ci->residue_type[number]=res->res_type; - - /* fill in all the books */ - { - int booklist=0,k; - - if(ci->hi.managed){ - for(i=0;ipartitions;i++) - for(k=0;k<4;k++) - if(res->books_base_managed->books[i][k]) - r->secondstages[i]|=(1<groupbook=book_dup_or_new(ci,res->book_aux_managed); - ci->book_param[r->groupbook]=(static_codebook *)res->book_aux_managed; - - for(i=0;ipartitions;i++){ - for(k=0;k<4;k++){ - if(res->books_base_managed->books[i][k]){ - int bookid=book_dup_or_new(ci,res->books_base_managed->books[i][k]); - r->booklist[booklist++]=bookid; - ci->book_param[bookid]=(static_codebook *)res->books_base_managed->books[i][k]; - } - } - } - - }else{ - - for(i=0;ipartitions;i++) - for(k=0;k<4;k++) - if(res->books_base->books[i][k]) - r->secondstages[i]|=(1<groupbook=book_dup_or_new(ci,res->book_aux); - ci->book_param[r->groupbook]=(static_codebook *)res->book_aux; - - for(i=0;ipartitions;i++){ - for(k=0;k<4;k++){ - if(res->books_base->books[i][k]){ - int bookid=book_dup_or_new(ci,res->books_base->books[i][k]); - r->booklist[booklist++]=bookid; - ci->book_param[bookid]=(static_codebook *)res->books_base->books[i][k]; - } - } - } - } - } - - /* lowpass setup/pointlimit */ - { - double freq=ci->hi.lowpass_kHz*1000.; - vorbis_info_floor1 *f=(vorbis_info_floor1*)ci->floor_param[block]; /* by convention */ - double nyq=vi->rate/2.; - long blocksize=ci->blocksizes[block]>>1; - - /* lowpass needs to be set in the floor and the residue. */ - if(freq>nyq)freq=nyq; - /* in the floor, the granularity can be very fine; it doesn't alter - the encoding structure, only the samples used to fit the floor - approximation */ - f->n=freq/nyq*blocksize; - - /* this res may by limited by the maximum pointlimit of the mode, - not the lowpass. the floor is always lowpass limited. */ - switch(res->limit_type){ - case 1: /* point stereo limited */ - if(ci->hi.managed) - freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS-1]*1000.; - else - freq=ci->psy_g_param.coupling_pkHz[PACKETBLOBS/2]*1000.; - if(freq>nyq)freq=nyq; - break; - case 2: /* LFE channel; lowpass at ~ 250Hz */ - freq=250; - break; - default: - /* already set */ - break; - } - - /* in the residue, we're constrained, physically, by partition - boundaries. We still lowpass 'wherever', but we have to round up - here to next boundary, or the vorbis spec will round it *down* to - previous boundary in encode/decode */ - if(ci->residue_type[number]==2){ - /* residue 2 bundles together multiple channels; used by stereo - and surround. Count the channels in use */ - /* Multiple maps/submaps can point to the same residue. In the case - of residue 2, they all better have the same number of - channels/samples. */ - int j,k,ch=0; - for(i=0;imaps&&ch==0;i++){ - vorbis_info_mapping0 *mi=(vorbis_info_mapping0 *)ci->map_param[i]; - for(j=0;jsubmaps && ch==0;j++) - if(mi->residuesubmap[j]==number) /* we found a submap referencing theis residue backend */ - for(k=0;kchannels;k++) - if(mi->chmuxlist[k]==j) /* this channel belongs to the submap */ - ch++; - } - - r->end=(int)((freq/nyq*blocksize*ch)/r->grouping+.9)* /* round up only if we're well past */ - r->grouping; - /* the blocksize and grouping may disagree at the end */ - if(r->end>blocksize*ch)r->end=blocksize*ch/r->grouping*r->grouping; - - }else{ - - r->end=(int)((freq/nyq*blocksize)/r->grouping+.9)* /* round up only if we're well past */ - r->grouping; - /* the blocksize and grouping may disagree at the end */ - if(r->end>blocksize)r->end=blocksize/r->grouping*r->grouping; - - } - - if(r->end==0)r->end=r->grouping; /* LFE channel */ - - } -} - -/* we assume two maps in this encoder */ -static void vorbis_encode_map_n_res_setup(vorbis_info *vi,double s, - const vorbis_mapping_template *maps){ - - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - int i,j,is=s,modes=2; - const vorbis_info_mapping0 *map=maps[is].map; - const vorbis_info_mode *mode=_mode_template; - const vorbis_residue_template *res=maps[is].res; - - if(ci->blocksizes[0]==ci->blocksizes[1])modes=1; - - for(i=0;imap_param[i]=_ogg_calloc(1,sizeof(*map)); - ci->mode_param[i]=(vorbis_info_mode*)_ogg_calloc(1,sizeof(*mode)); - - memcpy(ci->mode_param[i],mode+i,sizeof(*_mode_template)); - if(i>=ci->modes)ci->modes=i+1; - - ci->map_type[i]=0; - memcpy(ci->map_param[i],map+i,sizeof(*map)); - if(i>=ci->maps)ci->maps=i+1; - - for(j=0;jcodec_setup; - highlevel_encode_setup *hi=&ci->hi; - ve_setup_data_template *setup=(ve_setup_data_template *)hi->setup; - int is=hi->base_setting; - double ds=hi->base_setting-is; - int ch=vi->channels; - const double *r=setup->rate_mapping; - - if(r==NULL) - return(-1); - - return((r[is]*(1.-ds)+r[is+1]*ds)*ch); -} - -static const void *get_setup_template(long ch,long srate, - double req,int q_or_bitrate, - double *base_setting){ - int i=0,j; - if(q_or_bitrate)req/=ch; - - while(setup_list[i]){ - if(setup_list[i]->coupling_restriction==-1 || - setup_list[i]->coupling_restriction==ch){ - if(srate>=setup_list[i]->samplerate_min_restriction && - srate<=setup_list[i]->samplerate_max_restriction){ - int mappings=setup_list[i]->mappings; - const double *map=(q_or_bitrate? - setup_list[i]->rate_mapping: - setup_list[i]->quality_mapping); - - /* the template matches. Does the requested quality mode - fall within this template's modes? */ - if(reqmap[setup_list[i]->mappings]){++i;continue;} - for(j=0;j=map[j] && reqcodec_setup; - ve_setup_data_template *setup=NULL; - highlevel_encode_setup *hi=&ci->hi; - - if(ci==NULL)return(OV_EINVAL); - if(!hi->impulse_block_p)i0=1; - - /* too low/high an ATH floater is nonsensical, but doesn't break anything */ - if(hi->ath_floating_dB>-80)hi->ath_floating_dB=-80; - if(hi->ath_floating_dB<-200)hi->ath_floating_dB=-200; - - /* again, bound this to avoid the app shooting itself int he foot - too badly */ - if(hi->amplitude_track_dBpersec>0.)hi->amplitude_track_dBpersec=0.; - if(hi->amplitude_track_dBpersec<-99999.)hi->amplitude_track_dBpersec=-99999.; - - /* get the appropriate setup template; matches the fetch in previous - stages */ - setup=(ve_setup_data_template *)hi->setup; - if(setup==NULL)return(OV_EINVAL); - - hi->set_in_stone=1; - /* choose block sizes from configured sizes as well as paying - attention to long_block_p and short_block_p. If the configured - short and long blocks are the same length, we set long_block_p - and unset short_block_p */ - vorbis_encode_blocksize_setup(vi,hi->base_setting, - setup->blocksize_short, - setup->blocksize_long); - if(ci->blocksizes[0]==ci->blocksizes[1])singleblock=1; - - /* floor setup; choose proper floor params. Allocated on the floor - stack in order; if we alloc only a single long floor, it's 0 */ - for(i=0;ifloor_mappings;i++) - vorbis_encode_floor_setup(vi,hi->base_setting, - setup->floor_books, - setup->floor_params, - setup->floor_mapping_list[i]); - - /* setup of [mostly] short block detection and stereo*/ - vorbis_encode_global_psych_setup(vi,hi->trigger_setting, - setup->global_params, - setup->global_mapping); - vorbis_encode_global_stereo(vi,hi,setup->stereo_modes); - - /* basic psych setup and noise normalization */ - vorbis_encode_psyset_setup(vi,hi->base_setting, - setup->psy_noise_normal_start[0], - setup->psy_noise_normal_partition[0], - setup->psy_noise_normal_thresh, - 0); - vorbis_encode_psyset_setup(vi,hi->base_setting, - setup->psy_noise_normal_start[0], - setup->psy_noise_normal_partition[0], - setup->psy_noise_normal_thresh, - 1); - if(!singleblock){ - vorbis_encode_psyset_setup(vi,hi->base_setting, - setup->psy_noise_normal_start[1], - setup->psy_noise_normal_partition[1], - setup->psy_noise_normal_thresh, - 2); - vorbis_encode_psyset_setup(vi,hi->base_setting, - setup->psy_noise_normal_start[1], - setup->psy_noise_normal_partition[1], - setup->psy_noise_normal_thresh, - 3); - } - - /* tone masking setup */ - vorbis_encode_tonemask_setup(vi,hi->block[i0].tone_mask_setting,0, - setup->psy_tone_masteratt, - setup->psy_tone_0dB, - setup->psy_tone_adj_impulse); - vorbis_encode_tonemask_setup(vi,hi->block[1].tone_mask_setting,1, - setup->psy_tone_masteratt, - setup->psy_tone_0dB, - setup->psy_tone_adj_other); - if(!singleblock){ - vorbis_encode_tonemask_setup(vi,hi->block[2].tone_mask_setting,2, - setup->psy_tone_masteratt, - setup->psy_tone_0dB, - setup->psy_tone_adj_other); - vorbis_encode_tonemask_setup(vi,hi->block[3].tone_mask_setting,3, - setup->psy_tone_masteratt, - setup->psy_tone_0dB, - setup->psy_tone_adj_long); - } - - /* noise companding setup */ - vorbis_encode_compand_setup(vi,hi->block[i0].noise_compand_setting,0, - setup->psy_noise_compand, - setup->psy_noise_compand_short_mapping); - vorbis_encode_compand_setup(vi,hi->block[1].noise_compand_setting,1, - setup->psy_noise_compand, - setup->psy_noise_compand_short_mapping); - if(!singleblock){ - vorbis_encode_compand_setup(vi,hi->block[2].noise_compand_setting,2, - setup->psy_noise_compand, - setup->psy_noise_compand_long_mapping); - vorbis_encode_compand_setup(vi,hi->block[3].noise_compand_setting,3, - setup->psy_noise_compand, - setup->psy_noise_compand_long_mapping); - } - - /* peak guarding setup */ - vorbis_encode_peak_setup(vi,hi->block[i0].tone_peaklimit_setting,0, - setup->psy_tone_dBsuppress); - vorbis_encode_peak_setup(vi,hi->block[1].tone_peaklimit_setting,1, - setup->psy_tone_dBsuppress); - if(!singleblock){ - vorbis_encode_peak_setup(vi,hi->block[2].tone_peaklimit_setting,2, - setup->psy_tone_dBsuppress); - vorbis_encode_peak_setup(vi,hi->block[3].tone_peaklimit_setting,3, - setup->psy_tone_dBsuppress); - } - - /* noise bias setup */ - vorbis_encode_noisebias_setup(vi,hi->block[i0].noise_bias_setting,0, - setup->psy_noise_dBsuppress, - setup->psy_noise_bias_impulse, - setup->psy_noiseguards, - (i0==0?hi->impulse_noisetune:0.)); - vorbis_encode_noisebias_setup(vi,hi->block[1].noise_bias_setting,1, - setup->psy_noise_dBsuppress, - setup->psy_noise_bias_padding, - setup->psy_noiseguards,0.); - if(!singleblock){ - vorbis_encode_noisebias_setup(vi,hi->block[2].noise_bias_setting,2, - setup->psy_noise_dBsuppress, - setup->psy_noise_bias_trans, - setup->psy_noiseguards,0.); - vorbis_encode_noisebias_setup(vi,hi->block[3].noise_bias_setting,3, - setup->psy_noise_dBsuppress, - setup->psy_noise_bias_long, - setup->psy_noiseguards,0.); - } - - vorbis_encode_ath_setup(vi,0); - vorbis_encode_ath_setup(vi,1); - if(!singleblock){ - vorbis_encode_ath_setup(vi,2); - vorbis_encode_ath_setup(vi,3); - } - - vorbis_encode_map_n_res_setup(vi,hi->base_setting,setup->maps); - - /* set bitrate readonlies and management */ - if(hi->bitrate_av>0) - vi->bitrate_nominal=hi->bitrate_av; - else{ - vi->bitrate_nominal=setting_to_approx_bitrate(vi); - } - - vi->bitrate_lower=hi->bitrate_min; - vi->bitrate_upper=hi->bitrate_max; - if(hi->bitrate_av) - vi->bitrate_window=(double)hi->bitrate_reservoir/hi->bitrate_av; - else - vi->bitrate_window=0.; - - if(hi->managed){ - ci->bi.avg_rate=hi->bitrate_av; - ci->bi.min_rate=hi->bitrate_min; - ci->bi.max_rate=hi->bitrate_max; - - ci->bi.reservoir_bits=hi->bitrate_reservoir; - ci->bi.reservoir_bias= - hi->bitrate_reservoir_bias; - - ci->bi.slew_damp=hi->bitrate_av_damp; - - } - - return(0); - -} - -static void vorbis_encode_setup_setting(vorbis_info *vi, - long channels, - long rate){ - int i,is; - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - highlevel_encode_setup *hi=&ci->hi; - const ve_setup_data_template *setup=(ve_setup_data_template*)hi->setup; - double ds; - - vi->version=0; - vi->channels=channels; - vi->rate=rate; - - hi->impulse_block_p=1; - hi->noise_normalize_p=1; - - is=hi->base_setting; - ds=hi->base_setting-is; - - hi->stereo_point_setting=hi->base_setting; - - if(!hi->lowpass_altered) - hi->lowpass_kHz= - setup->psy_lowpass[is]*(1.-ds)+setup->psy_lowpass[is+1]*ds; - - hi->ath_floating_dB=setup->psy_ath_float[is]*(1.-ds)+ - setup->psy_ath_float[is+1]*ds; - hi->ath_absolute_dB=setup->psy_ath_abs[is]*(1.-ds)+ - setup->psy_ath_abs[is+1]*ds; - - hi->amplitude_track_dBpersec=-6.; - hi->trigger_setting=hi->base_setting; - - for(i=0;i<4;i++){ - hi->block[i].tone_mask_setting=hi->base_setting; - hi->block[i].tone_peaklimit_setting=hi->base_setting; - hi->block[i].noise_bias_setting=hi->base_setting; - hi->block[i].noise_compand_setting=hi->base_setting; - } -} - -int vorbis_encode_setup_vbr(vorbis_info *vi, - long channels, - long rate, - float quality){ - codec_setup_info *ci=(codec_setup_info*) vi->codec_setup; - highlevel_encode_setup *hi=&ci->hi; - - quality+=.0000001; - if(quality>=1.)quality=.9999; - - hi->req=quality; - hi->setup=get_setup_template(channels,rate,quality,0,&hi->base_setting); - if(!hi->setup)return OV_EIMPL; - - vorbis_encode_setup_setting(vi,channels,rate); - hi->managed=0; - hi->coupling_p=1; - - return 0; -} - -int vorbis_encode_init_vbr(vorbis_info *vi, - long channels, - long rate, - - float base_quality /* 0. to 1. */ - ){ - int ret=0; - - ret=vorbis_encode_setup_vbr(vi,channels,rate,base_quality); - - if(ret){ - vorbis_info_clear(vi); - return ret; - } - ret=vorbis_encode_setup_init(vi); - if(ret) - vorbis_info_clear(vi); - return(ret); -} - -int vorbis_encode_setup_managed(vorbis_info *vi, - long channels, - long rate, - - long max_bitrate, - long nominal_bitrate, - long min_bitrate){ - - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - highlevel_encode_setup *hi=&ci->hi; - double tnominal=nominal_bitrate; - - if(nominal_bitrate<=0.){ - if(max_bitrate>0.){ - if(min_bitrate>0.) - nominal_bitrate=(max_bitrate+min_bitrate)*.5; - else - nominal_bitrate=max_bitrate*.875; - }else{ - if(min_bitrate>0.){ - nominal_bitrate=min_bitrate; - }else{ - return(OV_EINVAL); - } - } - } - - hi->req=nominal_bitrate; - hi->setup=get_setup_template(channels,rate,nominal_bitrate,1,&hi->base_setting); - if(!hi->setup)return OV_EIMPL; - - vorbis_encode_setup_setting(vi,channels,rate); - - /* initialize management with sane defaults */ - hi->coupling_p=1; - hi->managed=1; - hi->bitrate_min=min_bitrate; - hi->bitrate_max=max_bitrate; - hi->bitrate_av=tnominal; - hi->bitrate_av_damp=1.5f; /* full range in no less than 1.5 second */ - hi->bitrate_reservoir=nominal_bitrate*2; - hi->bitrate_reservoir_bias=.1; /* bias toward hoarding bits */ - - return(0); - -} - -int vorbis_encode_init(vorbis_info *vi, - long channels, - long rate, - - long max_bitrate, - long nominal_bitrate, - long min_bitrate){ - - int ret=vorbis_encode_setup_managed(vi,channels,rate, - max_bitrate, - nominal_bitrate, - min_bitrate); - if(ret){ - vorbis_info_clear(vi); - return(ret); - } - - ret=vorbis_encode_setup_init(vi); - if(ret) - vorbis_info_clear(vi); - return(ret); -} - -int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg){ - if(vi){ - codec_setup_info *ci=(codec_setup_info*)vi->codec_setup; - highlevel_encode_setup *hi=&ci->hi; - int setp=(number&0xf); /* a read request has a low nibble of 0 */ - - if(setp && hi->set_in_stone)return(OV_EINVAL); - - switch(number){ - - /* now deprecated *****************/ - case OV_ECTL_RATEMANAGE_GET: - { - - struct ovectl_ratemanage_arg *ai= - (struct ovectl_ratemanage_arg *)arg; - - ai->management_active=hi->managed; - ai->bitrate_hard_window=ai->bitrate_av_window= - (double)hi->bitrate_reservoir/vi->rate; - ai->bitrate_av_window_center=1.; - ai->bitrate_hard_min=hi->bitrate_min; - ai->bitrate_hard_max=hi->bitrate_max; - ai->bitrate_av_lo=hi->bitrate_av; - ai->bitrate_av_hi=hi->bitrate_av; - - } - return(0); - - /* now deprecated *****************/ - case OV_ECTL_RATEMANAGE_SET: - { - struct ovectl_ratemanage_arg *ai= - (struct ovectl_ratemanage_arg *)arg; - if(ai==NULL){ - hi->managed=0; - }else{ - hi->managed=ai->management_active; - vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_AVG,arg); - vorbis_encode_ctl(vi,OV_ECTL_RATEMANAGE_HARD,arg); - } - } - return 0; - - /* now deprecated *****************/ - case OV_ECTL_RATEMANAGE_AVG: - { - struct ovectl_ratemanage_arg *ai= - (struct ovectl_ratemanage_arg *)arg; - if(ai==NULL){ - hi->bitrate_av=0; - }else{ - hi->bitrate_av=(ai->bitrate_av_lo+ai->bitrate_av_hi)*.5; - } - } - return(0); - /* now deprecated *****************/ - case OV_ECTL_RATEMANAGE_HARD: - { - struct ovectl_ratemanage_arg *ai= - (struct ovectl_ratemanage_arg *)arg; - if(ai==NULL){ - hi->bitrate_min=0; - hi->bitrate_max=0; - }else{ - hi->bitrate_min=ai->bitrate_hard_min; - hi->bitrate_max=ai->bitrate_hard_max; - hi->bitrate_reservoir=ai->bitrate_hard_window* - (hi->bitrate_max+hi->bitrate_min)*.5; - } - if(hi->bitrate_reservoir<128.) - hi->bitrate_reservoir=128.; - } - return(0); - - /* replacement ratemanage interface */ - case OV_ECTL_RATEMANAGE2_GET: - { - struct ovectl_ratemanage2_arg *ai= - (struct ovectl_ratemanage2_arg *)arg; - if(ai==NULL)return OV_EINVAL; - - ai->management_active=hi->managed; - ai->bitrate_limit_min_kbps=hi->bitrate_min/1000; - ai->bitrate_limit_max_kbps=hi->bitrate_max/1000; - ai->bitrate_average_kbps=hi->bitrate_av/1000; - ai->bitrate_average_damping=hi->bitrate_av_damp; - ai->bitrate_limit_reservoir_bits=hi->bitrate_reservoir; - ai->bitrate_limit_reservoir_bias=hi->bitrate_reservoir_bias; - } - return (0); - case OV_ECTL_RATEMANAGE2_SET: - { - struct ovectl_ratemanage2_arg *ai= - (struct ovectl_ratemanage2_arg *)arg; - if(ai==NULL){ - hi->managed=0; - }else{ - /* sanity check; only catch invariant violations */ - if(ai->bitrate_limit_min_kbps>0 && - ai->bitrate_average_kbps>0 && - ai->bitrate_limit_min_kbps>ai->bitrate_average_kbps) - return OV_EINVAL; - - if(ai->bitrate_limit_max_kbps>0 && - ai->bitrate_average_kbps>0 && - ai->bitrate_limit_max_kbpsbitrate_average_kbps) - return OV_EINVAL; - - if(ai->bitrate_limit_min_kbps>0 && - ai->bitrate_limit_max_kbps>0 && - ai->bitrate_limit_min_kbps>ai->bitrate_limit_max_kbps) - return OV_EINVAL; - - if(ai->bitrate_average_damping <= 0.) - return OV_EINVAL; - - if(ai->bitrate_limit_reservoir_bits < 0) - return OV_EINVAL; - - if(ai->bitrate_limit_reservoir_bias < 0.) - return OV_EINVAL; - - if(ai->bitrate_limit_reservoir_bias > 1.) - return OV_EINVAL; - - hi->managed=ai->management_active; - hi->bitrate_min=ai->bitrate_limit_min_kbps * 1000; - hi->bitrate_max=ai->bitrate_limit_max_kbps * 1000; - hi->bitrate_av=ai->bitrate_average_kbps * 1000; - hi->bitrate_av_damp=ai->bitrate_average_damping; - hi->bitrate_reservoir=ai->bitrate_limit_reservoir_bits; - hi->bitrate_reservoir_bias=ai->bitrate_limit_reservoir_bias; - } - } - return 0; - - case OV_ECTL_LOWPASS_GET: - { - double *farg=(double *)arg; - *farg=hi->lowpass_kHz; - } - return(0); - case OV_ECTL_LOWPASS_SET: - { - double *farg=(double *)arg; - hi->lowpass_kHz=*farg; - - if(hi->lowpass_kHz<2.)hi->lowpass_kHz=2.; - if(hi->lowpass_kHz>99.)hi->lowpass_kHz=99.; - hi->lowpass_altered=1; - } - return(0); - case OV_ECTL_IBLOCK_GET: - { - double *farg=(double *)arg; - *farg=hi->impulse_noisetune; - } - return(0); - case OV_ECTL_IBLOCK_SET: - { - double *farg=(double *)arg; - hi->impulse_noisetune=*farg; - - if(hi->impulse_noisetune>0.)hi->impulse_noisetune=0.; - if(hi->impulse_noisetune<-15.)hi->impulse_noisetune=-15.; - } - return(0); - case OV_ECTL_COUPLING_GET: - { - int *iarg=(int *)arg; - *iarg=hi->coupling_p; - } - return(0); - case OV_ECTL_COUPLING_SET: - { - const void *new_template; - double new_base=0.; - int *iarg=(int *)arg; - hi->coupling_p=((*iarg)!=0); - - /* Fetching a new template can alter the base_setting, which - many other parameters are based on. Right now, the only - parameter drawn from the base_setting that can be altered - by an encctl is the lowpass, so that is explictly flagged - to not be overwritten when we fetch a new template and - recompute the dependant settings */ - new_template = get_setup_template(hi->coupling_p?vi->channels:-1, - vi->rate, - hi->req, - hi->managed, - &new_base); - if(!hi->setup)return OV_EIMPL; - hi->setup=new_template; - hi->base_setting=new_base; - vorbis_encode_setup_setting(vi,vi->channels,vi->rate); - } - return(0); - } - return(OV_EIMPL); - } - return(OV_EINVAL); -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c deleted file mode 100755 index 79b6688..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/vorbisfile.c +++ /dev/null @@ -1,2338 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: stdio-based convenience library for opening/seeking/decoding - last mod: $Id: vorbisfile.c 17573 2010-10-27 14:53:59Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include -#include -#include - -#include "../../codec.h" -#include "../../vorbisfile.h" - -#include "os.h" -#include "misc.h" - -/* A 'chained bitstream' is a Vorbis bitstream that contains more than - one logical bitstream arranged end to end (the only form of Ogg - multiplexing allowed in a Vorbis bitstream; grouping [parallel - multiplexing] is not allowed in Vorbis) */ - -/* A Vorbis file can be played beginning to end (streamed) without - worrying ahead of time about chaining (see decoder_example.c). If - we have the whole file, however, and want random access - (seeking/scrubbing) or desire to know the total length/time of a - file, we need to account for the possibility of chaining. */ - -/* We can handle things a number of ways; we can determine the entire - bitstream structure right off the bat, or find pieces on demand. - This example determines and caches structure for the entire - bitstream, but builds a virtual decoder on the fly when moving - between links in the chain. */ - -/* There are also different ways to implement seeking. Enough - information exists in an Ogg bitstream to seek to - sample-granularity positions in the output. Or, one can seek by - picking some portion of the stream roughly in the desired area if - we only want coarse navigation through the stream. */ - -/************************************************************************* - * Many, many internal helpers. The intention is not to be confusing; - * rampant duplication and monolithic function implementation would be - * harder to understand anyway. The high level functions are last. Begin - * grokking near the end of the file */ - -/* read a little more data from the file/pipe into the ogg_sync framer -*/ -#define CHUNKSIZE 65536 /* greater-than-page-size granularity seeking */ -#define READSIZE 2048 /* a smaller read size is needed for low-rate streaming. */ - -static long _get_data(OggVorbis_File *vf){ - errno=0; - if(!(vf->callbacks.read_func))return(-1); - if(vf->datasource){ - char *buffer=ogg_sync_buffer(&vf->oy,READSIZE); - long bytes=(vf->callbacks.read_func)(buffer,1,READSIZE,vf->datasource); - if(bytes>0)ogg_sync_wrote(&vf->oy,bytes); - if(bytes==0 && errno)return(-1); - return(bytes); - }else - return(0); -} - -/* save a tiny smidge of verbosity to make the code more readable */ -static int _seek_helper(OggVorbis_File *vf,ogg_int64_t offset){ - if(vf->datasource){ - if(!(vf->callbacks.seek_func)|| - (vf->callbacks.seek_func)(vf->datasource, offset, SEEK_SET) == -1) - return OV_EREAD; - vf->offset=offset; - ogg_sync_reset(&vf->oy); - }else{ - /* shouldn't happen unless someone writes a broken callback */ - return OV_EFAULT; - } - return 0; -} - -/* The read/seek functions track absolute position within the stream */ - -/* from the head of the stream, get the next page. boundary specifies - if the function is allowed to fetch more data from the stream (and - how much) or only use internally buffered data. - - boundary: -1) unbounded search - 0) read no additional data; use cached only - n) search for a new page beginning for n bytes - - return: <0) did not find a page (OV_FALSE, OV_EOF, OV_EREAD) - n) found a page at absolute offset n */ - -static ogg_int64_t _get_next_page(OggVorbis_File *vf,ogg_page *og, - ogg_int64_t boundary){ - if(boundary>0)boundary+=vf->offset; - while(1){ - long more; - - if(boundary>0 && vf->offset>=boundary)return(OV_FALSE); - more=ogg_sync_pageseek(&vf->oy,og); - - if(more<0){ - /* skipped n bytes */ - vf->offset-=more; - }else{ - if(more==0){ - /* send more paramedics */ - if(!boundary)return(OV_FALSE); - { - long ret=_get_data(vf); - if(ret==0)return(OV_EOF); - if(ret<0)return(OV_EREAD); - } - }else{ - /* got a page. Return the offset at the page beginning, - advance the internal offset past the page end */ - ogg_int64_t ret=vf->offset; - vf->offset+=more; - return(ret); - - } - } - } -} - -/* find the latest page beginning before the current stream cursor - position. Much dirtier than the above as Ogg doesn't have any - backward search linkage. no 'readp' as it will certainly have to - read. */ -/* returns offset or OV_EREAD, OV_FAULT */ -static ogg_int64_t _get_prev_page(OggVorbis_File *vf,ogg_page *og){ - ogg_int64_t begin=vf->offset; - ogg_int64_t end=begin; - ogg_int64_t ret; - ogg_int64_t offset=-1; - - while(offset==-1){ - begin-=CHUNKSIZE; - if(begin<0) - begin=0; - - ret=_seek_helper(vf,begin); - if(ret)return(ret); - - while(vf->offsetoffset); - if(ret==OV_EREAD)return(OV_EREAD); - if(ret<0){ - break; - }else{ - offset=ret; - } - } - } - - /* In a fully compliant, non-multiplexed stream, we'll still be - holding the last page. In multiplexed (or noncompliant streams), - we will probably have to re-read the last page we saw */ - if(og->header_len==0){ - ret=_seek_helper(vf,offset); - if(ret)return(ret); - - ret=_get_next_page(vf,og,CHUNKSIZE); - if(ret<0) - /* this shouldn't be possible */ - return(OV_EFAULT); - } - - return(offset); -} - -static void _add_serialno(ogg_page *og,long **serialno_list, int *n){ - long s = ogg_page_serialno(og); - (*n)++; - - if(*serialno_list){ - *serialno_list = (long*)_ogg_realloc(*serialno_list, sizeof(**serialno_list)*(*n)); - }else{ - *serialno_list = (long*)_ogg_malloc(sizeof(**serialno_list)); - } - - (*serialno_list)[(*n)-1] = s; -} - -/* returns nonzero if found */ -static int _lookup_serialno(long s, long *serialno_list, int n){ - if(serialno_list){ - while(n--){ - if(*serialno_list == s) return 1; - serialno_list++; - } - } - return 0; -} - -static int _lookup_page_serialno(ogg_page *og, long *serialno_list, int n){ - long s = ogg_page_serialno(og); - return _lookup_serialno(s,serialno_list,n); -} - -/* performs the same search as _get_prev_page, but prefers pages of - the specified serial number. If a page of the specified serialno is - spotted during the seek-back-and-read-forward, it will return the - info of last page of the matching serial number instead of the very - last page. If no page of the specified serialno is seen, it will - return the info of last page and alter *serialno. */ -static ogg_int64_t _get_prev_page_serial(OggVorbis_File *vf, - long *serial_list, int serial_n, - int *serialno, ogg_int64_t *granpos){ - ogg_page og; - ogg_int64_t begin=vf->offset; - ogg_int64_t end=begin; - ogg_int64_t ret; - - ogg_int64_t prefoffset=-1; - ogg_int64_t offset=-1; - ogg_int64_t ret_serialno=-1; - ogg_int64_t ret_gran=-1; - - while(offset==-1){ - begin-=CHUNKSIZE; - if(begin<0) - begin=0; - - ret=_seek_helper(vf,begin); - if(ret)return(ret); - - while(vf->offsetoffset); - if(ret==OV_EREAD)return(OV_EREAD); - if(ret<0){ - break; - }else{ - ret_serialno=ogg_page_serialno(&og); - ret_gran=ogg_page_granulepos(&og); - offset=ret; - - if(ret_serialno == *serialno){ - prefoffset=ret; - *granpos=ret_gran; - } - - if(!_lookup_serialno(ret_serialno,serial_list,serial_n)){ - /* we fell off the end of the link, which means we seeked - back too far and shouldn't have been looking in that link - to begin with. If we found the preferred serial number, - forget that we saw it. */ - prefoffset=-1; - } - } - } - } - - /* we're not interested in the page... just the serialno and granpos. */ - if(prefoffset>=0)return(prefoffset); - - *serialno = ret_serialno; - *granpos = ret_gran; - return(offset); - -} - -/* uses the local ogg_stream storage in vf; this is important for - non-streaming input sources */ -static int _fetch_headers(OggVorbis_File *vf,vorbis_info *vi,vorbis_comment *vc, - long **serialno_list, int *serialno_n, - ogg_page *og_ptr){ - ogg_page og; - ogg_packet op; - int i,ret; - int allbos=0; - - if(!og_ptr){ - ogg_int64_t llret=_get_next_page(vf,&og,CHUNKSIZE); - if(llret==OV_EREAD)return(OV_EREAD); - if(llret<0)return(OV_ENOTVORBIS); - og_ptr=&og; - } - - vorbis_info_init(vi); - vorbis_comment_init(vc); - vf->ready_state=OPENED; - - /* extract the serialnos of all BOS pages + the first set of vorbis - headers we see in the link */ - - while(ogg_page_bos(og_ptr)){ - if(serialno_list){ - if(_lookup_page_serialno(og_ptr,*serialno_list,*serialno_n)){ - /* a dupe serialnumber in an initial header packet set == invalid stream */ - if(*serialno_list)_ogg_free(*serialno_list); - *serialno_list=0; - *serialno_n=0; - ret=OV_EBADHEADER; - goto bail_header; - } - - _add_serialno(og_ptr,serialno_list,serialno_n); - } - - if(vf->ready_stateos,ogg_page_serialno(og_ptr)); - ogg_stream_pagein(&vf->os,og_ptr); - - if(ogg_stream_packetout(&vf->os,&op) > 0 && - vorbis_synthesis_idheader(&op)){ - /* vorbis header; continue setup */ - vf->ready_state=STREAMSET; - if((ret=vorbis_synthesis_headerin(vi,vc,&op))){ - ret=OV_EBADHEADER; - goto bail_header; - } - } - } - - /* get next page */ - { - ogg_int64_t llret=_get_next_page(vf,og_ptr,CHUNKSIZE); - if(llret==OV_EREAD){ - ret=OV_EREAD; - goto bail_header; - } - if(llret<0){ - ret=OV_ENOTVORBIS; - goto bail_header; - } - - /* if this page also belongs to our vorbis stream, submit it and break */ - if(vf->ready_state==STREAMSET && - vf->os.serialno == ogg_page_serialno(og_ptr)){ - ogg_stream_pagein(&vf->os,og_ptr); - break; - } - } - } - - if(vf->ready_state!=STREAMSET){ - ret = OV_ENOTVORBIS; - goto bail_header; - } - - while(1){ - - i=0; - while(i<2){ /* get a page loop */ - - while(i<2){ /* get a packet loop */ - - int result=ogg_stream_packetout(&vf->os,&op); - if(result==0)break; - if(result==-1){ - ret=OV_EBADHEADER; - goto bail_header; - } - - if((ret=vorbis_synthesis_headerin(vi,vc,&op))) - goto bail_header; - - i++; - } - - while(i<2){ - if(_get_next_page(vf,og_ptr,CHUNKSIZE)<0){ - ret=OV_EBADHEADER; - goto bail_header; - } - - /* if this page belongs to the correct stream, go parse it */ - if(vf->os.serialno == ogg_page_serialno(og_ptr)){ - ogg_stream_pagein(&vf->os,og_ptr); - break; - } - - /* if we never see the final vorbis headers before the link - ends, abort */ - if(ogg_page_bos(og_ptr)){ - if(allbos){ - ret = OV_EBADHEADER; - goto bail_header; - }else - allbos=1; - } - - /* otherwise, keep looking */ - } - } - - return 0; - } - - bail_header: - vorbis_info_clear(vi); - vorbis_comment_clear(vc); - vf->ready_state=OPENED; - - return ret; -} - -/* Starting from current cursor position, get initial PCM offset of - next page. Consumes the page in the process without decoding - audio, however this is only called during stream parsing upon - seekable open. */ -static ogg_int64_t _initial_pcmoffset(OggVorbis_File *vf, vorbis_info *vi){ - ogg_page og; - ogg_int64_t accumulated=0; - long lastblock=-1; - int result; - int serialno = vf->os.serialno; - - while(1){ - ogg_packet op; - if(_get_next_page(vf,&og,-1)<0) - break; /* should not be possible unless the file is truncated/mangled */ - - if(ogg_page_bos(&og)) break; - if(ogg_page_serialno(&og)!=serialno) continue; - - /* count blocksizes of all frames in the page */ - ogg_stream_pagein(&vf->os,&og); - while((result=ogg_stream_packetout(&vf->os,&op))){ - if(result>0){ /* ignore holes */ - long thisblock=vorbis_packet_blocksize(vi,&op); - if(lastblock!=-1) - accumulated+=(lastblock+thisblock)>>2; - lastblock=thisblock; - } - } - - if(ogg_page_granulepos(&og)!=-1){ - /* pcm offset of last packet on the first audio page */ - accumulated= ogg_page_granulepos(&og)-accumulated; - break; - } - } - - /* less than zero? Either a corrupt file or a stream with samples - trimmed off the beginning, a normal occurrence; in both cases set - the offset to zero */ - if(accumulated<0)accumulated=0; - - return accumulated; -} - -/* finds each bitstream link one at a time using a bisection search - (has to begin by knowing the offset of the lb's initial page). - Recurses for each link so it can alloc the link storage after - finding them all, then unroll and fill the cache at the same time */ -static int _bisect_forward_serialno(OggVorbis_File *vf, - ogg_int64_t begin, - ogg_int64_t searched, - ogg_int64_t end, - ogg_int64_t endgran, - int endserial, - long *currentno_list, - int currentnos, - long m){ - ogg_int64_t pcmoffset; - ogg_int64_t dataoffset=searched; - ogg_int64_t endsearched=end; - ogg_int64_t next=end; - ogg_int64_t searchgran=-1; - ogg_page og; - ogg_int64_t ret,last; - int serialno = vf->os.serialno; - - /* invariants: - we have the headers and serialnos for the link beginning at 'begin' - we have the offset and granpos of the last page in the file (potentially - not a page we care about) - */ - - /* Is the last page in our list of current serialnumbers? */ - if(_lookup_serialno(endserial,currentno_list,currentnos)){ - - /* last page is in the starting serialno list, so we've bisected - down to (or just started with) a single link. Now we need to - find the last vorbis page belonging to the first vorbis stream - for this link. */ - - while(endserial != serialno){ - endserial = serialno; - vf->offset=_get_prev_page_serial(vf,currentno_list,currentnos,&endserial,&endgran); - } - - vf->links=m+1; - if(vf->offsets)_ogg_free(vf->offsets); - if(vf->serialnos)_ogg_free(vf->serialnos); - if(vf->dataoffsets)_ogg_free(vf->dataoffsets); - - vf->offsets=(ogg_int64_t*)_ogg_malloc((vf->links+1)*sizeof(*vf->offsets)); - vf->vi=(vorbis_info*)_ogg_realloc(vf->vi,vf->links*sizeof(*vf->vi)); - vf->vc=(vorbis_comment*)_ogg_realloc(vf->vc,vf->links*sizeof(*vf->vc)); - vf->serialnos=(long*)_ogg_malloc(vf->links*sizeof(*vf->serialnos)); - vf->dataoffsets=(ogg_int64_t*)_ogg_malloc(vf->links*sizeof(*vf->dataoffsets)); - vf->pcmlengths=(ogg_int64_t*)_ogg_malloc(vf->links*2*sizeof(*vf->pcmlengths)); - - vf->offsets[m+1]=end; - vf->offsets[m]=begin; - vf->pcmlengths[m*2+1]=(endgran<0?0:endgran); - - }else{ - - long *next_serialno_list=NULL; - int next_serialnos=0; - vorbis_info vi; - vorbis_comment vc; - - /* the below guards against garbage seperating the last and - first pages of two links. */ - while(searchedoffset){ - ret=_seek_helper(vf,bisect); - if(ret)return(ret); - } - - last=_get_next_page(vf,&og,-1); - if(last==OV_EREAD)return(OV_EREAD); - if(last<0 || !_lookup_page_serialno(&og,currentno_list,currentnos)){ - endsearched=bisect; - if(last>=0)next=last; - }else{ - searched=vf->offset; - } - } - - /* Bisection point found */ - - /* for the time being, fetch end PCM offset the simple way */ - { - int testserial = serialno+1; - vf->offset = next; - while(testserial != serialno){ - testserial = serialno; - vf->offset=_get_prev_page_serial(vf,currentno_list,currentnos,&testserial,&searchgran); - } - } - - if(vf->offset!=next){ - ret=_seek_helper(vf,next); - if(ret)return(ret); - } - - ret=_fetch_headers(vf,&vi,&vc,&next_serialno_list,&next_serialnos,NULL); - if(ret)return(ret); - serialno = vf->os.serialno; - dataoffset = vf->offset; - - /* this will consume a page, however the next bistection always - starts with a raw seek */ - pcmoffset = _initial_pcmoffset(vf,&vi); - - ret=_bisect_forward_serialno(vf,next,vf->offset,end,endgran,endserial, - next_serialno_list,next_serialnos,m+1); - if(ret)return(ret); - - if(next_serialno_list)_ogg_free(next_serialno_list); - - vf->offsets[m+1]=next; - vf->serialnos[m+1]=serialno; - vf->dataoffsets[m+1]=dataoffset; - - vf->vi[m+1]=vi; - vf->vc[m+1]=vc; - - vf->pcmlengths[m*2+1]=searchgran; - vf->pcmlengths[m*2+2]=pcmoffset; - vf->pcmlengths[m*2+3]-=pcmoffset; - if(vf->pcmlengths[m*2+3]<0)vf->pcmlengths[m*2+3]=0; - } - return(0); -} - -static int _make_decode_ready(OggVorbis_File *vf){ - if(vf->ready_state>STREAMSET)return 0; - if(vf->ready_stateseekable){ - if(vorbis_synthesis_init(&vf->vd,vf->vi+vf->current_link)) - return OV_EBADLINK; - }else{ - if(vorbis_synthesis_init(&vf->vd,vf->vi)) - return OV_EBADLINK; - } - vorbis_block_init(&vf->vd,&vf->vb); - vf->ready_state=INITSET; - vf->bittrack=0.f; - vf->samptrack=0.f; - return 0; -} - -static int _open_seekable2(OggVorbis_File *vf){ - ogg_int64_t dataoffset=vf->dataoffsets[0],end,endgran=-1; - int endserial=vf->os.serialno; - int serialno=vf->os.serialno; - - /* we're partially open and have a first link header state in - storage in vf */ - - /* fetch initial PCM offset */ - ogg_int64_t pcmoffset = _initial_pcmoffset(vf,vf->vi); - - /* we can seek, so set out learning all about this file */ - if(vf->callbacks.seek_func && vf->callbacks.tell_func){ - (vf->callbacks.seek_func)(vf->datasource,0,SEEK_END); - vf->offset=vf->end=(vf->callbacks.tell_func)(vf->datasource); - }else{ - vf->offset=vf->end=-1; - } - - /* If seek_func is implemented, tell_func must also be implemented */ - if(vf->end==-1) return(OV_EINVAL); - - /* Get the offset of the last page of the physical bitstream, or, if - we're lucky the last vorbis page of this link as most OggVorbis - files will contain a single logical bitstream */ - end=_get_prev_page_serial(vf,vf->serialnos+2,vf->serialnos[1],&endserial,&endgran); - if(end<0)return(end); - - /* now determine bitstream structure recursively */ - if(_bisect_forward_serialno(vf,0,dataoffset,vf->offset,endgran,endserial, - vf->serialnos+2,vf->serialnos[1],0)<0)return(OV_EREAD); - - vf->offsets[0]=0; - vf->serialnos[0]=serialno; - vf->dataoffsets[0]=dataoffset; - vf->pcmlengths[0]=pcmoffset; - vf->pcmlengths[1]-=pcmoffset; - if(vf->pcmlengths[1]<0)vf->pcmlengths[1]=0; - - return(ov_raw_seek(vf,dataoffset)); -} - -/* clear out the current logical bitstream decoder */ -static void _decode_clear(OggVorbis_File *vf){ - vorbis_dsp_clear(&vf->vd); - vorbis_block_clear(&vf->vb); - vf->ready_state=OPENED; -} - -/* fetch and process a packet. Handles the case where we're at a - bitstream boundary and dumps the decoding machine. If the decoding - machine is unloaded, it loads it. It also keeps pcm_offset up to - date (seek and read both use this. seek uses a special hack with - readp). - - return: <0) error, OV_HOLE (lost packet) or OV_EOF - 0) need more data (only if readp==0) - 1) got a packet -*/ - -static int _fetch_and_process_packet(OggVorbis_File *vf, - ogg_packet *op_in, - int readp, - int spanp){ - ogg_page og; - - /* handle one packet. Try to fetch it from current stream state */ - /* extract packets from page */ - while(1){ - - if(vf->ready_state==STREAMSET){ - int ret=_make_decode_ready(vf); - if(ret<0)return ret; - } - - /* process a packet if we can. */ - - if(vf->ready_state==INITSET){ - int hs=vorbis_synthesis_halfrate_p(vf->vi); - - while(1) { - ogg_packet op; - ogg_packet *op_ptr=(op_in?op_in:&op); - int result=ogg_stream_packetout(&vf->os,op_ptr); - ogg_int64_t granulepos; - - op_in=NULL; - if(result==-1)return(OV_HOLE); /* hole in the data. */ - if(result>0){ - /* got a packet. process it */ - granulepos=op_ptr->granulepos; - if(!vorbis_synthesis(&vf->vb,op_ptr)){ /* lazy check for lazy - header handling. The - header packets aren't - audio, so if/when we - submit them, - vorbis_synthesis will - reject them */ - - /* suck in the synthesis data and track bitrate */ - { - int oldsamples=vorbis_synthesis_pcmout(&vf->vd,NULL); - /* for proper use of libvorbis within libvorbisfile, - oldsamples will always be zero. */ - if(oldsamples)return(OV_EFAULT); - - vorbis_synthesis_blockin(&vf->vd,&vf->vb); - vf->samptrack+=(vorbis_synthesis_pcmout(&vf->vd,NULL)<bittrack+=op_ptr->bytes*8; - } - - /* update the pcm offset. */ - if(granulepos!=-1 && !op_ptr->e_o_s){ - int link=(vf->seekable?vf->current_link:0); - int i,samples; - - /* this packet has a pcm_offset on it (the last packet - completed on a page carries the offset) After processing - (above), we know the pcm position of the *last* sample - ready to be returned. Find the offset of the *first* - - As an aside, this trick is inaccurate if we begin - reading anew right at the last page; the end-of-stream - granulepos declares the last frame in the stream, and the - last packet of the last page may be a partial frame. - So, we need a previous granulepos from an in-sequence page - to have a reference point. Thus the !op_ptr->e_o_s clause - above */ - - if(vf->seekable && link>0) - granulepos-=vf->pcmlengths[link*2]; - if(granulepos<0)granulepos=0; /* actually, this - shouldn't be possible - here unless the stream - is very broken */ - - samples=(vorbis_synthesis_pcmout(&vf->vd,NULL)<pcmlengths[i*2+1]; - vf->pcm_offset=granulepos; - } - return(1); - } - } - else - break; - } - } - - if(vf->ready_state>=OPENED){ - ogg_int64_t ret; - - while(1){ - /* the loop is not strictly necessary, but there's no sense in - doing the extra checks of the larger loop for the common - case in a multiplexed bistream where the page is simply - part of a different logical bitstream; keep reading until - we get one with the correct serialno */ - - if(!readp)return(0); - if((ret=_get_next_page(vf,&og,-1))<0){ - return(OV_EOF); /* eof. leave unitialized */ - } - - /* bitrate tracking; add the header's bytes here, the body bytes - are done by packet above */ - vf->bittrack+=og.header_len*8; - - if(vf->ready_state==INITSET){ - if(vf->current_serialno!=ogg_page_serialno(&og)){ - - /* two possibilities: - 1) our decoding just traversed a bitstream boundary - 2) another stream is multiplexed into this logical section */ - - if(ogg_page_bos(&og)){ - /* boundary case */ - if(!spanp) - return(OV_EOF); - - _decode_clear(vf); - - if(!vf->seekable){ - vorbis_info_clear(vf->vi); - vorbis_comment_clear(vf->vc); - } - break; - - }else - continue; /* possibility #2 */ - } - } - - break; - } - } - - /* Do we need to load a new machine before submitting the page? */ - /* This is different in the seekable and non-seekable cases. - - In the seekable case, we already have all the header - information loaded and cached; we just initialize the machine - with it and continue on our merry way. - - In the non-seekable (streaming) case, we'll only be at a - boundary if we just left the previous logical bitstream and - we're now nominally at the header of the next bitstream - */ - - if(vf->ready_state!=INITSET){ - int link; - - if(vf->ready_stateseekable){ - long serialno = ogg_page_serialno(&og); - - /* match the serialno to bitstream section. We use this rather than - offset positions to avoid problems near logical bitstream - boundaries */ - - for(link=0;linklinks;link++) - if(vf->serialnos[link]==serialno)break; - - if(link==vf->links) continue; /* not the desired Vorbis - bitstream section; keep - trying */ - - vf->current_serialno=serialno; - vf->current_link=link; - - ogg_stream_reset_serialno(&vf->os,vf->current_serialno); - vf->ready_state=STREAMSET; - - }else{ - /* we're streaming */ - /* fetch the three header packets, build the info struct */ - - int ret=_fetch_headers(vf,vf->vi,vf->vc,NULL,NULL,&og); - if(ret)return(ret); - vf->current_serialno=vf->os.serialno; - vf->current_link++; - //link=0; - } - } - } - - /* the buffered page is the data we want, and we're ready for it; - add it to the stream state */ - ogg_stream_pagein(&vf->os,&og); - - } -} - -/* if, eg, 64 bit stdio is configured by default, this will build with - fseek64 */ -static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence){ - if(f==NULL)return(-1); - return fseek(f,off,whence); -} - -static int _ov_open1(void *f,OggVorbis_File *vf,const char *initial, - long ibytes, ov_callbacks callbacks){ - int offsettest=((f && callbacks.seek_func)?callbacks.seek_func(f,0,SEEK_CUR):-1); - long *serialno_list=NULL; - int serialno_list_size=0; - int ret; - - memset(vf,0,sizeof(*vf)); - vf->datasource=f; - vf->callbacks = callbacks; - - /* init the framing state */ - ogg_sync_init(&vf->oy); - - /* perhaps some data was previously read into a buffer for testing - against other stream types. Allow initialization from this - previously read data (especially as we may be reading from a - non-seekable stream) */ - if(initial){ - char *buffer=ogg_sync_buffer(&vf->oy,ibytes); - memcpy(buffer,initial,ibytes); - ogg_sync_wrote(&vf->oy,ibytes); - } - - /* can we seek? Stevens suggests the seek test was portable */ - if(offsettest!=-1)vf->seekable=1; - - /* No seeking yet; Set up a 'single' (current) logical bitstream - entry for partial open */ - vf->links=1; - vf->vi=(vorbis_info*) _ogg_calloc(vf->links,sizeof(*vf->vi)); - vf->vc=(vorbis_comment*) _ogg_calloc(vf->links,sizeof(*vf->vc)); - ogg_stream_init(&vf->os,-1); /* fill in the serialno later */ - - /* Fetch all BOS pages, store the vorbis header and all seen serial - numbers, load subsequent vorbis setup headers */ - if((ret=_fetch_headers(vf,vf->vi,vf->vc,&serialno_list,&serialno_list_size,NULL))<0){ - vf->datasource=NULL; - ov_clear(vf); - }else{ - /* serial number list for first link needs to be held somewhere - for second stage of seekable stream open; this saves having to - seek/reread first link's serialnumber data then. */ - vf->serialnos=(long*)_ogg_calloc(serialno_list_size+2,sizeof(*vf->serialnos)); - vf->serialnos[0]=vf->current_serialno=vf->os.serialno; - vf->serialnos[1]=serialno_list_size; - memcpy(vf->serialnos+2,serialno_list,serialno_list_size*sizeof(*vf->serialnos)); - - vf->offsets=(ogg_int64_t*)_ogg_calloc(1,sizeof(*vf->offsets)); - vf->dataoffsets=(ogg_int64_t*)_ogg_calloc(1,sizeof(*vf->dataoffsets)); - vf->offsets[0]=0; - vf->dataoffsets[0]=vf->offset; - - vf->ready_state=PARTOPEN; - } - if(serialno_list)_ogg_free(serialno_list); - return(ret); -} - -static int _ov_open2(OggVorbis_File *vf){ - if(vf->ready_state != PARTOPEN) return OV_EINVAL; - vf->ready_state=OPENED; - if(vf->seekable){ - int ret=_open_seekable2(vf); - if(ret){ - vf->datasource=NULL; - ov_clear(vf); - } - return(ret); - }else - vf->ready_state=STREAMSET; - - return 0; -} - - -/* clear out the OggVorbis_File struct */ -int ov_clear(OggVorbis_File *vf){ - if(vf){ - vorbis_block_clear(&vf->vb); - vorbis_dsp_clear(&vf->vd); - ogg_stream_clear(&vf->os); - - if(vf->vi && vf->links){ - int i; - for(i=0;ilinks;i++){ - vorbis_info_clear(vf->vi+i); - vorbis_comment_clear(vf->vc+i); - } - _ogg_free(vf->vi); - _ogg_free(vf->vc); - } - if(vf->dataoffsets)_ogg_free(vf->dataoffsets); - if(vf->pcmlengths)_ogg_free(vf->pcmlengths); - if(vf->serialnos)_ogg_free(vf->serialnos); - if(vf->offsets)_ogg_free(vf->offsets); - ogg_sync_clear(&vf->oy); - if(vf->datasource && vf->callbacks.close_func) - (vf->callbacks.close_func)(vf->datasource); - memset(vf,0,sizeof(*vf)); - } -#ifdef DEBUG_LEAKS - _VDBG_dump(); -#endif - return(0); -} - -/* inspects the OggVorbis file and finds/documents all the logical - bitstreams contained in it. Tries to be tolerant of logical - bitstream sections that are truncated/woogie. - - return: -1) error - 0) OK -*/ - -int ov_open_callbacks(void *f,OggVorbis_File *vf, - const char *initial,long ibytes,ov_callbacks callbacks){ - int ret=_ov_open1(f,vf,initial,ibytes,callbacks); - if(ret)return ret; - return _ov_open2(vf); -} - -int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){ - ov_callbacks callbacks = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, - (int (*)(void *)) fclose, - (long (*)(void *)) ftell - }; - - return ov_open_callbacks((void *)f, vf, initial, ibytes, callbacks); -} - -int ov_fopen(const char *path,OggVorbis_File *vf){ - int ret; - FILE *f = fopen(path,"rb"); - if(!f) return -1; - - ret = ov_open(f,vf,NULL,0); - if(ret) fclose(f); - return ret; -} - - -/* cheap hack for game usage where downsampling is desirable; there's - no need for SRC as we can just do it cheaply in libvorbis. */ - -int ov_halfrate(OggVorbis_File *vf,int flag){ - int i; - if(vf->vi==NULL)return OV_EINVAL; - if(vf->ready_state>STREAMSET){ - /* clear out stream state; dumping the decode machine is needed to - reinit the MDCT lookups. */ - vorbis_dsp_clear(&vf->vd); - vorbis_block_clear(&vf->vb); - vf->ready_state=STREAMSET; - if(vf->pcm_offset>=0){ - ogg_int64_t pos=vf->pcm_offset; - vf->pcm_offset=-1; /* make sure the pos is dumped if unseekable */ - ov_pcm_seek(vf,pos); - } - } - - for(i=0;ilinks;i++){ - if(vorbis_synthesis_halfrate(vf->vi+i,flag)){ - if(flag) ov_halfrate(vf,0); - return OV_EINVAL; - } - } - return 0; -} - -int ov_halfrate_p(OggVorbis_File *vf){ - if(vf->vi==NULL)return OV_EINVAL; - return vorbis_synthesis_halfrate_p(vf->vi); -} - -/* Only partially open the vorbis file; test for Vorbisness, and load - the headers for the first chain. Do not seek (although test for - seekability). Use ov_test_open to finish opening the file, else - ov_clear to close/free it. Same return codes as open. */ - -int ov_test_callbacks(void *f,OggVorbis_File *vf, - const char *initial,long ibytes,ov_callbacks callbacks) -{ - return _ov_open1(f,vf,initial,ibytes,callbacks); -} - -int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes){ - ov_callbacks callbacks = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) _fseek64_wrap, - (int (*)(void *)) fclose, - (long (*)(void *)) ftell - }; - - return ov_test_callbacks((void *)f, vf, initial, ibytes, callbacks); -} - -int ov_test_open(OggVorbis_File *vf){ - if(vf->ready_state!=PARTOPEN)return(OV_EINVAL); - return _ov_open2(vf); -} - -/* How many logical bitstreams in this physical bitstream? */ -long ov_streams(OggVorbis_File *vf){ - return vf->links; -} - -/* Is the FILE * associated with vf seekable? */ -long ov_seekable(OggVorbis_File *vf){ - return vf->seekable; -} - -/* returns the bitrate for a given logical bitstream or the entire - physical bitstream. If the file is open for random access, it will - find the *actual* average bitrate. If the file is streaming, it - returns the nominal bitrate (if set) else the average of the - upper/lower bounds (if set) else -1 (unset). - - If you want the actual bitrate field settings, get them from the - vorbis_info structs */ - -long ov_bitrate(OggVorbis_File *vf,int i){ - if(vf->ready_state=vf->links)return(OV_EINVAL); - if(!vf->seekable && i!=0)return(ov_bitrate(vf,0)); - if(i<0){ - ogg_int64_t bits=0; - int i; - float br; - for(i=0;ilinks;i++) - bits+=(vf->offsets[i+1]-vf->dataoffsets[i])*8; - /* This once read: return(rint(bits/ov_time_total(vf,-1))); - * gcc 3.x on x86 miscompiled this at optimisation level 2 and above, - * so this is slightly transformed to make it work. - */ - br = bits/ov_time_total(vf,-1); - return(rint(br)); - }else{ - if(vf->seekable){ - /* return the actual bitrate */ - return(rint((vf->offsets[i+1]-vf->dataoffsets[i])*8/ov_time_total(vf,i))); - }else{ - /* return nominal if set */ - if(vf->vi[i].bitrate_nominal>0){ - return vf->vi[i].bitrate_nominal; - }else{ - if(vf->vi[i].bitrate_upper>0){ - if(vf->vi[i].bitrate_lower>0){ - return (vf->vi[i].bitrate_upper+vf->vi[i].bitrate_lower)/2; - }else{ - return vf->vi[i].bitrate_upper; - } - } - return(OV_FALSE); - } - } - } -} - -/* returns the actual bitrate since last call. returns -1 if no - additional data to offer since last call (or at beginning of stream), - EINVAL if stream is only partially open -*/ -long ov_bitrate_instant(OggVorbis_File *vf){ - int link=(vf->seekable?vf->current_link:0); - long ret; - if(vf->ready_statesamptrack==0)return(OV_FALSE); - ret=vf->bittrack/vf->samptrack*vf->vi[link].rate+.5; - vf->bittrack=0.f; - vf->samptrack=0.f; - return(ret); -} - -/* Guess */ -long ov_serialnumber(OggVorbis_File *vf,int i){ - if(i>=vf->links)return(ov_serialnumber(vf,vf->links-1)); - if(!vf->seekable && i>=0)return(ov_serialnumber(vf,-1)); - if(i<0){ - return(vf->current_serialno); - }else{ - return(vf->serialnos[i]); - } -} - -/* returns: total raw (compressed) length of content if i==-1 - raw (compressed) length of that logical bitstream for i==0 to n - OV_EINVAL if the stream is not seekable (we can't know the length) - or if stream is only partially open -*/ -ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i){ - if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); - if(i<0){ - ogg_int64_t acc=0; - int i; - for(i=0;ilinks;i++) - acc+=ov_raw_total(vf,i); - return(acc); - }else{ - return(vf->offsets[i+1]-vf->offsets[i]); - } -} - -/* returns: total PCM length (samples) of content if i==-1 PCM length - (samples) of that logical bitstream for i==0 to n - OV_EINVAL if the stream is not seekable (we can't know the - length) or only partially open -*/ -ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i){ - if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); - if(i<0){ - ogg_int64_t acc=0; - int i; - for(i=0;ilinks;i++) - acc+=ov_pcm_total(vf,i); - return(acc); - }else{ - return(vf->pcmlengths[i*2+1]); - } -} - -/* returns: total seconds of content if i==-1 - seconds in that logical bitstream for i==0 to n - OV_EINVAL if the stream is not seekable (we can't know the - length) or only partially open -*/ -double ov_time_total(OggVorbis_File *vf,int i){ - if(vf->ready_stateseekable || i>=vf->links)return(OV_EINVAL); - if(i<0){ - double acc=0; - int i; - for(i=0;ilinks;i++) - acc+=ov_time_total(vf,i); - return(acc); - }else{ - return((double)(vf->pcmlengths[i*2+1])/vf->vi[i].rate); - } -} - -/* seek to an offset relative to the *compressed* data. This also - scans packets to update the PCM cursor. It will cross a logical - bitstream boundary, but only if it can't get any packets out of the - tail of the bitstream we seek to (so no surprises). - - returns zero on success, nonzero on failure */ - -int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos){ - ogg_stream_state work_os; - int ret; - - if(vf->ready_stateseekable) - return(OV_ENOSEEK); /* don't dump machine if we can't seek */ - - if(pos<0 || pos>vf->end)return(OV_EINVAL); - - /* is the seek position outside our current link [if any]? */ - if(vf->ready_state>=STREAMSET){ - if(posoffsets[vf->current_link] || pos>=vf->offsets[vf->current_link+1]) - _decode_clear(vf); /* clear out stream state */ - } - - /* don't yet clear out decoding machine (if it's initialized), in - the case we're in the same link. Restart the decode lapping, and - let _fetch_and_process_packet deal with a potential bitstream - boundary */ - vf->pcm_offset=-1; - ogg_stream_reset_serialno(&vf->os, - vf->current_serialno); /* must set serialno */ - vorbis_synthesis_restart(&vf->vd); - - ret=_seek_helper(vf,pos); - if(ret)goto seek_error; - - /* we need to make sure the pcm_offset is set, but we don't want to - advance the raw cursor past good packets just to get to the first - with a granulepos. That's not equivalent behavior to beginning - decoding as immediately after the seek position as possible. - - So, a hack. We use two stream states; a local scratch state and - the shared vf->os stream state. We use the local state to - scan, and the shared state as a buffer for later decode. - - Unfortuantely, on the last page we still advance to last packet - because the granulepos on the last page is not necessarily on a - packet boundary, and we need to make sure the granpos is - correct. - */ - - { - ogg_page og; - ogg_packet op; - int lastblock=0; - int accblock=0; - int thisblock=0; - int lastflag=0; - int firstflag=0; - ogg_int64_t pagepos=-1; - - ogg_stream_init(&work_os,vf->current_serialno); /* get the memory ready */ - ogg_stream_reset(&work_os); /* eliminate the spurious OV_HOLE - return from not necessarily - starting from the beginning */ - - while(1){ - if(vf->ready_state>=STREAMSET){ - /* snarf/scan a packet if we can */ - int result=ogg_stream_packetout(&work_os,&op); - - if(result>0){ - - if(vf->vi[vf->current_link].codec_setup){ - thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); - if(thisblock<0){ - ogg_stream_packetout(&vf->os,NULL); - thisblock=0; - }else{ - - /* We can't get a guaranteed correct pcm position out of the - last page in a stream because it might have a 'short' - granpos, which can only be detected in the presence of a - preceding page. However, if the last page is also the first - page, the granpos rules of a first page take precedence. Not - only that, but for first==last, the EOS page must be treated - as if its a normal first page for the stream to open/play. */ - if(lastflag && !firstflag) - ogg_stream_packetout(&vf->os,NULL); - else - if(lastblock)accblock+=(lastblock+thisblock)>>2; - } - - if(op.granulepos!=-1){ - int i,link=vf->current_link; - ogg_int64_t granulepos=op.granulepos-vf->pcmlengths[link*2]; - if(granulepos<0)granulepos=0; - - for(i=0;ipcmlengths[i*2+1]; - vf->pcm_offset=granulepos-accblock; - if(vf->pcm_offset<0)vf->pcm_offset=0; - break; - } - lastblock=thisblock; - continue; - }else - ogg_stream_packetout(&vf->os,NULL); - } - } - - if(!lastblock){ - pagepos=_get_next_page(vf,&og,-1); - if(pagepos<0){ - vf->pcm_offset=ov_pcm_total(vf,-1); - break; - } - }else{ - /* huh? Bogus stream with packets but no granulepos */ - vf->pcm_offset=-1; - break; - } - - /* has our decoding just traversed a bitstream boundary? */ - if(vf->ready_state>=STREAMSET){ - if(vf->current_serialno!=ogg_page_serialno(&og)){ - - /* two possibilities: - 1) our decoding just traversed a bitstream boundary - 2) another stream is multiplexed into this logical section? */ - - if(ogg_page_bos(&og)){ - /* we traversed */ - _decode_clear(vf); /* clear out stream state */ - ogg_stream_clear(&work_os); - } /* else, do nothing; next loop will scoop another page */ - } - } - - if(vf->ready_statelinks;link++) - if(vf->serialnos[link]==serialno)break; - - if(link==vf->links) continue; /* not the desired Vorbis - bitstream section; keep - trying */ - vf->current_link=link; - vf->current_serialno=serialno; - ogg_stream_reset_serialno(&vf->os,serialno); - ogg_stream_reset_serialno(&work_os,serialno); - vf->ready_state=STREAMSET; - firstflag=(pagepos<=vf->dataoffsets[link]); - } - - ogg_stream_pagein(&vf->os,&og); - ogg_stream_pagein(&work_os,&og); - lastflag=ogg_page_eos(&og); - - } - } - - ogg_stream_clear(&work_os); - vf->bittrack=0.f; - vf->samptrack=0.f; - return(0); - - seek_error: - /* dump the machine so we're in a known state */ - vf->pcm_offset=-1; - ogg_stream_clear(&work_os); - _decode_clear(vf); - return OV_EBADLINK; -} - -/* Page granularity seek (faster than sample granularity because we - don't do the last bit of decode to find a specific sample). - - Seek to the last [granule marked] page preceding the specified pos - location, such that decoding past the returned point will quickly - arrive at the requested position. */ -int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos){ - int link=-1; - ogg_int64_t result=0; - ogg_int64_t total=ov_pcm_total(vf,-1); - - if(vf->ready_stateseekable)return(OV_ENOSEEK); - - if(pos<0 || pos>total)return(OV_EINVAL); - - /* which bitstream section does this pcm offset occur in? */ - for(link=vf->links-1;link>=0;link--){ - total-=vf->pcmlengths[link*2+1]; - if(pos>=total)break; - } - - /* search within the logical bitstream for the page with the highest - pcm_pos preceding (or equal to) pos. There is a danger here; - missing pages or incorrect frame number information in the - bitstream could make our task impossible. Account for that (it - would be an error condition) */ - - /* new search algorithm by HB (Nicholas Vinen) */ - { - ogg_int64_t end=vf->offsets[link+1]; - ogg_int64_t begin=vf->offsets[link]; - ogg_int64_t begintime = vf->pcmlengths[link*2]; - ogg_int64_t endtime = vf->pcmlengths[link*2+1]+begintime; - ogg_int64_t target=pos-total+begintime; - ogg_int64_t best=begin; - - ogg_page og; - while(beginoffset){ - result=_seek_helper(vf,bisect); - if(result) goto seek_error; - } - - while(beginoffset); - if(result==OV_EREAD) goto seek_error; - if(result<0){ - if(bisect<=begin+1) - end=begin; /* found it */ - else{ - if(bisect==0) goto seek_error; - bisect-=CHUNKSIZE; - if(bisect<=begin)bisect=begin+1; - result=_seek_helper(vf,bisect); - if(result) goto seek_error; - } - }else{ - ogg_int64_t granulepos; - - if(ogg_page_serialno(&og)!=vf->serialnos[link]) - continue; - - granulepos=ogg_page_granulepos(&og); - if(granulepos==-1)continue; - - if(granuleposoffset; /* raw offset of next page */ - begintime=granulepos; - - if(target-begintime>44100)break; - bisect=begin; /* *not* begin + 1 */ - }else{ - if(bisect<=begin+1) - end=begin; /* found it */ - else{ - if(end==vf->offset){ /* we're pretty close - we'd be stuck in */ - end=result; - bisect-=CHUNKSIZE; /* an endless loop otherwise. */ - if(bisect<=begin)bisect=begin+1; - result=_seek_helper(vf,bisect); - if(result) goto seek_error; - }else{ - end=bisect; - endtime=granulepos; - break; - } - } - } - } - } - } - - /* found our page. seek to it, update pcm offset. Easier case than - raw_seek, don't keep packets preceding granulepos. */ - { - ogg_page og; - ogg_packet op; - - /* seek */ - result=_seek_helper(vf,best); - vf->pcm_offset=-1; - if(result) goto seek_error; - result=_get_next_page(vf,&og,-1); - if(result<0) goto seek_error; - - if(link!=vf->current_link){ - /* Different link; dump entire decode machine */ - _decode_clear(vf); - - vf->current_link=link; - vf->current_serialno=vf->serialnos[link]; - vf->ready_state=STREAMSET; - - }else{ - vorbis_synthesis_restart(&vf->vd); - } - - ogg_stream_reset_serialno(&vf->os,vf->current_serialno); - ogg_stream_pagein(&vf->os,&og); - - /* pull out all but last packet; the one with granulepos */ - while(1){ - result=ogg_stream_packetpeek(&vf->os,&op); - if(result==0){ - /* !!! the packet finishing this page originated on a - preceding page. Keep fetching previous pages until we - get one with a granulepos or without the 'continued' flag - set. Then just use raw_seek for simplicity. */ - - result=_seek_helper(vf,best); - if(result<0) goto seek_error; - - while(1){ - result=_get_prev_page(vf,&og); - if(result<0) goto seek_error; - if(ogg_page_serialno(&og)==vf->current_serialno && - (ogg_page_granulepos(&og)>-1 || - !ogg_page_continued(&og))){ - return ov_raw_seek(vf,result); - } - vf->offset=result; - } - } - if(result<0){ - result = OV_EBADPACKET; - goto seek_error; - } - if(op.granulepos!=-1){ - vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; - if(vf->pcm_offset<0)vf->pcm_offset=0; - vf->pcm_offset+=total; - break; - }else - result=ogg_stream_packetout(&vf->os,NULL); - (void) result; - } - } - } - - /* verify result */ - if(vf->pcm_offset>pos || pos>ov_pcm_total(vf,-1)){ - result=OV_EFAULT; - goto seek_error; - } - vf->bittrack=0.f; - vf->samptrack=0.f; - return(0); - - seek_error: - /* dump machine so we're in a known state */ - vf->pcm_offset=-1; - _decode_clear(vf); - return (int)result; -} - -/* seek to a sample offset relative to the decompressed pcm stream - returns zero on success, nonzero on failure */ - -int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos){ - int thisblock,lastblock=0; - int ret=ov_pcm_seek_page(vf,pos); - if(ret<0)return(ret); - if((ret=_make_decode_ready(vf)))return ret; - - /* discard leading packets we don't need for the lapping of the - position we want; don't decode them */ - - while(1){ - ogg_packet op; - ogg_page og; - - int ret=ogg_stream_packetpeek(&vf->os,&op); - if(ret>0){ - thisblock=vorbis_packet_blocksize(vf->vi+vf->current_link,&op); - if(thisblock<0){ - ogg_stream_packetout(&vf->os,NULL); - continue; /* non audio packet */ - } - if(lastblock)vf->pcm_offset+=(lastblock+thisblock)>>2; - - if(vf->pcm_offset+((thisblock+ - vorbis_info_blocksize(vf->vi,1))>>2)>=pos)break; - - /* remove the packet from packet queue and track its granulepos */ - ogg_stream_packetout(&vf->os,NULL); - vorbis_synthesis_trackonly(&vf->vb,&op); /* set up a vb with - only tracking, no - pcm_decode */ - vorbis_synthesis_blockin(&vf->vd,&vf->vb); - - /* end of logical stream case is hard, especially with exact - length positioning. */ - - if(op.granulepos>-1){ - int i; - /* always believe the stream markers */ - vf->pcm_offset=op.granulepos-vf->pcmlengths[vf->current_link*2]; - if(vf->pcm_offset<0)vf->pcm_offset=0; - for(i=0;icurrent_link;i++) - vf->pcm_offset+=vf->pcmlengths[i*2+1]; - } - - lastblock=thisblock; - - }else{ - if(ret<0 && ret!=OV_HOLE)break; - - /* suck in a new page */ - if(_get_next_page(vf,&og,-1)<0)break; - if(ogg_page_bos(&og))_decode_clear(vf); - - if(vf->ready_statelinks;link++) - if(vf->serialnos[link]==serialno)break; - if(link==vf->links) continue; - vf->current_link=link; - - vf->ready_state=STREAMSET; - vf->current_serialno=ogg_page_serialno(&og); - ogg_stream_reset_serialno(&vf->os,serialno); - ret=_make_decode_ready(vf); - if(ret)return ret; - lastblock=0; - } - - ogg_stream_pagein(&vf->os,&og); - } - } - - vf->bittrack=0.f; - vf->samptrack=0.f; - /* discard samples until we reach the desired position. Crossing a - logical bitstream boundary with abandon is OK. */ - { - /* note that halfrate could be set differently in each link, but - vorbisfile encoforces all links are set or unset */ - int hs=vorbis_synthesis_halfrate_p(vf->vi); - while(vf->pcm_offset<((pos>>hs)<pcm_offset)>>hs; - long samples=vorbis_synthesis_pcmout(&vf->vd,NULL); - - if(samples>target)samples=target; - vorbis_synthesis_read(&vf->vd,samples); - vf->pcm_offset+=samples<pcm_offset=ov_pcm_total(vf,-1); /* eof */ - } - } - return 0; -} - -/* seek to a playback time relative to the decompressed pcm stream - returns zero on success, nonzero on failure */ -int ov_time_seek(OggVorbis_File *vf,double seconds){ - /* translate time to PCM position and call ov_pcm_seek */ - - int link=-1; - ogg_int64_t pcm_total=0; - double time_total=0.; - - if(vf->ready_stateseekable)return(OV_ENOSEEK); - if(seconds<0)return(OV_EINVAL); - - /* which bitstream section does this time offset occur in? */ - for(link=0;linklinks;link++){ - double addsec = ov_time_total(vf,link); - if(secondspcmlengths[link*2+1]; - } - - if(link==vf->links)return(OV_EINVAL); - - /* enough information to convert time offset to pcm offset */ - { - ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate; - return(ov_pcm_seek(vf,target)); - } -} - -/* page-granularity version of ov_time_seek - returns zero on success, nonzero on failure */ -int ov_time_seek_page(OggVorbis_File *vf,double seconds){ - /* translate time to PCM position and call ov_pcm_seek */ - - int link=-1; - ogg_int64_t pcm_total=0; - double time_total=0.; - - if(vf->ready_stateseekable)return(OV_ENOSEEK); - if(seconds<0)return(OV_EINVAL); - - /* which bitstream section does this time offset occur in? */ - for(link=0;linklinks;link++){ - double addsec = ov_time_total(vf,link); - if(secondspcmlengths[link*2+1]; - } - - if(link==vf->links)return(OV_EINVAL); - - /* enough information to convert time offset to pcm offset */ - { - ogg_int64_t target=pcm_total+(seconds-time_total)*vf->vi[link].rate; - return(ov_pcm_seek_page(vf,target)); - } -} - -/* tell the current stream offset cursor. Note that seek followed by - tell will likely not give the set offset due to caching */ -ogg_int64_t ov_raw_tell(OggVorbis_File *vf){ - if(vf->ready_stateoffset); -} - -/* return PCM offset (sample) of next PCM sample to be read */ -ogg_int64_t ov_pcm_tell(OggVorbis_File *vf){ - if(vf->ready_statepcm_offset); -} - -/* return time offset (seconds) of next PCM sample to be read */ -double ov_time_tell(OggVorbis_File *vf){ - int link=0; - ogg_int64_t pcm_total=0; - double time_total=0.f; - - if(vf->ready_stateseekable){ - pcm_total=ov_pcm_total(vf,-1); - time_total=ov_time_total(vf,-1); - - /* which bitstream section does this time offset occur in? */ - for(link=vf->links-1;link>=0;link--){ - pcm_total-=vf->pcmlengths[link*2+1]; - time_total-=ov_time_total(vf,link); - if(vf->pcm_offset>=pcm_total)break; - } - } - - return((double)time_total+(double)(vf->pcm_offset-pcm_total)/vf->vi[link].rate); -} - -/* link: -1) return the vorbis_info struct for the bitstream section - currently being decoded - 0-n) to request information for a specific bitstream section - - In the case of a non-seekable bitstream, any call returns the - current bitstream. NULL in the case that the machine is not - initialized */ - -vorbis_info *ov_info(OggVorbis_File *vf,int link){ - if(vf->seekable){ - if(link<0) - if(vf->ready_state>=STREAMSET) - return vf->vi+vf->current_link; - else - return vf->vi; - else - if(link>=vf->links) - return NULL; - else - return vf->vi+link; - }else{ - return vf->vi; - } -} - -/* grr, strong typing, grr, no templates/inheritence, grr */ -vorbis_comment *ov_comment(OggVorbis_File *vf,int link){ - if(vf->seekable){ - if(link<0) - if(vf->ready_state>=STREAMSET) - return vf->vc+vf->current_link; - else - return vf->vc; - else - if(link>=vf->links) - return NULL; - else - return vf->vc+link; - }else{ - return vf->vc; - } -} - -static int host_is_big_endian() { - ogg_int32_t pattern = 0xfeedface; /* deadbeef */ - unsigned char *bytewise = (unsigned char *)&pattern; - if (bytewise[0] == 0xfe) return 1; - return 0; -} - -/* up to this point, everything could more or less hide the multiple - logical bitstream nature of chaining from the toplevel application - if the toplevel application didn't particularly care. However, at - the point that we actually read audio back, the multiple-section - nature must surface: Multiple bitstream sections do not necessarily - have to have the same number of channels or sampling rate. - - ov_read returns the sequential logical bitstream number currently - being decoded along with the PCM data in order that the toplevel - application can take action on channel/sample rate changes. This - number will be incremented even for streamed (non-seekable) streams - (for seekable streams, it represents the actual logical bitstream - index within the physical bitstream. Note that the accessor - functions above are aware of this dichotomy). - - ov_read_filter is exactly the same as ov_read except that it processes - the decoded audio data through a filter before packing it into the - requested format. This gives greater accuracy than applying a filter - after the audio has been converted into integral PCM. - - input values: buffer) a buffer to hold packed PCM data for return - length) the byte length requested to be placed into buffer - bigendianp) should the data be packed LSB first (0) or - MSB first (1) - word) word size for output. currently 1 (byte) or - 2 (16 bit short) - - return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL) - 0) EOF - n) number of bytes of PCM actually returned. The - below works on a packet-by-packet basis, so the - return length is not related to the 'length' passed - in, just guaranteed to fit. - - *section) set to the logical bitstream number */ - -long ov_read_filter(OggVorbis_File *vf,char *buffer,int length, - int bigendianp,int word,int sgned,int *bitstream, - void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param){ - int i,j; - int host_endian = host_is_big_endian(); - int hs; - - float **pcm; - long samples; - - if(vf->ready_stateready_state==INITSET){ - samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); - if(samples)break; - } - - /* suck in another packet */ - { - int ret=_fetch_and_process_packet(vf,NULL,1,1); - if(ret==OV_EOF) - return(0); - if(ret<=0) - return(ret); - } - - } - - if(samples>0){ - - /* yay! proceed to pack data into the byte buffer */ - - long channels=ov_info(vf,-1)->channels; - long bytespersample=word * channels; - vorbis_fpu_control fpu; - (void) fpu; - if(samples>length/bytespersample)samples=length/bytespersample; - - if(samples <= 0) - return OV_EINVAL; - - /* Here. */ - if(filter) - filter(pcm,channels,samples,filter_param); - - /* a tight loop to pack each size */ - { - int val; - if(word==1){ - int off=(sgned?0:128); - vorbis_fpu_setround(&fpu); - for(j=0;j127)val=127; - else if(val<-128)val=-128; - *buffer++=val+off; - } - vorbis_fpu_restore(fpu); - }else{ - int off=(sgned?0:32768); - - if(host_endian==bigendianp){ - if(sgned){ - - vorbis_fpu_setround(&fpu); - for(i=0;i32767)val=32767; - else if(val<-32768)val=-32768; - *dest=val; - dest+=channels; - } - } - vorbis_fpu_restore(fpu); - - }else{ - - vorbis_fpu_setround(&fpu); - for(i=0;i32767)val=32767; - else if(val<-32768)val=-32768; - *dest=val+off; - dest+=channels; - } - } - vorbis_fpu_restore(fpu); - - } - }else if(bigendianp){ - - vorbis_fpu_setround(&fpu); - for(j=0;j32767)val=32767; - else if(val<-32768)val=-32768; - val+=off; - *buffer++=(val>>8); - *buffer++=(val&0xff); - } - vorbis_fpu_restore(fpu); - - }else{ - int val; - vorbis_fpu_setround(&fpu); - for(j=0;j32767)val=32767; - else if(val<-32768)val=-32768; - val+=off; - *buffer++=(val&0xff); - *buffer++=(val>>8); - } - vorbis_fpu_restore(fpu); - - } - } - } - - vorbis_synthesis_read(&vf->vd,samples); - hs=vorbis_synthesis_halfrate_p(vf->vi); - vf->pcm_offset+=(samples<current_link; - return(samples*bytespersample); - }else{ - return(samples); - } -} - -long ov_read(OggVorbis_File *vf,char *buffer,int length, - int bigendianp,int word,int sgned,int *bitstream){ - return ov_read_filter(vf, buffer, length, bigendianp, word, sgned, bitstream, NULL, NULL); -} - -/* input values: pcm_channels) a float vector per channel of output - length) the sample length being read by the app - - return values: <0) error/hole in data (OV_HOLE), partial open (OV_EINVAL) - 0) EOF - n) number of samples of PCM actually returned. The - below works on a packet-by-packet basis, so the - return length is not related to the 'length' passed - in, just guaranteed to fit. - - *section) set to the logical bitstream number */ - - - -long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int length, - int *bitstream){ - - if(vf->ready_stateready_state==INITSET){ - float **pcm; - long samples=vorbis_synthesis_pcmout(&vf->vd,&pcm); - if(samples){ - int hs=vorbis_synthesis_halfrate_p(vf->vi); - if(pcm_channels)*pcm_channels=pcm; - if(samples>length)samples=length; - vorbis_synthesis_read(&vf->vd,samples); - vf->pcm_offset+=samples<current_link; - return samples; - - } - } - - /* suck in another packet */ - { - int ret=_fetch_and_process_packet(vf,NULL,1,1); - if(ret==OV_EOF)return(0); - if(ret<=0)return(ret); - } - - } -} - -extern float *vorbis_window(vorbis_dsp_state *v,int W); - -static void _ov_splice(float **pcm,float **lappcm, - int n1, int n2, - int ch1, int ch2, - float *w1, float *w2){ - int i,j; - float *w=w1; - int n=n1; - - if(n1>n2){ - n=n2; - w=w2; - } - - /* splice */ - for(j=0;jready_state==INITSET)break; - /* suck in another packet */ - { - int ret=_fetch_and_process_packet(vf,NULL,1,0); - if(ret<0 && ret!=OV_HOLE)return(ret); - } - } - return 0; -} - -/* make sure vf is INITSET and that we have a primed buffer; if - we're crosslapping at a stream section boundary, this also makes - sure we're sanity checking against the right stream information */ -static int _ov_initprime(OggVorbis_File *vf){ - vorbis_dsp_state *vd=&vf->vd; - while(1){ - if(vf->ready_state==INITSET) - if(vorbis_synthesis_pcmout(vd,NULL))break; - - /* suck in another packet */ - { - int ret=_fetch_and_process_packet(vf,NULL,1,0); - if(ret<0 && ret!=OV_HOLE)return(ret); - } - } - return 0; -} - -/* grab enough data for lapping from vf; this may be in the form of - unreturned, already-decoded pcm, remaining PCM we will need to - decode, or synthetic postextrapolation from last packets. */ -static void _ov_getlap(OggVorbis_File *vf,vorbis_info *vi,vorbis_dsp_state *vd, - float **lappcm,int lapsize){ - int lapcount=0,i; - float **pcm; - - /* try first to decode the lapping data */ - while(lapcountlapsize-lapcount)samples=lapsize-lapcount; - for(i=0;ichannels;i++) - memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples); - lapcount+=samples; - vorbis_synthesis_read(vd,samples); - }else{ - /* suck in another packet */ - int ret=_fetch_and_process_packet(vf,NULL,1,0); /* do *not* span */ - if(ret==OV_EOF)break; - } - } - if(lapcountvd,&pcm); - if(samples==0){ - for(i=0;ichannels;i++) - memset(lappcm[i]+lapcount,0,sizeof(**pcm)*lapsize-lapcount); - lapcount=lapsize; - }else{ - if(samples>lapsize-lapcount)samples=lapsize-lapcount; - for(i=0;ichannels;i++) - memcpy(lappcm[i]+lapcount,pcm[i],sizeof(**pcm)*samples); - lapcount+=samples; - } - - (void) lapcount; - } -} - -/* this sets up crosslapping of a sample by using trailing data from - sample 1 and lapping it into the windowing buffer of sample 2 */ -int ov_crosslap(OggVorbis_File *vf1, OggVorbis_File *vf2){ - vorbis_info *vi1,*vi2; - float **lappcm; - float **pcm; - float *w1,*w2; - int n1,n2,i,ret,hs1,hs2; - - if(vf1==vf2)return(0); /* degenerate case */ - if(vf1->ready_stateready_statechannels); - n1=vorbis_info_blocksize(vi1,0)>>(1+hs1); - n2=vorbis_info_blocksize(vi2,0)>>(1+hs2); - w1=vorbis_window(&vf1->vd,0); - w2=vorbis_window(&vf2->vd,0); - - for(i=0;ichannels;i++) - lappcm[i]=(float*) alloca(sizeof(**lappcm)*n1); - - _ov_getlap(vf1,vi1,&vf1->vd,lappcm,n1); - - /* have a lapping buffer from vf1; now to splice it into the lapping - buffer of vf2 */ - /* consolidate and expose the buffer. */ - vorbis_synthesis_lapout(&vf2->vd,&pcm); - -#if 0 - _analysis_output_always("pcmL",0,pcm[0],n1*2,0,0,0); - _analysis_output_always("pcmR",0,pcm[1],n1*2,0,0,0); -#endif - - /* splice */ - _ov_splice(pcm,lappcm,n1,n2,vi1->channels,vi2->channels,w1,w2); - - /* done */ - return(0); -} - -static int _ov_64_seek_lap(OggVorbis_File *vf,ogg_int64_t pos, - int (*localseek)(OggVorbis_File *,ogg_int64_t)){ - vorbis_info *vi; - float **lappcm; - float **pcm; - float *w1,*w2; - int n1,n2,ch1,ch2,hs; - int i,ret; - - if(vf->ready_statechannels; - n1=vorbis_info_blocksize(vi,0)>>(1+hs); - w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are - persistent; even if the decode state - from this link gets dumped, this - window array continues to exist */ - - lappcm=(float**) alloca(sizeof(*lappcm)*ch1); - for(i=0;ivd,lappcm,n1); - - /* have lapping data; seek and prime the buffer */ - ret=localseek(vf,pos); - if(ret)return ret; - ret=_ov_initprime(vf); - if(ret)return(ret); - - /* Guard against cross-link changes; they're perfectly legal */ - vi=ov_info(vf,-1); - ch2=vi->channels; - n2=vorbis_info_blocksize(vi,0)>>(1+hs); - w2=vorbis_window(&vf->vd,0); - - /* consolidate and expose the buffer. */ - vorbis_synthesis_lapout(&vf->vd,&pcm); - - /* splice */ - _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2); - - /* done */ - return(0); -} - -int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){ - return _ov_64_seek_lap(vf,pos,ov_raw_seek); -} - -int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos){ - return _ov_64_seek_lap(vf,pos,ov_pcm_seek); -} - -int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos){ - return _ov_64_seek_lap(vf,pos,ov_pcm_seek_page); -} - -static int _ov_d_seek_lap(OggVorbis_File *vf,double pos, - int (*localseek)(OggVorbis_File *,double)){ - vorbis_info *vi; - float **lappcm; - float **pcm; - float *w1,*w2; - int n1,n2,ch1,ch2,hs; - int i,ret; - - if(vf->ready_statechannels; - n1=vorbis_info_blocksize(vi,0)>>(1+hs); - w1=vorbis_window(&vf->vd,0); /* window arrays from libvorbis are - persistent; even if the decode state - from this link gets dumped, this - window array continues to exist */ - - lappcm=(float**) alloca(sizeof(*lappcm)*ch1); - for(i=0;ivd,lappcm,n1); - - /* have lapping data; seek and prime the buffer */ - ret=localseek(vf,pos); - if(ret)return ret; - ret=_ov_initprime(vf); - if(ret)return(ret); - - /* Guard against cross-link changes; they're perfectly legal */ - vi=ov_info(vf,-1); - ch2=vi->channels; - n2=vorbis_info_blocksize(vi,0)>>(1+hs); - w2=vorbis_window(&vf->vd,0); - - /* consolidate and expose the buffer. */ - vorbis_synthesis_lapout(&vf->vd,&pcm); - - /* splice */ - _ov_splice(pcm,lappcm,n1,n2,ch1,ch2,w1,w2); - - /* done */ - return(0); -} - -int ov_time_seek_lap(OggVorbis_File *vf,double pos){ - return _ov_d_seek_lap(vf,pos,ov_time_seek); -} - -int ov_time_seek_page_lap(OggVorbis_File *vf,double pos){ - return _ov_d_seek_lap(vf,pos,ov_time_seek_page); -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c deleted file mode 100755 index 0dfe3f9..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/libvorbis-1.3.2/lib/window.c +++ /dev/null @@ -1,2135 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2009 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: window functions - last mod: $Id: window.c 16227 2009-07-08 06:58:46Z xiphmont $ - - ********************************************************************/ - -#include -#include -#include "os.h" -#include "misc.h" - -static float vwin64[32] = { - 0.0009460463F, 0.0085006468F, 0.0235352254F, 0.0458950567F, - 0.0753351908F, 0.1115073077F, 0.1539457973F, 0.2020557475F, - 0.2551056759F, 0.3122276645F, 0.3724270287F, 0.4346027792F, - 0.4975789974F, 0.5601459521F, 0.6211085051F, 0.6793382689F, - 0.7338252629F, 0.7837245849F, 0.8283939355F, 0.8674186656F, - 0.9006222429F, 0.9280614787F, 0.9500073081F, 0.9669131782F, - 0.9793740220F, 0.9880792941F, 0.9937636139F, 0.9971582668F, - 0.9989462667F, 0.9997230082F, 0.9999638688F, 0.9999995525F, -}; - -static float vwin128[64] = { - 0.0002365472F, 0.0021280687F, 0.0059065254F, 0.0115626550F, - 0.0190823442F, 0.0284463735F, 0.0396300935F, 0.0526030430F, - 0.0673285281F, 0.0837631763F, 0.1018564887F, 0.1215504095F, - 0.1427789367F, 0.1654677960F, 0.1895342001F, 0.2148867160F, - 0.2414252576F, 0.2690412240F, 0.2976177952F, 0.3270303960F, - 0.3571473350F, 0.3878306189F, 0.4189369387F, 0.4503188188F, - 0.4818259135F, 0.5133064334F, 0.5446086751F, 0.5755826278F, - 0.6060816248F, 0.6359640047F, 0.6650947483F, 0.6933470543F, - 0.7206038179F, 0.7467589810F, 0.7717187213F, 0.7954024542F, - 0.8177436264F, 0.8386902831F, 0.8582053981F, 0.8762669622F, - 0.8928678298F, 0.9080153310F, 0.9217306608F, 0.9340480615F, - 0.9450138200F, 0.9546851041F, 0.9631286621F, 0.9704194171F, - 0.9766389810F, 0.9818741197F, 0.9862151938F, 0.9897546035F, - 0.9925852598F, 0.9947991032F, 0.9964856900F, 0.9977308602F, - 0.9986155015F, 0.9992144193F, 0.9995953200F, 0.9998179155F, - 0.9999331503F, 0.9999825563F, 0.9999977357F, 0.9999999720F, -}; - -static float vwin256[128] = { - 0.0000591390F, 0.0005321979F, 0.0014780301F, 0.0028960636F, - 0.0047854363F, 0.0071449926F, 0.0099732775F, 0.0132685298F, - 0.0170286741F, 0.0212513119F, 0.0259337111F, 0.0310727950F, - 0.0366651302F, 0.0427069140F, 0.0491939614F, 0.0561216907F, - 0.0634851102F, 0.0712788035F, 0.0794969160F, 0.0881331402F, - 0.0971807028F, 0.1066323515F, 0.1164803426F, 0.1267164297F, - 0.1373318534F, 0.1483173323F, 0.1596630553F, 0.1713586755F, - 0.1833933062F, 0.1957555184F, 0.2084333404F, 0.2214142599F, - 0.2346852280F, 0.2482326664F, 0.2620424757F, 0.2761000481F, - 0.2903902813F, 0.3048975959F, 0.3196059553F, 0.3344988887F, - 0.3495595160F, 0.3647705766F, 0.3801144597F, 0.3955732382F, - 0.4111287047F, 0.4267624093F, 0.4424557009F, 0.4581897696F, - 0.4739456913F, 0.4897044744F, 0.5054471075F, 0.5211546088F, - 0.5368080763F, 0.5523887395F, 0.5678780103F, 0.5832575361F, - 0.5985092508F, 0.6136154277F, 0.6285587300F, 0.6433222619F, - 0.6578896175F, 0.6722449294F, 0.6863729144F, 0.7002589187F, - 0.7138889597F, 0.7272497662F, 0.7403288154F, 0.7531143679F, - 0.7655954985F, 0.7777621249F, 0.7896050322F, 0.8011158947F, - 0.8122872932F, 0.8231127294F, 0.8335866365F, 0.8437043850F, - 0.8534622861F, 0.8628575905F, 0.8718884835F, 0.8805540765F, - 0.8888543947F, 0.8967903616F, 0.9043637797F, 0.9115773078F, - 0.9184344360F, 0.9249394562F, 0.9310974312F, 0.9369141608F, - 0.9423961446F, 0.9475505439F, 0.9523851406F, 0.9569082947F, - 0.9611289005F, 0.9650563408F, 0.9687004405F, 0.9720714191F, - 0.9751798427F, 0.9780365753F, 0.9806527301F, 0.9830396204F, - 0.9852087111F, 0.9871715701F, 0.9889398207F, 0.9905250941F, - 0.9919389832F, 0.9931929973F, 0.9942985174F, 0.9952667537F, - 0.9961087037F, 0.9968351119F, 0.9974564312F, 0.9979827858F, - 0.9984239359F, 0.9987892441F, 0.9990876435F, 0.9993276081F, - 0.9995171241F, 0.9996636648F, 0.9997741654F, 0.9998550016F, - 0.9999119692F, 0.9999502656F, 0.9999744742F, 0.9999885497F, - 0.9999958064F, 0.9999989077F, 0.9999998584F, 0.9999999983F, -}; - -static float vwin512[256] = { - 0.0000147849F, 0.0001330607F, 0.0003695946F, 0.0007243509F, - 0.0011972759F, 0.0017882983F, 0.0024973285F, 0.0033242588F, - 0.0042689632F, 0.0053312973F, 0.0065110982F, 0.0078081841F, - 0.0092223540F, 0.0107533880F, 0.0124010466F, 0.0141650703F, - 0.0160451800F, 0.0180410758F, 0.0201524373F, 0.0223789233F, - 0.0247201710F, 0.0271757958F, 0.0297453914F, 0.0324285286F, - 0.0352247556F, 0.0381335972F, 0.0411545545F, 0.0442871045F, - 0.0475306997F, 0.0508847676F, 0.0543487103F, 0.0579219038F, - 0.0616036982F, 0.0653934164F, 0.0692903546F, 0.0732937809F, - 0.0774029356F, 0.0816170305F, 0.0859352485F, 0.0903567428F, - 0.0948806375F, 0.0995060259F, 0.1042319712F, 0.1090575056F, - 0.1139816300F, 0.1190033137F, 0.1241214941F, 0.1293350764F, - 0.1346429333F, 0.1400439046F, 0.1455367974F, 0.1511203852F, - 0.1567934083F, 0.1625545735F, 0.1684025537F, 0.1743359881F, - 0.1803534820F, 0.1864536069F, 0.1926349000F, 0.1988958650F, - 0.2052349715F, 0.2116506555F, 0.2181413191F, 0.2247053313F, - 0.2313410275F, 0.2380467105F, 0.2448206500F, 0.2516610835F, - 0.2585662164F, 0.2655342226F, 0.2725632448F, 0.2796513950F, - 0.2867967551F, 0.2939973773F, 0.3012512852F, 0.3085564739F, - 0.3159109111F, 0.3233125375F, 0.3307592680F, 0.3382489922F, - 0.3457795756F, 0.3533488602F, 0.3609546657F, 0.3685947904F, - 0.3762670121F, 0.3839690896F, 0.3916987634F, 0.3994537572F, - 0.4072317788F, 0.4150305215F, 0.4228476653F, 0.4306808783F, - 0.4385278181F, 0.4463861329F, 0.4542534630F, 0.4621274424F, - 0.4700057001F, 0.4778858615F, 0.4857655502F, 0.4936423891F, - 0.5015140023F, 0.5093780165F, 0.5172320626F, 0.5250737772F, - 0.5329008043F, 0.5407107971F, 0.5485014192F, 0.5562703465F, - 0.5640152688F, 0.5717338914F, 0.5794239366F, 0.5870831457F, - 0.5947092801F, 0.6023001235F, 0.6098534829F, 0.6173671907F, - 0.6248391059F, 0.6322671161F, 0.6396491384F, 0.6469831217F, - 0.6542670475F, 0.6614989319F, 0.6686768267F, 0.6757988210F, - 0.6828630426F, 0.6898676592F, 0.6968108799F, 0.7036909564F, - 0.7105061843F, 0.7172549043F, 0.7239355032F, 0.7305464154F, - 0.7370861235F, 0.7435531598F, 0.7499461068F, 0.7562635986F, - 0.7625043214F, 0.7686670148F, 0.7747504721F, 0.7807535410F, - 0.7866751247F, 0.7925141825F, 0.7982697296F, 0.8039408387F, - 0.8095266395F, 0.8150263196F, 0.8204391248F, 0.8257643590F, - 0.8310013848F, 0.8361496236F, 0.8412085555F, 0.8461777194F, - 0.8510567129F, 0.8558451924F, 0.8605428730F, 0.8651495278F, - 0.8696649882F, 0.8740891432F, 0.8784219392F, 0.8826633797F, - 0.8868135244F, 0.8908724888F, 0.8948404441F, 0.8987176157F, - 0.9025042831F, 0.9062007791F, 0.9098074886F, 0.9133248482F, - 0.9167533451F, 0.9200935163F, 0.9233459472F, 0.9265112712F, - 0.9295901680F, 0.9325833632F, 0.9354916263F, 0.9383157705F, - 0.9410566504F, 0.9437151618F, 0.9462922398F, 0.9487888576F, - 0.9512060252F, 0.9535447882F, 0.9558062262F, 0.9579914516F, - 0.9601016078F, 0.9621378683F, 0.9641014348F, 0.9659935361F, - 0.9678154261F, 0.9695683830F, 0.9712537071F, 0.9728727198F, - 0.9744267618F, 0.9759171916F, 0.9773453842F, 0.9787127293F, - 0.9800206298F, 0.9812705006F, 0.9824637665F, 0.9836018613F, - 0.9846862258F, 0.9857183066F, 0.9866995544F, 0.9876314227F, - 0.9885153662F, 0.9893528393F, 0.9901452948F, 0.9908941823F, - 0.9916009470F, 0.9922670279F, 0.9928938570F, 0.9934828574F, - 0.9940354423F, 0.9945530133F, 0.9950369595F, 0.9954886562F, - 0.9959094633F, 0.9963007242F, 0.9966637649F, 0.9969998925F, - 0.9973103939F, 0.9975965351F, 0.9978595598F, 0.9981006885F, - 0.9983211172F, 0.9985220166F, 0.9987045311F, 0.9988697776F, - 0.9990188449F, 0.9991527924F, 0.9992726499F, 0.9993794157F, - 0.9994740570F, 0.9995575079F, 0.9996306699F, 0.9996944099F, - 0.9997495605F, 0.9997969190F, 0.9998372465F, 0.9998712678F, - 0.9998996704F, 0.9999231041F, 0.9999421807F, 0.9999574732F, - 0.9999695157F, 0.9999788026F, 0.9999857885F, 0.9999908879F, - 0.9999944746F, 0.9999968817F, 0.9999984010F, 0.9999992833F, - 0.9999997377F, 0.9999999317F, 0.9999999911F, 0.9999999999F, -}; - -static float vwin1024[512] = { - 0.0000036962F, 0.0000332659F, 0.0000924041F, 0.0001811086F, - 0.0002993761F, 0.0004472021F, 0.0006245811F, 0.0008315063F, - 0.0010679699F, 0.0013339631F, 0.0016294757F, 0.0019544965F, - 0.0023090133F, 0.0026930125F, 0.0031064797F, 0.0035493989F, - 0.0040217533F, 0.0045235250F, 0.0050546946F, 0.0056152418F, - 0.0062051451F, 0.0068243817F, 0.0074729278F, 0.0081507582F, - 0.0088578466F, 0.0095941655F, 0.0103596863F, 0.0111543789F, - 0.0119782122F, 0.0128311538F, 0.0137131701F, 0.0146242260F, - 0.0155642855F, 0.0165333111F, 0.0175312640F, 0.0185581042F, - 0.0196137903F, 0.0206982797F, 0.0218115284F, 0.0229534910F, - 0.0241241208F, 0.0253233698F, 0.0265511886F, 0.0278075263F, - 0.0290923308F, 0.0304055484F, 0.0317471241F, 0.0331170013F, - 0.0345151222F, 0.0359414274F, 0.0373958560F, 0.0388783456F, - 0.0403888325F, 0.0419272511F, 0.0434935347F, 0.0450876148F, - 0.0467094213F, 0.0483588828F, 0.0500359261F, 0.0517404765F, - 0.0534724575F, 0.0552317913F, 0.0570183983F, 0.0588321971F, - 0.0606731048F, 0.0625410369F, 0.0644359070F, 0.0663576272F, - 0.0683061077F, 0.0702812571F, 0.0722829821F, 0.0743111878F, - 0.0763657775F, 0.0784466526F, 0.0805537129F, 0.0826868561F, - 0.0848459782F, 0.0870309736F, 0.0892417345F, 0.0914781514F, - 0.0937401128F, 0.0960275056F, 0.0983402145F, 0.1006781223F, - 0.1030411101F, 0.1054290568F, 0.1078418397F, 0.1102793336F, - 0.1127414119F, 0.1152279457F, 0.1177388042F, 0.1202738544F, - 0.1228329618F, 0.1254159892F, 0.1280227980F, 0.1306532471F, - 0.1333071937F, 0.1359844927F, 0.1386849970F, 0.1414085575F, - 0.1441550230F, 0.1469242403F, 0.1497160539F, 0.1525303063F, - 0.1553668381F, 0.1582254875F, 0.1611060909F, 0.1640084822F, - 0.1669324936F, 0.1698779549F, 0.1728446939F, 0.1758325362F, - 0.1788413055F, 0.1818708232F, 0.1849209084F, 0.1879913785F, - 0.1910820485F, 0.1941927312F, 0.1973232376F, 0.2004733764F, - 0.2036429541F, 0.2068317752F, 0.2100396421F, 0.2132663552F, - 0.2165117125F, 0.2197755102F, 0.2230575422F, 0.2263576007F, - 0.2296754753F, 0.2330109540F, 0.2363638225F, 0.2397338646F, - 0.2431208619F, 0.2465245941F, 0.2499448389F, 0.2533813719F, - 0.2568339669F, 0.2603023956F, 0.2637864277F, 0.2672858312F, - 0.2708003718F, 0.2743298135F, 0.2778739186F, 0.2814324472F, - 0.2850051576F, 0.2885918065F, 0.2921921485F, 0.2958059366F, - 0.2994329219F, 0.3030728538F, 0.3067254799F, 0.3103905462F, - 0.3140677969F, 0.3177569747F, 0.3214578205F, 0.3251700736F, - 0.3288934718F, 0.3326277513F, 0.3363726468F, 0.3401278914F, - 0.3438932168F, 0.3476683533F, 0.3514530297F, 0.3552469734F, - 0.3590499106F, 0.3628615659F, 0.3666816630F, 0.3705099239F, - 0.3743460698F, 0.3781898204F, 0.3820408945F, 0.3858990095F, - 0.3897638820F, 0.3936352274F, 0.3975127601F, 0.4013961936F, - 0.4052852405F, 0.4091796123F, 0.4130790198F, 0.4169831732F, - 0.4208917815F, 0.4248045534F, 0.4287211965F, 0.4326414181F, - 0.4365649248F, 0.4404914225F, 0.4444206167F, 0.4483522125F, - 0.4522859146F, 0.4562214270F, 0.4601584538F, 0.4640966984F, - 0.4680358644F, 0.4719756548F, 0.4759157726F, 0.4798559209F, - 0.4837958024F, 0.4877351199F, 0.4916735765F, 0.4956108751F, - 0.4995467188F, 0.5034808109F, 0.5074128550F, 0.5113425550F, - 0.5152696149F, 0.5191937395F, 0.5231146336F, 0.5270320028F, - 0.5309455530F, 0.5348549910F, 0.5387600239F, 0.5426603597F, - 0.5465557070F, 0.5504457754F, 0.5543302752F, 0.5582089175F, - 0.5620814145F, 0.5659474793F, 0.5698068262F, 0.5736591704F, - 0.5775042283F, 0.5813417176F, 0.5851713571F, 0.5889928670F, - 0.5928059689F, 0.5966103856F, 0.6004058415F, 0.6041920626F, - 0.6079687761F, 0.6117357113F, 0.6154925986F, 0.6192391705F, - 0.6229751612F, 0.6267003064F, 0.6304143441F, 0.6341170137F, - 0.6378080569F, 0.6414872173F, 0.6451542405F, 0.6488088741F, - 0.6524508681F, 0.6560799742F, 0.6596959469F, 0.6632985424F, - 0.6668875197F, 0.6704626398F, 0.6740236662F, 0.6775703649F, - 0.6811025043F, 0.6846198554F, 0.6881221916F, 0.6916092892F, - 0.6950809269F, 0.6985368861F, 0.7019769510F, 0.7054009085F, - 0.7088085484F, 0.7121996632F, 0.7155740484F, 0.7189315023F, - 0.7222718263F, 0.7255948245F, 0.7289003043F, 0.7321880760F, - 0.7354579530F, 0.7387097518F, 0.7419432921F, 0.7451583966F, - 0.7483548915F, 0.7515326059F, 0.7546913723F, 0.7578310265F, - 0.7609514077F, 0.7640523581F, 0.7671337237F, 0.7701953535F, - 0.7732371001F, 0.7762588195F, 0.7792603711F, 0.7822416178F, - 0.7852024259F, 0.7881426654F, 0.7910622097F, 0.7939609356F, - 0.7968387237F, 0.7996954579F, 0.8025310261F, 0.8053453193F, - 0.8081382324F, 0.8109096638F, 0.8136595156F, 0.8163876936F, - 0.8190941071F, 0.8217786690F, 0.8244412960F, 0.8270819086F, - 0.8297004305F, 0.8322967896F, 0.8348709171F, 0.8374227481F, - 0.8399522213F, 0.8424592789F, 0.8449438672F, 0.8474059356F, - 0.8498454378F, 0.8522623306F, 0.8546565748F, 0.8570281348F, - 0.8593769787F, 0.8617030779F, 0.8640064080F, 0.8662869477F, - 0.8685446796F, 0.8707795899F, 0.8729916682F, 0.8751809079F, - 0.8773473059F, 0.8794908626F, 0.8816115819F, 0.8837094713F, - 0.8857845418F, 0.8878368079F, 0.8898662874F, 0.8918730019F, - 0.8938569760F, 0.8958182380F, 0.8977568194F, 0.8996727552F, - 0.9015660837F, 0.9034368465F, 0.9052850885F, 0.9071108577F, - 0.9089142057F, 0.9106951869F, 0.9124538591F, 0.9141902832F, - 0.9159045233F, 0.9175966464F, 0.9192667228F, 0.9209148257F, - 0.9225410313F, 0.9241454187F, 0.9257280701F, 0.9272890704F, - 0.9288285075F, 0.9303464720F, 0.9318430576F, 0.9333183603F, - 0.9347724792F, 0.9362055158F, 0.9376175745F, 0.9390087622F, - 0.9403791881F, 0.9417289644F, 0.9430582055F, 0.9443670283F, - 0.9456555521F, 0.9469238986F, 0.9481721917F, 0.9494005577F, - 0.9506091252F, 0.9517980248F, 0.9529673894F, 0.9541173540F, - 0.9552480557F, 0.9563596334F, 0.9574522282F, 0.9585259830F, - 0.9595810428F, 0.9606175542F, 0.9616356656F, 0.9626355274F, - 0.9636172915F, 0.9645811114F, 0.9655271425F, 0.9664555414F, - 0.9673664664F, 0.9682600774F, 0.9691365355F, 0.9699960034F, - 0.9708386448F, 0.9716646250F, 0.9724741103F, 0.9732672685F, - 0.9740442683F, 0.9748052795F, 0.9755504729F, 0.9762800205F, - 0.9769940950F, 0.9776928703F, 0.9783765210F, 0.9790452223F, - 0.9796991504F, 0.9803384823F, 0.9809633954F, 0.9815740679F, - 0.9821706784F, 0.9827534063F, 0.9833224312F, 0.9838779332F, - 0.9844200928F, 0.9849490910F, 0.9854651087F, 0.9859683274F, - 0.9864589286F, 0.9869370940F, 0.9874030054F, 0.9878568447F, - 0.9882987937F, 0.9887290343F, 0.9891477481F, 0.9895551169F, - 0.9899513220F, 0.9903365446F, 0.9907109658F, 0.9910747662F, - 0.9914281260F, 0.9917712252F, 0.9921042433F, 0.9924273593F, - 0.9927407516F, 0.9930445982F, 0.9933390763F, 0.9936243626F, - 0.9939006331F, 0.9941680631F, 0.9944268269F, 0.9946770982F, - 0.9949190498F, 0.9951528537F, 0.9953786808F, 0.9955967011F, - 0.9958070836F, 0.9960099963F, 0.9962056061F, 0.9963940787F, - 0.9965755786F, 0.9967502693F, 0.9969183129F, 0.9970798704F, - 0.9972351013F, 0.9973841640F, 0.9975272151F, 0.9976644103F, - 0.9977959036F, 0.9979218476F, 0.9980423932F, 0.9981576901F, - 0.9982678862F, 0.9983731278F, 0.9984735596F, 0.9985693247F, - 0.9986605645F, 0.9987474186F, 0.9988300248F, 0.9989085193F, - 0.9989830364F, 0.9990537085F, 0.9991206662F, 0.9991840382F, - 0.9992439513F, 0.9993005303F, 0.9993538982F, 0.9994041757F, - 0.9994514817F, 0.9994959330F, 0.9995376444F, 0.9995767286F, - 0.9996132960F, 0.9996474550F, 0.9996793121F, 0.9997089710F, - 0.9997365339F, 0.9997621003F, 0.9997857677F, 0.9998076311F, - 0.9998277836F, 0.9998463156F, 0.9998633155F, 0.9998788692F, - 0.9998930603F, 0.9999059701F, 0.9999176774F, 0.9999282586F, - 0.9999377880F, 0.9999463370F, 0.9999539749F, 0.9999607685F, - 0.9999667820F, 0.9999720773F, 0.9999767136F, 0.9999807479F, - 0.9999842344F, 0.9999872249F, 0.9999897688F, 0.9999919127F, - 0.9999937009F, 0.9999951749F, 0.9999963738F, 0.9999973342F, - 0.9999980900F, 0.9999986724F, 0.9999991103F, 0.9999994297F, - 0.9999996543F, 0.9999998049F, 0.9999999000F, 0.9999999552F, - 0.9999999836F, 0.9999999957F, 0.9999999994F, 1.0000000000F, -}; - -static float vwin2048[1024] = { - 0.0000009241F, 0.0000083165F, 0.0000231014F, 0.0000452785F, - 0.0000748476F, 0.0001118085F, 0.0001561608F, 0.0002079041F, - 0.0002670379F, 0.0003335617F, 0.0004074748F, 0.0004887765F, - 0.0005774661F, 0.0006735427F, 0.0007770054F, 0.0008878533F, - 0.0010060853F, 0.0011317002F, 0.0012646969F, 0.0014050742F, - 0.0015528307F, 0.0017079650F, 0.0018704756F, 0.0020403610F, - 0.0022176196F, 0.0024022497F, 0.0025942495F, 0.0027936173F, - 0.0030003511F, 0.0032144490F, 0.0034359088F, 0.0036647286F, - 0.0039009061F, 0.0041444391F, 0.0043953253F, 0.0046535621F, - 0.0049191472F, 0.0051920781F, 0.0054723520F, 0.0057599664F, - 0.0060549184F, 0.0063572052F, 0.0066668239F, 0.0069837715F, - 0.0073080449F, 0.0076396410F, 0.0079785566F, 0.0083247884F, - 0.0086783330F, 0.0090391871F, 0.0094073470F, 0.0097828092F, - 0.0101655700F, 0.0105556258F, 0.0109529726F, 0.0113576065F, - 0.0117695237F, 0.0121887200F, 0.0126151913F, 0.0130489335F, - 0.0134899422F, 0.0139382130F, 0.0143937415F, 0.0148565233F, - 0.0153265536F, 0.0158038279F, 0.0162883413F, 0.0167800889F, - 0.0172790660F, 0.0177852675F, 0.0182986882F, 0.0188193231F, - 0.0193471668F, 0.0198822141F, 0.0204244594F, 0.0209738974F, - 0.0215305225F, 0.0220943289F, 0.0226653109F, 0.0232434627F, - 0.0238287784F, 0.0244212519F, 0.0250208772F, 0.0256276481F, - 0.0262415582F, 0.0268626014F, 0.0274907711F, 0.0281260608F, - 0.0287684638F, 0.0294179736F, 0.0300745833F, 0.0307382859F, - 0.0314090747F, 0.0320869424F, 0.0327718819F, 0.0334638860F, - 0.0341629474F, 0.0348690586F, 0.0355822122F, 0.0363024004F, - 0.0370296157F, 0.0377638502F, 0.0385050960F, 0.0392533451F, - 0.0400085896F, 0.0407708211F, 0.0415400315F, 0.0423162123F, - 0.0430993552F, 0.0438894515F, 0.0446864926F, 0.0454904698F, - 0.0463013742F, 0.0471191969F, 0.0479439288F, 0.0487755607F, - 0.0496140836F, 0.0504594879F, 0.0513117642F, 0.0521709031F, - 0.0530368949F, 0.0539097297F, 0.0547893979F, 0.0556758894F, - 0.0565691941F, 0.0574693019F, 0.0583762026F, 0.0592898858F, - 0.0602103410F, 0.0611375576F, 0.0620715250F, 0.0630122324F, - 0.0639596688F, 0.0649138234F, 0.0658746848F, 0.0668422421F, - 0.0678164838F, 0.0687973985F, 0.0697849746F, 0.0707792005F, - 0.0717800645F, 0.0727875547F, 0.0738016591F, 0.0748223656F, - 0.0758496620F, 0.0768835359F, 0.0779239751F, 0.0789709668F, - 0.0800244985F, 0.0810845574F, 0.0821511306F, 0.0832242052F, - 0.0843037679F, 0.0853898056F, 0.0864823050F, 0.0875812525F, - 0.0886866347F, 0.0897984378F, 0.0909166480F, 0.0920412513F, - 0.0931722338F, 0.0943095813F, 0.0954532795F, 0.0966033140F, - 0.0977596702F, 0.0989223336F, 0.1000912894F, 0.1012665227F, - 0.1024480185F, 0.1036357616F, 0.1048297369F, 0.1060299290F, - 0.1072363224F, 0.1084489014F, 0.1096676504F, 0.1108925534F, - 0.1121235946F, 0.1133607577F, 0.1146040267F, 0.1158533850F, - 0.1171088163F, 0.1183703040F, 0.1196378312F, 0.1209113812F, - 0.1221909370F, 0.1234764815F, 0.1247679974F, 0.1260654674F, - 0.1273688740F, 0.1286781995F, 0.1299934263F, 0.1313145365F, - 0.1326415121F, 0.1339743349F, 0.1353129866F, 0.1366574490F, - 0.1380077035F, 0.1393637315F, 0.1407255141F, 0.1420930325F, - 0.1434662677F, 0.1448452004F, 0.1462298115F, 0.1476200814F, - 0.1490159906F, 0.1504175195F, 0.1518246482F, 0.1532373569F, - 0.1546556253F, 0.1560794333F, 0.1575087606F, 0.1589435866F, - 0.1603838909F, 0.1618296526F, 0.1632808509F, 0.1647374648F, - 0.1661994731F, 0.1676668546F, 0.1691395880F, 0.1706176516F, - 0.1721010238F, 0.1735896829F, 0.1750836068F, 0.1765827736F, - 0.1780871610F, 0.1795967468F, 0.1811115084F, 0.1826314234F, - 0.1841564689F, 0.1856866221F, 0.1872218600F, 0.1887621595F, - 0.1903074974F, 0.1918578503F, 0.1934131947F, 0.1949735068F, - 0.1965387630F, 0.1981089393F, 0.1996840117F, 0.2012639560F, - 0.2028487479F, 0.2044383630F, 0.2060327766F, 0.2076319642F, - 0.2092359007F, 0.2108445614F, 0.2124579211F, 0.2140759545F, - 0.2156986364F, 0.2173259411F, 0.2189578432F, 0.2205943168F, - 0.2222353361F, 0.2238808751F, 0.2255309076F, 0.2271854073F, - 0.2288443480F, 0.2305077030F, 0.2321754457F, 0.2338475493F, - 0.2355239869F, 0.2372047315F, 0.2388897560F, 0.2405790329F, - 0.2422725350F, 0.2439702347F, 0.2456721043F, 0.2473781159F, - 0.2490882418F, 0.2508024539F, 0.2525207240F, 0.2542430237F, - 0.2559693248F, 0.2576995986F, 0.2594338166F, 0.2611719498F, - 0.2629139695F, 0.2646598466F, 0.2664095520F, 0.2681630564F, - 0.2699203304F, 0.2716813445F, 0.2734460691F, 0.2752144744F, - 0.2769865307F, 0.2787622079F, 0.2805414760F, 0.2823243047F, - 0.2841106637F, 0.2859005227F, 0.2876938509F, 0.2894906179F, - 0.2912907928F, 0.2930943447F, 0.2949012426F, 0.2967114554F, - 0.2985249520F, 0.3003417009F, 0.3021616708F, 0.3039848301F, - 0.3058111471F, 0.3076405901F, 0.3094731273F, 0.3113087266F, - 0.3131473560F, 0.3149889833F, 0.3168335762F, 0.3186811024F, - 0.3205315294F, 0.3223848245F, 0.3242409552F, 0.3260998886F, - 0.3279615918F, 0.3298260319F, 0.3316931758F, 0.3335629903F, - 0.3354354423F, 0.3373104982F, 0.3391881247F, 0.3410682882F, - 0.3429509551F, 0.3448360917F, 0.3467236642F, 0.3486136387F, - 0.3505059811F, 0.3524006575F, 0.3542976336F, 0.3561968753F, - 0.3580983482F, 0.3600020179F, 0.3619078499F, 0.3638158096F, - 0.3657258625F, 0.3676379737F, 0.3695521086F, 0.3714682321F, - 0.3733863094F, 0.3753063055F, 0.3772281852F, 0.3791519134F, - 0.3810774548F, 0.3830047742F, 0.3849338362F, 0.3868646053F, - 0.3887970459F, 0.3907311227F, 0.3926667998F, 0.3946040417F, - 0.3965428125F, 0.3984830765F, 0.4004247978F, 0.4023679403F, - 0.4043124683F, 0.4062583455F, 0.4082055359F, 0.4101540034F, - 0.4121037117F, 0.4140546246F, 0.4160067058F, 0.4179599190F, - 0.4199142277F, 0.4218695956F, 0.4238259861F, 0.4257833627F, - 0.4277416888F, 0.4297009279F, 0.4316610433F, 0.4336219983F, - 0.4355837562F, 0.4375462803F, 0.4395095337F, 0.4414734797F, - 0.4434380815F, 0.4454033021F, 0.4473691046F, 0.4493354521F, - 0.4513023078F, 0.4532696345F, 0.4552373954F, 0.4572055533F, - 0.4591740713F, 0.4611429123F, 0.4631120393F, 0.4650814151F, - 0.4670510028F, 0.4690207650F, 0.4709906649F, 0.4729606651F, - 0.4749307287F, 0.4769008185F, 0.4788708972F, 0.4808409279F, - 0.4828108732F, 0.4847806962F, 0.4867503597F, 0.4887198264F, - 0.4906890593F, 0.4926580213F, 0.4946266753F, 0.4965949840F, - 0.4985629105F, 0.5005304176F, 0.5024974683F, 0.5044640255F, - 0.5064300522F, 0.5083955114F, 0.5103603659F, 0.5123245790F, - 0.5142881136F, 0.5162509328F, 0.5182129997F, 0.5201742774F, - 0.5221347290F, 0.5240943178F, 0.5260530070F, 0.5280107598F, - 0.5299675395F, 0.5319233095F, 0.5338780330F, 0.5358316736F, - 0.5377841946F, 0.5397355596F, 0.5416857320F, 0.5436346755F, - 0.5455823538F, 0.5475287304F, 0.5494737691F, 0.5514174337F, - 0.5533596881F, 0.5553004962F, 0.5572398218F, 0.5591776291F, - 0.5611138821F, 0.5630485449F, 0.5649815818F, 0.5669129570F, - 0.5688426349F, 0.5707705799F, 0.5726967564F, 0.5746211290F, - 0.5765436624F, 0.5784643212F, 0.5803830702F, 0.5822998743F, - 0.5842146984F, 0.5861275076F, 0.5880382669F, 0.5899469416F, - 0.5918534968F, 0.5937578981F, 0.5956601107F, 0.5975601004F, - 0.5994578326F, 0.6013532732F, 0.6032463880F, 0.6051371429F, - 0.6070255039F, 0.6089114372F, 0.6107949090F, 0.6126758856F, - 0.6145543334F, 0.6164302191F, 0.6183035092F, 0.6201741706F, - 0.6220421700F, 0.6239074745F, 0.6257700513F, 0.6276298674F, - 0.6294868903F, 0.6313410873F, 0.6331924262F, 0.6350408745F, - 0.6368864001F, 0.6387289710F, 0.6405685552F, 0.6424051209F, - 0.6442386364F, 0.6460690702F, 0.6478963910F, 0.6497205673F, - 0.6515415682F, 0.6533593625F, 0.6551739194F, 0.6569852082F, - 0.6587931984F, 0.6605978593F, 0.6623991609F, 0.6641970728F, - 0.6659915652F, 0.6677826081F, 0.6695701718F, 0.6713542268F, - 0.6731347437F, 0.6749116932F, 0.6766850461F, 0.6784547736F, - 0.6802208469F, 0.6819832374F, 0.6837419164F, 0.6854968559F, - 0.6872480275F, 0.6889954034F, 0.6907389556F, 0.6924786566F, - 0.6942144788F, 0.6959463950F, 0.6976743780F, 0.6993984008F, - 0.7011184365F, 0.7028344587F, 0.7045464407F, 0.7062543564F, - 0.7079581796F, 0.7096578844F, 0.7113534450F, 0.7130448359F, - 0.7147320316F, 0.7164150070F, 0.7180937371F, 0.7197681970F, - 0.7214383620F, 0.7231042077F, 0.7247657098F, 0.7264228443F, - 0.7280755871F, 0.7297239147F, 0.7313678035F, 0.7330072301F, - 0.7346421715F, 0.7362726046F, 0.7378985069F, 0.7395198556F, - 0.7411366285F, 0.7427488034F, 0.7443563584F, 0.7459592717F, - 0.7475575218F, 0.7491510873F, 0.7507399471F, 0.7523240803F, - 0.7539034661F, 0.7554780839F, 0.7570479136F, 0.7586129349F, - 0.7601731279F, 0.7617284730F, 0.7632789506F, 0.7648245416F, - 0.7663652267F, 0.7679009872F, 0.7694318044F, 0.7709576599F, - 0.7724785354F, 0.7739944130F, 0.7755052749F, 0.7770111035F, - 0.7785118815F, 0.7800075916F, 0.7814982170F, 0.7829837410F, - 0.7844641472F, 0.7859394191F, 0.7874095408F, 0.7888744965F, - 0.7903342706F, 0.7917888476F, 0.7932382124F, 0.7946823501F, - 0.7961212460F, 0.7975548855F, 0.7989832544F, 0.8004063386F, - 0.8018241244F, 0.8032365981F, 0.8046437463F, 0.8060455560F, - 0.8074420141F, 0.8088331080F, 0.8102188253F, 0.8115991536F, - 0.8129740810F, 0.8143435957F, 0.8157076861F, 0.8170663409F, - 0.8184195489F, 0.8197672994F, 0.8211095817F, 0.8224463853F, - 0.8237777001F, 0.8251035161F, 0.8264238235F, 0.8277386129F, - 0.8290478750F, 0.8303516008F, 0.8316497814F, 0.8329424083F, - 0.8342294731F, 0.8355109677F, 0.8367868841F, 0.8380572148F, - 0.8393219523F, 0.8405810893F, 0.8418346190F, 0.8430825345F, - 0.8443248294F, 0.8455614974F, 0.8467925323F, 0.8480179285F, - 0.8492376802F, 0.8504517822F, 0.8516602292F, 0.8528630164F, - 0.8540601391F, 0.8552515928F, 0.8564373733F, 0.8576174766F, - 0.8587918990F, 0.8599606368F, 0.8611236868F, 0.8622810460F, - 0.8634327113F, 0.8645786802F, 0.8657189504F, 0.8668535195F, - 0.8679823857F, 0.8691055472F, 0.8702230025F, 0.8713347503F, - 0.8724407896F, 0.8735411194F, 0.8746357394F, 0.8757246489F, - 0.8768078479F, 0.8778853364F, 0.8789571146F, 0.8800231832F, - 0.8810835427F, 0.8821381942F, 0.8831871387F, 0.8842303777F, - 0.8852679127F, 0.8862997456F, 0.8873258784F, 0.8883463132F, - 0.8893610527F, 0.8903700994F, 0.8913734562F, 0.8923711263F, - 0.8933631129F, 0.8943494196F, 0.8953300500F, 0.8963050083F, - 0.8972742985F, 0.8982379249F, 0.8991958922F, 0.9001482052F, - 0.9010948688F, 0.9020358883F, 0.9029712690F, 0.9039010165F, - 0.9048251367F, 0.9057436357F, 0.9066565195F, 0.9075637946F, - 0.9084654678F, 0.9093615456F, 0.9102520353F, 0.9111369440F, - 0.9120162792F, 0.9128900484F, 0.9137582595F, 0.9146209204F, - 0.9154780394F, 0.9163296248F, 0.9171756853F, 0.9180162296F, - 0.9188512667F, 0.9196808057F, 0.9205048559F, 0.9213234270F, - 0.9221365285F, 0.9229441704F, 0.9237463629F, 0.9245431160F, - 0.9253344404F, 0.9261203465F, 0.9269008453F, 0.9276759477F, - 0.9284456648F, 0.9292100080F, 0.9299689889F, 0.9307226190F, - 0.9314709103F, 0.9322138747F, 0.9329515245F, 0.9336838721F, - 0.9344109300F, 0.9351327108F, 0.9358492275F, 0.9365604931F, - 0.9372665208F, 0.9379673239F, 0.9386629160F, 0.9393533107F, - 0.9400385220F, 0.9407185637F, 0.9413934501F, 0.9420631954F, - 0.9427278141F, 0.9433873208F, 0.9440417304F, 0.9446910576F, - 0.9453353176F, 0.9459745255F, 0.9466086968F, 0.9472378469F, - 0.9478619915F, 0.9484811463F, 0.9490953274F, 0.9497045506F, - 0.9503088323F, 0.9509081888F, 0.9515026365F, 0.9520921921F, - 0.9526768723F, 0.9532566940F, 0.9538316742F, 0.9544018300F, - 0.9549671786F, 0.9555277375F, 0.9560835241F, 0.9566345562F, - 0.9571808513F, 0.9577224275F, 0.9582593027F, 0.9587914949F, - 0.9593190225F, 0.9598419038F, 0.9603601571F, 0.9608738012F, - 0.9613828546F, 0.9618873361F, 0.9623872646F, 0.9628826591F, - 0.9633735388F, 0.9638599227F, 0.9643418303F, 0.9648192808F, - 0.9652922939F, 0.9657608890F, 0.9662250860F, 0.9666849046F, - 0.9671403646F, 0.9675914861F, 0.9680382891F, 0.9684807937F, - 0.9689190202F, 0.9693529890F, 0.9697827203F, 0.9702082347F, - 0.9706295529F, 0.9710466953F, 0.9714596828F, 0.9718685362F, - 0.9722732762F, 0.9726739240F, 0.9730705005F, 0.9734630267F, - 0.9738515239F, 0.9742360134F, 0.9746165163F, 0.9749930540F, - 0.9753656481F, 0.9757343198F, 0.9760990909F, 0.9764599829F, - 0.9768170175F, 0.9771702164F, 0.9775196013F, 0.9778651941F, - 0.9782070167F, 0.9785450909F, 0.9788794388F, 0.9792100824F, - 0.9795370437F, 0.9798603449F, 0.9801800080F, 0.9804960554F, - 0.9808085092F, 0.9811173916F, 0.9814227251F, 0.9817245318F, - 0.9820228343F, 0.9823176549F, 0.9826090160F, 0.9828969402F, - 0.9831814498F, 0.9834625674F, 0.9837403156F, 0.9840147169F, - 0.9842857939F, 0.9845535692F, 0.9848180654F, 0.9850793052F, - 0.9853373113F, 0.9855921062F, 0.9858437127F, 0.9860921535F, - 0.9863374512F, 0.9865796287F, 0.9868187085F, 0.9870547136F, - 0.9872876664F, 0.9875175899F, 0.9877445067F, 0.9879684396F, - 0.9881894112F, 0.9884074444F, 0.9886225619F, 0.9888347863F, - 0.9890441404F, 0.9892506468F, 0.9894543284F, 0.9896552077F, - 0.9898533074F, 0.9900486502F, 0.9902412587F, 0.9904311555F, - 0.9906183633F, 0.9908029045F, 0.9909848019F, 0.9911640779F, - 0.9913407550F, 0.9915148557F, 0.9916864025F, 0.9918554179F, - 0.9920219241F, 0.9921859437F, 0.9923474989F, 0.9925066120F, - 0.9926633054F, 0.9928176012F, 0.9929695218F, 0.9931190891F, - 0.9932663254F, 0.9934112527F, 0.9935538932F, 0.9936942686F, - 0.9938324012F, 0.9939683126F, 0.9941020248F, 0.9942335597F, - 0.9943629388F, 0.9944901841F, 0.9946153170F, 0.9947383593F, - 0.9948593325F, 0.9949782579F, 0.9950951572F, 0.9952100516F, - 0.9953229625F, 0.9954339111F, 0.9955429186F, 0.9956500062F, - 0.9957551948F, 0.9958585056F, 0.9959599593F, 0.9960595769F, - 0.9961573792F, 0.9962533869F, 0.9963476206F, 0.9964401009F, - 0.9965308483F, 0.9966198833F, 0.9967072261F, 0.9967928971F, - 0.9968769164F, 0.9969593041F, 0.9970400804F, 0.9971192651F, - 0.9971968781F, 0.9972729391F, 0.9973474680F, 0.9974204842F, - 0.9974920074F, 0.9975620569F, 0.9976306521F, 0.9976978122F, - 0.9977635565F, 0.9978279039F, 0.9978908736F, 0.9979524842F, - 0.9980127547F, 0.9980717037F, 0.9981293499F, 0.9981857116F, - 0.9982408073F, 0.9982946554F, 0.9983472739F, 0.9983986810F, - 0.9984488947F, 0.9984979328F, 0.9985458132F, 0.9985925534F, - 0.9986381711F, 0.9986826838F, 0.9987261086F, 0.9987684630F, - 0.9988097640F, 0.9988500286F, 0.9988892738F, 0.9989275163F, - 0.9989647727F, 0.9990010597F, 0.9990363938F, 0.9990707911F, - 0.9991042679F, 0.9991368404F, 0.9991685244F, 0.9991993358F, - 0.9992292905F, 0.9992584038F, 0.9992866914F, 0.9993141686F, - 0.9993408506F, 0.9993667526F, 0.9993918895F, 0.9994162761F, - 0.9994399273F, 0.9994628576F, 0.9994850815F, 0.9995066133F, - 0.9995274672F, 0.9995476574F, 0.9995671978F, 0.9995861021F, - 0.9996043841F, 0.9996220573F, 0.9996391352F, 0.9996556310F, - 0.9996715579F, 0.9996869288F, 0.9997017568F, 0.9997160543F, - 0.9997298342F, 0.9997431088F, 0.9997558905F, 0.9997681914F, - 0.9997800236F, 0.9997913990F, 0.9998023292F, 0.9998128261F, - 0.9998229009F, 0.9998325650F, 0.9998418296F, 0.9998507058F, - 0.9998592044F, 0.9998673362F, 0.9998751117F, 0.9998825415F, - 0.9998896358F, 0.9998964047F, 0.9999028584F, 0.9999090066F, - 0.9999148590F, 0.9999204253F, 0.9999257148F, 0.9999307368F, - 0.9999355003F, 0.9999400144F, 0.9999442878F, 0.9999483293F, - 0.9999521472F, 0.9999557499F, 0.9999591457F, 0.9999623426F, - 0.9999653483F, 0.9999681708F, 0.9999708175F, 0.9999732959F, - 0.9999756132F, 0.9999777765F, 0.9999797928F, 0.9999816688F, - 0.9999834113F, 0.9999850266F, 0.9999865211F, 0.9999879009F, - 0.9999891721F, 0.9999903405F, 0.9999914118F, 0.9999923914F, - 0.9999932849F, 0.9999940972F, 0.9999948336F, 0.9999954989F, - 0.9999960978F, 0.9999966349F, 0.9999971146F, 0.9999975411F, - 0.9999979185F, 0.9999982507F, 0.9999985414F, 0.9999987944F, - 0.9999990129F, 0.9999992003F, 0.9999993596F, 0.9999994939F, - 0.9999996059F, 0.9999996981F, 0.9999997732F, 0.9999998333F, - 0.9999998805F, 0.9999999170F, 0.9999999444F, 0.9999999643F, - 0.9999999784F, 0.9999999878F, 0.9999999937F, 0.9999999972F, - 0.9999999990F, 0.9999999997F, 1.0000000000F, 1.0000000000F, -}; - -static float vwin4096[2048] = { - 0.0000002310F, 0.0000020791F, 0.0000057754F, 0.0000113197F, - 0.0000187121F, 0.0000279526F, 0.0000390412F, 0.0000519777F, - 0.0000667623F, 0.0000833949F, 0.0001018753F, 0.0001222036F, - 0.0001443798F, 0.0001684037F, 0.0001942754F, 0.0002219947F, - 0.0002515616F, 0.0002829761F, 0.0003162380F, 0.0003513472F, - 0.0003883038F, 0.0004271076F, 0.0004677584F, 0.0005102563F, - 0.0005546011F, 0.0006007928F, 0.0006488311F, 0.0006987160F, - 0.0007504474F, 0.0008040251F, 0.0008594490F, 0.0009167191F, - 0.0009758351F, 0.0010367969F, 0.0010996044F, 0.0011642574F, - 0.0012307558F, 0.0012990994F, 0.0013692880F, 0.0014413216F, - 0.0015151998F, 0.0015909226F, 0.0016684898F, 0.0017479011F, - 0.0018291565F, 0.0019122556F, 0.0019971983F, 0.0020839845F, - 0.0021726138F, 0.0022630861F, 0.0023554012F, 0.0024495588F, - 0.0025455588F, 0.0026434008F, 0.0027430847F, 0.0028446103F, - 0.0029479772F, 0.0030531853F, 0.0031602342F, 0.0032691238F, - 0.0033798538F, 0.0034924239F, 0.0036068338F, 0.0037230833F, - 0.0038411721F, 0.0039610999F, 0.0040828664F, 0.0042064714F, - 0.0043319145F, 0.0044591954F, 0.0045883139F, 0.0047192696F, - 0.0048520622F, 0.0049866914F, 0.0051231569F, 0.0052614583F, - 0.0054015953F, 0.0055435676F, 0.0056873748F, 0.0058330166F, - 0.0059804926F, 0.0061298026F, 0.0062809460F, 0.0064339226F, - 0.0065887320F, 0.0067453738F, 0.0069038476F, 0.0070641531F, - 0.0072262899F, 0.0073902575F, 0.0075560556F, 0.0077236838F, - 0.0078931417F, 0.0080644288F, 0.0082375447F, 0.0084124891F, - 0.0085892615F, 0.0087678614F, 0.0089482885F, 0.0091305422F, - 0.0093146223F, 0.0095005281F, 0.0096882592F, 0.0098778153F, - 0.0100691958F, 0.0102624002F, 0.0104574281F, 0.0106542791F, - 0.0108529525F, 0.0110534480F, 0.0112557651F, 0.0114599032F, - 0.0116658618F, 0.0118736405F, 0.0120832387F, 0.0122946560F, - 0.0125078917F, 0.0127229454F, 0.0129398166F, 0.0131585046F, - 0.0133790090F, 0.0136013292F, 0.0138254647F, 0.0140514149F, - 0.0142791792F, 0.0145087572F, 0.0147401481F, 0.0149733515F, - 0.0152083667F, 0.0154451932F, 0.0156838304F, 0.0159242777F, - 0.0161665345F, 0.0164106001F, 0.0166564741F, 0.0169041557F, - 0.0171536443F, 0.0174049393F, 0.0176580401F, 0.0179129461F, - 0.0181696565F, 0.0184281708F, 0.0186884883F, 0.0189506084F, - 0.0192145303F, 0.0194802535F, 0.0197477772F, 0.0200171008F, - 0.0202882236F, 0.0205611449F, 0.0208358639F, 0.0211123801F, - 0.0213906927F, 0.0216708011F, 0.0219527043F, 0.0222364019F, - 0.0225218930F, 0.0228091769F, 0.0230982529F, 0.0233891203F, - 0.0236817782F, 0.0239762259F, 0.0242724628F, 0.0245704880F, - 0.0248703007F, 0.0251719002F, 0.0254752858F, 0.0257804565F, - 0.0260874117F, 0.0263961506F, 0.0267066722F, 0.0270189760F, - 0.0273330609F, 0.0276489263F, 0.0279665712F, 0.0282859949F, - 0.0286071966F, 0.0289301753F, 0.0292549303F, 0.0295814607F, - 0.0299097656F, 0.0302398442F, 0.0305716957F, 0.0309053191F, - 0.0312407135F, 0.0315778782F, 0.0319168122F, 0.0322575145F, - 0.0325999844F, 0.0329442209F, 0.0332902231F, 0.0336379900F, - 0.0339875208F, 0.0343388146F, 0.0346918703F, 0.0350466871F, - 0.0354032640F, 0.0357616000F, 0.0361216943F, 0.0364835458F, - 0.0368471535F, 0.0372125166F, 0.0375796339F, 0.0379485046F, - 0.0383191276F, 0.0386915020F, 0.0390656267F, 0.0394415008F, - 0.0398191231F, 0.0401984927F, 0.0405796086F, 0.0409624698F, - 0.0413470751F, 0.0417334235F, 0.0421215141F, 0.0425113457F, - 0.0429029172F, 0.0432962277F, 0.0436912760F, 0.0440880610F, - 0.0444865817F, 0.0448868370F, 0.0452888257F, 0.0456925468F, - 0.0460979992F, 0.0465051816F, 0.0469140931F, 0.0473247325F, - 0.0477370986F, 0.0481511902F, 0.0485670064F, 0.0489845458F, - 0.0494038074F, 0.0498247899F, 0.0502474922F, 0.0506719131F, - 0.0510980514F, 0.0515259060F, 0.0519554756F, 0.0523867590F, - 0.0528197550F, 0.0532544624F, 0.0536908800F, 0.0541290066F, - 0.0545688408F, 0.0550103815F, 0.0554536274F, 0.0558985772F, - 0.0563452297F, 0.0567935837F, 0.0572436377F, 0.0576953907F, - 0.0581488412F, 0.0586039880F, 0.0590608297F, 0.0595193651F, - 0.0599795929F, 0.0604415117F, 0.0609051202F, 0.0613704170F, - 0.0618374009F, 0.0623060704F, 0.0627764243F, 0.0632484611F, - 0.0637221795F, 0.0641975781F, 0.0646746555F, 0.0651534104F, - 0.0656338413F, 0.0661159469F, 0.0665997257F, 0.0670851763F, - 0.0675722973F, 0.0680610873F, 0.0685515448F, 0.0690436684F, - 0.0695374567F, 0.0700329081F, 0.0705300213F, 0.0710287947F, - 0.0715292269F, 0.0720313163F, 0.0725350616F, 0.0730404612F, - 0.0735475136F, 0.0740562172F, 0.0745665707F, 0.0750785723F, - 0.0755922207F, 0.0761075143F, 0.0766244515F, 0.0771430307F, - 0.0776632505F, 0.0781851092F, 0.0787086052F, 0.0792337371F, - 0.0797605032F, 0.0802889018F, 0.0808189315F, 0.0813505905F, - 0.0818838773F, 0.0824187903F, 0.0829553277F, 0.0834934881F, - 0.0840332697F, 0.0845746708F, 0.0851176899F, 0.0856623252F, - 0.0862085751F, 0.0867564379F, 0.0873059119F, 0.0878569954F, - 0.0884096867F, 0.0889639840F, 0.0895198858F, 0.0900773902F, - 0.0906364955F, 0.0911972000F, 0.0917595019F, 0.0923233995F, - 0.0928888909F, 0.0934559745F, 0.0940246485F, 0.0945949110F, - 0.0951667604F, 0.0957401946F, 0.0963152121F, 0.0968918109F, - 0.0974699893F, 0.0980497454F, 0.0986310773F, 0.0992139832F, - 0.0997984614F, 0.1003845098F, 0.1009721267F, 0.1015613101F, - 0.1021520582F, 0.1027443692F, 0.1033382410F, 0.1039336718F, - 0.1045306597F, 0.1051292027F, 0.1057292990F, 0.1063309466F, - 0.1069341435F, 0.1075388878F, 0.1081451776F, 0.1087530108F, - 0.1093623856F, 0.1099732998F, 0.1105857516F, 0.1111997389F, - 0.1118152597F, 0.1124323121F, 0.1130508939F, 0.1136710032F, - 0.1142926379F, 0.1149157960F, 0.1155404755F, 0.1161666742F, - 0.1167943901F, 0.1174236211F, 0.1180543652F, 0.1186866202F, - 0.1193203841F, 0.1199556548F, 0.1205924300F, 0.1212307078F, - 0.1218704860F, 0.1225117624F, 0.1231545349F, 0.1237988013F, - 0.1244445596F, 0.1250918074F, 0.1257405427F, 0.1263907632F, - 0.1270424667F, 0.1276956512F, 0.1283503142F, 0.1290064537F, - 0.1296640674F, 0.1303231530F, 0.1309837084F, 0.1316457312F, - 0.1323092193F, 0.1329741703F, 0.1336405820F, 0.1343084520F, - 0.1349777782F, 0.1356485582F, 0.1363207897F, 0.1369944704F, - 0.1376695979F, 0.1383461700F, 0.1390241842F, 0.1397036384F, - 0.1403845300F, 0.1410668567F, 0.1417506162F, 0.1424358061F, - 0.1431224240F, 0.1438104674F, 0.1444999341F, 0.1451908216F, - 0.1458831274F, 0.1465768492F, 0.1472719844F, 0.1479685308F, - 0.1486664857F, 0.1493658468F, 0.1500666115F, 0.1507687775F, - 0.1514723422F, 0.1521773031F, 0.1528836577F, 0.1535914035F, - 0.1543005380F, 0.1550110587F, 0.1557229631F, 0.1564362485F, - 0.1571509124F, 0.1578669524F, 0.1585843657F, 0.1593031499F, - 0.1600233024F, 0.1607448205F, 0.1614677017F, 0.1621919433F, - 0.1629175428F, 0.1636444975F, 0.1643728047F, 0.1651024619F, - 0.1658334665F, 0.1665658156F, 0.1672995067F, 0.1680345371F, - 0.1687709041F, 0.1695086050F, 0.1702476372F, 0.1709879978F, - 0.1717296843F, 0.1724726938F, 0.1732170237F, 0.1739626711F, - 0.1747096335F, 0.1754579079F, 0.1762074916F, 0.1769583819F, - 0.1777105760F, 0.1784640710F, 0.1792188642F, 0.1799749529F, - 0.1807323340F, 0.1814910049F, 0.1822509628F, 0.1830122046F, - 0.1837747277F, 0.1845385292F, 0.1853036062F, 0.1860699558F, - 0.1868375751F, 0.1876064613F, 0.1883766114F, 0.1891480226F, - 0.1899206919F, 0.1906946164F, 0.1914697932F, 0.1922462194F, - 0.1930238919F, 0.1938028079F, 0.1945829643F, 0.1953643583F, - 0.1961469868F, 0.1969308468F, 0.1977159353F, 0.1985022494F, - 0.1992897859F, 0.2000785420F, 0.2008685145F, 0.2016597005F, - 0.2024520968F, 0.2032457005F, 0.2040405084F, 0.2048365175F, - 0.2056337247F, 0.2064321269F, 0.2072317211F, 0.2080325041F, - 0.2088344727F, 0.2096376240F, 0.2104419547F, 0.2112474618F, - 0.2120541420F, 0.2128619923F, 0.2136710094F, 0.2144811902F, - 0.2152925315F, 0.2161050301F, 0.2169186829F, 0.2177334866F, - 0.2185494381F, 0.2193665340F, 0.2201847712F, 0.2210041465F, - 0.2218246565F, 0.2226462981F, 0.2234690680F, 0.2242929629F, - 0.2251179796F, 0.2259441147F, 0.2267713650F, 0.2275997272F, - 0.2284291979F, 0.2292597739F, 0.2300914518F, 0.2309242283F, - 0.2317581001F, 0.2325930638F, 0.2334291160F, 0.2342662534F, - 0.2351044727F, 0.2359437703F, 0.2367841431F, 0.2376255875F, - 0.2384681001F, 0.2393116776F, 0.2401563165F, 0.2410020134F, - 0.2418487649F, 0.2426965675F, 0.2435454178F, 0.2443953122F, - 0.2452462474F, 0.2460982199F, 0.2469512262F, 0.2478052628F, - 0.2486603262F, 0.2495164129F, 0.2503735194F, 0.2512316421F, - 0.2520907776F, 0.2529509222F, 0.2538120726F, 0.2546742250F, - 0.2555373760F, 0.2564015219F, 0.2572666593F, 0.2581327845F, - 0.2589998939F, 0.2598679840F, 0.2607370510F, 0.2616070916F, - 0.2624781019F, 0.2633500783F, 0.2642230173F, 0.2650969152F, - 0.2659717684F, 0.2668475731F, 0.2677243257F, 0.2686020226F, - 0.2694806601F, 0.2703602344F, 0.2712407419F, 0.2721221789F, - 0.2730045417F, 0.2738878265F, 0.2747720297F, 0.2756571474F, - 0.2765431760F, 0.2774301117F, 0.2783179508F, 0.2792066895F, - 0.2800963240F, 0.2809868505F, 0.2818782654F, 0.2827705647F, - 0.2836637447F, 0.2845578016F, 0.2854527315F, 0.2863485307F, - 0.2872451953F, 0.2881427215F, 0.2890411055F, 0.2899403433F, - 0.2908404312F, 0.2917413654F, 0.2926431418F, 0.2935457567F, - 0.2944492061F, 0.2953534863F, 0.2962585932F, 0.2971645230F, - 0.2980712717F, 0.2989788356F, 0.2998872105F, 0.3007963927F, - 0.3017063781F, 0.3026171629F, 0.3035287430F, 0.3044411145F, - 0.3053542736F, 0.3062682161F, 0.3071829381F, 0.3080984356F, - 0.3090147047F, 0.3099317413F, 0.3108495414F, 0.3117681011F, - 0.3126874163F, 0.3136074830F, 0.3145282972F, 0.3154498548F, - 0.3163721517F, 0.3172951841F, 0.3182189477F, 0.3191434385F, - 0.3200686525F, 0.3209945856F, 0.3219212336F, 0.3228485927F, - 0.3237766585F, 0.3247054271F, 0.3256348943F, 0.3265650560F, - 0.3274959081F, 0.3284274465F, 0.3293596671F, 0.3302925657F, - 0.3312261382F, 0.3321603804F, 0.3330952882F, 0.3340308574F, - 0.3349670838F, 0.3359039634F, 0.3368414919F, 0.3377796651F, - 0.3387184789F, 0.3396579290F, 0.3405980113F, 0.3415387216F, - 0.3424800556F, 0.3434220091F, 0.3443645779F, 0.3453077578F, - 0.3462515446F, 0.3471959340F, 0.3481409217F, 0.3490865036F, - 0.3500326754F, 0.3509794328F, 0.3519267715F, 0.3528746873F, - 0.3538231759F, 0.3547722330F, 0.3557218544F, 0.3566720357F, - 0.3576227727F, 0.3585740610F, 0.3595258964F, 0.3604782745F, - 0.3614311910F, 0.3623846417F, 0.3633386221F, 0.3642931280F, - 0.3652481549F, 0.3662036987F, 0.3671597548F, 0.3681163191F, - 0.3690733870F, 0.3700309544F, 0.3709890167F, 0.3719475696F, - 0.3729066089F, 0.3738661299F, 0.3748261285F, 0.3757866002F, - 0.3767475406F, 0.3777089453F, 0.3786708100F, 0.3796331302F, - 0.3805959014F, 0.3815591194F, 0.3825227796F, 0.3834868777F, - 0.3844514093F, 0.3854163698F, 0.3863817549F, 0.3873475601F, - 0.3883137810F, 0.3892804131F, 0.3902474521F, 0.3912148933F, - 0.3921827325F, 0.3931509650F, 0.3941195865F, 0.3950885925F, - 0.3960579785F, 0.3970277400F, 0.3979978725F, 0.3989683716F, - 0.3999392328F, 0.4009104516F, 0.4018820234F, 0.4028539438F, - 0.4038262084F, 0.4047988125F, 0.4057717516F, 0.4067450214F, - 0.4077186172F, 0.4086925345F, 0.4096667688F, 0.4106413155F, - 0.4116161703F, 0.4125913284F, 0.4135667854F, 0.4145425368F, - 0.4155185780F, 0.4164949044F, 0.4174715116F, 0.4184483949F, - 0.4194255498F, 0.4204029718F, 0.4213806563F, 0.4223585987F, - 0.4233367946F, 0.4243152392F, 0.4252939281F, 0.4262728566F, - 0.4272520202F, 0.4282314144F, 0.4292110345F, 0.4301908760F, - 0.4311709343F, 0.4321512047F, 0.4331316828F, 0.4341123639F, - 0.4350932435F, 0.4360743168F, 0.4370555794F, 0.4380370267F, - 0.4390186540F, 0.4400004567F, 0.4409824303F, 0.4419645701F, - 0.4429468716F, 0.4439293300F, 0.4449119409F, 0.4458946996F, - 0.4468776014F, 0.4478606418F, 0.4488438162F, 0.4498271199F, - 0.4508105483F, 0.4517940967F, 0.4527777607F, 0.4537615355F, - 0.4547454165F, 0.4557293991F, 0.4567134786F, 0.4576976505F, - 0.4586819101F, 0.4596662527F, 0.4606506738F, 0.4616351687F, - 0.4626197328F, 0.4636043614F, 0.4645890499F, 0.4655737936F, - 0.4665585880F, 0.4675434284F, 0.4685283101F, 0.4695132286F, - 0.4704981791F, 0.4714831570F, 0.4724681577F, 0.4734531766F, - 0.4744382089F, 0.4754232501F, 0.4764082956F, 0.4773933406F, - 0.4783783806F, 0.4793634108F, 0.4803484267F, 0.4813334237F, - 0.4823183969F, 0.4833033419F, 0.4842882540F, 0.4852731285F, - 0.4862579608F, 0.4872427462F, 0.4882274802F, 0.4892121580F, - 0.4901967751F, 0.4911813267F, 0.4921658083F, 0.4931502151F, - 0.4941345427F, 0.4951187863F, 0.4961029412F, 0.4970870029F, - 0.4980709667F, 0.4990548280F, 0.5000385822F, 0.5010222245F, - 0.5020057505F, 0.5029891553F, 0.5039724345F, 0.5049555834F, - 0.5059385973F, 0.5069214716F, 0.5079042018F, 0.5088867831F, - 0.5098692110F, 0.5108514808F, 0.5118335879F, 0.5128155277F, - 0.5137972956F, 0.5147788869F, 0.5157602971F, 0.5167415215F, - 0.5177225555F, 0.5187033945F, 0.5196840339F, 0.5206644692F, - 0.5216446956F, 0.5226247086F, 0.5236045035F, 0.5245840759F, - 0.5255634211F, 0.5265425344F, 0.5275214114F, 0.5285000474F, - 0.5294784378F, 0.5304565781F, 0.5314344637F, 0.5324120899F, - 0.5333894522F, 0.5343665461F, 0.5353433670F, 0.5363199102F, - 0.5372961713F, 0.5382721457F, 0.5392478287F, 0.5402232159F, - 0.5411983027F, 0.5421730845F, 0.5431475569F, 0.5441217151F, - 0.5450955548F, 0.5460690714F, 0.5470422602F, 0.5480151169F, - 0.5489876368F, 0.5499598155F, 0.5509316484F, 0.5519031310F, - 0.5528742587F, 0.5538450271F, 0.5548154317F, 0.5557854680F, - 0.5567551314F, 0.5577244174F, 0.5586933216F, 0.5596618395F, - 0.5606299665F, 0.5615976983F, 0.5625650302F, 0.5635319580F, - 0.5644984770F, 0.5654645828F, 0.5664302709F, 0.5673955370F, - 0.5683603765F, 0.5693247850F, 0.5702887580F, 0.5712522912F, - 0.5722153800F, 0.5731780200F, 0.5741402069F, 0.5751019362F, - 0.5760632034F, 0.5770240042F, 0.5779843341F, 0.5789441889F, - 0.5799035639F, 0.5808624549F, 0.5818208575F, 0.5827787673F, - 0.5837361800F, 0.5846930910F, 0.5856494961F, 0.5866053910F, - 0.5875607712F, 0.5885156324F, 0.5894699703F, 0.5904237804F, - 0.5913770586F, 0.5923298004F, 0.5932820016F, 0.5942336578F, - 0.5951847646F, 0.5961353179F, 0.5970853132F, 0.5980347464F, - 0.5989836131F, 0.5999319090F, 0.6008796298F, 0.6018267713F, - 0.6027733292F, 0.6037192993F, 0.6046646773F, 0.6056094589F, - 0.6065536400F, 0.6074972162F, 0.6084401833F, 0.6093825372F, - 0.6103242736F, 0.6112653884F, 0.6122058772F, 0.6131457359F, - 0.6140849604F, 0.6150235464F, 0.6159614897F, 0.6168987862F, - 0.6178354318F, 0.6187714223F, 0.6197067535F, 0.6206414213F, - 0.6215754215F, 0.6225087501F, 0.6234414028F, 0.6243733757F, - 0.6253046646F, 0.6262352654F, 0.6271651739F, 0.6280943862F, - 0.6290228982F, 0.6299507057F, 0.6308778048F, 0.6318041913F, - 0.6327298612F, 0.6336548105F, 0.6345790352F, 0.6355025312F, - 0.6364252945F, 0.6373473211F, 0.6382686070F, 0.6391891483F, - 0.6401089409F, 0.6410279808F, 0.6419462642F, 0.6428637869F, - 0.6437805452F, 0.6446965350F, 0.6456117524F, 0.6465261935F, - 0.6474398544F, 0.6483527311F, 0.6492648197F, 0.6501761165F, - 0.6510866174F, 0.6519963186F, 0.6529052162F, 0.6538133064F, - 0.6547205854F, 0.6556270492F, 0.6565326941F, 0.6574375162F, - 0.6583415117F, 0.6592446769F, 0.6601470079F, 0.6610485009F, - 0.6619491521F, 0.6628489578F, 0.6637479143F, 0.6646460177F, - 0.6655432643F, 0.6664396505F, 0.6673351724F, 0.6682298264F, - 0.6691236087F, 0.6700165157F, 0.6709085436F, 0.6717996889F, - 0.6726899478F, 0.6735793167F, 0.6744677918F, 0.6753553697F, - 0.6762420466F, 0.6771278190F, 0.6780126832F, 0.6788966357F, - 0.6797796728F, 0.6806617909F, 0.6815429866F, 0.6824232562F, - 0.6833025961F, 0.6841810030F, 0.6850584731F, 0.6859350031F, - 0.6868105894F, 0.6876852284F, 0.6885589168F, 0.6894316510F, - 0.6903034275F, 0.6911742430F, 0.6920440939F, 0.6929129769F, - 0.6937808884F, 0.6946478251F, 0.6955137837F, 0.6963787606F, - 0.6972427525F, 0.6981057560F, 0.6989677678F, 0.6998287845F, - 0.7006888028F, 0.7015478194F, 0.7024058309F, 0.7032628340F, - 0.7041188254F, 0.7049738019F, 0.7058277601F, 0.7066806969F, - 0.7075326089F, 0.7083834929F, 0.7092333457F, 0.7100821640F, - 0.7109299447F, 0.7117766846F, 0.7126223804F, 0.7134670291F, - 0.7143106273F, 0.7151531721F, 0.7159946602F, 0.7168350885F, - 0.7176744539F, 0.7185127534F, 0.7193499837F, 0.7201861418F, - 0.7210212247F, 0.7218552293F, 0.7226881526F, 0.7235199914F, - 0.7243507428F, 0.7251804039F, 0.7260089715F, 0.7268364426F, - 0.7276628144F, 0.7284880839F, 0.7293122481F, 0.7301353040F, - 0.7309572487F, 0.7317780794F, 0.7325977930F, 0.7334163868F, - 0.7342338579F, 0.7350502033F, 0.7358654202F, 0.7366795059F, - 0.7374924573F, 0.7383042718F, 0.7391149465F, 0.7399244787F, - 0.7407328655F, 0.7415401041F, 0.7423461920F, 0.7431511261F, - 0.7439549040F, 0.7447575227F, 0.7455589797F, 0.7463592723F, - 0.7471583976F, 0.7479563532F, 0.7487531363F, 0.7495487443F, - 0.7503431745F, 0.7511364244F, 0.7519284913F, 0.7527193726F, - 0.7535090658F, 0.7542975683F, 0.7550848776F, 0.7558709910F, - 0.7566559062F, 0.7574396205F, 0.7582221314F, 0.7590034366F, - 0.7597835334F, 0.7605624194F, 0.7613400923F, 0.7621165495F, - 0.7628917886F, 0.7636658072F, 0.7644386030F, 0.7652101735F, - 0.7659805164F, 0.7667496292F, 0.7675175098F, 0.7682841556F, - 0.7690495645F, 0.7698137341F, 0.7705766622F, 0.7713383463F, - 0.7720987844F, 0.7728579741F, 0.7736159132F, 0.7743725994F, - 0.7751280306F, 0.7758822046F, 0.7766351192F, 0.7773867722F, - 0.7781371614F, 0.7788862848F, 0.7796341401F, 0.7803807253F, - 0.7811260383F, 0.7818700769F, 0.7826128392F, 0.7833543230F, - 0.7840945263F, 0.7848334471F, 0.7855710833F, 0.7863074330F, - 0.7870424941F, 0.7877762647F, 0.7885087428F, 0.7892399264F, - 0.7899698137F, 0.7906984026F, 0.7914256914F, 0.7921516780F, - 0.7928763607F, 0.7935997375F, 0.7943218065F, 0.7950425661F, - 0.7957620142F, 0.7964801492F, 0.7971969692F, 0.7979124724F, - 0.7986266570F, 0.7993395214F, 0.8000510638F, 0.8007612823F, - 0.8014701754F, 0.8021777413F, 0.8028839784F, 0.8035888849F, - 0.8042924592F, 0.8049946997F, 0.8056956048F, 0.8063951727F, - 0.8070934020F, 0.8077902910F, 0.8084858381F, 0.8091800419F, - 0.8098729007F, 0.8105644130F, 0.8112545774F, 0.8119433922F, - 0.8126308561F, 0.8133169676F, 0.8140017251F, 0.8146851272F, - 0.8153671726F, 0.8160478598F, 0.8167271874F, 0.8174051539F, - 0.8180817582F, 0.8187569986F, 0.8194308741F, 0.8201033831F, - 0.8207745244F, 0.8214442966F, 0.8221126986F, 0.8227797290F, - 0.8234453865F, 0.8241096700F, 0.8247725781F, 0.8254341097F, - 0.8260942636F, 0.8267530385F, 0.8274104334F, 0.8280664470F, - 0.8287210782F, 0.8293743259F, 0.8300261889F, 0.8306766662F, - 0.8313257566F, 0.8319734591F, 0.8326197727F, 0.8332646963F, - 0.8339082288F, 0.8345503692F, 0.8351911167F, 0.8358304700F, - 0.8364684284F, 0.8371049907F, 0.8377401562F, 0.8383739238F, - 0.8390062927F, 0.8396372618F, 0.8402668305F, 0.8408949977F, - 0.8415217626F, 0.8421471245F, 0.8427710823F, 0.8433936354F, - 0.8440147830F, 0.8446345242F, 0.8452528582F, 0.8458697844F, - 0.8464853020F, 0.8470994102F, 0.8477121084F, 0.8483233958F, - 0.8489332718F, 0.8495417356F, 0.8501487866F, 0.8507544243F, - 0.8513586479F, 0.8519614568F, 0.8525628505F, 0.8531628283F, - 0.8537613897F, 0.8543585341F, 0.8549542611F, 0.8555485699F, - 0.8561414603F, 0.8567329315F, 0.8573229832F, 0.8579116149F, - 0.8584988262F, 0.8590846165F, 0.8596689855F, 0.8602519327F, - 0.8608334577F, 0.8614135603F, 0.8619922399F, 0.8625694962F, - 0.8631453289F, 0.8637197377F, 0.8642927222F, 0.8648642821F, - 0.8654344172F, 0.8660031272F, 0.8665704118F, 0.8671362708F, - 0.8677007039F, 0.8682637109F, 0.8688252917F, 0.8693854460F, - 0.8699441737F, 0.8705014745F, 0.8710573485F, 0.8716117953F, - 0.8721648150F, 0.8727164073F, 0.8732665723F, 0.8738153098F, - 0.8743626197F, 0.8749085021F, 0.8754529569F, 0.8759959840F, - 0.8765375835F, 0.8770777553F, 0.8776164996F, 0.8781538162F, - 0.8786897054F, 0.8792241670F, 0.8797572013F, 0.8802888082F, - 0.8808189880F, 0.8813477407F, 0.8818750664F, 0.8824009653F, - 0.8829254375F, 0.8834484833F, 0.8839701028F, 0.8844902961F, - 0.8850090636F, 0.8855264054F, 0.8860423218F, 0.8865568131F, - 0.8870698794F, 0.8875815212F, 0.8880917386F, 0.8886005319F, - 0.8891079016F, 0.8896138479F, 0.8901183712F, 0.8906214719F, - 0.8911231503F, 0.8916234067F, 0.8921222417F, 0.8926196556F, - 0.8931156489F, 0.8936102219F, 0.8941033752F, 0.8945951092F, - 0.8950854244F, 0.8955743212F, 0.8960618003F, 0.8965478621F, - 0.8970325071F, 0.8975157359F, 0.8979975490F, 0.8984779471F, - 0.8989569307F, 0.8994345004F, 0.8999106568F, 0.9003854005F, - 0.9008587323F, 0.9013306526F, 0.9018011623F, 0.9022702619F, - 0.9027379521F, 0.9032042337F, 0.9036691074F, 0.9041325739F, - 0.9045946339F, 0.9050552882F, 0.9055145376F, 0.9059723828F, - 0.9064288246F, 0.9068838638F, 0.9073375013F, 0.9077897379F, - 0.9082405743F, 0.9086900115F, 0.9091380503F, 0.9095846917F, - 0.9100299364F, 0.9104737854F, 0.9109162397F, 0.9113573001F, - 0.9117969675F, 0.9122352430F, 0.9126721275F, 0.9131076219F, - 0.9135417273F, 0.9139744447F, 0.9144057750F, 0.9148357194F, - 0.9152642787F, 0.9156914542F, 0.9161172468F, 0.9165416576F, - 0.9169646877F, 0.9173863382F, 0.9178066102F, 0.9182255048F, - 0.9186430232F, 0.9190591665F, 0.9194739359F, 0.9198873324F, - 0.9202993574F, 0.9207100120F, 0.9211192973F, 0.9215272147F, - 0.9219337653F, 0.9223389504F, 0.9227427713F, 0.9231452290F, - 0.9235463251F, 0.9239460607F, 0.9243444371F, 0.9247414557F, - 0.9251371177F, 0.9255314245F, 0.9259243774F, 0.9263159778F, - 0.9267062270F, 0.9270951264F, 0.9274826774F, 0.9278688814F, - 0.9282537398F, 0.9286372540F, 0.9290194254F, 0.9294002555F, - 0.9297797458F, 0.9301578976F, 0.9305347125F, 0.9309101919F, - 0.9312843373F, 0.9316571503F, 0.9320286323F, 0.9323987849F, - 0.9327676097F, 0.9331351080F, 0.9335012816F, 0.9338661320F, - 0.9342296607F, 0.9345918694F, 0.9349527596F, 0.9353123330F, - 0.9356705911F, 0.9360275357F, 0.9363831683F, 0.9367374905F, - 0.9370905042F, 0.9374422108F, 0.9377926122F, 0.9381417099F, - 0.9384895057F, 0.9388360014F, 0.9391811985F, 0.9395250989F, - 0.9398677043F, 0.9402090165F, 0.9405490371F, 0.9408877680F, - 0.9412252110F, 0.9415613678F, 0.9418962402F, 0.9422298301F, - 0.9425621392F, 0.9428931695F, 0.9432229226F, 0.9435514005F, - 0.9438786050F, 0.9442045381F, 0.9445292014F, 0.9448525971F, - 0.9451747268F, 0.9454955926F, 0.9458151963F, 0.9461335399F, - 0.9464506253F, 0.9467664545F, 0.9470810293F, 0.9473943517F, - 0.9477064238F, 0.9480172474F, 0.9483268246F, 0.9486351573F, - 0.9489422475F, 0.9492480973F, 0.9495527087F, 0.9498560837F, - 0.9501582243F, 0.9504591325F, 0.9507588105F, 0.9510572603F, - 0.9513544839F, 0.9516504834F, 0.9519452609F, 0.9522388186F, - 0.9525311584F, 0.9528222826F, 0.9531121932F, 0.9534008923F, - 0.9536883821F, 0.9539746647F, 0.9542597424F, 0.9545436171F, - 0.9548262912F, 0.9551077667F, 0.9553880459F, 0.9556671309F, - 0.9559450239F, 0.9562217272F, 0.9564972429F, 0.9567715733F, - 0.9570447206F, 0.9573166871F, 0.9575874749F, 0.9578570863F, - 0.9581255236F, 0.9583927890F, 0.9586588849F, 0.9589238134F, - 0.9591875769F, 0.9594501777F, 0.9597116180F, 0.9599719003F, - 0.9602310267F, 0.9604889995F, 0.9607458213F, 0.9610014942F, - 0.9612560206F, 0.9615094028F, 0.9617616433F, 0.9620127443F, - 0.9622627083F, 0.9625115376F, 0.9627592345F, 0.9630058016F, - 0.9632512411F, 0.9634955555F, 0.9637387471F, 0.9639808185F, - 0.9642217720F, 0.9644616100F, 0.9647003349F, 0.9649379493F, - 0.9651744556F, 0.9654098561F, 0.9656441534F, 0.9658773499F, - 0.9661094480F, 0.9663404504F, 0.9665703593F, 0.9667991774F, - 0.9670269071F, 0.9672535509F, 0.9674791114F, 0.9677035909F, - 0.9679269921F, 0.9681493174F, 0.9683705694F, 0.9685907506F, - 0.9688098636F, 0.9690279108F, 0.9692448948F, 0.9694608182F, - 0.9696756836F, 0.9698894934F, 0.9701022503F, 0.9703139569F, - 0.9705246156F, 0.9707342291F, 0.9709428000F, 0.9711503309F, - 0.9713568243F, 0.9715622829F, 0.9717667093F, 0.9719701060F, - 0.9721724757F, 0.9723738210F, 0.9725741446F, 0.9727734490F, - 0.9729717369F, 0.9731690109F, 0.9733652737F, 0.9735605279F, - 0.9737547762F, 0.9739480212F, 0.9741402656F, 0.9743315120F, - 0.9745217631F, 0.9747110216F, 0.9748992901F, 0.9750865714F, - 0.9752728681F, 0.9754581829F, 0.9756425184F, 0.9758258775F, - 0.9760082627F, 0.9761896768F, 0.9763701224F, 0.9765496024F, - 0.9767281193F, 0.9769056760F, 0.9770822751F, 0.9772579193F, - 0.9774326114F, 0.9776063542F, 0.9777791502F, 0.9779510023F, - 0.9781219133F, 0.9782918858F, 0.9784609226F, 0.9786290264F, - 0.9787962000F, 0.9789624461F, 0.9791277676F, 0.9792921671F, - 0.9794556474F, 0.9796182113F, 0.9797798615F, 0.9799406009F, - 0.9801004321F, 0.9802593580F, 0.9804173813F, 0.9805745049F, - 0.9807307314F, 0.9808860637F, 0.9810405046F, 0.9811940568F, - 0.9813467232F, 0.9814985065F, 0.9816494095F, 0.9817994351F, - 0.9819485860F, 0.9820968650F, 0.9822442750F, 0.9823908186F, - 0.9825364988F, 0.9826813184F, 0.9828252801F, 0.9829683868F, - 0.9831106413F, 0.9832520463F, 0.9833926048F, 0.9835323195F, - 0.9836711932F, 0.9838092288F, 0.9839464291F, 0.9840827969F, - 0.9842183351F, 0.9843530464F, 0.9844869337F, 0.9846199998F, - 0.9847522475F, 0.9848836798F, 0.9850142993F, 0.9851441090F, - 0.9852731117F, 0.9854013101F, 0.9855287073F, 0.9856553058F, - 0.9857811087F, 0.9859061188F, 0.9860303388F, 0.9861537717F, - 0.9862764202F, 0.9863982872F, 0.9865193756F, 0.9866396882F, - 0.9867592277F, 0.9868779972F, 0.9869959993F, 0.9871132370F, - 0.9872297131F, 0.9873454304F, 0.9874603918F, 0.9875746001F, - 0.9876880581F, 0.9878007688F, 0.9879127348F, 0.9880239592F, - 0.9881344447F, 0.9882441941F, 0.9883532104F, 0.9884614962F, - 0.9885690546F, 0.9886758883F, 0.9887820001F, 0.9888873930F, - 0.9889920697F, 0.9890960331F, 0.9891992859F, 0.9893018312F, - 0.9894036716F, 0.9895048100F, 0.9896052493F, 0.9897049923F, - 0.9898040418F, 0.9899024006F, 0.9900000717F, 0.9900970577F, - 0.9901933616F, 0.9902889862F, 0.9903839343F, 0.9904782087F, - 0.9905718122F, 0.9906647477F, 0.9907570180F, 0.9908486259F, - 0.9909395742F, 0.9910298658F, 0.9911195034F, 0.9912084899F, - 0.9912968281F, 0.9913845208F, 0.9914715708F, 0.9915579810F, - 0.9916437540F, 0.9917288928F, 0.9918134001F, 0.9918972788F, - 0.9919805316F, 0.9920631613F, 0.9921451707F, 0.9922265626F, - 0.9923073399F, 0.9923875052F, 0.9924670615F, 0.9925460114F, - 0.9926243577F, 0.9927021033F, 0.9927792508F, 0.9928558032F, - 0.9929317631F, 0.9930071333F, 0.9930819167F, 0.9931561158F, - 0.9932297337F, 0.9933027728F, 0.9933752362F, 0.9934471264F, - 0.9935184462F, 0.9935891985F, 0.9936593859F, 0.9937290112F, - 0.9937980771F, 0.9938665864F, 0.9939345418F, 0.9940019460F, - 0.9940688018F, 0.9941351118F, 0.9942008789F, 0.9942661057F, - 0.9943307950F, 0.9943949494F, 0.9944585717F, 0.9945216645F, - 0.9945842307F, 0.9946462728F, 0.9947077936F, 0.9947687957F, - 0.9948292820F, 0.9948892550F, 0.9949487174F, 0.9950076719F, - 0.9950661212F, 0.9951240679F, 0.9951815148F, 0.9952384645F, - 0.9952949196F, 0.9953508828F, 0.9954063568F, 0.9954613442F, - 0.9955158476F, 0.9955698697F, 0.9956234132F, 0.9956764806F, - 0.9957290746F, 0.9957811978F, 0.9958328528F, 0.9958840423F, - 0.9959347688F, 0.9959850351F, 0.9960348435F, 0.9960841969F, - 0.9961330977F, 0.9961815486F, 0.9962295521F, 0.9962771108F, - 0.9963242274F, 0.9963709043F, 0.9964171441F, 0.9964629494F, - 0.9965083228F, 0.9965532668F, 0.9965977840F, 0.9966418768F, - 0.9966855479F, 0.9967287998F, 0.9967716350F, 0.9968140559F, - 0.9968560653F, 0.9968976655F, 0.9969388591F, 0.9969796485F, - 0.9970200363F, 0.9970600250F, 0.9970996170F, 0.9971388149F, - 0.9971776211F, 0.9972160380F, 0.9972540683F, 0.9972917142F, - 0.9973289783F, 0.9973658631F, 0.9974023709F, 0.9974385042F, - 0.9974742655F, 0.9975096571F, 0.9975446816F, 0.9975793413F, - 0.9976136386F, 0.9976475759F, 0.9976811557F, 0.9977143803F, - 0.9977472521F, 0.9977797736F, 0.9978119470F, 0.9978437748F, - 0.9978752593F, 0.9979064029F, 0.9979372079F, 0.9979676768F, - 0.9979978117F, 0.9980276151F, 0.9980570893F, 0.9980862367F, - 0.9981150595F, 0.9981435600F, 0.9981717406F, 0.9981996035F, - 0.9982271511F, 0.9982543856F, 0.9982813093F, 0.9983079246F, - 0.9983342336F, 0.9983602386F, 0.9983859418F, 0.9984113456F, - 0.9984364522F, 0.9984612638F, 0.9984857825F, 0.9985100108F, - 0.9985339507F, 0.9985576044F, 0.9985809743F, 0.9986040624F, - 0.9986268710F, 0.9986494022F, 0.9986716583F, 0.9986936413F, - 0.9987153535F, 0.9987367969F, 0.9987579738F, 0.9987788864F, - 0.9987995366F, 0.9988199267F, 0.9988400587F, 0.9988599348F, - 0.9988795572F, 0.9988989278F, 0.9989180487F, 0.9989369222F, - 0.9989555501F, 0.9989739347F, 0.9989920780F, 0.9990099820F, - 0.9990276487F, 0.9990450803F, 0.9990622787F, 0.9990792460F, - 0.9990959841F, 0.9991124952F, 0.9991287812F, 0.9991448440F, - 0.9991606858F, 0.9991763084F, 0.9991917139F, 0.9992069042F, - 0.9992218813F, 0.9992366471F, 0.9992512035F, 0.9992655525F, - 0.9992796961F, 0.9992936361F, 0.9993073744F, 0.9993209131F, - 0.9993342538F, 0.9993473987F, 0.9993603494F, 0.9993731080F, - 0.9993856762F, 0.9993980559F, 0.9994102490F, 0.9994222573F, - 0.9994340827F, 0.9994457269F, 0.9994571918F, 0.9994684793F, - 0.9994795910F, 0.9994905288F, 0.9995012945F, 0.9995118898F, - 0.9995223165F, 0.9995325765F, 0.9995426713F, 0.9995526029F, - 0.9995623728F, 0.9995719829F, 0.9995814349F, 0.9995907304F, - 0.9995998712F, 0.9996088590F, 0.9996176954F, 0.9996263821F, - 0.9996349208F, 0.9996433132F, 0.9996515609F, 0.9996596656F, - 0.9996676288F, 0.9996754522F, 0.9996831375F, 0.9996906862F, - 0.9996981000F, 0.9997053804F, 0.9997125290F, 0.9997195474F, - 0.9997264371F, 0.9997331998F, 0.9997398369F, 0.9997463500F, - 0.9997527406F, 0.9997590103F, 0.9997651606F, 0.9997711930F, - 0.9997771089F, 0.9997829098F, 0.9997885973F, 0.9997941728F, - 0.9997996378F, 0.9998049936F, 0.9998102419F, 0.9998153839F, - 0.9998204211F, 0.9998253550F, 0.9998301868F, 0.9998349182F, - 0.9998395503F, 0.9998440847F, 0.9998485226F, 0.9998528654F, - 0.9998571146F, 0.9998612713F, 0.9998653370F, 0.9998693130F, - 0.9998732007F, 0.9998770012F, 0.9998807159F, 0.9998843461F, - 0.9998878931F, 0.9998913581F, 0.9998947424F, 0.9998980473F, - 0.9999012740F, 0.9999044237F, 0.9999074976F, 0.9999104971F, - 0.9999134231F, 0.9999162771F, 0.9999190601F, 0.9999217733F, - 0.9999244179F, 0.9999269950F, 0.9999295058F, 0.9999319515F, - 0.9999343332F, 0.9999366519F, 0.9999389088F, 0.9999411050F, - 0.9999432416F, 0.9999453196F, 0.9999473402F, 0.9999493044F, - 0.9999512132F, 0.9999530677F, 0.9999548690F, 0.9999566180F, - 0.9999583157F, 0.9999599633F, 0.9999615616F, 0.9999631116F, - 0.9999646144F, 0.9999660709F, 0.9999674820F, 0.9999688487F, - 0.9999701719F, 0.9999714526F, 0.9999726917F, 0.9999738900F, - 0.9999750486F, 0.9999761682F, 0.9999772497F, 0.9999782941F, - 0.9999793021F, 0.9999802747F, 0.9999812126F, 0.9999821167F, - 0.9999829878F, 0.9999838268F, 0.9999846343F, 0.9999854113F, - 0.9999861584F, 0.9999868765F, 0.9999875664F, 0.9999882287F, - 0.9999888642F, 0.9999894736F, 0.9999900577F, 0.9999906172F, - 0.9999911528F, 0.9999916651F, 0.9999921548F, 0.9999926227F, - 0.9999930693F, 0.9999934954F, 0.9999939015F, 0.9999942883F, - 0.9999946564F, 0.9999950064F, 0.9999953390F, 0.9999956547F, - 0.9999959541F, 0.9999962377F, 0.9999965062F, 0.9999967601F, - 0.9999969998F, 0.9999972260F, 0.9999974392F, 0.9999976399F, - 0.9999978285F, 0.9999980056F, 0.9999981716F, 0.9999983271F, - 0.9999984724F, 0.9999986081F, 0.9999987345F, 0.9999988521F, - 0.9999989613F, 0.9999990625F, 0.9999991562F, 0.9999992426F, - 0.9999993223F, 0.9999993954F, 0.9999994625F, 0.9999995239F, - 0.9999995798F, 0.9999996307F, 0.9999996768F, 0.9999997184F, - 0.9999997559F, 0.9999997895F, 0.9999998195F, 0.9999998462F, - 0.9999998698F, 0.9999998906F, 0.9999999088F, 0.9999999246F, - 0.9999999383F, 0.9999999500F, 0.9999999600F, 0.9999999684F, - 0.9999999754F, 0.9999999811F, 0.9999999858F, 0.9999999896F, - 0.9999999925F, 0.9999999948F, 0.9999999965F, 0.9999999978F, - 0.9999999986F, 0.9999999992F, 0.9999999996F, 0.9999999998F, - 0.9999999999F, 1.0000000000F, 1.0000000000F, 1.0000000000F, -}; - -static float vwin8192[4096] = { - 0.0000000578F, 0.0000005198F, 0.0000014438F, 0.0000028299F, - 0.0000046780F, 0.0000069882F, 0.0000097604F, 0.0000129945F, - 0.0000166908F, 0.0000208490F, 0.0000254692F, 0.0000305515F, - 0.0000360958F, 0.0000421021F, 0.0000485704F, 0.0000555006F, - 0.0000628929F, 0.0000707472F, 0.0000790635F, 0.0000878417F, - 0.0000970820F, 0.0001067842F, 0.0001169483F, 0.0001275744F, - 0.0001386625F, 0.0001502126F, 0.0001622245F, 0.0001746984F, - 0.0001876343F, 0.0002010320F, 0.0002148917F, 0.0002292132F, - 0.0002439967F, 0.0002592421F, 0.0002749493F, 0.0002911184F, - 0.0003077493F, 0.0003248421F, 0.0003423967F, 0.0003604132F, - 0.0003788915F, 0.0003978316F, 0.0004172335F, 0.0004370971F, - 0.0004574226F, 0.0004782098F, 0.0004994587F, 0.0005211694F, - 0.0005433418F, 0.0005659759F, 0.0005890717F, 0.0006126292F, - 0.0006366484F, 0.0006611292F, 0.0006860716F, 0.0007114757F, - 0.0007373414F, 0.0007636687F, 0.0007904576F, 0.0008177080F, - 0.0008454200F, 0.0008735935F, 0.0009022285F, 0.0009313250F, - 0.0009608830F, 0.0009909025F, 0.0010213834F, 0.0010523257F, - 0.0010837295F, 0.0011155946F, 0.0011479211F, 0.0011807090F, - 0.0012139582F, 0.0012476687F, 0.0012818405F, 0.0013164736F, - 0.0013515679F, 0.0013871235F, 0.0014231402F, 0.0014596182F, - 0.0014965573F, 0.0015339576F, 0.0015718190F, 0.0016101415F, - 0.0016489251F, 0.0016881698F, 0.0017278754F, 0.0017680421F, - 0.0018086698F, 0.0018497584F, 0.0018913080F, 0.0019333185F, - 0.0019757898F, 0.0020187221F, 0.0020621151F, 0.0021059690F, - 0.0021502837F, 0.0021950591F, 0.0022402953F, 0.0022859921F, - 0.0023321497F, 0.0023787679F, 0.0024258467F, 0.0024733861F, - 0.0025213861F, 0.0025698466F, 0.0026187676F, 0.0026681491F, - 0.0027179911F, 0.0027682935F, 0.0028190562F, 0.0028702794F, - 0.0029219628F, 0.0029741066F, 0.0030267107F, 0.0030797749F, - 0.0031332994F, 0.0031872841F, 0.0032417289F, 0.0032966338F, - 0.0033519988F, 0.0034078238F, 0.0034641089F, 0.0035208539F, - 0.0035780589F, 0.0036357237F, 0.0036938485F, 0.0037524331F, - 0.0038114775F, 0.0038709817F, 0.0039309456F, 0.0039913692F, - 0.0040522524F, 0.0041135953F, 0.0041753978F, 0.0042376599F, - 0.0043003814F, 0.0043635624F, 0.0044272029F, 0.0044913028F, - 0.0045558620F, 0.0046208806F, 0.0046863585F, 0.0047522955F, - 0.0048186919F, 0.0048855473F, 0.0049528619F, 0.0050206356F, - 0.0050888684F, 0.0051575601F, 0.0052267108F, 0.0052963204F, - 0.0053663890F, 0.0054369163F, 0.0055079025F, 0.0055793474F, - 0.0056512510F, 0.0057236133F, 0.0057964342F, 0.0058697137F, - 0.0059434517F, 0.0060176482F, 0.0060923032F, 0.0061674166F, - 0.0062429883F, 0.0063190183F, 0.0063955066F, 0.0064724532F, - 0.0065498579F, 0.0066277207F, 0.0067060416F, 0.0067848205F, - 0.0068640575F, 0.0069437523F, 0.0070239051F, 0.0071045157F, - 0.0071855840F, 0.0072671102F, 0.0073490940F, 0.0074315355F, - 0.0075144345F, 0.0075977911F, 0.0076816052F, 0.0077658768F, - 0.0078506057F, 0.0079357920F, 0.0080214355F, 0.0081075363F, - 0.0081940943F, 0.0082811094F, 0.0083685816F, 0.0084565108F, - 0.0085448970F, 0.0086337401F, 0.0087230401F, 0.0088127969F, - 0.0089030104F, 0.0089936807F, 0.0090848076F, 0.0091763911F, - 0.0092684311F, 0.0093609276F, 0.0094538805F, 0.0095472898F, - 0.0096411554F, 0.0097354772F, 0.0098302552F, 0.0099254894F, - 0.0100211796F, 0.0101173259F, 0.0102139281F, 0.0103109863F, - 0.0104085002F, 0.0105064700F, 0.0106048955F, 0.0107037766F, - 0.0108031133F, 0.0109029056F, 0.0110031534F, 0.0111038565F, - 0.0112050151F, 0.0113066289F, 0.0114086980F, 0.0115112222F, - 0.0116142015F, 0.0117176359F, 0.0118215252F, 0.0119258695F, - 0.0120306686F, 0.0121359225F, 0.0122416312F, 0.0123477944F, - 0.0124544123F, 0.0125614847F, 0.0126690116F, 0.0127769928F, - 0.0128854284F, 0.0129943182F, 0.0131036623F, 0.0132134604F, - 0.0133237126F, 0.0134344188F, 0.0135455790F, 0.0136571929F, - 0.0137692607F, 0.0138817821F, 0.0139947572F, 0.0141081859F, - 0.0142220681F, 0.0143364037F, 0.0144511927F, 0.0145664350F, - 0.0146821304F, 0.0147982791F, 0.0149148808F, 0.0150319355F, - 0.0151494431F, 0.0152674036F, 0.0153858168F, 0.0155046828F, - 0.0156240014F, 0.0157437726F, 0.0158639962F, 0.0159846723F, - 0.0161058007F, 0.0162273814F, 0.0163494142F, 0.0164718991F, - 0.0165948361F, 0.0167182250F, 0.0168420658F, 0.0169663584F, - 0.0170911027F, 0.0172162987F, 0.0173419462F, 0.0174680452F, - 0.0175945956F, 0.0177215974F, 0.0178490504F, 0.0179769545F, - 0.0181053098F, 0.0182341160F, 0.0183633732F, 0.0184930812F, - 0.0186232399F, 0.0187538494F, 0.0188849094F, 0.0190164200F, - 0.0191483809F, 0.0192807923F, 0.0194136539F, 0.0195469656F, - 0.0196807275F, 0.0198149394F, 0.0199496012F, 0.0200847128F, - 0.0202202742F, 0.0203562853F, 0.0204927460F, 0.0206296561F, - 0.0207670157F, 0.0209048245F, 0.0210430826F, 0.0211817899F, - 0.0213209462F, 0.0214605515F, 0.0216006057F, 0.0217411086F, - 0.0218820603F, 0.0220234605F, 0.0221653093F, 0.0223076066F, - 0.0224503521F, 0.0225935459F, 0.0227371879F, 0.0228812779F, - 0.0230258160F, 0.0231708018F, 0.0233162355F, 0.0234621169F, - 0.0236084459F, 0.0237552224F, 0.0239024462F, 0.0240501175F, - 0.0241982359F, 0.0243468015F, 0.0244958141F, 0.0246452736F, - 0.0247951800F, 0.0249455331F, 0.0250963329F, 0.0252475792F, - 0.0253992720F, 0.0255514111F, 0.0257039965F, 0.0258570281F, - 0.0260105057F, 0.0261644293F, 0.0263187987F, 0.0264736139F, - 0.0266288747F, 0.0267845811F, 0.0269407330F, 0.0270973302F, - 0.0272543727F, 0.0274118604F, 0.0275697930F, 0.0277281707F, - 0.0278869932F, 0.0280462604F, 0.0282059723F, 0.0283661287F, - 0.0285267295F, 0.0286877747F, 0.0288492641F, 0.0290111976F, - 0.0291735751F, 0.0293363965F, 0.0294996617F, 0.0296633706F, - 0.0298275231F, 0.0299921190F, 0.0301571583F, 0.0303226409F, - 0.0304885667F, 0.0306549354F, 0.0308217472F, 0.0309890017F, - 0.0311566989F, 0.0313248388F, 0.0314934211F, 0.0316624459F, - 0.0318319128F, 0.0320018220F, 0.0321721732F, 0.0323429663F, - 0.0325142013F, 0.0326858779F, 0.0328579962F, 0.0330305559F, - 0.0332035570F, 0.0333769994F, 0.0335508829F, 0.0337252074F, - 0.0338999728F, 0.0340751790F, 0.0342508259F, 0.0344269134F, - 0.0346034412F, 0.0347804094F, 0.0349578178F, 0.0351356663F, - 0.0353139548F, 0.0354926831F, 0.0356718511F, 0.0358514588F, - 0.0360315059F, 0.0362119924F, 0.0363929182F, 0.0365742831F, - 0.0367560870F, 0.0369383297F, 0.0371210113F, 0.0373041315F, - 0.0374876902F, 0.0376716873F, 0.0378561226F, 0.0380409961F, - 0.0382263077F, 0.0384120571F, 0.0385982443F, 0.0387848691F, - 0.0389719315F, 0.0391594313F, 0.0393473683F, 0.0395357425F, - 0.0397245537F, 0.0399138017F, 0.0401034866F, 0.0402936080F, - 0.0404841660F, 0.0406751603F, 0.0408665909F, 0.0410584576F, - 0.0412507603F, 0.0414434988F, 0.0416366731F, 0.0418302829F, - 0.0420243282F, 0.0422188088F, 0.0424137246F, 0.0426090755F, - 0.0428048613F, 0.0430010819F, 0.0431977371F, 0.0433948269F, - 0.0435923511F, 0.0437903095F, 0.0439887020F, 0.0441875285F, - 0.0443867889F, 0.0445864830F, 0.0447866106F, 0.0449871717F, - 0.0451881661F, 0.0453895936F, 0.0455914542F, 0.0457937477F, - 0.0459964738F, 0.0461996326F, 0.0464032239F, 0.0466072475F, - 0.0468117032F, 0.0470165910F, 0.0472219107F, 0.0474276622F, - 0.0476338452F, 0.0478404597F, 0.0480475056F, 0.0482549827F, - 0.0484628907F, 0.0486712297F, 0.0488799994F, 0.0490891998F, - 0.0492988306F, 0.0495088917F, 0.0497193830F, 0.0499303043F, - 0.0501416554F, 0.0503534363F, 0.0505656468F, 0.0507782867F, - 0.0509913559F, 0.0512048542F, 0.0514187815F, 0.0516331376F, - 0.0518479225F, 0.0520631358F, 0.0522787775F, 0.0524948475F, - 0.0527113455F, 0.0529282715F, 0.0531456252F, 0.0533634066F, - 0.0535816154F, 0.0538002515F, 0.0540193148F, 0.0542388051F, - 0.0544587222F, 0.0546790660F, 0.0548998364F, 0.0551210331F, - 0.0553426561F, 0.0555647051F, 0.0557871801F, 0.0560100807F, - 0.0562334070F, 0.0564571587F, 0.0566813357F, 0.0569059378F, - 0.0571309649F, 0.0573564168F, 0.0575822933F, 0.0578085942F, - 0.0580353195F, 0.0582624689F, 0.0584900423F, 0.0587180396F, - 0.0589464605F, 0.0591753049F, 0.0594045726F, 0.0596342635F, - 0.0598643774F, 0.0600949141F, 0.0603258735F, 0.0605572555F, - 0.0607890597F, 0.0610212862F, 0.0612539346F, 0.0614870049F, - 0.0617204968F, 0.0619544103F, 0.0621887451F, 0.0624235010F, - 0.0626586780F, 0.0628942758F, 0.0631302942F, 0.0633667331F, - 0.0636035923F, 0.0638408717F, 0.0640785710F, 0.0643166901F, - 0.0645552288F, 0.0647941870F, 0.0650335645F, 0.0652733610F, - 0.0655135765F, 0.0657542108F, 0.0659952636F, 0.0662367348F, - 0.0664786242F, 0.0667209316F, 0.0669636570F, 0.0672068000F, - 0.0674503605F, 0.0676943384F, 0.0679387334F, 0.0681835454F, - 0.0684287742F, 0.0686744196F, 0.0689204814F, 0.0691669595F, - 0.0694138536F, 0.0696611637F, 0.0699088894F, 0.0701570307F, - 0.0704055873F, 0.0706545590F, 0.0709039458F, 0.0711537473F, - 0.0714039634F, 0.0716545939F, 0.0719056387F, 0.0721570975F, - 0.0724089702F, 0.0726612565F, 0.0729139563F, 0.0731670694F, - 0.0734205956F, 0.0736745347F, 0.0739288866F, 0.0741836510F, - 0.0744388277F, 0.0746944166F, 0.0749504175F, 0.0752068301F, - 0.0754636543F, 0.0757208899F, 0.0759785367F, 0.0762365946F, - 0.0764950632F, 0.0767539424F, 0.0770132320F, 0.0772729319F, - 0.0775330418F, 0.0777935616F, 0.0780544909F, 0.0783158298F, - 0.0785775778F, 0.0788397349F, 0.0791023009F, 0.0793652755F, - 0.0796286585F, 0.0798924498F, 0.0801566492F, 0.0804212564F, - 0.0806862712F, 0.0809516935F, 0.0812175231F, 0.0814837597F, - 0.0817504031F, 0.0820174532F, 0.0822849097F, 0.0825527724F, - 0.0828210412F, 0.0830897158F, 0.0833587960F, 0.0836282816F, - 0.0838981724F, 0.0841684682F, 0.0844391688F, 0.0847102740F, - 0.0849817835F, 0.0852536973F, 0.0855260150F, 0.0857987364F, - 0.0860718614F, 0.0863453897F, 0.0866193211F, 0.0868936554F, - 0.0871683924F, 0.0874435319F, 0.0877190737F, 0.0879950175F, - 0.0882713632F, 0.0885481105F, 0.0888252592F, 0.0891028091F, - 0.0893807600F, 0.0896591117F, 0.0899378639F, 0.0902170165F, - 0.0904965692F, 0.0907765218F, 0.0910568740F, 0.0913376258F, - 0.0916187767F, 0.0919003268F, 0.0921822756F, 0.0924646230F, - 0.0927473687F, 0.0930305126F, 0.0933140545F, 0.0935979940F, - 0.0938823310F, 0.0941670653F, 0.0944521966F, 0.0947377247F, - 0.0950236494F, 0.0953099704F, 0.0955966876F, 0.0958838007F, - 0.0961713094F, 0.0964592136F, 0.0967475131F, 0.0970362075F, - 0.0973252967F, 0.0976147805F, 0.0979046585F, 0.0981949307F, - 0.0984855967F, 0.0987766563F, 0.0990681093F, 0.0993599555F, - 0.0996521945F, 0.0999448263F, 0.1002378506F, 0.1005312671F, - 0.1008250755F, 0.1011192757F, 0.1014138675F, 0.1017088505F, - 0.1020042246F, 0.1022999895F, 0.1025961450F, 0.1028926909F, - 0.1031896268F, 0.1034869526F, 0.1037846680F, 0.1040827729F, - 0.1043812668F, 0.1046801497F, 0.1049794213F, 0.1052790813F, - 0.1055791294F, 0.1058795656F, 0.1061803894F, 0.1064816006F, - 0.1067831991F, 0.1070851846F, 0.1073875568F, 0.1076903155F, - 0.1079934604F, 0.1082969913F, 0.1086009079F, 0.1089052101F, - 0.1092098975F, 0.1095149699F, 0.1098204270F, 0.1101262687F, - 0.1104324946F, 0.1107391045F, 0.1110460982F, 0.1113534754F, - 0.1116612359F, 0.1119693793F, 0.1122779055F, 0.1125868142F, - 0.1128961052F, 0.1132057781F, 0.1135158328F, 0.1138262690F, - 0.1141370863F, 0.1144482847F, 0.1147598638F, 0.1150718233F, - 0.1153841631F, 0.1156968828F, 0.1160099822F, 0.1163234610F, - 0.1166373190F, 0.1169515559F, 0.1172661714F, 0.1175811654F, - 0.1178965374F, 0.1182122874F, 0.1185284149F, 0.1188449198F, - 0.1191618018F, 0.1194790606F, 0.1197966960F, 0.1201147076F, - 0.1204330953F, 0.1207518587F, 0.1210709976F, 0.1213905118F, - 0.1217104009F, 0.1220306647F, 0.1223513029F, 0.1226723153F, - 0.1229937016F, 0.1233154615F, 0.1236375948F, 0.1239601011F, - 0.1242829803F, 0.1246062319F, 0.1249298559F, 0.1252538518F, - 0.1255782195F, 0.1259029586F, 0.1262280689F, 0.1265535501F, - 0.1268794019F, 0.1272056241F, 0.1275322163F, 0.1278591784F, - 0.1281865099F, 0.1285142108F, 0.1288422805F, 0.1291707190F, - 0.1294995259F, 0.1298287009F, 0.1301582437F, 0.1304881542F, - 0.1308184319F, 0.1311490766F, 0.1314800881F, 0.1318114660F, - 0.1321432100F, 0.1324753200F, 0.1328077955F, 0.1331406364F, - 0.1334738422F, 0.1338074129F, 0.1341413479F, 0.1344756472F, - 0.1348103103F, 0.1351453370F, 0.1354807270F, 0.1358164801F, - 0.1361525959F, 0.1364890741F, 0.1368259145F, 0.1371631167F, - 0.1375006805F, 0.1378386056F, 0.1381768917F, 0.1385155384F, - 0.1388545456F, 0.1391939129F, 0.1395336400F, 0.1398737266F, - 0.1402141724F, 0.1405549772F, 0.1408961406F, 0.1412376623F, - 0.1415795421F, 0.1419217797F, 0.1422643746F, 0.1426073268F, - 0.1429506358F, 0.1432943013F, 0.1436383231F, 0.1439827008F, - 0.1443274342F, 0.1446725229F, 0.1450179667F, 0.1453637652F, - 0.1457099181F, 0.1460564252F, 0.1464032861F, 0.1467505006F, - 0.1470980682F, 0.1474459888F, 0.1477942620F, 0.1481428875F, - 0.1484918651F, 0.1488411942F, 0.1491908748F, 0.1495409065F, - 0.1498912889F, 0.1502420218F, 0.1505931048F, 0.1509445376F, - 0.1512963200F, 0.1516484516F, 0.1520009321F, 0.1523537612F, - 0.1527069385F, 0.1530604638F, 0.1534143368F, 0.1537685571F, - 0.1541231244F, 0.1544780384F, 0.1548332987F, 0.1551889052F, - 0.1555448574F, 0.1559011550F, 0.1562577978F, 0.1566147853F, - 0.1569721173F, 0.1573297935F, 0.1576878135F, 0.1580461771F, - 0.1584048838F, 0.1587639334F, 0.1591233255F, 0.1594830599F, - 0.1598431361F, 0.1602035540F, 0.1605643131F, 0.1609254131F, - 0.1612868537F, 0.1616486346F, 0.1620107555F, 0.1623732160F, - 0.1627360158F, 0.1630991545F, 0.1634626319F, 0.1638264476F, - 0.1641906013F, 0.1645550926F, 0.1649199212F, 0.1652850869F, - 0.1656505892F, 0.1660164278F, 0.1663826024F, 0.1667491127F, - 0.1671159583F, 0.1674831388F, 0.1678506541F, 0.1682185036F, - 0.1685866872F, 0.1689552044F, 0.1693240549F, 0.1696932384F, - 0.1700627545F, 0.1704326029F, 0.1708027833F, 0.1711732952F, - 0.1715441385F, 0.1719153127F, 0.1722868175F, 0.1726586526F, - 0.1730308176F, 0.1734033121F, 0.1737761359F, 0.1741492886F, - 0.1745227698F, 0.1748965792F, 0.1752707164F, 0.1756451812F, - 0.1760199731F, 0.1763950918F, 0.1767705370F, 0.1771463083F, - 0.1775224054F, 0.1778988279F, 0.1782755754F, 0.1786526477F, - 0.1790300444F, 0.1794077651F, 0.1797858094F, 0.1801641771F, - 0.1805428677F, 0.1809218810F, 0.1813012165F, 0.1816808739F, - 0.1820608528F, 0.1824411530F, 0.1828217739F, 0.1832027154F, - 0.1835839770F, 0.1839655584F, 0.1843474592F, 0.1847296790F, - 0.1851122175F, 0.1854950744F, 0.1858782492F, 0.1862617417F, - 0.1866455514F, 0.1870296780F, 0.1874141211F, 0.1877988804F, - 0.1881839555F, 0.1885693461F, 0.1889550517F, 0.1893410721F, - 0.1897274068F, 0.1901140555F, 0.1905010178F, 0.1908882933F, - 0.1912758818F, 0.1916637828F, 0.1920519959F, 0.1924405208F, - 0.1928293571F, 0.1932185044F, 0.1936079625F, 0.1939977308F, - 0.1943878091F, 0.1947781969F, 0.1951688939F, 0.1955598998F, - 0.1959512141F, 0.1963428364F, 0.1967347665F, 0.1971270038F, - 0.1975195482F, 0.1979123990F, 0.1983055561F, 0.1986990190F, - 0.1990927873F, 0.1994868607F, 0.1998812388F, 0.2002759212F, - 0.2006709075F, 0.2010661974F, 0.2014617904F, 0.2018576862F, - 0.2022538844F, 0.2026503847F, 0.2030471865F, 0.2034442897F, - 0.2038416937F, 0.2042393982F, 0.2046374028F, 0.2050357071F, - 0.2054343107F, 0.2058332133F, 0.2062324145F, 0.2066319138F, - 0.2070317110F, 0.2074318055F, 0.2078321970F, 0.2082328852F, - 0.2086338696F, 0.2090351498F, 0.2094367255F, 0.2098385962F, - 0.2102407617F, 0.2106432213F, 0.2110459749F, 0.2114490220F, - 0.2118523621F, 0.2122559950F, 0.2126599202F, 0.2130641373F, - 0.2134686459F, 0.2138734456F, 0.2142785361F, 0.2146839168F, - 0.2150895875F, 0.2154955478F, 0.2159017972F, 0.2163083353F, - 0.2167151617F, 0.2171222761F, 0.2175296780F, 0.2179373670F, - 0.2183453428F, 0.2187536049F, 0.2191621529F, 0.2195709864F, - 0.2199801051F, 0.2203895085F, 0.2207991961F, 0.2212091677F, - 0.2216194228F, 0.2220299610F, 0.2224407818F, 0.2228518850F, - 0.2232632699F, 0.2236749364F, 0.2240868839F, 0.2244991121F, - 0.2249116204F, 0.2253244086F, 0.2257374763F, 0.2261508229F, - 0.2265644481F, 0.2269783514F, 0.2273925326F, 0.2278069911F, - 0.2282217265F, 0.2286367384F, 0.2290520265F, 0.2294675902F, - 0.2298834292F, 0.2302995431F, 0.2307159314F, 0.2311325937F, - 0.2315495297F, 0.2319667388F, 0.2323842207F, 0.2328019749F, - 0.2332200011F, 0.2336382988F, 0.2340568675F, 0.2344757070F, - 0.2348948166F, 0.2353141961F, 0.2357338450F, 0.2361537629F, - 0.2365739493F, 0.2369944038F, 0.2374151261F, 0.2378361156F, - 0.2382573720F, 0.2386788948F, 0.2391006836F, 0.2395227380F, - 0.2399450575F, 0.2403676417F, 0.2407904902F, 0.2412136026F, - 0.2416369783F, 0.2420606171F, 0.2424845185F, 0.2429086820F, - 0.2433331072F, 0.2437577936F, 0.2441827409F, 0.2446079486F, - 0.2450334163F, 0.2454591435F, 0.2458851298F, 0.2463113747F, - 0.2467378779F, 0.2471646389F, 0.2475916573F, 0.2480189325F, - 0.2484464643F, 0.2488742521F, 0.2493022955F, 0.2497305940F, - 0.2501591473F, 0.2505879549F, 0.2510170163F, 0.2514463311F, - 0.2518758989F, 0.2523057193F, 0.2527357916F, 0.2531661157F, - 0.2535966909F, 0.2540275169F, 0.2544585931F, 0.2548899193F, - 0.2553214948F, 0.2557533193F, 0.2561853924F, 0.2566177135F, - 0.2570502822F, 0.2574830981F, 0.2579161608F, 0.2583494697F, - 0.2587830245F, 0.2592168246F, 0.2596508697F, 0.2600851593F, - 0.2605196929F, 0.2609544701F, 0.2613894904F, 0.2618247534F, - 0.2622602586F, 0.2626960055F, 0.2631319938F, 0.2635682230F, - 0.2640046925F, 0.2644414021F, 0.2648783511F, 0.2653155391F, - 0.2657529657F, 0.2661906305F, 0.2666285329F, 0.2670666725F, - 0.2675050489F, 0.2679436616F, 0.2683825101F, 0.2688215940F, - 0.2692609127F, 0.2697004660F, 0.2701402532F, 0.2705802739F, - 0.2710205278F, 0.2714610142F, 0.2719017327F, 0.2723426830F, - 0.2727838644F, 0.2732252766F, 0.2736669191F, 0.2741087914F, - 0.2745508930F, 0.2749932235F, 0.2754357824F, 0.2758785693F, - 0.2763215837F, 0.2767648251F, 0.2772082930F, 0.2776519870F, - 0.2780959066F, 0.2785400513F, 0.2789844207F, 0.2794290143F, - 0.2798738316F, 0.2803188722F, 0.2807641355F, 0.2812096211F, - 0.2816553286F, 0.2821012574F, 0.2825474071F, 0.2829937773F, - 0.2834403673F, 0.2838871768F, 0.2843342053F, 0.2847814523F, - 0.2852289174F, 0.2856765999F, 0.2861244996F, 0.2865726159F, - 0.2870209482F, 0.2874694962F, 0.2879182594F, 0.2883672372F, - 0.2888164293F, 0.2892658350F, 0.2897154540F, 0.2901652858F, - 0.2906153298F, 0.2910655856F, 0.2915160527F, 0.2919667306F, - 0.2924176189F, 0.2928687171F, 0.2933200246F, 0.2937715409F, - 0.2942232657F, 0.2946751984F, 0.2951273386F, 0.2955796856F, - 0.2960322391F, 0.2964849986F, 0.2969379636F, 0.2973911335F, - 0.2978445080F, 0.2982980864F, 0.2987518684F, 0.2992058534F, - 0.2996600409F, 0.3001144305F, 0.3005690217F, 0.3010238139F, - 0.3014788067F, 0.3019339995F, 0.3023893920F, 0.3028449835F, - 0.3033007736F, 0.3037567618F, 0.3042129477F, 0.3046693306F, - 0.3051259102F, 0.3055826859F, 0.3060396572F, 0.3064968236F, - 0.3069541847F, 0.3074117399F, 0.3078694887F, 0.3083274307F, - 0.3087855653F, 0.3092438920F, 0.3097024104F, 0.3101611199F, - 0.3106200200F, 0.3110791103F, 0.3115383902F, 0.3119978592F, - 0.3124575169F, 0.3129173627F, 0.3133773961F, 0.3138376166F, - 0.3142980238F, 0.3147586170F, 0.3152193959F, 0.3156803598F, - 0.3161415084F, 0.3166028410F, 0.3170643573F, 0.3175260566F, - 0.3179879384F, 0.3184500023F, 0.3189122478F, 0.3193746743F, - 0.3198372814F, 0.3203000685F, 0.3207630351F, 0.3212261807F, - 0.3216895048F, 0.3221530069F, 0.3226166865F, 0.3230805430F, - 0.3235445760F, 0.3240087849F, 0.3244731693F, 0.3249377285F, - 0.3254024622F, 0.3258673698F, 0.3263324507F, 0.3267977045F, - 0.3272631306F, 0.3277287286F, 0.3281944978F, 0.3286604379F, - 0.3291265482F, 0.3295928284F, 0.3300592777F, 0.3305258958F, - 0.3309926821F, 0.3314596361F, 0.3319267573F, 0.3323940451F, - 0.3328614990F, 0.3333291186F, 0.3337969033F, 0.3342648525F, - 0.3347329658F, 0.3352012427F, 0.3356696825F, 0.3361382849F, - 0.3366070492F, 0.3370759749F, 0.3375450616F, 0.3380143087F, - 0.3384837156F, 0.3389532819F, 0.3394230071F, 0.3398928905F, - 0.3403629317F, 0.3408331302F, 0.3413034854F, 0.3417739967F, - 0.3422446638F, 0.3427154860F, 0.3431864628F, 0.3436575938F, - 0.3441288782F, 0.3446003158F, 0.3450719058F, 0.3455436478F, - 0.3460155412F, 0.3464875856F, 0.3469597804F, 0.3474321250F, - 0.3479046189F, 0.3483772617F, 0.3488500527F, 0.3493229914F, - 0.3497960774F, 0.3502693100F, 0.3507426887F, 0.3512162131F, - 0.3516898825F, 0.3521636965F, 0.3526376545F, 0.3531117559F, - 0.3535860003F, 0.3540603870F, 0.3545349157F, 0.3550095856F, - 0.3554843964F, 0.3559593474F, 0.3564344381F, 0.3569096680F, - 0.3573850366F, 0.3578605432F, 0.3583361875F, 0.3588119687F, - 0.3592878865F, 0.3597639402F, 0.3602401293F, 0.3607164533F, - 0.3611929117F, 0.3616695038F, 0.3621462292F, 0.3626230873F, - 0.3631000776F, 0.3635771995F, 0.3640544525F, 0.3645318360F, - 0.3650093496F, 0.3654869926F, 0.3659647645F, 0.3664426648F, - 0.3669206930F, 0.3673988484F, 0.3678771306F, 0.3683555390F, - 0.3688340731F, 0.3693127322F, 0.3697915160F, 0.3702704237F, - 0.3707494549F, 0.3712286091F, 0.3717078857F, 0.3721872840F, - 0.3726668037F, 0.3731464441F, 0.3736262047F, 0.3741060850F, - 0.3745860843F, 0.3750662023F, 0.3755464382F, 0.3760267915F, - 0.3765072618F, 0.3769878484F, 0.3774685509F, 0.3779493686F, - 0.3784303010F, 0.3789113475F, 0.3793925076F, 0.3798737809F, - 0.3803551666F, 0.3808366642F, 0.3813182733F, 0.3817999932F, - 0.3822818234F, 0.3827637633F, 0.3832458124F, 0.3837279702F, - 0.3842102360F, 0.3846926093F, 0.3851750897F, 0.3856576764F, - 0.3861403690F, 0.3866231670F, 0.3871060696F, 0.3875890765F, - 0.3880721870F, 0.3885554007F, 0.3890387168F, 0.3895221349F, - 0.3900056544F, 0.3904892748F, 0.3909729955F, 0.3914568160F, - 0.3919407356F, 0.3924247539F, 0.3929088702F, 0.3933930841F, - 0.3938773949F, 0.3943618021F, 0.3948463052F, 0.3953309035F, - 0.3958155966F, 0.3963003838F, 0.3967852646F, 0.3972702385F, - 0.3977553048F, 0.3982404631F, 0.3987257127F, 0.3992110531F, - 0.3996964838F, 0.4001820041F, 0.4006676136F, 0.4011533116F, - 0.4016390976F, 0.4021249710F, 0.4026109313F, 0.4030969779F, - 0.4035831102F, 0.4040693277F, 0.4045556299F, 0.4050420160F, - 0.4055284857F, 0.4060150383F, 0.4065016732F, 0.4069883899F, - 0.4074751879F, 0.4079620665F, 0.4084490252F, 0.4089360635F, - 0.4094231807F, 0.4099103763F, 0.4103976498F, 0.4108850005F, - 0.4113724280F, 0.4118599315F, 0.4123475107F, 0.4128351648F, - 0.4133228934F, 0.4138106959F, 0.4142985716F, 0.4147865201F, - 0.4152745408F, 0.4157626330F, 0.4162507963F, 0.4167390301F, - 0.4172273337F, 0.4177157067F, 0.4182041484F, 0.4186926583F, - 0.4191812359F, 0.4196698805F, 0.4201585915F, 0.4206473685F, - 0.4211362108F, 0.4216251179F, 0.4221140892F, 0.4226031241F, - 0.4230922221F, 0.4235813826F, 0.4240706050F, 0.4245598887F, - 0.4250492332F, 0.4255386379F, 0.4260281022F, 0.4265176256F, - 0.4270072075F, 0.4274968473F, 0.4279865445F, 0.4284762984F, - 0.4289661086F, 0.4294559743F, 0.4299458951F, 0.4304358704F, - 0.4309258996F, 0.4314159822F, 0.4319061175F, 0.4323963050F, - 0.4328865441F, 0.4333768342F, 0.4338671749F, 0.4343575654F, - 0.4348480052F, 0.4353384938F, 0.4358290306F, 0.4363196149F, - 0.4368102463F, 0.4373009241F, 0.4377916478F, 0.4382824168F, - 0.4387732305F, 0.4392640884F, 0.4397549899F, 0.4402459343F, - 0.4407369212F, 0.4412279499F, 0.4417190198F, 0.4422101305F, - 0.4427012813F, 0.4431924717F, 0.4436837010F, 0.4441749686F, - 0.4446662742F, 0.4451576169F, 0.4456489963F, 0.4461404118F, - 0.4466318628F, 0.4471233487F, 0.4476148690F, 0.4481064230F, - 0.4485980103F, 0.4490896302F, 0.4495812821F, 0.4500729654F, - 0.4505646797F, 0.4510564243F, 0.4515481986F, 0.4520400021F, - 0.4525318341F, 0.4530236942F, 0.4535155816F, 0.4540074959F, - 0.4544994365F, 0.4549914028F, 0.4554833941F, 0.4559754100F, - 0.4564674499F, 0.4569595131F, 0.4574515991F, 0.4579437074F, - 0.4584358372F, 0.4589279881F, 0.4594201595F, 0.4599123508F, - 0.4604045615F, 0.4608967908F, 0.4613890383F, 0.4618813034F, - 0.4623735855F, 0.4628658841F, 0.4633581984F, 0.4638505281F, - 0.4643428724F, 0.4648352308F, 0.4653276028F, 0.4658199877F, - 0.4663123849F, 0.4668047940F, 0.4672972143F, 0.4677896451F, - 0.4682820861F, 0.4687745365F, 0.4692669958F, 0.4697594634F, - 0.4702519387F, 0.4707444211F, 0.4712369102F, 0.4717294052F, - 0.4722219056F, 0.4727144109F, 0.4732069204F, 0.4736994336F, - 0.4741919498F, 0.4746844686F, 0.4751769893F, 0.4756695113F, - 0.4761620341F, 0.4766545571F, 0.4771470797F, 0.4776396013F, - 0.4781321213F, 0.4786246392F, 0.4791171544F, 0.4796096663F, - 0.4801021744F, 0.4805946779F, 0.4810871765F, 0.4815796694F, - 0.4820721561F, 0.4825646360F, 0.4830571086F, 0.4835495732F, - 0.4840420293F, 0.4845344763F, 0.4850269136F, 0.4855193407F, - 0.4860117569F, 0.4865041617F, 0.4869965545F, 0.4874889347F, - 0.4879813018F, 0.4884736551F, 0.4889659941F, 0.4894583182F, - 0.4899506268F, 0.4904429193F, 0.4909351952F, 0.4914274538F, - 0.4919196947F, 0.4924119172F, 0.4929041207F, 0.4933963046F, - 0.4938884685F, 0.4943806116F, 0.4948727335F, 0.4953648335F, - 0.4958569110F, 0.4963489656F, 0.4968409965F, 0.4973330032F, - 0.4978249852F, 0.4983169419F, 0.4988088726F, 0.4993007768F, - 0.4997926539F, 0.5002845034F, 0.5007763247F, 0.5012681171F, - 0.5017598801F, 0.5022516132F, 0.5027433157F, 0.5032349871F, - 0.5037266268F, 0.5042182341F, 0.5047098086F, 0.5052013497F, - 0.5056928567F, 0.5061843292F, 0.5066757664F, 0.5071671679F, - 0.5076585330F, 0.5081498613F, 0.5086411520F, 0.5091324047F, - 0.5096236187F, 0.5101147934F, 0.5106059284F, 0.5110970230F, - 0.5115880766F, 0.5120790887F, 0.5125700587F, 0.5130609860F, - 0.5135518700F, 0.5140427102F, 0.5145335059F, 0.5150242566F, - 0.5155149618F, 0.5160056208F, 0.5164962331F, 0.5169867980F, - 0.5174773151F, 0.5179677837F, 0.5184582033F, 0.5189485733F, - 0.5194388931F, 0.5199291621F, 0.5204193798F, 0.5209095455F, - 0.5213996588F, 0.5218897190F, 0.5223797256F, 0.5228696779F, - 0.5233595755F, 0.5238494177F, 0.5243392039F, 0.5248289337F, - 0.5253186063F, 0.5258082213F, 0.5262977781F, 0.5267872760F, - 0.5272767146F, 0.5277660932F, 0.5282554112F, 0.5287446682F, - 0.5292338635F, 0.5297229965F, 0.5302120667F, 0.5307010736F, - 0.5311900164F, 0.5316788947F, 0.5321677079F, 0.5326564554F, - 0.5331451366F, 0.5336337511F, 0.5341222981F, 0.5346107771F, - 0.5350991876F, 0.5355875290F, 0.5360758007F, 0.5365640021F, - 0.5370521327F, 0.5375401920F, 0.5380281792F, 0.5385160939F, - 0.5390039355F, 0.5394917034F, 0.5399793971F, 0.5404670159F, - 0.5409545594F, 0.5414420269F, 0.5419294179F, 0.5424167318F, - 0.5429039680F, 0.5433911261F, 0.5438782053F, 0.5443652051F, - 0.5448521250F, 0.5453389644F, 0.5458257228F, 0.5463123995F, - 0.5467989940F, 0.5472855057F, 0.5477719341F, 0.5482582786F, - 0.5487445387F, 0.5492307137F, 0.5497168031F, 0.5502028063F, - 0.5506887228F, 0.5511745520F, 0.5516602934F, 0.5521459463F, - 0.5526315103F, 0.5531169847F, 0.5536023690F, 0.5540876626F, - 0.5545728649F, 0.5550579755F, 0.5555429937F, 0.5560279189F, - 0.5565127507F, 0.5569974884F, 0.5574821315F, 0.5579666794F, - 0.5584511316F, 0.5589354875F, 0.5594197465F, 0.5599039080F, - 0.5603879716F, 0.5608719367F, 0.5613558026F, 0.5618395689F, - 0.5623232350F, 0.5628068002F, 0.5632902642F, 0.5637736262F, - 0.5642568858F, 0.5647400423F, 0.5652230953F, 0.5657060442F, - 0.5661888883F, 0.5666716272F, 0.5671542603F, 0.5676367870F, - 0.5681192069F, 0.5686015192F, 0.5690837235F, 0.5695658192F, - 0.5700478058F, 0.5705296827F, 0.5710114494F, 0.5714931052F, - 0.5719746497F, 0.5724560822F, 0.5729374023F, 0.5734186094F, - 0.5738997029F, 0.5743806823F, 0.5748615470F, 0.5753422965F, - 0.5758229301F, 0.5763034475F, 0.5767838480F, 0.5772641310F, - 0.5777442960F, 0.5782243426F, 0.5787042700F, 0.5791840778F, - 0.5796637654F, 0.5801433322F, 0.5806227778F, 0.5811021016F, - 0.5815813029F, 0.5820603814F, 0.5825393363F, 0.5830181673F, - 0.5834968737F, 0.5839754549F, 0.5844539105F, 0.5849322399F, - 0.5854104425F, 0.5858885179F, 0.5863664653F, 0.5868442844F, - 0.5873219746F, 0.5877995353F, 0.5882769660F, 0.5887542661F, - 0.5892314351F, 0.5897084724F, 0.5901853776F, 0.5906621500F, - 0.5911387892F, 0.5916152945F, 0.5920916655F, 0.5925679016F, - 0.5930440022F, 0.5935199669F, 0.5939957950F, 0.5944714861F, - 0.5949470396F, 0.5954224550F, 0.5958977317F, 0.5963728692F, - 0.5968478669F, 0.5973227244F, 0.5977974411F, 0.5982720163F, - 0.5987464497F, 0.5992207407F, 0.5996948887F, 0.6001688932F, - 0.6006427537F, 0.6011164696F, 0.6015900405F, 0.6020634657F, - 0.6025367447F, 0.6030098770F, 0.6034828621F, 0.6039556995F, - 0.6044283885F, 0.6049009288F, 0.6053733196F, 0.6058455606F, - 0.6063176512F, 0.6067895909F, 0.6072613790F, 0.6077330152F, - 0.6082044989F, 0.6086758295F, 0.6091470065F, 0.6096180294F, - 0.6100888977F, 0.6105596108F, 0.6110301682F, 0.6115005694F, - 0.6119708139F, 0.6124409011F, 0.6129108305F, 0.6133806017F, - 0.6138502139F, 0.6143196669F, 0.6147889599F, 0.6152580926F, - 0.6157270643F, 0.6161958746F, 0.6166645230F, 0.6171330088F, - 0.6176013317F, 0.6180694910F, 0.6185374863F, 0.6190053171F, - 0.6194729827F, 0.6199404828F, 0.6204078167F, 0.6208749841F, - 0.6213419842F, 0.6218088168F, 0.6222754811F, 0.6227419768F, - 0.6232083032F, 0.6236744600F, 0.6241404465F, 0.6246062622F, - 0.6250719067F, 0.6255373795F, 0.6260026799F, 0.6264678076F, - 0.6269327619F, 0.6273975425F, 0.6278621487F, 0.6283265800F, - 0.6287908361F, 0.6292549163F, 0.6297188201F, 0.6301825471F, - 0.6306460966F, 0.6311094683F, 0.6315726617F, 0.6320356761F, - 0.6324985111F, 0.6329611662F, 0.6334236410F, 0.6338859348F, - 0.6343480472F, 0.6348099777F, 0.6352717257F, 0.6357332909F, - 0.6361946726F, 0.6366558704F, 0.6371168837F, 0.6375777122F, - 0.6380383552F, 0.6384988123F, 0.6389590830F, 0.6394191668F, - 0.6398790631F, 0.6403387716F, 0.6407982916F, 0.6412576228F, - 0.6417167645F, 0.6421757163F, 0.6426344778F, 0.6430930483F, - 0.6435514275F, 0.6440096149F, 0.6444676098F, 0.6449254119F, - 0.6453830207F, 0.6458404356F, 0.6462976562F, 0.6467546820F, - 0.6472115125F, 0.6476681472F, 0.6481245856F, 0.6485808273F, - 0.6490368717F, 0.6494927183F, 0.6499483667F, 0.6504038164F, - 0.6508590670F, 0.6513141178F, 0.6517689684F, 0.6522236185F, - 0.6526780673F, 0.6531323146F, 0.6535863598F, 0.6540402024F, - 0.6544938419F, 0.6549472779F, 0.6554005099F, 0.6558535373F, - 0.6563063598F, 0.6567589769F, 0.6572113880F, 0.6576635927F, - 0.6581155906F, 0.6585673810F, 0.6590189637F, 0.6594703380F, - 0.6599215035F, 0.6603724598F, 0.6608232064F, 0.6612737427F, - 0.6617240684F, 0.6621741829F, 0.6626240859F, 0.6630737767F, - 0.6635232550F, 0.6639725202F, 0.6644215720F, 0.6648704098F, - 0.6653190332F, 0.6657674417F, 0.6662156348F, 0.6666636121F, - 0.6671113731F, 0.6675589174F, 0.6680062445F, 0.6684533538F, - 0.6689002450F, 0.6693469177F, 0.6697933712F, 0.6702396052F, - 0.6706856193F, 0.6711314129F, 0.6715769855F, 0.6720223369F, - 0.6724674664F, 0.6729123736F, 0.6733570581F, 0.6738015194F, - 0.6742457570F, 0.6746897706F, 0.6751335596F, 0.6755771236F, - 0.6760204621F, 0.6764635747F, 0.6769064609F, 0.6773491204F, - 0.6777915525F, 0.6782337570F, 0.6786757332F, 0.6791174809F, - 0.6795589995F, 0.6800002886F, 0.6804413477F, 0.6808821765F, - 0.6813227743F, 0.6817631409F, 0.6822032758F, 0.6826431785F, - 0.6830828485F, 0.6835222855F, 0.6839614890F, 0.6844004585F, - 0.6848391936F, 0.6852776939F, 0.6857159589F, 0.6861539883F, - 0.6865917815F, 0.6870293381F, 0.6874666576F, 0.6879037398F, - 0.6883405840F, 0.6887771899F, 0.6892135571F, 0.6896496850F, - 0.6900855733F, 0.6905212216F, 0.6909566294F, 0.6913917963F, - 0.6918267218F, 0.6922614055F, 0.6926958471F, 0.6931300459F, - 0.6935640018F, 0.6939977141F, 0.6944311825F, 0.6948644066F, - 0.6952973859F, 0.6957301200F, 0.6961626085F, 0.6965948510F, - 0.6970268470F, 0.6974585961F, 0.6978900980F, 0.6983213521F, - 0.6987523580F, 0.6991831154F, 0.6996136238F, 0.7000438828F, - 0.7004738921F, 0.7009036510F, 0.7013331594F, 0.7017624166F, - 0.7021914224F, 0.7026201763F, 0.7030486779F, 0.7034769268F, - 0.7039049226F, 0.7043326648F, 0.7047601531F, 0.7051873870F, - 0.7056143662F, 0.7060410902F, 0.7064675586F, 0.7068937711F, - 0.7073197271F, 0.7077454264F, 0.7081708684F, 0.7085960529F, - 0.7090209793F, 0.7094456474F, 0.7098700566F, 0.7102942066F, - 0.7107180970F, 0.7111417274F, 0.7115650974F, 0.7119882066F, - 0.7124110545F, 0.7128336409F, 0.7132559653F, 0.7136780272F, - 0.7140998264F, 0.7145213624F, 0.7149426348F, 0.7153636433F, - 0.7157843874F, 0.7162048668F, 0.7166250810F, 0.7170450296F, - 0.7174647124F, 0.7178841289F, 0.7183032786F, 0.7187221613F, - 0.7191407765F, 0.7195591239F, 0.7199772030F, 0.7203950135F, - 0.7208125550F, 0.7212298271F, 0.7216468294F, 0.7220635616F, - 0.7224800233F, 0.7228962140F, 0.7233121335F, 0.7237277813F, - 0.7241431571F, 0.7245582604F, 0.7249730910F, 0.7253876484F, - 0.7258019322F, 0.7262159422F, 0.7266296778F, 0.7270431388F, - 0.7274563247F, 0.7278692353F, 0.7282818700F, 0.7286942287F, - 0.7291063108F, 0.7295181160F, 0.7299296440F, 0.7303408944F, - 0.7307518669F, 0.7311625609F, 0.7315729763F, 0.7319831126F, - 0.7323929695F, 0.7328025466F, 0.7332118435F, 0.7336208600F, - 0.7340295955F, 0.7344380499F, 0.7348462226F, 0.7352541134F, - 0.7356617220F, 0.7360690478F, 0.7364760907F, 0.7368828502F, - 0.7372893259F, 0.7376955176F, 0.7381014249F, 0.7385070475F, - 0.7389123849F, 0.7393174368F, 0.7397222029F, 0.7401266829F, - 0.7405308763F, 0.7409347829F, 0.7413384023F, 0.7417417341F, - 0.7421447780F, 0.7425475338F, 0.7429500009F, 0.7433521791F, - 0.7437540681F, 0.7441556674F, 0.7445569769F, 0.7449579960F, - 0.7453587245F, 0.7457591621F, 0.7461593084F, 0.7465591631F, - 0.7469587259F, 0.7473579963F, 0.7477569741F, 0.7481556590F, - 0.7485540506F, 0.7489521486F, 0.7493499526F, 0.7497474623F, - 0.7501446775F, 0.7505415977F, 0.7509382227F, 0.7513345521F, - 0.7517305856F, 0.7521263229F, 0.7525217636F, 0.7529169074F, - 0.7533117541F, 0.7537063032F, 0.7541005545F, 0.7544945076F, - 0.7548881623F, 0.7552815182F, 0.7556745749F, 0.7560673323F, - 0.7564597899F, 0.7568519474F, 0.7572438046F, 0.7576353611F, - 0.7580266166F, 0.7584175708F, 0.7588082235F, 0.7591985741F, - 0.7595886226F, 0.7599783685F, 0.7603678116F, 0.7607569515F, - 0.7611457879F, 0.7615343206F, 0.7619225493F, 0.7623104735F, - 0.7626980931F, 0.7630854078F, 0.7634724171F, 0.7638591209F, - 0.7642455188F, 0.7646316106F, 0.7650173959F, 0.7654028744F, - 0.7657880459F, 0.7661729100F, 0.7665574664F, 0.7669417150F, - 0.7673256553F, 0.7677092871F, 0.7680926100F, 0.7684756239F, - 0.7688583284F, 0.7692407232F, 0.7696228080F, 0.7700045826F, - 0.7703860467F, 0.7707671999F, 0.7711480420F, 0.7715285728F, - 0.7719087918F, 0.7722886989F, 0.7726682938F, 0.7730475762F, - 0.7734265458F, 0.7738052023F, 0.7741835454F, 0.7745615750F, - 0.7749392906F, 0.7753166921F, 0.7756937791F, 0.7760705514F, - 0.7764470087F, 0.7768231508F, 0.7771989773F, 0.7775744880F, - 0.7779496827F, 0.7783245610F, 0.7786991227F, 0.7790733676F, - 0.7794472953F, 0.7798209056F, 0.7801941982F, 0.7805671729F, - 0.7809398294F, 0.7813121675F, 0.7816841869F, 0.7820558873F, - 0.7824272684F, 0.7827983301F, 0.7831690720F, 0.7835394940F, - 0.7839095957F, 0.7842793768F, 0.7846488373F, 0.7850179767F, - 0.7853867948F, 0.7857552914F, 0.7861234663F, 0.7864913191F, - 0.7868588497F, 0.7872260578F, 0.7875929431F, 0.7879595055F, - 0.7883257445F, 0.7886916601F, 0.7890572520F, 0.7894225198F, - 0.7897874635F, 0.7901520827F, 0.7905163772F, 0.7908803468F, - 0.7912439912F, 0.7916073102F, 0.7919703035F, 0.7923329710F, - 0.7926953124F, 0.7930573274F, 0.7934190158F, 0.7937803774F, - 0.7941414120F, 0.7945021193F, 0.7948624991F, 0.7952225511F, - 0.7955822752F, 0.7959416711F, 0.7963007387F, 0.7966594775F, - 0.7970178875F, 0.7973759685F, 0.7977337201F, 0.7980911422F, - 0.7984482346F, 0.7988049970F, 0.7991614292F, 0.7995175310F, - 0.7998733022F, 0.8002287426F, 0.8005838519F, 0.8009386299F, - 0.8012930765F, 0.8016471914F, 0.8020009744F, 0.8023544253F, - 0.8027075438F, 0.8030603298F, 0.8034127831F, 0.8037649035F, - 0.8041166906F, 0.8044681445F, 0.8048192647F, 0.8051700512F, - 0.8055205038F, 0.8058706222F, 0.8062204062F, 0.8065698556F, - 0.8069189702F, 0.8072677499F, 0.8076161944F, 0.8079643036F, - 0.8083120772F, 0.8086595151F, 0.8090066170F, 0.8093533827F, - 0.8096998122F, 0.8100459051F, 0.8103916613F, 0.8107370806F, - 0.8110821628F, 0.8114269077F, 0.8117713151F, 0.8121153849F, - 0.8124591169F, 0.8128025108F, 0.8131455666F, 0.8134882839F, - 0.8138306627F, 0.8141727027F, 0.8145144038F, 0.8148557658F, - 0.8151967886F, 0.8155374718F, 0.8158778154F, 0.8162178192F, - 0.8165574830F, 0.8168968067F, 0.8172357900F, 0.8175744328F, - 0.8179127349F, 0.8182506962F, 0.8185883164F, 0.8189255955F, - 0.8192625332F, 0.8195991295F, 0.8199353840F, 0.8202712967F, - 0.8206068673F, 0.8209420958F, 0.8212769820F, 0.8216115256F, - 0.8219457266F, 0.8222795848F, 0.8226131000F, 0.8229462721F, - 0.8232791009F, 0.8236115863F, 0.8239437280F, 0.8242755260F, - 0.8246069801F, 0.8249380901F, 0.8252688559F, 0.8255992774F, - 0.8259293544F, 0.8262590867F, 0.8265884741F, 0.8269175167F, - 0.8272462141F, 0.8275745663F, 0.8279025732F, 0.8282302344F, - 0.8285575501F, 0.8288845199F, 0.8292111437F, 0.8295374215F, - 0.8298633530F, 0.8301889382F, 0.8305141768F, 0.8308390688F, - 0.8311636141F, 0.8314878124F, 0.8318116637F, 0.8321351678F, - 0.8324583246F, 0.8327811340F, 0.8331035957F, 0.8334257098F, - 0.8337474761F, 0.8340688944F, 0.8343899647F, 0.8347106867F, - 0.8350310605F, 0.8353510857F, 0.8356707624F, 0.8359900904F, - 0.8363090696F, 0.8366276999F, 0.8369459811F, 0.8372639131F, - 0.8375814958F, 0.8378987292F, 0.8382156130F, 0.8385321472F, - 0.8388483316F, 0.8391641662F, 0.8394796508F, 0.8397947853F, - 0.8401095697F, 0.8404240037F, 0.8407380873F, 0.8410518204F, - 0.8413652029F, 0.8416782347F, 0.8419909156F, 0.8423032456F, - 0.8426152245F, 0.8429268523F, 0.8432381289F, 0.8435490541F, - 0.8438596279F, 0.8441698502F, 0.8444797208F, 0.8447892396F, - 0.8450984067F, 0.8454072218F, 0.8457156849F, 0.8460237959F, - 0.8463315547F, 0.8466389612F, 0.8469460154F, 0.8472527170F, - 0.8475590661F, 0.8478650625F, 0.8481707063F, 0.8484759971F, - 0.8487809351F, 0.8490855201F, 0.8493897521F, 0.8496936308F, - 0.8499971564F, 0.8503003286F, 0.8506031474F, 0.8509056128F, - 0.8512077246F, 0.8515094828F, 0.8518108872F, 0.8521119379F, - 0.8524126348F, 0.8527129777F, 0.8530129666F, 0.8533126015F, - 0.8536118822F, 0.8539108087F, 0.8542093809F, 0.8545075988F, - 0.8548054623F, 0.8551029712F, 0.8554001257F, 0.8556969255F, - 0.8559933707F, 0.8562894611F, 0.8565851968F, 0.8568805775F, - 0.8571756034F, 0.8574702743F, 0.8577645902F, 0.8580585509F, - 0.8583521566F, 0.8586454070F, 0.8589383021F, 0.8592308420F, - 0.8595230265F, 0.8598148556F, 0.8601063292F, 0.8603974473F, - 0.8606882098F, 0.8609786167F, 0.8612686680F, 0.8615583636F, - 0.8618477034F, 0.8621366874F, 0.8624253156F, 0.8627135878F, - 0.8630015042F, 0.8632890646F, 0.8635762690F, 0.8638631173F, - 0.8641496096F, 0.8644357457F, 0.8647215257F, 0.8650069495F, - 0.8652920171F, 0.8655767283F, 0.8658610833F, 0.8661450820F, - 0.8664287243F, 0.8667120102F, 0.8669949397F, 0.8672775127F, - 0.8675597293F, 0.8678415894F, 0.8681230929F, 0.8684042398F, - 0.8686850302F, 0.8689654640F, 0.8692455412F, 0.8695252617F, - 0.8698046255F, 0.8700836327F, 0.8703622831F, 0.8706405768F, - 0.8709185138F, 0.8711960940F, 0.8714733174F, 0.8717501840F, - 0.8720266939F, 0.8723028469F, 0.8725786430F, 0.8728540824F, - 0.8731291648F, 0.8734038905F, 0.8736782592F, 0.8739522711F, - 0.8742259261F, 0.8744992242F, 0.8747721653F, 0.8750447496F, - 0.8753169770F, 0.8755888475F, 0.8758603611F, 0.8761315177F, - 0.8764023175F, 0.8766727603F, 0.8769428462F, 0.8772125752F, - 0.8774819474F, 0.8777509626F, 0.8780196209F, 0.8782879224F, - 0.8785558669F, 0.8788234546F, 0.8790906854F, 0.8793575594F, - 0.8796240765F, 0.8798902368F, 0.8801560403F, 0.8804214870F, - 0.8806865768F, 0.8809513099F, 0.8812156863F, 0.8814797059F, - 0.8817433687F, 0.8820066749F, 0.8822696243F, 0.8825322171F, - 0.8827944532F, 0.8830563327F, 0.8833178556F, 0.8835790219F, - 0.8838398316F, 0.8841002848F, 0.8843603815F, 0.8846201217F, - 0.8848795054F, 0.8851385327F, 0.8853972036F, 0.8856555182F, - 0.8859134764F, 0.8861710783F, 0.8864283239F, 0.8866852133F, - 0.8869417464F, 0.8871979234F, 0.8874537443F, 0.8877092090F, - 0.8879643177F, 0.8882190704F, 0.8884734671F, 0.8887275078F, - 0.8889811927F, 0.8892345216F, 0.8894874948F, 0.8897401122F, - 0.8899923738F, 0.8902442798F, 0.8904958301F, 0.8907470248F, - 0.8909978640F, 0.8912483477F, 0.8914984759F, 0.8917482487F, - 0.8919976662F, 0.8922467284F, 0.8924954353F, 0.8927437871F, - 0.8929917837F, 0.8932394252F, 0.8934867118F, 0.8937336433F, - 0.8939802199F, 0.8942264417F, 0.8944723087F, 0.8947178210F, - 0.8949629785F, 0.8952077815F, 0.8954522299F, 0.8956963239F, - 0.8959400634F, 0.8961834486F, 0.8964264795F, 0.8966691561F, - 0.8969114786F, 0.8971534470F, 0.8973950614F, 0.8976363219F, - 0.8978772284F, 0.8981177812F, 0.8983579802F, 0.8985978256F, - 0.8988373174F, 0.8990764556F, 0.8993152405F, 0.8995536720F, - 0.8997917502F, 0.9000294751F, 0.9002668470F, 0.9005038658F, - 0.9007405317F, 0.9009768446F, 0.9012128048F, 0.9014484123F, - 0.9016836671F, 0.9019185693F, 0.9021531191F, 0.9023873165F, - 0.9026211616F, 0.9028546546F, 0.9030877954F, 0.9033205841F, - 0.9035530210F, 0.9037851059F, 0.9040168392F, 0.9042482207F, - 0.9044792507F, 0.9047099293F, 0.9049402564F, 0.9051702323F, - 0.9053998569F, 0.9056291305F, 0.9058580531F, 0.9060866248F, - 0.9063148457F, 0.9065427159F, 0.9067702355F, 0.9069974046F, - 0.9072242233F, 0.9074506917F, 0.9076768100F, 0.9079025782F, - 0.9081279964F, 0.9083530647F, 0.9085777833F, 0.9088021523F, - 0.9090261717F, 0.9092498417F, 0.9094731623F, 0.9096961338F, - 0.9099187561F, 0.9101410295F, 0.9103629540F, 0.9105845297F, - 0.9108057568F, 0.9110266354F, 0.9112471656F, 0.9114673475F, - 0.9116871812F, 0.9119066668F, 0.9121258046F, 0.9123445945F, - 0.9125630367F, 0.9127811314F, 0.9129988786F, 0.9132162785F, - 0.9134333312F, 0.9136500368F, 0.9138663954F, 0.9140824073F, - 0.9142980724F, 0.9145133910F, 0.9147283632F, 0.9149429890F, - 0.9151572687F, 0.9153712023F, 0.9155847900F, 0.9157980319F, - 0.9160109282F, 0.9162234790F, 0.9164356844F, 0.9166475445F, - 0.9168590595F, 0.9170702296F, 0.9172810548F, 0.9174915354F, - 0.9177016714F, 0.9179114629F, 0.9181209102F, 0.9183300134F, - 0.9185387726F, 0.9187471879F, 0.9189552595F, 0.9191629876F, - 0.9193703723F, 0.9195774136F, 0.9197841119F, 0.9199904672F, - 0.9201964797F, 0.9204021495F, 0.9206074767F, 0.9208124616F, - 0.9210171043F, 0.9212214049F, 0.9214253636F, 0.9216289805F, - 0.9218322558F, 0.9220351896F, 0.9222377821F, 0.9224400335F, - 0.9226419439F, 0.9228435134F, 0.9230447423F, 0.9232456307F, - 0.9234461787F, 0.9236463865F, 0.9238462543F, 0.9240457822F, - 0.9242449704F, 0.9244438190F, 0.9246423282F, 0.9248404983F, - 0.9250383293F, 0.9252358214F, 0.9254329747F, 0.9256297896F, - 0.9258262660F, 0.9260224042F, 0.9262182044F, 0.9264136667F, - 0.9266087913F, 0.9268035783F, 0.9269980280F, 0.9271921405F, - 0.9273859160F, 0.9275793546F, 0.9277724566F, 0.9279652221F, - 0.9281576513F, 0.9283497443F, 0.9285415014F, 0.9287329227F, - 0.9289240084F, 0.9291147586F, 0.9293051737F, 0.9294952536F, - 0.9296849987F, 0.9298744091F, 0.9300634850F, 0.9302522266F, - 0.9304406340F, 0.9306287074F, 0.9308164471F, 0.9310038532F, - 0.9311909259F, 0.9313776654F, 0.9315640719F, 0.9317501455F, - 0.9319358865F, 0.9321212951F, 0.9323063713F, 0.9324911155F, - 0.9326755279F, 0.9328596085F, 0.9330433577F, 0.9332267756F, - 0.9334098623F, 0.9335926182F, 0.9337750434F, 0.9339571380F, - 0.9341389023F, 0.9343203366F, 0.9345014409F, 0.9346822155F, - 0.9348626606F, 0.9350427763F, 0.9352225630F, 0.9354020207F, - 0.9355811498F, 0.9357599503F, 0.9359384226F, 0.9361165667F, - 0.9362943830F, 0.9364718716F, 0.9366490327F, 0.9368258666F, - 0.9370023733F, 0.9371785533F, 0.9373544066F, 0.9375299335F, - 0.9377051341F, 0.9378800087F, 0.9380545576F, 0.9382287809F, - 0.9384026787F, 0.9385762515F, 0.9387494993F, 0.9389224223F, - 0.9390950209F, 0.9392672951F, 0.9394392453F, 0.9396108716F, - 0.9397821743F, 0.9399531536F, 0.9401238096F, 0.9402941427F, - 0.9404641530F, 0.9406338407F, 0.9408032061F, 0.9409722495F, - 0.9411409709F, 0.9413093707F, 0.9414774491F, 0.9416452062F, - 0.9418126424F, 0.9419797579F, 0.9421465528F, 0.9423130274F, - 0.9424791819F, 0.9426450166F, 0.9428105317F, 0.9429757274F, - 0.9431406039F, 0.9433051616F, 0.9434694005F, 0.9436333209F, - 0.9437969232F, 0.9439602074F, 0.9441231739F, 0.9442858229F, - 0.9444481545F, 0.9446101691F, 0.9447718669F, 0.9449332481F, - 0.9450943129F, 0.9452550617F, 0.9454154945F, 0.9455756118F, - 0.9457354136F, 0.9458949003F, 0.9460540721F, 0.9462129292F, - 0.9463714719F, 0.9465297003F, 0.9466876149F, 0.9468452157F, - 0.9470025031F, 0.9471594772F, 0.9473161384F, 0.9474724869F, - 0.9476285229F, 0.9477842466F, 0.9479396584F, 0.9480947585F, - 0.9482495470F, 0.9484040243F, 0.9485581906F, 0.9487120462F, - 0.9488655913F, 0.9490188262F, 0.9491717511F, 0.9493243662F, - 0.9494766718F, 0.9496286683F, 0.9497803557F, 0.9499317345F, - 0.9500828047F, 0.9502335668F, 0.9503840209F, 0.9505341673F, - 0.9506840062F, 0.9508335380F, 0.9509827629F, 0.9511316810F, - 0.9512802928F, 0.9514285984F, 0.9515765982F, 0.9517242923F, - 0.9518716810F, 0.9520187646F, 0.9521655434F, 0.9523120176F, - 0.9524581875F, 0.9526040534F, 0.9527496154F, 0.9528948739F, - 0.9530398292F, 0.9531844814F, 0.9533288310F, 0.9534728780F, - 0.9536166229F, 0.9537600659F, 0.9539032071F, 0.9540460470F, - 0.9541885858F, 0.9543308237F, 0.9544727611F, 0.9546143981F, - 0.9547557351F, 0.9548967723F, 0.9550375100F, 0.9551779485F, - 0.9553180881F, 0.9554579290F, 0.9555974714F, 0.9557367158F, - 0.9558756623F, 0.9560143112F, 0.9561526628F, 0.9562907174F, - 0.9564284752F, 0.9565659366F, 0.9567031017F, 0.9568399710F, - 0.9569765446F, 0.9571128229F, 0.9572488061F, 0.9573844944F, - 0.9575198883F, 0.9576549879F, 0.9577897936F, 0.9579243056F, - 0.9580585242F, 0.9581924497F, 0.9583260824F, 0.9584594226F, - 0.9585924705F, 0.9587252264F, 0.9588576906F, 0.9589898634F, - 0.9591217452F, 0.9592533360F, 0.9593846364F, 0.9595156465F, - 0.9596463666F, 0.9597767971F, 0.9599069382F, 0.9600367901F, - 0.9601663533F, 0.9602956279F, 0.9604246143F, 0.9605533128F, - 0.9606817236F, 0.9608098471F, 0.9609376835F, 0.9610652332F, - 0.9611924963F, 0.9613194733F, 0.9614461644F, 0.9615725699F, - 0.9616986901F, 0.9618245253F, 0.9619500757F, 0.9620753418F, - 0.9622003238F, 0.9623250219F, 0.9624494365F, 0.9625735679F, - 0.9626974163F, 0.9628209821F, 0.9629442656F, 0.9630672671F, - 0.9631899868F, 0.9633124251F, 0.9634345822F, 0.9635564585F, - 0.9636780543F, 0.9637993699F, 0.9639204056F, 0.9640411616F, - 0.9641616383F, 0.9642818359F, 0.9644017549F, 0.9645213955F, - 0.9646407579F, 0.9647598426F, 0.9648786497F, 0.9649971797F, - 0.9651154328F, 0.9652334092F, 0.9653511095F, 0.9654685337F, - 0.9655856823F, 0.9657025556F, 0.9658191538F, 0.9659354773F, - 0.9660515263F, 0.9661673013F, 0.9662828024F, 0.9663980300F, - 0.9665129845F, 0.9666276660F, 0.9667420750F, 0.9668562118F, - 0.9669700766F, 0.9670836698F, 0.9671969917F, 0.9673100425F, - 0.9674228227F, 0.9675353325F, 0.9676475722F, 0.9677595422F, - 0.9678712428F, 0.9679826742F, 0.9680938368F, 0.9682047309F, - 0.9683153569F, 0.9684257150F, 0.9685358056F, 0.9686456289F, - 0.9687551853F, 0.9688644752F, 0.9689734987F, 0.9690822564F, - 0.9691907483F, 0.9692989750F, 0.9694069367F, 0.9695146337F, - 0.9696220663F, 0.9697292349F, 0.9698361398F, 0.9699427813F, - 0.9700491597F, 0.9701552754F, 0.9702611286F, 0.9703667197F, - 0.9704720490F, 0.9705771169F, 0.9706819236F, 0.9707864695F, - 0.9708907549F, 0.9709947802F, 0.9710985456F, 0.9712020514F, - 0.9713052981F, 0.9714082859F, 0.9715110151F, 0.9716134862F, - 0.9717156993F, 0.9718176549F, 0.9719193532F, 0.9720207946F, - 0.9721219794F, 0.9722229080F, 0.9723235806F, 0.9724239976F, - 0.9725241593F, 0.9726240661F, 0.9727237183F, 0.9728231161F, - 0.9729222601F, 0.9730211503F, 0.9731197873F, 0.9732181713F, - 0.9733163027F, 0.9734141817F, 0.9735118088F, 0.9736091842F, - 0.9737063083F, 0.9738031814F, 0.9738998039F, 0.9739961760F, - 0.9740922981F, 0.9741881706F, 0.9742837938F, 0.9743791680F, - 0.9744742935F, 0.9745691707F, 0.9746637999F, 0.9747581814F, - 0.9748523157F, 0.9749462029F, 0.9750398435F, 0.9751332378F, - 0.9752263861F, 0.9753192887F, 0.9754119461F, 0.9755043585F, - 0.9755965262F, 0.9756884496F, 0.9757801291F, 0.9758715650F, - 0.9759627575F, 0.9760537071F, 0.9761444141F, 0.9762348789F, - 0.9763251016F, 0.9764150828F, 0.9765048228F, 0.9765943218F, - 0.9766835802F, 0.9767725984F, 0.9768613767F, 0.9769499154F, - 0.9770382149F, 0.9771262755F, 0.9772140976F, 0.9773016815F, - 0.9773890275F, 0.9774761360F, 0.9775630073F, 0.9776496418F, - 0.9777360398F, 0.9778222016F, 0.9779081277F, 0.9779938182F, - 0.9780792736F, 0.9781644943F, 0.9782494805F, 0.9783342326F, - 0.9784187509F, 0.9785030359F, 0.9785870877F, 0.9786709069F, - 0.9787544936F, 0.9788378484F, 0.9789209714F, 0.9790038631F, - 0.9790865238F, 0.9791689538F, 0.9792511535F, 0.9793331232F, - 0.9794148633F, 0.9794963742F, 0.9795776561F, 0.9796587094F, - 0.9797395345F, 0.9798201316F, 0.9799005013F, 0.9799806437F, - 0.9800605593F, 0.9801402483F, 0.9802197112F, 0.9802989483F, - 0.9803779600F, 0.9804567465F, 0.9805353082F, 0.9806136455F, - 0.9806917587F, 0.9807696482F, 0.9808473143F, 0.9809247574F, - 0.9810019778F, 0.9810789759F, 0.9811557519F, 0.9812323064F, - 0.9813086395F, 0.9813847517F, 0.9814606433F, 0.9815363147F, - 0.9816117662F, 0.9816869981F, 0.9817620108F, 0.9818368047F, - 0.9819113801F, 0.9819857374F, 0.9820598769F, 0.9821337989F, - 0.9822075038F, 0.9822809920F, 0.9823542638F, 0.9824273195F, - 0.9825001596F, 0.9825727843F, 0.9826451940F, 0.9827173891F, - 0.9827893700F, 0.9828611368F, 0.9829326901F, 0.9830040302F, - 0.9830751574F, 0.9831460720F, 0.9832167745F, 0.9832872652F, - 0.9833575444F, 0.9834276124F, 0.9834974697F, 0.9835671166F, - 0.9836365535F, 0.9837057806F, 0.9837747983F, 0.9838436071F, - 0.9839122072F, 0.9839805990F, 0.9840487829F, 0.9841167591F, - 0.9841845282F, 0.9842520903F, 0.9843194459F, 0.9843865953F, - 0.9844535389F, 0.9845202771F, 0.9845868101F, 0.9846531383F, - 0.9847192622F, 0.9847851820F, 0.9848508980F, 0.9849164108F, - 0.9849817205F, 0.9850468276F, 0.9851117324F, 0.9851764352F, - 0.9852409365F, 0.9853052366F, 0.9853693358F, 0.9854332344F, - 0.9854969330F, 0.9855604317F, 0.9856237309F, 0.9856868310F, - 0.9857497325F, 0.9858124355F, 0.9858749404F, 0.9859372477F, - 0.9859993577F, 0.9860612707F, 0.9861229871F, 0.9861845072F, - 0.9862458315F, 0.9863069601F, 0.9863678936F, 0.9864286322F, - 0.9864891764F, 0.9865495264F, 0.9866096826F, 0.9866696454F, - 0.9867294152F, 0.9867889922F, 0.9868483769F, 0.9869075695F, - 0.9869665706F, 0.9870253803F, 0.9870839991F, 0.9871424273F, - 0.9872006653F, 0.9872587135F, 0.9873165721F, 0.9873742415F, - 0.9874317222F, 0.9874890144F, 0.9875461185F, 0.9876030348F, - 0.9876597638F, 0.9877163057F, 0.9877726610F, 0.9878288300F, - 0.9878848130F, 0.9879406104F, 0.9879962225F, 0.9880516497F, - 0.9881068924F, 0.9881619509F, 0.9882168256F, 0.9882715168F, - 0.9883260249F, 0.9883803502F, 0.9884344931F, 0.9884884539F, - 0.9885422331F, 0.9885958309F, 0.9886492477F, 0.9887024838F, - 0.9887555397F, 0.9888084157F, 0.9888611120F, 0.9889136292F, - 0.9889659675F, 0.9890181273F, 0.9890701089F, 0.9891219128F, - 0.9891735392F, 0.9892249885F, 0.9892762610F, 0.9893273572F, - 0.9893782774F, 0.9894290219F, 0.9894795911F, 0.9895299853F, - 0.9895802049F, 0.9896302502F, 0.9896801217F, 0.9897298196F, - 0.9897793443F, 0.9898286961F, 0.9898778755F, 0.9899268828F, - 0.9899757183F, 0.9900243823F, 0.9900728753F, 0.9901211976F, - 0.9901693495F, 0.9902173314F, 0.9902651436F, 0.9903127865F, - 0.9903602605F, 0.9904075659F, 0.9904547031F, 0.9905016723F, - 0.9905484740F, 0.9905951086F, 0.9906415763F, 0.9906878775F, - 0.9907340126F, 0.9907799819F, 0.9908257858F, 0.9908714247F, - 0.9909168988F, 0.9909622086F, 0.9910073543F, 0.9910523364F, - 0.9910971552F, 0.9911418110F, 0.9911863042F, 0.9912306351F, - 0.9912748042F, 0.9913188117F, 0.9913626580F, 0.9914063435F, - 0.9914498684F, 0.9914932333F, 0.9915364383F, 0.9915794839F, - 0.9916223703F, 0.9916650981F, 0.9917076674F, 0.9917500787F, - 0.9917923323F, 0.9918344286F, 0.9918763679F, 0.9919181505F, - 0.9919597769F, 0.9920012473F, 0.9920425621F, 0.9920837217F, - 0.9921247263F, 0.9921655765F, 0.9922062724F, 0.9922468145F, - 0.9922872030F, 0.9923274385F, 0.9923675211F, 0.9924074513F, - 0.9924472294F, 0.9924868557F, 0.9925263306F, 0.9925656544F, - 0.9926048275F, 0.9926438503F, 0.9926827230F, 0.9927214461F, - 0.9927600199F, 0.9927984446F, 0.9928367208F, 0.9928748486F, - 0.9929128285F, 0.9929506608F, 0.9929883459F, 0.9930258841F, - 0.9930632757F, 0.9931005211F, 0.9931376207F, 0.9931745747F, - 0.9932113836F, 0.9932480476F, 0.9932845671F, 0.9933209425F, - 0.9933571742F, 0.9933932623F, 0.9934292074F, 0.9934650097F, - 0.9935006696F, 0.9935361874F, 0.9935715635F, 0.9936067982F, - 0.9936418919F, 0.9936768448F, 0.9937116574F, 0.9937463300F, - 0.9937808629F, 0.9938152565F, 0.9938495111F, 0.9938836271F, - 0.9939176047F, 0.9939514444F, 0.9939851465F, 0.9940187112F, - 0.9940521391F, 0.9940854303F, 0.9941185853F, 0.9941516044F, - 0.9941844879F, 0.9942172361F, 0.9942498495F, 0.9942823283F, - 0.9943146729F, 0.9943468836F, 0.9943789608F, 0.9944109047F, - 0.9944427158F, 0.9944743944F, 0.9945059408F, 0.9945373553F, - 0.9945686384F, 0.9945997902F, 0.9946308112F, 0.9946617017F, - 0.9946924621F, 0.9947230926F, 0.9947535937F, 0.9947839656F, - 0.9948142086F, 0.9948443232F, 0.9948743097F, 0.9949041683F, - 0.9949338995F, 0.9949635035F, 0.9949929807F, 0.9950223315F, - 0.9950515561F, 0.9950806549F, 0.9951096282F, 0.9951384764F, - 0.9951671998F, 0.9951957987F, 0.9952242735F, 0.9952526245F, - 0.9952808520F, 0.9953089564F, 0.9953369380F, 0.9953647971F, - 0.9953925340F, 0.9954201491F, 0.9954476428F, 0.9954750153F, - 0.9955022670F, 0.9955293981F, 0.9955564092F, 0.9955833003F, - 0.9956100720F, 0.9956367245F, 0.9956632582F, 0.9956896733F, - 0.9957159703F, 0.9957421494F, 0.9957682110F, 0.9957941553F, - 0.9958199828F, 0.9958456937F, 0.9958712884F, 0.9958967672F, - 0.9959221305F, 0.9959473784F, 0.9959725115F, 0.9959975300F, - 0.9960224342F, 0.9960472244F, 0.9960719011F, 0.9960964644F, - 0.9961209148F, 0.9961452525F, 0.9961694779F, 0.9961935913F, - 0.9962175930F, 0.9962414834F, 0.9962652627F, 0.9962889313F, - 0.9963124895F, 0.9963359377F, 0.9963592761F, 0.9963825051F, - 0.9964056250F, 0.9964286361F, 0.9964515387F, 0.9964743332F, - 0.9964970198F, 0.9965195990F, 0.9965420709F, 0.9965644360F, - 0.9965866946F, 0.9966088469F, 0.9966308932F, 0.9966528340F, - 0.9966746695F, 0.9966964001F, 0.9967180260F, 0.9967395475F, - 0.9967609651F, 0.9967822789F, 0.9968034894F, 0.9968245968F, - 0.9968456014F, 0.9968665036F, 0.9968873037F, 0.9969080019F, - 0.9969285987F, 0.9969490942F, 0.9969694889F, 0.9969897830F, - 0.9970099769F, 0.9970300708F, 0.9970500651F, 0.9970699601F, - 0.9970897561F, 0.9971094533F, 0.9971290522F, 0.9971485531F, - 0.9971679561F, 0.9971872617F, 0.9972064702F, 0.9972255818F, - 0.9972445968F, 0.9972635157F, 0.9972823386F, 0.9973010659F, - 0.9973196980F, 0.9973382350F, 0.9973566773F, 0.9973750253F, - 0.9973932791F, 0.9974114392F, 0.9974295059F, 0.9974474793F, - 0.9974653599F, 0.9974831480F, 0.9975008438F, 0.9975184476F, - 0.9975359598F, 0.9975533806F, 0.9975707104F, 0.9975879495F, - 0.9976050981F, 0.9976221566F, 0.9976391252F, 0.9976560043F, - 0.9976727941F, 0.9976894950F, 0.9977061073F, 0.9977226312F, - 0.9977390671F, 0.9977554152F, 0.9977716759F, 0.9977878495F, - 0.9978039361F, 0.9978199363F, 0.9978358501F, 0.9978516780F, - 0.9978674202F, 0.9978830771F, 0.9978986488F, 0.9979141358F, - 0.9979295383F, 0.9979448566F, 0.9979600909F, 0.9979752417F, - 0.9979903091F, 0.9980052936F, 0.9980201952F, 0.9980350145F, - 0.9980497515F, 0.9980644067F, 0.9980789804F, 0.9980934727F, - 0.9981078841F, 0.9981222147F, 0.9981364649F, 0.9981506350F, - 0.9981647253F, 0.9981787360F, 0.9981926674F, 0.9982065199F, - 0.9982202936F, 0.9982339890F, 0.9982476062F, 0.9982611456F, - 0.9982746074F, 0.9982879920F, 0.9983012996F, 0.9983145304F, - 0.9983276849F, 0.9983407632F, 0.9983537657F, 0.9983666926F, - 0.9983795442F, 0.9983923208F, 0.9984050226F, 0.9984176501F, - 0.9984302033F, 0.9984426827F, 0.9984550884F, 0.9984674208F, - 0.9984796802F, 0.9984918667F, 0.9985039808F, 0.9985160227F, - 0.9985279926F, 0.9985398909F, 0.9985517177F, 0.9985634734F, - 0.9985751583F, 0.9985867727F, 0.9985983167F, 0.9986097907F, - 0.9986211949F, 0.9986325297F, 0.9986437953F, 0.9986549919F, - 0.9986661199F, 0.9986771795F, 0.9986881710F, 0.9986990946F, - 0.9987099507F, 0.9987207394F, 0.9987314611F, 0.9987421161F, - 0.9987527045F, 0.9987632267F, 0.9987736829F, 0.9987840734F, - 0.9987943985F, 0.9988046584F, 0.9988148534F, 0.9988249838F, - 0.9988350498F, 0.9988450516F, 0.9988549897F, 0.9988648641F, - 0.9988746753F, 0.9988844233F, 0.9988941086F, 0.9989037313F, - 0.9989132918F, 0.9989227902F, 0.9989322269F, 0.9989416021F, - 0.9989509160F, 0.9989601690F, 0.9989693613F, 0.9989784931F, - 0.9989875647F, 0.9989965763F, 0.9990055283F, 0.9990144208F, - 0.9990232541F, 0.9990320286F, 0.9990407443F, 0.9990494016F, - 0.9990580008F, 0.9990665421F, 0.9990750257F, 0.9990834519F, - 0.9990918209F, 0.9991001331F, 0.9991083886F, 0.9991165877F, - 0.9991247307F, 0.9991328177F, 0.9991408491F, 0.9991488251F, - 0.9991567460F, 0.9991646119F, 0.9991724232F, 0.9991801801F, - 0.9991878828F, 0.9991955316F, 0.9992031267F, 0.9992106684F, - 0.9992181569F, 0.9992255925F, 0.9992329753F, 0.9992403057F, - 0.9992475839F, 0.9992548101F, 0.9992619846F, 0.9992691076F, - 0.9992761793F, 0.9992832001F, 0.9992901701F, 0.9992970895F, - 0.9993039587F, 0.9993107777F, 0.9993175470F, 0.9993242667F, - 0.9993309371F, 0.9993375583F, 0.9993441307F, 0.9993506545F, - 0.9993571298F, 0.9993635570F, 0.9993699362F, 0.9993762678F, - 0.9993825519F, 0.9993887887F, 0.9993949785F, 0.9994011216F, - 0.9994072181F, 0.9994132683F, 0.9994192725F, 0.9994252307F, - 0.9994311434F, 0.9994370107F, 0.9994428327F, 0.9994486099F, - 0.9994543423F, 0.9994600303F, 0.9994656739F, 0.9994712736F, - 0.9994768294F, 0.9994823417F, 0.9994878105F, 0.9994932363F, - 0.9994986191F, 0.9995039592F, 0.9995092568F, 0.9995145122F, - 0.9995197256F, 0.9995248971F, 0.9995300270F, 0.9995351156F, - 0.9995401630F, 0.9995451695F, 0.9995501352F, 0.9995550604F, - 0.9995599454F, 0.9995647903F, 0.9995695953F, 0.9995743607F, - 0.9995790866F, 0.9995837734F, 0.9995884211F, 0.9995930300F, - 0.9995976004F, 0.9996021324F, 0.9996066263F, 0.9996110822F, - 0.9996155004F, 0.9996198810F, 0.9996242244F, 0.9996285306F, - 0.9996327999F, 0.9996370326F, 0.9996412287F, 0.9996453886F, - 0.9996495125F, 0.9996536004F, 0.9996576527F, 0.9996616696F, - 0.9996656512F, 0.9996695977F, 0.9996735094F, 0.9996773865F, - 0.9996812291F, 0.9996850374F, 0.9996888118F, 0.9996925523F, - 0.9996962591F, 0.9996999325F, 0.9997035727F, 0.9997071798F, - 0.9997107541F, 0.9997142957F, 0.9997178049F, 0.9997212818F, - 0.9997247266F, 0.9997281396F, 0.9997315209F, 0.9997348708F, - 0.9997381893F, 0.9997414767F, 0.9997447333F, 0.9997479591F, - 0.9997511544F, 0.9997543194F, 0.9997574542F, 0.9997605591F, - 0.9997636342F, 0.9997666797F, 0.9997696958F, 0.9997726828F, - 0.9997756407F, 0.9997785698F, 0.9997814703F, 0.9997843423F, - 0.9997871860F, 0.9997900016F, 0.9997927894F, 0.9997955494F, - 0.9997982818F, 0.9998009869F, 0.9998036648F, 0.9998063157F, - 0.9998089398F, 0.9998115373F, 0.9998141082F, 0.9998166529F, - 0.9998191715F, 0.9998216642F, 0.9998241311F, 0.9998265724F, - 0.9998289884F, 0.9998313790F, 0.9998337447F, 0.9998360854F, - 0.9998384015F, 0.9998406930F, 0.9998429602F, 0.9998452031F, - 0.9998474221F, 0.9998496171F, 0.9998517885F, 0.9998539364F, - 0.9998560610F, 0.9998581624F, 0.9998602407F, 0.9998622962F, - 0.9998643291F, 0.9998663394F, 0.9998683274F, 0.9998702932F, - 0.9998722370F, 0.9998741589F, 0.9998760591F, 0.9998779378F, - 0.9998797952F, 0.9998816313F, 0.9998834464F, 0.9998852406F, - 0.9998870141F, 0.9998887670F, 0.9998904995F, 0.9998922117F, - 0.9998939039F, 0.9998955761F, 0.9998972285F, 0.9998988613F, - 0.9999004746F, 0.9999020686F, 0.9999036434F, 0.9999051992F, - 0.9999067362F, 0.9999082544F, 0.9999097541F, 0.9999112354F, - 0.9999126984F, 0.9999141433F, 0.9999155703F, 0.9999169794F, - 0.9999183709F, 0.9999197449F, 0.9999211014F, 0.9999224408F, - 0.9999237631F, 0.9999250684F, 0.9999263570F, 0.9999276289F, - 0.9999288843F, 0.9999301233F, 0.9999313461F, 0.9999325529F, - 0.9999337437F, 0.9999349187F, 0.9999360780F, 0.9999372218F, - 0.9999383503F, 0.9999394635F, 0.9999405616F, 0.9999416447F, - 0.9999427129F, 0.9999437665F, 0.9999448055F, 0.9999458301F, - 0.9999468404F, 0.9999478365F, 0.9999488185F, 0.9999497867F, - 0.9999507411F, 0.9999516819F, 0.9999526091F, 0.9999535230F, - 0.9999544236F, 0.9999553111F, 0.9999561856F, 0.9999570472F, - 0.9999578960F, 0.9999587323F, 0.9999595560F, 0.9999603674F, - 0.9999611666F, 0.9999619536F, 0.9999627286F, 0.9999634917F, - 0.9999642431F, 0.9999649828F, 0.9999657110F, 0.9999664278F, - 0.9999671334F, 0.9999678278F, 0.9999685111F, 0.9999691835F, - 0.9999698451F, 0.9999704960F, 0.9999711364F, 0.9999717662F, - 0.9999723858F, 0.9999729950F, 0.9999735942F, 0.9999741834F, - 0.9999747626F, 0.9999753321F, 0.9999758919F, 0.9999764421F, - 0.9999769828F, 0.9999775143F, 0.9999780364F, 0.9999785495F, - 0.9999790535F, 0.9999795485F, 0.9999800348F, 0.9999805124F, - 0.9999809813F, 0.9999814417F, 0.9999818938F, 0.9999823375F, - 0.9999827731F, 0.9999832005F, 0.9999836200F, 0.9999840316F, - 0.9999844353F, 0.9999848314F, 0.9999852199F, 0.9999856008F, - 0.9999859744F, 0.9999863407F, 0.9999866997F, 0.9999870516F, - 0.9999873965F, 0.9999877345F, 0.9999880656F, 0.9999883900F, - 0.9999887078F, 0.9999890190F, 0.9999893237F, 0.9999896220F, - 0.9999899140F, 0.9999901999F, 0.9999904796F, 0.9999907533F, - 0.9999910211F, 0.9999912830F, 0.9999915391F, 0.9999917896F, - 0.9999920345F, 0.9999922738F, 0.9999925077F, 0.9999927363F, - 0.9999929596F, 0.9999931777F, 0.9999933907F, 0.9999935987F, - 0.9999938018F, 0.9999940000F, 0.9999941934F, 0.9999943820F, - 0.9999945661F, 0.9999947456F, 0.9999949206F, 0.9999950912F, - 0.9999952575F, 0.9999954195F, 0.9999955773F, 0.9999957311F, - 0.9999958807F, 0.9999960265F, 0.9999961683F, 0.9999963063F, - 0.9999964405F, 0.9999965710F, 0.9999966979F, 0.9999968213F, - 0.9999969412F, 0.9999970576F, 0.9999971707F, 0.9999972805F, - 0.9999973871F, 0.9999974905F, 0.9999975909F, 0.9999976881F, - 0.9999977824F, 0.9999978738F, 0.9999979624F, 0.9999980481F, - 0.9999981311F, 0.9999982115F, 0.9999982892F, 0.9999983644F, - 0.9999984370F, 0.9999985072F, 0.9999985750F, 0.9999986405F, - 0.9999987037F, 0.9999987647F, 0.9999988235F, 0.9999988802F, - 0.9999989348F, 0.9999989873F, 0.9999990379F, 0.9999990866F, - 0.9999991334F, 0.9999991784F, 0.9999992217F, 0.9999992632F, - 0.9999993030F, 0.9999993411F, 0.9999993777F, 0.9999994128F, - 0.9999994463F, 0.9999994784F, 0.9999995091F, 0.9999995384F, - 0.9999995663F, 0.9999995930F, 0.9999996184F, 0.9999996426F, - 0.9999996657F, 0.9999996876F, 0.9999997084F, 0.9999997282F, - 0.9999997469F, 0.9999997647F, 0.9999997815F, 0.9999997973F, - 0.9999998123F, 0.9999998265F, 0.9999998398F, 0.9999998524F, - 0.9999998642F, 0.9999998753F, 0.9999998857F, 0.9999998954F, - 0.9999999045F, 0.9999999130F, 0.9999999209F, 0.9999999282F, - 0.9999999351F, 0.9999999414F, 0.9999999472F, 0.9999999526F, - 0.9999999576F, 0.9999999622F, 0.9999999664F, 0.9999999702F, - 0.9999999737F, 0.9999999769F, 0.9999999798F, 0.9999999824F, - 0.9999999847F, 0.9999999868F, 0.9999999887F, 0.9999999904F, - 0.9999999919F, 0.9999999932F, 0.9999999943F, 0.9999999953F, - 0.9999999961F, 0.9999999969F, 0.9999999975F, 0.9999999980F, - 0.9999999985F, 0.9999999988F, 0.9999999991F, 0.9999999993F, - 0.9999999995F, 0.9999999997F, 0.9999999998F, 0.9999999999F, - 0.9999999999F, 1.0000000000F, 1.0000000000F, 1.0000000000F, - 1.0000000000F, 1.0000000000F, 1.0000000000F, 1.0000000000F, -}; - -static float *vwin[8] = { - vwin64, - vwin128, - vwin256, - vwin512, - vwin1024, - vwin2048, - vwin4096, - vwin8192, -}; - -float *_vorbis_window_get(int n){ - return vwin[n]; -} - -void _vorbis_apply_window(float *d,int *winno,long *blocksizes, - int lW,int W,int nW){ - lW=(W?lW:0); - nW=(W?nW:0); - - { - float *windowLW=vwin[winno[lW]]; - float *windowNW=vwin[winno[nW]]; - - long n=blocksizes[W]; - long ln=blocksizes[lW]; - long rn=blocksizes[nW]; - - long leftbegin=n/4-ln/4; - long leftend=leftbegin+ln/2; - - long rightbegin=n/2+n/4-rn/4; - long rightend=rightbegin+rn/2; - - int i,p; - - for(i=0;i>16)&0x0000ffffUL) | ((x<<16)&0xffff0000UL); - x= ((x>> 8)&0x00ff00ffUL) | ((x<< 8)&0xff00ff00UL); - x= ((x>> 4)&0x0f0f0f0fUL) | ((x<< 4)&0xf0f0f0f0UL); - x= ((x>> 2)&0x33333333UL) | ((x<< 2)&0xccccccccUL); - return((x>> 1)&0x55555555UL) | ((x<< 1)&0xaaaaaaaaUL); -} - - -/* ogg_stream_state contains the current encode/decode state of a logical - Ogg bitstream **********************************************************/ - -typedef struct { - unsigned char *body_data; /* bytes from packet bodies */ - long body_storage; /* storage elements allocated */ - long body_fill; /* elements stored; fill mark */ - long body_returned; /* elements of fill returned */ - - - int *lacing_vals; /* The values that will go to the segment table */ - ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact - this way, but it is simple coupled to the - lacing fifo */ - long lacing_storage; - long lacing_fill; - long lacing_packet; - long lacing_returned; - - unsigned char header[282]; /* working space for header encode */ - int header_fill; - - int e_o_s; /* set when we have buffered the last packet in the - logical bitstream */ - int b_o_s; /* set after we've written the initial page - of a logical bitstream */ - long serialno; - long pageno; - ogg_int64_t packetno; /* sequence number for decode; the framing - knows where there's a hole in the data, - but we need coupling so that the codec - (which is in a seperate abstraction - layer) also knows about the gap */ - ogg_int64_t granulepos; - -} ogg_stream_state; - -/* ogg_packet is used to encapsulate the data and metadata belonging - to a single raw Ogg/Vorbis packet *************************************/ - -typedef struct { - unsigned char *packet; - long bytes; - long b_o_s; - long e_o_s; - - ogg_int64_t granulepos; - - ogg_int64_t packetno; /* sequence number for decode; the framing - knows where there's a hole in the data, - but we need coupling so that the codec - (which is in a seperate abstraction - layer) also knows about the gap */ -} ogg_packet; - -typedef struct { - unsigned char *data; - int storage; - int fill; - int returned; - - int unsynced; - int headerbytes; - int bodybytes; -} ogg_sync_state; - -/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ - -extern void oggpack_writeinit(oggpack_buffer *b); -extern void oggpack_writetrunc(oggpack_buffer *b,long bits); -extern void oggpack_writealign(oggpack_buffer *b); -extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits); -extern void oggpack_reset(oggpack_buffer *b); -extern void oggpack_writeclear(oggpack_buffer *b); -extern void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); -extern void oggpack_write(oggpack_buffer *b,unsigned long value,int bits); -extern long oggpack_look(oggpack_buffer *b,int bits); -extern long oggpack_look1(oggpack_buffer *b); -extern void oggpack_adv(oggpack_buffer *b,int bits); -extern void oggpack_adv1(oggpack_buffer *b); -extern long oggpack_read(oggpack_buffer *b,int bits); -extern long oggpack_read1(oggpack_buffer *b); -extern long oggpack_bytes(oggpack_buffer *b); -extern long oggpack_bits(oggpack_buffer *b); -extern unsigned char *oggpack_get_buffer(oggpack_buffer *b); - -extern void oggpackB_writeinit(oggpack_buffer *b); -extern void oggpackB_writetrunc(oggpack_buffer *b,long bits); -extern void oggpackB_writealign(oggpack_buffer *b); -extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits); -extern void oggpackB_reset(oggpack_buffer *b); -extern void oggpackB_writeclear(oggpack_buffer *b); -extern void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); -extern void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits); -extern long oggpackB_look(oggpack_buffer *b,int bits); -extern long oggpackB_look1(oggpack_buffer *b); -extern void oggpackB_adv(oggpack_buffer *b,int bits); -extern void oggpackB_adv1(oggpack_buffer *b); -extern long oggpackB_read(oggpack_buffer *b,int bits); -extern long oggpackB_read1(oggpack_buffer *b); -extern long oggpackB_bytes(oggpack_buffer *b); -extern long oggpackB_bits(oggpack_buffer *b); -extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b); - -/* Ogg BITSTREAM PRIMITIVES: encoding **************************/ - -extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); -extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); -extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); - -/* Ogg BITSTREAM PRIMITIVES: decoding **************************/ - -extern int ogg_sync_init(ogg_sync_state *oy); -extern int ogg_sync_clear(ogg_sync_state *oy); -extern int ogg_sync_reset(ogg_sync_state *oy); -extern int ogg_sync_destroy(ogg_sync_state *oy); - -extern char *ogg_sync_buffer(ogg_sync_state *oy, long size); -extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); -extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); -extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); -extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); -extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); -extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); - -/* Ogg BITSTREAM PRIMITIVES: general ***************************/ - -extern int ogg_stream_init(ogg_stream_state *os,int serialno); -extern int ogg_stream_clear(ogg_stream_state *os); -extern int ogg_stream_reset(ogg_stream_state *os); -extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); -extern int ogg_stream_destroy(ogg_stream_state *os); -extern int ogg_stream_eos(ogg_stream_state *os); - -extern void ogg_page_checksum_set(ogg_page *og); - -extern int ogg_page_version(ogg_page *og); -extern int ogg_page_continued(ogg_page *og); -extern int ogg_page_bos(ogg_page *og); -extern int ogg_page_eos(ogg_page *og); -extern ogg_int64_t ogg_page_granulepos(ogg_page *og); -extern int ogg_page_serialno(ogg_page *og); -extern long ogg_page_pageno(ogg_page *og); -extern int ogg_page_packets(ogg_page *og); - -extern void ogg_packet_clear(ogg_packet *op); - - -#ifdef __cplusplus -} -#endif - -#endif /* _OGG_H */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h deleted file mode 100755 index fa7b49f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/os_types.h +++ /dev/null @@ -1,127 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: #ifdef jail to whip a few platforms into the UNIX ideal. - last mod: $Id: os_types.h,v 1.1 2007/06/07 17:48:18 jules_rms Exp $ - - ********************************************************************/ -#ifndef _OS_TYPES_H -#define _OS_TYPES_H - -/* make it easy on the folks that want to compile the libs with a - different malloc than stdlib */ -#define _ogg_malloc malloc -#define _ogg_calloc calloc -#define _ogg_realloc realloc -#define _ogg_free free - -#if defined(_WIN32) - -# if defined(__CYGWIN__) -# include <_G_config.h> - typedef _G_int64_t ogg_int64_t; - typedef _G_int32_t ogg_int32_t; - typedef _G_uint32_t ogg_uint32_t; - typedef _G_int16_t ogg_int16_t; - typedef _G_uint16_t ogg_uint16_t; -# elif defined(__MINGW32__) - typedef short ogg_int16_t; - typedef unsigned short ogg_uint16_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long ogg_int64_t; - typedef unsigned long long ogg_uint64_t; -# elif defined(__MWERKS__) - typedef long long ogg_int64_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef short ogg_int16_t; - typedef unsigned short ogg_uint16_t; -# else - /* MSVC/Borland */ - typedef __int64 ogg_int64_t; - typedef __int32 ogg_int32_t; - typedef unsigned __int32 ogg_uint32_t; - typedef __int16 ogg_int16_t; - typedef unsigned __int16 ogg_uint16_t; -# endif - -#elif defined(__MACOS__) - -# include - typedef SInt16 ogg_int16_t; - typedef UInt16 ogg_uint16_t; - typedef SInt32 ogg_int32_t; - typedef UInt32 ogg_uint32_t; - typedef SInt64 ogg_int64_t; - -#elif defined(__MACOSX__) /* MacOS X Framework build */ - -# include - typedef int16_t ogg_int16_t; - typedef u_int16_t ogg_uint16_t; - typedef int32_t ogg_int32_t; - typedef u_int32_t ogg_uint32_t; - typedef int64_t ogg_int64_t; - -#elif defined(__BEOS__) - - /* Be */ -# include - typedef int16_t ogg_int16_t; - typedef u_int16_t ogg_uint16_t; - typedef int32_t ogg_int32_t; - typedef u_int32_t ogg_uint32_t; - typedef int64_t ogg_int64_t; - -#elif defined (__EMX__) - - /* OS/2 GCC */ - typedef short ogg_int16_t; - typedef unsigned short ogg_uint16_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long ogg_int64_t; - -#elif defined (DJGPP) - - /* DJGPP */ - typedef short ogg_int16_t; - typedef int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long ogg_int64_t; - -#elif defined(R5900) - - /* PS2 EE */ - typedef long ogg_int64_t; - typedef int ogg_int32_t; - typedef unsigned ogg_uint32_t; - typedef short ogg_int16_t; - -#elif defined(__SYMBIAN32__) - - /* Symbian GCC */ - typedef signed short ogg_int16_t; - typedef unsigned short ogg_uint16_t; - typedef signed int ogg_int32_t; - typedef unsigned int ogg_uint32_t; - typedef long long int ogg_int64_t; - -#else - -# include -# include "config_types.h" - -#endif - -#endif /* _OS_TYPES_H */ diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h deleted file mode 100755 index c7a23f9..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisenc.h +++ /dev/null @@ -1,436 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: vorbis encode-engine setup - last mod: $Id: vorbisenc.h 17021 2010-03-24 09:29:41Z xiphmont $ - - ********************************************************************/ - -/** \file - * Libvorbisenc is a convenient API for setting up an encoding - * environment using libvorbis. Libvorbisenc encapsulates the - * actions needed to set up the encoder properly. - */ - -#ifndef _OV_ENC_H_ -#define _OV_ENC_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#include "codec.h" - -/** - * This is the primary function within libvorbisenc for setting up managed - * bitrate modes. - * - * Before this function is called, the \ref vorbis_info - * struct should be initialized by using vorbis_info_init() from the libvorbis - * API. After encoding, vorbis_info_clear() should be called. - * - * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set - * constraints for the encoded file. This function uses these settings to - * select the appropriate encoding mode and set it up. - * - * \param vi Pointer to an initialized \ref vorbis_info struct. - * \param channels The number of channels to be encoded. - * \param rate The sampling rate of the source audio. - * \param max_bitrate Desired maximum bitrate (limit). -1 indicates unset. - * \param nominal_bitrate Desired average, or central, bitrate. -1 indicates unset. - * \param min_bitrate Desired minimum bitrate. -1 indicates unset. - * - * \return Zero for success, and negative values for failure. - * - * \retval 0 Success. - * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. - * \retval OV_EINVAL Invalid setup request, eg, out of range argument. - * \retval OV_EIMPL Unimplemented mode; unable to comply with bitrate request. - */ -extern int vorbis_encode_init(vorbis_info *vi, - long channels, - long rate, - - long max_bitrate, - long nominal_bitrate, - long min_bitrate); - -/** - * This function performs step-one of a three-step bitrate-managed encode - * setup. It functions similarly to the one-step setup performed by \ref - * vorbis_encode_init but allows an application to make further encode setup - * tweaks using \ref vorbis_encode_ctl before finally calling \ref - * vorbis_encode_setup_init to complete the setup process. - * - * Before this function is called, the \ref vorbis_info struct should be - * initialized by using vorbis_info_init() from the libvorbis API. After - * encoding, vorbis_info_clear() should be called. - * - * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set - * constraints for the encoded file. This function uses these settings to - * select the appropriate encoding mode and set it up. - * - * \param vi Pointer to an initialized vorbis_info struct. - * \param channels The number of channels to be encoded. - * \param rate The sampling rate of the source audio. - * \param max_bitrate Desired maximum bitrate (limit). -1 indicates unset. - * \param nominal_bitrate Desired average, or central, bitrate. -1 indicates unset. - * \param min_bitrate Desired minimum bitrate. -1 indicates unset. - * - * \return Zero for success, and negative for failure. - * - * \retval 0 Success - * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. - * \retval OV_EINVAL Invalid setup request, eg, out of range argument. - * \retval OV_EIMPL Unimplemented mode; unable to comply with bitrate request. - */ -extern int vorbis_encode_setup_managed(vorbis_info *vi, - long channels, - long rate, - - long max_bitrate, - long nominal_bitrate, - long min_bitrate); - -/** - * This function performs step-one of a three-step variable bitrate - * (quality-based) encode setup. It functions similarly to the one-step setup - * performed by \ref vorbis_encode_init_vbr() but allows an application to - * make further encode setup tweaks using \ref vorbis_encode_ctl() before - * finally calling \ref vorbis_encode_setup_init to complete the setup - * process. - * - * Before this function is called, the \ref vorbis_info struct should be - * initialized by using \ref vorbis_info_init() from the libvorbis API. After - * encoding, vorbis_info_clear() should be called. - * - * \param vi Pointer to an initialized vorbis_info struct. - * \param channels The number of channels to be encoded. - * \param rate The sampling rate of the source audio. - * \param quality Desired quality level, currently from -0.1 to 1.0 (lo to hi). - * - * \return Zero for success, and negative values for failure. - * - * \retval 0 Success - * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. - * \retval OV_EINVAL Invalid setup request, eg, out of range argument. - * \retval OV_EIMPL Unimplemented mode; unable to comply with quality level request. - */ -extern int vorbis_encode_setup_vbr(vorbis_info *vi, - long channels, - long rate, - - float quality - ); - -/** - * This is the primary function within libvorbisenc for setting up variable - * bitrate ("quality" based) modes. - * - * - * Before this function is called, the vorbis_info struct should be - * initialized by using vorbis_info_init() from the libvorbis API. After - * encoding, vorbis_info_clear() should be called. - * - * \param vi Pointer to an initialized vorbis_info struct. - * \param channels The number of channels to be encoded. - * \param rate The sampling rate of the source audio. - * \param base_quality Desired quality level, currently from -0.1 to 1.0 (lo to hi). - * - * - * \return Zero for success, or a negative number for failure. - * - * \retval 0 Success - * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. - * \retval OV_EINVAL Invalid setup request, eg, out of range argument. - * \retval OV_EIMPL Unimplemented mode; unable to comply with quality level request. - */ -extern int vorbis_encode_init_vbr(vorbis_info *vi, - long channels, - long rate, - - float base_quality - ); - -/** - * This function performs the last stage of three-step encoding setup, as - * described in the API overview under managed bitrate modes. - * - * Before this function is called, the \ref vorbis_info struct should be - * initialized by using vorbis_info_init() from the libvorbis API, one of - * \ref vorbis_encode_setup_managed() or \ref vorbis_encode_setup_vbr() called to - * initialize the high-level encoding setup, and \ref vorbis_encode_ctl() - * called if necessary to make encoding setup changes. - * vorbis_encode_setup_init() finalizes the highlevel encoding structure into - * a complete encoding setup after which the application may make no further - * setup changes. - * - * After encoding, vorbis_info_clear() should be called. - * - * \param vi Pointer to an initialized \ref vorbis_info struct. - * - * \return Zero for success, and negative values for failure. - * - * \retval 0 Success. - * \retval OV_EFAULT Internal logic fault; indicates a bug or heap/stack corruption. - * - * \retval OV_EINVAL Attempt to use vorbis_encode_setup_init() without first - * calling one of vorbis_encode_setup_managed() or vorbis_encode_setup_vbr() to - * initialize the high-level encoding setup - * - */ -extern int vorbis_encode_setup_init(vorbis_info *vi); - -/** - * This function implements a generic interface to miscellaneous encoder - * settings similar to the classic UNIX 'ioctl()' system call. Applications - * may use vorbis_encode_ctl() to query or set bitrate management or quality - * mode details by using one of several \e request arguments detailed below. - * vorbis_encode_ctl() must be called after one of - * vorbis_encode_setup_managed() or vorbis_encode_setup_vbr(). When used - * to modify settings, \ref vorbis_encode_ctl() must be called before \ref - * vorbis_encode_setup_init(). - * - * \param vi Pointer to an initialized vorbis_info struct. - * - * \param number Specifies the desired action; See \ref encctlcodes "the list - * of available requests". - * - * \param arg void * pointing to a data structure matching the request - * argument. - * - * \retval 0 Success. Any further return information (such as the result of a - * query) is placed into the storage pointed to by *arg. - * - * \retval OV_EINVAL Invalid argument, or an attempt to modify a setting after - * calling vorbis_encode_setup_init(). - * - * \retval OV_EIMPL Unimplemented or unknown request - */ -extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); - -/** - * \deprecated This is a deprecated interface. Please use vorbis_encode_ctl() - * with the \ref ovectl_ratemanage2_arg struct and \ref - * OV_ECTL_RATEMANAGE2_GET and \ref OV_ECTL_RATEMANAGE2_SET calls in new code. - * - * The \ref ovectl_ratemanage_arg structure is used with vorbis_encode_ctl() - * and the \ref OV_ECTL_RATEMANAGE_GET, \ref OV_ECTL_RATEMANAGE_SET, \ref - * OV_ECTL_RATEMANAGE_AVG, \ref OV_ECTL_RATEMANAGE_HARD calls in order to - * query and modify specifics of the encoder's bitrate management - * configuration. -*/ -struct ovectl_ratemanage_arg { - int management_active; /**< nonzero if bitrate management is active*/ -/** hard lower limit (in kilobits per second) below which the stream bitrate - will never be allowed for any given bitrate_hard_window seconds of time.*/ - long bitrate_hard_min; -/** hard upper limit (in kilobits per second) above which the stream bitrate - will never be allowed for any given bitrate_hard_window seconds of time.*/ - long bitrate_hard_max; -/** the window period (in seconds) used to regulate the hard bitrate minimum - and maximum*/ - double bitrate_hard_window; -/** soft lower limit (in kilobits per second) below which the average bitrate - tracker will start nudging the bitrate higher.*/ - long bitrate_av_lo; -/** soft upper limit (in kilobits per second) above which the average bitrate - tracker will start nudging the bitrate lower.*/ - long bitrate_av_hi; -/** the window period (in seconds) used to regulate the average bitrate - minimum and maximum.*/ - double bitrate_av_window; -/** Regulates the relative centering of the average and hard windows; in - libvorbis 1.0 and 1.0.1, the hard window regulation overlapped but - followed the average window regulation. In libvorbis 1.1 a bit-reservoir - interface replaces the old windowing interface; the older windowing - interface is simulated and this field has no effect.*/ - double bitrate_av_window_center; -}; - -/** - * \name struct ovectl_ratemanage2_arg - * - * The ovectl_ratemanage2_arg structure is used with vorbis_encode_ctl() and - * the OV_ECTL_RATEMANAGE2_GET and OV_ECTL_RATEMANAGE2_SET calls in order to - * query and modify specifics of the encoder's bitrate management - * configuration. - * -*/ -struct ovectl_ratemanage2_arg { - int management_active; /**< nonzero if bitrate management is active */ -/** Lower allowed bitrate limit in kilobits per second */ - long bitrate_limit_min_kbps; -/** Upper allowed bitrate limit in kilobits per second */ - long bitrate_limit_max_kbps; - long bitrate_limit_reservoir_bits; /**struct ovectl_ratemanage2_arg * - * - * Used to query the current encoder bitrate management setting. Also used to - * initialize fields of an ovectl_ratemanage2_arg structure for use with - * \ref OV_ECTL_RATEMANAGE2_SET. - */ -#define OV_ECTL_RATEMANAGE2_GET 0x14 - -/** - * Set the current encoder bitrate management settings. - * - * Argument: struct ovectl_ratemanage2_arg * - * - * Used to set the current encoder bitrate management settings to the values - * listed in the ovectl_ratemanage2_arg. Passing a NULL pointer will disable - * bitrate management. -*/ -#define OV_ECTL_RATEMANAGE2_SET 0x15 - -/** - * Returns the current encoder hard-lowpass setting (kHz) in the double - * pointed to by arg. - * - * Argument: double * -*/ -#define OV_ECTL_LOWPASS_GET 0x20 - -/** - * Sets the encoder hard-lowpass to the value (kHz) pointed to by arg. Valid - * lowpass settings range from 2 to 99. - * - * Argument: double * -*/ -#define OV_ECTL_LOWPASS_SET 0x21 - -/** - * Returns the current encoder impulse block setting in the double pointed - * to by arg. - * - * Argument: double * -*/ -#define OV_ECTL_IBLOCK_GET 0x30 - -/** - * Sets the impulse block bias to the the value pointed to by arg. - * - * Argument: double * - * - * Valid range is -15.0 to 0.0 [default]. A negative impulse block bias will - * direct to encoder to use more bits when incoding short blocks that contain - * strong impulses, thus improving the accuracy of impulse encoding. - */ -#define OV_ECTL_IBLOCK_SET 0x31 - -/** - * Returns the current encoder coupling setting in the int pointed - * to by arg. - * - * Argument: int * -*/ -#define OV_ECTL_COUPLING_GET 0x40 - -/** - * Enables/disables channel coupling in multichannel encoding according to arg. - * - * Argument: int * - * - * Zero disables channel coupling for multichannel inputs, nonzer enables - * channel coupling. Setting has no effect on monophonic encoding or - * multichannel counts that do not offer coupling. At present, coupling is - * available for stereo and 5.1 encoding. - */ -#define OV_ECTL_COUPLING_SET 0x41 - - /* deprecated rate management supported only for compatibility */ - -/** - * Old interface to querying bitrate management settings. - * - * Deprecated after move to bit-reservoir style management in 1.1 rendered - * this interface partially obsolete. - - * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_GET instead. - * - * Argument: struct ovectl_ratemanage_arg * - */ -#define OV_ECTL_RATEMANAGE_GET 0x10 -/** - * Old interface to modifying bitrate management settings. - * - * deprecated after move to bit-reservoir style management in 1.1 rendered - * this interface partially obsolete. - * - * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. - * - * Argument: struct ovectl_ratemanage_arg * - */ -#define OV_ECTL_RATEMANAGE_SET 0x11 -/** - * Old interface to setting average-bitrate encoding mode. - * - * Deprecated after move to bit-reservoir style management in 1.1 rendered - * this interface partially obsolete. - * - * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. - * - * Argument: struct ovectl_ratemanage_arg * - */ -#define OV_ECTL_RATEMANAGE_AVG 0x12 -/** - * Old interface to setting bounded-bitrate encoding modes. - * - * deprecated after move to bit-reservoir style management in 1.1 rendered - * this interface partially obsolete. - * - * \deprecated Please use \ref OV_ECTL_RATEMANAGE2_SET instead. - * - * Argument: struct ovectl_ratemanage_arg * - */ -#define OV_ECTL_RATEMANAGE_HARD 0x13 - -/*@}*/ - - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h b/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h deleted file mode 100755 index ee6e3f7..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/codecs/oggvorbis/vorbisfile.h +++ /dev/null @@ -1,205 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: stdio-based convenience library for opening/seeking/decoding - last mod: $Id: vorbisfile.h 17182 2010-04-29 03:48:32Z xiphmont $ - - ********************************************************************/ - -#ifndef _OV_FILE_H_ -#define _OV_FILE_H_ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -#include -#include "codec.h" - -/* The function prototypes for the callbacks are basically the same as for - * the stdio functions fread, fseek, fclose, ftell. - * The one difference is that the FILE * arguments have been replaced with - * a void * - this is to be used as a pointer to whatever internal data these - * functions might need. In the stdio case, it's just a FILE * cast to a void * - * - * If you use other functions, check the docs for these functions and return - * the right values. For seek_func(), you *MUST* return -1 if the stream is - * unseekable - */ -typedef struct { - size_t (*read_func) (void *ptr, size_t size, size_t nmemb, void *datasource); - int (*seek_func) (void *datasource, ogg_int64_t offset, int whence); - int (*close_func) (void *datasource); - long (*tell_func) (void *datasource); -} ov_callbacks; - -#ifndef OV_EXCLUDE_STATIC_CALLBACKS - -/* a few sets of convenient callbacks, especially for use under - * Windows where ov_open_callbacks() should always be used instead of - * ov_open() to avoid problems with incompatible crt.o version linking - * issues. */ - -/*static int _ov_header_fseek_wrap(FILE *f,ogg_int64_t off,int whence){ - if(f==NULL)return(-1); - -#ifdef __MINGW32__ - return fseeko64(f,off,whence); -#elif defined (_WIN32) - return _fseeki64(f,off,whence); -#else - return fseek(f,off,whence); -#endif -}*/ - -/* These structs below (OV_CALLBACKS_DEFAULT etc) are defined here as - * static data. That means that every file which includes this header - * will get its own copy of these structs whether it uses them or - * not unless it #defines OV_EXCLUDE_STATIC_CALLBACKS. - * These static symbols are essential on platforms such as Windows on - * which several different versions of stdio support may be linked to - * by different DLLs, and we need to be certain we know which one - * we're using (the same one as the main application). - */ - -/*static ov_callbacks OV_CALLBACKS_DEFAULT = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, - (int (*)(void *)) fclose, - (long (*)(void *)) ftell -}; - -static ov_callbacks OV_CALLBACKS_NOCLOSE = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) _ov_header_fseek_wrap, - (int (*)(void *)) NULL, - (long (*)(void *)) ftell -}; - -static ov_callbacks OV_CALLBACKS_STREAMONLY = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) NULL, - (int (*)(void *)) fclose, - (long (*)(void *)) NULL -}; - -static ov_callbacks OV_CALLBACKS_STREAMONLY_NOCLOSE = { - (size_t (*)(void *, size_t, size_t, void *)) fread, - (int (*)(void *, ogg_int64_t, int)) NULL, - (int (*)(void *)) NULL, - (long (*)(void *)) NULL -};*/ - -#endif - -#define NOTOPEN 0 -#define PARTOPEN 1 -#define OPENED 2 -#define STREAMSET 3 -#define INITSET 4 - -typedef struct OggVorbis_File { - void *datasource; /* Pointer to a FILE *, etc. */ - int seekable; - ogg_int64_t offset; - ogg_int64_t end; - ogg_sync_state oy; - - /* If the FILE handle isn't seekable (eg, a pipe), only the current - stream appears */ - int links; - ogg_int64_t *offsets; - ogg_int64_t *dataoffsets; - long *serialnos; - ogg_int64_t *pcmlengths; /* overloaded to maintain binary - compatibility; x2 size, stores both - beginning and end values */ - vorbis_info *vi; - vorbis_comment *vc; - - /* Decoding working state local storage */ - ogg_int64_t pcm_offset; - int ready_state; - long current_serialno; - int current_link; - - double bittrack; - double samptrack; - - ogg_stream_state os; /* take physical pages, weld into a logical - stream of packets */ - vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */ - vorbis_block vb; /* local working space for packet->PCM decode */ - - ov_callbacks callbacks; - -} OggVorbis_File; - - -extern int ov_clear(OggVorbis_File *vf); -extern int ov_fopen(const char *path,OggVorbis_File *vf); -extern int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); -extern int ov_open_callbacks(void *datasource, OggVorbis_File *vf, - const char *initial, long ibytes, ov_callbacks callbacks); - -extern int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes); -extern int ov_test_callbacks(void *datasource, OggVorbis_File *vf, - const char *initial, long ibytes, ov_callbacks callbacks); -extern int ov_test_open(OggVorbis_File *vf); - -extern long ov_bitrate(OggVorbis_File *vf,int i); -extern long ov_bitrate_instant(OggVorbis_File *vf); -extern long ov_streams(OggVorbis_File *vf); -extern long ov_seekable(OggVorbis_File *vf); -extern long ov_serialnumber(OggVorbis_File *vf,int i); - -extern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); -extern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); -extern double ov_time_total(OggVorbis_File *vf,int i); - -extern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_time_seek(OggVorbis_File *vf,double pos); -extern int ov_time_seek_page(OggVorbis_File *vf,double pos); - -extern int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos); -extern int ov_time_seek_lap(OggVorbis_File *vf,double pos); -extern int ov_time_seek_page_lap(OggVorbis_File *vf,double pos); - -extern ogg_int64_t ov_raw_tell(OggVorbis_File *vf); -extern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); -extern double ov_time_tell(OggVorbis_File *vf); - -extern vorbis_info *ov_info(OggVorbis_File *vf,int link); -extern vorbis_comment *ov_comment(OggVorbis_File *vf,int link); - -extern long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int samples, - int *bitstream); -extern long ov_read_filter(OggVorbis_File *vf,char *buffer,int length, - int bigendianp,int word,int sgned,int *bitstream, - void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param); -extern long ov_read(OggVorbis_File *vf,char *buffer,int length, - int bigendianp,int word,int sgned,int *bitstream); -extern int ov_crosslap(OggVorbis_File *vf1,OggVorbis_File *vf2); - -extern int ov_halfrate(OggVorbis_File *vf,int flag); -extern int ov_halfrate_p(OggVorbis_File *vf); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp deleted file mode 100755 index ad87176..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioFormat::AudioFormat (String name, StringArray extensions) - : formatName (name), fileExtensions (extensions) -{ -} - -AudioFormat::AudioFormat (StringRef name, StringRef extensions) - : formatName (name.text), fileExtensions (StringArray::fromTokens (extensions, false)) -{ -} - -AudioFormat::~AudioFormat() -{ -} - -bool AudioFormat::canHandleFile (const File& f) -{ - for (int i = 0; i < fileExtensions.size(); ++i) - if (f.hasFileExtension (fileExtensions[i])) - return true; - - return false; -} - -const String& AudioFormat::getFormatName() const { return formatName; } -const StringArray& AudioFormat::getFileExtensions() const { return fileExtensions; } -bool AudioFormat::isCompressed() { return false; } -StringArray AudioFormat::getQualityOptions() { return StringArray(); } - -MemoryMappedAudioFormatReader* AudioFormat::createMemoryMappedReader (const File&) -{ - return nullptr; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h deleted file mode 100755 index 196d436..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormat.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOFORMAT_H_INCLUDED -#define JUCE_AUDIOFORMAT_H_INCLUDED - - -//============================================================================== -/** - Subclasses of AudioFormat are used to read and write different audio - file formats. - - @see AudioFormatReader, AudioFormatWriter, WavAudioFormat, AiffAudioFormat -*/ -class JUCE_API AudioFormat -{ -public: - //============================================================================== - /** Destructor. */ - virtual ~AudioFormat(); - - //============================================================================== - /** Returns the name of this format. - e.g. "WAV file" or "AIFF file" - */ - const String& getFormatName() const; - - /** Returns all the file extensions that might apply to a file of this format. - - The first item will be the one that's preferred when creating a new file. - - So for a wav file this might just return ".wav"; for an AIFF file it might - return two items, ".aif" and ".aiff" - */ - const StringArray& getFileExtensions() const; - - //============================================================================== - /** Returns true if this the given file can be read by this format. - - Subclasses shouldn't do too much work here, just check the extension or - file type. The base class implementation just checks the file's extension - against one of the ones that was registered in the constructor. - */ - virtual bool canHandleFile (const File& fileToTest); - - /** Returns a set of sample rates that the format can read and write. */ - virtual Array getPossibleSampleRates() = 0; - - /** Returns a set of bit depths that the format can read and write. */ - virtual Array getPossibleBitDepths() = 0; - - /** Returns true if the format can do 2-channel audio. */ - virtual bool canDoStereo() = 0; - - /** Returns true if the format can do 1-channel audio. */ - virtual bool canDoMono() = 0; - - /** Returns true if the format uses compressed data. */ - virtual bool isCompressed(); - - /** Returns a list of different qualities that can be used when writing. - - Non-compressed formats will just return an empty array, but for something - like Ogg-Vorbis or MP3, it might return a list of bit-rates, etc. - - When calling createWriterFor(), an index from this array is passed in to - tell the format which option is required. - */ - virtual StringArray getQualityOptions(); - - //============================================================================== - /** Tries to create an object that can read from a stream containing audio - data in this format. - - The reader object that is returned can be used to read from the stream, and - should then be deleted by the caller. - - @param sourceStream the stream to read from - the AudioFormatReader object - that is returned will delete this stream when it no longer - needs it. - @param deleteStreamIfOpeningFails if no reader can be created, this determines whether this method - should delete the stream object that was passed-in. (If a valid - reader is returned, it will always be in charge of deleting the - stream, so this parameter is ignored) - @see AudioFormatReader - */ - virtual AudioFormatReader* createReaderFor (InputStream* sourceStream, - bool deleteStreamIfOpeningFails) = 0; - - /** Attempts to create a MemoryMappedAudioFormatReader, if possible for this format. - If the format does not support this, the method will return nullptr; - */ - virtual MemoryMappedAudioFormatReader* createMemoryMappedReader (const File& file); - - /** Tries to create an object that can write to a stream with this audio format. - - The writer object that is returned can be used to write to the stream, and - should then be deleted by the caller. - - If the stream can't be created for some reason (e.g. the parameters passed in - here aren't suitable), this will return 0. - - @param streamToWriteTo the stream that the data will go to - this will be - deleted by the AudioFormatWriter object when it's no longer - needed. If no AudioFormatWriter can be created by this method, - the stream will NOT be deleted, so that the caller can re-use it - to try to open a different format, etc - @param sampleRateToUse the sample rate for the file, which must be one of the ones - returned by getPossibleSampleRates() - @param numberOfChannels the number of channels - this must be either 1 or 2, and - the choice will depend on the results of canDoMono() and - canDoStereo() - @param bitsPerSample the bits per sample to use - this must be one of the values - returned by getPossibleBitDepths() - @param metadataValues a set of metadata values that the writer should try to write - to the stream. Exactly what these are depends on the format, - and the subclass doesn't actually have to do anything with - them if it doesn't want to. Have a look at the specific format - implementation classes to see possible values that can be - used - @param qualityOptionIndex the index of one of compression qualities returned by the - getQualityOptions() method. If there aren't any quality options - for this format, just pass 0 in this parameter, as it'll be - ignored - @see AudioFormatWriter - */ - virtual AudioFormatWriter* createWriterFor (OutputStream* streamToWriteTo, - double sampleRateToUse, - unsigned int numberOfChannels, - int bitsPerSample, - const StringPairArray& metadataValues, - int qualityOptionIndex) = 0; - -protected: - /** Creates an AudioFormat object. - - @param formatName this sets the value that will be returned by getFormatName() - @param fileExtensions an array of file extensions - these will be returned by getFileExtensions() - */ - AudioFormat (String formatName, StringArray fileExtensions); - - /** Creates an AudioFormat object. - - @param formatName this sets the value that will be returned by getFormatName() - @param fileExtensions a whitespace-separated list of file extensions - these will - be returned by getFileExtensions() - */ - AudioFormat (StringRef formatName, StringRef fileExtensions); - -private: - //============================================================================== - String formatName; - StringArray fileExtensions; -}; - - -#endif // JUCE_AUDIOFORMAT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp deleted file mode 100755 index f0196c8..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.cpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioFormatManager::AudioFormatManager() : defaultFormatIndex (0) {} -AudioFormatManager::~AudioFormatManager() {} - -//============================================================================== -void AudioFormatManager::registerFormat (AudioFormat* newFormat, const bool makeThisTheDefaultFormat) -{ - jassert (newFormat != nullptr); - - if (newFormat != nullptr) - { - #if JUCE_DEBUG - for (int i = getNumKnownFormats(); --i >= 0;) - { - if (getKnownFormat (i)->getFormatName() == newFormat->getFormatName()) - { - jassertfalse; // trying to add the same format twice! - } - } - #endif - - if (makeThisTheDefaultFormat) - defaultFormatIndex = getNumKnownFormats(); - - knownFormats.add (newFormat); - } -} - -void AudioFormatManager::registerBasicFormats() -{ - registerFormat (new WavAudioFormat(), true); - registerFormat (new AiffAudioFormat(), false); - - #if JUCE_USE_FLAC - registerFormat (new FlacAudioFormat(), false); - #endif - - #if JUCE_USE_OGGVORBIS - registerFormat (new OggVorbisAudioFormat(), false); - #endif - - #if JUCE_MAC || JUCE_IOS - registerFormat (new CoreAudioFormat(), false); - #endif - - #if JUCE_USE_MP3AUDIOFORMAT - registerFormat (new MP3AudioFormat(), false); - #endif - - #if JUCE_USE_WINDOWS_MEDIA_FORMAT - registerFormat (new WindowsMediaAudioFormat(), false); - #endif -} - -void AudioFormatManager::clearFormats() -{ - knownFormats.clear(); - defaultFormatIndex = 0; -} - -int AudioFormatManager::getNumKnownFormats() const -{ - return knownFormats.size(); -} - -AudioFormat* AudioFormatManager::getKnownFormat (const int index) const -{ - return knownFormats [index]; -} - -AudioFormat* AudioFormatManager::getDefaultFormat() const -{ - return getKnownFormat (defaultFormatIndex); -} - -AudioFormat* AudioFormatManager::findFormatForFileExtension (const String& fileExtension) const -{ - if (! fileExtension.startsWithChar ('.')) - return findFormatForFileExtension ("." + fileExtension); - - for (int i = 0; i < getNumKnownFormats(); ++i) - if (getKnownFormat(i)->getFileExtensions().contains (fileExtension, true)) - return getKnownFormat(i); - - return nullptr; -} - -String AudioFormatManager::getWildcardForAllFormats() const -{ - StringArray extensions; - - for (int i = 0; i < getNumKnownFormats(); ++i) - extensions.addArray (getKnownFormat(i)->getFileExtensions()); - - extensions.trim(); - extensions.removeEmptyStrings(); - - for (int i = 0; i < extensions.size(); ++i) - extensions.set (i, (extensions[i].startsWithChar ('.') ? "*" : "*.") + extensions[i]); - - extensions.removeDuplicates (true); - return extensions.joinIntoString (";"); -} - -//============================================================================== -AudioFormatReader* AudioFormatManager::createReaderFor (const File& file) -{ - // you need to actually register some formats before the manager can - // use them to open a file! - jassert (getNumKnownFormats() > 0); - - for (int i = 0; i < getNumKnownFormats(); ++i) - { - AudioFormat* const af = getKnownFormat(i); - - if (af->canHandleFile (file)) - if (InputStream* const in = file.createInputStream()) - if (AudioFormatReader* const r = af->createReaderFor (in, true)) - return r; - } - - return nullptr; -} - -AudioFormatReader* AudioFormatManager::createReaderFor (InputStream* audioFileStream) -{ - // you need to actually register some formats before the manager can - // use them to open a file! - jassert (getNumKnownFormats() > 0); - - ScopedPointer in (audioFileStream); - - if (in != nullptr) - { - const int64 originalStreamPos = in->getPosition(); - - for (int i = 0; i < getNumKnownFormats(); ++i) - { - if (AudioFormatReader* const r = getKnownFormat(i)->createReaderFor (in, false)) - { - in.release(); - return r; - } - - in->setPosition (originalStreamPos); - - // the stream that is passed-in must be capable of being repositioned so - // that all the formats can have a go at opening it. - jassert (in->getPosition() == originalStreamPos); - } - } - - return nullptr; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h deleted file mode 100755 index f560347..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatManager.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOFORMATMANAGER_H_INCLUDED -#define JUCE_AUDIOFORMATMANAGER_H_INCLUDED - - -//============================================================================== -/** - A class for keeping a list of available audio formats, and for deciding which - one to use to open a given file. - - After creating an AudioFormatManager object, you should call registerFormat() - or registerBasicFormats() to give it a list of format types that it can use. - - @see AudioFormat -*/ -class JUCE_API AudioFormatManager -{ -public: - //============================================================================== - /** Creates an empty format manager. - - Before it'll be any use, you'll need to call registerFormat() with all the - formats you want it to be able to recognise. - */ - AudioFormatManager(); - - /** Destructor. */ - ~AudioFormatManager(); - - //============================================================================== - /** Adds a format to the manager's list of available file types. - - The object passed-in will be deleted by this object, so don't keep a pointer - to it! - - If makeThisTheDefaultFormat is true, then the getDefaultFormat() method will - return this one when called. - */ - void registerFormat (AudioFormat* newFormat, - bool makeThisTheDefaultFormat); - - /** Handy method to make it easy to register the formats that come with Juce. - - Currently, this will add WAV and AIFF to the list. - */ - void registerBasicFormats(); - - /** Clears the list of known formats. */ - void clearFormats(); - - /** Returns the number of currently registered file formats. */ - int getNumKnownFormats() const; - - /** Returns one of the registered file formats. */ - AudioFormat* getKnownFormat (int index) const; - - /** Iterator access to the list of known formats. */ - AudioFormat** begin() const noexcept { return knownFormats.begin(); } - - /** Iterator access to the list of known formats. */ - AudioFormat** end() const noexcept { return knownFormats.end(); } - - /** Looks for which of the known formats is listed as being for a given file - extension. - - The extension may have a dot before it, so e.g. ".wav" or "wav" are both ok. - */ - AudioFormat* findFormatForFileExtension (const String& fileExtension) const; - - /** Returns the format which has been set as the default one. - - You can set a format as being the default when it is registered. It's useful - when you want to write to a file, because the best format may change between - platforms, e.g. AIFF is preferred on the Mac, WAV on Windows. - - If none has been set as the default, this method will just return the first - one in the list. - */ - AudioFormat* getDefaultFormat() const; - - /** Returns a set of wildcards for file-matching that contains the extensions for - all known formats. - - E.g. if might return "*.wav;*.aiff" if it just knows about wavs and aiffs. - */ - String getWildcardForAllFormats() const; - - //============================================================================== - /** Searches through the known formats to try to create a suitable reader for - this file. - - If none of the registered formats can open the file, it'll return 0. If it - returns a reader, it's the caller's responsibility to delete the reader. - */ - AudioFormatReader* createReaderFor (const File& audioFile); - - /** Searches through the known formats to try to create a suitable reader for - this stream. - - The stream object that is passed-in will be deleted by this method or by the - reader that is returned, so the caller should not keep any references to it. - - The stream that is passed-in must be capable of being repositioned so - that all the formats can have a go at opening it. - - If none of the registered formats can open the stream, it'll return 0. If it - returns a reader, it's the caller's responsibility to delete the reader. - */ - AudioFormatReader* createReaderFor (InputStream* audioFileStream); - -private: - //============================================================================== - OwnedArray knownFormats; - int defaultFormatIndex; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioFormatManager) -}; - - -#endif // JUCE_AUDIOFORMATMANAGER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp deleted file mode 100755 index b265b09..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.cpp +++ /dev/null @@ -1,414 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioFormatReader::AudioFormatReader (InputStream* const in, const String& name) - : sampleRate (0), - bitsPerSample (0), - lengthInSamples (0), - numChannels (0), - usesFloatingPointData (false), - input (in), - formatName (name) -{ -} - -AudioFormatReader::~AudioFormatReader() -{ - delete input; -} - -bool AudioFormatReader::read (int* const* destSamples, - int numDestChannels, - int64 startSampleInSource, - int numSamplesToRead, - const bool fillLeftoverChannelsWithCopies) -{ - jassert (numDestChannels > 0); // you have to actually give this some channels to work with! - - const size_t originalNumSamplesToRead = (size_t) numSamplesToRead; - int startOffsetInDestBuffer = 0; - - if (startSampleInSource < 0) - { - const int silence = (int) jmin (-startSampleInSource, (int64) numSamplesToRead); - - for (int i = numDestChannels; --i >= 0;) - if (destSamples[i] != nullptr) - zeromem (destSamples[i], sizeof (int) * (size_t) silence); - - startOffsetInDestBuffer += silence; - numSamplesToRead -= silence; - startSampleInSource = 0; - } - - if (numSamplesToRead <= 0) - return true; - - if (! readSamples (const_cast (destSamples), - jmin ((int) numChannels, numDestChannels), startOffsetInDestBuffer, - startSampleInSource, numSamplesToRead)) - return false; - - if (numDestChannels > (int) numChannels) - { - if (fillLeftoverChannelsWithCopies) - { - int* lastFullChannel = destSamples[0]; - - for (int i = (int) numChannels; --i > 0;) - { - if (destSamples[i] != nullptr) - { - lastFullChannel = destSamples[i]; - break; - } - } - - if (lastFullChannel != nullptr) - for (int i = (int) numChannels; i < numDestChannels; ++i) - if (destSamples[i] != nullptr) - memcpy (destSamples[i], lastFullChannel, sizeof (int) * originalNumSamplesToRead); - } - else - { - for (int i = (int) numChannels; i < numDestChannels; ++i) - if (destSamples[i] != nullptr) - zeromem (destSamples[i], sizeof (int) * originalNumSamplesToRead); - } - } - - return true; -} - -static void readChannels (AudioFormatReader& reader, - int** const chans, AudioSampleBuffer* const buffer, - const int startSample, const int numSamples, - const int64 readerStartSample, const int numTargetChannels) -{ - for (int j = 0; j < numTargetChannels; ++j) - chans[j] = reinterpret_cast (buffer->getWritePointer (j, startSample)); - - chans[numTargetChannels] = nullptr; - reader.read (chans, numTargetChannels, readerStartSample, numSamples, true); -} - -void AudioFormatReader::read (AudioSampleBuffer* buffer, - int startSample, - int numSamples, - int64 readerStartSample, - bool useReaderLeftChan, - bool useReaderRightChan) -{ - jassert (buffer != nullptr); - jassert (startSample >= 0 && startSample + numSamples <= buffer->getNumSamples()); - - if (numSamples > 0) - { - const int numTargetChannels = buffer->getNumChannels(); - - if (numTargetChannels <= 2) - { - int* const dest0 = reinterpret_cast (buffer->getWritePointer (0, startSample)); - int* const dest1 = reinterpret_cast (numTargetChannels > 1 ? buffer->getWritePointer (1, startSample) : nullptr); - int* chans[3]; - - if (useReaderLeftChan == useReaderRightChan) - { - chans[0] = dest0; - chans[1] = numChannels > 1 ? dest1 : nullptr; - } - else if (useReaderLeftChan || (numChannels == 1)) - { - chans[0] = dest0; - chans[1] = nullptr; - } - else if (useReaderRightChan) - { - chans[0] = nullptr; - chans[1] = dest0; - } - - chans[2] = nullptr; - read (chans, 2, readerStartSample, numSamples, true); - - // if the target's stereo and the source is mono, dupe the first channel.. - if (numTargetChannels > 1 && (chans[0] == nullptr || chans[1] == nullptr)) - memcpy (dest1, dest0, sizeof (float) * (size_t) numSamples); - } - else if (numTargetChannels <= 64) - { - int* chans[65]; - readChannels (*this, chans, buffer, startSample, numSamples, readerStartSample, numTargetChannels); - } - else - { - HeapBlock chans ((size_t) numTargetChannels); - readChannels (*this, chans, buffer, startSample, numSamples, readerStartSample, numTargetChannels); - } - - if (! usesFloatingPointData) - for (int j = 0; j < numTargetChannels; ++j) - if (float* const d = buffer->getWritePointer (j, startSample)) - FloatVectorOperations::convertFixedToFloat (d, reinterpret_cast (d), 1.0f / 0x7fffffff, numSamples); - } -} - -void AudioFormatReader::readMaxLevels (int64 startSampleInFile, int64 numSamples, - Range* const results, const int channelsToRead) -{ - jassert (channelsToRead > 0 && channelsToRead <= (int) numChannels); - - if (numSamples <= 0) - { - for (int i = 0; i < channelsToRead; ++i) - results[i] = Range(); - - return; - } - - const int bufferSize = (int) jmin (numSamples, (int64) 4096); - AudioSampleBuffer tempSampleBuffer ((int) channelsToRead, bufferSize); - - float* const* const floatBuffer = tempSampleBuffer.getArrayOfWritePointers(); - int* const* intBuffer = reinterpret_cast (floatBuffer); - bool isFirstBlock = true; - - while (numSamples > 0) - { - const int numToDo = (int) jmin (numSamples, (int64) bufferSize); - if (! read (intBuffer, channelsToRead, startSampleInFile, numToDo, false)) - break; - - for (int i = 0; i < channelsToRead; ++i) - { - Range r; - - if (usesFloatingPointData) - { - r = FloatVectorOperations::findMinAndMax (floatBuffer[i], numToDo); - } - else - { - Range intRange (Range::findMinAndMax (intBuffer[i], numToDo)); - - r = Range (intRange.getStart() / (float) std::numeric_limits::max(), - intRange.getEnd() / (float) std::numeric_limits::max()); - } - - results[i] = isFirstBlock ? r : results[i].getUnionWith (r); - } - - isFirstBlock = false; - numSamples -= numToDo; - startSampleInFile += numToDo; - } -} - -void AudioFormatReader::readMaxLevels (int64 startSampleInFile, int64 numSamples, - float& lowestLeft, float& highestLeft, - float& lowestRight, float& highestRight) -{ - Range levels[2]; - - if (numChannels < 2) - { - readMaxLevels (startSampleInFile, numSamples, levels, (int) numChannels); - levels[1] = levels[0]; - } - else - { - readMaxLevels (startSampleInFile, numSamples, levels, 2); - } - - lowestLeft = levels[0].getStart(); - highestLeft = levels[0].getEnd(); - lowestRight = levels[1].getStart(); - highestRight = levels[1].getEnd(); -} - -int64 AudioFormatReader::searchForLevel (int64 startSample, - int64 numSamplesToSearch, - const double magnitudeRangeMinimum, - const double magnitudeRangeMaximum, - const int minimumConsecutiveSamples) -{ - if (numSamplesToSearch == 0) - return -1; - - const int bufferSize = 4096; - HeapBlock tempSpace (bufferSize * 2 + 64); - - int* tempBuffer[3]; - tempBuffer[0] = tempSpace.getData(); - tempBuffer[1] = tempSpace.getData() + bufferSize; - tempBuffer[2] = 0; - - int consecutive = 0; - int64 firstMatchPos = -1; - - jassert (magnitudeRangeMaximum > magnitudeRangeMinimum); - - const double doubleMin = jlimit (0.0, (double) std::numeric_limits::max(), magnitudeRangeMinimum * std::numeric_limits::max()); - const double doubleMax = jlimit (doubleMin, (double) std::numeric_limits::max(), magnitudeRangeMaximum * std::numeric_limits::max()); - const int intMagnitudeRangeMinimum = roundToInt (doubleMin); - const int intMagnitudeRangeMaximum = roundToInt (doubleMax); - - while (numSamplesToSearch != 0) - { - const int numThisTime = (int) jmin (abs64 (numSamplesToSearch), (int64) bufferSize); - int64 bufferStart = startSample; - - if (numSamplesToSearch < 0) - bufferStart -= numThisTime; - - if (bufferStart >= (int) lengthInSamples) - break; - - read (tempBuffer, 2, bufferStart, numThisTime, false); - - int num = numThisTime; - while (--num >= 0) - { - if (numSamplesToSearch < 0) - --startSample; - - bool matches = false; - const int index = (int) (startSample - bufferStart); - - if (usesFloatingPointData) - { - const float sample1 = std::abs (((float*) tempBuffer[0]) [index]); - - if (sample1 >= magnitudeRangeMinimum - && sample1 <= magnitudeRangeMaximum) - { - matches = true; - } - else if (numChannels > 1) - { - const float sample2 = std::abs (((float*) tempBuffer[1]) [index]); - - matches = (sample2 >= magnitudeRangeMinimum - && sample2 <= magnitudeRangeMaximum); - } - } - else - { - const int sample1 = abs (tempBuffer[0] [index]); - - if (sample1 >= intMagnitudeRangeMinimum - && sample1 <= intMagnitudeRangeMaximum) - { - matches = true; - } - else if (numChannels > 1) - { - const int sample2 = abs (tempBuffer[1][index]); - - matches = (sample2 >= intMagnitudeRangeMinimum - && sample2 <= intMagnitudeRangeMaximum); - } - } - - if (matches) - { - if (firstMatchPos < 0) - firstMatchPos = startSample; - - if (++consecutive >= minimumConsecutiveSamples) - { - if (firstMatchPos < 0 || firstMatchPos >= lengthInSamples) - return -1; - - return firstMatchPos; - } - } - else - { - consecutive = 0; - firstMatchPos = -1; - } - - if (numSamplesToSearch > 0) - ++startSample; - } - - if (numSamplesToSearch > 0) - numSamplesToSearch -= numThisTime; - else - numSamplesToSearch += numThisTime; - } - - return -1; -} - -//============================================================================== -MemoryMappedAudioFormatReader::MemoryMappedAudioFormatReader (const File& f, const AudioFormatReader& reader, - int64 start, int64 length, int frameSize) - : AudioFormatReader (nullptr, reader.getFormatName()), file (f), - dataChunkStart (start), dataLength (length), bytesPerFrame (frameSize) -{ - sampleRate = reader.sampleRate; - bitsPerSample = reader.bitsPerSample; - lengthInSamples = reader.lengthInSamples; - numChannels = reader.numChannels; - metadataValues = reader.metadataValues; - usesFloatingPointData = reader.usesFloatingPointData; -} - -bool MemoryMappedAudioFormatReader::mapEntireFile() -{ - return mapSectionOfFile (Range (0, lengthInSamples)); -} - -bool MemoryMappedAudioFormatReader::mapSectionOfFile (Range samplesToMap) -{ - if (map == nullptr || samplesToMap != mappedSection) - { - map = nullptr; - - const Range fileRange (sampleToFilePos (samplesToMap.getStart()), - sampleToFilePos (samplesToMap.getEnd())); - - map = new MemoryMappedFile (file, fileRange, MemoryMappedFile::readOnly); - - if (map->getData() == nullptr) - map = nullptr; - else - mappedSection = Range (jmax ((int64) 0, filePosToSample (map->getRange().getStart() + (bytesPerFrame - 1))), - jmin (lengthInSamples, filePosToSample (map->getRange().getEnd()))); - } - - return map != nullptr; -} - -static int memoryReadDummyVariable; // used to force the compiler not to optimise-away the read operation - -void MemoryMappedAudioFormatReader::touchSample (int64 sample) const noexcept -{ - if (map != nullptr && mappedSection.contains (sample)) - memoryReadDummyVariable += *(char*) sampleToPointer (sample); - else - jassertfalse; // you must make sure that the window contains all the samples you're going to attempt to read. -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h deleted file mode 100755 index 9d63f03..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReader.h +++ /dev/null @@ -1,300 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOFORMATREADER_H_INCLUDED -#define JUCE_AUDIOFORMATREADER_H_INCLUDED - - -//============================================================================== -/** - Reads samples from an audio file stream. - - A subclass that reads a specific type of audio format will be created by - an AudioFormat object. - - @see AudioFormat, AudioFormatWriter -*/ -class JUCE_API AudioFormatReader -{ -protected: - //============================================================================== - /** Creates an AudioFormatReader object. - - @param sourceStream the stream to read from - this will be deleted - by this object when it is no longer needed. (Some - specialised readers might not use this parameter and - can leave it as nullptr). - @param formatName the description that will be returned by the getFormatName() - method - */ - AudioFormatReader (InputStream* sourceStream, - const String& formatName); - -public: - /** Destructor. */ - virtual ~AudioFormatReader(); - - //============================================================================== - /** Returns a description of what type of format this is. - - E.g. "AIFF" - */ - const String& getFormatName() const noexcept { return formatName; } - - //============================================================================== - /** Reads samples from the stream. - - @param destSamples an array of buffers into which the sample data for each - channel will be written. - If the format is fixed-point, each channel will be written - as an array of 32-bit signed integers using the full - range -0x80000000 to 0x7fffffff, regardless of the source's - bit-depth. If it is a floating-point format, you should cast - the resulting array to a (float**) to get the values (in the - range -1.0 to 1.0 or beyond) - If the format is stereo, then destSamples[0] is the left channel - data, and destSamples[1] is the right channel. - The numDestChannels parameter indicates how many pointers this array - contains, but some of these pointers can be null if you don't want to - read data for some of the channels - @param numDestChannels the number of array elements in the destChannels array - @param startSampleInSource the position in the audio file or stream at which the samples - should be read, as a number of samples from the start of the - stream. It's ok for this to be beyond the start or end of the - available data - any samples that are out-of-range will be returned - as zeros. - @param numSamplesToRead the number of samples to read. If this is greater than the number - of samples that the file or stream contains. the result will be padded - with zeros - @param fillLeftoverChannelsWithCopies if true, this indicates that if there's no source data available - for some of the channels that you pass in, then they should be filled with - copies of valid source channels. - E.g. if you're reading a mono file and you pass 2 channels to this method, then - if fillLeftoverChannelsWithCopies is true, both destination channels will be filled - with the same data from the file's single channel. If fillLeftoverChannelsWithCopies - was false, then only the first channel would be filled with the file's contents, and - the second would be cleared. If there are many channels, e.g. you try to read 4 channels - from a stereo file, then the last 3 would all end up with copies of the same data. - @returns true if the operation succeeded, false if there was an error. Note - that reading sections of data beyond the extent of the stream isn't an - error - the reader should just return zeros for these regions - @see readMaxLevels - */ - bool read (int* const* destSamples, - int numDestChannels, - int64 startSampleInSource, - int numSamplesToRead, - bool fillLeftoverChannelsWithCopies); - - /** Fills a section of an AudioSampleBuffer from this reader. - - This will convert the reader's fixed- or floating-point data to - the buffer's floating-point format, and will try to intelligently - cope with mismatches between the number of channels in the reader - and the buffer. - */ - void read (AudioSampleBuffer* buffer, - int startSampleInDestBuffer, - int numSamples, - int64 readerStartSample, - bool useReaderLeftChan, - bool useReaderRightChan); - - /** Finds the highest and lowest sample levels from a section of the audio stream. - - This will read a block of samples from the stream, and measure the - highest and lowest sample levels from the channels in that section, returning - these as normalised floating-point levels. - - @param startSample the offset into the audio stream to start reading from. It's - ok for this to be beyond the start or end of the stream. - @param numSamples how many samples to read - @param results this array will be filled with Range values for each channel. - The array must contain numChannels elements. - @param numChannelsToRead the number of channels of data to scan. This must be - more than zero, but not more than the total number of channels - that the reader contains - @see read - */ - virtual void readMaxLevels (int64 startSample, int64 numSamples, - Range* results, int numChannelsToRead); - - /** Finds the highest and lowest sample levels from a section of the audio stream. - - This will read a block of samples from the stream, and measure the - highest and lowest sample levels from the channels in that section, returning - these as normalised floating-point levels. - - @param startSample the offset into the audio stream to start reading from. It's - ok for this to be beyond the start or end of the stream. - @param numSamples how many samples to read - @param lowestLeft on return, this is the lowest absolute sample from the left channel - @param highestLeft on return, this is the highest absolute sample from the left channel - @param lowestRight on return, this is the lowest absolute sample from the right - channel (if there is one) - @param highestRight on return, this is the highest absolute sample from the right - channel (if there is one) - @see read - */ - virtual void readMaxLevels (int64 startSample, int64 numSamples, - float& lowestLeft, float& highestLeft, - float& lowestRight, float& highestRight); - - /** Scans the source looking for a sample whose magnitude is in a specified range. - - This will read from the source, either forwards or backwards between two sample - positions, until it finds a sample whose magnitude lies between two specified levels. - - If it finds a suitable sample, it returns its position; if not, it will return -1. - - There's also a minimumConsecutiveSamples setting to help avoid spikes or zero-crossing - points when you're searching for a continuous range of samples - - @param startSample the first sample to look at - @param numSamplesToSearch the number of samples to scan. If this value is negative, - the search will go backwards - @param magnitudeRangeMinimum the lowest magnitude (inclusive) that is considered a hit, from 0 to 1.0 - @param magnitudeRangeMaximum the highest magnitude (inclusive) that is considered a hit, from 0 to 1.0 - @param minimumConsecutiveSamples if this is > 0, the method will only look for a sequence - of this many consecutive samples, all of which lie - within the target range. When it finds such a sequence, - it returns the position of the first in-range sample - it found (i.e. the earliest one if scanning forwards, the - latest one if scanning backwards) - */ - int64 searchForLevel (int64 startSample, - int64 numSamplesToSearch, - double magnitudeRangeMinimum, - double magnitudeRangeMaximum, - int minimumConsecutiveSamples); - - - //============================================================================== - /** The sample-rate of the stream. */ - double sampleRate; - - /** The number of bits per sample, e.g. 16, 24, 32. */ - unsigned int bitsPerSample; - - /** The total number of samples in the audio stream. */ - int64 lengthInSamples; - - /** The total number of channels in the audio stream. */ - unsigned int numChannels; - - /** Indicates whether the data is floating-point or fixed. */ - bool usesFloatingPointData; - - /** A set of metadata values that the reader has pulled out of the stream. - - Exactly what these values are depends on the format, so you can - check out the format implementation code to see what kind of stuff - they understand. - */ - StringPairArray metadataValues; - - /** The input stream, for use by subclasses. */ - InputStream* input; - - - //============================================================================== - /** Subclasses must implement this method to perform the low-level read operation. - - Callers should use read() instead of calling this directly. - - @param destSamples the array of destination buffers to fill. Some of these - pointers may be null - @param numDestChannels the number of items in the destSamples array. This - value is guaranteed not to be greater than the number of - channels that this reader object contains - @param startOffsetInDestBuffer the number of samples from the start of the - dest data at which to begin writing - @param startSampleInFile the number of samples into the source data at which - to begin reading. This value is guaranteed to be >= 0. - @param numSamples the number of samples to read - */ - virtual bool readSamples (int** destSamples, - int numDestChannels, - int startOffsetInDestBuffer, - int64 startSampleInFile, - int numSamples) = 0; - - -protected: - //============================================================================== - /** Used by AudioFormatReader subclasses to copy data to different formats. */ - template - struct ReadHelper - { - typedef AudioData::Pointer DestType; - typedef AudioData::Pointer SourceType; - - template - static void read (TargetType* const* destData, int destOffset, int numDestChannels, - const void* sourceData, int numSourceChannels, int numSamples) noexcept - { - for (int i = 0; i < numDestChannels; ++i) - { - if (void* targetChan = destData[i]) - { - DestType dest (targetChan); - dest += destOffset; - - if (i < numSourceChannels) - dest.convertSamples (SourceType (addBytesToPointer (sourceData, i * SourceType::getBytesPerSample()), numSourceChannels), numSamples); - else - dest.clearSamples (numSamples); - } - } - } - }; - - /** Used by AudioFormatReader subclasses to clear any parts of the data blocks that lie - beyond the end of their available length. - */ - static void clearSamplesBeyondAvailableLength (int** destSamples, int numDestChannels, - int startOffsetInDestBuffer, int64 startSampleInFile, - int& numSamples, int64 fileLengthInSamples) - { - jassert (destSamples != nullptr); - const int64 samplesAvailable = fileLengthInSamples - startSampleInFile; - - if (samplesAvailable < numSamples) - { - for (int i = numDestChannels; --i >= 0;) - if (destSamples[i] != nullptr) - zeromem (destSamples[i] + startOffsetInDestBuffer, sizeof (int) * (size_t) numSamples); - - numSamples = (int) samplesAvailable; - } - } - -private: - String formatName; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioFormatReader) -}; - - -#endif // JUCE_AUDIOFORMATREADER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp deleted file mode 100755 index fb086ef..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioFormatReaderSource::AudioFormatReaderSource (AudioFormatReader* const r, - const bool deleteReaderWhenThisIsDeleted) - : reader (r, deleteReaderWhenThisIsDeleted), - nextPlayPos (0), - looping (false) -{ - jassert (reader != nullptr); -} - -AudioFormatReaderSource::~AudioFormatReaderSource() {} - -int64 AudioFormatReaderSource::getTotalLength() const { return reader->lengthInSamples; } -void AudioFormatReaderSource::setNextReadPosition (int64 newPosition) { nextPlayPos = newPosition; } -void AudioFormatReaderSource::setLooping (bool shouldLoop) { looping = shouldLoop; } - -int64 AudioFormatReaderSource::getNextReadPosition() const -{ - return looping ? nextPlayPos % reader->lengthInSamples - : nextPlayPos; -} - -void AudioFormatReaderSource::prepareToPlay (int /*samplesPerBlockExpected*/, double /*sampleRate*/) {} -void AudioFormatReaderSource::releaseResources() {} - -void AudioFormatReaderSource::getNextAudioBlock (const AudioSourceChannelInfo& info) -{ - if (info.numSamples > 0) - { - const int64 start = nextPlayPos; - - if (looping) - { - const int64 newStart = start % reader->lengthInSamples; - const int64 newEnd = (start + info.numSamples) % reader->lengthInSamples; - - if (newEnd > newStart) - { - reader->read (info.buffer, info.startSample, - (int) (newEnd - newStart), newStart, true, true); - } - else - { - const int endSamps = (int) (reader->lengthInSamples - newStart); - - reader->read (info.buffer, info.startSample, - endSamps, newStart, true, true); - - reader->read (info.buffer, info.startSample + endSamps, - (int) newEnd, 0, true, true); - } - - nextPlayPos = newEnd; - } - else - { - reader->read (info.buffer, info.startSample, - info.numSamples, start, true, true); - nextPlayPos += info.numSamples; - } - } -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h deleted file mode 100755 index d7ff5f7..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatReaderSource.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOFORMATREADERSOURCE_H_INCLUDED -#define JUCE_AUDIOFORMATREADERSOURCE_H_INCLUDED - - -//============================================================================== -/** - A type of AudioSource that will read from an AudioFormatReader. - - @see PositionableAudioSource, AudioTransportSource, BufferingAudioSource -*/ -class JUCE_API AudioFormatReaderSource : public PositionableAudioSource -{ -public: - //============================================================================== - /** Creates an AudioFormatReaderSource for a given reader. - - @param sourceReader the reader to use as the data source - this must - not be null - @param deleteReaderWhenThisIsDeleted if true, the reader passed-in will be deleted - when this object is deleted; if false it will be - left up to the caller to manage its lifetime - */ - AudioFormatReaderSource (AudioFormatReader* sourceReader, - bool deleteReaderWhenThisIsDeleted); - - /** Destructor. */ - ~AudioFormatReaderSource(); - - //============================================================================== - /** Toggles loop-mode. - - If set to true, it will continuously loop the input source. If false, - it will just emit silence after the source has finished. - - @see isLooping - */ - void setLooping (bool shouldLoop); - - /** Returns whether loop-mode is turned on or not. */ - bool isLooping() const { return looping; } - - /** Returns the reader that's being used. */ - AudioFormatReader* getAudioFormatReader() const noexcept { return reader; } - - //============================================================================== - /** Implementation of the AudioSource method. */ - void prepareToPlay (int samplesPerBlockExpected, double sampleRate) override; - - /** Implementation of the AudioSource method. */ - void releaseResources() override; - - /** Implementation of the AudioSource method. */ - void getNextAudioBlock (const AudioSourceChannelInfo&) override; - - //============================================================================== - /** Implements the PositionableAudioSource method. */ - void setNextReadPosition (int64 newPosition) override; - - /** Implements the PositionableAudioSource method. */ - int64 getNextReadPosition() const override; - - /** Implements the PositionableAudioSource method. */ - int64 getTotalLength() const override; - -private: - //============================================================================== - OptionalScopedPointer reader; - - int64 volatile nextPlayPos; - bool volatile looping; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioFormatReaderSource) -}; - - -#endif // JUCE_AUDIOFORMATREADERSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp deleted file mode 100755 index 065f36a..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioFormatWriter::AudioFormatWriter (OutputStream* const out, - const String& formatName_, - const double rate, - const unsigned int numChannels_, - const unsigned int bitsPerSample_) - : sampleRate (rate), - numChannels (numChannels_), - bitsPerSample (bitsPerSample_), - usesFloatingPointData (false), - output (out), - formatName (formatName_) -{ -} - -AudioFormatWriter::~AudioFormatWriter() -{ - delete output; -} - -static void convertFloatsToInts (int* dest, const float* src, int numSamples) noexcept -{ - while (--numSamples >= 0) - { - const double samp = *src++; - - if (samp <= -1.0) - *dest = std::numeric_limits::min(); - else if (samp >= 1.0) - *dest = std::numeric_limits::max(); - else - *dest = roundToInt (std::numeric_limits::max() * samp); - - ++dest; - } -} - -bool AudioFormatWriter::writeFromAudioReader (AudioFormatReader& reader, - int64 startSample, - int64 numSamplesToRead) -{ - const int bufferSize = 16384; - AudioSampleBuffer tempBuffer ((int) numChannels, bufferSize); - - int* buffers [128] = { 0 }; - - for (int i = tempBuffer.getNumChannels(); --i >= 0;) - buffers[i] = reinterpret_cast (tempBuffer.getWritePointer (i, 0)); - - if (numSamplesToRead < 0) - numSamplesToRead = reader.lengthInSamples; - - while (numSamplesToRead > 0) - { - const int numToDo = (int) jmin (numSamplesToRead, (int64) bufferSize); - - if (! reader.read (buffers, (int) numChannels, startSample, numToDo, false)) - return false; - - if (reader.usesFloatingPointData != isFloatingPoint()) - { - int** bufferChan = buffers; - - while (*bufferChan != nullptr) - { - void* const b = *bufferChan++; - - if (isFloatingPoint()) - FloatVectorOperations::convertFixedToFloat ((float*) b, (int*) b, 1.0f / 0x7fffffff, numToDo); - else - convertFloatsToInts ((int*) b, (float*) b, numToDo); - } - } - - if (! write (const_cast (buffers), numToDo)) - return false; - - numSamplesToRead -= numToDo; - startSample += numToDo; - } - - return true; -} - -bool AudioFormatWriter::writeFromAudioSource (AudioSource& source, int numSamplesToRead, const int samplesPerBlock) -{ - AudioSampleBuffer tempBuffer (getNumChannels(), samplesPerBlock); - - while (numSamplesToRead > 0) - { - const int numToDo = jmin (numSamplesToRead, samplesPerBlock); - - AudioSourceChannelInfo info (&tempBuffer, 0, numToDo); - info.clearActiveBufferRegion(); - - source.getNextAudioBlock (info); - - if (! writeFromAudioSampleBuffer (tempBuffer, 0, numToDo)) - return false; - - numSamplesToRead -= numToDo; - } - - return true; -} - -bool AudioFormatWriter::writeFromFloatArrays (const float* const* channels, int numSourceChannels, int numSamples) -{ - if (numSamples <= 0) - return true; - - if (isFloatingPoint()) - return write ((const int**) channels, numSamples); - - int* chans [256]; - int scratch [4096]; - - jassert (numSourceChannels < numElementsInArray (chans)); - const int maxSamples = (int) (numElementsInArray (scratch) / numSourceChannels); - - for (int i = 0; i < numSourceChannels; ++i) - chans[i] = scratch + (i * maxSamples); - - chans[numSourceChannels] = nullptr; - int startSample = 0; - - while (numSamples > 0) - { - const int numToDo = jmin (numSamples, maxSamples); - - for (int i = 0; i < numSourceChannels; ++i) - convertFloatsToInts (chans[i], channels[i] + startSample, numToDo); - - if (! write ((const int**) chans, numToDo)) - return false; - - startSample += numToDo; - numSamples -= numToDo; - } - - return true; -} - -bool AudioFormatWriter::writeFromAudioSampleBuffer (const AudioSampleBuffer& source, int startSample, int numSamples) -{ - const int numSourceChannels = source.getNumChannels(); - jassert (startSample >= 0 && startSample + numSamples <= source.getNumSamples() && numSourceChannels > 0); - - if (startSample == 0) - return writeFromFloatArrays (source.getArrayOfReadPointers(), numSourceChannels, numSamples); - - const float* chans [256]; - jassert ((int) numChannels < numElementsInArray (chans)); - - for (int i = 0; i < numSourceChannels; ++i) - chans[i] = source.getReadPointer (i, startSample); - - chans[numSourceChannels] = nullptr; - - return writeFromFloatArrays (chans, numSourceChannels, numSamples); -} - -bool AudioFormatWriter::flush() -{ - return false; -} - -//============================================================================== -class AudioFormatWriter::ThreadedWriter::Buffer : private TimeSliceClient -{ -public: - Buffer (TimeSliceThread& tst, AudioFormatWriter* w, int channels, int numSamples) - : fifo (numSamples), - buffer (channels, numSamples), - timeSliceThread (tst), - writer (w), - receiver (nullptr), - samplesWritten (0), - samplesPerFlush (0), - flushSampleCounter (0), - isRunning (true) - { - timeSliceThread.addTimeSliceClient (this); - } - - ~Buffer() - { - isRunning = false; - timeSliceThread.removeTimeSliceClient (this); - - while (writePendingData() == 0) - {} - } - - bool write (const float* const* data, int numSamples) - { - if (numSamples <= 0 || ! isRunning) - return true; - - jassert (timeSliceThread.isThreadRunning()); // you need to get your thread running before pumping data into this! - - int start1, size1, start2, size2; - fifo.prepareToWrite (numSamples, start1, size1, start2, size2); - - if (size1 + size2 < numSamples) - return false; - - for (int i = buffer.getNumChannels(); --i >= 0;) - { - buffer.copyFrom (i, start1, data[i], size1); - buffer.copyFrom (i, start2, data[i] + size1, size2); - } - - fifo.finishedWrite (size1 + size2); - timeSliceThread.notify(); - return true; - } - - int useTimeSlice() override - { - return writePendingData(); - } - - int writePendingData() - { - const int numToDo = fifo.getTotalSize() / 4; - - int start1, size1, start2, size2; - fifo.prepareToRead (numToDo, start1, size1, start2, size2); - - if (size1 <= 0) - return 10; - - writer->writeFromAudioSampleBuffer (buffer, start1, size1); - - const ScopedLock sl (thumbnailLock); - if (receiver != nullptr) - receiver->addBlock (samplesWritten, buffer, start1, size1); - - samplesWritten += size1; - - if (size2 > 0) - { - writer->writeFromAudioSampleBuffer (buffer, start2, size2); - - if (receiver != nullptr) - receiver->addBlock (samplesWritten, buffer, start2, size2); - - samplesWritten += size2; - } - - fifo.finishedRead (size1 + size2); - - if (samplesPerFlush > 0) - { - flushSampleCounter -= size1 + size2; - - if (flushSampleCounter <= 0) - { - flushSampleCounter = samplesPerFlush; - writer->flush(); - } - } - - return 0; - } - - void setDataReceiver (IncomingDataReceiver* newReceiver) - { - if (newReceiver != nullptr) - newReceiver->reset (buffer.getNumChannels(), writer->getSampleRate(), 0); - - const ScopedLock sl (thumbnailLock); - receiver = newReceiver; - samplesWritten = 0; - } - - void setFlushInterval (int numSamples) noexcept - { - samplesPerFlush = numSamples; - } - -private: - AbstractFifo fifo; - AudioSampleBuffer buffer; - TimeSliceThread& timeSliceThread; - ScopedPointer writer; - CriticalSection thumbnailLock; - IncomingDataReceiver* receiver; - int64 samplesWritten; - int samplesPerFlush, flushSampleCounter; - volatile bool isRunning; - - JUCE_DECLARE_NON_COPYABLE (Buffer) -}; - -AudioFormatWriter::ThreadedWriter::ThreadedWriter (AudioFormatWriter* writer, TimeSliceThread& backgroundThread, int numSamplesToBuffer) - : buffer (new AudioFormatWriter::ThreadedWriter::Buffer (backgroundThread, writer, (int) writer->numChannels, numSamplesToBuffer)) -{ -} - -AudioFormatWriter::ThreadedWriter::~ThreadedWriter() -{ -} - -bool AudioFormatWriter::ThreadedWriter::write (const float* const* data, int numSamples) -{ - return buffer->write (data, numSamples); -} - -void AudioFormatWriter::ThreadedWriter::setDataReceiver (AudioFormatWriter::ThreadedWriter::IncomingDataReceiver* receiver) -{ - buffer->setDataReceiver (receiver); -} - -void AudioFormatWriter::ThreadedWriter::setFlushInterval (int numSamplesPerFlush) noexcept -{ - buffer->setFlushInterval (numSamplesPerFlush); -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h deleted file mode 100755 index 9098c75..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioFormatWriter.h +++ /dev/null @@ -1,274 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOFORMATWRITER_H_INCLUDED -#define JUCE_AUDIOFORMATWRITER_H_INCLUDED - - -//============================================================================== -/** - Writes samples to an audio file stream. - - A subclass that writes a specific type of audio format will be created by - an AudioFormat object. - - After creating one of these with the AudioFormat::createWriterFor() method - you can call its write() method to store the samples, and then delete it. - - @see AudioFormat, AudioFormatReader -*/ -class JUCE_API AudioFormatWriter -{ -protected: - //============================================================================== - /** Creates an AudioFormatWriter object. - - @param destStream the stream to write to - this will be deleted - by this object when it is no longer needed - @param formatName the description that will be returned by the getFormatName() - method - @param sampleRate the sample rate to use - the base class just stores - this value, it doesn't do anything with it - @param numberOfChannels the number of channels to write - the base class just stores - this value, it doesn't do anything with it - @param bitsPerSample the bit depth of the stream - the base class just stores - this value, it doesn't do anything with it - */ - AudioFormatWriter (OutputStream* destStream, - const String& formatName, - double sampleRate, - unsigned int numberOfChannels, - unsigned int bitsPerSample); - -public: - /** Destructor. */ - virtual ~AudioFormatWriter(); - - //============================================================================== - /** Returns a description of what type of format this is. - - E.g. "AIFF file" - */ - const String& getFormatName() const noexcept { return formatName; } - - //============================================================================== - /** Writes a set of samples to the audio stream. - - Note that if you're trying to write the contents of an AudioSampleBuffer, you - can use AudioSampleBuffer::writeToAudioWriter(). - - @param samplesToWrite an array of arrays containing the sample data for - each channel to write. This is a zero-terminated - array of arrays, and can contain a different number - of channels than the actual stream uses, and the - writer should do its best to cope with this. - If the format is fixed-point, each channel will be formatted - as an array of signed integers using the full 32-bit - range -0x80000000 to 0x7fffffff, regardless of the source's - bit-depth. If it is a floating-point format, you should treat - the arrays as arrays of floats, and just cast it to an (int**) - to pass it into the method. - @param numSamples the number of samples to write - */ - virtual bool write (const int** samplesToWrite, int numSamples) = 0; - - /** Some formats may support a flush operation that makes sure the file is in a - valid state before carrying on. - If supported, this means that by calling flush periodically when writing data - to a large file, then it should still be left in a readable state if your program - crashes. - It goes without saying that this method must be called from the same thread that's - calling write()! - If the format supports flushing and the operation succeeds, this returns true. - */ - virtual bool flush(); - - //============================================================================== - /** Reads a section of samples from an AudioFormatReader, and writes these to - the output. - - This will take care of any floating-point conversion that's required to convert - between the two formats. It won't deal with sample-rate conversion, though. - - If numSamplesToRead < 0, it will write the entire length of the reader. - - @returns false if it can't read or write properly during the operation - */ - bool writeFromAudioReader (AudioFormatReader& reader, - int64 startSample, - int64 numSamplesToRead); - - /** Reads some samples from an AudioSource, and writes these to the output. - - The source must already have been initialised with the AudioSource::prepareToPlay() method - - @param source the source to read from - @param numSamplesToRead total number of samples to read and write - @param samplesPerBlock the maximum number of samples to fetch from the source - @returns false if it can't read or write properly during the operation - */ - bool writeFromAudioSource (AudioSource& source, - int numSamplesToRead, - int samplesPerBlock = 2048); - - - /** Writes some samples from an AudioSampleBuffer. */ - bool writeFromAudioSampleBuffer (const AudioSampleBuffer& source, - int startSample, int numSamples); - - /** Writes some samples from a set of float data channels. */ - bool writeFromFloatArrays (const float* const* channels, int numChannels, int numSamples); - - //============================================================================== - /** Returns the sample rate being used. */ - double getSampleRate() const noexcept { return sampleRate; } - - /** Returns the number of channels being written. */ - int getNumChannels() const noexcept { return (int) numChannels; } - - /** Returns the bit-depth of the data being written. */ - int getBitsPerSample() const noexcept { return (int) bitsPerSample; } - - /** Returns true if it's a floating-point format, false if it's fixed-point. */ - bool isFloatingPoint() const noexcept { return usesFloatingPointData; } - - //============================================================================== - /** - Provides a FIFO for an AudioFormatWriter, allowing you to push incoming - data into a buffer which will be flushed to disk by a background thread. - */ - class ThreadedWriter - { - public: - /** Creates a ThreadedWriter for a given writer and a thread. - - The writer object which is passed in here will be owned and deleted by - the ThreadedWriter when it is no longer needed. - - To stop the writer and flush the buffer to disk, simply delete this object. - */ - ThreadedWriter (AudioFormatWriter* writer, - TimeSliceThread& backgroundThread, - int numSamplesToBuffer); - - /** Destructor. */ - ~ThreadedWriter(); - - /** Pushes some incoming audio data into the FIFO. - - If there's enough free space in the buffer, this will add the data to it, - - If the FIFO is too full to accept this many samples, the method will return - false - then you could either wait until the background thread has had time to - consume some of the buffered data and try again, or you can give up - and lost this block. - - The data must be an array containing the same number of channels as the - AudioFormatWriter object is using. None of these channels can be null. - */ - bool write (const float* const* data, int numSamples); - - class JUCE_API IncomingDataReceiver - { - public: - IncomingDataReceiver() {} - virtual ~IncomingDataReceiver() {} - - virtual void reset (int numChannels, double sampleRate, int64 totalSamplesInSource) = 0; - virtual void addBlock (int64 sampleNumberInSource, const AudioSampleBuffer& newData, - int startOffsetInBuffer, int numSamples) = 0; - }; - - /** Allows you to specify a callback that this writer should update with the - incoming data. - The receiver will be cleared and will the writer will begin adding data to - it as the data arrives. Pass a null pointer to remove the current receiver. - - The object passed-in must not be deleted while this writer is still using it. - */ - void setDataReceiver (IncomingDataReceiver*); - - /** Sets how many samples should be written before calling the AudioFormatWriter::flush method. - Set this to 0 to disable flushing (this is the default). - */ - void setFlushInterval (int numSamplesPerFlush) noexcept; - - private: - class Buffer; - friend struct ContainerDeletePolicy; - ScopedPointer buffer; - }; - -protected: - //============================================================================== - /** The sample rate of the stream. */ - double sampleRate; - - /** The number of channels being written to the stream. */ - unsigned int numChannels; - - /** The bit depth of the file. */ - unsigned int bitsPerSample; - - /** True if it's a floating-point format, false if it's fixed-point. */ - bool usesFloatingPointData; - - /** The output stream for use by subclasses. */ - OutputStream* output; - - /** Used by AudioFormatWriter subclasses to copy data to different formats. */ - template - struct WriteHelper - { - typedef AudioData::Pointer DestType; - typedef AudioData::Pointer SourceType; - - static void write (void* destData, int numDestChannels, const int* const* source, - int numSamples, const int sourceOffset = 0) noexcept - { - for (int i = 0; i < numDestChannels; ++i) - { - const DestType dest (addBytesToPointer (destData, i * DestType::getBytesPerSample()), numDestChannels); - - if (*source != nullptr) - { - dest.convertSamples (SourceType (*source + sourceOffset), numSamples); - ++source; - } - else - { - dest.clearSamples (numSamples); - } - } - } - }; - -private: - String formatName; - friend class ThreadedWriter; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioFormatWriter) -}; - -#endif // JUCE_AUDIOFORMATWRITER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp deleted file mode 100755 index 296f55f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioSubsectionReader::AudioSubsectionReader (AudioFormatReader* const source_, - const int64 startSample_, - const int64 length_, - const bool deleteSourceWhenDeleted_) - : AudioFormatReader (0, source_->getFormatName()), - source (source_), - startSample (startSample_), - deleteSourceWhenDeleted (deleteSourceWhenDeleted_) -{ - length = jmin (jmax ((int64) 0, source->lengthInSamples - startSample), length_); - - sampleRate = source->sampleRate; - bitsPerSample = source->bitsPerSample; - lengthInSamples = length; - numChannels = source->numChannels; - usesFloatingPointData = source->usesFloatingPointData; -} - -AudioSubsectionReader::~AudioSubsectionReader() -{ - if (deleteSourceWhenDeleted) - delete source; -} - -//============================================================================== -bool AudioSubsectionReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) -{ - clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, - startSampleInFile, numSamples, length); - - return source->readSamples (destSamples, numDestChannels, startOffsetInDestBuffer, - startSampleInFile + startSample, numSamples); -} - -void AudioSubsectionReader::readMaxLevels (int64 startSampleInFile, int64 numSamples, Range* results, int numChannelsToRead) -{ - startSampleInFile = jmax ((int64) 0, startSampleInFile); - numSamples = jmax ((int64) 0, jmin (numSamples, length - startSampleInFile)); - - source->readMaxLevels (startSampleInFile + startSample, numSamples, results, numChannelsToRead); -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h deleted file mode 100755 index a666f4f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_AudioSubsectionReader.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOSUBSECTIONREADER_H_INCLUDED -#define JUCE_AUDIOSUBSECTIONREADER_H_INCLUDED - - -//============================================================================== -/** - This class is used to wrap an AudioFormatReader and only read from a - subsection of the file. - - So if you have a reader which can read a 1000 sample file, you could wrap it - in one of these to only access, e.g. samples 100 to 200, and any samples - outside that will come back as 0. Accessing sample 0 from this reader will - actually read the first sample from the other's subsection, which might - be at a non-zero position. - - @see AudioFormatReader -*/ -class JUCE_API AudioSubsectionReader : public AudioFormatReader -{ -public: - //============================================================================== - /** Creates an AudioSubsectionReader for a given data source. - - @param sourceReader the source reader from which we'll be taking data - @param subsectionStartSample the sample within the source reader which will be - mapped onto sample 0 for this reader. - @param subsectionLength the number of samples from the source that will - make up the subsection. If this reader is asked for - any samples beyond this region, it will return zero. - @param deleteSourceWhenDeleted if true, the sourceReader object will be deleted when - this object is deleted. - */ - AudioSubsectionReader (AudioFormatReader* sourceReader, - int64 subsectionStartSample, - int64 subsectionLength, - bool deleteSourceWhenDeleted); - - /** Destructor. */ - ~AudioSubsectionReader(); - - - //============================================================================== - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override; - - void readMaxLevels (int64 startSample, int64 numSamples, - Range* results, int numChannelsToRead) override; - - -private: - //============================================================================== - AudioFormatReader* const source; - int64 startSample, length; - const bool deleteSourceWhenDeleted; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioSubsectionReader) -}; - -#endif // JUCE_AUDIOSUBSECTIONREADER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp b/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp deleted file mode 100755 index ecfe1d4..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -BufferingAudioReader::BufferingAudioReader (AudioFormatReader* sourceReader, - TimeSliceThread& timeSliceThread, - int samplesToBuffer) - : AudioFormatReader (nullptr, sourceReader->getFormatName()), - source (sourceReader), thread (timeSliceThread), - nextReadPosition (0), - numBlocks (1 + (samplesToBuffer / samplesPerBlock)) -{ - sampleRate = source->sampleRate; - lengthInSamples = source->lengthInSamples; - numChannels = source->numChannels; - metadataValues = source->metadataValues; - bitsPerSample = 32; - usesFloatingPointData = true; - - for (int i = 3; --i >= 0;) - readNextBufferChunk(); - - timeSliceThread.addTimeSliceClient (this); -} - -BufferingAudioReader::~BufferingAudioReader() -{ - thread.removeTimeSliceClient (this); -} - -void BufferingAudioReader::setReadTimeout (int timeoutMilliseconds) noexcept -{ - timeoutMs = timeoutMilliseconds; -} - -bool BufferingAudioReader::readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) -{ - const uint32 startTime = Time::getMillisecondCounter(); - clearSamplesBeyondAvailableLength (destSamples, numDestChannels, startOffsetInDestBuffer, - startSampleInFile, numSamples, lengthInSamples); - - const ScopedLock sl (lock); - nextReadPosition = startSampleInFile; - - while (numSamples > 0) - { - if (const BufferedBlock* const block = getBlockContaining (startSampleInFile)) - { - const int offset = (int) (startSampleInFile - block->range.getStart()); - const int numToDo = jmin (numSamples, (int) (block->range.getEnd() - startSampleInFile)); - - for (int j = 0; j < numDestChannels; ++j) - { - if (float* dest = (float*) destSamples[j]) - { - dest += startOffsetInDestBuffer; - - if (j < (int) numChannels) - FloatVectorOperations::copy (dest, block->buffer.getReadPointer (j, offset), numToDo); - else - FloatVectorOperations::clear (dest, numToDo); - } - } - - startOffsetInDestBuffer += numToDo; - startSampleInFile += numToDo; - numSamples -= numToDo; - } - else - { - if (timeoutMs >= 0 && Time::getMillisecondCounter() >= startTime + (uint32) timeoutMs) - { - for (int j = 0; j < numDestChannels; ++j) - if (float* dest = (float*) destSamples[j]) - FloatVectorOperations::clear (dest + startOffsetInDestBuffer, numSamples); - - break; - } - else - { - ScopedUnlock ul (lock); - Thread::yield(); - } - } - } - - return true; -} - -BufferingAudioReader::BufferedBlock::BufferedBlock (AudioFormatReader& reader, int64 pos, int numSamples) - : range (pos, pos + numSamples), - buffer ((int) reader.numChannels, numSamples) -{ - reader.read (&buffer, 0, numSamples, pos, true, true); -} - -BufferingAudioReader::BufferedBlock* BufferingAudioReader::getBlockContaining (int64 pos) const noexcept -{ - for (int i = blocks.size(); --i >= 0;) - { - BufferedBlock* const b = blocks.getUnchecked(i); - - if (b->range.contains (pos)) - return b; - } - - return nullptr; -} - -int BufferingAudioReader::useTimeSlice() -{ - return readNextBufferChunk() ? 1 : 100; -} - -bool BufferingAudioReader::readNextBufferChunk() -{ - const int64 pos = nextReadPosition; - const int64 startPos = ((pos - 1024) / samplesPerBlock) * samplesPerBlock; - const int64 endPos = startPos + numBlocks * samplesPerBlock; - - OwnedArray newBlocks; - - for (int i = blocks.size(); --i >= 0;) - if (blocks.getUnchecked(i)->range.intersects (Range (startPos, endPos))) - newBlocks.add (blocks.getUnchecked(i)); - - if (newBlocks.size() == numBlocks) - { - newBlocks.clear (false); - return false; - } - - for (int64 p = startPos; p < endPos; p += samplesPerBlock) - { - if (getBlockContaining (p) == nullptr) - { - newBlocks.add (new BufferedBlock (*source, p, samplesPerBlock)); - break; // just do one block - } - } - - { - const ScopedLock sl (lock); - newBlocks.swapWith (blocks); - } - - for (int i = blocks.size(); --i >= 0;) - newBlocks.removeObject (blocks.getUnchecked(i), false); - - return true; -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h deleted file mode 100755 index 8f950be..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_BufferingAudioFormatReader.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_BUFFERINGAUDIOFORMATREADER_H_INCLUDED -#define JUCE_BUFFERINGAUDIOFORMATREADER_H_INCLUDED - -//============================================================================== -/** - An AudioFormatReader that uses a background thread to pre-read data from - another reader. - - @see AudioFormatReader -*/ -class JUCE_API BufferingAudioReader : public AudioFormatReader, - private TimeSliceClient -{ -public: - /** Creates a reader. - - @param sourceReader the source reader to wrap. This BufferingAudioReader - takes ownership of this object and will delete it later - when no longer needed - @param timeSliceThread the thread that should be used to do the background reading. - Make sure that the thread you supply is running, and won't - be deleted while the reader object still exists. - @param samplesToBuffer the total number of samples to buffer ahead. - */ - BufferingAudioReader (AudioFormatReader* sourceReader, - TimeSliceThread& timeSliceThread, - int samplesToBuffer); - - ~BufferingAudioReader(); - - /** Sets a number of milliseconds that the reader can block for in its readSamples() - method before giving up and returning silence. - A value of less that 0 means "wait forever". - The default timeout is 0. - */ - void setReadTimeout (int timeoutMilliseconds) noexcept; - - bool readSamples (int** destSamples, int numDestChannels, int startOffsetInDestBuffer, - int64 startSampleInFile, int numSamples) override; - -private: - ScopedPointer source; - TimeSliceThread& thread; - int64 nextReadPosition; - const int numBlocks; - int timeoutMs; - - enum { samplesPerBlock = 32768 }; - - struct BufferedBlock - { - BufferedBlock (AudioFormatReader& reader, int64 pos, int numSamples); - - Range range; - AudioSampleBuffer buffer; - }; - - CriticalSection lock; - OwnedArray blocks; - - BufferedBlock* getBlockContaining (int64 pos) const noexcept; - int useTimeSlice() override; - bool readNextBufferChunk(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BufferingAudioReader) -}; - - -#endif // JUCE_BUFFERINGAUDIOFORMATREADER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h b/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h deleted file mode 100755 index f245a02..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/format/juce_MemoryMappedAudioFormatReader.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MEMORYMAPPEDAUDIOFORMATREADER_H_INCLUDED -#define JUCE_MEMORYMAPPEDAUDIOFORMATREADER_H_INCLUDED - - -//============================================================================== -/** - A specialised type of AudioFormatReader that uses a MemoryMappedFile to read - directly from an audio file. - - This allows for incredibly fast random-access to sample data in the mapped - region of the file, but not all audio formats support it - see - AudioFormat::createMemoryMappedReader(). - - Note that before reading samples from a MemoryMappedAudioFormatReader, you must first - call mapEntireFile() or mapSectionOfFile() to ensure that the region you want to - read has been mapped. - - @see AudioFormat::createMemoryMappedReader, AudioFormatReader -*/ -class JUCE_API MemoryMappedAudioFormatReader : public AudioFormatReader -{ -protected: - //============================================================================== - /** Creates an MemoryMappedAudioFormatReader object. - - Note that before attempting to read any data, you must call mapEntireFile() - or mapSectionOfFile() to ensure that the region you want to read has - been mapped. - */ - MemoryMappedAudioFormatReader (const File& file, const AudioFormatReader& details, - int64 dataChunkStart, int64 dataChunkLength, int bytesPerFrame); - -public: - /** Returns the file that is being mapped */ - const File& getFile() const noexcept { return file; } - - /** Attempts to map the entire file into memory. */ - bool mapEntireFile(); - - /** Attempts to map a section of the file into memory. */ - bool mapSectionOfFile (Range samplesToMap); - - /** Returns the sample range that's currently memory-mapped and available for reading. */ - Range getMappedSection() const noexcept { return mappedSection; } - - /** Touches the memory for the given sample, to force it to be loaded into active memory. */ - void touchSample (int64 sample) const noexcept; - - /** Returns the samples for all channels at a given sample position. - The result array must be large enough to hold a value for each channel - that this reader contains. - */ - virtual void getSample (int64 sampleIndex, float* result) const noexcept = 0; - - /** Returns the number of bytes currently being mapped */ - size_t getNumBytesUsed() const { return map != nullptr ? map->getSize() : 0; } - -protected: - File file; - Range mappedSection; - ScopedPointer map; - int64 dataChunkStart, dataLength; - int bytesPerFrame; - - /** Converts a sample index to a byte position in the file. */ - inline int64 sampleToFilePos (int64 sample) const noexcept { return dataChunkStart + sample * bytesPerFrame; } - - /** Converts a byte position in the file to a sample index. */ - inline int64 filePosToSample (int64 filePos) const noexcept { return (filePos - dataChunkStart) / bytesPerFrame; } - - /** Converts a sample index to a pointer to the mapped file memory. */ - inline const void* sampleToPointer (int64 sample) const noexcept { return addBytesToPointer (map->getData(), sampleToFilePos (sample) - map->getRange().getStart()); } - - /** Used by AudioFormatReader subclasses to scan for min/max ranges in interleaved data. */ - template - Range scanMinAndMaxInterleaved (int channel, int64 startSampleInFile, int64 numSamples) const noexcept - { - typedef AudioData::Pointer SourceType; - - return SourceType (addBytesToPointer (sampleToPointer (startSampleInFile), ((int) bitsPerSample / 8) * channel), (int) numChannels) - .findMinAndMax ((size_t) numSamples); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedAudioFormatReader) -}; - - -#endif // JUCE_MEMORYMAPPEDAUDIOFORMATREADER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp b/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp deleted file mode 100755 index b68042f..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if defined (JUCE_AUDIO_FORMATS_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE - /* When you add this cpp file to your project, you mustn't include it in a file where you've - already included any other headers - just put it inside a file on its own, possibly with your config - flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix - header files that the compiler may be using. - */ - #error "Incorrect use of JUCE cpp file" -#endif - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../juce_core/native/juce_BasicNativeHeaders.h" -#include "juce_audio_formats.h" - -//============================================================================== -#if JUCE_MAC - #define Point CarbonDummyPointName - #define Component CarbonDummyCompName - #if JUCE_QUICKTIME - #import - #endif - #include - #undef Component - #undef Point - -#elif JUCE_IOS - #import - #import - -//============================================================================== -#elif JUCE_WINDOWS - #if JUCE_QUICKTIME - /* If you've got an include error here, you probably need to install the QuickTime SDK and - add its header directory to your include path. - - Alternatively, if you don't need any QuickTime services, just set the JUCE_QUICKTIME flag to 0. - */ - #include - #include - #include - #include - #include - - /* If you've got QuickTime 7 installed, then these COM objects should be found in - the "\Program Files\Quicktime" directory. You'll need to add this directory to - your include search path to make these import statements work. - */ - #import - #import - - #if JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES - #pragma comment (lib, "QTMLClient.lib") - #endif - #endif - - #if JUCE_USE_WINDOWS_MEDIA_FORMAT - #include - #endif -#endif - -//============================================================================== -namespace juce -{ - -#if JUCE_ANDROID - #include "../juce_core/native/juce_android_JNIHelpers.h" - #undef JUCE_QUICKTIME -#endif - -#if JUCE_WINDOWS - #include "../juce_core/native/juce_win32_ComSmartPtr.h" -#endif - -#include "format/juce_AudioFormat.cpp" -#include "format/juce_AudioFormatManager.cpp" -#include "format/juce_AudioFormatReader.cpp" -#include "format/juce_AudioFormatReaderSource.cpp" -#include "format/juce_AudioFormatWriter.cpp" -#include "format/juce_AudioSubsectionReader.cpp" -#include "format/juce_BufferingAudioFormatReader.cpp" -#include "sampler/juce_Sampler.cpp" -#include "codecs/juce_AiffAudioFormat.cpp" -#include "codecs/juce_CoreAudioFormat.cpp" -#include "codecs/juce_FlacAudioFormat.cpp" -#include "codecs/juce_MP3AudioFormat.cpp" -#include "codecs/juce_OggVorbisAudioFormat.cpp" -#include "codecs/juce_QuickTimeAudioFormat.cpp" -#include "codecs/juce_WavAudioFormat.cpp" -#include "codecs/juce_LAMEEncoderAudioFormat.cpp" - -#if JUCE_WINDOWS && JUCE_USE_WINDOWS_MEDIA_FORMAT - #include "codecs/juce_WindowsMediaAudioFormat.cpp" -#endif - -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h b/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h deleted file mode 100755 index c15194e..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIO_FORMATS_H_INCLUDED -#define JUCE_AUDIO_FORMATS_H_INCLUDED - -#include "../juce_audio_basics/juce_audio_basics.h" - -//============================================================================= -/** Config: JUCE_USE_FLAC - Enables the FLAC audio codec classes (available on all platforms). - If your app doesn't need to read FLAC files, you might want to disable this to - reduce the size of your codebase and build time. -*/ -#ifndef JUCE_USE_FLAC - #define JUCE_USE_FLAC 1 -#endif - -/** Config: JUCE_USE_OGGVORBIS - Enables the Ogg-Vorbis audio codec classes (available on all platforms). - If your app doesn't need to read Ogg-Vorbis files, you might want to disable this to - reduce the size of your codebase and build time. -*/ -#ifndef JUCE_USE_OGGVORBIS - #define JUCE_USE_OGGVORBIS 1 -#endif - -/** Config: JUCE_USE_MP3AUDIOFORMAT - Enables the software-based MP3AudioFormat class. - IMPORTANT DISCLAIMER: By choosing to enable the JUCE_USE_MP3AUDIOFORMAT flag and to compile - this MP3 code into your software, you do so AT YOUR OWN RISK! By doing so, you are agreeing - that Raw Material Software is in no way responsible for any patent, copyright, or other - legal issues that you may suffer as a result. - - The code in juce_MP3AudioFormat.cpp is NOT guaranteed to be free from infringements of 3rd-party - intellectual property. If you wish to use it, please seek your own independent advice about the - legality of doing so. If you are not willing to accept full responsibility for the consequences - of using this code, then do not enable this setting. -*/ -#ifndef JUCE_USE_MP3AUDIOFORMAT - #define JUCE_USE_MP3AUDIOFORMAT 0 -#endif - -/** Config: JUCE_USE_LAME_AUDIO_FORMAT - Enables the LameEncoderAudioFormat class. -*/ -#ifndef JUCE_USE_LAME_AUDIO_FORMAT - #define JUCE_USE_LAME_AUDIO_FORMAT 0 -#endif - -/** Config: JUCE_USE_WINDOWS_MEDIA_FORMAT - Enables the Windows Media SDK codecs. -*/ -#ifndef JUCE_USE_WINDOWS_MEDIA_FORMAT - #define JUCE_USE_WINDOWS_MEDIA_FORMAT 1 -#endif - -#if ! JUCE_MSVC - #undef JUCE_USE_WINDOWS_MEDIA_FORMAT - #define JUCE_USE_WINDOWS_MEDIA_FORMAT 0 -#endif - -//============================================================================= -namespace juce -{ - -class AudioFormat; -#include "format/juce_AudioFormatReader.h" -#include "format/juce_AudioFormatWriter.h" -#include "format/juce_MemoryMappedAudioFormatReader.h" -#include "format/juce_AudioFormat.h" -#include "format/juce_AudioFormatManager.h" -#include "format/juce_AudioFormatReaderSource.h" -#include "format/juce_AudioSubsectionReader.h" -#include "format/juce_BufferingAudioFormatReader.h" -#include "codecs/juce_AiffAudioFormat.h" -#include "codecs/juce_CoreAudioFormat.h" -#include "codecs/juce_FlacAudioFormat.h" -#include "codecs/juce_LAMEEncoderAudioFormat.h" -#include "codecs/juce_MP3AudioFormat.h" -#include "codecs/juce_OggVorbisAudioFormat.h" -#include "codecs/juce_QuickTimeAudioFormat.h" -#include "codecs/juce_WavAudioFormat.h" -#include "codecs/juce_WindowsMediaAudioFormat.h" -#include "sampler/juce_Sampler.h" - -} - -#endif // JUCE_AUDIO_FORMATS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm b/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm deleted file mode 100755 index 9b32ae5..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/juce_audio_formats.mm +++ /dev/null @@ -1,25 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#include "juce_audio_formats.cpp" diff --git a/JuceLibraryCode/modules/juce_audio_formats/juce_module_info b/JuceLibraryCode/modules/juce_audio_formats/juce_module_info deleted file mode 100755 index 9b9adfb..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/juce_module_info +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "juce_audio_formats", - "name": "JUCE audio file format codecs", - "version": "3.1.1", - "description": "Classes for reading and writing various audio file formats.", - "website": "http://www.juce.com/juce", - "license": "GPL/Commercial", - - "dependencies": [ { "id": "juce_audio_basics", "version": "matching" } ], - - "include": "juce_audio_formats.h", - - "compile": [ { "file": "juce_audio_formats.cpp", "target": "! xcode" }, - { "file": "juce_audio_formats.mm", "target": "xcode" } ], - - "browse": [ "format/*", - "codecs/*", - "sampler/*" ], - - "OSXFrameworks": "CoreAudio CoreMIDI QuartzCore AudioToolbox", - "iOSFrameworks": "AudioToolbox QuartzCore" -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp b/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp deleted file mode 100755 index d2f1ace..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -SamplerSound::SamplerSound (const String& soundName, - AudioFormatReader& source, - const BigInteger& notes, - const int midiNoteForNormalPitch, - const double attackTimeSecs, - const double releaseTimeSecs, - const double maxSampleLengthSeconds) - : name (soundName), - midiNotes (notes), - midiRootNote (midiNoteForNormalPitch) -{ - sourceSampleRate = source.sampleRate; - - if (sourceSampleRate <= 0 || source.lengthInSamples <= 0) - { - length = 0; - attackSamples = 0; - releaseSamples = 0; - } - else - { - length = jmin ((int) source.lengthInSamples, - (int) (maxSampleLengthSeconds * sourceSampleRate)); - - data = new AudioSampleBuffer (jmin (2, (int) source.numChannels), length + 4); - - source.read (data, 0, length + 4, 0, true, true); - - attackSamples = roundToInt (attackTimeSecs * sourceSampleRate); - releaseSamples = roundToInt (releaseTimeSecs * sourceSampleRate); - } -} - -SamplerSound::~SamplerSound() -{ -} - -bool SamplerSound::appliesToNote (int midiNoteNumber) -{ - return midiNotes [midiNoteNumber]; -} - -bool SamplerSound::appliesToChannel (int /*midiChannel*/) -{ - return true; -} - -//============================================================================== -SamplerVoice::SamplerVoice() - : pitchRatio (0.0), - sourceSamplePosition (0.0), - lgain (0.0f), rgain (0.0f), - attackReleaseLevel (0), attackDelta (0), releaseDelta (0), - isInAttack (false), isInRelease (false) -{ -} - -SamplerVoice::~SamplerVoice() -{ -} - -bool SamplerVoice::canPlaySound (SynthesiserSound* sound) -{ - return dynamic_cast (sound) != nullptr; -} - -void SamplerVoice::startNote (const int midiNoteNumber, - const float velocity, - SynthesiserSound* s, - const int /*currentPitchWheelPosition*/) -{ - if (const SamplerSound* const sound = dynamic_cast (s)) - { - pitchRatio = pow (2.0, (midiNoteNumber - sound->midiRootNote) / 12.0) - * sound->sourceSampleRate / getSampleRate(); - - sourceSamplePosition = 0.0; - lgain = velocity; - rgain = velocity; - - isInAttack = (sound->attackSamples > 0); - isInRelease = false; - - if (isInAttack) - { - attackReleaseLevel = 0.0f; - attackDelta = (float) (pitchRatio / sound->attackSamples); - } - else - { - attackReleaseLevel = 1.0f; - attackDelta = 0.0f; - } - - if (sound->releaseSamples > 0) - releaseDelta = (float) (-pitchRatio / sound->releaseSamples); - else - releaseDelta = -1.0f; - } - else - { - jassertfalse; // this object can only play SamplerSounds! - } -} - -void SamplerVoice::stopNote (float /*velocity*/, bool allowTailOff) -{ - if (allowTailOff) - { - isInAttack = false; - isInRelease = true; - } - else - { - clearCurrentNote(); - } -} - -void SamplerVoice::pitchWheelMoved (const int /*newValue*/) -{ -} - -void SamplerVoice::controllerMoved (const int /*controllerNumber*/, - const int /*newValue*/) -{ -} - -//============================================================================== -void SamplerVoice::renderNextBlock (AudioSampleBuffer& outputBuffer, int startSample, int numSamples) -{ - if (const SamplerSound* const playingSound = static_cast (getCurrentlyPlayingSound().get())) - { - const float* const inL = playingSound->data->getReadPointer (0); - const float* const inR = playingSound->data->getNumChannels() > 1 - ? playingSound->data->getReadPointer (1) : nullptr; - - float* outL = outputBuffer.getWritePointer (0, startSample); - float* outR = outputBuffer.getNumChannels() > 1 ? outputBuffer.getWritePointer (1, startSample) : nullptr; - - while (--numSamples >= 0) - { - const int pos = (int) sourceSamplePosition; - const float alpha = (float) (sourceSamplePosition - pos); - const float invAlpha = 1.0f - alpha; - - // just using a very simple linear interpolation here.. - float l = (inL [pos] * invAlpha + inL [pos + 1] * alpha); - float r = (inR != nullptr) ? (inR [pos] * invAlpha + inR [pos + 1] * alpha) - : l; - - l *= lgain; - r *= rgain; - - if (isInAttack) - { - l *= attackReleaseLevel; - r *= attackReleaseLevel; - - attackReleaseLevel += attackDelta; - - if (attackReleaseLevel >= 1.0f) - { - attackReleaseLevel = 1.0f; - isInAttack = false; - } - } - else if (isInRelease) - { - l *= attackReleaseLevel; - r *= attackReleaseLevel; - - attackReleaseLevel += releaseDelta; - - if (attackReleaseLevel <= 0.0f) - { - stopNote (0.0f, false); - break; - } - } - - if (outR != nullptr) - { - *outL++ += l; - *outR++ += r; - } - else - { - *outL++ += (l + r) * 0.5f; - } - - sourceSamplePosition += pitchRatio; - - if (sourceSamplePosition > playingSound->length) - { - stopNote (0.0f, false); - break; - } - } - } -} diff --git a/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h b/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h deleted file mode 100755 index f801bf2..0000000 --- a/JuceLibraryCode/modules/juce_audio_formats/sampler/juce_Sampler.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_SAMPLER_H_INCLUDED -#define JUCE_SAMPLER_H_INCLUDED - - -//============================================================================== -/** - A subclass of SynthesiserSound that represents a sampled audio clip. - - This is a pretty basic sampler, and just attempts to load the whole audio stream - into memory. - - To use it, create a Synthesiser, add some SamplerVoice objects to it, then - give it some SampledSound objects to play. - - @see SamplerVoice, Synthesiser, SynthesiserSound -*/ -class JUCE_API SamplerSound : public SynthesiserSound -{ -public: - //============================================================================== - /** Creates a sampled sound from an audio reader. - - This will attempt to load the audio from the source into memory and store - it in this object. - - @param name a name for the sample - @param source the audio to load. This object can be safely deleted by the - caller after this constructor returns - @param midiNotes the set of midi keys that this sound should be played on. This - is used by the SynthesiserSound::appliesToNote() method - @param midiNoteForNormalPitch the midi note at which the sample should be played - with its natural rate. All other notes will be pitched - up or down relative to this one - @param attackTimeSecs the attack (fade-in) time, in seconds - @param releaseTimeSecs the decay (fade-out) time, in seconds - @param maxSampleLengthSeconds a maximum length of audio to read from the audio - source, in seconds - */ - SamplerSound (const String& name, - AudioFormatReader& source, - const BigInteger& midiNotes, - int midiNoteForNormalPitch, - double attackTimeSecs, - double releaseTimeSecs, - double maxSampleLengthSeconds); - - /** Destructor. */ - ~SamplerSound(); - - //============================================================================== - /** Returns the sample's name */ - const String& getName() const noexcept { return name; } - - /** Returns the audio sample data. - This could return nullptr if there was a problem loading the data. - */ - AudioSampleBuffer* getAudioData() const noexcept { return data; } - - - //============================================================================== - bool appliesToNote (int midiNoteNumber) override; - bool appliesToChannel (int midiChannel) override; - - -private: - //============================================================================== - friend class SamplerVoice; - - String name; - ScopedPointer data; - double sourceSampleRate; - BigInteger midiNotes; - int length, attackSamples, releaseSamples; - int midiRootNote; - - JUCE_LEAK_DETECTOR (SamplerSound) -}; - - -//============================================================================== -/** - A subclass of SynthesiserVoice that can play a SamplerSound. - - To use it, create a Synthesiser, add some SamplerVoice objects to it, then - give it some SampledSound objects to play. - - @see SamplerSound, Synthesiser, SynthesiserVoice -*/ -class JUCE_API SamplerVoice : public SynthesiserVoice -{ -public: - //============================================================================== - /** Creates a SamplerVoice. */ - SamplerVoice(); - - /** Destructor. */ - ~SamplerVoice(); - - //============================================================================== - bool canPlaySound (SynthesiserSound*) override; - - void startNote (int midiNoteNumber, float velocity, SynthesiserSound*, int pitchWheel) override; - void stopNote (float velocity, bool allowTailOff) override; - - void pitchWheelMoved (int newValue); - void controllerMoved (int controllerNumber, int newValue) override; - - void renderNextBlock (AudioSampleBuffer&, int startSample, int numSamples) override; - - -private: - //============================================================================== - double pitchRatio; - double sourceSamplePosition; - float lgain, rgain, attackReleaseLevel, attackDelta, releaseDelta; - bool isInAttack, isInRelease; - - JUCE_LEAK_DETECTOR (SamplerVoice) -}; - - -#endif // JUCE_SAMPLER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp deleted file mode 100755 index 6a3d620..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp +++ /dev/null @@ -1,1093 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_AAX && (JUCE_INCLUDED_AAX_IN_MM || defined (_WIN32) || defined (_WIN64)) - -#ifdef _MSC_VER - #include -#else - #include -#endif - -#include "../utility/juce_IncludeModuleHeaders.h" -#undef Component - -#ifdef __clang__ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wnon-virtual-dtor" - #pragma clang diagnostic ignored "-Wsign-conversion" -#endif - -#include "AAX_Exports.cpp" -#include "AAX_ICollection.h" -#include "AAX_IComponentDescriptor.h" -#include "AAX_IEffectDescriptor.h" -#include "AAX_IPropertyMap.h" -#include "AAX_CEffectParameters.h" -#include "AAX_Errors.h" -#include "AAX_CBinaryTaperDelegate.h" -#include "AAX_CBinaryDisplayDelegate.h" -#include "AAX_CLinearTaperDelegate.h" -#include "AAX_CNumberDisplayDelegate.h" -#include "AAX_CEffectGUI.h" -#include "AAX_IViewContainer.h" -#include "AAX_ITransport.h" -#include "AAX_IMIDINode.h" -#include "AAX_UtilsNative.h" -#include "AAX_Enums.h" - -#ifdef __clang__ - #pragma clang diagnostic pop -#endif - -#if JUCE_WINDOWS - #ifndef JucePlugin_AAXLibs_path - #error "You need to define the JucePlugin_AAXLibs_path macro. (This is best done via the introjucer)" - #endif - - #if JUCE_64BIT - #define JUCE_AAX_LIB "AAXLibrary_x64" - #else - #define JUCE_AAX_LIB "AAXLibrary" - #endif - - #if JUCE_DEBUG - #define JUCE_AAX_LIB_PATH "\\Debug\\" - #define JUCE_AAX_LIB_SUFFIX "_D" - #else - #define JUCE_AAX_LIB_PATH "\\Release\\" - #define JUCE_AAX_LIB_SUFFIX "" - #endif - - #pragma comment(lib, JucePlugin_AAXLibs_path JUCE_AAX_LIB_PATH JUCE_AAX_LIB JUCE_AAX_LIB_SUFFIX ".lib") -#endif - -using juce::Component; - -const int32_t juceChunkType = 'juce'; - -//============================================================================== -struct AAXClasses -{ - static void check (AAX_Result result) - { - jassert (result == AAX_SUCCESS); (void) result; - } - - static int getParamIndexFromID (AAX_CParamID paramID) noexcept - { - return atoi (paramID); - } - - static bool isBypassParam (AAX_CParamID paramID) noexcept - { - return AAX::IsParameterIDEqual (paramID, cDefaultMasterBypassID) != 0; - } - - static AAX_EStemFormat getFormatForChans (const int numChans) noexcept - { - switch (numChans) - { - case 0: return AAX_eStemFormat_None; - case 1: return AAX_eStemFormat_Mono; - case 2: return AAX_eStemFormat_Stereo; - case 3: return AAX_eStemFormat_LCR; - case 4: return AAX_eStemFormat_Quad; - case 5: return AAX_eStemFormat_5_0; - case 6: return AAX_eStemFormat_5_1; - case 7: return AAX_eStemFormat_7_0_DTS; - case 8: return AAX_eStemFormat_7_1_DTS; - default: jassertfalse; break; - } - - return AAX_eStemFormat_None; - } - - static int getNumChannelsForStemFormat (AAX_EStemFormat format) noexcept - { - switch (format) - { - case AAX_eStemFormat_None: return 0; - case AAX_eStemFormat_Mono: return 1; - case AAX_eStemFormat_Stereo: return 2; - case AAX_eStemFormat_LCR: return 3; - case AAX_eStemFormat_LCRS: - case AAX_eStemFormat_Quad: return 4; - case AAX_eStemFormat_5_0: return 5; - case AAX_eStemFormat_5_1: - case AAX_eStemFormat_6_0: return 6; - case AAX_eStemFormat_6_1: - case AAX_eStemFormat_7_0_SDDS: - case AAX_eStemFormat_7_0_DTS: return 7; - case AAX_eStemFormat_7_1_SDDS: - case AAX_eStemFormat_7_1_DTS: return 8; - default: jassertfalse; break; - } - - return 0; - } - - static const char* getSpeakerArrangementString (AAX_EStemFormat format) noexcept - { - switch (format) - { - case AAX_eStemFormat_Mono: return "M"; - case AAX_eStemFormat_Stereo: return "L R"; - case AAX_eStemFormat_LCR: return "L C R"; - case AAX_eStemFormat_LCRS: return "L C R S"; - case AAX_eStemFormat_Quad: return "L R Ls Rs"; - case AAX_eStemFormat_5_0: return "L C R Ls Rs"; - case AAX_eStemFormat_5_1: return "L C R Ls Rs LFE"; - case AAX_eStemFormat_6_0: return "L C R Ls Cs Rs"; - case AAX_eStemFormat_6_1: return "L C R Ls Cs Rs LFE"; - case AAX_eStemFormat_7_0_SDDS: return "L Lc C Rc R Ls Rs"; - case AAX_eStemFormat_7_1_SDDS: return "L Lc C Rc R Ls Rs LFE"; - case AAX_eStemFormat_7_0_DTS: return "L C R Lss Rss Lsr Rsr"; - case AAX_eStemFormat_7_1_DTS: return "L C R Lss Rss Lsr Rsr LFE"; - default: break; - } - - return nullptr; - } - - static Colour getColourFromHighlightEnum (AAX_EHighlightColor colour) noexcept - { - switch (colour) - { - case AAX_eHighlightColor_Red: return Colours::red; - case AAX_eHighlightColor_Blue: return Colours::blue; - case AAX_eHighlightColor_Green: return Colours::green; - case AAX_eHighlightColor_Yellow: return Colours::yellow; - default: jassertfalse; break; - } - - return Colours::black; - } - - //============================================================================== - class JuceAAX_Processor; - - struct PluginInstanceInfo - { - PluginInstanceInfo (JuceAAX_Processor& p) : parameters (p) {} - - JuceAAX_Processor& parameters; - - JUCE_DECLARE_NON_COPYABLE (PluginInstanceInfo) - }; - - //============================================================================== - struct JUCEAlgorithmContext - { - float** inputChannels; - float** outputChannels; - int32_t* bufferSize; - int32_t* bypass; - - #if JucePlugin_WantsMidiInput - AAX_IMIDINode* midiNodeIn; - #endif - - #if JucePlugin_ProducesMidiOutput - AAX_IMIDINode* midiNodeOut; - #endif - - PluginInstanceInfo* pluginInstance; - int32_t* isPrepared; - }; - - struct JUCEAlgorithmIDs - { - enum - { - inputChannels = AAX_FIELD_INDEX (JUCEAlgorithmContext, inputChannels), - outputChannels = AAX_FIELD_INDEX (JUCEAlgorithmContext, outputChannels), - bufferSize = AAX_FIELD_INDEX (JUCEAlgorithmContext, bufferSize), - bypass = AAX_FIELD_INDEX (JUCEAlgorithmContext, bypass), - - #if JucePlugin_WantsMidiInput - midiNodeIn = AAX_FIELD_INDEX (JUCEAlgorithmContext, midiNodeIn), - #endif - - #if JucePlugin_ProducesMidiOutput - midiNodeOut = AAX_FIELD_INDEX (JUCEAlgorithmContext, midiNodeOut), - #endif - - pluginInstance = AAX_FIELD_INDEX (JUCEAlgorithmContext, pluginInstance), - preparedFlag = AAX_FIELD_INDEX (JUCEAlgorithmContext, isPrepared) - }; - }; - - #if JucePlugin_WantsMidiInput - static AAX_IMIDINode* getMidiNodeIn (const JUCEAlgorithmContext& c) noexcept { return c.midiNodeIn; } - #else - static AAX_IMIDINode* getMidiNodeIn (const JUCEAlgorithmContext&) noexcept { return nullptr; } - #endif - - #if JucePlugin_ProducesMidiOutput - AAX_IMIDINode* midiNodeOut; - static AAX_IMIDINode* getMidiNodeOut (const JUCEAlgorithmContext& c) noexcept { return c.midiNodeOut; } - #else - static AAX_IMIDINode* getMidiNodeOut (const JUCEAlgorithmContext&) noexcept { return nullptr; } - #endif - - //============================================================================== - class JuceAAX_GUI : public AAX_CEffectGUI - { - public: - JuceAAX_GUI() {} - ~JuceAAX_GUI() { DeleteViewContainer(); } - - static AAX_IEffectGUI* AAX_CALLBACK Create() { return new JuceAAX_GUI(); } - - void CreateViewContents() override - { - if (component == nullptr) - { - if (JuceAAX_Processor* params = dynamic_cast (GetEffectParameters())) - component = new ContentWrapperComponent (*this, params->getPluginInstance()); - else - jassertfalse; - } - } - - void CreateViewContainer() override - { - CreateViewContents(); - - if (void* nativeViewToAttachTo = GetViewContainerPtr()) - { - #if JUCE_MAC - if (GetViewContainerType() == AAX_eViewContainer_Type_NSView) - #else - if (GetViewContainerType() == AAX_eViewContainer_Type_HWND) - #endif - { - component->setVisible (true); - component->addToDesktop (0, nativeViewToAttachTo); - } - } - } - - void DeleteViewContainer() override - { - if (component != nullptr) - { - JUCE_AUTORELEASEPOOL - { - component->removeFromDesktop(); - component = nullptr; - } - } - } - - AAX_Result GetViewSize (AAX_Point* viewSize) const override - { - if (component != nullptr) - { - viewSize->horz = (float) component->getWidth(); - viewSize->vert = (float) component->getHeight(); - return AAX_SUCCESS; - } - - return AAX_ERROR_NULL_OBJECT; - } - - AAX_Result ParameterUpdated (AAX_CParamID) override - { - return AAX_SUCCESS; - } - - AAX_Result SetControlHighlightInfo (AAX_CParamID paramID, AAX_CBoolean isHighlighted, AAX_EHighlightColor colour) override - { - if (component != nullptr && component->pluginEditor != nullptr) - { - AudioProcessorEditor::ParameterControlHighlightInfo info; - info.parameterIndex = getParamIndexFromID (paramID); - info.isHighlighted = isHighlighted; - info.suggestedColour = getColourFromHighlightEnum (colour); - - component->pluginEditor->setControlHighlight (info); - return AAX_SUCCESS; - } - - return AAX_ERROR_NULL_OBJECT; - } - - private: - struct ContentWrapperComponent : public juce::Component - { - ContentWrapperComponent (JuceAAX_GUI& gui, AudioProcessor& plugin) - : owner (gui) - { - setOpaque (true); - setBroughtToFrontOnMouseClick (true); - - addAndMakeVisible (pluginEditor = plugin.createEditorIfNeeded()); - - if (pluginEditor != nullptr) - { - setBounds (pluginEditor->getLocalBounds()); - pluginEditor->addMouseListener (this, true); - } - } - - ~ContentWrapperComponent() - { - if (pluginEditor != nullptr) - { - PopupMenu::dismissAllActiveMenus(); - pluginEditor->removeMouseListener (this); - pluginEditor->processor.editorBeingDeleted (pluginEditor); - } - } - - void paint (Graphics& g) override - { - g.fillAll (Colours::black); - } - - template - void callMouseMethod (const MouseEvent& e, MethodType method) - { - if (AAX_IViewContainer* vc = owner.GetViewContainer()) - { - const int parameterIndex = pluginEditor->getControlParameterIndex (*e.eventComponent); - - if (parameterIndex >= 0) - { - uint32_t mods = 0; - vc->GetModifiers (&mods); - (vc->*method) (IndexAsParamID (parameterIndex), mods); - } - } - } - - void mouseDown (const MouseEvent& e) override { callMouseMethod (e, &AAX_IViewContainer::HandleParameterMouseDown); } - void mouseUp (const MouseEvent& e) override { callMouseMethod (e, &AAX_IViewContainer::HandleParameterMouseUp); } - void mouseDrag (const MouseEvent& e) override { callMouseMethod (e, &AAX_IViewContainer::HandleParameterMouseDrag); } - - void childBoundsChanged (Component*) override - { - if (pluginEditor != nullptr) - { - const int w = pluginEditor->getWidth(); - const int h = pluginEditor->getHeight(); - setSize (w, h); - - AAX_Point newSize ((float) h, (float) w); - owner.GetViewContainer()->SetViewSize (newSize); - } - } - - ScopedPointer pluginEditor; - JuceAAX_GUI& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContentWrapperComponent) - }; - - ScopedPointer component; - - ScopedJuceInitialiser_GUI libraryInitialiser; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAAX_GUI) - }; - - //============================================================================== - class JuceAAX_Processor : public AAX_CEffectParameters, - public juce::AudioPlayHead, - public AudioProcessorListener - { - public: - JuceAAX_Processor() : sampleRate (0), lastBufferSize (1024) - { - pluginInstance = createPluginFilterOfType (AudioProcessor::wrapperType_AAX); - pluginInstance->setPlayHead (this); - pluginInstance->addListener (this); - - AAX_CEffectParameters::GetNumberOfChunks (&juceChunkIndex); - } - - static AAX_CEffectParameters* AAX_CALLBACK Create() { return new JuceAAX_Processor(); } - - AAX_Result EffectInit() override - { - check (Controller()->GetSampleRate (&sampleRate)); - - preparePlugin(); - addBypassParameter(); - addAudioProcessorParameters(); - - return AAX_SUCCESS; - } - - AAX_Result GetNumberOfChunks (int32_t* numChunks) const override - { - // The juceChunk is the last chunk. - *numChunks = juceChunkIndex + 1; - return AAX_SUCCESS; - } - - AAX_Result GetChunkIDFromIndex (int32_t index, AAX_CTypeID* chunkID) const override - { - if (index != juceChunkIndex) - return AAX_CEffectParameters::GetChunkIDFromIndex (index, chunkID); - - *chunkID = juceChunkType; - return AAX_SUCCESS; - } - - AAX_Result GetChunkSize (AAX_CTypeID chunkID, uint32_t* oSize) const override - { - if (chunkID != juceChunkType) - return AAX_CEffectParameters::GetChunkSize (chunkID, oSize); - - tempFilterData.reset(); - pluginInstance->getStateInformation (tempFilterData); - *oSize = (uint32_t) tempFilterData.getSize(); - return AAX_SUCCESS; - } - - AAX_Result GetChunk (AAX_CTypeID chunkID, AAX_SPlugInChunk* oChunk) const override - { - if (chunkID != juceChunkType) - return AAX_CEffectParameters::GetChunk (chunkID, oChunk); - - if (tempFilterData.getSize() == 0) - pluginInstance->getStateInformation (tempFilterData); - - oChunk->fSize = (int32_t) tempFilterData.getSize(); - tempFilterData.copyTo (oChunk->fData, 0, tempFilterData.getSize()); - tempFilterData.reset(); - - return AAX_SUCCESS; - } - - AAX_Result SetChunk (AAX_CTypeID chunkID, const AAX_SPlugInChunk* chunk) override - { - if (chunkID != juceChunkType) - return AAX_CEffectParameters::SetChunk (chunkID, chunk); - - pluginInstance->setStateInformation ((void*) chunk->fData, chunk->fSize); - - // Notify Pro Tools that the parameters were updated. - // Without it a bug happens in these circumstances: - // * A preset is saved with the RTAS version of the plugin (".tfx" preset format). - // * The preset is loaded in PT 10 using the AAX version. - // * The session is then saved, and closed. - // * The saved session is loaded, but acting as if the preset was never loaded. - const int numParameters = pluginInstance->getNumParameters(); - - for (int i = 0; i < numParameters; ++i) - SetParameterNormalizedValue (IndexAsParamID (i), (double) pluginInstance->getParameter(i)); - - return AAX_SUCCESS; - } - - AAX_Result ResetFieldData (AAX_CFieldIndex fieldIndex, void* data, uint32_t dataSize) const override - { - switch (fieldIndex) - { - case JUCEAlgorithmIDs::pluginInstance: - { - const size_t numObjects = dataSize / sizeof (PluginInstanceInfo); - PluginInstanceInfo* const objects = static_cast (data); - - jassert (numObjects == 1); // not sure how to handle more than one.. - - for (size_t i = 0; i < numObjects; ++i) - new (objects + i) PluginInstanceInfo (const_cast (*this)); - - break; - } - - case JUCEAlgorithmIDs::preparedFlag: - { - const_cast(this)->preparePlugin(); - - const size_t numObjects = dataSize / sizeof (uint32_t); - uint32_t* const objects = static_cast (data); - - for (size_t i = 0; i < numObjects; ++i) - new (objects + i) uint32_t (1); - - break; - } - } - - return AAX_SUCCESS; - } - - AAX_Result UpdateParameterNormalizedValue (AAX_CParamID paramID, double value, AAX_EUpdateSource source) override - { - AAX_Result result = AAX_CEffectParameters::UpdateParameterNormalizedValue (paramID, value, source); - - if (! isBypassParam (paramID)) - pluginInstance->setParameter (getParamIndexFromID (paramID), (float) value); - - return result; - } - - AAX_Result GetParameterStringFromValue (AAX_CParamID paramID, double value, AAX_IString* result, int32_t maxLen) const override - { - if (isBypassParam (paramID)) - result->Set (value == 0 ? "Off" - : (maxLen >= 8 ? "Bypassed" : "Byp")); - else - result->Set (pluginInstance->getParameterText (getParamIndexFromID (paramID), maxLen).toRawUTF8()); - - return AAX_SUCCESS; - } - - AAX_Result GetParameterNumberofSteps (AAX_CParamID paramID, int32_t* result) const - { - if (isBypassParam (paramID)) - *result = 2; - else - *result = pluginInstance->getParameterNumSteps (getParamIndexFromID (paramID)); - - return AAX_SUCCESS; - } - - AAX_Result GetParameterNormalizedValue (AAX_CParamID paramID, double* result) const override - { - if (isBypassParam (paramID)) - return AAX_CEffectParameters::GetParameterNormalizedValue (paramID, result); - - *result = pluginInstance->getParameter (getParamIndexFromID (paramID)); - return AAX_SUCCESS; - } - - AAX_Result SetParameterNormalizedValue (AAX_CParamID paramID, double newValue) override - { - if (isBypassParam (paramID)) - return AAX_CEffectParameters::SetParameterNormalizedValue (paramID, newValue); - - if (AAX_IParameter* p = const_cast (mParameterManager.GetParameterByID (paramID))) - p->SetValueWithFloat ((float) newValue); - - pluginInstance->setParameter (getParamIndexFromID (paramID), (float) newValue); - return AAX_SUCCESS; - } - - AAX_Result SetParameterNormalizedRelative (AAX_CParamID paramID, double newDeltaValue) override - { - if (isBypassParam (paramID)) - return AAX_CEffectParameters::SetParameterNormalizedRelative (paramID, newDeltaValue); - - const int paramIndex = getParamIndexFromID (paramID); - const float newValue = pluginInstance->getParameter (paramIndex) + (float) newDeltaValue; - pluginInstance->setParameter (paramIndex, jlimit (0.0f, 1.0f, newValue)); - - if (AAX_IParameter* p = const_cast (mParameterManager.GetParameterByID (paramID))) - p->SetValueWithFloat (newValue); - - return AAX_SUCCESS; - } - - AAX_Result GetParameterNameOfLength (AAX_CParamID paramID, AAX_IString* result, int32_t maxLen) const override - { - if (isBypassParam (paramID)) - result->Set (maxLen >= 13 ? "Master Bypass" - : (maxLen >= 8 ? "Mast Byp" - : (maxLen >= 6 ? "MstByp" : "MByp"))); - else - result->Set (pluginInstance->getParameterName (getParamIndexFromID (paramID), maxLen).toRawUTF8()); - - return AAX_SUCCESS; - } - - AAX_Result GetParameterName (AAX_CParamID paramID, AAX_IString* result) const override - { - if (isBypassParam (paramID)) - result->Set ("Master Bypass"); - else - result->Set (pluginInstance->getParameterName (getParamIndexFromID (paramID), 31).toRawUTF8()); - - return AAX_SUCCESS; - } - - AAX_Result GetParameterDefaultNormalizedValue (AAX_CParamID paramID, double* result) const override - { - if (! isBypassParam (paramID)) - { - *result = (double) pluginInstance->getParameterDefaultValue (getParamIndexFromID (paramID)); - - jassert (*result >= 0 && *result <= 1.0f); - } - - return AAX_SUCCESS; - } - - AudioProcessor& getPluginInstance() const noexcept { return *pluginInstance; } - - bool getCurrentPosition (juce::AudioPlayHead::CurrentPositionInfo& info) override - { - const AAX_ITransport& transport = *Transport(); - - info.bpm = 0.0; - check (transport.GetCurrentTempo (&info.bpm)); - - int32_t num = 4, den = 4; - transport.GetCurrentMeter (&num, &den); - info.timeSigNumerator = (int) num; - info.timeSigDenominator = (int) den; - - info.timeInSamples = 0; - - if (transport.IsTransportPlaying (&info.isPlaying) != AAX_SUCCESS) - info.isPlaying = false; - - if (info.isPlaying - || transport.GetTimelineSelectionStartPosition (&info.timeInSamples) != AAX_SUCCESS) - check (transport.GetCurrentNativeSampleLocation (&info.timeInSamples)); - - info.timeInSeconds = info.timeInSamples / sampleRate; - - int64_t ticks = 0; - check (transport.GetCurrentTickPosition (&ticks)); - info.ppqPosition = ticks / 960000.0; - - info.isLooping = false; - int64_t loopStartTick = 0, loopEndTick = 0; - check (transport.GetCurrentLoopPosition (&info.isLooping, &loopStartTick, &loopEndTick)); - info.ppqLoopStart = loopStartTick / 960000.0; - info.ppqLoopEnd = loopEndTick / 960000.0; - - info.editOriginTime = 0; - info.frameRate = AudioPlayHead::fpsUnknown; - - AAX_EFrameRate frameRate; - int32_t offset; - - if (transport.GetTimeCodeInfo (&frameRate, &offset) == AAX_SUCCESS) - { - double framesPerSec = 24.0; - - switch (frameRate) - { - case AAX_eFrameRate_Undeclared: break; - case AAX_eFrameRate_24Frame: info.frameRate = AudioPlayHead::fps24; break; - case AAX_eFrameRate_25Frame: info.frameRate = AudioPlayHead::fps25; framesPerSec = 25.0; break; - case AAX_eFrameRate_2997NonDrop: info.frameRate = AudioPlayHead::fps2997; framesPerSec = 29.97002997; break; - case AAX_eFrameRate_2997DropFrame: info.frameRate = AudioPlayHead::fps2997drop; framesPerSec = 29.97002997; break; - case AAX_eFrameRate_30NonDrop: info.frameRate = AudioPlayHead::fps30; framesPerSec = 30.0; break; - case AAX_eFrameRate_30DropFrame: info.frameRate = AudioPlayHead::fps30drop; framesPerSec = 30.0; break; - case AAX_eFrameRate_23976: info.frameRate = AudioPlayHead::fps24; framesPerSec = 23.976; break; - default: break; - } - - info.editOriginTime = offset / framesPerSec; - } - - // No way to get these: (?) - info.isRecording = false; - info.ppqPositionOfLastBarStart = 0; - - return true; - } - - void audioProcessorParameterChanged (AudioProcessor* /*processor*/, int parameterIndex, float newValue) override - { - SetParameterNormalizedValue (IndexAsParamID (parameterIndex), (double) newValue); - } - - void audioProcessorChanged (AudioProcessor* processor) override - { - ++mNumPlugInChanges; - check (Controller()->SetSignalLatency (processor->getLatencySamples())); - } - - void audioProcessorParameterChangeGestureBegin (AudioProcessor* /*processor*/, int parameterIndex) override - { - TouchParameter (IndexAsParamID (parameterIndex)); - } - - void audioProcessorParameterChangeGestureEnd (AudioProcessor* /*processor*/, int parameterIndex) override - { - ReleaseParameter (IndexAsParamID (parameterIndex)); - } - - AAX_Result NotificationReceived (AAX_CTypeID type, const void* data, uint32_t size) override - { - if (type == AAX_eNotificationEvent_EnteringOfflineMode) pluginInstance->setNonRealtime (true); - if (type == AAX_eNotificationEvent_ExitingOfflineMode) pluginInstance->setNonRealtime (false); - - return AAX_CEffectParameters::NotificationReceived (type, data, size); - } - - void process (const float* const* inputs, float* const* outputs, const int bufferSize, - const bool bypass, AAX_IMIDINode* midiNodeIn, AAX_IMIDINode* midiNodesOut) - { - const int numIns = pluginInstance->getNumInputChannels(); - const int numOuts = pluginInstance->getNumOutputChannels(); - - if (numOuts >= numIns) - { - for (int i = 0; i < numIns; ++i) - memcpy (outputs[i], inputs[i], (size_t) bufferSize * sizeof (float)); - - process (outputs, numOuts, bufferSize, bypass, midiNodeIn, midiNodesOut); - } - else - { - if (channelList.size() <= numIns) - channelList.insertMultiple (-1, nullptr, 1 + numIns - channelList.size()); - - float** channels = channelList.getRawDataPointer(); - - for (int i = 0; i < numOuts; ++i) - { - memcpy (outputs[i], inputs[i], (size_t) bufferSize * sizeof (float)); - channels[i] = outputs[i]; - } - - for (int i = numOuts; i < numIns; ++i) - channels[i] = const_cast (inputs[i]); - - process (channels, numIns, bufferSize, bypass, midiNodeIn, midiNodesOut); - } - } - - private: - void process (float* const* channels, const int numChans, const int bufferSize, - const bool bypass, AAX_IMIDINode* midiNodeIn, AAX_IMIDINode* midiNodesOut) - { - AudioSampleBuffer buffer (channels, numChans, bufferSize); - - midiBuffer.clear(); - - (void) midiNodeIn; - (void) midiNodesOut; - - #if JucePlugin_WantsMidiInput - { - AAX_CMidiStream* const midiStream = midiNodeIn->GetNodeBuffer(); - const uint32_t numMidiEvents = midiStream->mBufferSize; - - for (uint32_t i = 0; i < numMidiEvents; ++i) - { - const AAX_CMidiPacket& m = midiStream->mBuffer[i]; - - jassert ((int) m.mTimestamp < bufferSize); - midiBuffer.addEvent (m.mData, (int) m.mLength, - jlimit (0, (int) bufferSize - 1, (int) m.mTimestamp)); - } - } - #endif - - { - if (lastBufferSize != bufferSize) - { - lastBufferSize = bufferSize; - pluginInstance->setPlayConfigDetails (pluginInstance->getNumInputChannels(), - pluginInstance->getNumOutputChannels(), - sampleRate, bufferSize); - pluginInstance->prepareToPlay (sampleRate, bufferSize); - } - - const ScopedLock sl (pluginInstance->getCallbackLock()); - - if (bypass) - pluginInstance->processBlockBypassed (buffer, midiBuffer); - else - pluginInstance->processBlock (buffer, midiBuffer); - } - - #if JucePlugin_ProducesMidiOutput - { - const juce::uint8* midiEventData; - int midiEventSize, midiEventPosition; - MidiBuffer::Iterator i (midiBuffer); - - AAX_CMidiPacket packet; - packet.mIsImmediate = false; - - while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) - { - jassert (isPositiveAndBelow (midiEventPosition, bufferSize)); - - if (midiEventSize <= 4) - { - packet.mTimestamp = (uint32_t) midiEventPosition; - packet.mLength = (uint32_t) midiEventSize; - memcpy (packet.mData, midiEventData, (size_t) midiEventSize); - - check (midiNodesOut->PostMIDIPacket (&packet)); - } - } - } - #else - (void) midiNodesOut; - #endif - } - - void addBypassParameter() - { - AAX_IParameter* masterBypass = new AAX_CParameter (cDefaultMasterBypassID, - AAX_CString ("Master Bypass"), - false, - AAX_CBinaryTaperDelegate(), - AAX_CBinaryDisplayDelegate ("bypass", "on"), - true); - masterBypass->SetNumberOfSteps (2); - masterBypass->SetType (AAX_eParameterType_Discrete); - mParameterManager.AddParameter (masterBypass); - mPacketDispatcher.RegisterPacket (cDefaultMasterBypassID, JUCEAlgorithmIDs::bypass); - } - - void addAudioProcessorParameters() - { - AudioProcessor& audioProcessor = getPluginInstance(); - const int numParameters = audioProcessor.getNumParameters(); - - for (int parameterIndex = 0; parameterIndex < numParameters; ++parameterIndex) - { - AAX_IParameter* parameter - = new AAX_CParameter (IndexAsParamID (parameterIndex), - audioProcessor.getParameterName (parameterIndex, 31).toRawUTF8(), - audioProcessor.getParameterDefaultValue (parameterIndex), - AAX_CLinearTaperDelegate(), - AAX_CNumberDisplayDelegate(), - audioProcessor.isParameterAutomatable (parameterIndex)); - - parameter->AddShortenedName (audioProcessor.getParameterName (parameterIndex, 4).toRawUTF8()); - - const int parameterNumSteps = audioProcessor.getParameterNumSteps (parameterIndex); - parameter->SetNumberOfSteps ((uint32_t) parameterNumSteps); - parameter->SetType (parameterNumSteps > 1000 ? AAX_eParameterType_Continuous - : AAX_eParameterType_Discrete); - - parameter->SetOrientation (audioProcessor.isParameterOrientationInverted (parameterIndex) - ? (AAX_eParameterOrientation_RightMinLeftMax | AAX_eParameterOrientation_TopMinBottomMax - | AAX_eParameterOrientation_RotarySingleDotMode | AAX_eParameterOrientation_RotaryRightMinLeftMax) - : (AAX_eParameterOrientation_LeftMinRightMax | AAX_eParameterOrientation_BottomMinTopMax - | AAX_eParameterOrientation_RotarySingleDotMode | AAX_eParameterOrientation_RotaryLeftMinRightMax)); - - mParameterManager.AddParameter (parameter); - } - } - - void preparePlugin() - { - AAX_EStemFormat inputStemFormat = AAX_eStemFormat_None; - check (Controller()->GetInputStemFormat (&inputStemFormat)); - const int numberOfInputChannels = getNumChannelsForStemFormat (inputStemFormat); - - AAX_EStemFormat outputStemFormat = AAX_eStemFormat_None; - check (Controller()->GetOutputStemFormat (&outputStemFormat)); - const int numberOfOutputChannels = getNumChannelsForStemFormat (outputStemFormat); - - AudioProcessor& audioProcessor = getPluginInstance(); - - audioProcessor.setSpeakerArrangement (getSpeakerArrangementString (inputStemFormat), - getSpeakerArrangementString (outputStemFormat)); - - audioProcessor.setPlayConfigDetails (numberOfInputChannels, numberOfOutputChannels, sampleRate, lastBufferSize); - audioProcessor.prepareToPlay (sampleRate, lastBufferSize); - - check (Controller()->SetSignalLatency (audioProcessor.getLatencySamples())); - } - - ScopedJuceInitialiser_GUI libraryInitialiser; - - ScopedPointer pluginInstance; - MidiBuffer midiBuffer; - Array channelList; - int32_t juceChunkIndex; - AAX_CSampleRate sampleRate; - int lastBufferSize; - - // tempFilterData is initialized in GetChunkSize. - // To avoid generating it again in GetChunk, we keep it as a member. - mutable juce::MemoryBlock tempFilterData; - - JUCE_DECLARE_NON_COPYABLE (JuceAAX_Processor) - }; - - //============================================================================== - struct IndexAsParamID - { - inline explicit IndexAsParamID (int i) noexcept : index (i) {} - - operator AAX_CParamID() noexcept - { - jassert (index >= 0); - - char* t = name + sizeof (name); - *--t = 0; - int v = index; - - do - { - *--t = (char) ('0' + (v % 10)); - v /= 10; - - } while (v > 0); - - return static_cast (t); - } - - private: - int index; - char name[32]; - - JUCE_DECLARE_NON_COPYABLE (IndexAsParamID) - }; - - //============================================================================== - static void AAX_CALLBACK algorithmProcessCallback (JUCEAlgorithmContext* const instancesBegin[], - const void* const instancesEnd) - { - for (JUCEAlgorithmContext* const* iter = instancesBegin; iter < instancesEnd; ++iter) - { - const JUCEAlgorithmContext& i = **iter; - - i.pluginInstance->parameters.process (i.inputChannels, i.outputChannels, - *(i.bufferSize), *(i.bypass) != 0, - getMidiNodeIn(i), getMidiNodeOut(i)); - } - } - - //============================================================================== - static void createDescriptor (AAX_IComponentDescriptor& desc, int channelConfigIndex, - int numInputs, int numOutputs) - { - check (desc.AddAudioIn (JUCEAlgorithmIDs::inputChannels)); - check (desc.AddAudioOut (JUCEAlgorithmIDs::outputChannels)); - check (desc.AddAudioBufferLength (JUCEAlgorithmIDs::bufferSize)); - check (desc.AddDataInPort (JUCEAlgorithmIDs::bypass, sizeof (int32_t))); - - #if JucePlugin_WantsMidiInput - check (desc.AddMIDINode (JUCEAlgorithmIDs::midiNodeIn, AAX_eMIDINodeType_LocalInput, - JucePlugin_Name, 0xffff)); - #endif - - #if JucePlugin_ProducesMidiOutput - check (desc.AddMIDINode (JUCEAlgorithmIDs::midiNodeOut, AAX_eMIDINodeType_LocalOutput, - JucePlugin_Name " Out", 0xffff)); - #endif - - check (desc.AddPrivateData (JUCEAlgorithmIDs::pluginInstance, sizeof (PluginInstanceInfo))); - - // Create a property map - AAX_IPropertyMap* const properties = desc.NewPropertyMap(); - jassert (properties != nullptr); - - properties->AddProperty (AAX_eProperty_ManufacturerID, JucePlugin_AAXManufacturerCode); - properties->AddProperty (AAX_eProperty_ProductID, JucePlugin_AAXProductId); - - #if JucePlugin_AAXDisableBypass - properties->AddProperty (AAX_eProperty_CanBypass, false); - #else - properties->AddProperty (AAX_eProperty_CanBypass, true); - #endif - - properties->AddProperty (AAX_eProperty_InputStemFormat, getFormatForChans (numInputs)); - properties->AddProperty (AAX_eProperty_OutputStemFormat, getFormatForChans (numOutputs)); - - // This value needs to match the RTAS wrapper's Type ID, so that - // the host knows that the RTAS/AAX plugins are equivalent. - properties->AddProperty (AAX_eProperty_PlugInID_Native, 'jcaa' + channelConfigIndex); - - #if ! JucePlugin_AAXDisableAudioSuite - properties->AddProperty (AAX_eProperty_PlugInID_AudioSuite, 'jyaa' + channelConfigIndex); - #endif - - #if JucePlugin_AAXDisableMultiMono - properties->AddProperty (AAX_eProperty_Constraint_MultiMonoSupport, false); - #else - properties->AddProperty (AAX_eProperty_Constraint_MultiMonoSupport, true); - #endif - - check (desc.AddProcessProc_Native (algorithmProcessCallback, properties)); - } - - static void getPlugInDescription (AAX_IEffectDescriptor& descriptor) - { - descriptor.AddName (JucePlugin_Desc); - descriptor.AddName (JucePlugin_Name); - descriptor.AddCategory (JucePlugin_AAXCategory); - - #ifdef JucePlugin_AAXPageTableFile - // optional page table setting - define this macro in your AppConfig.h if you - // want to set this value - see Avid documentation for details about its format. - descriptor.AddResourceInfo (AAX_eResourceType_PageTable, JucePlugin_AAXPageTableFile); - #endif - - check (descriptor.AddProcPtr ((void*) JuceAAX_GUI::Create, kAAX_ProcPtrID_Create_EffectGUI)); - check (descriptor.AddProcPtr ((void*) JuceAAX_Processor::Create, kAAX_ProcPtrID_Create_EffectParameters)); - - const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; - const int numConfigs = numElementsInArray (channelConfigs); - - // You need to actually add some configurations to the JucePlugin_PreferredChannelConfigurations - // value in your JucePluginCharacteristics.h file.. - jassert (numConfigs > 0); - - for (int i = 0; i < numConfigs; ++i) - { - if (AAX_IComponentDescriptor* const desc = descriptor.NewComponentDescriptor()) - { - const int numIns = channelConfigs [i][0]; - const int numOuts = channelConfigs [i][1]; - - if (numIns <= 8 && numOuts <= 8) // AAX doesn't seem to handle more than 8 chans - { - createDescriptor (*desc, i, numIns, numOuts); - check (descriptor.AddComponent (desc)); - } - } - } - } -}; - -//============================================================================== -AAX_Result JUCE_CDECL GetEffectDescriptions (AAX_ICollection*); -AAX_Result JUCE_CDECL GetEffectDescriptions (AAX_ICollection* collection) -{ - ScopedJuceInitialiser_GUI libraryInitialiser; - - if (AAX_IEffectDescriptor* const descriptor = collection->NewDescriptor()) - { - AAXClasses::getPlugInDescription (*descriptor); - collection->AddEffect (JUCE_STRINGIFY (JucePlugin_AAXIdentifier), descriptor); - - collection->SetManufacturerName (JucePlugin_Manufacturer); - collection->AddPackageName (JucePlugin_Desc); - collection->AddPackageName (JucePlugin_Name); - collection->SetPackageVersion (JucePlugin_VersionCode); - - return AAX_SUCCESS; - } - - return AAX_ERROR_NULL_OBJECT; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.mm b/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.mm deleted file mode 100755 index 5c450cb..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.mm +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#define JUCE_INCLUDED_AAX_IN_MM 1 -#include "juce_AAX_Wrapper.cpp" diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r b/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r deleted file mode 100755 index 9337877..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Resources.r +++ /dev/null @@ -1,69 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#define UseExtendedThingResource 1 -#include - -//============================================================================== -/* The AppConfig.h file should be a file in your project, containing info to describe the - plugin's name, type, etc. The introjucer will generate this file automatically for you. - - You may need to adjust the include path of your project to make sure it can be - found by this include statement. (Don't hack this file to change the include path) -*/ -#include "AppConfig.h" - - -//============================================================================== -// component resources for Audio Unit -#define RES_ID 1000 -#define COMP_TYPE JucePlugin_AUMainType -#define COMP_SUBTYPE JucePlugin_AUSubType -#define COMP_MANUF JucePlugin_AUManufacturerCode -#define VERSION JucePlugin_VersionCode -#define NAME JucePlugin_Manufacturer ": " JucePlugin_Name -#define DESCRIPTION JucePlugin_Desc -#define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "Entry" - -#include "AUResources.r" - -//============================================================================== -// component resources for Audio Unit Carbon View - -#ifndef BUILD_AU_CARBON_UI - #define BUILD_AU_CARBON_UI 1 -#endif - -#if BUILD_AU_CARBON_UI - #define RES_ID 2000 - #define COMP_TYPE kAudioUnitCarbonViewComponentType - #define COMP_SUBTYPE JucePlugin_AUSubType - #define COMP_MANUF JucePlugin_AUManufacturerCode - #define VERSION JucePlugin_VersionCode - #define NAME JucePlugin_Manufacturer ": " JucePlugin_Name " View" - #define DESCRIPTION NAME - #define ENTRY_POINT JucePlugin_AUExportPrefixQuoted "ViewEntry" - - #include "AUResources.r" -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm b/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm deleted file mode 100755 index 4bf8f5c..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm +++ /dev/null @@ -1,1633 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_AU - -#if __LP64__ - #undef JUCE_SUPPORT_CARBON - #define JUCE_SUPPORT_CARBON 0 -#endif - -#ifdef __clang__ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wshorten-64-to-32" - #pragma clang diagnostic ignored "-Wunused-parameter" - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - #pragma clang diagnostic ignored "-Wsign-conversion" - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Woverloaded-virtual" -#endif - -#include "../utility/juce_IncludeSystemHeaders.h" - -#include -#include -#include -#include - -#if JUCE_SUPPORT_CARBON - #define Point CarbonDummyPointName - #define Component CarbonDummyCompName -#endif - -/* - Got an include error here? - - You probably need to install Apple's AU classes - see the - juce website for more info on how to get them: - http://www.juce.com/forum/topic/aus-xcode -*/ -#include "AUMIDIEffectBase.h" -#include "MusicDeviceBase.h" -#undef Point -#undef Component - -/** The BUILD_AU_CARBON_UI flag lets you specify whether old-school carbon hosts are supported as - well as ones that can open a cocoa view. If this is enabled, you'll need to also add the AUCarbonBase - files to your project. -*/ -#if ! (defined (BUILD_AU_CARBON_UI) || JUCE_64BIT) - #define BUILD_AU_CARBON_UI 1 -#endif - -#ifdef __LP64__ - #undef BUILD_AU_CARBON_UI // (not possible in a 64-bit build) -#endif - -#if BUILD_AU_CARBON_UI - #undef Button - #define Point CarbonDummyPointName - #include "AUCarbonViewBase.h" - #undef Point -#endif - -#ifdef __clang__ - #pragma clang diagnostic pop -#endif - -#define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 - -#include "../utility/juce_IncludeModuleHeaders.h" -#include "../utility/juce_FakeMouseMoveGenerator.h" -#include "../utility/juce_CarbonVisibility.h" -#include "../../juce_core/native/juce_osx_ObjCHelpers.h" - -//============================================================================== -static Array activePlugins, activeUIs; - -static const AudioUnitPropertyID juceFilterObjectPropertyID = 0x1a45ffe9; - -static const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; -static const int numChannelConfigs = sizeof (channelConfigs) / sizeof (*channelConfigs); - -#if JucePlugin_IsSynth -class JuceAUBaseClass : public MusicDeviceBase -{ -public: - JuceAUBaseClass (AudioComponentInstance comp) : MusicDeviceBase (comp, 0, 1) {} -}; -#else -class JuceAUBaseClass : public AUMIDIEffectBase -{ -public: - JuceAUBaseClass (AudioComponentInstance comp) : AUMIDIEffectBase (comp, false) {} - - OSStatus MIDIEvent (UInt32 inStatus, UInt32 inData1, UInt32 inData2, UInt32 inOffsetSampleFrame) - { - return AUMIDIBase::MIDIEvent (inStatus, inData1, inData2, inOffsetSampleFrame); - } - - OSStatus SysEx (const UInt8* inData, UInt32 inLength) - { - return AUMIDIBase::SysEx (inData, inLength); - } -}; -#endif - - -// This macro can be set if you need to override this internal name for some reason.. -#ifndef JUCE_STATE_DICTIONARY_KEY - #define JUCE_STATE_DICTIONARY_KEY CFSTR("jucePluginState") -#endif - -//============================================================================== -class JuceAU : public JuceAUBaseClass, - public AudioProcessorListener, - public AudioPlayHead, - public ComponentListener -{ -public: - //============================================================================== - JuceAU (AudioUnit component) - : JuceAUBaseClass (component), - bufferSpace (2, 16), - prepared (false) - { - if (activePlugins.size() + activeUIs.size() == 0) - { - #if BUILD_AU_CARBON_UI - NSApplicationLoad(); - #endif - - initialiseJuce_GUI(); - } - - juceFilter = createPluginFilterOfType (AudioProcessor::wrapperType_AudioUnit); - - juceFilter->setPlayHead (this); - juceFilter->addListener (this); - - Globals()->UseIndexedParameters (juceFilter->getNumParameters()); - - activePlugins.add (this); - - zerostruct (auEvent); - auEvent.mArgument.mParameter.mAudioUnit = GetComponentInstance(); - auEvent.mArgument.mParameter.mScope = kAudioUnitScope_Global; - auEvent.mArgument.mParameter.mElement = 0; - - zerostruct (midiCallback); - - CreateElements(); - - CAStreamBasicDescription streamDescription; - streamDescription.mSampleRate = getSampleRate(); - streamDescription.SetCanonical ((UInt32) channelConfigs[0][1], false); - Outputs().GetIOElement(0)->SetStreamFormat (streamDescription); - - #if ! JucePlugin_IsSynth - streamDescription.SetCanonical ((UInt32) channelConfigs[0][0], false); - Inputs().GetIOElement(0)->SetStreamFormat (streamDescription); - #endif - } - - ~JuceAU() - { - deleteActiveEditors(); - juceFilter = nullptr; - clearPresetsArray(); - - jassert (activePlugins.contains (this)); - activePlugins.removeFirstMatchingValue (this); - - if (activePlugins.size() + activeUIs.size() == 0) - shutdownJuce_GUI(); - } - - void deleteActiveEditors() - { - for (int i = activeUIs.size(); --i >= 0;) - { - id ui = (id) activeUIs.getUnchecked(i); - - if (JuceUIViewClass::getAU (ui) == this) - JuceUIViewClass::deleteEditor (ui); - } - } - - //============================================================================== - ComponentResult GetPropertyInfo (AudioUnitPropertyID inID, - AudioUnitScope inScope, - AudioUnitElement inElement, - UInt32& outDataSize, - Boolean& outWritable) override - { - if (inScope == kAudioUnitScope_Global) - { - switch (inID) - { - case juceFilterObjectPropertyID: - outWritable = false; - outDataSize = sizeof (void*) * 2; - return noErr; - - case kAudioUnitProperty_OfflineRender: - outWritable = true; - outDataSize = sizeof (UInt32); - return noErr; - - case kMusicDeviceProperty_InstrumentCount: - outDataSize = sizeof (UInt32); - outWritable = false; - return noErr; - - case kAudioUnitProperty_CocoaUI: - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - // (On 10.4, there's a random obj-c dispatching crash when trying to load a cocoa UI) - if (SystemStats::getOperatingSystemType() >= SystemStats::MacOSX_10_5) - #endif - { - outDataSize = sizeof (AudioUnitCocoaViewInfo); - outWritable = true; - return noErr; - } - - break; - - #if JucePlugin_ProducesMidiOutput - case kAudioUnitProperty_MIDIOutputCallbackInfo: - outDataSize = sizeof (CFArrayRef); - outWritable = false; - return noErr; - - case kAudioUnitProperty_MIDIOutputCallback: - outDataSize = sizeof (AUMIDIOutputCallbackStruct); - outWritable = true; - return noErr; - #endif - - case kAudioUnitProperty_ParameterStringFromValue: - outDataSize = sizeof (AudioUnitParameterStringFromValue); - outWritable = false; - return noErr; - - case kAudioUnitProperty_ParameterValueFromString: - outDataSize = sizeof (AudioUnitParameterValueFromString); - outWritable = false; - return noErr; - - default: break; - } - } - - return JuceAUBaseClass::GetPropertyInfo (inID, inScope, inElement, outDataSize, outWritable); - } - - ComponentResult GetProperty (AudioUnitPropertyID inID, - AudioUnitScope inScope, - AudioUnitElement inElement, - void* outData) override - { - if (inScope == kAudioUnitScope_Global) - { - switch (inID) - { - case juceFilterObjectPropertyID: - ((void**) outData)[0] = (void*) static_cast (juceFilter); - ((void**) outData)[1] = (void*) this; - return noErr; - - case kAudioUnitProperty_OfflineRender: - *(UInt32*) outData = (juceFilter != nullptr && juceFilter->isNonRealtime()) ? 1 : 0; - return noErr; - - case kMusicDeviceProperty_InstrumentCount: - *(UInt32*) outData = 1; - return noErr; - - case kAudioUnitProperty_CocoaUI: - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - // (On 10.4, there's a random obj-c dispatching crash when trying to load a cocoa UI) - if (SystemStats::getOperatingSystemType() >= SystemStats::MacOSX_10_5) - #endif - { - JUCE_AUTORELEASEPOOL - { - static JuceUICreationClass cls; - - // (NB: this may be the host's bundle, not necessarily the component's) - NSBundle* bundle = [NSBundle bundleForClass: cls.cls]; - - AudioUnitCocoaViewInfo* info = static_cast (outData); - info->mCocoaAUViewClass[0] = (CFStringRef) [juceStringToNS (class_getName (cls.cls)) retain]; - info->mCocoaAUViewBundleLocation = (CFURLRef) [[NSURL fileURLWithPath: [bundle bundlePath]] retain]; - } - - return noErr; - } - - break; - - #if JucePlugin_ProducesMidiOutput - case kAudioUnitProperty_MIDIOutputCallbackInfo: - { - CFStringRef strs[1]; - strs[0] = CFSTR ("MIDI Callback"); - - CFArrayRef callbackArray = CFArrayCreate (nullptr, (const void**) strs, 1, &kCFTypeArrayCallBacks); - *(CFArrayRef*) outData = callbackArray; - return noErr; - } - #endif - - case kAudioUnitProperty_ParameterValueFromString: - { - if (AudioUnitParameterValueFromString* pv = (AudioUnitParameterValueFromString*) outData) - { - if (juceFilter != nullptr) - { - const String text (String::fromCFString (pv->inString)); - - if (AudioProcessorParameter* param = juceFilter->getParameters() [(int) pv->inParamID]) - pv->outValue = param->getValueForText (text); - else - pv->outValue = text.getFloatValue(); - - return noErr; - } - } - } - break; - - case kAudioUnitProperty_ParameterStringFromValue: - { - if (AudioUnitParameterStringFromValue* pv = (AudioUnitParameterStringFromValue*) outData) - { - if (juceFilter != nullptr) - { - const float value = (float) *(pv->inValue); - String text; - - if (AudioProcessorParameter* param = juceFilter->getParameters() [(int) pv->inParamID]) - text = param->getText ((float) *(pv->inValue), 0); - else - text = String (value); - - pv->outString = text.toCFString(); - return noErr; - } - } - } - break; - - default: - break; - } - } - - return JuceAUBaseClass::GetProperty (inID, inScope, inElement, outData); - } - - ComponentResult SetProperty (AudioUnitPropertyID inID, - AudioUnitScope inScope, - AudioUnitElement inElement, - const void* inData, - UInt32 inDataSize) override - { - if (inScope == kAudioUnitScope_Global) - { - switch (inID) - { - #if JucePlugin_ProducesMidiOutput - case kAudioUnitProperty_MIDIOutputCallback: - if (inDataSize < sizeof (AUMIDIOutputCallbackStruct)) - return kAudioUnitErr_InvalidPropertyValue; - - if (AUMIDIOutputCallbackStruct* callbackStruct = (AUMIDIOutputCallbackStruct*) inData) - midiCallback = *callbackStruct; - - return noErr; - #endif - - case kAudioUnitProperty_OfflineRender: - if (juceFilter != nullptr) - juceFilter->setNonRealtime ((*(UInt32*) inData) != 0); - - return noErr; - - default: break; - } - } - - return JuceAUBaseClass::SetProperty (inID, inScope, inElement, inData, inDataSize); - } - - ComponentResult SaveState (CFPropertyListRef* outData) override - { - ComponentResult err = JuceAUBaseClass::SaveState (outData); - - if (err != noErr) - return err; - - jassert (CFGetTypeID (*outData) == CFDictionaryGetTypeID()); - - CFMutableDictionaryRef dict = (CFMutableDictionaryRef) *outData; - - if (juceFilter != nullptr) - { - juce::MemoryBlock state; - juceFilter->getCurrentProgramStateInformation (state); - - if (state.getSize() > 0) - { - CFDataRef ourState = CFDataCreate (kCFAllocatorDefault, (const UInt8*) state.getData(), (CFIndex) state.getSize()); - CFDictionarySetValue (dict, JUCE_STATE_DICTIONARY_KEY, ourState); - CFRelease (ourState); - } - } - - return noErr; - } - - ComponentResult RestoreState (CFPropertyListRef inData) override - { - { - // Remove the data entry from the state to prevent the superclass loading the parameters - CFMutableDictionaryRef copyWithoutData = CFDictionaryCreateMutableCopy (nullptr, 0, (CFDictionaryRef) inData); - CFDictionaryRemoveValue (copyWithoutData, CFSTR (kAUPresetDataKey)); - ComponentResult err = JuceAUBaseClass::RestoreState (copyWithoutData); - CFRelease (copyWithoutData); - - if (err != noErr) - return err; - } - - if (juceFilter != nullptr) - { - CFDictionaryRef dict = (CFDictionaryRef) inData; - CFDataRef data = 0; - - if (CFDictionaryGetValueIfPresent (dict, JUCE_STATE_DICTIONARY_KEY, (const void**) &data)) - { - if (data != 0) - { - const int numBytes = (int) CFDataGetLength (data); - const juce::uint8* const rawBytes = CFDataGetBytePtr (data); - - if (numBytes > 0) - juceFilter->setCurrentProgramStateInformation (rawBytes, numBytes); - } - } - } - - return noErr; - } - - UInt32 SupportedNumChannels (const AUChannelInfo** outInfo) override - { - // If you hit this, then you need to add some configurations to your - // JucePlugin_PreferredChannelConfigurations setting.. - jassert (numChannelConfigs > 0); - - if (outInfo != nullptr) - { - *outInfo = channelInfo; - - for (int i = 0; i < numChannelConfigs; ++i) - { - #if JucePlugin_IsSynth - channelInfo[i].inChannels = 0; - #else - channelInfo[i].inChannels = channelConfigs[i][0]; - #endif - channelInfo[i].outChannels = channelConfigs[i][1]; - } - } - - return numChannelConfigs; - } - - //============================================================================== - ComponentResult GetParameterInfo (AudioUnitScope inScope, - AudioUnitParameterID inParameterID, - AudioUnitParameterInfo& outParameterInfo) override - { - const int index = (int) inParameterID; - - if (inScope == kAudioUnitScope_Global - && juceFilter != nullptr - && index < juceFilter->getNumParameters()) - { - outParameterInfo.flags = (UInt32) (kAudioUnitParameterFlag_IsWritable - | kAudioUnitParameterFlag_IsReadable - | kAudioUnitParameterFlag_HasCFNameString - | kAudioUnitParameterFlag_ValuesHaveStrings); - - const String name (juceFilter->getParameterName (index)); - - // set whether the param is automatable (unnamed parameters aren't allowed to be automated) - if (name.isEmpty() || ! juceFilter->isParameterAutomatable (index)) - outParameterInfo.flags |= kAudioUnitParameterFlag_NonRealTime; - - if (juceFilter->isMetaParameter (index)) - outParameterInfo.flags |= kAudioUnitParameterFlag_IsGlobalMeta; - - AUBase::FillInParameterName (outParameterInfo, name.toCFString(), true); - - outParameterInfo.minValue = 0.0f; - outParameterInfo.maxValue = 1.0f; - outParameterInfo.defaultValue = juceFilter->getParameterDefaultValue (index); - jassert (outParameterInfo.defaultValue >= outParameterInfo.minValue - && outParameterInfo.defaultValue <= outParameterInfo.maxValue); - outParameterInfo.unit = kAudioUnitParameterUnit_Generic; - - return noErr; - } - - return kAudioUnitErr_InvalidParameter; - } - - ComponentResult GetParameter (AudioUnitParameterID inID, - AudioUnitScope inScope, - AudioUnitElement inElement, - Float32& outValue) override - { - if (inScope == kAudioUnitScope_Global && juceFilter != nullptr) - { - outValue = juceFilter->getParameter ((int) inID); - return noErr; - } - - return AUBase::GetParameter (inID, inScope, inElement, outValue); - } - - ComponentResult SetParameter (AudioUnitParameterID inID, - AudioUnitScope inScope, - AudioUnitElement inElement, - Float32 inValue, - UInt32 inBufferOffsetInFrames) override - { - if (inScope == kAudioUnitScope_Global && juceFilter != nullptr) - { - juceFilter->setParameter ((int) inID, inValue); - return noErr; - } - - return AUBase::SetParameter (inID, inScope, inElement, inValue, inBufferOffsetInFrames); - } - - // No idea what this method actually does or what it should return. Current Apple docs say nothing about it. - // (Note that this isn't marked 'override' in case older versions of the SDK don't include it) - bool CanScheduleParameters() const { return false; } - - //============================================================================== - ComponentResult Version() override { return JucePlugin_VersionCode; } - bool SupportsTail() override { return true; } - Float64 GetTailTime() override { return juceFilter->getTailLengthSeconds(); } - double getSampleRate() { return GetOutput(0)->GetStreamFormat().mSampleRate; } - - Float64 GetLatency() override - { - const double rate = getSampleRate(); - jassert (rate > 0); - return rate > 0 ? juceFilter->getLatencySamples() / rate : 0; - } - - //============================================================================== - #if BUILD_AU_CARBON_UI - int GetNumCustomUIComponents() override - { - return getHostType().isDigitalPerformer() ? 0 : 1; - } - - void GetUIComponentDescs (ComponentDescription* inDescArray) override - { - inDescArray[0].componentType = kAudioUnitCarbonViewComponentType; - inDescArray[0].componentSubType = JucePlugin_AUSubType; - inDescArray[0].componentManufacturer = JucePlugin_AUManufacturerCode; - inDescArray[0].componentFlags = 0; - inDescArray[0].componentFlagsMask = 0; - } - #endif - - //============================================================================== - bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override - { - info.timeSigNumerator = 0; - info.timeSigDenominator = 0; - info.editOriginTime = 0; - info.ppqPositionOfLastBarStart = 0; - info.isRecording = false; - info.ppqLoopStart = 0; - info.ppqLoopEnd = 0; - - switch (lastTimeStamp.mSMPTETime.mType) - { - case kSMPTETimeType24: info.frameRate = AudioPlayHead::fps24; break; - case kSMPTETimeType25: info.frameRate = AudioPlayHead::fps25; break; - case kSMPTETimeType30Drop: info.frameRate = AudioPlayHead::fps30drop; break; - case kSMPTETimeType30: info.frameRate = AudioPlayHead::fps30; break; - case kSMPTETimeType2997: info.frameRate = AudioPlayHead::fps2997; break; - case kSMPTETimeType2997Drop: info.frameRate = AudioPlayHead::fps2997drop; break; - //case kSMPTETimeType60: - //case kSMPTETimeType5994: - default: info.frameRate = AudioPlayHead::fpsUnknown; break; - } - - if (CallHostBeatAndTempo (&info.ppqPosition, &info.bpm) != noErr) - { - info.ppqPosition = 0; - info.bpm = 0; - } - - UInt32 outDeltaSampleOffsetToNextBeat; - double outCurrentMeasureDownBeat; - float num; - UInt32 den; - - if (CallHostMusicalTimeLocation (&outDeltaSampleOffsetToNextBeat, &num, &den, - &outCurrentMeasureDownBeat) == noErr) - { - info.timeSigNumerator = (int) num; - info.timeSigDenominator = (int) den; - info.ppqPositionOfLastBarStart = outCurrentMeasureDownBeat; - } - - double outCurrentSampleInTimeLine, outCycleStartBeat, outCycleEndBeat; - Boolean playing = false, looping = false, playchanged; - - if (CallHostTransportState (&playing, - &playchanged, - &outCurrentSampleInTimeLine, - &looping, - &outCycleStartBeat, - &outCycleEndBeat) != noErr - || getHostType().isLogic()) - { - // If the host doesn't support this callback (or if it's Logic, which has a bug), - // then fallback to using the sample time from lastTimeStamp: - outCurrentSampleInTimeLine = lastTimeStamp.mSampleTime; - } - - info.isPlaying = playing; - info.timeInSamples = (int64) (outCurrentSampleInTimeLine + 0.5); - info.timeInSeconds = info.timeInSamples / getSampleRate(); - info.isLooping = looping; - - return true; - } - - void sendAUEvent (const AudioUnitEventType type, const int index) - { - if (AUEventListenerNotify != 0) - { - auEvent.mEventType = type; - auEvent.mArgument.mParameter.mParameterID = (AudioUnitParameterID) index; - AUEventListenerNotify (0, 0, &auEvent); - } - } - - void audioProcessorParameterChanged (AudioProcessor*, int index, float /*newValue*/) - { - sendAUEvent (kAudioUnitEvent_ParameterValueChange, index); - } - - void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) - { - sendAUEvent (kAudioUnitEvent_BeginParameterChangeGesture, index); - } - - void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) - { - sendAUEvent (kAudioUnitEvent_EndParameterChangeGesture, index); - } - - void audioProcessorChanged (AudioProcessor*) - { - PropertyChanged (kAudioUnitProperty_Latency, kAudioUnitScope_Global, 0); - PropertyChanged (kAudioUnitProperty_ParameterList, kAudioUnitScope_Global, 0); - PropertyChanged (kAudioUnitProperty_ParameterInfo, kAudioUnitScope_Global, 0); - } - - bool StreamFormatWritable (AudioUnitScope, AudioUnitElement) override - { - return ! IsInitialized(); - } - - // (these two slightly different versions are because the definition changed between 10.4 and 10.5) - ComponentResult StartNote (MusicDeviceInstrumentID, MusicDeviceGroupID, NoteInstanceID&, UInt32, const MusicDeviceNoteParams&) { return noErr; } - ComponentResult StartNote (MusicDeviceInstrumentID, MusicDeviceGroupID, NoteInstanceID*, UInt32, const MusicDeviceNoteParams&) { return noErr; } - ComponentResult StopNote (MusicDeviceGroupID, NoteInstanceID, UInt32) { return noErr; } - - //============================================================================== - ComponentResult Initialize() override - { - #if ! JucePlugin_IsSynth - const int numIns = findNumInputChannels(); - #endif - const int numOuts = findNumOutputChannels(); - - bool isValidChannelConfig = false; - - for (int i = 0; i < numChannelConfigs; ++i) - #if JucePlugin_IsSynth - if (numOuts == channelConfigs[i][1]) - #else - if (numIns == channelConfigs[i][0] && numOuts == channelConfigs[i][1]) - #endif - isValidChannelConfig = true; - - if (! isValidChannelConfig) - return kAudioUnitErr_FormatNotSupported; - - JuceAUBaseClass::Initialize(); - prepareToPlay(); - return noErr; - } - - void Cleanup() override - { - JuceAUBaseClass::Cleanup(); - - if (juceFilter != nullptr) - juceFilter->releaseResources(); - - bufferSpace.setSize (2, 16); - midiEvents.clear(); - incomingEvents.clear(); - prepared = false; - } - - ComponentResult Reset (AudioUnitScope inScope, AudioUnitElement inElement) override - { - if (! prepared) - prepareToPlay(); - - if (juceFilter != nullptr) - juceFilter->reset(); - - return JuceAUBaseClass::Reset (inScope, inElement); - } - - int findNumInputChannels() - { - #if ! JucePlugin_IsSynth - if (AUInputElement* e = GetInput(0)) - return (int) e->GetStreamFormat().mChannelsPerFrame; - #endif - - return 0; - } - - int findNumOutputChannels() - { - if (AUOutputElement* e = GetOutput(0)) - return (int) e->GetStreamFormat().mChannelsPerFrame; - - return 0; - } - - void prepareToPlay() - { - if (juceFilter != nullptr) - { - juceFilter->setPlayConfigDetails (findNumInputChannels(), - findNumOutputChannels(), - getSampleRate(), - (int) GetMaxFramesPerSlice()); - - bufferSpace.setSize (juceFilter->getNumInputChannels() + juceFilter->getNumOutputChannels(), - (int) GetMaxFramesPerSlice() + 32); - - juceFilter->prepareToPlay (getSampleRate(), (int) GetMaxFramesPerSlice()); - - midiEvents.ensureSize (2048); - midiEvents.clear(); - incomingEvents.ensureSize (2048); - incomingEvents.clear(); - - channels.calloc ((size_t) jmax (juceFilter->getNumInputChannels(), - juceFilter->getNumOutputChannels()) + 4); - - prepared = true; - } - } - - ComponentResult Render (AudioUnitRenderActionFlags &ioActionFlags, - const AudioTimeStamp& inTimeStamp, - UInt32 nFrames) override - { - lastTimeStamp = inTimeStamp; - - #if ! JucePlugin_IsSynth - return JuceAUBaseClass::Render (ioActionFlags, inTimeStamp, nFrames); - #else - // synths can't have any inputs.. - AudioBufferList inBuffer; - inBuffer.mNumberBuffers = 0; - - return ProcessBufferLists (ioActionFlags, inBuffer, GetOutput(0)->GetBufferList(), nFrames); - #endif - } - - OSStatus ProcessBufferLists (AudioUnitRenderActionFlags& ioActionFlags, - const AudioBufferList& inBuffer, - AudioBufferList& outBuffer, - UInt32 numSamples) override - { - if (juceFilter != nullptr) - { - jassert (prepared); - - int numOutChans = 0; - int nextSpareBufferChan = 0; - bool needToReinterleave = false; - const int numIn = juceFilter->getNumInputChannels(); - const int numOut = juceFilter->getNumOutputChannels(); - - for (unsigned int i = 0; i < outBuffer.mNumberBuffers; ++i) - { - AudioBuffer& buf = outBuffer.mBuffers[i]; - - if (buf.mNumberChannels == 1) - { - channels [numOutChans++] = (float*) buf.mData; - } - else - { - needToReinterleave = true; - - for (unsigned int subChan = 0; subChan < buf.mNumberChannels && numOutChans < numOut; ++subChan) - channels [numOutChans++] = bufferSpace.getWritePointer (nextSpareBufferChan++); - } - - if (numOutChans >= numOut) - break; - } - - int numInChans = 0; - - for (unsigned int i = 0; i < inBuffer.mNumberBuffers; ++i) - { - const AudioBuffer& buf = inBuffer.mBuffers[i]; - - if (buf.mNumberChannels == 1) - { - if (numInChans < numOutChans) - memcpy (channels [numInChans], (const float*) buf.mData, sizeof (float) * numSamples); - else - channels [numInChans] = (float*) buf.mData; - - ++numInChans; - } - else - { - // need to de-interleave.. - for (unsigned int subChan = 0; subChan < buf.mNumberChannels && numInChans < numIn; ++subChan) - { - float* dest; - - if (numInChans < numOutChans) - { - dest = channels [numInChans++]; - } - else - { - dest = bufferSpace.getWritePointer (nextSpareBufferChan++); - channels [numInChans++] = dest; - } - - const float* src = ((const float*) buf.mData) + subChan; - - for (int j = (int) numSamples; --j >= 0;) - { - *dest++ = *src; - src += buf.mNumberChannels; - } - } - } - - if (numInChans >= numIn) - break; - } - - { - const ScopedLock sl (incomingMidiLock); - midiEvents.clear(); - incomingEvents.swapWith (midiEvents); - } - - { - AudioSampleBuffer buffer (channels, jmax (numIn, numOut), (int) numSamples); - - const ScopedLock sl (juceFilter->getCallbackLock()); - - if (juceFilter->isSuspended()) - { - for (int j = 0; j < numOut; ++j) - zeromem (channels [j], sizeof (float) * numSamples); - } - #if ! JucePlugin_IsSynth - else if (ShouldBypassEffect()) - { - juceFilter->processBlockBypassed (buffer, midiEvents); - } - #endif - else - { - juceFilter->processBlock (buffer, midiEvents); - } - } - - if (! midiEvents.isEmpty()) - { - #if JucePlugin_ProducesMidiOutput - if (midiCallback.midiOutputCallback != nullptr) - { - UInt32 numPackets = 0; - size_t dataSize = 0; - - const juce::uint8* midiEventData; - int midiEventSize, midiEventPosition; - - for (MidiBuffer::Iterator i (midiEvents); i.getNextEvent (midiEventData, midiEventSize, midiEventPosition);) - { - jassert (isPositiveAndBelow (midiEventPosition, (int) numSamples)); - dataSize += (size_t) midiEventSize; - ++numPackets; - } - - MIDIPacket* p; - const size_t packetMembersSize = sizeof (MIDIPacket) - sizeof (p->data); // NB: GCC chokes on "sizeof (MidiMessage::data)" - const size_t packetListMembersSize = sizeof (MIDIPacketList) - sizeof (p->data); - - HeapBlock packetList; - packetList.malloc (packetListMembersSize + packetMembersSize * numPackets + dataSize, 1); - packetList->numPackets = numPackets; - - p = packetList->packet; - - for (MidiBuffer::Iterator i (midiEvents); i.getNextEvent (midiEventData, midiEventSize, midiEventPosition);) - { - p->timeStamp = (MIDITimeStamp) midiEventPosition; - p->length = (UInt16) midiEventSize; - memcpy (p->data, midiEventData, (size_t) midiEventSize); - p = MIDIPacketNext (p); - } - - midiCallback.midiOutputCallback (midiCallback.userData, &lastTimeStamp, 0, packetList); - } - #endif - - midiEvents.clear(); - } - - if (needToReinterleave) - { - nextSpareBufferChan = 0; - - for (unsigned int i = 0; i < outBuffer.mNumberBuffers; ++i) - { - AudioBuffer& buf = outBuffer.mBuffers[i]; - - if (buf.mNumberChannels > 1) - { - for (unsigned int subChan = 0; subChan < buf.mNumberChannels; ++subChan) - { - const float* src = bufferSpace.getReadPointer (nextSpareBufferChan++); - float* dest = ((float*) buf.mData) + subChan; - - for (int j = (int) numSamples; --j >= 0;) - { - *dest = *src++; - dest += buf.mNumberChannels; - } - } - } - } - } - - #if ! JucePlugin_SilenceInProducesSilenceOut - ioActionFlags &= (AudioUnitRenderActionFlags) ~kAudioUnitRenderAction_OutputIsSilence; - #endif - } - - return noErr; - } - - OSStatus HandleMidiEvent (UInt8 nStatus, UInt8 inChannel, UInt8 inData1, UInt8 inData2, UInt32 inStartFrame) override - { - #if JucePlugin_WantsMidiInput - const ScopedLock sl (incomingMidiLock); - const juce::uint8 data[] = { (juce::uint8) (nStatus | inChannel), - (juce::uint8) inData1, - (juce::uint8) inData2 }; - - incomingEvents.addEvent (data, 3, (int) inStartFrame); - return noErr; - #else - (void) nStatus; (void) inChannel; (void) inData1; (void) inData2; (void) inStartFrame; - return kAudioUnitErr_PropertyNotInUse; - #endif - } - - OSStatus HandleSysEx (const UInt8* inData, UInt32 inLength) override - { - #if JucePlugin_WantsMidiInput - const ScopedLock sl (incomingMidiLock); - incomingEvents.addEvent (inData, (int) inLength, 0); - return noErr; - #else - (void) inData; (void) inLength; - return kAudioUnitErr_PropertyNotInUse; - #endif - } - - //============================================================================== - ComponentResult GetPresets (CFArrayRef* outData) const override - { - if (outData != nullptr) - { - const int numPrograms = juceFilter->getNumPrograms(); - - clearPresetsArray(); - presetsArray.insertMultiple (0, AUPreset(), numPrograms); - - CFMutableArrayRef presetsArrayRef = CFArrayCreateMutable (0, numPrograms, 0); - - for (int i = 0; i < numPrograms; ++i) - { - String name (juceFilter->getProgramName(i)); - if (name.isEmpty()) - name = "Untitled"; - - AUPreset& p = presetsArray.getReference(i); - p.presetNumber = i; - p.presetName = name.toCFString(); - - CFArrayAppendValue (presetsArrayRef, &p); - } - - *outData = (CFArrayRef) presetsArrayRef; - } - - return noErr; - } - - OSStatus NewFactoryPresetSet (const AUPreset& inNewFactoryPreset) override - { - const int numPrograms = juceFilter->getNumPrograms(); - const SInt32 chosenPresetNumber = (int) inNewFactoryPreset.presetNumber; - - if (chosenPresetNumber >= numPrograms) - return kAudioUnitErr_InvalidProperty; - - AUPreset chosenPreset; - chosenPreset.presetNumber = chosenPresetNumber; - chosenPreset.presetName = juceFilter->getProgramName (chosenPresetNumber).toCFString(); - - juceFilter->setCurrentProgram (chosenPresetNumber); - SetAFactoryPresetAsCurrent (chosenPreset); - - return noErr; - } - - void componentMovedOrResized (Component& component, bool /*wasMoved*/, bool /*wasResized*/) override - { - NSView* view = (NSView*) component.getWindowHandle(); - NSRect r = [[view superview] frame]; - r.origin.y = r.origin.y + r.size.height - component.getHeight(); - r.size.width = component.getWidth(); - r.size.height = component.getHeight(); - [[view superview] setFrame: r]; - [view setFrame: makeNSRect (component.getLocalBounds())]; - [view setNeedsDisplay: YES]; - } - - //============================================================================== - class EditorCompHolder : public Component - { - public: - EditorCompHolder (AudioProcessorEditor* const editor) - { - setSize (editor->getWidth(), editor->getHeight()); - addAndMakeVisible (editor); - - #if ! JucePlugin_EditorRequiresKeyboardFocus - setWantsKeyboardFocus (false); - #else - setWantsKeyboardFocus (true); - #endif - } - - ~EditorCompHolder() - { - deleteAllChildren(); // note that we can't use a ScopedPointer because the editor may - // have been transferred to another parent which takes over ownership. - } - - static NSView* createViewFor (AudioProcessor* filter, JuceAU* au, AudioProcessorEditor* const editor) - { - EditorCompHolder* editorCompHolder = new EditorCompHolder (editor); - NSRect r = makeNSRect (editorCompHolder->getLocalBounds()); - - static JuceUIViewClass cls; - NSView* view = [[cls.createInstance() initWithFrame: r] autorelease]; - - JuceUIViewClass::setFilter (view, filter); - JuceUIViewClass::setAU (view, au); - JuceUIViewClass::setEditor (view, editorCompHolder); - - [view setHidden: NO]; - [view setPostsFrameChangedNotifications: YES]; - - [[NSNotificationCenter defaultCenter] addObserver: view - selector: @selector (applicationWillTerminate:) - name: NSApplicationWillTerminateNotification - object: nil]; - activeUIs.add (view); - - editorCompHolder->addToDesktop (0, (void*) view); - editorCompHolder->setVisible (view); - return view; - } - - void childBoundsChanged (Component*) override - { - if (Component* editor = getChildComponent(0)) - { - const int w = jmax (32, editor->getWidth()); - const int h = jmax (32, editor->getHeight()); - - if (getWidth() != w || getHeight() != h) - setSize (w, h); - - NSView* view = (NSView*) getWindowHandle(); - NSRect r = [[view superview] frame]; - r.size.width = editor->getWidth(); - r.size.height = editor->getHeight(); - [[view superview] setFrame: r]; - [view setFrame: makeNSRect (editor->getLocalBounds())]; - [view setNeedsDisplay: YES]; - } - } - - bool keyPressed (const KeyPress&) override - { - if (getHostType().isAbletonLive()) - { - static NSTimeInterval lastEventTime = 0; // check we're not recursively sending the same event - NSTimeInterval eventTime = [[NSApp currentEvent] timestamp]; - - if (lastEventTime != eventTime) - { - lastEventTime = eventTime; - - NSView* view = (NSView*) getWindowHandle(); - NSView* hostView = [view superview]; - NSWindow* hostWindow = [hostView window]; - - [hostWindow makeFirstResponder: hostView]; - [hostView keyDown: [NSApp currentEvent]]; - [hostWindow makeFirstResponder: view]; - } - } - - return false; - } - - private: - JUCE_DECLARE_NON_COPYABLE (EditorCompHolder) - }; - - //============================================================================== - struct JuceUIViewClass : public ObjCClass - { - JuceUIViewClass() : ObjCClass ("JUCEAUView_") - { - addIvar ("filter"); - addIvar ("au"); - addIvar ("editor"); - - addMethod (@selector (dealloc), dealloc, "v@:"); - addMethod (@selector (applicationWillTerminate:), applicationWillTerminate, "v@:@"); - addMethod (@selector (viewDidMoveToWindow), viewDidMoveToWindow, "v@:"); - addMethod (@selector (mouseDownCanMoveWindow), mouseDownCanMoveWindow, "c@:"); - - registerClass(); - } - - static void deleteEditor (id self) - { - ScopedPointer editorComp (getEditor (self)); - - if (editorComp != nullptr) - { - if (editorComp->getChildComponent(0) != nullptr - && activePlugins.contains (getAU (self))) // plugin may have been deleted before the UI - { - AudioProcessor* const filter = getIvar (self, "filter"); - filter->editorBeingDeleted ((AudioProcessorEditor*) editorComp->getChildComponent(0)); - } - - editorComp = nullptr; - setEditor (self, nullptr); - } - } - - static JuceAU* getAU (id self) { return getIvar (self, "au"); } - static EditorCompHolder* getEditor (id self) { return getIvar (self, "editor"); } - - static void setFilter (id self, AudioProcessor* filter) { object_setInstanceVariable (self, "filter", filter); } - static void setAU (id self, JuceAU* au) { object_setInstanceVariable (self, "au", au); } - static void setEditor (id self, EditorCompHolder* e) { object_setInstanceVariable (self, "editor", e); } - - private: - static void dealloc (id self, SEL) - { - if (activeUIs.contains (self)) - shutdown (self); - - sendSuperclassMessage (self, @selector (dealloc)); - } - - static void applicationWillTerminate (id self, SEL, NSNotification*) - { - shutdown (self); - } - - static void shutdown (id self) - { - [[NSNotificationCenter defaultCenter] removeObserver: self]; - deleteEditor (self); - - jassert (activeUIs.contains (self)); - activeUIs.removeFirstMatchingValue (self); - - if (activePlugins.size() + activeUIs.size() == 0) - { - // there's some kind of component currently modal, but the host - // is trying to delete our plugin.. - jassert (Component::getCurrentlyModalComponent() == nullptr); - - shutdownJuce_GUI(); - } - } - - static void viewDidMoveToWindow (id self, SEL) - { - if (NSWindow* w = [(NSView*) self window]) - { - [w setAcceptsMouseMovedEvents: YES]; - - if (EditorCompHolder* const editorComp = getEditor (self)) - [w makeFirstResponder: (NSView*) editorComp->getWindowHandle()]; - } - } - - static BOOL mouseDownCanMoveWindow (id, SEL) - { - return NO; - } - }; - - //============================================================================== - struct JuceUICreationClass : public ObjCClass - { - JuceUICreationClass() : ObjCClass ("JUCE_AUCocoaViewClass_") - { - addMethod (@selector (interfaceVersion), interfaceVersion, @encode (unsigned int), "@:"); - addMethod (@selector (description), description, @encode (NSString*), "@:"); - addMethod (@selector (uiViewForAudioUnit:withSize:), uiViewForAudioUnit, @encode (NSView*), "@:", @encode (AudioUnit), @encode (NSSize)); - - addProtocol (@protocol (AUCocoaUIBase)); - - registerClass(); - } - - private: - static unsigned int interfaceVersion (id, SEL) { return 0; } - - static NSString* description (id, SEL) - { - return [NSString stringWithString: nsStringLiteral (JucePlugin_Name)]; - } - - static NSView* uiViewForAudioUnit (id, SEL, AudioUnit inAudioUnit, NSSize) - { - void* pointers[2]; - UInt32 propertySize = sizeof (pointers); - - if (AudioUnitGetProperty (inAudioUnit, juceFilterObjectPropertyID, - kAudioUnitScope_Global, 0, pointers, &propertySize) == noErr) - { - if (AudioProcessor* filter = static_cast (pointers[0])) - if (AudioProcessorEditor* editorComp = filter->createEditorIfNeeded()) - return EditorCompHolder::createViewFor (filter, static_cast (pointers[1]), editorComp); - } - - return nil; - } - }; - -private: - //============================================================================== - ScopedPointer juceFilter; - AudioSampleBuffer bufferSpace; - HeapBlock channels; - MidiBuffer midiEvents, incomingEvents; - bool prepared; - AUChannelInfo channelInfo [numChannelConfigs]; - AudioUnitEvent auEvent; - mutable Array presetsArray; - CriticalSection incomingMidiLock; - AUMIDIOutputCallbackStruct midiCallback; - AudioTimeStamp lastTimeStamp; - - void clearPresetsArray() const - { - for (int i = presetsArray.size(); --i >= 0;) - CFRelease (presetsArray.getReference(i).presetName); - - presetsArray.clear(); - } - - JUCE_DECLARE_NON_COPYABLE (JuceAU) -}; - - -//============================================================================== -#if BUILD_AU_CARBON_UI - -class JuceAUView : public AUCarbonViewBase -{ -public: - JuceAUView (AudioUnitCarbonView auview) - : AUCarbonViewBase (auview), - juceFilter (nullptr) - { - } - - ~JuceAUView() - { - deleteUI(); - } - - ComponentResult CreateUI (Float32 /*inXOffset*/, Float32 /*inYOffset*/) override - { - JUCE_AUTORELEASEPOOL - { - if (juceFilter == nullptr) - { - void* pointers[2]; - UInt32 propertySize = sizeof (pointers); - - AudioUnitGetProperty (GetEditAudioUnit(), - juceFilterObjectPropertyID, - kAudioUnitScope_Global, - 0, - pointers, - &propertySize); - - juceFilter = (AudioProcessor*) pointers[0]; - } - - if (juceFilter != nullptr) - { - deleteUI(); - - if (AudioProcessorEditor* editorComp = juceFilter->createEditorIfNeeded()) - { - editorComp->setOpaque (true); - windowComp = new ComponentInHIView (editorComp, mCarbonPane); - } - } - else - { - jassertfalse; // can't get a pointer to our effect - } - } - - return noErr; - } - - AudioUnitCarbonViewEventListener getEventListener() const { return mEventListener; } - void* getEventListenerUserData() const { return mEventListenerUserData; } - -private: - //============================================================================== - AudioProcessor* juceFilter; - ScopedPointer windowComp; - FakeMouseMoveGenerator fakeMouseGenerator; - - void deleteUI() - { - if (windowComp != nullptr) - { - PopupMenu::dismissAllActiveMenus(); - - /* This assertion is triggered when there's some kind of modal component active, and the - host is trying to delete our plugin. - If you must use modal components, always use them in a non-blocking way, by never - calling runModalLoop(), but instead using enterModalState() with a callback that - will be performed on completion. (Note that this assertion could actually trigger - a false alarm even if you're doing it correctly, but is here to catch people who - aren't so careful) */ - jassert (Component::getCurrentlyModalComponent() == nullptr); - - if (JuceAU::EditorCompHolder* editorCompHolder = dynamic_cast (windowComp->getChildComponent(0))) - if (AudioProcessorEditor* audioProcessEditor = dynamic_cast (editorCompHolder->getChildComponent(0))) - juceFilter->editorBeingDeleted (audioProcessEditor); - - windowComp = nullptr; - } - } - - //============================================================================== - // Uses a child NSWindow to sit in front of a HIView and display our component - class ComponentInHIView : public Component - { - public: - ComponentInHIView (AudioProcessorEditor* ed, HIViewRef parentHIView) - : parentView (parentHIView), - editor (ed), - recursive (false) - { - JUCE_AUTORELEASEPOOL - { - jassert (ed != nullptr); - addAndMakeVisible (editor); - setOpaque (true); - setVisible (true); - setBroughtToFrontOnMouseClick (true); - - setSize (editor.getWidth(), editor.getHeight()); - SizeControl (parentHIView, (SInt16) editor.getWidth(), (SInt16) editor.getHeight()); - - WindowRef windowRef = HIViewGetWindow (parentHIView); - hostWindow = [[NSWindow alloc] initWithWindowRef: windowRef]; - - [hostWindow retain]; - [hostWindow setCanHide: YES]; - [hostWindow setReleasedWhenClosed: YES]; - - updateWindowPos(); - - #if ! JucePlugin_EditorRequiresKeyboardFocus - addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); - setWantsKeyboardFocus (false); - #else - addToDesktop (ComponentPeer::windowIsTemporary); - setWantsKeyboardFocus (true); - #endif - - setVisible (true); - toFront (false); - - addSubWindow(); - - NSWindow* pluginWindow = [((NSView*) getWindowHandle()) window]; - [pluginWindow setNextResponder: hostWindow]; - - attachWindowHidingHooks (this, (WindowRef) windowRef, hostWindow); - } - } - - ~ComponentInHIView() - { - JUCE_AUTORELEASEPOOL - { - removeWindowHidingHooks (this); - - NSWindow* pluginWindow = [((NSView*) getWindowHandle()) window]; - [hostWindow removeChildWindow: pluginWindow]; - removeFromDesktop(); - - [hostWindow release]; - hostWindow = nil; - } - } - - void updateWindowPos() - { - HIPoint f; - f.x = f.y = 0; - HIPointConvert (&f, kHICoordSpaceView, parentView, kHICoordSpaceScreenPixel, 0); - setTopLeftPosition ((int) f.x, (int) f.y); - } - - void addSubWindow() - { - NSWindow* pluginWindow = [((NSView*) getWindowHandle()) window]; - [pluginWindow setExcludedFromWindowsMenu: YES]; - [pluginWindow setCanHide: YES]; - - [hostWindow addChildWindow: pluginWindow - ordered: NSWindowAbove]; - [hostWindow orderFront: nil]; - [pluginWindow orderFront: nil]; - } - - void resized() override - { - if (Component* const child = getChildComponent (0)) - child->setBounds (getLocalBounds()); - } - - void paint (Graphics&) override {} - - void childBoundsChanged (Component*) override - { - if (! recursive) - { - recursive = true; - - const int w = jmax (32, editor.getWidth()); - const int h = jmax (32, editor.getHeight()); - - SizeControl (parentView, (SInt16) w, (SInt16) h); - - if (getWidth() != w || getHeight() != h) - setSize (w, h); - - editor.repaint(); - - updateWindowPos(); - addSubWindow(); // (need this for AULab) - - recursive = false; - } - } - - bool keyPressed (const KeyPress& kp) override - { - if (! kp.getModifiers().isCommandDown()) - { - // If we have an unused keypress, move the key-focus to a host window - // and re-inject the event.. - static NSTimeInterval lastEventTime = 0; // check we're not recursively sending the same event - NSTimeInterval eventTime = [[NSApp currentEvent] timestamp]; - - if (lastEventTime != eventTime) - { - lastEventTime = eventTime; - - [[hostWindow parentWindow] makeKeyWindow]; - repostCurrentNSEvent(); - } - } - - return false; - } - - private: - HIViewRef parentView; - NSWindow* hostWindow; - JuceAU::EditorCompHolder editor; - bool recursive; - }; -}; - -#endif - -//============================================================================== -#define JUCE_COMPONENT_ENTRYX(Class, Name, Suffix) \ - extern "C" __attribute__((visibility("default"))) ComponentResult Name ## Suffix (ComponentParameters* params, Class* obj); \ - extern "C" __attribute__((visibility("default"))) ComponentResult Name ## Suffix (ComponentParameters* params, Class* obj) \ - { \ - return ComponentEntryPoint::Dispatch (params, obj); \ - } - -#if JucePlugin_ProducesMidiOutput || JucePlugin_WantsMidiInput - #define FACTORY_BASE_CLASS AUMIDIEffectFactory -#else - #define FACTORY_BASE_CLASS AUBaseFactory -#endif - -#define JUCE_FACTORY_ENTRYX(Class, Name) \ - extern "C" __attribute__((visibility("default"))) void* Name ## Factory (const AudioComponentDescription* desc); \ - extern "C" __attribute__((visibility("default"))) void* Name ## Factory (const AudioComponentDescription* desc) \ - { \ - return FACTORY_BASE_CLASS::Factory (desc); \ - } - -#define JUCE_COMPONENT_ENTRY(Class, Name, Suffix) JUCE_COMPONENT_ENTRYX(Class, Name, Suffix) -#define JUCE_FACTORY_ENTRY(Class, Name) JUCE_FACTORY_ENTRYX(Class, Name) - -//============================================================================== -JUCE_COMPONENT_ENTRY (JuceAU, JucePlugin_AUExportPrefix, Entry) - -#ifndef AUDIOCOMPONENT_ENTRY - #define JUCE_DISABLE_AU_FACTORY_ENTRY 1 -#endif - -#if ! JUCE_DISABLE_AU_FACTORY_ENTRY // (You might need to disable this for old Xcode 3 builds) -JUCE_FACTORY_ENTRY (JuceAU, JucePlugin_AUExportPrefix) -#endif - -#if BUILD_AU_CARBON_UI - JUCE_COMPONENT_ENTRY (JuceAUView, JucePlugin_AUExportPrefix, ViewEntry) -#endif - -#if ! JUCE_DISABLE_AU_FACTORY_ENTRY - #include "AUPlugInDispatch.cpp" -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp deleted file mode 100755 index dddda73..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode1.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -#include "juce_RTAS_DigiCode_Header.h" - -/* - This file is used to include and build the required digidesign CPP files without your project - needing to reference the files directly. Because these files will be found via your include path, - this means that the project doesn't have to change to cope with people's SDKs being in different - locations. - - Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and - the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". - If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's - going on... All the other files in your project can be set to use the normal __cdecl convention. - - If you get an error building the includes statements below, check your paths - there's a full - list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp -*/ - -#if WINDOWS_VERSION - #undef _UNICODE - #undef UNICODE -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp deleted file mode 100755 index dfdc252..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode2.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -#include "juce_RTAS_DigiCode_Header.h" - -/* - This file is used to include and build the required digidesign CPP files without your project - needing to reference the files directly. Because these files will be found via your include path, - this means that the project doesn't have to change to cope with people's SDKs being in different - locations. - - Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and - the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". - If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's - going on... All the other files in your project can be set to use the normal __cdecl convention. - - If you get an error building the includes statements below, check your paths - there's a full - list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp -*/ - -#include -#include - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp deleted file mode 100755 index 9c6a873..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode3.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - - #include "juce_RTAS_DigiCode_Header.h" - - /* - This file is used to include and build the required digidesign CPP files without your project - needing to reference the files directly. Because these files will be found via your include path, - this means that the project doesn't have to change to cope with people's SDKs being in different - locations. - - Important note on Windows: In your project settings for the three juce_RTAS_DigiCode.cpp files and - the juce_RTAS_Wrapper.cpp file, you need to set the calling convention to "__stdcall". - If you don't do this, you'll get some unresolved externals and will spend a long time wondering what's - going on... All the other files in your project can be set to use the normal __cdecl convention. - - If you get an error building the includes statements below, check your paths - there's a full - list of the necessary Digidesign paths in juce_RTAS_Wrapper.cpp - */ - - #if WINDOWS_VERSION - #undef _UNICODE - #undef UNICODE - - #define DllMain DllMainRTAS - #include - #undef DllMain - #include - - #else - #include - #include - #endif - - #else - - #if _MSC_VER - short __stdcall NewPlugIn (void*) { return 0; } - short __stdcall _PI_GetRoutineDescriptor (long, void*) { return 0; } - #endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h deleted file mode 100755 index 2fe0e20..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_DigiCode_Header.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_RTAS_DIGICODE_HEADER_H_INCLUDED -#define JUCE_RTAS_DIGICODE_HEADER_H_INCLUDED - -#if JucePlugin_Build_RTAS - -//============================================================================== -#if JucePlugin_Build_RTAS -#ifdef _MSC_VER - - #define kCompileAsCodeResource 0 - #define kBuildStandAlone 0 - #define kNoDSP 0 - #define kNoDAE 0 - #define kNoSDS 0 - #define kNoViews 0 - #define kUseDSPCodeDecode 0 - - #define WIN32 1 - #define WINDOWS_VERSION 1 - #define PLUGIN_SDK_BUILD 1 - #define PLUGIN_SDK_DIRECTMIDI 1 - - // the Digidesign projects all use a struct alignment of 2.. - #pragma pack (2) - #pragma warning (disable: 4267 4996 4311 4312 4103 4121 4100 4127 4189 4245 4389 4512 4701) - - #include - -#else - - #define kCompileAsCodeResource 0 - #define kNoDSP 1 - #define kNoDAE 0 - #define kNoSDS 0 - #define kNoViews 0 - #define kUseDSPCodeDecode 0 - - #define MAC_VERSION 1 - #define PLUGIN_SDK_BUILD 1 - #define PLUGIN_SDK_DIRECTMIDI 1 - #define DIGI_PASCAL - - #include - -#endif -#endif -#endif - -#endif // JUCE_RTAS_DIGICODE_HEADER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacResources.r b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacResources.r deleted file mode 100755 index a40e1f3..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacResources.r +++ /dev/null @@ -1,6 +0,0 @@ - -/* - This dummy file is added to the resources section of the project to - force XCode to create some resources for the dpm. If there aren't any - resources, PT will refuse to load the plugin.. -*/ diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm deleted file mode 100755 index 22c3575..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_MacUtilities.mm +++ /dev/null @@ -1,169 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -// Horrible carbon-based fix for a cocoa bug, where an NSWindow that wraps a carbon -// window fails to keep its position updated when the user drags the window around.. -#define WINDOWPOSITION_BODGE 1 -#define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 - -#include "../utility/juce_IncludeSystemHeaders.h" -#include "../utility/juce_IncludeModuleHeaders.h" -#include "../utility/juce_CarbonVisibility.h" - -//============================================================================== -void initialiseMacRTAS(); -void initialiseMacRTAS() -{ - #if ! JUCE_64BIT - NSApplicationLoad(); - #endif -} - -void* attachSubWindow (void*, Component*); -void* attachSubWindow (void* hostWindowRef, Component* comp) -{ - JUCE_AUTORELEASEPOOL - { - #if 0 - // This was suggested as a way to improve passing keypresses to the host, but - // a side-effect seems to be occasional rendering artifacts. - HIWindowChangeClass ((WindowRef) hostWindowRef, kFloatingWindowClass); - #endif - - NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: hostWindowRef]; - [hostWindow retain]; - [hostWindow setCanHide: YES]; - [hostWindow setReleasedWhenClosed: YES]; - NSRect oldWindowFrame = [hostWindow frame]; - - NSView* content = [hostWindow contentView]; - NSRect f = [content frame]; - f.size.width = comp->getWidth(); - f.size.height = comp->getHeight(); - [content setFrame: f]; - - const CGFloat mainScreenHeight = [[[NSScreen screens] objectAtIndex: 0] frame].size.height; - - #if WINDOWPOSITION_BODGE - { - Rect winBounds; - GetWindowBounds ((WindowRef) hostWindowRef, kWindowContentRgn, &winBounds); - NSRect w = [hostWindow frame]; - w.origin.x = winBounds.left; - w.origin.y = mainScreenHeight - winBounds.bottom; - [hostWindow setFrame: w display: NO animate: NO]; - } - #endif - - NSPoint windowPos = [hostWindow convertBaseToScreen: f.origin]; - windowPos.x = windowPos.x + jmax (0.0f, (oldWindowFrame.size.width - f.size.width) / 2.0f); - windowPos.y = mainScreenHeight - (windowPos.y + f.size.height); - - comp->setTopLeftPosition ((int) windowPos.x, (int) windowPos.y); - - #if ! JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); - #else - comp->addToDesktop (ComponentPeer::windowIsTemporary); - #endif - - comp->setVisible (true); - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - - [hostWindow addChildWindow: pluginWindow - ordered: NSWindowAbove]; - [hostWindow orderFront: nil]; - [pluginWindow orderFront: nil]; - - attachWindowHidingHooks (comp, (WindowRef) hostWindowRef, hostWindow); - - return hostWindow; - } -} - -void removeSubWindow (void*, Component*); -void removeSubWindow (void* nsWindow, Component* comp) -{ - JUCE_AUTORELEASEPOOL - { - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* hostWindow = (NSWindow*) nsWindow; - NSWindow* pluginWindow = [pluginView window]; - - removeWindowHidingHooks (comp); - [hostWindow removeChildWindow: pluginWindow]; - comp->removeFromDesktop(); - [hostWindow release]; - } -} - -namespace -{ - bool isJuceWindow (WindowRef w) - { - for (int i = ComponentPeer::getNumPeers(); --i >= 0;) - { - ComponentPeer* peer = ComponentPeer::getPeer(i); - NSView* view = (NSView*) peer->getNativeHandle(); - - if ([[view window] windowRef] == w) - return true; - } - - return false; - } -} - -void forwardCurrentKeyEventToHostWindow(); -void forwardCurrentKeyEventToHostWindow() -{ - WindowRef w = FrontNonFloatingWindow(); - WindowRef original = w; - - while (IsValidWindowPtr (w) && isJuceWindow (w)) - { - w = GetNextWindowOfClass (w, kDocumentWindowClass, true); - - if (w == original) - break; - } - - if (! isJuceWindow (w)) - { - ActivateWindow (w, true); - repostCurrentNSEvent(); - } -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def deleted file mode 100755 index 31b0925..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinExports.def +++ /dev/null @@ -1,3 +0,0 @@ -EXPORTS - NewPlugIn @1 - _PI_GetRoutineDescriptor @2 diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources.rsr b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinResources.rsr deleted file mode 100755 index d8bfb4a1c8594d8faf551d09f1b3c7a07f875fce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3198 zcmd^BO>7%Q6ngjND65S;QOf{;QW6h$pb6cQS#C@9$Lbdh6Qc7Dhy zD;gxYRN|UTZwNSY$_eNd#SN#3i(|L+=-8I3G+le`;k}t1k9V7-;=qY#@4olG_dm0< zHh=*D&kX^b#>>F#e@9nNy}&vFI^XOc=pXp%^~m5mE$J2Z)4<^1Td!VoP@sP$?1E19661?$Idb2lD*`S_G=+Ndr3JcbIB2Q z4=%OYm1nyh>quB})c%#-OVAeXk3VD(Uw+4PP|XGFx8X_*#4EVP19rJEEo)%Dr}if& zJ90i{P#o*{>MLCFfL+5{67hOFz0Nh@v+KE(gTKDEwG@6a$$Zhf(9)u$a z?PP0JbX>nH+7YR>$mMlKP$Nqd51q#9ytco;@7Czc-Flm*m z;I)H;1Gh$B-aHV!VMCNd5>@jETxG^8n*99(oCpHB(3X#OLwO%nLObzze1R|_NIgzE z;_-!w@RvG)Qs2Pfdxw4NcyLvN(RB8CPpi+e{ir)2Lw2Newe132D&s`{RzDLx6?qWGy zEOv7)3bUb#SDIh`G z1t4yoKOJ1*bV$5DLMR>X@5`rBiNa6hbL#p`kW|;tx|ph2mxqqm-MR}do+9Zl+&FM? ztkkNYie!6F{oS10xtqS3Am#|l9pWfr#Ha5?#_ujl?8@6%t&U)|WIosg82)wrT&H0*YImm^bpQm@( z+0n62r;r<$CqKL_O4_3zj9rit;UslTjeNW!Ajn7rt{D@MFupr^V*H9Q^uPreH*S49 zId#LzvSl-qwNgozinG}WLm-t*tg_{~gcW07n2Rf>nPjsAY%UpNvzPkWM8cfQnrtZ@ zn_D#5YHBINqN((%499<8&A%li7sobxyAe8Tya*v04&^Vsby~KfiMLVz8u=T@Z&}eS z=^MyN{{cCz=P&P%ja)_ktGD8Rcq_g$GCD>0{o$*Vv=ilMJTs5H2Dp<91wl5a$8KE9 z#wS`nbxq41*R}lY=WX)eTJC&F$l})dQ5#NuK+g=->J&M9W+04mPWa%90p&v1#R=#h cUrCx7mNB!qSy8iVIGtuw)`A&h<4cSG0Paa_uK)l5 diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp deleted file mode 100755 index 7395136..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_WinUtilities.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" - -// (these functions are in their own file because of problems including windows.h -// at the same time as the Digi headers) - -#if JucePlugin_Build_RTAS - -#define _DO_NOT_DECLARE_INTERLOCKED_INTRINSICS_IN_MEMORY // (workaround for a VC build problem) - -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0500 -#undef STRICT -#define STRICT -#include -#include - -#pragma pack (push, 8) -#include "../utility/juce_IncludeModuleHeaders.h" -#pragma pack (pop) - -//============================================================================== -void JUCE_CALLTYPE attachSubWindow (void* hostWindow, - int& titleW, int& titleH, - Component* comp) -{ - RECT clientRect; - GetClientRect ((HWND) hostWindow, &clientRect); - - titleW = clientRect.right - clientRect.left; - titleH = jmax (0, (int) (clientRect.bottom - clientRect.top) - comp->getHeight()); - comp->setTopLeftPosition (0, titleH); - - comp->addToDesktop (0); - - HWND plugWnd = (HWND) comp->getWindowHandle(); - SetParent (plugWnd, (HWND) hostWindow); - - DWORD val = GetWindowLong (plugWnd, GWL_STYLE); - val = (val & ~WS_POPUP) | WS_CHILD; - SetWindowLong (plugWnd, GWL_STYLE, val); - - val = GetWindowLong ((HWND) hostWindow, GWL_STYLE); - SetWindowLong ((HWND) hostWindow, GWL_STYLE, val | WS_CLIPCHILDREN); -} - -void JUCE_CALLTYPE resizeHostWindow (void* hostWindow, - int& titleW, int& titleH, - Component* comp) -{ - RECT clientRect, windowRect; - GetClientRect ((HWND) hostWindow, &clientRect); - GetWindowRect ((HWND) hostWindow, &windowRect); - const int borderW = (windowRect.right - windowRect.left) - (clientRect.right - clientRect.left); - const int borderH = (windowRect.bottom - windowRect.top) - (clientRect.bottom - clientRect.top); - - SetWindowPos ((HWND) hostWindow, 0, 0, 0, - borderW + jmax (titleW, comp->getWidth()), - borderH + comp->getHeight() + titleH, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); -} - -#if ! JucePlugin_EditorRequiresKeyboardFocus - -namespace -{ - HWND findMDIParentOf (HWND w) - { - const int frameThickness = GetSystemMetrics (SM_CYFIXEDFRAME); - - while (w != 0) - { - HWND parent = GetParent (w); - - if (parent == 0) - break; - - TCHAR windowType [32] = { 0 }; - GetClassName (parent, windowType, 31); - - if (String (windowType).equalsIgnoreCase ("MDIClient")) - { - w = parent; - break; - } - - RECT windowPos, parentPos; - GetWindowRect (w, &windowPos); - GetWindowRect (parent, &parentPos); - - int dw = (parentPos.right - parentPos.left) - (windowPos.right - windowPos.left); - int dh = (parentPos.bottom - parentPos.top) - (windowPos.bottom - windowPos.top); - - if (dw > 100 || dh > 100) - break; - - w = parent; - - if (dw == 2 * frameThickness) - break; - } - - return w; - } -} - -void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow) -{ - SetFocus (findMDIParentOf ((HWND) hostWindow)); -} - -#endif -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp deleted file mode 100755 index 3cc690a..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/RTAS/juce_RTAS_Wrapper.cpp +++ /dev/null @@ -1,990 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_RTAS - -#ifdef _MSC_VER - // (this is a workaround for a build problem in VC9) - #define _DO_NOT_DECLARE_INTERLOCKED_INTRINSICS_IN_MEMORY - #include -#endif - -#include "juce_RTAS_DigiCode_Header.h" - -#ifdef _MSC_VER - #include -#endif - -/* Note about include paths - ------------------------ - - To be able to include all the Digidesign headers correctly, you'll need to add this - lot to your include path: - - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\EffectClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ProcessClasses\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Utilities - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\RTASP_Adapt - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\CoreClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Controls - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Meters - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\ViewClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\DSPClasses - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\PluginLibrary\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\common - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\common\Platform - c:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugins\SignalProcessing\Public - C:\yourdirectory\PT_80_SDK\AlturaPorts\TDMPlugIns\DSPManager\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\SADriver\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\DigiPublic\Interfaces - c:\yourdirectory\PT_80_SDK\AlturaPorts\Fic\Interfaces\DAEClient - c:\yourdirectory\PT_80_SDK\AlturaPorts\NewFileLibs\Cmn - c:\yourdirectory\PT_80_SDK\AlturaPorts\NewFileLibs\DOA - c:\yourdirectory\PT_80_SDK\AlturaPorts\AlturaSource\PPC_H - c:\yourdirectory\PT_80_SDK\AlturaPorts\AlturaSource\AppSupport - c:\yourdirectory\PT_80_SDK\AlturaPorts\DigiPublic - c:\yourdirectory\PT_80_SDK\AvidCode\AVX2sdk\AVX\avx2\avx2sdk\inc - c:\yourdirectory\PT_80_SDK\xplat\AVX\avx2\avx2sdk\inc - - NB. If you hit a huge pile of bugs around here, make sure that you've not got the - Apple QuickTime headers before the PT headers in your path, because there are - some filename clashes between them. - -*/ -#include -#include -#include -#include -#include -#include -#include -#include -#include - -//============================================================================== -#ifdef _MSC_VER - #pragma pack (push, 8) - #pragma warning (disable: 4263 4264) -#endif - -#include "../utility/juce_IncludeModuleHeaders.h" - -#ifdef _MSC_VER - #pragma pack (pop) - - // This JUCE_RTAS_LINK_TO_DEBUG_LIB setting can be used to force linkage - // against only the release build of the RTAS lib, since in older SDKs there - // can be problems with the debug build. - #if JUCE_DEBUG && ! defined (JUCE_RTAS_LINK_TO_DEBUG_LIB) - #define JUCE_RTAS_LINK_TO_DEBUG_LIB 1 - #endif - - #if JUCE_RTAS_LINK_TO_DEBUG_LIB - #define PT_LIB_PATH JucePlugin_WinBag_path "\\Debug\\lib\\" - #else - #define PT_LIB_PATH JucePlugin_WinBag_path "\\Release\\lib\\" - #endif - - #pragma comment(lib, PT_LIB_PATH "DAE.lib") - #pragma comment(lib, PT_LIB_PATH "DigiExt.lib") - #pragma comment(lib, PT_LIB_PATH "DSI.lib") - #pragma comment(lib, PT_LIB_PATH "PluginLib.lib") - #pragma comment(lib, PT_LIB_PATH "DSPManager.lib") - #pragma comment(lib, PT_LIB_PATH "DSPManagerClientLib.lib") - #pragma comment(lib, PT_LIB_PATH "RTASClientLib.lib") -#endif - -#undef Component -#undef MemoryBlock - -//============================================================================== -#if JUCE_WINDOWS - extern void JUCE_CALLTYPE attachSubWindow (void* hostWindow, int& titleW, int& titleH, juce::Component* comp); - extern void JUCE_CALLTYPE resizeHostWindow (void* hostWindow, int& titleW, int& titleH, juce::Component* comp); - #if ! JucePlugin_EditorRequiresKeyboardFocus - extern void JUCE_CALLTYPE passFocusToHostWindow (void* hostWindow); - #endif -#else - extern void* attachSubWindow (void* hostWindowRef, juce::Component* comp); - extern void removeSubWindow (void* nsWindow, juce::Component* comp); - extern void forwardCurrentKeyEventToHostWindow(); -#endif - -#if ! (JUCE_DEBUG || defined (JUCE_RTAS_PLUGINGESTALT_IS_CACHEABLE)) - #define JUCE_RTAS_PLUGINGESTALT_IS_CACHEABLE 1 -#endif - -const int midiBufferSize = 1024; -const OSType juceChunkType = 'juce'; -static const int bypassControlIndex = 1; - -static int numInstances = 0; - -//============================================================================== -class JucePlugInProcess : public CEffectProcessMIDI, - public CEffectProcessRTAS, - public AudioProcessorListener, - public AudioPlayHead -{ -public: - //============================================================================== - JucePlugInProcess() - : sampleRate (44100.0) - { - juceFilter = createPluginFilterOfType (AudioProcessor::wrapperType_RTAS); - - AddChunk (juceChunkType, "Juce Audio Plugin Data"); - - ++numInstances; - } - - ~JucePlugInProcess() - { - JUCE_AUTORELEASEPOOL - { - if (mLoggedIn) - MIDILogOut(); - - midiBufferNode = nullptr; - midiTransport = nullptr; - - if (juceFilter != nullptr) - { - juceFilter->releaseResources(); - juceFilter = nullptr; - } - - if (--numInstances == 0) - { - #if JUCE_MAC - // Hack to allow any NSWindows to clear themselves up before returning to PT.. - for (int i = 20; --i >= 0;) - MessageManager::getInstance()->runDispatchLoopUntil (1); - #endif - - shutdownJuce_GUI(); - } - } - } - - //============================================================================== - class JuceCustomUIView : public CCustomView, - public Timer - { - public: - //============================================================================== - JuceCustomUIView (AudioProcessor* ap, JucePlugInProcess* p) - : filter (ap), process (p) - { - // setting the size in here crashes PT for some reason, so keep it simple.. - } - - ~JuceCustomUIView() - { - deleteEditorComp(); - } - - //============================================================================== - void updateSize() - { - if (editorComp == nullptr) - { - editorComp = filter->createEditorIfNeeded(); - jassert (editorComp != nullptr); - } - - if (editorComp->getWidth() != 0 && editorComp->getHeight() != 0) - { - Rect oldRect; - GetRect (&oldRect); - - Rect r; - r.left = 0; - r.top = 0; - r.right = editorComp->getWidth(); - r.bottom = editorComp->getHeight(); - SetRect (&r); - - if (oldRect.right != r.right || oldRect.bottom != r.bottom) - startTimer (50); - } - } - - void timerCallback() override - { - if (! juce::Component::isMouseButtonDownAnywhere()) - { - stopTimer(); - - // Send a token to the host to tell it about the resize - SSetProcessWindowResizeToken token (process->fRootNameId, process->fRootNameId); - FicSDSDispatchToken (&token); - } - } - - void attachToWindow (GrafPtr port) - { - if (port != 0) - { - JUCE_AUTORELEASEPOOL - { - updateSize(); - - #if JUCE_WINDOWS - void* const hostWindow = (void*) ASI_GethWnd ((WindowPtr) port); - #else - void* const hostWindow = (void*) GetWindowFromPort (port); - #endif - wrapper = nullptr; - wrapper = new EditorCompWrapper (hostWindow, editorComp, this); - } - } - else - { - deleteEditorComp(); - } - } - - void DrawContents (Rect*) - { - #if JUCE_WINDOWS - if (wrapper != nullptr) - { - if (ComponentPeer* const peer = wrapper->getPeer()) - peer->repaint (wrapper->getLocalBounds()); // (seems to be required in PT6.4, but not in 7.x) - } - #endif - } - - void DrawBackground (Rect*) {} - - //============================================================================== - private: - AudioProcessor* const filter; - JucePlugInProcess* const process; - ScopedPointer wrapper; - ScopedPointer editorComp; - - void deleteEditorComp() - { - if (editorComp != nullptr || wrapper != nullptr) - { - JUCE_AUTORELEASEPOOL - { - PopupMenu::dismissAllActiveMenus(); - - if (juce::Component* const modalComponent = juce::Component::getCurrentlyModalComponent()) - modalComponent->exitModalState (0); - - filter->editorBeingDeleted (editorComp); - - editorComp = nullptr; - wrapper = nullptr; - } - } - } - - //============================================================================== - // A component to hold the AudioProcessorEditor, and cope with some housekeeping - // chores when it changes or repaints. - class EditorCompWrapper : public juce::Component - #if ! JUCE_MAC - , public FocusChangeListener - #endif - { - public: - EditorCompWrapper (void* const hostWindow_, - Component* const editorComp, - JuceCustomUIView* const owner_) - : hostWindow (hostWindow_), - owner (owner_), - titleW (0), - titleH (0) - { - #if ! JucePlugin_EditorRequiresKeyboardFocus - setMouseClickGrabsKeyboardFocus (false); - setWantsKeyboardFocus (false); - #endif - setOpaque (true); - setBroughtToFrontOnMouseClick (true); - setBounds (editorComp->getBounds()); - editorComp->setTopLeftPosition (0, 0); - addAndMakeVisible (editorComp); - - #if JUCE_WINDOWS - attachSubWindow (hostWindow, titleW, titleH, this); - #else - nsWindow = attachSubWindow (hostWindow, this); - #endif - setVisible (true); - - #if JUCE_WINDOWS && ! JucePlugin_EditorRequiresKeyboardFocus - Desktop::getInstance().addFocusChangeListener (this); - #endif - } - - ~EditorCompWrapper() - { - removeChildComponent (getEditor()); - - #if JUCE_WINDOWS && ! JucePlugin_EditorRequiresKeyboardFocus - Desktop::getInstance().removeFocusChangeListener (this); - #endif - - #if JUCE_MAC - removeSubWindow (nsWindow, this); - #endif - } - - void paint (Graphics&) override {} - - void resized() override - { - if (juce::Component* const ed = getEditor()) - ed->setBounds (getLocalBounds()); - - repaint(); - } - - #if JUCE_WINDOWS - void globalFocusChanged (juce::Component*) override - { - #if ! JucePlugin_EditorRequiresKeyboardFocus - if (hasKeyboardFocus (true)) - passFocusToHostWindow (hostWindow); - #endif - } - #endif - - void childBoundsChanged (juce::Component* child) override - { - setSize (child->getWidth(), child->getHeight()); - child->setTopLeftPosition (0, 0); - - #if JUCE_WINDOWS - resizeHostWindow (hostWindow, titleW, titleH, this); - #endif - owner->updateSize(); - } - - void userTriedToCloseWindow() override {} - - #if JUCE_MAC && JucePlugin_EditorRequiresKeyboardFocus - bool keyPressed (const KeyPress& kp) override - { - owner->updateSize(); - forwardCurrentKeyEventToHostWindow(); - return true; - } - #endif - - private: - //============================================================================== - void* const hostWindow; - void* nsWindow; - JuceCustomUIView* const owner; - int titleW, titleH; - - juce::Component* getEditor() const { return getChildComponent (0); } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EditorCompWrapper) - }; - }; - - JuceCustomUIView* getView() const - { - return dynamic_cast (fOurPlugInView); - } - - void GetViewRect (Rect* size) override - { - if (JuceCustomUIView* const v = getView()) - v->updateSize(); - - CEffectProcessRTAS::GetViewRect (size); - } - - CPlugInView* CreateCPlugInView() override - { - return new JuceCustomUIView (juceFilter, this); - } - - void SetViewPort (GrafPtr port) override - { - CEffectProcessRTAS::SetViewPort (port); - - if (JuceCustomUIView* const v = getView()) - v->attachToWindow (port); - } - - //============================================================================== - ComponentResult GetDelaySamplesLong (long* aNumSamples) override - { - if (aNumSamples != nullptr) - *aNumSamples = juceFilter != nullptr ? juceFilter->getLatencySamples() : 0; - - return noErr; - } - - //============================================================================== - void EffectInit() override - { - sampleRate = (double) GetSampleRate(); - jassert (sampleRate > 0); - const int maxBlockSize = (int) CEffectProcessRTAS::GetMaximumRTASQuantum(); - jassert (maxBlockSize > 0); - - SFicPlugInStemFormats stems; - GetProcessType()->GetStemFormats (&stems); - - juceFilter->setPlayConfigDetails (fNumInputs, fNumOutputs, sampleRate, maxBlockSize); - - AddControl (new CPluginControl_OnOff ('bypa', "Master Bypass\nMastrByp\nMByp\nByp", false, true)); - DefineMasterBypassControlIndex (bypassControlIndex); - - for (int i = 0; i < juceFilter->getNumParameters(); ++i) - AddControl (new JucePluginControl (juceFilter, i)); - - // we need to do this midi log-in to get timecode, regardless of whether - // the plugin actually uses midi... - if (MIDILogIn() == noErr) - { - #if JucePlugin_WantsMidiInput - if (CEffectType* const type = dynamic_cast (this->GetProcessType())) - { - char nodeName [64]; - type->GetProcessTypeName (63, nodeName); - p2cstrcpy (nodeName, reinterpret_cast (nodeName)); - - midiBufferNode = new CEffectMIDIOtherBufferedNode (&mMIDIWorld, - 8192, - eLocalNode, - nodeName, - midiBuffer); - - midiBufferNode->Initialize (0xffff, true); - } - #endif - } - - midiTransport = new CEffectMIDITransport (&mMIDIWorld); - midiEvents.ensureSize (2048); - - channels.calloc (jmax (juceFilter->getNumInputChannels(), - juceFilter->getNumOutputChannels())); - - juceFilter->setPlayHead (this); - juceFilter->addListener (this); - - juceFilter->prepareToPlay (sampleRate, maxBlockSize); - } - - void RenderAudio (float** inputs, float** outputs, long numSamples) override - { - #if JucePlugin_WantsMidiInput - midiEvents.clear(); - - const Cmn_UInt32 bufferSize = mRTGlobals->mHWBufferSizeInSamples; - - if (midiBufferNode != nullptr) - { - if (midiBufferNode->GetAdvanceScheduleTime() != bufferSize) - midiBufferNode->SetAdvanceScheduleTime (bufferSize); - - if (midiBufferNode->FillMIDIBuffer (mRTGlobals->mRunningTime, numSamples) == noErr) - { - jassert (midiBufferNode->GetBufferPtr() != nullptr); - const int numMidiEvents = midiBufferNode->GetBufferSize(); - - for (int i = 0; i < numMidiEvents; ++i) - { - const DirectMidiPacket& m = midiBuffer[i]; - - jassert ((int) m.mTimestamp < numSamples); - - midiEvents.addEvent (m.mData, m.mLength, - jlimit (0, (int) numSamples - 1, (int) m.mTimestamp)); - } - } - } - #endif - - #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS - const int numMidiEventsComingIn = midiEvents.getNumEvents(); - (void) numMidiEventsComingIn; - #endif - - { - const ScopedLock sl (juceFilter->getCallbackLock()); - - const int numIn = juceFilter->getNumInputChannels(); - const int numOut = juceFilter->getNumOutputChannels(); - const int totalChans = jmax (numIn, numOut); - - if (juceFilter->isSuspended()) - { - for (int i = 0; i < numOut; ++i) - FloatVectorOperations::clear (outputs [i], numSamples); - } - else - { - { - int i; - for (i = 0; i < numOut; ++i) - { - channels[i] = outputs [i]; - - if (i < numIn && inputs != outputs) - FloatVectorOperations::copy (outputs [i], inputs[i], numSamples); - } - - for (; i < numIn; ++i) - channels [i] = inputs [i]; - } - - AudioSampleBuffer chans (channels, totalChans, numSamples); - - if (mBypassed) - juceFilter->processBlockBypassed (chans, midiEvents); - else - juceFilter->processBlock (chans, midiEvents); - } - } - - if (! midiEvents.isEmpty()) - { - #if JucePlugin_ProducesMidiOutput - const juce::uint8* midiEventData; - int midiEventSize, midiEventPosition; - MidiBuffer::Iterator i (midiEvents); - - while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) - { - //jassert (midiEventPosition >= 0 && midiEventPosition < (int) numSamples); - } - #elif JUCE_DEBUG || JUCE_LOG_ASSERTIONS - // if your plugin creates midi messages, you'll need to set - // the JucePlugin_ProducesMidiOutput macro to 1 in your - // JucePluginCharacteristics.h file - jassert (midiEvents.getNumEvents() <= numMidiEventsComingIn); - #endif - - midiEvents.clear(); - } - } - - //============================================================================== - ComponentResult GetChunkSize (OSType chunkID, long* size) override - { - if (chunkID == juceChunkType) - { - tempFilterData.reset(); - juceFilter->getStateInformation (tempFilterData); - - *size = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); - return noErr; - } - - return CEffectProcessMIDI::GetChunkSize (chunkID, size); - } - - ComponentResult GetChunk (OSType chunkID, SFicPlugInChunk* chunk) override - { - if (chunkID == juceChunkType) - { - if (tempFilterData.getSize() == 0) - juceFilter->getStateInformation (tempFilterData); - - chunk->fSize = sizeof (SFicPlugInChunkHeader) + tempFilterData.getSize(); - tempFilterData.copyTo ((void*) chunk->fData, 0, tempFilterData.getSize()); - - tempFilterData.reset(); - - return noErr; - } - - return CEffectProcessMIDI::GetChunk (chunkID, chunk); - } - - ComponentResult SetChunk (OSType chunkID, SFicPlugInChunk* chunk) override - { - if (chunkID == juceChunkType) - { - tempFilterData.reset(); - - if (chunk->fSize - sizeof (SFicPlugInChunkHeader) > 0) - { - juceFilter->setStateInformation ((void*) chunk->fData, - chunk->fSize - sizeof (SFicPlugInChunkHeader)); - } - - return noErr; - } - - return CEffectProcessMIDI::SetChunk (chunkID, chunk); - } - - //============================================================================== - ComponentResult UpdateControlValue (long controlIndex, long value) override - { - if (controlIndex != bypassControlIndex) - juceFilter->setParameter (controlIndex - 2, longToFloat (value)); - else - mBypassed = (value > 0); - - return CProcess::UpdateControlValue (controlIndex, value); - } - - #if JUCE_WINDOWS - Boolean HandleKeystroke (EventRecord* e) override - { - if (juce::Component* modalComp = juce::Component::getCurrentlyModalComponent()) - { - if (juce::Component* focused = modalComp->getCurrentlyFocusedComponent()) - { - switch (e->message & charCodeMask) - { - case kReturnCharCode: - case kEnterCharCode: focused->keyPressed (KeyPress (KeyPress::returnKey)); break; - case kEscapeCharCode: focused->keyPressed (KeyPress (KeyPress::escapeKey)); break; - default: break; - } - - return true; - } - } - - return false; - } - #endif - - //============================================================================== - bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override - { - Cmn_Float64 bpm = 120.0; - Cmn_Int32 num = 4, denom = 4; - Cmn_Int64 ticks = 0; - Cmn_Bool isPlaying = false; - - if (midiTransport != nullptr) - { - midiTransport->GetCurrentTempo (&bpm); - midiTransport->IsTransportPlaying (&isPlaying); - midiTransport->GetCurrentMeter (&num, &denom); - - // (The following is a work-around because GetCurrentTickPosition() doesn't work correctly). - Cmn_Int64 sampleLocation; - - if (isPlaying) - midiTransport->GetCurrentRTASSampleLocation (&sampleLocation); - else - midiTransport->GetCurrentTDMSampleLocation (&sampleLocation); - - midiTransport->GetCustomTickPosition (&ticks, sampleLocation); - - info.timeInSamples = (int64) sampleLocation; - info.timeInSeconds = sampleLocation / sampleRate; - } - else - { - info.timeInSamples = 0; - info.timeInSeconds = 0; - } - - info.bpm = bpm; - info.timeSigNumerator = num; - info.timeSigDenominator = denom; - info.isPlaying = isPlaying; - info.isRecording = false; - info.ppqPosition = ticks / 960000.0; - info.ppqPositionOfLastBarStart = 0; //xxx no idea how to get this correctly.. - info.isLooping = false; - info.ppqLoopStart = 0; - info.ppqLoopEnd = 0; - - double framesPerSec = 24.0; - - switch (fTimeCodeInfo.mFrameRate) - { - case ficFrameRate_24Frame: info.frameRate = AudioPlayHead::fps24; break; - case ficFrameRate_25Frame: info.frameRate = AudioPlayHead::fps25; framesPerSec = 25.0; break; - case ficFrameRate_2997NonDrop: info.frameRate = AudioPlayHead::fps2997; framesPerSec = 29.97002997; break; - case ficFrameRate_2997DropFrame: info.frameRate = AudioPlayHead::fps2997drop; framesPerSec = 29.97002997; break; - case ficFrameRate_30NonDrop: info.frameRate = AudioPlayHead::fps30; framesPerSec = 30.0; break; - case ficFrameRate_30DropFrame: info.frameRate = AudioPlayHead::fps30drop; framesPerSec = 30.0; break; - case ficFrameRate_23976: info.frameRate = AudioPlayHead::fps24; framesPerSec = 23.976; break; - default: info.frameRate = AudioPlayHead::fpsUnknown; break; - } - - info.editOriginTime = fTimeCodeInfo.mFrameOffset / framesPerSec; - - return true; - } - - void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override - { - SetControlValue (index + 2, floatToLong (newValue)); - } - - void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override - { - TouchControl (index + 2); - } - - void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override - { - ReleaseControl (index + 2); - } - - void audioProcessorChanged (AudioProcessor*) override - { - // xxx is there an RTAS equivalent? - } - -private: - ScopedPointer juceFilter; - MidiBuffer midiEvents; - ScopedPointer midiBufferNode; - ScopedPointer midiTransport; - DirectMidiPacket midiBuffer [midiBufferSize]; - - juce::MemoryBlock tempFilterData; - HeapBlock channels; - double sampleRate; - - static float longToFloat (const long n) noexcept - { - return (float) ((((double) n) + (double) 0x80000000) / (double) 0xffffffff); - } - - static long floatToLong (const float n) noexcept - { - return roundToInt (jlimit (-(double) 0x80000000, (double) 0x7fffffff, - n * (double) 0xffffffff - (double) 0x80000000)); - } - - void bypassBuffers (float** const inputs, float** const outputs, const long numSamples) const - { - for (int i = fNumOutputs; --i >= 0;) - { - if (i < fNumInputs) - FloatVectorOperations::copy (outputs[i], inputs[i], numSamples); - else - FloatVectorOperations::clear (outputs[i], numSamples); - } - } - - //============================================================================== - class JucePluginControl : public CPluginControl - { - public: - //============================================================================== - JucePluginControl (AudioProcessor* const juceFilter_, const int index_) - : juceFilter (juceFilter_), - index (index_) - { - } - - //============================================================================== - OSType GetID() const { return index + 1; } - long GetDefaultValue() const { return floatToLong (juceFilter->getParameterDefaultValue (index)); } - void SetDefaultValue (long) {} - long GetNumSteps() const { return juceFilter->getParameterNumSteps (index); } - - long ConvertStringToValue (const char* valueString) const - { - return floatToLong (String (valueString).getFloatValue()); - } - - Cmn_Bool IsKeyValid (long key) const { return true; } - - void GetNameOfLength (char* name, int maxLength, OSType inControllerType) const - { - // Pro-tools expects all your parameters to have valid names! - jassert (juceFilter->getParameterName (index, maxLength).isNotEmpty()); - - juceFilter->getParameterName (index, maxLength).copyToUTF8 (name, (size_t) maxLength + 1); - } - - long GetPriority() const { return kFicCooperativeTaskPriority; } - - long GetOrientation() const - { - return juceFilter->isParameterOrientationInverted (index) - ? kDAE_RightMinLeftMax | kDAE_TopMinBottomMax | kDAE_RotarySingleDotMode | kDAE_RotaryRightMinLeftMax - : kDAE_LeftMinRightMax | kDAE_BottomMinTopMax | kDAE_RotarySingleDotMode | kDAE_RotaryLeftMinRightMax; - } - - long GetControlType() const { return kDAE_ContinuousValues; } - - void GetValueString (char* valueString, int maxLength, long value) const - { - juceFilter->getParameterText (index, maxLength).copyToUTF8 (valueString, (size_t) maxLength + 1); - } - - Cmn_Bool IsAutomatable() const - { - return juceFilter->isParameterAutomatable (index); - } - - private: - //============================================================================== - AudioProcessor* const juceFilter; - const int index; - - JUCE_DECLARE_NON_COPYABLE (JucePluginControl) - }; -}; - -//============================================================================== -class JucePlugInGroup : public CEffectGroupMIDI -{ -public: - //============================================================================== - JucePlugInGroup() - { - DefineManufacturerNamesAndID (JucePlugin_Manufacturer, JucePlugin_RTASManufacturerCode); - DefinePlugInNamesAndVersion (createRTASName().toUTF8(), JucePlugin_VersionCode); - - #if JUCE_RTAS_PLUGINGESTALT_IS_CACHEABLE - AddGestalt (pluginGestalt_IsCacheable); - #endif - } - - ~JucePlugInGroup() - { - shutdownJuce_GUI(); - } - - //============================================================================== - void CreateEffectTypes() - { - const short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; - const int numConfigs = numElementsInArray (channelConfigs); - - // You need to actually add some configurations to the JucePlugin_PreferredChannelConfigurations - // value in your JucePluginCharacteristics.h file.. - jassert (numConfigs > 0); - - for (int i = 0; i < numConfigs; ++i) - { - if (channelConfigs[i][0] <= 8 && channelConfigs[i][1] <= 8) - { - CEffectType* const type - = new CEffectTypeRTAS ('jcaa' + i, - JucePlugin_RTASProductId, - JucePlugin_RTASCategory); - - type->DefineTypeNames (createRTASName().toRawUTF8()); - type->DefineSampleRateSupport (eSupports48kAnd96kAnd192k); - - type->DefineStemFormats (getFormatForChans (channelConfigs [i][0] != 0 ? channelConfigs [i][0] : channelConfigs [i][1]), - getFormatForChans (channelConfigs [i][1] != 0 ? channelConfigs [i][1] : channelConfigs [i][0])); - - #if ! JucePlugin_RTASDisableBypass - type->AddGestalt (pluginGestalt_CanBypass); - #endif - - #if JucePlugin_RTASDisableMultiMono - type->AddGestalt (pluginGestalt_DoesntSupportMultiMono); - #endif - - type->AddGestalt (pluginGestalt_SupportsVariableQuanta); - type->AttachEffectProcessCreator (createNewProcess); - - AddEffectType (type); - } - } - } - - void Initialize() - { - CEffectGroupMIDI::Initialize(); - } - - //============================================================================== -private: - static CEffectProcess* createNewProcess() - { - #if JUCE_WINDOWS - Process::setCurrentModuleInstanceHandle (gThisModule); - #endif - - initialiseJuce_GUI(); - - return new JucePlugInProcess(); - } - - static String createRTASName() - { - return String (JucePlugin_Name) + "\n" - + String (JucePlugin_Desc); - } - - static EPlugIn_StemFormat getFormatForChans (const int numChans) noexcept - { - switch (numChans) - { - case 0: return ePlugIn_StemFormat_Generic; - case 1: return ePlugIn_StemFormat_Mono; - case 2: return ePlugIn_StemFormat_Stereo; - case 3: return ePlugIn_StemFormat_LCR; - case 4: return ePlugIn_StemFormat_Quad; - case 5: return ePlugIn_StemFormat_5dot0; - case 6: return ePlugIn_StemFormat_5dot1; - - #if PT_VERS_MAJOR >= 9 - case 7: return ePlugIn_StemFormat_7dot0DTS; - case 8: return ePlugIn_StemFormat_7dot1DTS; - #else - case 7: return ePlugIn_StemFormat_7dot0; - case 8: return ePlugIn_StemFormat_7dot1; - #endif - - default: jassertfalse; break; // hmm - not a valid number of chans for RTAS.. - } - - return ePlugIn_StemFormat_Generic; - } -}; - -void initialiseMacRTAS(); - -CProcessGroupInterface* CProcessGroup::CreateProcessGroup() -{ - #if JUCE_MAC - initialiseMacRTAS(); - #endif - - return new JucePlugInGroup(); -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h b/JuceLibraryCode/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h deleted file mode 100755 index bdf7269..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/Standalone/juce_StandaloneFilterWindow.h +++ /dev/null @@ -1,394 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_STANDALONEFILTERWINDOW_H_INCLUDED -#define JUCE_STANDALONEFILTERWINDOW_H_INCLUDED - -extern AudioProcessor* JUCE_CALLTYPE createPluginFilter(); - -//============================================================================== -/** - An object that creates and plays a standalone instance of an AudioProcessor. - - The object will create your processor using the same createPluginFilter() - function that the other plugin wrappers use, and will run it through the - computer's audio/MIDI devices using AudioDeviceManager and AudioProcessorPlayer. -*/ -class StandalonePluginHolder -{ -public: - /** Creates an instance of the default plugin. - - The settings object can be a PropertySet that the class should use to - store its settings - the object that is passed-in will be owned by this - class and deleted automatically when no longer needed. (It can also be null) - */ - StandalonePluginHolder (PropertySet* settingsToUse, bool takeOwnershipOfSettings) - : settings (settingsToUse, takeOwnershipOfSettings) - { - createPlugin(); - setupAudioDevices(); - reloadPluginState(); - startPlaying(); - } - - ~StandalonePluginHolder() - { - deletePlugin(); - shutDownAudioDevices(); - } - - //============================================================================== - void createPlugin() - { - AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::wrapperType_Standalone); - processor = createPluginFilter(); - jassert (processor != nullptr); // Your createPluginFilter() function must return a valid object! - AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::wrapperType_Undefined); - - processor->setPlayConfigDetails (JucePlugin_MaxNumInputChannels, - JucePlugin_MaxNumOutputChannels, - 44100, 512); - } - - void deletePlugin() - { - stopPlaying(); - processor = nullptr; - } - - static String getFilePatterns (const String& fileSuffix) - { - if (fileSuffix.isEmpty()) - return String(); - - return (fileSuffix.startsWithChar ('.') ? "*" : "*.") + fileSuffix; - } - - - //============================================================================== - File getLastFile() const - { - File f; - - if (settings != nullptr) - f = File (settings->getValue ("lastStateFile")); - - if (f == File::nonexistent) - f = File::getSpecialLocation (File::userDocumentsDirectory); - - return f; - } - - void setLastFile (const FileChooser& fc) - { - if (settings != nullptr) - settings->setValue ("lastStateFile", fc.getResult().getFullPathName()); - } - - /** Pops up a dialog letting the user save the processor's state to a file. */ - void askUserToSaveState (const String& fileSuffix = String()) - { - FileChooser fc (TRANS("Save current state"), getLastFile(), getFilePatterns (fileSuffix)); - - if (fc.browseForFileToSave (true)) - { - setLastFile (fc); - - MemoryBlock data; - processor->getStateInformation (data); - - if (! fc.getResult().replaceWithData (data.getData(), data.getSize())) - AlertWindow::showMessageBox (AlertWindow::WarningIcon, - TRANS("Error whilst saving"), - TRANS("Couldn't write to the specified file!")); - } - } - - /** Pops up a dialog letting the user re-load the processor's state from a file. */ - void askUserToLoadState (const String& fileSuffix = String()) - { - FileChooser fc (TRANS("Load a saved state"), getLastFile(), getFilePatterns (fileSuffix)); - - if (fc.browseForFileToOpen()) - { - setLastFile (fc); - - MemoryBlock data; - - if (fc.getResult().loadFileAsData (data)) - processor->setStateInformation (data.getData(), (int) data.getSize()); - else - AlertWindow::showMessageBox (AlertWindow::WarningIcon, - TRANS("Error whilst loading"), - TRANS("Couldn't read from the specified file!")); - } - } - - //============================================================================== - void startPlaying() - { - player.setProcessor (processor); - } - - void stopPlaying() - { - player.setProcessor (nullptr); - } - - //============================================================================== - /** Shows an audio properties dialog box modally. */ - void showAudioSettingsDialog() - { - DialogWindow::LaunchOptions o; - o.content.setOwned (new AudioDeviceSelectorComponent (deviceManager, - processor->getNumInputChannels(), - processor->getNumInputChannels(), - processor->getNumOutputChannels(), - processor->getNumOutputChannels(), - true, false, - true, false)); - o.content->setSize (500, 450); - - o.dialogTitle = TRANS("Audio Settings"); - o.dialogBackgroundColour = Colour (0xfff0f0f0); - o.escapeKeyTriggersCloseButton = true; - o.useNativeTitleBar = true; - o.resizable = false; - - o.launchAsync(); - } - - void saveAudioDeviceState() - { - if (settings != nullptr) - { - ScopedPointer xml (deviceManager.createStateXml()); - settings->setValue ("audioSetup", xml); - } - } - - void reloadAudioDeviceState() - { - ScopedPointer savedState; - - if (settings != nullptr) - savedState = settings->getXmlValue ("audioSetup"); - - deviceManager.initialise (processor->getNumInputChannels(), - processor->getNumOutputChannels(), - savedState, - true); - } - - //============================================================================== - void savePluginState() - { - if (settings != nullptr && processor != nullptr) - { - MemoryBlock data; - processor->getStateInformation (data); - - settings->setValue ("filterState", data.toBase64Encoding()); - } - } - - void reloadPluginState() - { - if (settings != nullptr) - { - MemoryBlock data; - - if (data.fromBase64Encoding (settings->getValue ("filterState")) && data.getSize() > 0) - processor->setStateInformation (data.getData(), (int) data.getSize()); - } - } - - //============================================================================== - OptionalScopedPointer settings; - ScopedPointer processor; - AudioDeviceManager deviceManager; - AudioProcessorPlayer player; - -private: - void setupAudioDevices() - { - deviceManager.addAudioCallback (&player); - deviceManager.addMidiInputCallback (String::empty, &player); - - reloadAudioDeviceState(); - } - - void shutDownAudioDevices() - { - saveAudioDeviceState(); - - deviceManager.removeMidiInputCallback (String::empty, &player); - deviceManager.removeAudioCallback (&player); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StandalonePluginHolder) -}; - - -//============================================================================== -/** - A class that can be used to run a simple standalone application containing your filter. - - Just create one of these objects in your JUCEApplicationBase::initialise() method, and - let it do its work. It will create your filter object using the same createPluginFilter() function - that the other plugin wrappers use. -*/ -class StandaloneFilterWindow : public DocumentWindow, - public ButtonListener // (can't use Button::Listener due to VC2005 bug) -{ -public: - //============================================================================== - /** Creates a window with a given title and colour. - The settings object can be a PropertySet that the class should use to - store its settings (it can also be null). If takeOwnershipOfSettings is - true, then the settings object will be owned and deleted by this object. - */ - StandaloneFilterWindow (const String& title, - Colour backgroundColour, - PropertySet* settingsToUse, - bool takeOwnershipOfSettings) - : DocumentWindow (title, backgroundColour, DocumentWindow::minimiseButton | DocumentWindow::closeButton), - optionsButton ("options") - { - setTitleBarButtonsRequired (DocumentWindow::minimiseButton | DocumentWindow::closeButton, false); - - Component::addAndMakeVisible (optionsButton); - optionsButton.addListener (this); - optionsButton.setTriggeredOnMouseDown (true); - - pluginHolder = new StandalonePluginHolder (settingsToUse, takeOwnershipOfSettings); - - createEditorComp(); - - if (PropertySet* props = pluginHolder->settings) - { - const int x = props->getIntValue ("windowX", -100); - const int y = props->getIntValue ("windowY", -100); - - if (x != -100 && y != -100) - setBoundsConstrained (juce::Rectangle (x, y, getWidth(), getHeight())); - else - centreWithSize (getWidth(), getHeight()); - } - else - { - centreWithSize (getWidth(), getHeight()); - } - } - - ~StandaloneFilterWindow() - { - if (PropertySet* props = pluginHolder->settings) - { - props->setValue ("windowX", getX()); - props->setValue ("windowY", getY()); - } - - pluginHolder->stopPlaying(); - deleteEditorComp(); - pluginHolder = nullptr; - } - - //============================================================================== - AudioProcessor* getAudioProcessor() const noexcept { return pluginHolder->processor; } - AudioDeviceManager& getDeviceManager() const noexcept { return pluginHolder->deviceManager; } - - void createEditorComp() - { - setContentOwned (getAudioProcessor()->createEditorIfNeeded(), true); - } - - void deleteEditorComp() - { - if (AudioProcessorEditor* ed = dynamic_cast (getContentComponent())) - { - pluginHolder->processor->editorBeingDeleted (ed); - clearContentComponent(); - } - } - - /** Deletes and re-creates the plugin, resetting it to its default state. */ - void resetToDefaultState() - { - pluginHolder->stopPlaying(); - deleteEditorComp(); - pluginHolder->deletePlugin(); - - if (PropertySet* props = pluginHolder->settings) - props->removeValue ("filterState"); - - pluginHolder->createPlugin(); - createEditorComp(); - pluginHolder->startPlaying(); - } - - //============================================================================== - void closeButtonPressed() override - { - JUCEApplicationBase::quit(); - } - - void buttonClicked (Button*) override - { - PopupMenu m; - m.addItem (1, TRANS("Audio Settings...")); - m.addSeparator(); - m.addItem (2, TRANS("Save current state...")); - m.addItem (3, TRANS("Load a saved state...")); - m.addSeparator(); - m.addItem (4, TRANS("Reset to default state")); - - switch (m.showAt (&optionsButton)) - { - case 1: pluginHolder->showAudioSettingsDialog(); break; - case 2: pluginHolder->askUserToSaveState(); break; - case 3: pluginHolder->askUserToLoadState(); break; - case 4: resetToDefaultState(); break; - default: break; - } - } - - void resized() override - { - DocumentWindow::resized(); - optionsButton.setBounds (8, 6, 60, getTitleBarHeight() - 8); - } - - ScopedPointer pluginHolder; - -private: - //============================================================================== - TextButton optionsButton; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StandaloneFilterWindow) -}; - - -#endif // JUCE_STANDALONEFILTERWINDOW_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp deleted file mode 100755 index bdd2b2a..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp +++ /dev/null @@ -1,1605 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_VST - -#ifdef _MSC_VER - #pragma warning (disable : 4996 4100) -#endif - -#ifdef _WIN32 - #undef _WIN32_WINNT - #define _WIN32_WINNT 0x500 - #undef STRICT - #define STRICT 1 - #include -#elif defined (LINUX) - #include - #include - #include - #undef KeyPress -#else - #include -#endif - -#ifdef PRAGMA_ALIGN_SUPPORTED - #undef PRAGMA_ALIGN_SUPPORTED - #define PRAGMA_ALIGN_SUPPORTED 1 -#endif - -//============================================================================== -#ifndef _MSC_VER - #define __cdecl -#endif - -#ifdef __clang__ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Wshadow" - #pragma clang diagnostic ignored "-Wdeprecated-register" - #pragma clang diagnostic ignored "-Wunused-parameter" - #pragma clang diagnostic ignored "-Wdeprecated-writable-strings" - #pragma clang diagnostic ignored "-Wnon-virtual-dtor" -#endif - -/* These files come with the Steinberg VST SDK - to get them, you'll need to - visit the Steinberg website and agree to whatever is currently required to - get them. The best version to get is the VST3 SDK, which also contains - the older VST2.4 files. - - Then, you'll need to make sure your include path contains your "VST SDK3" - directory (or whatever you've named it on your machine). The introjucer has - a special box for setting this path. -*/ -#include -#include -#include -#include - -#if ! VST_2_4_EXTENSIONS - #error "It looks like you're trying to include an out-of-date VSTSDK version - make sure you have at least version 2.4" -#endif - -#ifndef JUCE_VST3_CAN_REPLACE_VST2 - #define JUCE_VST3_CAN_REPLACE_VST2 1 -#endif - -#if JucePlugin_Build_VST3 && JUCE_VST3_CAN_REPLACE_VST2 - #include - namespace juce { extern Steinberg::FUID getJuceVST3ComponentIID(); } -#endif - -#ifdef __clang__ - #pragma clang diagnostic pop -#endif - -//============================================================================== -#ifdef _MSC_VER - #pragma pack (push, 8) -#endif - -#include "../utility/juce_IncludeModuleHeaders.h" -#include "../utility/juce_FakeMouseMoveGenerator.h" -#include "../utility/juce_WindowsHooks.h" - -#ifdef _MSC_VER - #pragma pack (pop) -#endif - -#undef MemoryBlock - -class JuceVSTWrapper; -static bool recursionCheck = false; -static juce::uint32 lastMasterIdleCall = 0; - -namespace juce -{ - #if JUCE_MAC - extern void initialiseMac(); - extern void* attachComponentToWindowRef (Component*, void* parent, bool isNSView); - extern void detachComponentFromWindowRef (Component*, void* window, bool isNSView); - extern void setNativeHostWindowSize (void* window, Component*, int newWidth, int newHeight, bool isNSView); - extern void checkWindowVisibility (void* window, Component*, bool isNSView); - extern bool forwardCurrentKeyEventToHost (Component*, bool isNSView); - #if ! JUCE_64BIT - extern void updateEditorCompBounds (Component*); - #endif - #endif - - #if JUCE_LINUX - extern Display* display; - #endif -} - - -//============================================================================== -#if JUCE_WINDOWS - -namespace -{ - // Returns the actual container window, unlike GetParent, which can also return a separate owner window. - static HWND getWindowParent (HWND w) noexcept { return GetAncestor (w, GA_PARENT); } - - static HWND findMDIParentOf (HWND w) - { - const int frameThickness = GetSystemMetrics (SM_CYFIXEDFRAME); - - while (w != 0) - { - HWND parent = getWindowParent (w); - - if (parent == 0) - break; - - TCHAR windowType[32] = { 0 }; - GetClassName (parent, windowType, 31); - - if (String (windowType).equalsIgnoreCase ("MDIClient")) - return parent; - - RECT windowPos, parentPos; - GetWindowRect (w, &windowPos); - GetWindowRect (parent, &parentPos); - - const int dw = (parentPos.right - parentPos.left) - (windowPos.right - windowPos.left); - const int dh = (parentPos.bottom - parentPos.top) - (windowPos.bottom - windowPos.top); - - if (dw > 100 || dh > 100) - break; - - w = parent; - - if (dw == 2 * frameThickness) - break; - } - - return w; - } - - static bool messageThreadIsDefinitelyCorrect = false; -} - -//============================================================================== -#elif JUCE_LINUX - -class SharedMessageThread : public Thread -{ -public: - SharedMessageThread() - : Thread ("VstMessageThread"), - initialised (false) - { - startThread (7); - - while (! initialised) - sleep (1); - } - - ~SharedMessageThread() - { - signalThreadShouldExit(); - JUCEApplicationBase::quit(); - waitForThreadToExit (5000); - clearSingletonInstance(); - } - - void run() override - { - initialiseJuce_GUI(); - initialised = true; - - MessageManager::getInstance()->setCurrentThreadAsMessageThread(); - - while ((! threadShouldExit()) && MessageManager::getInstance()->runDispatchLoopUntil (250)) - {} - } - - juce_DeclareSingleton (SharedMessageThread, false) - -private: - bool initialised; -}; - -juce_ImplementSingleton (SharedMessageThread) - -#endif - -static Array activePlugins; - -//============================================================================== -/** - This is an AudioEffectX object that holds and wraps our AudioProcessor... -*/ -class JuceVSTWrapper : public AudioEffectX, - public AudioProcessorListener, - public AudioPlayHead, - private Timer, - private AsyncUpdater -{ -public: - //============================================================================== - JuceVSTWrapper (audioMasterCallback audioMasterCB, AudioProcessor* const af) - : AudioEffectX (audioMasterCB, af->getNumPrograms(), af->getNumParameters()), - filter (af), - chunkMemoryTime (0), - speakerIn (kSpeakerArrEmpty), - speakerOut (kSpeakerArrEmpty), - numInChans (JucePlugin_MaxNumInputChannels), - numOutChans (JucePlugin_MaxNumOutputChannels), - isProcessing (false), - isBypassed (false), - hasShutdown (false), - firstProcessCallback (true), - shouldDeleteEditor (false), - #if JUCE_64BIT - useNSView (true), - #else - useNSView (false), - #endif - processTempBuffer (1, 1), - hostWindow (0) - { - filter->setPlayConfigDetails (numInChans, numOutChans, 0, 0); - filter->setPlayHead (this); - filter->addListener (this); - - cEffect.flags |= effFlagsHasEditor; - cEffect.version = convertHexVersionToDecimal (JucePlugin_VersionCode); - - setUniqueID ((int) (JucePlugin_VSTUniqueID)); - - setNumInputs (numInChans); - setNumOutputs (numOutChans); - - canProcessReplacing (true); - - isSynth ((JucePlugin_IsSynth) != 0); - setInitialDelay (filter->getLatencySamples()); - programsAreChunks (true); - - // NB: For reasons best known to themselves, some hosts fail to load/save plugin - // state correctly if the plugin doesn't report that it has at least 1 program. - jassert (af->getNumPrograms() > 0); - - activePlugins.add (this); - } - - ~JuceVSTWrapper() - { - JUCE_AUTORELEASEPOOL - { - { - #if JUCE_LINUX - MessageManagerLock mmLock; - #endif - stopTimer(); - deleteEditor (false); - - hasShutdown = true; - - delete filter; - filter = nullptr; - - jassert (editorComp == 0); - - channels.free(); - deleteTempChannels(); - - jassert (activePlugins.contains (this)); - activePlugins.removeFirstMatchingValue (this); - } - - if (activePlugins.size() == 0) - { - #if JUCE_LINUX - SharedMessageThread::deleteInstance(); - #endif - shutdownJuce_GUI(); - - #if JUCE_WINDOWS - messageThreadIsDefinitelyCorrect = false; - #endif - } - } - } - - void open() override - { - // Note: most hosts call this on the UI thread, but wavelab doesn't, so be careful in here. - if (filter->hasEditor()) - cEffect.flags |= effFlagsHasEditor; - else - cEffect.flags &= ~effFlagsHasEditor; - } - - void close() override - { - // Note: most hosts call this on the UI thread, but wavelab doesn't, so be careful in here. - stopTimer(); - - if (MessageManager::getInstance()->isThisTheMessageThread()) - deleteEditor (false); - } - - //============================================================================== - bool getEffectName (char* name) override - { - String (JucePlugin_Name).copyToUTF8 (name, 64); - return true; - } - - bool getVendorString (char* text) override - { - String (JucePlugin_Manufacturer).copyToUTF8 (text, 64); - return true; - } - - bool getProductString (char* text) override { return getEffectName (text); } - VstInt32 getVendorVersion() override { return convertHexVersionToDecimal (JucePlugin_VersionCode); } - VstPlugCategory getPlugCategory() override { return JucePlugin_VSTCategory; } - bool keysRequired() { return (JucePlugin_EditorRequiresKeyboardFocus) != 0; } - - VstInt32 canDo (char* text) override - { - if (strcmp (text, "receiveVstEvents") == 0 - || strcmp (text, "receiveVstMidiEvent") == 0 - || strcmp (text, "receiveVstMidiEvents") == 0) - { - #if JucePlugin_WantsMidiInput - return 1; - #else - return -1; - #endif - } - - if (strcmp (text, "sendVstEvents") == 0 - || strcmp (text, "sendVstMidiEvent") == 0 - || strcmp (text, "sendVstMidiEvents") == 0) - { - #if JucePlugin_ProducesMidiOutput - return 1; - #else - return -1; - #endif - } - - if (strcmp (text, "receiveVstTimeInfo") == 0 - || strcmp (text, "conformsToWindowRules") == 0 - || strcmp (text, "bypass") == 0) - { - return 1; - } - - if (strcmp (text, "openCloseAnyThread") == 0) - { - // This tells Wavelab to use the UI thread to invoke open/close, - // like all other hosts do. - return -1; - } - - #if JUCE_MAC - if (strcmp (text, "hasCockosViewAsConfig") == 0) - { - useNSView = true; - return (VstInt32) 0xbeef0000; - } - #endif - - return 0; - } - - VstIntPtr vendorSpecific (VstInt32 lArg, VstIntPtr lArg2, void* ptrArg, float floatArg) override - { - (void) lArg; (void) lArg2; (void) ptrArg; (void) floatArg; - - #if JucePlugin_Build_VST3 && JUCE_VST3_CAN_REPLACE_VST2 - if ((lArg == 'stCA' || lArg == 'stCa') && lArg2 == 'FUID' && ptrArg != nullptr) - { - memcpy (ptrArg, getJuceVST3ComponentIID(), 16); - return 1; - } - #endif - - return 0; - } - - bool getInputProperties (VstInt32 index, VstPinProperties* properties) override - { - if (filter == nullptr || index >= JucePlugin_MaxNumInputChannels) - return false; - - setPinProperties (*properties, filter->getInputChannelName ((int) index), - speakerIn, filter->isInputChannelStereoPair ((int) index)); - return true; - } - - bool getOutputProperties (VstInt32 index, VstPinProperties* properties) override - { - if (filter == nullptr || index >= JucePlugin_MaxNumOutputChannels) - return false; - - setPinProperties (*properties, filter->getOutputChannelName ((int) index), - speakerOut, filter->isOutputChannelStereoPair ((int) index)); - return true; - } - - static void setPinProperties (VstPinProperties& properties, const String& name, - VstSpeakerArrangementType type, const bool isPair) - { - name.copyToUTF8 (properties.label, (size_t) (kVstMaxLabelLen - 1)); - name.copyToUTF8 (properties.shortLabel, (size_t) (kVstMaxShortLabelLen - 1)); - - if (type != kSpeakerArrEmpty) - { - properties.flags = kVstPinUseSpeaker; - properties.arrangementType = type; - } - else - { - properties.flags = kVstPinIsActive; - properties.arrangementType = 0; - - if (isPair) - properties.flags |= kVstPinIsStereo; - } - } - - bool setBypass (bool b) override - { - isBypassed = b; - return true; - } - - VstInt32 getGetTailSize() override - { - if (filter != nullptr) - return (VstInt32) (filter->getTailLengthSeconds() * getSampleRate()); - - return 0; - } - - //============================================================================== - VstInt32 processEvents (VstEvents* events) override - { - #if JucePlugin_WantsMidiInput - VSTMidiEventList::addEventsToMidiBuffer (events, midiEvents); - return 1; - #else - (void) events; - return 0; - #endif - } - - void process (float** inputs, float** outputs, VstInt32 numSamples) - { - const int numIn = numInChans; - const int numOut = numOutChans; - - processTempBuffer.setSize (numIn, numSamples, false, false, true); - - for (int i = numIn; --i >= 0;) - processTempBuffer.copyFrom (i, 0, outputs[i], numSamples); - - processReplacing (inputs, outputs, numSamples); - - AudioSampleBuffer dest (outputs, numOut, numSamples); - - for (int i = jmin (numIn, numOut); --i >= 0;) - dest.addFrom (i, 0, processTempBuffer, i, 0, numSamples); - } - - void processReplacing (float** inputs, float** outputs, VstInt32 numSamples) override - { - if (firstProcessCallback) - { - firstProcessCallback = false; - - // if this fails, the host hasn't called resume() before processing - jassert (isProcessing); - - // (tragically, some hosts actually need this, although it's stupid to have - // to do it here..) - if (! isProcessing) - resume(); - - filter->setNonRealtime (getCurrentProcessLevel() == 4 /* kVstProcessLevelOffline */); - - #if JUCE_WINDOWS - if (GetThreadPriority (GetCurrentThread()) <= THREAD_PRIORITY_NORMAL - && GetThreadPriority (GetCurrentThread()) >= THREAD_PRIORITY_LOWEST) - filter->setNonRealtime (true); - #endif - } - - #if JUCE_DEBUG && ! JucePlugin_ProducesMidiOutput - const int numMidiEventsComingIn = midiEvents.getNumEvents(); - #endif - - jassert (activePlugins.contains (this)); - - { - const ScopedLock sl (filter->getCallbackLock()); - - const int numIn = numInChans; - const int numOut = numOutChans; - - if (filter->isSuspended()) - { - for (int i = 0; i < numOut; ++i) - FloatVectorOperations::clear (outputs[i], numSamples); - } - else - { - int i; - for (i = 0; i < numOut; ++i) - { - float* chan = tempChannels.getUnchecked(i); - - if (chan == nullptr) - { - chan = outputs[i]; - - // if some output channels are disabled, some hosts supply the same buffer - // for multiple channels - this buggers up our method of copying the - // inputs over the outputs, so we need to create unique temp buffers in this case.. - for (int j = i; --j >= 0;) - { - if (outputs[j] == chan) - { - chan = new float [blockSize * 2]; - tempChannels.set (i, chan); - break; - } - } - } - - if (i < numIn && chan != inputs[i]) - memcpy (chan, inputs[i], sizeof (float) * (size_t) numSamples); - - channels[i] = chan; - } - - for (; i < numIn; ++i) - channels[i] = inputs[i]; - - { - AudioSampleBuffer chans (channels, jmax (numIn, numOut), numSamples); - - if (isBypassed) - filter->processBlockBypassed (chans, midiEvents); - else - filter->processBlock (chans, midiEvents); - } - - // copy back any temp channels that may have been used.. - for (i = 0; i < numOut; ++i) - if (const float* const chan = tempChannels.getUnchecked(i)) - memcpy (outputs[i], chan, sizeof (float) * (size_t) numSamples); - } - } - - if (! midiEvents.isEmpty()) - { - #if JucePlugin_ProducesMidiOutput - const int numEvents = midiEvents.getNumEvents(); - - outgoingEvents.ensureSize (numEvents); - outgoingEvents.clear(); - - const juce::uint8* midiEventData; - int midiEventSize, midiEventPosition; - MidiBuffer::Iterator i (midiEvents); - - while (i.getNextEvent (midiEventData, midiEventSize, midiEventPosition)) - { - jassert (midiEventPosition >= 0 && midiEventPosition < numSamples); - - outgoingEvents.addEvent (midiEventData, midiEventSize, midiEventPosition); - } - - sendVstEventsToHost (outgoingEvents.events); - #elif JUCE_DEBUG - /* This assertion is caused when you've added some events to the - midiMessages array in your processBlock() method, which usually means - that you're trying to send them somewhere. But in this case they're - getting thrown away. - - If your plugin does want to send midi messages, you'll need to set - the JucePlugin_ProducesMidiOutput macro to 1 in your - JucePluginCharacteristics.h file. - - If you don't want to produce any midi output, then you should clear the - midiMessages array at the end of your processBlock() method, to - indicate that you don't want any of the events to be passed through - to the output. - */ - jassert (midiEvents.getNumEvents() <= numMidiEventsComingIn); - #endif - - midiEvents.clear(); - } - } - - //============================================================================== - VstInt32 startProcess() override { return 0; } - VstInt32 stopProcess() override { return 0; } - - void resume() override - { - if (filter != nullptr) - { - isProcessing = true; - channels.calloc ((size_t) (numInChans + numOutChans)); - - double rate = getSampleRate(); - jassert (rate > 0); - if (rate <= 0.0) - rate = 44100.0; - - const int currentBlockSize = getBlockSize(); - jassert (currentBlockSize > 0); - - firstProcessCallback = true; - - filter->setNonRealtime (getCurrentProcessLevel() == 4 /* kVstProcessLevelOffline */); - filter->setPlayConfigDetails (numInChans, numOutChans, rate, currentBlockSize); - - deleteTempChannels(); - - filter->prepareToPlay (rate, currentBlockSize); - - midiEvents.ensureSize (2048); - midiEvents.clear(); - - setInitialDelay (filter->getLatencySamples()); - - AudioEffectX::resume(); - - #if JucePlugin_ProducesMidiOutput - outgoingEvents.ensureSize (512); - #endif - } - } - - void suspend() override - { - if (filter != nullptr) - { - AudioEffectX::suspend(); - - filter->releaseResources(); - outgoingEvents.freeEvents(); - - isProcessing = false; - channels.free(); - - deleteTempChannels(); - } - } - - bool getCurrentPosition (AudioPlayHead::CurrentPositionInfo& info) override - { - const VstTimeInfo* const ti = getTimeInfo (kVstPpqPosValid | kVstTempoValid | kVstBarsValid | kVstCyclePosValid - | kVstTimeSigValid | kVstSmpteValid | kVstClockValid); - - if (ti == nullptr || ti->sampleRate <= 0) - return false; - - info.bpm = (ti->flags & kVstTempoValid) != 0 ? ti->tempo : 0.0; - - if ((ti->flags & kVstTimeSigValid) != 0) - { - info.timeSigNumerator = ti->timeSigNumerator; - info.timeSigDenominator = ti->timeSigDenominator; - } - else - { - info.timeSigNumerator = 4; - info.timeSigDenominator = 4; - } - - info.timeInSamples = (int64) (ti->samplePos + 0.5); - info.timeInSeconds = ti->samplePos / ti->sampleRate; - info.ppqPosition = (ti->flags & kVstPpqPosValid) != 0 ? ti->ppqPos : 0.0; - info.ppqPositionOfLastBarStart = (ti->flags & kVstBarsValid) != 0 ? ti->barStartPos : 0.0; - - if ((ti->flags & kVstSmpteValid) != 0) - { - AudioPlayHead::FrameRateType rate = AudioPlayHead::fpsUnknown; - double fps = 1.0; - - switch (ti->smpteFrameRate) - { - case kVstSmpte24fps: rate = AudioPlayHead::fps24; fps = 24.0; break; - case kVstSmpte25fps: rate = AudioPlayHead::fps25; fps = 25.0; break; - case kVstSmpte2997fps: rate = AudioPlayHead::fps2997; fps = 29.97; break; - case kVstSmpte30fps: rate = AudioPlayHead::fps30; fps = 30.0; break; - case kVstSmpte2997dfps: rate = AudioPlayHead::fps2997drop; fps = 29.97; break; - case kVstSmpte30dfps: rate = AudioPlayHead::fps30drop; fps = 30.0; break; - - case kVstSmpteFilm16mm: - case kVstSmpteFilm35mm: fps = 24.0; break; - - case kVstSmpte239fps: fps = 23.976; break; - case kVstSmpte249fps: fps = 24.976; break; - case kVstSmpte599fps: fps = 59.94; break; - case kVstSmpte60fps: fps = 60; break; - - default: jassertfalse; // unknown frame-rate.. - } - - info.frameRate = rate; - info.editOriginTime = ti->smpteOffset / (80.0 * fps); - } - else - { - info.frameRate = AudioPlayHead::fpsUnknown; - info.editOriginTime = 0; - } - - info.isRecording = (ti->flags & kVstTransportRecording) != 0; - info.isPlaying = (ti->flags & (kVstTransportRecording | kVstTransportPlaying)) != 0; - info.isLooping = (ti->flags & kVstTransportCycleActive) != 0; - - if ((ti->flags & kVstCyclePosValid) != 0) - { - info.ppqLoopStart = ti->cycleStartPos; - info.ppqLoopEnd = ti->cycleEndPos; - } - else - { - info.ppqLoopStart = 0; - info.ppqLoopEnd = 0; - } - - return true; - } - - //============================================================================== - VstInt32 getProgram() override - { - return filter != nullptr ? filter->getCurrentProgram() : 0; - } - - void setProgram (VstInt32 program) override - { - if (filter != nullptr) - filter->setCurrentProgram (program); - } - - void setProgramName (char* name) override - { - if (filter != nullptr) - filter->changeProgramName (filter->getCurrentProgram(), name); - } - - void getProgramName (char* name) override - { - if (filter != nullptr) - filter->getProgramName (filter->getCurrentProgram()).copyToUTF8 (name, 24); - } - - bool getProgramNameIndexed (VstInt32 /*category*/, VstInt32 index, char* text) override - { - if (filter != nullptr && isPositiveAndBelow (index, filter->getNumPrograms())) - { - filter->getProgramName (index).copyToUTF8 (text, 24); - return true; - } - - return false; - } - - //============================================================================== - float getParameter (VstInt32 index) override - { - if (filter == nullptr) - return 0.0f; - - jassert (isPositiveAndBelow (index, filter->getNumParameters())); - return filter->getParameter (index); - } - - void setParameter (VstInt32 index, float value) override - { -#ifdef CPL_TRACEGUARD_ENTRYPOINTS - CPL_TRACEGUARD_START -#endif - if (filter != nullptr) - { - jassert (isPositiveAndBelow (index, filter->getNumParameters())); - filter->setParameter (index, value); - } -#ifdef CPL_TRACEGUARD_ENTRYPOINTS - CPL_TRACEGUARD_STOP("VST setParameter"); -#endif - - } - - void getParameterDisplay (VstInt32 index, char* text) override - { - if (filter != nullptr) - { - jassert (isPositiveAndBelow (index, filter->getNumParameters())); - filter->getParameterText (index, 24).copyToUTF8 (text, 24); // length should technically be kVstMaxParamStrLen, which is 8, but hosts will normally allow a bit more. - } - } - - void getParameterName (VstInt32 index, char* text) override - { - if (filter != nullptr) - { - jassert (isPositiveAndBelow (index, filter->getNumParameters())); - filter->getParameterName (index, 16).copyToUTF8 (text, 16); // length should technically be kVstMaxParamStrLen, which is 8, but hosts will normally allow a bit more. - } - } - - void getParameterLabel (VstInt32 index, char* text) override - { - if (filter != nullptr) - { - jassert (isPositiveAndBelow (index, filter->getNumParameters())); - filter->getParameterLabel (index).copyToUTF8 (text, 24); // length should technically be kVstMaxParamStrLen, which is 8, but hosts will normally allow a bit more. - } - } - - void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override - { - if (audioMaster != nullptr) - audioMaster (&cEffect, audioMasterAutomate, index, 0, 0, newValue); - } - - void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override { beginEdit (index); } - void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override { endEdit (index); } - - void audioProcessorChanged (AudioProcessor*) override - { - setInitialDelay (filter->getLatencySamples()); - updateDisplay(); - triggerAsyncUpdate(); - } - - void handleAsyncUpdate() override - { - ioChanged(); - } - - bool canParameterBeAutomated (VstInt32 index) override - { - return filter != nullptr && filter->isParameterAutomatable ((int) index); - } - - struct ChannelConfigComparator - { - static int compareElements (const short* const first, const short* const second) noexcept - { - if (first[0] < second[0]) return -1; - if (first[0] > second[0]) return 1; - if (first[1] < second[1]) return -1; - if (first[1] > second[1]) return 1; - return 0; - } - }; - - bool setSpeakerArrangement (VstSpeakerArrangement* pluginInput, - VstSpeakerArrangement* pluginOutput) override - { - short channelConfigs[][2] = { JucePlugin_PreferredChannelConfigurations }; - - Array channelConfigsSorted; - ChannelConfigComparator comp; - - for (int i = 0; i < numElementsInArray (channelConfigs); ++i) - channelConfigsSorted.addSorted (comp, channelConfigs[i]); - - for (int i = channelConfigsSorted.size(); --i >= 0;) - { - const short* const config = channelConfigsSorted.getUnchecked(i); - bool inCountMatches = (config[0] == pluginInput->numChannels); - bool outCountMatches = (config[1] == pluginOutput->numChannels); - - if (inCountMatches && outCountMatches) - { - speakerIn = (VstSpeakerArrangementType) pluginInput->type; - speakerOut = (VstSpeakerArrangementType) pluginOutput->type; - numInChans = pluginInput->numChannels; - numOutChans = pluginOutput->numChannels; - - filter->setPlayConfigDetails (numInChans, numOutChans, - filter->getSampleRate(), - filter->getBlockSize()); - - filter->setSpeakerArrangement (getSpeakerArrangementString (speakerIn), - getSpeakerArrangementString (speakerOut)); - return true; - } - } - - filter->setSpeakerArrangement (String::empty, String::empty); - return false; - } - - static const char* getSpeakerArrangementString (VstSpeakerArrangementType type) noexcept - { - switch (type) - { - case kSpeakerArrMono: return "M"; - case kSpeakerArrStereo: return "L R"; - case kSpeakerArrStereoSurround: return "Ls Rs"; - case kSpeakerArrStereoCenter: return "Lc Rc"; - case kSpeakerArrStereoSide: return "Sl Sr"; - case kSpeakerArrStereoCLfe: return "C Lfe"; - case kSpeakerArr30Cine: return "L R C"; - case kSpeakerArr30Music: return "L R S"; - case kSpeakerArr31Cine: return "L R C Lfe"; - case kSpeakerArr31Music: return "L R Lfe S"; - case kSpeakerArr40Cine: return "L R C S"; - case kSpeakerArr40Music: return "L R Ls Rs"; - case kSpeakerArr41Cine: return "L R C Lfe S"; - case kSpeakerArr41Music: return "L R Lfe Ls Rs"; - case kSpeakerArr50: return "L R C Ls Rs" ; - case kSpeakerArr51: return "L R C Lfe Ls Rs"; - case kSpeakerArr60Cine: return "L R C Ls Rs Cs"; - case kSpeakerArr60Music: return "L R Ls Rs Sl Sr "; - case kSpeakerArr61Cine: return "L R C Lfe Ls Rs Cs"; - case kSpeakerArr61Music: return "L R Lfe Ls Rs Sl Sr"; - case kSpeakerArr70Cine: return "L R C Ls Rs Lc Rc "; - case kSpeakerArr70Music: return "L R C Ls Rs Sl Sr"; - case kSpeakerArr71Cine: return "L R C Lfe Ls Rs Lc Rc"; - case kSpeakerArr71Music: return "L R C Lfe Ls Rs Sl Sr"; - case kSpeakerArr80Cine: return "L R C Ls Rs Lc Rc Cs"; - case kSpeakerArr80Music: return "L R C Ls Rs Cs Sl Sr"; - case kSpeakerArr81Cine: return "L R C Lfe Ls Rs Lc Rc Cs"; - case kSpeakerArr81Music: return "L R C Lfe Ls Rs Cs Sl Sr" ; - case kSpeakerArr102: return "L R C Lfe Ls Rs Tfl Tfc Tfr Trl Trr Lfe2"; - default: break; - } - - return nullptr; - } - - //============================================================================== - VstInt32 getChunk (void** data, bool onlyStoreCurrentProgramData) override - { - if (filter == nullptr) - return 0; - - chunkMemory.reset(); - if (onlyStoreCurrentProgramData) - filter->getCurrentProgramStateInformation (chunkMemory); - else - filter->getStateInformation (chunkMemory); - - *data = (void*) chunkMemory.getData(); - - // because the chunk is only needed temporarily by the host (or at least you'd - // hope so) we'll give it a while and then free it in the timer callback. - chunkMemoryTime = juce::Time::getApproximateMillisecondCounter(); - - return (VstInt32) chunkMemory.getSize(); - } - - VstInt32 setChunk (void* data, VstInt32 byteSize, bool onlyRestoreCurrentProgramData) override - { - if (filter != nullptr) - { - chunkMemory.reset(); - chunkMemoryTime = 0; - - if (byteSize > 0 && data != nullptr) - { - if (onlyRestoreCurrentProgramData) - filter->setCurrentProgramStateInformation (data, byteSize); - else - filter->setStateInformation (data, byteSize); - } - } - - return 0; - } - - void timerCallback() override - { - if (shouldDeleteEditor) - { - shouldDeleteEditor = false; - deleteEditor (true); - } - - if (chunkMemoryTime > 0 - && chunkMemoryTime < juce::Time::getApproximateMillisecondCounter() - 2000 - && ! recursionCheck) - { - chunkMemory.reset(); - chunkMemoryTime = 0; - } - - #if JUCE_MAC - if (hostWindow != 0) - checkWindowVisibility (hostWindow, editorComp, useNSView); - #endif - - tryMasterIdle(); - } - - void tryMasterIdle() - { - if (Component::isMouseButtonDownAnywhere() && ! recursionCheck) - { - const juce::uint32 now = juce::Time::getMillisecondCounter(); - - if (now > lastMasterIdleCall + 20 && editorComp != nullptr) - { - lastMasterIdleCall = now; - - recursionCheck = true; - masterIdle(); - recursionCheck = false; - } - } - } - - void doIdleCallback() - { - // (wavelab calls this on a separate thread and causes a deadlock).. - if (MessageManager::getInstance()->isThisTheMessageThread() - && ! recursionCheck) - { - recursionCheck = true; - - JUCE_AUTORELEASEPOOL - { - Timer::callPendingTimersSynchronously(); - - for (int i = ComponentPeer::getNumPeers(); --i >= 0;) - if (ComponentPeer* p = ComponentPeer::getPeer(i)) - p->performAnyPendingRepaintsNow(); - - recursionCheck = false; - } - } - } - - void createEditorComp() - { - if (hasShutdown || filter == nullptr) - return; - - if (editorComp == nullptr) - { - if (AudioProcessorEditor* const ed = filter->createEditorIfNeeded()) - { - cEffect.flags |= effFlagsHasEditor; - ed->setOpaque (true); - ed->setVisible (true); - - editorComp = new EditorCompWrapper (*this, ed); - } - else - { - cEffect.flags &= ~effFlagsHasEditor; - } - } - - shouldDeleteEditor = false; - } - - void deleteEditor (bool canDeleteLaterIfModal) - { - JUCE_AUTORELEASEPOOL - { - PopupMenu::dismissAllActiveMenus(); - - jassert (! recursionCheck); - recursionCheck = true; - - if (editorComp != nullptr) - { - if (Component* const modalComponent = Component::getCurrentlyModalComponent()) - { - modalComponent->exitModalState (0); - - if (canDeleteLaterIfModal) - { - shouldDeleteEditor = true; - recursionCheck = false; - return; - } - } - - #if JUCE_MAC - if (hostWindow != 0) - { - detachComponentFromWindowRef (editorComp, hostWindow, useNSView); - hostWindow = 0; - } - #endif - - filter->editorBeingDeleted (editorComp->getEditorComp()); - - editorComp = nullptr; - - // there's some kind of component currently modal, but the host - // is trying to delete our plugin. You should try to avoid this happening.. - jassert (Component::getCurrentlyModalComponent() == nullptr); - } - - #if JUCE_LINUX - hostWindow = 0; - #endif - - recursionCheck = false; - } - } - - VstIntPtr dispatcher (VstInt32 opCode, VstInt32 index, VstIntPtr value, void* ptr, float opt) override - { -#ifdef CPL_TRACEGUARD_ENTRYPOINTS - return CPL_TRACEGUARD_START -#endif - if (hasShutdown) - return (VstIntPtr)0; - - if (opCode == effEditIdle) - { - doIdleCallback(); - return (VstIntPtr)0; - } - else if (opCode == effEditOpen) - { - checkWhetherMessageThreadIsCorrect(); - const MessageManagerLock mmLock; - jassert (! recursionCheck); - - startTimer (1000 / 4); // performs misc housekeeping chores - - deleteEditor (true); - createEditorComp(); - - if (editorComp != nullptr) - { - editorComp->setOpaque (true); - editorComp->setVisible (false); - - #if JUCE_WINDOWS - editorComp->addToDesktop (0, ptr); - hostWindow = (HWND) ptr; - #elif JUCE_LINUX - editorComp->addToDesktop (0, ptr); - hostWindow = (Window) ptr; - Window editorWnd = (Window) editorComp->getWindowHandle(); - XReparentWindow (display, editorWnd, hostWindow, 0, 0); - #else - hostWindow = attachComponentToWindowRef (editorComp, ptr, useNSView); - #endif - editorComp->setVisible (true); - - return (VstIntPtr)1; - } - } - else if (opCode == effEditClose) - { - checkWhetherMessageThreadIsCorrect(); - const MessageManagerLock mmLock; - deleteEditor (true); - return (VstIntPtr)0; - } - else if (opCode == effEditGetRect) - { - checkWhetherMessageThreadIsCorrect(); - const MessageManagerLock mmLock; - createEditorComp(); - - if (editorComp != nullptr) - { - editorSize.left = 0; - editorSize.top = 0; - editorSize.right = (VstInt16) editorComp->getWidth(); - editorSize.bottom = (VstInt16) editorComp->getHeight(); - - *((ERect**) ptr) = &editorSize; - - return (VstIntPtr) (pointer_sized_int) &editorSize; - } - - return (VstIntPtr)0; - } - - return AudioEffectX::dispatcher (opCode, index, value, ptr, opt); -#ifdef CPL_TRACEGUARD_ENTRYPOINTS - CPL_TRACEGUARD_STOP("VST dispatcher"); -#endif - } - - void resizeHostWindow (int newWidth, int newHeight) - { - if (editorComp != nullptr) - { - if (! (canHostDo (const_cast ("sizeWindow")) && sizeWindow (newWidth, newHeight))) - { - // some hosts don't support the sizeWindow call, so do it manually.. - #if JUCE_MAC - setNativeHostWindowSize (hostWindow, editorComp, newWidth, newHeight, useNSView); - - #elif JUCE_LINUX - // (Currently, all linux hosts support sizeWindow, so this should never need to happen) - editorComp->setSize (newWidth, newHeight); - - #else - int dw = 0; - int dh = 0; - const int frameThickness = GetSystemMetrics (SM_CYFIXEDFRAME); - - HWND w = (HWND) editorComp->getWindowHandle(); - - while (w != 0) - { - HWND parent = getWindowParent (w); - - if (parent == 0) - break; - - TCHAR windowType [32] = { 0 }; - GetClassName (parent, windowType, 31); - - if (String (windowType).equalsIgnoreCase ("MDIClient")) - break; - - RECT windowPos, parentPos; - GetWindowRect (w, &windowPos); - GetWindowRect (parent, &parentPos); - - SetWindowPos (w, 0, 0, 0, newWidth + dw, newHeight + dh, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); - - dw = (parentPos.right - parentPos.left) - (windowPos.right - windowPos.left); - dh = (parentPos.bottom - parentPos.top) - (windowPos.bottom - windowPos.top); - - w = parent; - - if (dw == 2 * frameThickness) - break; - - if (dw > 100 || dh > 100) - w = 0; - } - - if (w != 0) - SetWindowPos (w, 0, 0, 0, newWidth + dw, newHeight + dh, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); - #endif - } - - if (ComponentPeer* peer = editorComp->getPeer()) - peer->handleMovedOrResized(); - } - } - - //============================================================================== - // A component to hold the AudioProcessorEditor, and cope with some housekeeping - // chores when it changes or repaints. - class EditorCompWrapper : public Component, - public AsyncUpdater - { - public: - EditorCompWrapper (JuceVSTWrapper& w, AudioProcessorEditor* editor) - : wrapper (w) - { - setOpaque (true); - editor->setOpaque (true); - - setBounds (editor->getBounds()); - editor->setTopLeftPosition (0, 0); - addAndMakeVisible (editor); - - #if JUCE_WINDOWS - if (! getHostType().isReceptor()) - addMouseListener (this, true); - #endif - } - - ~EditorCompWrapper() - { - deleteAllChildren(); // note that we can't use a ScopedPointer because the editor may - // have been transferred to another parent which takes over ownership. - } - - void paint (Graphics&) override {} - - void paintOverChildren (Graphics&) override - { - // this causes an async call to masterIdle() to help - // creaky old DAWs like Nuendo repaint themselves while we're - // repainting. Otherwise they just seem to give up and sit there - // waiting. - triggerAsyncUpdate(); - } - - #if JUCE_MAC - bool keyPressed (const KeyPress&) override - { - // If we have an unused keypress, move the key-focus to a host window - // and re-inject the event.. - return forwardCurrentKeyEventToHost (this, wrapper.useNSView); - } - #endif - - AudioProcessorEditor* getEditorComp() const - { - return dynamic_cast (getChildComponent(0)); - } - - void resized() override - { - if (Component* const editor = getChildComponent(0)) - editor->setBounds (getLocalBounds()); - - #if JUCE_MAC && ! JUCE_64BIT - if (! wrapper.useNSView) - updateEditorCompBounds (this); - #endif - } - - void childBoundsChanged (Component* child) override - { - child->setTopLeftPosition (0, 0); - - const int cw = child->getWidth(); - const int ch = child->getHeight(); - - #if JUCE_MAC - if (wrapper.useNSView) - setTopLeftPosition (0, getHeight() - ch); - #endif - - wrapper.resizeHostWindow (cw, ch); - - #if ! JUCE_LINUX // setSize() on linux causes renoise and energyxt to fail. - setSize (cw, ch); - #else - XResizeWindow (display, (Window) getWindowHandle(), cw, ch); - #endif - - #if JUCE_MAC - wrapper.resizeHostWindow (cw, ch); // (doing this a second time seems to be necessary in tracktion) - #endif - } - - void handleAsyncUpdate() override - { - wrapper.tryMasterIdle(); - } - - #if JUCE_WINDOWS - void mouseDown (const MouseEvent&) override - { - broughtToFront(); - } - - void broughtToFront() override - { - // for hosts like nuendo, need to also pop the MDI container to the - // front when our comp is clicked on. - if (! isCurrentlyBlockedByAnotherModalComponent()) - if (HWND parent = findMDIParentOf ((HWND) getWindowHandle())) - SetWindowPos (parent, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - } - #endif - - private: - //============================================================================== - JuceVSTWrapper& wrapper; - FakeMouseMoveGenerator fakeMouseGenerator; - - #if JUCE_WINDOWS - WindowsHooks hooks; - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EditorCompWrapper) - }; - - //============================================================================== -private: - AudioProcessor* filter; - juce::MemoryBlock chunkMemory; - juce::uint32 chunkMemoryTime; - ScopedPointer editorComp; - ERect editorSize; - MidiBuffer midiEvents; - VSTMidiEventList outgoingEvents; - VstSpeakerArrangementType speakerIn, speakerOut; - int numInChans, numOutChans; - bool isProcessing, isBypassed, hasShutdown, firstProcessCallback; - bool shouldDeleteEditor, useNSView; - HeapBlock channels; - Array tempChannels; // see note in processReplacing() - AudioSampleBuffer processTempBuffer; - - #if JUCE_MAC - void* hostWindow; - #elif JUCE_LINUX - Window hostWindow; - #else - HWND hostWindow; - #endif - - static inline VstInt32 convertHexVersionToDecimal (const unsigned int hexVersion) - { - #if JUCE_VST_RETURN_HEX_VERSION_NUMBER_DIRECTLY - return (VstInt32) hexVersion; - #else - return (VstInt32) (((hexVersion >> 24) & 0xff) * 1000 - + ((hexVersion >> 16) & 0xff) * 100 - + ((hexVersion >> 8) & 0xff) * 10 - + (hexVersion & 0xff)); - #endif - } - - //============================================================================== - #if JUCE_WINDOWS - // Workarounds for hosts which attempt to open editor windows on a non-GUI thread.. (Grrrr...) - static void checkWhetherMessageThreadIsCorrect() - { - const PluginHostType host (getHostType()); - - if (host.isWavelab() || host.isCubaseBridged() || host.isPremiere()) - { - if (! messageThreadIsDefinitelyCorrect) - { - MessageManager::getInstance()->setCurrentThreadAsMessageThread(); - - class MessageThreadCallback : public CallbackMessage - { - public: - MessageThreadCallback (bool& tr) : triggered (tr) {} - - void messageCallback() override - { - triggered = true; - } - - private: - bool& triggered; - }; - - (new MessageThreadCallback (messageThreadIsDefinitelyCorrect))->post(); - } - } - } - #else - static void checkWhetherMessageThreadIsCorrect() {} - #endif - - //============================================================================== - void deleteTempChannels() - { - for (int i = tempChannels.size(); --i >= 0;) - delete[] (tempChannels.getUnchecked(i)); - - tempChannels.clear(); - - if (filter != nullptr) - tempChannels.insertMultiple (0, nullptr, filter->getNumInputChannels() + filter->getNumOutputChannels()); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVSTWrapper) -}; - -//============================================================================== -namespace -{ - AEffect* pluginEntryPoint (audioMasterCallback audioMaster) - { - JUCE_AUTORELEASEPOOL - { - initialiseJuce_GUI(); - - try - { - if (audioMaster (0, audioMasterVersion, 0, 0, 0, 0) != 0) - { - #if JUCE_LINUX - MessageManagerLock mmLock; - #endif - - AudioProcessor* const filter = createPluginFilterOfType (AudioProcessor::wrapperType_VST); - JuceVSTWrapper* const wrapper = new JuceVSTWrapper (audioMaster, filter); - return wrapper->getAeffect(); - } - } - catch (...) - {} - } - - return nullptr; - } -} - -#if ! JUCE_WINDOWS - #define JUCE_EXPORTED_FUNCTION extern "C" __attribute__ ((visibility("default"))) -#endif - -//============================================================================== -// Mac startup code.. -#if JUCE_MAC - - JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster); - JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster) - { - initialiseMac(); - return pluginEntryPoint (audioMaster); - } - - JUCE_EXPORTED_FUNCTION AEffect* main_macho (audioMasterCallback audioMaster); - JUCE_EXPORTED_FUNCTION AEffect* main_macho (audioMasterCallback audioMaster) - { - initialiseMac(); - return pluginEntryPoint (audioMaster); - } - -//============================================================================== -// Linux startup code.. -#elif JUCE_LINUX - - JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster); - JUCE_EXPORTED_FUNCTION AEffect* VSTPluginMain (audioMasterCallback audioMaster) - { - SharedMessageThread::getInstance(); - return pluginEntryPoint (audioMaster); - } - - JUCE_EXPORTED_FUNCTION AEffect* main_plugin (audioMasterCallback audioMaster) asm ("main"); - JUCE_EXPORTED_FUNCTION AEffect* main_plugin (audioMasterCallback audioMaster) - { - return VSTPluginMain (audioMaster); - } - - // don't put initialiseJuce_GUI or shutdownJuce_GUI in these... it will crash! - __attribute__((constructor)) void myPluginInit() {} - __attribute__((destructor)) void myPluginFini() {} - -//============================================================================== -// Win32 startup code.. -#else - - extern "C" __declspec (dllexport) AEffect* VSTPluginMain (audioMasterCallback audioMaster) - { - return pluginEntryPoint (audioMaster); - } - - #ifndef JUCE_64BIT // (can't compile this on win64, but it's not needed anyway with VST2.4) - extern "C" __declspec (dllexport) int main (audioMasterCallback audioMaster) - { - return (int) pluginEntryPoint (audioMaster); - } - #endif -#endif - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm b/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm deleted file mode 100755 index e8a31a6..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.mm +++ /dev/null @@ -1,296 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_VST || JucePlugin_Build_VST3 - -#define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 - -#include "../utility/juce_IncludeSystemHeaders.h" -#include "../utility/juce_IncludeModuleHeaders.h" -#include "../utility/juce_FakeMouseMoveGenerator.h" -#include "../utility/juce_CarbonVisibility.h" - -//============================================================================== -namespace juce -{ - -#if ! JUCE_64BIT -void updateEditorCompBounds (Component*); -void updateEditorCompBounds (Component* comp) -{ - HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) - comp->getProperties() ["dummyViewRef"].toString().getHexValue64(); - - HIRect r; - HIViewGetFrame (dummyView, &r); - HIViewRef root; - HIViewFindByID (HIViewGetRoot (HIViewGetWindow (dummyView)), kHIViewWindowContentID, &root); - HIViewConvertRect (&r, HIViewGetSuperview (dummyView), root); - - Rect windowPos; - GetWindowBounds (HIViewGetWindow (dummyView), kWindowContentRgn, &windowPos); - - comp->setTopLeftPosition ((int) (windowPos.left + r.origin.x), - (int) (windowPos.top + r.origin.y)); -} - -static pascal OSStatus viewBoundsChangedEvent (EventHandlerCallRef, EventRef, void* user) -{ - updateEditorCompBounds ((Component*) user); - return noErr; -} -#endif - -//============================================================================== -void initialiseMac(); -void initialiseMac() -{ - #if ! JUCE_64BIT - NSApplicationLoad(); - #endif -} - -void* attachComponentToWindowRef (Component* comp, void* parentWindowOrView, bool isNSView); -void* attachComponentToWindowRef (Component* comp, void* parentWindowOrView, bool isNSView) -{ - JUCE_AUTORELEASEPOOL - { - #if ! JUCE_64BIT - if (! isNSView) - { - NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: parentWindowOrView]; - [hostWindow retain]; - [hostWindow setCanHide: YES]; - [hostWindow setReleasedWhenClosed: YES]; - - HIViewRef parentView = 0; - - WindowAttributes attributes; - GetWindowAttributes ((WindowRef) parentWindowOrView, &attributes); - if ((attributes & kWindowCompositingAttribute) != 0) - { - HIViewRef root = HIViewGetRoot ((WindowRef) parentWindowOrView); - HIViewFindByID (root, kHIViewWindowContentID, &parentView); - - if (parentView == 0) - parentView = root; - } - else - { - GetRootControl ((WindowRef) parentWindowOrView, (ControlRef*) &parentView); - - if (parentView == 0) - CreateRootControl ((WindowRef) parentWindowOrView, (ControlRef*) &parentView); - } - - // It seems that the only way to successfully position our overlaid window is by putting a dummy - // HIView into the host's carbon window, and then catching events to see when it gets repositioned - HIViewRef dummyView = 0; - HIImageViewCreate (0, &dummyView); - HIRect r = { {0, 0}, { (float) comp->getWidth(), (float) comp->getHeight()} }; - HIViewSetFrame (dummyView, &r); - HIViewAddSubview (parentView, dummyView); - comp->getProperties().set ("dummyViewRef", String::toHexString ((pointer_sized_int) (void*) dummyView)); - - EventHandlerRef ref; - const EventTypeSpec kControlBoundsChangedEvent = { kEventClassControl, kEventControlBoundsChanged }; - InstallEventHandler (GetControlEventTarget (dummyView), NewEventHandlerUPP (viewBoundsChangedEvent), 1, &kControlBoundsChangedEvent, (void*) comp, &ref); - comp->getProperties().set ("boundsEventRef", String::toHexString ((pointer_sized_int) (void*) ref)); - - updateEditorCompBounds (comp); - - #if ! JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); - #else - comp->addToDesktop (ComponentPeer::windowIsTemporary); - #endif - - comp->setVisible (true); - comp->toFront (false); - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - [pluginWindow setExcludedFromWindowsMenu: YES]; - [pluginWindow setCanHide: YES]; - - [hostWindow addChildWindow: pluginWindow - ordered: NSWindowAbove]; - [hostWindow orderFront: nil]; - [pluginWindow orderFront: nil]; - - attachWindowHidingHooks (comp, (WindowRef) parentWindowOrView, hostWindow); - - return hostWindow; - } - #endif - - (void) isNSView; - NSView* parentView = [(NSView*) parentWindowOrView retain]; - - #if JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (0, parentView); - #else - comp->addToDesktop (ComponentPeer::windowIgnoresKeyPresses, parentView); - #endif - - // (this workaround is because Wavelab provides a zero-size parent view..) - if ([parentView frame].size.height == 0) - [((NSView*) comp->getWindowHandle()) setFrameOrigin: NSZeroPoint]; - - comp->setVisible (true); - comp->toFront (false); - - [[parentView window] setAcceptsMouseMovedEvents: YES]; - return parentView; - } -} - -void detachComponentFromWindowRef (Component* comp, void* window, bool isNSView); -void detachComponentFromWindowRef (Component* comp, void* window, bool isNSView) -{ - JUCE_AUTORELEASEPOOL - { - #if ! JUCE_64BIT - if (! isNSView) - { - EventHandlerRef ref = (EventHandlerRef) (void*) (pointer_sized_int) - comp->getProperties() ["boundsEventRef"].toString().getHexValue64(); - RemoveEventHandler (ref); - - removeWindowHidingHooks (comp); - - HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) - comp->getProperties() ["dummyViewRef"].toString().getHexValue64(); - - if (HIViewIsValid (dummyView)) - CFRelease (dummyView); - - NSWindow* hostWindow = (NSWindow*) window; - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - - [pluginView retain]; - [hostWindow removeChildWindow: pluginWindow]; - [pluginWindow close]; - comp->removeFromDesktop(); - [pluginView release]; - - [hostWindow release]; - - static bool needToRunMessageLoop = ! getHostType().isReaper(); - - // The event loop needs to be run between closing the window and deleting the plugin, - // presumably to let the cocoa objects get tidied up. Leaving out this line causes crashes - // in Live when you delete the plugin with its window open. - // (Doing it this way rather than using a single longer timout means that we can guarantee - // how many messages will be dispatched, which seems to be vital in Reaper) - if (needToRunMessageLoop) - for (int i = 20; --i >= 0;) - MessageManager::getInstance()->runDispatchLoopUntil (1); - - return; - } - #endif - - (void) isNSView; - comp->removeFromDesktop(); - [(id) window release]; - } -} - -void setNativeHostWindowSize (void* window, Component* component, int newWidth, int newHeight, bool isNSView); -void setNativeHostWindowSize (void* window, Component* component, int newWidth, int newHeight, bool isNSView) -{ - JUCE_AUTORELEASEPOOL - { - #if ! JUCE_64BIT - if (! isNSView) - { - if (HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) - component->getProperties() ["dummyViewRef"].toString().getHexValue64()) - { - HIRect frameRect; - HIViewGetFrame (dummyView, &frameRect); - frameRect.size.width = newWidth; - frameRect.size.height = newHeight; - HIViewSetFrame (dummyView, &frameRect); - } - - return; - } - #endif - - (void) isNSView; - - if (NSView* hostView = (NSView*) window) - { - const int dx = newWidth - component->getWidth(); - const int dy = newHeight - component->getHeight(); - - NSRect r = [hostView frame]; - r.size.width += dx; - r.size.height += dy; - r.origin.y -= dy; - [hostView setFrame: r]; - } - } -} - -void checkWindowVisibility (void* window, Component* comp, bool isNSView); -void checkWindowVisibility (void* window, Component* comp, bool isNSView) -{ - (void) window; (void) comp; (void) isNSView; - - #if ! JUCE_64BIT - if (! isNSView) - comp->setVisible ([((NSWindow*) window) isVisible]); - #endif -} - -bool forwardCurrentKeyEventToHost (Component* comp, bool isNSView); -bool forwardCurrentKeyEventToHost (Component* comp, bool isNSView) -{ - #if ! JUCE_64BIT - if (! isNSView) - { - NSWindow* win = [(NSView*) comp->getWindowHandle() window]; - [[win parentWindow] makeKeyWindow]; - repostCurrentNSEvent(); - return true; - } - #endif - - (void) comp; (void) isNSView; - return false; -} - -} // (juce namespace) - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp deleted file mode 100755 index cb71927..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ /dev/null @@ -1,1814 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -//============================================================================== -#if JucePlugin_Build_VST3 && (__APPLE_CPP__ || __APPLE_CC__ || _WIN32 || _WIN64) - -#include "../../juce_audio_processors/format_types/juce_VST3Headers.h" -#include "../utility/juce_CheckSettingMacros.h" -#include "../utility/juce_IncludeModuleHeaders.h" -#include "../utility/juce_WindowsHooks.h" -#include "../../juce_audio_processors/format_types/juce_VST3Common.h" - -#ifndef JUCE_VST3_CAN_REPLACE_VST2 - #define JUCE_VST3_CAN_REPLACE_VST2 1 -#endif - -#if JUCE_VST3_CAN_REPLACE_VST2 - #if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4514 4996) - #endif - - #include - - #if JUCE_MSVC - #pragma warning (pop) - #endif -#endif - -#undef Point -#undef Component - -namespace juce -{ - -using namespace Steinberg; - -//============================================================================== -#if JUCE_MAC - extern void initialiseMac(); - extern void* attachComponentToWindowRef (Component*, void* parent, bool isNSView); - extern void detachComponentFromWindowRef (Component*, void* window, bool isNSView); - extern void setNativeHostWindowSize (void* window, Component*, int newWidth, int newHeight, bool isNSView); -#endif - -//============================================================================== -class JuceAudioProcessor : public FUnknown -{ -public: - JuceAudioProcessor (AudioProcessor* source) noexcept - : refCount (0), audioProcessor (source) {} - - virtual ~JuceAudioProcessor() {} - - AudioProcessor* get() const noexcept { return audioProcessor; } - - JUCE_DECLARE_VST3_COM_QUERY_METHODS - JUCE_DECLARE_VST3_COM_REF_METHODS - - static const FUID iid; - -private: - Atomic refCount; - ScopedPointer audioProcessor; - ScopedJuceInitialiser_GUI libraryInitialiser; - - JuceAudioProcessor() JUCE_DELETED_FUNCTION; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAudioProcessor) -}; - -//============================================================================== -class JuceVST3EditController : public Vst::EditController, - public Vst::IMidiMapping, - public AudioProcessorListener -{ -public: - JuceVST3EditController (Vst::IHostApplication* host) - { - if (host != nullptr) - host->queryInterface (FUnknown::iid, (void**) &hostContext); - } - - //============================================================================== - static const FUID iid; - - //============================================================================== - REFCOUNT_METHODS (ComponentBase) - - tresult PLUGIN_API queryInterface (const TUID targetIID, void** obj) override - { - TEST_FOR_AND_RETURN_IF_VALID (targetIID, FObject) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, JuceVST3EditController) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IEditController) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IEditController2) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IConnectionPoint) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IMidiMapping) - TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (targetIID, IPluginBase, Vst::IEditController) - TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (targetIID, IDependent, Vst::IEditController) - TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (targetIID, FUnknown, Vst::IEditController) - - if (doUIDsMatch (targetIID, JuceAudioProcessor::iid)) - { - audioProcessor->addRef(); - *obj = audioProcessor; - return kResultOk; - } - - *obj = nullptr; - return kNoInterface; - } - - //============================================================================== - tresult PLUGIN_API initialize (FUnknown* context) override - { - if (hostContext != context) - { - if (hostContext != nullptr) - hostContext->release(); - - hostContext = context; - - if (hostContext != nullptr) - hostContext->addRef(); - } - - return kResultTrue; - } - - tresult PLUGIN_API terminate() override - { - if (AudioProcessor* const pluginInstance = getPluginInstance()) - pluginInstance->removeListener (this); - - audioProcessor = nullptr; - - return EditController::terminate(); - } - - //============================================================================== - struct Param : public Vst::Parameter - { - Param (AudioProcessor& p, int index) : owner (p), paramIndex (index) - { - info.id = (Vst::ParamID) index; - toString128 (info.title, p.getParameterName (index)); - toString128 (info.shortTitle, p.getParameterName (index, 8)); - toString128 (info.units, p.getParameterLabel (index)); - - const int numSteps = p.getParameterNumSteps (index); - info.stepCount = (Steinberg::int32) (numSteps > 0 && numSteps < 0x7fffffff ? numSteps - 1 : 0); - info.defaultNormalizedValue = p.getParameterDefaultValue (index); - jassert (info.defaultNormalizedValue >= 0 && info.defaultNormalizedValue <= 1.0f); - info.unitId = Vst::kRootUnitId; - info.flags = p.isParameterAutomatable (index) ? Vst::ParameterInfo::kCanAutomate : 0; - } - - virtual ~Param() {} - - bool setNormalized (Vst::ParamValue v) override - { - v = jlimit (0.0, 1.0, v); - - if (v != valueNormalized) - { - valueNormalized = v; - changed(); - return true; - } - - return false; - } - - void toString (Vst::ParamValue, Vst::String128 result) const override - { - toString128 (result, owner.getParameterText (paramIndex, 128)); - } - - Vst::ParamValue toPlain (Vst::ParamValue v) const override { return v; } - Vst::ParamValue toNormalized (Vst::ParamValue v) const override { return v; } - - private: - AudioProcessor& owner; - int paramIndex; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Param) - }; - - //============================================================================== - void setAudioProcessor (JuceAudioProcessor* audioProc) - { - if (audioProcessor != audioProc) - { - audioProcessor = audioProc; - setupParameters(); - } - } - - tresult PLUGIN_API connect (IConnectionPoint* other) override - { - if (other != nullptr && audioProcessor == nullptr) - { - const tresult result = ComponentBase::connect (other); - - if (! audioProcessor.loadFrom (other)) - sendIntMessage ("JuceVST3EditController", (Steinberg::int64) (pointer_sized_int) this); - else - setupParameters(); - - return result; - } - - jassertfalse; - return kResultFalse; - } - - //============================================================================== - tresult PLUGIN_API getMidiControllerAssignment (Steinberg::int32, Steinberg::int16, - Vst::CtrlNumber, - Vst::ParamID& id) override - { - //TODO - id = 0; - return kNotImplemented; - } - - //============================================================================== - IPlugView* PLUGIN_API createView (const char* name) override - { - if (AudioProcessor* const pluginInstance = getPluginInstance()) - { - if (pluginInstance->hasEditor() && name != nullptr - && strcmp (name, Vst::ViewType::kEditor) == 0) - { - return new JuceVST3Editor (*this, *pluginInstance); - } - } - - return nullptr; - } - - //============================================================================== - void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override { beginEdit ((Vst::ParamID) index); } - void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override { performEdit ((Vst::ParamID) index, (double) newValue); } - void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override { endEdit ((Vst::ParamID) index); } - - void audioProcessorChanged (AudioProcessor*) override - { - if (componentHandler != nullptr) - componentHandler->restartComponent (Vst::kLatencyChanged & Vst::kParamValuesChanged); - } - - //============================================================================== - AudioProcessor* getPluginInstance() const noexcept - { - if (audioProcessor != nullptr) - return audioProcessor->get(); - - return nullptr; - } - -private: - //============================================================================== - ComSmartPtr audioProcessor; - ScopedJuceInitialiser_GUI libraryInitialiser; - - //============================================================================== - void setupParameters() - { - if (AudioProcessor* const pluginInstance = getPluginInstance()) - { - pluginInstance->addListener (this); - - if (parameters.getParameterCount() <= 0) - for (int i = 0; i < pluginInstance->getNumParameters(); ++i) - parameters.addParameter (new Param (*pluginInstance, i)); - - audioProcessorChanged (pluginInstance); - } - } - - void sendIntMessage (const char* idTag, const Steinberg::int64 value) - { - jassert (hostContext != nullptr); - - if (Vst::IMessage* message = allocateMessage()) - { - const FReleaser releaser (message); - message->setMessageID (idTag); - message->getAttributes()->setInt (idTag, value); - sendMessage (message); - } - } - - //============================================================================== - class JuceVST3Editor : public Vst::EditorView - { - public: - JuceVST3Editor (JuceVST3EditController& ec, AudioProcessor& p) - : Vst::EditorView (&ec, nullptr), - owner (&ec), pluginInstance (p) - { - #if JUCE_MAC - macHostWindow = nullptr; - isNSView = false; - #endif - - component = new ContentWrapperComponent (*this, p); - } - - //============================================================================== - tresult PLUGIN_API isPlatformTypeSupported (FIDString type) override - { - if (type != nullptr && pluginInstance.hasEditor()) - { - #if JUCE_WINDOWS - if (strcmp (type, kPlatformTypeHWND) == 0) - #else - if (strcmp (type, kPlatformTypeNSView) == 0 || strcmp (type, kPlatformTypeHIView) == 0) - #endif - return kResultTrue; - } - - return kResultFalse; - } - - tresult PLUGIN_API attached (void* parent, FIDString type) override - { - if (parent == nullptr || isPlatformTypeSupported (type) == kResultFalse) - return kResultFalse; - - if (component == nullptr) - component = new ContentWrapperComponent (*this, pluginInstance); - - #if JUCE_WINDOWS - component->addToDesktop (0, parent); - component->setOpaque (true); - component->setVisible (true); - #else - isNSView = (strcmp (type, kPlatformTypeNSView) == 0); - macHostWindow = juce::attachComponentToWindowRef (component, parent, isNSView); - #endif - - component->resizeHostWindow(); - systemWindow = parent; - attachedToParent(); - - return kResultTrue; - } - - tresult PLUGIN_API removed() override - { - if (component != nullptr) - { - #if JUCE_WINDOWS - component->removeFromDesktop(); - #else - if (macHostWindow != nullptr) - { - juce::detachComponentFromWindowRef (component, macHostWindow, isNSView); - macHostWindow = nullptr; - } - #endif - - component = nullptr; - } - - return CPluginView::removed(); - } - - tresult PLUGIN_API onSize (ViewRect* newSize) override - { - if (newSize != nullptr) - { - rect = *newSize; - - if (component != nullptr) - component->setSize (rect.getWidth(), rect.getHeight()); - - return kResultTrue; - } - - jassertfalse; - return kResultFalse; - } - - tresult PLUGIN_API getSize (ViewRect* size) override - { - if (size != nullptr && component != nullptr) - { - *size = ViewRect (0, 0, component->getWidth(), component->getHeight()); - return kResultTrue; - } - - return kResultFalse; - } - - tresult PLUGIN_API canResize() override { return kResultTrue; } - - tresult PLUGIN_API checkSizeConstraint (ViewRect* rect) override - { - if (rect != nullptr && component != nullptr) - { - rect->right = rect->left + component->getWidth(); - rect->bottom = rect->top + component->getHeight(); - return kResultTrue; - } - - jassertfalse; - return kResultFalse; - } - - private: - //============================================================================== - class ContentWrapperComponent : public juce::Component - { - public: - ContentWrapperComponent (JuceVST3Editor& editor, AudioProcessor& plugin) - : owner (editor), - pluginEditor (plugin.createEditorIfNeeded()) - { - setOpaque (true); - setBroughtToFrontOnMouseClick (true); - - // if hasEditor() returns true then createEditorIfNeeded has to return a valid editor - jassert (pluginEditor != nullptr); - - if (pluginEditor != nullptr) - { - addAndMakeVisible (pluginEditor); - setBounds (pluginEditor->getLocalBounds()); - resizeHostWindow(); - } - } - - ~ContentWrapperComponent() - { - if (pluginEditor != nullptr) - { - PopupMenu::dismissAllActiveMenus(); - pluginEditor->processor.editorBeingDeleted (pluginEditor); - } - } - - void paint (Graphics& g) override - { - g.fillAll (Colours::black); - } - - void childBoundsChanged (Component*) override - { - resizeHostWindow(); - } - - void resized() override - { - if (pluginEditor != nullptr) - pluginEditor->setBounds (getLocalBounds()); - } - - void resizeHostWindow() - { - if (pluginEditor != nullptr) - { - const int w = pluginEditor->getWidth(); - const int h = pluginEditor->getHeight(); - - #if JUCE_WINDOWS - setSize (w, h); - #else - if (owner.macHostWindow != nullptr && ! getHostType().isWavelab()) - juce::setNativeHostWindowSize (owner.macHostWindow, this, w, h, owner.isNSView); - #endif - - if (owner.plugFrame != nullptr) - { - ViewRect newSize (0, 0, w, h); - owner.plugFrame->resizeView (&owner, &newSize); - - if (getHostType().isWavelab()) - setBounds (0, 0, w, h); - } - } - } - - private: - JuceVST3Editor& owner; - ScopedPointer pluginEditor; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContentWrapperComponent) - }; - - //============================================================================== - ComSmartPtr owner; - AudioProcessor& pluginInstance; - - ScopedPointer component; - friend class ContentWrapperComponent; - - #if JUCE_MAC - void* macHostWindow; - bool isNSView; - #endif - - #if JUCE_WINDOWS - WindowsHooks hooks; - #endif - - ScopedJuceInitialiser_GUI libraryInitialiser; - - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Editor) - }; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3EditController) -}; - -//============================================================================== -class JuceVST3Component : public Vst::IComponent, - public Vst::IAudioProcessor, - public Vst::IUnitInfo, - public Vst::IConnectionPoint, - public AudioPlayHead -{ -public: - JuceVST3Component (Vst::IHostApplication* h) - : refCount (1), - host (h), - audioInputs (Vst::kAudio, Vst::kInput), - audioOutputs (Vst::kAudio, Vst::kOutput), - eventInputs (Vst::kEvent, Vst::kInput), - eventOutputs (Vst::kEvent, Vst::kOutput) - { - pluginInstance = createPluginFilterOfType (AudioProcessor::wrapperType_VST3); - comPluginInstance = new JuceAudioProcessor (pluginInstance); - - zerostruct (processContext); - - processSetup.maxSamplesPerBlock = 1024; - processSetup.processMode = Vst::kRealtime; - processSetup.sampleRate = 44100.0; - processSetup.symbolicSampleSize = Vst::kSample32; - - pluginInstance->setPlayHead (this); - } - - ~JuceVST3Component() - { - if (pluginInstance != nullptr) - if (pluginInstance->getPlayHead() == this) - pluginInstance->setPlayHead (nullptr); - - audioInputs.removeAll(); - audioOutputs.removeAll(); - eventInputs.removeAll(); - eventOutputs.removeAll(); - } - - //============================================================================== - AudioProcessor& getPluginInstance() const noexcept { return *pluginInstance; } - - //============================================================================== - static const FUID iid; - - JUCE_DECLARE_VST3_COM_REF_METHODS - - tresult PLUGIN_API queryInterface (const TUID targetIID, void** obj) override - { - TEST_FOR_AND_RETURN_IF_VALID (targetIID, IPluginBase) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, JuceVST3Component) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IComponent) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IAudioProcessor) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IUnitInfo) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IConnectionPoint) - TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (targetIID, FUnknown, Vst::IComponent) - - if (doUIDsMatch (targetIID, JuceAudioProcessor::iid)) - { - comPluginInstance->addRef(); - *obj = comPluginInstance; - return kResultOk; - } - - *obj = nullptr; - return kNoInterface; - } - - //============================================================================== - tresult PLUGIN_API initialize (FUnknown* hostContext) override - { - if (host != hostContext) - host.loadFrom (hostContext); - - #if JucePlugin_MaxNumInputChannels > 0 - addAudioBusTo (audioInputs, TRANS("Audio Input"), - getArrangementForNumChannels (JucePlugin_MaxNumInputChannels)); - #endif - - #if JucePlugin_MaxNumOutputChannels > 0 - addAudioBusTo (audioOutputs, TRANS("Audio Output"), - getArrangementForNumChannels (JucePlugin_MaxNumOutputChannels)); - #endif - - #if JucePlugin_WantsMidiInput - addEventBusTo (eventInputs, TRANS("MIDI Input")); - #endif - - #if JucePlugin_ProducesMidiOutput - addEventBusTo (eventOutputs, TRANS("MIDI Output")); - #endif - - processContext.sampleRate = processSetup.sampleRate; - - preparePlugin (processSetup.sampleRate, (int) processSetup.maxSamplesPerBlock); - - return kResultTrue; - } - - tresult PLUGIN_API terminate() override - { - getPluginInstance().releaseResources(); - return kResultTrue; - } - - //============================================================================== - tresult PLUGIN_API connect (IConnectionPoint* other) override - { - if (other != nullptr && juceVST3EditController == nullptr) - juceVST3EditController.loadFrom (other); - - return kResultTrue; - } - - tresult PLUGIN_API disconnect (IConnectionPoint*) override - { - juceVST3EditController = nullptr; - return kResultTrue; - } - - tresult PLUGIN_API notify (Vst::IMessage* message) override - { - if (message != nullptr && juceVST3EditController == nullptr) - { - Steinberg::int64 value = 0; - - if (message->getAttributes()->getInt ("JuceVST3EditController", value) == kResultTrue) - { - juceVST3EditController = (JuceVST3EditController*) (pointer_sized_int) value; - - if (juceVST3EditController != nullptr) - juceVST3EditController->setAudioProcessor (comPluginInstance); - else - jassertfalse; - } - } - - return kResultTrue; - } - - //============================================================================== - tresult PLUGIN_API getControllerClassId (TUID classID) override - { - memcpy (classID, JuceVST3EditController::iid, sizeof (TUID)); - return kResultTrue; - } - - Steinberg::int32 PLUGIN_API getBusCount (Vst::MediaType type, Vst::BusDirection dir) override - { - if (Vst::BusList* const busList = getBusListFor (type, dir)) - return busList->total(); - - return 0; - } - - tresult PLUGIN_API getBusInfo (Vst::MediaType type, Vst::BusDirection dir, - Steinberg::int32 index, Vst::BusInfo& info) override - { - if (Vst::BusList* const busList = getBusListFor (type, dir)) - { - if (Vst::Bus* const bus = (Vst::Bus*) busList->at (index)) - { - info.mediaType = type; - info.direction = dir; - - if (bus->getInfo (info)) - return kResultTrue; - } - } - - zerostruct (info); - return kResultFalse; - } - - tresult PLUGIN_API activateBus (Vst::MediaType type, Vst::BusDirection dir, - Steinberg::int32 index, TBool state) override - { - if (Vst::BusList* const busList = getBusListFor (type, dir)) - { - if (Vst::Bus* const bus = (Vst::Bus*) busList->at (index)) - { - bus->setActive (state); - return kResultTrue; - } - } - - jassertfalse; - return kResultFalse; - } - - tresult PLUGIN_API setActive (TBool state) override - { - if (! state) - { - getPluginInstance().releaseResources(); - } - else - { - double sampleRate = getPluginInstance().getSampleRate(); - int bufferSize = getPluginInstance().getBlockSize(); - - sampleRate = processSetup.sampleRate > 0.0 - ? processSetup.sampleRate - : sampleRate; - - bufferSize = processSetup.maxSamplesPerBlock > 0 - ? (int) processSetup.maxSamplesPerBlock - : bufferSize; - - channelList.clear(); - channelList.insertMultiple (0, nullptr, jmax (JucePlugin_MaxNumInputChannels, JucePlugin_MaxNumOutputChannels) + 1); - - preparePlugin (sampleRate, bufferSize); - } - - return kResultOk; - } - - tresult PLUGIN_API setIoMode (Vst::IoMode) override { return kNotImplemented; } - tresult PLUGIN_API getRoutingInfo (Vst::RoutingInfo&, Vst::RoutingInfo&) override { return kNotImplemented; } - - #if JUCE_VST3_CAN_REPLACE_VST2 - void loadVST2VstWBlock (const char* data, int size) - { - const int headerLen = htonl (*(juce::int32*) (data + 4)); - const struct fxBank* bank = (const struct fxBank*) (data + (8 + headerLen)); - const int version = htonl (bank->version); (void) version; - - jassert ('VstW' == htonl (*(juce::int32*) data)); - jassert (1 == htonl (*(juce::int32*) (data + 8))); // version should be 1 according to Steinberg's docs - jassert (cMagic == htonl (bank->chunkMagic)); - jassert (chunkBankMagic == htonl (bank->fxMagic)); - jassert (version == 1 || version == 2); - jassert (JucePlugin_VSTUniqueID == htonl (bank->fxID)); - - pluginInstance->setStateInformation (bank->content.data.chunk, - jmin ((int) (size - (bank->content.data.chunk - data)), - (int) htonl (bank->content.data.size))); - } - - bool loadVST3PresetFile (const char* data, int size) - { - if (size < 48) - return false; - - // At offset 4 there's a little-endian version number which seems to typically be 1 - // At offset 8 there's 32 bytes the SDK calls "ASCII-encoded class id" - const int chunkListOffset = (int) ByteOrder::littleEndianInt (data + 40); - jassert (memcmp (data + chunkListOffset, "List", 4) == 0); - const int entryCount = (int) ByteOrder::littleEndianInt (data + chunkListOffset + 4); - jassert (entryCount > 0); - - for (int i = 0; i < entryCount; ++i) - { - const int entryOffset = chunkListOffset + 8 + 20 * i; - - if (entryOffset + 20 > size) - return false; - - if (memcmp (data + entryOffset, "Comp", 4) == 0) - { - // "Comp" entries seem to contain the data. - juce::uint64 chunkOffset = ByteOrder::littleEndianInt64 (data + entryOffset + 4); - juce::uint64 chunkSize = ByteOrder::littleEndianInt64 (data + entryOffset + 12); - - if (chunkOffset + chunkSize > size) - { - jassertfalse; - return false; - } - - loadVST2VstWBlock (data + chunkOffset, (int) chunkSize); - } - } - - return true; - } - - bool loadVST2CompatibleState (const char* data, int size) - { - if (size < 4) - return false; - - if (htonl (*(juce::int32*) data) == 'VstW') - { - loadVST2VstWBlock (data, size); - return true; - } - - if (memcmp (data, "VST3", 4) == 0) - { - // In Cubase 5, when loading VST3 .vstpreset files, - // we get the whole content of the files to load. - // In Cubase 7 we get just the contents within and - // we go directly to the loadVST2VstW codepath instead. - return loadVST3PresetFile (data, size); - } - - return false; - } - #endif - - bool loadStateData (const void* data, int size) - { - #if JUCE_VST3_CAN_REPLACE_VST2 - return loadVST2CompatibleState ((const char*) data, size); - #else - pluginInstance->setStateInformation (data, size); - return true; - #endif - } - - bool readFromMemoryStream (IBStream* state) - { - FUnknownPtr s (state); - - if (s != nullptr - && s->getData() != nullptr - && s->getSize() > 0 - && s->getSize() < 1024 * 1024 * 100) // (some hosts seem to return junk for the size) - { - // Adobe Audition CS6 hack to avoid trying to use corrupted streams: - if (getHostType().isAdobeAudition()) - if (s->getSize() >= 5 && memcmp (s->getData(), "VC2!E", 5) == 0) - return false; - - return loadStateData (s->getData(), (int) s->getSize()); - } - - return false; - } - - bool readFromUnknownStream (IBStream* state) - { - MemoryOutputStream allData; - - { - const size_t bytesPerBlock = 4096; - HeapBlock buffer (bytesPerBlock); - - for (;;) - { - Steinberg::int32 bytesRead = 0; - const Steinberg::tresult status = state->read (buffer, (Steinberg::int32) bytesPerBlock, &bytesRead); - - if (bytesRead <= 0 || (status != kResultTrue && ! getHostType().isWavelab())) - break; - - allData.write (buffer, bytesRead); - } - } - - const size_t dataSize = allData.getDataSize(); - - return dataSize > 0 && dataSize < 0x7fffffff - && loadStateData (allData.getData(), (int) dataSize); - } - - tresult PLUGIN_API setState (IBStream* state) override - { - if (state == nullptr) - return kInvalidArgument; - - FUnknownPtr stateRefHolder (state); // just in case the caller hasn't properly ref-counted the stream object - - if (state->seek (0, IBStream::kIBSeekSet, nullptr) == kResultTrue) - if (readFromMemoryStream (state) || readFromUnknownStream (state)) - return kResultTrue; - - return kResultFalse; - } - - #if JUCE_VST3_CAN_REPLACE_VST2 - static tresult writeVST2Int (IBStream* state, int n) - { - juce::int32 t = (juce::int32) htonl (n); - return state->write (&t, 4); - } - - static tresult writeVST2Header (IBStream* state) - { - tresult status = writeVST2Int (state, 'VstW'); - - if (status == kResultOk) status = writeVST2Int (state, 8); // header size - if (status == kResultOk) status = writeVST2Int (state, 1); // version - if (status == kResultOk) status = writeVST2Int (state, 0); // bypass - - return status; - } - #endif - - tresult PLUGIN_API getState (IBStream* state) override - { - if (state == nullptr) - return kInvalidArgument; - - juce::MemoryBlock mem; - pluginInstance->getStateInformation (mem); - - #if JUCE_VST3_CAN_REPLACE_VST2 - tresult status = writeVST2Header (state); - - if (status != kResultOk) - return status; - - const int bankBlockSize = 160; - struct fxBank bank; - - zerostruct (bank); - bank.chunkMagic = htonl (cMagic); - bank.byteSize = htonl (bankBlockSize - 8 + (unsigned int) mem.getSize()); - bank.fxMagic = htonl (chunkBankMagic); - bank.version = htonl (2); - bank.fxID = htonl (JucePlugin_VSTUniqueID); - bank.fxVersion = htonl (JucePlugin_VersionCode); - bank.content.data.size = htonl ((unsigned int) mem.getSize()); - - status = state->write (&bank, bankBlockSize); - - if (status != kResultOk) - return status; - #endif - - return state->write (mem.getData(), (Steinberg::int32) mem.getSize()); - } - - //============================================================================== - Steinberg::int32 PLUGIN_API getUnitCount() override - { - return 1; - } - - tresult PLUGIN_API getUnitInfo (Steinberg::int32 unitIndex, Vst::UnitInfo& info) override - { - if (unitIndex == 0) - { - info.id = Vst::kRootUnitId; - info.parentUnitId = Vst::kNoParentUnitId; - info.programListId = Vst::kNoProgramListId; - - toString128 (info.name, TRANS("Root Unit")); - - return kResultTrue; - } - - zerostruct (info); - return kResultFalse; - } - - Steinberg::int32 PLUGIN_API getProgramListCount() override - { - if (getPluginInstance().getNumPrograms() > 0) - return 1; - - return 0; - } - - tresult PLUGIN_API getProgramListInfo (Steinberg::int32 listIndex, Vst::ProgramListInfo& info) override - { - if (listIndex == 0) - { - info.id = paramPreset; - info.programCount = (Steinberg::int32) getPluginInstance().getNumPrograms(); - - toString128 (info.name, TRANS("Factory Presets")); - - return kResultTrue; - } - - jassertfalse; - zerostruct (info); - return kResultFalse; - } - - tresult PLUGIN_API getProgramName (Vst::ProgramListID listId, Steinberg::int32 programIndex, Vst::String128 name) override - { - if (listId == paramPreset - && isPositiveAndBelow ((int) programIndex, getPluginInstance().getNumPrograms())) - { - toString128 (name, getPluginInstance().getProgramName ((int) programIndex)); - return kResultTrue; - } - - jassertfalse; - toString128 (name, juce::String()); - return kResultFalse; - } - - tresult PLUGIN_API getProgramInfo (Vst::ProgramListID, Steinberg::int32, Vst::CString, Vst::String128) override { return kNotImplemented; } - tresult PLUGIN_API hasProgramPitchNames (Vst::ProgramListID, Steinberg::int32) override { return kNotImplemented; } - tresult PLUGIN_API getProgramPitchName (Vst::ProgramListID, Steinberg::int32, Steinberg::int16, Vst::String128) override { return kNotImplemented; } - tresult PLUGIN_API selectUnit (Vst::UnitID) override { return kNotImplemented; } - tresult PLUGIN_API setUnitProgramData (Steinberg::int32, Steinberg::int32, IBStream*) override { return kNotImplemented; } - Vst::UnitID PLUGIN_API getSelectedUnit() override { return Vst::kRootUnitId; } - - tresult PLUGIN_API getUnitByBus (Vst::MediaType, Vst::BusDirection, - Steinberg::int32, Steinberg::int32, - Vst::UnitID& unitId) override - { - zerostruct (unitId); - return kNotImplemented; - } - - //============================================================================== - bool getCurrentPosition (CurrentPositionInfo& info) override - { - info.timeInSamples = jmax ((juce::int64) 0, processContext.projectTimeSamples); - info.timeInSeconds = processContext.projectTimeMusic; - info.bpm = jmax (1.0, processContext.tempo); - info.timeSigNumerator = jmax (1, (int) processContext.timeSigNumerator); - info.timeSigDenominator = jmax (1, (int) processContext.timeSigDenominator); - info.ppqPositionOfLastBarStart = processContext.barPositionMusic; - info.ppqPosition = processContext.projectTimeMusic; - info.ppqLoopStart = processContext.cycleStartMusic; - info.ppqLoopEnd = processContext.cycleEndMusic; - info.isRecording = (processContext.state & Vst::ProcessContext::kRecording) != 0; - info.isPlaying = (processContext.state & Vst::ProcessContext::kPlaying) != 0; - info.isLooping = (processContext.state & Vst::ProcessContext::kCycleActive) != 0; - info.editOriginTime = 0.0; - info.frameRate = AudioPlayHead::fpsUnknown; - - if ((processContext.state & Vst::ProcessContext::kSmpteValid) != 0) - { - switch (processContext.frameRate.framesPerSecond) - { - case 24: info.frameRate = AudioPlayHead::fps24; break; - case 25: info.frameRate = AudioPlayHead::fps25; break; - case 29: info.frameRate = AudioPlayHead::fps30drop; break; - - case 30: - { - if ((processContext.frameRate.flags & Vst::FrameRate::kDropRate) != 0) - info.frameRate = AudioPlayHead::fps30drop; - else - info.frameRate = AudioPlayHead::fps30; - } - break; - - default: break; - } - } - - return true; - } - - //============================================================================== - static tresult setBusArrangementFor (Vst::BusList& list, - Vst::SpeakerArrangement* arrangement, - Steinberg::int32 numBusses) - { - if (arrangement != nullptr && numBusses == 1) //Should only be 1 bus per BusList - { - Steinberg::int32 counter = 0; - - FOREACH_CAST (IPtr, Vst::AudioBus, bus, list) - { - if (counter < numBusses) - bus->setArrangement (arrangement[counter]); - - counter++; - } - ENDFOR - - return kResultTrue; - } - - return kResultFalse; - } - - tresult PLUGIN_API setBusArrangements (Vst::SpeakerArrangement* inputs, Steinberg::int32 numIns, - Vst::SpeakerArrangement* outputs, Steinberg::int32 numOuts) override - { - (void) inputs; (void) outputs; - - #if JucePlugin_MaxNumInputChannels > 0 - if (setBusArrangementFor (audioInputs, inputs, numIns) != kResultTrue) - return kResultFalse; - #else - if (numIns != 0) - return kResultFalse; - #endif - - #if JucePlugin_MaxNumOutputChannels > 0 - if (setBusArrangementFor (audioOutputs, outputs, numOuts) != kResultTrue) - return kResultFalse; - #else - if (numOuts != 0) - return kResultFalse; - #endif - - preparePlugin (getPluginInstance().getSampleRate(), - getPluginInstance().getBlockSize()); - - return kResultTrue; - } - - tresult PLUGIN_API getBusArrangement (Vst::BusDirection dir, Steinberg::int32 index, Vst::SpeakerArrangement& arr) override - { - if (Vst::BusList* const busList = getBusListFor (Vst::kAudio, dir)) - { - if (Vst::AudioBus* const audioBus = FCast (busList->at (index))) - { - arr = audioBus->getArrangement(); - return kResultTrue; - } - } - - return kResultFalse; - } - - tresult PLUGIN_API canProcessSampleSize (Steinberg::int32 symbolicSampleSize) override - { - return symbolicSampleSize == Vst::kSample32 ? kResultTrue : kResultFalse; - } - - Steinberg::uint32 PLUGIN_API getLatencySamples() override - { - return (Steinberg::uint32) jmax (0, getPluginInstance().getLatencySamples()); - } - - tresult PLUGIN_API setupProcessing (Vst::ProcessSetup& newSetup) override - { - if (canProcessSampleSize (newSetup.symbolicSampleSize) != kResultTrue) - return kResultFalse; - - processSetup = newSetup; - processContext.sampleRate = processSetup.sampleRate; - - preparePlugin (processSetup.sampleRate, processSetup.maxSamplesPerBlock); - - return kResultTrue; - } - - tresult PLUGIN_API setProcessing (TBool state) override - { - if (! state) - getPluginInstance().reset(); - - return kResultTrue; - } - - Steinberg::uint32 PLUGIN_API getTailSamples() override - { - const double tailLengthSeconds = getPluginInstance().getTailLengthSeconds(); - - if (tailLengthSeconds <= 0.0 || processSetup.sampleRate > 0.0) - return Vst::kNoTail; - - return (Steinberg::uint32) roundToIntAccurate (tailLengthSeconds * processSetup.sampleRate); - } - - //============================================================================== - void processParameterChanges (Vst::IParameterChanges& paramChanges) - { - jassert (pluginInstance != nullptr); - - const Steinberg::int32 numParamsChanged = paramChanges.getParameterCount(); - - for (Steinberg::int32 i = 0; i < numParamsChanged; ++i) - { - if (Vst::IParamValueQueue* paramQueue = paramChanges.getParameterData (i)) - { - const Steinberg::int32 numPoints = paramQueue->getPointCount(); - - Steinberg::int32 offsetSamples; - double value = 0.0; - - if (paramQueue->getPoint (numPoints - 1, offsetSamples, value) == kResultTrue) - { - const int id = (int) paramQueue->getParameterId(); - jassert (isPositiveAndBelow (id, pluginInstance->getNumParameters())); - pluginInstance->setParameter (id, (float) value); - } - } - } - } - - tresult PLUGIN_API process (Vst::ProcessData& data) override - { - if (pluginInstance == nullptr) - return kResultFalse; - - if (data.processContext != nullptr) - processContext = *data.processContext; - else - zerostruct (processContext); - - midiBuffer.clear(); - - #if JucePlugin_WantsMidiInput - if (data.inputEvents != nullptr) - MidiEventList::toMidiBuffer (midiBuffer, *data.inputEvents); - #endif - - #if JUCE_DEBUG && ! JucePlugin_ProducesMidiOutput - const int numMidiEventsComingIn = midiBuffer.getNumEvents(); - #endif - - const int numInputChans = (data.inputs != nullptr && data.inputs[0].channelBuffers32 != nullptr) ? (int) data.inputs[0].numChannels : 0; - const int numOutputChans = (data.outputs != nullptr && data.outputs[0].channelBuffers32 != nullptr) ? (int) data.outputs[0].numChannels : 0; - - int totalChans = 0; - - while (totalChans < numInputChans) - { - channelList.set (totalChans, data.inputs[0].channelBuffers32[totalChans]); - ++totalChans; - } - - while (totalChans < numOutputChans) - { - channelList.set (totalChans, data.outputs[0].channelBuffers32[totalChans]); - ++totalChans; - } - - AudioSampleBuffer buffer; - - if (totalChans != 0) - buffer.setDataToReferTo (channelList.getRawDataPointer(), totalChans, (int) data.numSamples); - else if (getHostType().isWavelab() - && pluginInstance->getNumInputChannels() + pluginInstance->getNumOutputChannels() > 0) - return kResultFalse; - - { - const ScopedLock sl (pluginInstance->getCallbackLock()); - - pluginInstance->setNonRealtime (data.processMode == Vst::kOffline); - - if (data.inputParameterChanges != nullptr) - processParameterChanges (*data.inputParameterChanges); - - if (pluginInstance->isSuspended()) - buffer.clear(); - else - pluginInstance->processBlock (buffer, midiBuffer); - } - - for (int i = 0; i < numOutputChans; ++i) - FloatVectorOperations::copy (data.outputs[0].channelBuffers32[i], buffer.getReadPointer (i), (int) data.numSamples); - - // clear extra busses.. - if (data.outputs != nullptr) - for (int i = 1; i < data.numOutputs; ++i) - for (int f = 0; f < data.outputs[i].numChannels; ++f) - FloatVectorOperations::clear (data.outputs[i].channelBuffers32[f], (int) data.numSamples); - - #if JucePlugin_ProducesMidiOutput - if (data.outputEvents != nullptr) - MidiEventList::toEventList (*data.outputEvents, midiBuffer); - #elif JUCE_DEBUG - /* This assertion is caused when you've added some events to the - midiMessages array in your processBlock() method, which usually means - that you're trying to send them somewhere. But in this case they're - getting thrown away. - - If your plugin does want to send MIDI messages, you'll need to set - the JucePlugin_ProducesMidiOutput macro to 1 in your - JucePluginCharacteristics.h file. - - If you don't want to produce any MIDI output, then you should clear the - midiMessages array at the end of your processBlock() method, to - indicate that you don't want any of the events to be passed through - to the output. - */ - jassert (midiBuffer.getNumEvents() <= numMidiEventsComingIn); - #endif - - return kResultTrue; - } - -private: - //============================================================================== - Atomic refCount; - - AudioProcessor* pluginInstance; - ComSmartPtr host; - ComSmartPtr comPluginInstance; - ComSmartPtr juceVST3EditController; - - /** - Since VST3 does not provide a way of knowing the buffer size and sample rate at any point, - this object needs to be copied on every call to process() to be up-to-date... - */ - Vst::ProcessContext processContext; - Vst::ProcessSetup processSetup; - - Vst::BusList audioInputs, audioOutputs, eventInputs, eventOutputs; - MidiBuffer midiBuffer; - Array channelList; - - ScopedJuceInitialiser_GUI libraryInitialiser; - - //============================================================================== - void addBusTo (Vst::BusList& busList, Vst::Bus* newBus) - { - busList.append (IPtr (newBus, false)); - } - - void addAudioBusTo (Vst::BusList& busList, const juce::String& name, Vst::SpeakerArrangement arr) - { - addBusTo (busList, new Vst::AudioBus (toString (name), Vst::kMain, Vst::BusInfo::kDefaultActive, arr)); - } - - void addEventBusTo (Vst::BusList& busList, const juce::String& name) - { - addBusTo (busList, new Vst::EventBus (toString (name), 16, Vst::kMain, Vst::BusInfo::kDefaultActive)); - } - - Vst::BusList* getBusListFor (Vst::MediaType type, Vst::BusDirection dir) - { - if (type == Vst::kAudio) return dir == Vst::kInput ? &audioInputs : &audioOutputs; - if (type == Vst::kEvent) return dir == Vst::kInput ? &eventInputs : &eventOutputs; - - return nullptr; - } - - //============================================================================== - enum InternalParameters - { - paramPreset = 'prst' - }; - - static int getNumChannels (Vst::BusList& busList) - { - Vst::BusInfo info; - info.channelCount = 0; - - if (Vst::Bus* bus = busList.first()) - bus->getInfo (info); - - return (int) info.channelCount; - } - - void preparePlugin (double sampleRate, int bufferSize) - { - getPluginInstance().setPlayConfigDetails (getNumChannels (audioInputs), - getNumChannels (audioOutputs), - sampleRate, bufferSize); - - getPluginInstance().prepareToPlay (sampleRate, bufferSize); - } - - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Component) -}; - -#if JucePlugin_Build_VST3 && JUCE_VST3_CAN_REPLACE_VST2 - Steinberg::FUID getJuceVST3ComponentIID(); - Steinberg::FUID getJuceVST3ComponentIID() { return JuceVST3Component::iid; } -#endif - -//============================================================================== -#if JUCE_MSVC - #pragma warning (push, 0) - #pragma warning (disable: 4310) -#elif JUCE_CLANG - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-w" -#endif - -DECLARE_CLASS_IID (JuceAudioProcessor, 0x0101ABAB, 0xABCDEF01, JucePlugin_ManufacturerCode, JucePlugin_PluginCode) -DEF_CLASS_IID (JuceAudioProcessor) - -#if JUCE_VST3_CAN_REPLACE_VST2 - // NB: Nasty old-fashioned code in here because it's copied from the Steinberg example code. - static FUID getFUIDForVST2ID (bool forControllerUID) - { - char uidString[33]; - - const int vstfxid = (('V' << 16) | ('S' << 8) | (forControllerUID ? 'E' : 'T')); - char vstfxidStr[7] = { 0 }; - sprintf (vstfxidStr, "%06X", vstfxid); - strcpy (uidString, vstfxidStr); - - char uidStr[9] = { 0 }; - sprintf (uidStr, "%08X", JucePlugin_VSTUniqueID); - strcat (uidString, uidStr); - - char nameidStr[3] = { 0 }; - const size_t len = strlen (JucePlugin_Name); - - for (size_t i = 0; i <= 8; ++i) - { - juce::uint8 c = i < len ? JucePlugin_Name[i] : 0; - - if (c >= 'A' && c <= 'Z') - c += 'a' - 'A'; - - sprintf (nameidStr, "%02X", c); - strcat (uidString, nameidStr); - } - - FUID newOne; - newOne.fromString (uidString); - return newOne; - } - - const Steinberg::FUID JuceVST3Component ::iid (getFUIDForVST2ID (false)); - const Steinberg::FUID JuceVST3EditController::iid (getFUIDForVST2ID (true)); - -#else - DECLARE_CLASS_IID (JuceVST3EditController, 0xABCDEF01, 0x1234ABCD, JucePlugin_ManufacturerCode, JucePlugin_PluginCode) - DEF_CLASS_IID (JuceVST3EditController) - - DECLARE_CLASS_IID (JuceVST3Component, 0xABCDEF01, 0x9182FAEB, JucePlugin_ManufacturerCode, JucePlugin_PluginCode) - DEF_CLASS_IID (JuceVST3Component) -#endif - -#if JUCE_MSVC - #pragma warning (pop) -#elif JUCE_CLANG - #pragma clang diagnostic pop -#endif - -//============================================================================== -bool initModule() -{ - #if JUCE_MAC - initialiseMac(); - #endif - - return true; -} - -bool shutdownModule() -{ - return true; -} - -#undef JUCE_EXPORTED_FUNCTION - -#if JUCE_WINDOWS - extern "C" __declspec (dllexport) bool InitDll() { return initModule(); } - extern "C" __declspec (dllexport) bool ExitDll() { return shutdownModule(); } - #define JUCE_EXPORTED_FUNCTION - -#else - #define JUCE_EXPORTED_FUNCTION extern "C" __attribute__ ((visibility ("default"))) - - CFBundleRef globalBundleInstance = nullptr; - juce::uint32 numBundleRefs = 0; - juce::Array bundleRefs; - - enum { MaxPathLength = 2048 }; - char modulePath[MaxPathLength] = { 0 }; - void* moduleHandle = nullptr; - - JUCE_EXPORTED_FUNCTION bool bundleEntry (CFBundleRef ref) - { - if (ref != nullptr) - { - ++numBundleRefs; - CFRetain (ref); - - bundleRefs.add (ref); - - if (moduleHandle == nullptr) - { - globalBundleInstance = ref; - moduleHandle = ref; - - CFURLRef tempURL = CFBundleCopyBundleURL (ref); - CFURLGetFileSystemRepresentation (tempURL, true, (UInt8*) modulePath, MaxPathLength); - CFRelease (tempURL); - } - } - - return initModule(); - } - - JUCE_EXPORTED_FUNCTION bool bundleExit() - { - if (shutdownModule()) - { - if (--numBundleRefs == 0) - { - for (int i = 0; i < bundleRefs.size(); ++i) - CFRelease (bundleRefs.getUnchecked (i)); - - bundleRefs.clear(); - } - - return true; - } - - return false; - } -#endif - -//============================================================================== -/** This typedef represents VST3's createInstance() function signature */ -typedef FUnknown* (*CreateFunction) (Vst::IHostApplication*); - -static FUnknown* createComponentInstance (Vst::IHostApplication* host) -{ - return (Vst::IAudioProcessor*) new JuceVST3Component (host); -} - -static FUnknown* createControllerInstance (Vst::IHostApplication* host) -{ - return (Vst::IEditController*) new JuceVST3EditController (host); -} - -//============================================================================== -class JucePluginFactory; -static JucePluginFactory* globalFactory = nullptr; - -//============================================================================== -class JucePluginFactory : public IPluginFactory3 -{ -public: - JucePluginFactory() - : refCount (1), - factoryInfo (JucePlugin_Manufacturer, JucePlugin_ManufacturerWebsite, - JucePlugin_ManufacturerEmail, Vst::kDefaultFactoryFlags) - { - } - - virtual ~JucePluginFactory() - { - if (globalFactory == this) - globalFactory = nullptr; - } - - //============================================================================== - bool registerClass (const PClassInfo2& info, CreateFunction createFunction) - { - if (createFunction == nullptr) - { - jassertfalse; - return false; - } - - ClassEntry* entry = classes.add (new ClassEntry (info, createFunction)); - entry->infoW.fromAscii (info); - - return true; - } - - bool isClassRegistered (const FUID& cid) const - { - for (int i = 0; i < classes.size(); ++i) - if (classes.getUnchecked (i)->infoW.cid == cid) - return true; - - return false; - } - - //============================================================================== - JUCE_DECLARE_VST3_COM_REF_METHODS - - tresult PLUGIN_API queryInterface (const TUID targetIID, void** obj) override - { - TEST_FOR_AND_RETURN_IF_VALID (targetIID, IPluginFactory3) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, IPluginFactory2) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, IPluginFactory) - TEST_FOR_AND_RETURN_IF_VALID (targetIID, FUnknown) - - jassertfalse; // Something new? - *obj = nullptr; - return kNotImplemented; - } - - //============================================================================== - Steinberg::int32 PLUGIN_API countClasses() override - { - return (Steinberg::int32) classes.size(); - } - - tresult PLUGIN_API getFactoryInfo (PFactoryInfo* info) override - { - if (info == nullptr) - return kInvalidArgument; - - memcpy (info, &factoryInfo, sizeof (PFactoryInfo)); - return kResultOk; - } - - tresult PLUGIN_API getClassInfo (Steinberg::int32 index, PClassInfo* info) override - { - return getPClassInfo (index, info); - } - - tresult PLUGIN_API getClassInfo2 (Steinberg::int32 index, PClassInfo2* info) override - { - return getPClassInfo (index, info); - } - - tresult PLUGIN_API getClassInfoUnicode (Steinberg::int32 index, PClassInfoW* info) override - { - if (info != nullptr) - { - if (ClassEntry* entry = classes[(int) index]) - { - memcpy (info, &entry->infoW, sizeof (PClassInfoW)); - return kResultOk; - } - } - - return kInvalidArgument; - } - - tresult PLUGIN_API createInstance (FIDString cid, FIDString sourceIid, void** obj) override - { - *obj = nullptr; - - FUID sourceFuid = sourceIid; - - if (cid == nullptr || sourceIid == nullptr || ! sourceFuid.isValid()) - { - jassertfalse; // The host you're running in has severe implementation issues! - return kInvalidArgument; - } - - TUID iidToQuery; - sourceFuid.toTUID (iidToQuery); - - for (int i = 0; i < classes.size(); ++i) - { - const ClassEntry& entry = *classes.getUnchecked (i); - - if (doUIDsMatch (entry.infoW.cid, cid)) - { - if (FUnknown* const instance = entry.createFunction (host)) - { - const FReleaser releaser (instance); - - if (instance->queryInterface (iidToQuery, obj) == kResultOk) - return kResultOk; - } - - break; - } - } - - return kNoInterface; - } - - tresult PLUGIN_API setHostContext (FUnknown* context) override - { - host.loadFrom (context); - - if (host != nullptr) - { - Vst::String128 name; - host->getName (name); - - return kResultTrue; - } - - return kNotImplemented; - } - -private: - //============================================================================== - ScopedJuceInitialiser_GUI libraryInitialiser; - Atomic refCount; - const PFactoryInfo factoryInfo; - ComSmartPtr host; - - //============================================================================== - struct ClassEntry - { - ClassEntry() noexcept : createFunction (nullptr), isUnicode (false) {} - - ClassEntry (const PClassInfo2& info, CreateFunction fn) noexcept - : info2 (info), createFunction (fn), isUnicode (false) {} - - PClassInfo2 info2; - PClassInfoW infoW; - CreateFunction createFunction; - bool isUnicode; - - private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ClassEntry) - }; - - OwnedArray classes; - - //============================================================================== - template - tresult PLUGIN_API getPClassInfo (Steinberg::int32 index, PClassInfoType* info) - { - if (info != nullptr) - { - zerostruct (*info); - - if (ClassEntry* entry = classes[(int) index]) - { - if (entry->isUnicode) - return kResultFalse; - - memcpy (info, &entry->info2, sizeof (PClassInfoType)); - return kResultOk; - } - } - - jassertfalse; - return kInvalidArgument; - } - - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JucePluginFactory) -}; - -} // juce namespace - -//============================================================================== -#ifndef JucePlugin_Vst3ComponentFlags - #if JucePlugin_IsSynth - #define JucePlugin_Vst3ComponentFlags Vst::kSimpleModeSupported - #else - #define JucePlugin_Vst3ComponentFlags 0 - #endif -#endif - -#ifndef JucePlugin_Vst3Category - #if JucePlugin_IsSynth - #define JucePlugin_Vst3Category Vst::PlugType::kInstrumentSynth - #else - #define JucePlugin_Vst3Category Vst::PlugType::kFx - #endif -#endif - -//============================================================================== -// The VST3 plugin entry point. -JUCE_EXPORTED_FUNCTION IPluginFactory* PLUGIN_API GetPluginFactory() -{ - #if JUCE_WINDOWS - // Cunning trick to force this function to be exported. Life's too short to - // faff around creating .def files for this kind of thing. - #pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__) - #endif - - if (globalFactory == nullptr) - { - globalFactory = new JucePluginFactory(); - - static const PClassInfo2 componentClass (JuceVST3Component::iid, - PClassInfo::kManyInstances, - kVstAudioEffectClass, - JucePlugin_Name, - JucePlugin_Vst3ComponentFlags, - JucePlugin_Vst3Category, - JucePlugin_Manufacturer, - JucePlugin_VersionString, - kVstVersionString); - - globalFactory->registerClass (componentClass, createComponentInstance); - - static const PClassInfo2 controllerClass (JuceVST3EditController::iid, - PClassInfo::kManyInstances, - kVstComponentControllerClass, - JucePlugin_Name, - JucePlugin_Vst3ComponentFlags, - JucePlugin_Vst3Category, - JucePlugin_Manufacturer, - JucePlugin_VersionString, - kVstVersionString); - - globalFactory->registerClass (controllerClass, createControllerInstance); - } - else - { - globalFactory->addRef(); - } - - return dynamic_cast (globalFactory); -} - -#endif //JucePlugin_Build_VST3 diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm b/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm deleted file mode 100755 index 73a0d88..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm +++ /dev/null @@ -1,273 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" -#include "../utility/juce_CheckSettingMacros.h" - -#if JucePlugin_Build_VST3 - -#define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 - -#include "../utility/juce_IncludeSystemHeaders.h" -#include "../utility/juce_IncludeModuleHeaders.h" -#include "../utility/juce_FakeMouseMoveGenerator.h" -#include "../utility/juce_CarbonVisibility.h" - -#undef Component -#undef Point - -//============================================================================== -namespace juce -{ - static void initialiseMac() - { - #if ! JUCE_64BIT - NSApplicationLoad(); - #endif - } - - #if ! JUCE_64BIT - static void updateComponentPos (Component* const comp) - { - DBG ("updateComponentPos()"); - - HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) - comp->getProperties() ["dummyViewRef"].toString().getHexValue64(); - - HIRect r; - HIViewGetFrame (dummyView, &r); - HIViewRef root; - HIViewFindByID (HIViewGetRoot (HIViewGetWindow (dummyView)), kHIViewWindowContentID, &root); - HIViewConvertRect (&r, HIViewGetSuperview (dummyView), root); - - Rect windowPos; - GetWindowBounds (HIViewGetWindow (dummyView), kWindowContentRgn, &windowPos); - - comp->setTopLeftPosition ((int) (windowPos.left + r.origin.x), - (int) (windowPos.top + r.origin.y)); - } - - static pascal OSStatus viewBoundsChangedEvent (EventHandlerCallRef, EventRef, void* user) - { - updateComponentPos ((Component*) user); - return noErr; - } - #endif - - static void* attachComponentToWindowRef (Component* comp, void* windowRef, bool isHIView) - { - DBG ("attachComponentToWindowRef()"); - - JUCE_AUTORELEASEPOOL - { - #if JUCE_64BIT - (void) isHIView; - NSView* parentView = (NSView*) windowRef; - - #if JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (0, parentView); - #else - comp->addToDesktop (ComponentPeer::windowIgnoresKeyPresses, parentView); - #endif - - // (this workaround is because Wavelab provides a zero-size parent view..) - if ([parentView frame].size.height == 0) - [((NSView*) comp->getWindowHandle()) setFrameOrigin: NSZeroPoint]; - - comp->setVisible (true); - comp->toFront (false); - - [[parentView window] setAcceptsMouseMovedEvents: YES]; - return parentView; - - #else - //treat NSView like 64bit - if (! isHIView) - { - NSView* parentView = (NSView*) windowRef; - - #if JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (0, parentView); - #else - comp->addToDesktop (ComponentPeer::windowIgnoresKeyPresses, parentView); - #endif - - // (this workaround is because Wavelab provides a zero-size parent view..) - if ([parentView frame].size.height == 0) - [((NSView*) comp->getWindowHandle()) setFrameOrigin: NSZeroPoint]; - - comp->setVisible (true); - comp->toFront (false); - - [[parentView window] setAcceptsMouseMovedEvents: YES]; - return parentView; - } - - NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: windowRef]; - [hostWindow retain]; - [hostWindow setCanHide: YES]; - [hostWindow setReleasedWhenClosed: YES]; - - HIViewRef parentView = nullptr; - - WindowAttributes attributes; - GetWindowAttributes ((WindowRef) windowRef, &attributes); - - if ((attributes & kWindowCompositingAttribute) != 0) - { - HIViewRef root = HIViewGetRoot ((WindowRef) windowRef); - HIViewFindByID (root, kHIViewWindowContentID, &parentView); - - if (parentView == nullptr) - parentView = root; - } - else - { - GetRootControl ((WindowRef) windowRef, (ControlRef*) &parentView); - - if (parentView == nullptr) - CreateRootControl ((WindowRef) windowRef, (ControlRef*) &parentView); - } - - // It seems that the only way to successfully position our overlaid window is by putting a dummy - // HIView into the host's carbon window, and then catching events to see when it gets repositioned - HIViewRef dummyView = 0; - HIImageViewCreate (0, &dummyView); - HIRect r = { {0, 0}, { (float) comp->getWidth(), (float) comp->getHeight()} }; - HIViewSetFrame (dummyView, &r); - HIViewAddSubview (parentView, dummyView); - comp->getProperties().set ("dummyViewRef", String::toHexString ((pointer_sized_int) (void*) dummyView)); - - EventHandlerRef ref; - const EventTypeSpec kControlBoundsChangedEvent = { kEventClassControl, kEventControlBoundsChanged }; - InstallEventHandler (GetControlEventTarget (dummyView), NewEventHandlerUPP (viewBoundsChangedEvent), 1, &kControlBoundsChangedEvent, (void*) comp, &ref); - comp->getProperties().set ("boundsEventRef", String::toHexString ((pointer_sized_int) (void*) ref)); - - updateComponentPos (comp); - - #if ! JucePlugin_EditorRequiresKeyboardFocus - comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); - #else - comp->addToDesktop (ComponentPeer::windowIsTemporary); - #endif - - comp->setVisible (true); - comp->toFront (false); - - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - [pluginWindow setExcludedFromWindowsMenu: YES]; - [pluginWindow setCanHide: YES]; - - [hostWindow addChildWindow: pluginWindow - ordered: NSWindowAbove]; - [hostWindow orderFront: nil]; - [pluginWindow orderFront: nil]; - - attachWindowHidingHooks (comp, (WindowRef) windowRef, hostWindow); - - return hostWindow; - #endif - } - } - - static void detachComponentFromWindowRef (Component* comp, void* nsWindow, bool isHIView) - { - JUCE_AUTORELEASEPOOL - { - #if ! JUCE_64BIT - if (isHIView) - { - JUCE_AUTORELEASEPOOL - { - EventHandlerRef ref = (EventHandlerRef) (void*) (pointer_sized_int) - comp->getProperties() ["boundsEventRef"].toString().getHexValue64(); - RemoveEventHandler (ref); - - removeWindowHidingHooks (comp); - - HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) - comp->getProperties() ["dummyViewRef"].toString().getHexValue64(); - - if (HIViewIsValid (dummyView)) - CFRelease (dummyView); - - NSWindow* hostWindow = (NSWindow*) nsWindow; - NSView* pluginView = (NSView*) comp->getWindowHandle(); - NSWindow* pluginWindow = [pluginView window]; - - [hostWindow removeChildWindow: pluginWindow]; - comp->removeFromDesktop(); - - [hostWindow release]; - } - - // The event loop needs to be run between closing the window and deleting the plugin, - // presumably to let the cocoa objects get tidied up. Leaving out this line causes crashes - // in Live and Reaper when you delete the plugin with its window open. - // (Doing it this way rather than using a single longer timout means that we can guarantee - // how many messages will be dispatched, which seems to be vital in Reaper) - for (int i = 20; --i >= 0;) - MessageManager::getInstance()->runDispatchLoopUntil (1); - - return; - } - #endif - - (void) nsWindow; (void) isHIView; - comp->removeFromDesktop(); - } - } - - static void setNativeHostWindowSize (void* nsWindow, Component* component, int newWidth, int newHeight, bool isHIView) - { - JUCE_AUTORELEASEPOOL - { - #if ! JUCE_64BIT - if (isHIView) - { - if (HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) - component->getProperties() ["dummyViewRef"].toString().getHexValue64()) - { - HIRect frameRect; - HIViewGetFrame (dummyView, &frameRect); - frameRect.size.width = newWidth; - frameRect.size.height = newHeight; - HIViewSetFrame (dummyView, &frameRect); - } - - return; - } - #endif - - (void) nsWindow; (void) isHIView; - component->setSize (newWidth, newHeight); - } - } -} // (juce namespace) - - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h b/JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h deleted file mode 100755 index 974479c..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/juce_audio_plugin_client.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIO_PLUGIN_CLIENT_H_INCLUDED -#define JUCE_AUDIO_PLUGIN_CLIENT_H_INCLUDED - -#include "../juce_gui_basics/juce_gui_basics.h" -#include "../juce_audio_basics/juce_audio_basics.h" -#include "../juce_audio_processors/juce_audio_processors.h" -#include "utility/juce_CheckSettingMacros.h" - -namespace juce -{ - #include "utility/juce_PluginHostType.h" -} - -#endif // JUCE_AUDIO_PLUGIN_CLIENT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/juce_module_info b/JuceLibraryCode/modules/juce_audio_plugin_client/juce_module_info deleted file mode 100755 index 8b70756..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/juce_module_info +++ /dev/null @@ -1,45 +0,0 @@ -{ - "id": "juce_audio_plugin_client", - "name": "JUCE audio plugin wrapper classes", - "version": "3.1.1", - "description": "Classes for building VST, VST3, RTAS, AAX and AU plugins.", - "website": "http://www.juce.com/juce", - "license": "GPL/Commercial", - - "dependencies": [ { "id": "juce_gui_basics", "version": "matching" }, - { "id": "juce_audio_basics", "version": "matching" }, - { "id": "juce_audio_processors", "version": "matching" } ], - - "include": "juce_audio_plugin_client.h", - - "compile": [ { "file": "VST/juce_VST_Wrapper.cpp" }, - { "file": "VST/juce_VST_Wrapper.mm", "target": "xcode" }, - { "file": "VST3/juce_VST3_Wrapper.cpp" }, - { "file": "VST3/juce_VST3_Wrapper.mm", "target": "xcode" }, - { "file": "RTAS/juce_RTAS_DigiCode1.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, - { "file": "RTAS/juce_RTAS_DigiCode2.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, - { "file": "RTAS/juce_RTAS_DigiCode3.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, - { "file": "RTAS/juce_RTAS_MacResources.r", "target": "xcode", "RTASOnly": "1" }, - { "file": "RTAS/juce_RTAS_MacUtilities.mm", "target": "xcode" }, - { "file": "RTAS/juce_RTAS_WinResources.rsr", "target": "msvc" }, - { "file": "RTAS/juce_RTAS_WinUtilities.cpp", "target": "msvc", "warnings": "disabled", "stdcall": "1" }, - { "file": "RTAS/juce_RTAS_Wrapper.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, - { "file": "AU/juce_AU_Resources.r", "target": "xcode", "AudioUnitOnly": "1" }, - { "file": "AU/juce_AU_Wrapper.mm", "target": "xcode" }, - { "file": "AAX/juce_AAX_Wrapper.cpp", "target": "xcode, msvc" }, - { "file": "AAX/juce_AAX_Wrapper.mm", "target": "xcode" }, - { "file": "utility/juce_PluginUtilities.cpp" } - ], - - "browse": [ "AU/*.cpp", - "AU/*.mm", - "AU/*.h", - "RTAS/*.cpp", - "RTAS/*.mm", - "RTAS/*.h", - "VST/*", - "VST3/*", - "AAX/*", - "utility/*" - ] -} diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h deleted file mode 100755 index 50eccd7..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CarbonVisibility.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_CARBONVISIBILITY_H_INCLUDED -#define JUCE_CARBONVISIBILITY_H_INCLUDED - -//============================================================================== -#if JUCE_SUPPORT_CARBON && JUCE_MAC_WINDOW_VISIBITY_BODGE - -/* When you wrap a WindowRef as an NSWindow, it seems to bugger up the HideWindow - function, so when the host tries (and fails) to hide the window, this stuff catches - the event and forces it to update. -*/ -static pascal OSStatus windowVisibilityBodge (EventHandlerCallRef, EventRef e, void* user) -{ - NSWindow* hostWindow = (NSWindow*) user; - - switch (GetEventKind (e)) - { - case kEventWindowInit: [hostWindow display]; break; - case kEventWindowShown: [hostWindow orderFront: nil]; break; - case kEventWindowHidden: [hostWindow orderOut: nil]; break; - } - - return eventNotHandledErr; -} - -inline void attachWindowHidingHooks (Component* comp, void* hostWindowRef, NSWindow* nsWindow) -{ - const EventTypeSpec eventsToCatch[] = - { - { kEventClassWindow, kEventWindowInit }, - { kEventClassWindow, kEventWindowShown }, - { kEventClassWindow, kEventWindowHidden } - }; - - EventHandlerRef ref; - InstallWindowEventHandler ((WindowRef) hostWindowRef, - NewEventHandlerUPP (windowVisibilityBodge), - GetEventTypeCount (eventsToCatch), eventsToCatch, - (void*) nsWindow, &ref); - - comp->getProperties().set ("carbonEventRef", String::toHexString ((pointer_sized_int) (void*) ref)); -} - -inline void removeWindowHidingHooks (Component* comp) -{ - if (comp != nullptr) - RemoveEventHandler ((EventHandlerRef) (void*) (pointer_sized_int) - comp->getProperties() ["carbonEventRef"].toString().getHexValue64()); -} - -#elif JUCE_MAC - inline void attachWindowHidingHooks (void*, void*, void*) {} - inline void removeWindowHidingHooks (void*) {} -#endif - -#endif // JUCE_CARBONVISIBILITY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h deleted file mode 100755 index b3f51b5..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// The following checks should cause a compile error if you've forgotten to -// define all your plugin settings properly.. - -#if ! (JucePlugin_Build_VST || JucePlugin_Build_VST3 \ - || JucePlugin_Build_AU || JucePlugin_Build_RTAS || JucePlugin_Build_AAX \ - || JucePlugin_Build_Standalone || JucePlugin_Build_LV2) - #error "You need to enable at least one plugin format!" -#endif - -#ifndef JucePlugin_IsSynth - #error "You need to define the JucePlugin_IsSynth value!" -#endif - -#ifndef JucePlugin_ManufacturerCode - #error "You need to define the JucePlugin_ManufacturerCode value!" -#endif - -#ifndef JucePlugin_PluginCode - #error "You need to define the JucePlugin_PluginCode value!" -#endif - -#ifndef JucePlugin_ProducesMidiOutput - #error "You need to define the JucePlugin_ProducesMidiOutput value!" -#endif - -#ifndef JucePlugin_WantsMidiInput - #error "You need to define the JucePlugin_WantsMidiInput value!" -#endif - -#ifndef JucePlugin_MaxNumInputChannels - #error "You need to define the JucePlugin_MaxNumInputChannels value!" -#endif - -#ifndef JucePlugin_MaxNumOutputChannels - #error "You need to define the JucePlugin_MaxNumOutputChannels value!" -#endif - -#ifndef JucePlugin_PreferredChannelConfigurations - #error "You need to define the JucePlugin_PreferredChannelConfigurations value!" -#endif - -#ifdef JucePlugin_Latency - #error "JucePlugin_Latency is now deprecated - instead, call the AudioProcessor::setLatencySamples() method if your plugin has a non-zero delay" -#endif - -#ifndef JucePlugin_SilenceInProducesSilenceOut - #error "You need to define the JucePlugin_SilenceInProducesSilenceOut value!" -#endif - -#ifndef JucePlugin_EditorRequiresKeyboardFocus - #error "You need to define the JucePlugin_EditorRequiresKeyboardFocus value!" -#endif - -//============================================================================== -#if _WIN64 || (__LP64__ && (defined (__APPLE_CPP__) || defined (__APPLE_CC__))) - #undef JucePlugin_Build_RTAS - #define JucePlugin_Build_RTAS 0 -#endif - -#if ! (defined (_MSC_VER) || defined (__APPLE_CPP__) || defined (__APPLE_CC__)) - #undef JucePlugin_Build_VST3 - #define JucePlugin_Build_VST3 0 -#endif - -//============================================================================== -#if JucePlugin_Build_RTAS && _MSC_VER && ! defined (JucePlugin_WinBag_path) - #error "You need to define the JucePlugin_WinBag_path value!" -#endif - -#if JucePlugin_Build_LV2 && ! defined (JucePlugin_LV2URI) - #error "You need to define the JucePlugin_LV2URI value!" -#endif - -#if JucePlugin_Build_AAX && ! defined (JucePlugin_AAXIdentifier) - #error "You need to define the JucePlugin_AAXIdentifier value!" -#endif - -#if defined (__ppc__) - #undef JucePlugin_Build_AAX - #define JucePlugin_Build_AAX 0 -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h deleted file mode 100755 index e00cb23..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_FakeMouseMoveGenerator.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_FAKEMOUSEMOVEGENERATOR_H_INCLUDED -#define JUCE_FAKEMOUSEMOVEGENERATOR_H_INCLUDED - -#if JUCE_MAC && JUCE_SUPPORT_CARBON - -//============================================================================== -// Helper class to workaround carbon windows not getting mouse-moves.. -class FakeMouseMoveGenerator : private Timer -{ -public: - FakeMouseMoveGenerator() - { - startTimer (1000 / 30); - } - - void timerCallback() override - { - // workaround for carbon windows not getting mouse-moves.. - const Point screenPos (Desktop::getInstance().getMainMouseSource().getScreenPosition()); - - if (screenPos != lastScreenPos) - { - lastScreenPos = screenPos; - const ModifierKeys mods (ModifierKeys::getCurrentModifiers()); - - if (! mods.isAnyMouseButtonDown()) - if (Component* const comp = Desktop::getInstance().findComponentAt (screenPos.roundToInt())) - if (ComponentPeer* const peer = comp->getPeer()) - if (! peer->isFocused()) - peer->handleMouseEvent (0, peer->globalToLocal (screenPos), mods, Time::currentTimeMillis()); - } - } - -private: - Point lastScreenPos; -}; - -#else -struct FakeMouseMoveGenerator {}; -#endif - -#endif // JUCE_FAKEMOUSEMOVEGENERATOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h deleted file mode 100755 index 32d06d7..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeModuleHeaders.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#include "../juce_audio_plugin_client.h" - -using namespace juce; - -namespace juce -{ - #if JUCE_MAC && ! DOXYGEN - #define Point juce::Point - #define Component juce::Component - - void repostCurrentNSEvent(); - #endif - - //============================================================================== - inline const PluginHostType& getHostType() - { - static PluginHostType hostType; - return hostType; - } -} - -extern AudioProcessor* JUCE_CALLTYPE createPluginFilterOfType (AudioProcessor::WrapperType); diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h deleted file mode 100755 index 8f76b14..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_IncludeSystemHeaders.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_WINDOWS - #undef _WIN32_WINNT - #define _WIN32_WINNT 0x500 - #undef STRICT - #define STRICT 1 - #include - #include - #pragma warning (disable : 4312 4355) - #ifdef __INTEL_COMPILER - #pragma warning (disable : 1899) - #endif - -#elif JUCE_LINUX - #include - #include - #include - #include - #include - #undef Font - #undef KeyPress - #undef Drawable - #undef Time - -#else - #if ! (defined (JUCE_SUPPORT_CARBON) || defined (__LP64__)) - #define JUCE_SUPPORT_CARBON 1 - #endif - - #if JUCE_SUPPORT_CARBON - #define Point CarbonDummyPointName - #define Component CarbonDummyCompName - #include - #include - #undef Point - #undef Component - #else - #include - #endif - #include - #include - #include -#endif diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h deleted file mode 100755 index e304c1e..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginHostType.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -//============================================================================== -class PluginHostType -{ -public: - //============================================================================== - PluginHostType() : type (getHostType()) {} - PluginHostType (const PluginHostType& other) noexcept : type (other.type) {} - PluginHostType& operator= (const PluginHostType& other) noexcept { type = other.type; return *this; } - - //============================================================================== - enum HostType - { - UnknownHost, - AbletonLive6, - AbletonLive7, - AbletonLive8, - AbletonLiveGeneric, - AdobeAudition, - AdobePremierePro, - AppleLogic, - Ardour, - CakewalkSonar8, - CakewalkSonarGeneric, - DigidesignProTools, - DigitalPerformer, - FruityLoops, - MagixSamplitude, - MergingPyramix, - MuseReceptorGeneric, - Reaper, - SteinbergCubase4, - SteinbergCubase5, - SteinbergCubase5Bridged, - SteinbergCubase6, - SteinbergCubase7, - SteinbergCubaseGeneric, - SteinbergNuendo3, - SteinbergNuendo4, - SteinbergNuendo5, - SteinbergNuendoGeneric, - SteinbergWavelab5, - SteinbergWavelab6, - SteinbergWavelab7, - SteinbergWavelab8, - SteinbergWavelabGeneric, - SteinbergTestHost, - StudioOne, - Tracktion3, - TracktionGeneric, - WaveBurner, - VBVSTScanner - }; - - HostType type; - - //============================================================================== - bool isAbletonLive() const noexcept { return type == AbletonLive6 || type == AbletonLive7 || type == AbletonLive8 || type == AbletonLiveGeneric; } - bool isAdobeAudition() const noexcept { return type == AdobeAudition; } - bool isArdour() const noexcept { return type == Ardour; } - bool isDigitalPerformer() const noexcept { return type == DigitalPerformer; } - bool isCubase() const noexcept { return type == SteinbergCubase4 || type == SteinbergCubase5 || type == SteinbergCubase5Bridged || type == SteinbergCubase6 || type == SteinbergCubase7 || type == SteinbergCubaseGeneric; } - bool isCubaseBridged() const noexcept { return type == SteinbergCubase5Bridged; } - bool isLogic() const noexcept { return type == AppleLogic; } - bool isFruityLoops() const noexcept { return type == FruityLoops; } - bool isNuendo() const noexcept { return type == SteinbergNuendo3 || type == SteinbergNuendo4 || type == SteinbergNuendo5 || type == SteinbergNuendoGeneric; } - bool isPremiere() const noexcept { return type == AdobePremierePro; } - bool isPyramix() const noexcept { return type == MergingPyramix; } - bool isReceptor() const noexcept { return type == MuseReceptorGeneric; } - bool isReaper() const noexcept { return type == Reaper; } - bool isSamplitude() const noexcept { return type == MagixSamplitude; } - bool isSonar() const noexcept { return type == CakewalkSonar8 || type == CakewalkSonarGeneric; } - bool isSteinbergTestHost() const noexcept{ return type == SteinbergTestHost; } - bool isSteinberg() const noexcept { return isCubase() || isNuendo() || isWavelab() || isSteinbergTestHost(); } - bool isStudioOne() const noexcept { return type == StudioOne; } - bool isTracktion() const noexcept { return type == Tracktion3 || type == TracktionGeneric; } - bool isVBVSTScanner() const noexcept { return type == VBVSTScanner; } - bool isWaveBurner() const noexcept { return type == WaveBurner; } - bool isWavelab() const noexcept { return isWavelabLegacy() || type == SteinbergWavelab7 || type == SteinbergWavelab8 || type == SteinbergWavelabGeneric; } - bool isWavelabLegacy() const noexcept { return type == SteinbergWavelab5 || type == SteinbergWavelab6; } - - //============================================================================== - const char* getHostDescription() const noexcept - { - switch (type) - { - case AbletonLive6: return "Ableton Live 6"; - case AbletonLive7: return "Ableton Live 7"; - case AbletonLive8: return "Ableton Live 8"; - case AbletonLiveGeneric: return "Ableton Live"; - case AdobeAudition: return "Adobe Audition"; - case AdobePremierePro: return "Adobe Premiere"; - case AppleLogic: return "Apple Logic"; - case CakewalkSonar8: return "Cakewalk Sonar 8"; - case CakewalkSonarGeneric: return "Cakewalk Sonar"; - case DigidesignProTools: return "ProTools"; - case DigitalPerformer: return "DigitalPerformer"; - case FruityLoops: return "FruityLoops"; - case MagixSamplitude: return "Magix Samplitude"; - case MergingPyramix: return "Pyramix"; - case MuseReceptorGeneric: return "Muse Receptor"; - case Reaper: return "Reaper"; - case SteinbergCubase4: return "Steinberg Cubase 4"; - case SteinbergCubase5: return "Steinberg Cubase 5"; - case SteinbergCubase5Bridged: return "Steinberg Cubase 5 Bridged"; - case SteinbergCubase6: return "Steinberg Cubase 6"; - case SteinbergCubase7: return "Steinberg Cubase 7"; - case SteinbergCubaseGeneric: return "Steinberg Cubase"; - case SteinbergNuendo3: return "Steinberg Nuendo 3"; - case SteinbergNuendo4: return "Steinberg Nuendo 4"; - case SteinbergNuendo5: return "Steinberg Nuendo 5"; - case SteinbergNuendoGeneric: return "Steinberg Nuendo"; - case SteinbergWavelab5: return "Steinberg Wavelab 5"; - case SteinbergWavelab6: return "Steinberg Wavelab 6"; - case SteinbergWavelab7: return "Steinberg Wavelab 7"; - case SteinbergWavelab8: return "Steinberg Wavelab 8"; - case SteinbergWavelabGeneric: return "Steinberg Wavelab"; - case SteinbergTestHost: return "Steinberg TestHost"; - case StudioOne: return "Studio One"; - case Tracktion3: return "Tracktion 3"; - case TracktionGeneric: return "Tracktion"; - case VBVSTScanner: return "VBVSTScanner"; - case WaveBurner: return "WaveBurner"; - default: break; - } - - return "Unknown"; - } - - //============================================================================== - static String getHostPath() - { - return File::getSpecialLocation (File::hostApplicationPath).getFullPathName(); - } - - //============================================================================== -private: - static HostType getHostType() - { - const String hostPath (getHostPath()); - const String hostFilename (File (hostPath).getFileName()); - - #if JUCE_MAC - if (hostPath.containsIgnoreCase ("Live 6.")) return AbletonLive6; - if (hostPath.containsIgnoreCase ("Live 7.")) return AbletonLive7; - if (hostPath.containsIgnoreCase ("Live 8.")) return AbletonLive8; - if (hostFilename.containsIgnoreCase ("Live")) return AbletonLiveGeneric; - if (hostFilename.containsIgnoreCase ("Adobe Premiere")) return AdobePremierePro; - if (hostFilename.contains ("Logic")) return AppleLogic; - if (hostFilename.containsIgnoreCase ("Pro Tools")) return DigidesignProTools; - if (hostFilename.containsIgnoreCase ("Nuendo 3")) return SteinbergNuendo3; - if (hostFilename.containsIgnoreCase ("Nuendo 4")) return SteinbergNuendo4; - if (hostFilename.containsIgnoreCase ("Nuendo 5")) return SteinbergNuendo5; - if (hostFilename.containsIgnoreCase ("Nuendo")) return SteinbergNuendoGeneric; - if (hostFilename.containsIgnoreCase ("Cubase 4")) return SteinbergCubase4; - if (hostFilename.containsIgnoreCase ("Cubase 5")) return SteinbergCubase5; - if (hostFilename.containsIgnoreCase ("Cubase 6")) return SteinbergCubase6; - if (hostFilename.containsIgnoreCase ("Cubase 7")) return SteinbergCubase7; - if (hostFilename.containsIgnoreCase ("Cubase")) return SteinbergCubaseGeneric; - if (hostPath.containsIgnoreCase ("Wavelab 7")) return SteinbergWavelab7; - if (hostPath.containsIgnoreCase ("Wavelab 8")) return SteinbergWavelab8; - if (hostFilename.containsIgnoreCase ("Wavelab")) return SteinbergWavelabGeneric; - if (hostFilename.containsIgnoreCase ("WaveBurner")) return WaveBurner; - if (hostFilename.contains ("Digital Performer")) return DigitalPerformer; - if (hostFilename.containsIgnoreCase ("reaper")) return Reaper; - if (hostPath.containsIgnoreCase ("Studio One")) return StudioOne; - if (hostPath.containsIgnoreCase ("Tracktion 3")) return Tracktion3; - if (hostFilename.containsIgnoreCase ("Tracktion")) return TracktionGeneric; - - #elif JUCE_WINDOWS - if (hostFilename.containsIgnoreCase ("Live 6.")) return AbletonLive6; - if (hostFilename.containsIgnoreCase ("Live 7.")) return AbletonLive7; - if (hostFilename.containsIgnoreCase ("Live 8.")) return AbletonLive8; - if (hostFilename.containsIgnoreCase ("Live ")) return AbletonLiveGeneric; - if (hostFilename.containsIgnoreCase ("Audition")) return AdobeAudition; - if (hostFilename.containsIgnoreCase ("Adobe Premiere")) return AdobePremierePro; - if (hostFilename.containsIgnoreCase ("ProTools")) return DigidesignProTools; - if (hostPath.containsIgnoreCase ("SONAR 8")) return CakewalkSonar8; - if (hostFilename.containsIgnoreCase ("SONAR")) return CakewalkSonarGeneric; - if (hostFilename.containsIgnoreCase ("Logic")) return AppleLogic; - if (hostPath.containsIgnoreCase ("Tracktion 3")) return Tracktion3; - if (hostFilename.containsIgnoreCase ("Tracktion")) return TracktionGeneric; - if (hostFilename.containsIgnoreCase ("reaper")) return Reaper; - if (hostFilename.containsIgnoreCase ("Cubase4")) return SteinbergCubase4; - if (hostFilename.containsIgnoreCase ("Cubase5")) return SteinbergCubase5; - if (hostFilename.containsIgnoreCase ("Cubase6")) return SteinbergCubase6; - if (hostFilename.containsIgnoreCase ("Cubase7")) return SteinbergCubase7; - if (hostFilename.containsIgnoreCase ("Cubase")) return SteinbergCubaseGeneric; - if (hostFilename.containsIgnoreCase ("VSTBridgeApp")) return SteinbergCubase5Bridged; - if (hostPath.containsIgnoreCase ("Wavelab 5")) return SteinbergWavelab5; - if (hostPath.containsIgnoreCase ("Wavelab 6")) return SteinbergWavelab6; - if (hostPath.containsIgnoreCase ("Wavelab 7")) return SteinbergWavelab7; - if (hostPath.containsIgnoreCase ("Wavelab 8")) return SteinbergWavelab8; - if (hostPath.containsIgnoreCase ("Nuendo")) return SteinbergNuendoGeneric; - if (hostFilename.containsIgnoreCase ("Wavelab")) return SteinbergWavelabGeneric; - if (hostFilename.containsIgnoreCase ("TestHost")) return SteinbergTestHost; - if (hostFilename.containsIgnoreCase ("rm-host")) return MuseReceptorGeneric; - if (hostFilename.startsWith ("FL")) return FruityLoops; - if (hostFilename.contains ("ilbridge.")) return FruityLoops; - if (hostPath.containsIgnoreCase ("Studio One")) return StudioOne; - if (hostPath.containsIgnoreCase ("Digital Performer")) return DigitalPerformer; - if (hostFilename.containsIgnoreCase ("VST_Scanner")) return VBVSTScanner; - if (hostPath.containsIgnoreCase ("Merging Technologies")) return MergingPyramix; - if (hostFilename.startsWithIgnoreCase ("Sam")) return MagixSamplitude; - - #elif JUCE_LINUX - if (hostFilename.containsIgnoreCase ("Ardour")) return Ardour; - - #else - #error - #endif - return UnknownHost; - } -}; diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp deleted file mode 100755 index 1e87c49..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_PluginUtilities.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if _MSC_VER || defined (__MINGW32__) || defined (__MINGW64__) - #include -#endif - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../utility/juce_CheckSettingMacros.h" -#include "juce_IncludeModuleHeaders.h" - -#if _MSC_VER || JUCE_MINGW - -#if JucePlugin_Build_RTAS - extern "C" BOOL WINAPI DllMainRTAS (HINSTANCE, DWORD, LPVOID); -#endif - -extern "C" BOOL WINAPI DllMain (HINSTANCE instance, DWORD reason, LPVOID reserved) -{ - if (reason == DLL_PROCESS_ATTACH) - Process::setCurrentModuleInstanceHandle (instance); - - #if JucePlugin_Build_RTAS - if (GetModuleHandleA ("DAE.DLL") != 0) - { - #if JucePlugin_Build_AAX - if (! File::getSpecialLocation (File::currentExecutableFile).hasFileExtension ("aaxplugin")) - #endif - return DllMainRTAS (instance, reason, reserved); - } - #endif - - (void) reserved; - return TRUE; -} - -#endif - -//============================================================================== -/** Somewhere in the codebase of your plugin, you need to implement this function - and make it return a new instance of the filter subclass that you're building. -*/ -extern AudioProcessor* JUCE_CALLTYPE createPluginFilter(); - -AudioProcessor* JUCE_CALLTYPE createPluginFilterOfType (AudioProcessor::WrapperType type) -{ - AudioProcessor::setTypeOfNextNewPlugin (type); - AudioProcessor* const pluginInstance = createPluginFilter(); - AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::wrapperType_Undefined); - - // your createPluginFilter() method must return an object! - jassert (pluginInstance != nullptr && pluginInstance->wrapperType == type); - - return pluginInstance; -} diff --git a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h b/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h deleted file mode 100755 index a5cde30..0000000 --- a/JuceLibraryCode/modules/juce_audio_plugin_client/utility/juce_WindowsHooks.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_WINDOWS - -namespace juce -{ - // This function is in juce_win32_Windowing.cpp - extern bool offerKeyMessageToJUCEWindow (MSG&); -} - -namespace -{ - static HHOOK mouseWheelHook = 0, keyboardHook = 0; - static int numHookUsers = 0; - - struct WindowsHooks - { - WindowsHooks() - { - if (numHookUsers++ == 0) - { - mouseWheelHook = SetWindowsHookEx (WH_MOUSE, mouseWheelHookCallback, - (HINSTANCE) Process::getCurrentModuleInstanceHandle(), - GetCurrentThreadId()); - - keyboardHook = SetWindowsHookEx (WH_GETMESSAGE, keyboardHookCallback, - (HINSTANCE) Process::getCurrentModuleInstanceHandle(), - GetCurrentThreadId()); - } - } - - ~WindowsHooks() - { - if (--numHookUsers == 0) - { - if (mouseWheelHook != 0) - { - UnhookWindowsHookEx (mouseWheelHook); - mouseWheelHook = 0; - } - - if (keyboardHook != 0) - { - UnhookWindowsHookEx (keyboardHook); - keyboardHook = 0; - } - } - } - - static LRESULT CALLBACK mouseWheelHookCallback (int nCode, WPARAM wParam, LPARAM lParam) - { - if (nCode >= 0 && wParam == WM_MOUSEWHEEL) - { - // using a local copy of this struct to support old mingw libraries - struct MOUSEHOOKSTRUCTEX_ : public MOUSEHOOKSTRUCT { DWORD mouseData; }; - - const MOUSEHOOKSTRUCTEX_& hs = *(MOUSEHOOKSTRUCTEX_*) lParam; - - if (Component* const comp = Desktop::getInstance().findComponentAt (Point (hs.pt.x, hs.pt.y))) - if (comp->getWindowHandle() != 0) - return PostMessage ((HWND) comp->getWindowHandle(), WM_MOUSEWHEEL, - hs.mouseData & 0xffff0000, (hs.pt.x & 0xffff) | (hs.pt.y << 16)); - } - - return CallNextHookEx (mouseWheelHook, nCode, wParam, lParam); - } - - static LRESULT CALLBACK keyboardHookCallback (int nCode, WPARAM wParam, LPARAM lParam) - { - MSG& msg = *(MSG*) lParam; - - if (nCode == HC_ACTION && wParam == PM_REMOVE - && offerKeyMessageToJUCEWindow (msg)) - { - zerostruct (msg); - msg.message = WM_USER; - return 1; - } - - return CallNextHookEx (keyboardHook, nCode, wParam, lParam); - } - }; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp deleted file mode 100755 index cbd2542..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioPluginFormat::AudioPluginFormat() noexcept {} -AudioPluginFormat::~AudioPluginFormat() {} diff --git a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h deleted file mode 100755 index d0af201..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormat.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOPLUGINFORMAT_H_INCLUDED -#define JUCE_AUDIOPLUGINFORMAT_H_INCLUDED - - -//============================================================================== -/** - The base class for a type of plugin format, such as VST, AudioUnit, LADSPA, etc. - - @see AudioFormatManager -*/ -class JUCE_API AudioPluginFormat -{ -public: - //============================================================================== - /** Destructor. */ - virtual ~AudioPluginFormat(); - - //============================================================================== - /** Returns the format name. - E.g. "VST", "AudioUnit", etc. - */ - virtual String getName() const = 0; - - /** This tries to create descriptions for all the plugin types available in - a binary module file. - - The file will be some kind of DLL or bundle. - - Normally there will only be one type returned, but some plugins - (e.g. VST shells) can use a single DLL to create a set of different plugin - subtypes, so in that case, each subtype is returned as a separate object. - */ - virtual void findAllTypesForFile (OwnedArray& results, - const String& fileOrIdentifier) = 0; - - /** Tries to recreate a type from a previously generated PluginDescription. - @see PluginDescription::createInstance - */ - virtual AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc, - double initialSampleRate, - int initialBufferSize) = 0; - - /** Should do a quick check to see if this file or directory might be a plugin of - this format. - - This is for searching for potential files, so it shouldn't actually try to - load the plugin or do anything time-consuming. - */ - virtual bool fileMightContainThisPluginType (const String& fileOrIdentifier) = 0; - - /** Returns a readable version of the name of the plugin that this identifier refers to. */ - virtual String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) = 0; - - /** Returns true if this plugin's version or date has changed and it should be re-checked. */ - virtual bool pluginNeedsRescanning (const PluginDescription&) = 0; - - /** Checks whether this plugin could possibly be loaded. - It doesn't actually need to load it, just to check whether the file or component - still exists. - */ - virtual bool doesPluginStillExist (const PluginDescription& desc) = 0; - - /** Returns true if this format needs to run a scan to find its list of plugins. */ - virtual bool canScanForPlugins() const = 0; - - /** Searches a suggested set of directories for any plugins in this format. - The path might be ignored, e.g. by AUs, which are found by the OS rather - than manually. - */ - virtual StringArray searchPathsForPlugins (const FileSearchPath& directoriesToSearch, - bool recursive) = 0; - - /** Returns the typical places to look for this kind of plugin. - - Note that if this returns no paths, it means that the format doesn't search in - files or folders, e.g. AudioUnits. - */ - virtual FileSearchPath getDefaultLocationsToSearch() = 0; - -protected: - //============================================================================== - AudioPluginFormat() noexcept; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioPluginFormat) -}; - - -#endif // JUCE_AUDIOPLUGINFORMAT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp deleted file mode 100755 index 0afa7c7..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioPluginFormatManager::AudioPluginFormatManager() {} -AudioPluginFormatManager::~AudioPluginFormatManager() {} - -//============================================================================== -void AudioPluginFormatManager::addDefaultFormats() -{ - #if JUCE_DEBUG - // you should only call this method once! - for (int i = formats.size(); --i >= 0;) - { - #if JUCE_PLUGINHOST_VST - jassert (dynamic_cast (formats[i]) == nullptr); - #endif - - #if JUCE_PLUGINHOST_VST3 - jassert (dynamic_cast (formats[i]) == nullptr); - #endif - - #if JUCE_PLUGINHOST_AU && JUCE_MAC - jassert (dynamic_cast (formats[i]) == nullptr); - #endif - - #if JUCE_PLUGINHOST_LADSPA && JUCE_LINUX - jassert (dynamic_cast (formats[i]) == nullptr); - #endif - } - #endif - - #if JUCE_PLUGINHOST_AU && JUCE_MAC - formats.add (new AudioUnitPluginFormat()); - #endif - - #if JUCE_PLUGINHOST_VST - formats.add (new VSTPluginFormat()); - #endif - - #if JUCE_PLUGINHOST_VST3 - formats.add (new VST3PluginFormat()); - #endif - - #if JUCE_PLUGINHOST_LADSPA && JUCE_LINUX - formats.add (new LADSPAPluginFormat()); - #endif -} - -int AudioPluginFormatManager::getNumFormats() -{ - return formats.size(); -} - -AudioPluginFormat* AudioPluginFormatManager::getFormat (const int index) -{ - return formats [index]; -} - -void AudioPluginFormatManager::addFormat (AudioPluginFormat* const format) -{ - formats.add (format); -} - -AudioPluginInstance* AudioPluginFormatManager::createPluginInstance (const PluginDescription& description, double rate, - int blockSize, String& errorMessage) const -{ - for (int i = 0; i < formats.size(); ++i) - if (AudioPluginInstance* result = formats.getUnchecked(i)->createInstanceFromDescription (description, rate, blockSize)) - return result; - - errorMessage = doesPluginStillExist (description) ? TRANS ("This plug-in failed to load correctly") - : TRANS ("This plug-in file no longer exists"); - return nullptr; -} - -bool AudioPluginFormatManager::doesPluginStillExist (const PluginDescription& description) const -{ - for (int i = 0; i < formats.size(); ++i) - if (formats.getUnchecked(i)->getName() == description.pluginFormatName) - return formats.getUnchecked(i)->doesPluginStillExist (description); - - return false; -} diff --git a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h b/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h deleted file mode 100755 index a6f1607..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOPLUGINFORMATMANAGER_H_INCLUDED -#define JUCE_AUDIOPLUGINFORMATMANAGER_H_INCLUDED - - -//============================================================================== -/** - This maintains a list of known AudioPluginFormats. - - @see AudioPluginFormat -*/ -class JUCE_API AudioPluginFormatManager -{ -public: - //============================================================================== - AudioPluginFormatManager(); - - /** Destructor. */ - ~AudioPluginFormatManager(); - - //============================================================================== - /** Adds any formats that it knows about, e.g. VST. - */ - void addDefaultFormats(); - - //============================================================================== - /** Returns the number of types of format that are available. - - Use getFormat() to get one of them. - */ - int getNumFormats(); - - /** Returns one of the available formats. - - @see getNumFormats - */ - AudioPluginFormat* getFormat (int index); - - //============================================================================== - /** Adds a format to the list. - - The object passed in will be owned and deleted by the manager. - */ - void addFormat (AudioPluginFormat* format); - - - //============================================================================== - /** Tries to load the type for this description, by trying all the formats - that this manager knows about. - - The caller is responsible for deleting the object that is returned. - - If it can't load the plugin, it returns nullptr and leaves a message in the - errorMessage string. - */ - AudioPluginInstance* createPluginInstance (const PluginDescription& description, - double initialSampleRate, - int initialBufferSize, - String& errorMessage) const; - - /** Checks that the file or component for this plugin actually still exists. - - (This won't try to load the plugin) - */ - bool doesPluginStillExist (const PluginDescription& description) const; - -private: - //============================================================================== - OwnedArray formats; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioPluginFormatManager) -}; - - - -#endif // JUCE_AUDIOPLUGINFORMATMANAGER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h deleted file mode 100755 index 46c2b10..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if (JUCE_PLUGINHOST_AU && JUCE_MAC) || DOXYGEN - -//============================================================================== -/** - Implements a plugin format manager for AudioUnits. -*/ -class JUCE_API AudioUnitPluginFormat : public AudioPluginFormat -{ -public: - //============================================================================== - AudioUnitPluginFormat(); - ~AudioUnitPluginFormat(); - - //============================================================================== - String getName() const override { return "AudioUnit"; } - void findAllTypesForFile (OwnedArray&, const String& fileOrIdentifier) override; - AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc, double, int) override; - bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; - String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; - bool pluginNeedsRescanning (const PluginDescription&) override; - StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive); - bool doesPluginStillExist (const PluginDescription&) override; - FileSearchPath getDefaultLocationsToSearch() override; - bool canScanForPlugins() const override { return true; } - -private: - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginFormat) -}; - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm deleted file mode 100755 index 2877509..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ /dev/null @@ -1,1738 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_PLUGINHOST_AU && JUCE_MAC - -} // (juce namespace) - -#include -#include -#include -#include -#include - -#if JUCE_SUPPORT_CARBON - #include -#endif - -namespace juce -{ - -#include "../../juce_audio_devices/native/juce_MidiDataConcatenator.h" - -#if JUCE_SUPPORT_CARBON - #include "../../juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" -#endif - -// Change this to disable logging of various activities -#ifndef AU_LOGGING - #define AU_LOGGING 1 -#endif - -#if AU_LOGGING - #define JUCE_AU_LOG(a) Logger::writeToLog(a); -#else - #define JUCE_AU_LOG(a) -#endif - -namespace AudioUnitFormatHelpers -{ - #if JUCE_DEBUG - static ThreadLocalValue insideCallback; - #endif - - String osTypeToString (OSType type) noexcept - { - const juce_wchar s[4] = { (juce_wchar) ((type >> 24) & 0xff), - (juce_wchar) ((type >> 16) & 0xff), - (juce_wchar) ((type >> 8) & 0xff), - (juce_wchar) (type & 0xff) }; - return String (s, 4); - } - - OSType stringToOSType (String s) - { - if (s.trim().length() >= 4) // (to avoid trimming leading spaces) - s = s.trim(); - - s += " "; - - return (((OSType) (unsigned char) s[0]) << 24) - | (((OSType) (unsigned char) s[1]) << 16) - | (((OSType) (unsigned char) s[2]) << 8) - | ((OSType) (unsigned char) s[3]); - } - - static const char* auIdentifierPrefix = "AudioUnit:"; - - String createPluginIdentifier (const AudioComponentDescription& desc) - { - String s (auIdentifierPrefix); - - if (desc.componentType == kAudioUnitType_MusicDevice) - s << "Synths/"; - else if (desc.componentType == kAudioUnitType_MusicEffect - || desc.componentType == kAudioUnitType_Effect) - s << "Effects/"; - else if (desc.componentType == kAudioUnitType_Generator) - s << "Generators/"; - else if (desc.componentType == kAudioUnitType_Panner) - s << "Panners/"; - - s << osTypeToString (desc.componentType) << "," - << osTypeToString (desc.componentSubType) << "," - << osTypeToString (desc.componentManufacturer); - - return s; - } - - void getNameAndManufacturer (AudioComponent comp, String& name, String& manufacturer) - { - CFStringRef cfName; - if (AudioComponentCopyName (comp, &cfName) == noErr) - { - name = String::fromCFString (cfName); - CFRelease (cfName); - } - - if (name.containsChar (':')) - { - manufacturer = name.upToFirstOccurrenceOf (":", false, false).trim(); - name = name.fromFirstOccurrenceOf (":", false, false).trim(); - } - - if (name.isEmpty()) - name = ""; - } - - bool getComponentDescFromIdentifier (const String& fileOrIdentifier, AudioComponentDescription& desc, - String& name, String& version, String& manufacturer) - { - if (fileOrIdentifier.startsWithIgnoreCase (auIdentifierPrefix)) - { - String s (fileOrIdentifier.substring (jmax (fileOrIdentifier.lastIndexOfChar (':'), - fileOrIdentifier.lastIndexOfChar ('/')) + 1)); - - StringArray tokens; - tokens.addTokens (s, ",", StringRef()); - tokens.removeEmptyStrings(); - - if (tokens.size() == 3) - { - zerostruct (desc); - desc.componentType = stringToOSType (tokens[0]); - desc.componentSubType = stringToOSType (tokens[1]); - desc.componentManufacturer = stringToOSType (tokens[2]); - - if (AudioComponent comp = AudioComponentFindNext (0, &desc)) - { - getNameAndManufacturer (comp, name, manufacturer); - - if (manufacturer.isEmpty()) - manufacturer = tokens[2]; - - if (version.isEmpty()) - { - UInt32 versionNum; - - if (AudioComponentGetVersion (comp, &versionNum) == noErr) - { - version << (int) (versionNum >> 16) << "." - << (int) ((versionNum >> 8) & 0xff) << "." - << (int) (versionNum & 0xff); - } - } - - return true; - } - } - } - - return false; - } - - bool getComponentDescFromFile (const String& fileOrIdentifier, AudioComponentDescription& desc, - String& name, String& version, String& manufacturer) - { - zerostruct (desc); - - const File file (fileOrIdentifier); - if (! file.hasFileExtension (".component")) - return false; - - const char* const utf8 = fileOrIdentifier.toUTF8(); - - if (CFURLRef url = CFURLCreateFromFileSystemRepresentation (0, (const UInt8*) utf8, - strlen (utf8), file.isDirectory())) - { - CFBundleRef bundleRef = CFBundleCreate (kCFAllocatorDefault, url); - CFRelease (url); - - if (bundleRef != 0) - { - CFTypeRef bundleName = CFBundleGetValueForInfoDictionaryKey (bundleRef, CFSTR("CFBundleName")); - - if (bundleName != 0 && CFGetTypeID (bundleName) == CFStringGetTypeID()) - name = String::fromCFString ((CFStringRef) bundleName); - - if (name.isEmpty()) - name = file.getFileNameWithoutExtension(); - - CFTypeRef versionString = CFBundleGetValueForInfoDictionaryKey (bundleRef, CFSTR("CFBundleVersion")); - - if (versionString != 0 && CFGetTypeID (versionString) == CFStringGetTypeID()) - version = String::fromCFString ((CFStringRef) versionString); - - CFTypeRef manuString = CFBundleGetValueForInfoDictionaryKey (bundleRef, CFSTR("CFBundleGetInfoString")); - - if (manuString != 0 && CFGetTypeID (manuString) == CFStringGetTypeID()) - manufacturer = String::fromCFString ((CFStringRef) manuString); - - const short resFileId = CFBundleOpenBundleResourceMap (bundleRef); - UseResFile (resFileId); - - const OSType thngType = stringToOSType ("thng"); - - for (ResourceIndex i = 1; i <= Count1Resources (thngType); ++i) - { - if (Handle h = Get1IndResource (thngType, i)) - { - HLock (h); - const uint32* const types = (const uint32*) *h; - - if (types[0] == kAudioUnitType_MusicDevice - || types[0] == kAudioUnitType_MusicEffect - || types[0] == kAudioUnitType_Effect - || types[0] == kAudioUnitType_Generator - || types[0] == kAudioUnitType_Panner) - { - desc.componentType = types[0]; - desc.componentSubType = types[1]; - desc.componentManufacturer = types[2]; - - if (AudioComponent comp = AudioComponentFindNext (0, &desc)) - getNameAndManufacturer (comp, name, manufacturer); - - break; - } - - HUnlock (h); - ReleaseResource (h); - } - } - - CFBundleCloseBundleResourceMap (bundleRef, resFileId); - CFRelease (bundleRef); - } - } - - return desc.componentType != 0 && desc.componentSubType != 0; - } - - const char* getCategory (OSType type) noexcept - { - switch (type) - { - case kAudioUnitType_Effect: - case kAudioUnitType_MusicEffect: return "Effect"; - case kAudioUnitType_MusicDevice: return "Synth"; - case kAudioUnitType_Generator: return "Generator"; - case kAudioUnitType_Panner: return "Panner"; - default: break; - } - - return nullptr; - } -} - -//============================================================================== -class AudioUnitPluginWindowCarbon; -class AudioUnitPluginWindowCocoa; - -//============================================================================== -class AudioUnitPluginInstance : public AudioPluginInstance -{ -public: - AudioUnitPluginInstance (const String& fileOrId) - : fileOrIdentifier (fileOrId), - wantsMidiMessages (false), - producesMidiMessages (false), - wasPlaying (false), - prepared (false), - currentBuffer (nullptr), - numInputBusChannels (0), - numOutputBusChannels (0), - numInputBusses (0), - numOutputBusses (0), - audioUnit (nullptr), - eventListenerRef (0), - midiConcatenator (2048) - { - using namespace AudioUnitFormatHelpers; - - #if JUCE_DEBUG - ++*insideCallback; - #endif - - JUCE_AU_LOG ("Opening AU: " + fileOrIdentifier); - - if (getComponentDescFromIdentifier (fileOrIdentifier, componentDesc, pluginName, version, manufacturer) - || getComponentDescFromFile (fileOrIdentifier, componentDesc, pluginName, version, manufacturer)) - { - if (AudioComponent comp = AudioComponentFindNext (0, &componentDesc)) - { - AudioComponentInstanceNew (comp, &audioUnit); - - wantsMidiMessages = componentDesc.componentType == kAudioUnitType_MusicDevice - || componentDesc.componentType == kAudioUnitType_MusicEffect; - } - } - - #if JUCE_DEBUG - --*insideCallback; - #endif - } - - ~AudioUnitPluginInstance() - { - const ScopedLock sl (lock); - - #if JUCE_DEBUG - // this indicates that some kind of recursive call is getting triggered that's - // deleting this plugin while it's still under construction. - jassert (AudioUnitFormatHelpers::insideCallback.get() == 0); - #endif - - if (eventListenerRef != 0) - { - AUListenerDispose (eventListenerRef); - eventListenerRef = 0; - } - - if (audioUnit != nullptr) - { - if (prepared) - releaseResources(); - - AudioComponentInstanceDispose (audioUnit); - audioUnit = nullptr; - } - } - - void initialise (double rate, int blockSize) - { - refreshParameterList(); - updateNumChannels(); - producesMidiMessages = canProduceMidiOutput(); - setPlayConfigDetails (numInputBusChannels * numInputBusses, - numOutputBusChannels * numOutputBusses, - rate, blockSize); - setLatencySamples (0); - - if (parameters.size() == 0) - { - // some plugins crash if initialiseAudioUnit() is called too soon (sigh..), so we'll - // only call it here if it seems like they it's one of the awkward plugins that can - // only create their parameters after it has been initialised. - initialiseAudioUnit(); - refreshParameterList(); - } - - setPluginCallbacks(); - } - - //============================================================================== - // AudioPluginInstance methods: - - void fillInPluginDescription (PluginDescription& desc) const override - { - desc.name = pluginName; - desc.descriptiveName = pluginName; - desc.fileOrIdentifier = AudioUnitFormatHelpers::createPluginIdentifier (componentDesc); - desc.uid = ((int) componentDesc.componentType) - ^ ((int) componentDesc.componentSubType) - ^ ((int) componentDesc.componentManufacturer); - desc.lastFileModTime = Time(); - desc.pluginFormatName = "AudioUnit"; - desc.category = AudioUnitFormatHelpers::getCategory (componentDesc.componentType); - desc.manufacturerName = manufacturer; - desc.version = version; - desc.numInputChannels = getNumInputChannels(); - desc.numOutputChannels = getNumOutputChannels(); - desc.isInstrument = (componentDesc.componentType == kAudioUnitType_MusicDevice); - } - - void* getPlatformSpecificData() override { return audioUnit; } - const String getName() const override { return pluginName; } - - bool silenceInProducesSilenceOut() const override - { - return getTailLengthSeconds() <= 0; - } - - double getTailLengthSeconds() const override - { - Float64 tail = 0; - UInt32 tailSize = sizeof (tail); - - if (audioUnit != nullptr) - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_TailTime, kAudioUnitScope_Global, - 0, &tail, &tailSize); - - return tail; - } - - bool acceptsMidi() const override { return wantsMidiMessages; } - bool producesMidi() const override { return producesMidiMessages; } - - //============================================================================== - // AudioProcessor methods: - - void prepareToPlay (double newSampleRate, int estimatedSamplesPerBlock) override - { - if (audioUnit != nullptr) - { - releaseResources(); - updateNumChannels(); - - Float64 sampleRateIn = 0, sampleRateOut = 0; - UInt32 sampleRateSize = sizeof (sampleRateIn); - const Float64 sr = newSampleRate; - - for (int i = 0; i < numInputBusses; ++i) - { - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, i, &sampleRateIn, &sampleRateSize); - - if (sampleRateIn != sr) - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, i, &sr, sizeof (sr)); - } - - for (int i = 0; i < numOutputBusses; ++i) - { - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, i, &sampleRateOut, &sampleRateSize); - - if (sampleRateOut != sr) - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, i, &sr, sizeof (sr)); - } - - UInt32 frameSize = (UInt32) estimatedSamplesPerBlock; - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, - &frameSize, sizeof (frameSize)); - - setPlayConfigDetails (numInputBusChannels * numInputBusses, - numOutputBusChannels * numOutputBusses, - newSampleRate, estimatedSamplesPerBlock); - - Float64 latencySecs = 0.0; - UInt32 latencySize = sizeof (latencySecs); - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_Latency, kAudioUnitScope_Global, - 0, &latencySecs, &latencySize); - - setLatencySamples (roundToInt (latencySecs * newSampleRate)); - - { - AudioStreamBasicDescription stream; - zerostruct (stream); // (can't use "= { 0 }" on this object because it's typedef'ed as a C struct) - stream.mSampleRate = sr; - stream.mFormatID = kAudioFormatLinearPCM; - stream.mFormatFlags = kAudioFormatFlagsNativeFloatPacked | kAudioFormatFlagIsNonInterleaved | kAudioFormatFlagsNativeEndian; - stream.mFramesPerPacket = 1; - stream.mBytesPerPacket = 4; - stream.mBytesPerFrame = 4; - stream.mBitsPerChannel = 32; - stream.mChannelsPerFrame = numInputBusChannels; - - for (int i = 0; i < numInputBusses; ++i) - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, - kAudioUnitScope_Input, i, &stream, sizeof (stream)); - - stream.mChannelsPerFrame = numOutputBusChannels; - - for (int i = 0; i < numOutputBusses; ++i) - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_StreamFormat, - kAudioUnitScope_Output, i, &stream, sizeof (stream)); - } - - if (numOutputBusses != 0 && numOutputBusChannels != 0) - outputBufferList.calloc (numOutputBusses, getAudioBufferSizeInBytes()); - - zerostruct (timeStamp); - timeStamp.mSampleTime = 0; - timeStamp.mHostTime = AudioGetCurrentHostTime(); - timeStamp.mFlags = kAudioTimeStampSampleTimeValid | kAudioTimeStampHostTimeValid; - - currentBuffer = nullptr; - wasPlaying = false; - - resetBusses(); - - jassert (! prepared); - initialiseAudioUnit(); - } - } - - void releaseResources() override - { - if (prepared) - { - AudioUnitUninitialize (audioUnit); - resetBusses(); - AudioUnitReset (audioUnit, kAudioUnitScope_Global, 0); - - outputBufferList.free(); - currentBuffer = nullptr; - prepared = false; - } - - incomingMidi.clear(); - } - - bool initialiseAudioUnit() - { - if (! prepared) - prepared = (AudioUnitInitialize (audioUnit) == noErr); - - return prepared; - } - - void resetBusses() - { - for (int i = 0; i < numInputBusses; ++i) AudioUnitReset (audioUnit, kAudioUnitScope_Input, i); - for (int i = 0; i < numOutputBusses; ++i) AudioUnitReset (audioUnit, kAudioUnitScope_Output, i); - } - - void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) override - { - const int numSamples = buffer.getNumSamples(); - - if (prepared) - { - timeStamp.mHostTime = AudioGetCurrentHostTime(); - - for (int i = 0; i < numOutputBusses; ++i) - { - if (AudioBufferList* const abl = getAudioBufferListForBus(i)) - { - abl->mNumberBuffers = numOutputBusChannels; - - for (int j = 0; j < numOutputBusChannels; ++j) - { - abl->mBuffers[j].mNumberChannels = 1; - abl->mBuffers[j].mDataByteSize = sizeof (float) * numSamples; - abl->mBuffers[j].mData = buffer.getWritePointer (i * numOutputBusChannels + j); - } - } - } - - currentBuffer = &buffer; - - if (wantsMidiMessages) - { - const uint8* midiEventData; - int midiEventSize, midiEventPosition; - - for (MidiBuffer::Iterator i (midiMessages); i.getNextEvent (midiEventData, midiEventSize, midiEventPosition);) - { - if (midiEventSize <= 3) - MusicDeviceMIDIEvent (audioUnit, - midiEventData[0], midiEventData[1], midiEventData[2], - midiEventPosition); - else - MusicDeviceSysEx (audioUnit, midiEventData, midiEventSize); - } - - midiMessages.clear(); - } - - - for (int i = 0; i < numOutputBusses; ++i) - { - AudioUnitRenderActionFlags flags = 0; - AudioUnitRender (audioUnit, &flags, &timeStamp, i, numSamples, getAudioBufferListForBus (i)); - } - - timeStamp.mSampleTime += numSamples; - } - else - { - // Plugin not working correctly, so just bypass.. - for (int i = 0; i < getNumOutputChannels(); ++i) - buffer.clear (i, 0, buffer.getNumSamples()); - } - - if (producesMidiMessages) - { - const ScopedLock sl (midiInLock); - midiMessages.swapWith (incomingMidi); - incomingMidi.clear(); - } - } - - //============================================================================== - bool hasEditor() const override { return true; } - AudioProcessorEditor* createEditor() override; - - //============================================================================== - const String getInputChannelName (int index) const override - { - if (isPositiveAndBelow (index, getNumInputChannels())) - return "Input " + String (index + 1); - - return String(); - } - - const String getOutputChannelName (int index) const override - { - if (isPositiveAndBelow (index, getNumOutputChannels())) - return "Output " + String (index + 1); - - return String(); - } - - bool isInputChannelStereoPair (int index) const override { return isPositiveAndBelow (index, getNumInputChannels()); } - bool isOutputChannelStereoPair (int index) const override { return isPositiveAndBelow (index, getNumOutputChannels()); } - - //============================================================================== - int getNumParameters() override { return parameters.size(); } - - float getParameter (int index) override - { - const ScopedLock sl (lock); - - AudioUnitParameterValue value = 0; - - if (audioUnit != nullptr) - { - if (const ParamInfo* p = parameters[index]) - { - AudioUnitGetParameter (audioUnit, - p->paramID, - kAudioUnitScope_Global, 0, - &value); - - value = (value - p->minValue) / (p->maxValue - p->minValue); - } - } - - return value; - } - - void setParameter (int index, float newValue) override - { - const ScopedLock sl (lock); - - if (audioUnit != nullptr) - { - if (const ParamInfo* p = parameters[index]) - { - AudioUnitSetParameter (audioUnit, p->paramID, kAudioUnitScope_Global, 0, - p->minValue + (p->maxValue - p->minValue) * newValue, 0); - - sendParameterChangeEvent (index); - } - } - } - - void sendParameterChangeEvent (int index) - { - jassert (audioUnit != nullptr); - - const ParamInfo& p = *parameters.getUnchecked (index); - - AudioUnitEvent ev; - ev.mEventType = kAudioUnitEvent_ParameterValueChange; - ev.mArgument.mParameter.mAudioUnit = audioUnit; - ev.mArgument.mParameter.mParameterID = p.paramID; - ev.mArgument.mParameter.mScope = kAudioUnitScope_Global; - ev.mArgument.mParameter.mElement = 0; - - AUEventListenerNotify (nullptr, nullptr, &ev); - } - - void sendAllParametersChangedEvents() - { - jassert (audioUnit != nullptr); - - AudioUnitParameter param; - param.mAudioUnit = audioUnit; - param.mParameterID = kAUParameterListener_AnyParameter; - - AUParameterListenerNotify (nullptr, nullptr, ¶m); - } - - const String getParameterName (int index) override - { - if (const ParamInfo* p = parameters[index]) - return p->name; - - return String(); - } - - const String getParameterText (int index) override { return String (getParameter (index)); } - - bool isParameterAutomatable (int index) const override - { - if (const ParamInfo* p = parameters[index]) - return p->automatable; - - return false; - } - - //============================================================================== - int getNumPrograms() override - { - CFArrayRef presets; - UInt32 sz = sizeof (CFArrayRef); - int num = 0; - - if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_FactoryPresets, - kAudioUnitScope_Global, 0, &presets, &sz) == noErr) - { - num = (int) CFArrayGetCount (presets); - CFRelease (presets); - } - - return num; - } - - int getCurrentProgram() override - { - AUPreset current; - current.presetNumber = 0; - UInt32 sz = sizeof (AUPreset); - - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_PresentPreset, - kAudioUnitScope_Global, 0, ¤t, &sz); - - return current.presetNumber; - } - - void setCurrentProgram (int newIndex) override - { - AUPreset current; - current.presetNumber = newIndex; - current.presetName = CFSTR(""); - - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_PresentPreset, - kAudioUnitScope_Global, 0, ¤t, sizeof (AUPreset)); - - sendAllParametersChangedEvents(); - } - - const String getProgramName (int index) override - { - String s; - CFArrayRef presets; - UInt32 sz = sizeof (CFArrayRef); - - if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_FactoryPresets, - kAudioUnitScope_Global, 0, &presets, &sz) == noErr) - { - for (CFIndex i = 0; i < CFArrayGetCount (presets); ++i) - { - if (const AUPreset* p = (const AUPreset*) CFArrayGetValueAtIndex (presets, i)) - { - if (p->presetNumber == index) - { - s = String::fromCFString (p->presetName); - break; - } - } - } - - CFRelease (presets); - } - - return s; - } - - void changeProgramName (int /*index*/, const String& /*newName*/) override - { - jassertfalse; // xxx not implemented! - } - - //============================================================================== - void getStateInformation (MemoryBlock& destData) override - { - getCurrentProgramStateInformation (destData); - } - - void getCurrentProgramStateInformation (MemoryBlock& destData) override - { - CFPropertyListRef propertyList = 0; - UInt32 sz = sizeof (CFPropertyListRef); - - if (AudioUnitGetProperty (audioUnit, - kAudioUnitProperty_ClassInfo, - kAudioUnitScope_Global, - 0, &propertyList, &sz) == noErr) - { - CFWriteStreamRef stream = CFWriteStreamCreateWithAllocatedBuffers (kCFAllocatorDefault, kCFAllocatorDefault); - CFWriteStreamOpen (stream); - - CFIndex bytesWritten = CFPropertyListWriteToStream (propertyList, stream, kCFPropertyListBinaryFormat_v1_0, 0); - CFWriteStreamClose (stream); - - CFDataRef data = (CFDataRef) CFWriteStreamCopyProperty (stream, kCFStreamPropertyDataWritten); - - destData.setSize (bytesWritten); - destData.copyFrom (CFDataGetBytePtr (data), 0, destData.getSize()); - CFRelease (data); - - CFRelease (stream); - CFRelease (propertyList); - } - } - - void setStateInformation (const void* data, int sizeInBytes) override - { - setCurrentProgramStateInformation (data, sizeInBytes); - } - - void setCurrentProgramStateInformation (const void* data, int sizeInBytes) override - { - CFReadStreamRef stream = CFReadStreamCreateWithBytesNoCopy (kCFAllocatorDefault, (const UInt8*) data, - sizeInBytes, kCFAllocatorNull); - CFReadStreamOpen (stream); - - CFPropertyListFormat format = kCFPropertyListBinaryFormat_v1_0; - CFPropertyListRef propertyList = CFPropertyListCreateFromStream (kCFAllocatorDefault, stream, 0, - kCFPropertyListImmutable, &format, 0); - CFRelease (stream); - - if (propertyList != 0) - { - initialiseAudioUnit(); - - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global, - 0, &propertyList, sizeof (propertyList)); - - sendAllParametersChangedEvents(); - - CFRelease (propertyList); - } - } - - void refreshParameterList() override - { - parameters.clear(); - - if (audioUnit != nullptr) - { - UInt32 paramListSize = 0; - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ParameterList, kAudioUnitScope_Global, - 0, 0, ¶mListSize); - - if (paramListSize > 0) - { - const size_t numParams = paramListSize / sizeof (int); - - HeapBlock ids; - ids.calloc (numParams); - - AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ParameterList, kAudioUnitScope_Global, - 0, ids, ¶mListSize); - - for (int i = 0; i < numParams; ++i) - { - AudioUnitParameterInfo info; - UInt32 sz = sizeof (info); - - if (AudioUnitGetProperty (audioUnit, - kAudioUnitProperty_ParameterInfo, - kAudioUnitScope_Global, - ids[i], &info, &sz) == noErr) - { - ParamInfo* const param = new ParamInfo(); - parameters.add (param); - param->paramID = ids[i]; - param->minValue = info.minValue; - param->maxValue = info.maxValue; - param->automatable = (info.flags & kAudioUnitParameterFlag_NonRealTime) == 0; - - if ((info.flags & kAudioUnitParameterFlag_HasCFNameString) != 0) - { - param->name = String::fromCFString (info.cfNameString); - - if ((info.flags & kAudioUnitParameterFlag_CFNameRelease) != 0) - CFRelease (info.cfNameString); - } - else - { - param->name = String (info.name, sizeof (info.name)); - } - } - } - } - } - } - - void handleIncomingMidiMessage (void*, const MidiMessage& message) - { - const ScopedLock sl (midiInLock); - incomingMidi.addEvent (message, 0); - } - - void handlePartialSysexMessage (void*, const uint8*, int, double) {} - -private: - //============================================================================== - friend class AudioUnitPluginWindowCarbon; - friend class AudioUnitPluginWindowCocoa; - friend class AudioUnitPluginFormat; - - AudioComponentDescription componentDesc; - String pluginName, manufacturer, version; - String fileOrIdentifier; - CriticalSection lock; - bool wantsMidiMessages, producesMidiMessages, wasPlaying, prepared; - - HeapBlock outputBufferList; - AudioTimeStamp timeStamp; - AudioSampleBuffer* currentBuffer; - int numInputBusChannels, numOutputBusChannels, numInputBusses, numOutputBusses; - - AudioUnit audioUnit; - AUEventListenerRef eventListenerRef; - - struct ParamInfo - { - UInt32 paramID; - String name; - AudioUnitParameterValue minValue, maxValue; - bool automatable; - }; - - OwnedArray parameters; - - MidiDataConcatenator midiConcatenator; - CriticalSection midiInLock; - MidiBuffer incomingMidi; - - void setPluginCallbacks() - { - if (audioUnit != nullptr) - { - { - AURenderCallbackStruct info; - zerostruct (info); // (can't use "= { 0 }" on this object because it's typedef'ed as a C struct) - - info.inputProcRefCon = this; - info.inputProc = renderGetInputCallback; - - for (int i = 0; i < numInputBusses; ++i) - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_SetRenderCallback, - kAudioUnitScope_Input, i, &info, sizeof (info)); - } - - if (producesMidiMessages) - { - AUMIDIOutputCallbackStruct info; - zerostruct (info); - - info.userData = this; - info.midiOutputCallback = renderMidiOutputCallback; - - producesMidiMessages = (AudioUnitSetProperty (audioUnit, kAudioUnitProperty_MIDIOutputCallback, - kAudioUnitScope_Global, 0, &info, sizeof (info)) == noErr); - } - - { - HostCallbackInfo info; - zerostruct (info); - - info.hostUserData = this; - info.beatAndTempoProc = getBeatAndTempoCallback; - info.musicalTimeLocationProc = getMusicalTimeLocationCallback; - info.transportStateProc = getTransportStateCallback; - - AudioUnitSetProperty (audioUnit, kAudioUnitProperty_HostCallbacks, - kAudioUnitScope_Global, 0, &info, sizeof (info)); - } - - AUEventListenerCreate (eventListenerCallback, this, - #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 - CFRunLoopGetMain(), - #else - nullptr, - #endif - kCFRunLoopDefaultMode, 0, 0, &eventListenerRef); - - for (int i = 0; i < parameters.size(); ++i) - { - AudioUnitEvent event; - event.mArgument.mParameter.mAudioUnit = audioUnit; - event.mArgument.mParameter.mParameterID = parameters.getUnchecked(i)->paramID; - event.mArgument.mParameter.mScope = kAudioUnitScope_Global; - event.mArgument.mParameter.mElement = 0; - - event.mEventType = kAudioUnitEvent_ParameterValueChange; - AUEventListenerAddEventType (eventListenerRef, nullptr, &event); - - event.mEventType = kAudioUnitEvent_BeginParameterChangeGesture; - AUEventListenerAddEventType (eventListenerRef, nullptr, &event); - - event.mEventType = kAudioUnitEvent_EndParameterChangeGesture; - AUEventListenerAddEventType (eventListenerRef, nullptr, &event); - } - - // Add a listener for program changes - AudioUnitEvent event; - event.mArgument.mProperty.mAudioUnit = audioUnit; - event.mArgument.mProperty.mPropertyID = kAudioUnitProperty_PresentPreset; - event.mArgument.mProperty.mScope = kAudioUnitScope_Global; - event.mArgument.mProperty.mElement = 0; - - event.mEventType = kAudioUnitEvent_PropertyChange; - AUEventListenerAddEventType (eventListenerRef, nullptr, &event); - } - } - - void eventCallback (const AudioUnitEvent& event, AudioUnitParameterValue newValue) - { - switch (event.mEventType) - { - case kAudioUnitEvent_ParameterValueChange: - for (int i = 0; i < parameters.size(); ++i) - { - const ParamInfo& p = *parameters.getUnchecked(i); - - if (p.paramID == event.mArgument.mParameter.mParameterID) - { - sendParamChangeMessageToListeners (i, (newValue - p.minValue) / (p.maxValue - p.minValue)); - break; - } - } - - break; - - case kAudioUnitEvent_BeginParameterChangeGesture: - beginParameterChangeGesture (event.mArgument.mParameter.mParameterID); - break; - - case kAudioUnitEvent_EndParameterChangeGesture: - endParameterChangeGesture (event.mArgument.mParameter.mParameterID); - break; - - default: - sendAllParametersChangedEvents(); - break; - } - } - - static void eventListenerCallback (void* userRef, void*, const AudioUnitEvent* event, - UInt64, AudioUnitParameterValue value) - { - jassert (event != nullptr); - static_cast (userRef)->eventCallback (*event, value); - } - - //============================================================================== - OSStatus renderGetInput (AudioUnitRenderActionFlags*, - const AudioTimeStamp*, - UInt32 inBusNumber, - UInt32 inNumberFrames, - AudioBufferList* ioData) const - { - if (currentBuffer != nullptr) - { - // if this ever happens, might need to add extra handling - jassert (inNumberFrames == (UInt32) currentBuffer->getNumSamples()); - - for (UInt32 i = 0; i < ioData->mNumberBuffers; ++i) - { - const int bufferChannel = inBusNumber * numInputBusChannels + i; - - if (bufferChannel < currentBuffer->getNumChannels()) - { - memcpy (ioData->mBuffers[i].mData, - currentBuffer->getReadPointer (bufferChannel), - sizeof (float) * inNumberFrames); - } - else - { - zeromem (ioData->mBuffers[i].mData, - sizeof (float) * inNumberFrames); - } - } - } - - return noErr; - } - - OSStatus renderMidiOutput (const MIDIPacketList* pktlist) - { - if (pktlist != nullptr && pktlist->numPackets) - { - const double time = Time::getMillisecondCounterHiRes() * 0.001; - const MIDIPacket* packet = &pktlist->packet[0]; - - for (UInt32 i = 0; i < pktlist->numPackets; ++i) - { - midiConcatenator.pushMidiData (packet->data, (int) packet->length, time, (void*) nullptr, *this); - packet = MIDIPacketNext (packet); - } - } - - return noErr; - } - - template - static void setIfNotNull (Type1* p, Type2 value) noexcept - { - if (p != nullptr) *p = value; - } - - OSStatus getBeatAndTempo (Float64* outCurrentBeat, Float64* outCurrentTempo) const - { - AudioPlayHead* const ph = getPlayHead(); - AudioPlayHead::CurrentPositionInfo result; - - if (ph != nullptr && ph->getCurrentPosition (result)) - { - setIfNotNull (outCurrentBeat, result.ppqPosition); - setIfNotNull (outCurrentTempo, result.bpm); - } - else - { - setIfNotNull (outCurrentBeat, 0); - setIfNotNull (outCurrentTempo, 120.0); - } - - return noErr; - } - - OSStatus getMusicalTimeLocation (UInt32* outDeltaSampleOffsetToNextBeat, Float32* outTimeSig_Numerator, - UInt32* outTimeSig_Denominator, Float64* outCurrentMeasureDownBeat) const - { - AudioPlayHead* const ph = getPlayHead(); - AudioPlayHead::CurrentPositionInfo result; - - if (ph != nullptr && ph->getCurrentPosition (result)) - { - setIfNotNull (outTimeSig_Numerator, result.timeSigNumerator); - setIfNotNull (outTimeSig_Denominator, result.timeSigDenominator); - setIfNotNull (outDeltaSampleOffsetToNextBeat, 0); //xxx - setIfNotNull (outCurrentMeasureDownBeat, result.ppqPositionOfLastBarStart); //xxx wrong - } - else - { - setIfNotNull (outDeltaSampleOffsetToNextBeat, 0); - setIfNotNull (outTimeSig_Numerator, 4); - setIfNotNull (outTimeSig_Denominator, 4); - setIfNotNull (outCurrentMeasureDownBeat, 0); - } - - return noErr; - } - - OSStatus getTransportState (Boolean* outIsPlaying, Boolean* outTransportStateChanged, - Float64* outCurrentSampleInTimeLine, Boolean* outIsCycling, - Float64* outCycleStartBeat, Float64* outCycleEndBeat) - { - AudioPlayHead* const ph = getPlayHead(); - AudioPlayHead::CurrentPositionInfo result; - - if (ph != nullptr && ph->getCurrentPosition (result)) - { - setIfNotNull (outIsPlaying, result.isPlaying); - - if (outTransportStateChanged != nullptr) - { - *outTransportStateChanged = result.isPlaying != wasPlaying; - wasPlaying = result.isPlaying; - } - - setIfNotNull (outCurrentSampleInTimeLine, result.timeInSamples); - setIfNotNull (outIsCycling, false); - setIfNotNull (outCycleStartBeat, 0); - setIfNotNull (outCycleEndBeat, 0); - } - else - { - setIfNotNull (outIsPlaying, false); - setIfNotNull (outTransportStateChanged, false); - setIfNotNull (outCurrentSampleInTimeLine, 0); - setIfNotNull (outIsCycling, false); - setIfNotNull (outCycleStartBeat, 0); - setIfNotNull (outCycleEndBeat, 0); - } - - return noErr; - } - - //============================================================================== - static OSStatus renderGetInputCallback (void* hostRef, AudioUnitRenderActionFlags* ioActionFlags, - const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber, - UInt32 inNumberFrames, AudioBufferList* ioData) - { - return static_cast (hostRef) - ->renderGetInput (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData); - } - - static OSStatus renderMidiOutputCallback (void* hostRef, const AudioTimeStamp*, UInt32 /*midiOutNum*/, - const struct MIDIPacketList* pktlist) - { - return static_cast (hostRef)->renderMidiOutput (pktlist); - } - - static OSStatus getBeatAndTempoCallback (void* hostRef, Float64* outCurrentBeat, Float64* outCurrentTempo) - { - return static_cast (hostRef)->getBeatAndTempo (outCurrentBeat, outCurrentTempo); - } - - static OSStatus getMusicalTimeLocationCallback (void* hostRef, UInt32* outDeltaSampleOffsetToNextBeat, - Float32* outTimeSig_Numerator, UInt32* outTimeSig_Denominator, - Float64* outCurrentMeasureDownBeat) - { - return static_cast (hostRef) - ->getMusicalTimeLocation (outDeltaSampleOffsetToNextBeat, outTimeSig_Numerator, - outTimeSig_Denominator, outCurrentMeasureDownBeat); - } - - static OSStatus getTransportStateCallback (void* hostRef, Boolean* outIsPlaying, Boolean* outTransportStateChanged, - Float64* outCurrentSampleInTimeLine, Boolean* outIsCycling, - Float64* outCycleStartBeat, Float64* outCycleEndBeat) - { - return static_cast (hostRef) - ->getTransportState (outIsPlaying, outTransportStateChanged, outCurrentSampleInTimeLine, - outIsCycling, outCycleStartBeat, outCycleEndBeat); - } - - //============================================================================== - size_t getAudioBufferSizeInBytes() const noexcept - { - return offsetof (AudioBufferList, mBuffers) + (sizeof (AudioBuffer) * numOutputBusChannels); - } - - AudioBufferList* getAudioBufferListForBus (int busIndex) const noexcept - { - return addBytesToPointer (outputBufferList.getData(), getAudioBufferSizeInBytes() * busIndex); - } - - int getElementCount (AudioUnitScope scope) const noexcept - { - UInt32 count; - UInt32 countSize = sizeof (count); - - if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &count, &countSize) != noErr - || countSize == 0) - count = 1; - - return (int) count; - } - - void updateNumChannels() - { - numInputBusses = getElementCount (kAudioUnitScope_Input); - numOutputBusses = getElementCount (kAudioUnitScope_Output); - - AUChannelInfo supportedChannels [128]; - UInt32 supportedChannelsSize = sizeof (supportedChannels); - - if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_SupportedNumChannels, kAudioUnitScope_Global, - 0, supportedChannels, &supportedChannelsSize) == noErr - && supportedChannelsSize > 0) - { - int explicitNumIns = 0; - int explicitNumOuts = 0; - int maximumNumIns = 0; - int maximumNumOuts = 0; - - for (int i = 0; i < (int) (supportedChannelsSize / sizeof (AUChannelInfo)); ++i) - { - const int inChannels = (int) supportedChannels[i].inChannels; - const int outChannels = (int) supportedChannels[i].outChannels; - - if (inChannels < 0) - maximumNumIns = jmin (maximumNumIns, inChannels); - else - explicitNumIns = jmax (explicitNumIns, inChannels); - - if (outChannels < 0) - maximumNumOuts = jmin (maximumNumOuts, outChannels); - else - explicitNumOuts = jmax (explicitNumOuts, outChannels); - } - - if ((maximumNumIns == -1 && maximumNumOuts == -1) // (special meaning: any number of ins/outs, as long as they match) - || (maximumNumIns == -2 && maximumNumOuts == -1) // (special meaning: any number of ins/outs, even if they don't match) - || (maximumNumIns == -1 && maximumNumOuts == -2)) - { - numInputBusChannels = numOutputBusChannels = 2; - } - else - { - numInputBusChannels = explicitNumIns; - numOutputBusChannels = explicitNumOuts; - - if (maximumNumIns == -1 || (maximumNumIns < 0 && explicitNumIns <= -maximumNumIns)) - numInputBusChannels = 2; - - if (maximumNumOuts == -1 || (maximumNumOuts < 0 && explicitNumOuts <= -maximumNumOuts)) - numOutputBusChannels = 2; - } - } - else - { - // (this really means the plugin will take any number of ins/outs as long - // as they are the same) - numInputBusChannels = numOutputBusChannels = 2; - } - } - - bool canProduceMidiOutput() - { - UInt32 dataSize = 0; - Boolean isWritable = false; - - if (AudioUnitGetPropertyInfo (audioUnit, kAudioUnitProperty_MIDIOutputCallbackInfo, - kAudioUnitScope_Global, 0, &dataSize, &isWritable) == noErr - && dataSize != 0) - { - CFArrayRef midiArray; - - if (AudioUnitGetProperty (audioUnit, kAudioUnitProperty_MIDIOutputCallbackInfo, - kAudioUnitScope_Global, 0, &midiArray, &dataSize) == noErr) - { - bool result = (CFArrayGetCount (midiArray) > 0); - CFRelease (midiArray); - return result; - } - } - - return false; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginInstance) -}; - -//============================================================================== -class AudioUnitPluginWindowCocoa : public AudioProcessorEditor -{ -public: - AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& p, bool createGenericViewIfNeeded) - : AudioProcessorEditor (&p), - plugin (p) - { - addAndMakeVisible (wrapper); - - setOpaque (true); - setVisible (true); - setSize (100, 100); - - createView (createGenericViewIfNeeded); - } - - ~AudioUnitPluginWindowCocoa() - { - if (isValid()) - { - wrapper.setVisible (false); - removeChildComponent (&wrapper); - wrapper.setView (nil); - plugin.editorBeingDeleted (this); - } - } - - bool isValid() const { return wrapper.getView() != nil; } - - void paint (Graphics& g) override - { - g.fillAll (Colours::white); - } - - void resized() override - { - wrapper.setSize (getWidth(), getHeight()); - } - - void childBoundsChanged (Component*) override - { - setSize (wrapper.getWidth(), wrapper.getHeight()); - } - -private: - AudioUnitPluginInstance& plugin; - - AutoResizingNSViewComponent wrapper; - - bool createView (const bool createGenericViewIfNeeded) - { - if (! plugin.initialiseAudioUnit()) - return false; - - NSView* pluginView = nil; - UInt32 dataSize = 0; - Boolean isWritable = false; - - if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, - 0, &dataSize, &isWritable) == noErr - && dataSize != 0 - && AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, - 0, &dataSize, &isWritable) == noErr) - { - HeapBlock info; - info.calloc (dataSize, 1); - - if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_CocoaUI, kAudioUnitScope_Global, - 0, info, &dataSize) == noErr) - { - NSString* viewClassName = (NSString*) (info->mCocoaAUViewClass[0]); - CFStringRef path = CFURLCopyPath (info->mCocoaAUViewBundleLocation); - NSString* unescapedPath = (NSString*) CFURLCreateStringByReplacingPercentEscapes (0, path, CFSTR ("")); - CFRelease (path); - NSBundle* viewBundle = [NSBundle bundleWithPath: [unescapedPath autorelease]]; - Class viewClass = [viewBundle classNamed: viewClassName]; - - if ([viewClass conformsToProtocol: @protocol (AUCocoaUIBase)] - && [viewClass instancesRespondToSelector: @selector (interfaceVersion)] - && [viewClass instancesRespondToSelector: @selector (uiViewForAudioUnit: withSize:)]) - { - id factory = [[[viewClass alloc] init] autorelease]; - pluginView = [factory uiViewForAudioUnit: plugin.audioUnit - withSize: NSMakeSize (getWidth(), getHeight())]; - } - - for (int i = (dataSize - sizeof (CFURLRef)) / sizeof (CFStringRef); --i >= 0;) - CFRelease (info->mCocoaAUViewClass[i]); - - CFRelease (info->mCocoaAUViewBundleLocation); - } - } - - if (createGenericViewIfNeeded && (pluginView == nil)) - { - { - // This forces CoreAudio.component to be loaded, otherwise the AUGenericView will assert - AudioComponentDescription desc; - String name, version, manufacturer; - AudioUnitFormatHelpers::getComponentDescFromIdentifier ("AudioUnit:Output/auou,genr,appl", - desc, name, version, manufacturer); - } - - pluginView = [[AUGenericView alloc] initWithAudioUnit: plugin.audioUnit]; - } - - wrapper.setView (pluginView); - - if (pluginView != nil) - wrapper.resizeToFitView(); - - return pluginView != nil; - } -}; - -#if JUCE_SUPPORT_CARBON - -//============================================================================== -class AudioUnitPluginWindowCarbon : public AudioProcessorEditor -{ -public: - AudioUnitPluginWindowCarbon (AudioUnitPluginInstance& p) - : AudioProcessorEditor (&p), - plugin (p), - audioComponent (nullptr), - viewComponent (nullptr) - { - addAndMakeVisible (innerWrapper = new InnerWrapperComponent (*this)); - - setOpaque (true); - setVisible (true); - setSize (400, 300); - - UInt32 propertySize; - if (AudioUnitGetPropertyInfo (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, - kAudioUnitScope_Global, 0, &propertySize, NULL) == noErr - && propertySize > 0) - { - HeapBlock views (propertySize / sizeof (AudioComponentDescription)); - - if (AudioUnitGetProperty (plugin.audioUnit, kAudioUnitProperty_GetUIComponentList, - kAudioUnitScope_Global, 0, &views[0], &propertySize) == noErr) - { - audioComponent = AudioComponentFindNext (nullptr, &views[0]); - } - } - } - - ~AudioUnitPluginWindowCarbon() - { - innerWrapper = nullptr; - - if (isValid()) - plugin.editorBeingDeleted (this); - } - - bool isValid() const noexcept { return audioComponent != nullptr; } - - //============================================================================== - void paint (Graphics& g) override - { - g.fillAll (Colours::black); - } - - void resized() override - { - if (innerWrapper != nullptr) - innerWrapper->setSize (getWidth(), getHeight()); - } - - //============================================================================== - bool keyStateChanged (bool) override { return false; } - bool keyPressed (const KeyPress&) override { return false; } - - //============================================================================== - AudioUnit getAudioUnit() const { return plugin.audioUnit; } - - AudioUnitCarbonView getViewComponent() - { - if (viewComponent == nullptr && audioComponent != nullptr) - AudioComponentInstanceNew (audioComponent, &viewComponent); - - return viewComponent; - } - - void closeViewComponent() - { - if (viewComponent != nullptr) - { - JUCE_AU_LOG ("Closing AU GUI: " + plugin.getName()); - - AudioComponentInstanceDispose (viewComponent); - viewComponent = nullptr; - } - } - -private: - //============================================================================== - AudioUnitPluginInstance& plugin; - AudioComponent audioComponent; - AudioUnitCarbonView viewComponent; - - //============================================================================== - class InnerWrapperComponent : public CarbonViewWrapperComponent - { - public: - InnerWrapperComponent (AudioUnitPluginWindowCarbon& w) : owner (w) {} - - ~InnerWrapperComponent() - { - deleteWindow(); - } - - HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) override - { - JUCE_AU_LOG ("Opening AU GUI: " + owner.plugin.getName()); - - AudioUnitCarbonView carbonView = owner.getViewComponent(); - - if (carbonView == 0) - return 0; - - Float32Point pos = { 0, 0 }; - Float32Point size = { 250, 200 }; - HIViewRef pluginView = 0; - - AudioUnitCarbonViewCreate (carbonView, owner.getAudioUnit(), windowRef, rootView, - &pos, &size, (ControlRef*) &pluginView); - - return pluginView; - } - - void removeView (HIViewRef) override - { - owner.closeViewComponent(); - } - - private: - AudioUnitPluginWindowCarbon& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InnerWrapperComponent) - }; - - friend class InnerWrapperComponent; - ScopedPointer innerWrapper; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioUnitPluginWindowCarbon) -}; - -#endif - -//============================================================================== -AudioProcessorEditor* AudioUnitPluginInstance::createEditor() -{ - ScopedPointer w (new AudioUnitPluginWindowCocoa (*this, false)); - - if (! static_cast (w.get())->isValid()) - w = nullptr; - - #if JUCE_SUPPORT_CARBON - if (w == nullptr) - { - w = new AudioUnitPluginWindowCarbon (*this); - - if (! static_cast (w.get())->isValid()) - w = nullptr; - } - #endif - - if (w == nullptr) - w = new AudioUnitPluginWindowCocoa (*this, true); // use AUGenericView as a fallback - - return w.release(); -} - - -//============================================================================== -//============================================================================== -AudioUnitPluginFormat::AudioUnitPluginFormat() -{ -} - -AudioUnitPluginFormat::~AudioUnitPluginFormat() -{ -} - -void AudioUnitPluginFormat::findAllTypesForFile (OwnedArray& results, - const String& fileOrIdentifier) -{ - if (! fileMightContainThisPluginType (fileOrIdentifier)) - return; - - PluginDescription desc; - desc.fileOrIdentifier = fileOrIdentifier; - desc.uid = 0; - - try - { - ScopedPointer createdInstance (createInstanceFromDescription (desc, 44100.0, 512)); - - if (AudioUnitPluginInstance* auInstance = dynamic_cast (createdInstance.get())) - results.add (new PluginDescription (auInstance->getPluginDescription())); - } - catch (...) - { - // crashed while loading... - } -} - -AudioPluginInstance* AudioUnitPluginFormat::createInstanceFromDescription (const PluginDescription& desc, double rate, int blockSize) -{ - if (fileMightContainThisPluginType (desc.fileOrIdentifier)) - { - ScopedPointer result (new AudioUnitPluginInstance (desc.fileOrIdentifier)); - - if (result->audioUnit != nullptr) - { - result->initialise (rate, blockSize); - return result.release(); - } - } - - return nullptr; -} - -StringArray AudioUnitPluginFormat::searchPathsForPlugins (const FileSearchPath&, bool /*recursive*/) -{ - StringArray result; - AudioComponent comp = nullptr; - - for (;;) - { - AudioComponentDescription desc; - zerostruct (desc); - - comp = AudioComponentFindNext (comp, &desc); - - if (comp == nullptr) - break; - - AudioComponentGetDescription (comp, &desc); - - if (desc.componentType == kAudioUnitType_MusicDevice - || desc.componentType == kAudioUnitType_MusicEffect - || desc.componentType == kAudioUnitType_Effect - || desc.componentType == kAudioUnitType_Generator - || desc.componentType == kAudioUnitType_Panner) - { - result.add (AudioUnitFormatHelpers::createPluginIdentifier (desc)); - } - } - - return result; -} - -bool AudioUnitPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) -{ - AudioComponentDescription desc; - - String name, version, manufacturer; - if (AudioUnitFormatHelpers::getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer)) - return AudioComponentFindNext (nullptr, &desc) != nullptr; - - const File f (File::createFileWithoutCheckingPath (fileOrIdentifier)); - - return f.hasFileExtension (".component") - && f.isDirectory(); -} - -String AudioUnitPluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) -{ - AudioComponentDescription desc; - String name, version, manufacturer; - AudioUnitFormatHelpers::getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer); - - if (name.isEmpty()) - name = fileOrIdentifier; - - return name; -} - -bool AudioUnitPluginFormat::pluginNeedsRescanning (const PluginDescription& desc) -{ - AudioComponentDescription newDesc; - String name, version, manufacturer; - - return ! (AudioUnitFormatHelpers::getComponentDescFromIdentifier (desc.fileOrIdentifier, newDesc, - name, version, manufacturer) - && version == desc.version); -} - -bool AudioUnitPluginFormat::doesPluginStillExist (const PluginDescription& desc) -{ - if (desc.fileOrIdentifier.startsWithIgnoreCase (AudioUnitFormatHelpers::auIdentifierPrefix)) - return fileMightContainThisPluginType (desc.fileOrIdentifier); - - return File (desc.fileOrIdentifier).exists(); -} - -FileSearchPath AudioUnitPluginFormat::getDefaultLocationsToSearch() -{ - return FileSearchPath(); -} - -#undef JUCE_AU_LOG - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp deleted file mode 100755 index 1bb2413..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp +++ /dev/null @@ -1,703 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_PLUGINHOST_LADSPA && JUCE_LINUX - -} // (juce namespace) - -#include - -namespace juce -{ - -static int shellLADSPAUIDToCreate = 0; -static int insideLADSPACallback = 0; - -#define JUCE_LADSPA_LOGGING 1 - -#if JUCE_LADSPA_LOGGING - #define JUCE_LADSPA_LOG(x) Logger::writeToLog (x); -#else - #define JUCE_LADSPA_LOG(x) -#endif - -//============================================================================== -class LADSPAModuleHandle : public ReferenceCountedObject -{ -public: - LADSPAModuleHandle (const File& f) - : file (f), moduleMain (nullptr) - { - getActiveModules().add (this); - } - - ~LADSPAModuleHandle() - { - getActiveModules().removeFirstMatchingValue (this); - close(); - } - - typedef ReferenceCountedObjectPtr Ptr; - - static Array & getActiveModules() - { - static Array activeModules; - return activeModules; - } - - static LADSPAModuleHandle* findOrCreateModule (const File& file) - { - for (int i = getActiveModules().size(); --i >= 0;) - { - LADSPAModuleHandle* const module = getActiveModules().getUnchecked(i); - - if (module->file == file) - return module; - } - - ++insideLADSPACallback; - shellLADSPAUIDToCreate = 0; - - JUCE_LADSPA_LOG ("Loading LADSPA module: " + file.getFullPathName()); - - ScopedPointer m (new LADSPAModuleHandle (file)); - - if (! m->open()) - m = nullptr; - - --insideLADSPACallback; - - return m.release(); - } - - File file; - LADSPA_Descriptor_Function moduleMain; - -private: - DynamicLibrary module; - - bool open() - { - module.open (file.getFullPathName()); - moduleMain = (LADSPA_Descriptor_Function) module.getFunction ("ladspa_descriptor"); - return moduleMain != nullptr; - } - - void close() - { - module.close(); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LADSPAModuleHandle) -}; - - -//============================================================================== -class LADSPAPluginInstance : public AudioPluginInstance -{ -public: - LADSPAPluginInstance (const LADSPAModuleHandle::Ptr& m) - : module (m), plugin (nullptr), handle (nullptr), - initialised (false), tempBuffer (1, 1) - { - ++insideLADSPACallback; - - name = module->file.getFileNameWithoutExtension(); - - JUCE_LADSPA_LOG ("Creating LADSPA instance: " + name); - - if (module->moduleMain != nullptr) - { - plugin = module->moduleMain (shellLADSPAUIDToCreate); - - if (plugin == nullptr) - { - JUCE_LADSPA_LOG ("Cannot find any valid descriptor in shared library"); - --insideLADSPACallback; - return; - } - } - else - { - JUCE_LADSPA_LOG ("Cannot find any valid plugin in shared library"); - --insideLADSPACallback; - return; - } - - const double sampleRate = getSampleRate() > 0 ? getSampleRate() : 44100.0; - - handle = plugin->instantiate (plugin, (uint32) sampleRate); - - --insideLADSPACallback; - } - - ~LADSPAPluginInstance() - { - const ScopedLock sl (lock); - - jassert (insideLADSPACallback == 0); - - if (handle != nullptr && plugin != nullptr && plugin->cleanup != nullptr) - plugin->cleanup (handle); - - initialised = false; - module = nullptr; - plugin = nullptr; - handle = nullptr; - } - - void initialise (double initialSampleRate, int initialBlockSize) - { - setPlayConfigDetails (inputs.size(), outputs.size(), initialSampleRate, initialBlockSize); - - if (initialised || plugin == nullptr || handle == nullptr) - return; - - JUCE_LADSPA_LOG ("Initialising LADSPA: " + name); - - initialised = true; - - inputs.clear(); - outputs.clear(); - parameters.clear(); - - for (unsigned int i = 0; i < plugin->PortCount; ++i) - { - const LADSPA_PortDescriptor portDesc = plugin->PortDescriptors[i]; - - if ((portDesc & LADSPA_PORT_CONTROL) != 0) - parameters.add (i); - - if ((portDesc & LADSPA_PORT_AUDIO) != 0) - { - if ((portDesc & LADSPA_PORT_INPUT) != 0) inputs.add (i); - if ((portDesc & LADSPA_PORT_OUTPUT) != 0) outputs.add (i); - } - } - - parameterValues.calloc (parameters.size()); - - for (int i = 0; i < parameters.size(); ++i) - plugin->connect_port (handle, parameters[i], &(parameterValues[i].scaled)); - - setPlayConfigDetails (inputs.size(), outputs.size(), initialSampleRate, initialBlockSize); - - setCurrentProgram (0); - setLatencySamples (0); - - // Some plugins crash if this doesn't happen: - if (plugin->activate != nullptr) plugin->activate (handle); - if (plugin->deactivate != nullptr) plugin->deactivate (handle); - } - - //============================================================================== - // AudioPluginInstance methods: - - void fillInPluginDescription (PluginDescription& desc) const - { - desc.name = getName(); - desc.fileOrIdentifier = module->file.getFullPathName(); - desc.uid = getUID(); - desc.lastFileModTime = module->file.getLastModificationTime(); - desc.pluginFormatName = "LADSPA"; - desc.category = getCategory(); - desc.manufacturerName = plugin != nullptr ? String (plugin->Maker) : String(); - desc.version = getVersion(); - desc.numInputChannels = getNumInputChannels(); - desc.numOutputChannels = getNumOutputChannels(); - desc.isInstrument = false; - } - - const String getName() const - { - if (plugin != nullptr && plugin->Label != nullptr) - return plugin->Label; - - return name; - } - - int getUID() const - { - if (plugin != nullptr && plugin->UniqueID != 0) - return (int) plugin->UniqueID; - - return module->file.hashCode(); - } - - String getVersion() const { return LADSPA_VERSION; } - String getCategory() const { return "Effect"; } - - bool acceptsMidi() const { return false; } - bool producesMidi() const { return false; } - - bool silenceInProducesSilenceOut() const { return plugin == nullptr; } // ..any way to get a proper answer for these? - double getTailLengthSeconds() const { return 0.0; } - - //============================================================================== - void prepareToPlay (double newSampleRate, int samplesPerBlockExpected) - { - setLatencySamples (0); - - initialise (newSampleRate, samplesPerBlockExpected); - - if (initialised) - { - tempBuffer.setSize (jmax (1, outputs.size()), samplesPerBlockExpected); - - // dodgy hack to force some plugins to initialise the sample rate.. - if (getNumParameters() > 0) - { - const float old = getParameter (0); - setParameter (0, (old < 0.5f) ? 1.0f : 0.0f); - setParameter (0, old); - } - - if (plugin->activate != nullptr) - plugin->activate (handle); - } - } - - void releaseResources() - { - if (handle != nullptr && plugin->deactivate != nullptr) - plugin->deactivate (handle); - - tempBuffer.setSize (1, 1); - } - - void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) - { - const int numSamples = buffer.getNumSamples(); - - if (initialised && plugin != nullptr && handle != nullptr) - { - for (int i = 0; i < inputs.size(); ++i) - plugin->connect_port (handle, inputs[i], - i < buffer.getNumChannels() ? buffer.getWritePointer (i) : nullptr); - - if (plugin->run != nullptr) - { - for (int i = 0; i < outputs.size(); ++i) - plugin->connect_port (handle, outputs.getUnchecked(i), - i < buffer.getNumChannels() ? buffer.getWritePointer (i) : nullptr); - - plugin->run (handle, numSamples); - return; - } - - if (plugin->run_adding != nullptr) - { - tempBuffer.setSize (outputs.size(), numSamples); - tempBuffer.clear(); - - for (int i = 0; i < outputs.size(); ++i) - plugin->connect_port (handle, outputs.getUnchecked(i), tempBuffer.getWritePointer (i)); - - plugin->run_adding (handle, numSamples); - - for (int i = 0; i < outputs.size(); ++i) - if (i < buffer.getNumChannels()) - buffer.copyFrom (i, 0, tempBuffer, i, 0, numSamples); - - return; - } - - jassertfalse; // no callback to use? - } - - for (int i = getNumInputChannels(); i < getNumOutputChannels(); ++i) - buffer.clear (i, 0, numSamples); - } - - bool isInputChannelStereoPair (int index) const { return isPositiveAndBelow (index, getNumInputChannels()); } - bool isOutputChannelStereoPair (int index) const { return isPositiveAndBelow (index, getNumInputChannels()); } - - const String getInputChannelName (const int index) const - { - if (isPositiveAndBelow (index, getNumInputChannels())) - return String (plugin->PortNames [inputs [index]]).trim(); - - return String(); - } - - const String getOutputChannelName (const int index) const - { - if (isPositiveAndBelow (index, getNumInputChannels())) - return String (plugin->PortNames [outputs [index]]).trim(); - - return String(); - } - - //============================================================================== - int getNumParameters() { return handle != nullptr ? parameters.size() : 0; } - - bool isParameterAutomatable (int index) const - { - return plugin != nullptr - && (plugin->PortDescriptors [parameters[index]] & LADSPA_PORT_INPUT) != 0; - } - - float getParameter (int index) - { - if (plugin != nullptr && isPositiveAndBelow (index, parameters.size())) - { - const ScopedLock sl (lock); - return parameterValues[index].unscaled; - } - - return 0.0f; - } - - void setParameter (int index, float newValue) - { - if (plugin != nullptr && isPositiveAndBelow (index, parameters.size())) - { - const ScopedLock sl (lock); - - ParameterValue& p = parameterValues[index]; - - if (p.unscaled != newValue) - p = ParameterValue (getNewParamScaled (plugin->PortRangeHints [parameters[index]], newValue), newValue); - } - } - - const String getParameterName (int index) - { - if (plugin != nullptr) - { - jassert (isPositiveAndBelow (index, parameters.size())); - return String (plugin->PortNames [parameters [index]]).trim(); - } - - return String(); - } - - const String getParameterText (int index) - { - if (plugin != nullptr) - { - jassert (index >= 0 && index < parameters.size()); - - const LADSPA_PortRangeHint& hint = plugin->PortRangeHints [parameters [index]]; - - if (LADSPA_IS_HINT_INTEGER (hint.HintDescriptor)) - return String ((int) parameterValues[index].scaled); - - return String (parameterValues[index].scaled, 4); - } - - return String(); - } - - //============================================================================== - int getNumPrograms() { return 0; } - int getCurrentProgram() { return 0; } - - void setCurrentProgram (int newIndex) - { - if (plugin != nullptr) - for (int i = 0; i < parameters.size(); ++i) - parameterValues[i] = getParamValue (plugin->PortRangeHints [parameters[i]]); - } - - const String getProgramName (int index) - { - // XXX - return String(); - } - - void changeProgramName (int index, const String& newName) - { - // XXX - } - - //============================================================================== - void getStateInformation (MemoryBlock& destData) - { - destData.setSize (sizeof (float) * getNumParameters()); - destData.fillWith (0); - - float* const p = (float*) ((char*) destData.getData()); - for (int i = 0; i < getNumParameters(); ++i) - p[i] = getParameter(i); - } - - void getCurrentProgramStateInformation (MemoryBlock& destData) - { - getStateInformation (destData); - } - - void setStateInformation (const void* data, int sizeInBytes) - { - const float* p = static_cast (data); - - for (int i = 0; i < getNumParameters(); ++i) - setParameter (i, p[i]); - } - - void setCurrentProgramStateInformation (const void* data, int sizeInBytes) - { - setStateInformation (data, sizeInBytes); - } - - bool hasEditor() const - { - return false; - } - - AudioProcessorEditor* createEditor() - { - return nullptr; - } - - bool isValid() const - { - return handle != nullptr; - } - - LADSPAModuleHandle::Ptr module; - const LADSPA_Descriptor* plugin; - -private: - LADSPA_Handle handle; - String name; - CriticalSection lock; - bool initialised; - AudioSampleBuffer tempBuffer; - Array inputs, outputs, parameters; - - struct ParameterValue - { - inline ParameterValue() noexcept : scaled (0), unscaled (0) {} - inline ParameterValue (float s, float u) noexcept : scaled (s), unscaled (u) {} - - float scaled, unscaled; - }; - - HeapBlock parameterValues; - - //============================================================================== - static float scaledValue (float low, float high, float alpha, bool useLog) noexcept - { - if (useLog && low > 0 && high > 0) - return expf (logf (low) * (1.0f - alpha) + logf (high) * alpha); - - return low + (high - low) * alpha; - } - - static float toIntIfNecessary (const LADSPA_PortRangeHintDescriptor& desc, float value) - { - return LADSPA_IS_HINT_INTEGER (desc) ? ((float) (int) value) : value; - } - - float getNewParamScaled (const LADSPA_PortRangeHint& hint, float newValue) const - { - const LADSPA_PortRangeHintDescriptor& desc = hint.HintDescriptor; - - if (LADSPA_IS_HINT_TOGGLED (desc)) - return (newValue < 0.5f) ? 0.0f : 1.0f; - - const float scale = LADSPA_IS_HINT_SAMPLE_RATE (desc) ? (float) getSampleRate() : 1.0f; - const float lower = hint.LowerBound * scale; - const float upper = hint.UpperBound * scale; - - if (LADSPA_IS_HINT_BOUNDED_BELOW (desc) && LADSPA_IS_HINT_BOUNDED_ABOVE (desc)) - return toIntIfNecessary (desc, scaledValue (lower, upper, newValue, LADSPA_IS_HINT_LOGARITHMIC (desc))); - - if (LADSPA_IS_HINT_BOUNDED_BELOW (desc)) return toIntIfNecessary (desc, newValue); - if (LADSPA_IS_HINT_BOUNDED_ABOVE (desc)) return toIntIfNecessary (desc, newValue * upper); - - return 0.0f; - } - - ParameterValue getParamValue (const LADSPA_PortRangeHint& hint) const - { - const LADSPA_PortRangeHintDescriptor& desc = hint.HintDescriptor; - - if (LADSPA_IS_HINT_HAS_DEFAULT (desc)) - { - if (LADSPA_IS_HINT_DEFAULT_0 (desc)) return ParameterValue(); - if (LADSPA_IS_HINT_DEFAULT_1 (desc)) return ParameterValue (1.0f, 1.0f); - if (LADSPA_IS_HINT_DEFAULT_100 (desc)) return ParameterValue (100.0f, 0.5f); - if (LADSPA_IS_HINT_DEFAULT_440 (desc)) return ParameterValue (440.0f, 0.5f); - - const float scale = LADSPA_IS_HINT_SAMPLE_RATE (desc) ? (float) getSampleRate() : 1.0f; - const float lower = hint.LowerBound * scale; - const float upper = hint.UpperBound * scale; - - if (LADSPA_IS_HINT_BOUNDED_BELOW (desc) && LADSPA_IS_HINT_DEFAULT_MINIMUM (desc)) return ParameterValue (lower, 0.0f); - if (LADSPA_IS_HINT_BOUNDED_ABOVE (desc) && LADSPA_IS_HINT_DEFAULT_MAXIMUM (desc)) return ParameterValue (upper, 1.0f); - - if (LADSPA_IS_HINT_BOUNDED_BELOW (desc)) - { - const bool useLog = LADSPA_IS_HINT_LOGARITHMIC (desc); - - if (LADSPA_IS_HINT_DEFAULT_LOW (desc)) return ParameterValue (scaledValue (lower, upper, 0.25f, useLog), 0.25f); - if (LADSPA_IS_HINT_DEFAULT_MIDDLE (desc)) return ParameterValue (scaledValue (lower, upper, 0.50f, useLog), 0.50f); - if (LADSPA_IS_HINT_DEFAULT_HIGH (desc)) return ParameterValue (scaledValue (lower, upper, 0.75f, useLog), 0.75f); - } - } - - return ParameterValue(); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LADSPAPluginInstance) -}; - - -//============================================================================== -//============================================================================== -LADSPAPluginFormat::LADSPAPluginFormat() {} -LADSPAPluginFormat::~LADSPAPluginFormat() {} - -void LADSPAPluginFormat::findAllTypesForFile (OwnedArray & results, - const String& fileOrIdentifier) -{ - if (! fileMightContainThisPluginType (fileOrIdentifier)) - return; - - PluginDescription desc; - desc.fileOrIdentifier = fileOrIdentifier; - desc.uid = 0; - - ScopedPointer instance (dynamic_cast (createInstanceFromDescription (desc, 44100.0, 512))); - - if (instance == nullptr || ! instance->isValid()) - return; - - instance->initialise (44100.0, 512); - - instance->fillInPluginDescription (desc); - - if (instance->module->moduleMain != nullptr) - { - for (int uid = 0;; ++uid) - { - if (const LADSPA_Descriptor* plugin = instance->module->moduleMain (uid)) - { - desc.uid = uid; - desc.name = plugin->Name != nullptr ? plugin->Name : "Unknown"; - - if (! arrayContainsPlugin (results, desc)) - results.add (new PluginDescription (desc)); - } - else - { - break; - } - } - } -} - -AudioPluginInstance* LADSPAPluginFormat::createInstanceFromDescription (const PluginDescription& desc, - double sampleRate, int blockSize) -{ - ScopedPointer result; - - if (fileMightContainThisPluginType (desc.fileOrIdentifier)) - { - File file (desc.fileOrIdentifier); - - const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); - file.getParentDirectory().setAsCurrentWorkingDirectory(); - - const LADSPAModuleHandle::Ptr module (LADSPAModuleHandle::findOrCreateModule (file)); - - if (module != nullptr) - { - shellLADSPAUIDToCreate = desc.uid; - - result = new LADSPAPluginInstance (module); - - if (result->plugin != nullptr && result->isValid()) - result->initialise (sampleRate, blockSize); - else - result = nullptr; - } - - previousWorkingDirectory.setAsCurrentWorkingDirectory(); - } - - return result.release(); -} - -bool LADSPAPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) -{ - const File f (File::createFileWithoutCheckingPath (fileOrIdentifier)); - return f.existsAsFile() && f.hasFileExtension (".so"); -} - -String LADSPAPluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) -{ - return fileOrIdentifier; -} - -bool LADSPAPluginFormat::pluginNeedsRescanning (const PluginDescription& desc) -{ - return File (desc.fileOrIdentifier).getLastModificationTime() != desc.lastFileModTime; -} - -bool LADSPAPluginFormat::doesPluginStillExist (const PluginDescription& desc) -{ - return File::createFileWithoutCheckingPath (desc.fileOrIdentifier).exists(); -} - -StringArray LADSPAPluginFormat::searchPathsForPlugins (const FileSearchPath& directoriesToSearch, const bool recursive) -{ - StringArray results; - - for (int j = 0; j < directoriesToSearch.getNumPaths(); ++j) - recursiveFileSearch (results, directoriesToSearch[j], recursive); - - return results; -} - -void LADSPAPluginFormat::recursiveFileSearch (StringArray& results, const File& dir, const bool recursive) -{ - DirectoryIterator iter (dir, false, "*", File::findFilesAndDirectories); - - while (iter.next()) - { - const File f (iter.getFile()); - bool isPlugin = false; - - if (fileMightContainThisPluginType (f.getFullPathName())) - { - isPlugin = true; - results.add (f.getFullPathName()); - } - - if (recursive && (! isPlugin) && f.isDirectory()) - recursiveFileSearch (results, f, true); - } -} - -FileSearchPath LADSPAPluginFormat::getDefaultLocationsToSearch() -{ - return FileSearchPath (SystemStats::getEnvironmentVariable ("LADSPA_PATH", - "/usr/lib/ladspa;/usr/local/lib/ladspa;~/.ladspa") - .replace (":", ";")); -} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h deleted file mode 100755 index 21d3167..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if (JUCE_PLUGINHOST_LADSPA && JUCE_LINUX) || DOXYGEN - -//============================================================================== -/** - Implements a plugin format manager for LADSPA plugins. -*/ -class JUCE_API LADSPAPluginFormat : public AudioPluginFormat -{ -public: - //============================================================================== - LADSPAPluginFormat(); - ~LADSPAPluginFormat(); - - //============================================================================== - String getName() const override { return "LADSPA"; } - void findAllTypesForFile (OwnedArray&, const String& fileOrIdentifier) override; - AudioPluginInstance* createInstanceFromDescription (const PluginDescription&, double, int) override; - bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; - String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; - bool pluginNeedsRescanning (const PluginDescription&) override; - StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive) override; - bool doesPluginStillExist (const PluginDescription&) override; - FileSearchPath getDefaultLocationsToSearch() override; - bool canScanForPlugins() const override { return true; } - -private: - void recursiveFileSearch (StringArray&, const File&, bool recursive); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LADSPAPluginFormat) -}; - - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h deleted file mode 100755 index d7e66cd..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Common.h +++ /dev/null @@ -1,420 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_VST3COMMON_H_INCLUDED -#define JUCE_VST3COMMON_H_INCLUDED - -//============================================================================== -#define JUCE_DECLARE_VST3_COM_REF_METHODS \ - Steinberg::uint32 PLUGIN_API addRef() override { return (Steinberg::uint32) ++refCount; } \ - Steinberg::uint32 PLUGIN_API release() override { const int r = --refCount; if (r == 0) delete this; return (Steinberg::uint32) r; } - -#define JUCE_DECLARE_VST3_COM_QUERY_METHODS \ - Steinberg::tresult PLUGIN_API queryInterface (const Steinberg::TUID, void** obj) override \ - { \ - jassertfalse; \ - *obj = nullptr; \ - return Steinberg::kNotImplemented; \ - } - -static bool doUIDsMatch (const Steinberg::TUID a, const Steinberg::TUID b) noexcept -{ - return std::memcmp (a, b, sizeof (Steinberg::TUID)) == 0; -} - -#define TEST_FOR_AND_RETURN_IF_VALID(iidToTest, ClassType) \ - if (doUIDsMatch (iidToTest, ClassType::iid)) \ - { \ - addRef(); \ - *obj = dynamic_cast (this); \ - return Steinberg::kResultOk; \ - } - -#define TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID(iidToTest, CommonClassType, SourceClassType) \ - if (doUIDsMatch (iidToTest, CommonClassType::iid)) \ - { \ - addRef(); \ - *obj = (CommonClassType*) static_cast (this); \ - return Steinberg::kResultOk; \ - } - -//============================================================================== -static juce::String toString (const Steinberg::char8* string) noexcept { return juce::String (string); } -static juce::String toString (const Steinberg::char16* string) noexcept { return juce::String (juce::CharPointer_UTF16 ((juce::CharPointer_UTF16::CharType*) string)); } - -// NB: The casts are handled by a Steinberg::UString operator -static juce::String toString (const Steinberg::UString128& string) noexcept { return toString (static_cast (string)); } -static juce::String toString (const Steinberg::UString256& string) noexcept { return toString (static_cast (string)); } - -static void toString128 (Steinberg::Vst::String128 result, const juce::String& source) -{ - Steinberg::UString (result, 128).fromAscii (source.toUTF8()); -} - -static Steinberg::Vst::TChar* toString (const juce::String& source) noexcept -{ - return reinterpret_cast (source.toUTF16().getAddress()); -} - -#if JUCE_WINDOWS - static const Steinberg::FIDString defaultVST3WindowType = Steinberg::kPlatformTypeHWND; -#else - static const Steinberg::FIDString defaultVST3WindowType = Steinberg::kPlatformTypeNSView; -#endif - - -//============================================================================== -static Steinberg::Vst::SpeakerArrangement getArrangementForBus (Steinberg::Vst::IAudioProcessor* processor, - bool isInput, int busIndex) -{ - Steinberg::Vst::SpeakerArrangement arrangement = Steinberg::Vst::SpeakerArr::kEmpty; - - if (processor != nullptr) - processor->getBusArrangement (isInput ? Steinberg::Vst::kInput : Steinberg::Vst::kOutput, - (Steinberg::int32) busIndex, arrangement); - - return arrangement; -} - -/** For the sake of simplicity, there can only be 1 arrangement type per channel count. - i.e.: 4 channels == k31Cine OR k40Cine -*/ -static Steinberg::Vst::SpeakerArrangement getArrangementForNumChannels (int numChannels) noexcept -{ - using namespace Steinberg::Vst::SpeakerArr; - - switch (numChannels) - { - case 0: return kEmpty; - case 1: return kMono; - case 2: return kStereo; - case 3: return k30Cine; - case 4: return k31Cine; - case 5: return k50; - case 6: return k51; - case 7: return k61Cine; - case 8: return k71CineFullFront; - case 9: return k90; - case 10: return k91; - case 11: return k101; - case 12: return k111; - case 13: return k130; - case 14: return k131; - case 24: return (Steinberg::Vst::SpeakerArrangement) 1929904127; // k222 - default: break; - } - - jassert (numChannels >= 0); - - juce::BigInteger bi; - bi.setRange (0, jmin (numChannels, (int) (sizeof (Steinberg::Vst::SpeakerArrangement) * 8)), true); - return (Steinberg::Vst::SpeakerArrangement) bi.toInt64(); -} - -//============================================================================== -template -class ComSmartPtr -{ -public: - ComSmartPtr() noexcept : source (nullptr) {} - ComSmartPtr (ObjectType* object, bool autoAddRef = true) noexcept : source (object) { if (source != nullptr && autoAddRef) source->addRef(); } - ComSmartPtr (const ComSmartPtr& other) noexcept : source (other.source) { if (source != nullptr) source->addRef(); } - ~ComSmartPtr() { if (source != nullptr) source->release(); } - - operator ObjectType*() const noexcept { return source; } - ObjectType* get() const noexcept { return source; } - ObjectType& operator*() const noexcept { return *source; } - ObjectType* operator->() const noexcept { return source; } - - ComSmartPtr& operator= (const ComSmartPtr& other) { return operator= (other.source); } - - ComSmartPtr& operator= (ObjectType* const newObjectToTakePossessionOf) - { - ComSmartPtr p (newObjectToTakePossessionOf); - std::swap (p.source, source); - return *this; - } - - bool operator== (ObjectType* const other) noexcept { return source == other; } - bool operator!= (ObjectType* const other) noexcept { return source != other; } - - bool loadFrom (Steinberg::FUnknown* o) - { - *this = nullptr; - return o != nullptr && o->queryInterface (ObjectType::iid, (void**) &source) == Steinberg::kResultOk; - } - - bool loadFrom (Steinberg::IPluginFactory* factory, const Steinberg::TUID& uuid) - { - jassert (factory != nullptr); - *this = nullptr; - return factory->createInstance (uuid, ObjectType::iid, (void**) &source) == Steinberg::kResultOk; - } - -private: - ObjectType* source; -}; - -//============================================================================== -class MidiEventList : public Steinberg::Vst::IEventList -{ -public: - MidiEventList() {} - virtual ~MidiEventList() {} - - JUCE_DECLARE_VST3_COM_REF_METHODS - JUCE_DECLARE_VST3_COM_QUERY_METHODS - - //============================================================================== - void clear() - { - events.clearQuick(); - } - - Steinberg::int32 PLUGIN_API getEventCount() override - { - return (Steinberg::int32) events.size(); - } - - // NB: This has to cope with out-of-range indexes from some plugins. - Steinberg::tresult PLUGIN_API getEvent (Steinberg::int32 index, Steinberg::Vst::Event& e) override - { - if (isPositiveAndBelow ((int) index, events.size())) - { - e = events.getReference ((int) index); - return Steinberg::kResultTrue; - } - - return Steinberg::kResultFalse; - } - - Steinberg::tresult PLUGIN_API addEvent (Steinberg::Vst::Event& e) override - { - events.add (e); - return Steinberg::kResultTrue; - } - - //============================================================================== - static void toMidiBuffer (MidiBuffer& result, Steinberg::Vst::IEventList& eventList) - { - const int32 numEvents = eventList.getEventCount(); - - for (Steinberg::int32 i = 0; i < numEvents; ++i) - { - Steinberg::Vst::Event e; - - if (eventList.getEvent (i, e) == Steinberg::kResultOk) - { - switch (e.type) - { - case Steinberg::Vst::Event::kNoteOnEvent: - result.addEvent (MidiMessage::noteOn (createSafeChannel (e.noteOn.channel), - createSafeNote (e.noteOn.pitch), - (Steinberg::uint8) denormaliseToMidiValue (e.noteOn.velocity)), - e.sampleOffset); - break; - - case Steinberg::Vst::Event::kNoteOffEvent: - result.addEvent (MidiMessage::noteOff (createSafeChannel (e.noteOff.channel), - createSafeNote (e.noteOff.pitch), - (Steinberg::uint8) denormaliseToMidiValue (e.noteOff.velocity)), - e.sampleOffset); - break; - - case Steinberg::Vst::Event::kPolyPressureEvent: - result.addEvent (MidiMessage::aftertouchChange (createSafeChannel (e.polyPressure.channel), - createSafeNote (e.polyPressure.pitch), - denormaliseToMidiValue (e.polyPressure.pressure)), - e.sampleOffset); - break; - - case Steinberg::Vst::Event::kDataEvent: - result.addEvent (MidiMessage::createSysExMessage (e.data.bytes, e.data.size), - e.sampleOffset); - break; - - default: - break; - } - } - } - } - - static void toEventList (Steinberg::Vst::IEventList& result, MidiBuffer& midiBuffer) - { - MidiBuffer::Iterator iterator (midiBuffer); - MidiMessage msg; - int midiEventPosition = 0; - - enum { maxNumEvents = 2048 }; // Steinberg's Host Checker states that no more than 2048 events are allowed at once - int numEvents = 0; - - while (iterator.getNextEvent (msg, midiEventPosition)) - { - if (++numEvents > maxNumEvents) - break; - - Steinberg::Vst::Event e = { 0 }; - - if (msg.isNoteOn()) - { - e.type = Steinberg::Vst::Event::kNoteOnEvent; - e.noteOn.channel = createSafeChannel (msg.getChannel()); - e.noteOn.pitch = createSafeNote (msg.getNoteNumber()); - e.noteOn.velocity = normaliseMidiValue (msg.getVelocity()); - e.noteOn.length = 0; - e.noteOn.tuning = 0.0f; - e.noteOn.noteId = -1; - } - else if (msg.isNoteOff()) - { - e.type = Steinberg::Vst::Event::kNoteOffEvent; - e.noteOff.channel = createSafeChannel (msg.getChannel()); - e.noteOff.pitch = createSafeNote (msg.getNoteNumber()); - e.noteOff.velocity = normaliseMidiValue (msg.getVelocity()); - e.noteOff.tuning = 0.0f; - e.noteOff.noteId = -1; - } - else if (msg.isSysEx()) - { - e.type = Steinberg::Vst::Event::kDataEvent; - e.data.bytes = msg.getSysExData(); - e.data.size = msg.getSysExDataSize(); - e.data.type = Steinberg::Vst::DataEvent::kMidiSysEx; - } - else if (msg.isAftertouch()) - { - e.type = Steinberg::Vst::Event::kPolyPressureEvent; - e.polyPressure.channel = createSafeChannel (msg.getChannel()); - e.polyPressure.pitch = createSafeNote (msg.getNoteNumber()); - e.polyPressure.pressure = normaliseMidiValue (msg.getAfterTouchValue()); - } - else - { - continue; - } - - e.busIndex = 0; - e.sampleOffset = midiEventPosition; - - result.addEvent (e); - } - } - -private: - Array events; - Atomic refCount; - - static Steinberg::int16 createSafeChannel (int channel) noexcept { return (Steinberg::int16) jlimit (0, 15, channel - 1); } - static int createSafeChannel (Steinberg::int16 channel) noexcept { return (int) jlimit (1, 16, channel + 1); } - - static Steinberg::int16 createSafeNote (int note) noexcept { return (Steinberg::int16) jlimit (0, 127, note); } - static int createSafeNote (Steinberg::int16 note) noexcept { return jlimit (0, 127, (int) note); } - - static float normaliseMidiValue (int value) noexcept { return jlimit (0.0f, 1.0f, (float) value / 127.0f); } - static int denormaliseToMidiValue (float value) noexcept { return roundToInt (jlimit (0.0f, 127.0f, value * 127.0f)); } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiEventList) -}; - -//============================================================================== -namespace VST3BufferExchange -{ - typedef Array Bus; - typedef Array BusMap; - - /** Assigns a series of AudioSampleBuffer's channels to an AudioBusBuffers' - - @warning For speed, does not check the channel count and offsets - according to the AudioSampleBuffer - */ - void associateBufferTo (Steinberg::Vst::AudioBusBuffers& vstBuffers, - Bus& bus, - AudioSampleBuffer& buffer, - int numChannels, int channelStartOffset, - int sampleOffset = 0) - { - const int channelEnd = numChannels + channelStartOffset; - jassert (channelEnd >= 0 && channelEnd <= buffer.getNumChannels()); - - bus.clearQuick(); - - for (int i = channelStartOffset; i < channelEnd; ++i) - bus.add (buffer.getWritePointer (i, sampleOffset)); - - vstBuffers.channelBuffers32 = bus.getRawDataPointer(); - vstBuffers.numChannels = numChannels; - vstBuffers.silenceFlags = 0; - } - - static void mapArrangementToBusses (int& channelIndexOffset, int index, - Array& result, - BusMap& busMapToUse, Steinberg::Vst::SpeakerArrangement arrangement, - AudioSampleBuffer& source) - { - const int numChansForBus = BigInteger ((juce::int64) arrangement).countNumberOfSetBits(); - - if (index >= result.size()) - result.add (Steinberg::Vst::AudioBusBuffers()); - - if (index >= busMapToUse.size()) - busMapToUse.add (Bus()); - - if (numChansForBus > 0) - { - associateBufferTo (result.getReference (index), - busMapToUse.getReference (index), - source, numChansForBus, channelIndexOffset); - } - - channelIndexOffset += numChansForBus; - } - - static void mapBufferToBusses (Array& result, BusMap& busMapToUse, - const Array& arrangements, - AudioSampleBuffer& source) - { - int channelIndexOffset = 0; - - for (int i = 0; i < arrangements.size(); ++i) - mapArrangementToBusses (channelIndexOffset, i, result, busMapToUse, - arrangements.getUnchecked (i), source); - } - - static void mapBufferToBusses (Array& result, - Steinberg::Vst::IAudioProcessor& processor, - BusMap& busMapToUse, bool isInput, int numBusses, - AudioSampleBuffer& source) - { - int channelIndexOffset = 0; - - for (int i = 0; i < numBusses; ++i) - mapArrangementToBusses (channelIndexOffset, i, - result, busMapToUse, - getArrangementForBus (&processor, isInput, i), - source); - } -} - -#endif // JUCE_VST3COMMON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h deleted file mode 100755 index ffb90e8..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3Headers.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_VST3HEADERS_H_INCLUDED -#define JUCE_VST3HEADERS_H_INCLUDED - -#undef Point -#undef Component - -// Wow, those Steinberg guys really don't worry too much about compiler warnings. -#if _MSC_VER - #pragma warning (disable: 4505) - #pragma warning (push, 0) - #pragma warning (disable: 4702) -#elif __clang__ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wnon-virtual-dtor" - #pragma clang diagnostic ignored "-Wreorder" - #pragma clang diagnostic ignored "-Wunsequenced" - #pragma clang diagnostic ignored "-Wint-to-pointer-cast" - #pragma clang diagnostic ignored "-Wunused-parameter" - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Woverloaded-virtual" - #pragma clang diagnostic ignored "-Wshadow" - #pragma clang diagnostic ignored "-Wdeprecated-register" -#endif - -/* These files come with the Steinberg VST3 SDK - to get them, you'll need to - visit the Steinberg website and agree to whatever is currently required to - get them. - - Then, you'll need to make sure your include path contains your "VST3 SDK" - directory (or whatever you've named it on your machine). The Introjucer has - a special box for setting this path. -*/ -#if JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -#else - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - -//============================================================================== -namespace Steinberg -{ - /** Missing IIDs */ - DEF_CLASS_IID (IPluginBase) - DEF_CLASS_IID (IPlugView) - DEF_CLASS_IID (IPlugFrame) - DEF_CLASS_IID (IBStream) - DEF_CLASS_IID (ISizeableStream) - DEF_CLASS_IID (IPluginFactory) - DEF_CLASS_IID (IPluginFactory2) - DEF_CLASS_IID (IPluginFactory3) -} -#endif //JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY - -#if _MSC_VER - #pragma warning (pop) -#elif __clang__ - #pragma clang diagnostic pop -#endif - -//============================================================================== -#undef ASSERT -#undef WARNING -#undef PRINTSYSERROR -#undef DEBUGSTR -#undef DBPRT0 -#undef DBPRT1 -#undef DBPRT2 -#undef DBPRT3 -#undef DBPRT4 -#undef DBPRT5 -#undef min -#undef max -#undef MIN -#undef MAX -#undef calloc -#undef free -#undef malloc -#undef realloc -#undef NEW -#undef NEWVEC -#undef VERIFY -#undef VERIFY_IS -#undef VERIFY_NOT -#undef META_CREATE_FUNC -#undef CLASS_CREATE_FUNC -#undef SINGLE_CREATE_FUNC -#undef _META_CLASS -#undef _META_CLASS_IFACE -#undef _META_CLASS_SINGLE -#undef META_CLASS -#undef META_CLASS_IFACE -#undef META_CLASS_SINGLE -#undef SINGLETON -#undef OBJ_METHODS -#undef QUERY_INTERFACE -#undef LICENCE_UID -#undef BEGIN_FACTORY -#undef DEF_CLASS -#undef DEF_CLASS1 -#undef DEF_CLASS2 -#undef DEF_CLASS_W -#undef END_FACTORY -#undef Point -#undef Component - -#endif // JUCE_VST3HEADERS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp deleted file mode 100755 index 1bef497..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ /dev/null @@ -1,2554 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_PLUGINHOST_VST3 - -} // namespace juce - -#if JucePlugin_Build_VST3 - #undef JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY - #define JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY 1 -#endif - -#include -#include "juce_VST3Headers.h" - -#undef JUCE_VST3HEADERS_INCLUDE_HEADERS_ONLY - -namespace juce -{ - -#include "juce_VST3Common.h" - -using namespace Steinberg; - -//============================================================================== -struct VST3Classes -{ - -#ifndef JUCE_VST3_DEBUGGING - #define JUCE_VST3_DEBUGGING 0 -#endif - -#if JUCE_VST3_DEBUGGING - #define VST3_DBG(a) Logger::writeToLog (a); -#else - #define VST3_DBG(a) -#endif - -#if JUCE_DEBUG -static int warnOnFailure (int result) -{ - const char* message = "Unknown result!"; - - switch (result) - { - case kResultOk: return result; - case kNotImplemented: message = "kNotImplemented"; break; - case kNoInterface: message = "kNoInterface"; break; - case kResultFalse: message = "kResultFalse"; break; - case kInvalidArgument: message = "kInvalidArgument"; break; - case kInternalError: message = "kInternalError"; break; - case kNotInitialized: message = "kNotInitialized"; break; - case kOutOfMemory: message = "kOutOfMemory"; break; - default: break; - } - - DBG (message); - return result; -} -#else - #define warnOnFailure(x) x -#endif - -//============================================================================== -static int getHashForTUID (const TUID& tuid) noexcept -{ - int value = 0; - - for (int i = 0; i < numElementsInArray (tuid); ++i) - value = (value * 31) + tuid[i]; - - return value; -} - -template -static void fillDescriptionWith (PluginDescription& description, ObjectType& object) -{ - description.version = toString (object.version).trim(); - description.category = toString (object.subCategories).trim(); - - if (description.manufacturerName.trim().isEmpty()) - description.manufacturerName = toString (object.vendor).trim(); -} - -static void createPluginDescription (PluginDescription& description, - const File& pluginFile, const String& company, const String& name, - const PClassInfo& info, PClassInfo2* info2, PClassInfoW* infoW, - int numInputs, int numOutputs) -{ - description.fileOrIdentifier = pluginFile.getFullPathName(); - description.lastFileModTime = pluginFile.getLastModificationTime(); - description.manufacturerName = company; - description.name = name; - description.descriptiveName = name; - description.pluginFormatName = "VST3"; - description.numInputChannels = numInputs; - description.numOutputChannels = numOutputs; - description.uid = getHashForTUID (info.cid); - - if (infoW != nullptr) fillDescriptionWith (description, *infoW); - else if (info2 != nullptr) fillDescriptionWith (description, *info2); - - if (description.category.isEmpty()) - description.category = toString (info.category).trim(); - - description.isInstrument = description.category.containsIgnoreCase ("Instrument"); // This seems to be the only way to find that out! ARGH! -} - -static int getNumSingleDirectionBussesFor (Vst::IComponent* component, - bool checkInputs, - bool checkAudioChannels) -{ - jassert (component != nullptr); - - return (int) component->getBusCount (checkAudioChannels ? Vst::kAudio : Vst::kEvent, - checkInputs ? Vst::kInput : Vst::kOutput); -} - -/** Gives the total number of channels for a particular type of bus direction and media type */ -static int getNumSingleDirectionChannelsFor (Vst::IComponent* component, - bool checkInputs, - bool checkAudioChannels) -{ - jassert (component != nullptr); - - const Vst::BusDirections direction = checkInputs ? Vst::kInput : Vst::kOutput; - const Vst::MediaTypes mediaType = checkAudioChannels ? Vst::kAudio : Vst::kEvent; - const Steinberg::int32 numBuses = component->getBusCount (mediaType, direction); - - int numChannels = 0; - - for (Steinberg::int32 i = numBuses; --i >= 0;) - { - Vst::BusInfo busInfo; - warnOnFailure (component->getBusInfo (mediaType, direction, i, busInfo)); - numChannels += (int) busInfo.channelCount; - } - - return numChannels; -} - -static void setStateForAllBussesOfType (Vst::IComponent* component, - bool state, - bool activateInputs, - bool activateAudioChannels) -{ - jassert (component != nullptr); - - const Vst::BusDirections direction = activateInputs ? Vst::kInput : Vst::kOutput; - const Vst::MediaTypes mediaType = activateAudioChannels ? Vst::kAudio : Vst::kEvent; - const Steinberg::int32 numBuses = component->getBusCount (mediaType, direction); - - for (Steinberg::int32 i = numBuses; --i >= 0;) - warnOnFailure (component->activateBus (mediaType, direction, i, state)); -} - -//============================================================================== -/** Assigns a complete AudioSampleBuffer's channels to an AudioBusBuffers' */ -static void associateWholeBufferTo (Vst::AudioBusBuffers& vstBuffers, AudioSampleBuffer& buffer) noexcept -{ - vstBuffers.channelBuffers32 = buffer.getArrayOfWritePointers(); - vstBuffers.numChannels = buffer.getNumChannels(); - vstBuffers.silenceFlags = 0; -} - -//============================================================================== -static void toProcessContext (Vst::ProcessContext& context, AudioPlayHead* playHead, double sampleRate) -{ - jassert (sampleRate > 0.0); //Must always be valid, as stated by the VST3 SDK - - using namespace Vst; - - zerostruct (context); - context.sampleRate = sampleRate; - - if (playHead != nullptr) - { - AudioPlayHead::CurrentPositionInfo position; - playHead->getCurrentPosition (position); - - context.projectTimeSamples = position.timeInSamples; //Must always be valid, as stated by the VST3 SDK - context.projectTimeMusic = position.timeInSeconds; //Does not always need to be valid... - context.tempo = position.bpm; - context.timeSigNumerator = position.timeSigNumerator; - context.timeSigDenominator = position.timeSigDenominator; - context.barPositionMusic = position.ppqPositionOfLastBarStart; - context.cycleStartMusic = position.ppqLoopStart; - context.cycleEndMusic = position.ppqLoopEnd; - - switch (position.frameRate) - { - case AudioPlayHead::fps24: context.frameRate.framesPerSecond = 24; break; - case AudioPlayHead::fps25: context.frameRate.framesPerSecond = 25; break; - case AudioPlayHead::fps30: context.frameRate.framesPerSecond = 30; break; - - case AudioPlayHead::fps2997: - case AudioPlayHead::fps2997drop: - case AudioPlayHead::fps30drop: - { - context.frameRate.framesPerSecond = 30; - context.frameRate.flags = FrameRate::kDropRate; - - if (position.frameRate == AudioPlayHead::fps2997drop) - context.frameRate.flags |= FrameRate::kPullDownRate; - } - break; - - case AudioPlayHead::fpsUnknown: break; - - default: jassertfalse; break; // New frame rate? - } - - if (position.isPlaying) context.state |= ProcessContext::kPlaying; - if (position.isRecording) context.state |= ProcessContext::kRecording; - if (position.isLooping) context.state |= ProcessContext::kCycleActive; - } - else - { - context.tempo = 120.0; - context.frameRate.framesPerSecond = 30; - context.timeSigNumerator = 4; - context.timeSigDenominator = 4; - } - - if (context.projectTimeMusic >= 0.0) context.state |= ProcessContext::kProjectTimeMusicValid; - if (context.barPositionMusic >= 0.0) context.state |= ProcessContext::kBarPositionValid; - if (context.tempo > 0.0) context.state |= ProcessContext::kTempoValid; - if (context.frameRate.framesPerSecond > 0) context.state |= ProcessContext::kSmpteValid; - - if (context.cycleStartMusic >= 0.0 - && context.cycleEndMusic > 0.0 - && context.cycleEndMusic > context.cycleStartMusic) - { - context.state |= ProcessContext::kCycleValid; - } - - if (context.timeSigNumerator > 0 && context.timeSigDenominator > 0) - context.state |= ProcessContext::kTimeSigValid; -} - -//============================================================================== -/** Get a list of speaker arrangements as per their speaker names - - (e.g.: 2 regular channels, aliased as 'kStringStereoS', is "L R") -*/ -static StringArray getSpeakerArrangements() -{ - using namespace Vst::SpeakerArr; - - const Vst::CString arrangements[] = - { - kStringMonoS, kStringStereoS, kStringStereoRS, kStringStereoCS, - kStringStereoSS, kStringStereoCLfeS, kString30CineS, kString30MusicS, - kString31CineS, kString31MusicS, kString40CineS, kString40MusicS, - kString41CineS, kString41MusicS, kString50S, kString51S, - kString60CineS, kString60MusicS, kString61CineS, kString61MusicS, - kString70CineS, kString70MusicS, kString71CineS, kString71MusicS, - kString80CineS, kString80MusicS, kString81CineS, kString81MusicS, - kString80CubeS, kStringBFormat1stOrderS, kString71CineTopCenterS, - kString71CineCenterHighS, kString71CineFrontHighS, kString71CineSideHighS, - kString71CineFullRearS, kString90S, kString91S, - kString100S, kString101S, kString110S, kString111S, - kString130S, kString131S, kString102S, kString122S, - nullptr - }; - - return StringArray (arrangements); -} - -/** Get a list of speaker arrangements as per their named configurations - - (e.g.: 2 regular channels, aliased as 'kStringStereoS', is "L R") -*/ -static StringArray getNamedSpeakerArrangements() -{ - using namespace Vst::SpeakerArr; - - const Vst::CString arrangements[] = - { - kStringEmpty, kStringMono, kStringStereo, kStringStereoR, - kStringStereoC, kStringStereoSide, kStringStereoCLfe, kString30Cine, - kString30Music, kString31Cine, kString31Music, kString40Cine, - kString40Music, kString41Cine, kString41Music, kString50, - kString51, kString60Cine, kString60Music, kString61Cine, - kString61Music, kString70Cine, kString70Music, kString71Cine, - kString71Music, kString71CineTopCenter, kString71CineCenterHigh, - kString71CineFrontHigh, kString71CineSideHigh, kString71CineFullRear, - kString80Cine, kString80Music, kString80Cube, kString81Cine, - kString81Music, kString102, kString122, kString90, - kString91, kString100, kString101, kString110, - kString111, kString130, kString131, - nullptr - }; - - return StringArray (arrangements); -} - -static Vst::SpeakerArrangement getSpeakerArrangementFrom (const String& string) -{ - return Vst::SpeakerArr::getSpeakerArrangementFromString (string.toUTF8()); -} - -//============================================================================== -static StringArray getPluginEffectCategories() -{ - using namespace Vst::PlugType; - - const Vst::CString categories[] = - { - kFxAnalyzer, kFxDelay, kFxDistortion, kFxDynamics, - kFxEQ, kFxFilter, kFx, kFxInstrument, - kFxInstrumentExternal, kFxSpatial, kFxGenerator, kFxMastering, - kFxModulation, kFxPitchShift, kFxRestoration, kFxReverb, - kFxSurround, kFxTools, kSpatial, kSpatialFx, - nullptr - }; - - return StringArray (categories); -} - -static StringArray getPluginInstrumentCategories() -{ - using namespace Vst::PlugType; - - const Vst::CString categories[] = - { - kInstrumentSynthSampler, kInstrumentDrum, - kInstrumentSampler, kInstrumentSynth, - kInstrumentExternal, kFxInstrument, - kFxInstrumentExternal, kFxSpatial, - kFxGenerator, - nullptr - }; - - return StringArray (categories); -} - -//============================================================================== -class VST3PluginInstance; - -class VST3HostContext : public Vst::IComponentHandler, // From VST V3.0.0 - public Vst::IComponentHandler2, // From VST V3.1.0 (a very well named class, of course!) - public Vst::IComponentHandler3, // From VST V3.5.0 (also very well named!) - public Vst::IContextMenuTarget, - public Vst::IHostApplication, - public Vst::IUnitHandler -{ -public: - VST3HostContext (VST3PluginInstance* pluginInstance) : owner (pluginInstance) - { - appName = File::getSpecialLocation (File::currentApplicationFile).getFileNameWithoutExtension(); - attributeList = new AttributeList (this); - } - - virtual ~VST3HostContext() {} - - JUCE_DECLARE_VST3_COM_REF_METHODS - - FUnknown* getFUnknown() { return static_cast (this); } - - static bool hasFlag (Steinberg::int32 source, Steinberg::int32 flag) noexcept - { - return (source & flag) == flag; - } - - //============================================================================== - tresult PLUGIN_API beginEdit (Vst::ParamID paramID) override - { - const int index = getIndexOfParamID (paramID); - - if (index < 0) - return kResultFalse; - - owner->beginParameterChangeGesture (index); - return kResultTrue; - } - - tresult PLUGIN_API performEdit (Vst::ParamID paramID, Vst::ParamValue valueNormalized) override - { - const int index = getIndexOfParamID (paramID); - - if (index < 0) - return kResultFalse; - - owner->sendParamChangeMessageToListeners (index, (float) valueNormalized); - return owner->editController->setParamNormalized (paramID, valueNormalized); - } - - tresult PLUGIN_API endEdit (Vst::ParamID paramID) override - { - const int index = getIndexOfParamID (paramID); - - if (index < 0) - return kResultFalse; - - owner->endParameterChangeGesture (index); - return kResultTrue; - } - - tresult PLUGIN_API restartComponent (Steinberg::int32 flags) override - { - if (owner != nullptr) - { - if (hasFlag (flags, Vst::kReloadComponent)) - owner->reset(); - - if (hasFlag (flags, Vst::kIoChanged)) - { - const double sampleRate = owner->getSampleRate(); - const int blockSize = owner->getBlockSize(); - - owner->prepareToPlay (sampleRate >= 8000 ? sampleRate : 44100.0, - blockSize > 0 ? blockSize : 1024); - } - - if (hasFlag (flags, Vst::kLatencyChanged)) - if (owner->processor != nullptr) - owner->setLatencySamples (jmax (0, (int) owner->processor->getLatencySamples())); - - owner->updateHostDisplay(); - return kResultTrue; - } - - jassertfalse; - return kResultFalse; - } - - //============================================================================== - tresult PLUGIN_API setDirty (TBool) override - { - return kResultFalse; - } - - tresult PLUGIN_API requestOpenEditor (FIDString name) override - { - (void) name; - jassertfalse; - return kResultFalse; - } - - tresult PLUGIN_API startGroupEdit() override - { - jassertfalse; - return kResultFalse; - } - - tresult PLUGIN_API finishGroupEdit() override - { - jassertfalse; - return kResultFalse; - } - - //============================================================================== - class ContextMenu : public Vst::IContextMenu - { - public: - ContextMenu (VST3PluginInstance& pluginInstance) : owner (pluginInstance) {} - virtual ~ContextMenu() {} - - JUCE_DECLARE_VST3_COM_REF_METHODS - JUCE_DECLARE_VST3_COM_QUERY_METHODS - - Steinberg::int32 PLUGIN_API getItemCount() override { return (Steinberg::int32) items.size(); } - - tresult PLUGIN_API addItem (const Item& item, IContextMenuTarget* target) override - { - jassert (target != nullptr); - - ItemAndTarget newItem; - newItem.item = item; - newItem.target = target; - - items.add (newItem); - return kResultOk; - } - - tresult PLUGIN_API removeItem (const Item& toRemove, IContextMenuTarget* target) override - { - for (int i = items.size(); --i >= 0;) - { - ItemAndTarget& item = items.getReference(i); - - if (item.item.tag == toRemove.tag && item.target == target) - items.remove (i); - } - - return kResultOk; - } - - tresult PLUGIN_API getItem (Steinberg::int32 tag, Item& result, IContextMenuTarget** target) override - { - for (int i = 0; i < items.size(); ++i) - { - const ItemAndTarget& item = items.getReference(i); - - if (item.item.tag == tag) - { - result = item.item; - - if (target != nullptr) - *target = item.target; - - return kResultTrue; - } - } - - zerostruct (result); - return kResultFalse; - } - - tresult PLUGIN_API popup (Steinberg::UCoord x, Steinberg::UCoord y) override - { - Array subItemStack; - OwnedArray menuStack; - PopupMenu* topLevelMenu = menuStack.add (new PopupMenu()); - - for (int i = 0; i < items.size(); ++i) - { - const Item& item = items.getReference (i).item; - - PopupMenu* menuToUse = menuStack.getLast(); - - if (hasFlag (item.flags, Item::kIsGroupStart & ~Item::kIsDisabled)) - { - subItemStack.add (&item); - menuStack.add (new PopupMenu()); - } - else if (hasFlag (item.flags, Item::kIsGroupEnd)) - { - if (const Item* subItem = subItemStack.getLast()) - { - if (PopupMenu* m = menuStack [menuStack.size() - 2]) - m->addSubMenu (toString (subItem->name), *menuToUse, - ! hasFlag (subItem->flags, Item::kIsDisabled), - nullptr, - hasFlag (subItem->flags, Item::kIsChecked)); - - menuStack.removeLast (1); - subItemStack.removeLast (1); - } - } - else if (hasFlag (item.flags, Item::kIsSeparator)) - { - menuToUse->addSeparator(); - } - else - { - menuToUse->addItem (item.tag != 0 ? (int) item.tag : (int) zeroTagReplacement, - toString (item.name), - ! hasFlag (item.flags, Item::kIsDisabled), - hasFlag (item.flags, Item::kIsChecked)); - } - } - - PopupMenu::Options options; - - if (AudioProcessorEditor* ed = owner.getActiveEditor()) - options = options.withTargetScreenArea (ed->getScreenBounds().translated ((int) x, (int) y).withSize (1, 1)); - - #if JUCE_MODAL_LOOPS_PERMITTED - // Unfortunately, Steinberg's docs explicitly say this should be modal.. - handleResult (topLevelMenu->showMenu (options)); - #else - topLevelMenu->showMenuAsync (options, ModalCallbackFunction::create (menuFinished, ComSmartPtr (this))); - #endif - - return kResultOk; - } - - #if ! JUCE_MODAL_LOOPS_PERMITTED - static void menuFinished (int modalResult, ComSmartPtr menu) { menu->handleResult (modalResult); } - #endif - - private: - enum { zeroTagReplacement = 0x7fffffff }; - - Atomic refCount; - VST3PluginInstance& owner; - - struct ItemAndTarget - { - Item item; - ComSmartPtr target; - }; - - Array items; - - void handleResult (int result) - { - if (result == 0) - return; - - if (result == zeroTagReplacement) - result = 0; - - for (int i = 0; i < items.size(); ++i) - { - const ItemAndTarget& item = items.getReference(i); - - if ((int) item.item.tag == result) - { - if (item.target != nullptr) - item.target->executeMenuItem ((Steinberg::int32) result); - - break; - } - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContextMenu) - }; - - Vst::IContextMenu* PLUGIN_API createContextMenu (IPlugView*, const Vst::ParamID*) override - { - if (owner != nullptr) - return new ContextMenu (*owner); - - return nullptr; - } - - tresult PLUGIN_API executeMenuItem (Steinberg::int32) override - { - jassertfalse; - return kResultFalse; - } - - //============================================================================== - tresult PLUGIN_API getName (Vst::String128 name) override - { - Steinberg::String str (appName.toUTF8()); - str.copyTo (name, 0, 127); - return kResultOk; - } - - tresult PLUGIN_API createInstance (TUID cid, TUID iid, void** obj) override - { - *obj = nullptr; - - if (! doUIDsMatch (cid, iid)) - { - jassertfalse; - return kInvalidArgument; - } - - if (doUIDsMatch (cid, Vst::IMessage::iid) && doUIDsMatch (iid, Vst::IMessage::iid)) - { - ComSmartPtr m (new Message (*this, attributeList)); - messageQueue.add (m); - m->addRef(); - *obj = m; - return kResultOk; - } - else if (doUIDsMatch (cid, Vst::IAttributeList::iid) && doUIDsMatch (iid, Vst::IAttributeList::iid)) - { - ComSmartPtr l (new AttributeList (this)); - l->addRef(); - *obj = l; - return kResultOk; - } - - jassertfalse; - return kNotImplemented; - } - - //============================================================================== - tresult PLUGIN_API notifyUnitSelection (Vst::UnitID) override - { - jassertfalse; - return kResultFalse; - } - - tresult PLUGIN_API notifyProgramListChange (Vst::ProgramListID, Steinberg::int32) override - { - jassertfalse; - return kResultFalse; - } - - //============================================================================== - tresult PLUGIN_API queryInterface (const TUID iid, void** obj) override - { - if (doUIDsMatch (iid, Vst::IAttributeList::iid)) - { - *obj = attributeList.get(); - return kResultOk; - } - - TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IComponentHandler) - TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IComponentHandler2) - TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IComponentHandler3) - TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IContextMenuTarget) - TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IHostApplication) - TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IUnitHandler) - TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (iid, FUnknown, Vst::IComponentHandler) - - *obj = nullptr; - return kNotImplemented; - } - -private: - //============================================================================== - VST3PluginInstance* const owner; - Atomic refCount; - String appName; - - typedef std::map ParamMapType; - ParamMapType paramToIndexMap; - - int getIndexOfParamID (Vst::ParamID paramID) - { - if (owner == nullptr || owner->editController == nullptr) - return -1; - - int result = getMappedParamID (paramID); - - if (result < 0) - { - const int numParams = owner->editController->getParameterCount(); - - for (int i = 0; i < numParams; ++i) - { - Vst::ParameterInfo paramInfo; - owner->editController->getParameterInfo (i, paramInfo); - paramToIndexMap[paramInfo.id] = i; - } - - result = getMappedParamID (paramID); - } - - return result; - } - - int getMappedParamID (Vst::ParamID paramID) - { - const ParamMapType::iterator it (paramToIndexMap.find (paramID)); - return it != paramToIndexMap.end() ? it->second : -1; - } - - //============================================================================== - class Message : public Vst::IMessage - { - public: - Message (VST3HostContext& o, Vst::IAttributeList* list) - : owner (o), attributeList (list) - { - } - - Message (VST3HostContext& o, Vst::IAttributeList* list, FIDString id) - : owner (o), attributeList (list), messageId (toString (id)) - { - } - - Message (VST3HostContext& o, Vst::IAttributeList* list, FIDString id, const var& v) - : value (v), owner (o), attributeList (list), messageId (toString (id)) - { - } - - virtual ~Message() {} - - JUCE_DECLARE_VST3_COM_REF_METHODS - JUCE_DECLARE_VST3_COM_QUERY_METHODS - - FIDString PLUGIN_API getMessageID() override { return messageId.toRawUTF8(); } - void PLUGIN_API setMessageID (FIDString id) override { messageId = toString (id); } - Vst::IAttributeList* PLUGIN_API getAttributes() override { return attributeList; } - - var value; - - private: - VST3HostContext& owner; - ComSmartPtr attributeList; - String messageId; - Atomic refCount; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Message) - }; - - Array, CriticalSection> messageQueue; - - //============================================================================== - class AttributeList : public Vst::IAttributeList - { - public: - AttributeList (VST3HostContext* o) : owner (o) {} - virtual ~AttributeList() {} - - JUCE_DECLARE_VST3_COM_REF_METHODS - JUCE_DECLARE_VST3_COM_QUERY_METHODS - - //============================================================================== - tresult PLUGIN_API setInt (AttrID id, Steinberg::int64 value) override - { - addMessageToQueue (id, value); - return kResultTrue; - } - - tresult PLUGIN_API setFloat (AttrID id, double value) override - { - addMessageToQueue (id, value); - return kResultTrue; - } - - tresult PLUGIN_API setString (AttrID id, const Vst::TChar* string) override - { - addMessageToQueue (id, toString (string)); - return kResultTrue; - } - - tresult PLUGIN_API setBinary (AttrID id, const void* data, Steinberg::uint32 size) override - { - jassert (size >= 0 && (data != nullptr || size == 0)); - addMessageToQueue (id, MemoryBlock (data, (size_t) size)); - return kResultTrue; - } - - //============================================================================== - tresult PLUGIN_API getInt (AttrID id, Steinberg::int64& result) override - { - jassert (id != nullptr); - - if (findMessageOnQueueWithID (id, result)) - return kResultTrue; - - jassertfalse; - return kResultFalse; - } - - tresult PLUGIN_API getFloat (AttrID id, double& result) override - { - jassert (id != nullptr); - - if (findMessageOnQueueWithID (id, result)) - return kResultTrue; - - jassertfalse; - return kResultFalse; - } - - tresult PLUGIN_API getString (AttrID id, Vst::TChar* result, Steinberg::uint32 length) override - { - jassert (id != nullptr); - - String stringToFetch; - if (findMessageOnQueueWithID (id, stringToFetch)) - { - Steinberg::String str (stringToFetch.toRawUTF8()); - str.copyTo (result, 0, (Steinberg::int32) jmin (length, (Steinberg::uint32) std::numeric_limits::max())); - - return kResultTrue; - } - - jassertfalse; - return kResultFalse; - } - - tresult PLUGIN_API getBinary (AttrID id, const void*& data, Steinberg::uint32& size) override - { - jassert (id != nullptr); - - for (int i = owner->messageQueue.size(); --i >= 0;) - { - Message* const message = owner->messageQueue.getReference (i); - - if (std::strcmp (message->getMessageID(), id) == 0) - { - if (MemoryBlock* binaryData = message->value.getBinaryData()) - { - data = binaryData->getData(); - size = (Steinberg::uint32) binaryData->getSize(); - return kResultTrue; - } - } - } - - return kResultFalse; - } - - private: - VST3HostContext* owner; - Atomic refCount; - - //============================================================================== - template - void addMessageToQueue (AttrID id, const Type& value) - { - jassert (id != nullptr); - - for (int i = owner->messageQueue.size(); --i >= 0;) - { - VST3HostContext::Message* const message = owner->messageQueue.getReference (i); - - if (std::strcmp (message->getMessageID(), id) == 0) - { - message->value = value; - return; - } - } - - owner->messageQueue.add (ComSmartPtr (new Message (*owner, this, id, value))); - } - - template - bool findMessageOnQueueWithID (AttrID id, Type& value) - { - jassert (id != nullptr); - - for (int i = owner->messageQueue.size(); --i >= 0;) - { - VST3HostContext::Message* const message = owner->messageQueue.getReference (i); - - if (std::strcmp (message->getMessageID(), id) == 0) - { - value = message->value; - return true; - } - } - - return false; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AttributeList) - }; - - ComSmartPtr attributeList; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3HostContext) -}; - -//============================================================================== -class DescriptionFactory -{ -public: - DescriptionFactory (VST3HostContext* host, IPluginFactory* pluginFactory) - : vst3HostContext (host), factory (pluginFactory) - { - jassert (pluginFactory != nullptr); - } - - virtual ~DescriptionFactory() {} - - Result findDescriptionsAndPerform (const File& file) - { - StringArray foundNames; - PFactoryInfo factoryInfo; - factory->getFactoryInfo (&factoryInfo); - const String companyName (toString (factoryInfo.vendor).trim()); - - Result result (Result::ok()); - - const Steinberg::int32 numClasses = factory->countClasses(); - - for (Steinberg::int32 i = 0; i < numClasses; ++i) - { - PClassInfo info; - factory->getClassInfo (i, &info); - - if (std::strcmp (info.category, kVstAudioEffectClass) != 0) - continue; - - const String name (toString (info.name).trim()); - - if (foundNames.contains (name, true)) - continue; - - ScopedPointer info2; - ScopedPointer infoW; - - { - ComSmartPtr pf2; - ComSmartPtr pf3; - - if (pf2.loadFrom (factory)) - { - info2 = new PClassInfo2(); - pf2->getClassInfo2 (i, info2); - } - - if (pf3.loadFrom (factory)) - { - infoW = new PClassInfoW(); - pf3->getClassInfoUnicode (i, infoW); - } - } - - foundNames.add (name); - - PluginDescription desc; - - { - ComSmartPtr component; - - if (component.loadFrom (factory, info.cid)) - { - if (component->initialize (vst3HostContext->getFUnknown()) == kResultOk) - { - const int numInputs = getNumSingleDirectionChannelsFor (component, true, true); - const int numOutputs = getNumSingleDirectionChannelsFor (component, false, true); - - createPluginDescription (desc, file, companyName, name, - info, info2, infoW, numInputs, numOutputs); - - component->terminate(); - } - else - { - jassertfalse; - } - } - else - { - jassertfalse; - } - } - - result = performOnDescription (desc); - - if (result.failed()) - break; - } - - return result; - } - -protected: - virtual Result performOnDescription (PluginDescription& description) = 0; - -private: - ComSmartPtr vst3HostContext; - ComSmartPtr factory; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DescriptionFactory) -}; - -struct MatchingDescriptionFinder : public DescriptionFactory -{ - MatchingDescriptionFinder (VST3HostContext* host, IPluginFactory* pluginFactory, const PluginDescription& desc) - : DescriptionFactory (host, pluginFactory), description (desc) - { - } - - static const char* getSuccessString() noexcept { return "Found Description"; } - - Result performOnDescription (PluginDescription& desc) - { - if (description.isDuplicateOf (desc)) - return Result::fail (getSuccessString()); - - return Result::ok(); - } - -private: - const PluginDescription& description; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MatchingDescriptionFinder) -}; - -struct DescriptionLister : public DescriptionFactory -{ - DescriptionLister (VST3HostContext* host, IPluginFactory* pluginFactory) - : DescriptionFactory (host, pluginFactory) - { - } - - Result performOnDescription (PluginDescription& desc) - { - list.add (new PluginDescription (desc)); - return Result::ok(); - } - - OwnedArray list; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DescriptionLister) -}; - -//============================================================================== -struct DLLHandle -{ - DLLHandle (const String& modulePath) - : factory (nullptr) - { - if (modulePath.trim().isNotEmpty()) - open (modulePath); - } - - ~DLLHandle() - { - typedef bool (PLUGIN_API *ExitModuleFn) (); - - #if JUCE_WINDOWS - if (ExitModuleFn exitFn = (ExitModuleFn) getFunction ("ExitDll")) - exitFn(); - - releaseFactory(); - library.close(); - - #else - if (bundleRef != nullptr) - { - if (ExitModuleFn exitFn = (ExitModuleFn) getFunction ("bundleExit")) - exitFn(); - - releaseFactory(); - - CFRelease (bundleRef); - bundleRef = nullptr; - } - #endif - } - - void open (const PluginDescription& description) - { - #if JUCE_WINDOWS - jassert (description.fileOrIdentifier.isNotEmpty()); - jassert (File (description.fileOrIdentifier).existsAsFile()); - library.open (description.fileOrIdentifier); - #else - open (description.fileOrIdentifier); - #endif - } - - /** @note The factory should begin with a refCount of 1, - so don't increment the reference count - (ie: don't use a ComSmartPtr in here)! - Its lifetime will be handled by this DllHandle, - when such will be destroyed. - - @see releaseFactory - */ - IPluginFactory* JUCE_CALLTYPE getPluginFactory() - { - if (factory == nullptr) - if (GetFactoryProc proc = (GetFactoryProc) getFunction ("GetPluginFactory")) - factory = proc(); - - jassert (factory != nullptr); // The plugin NEEDS to provide a factory to be able to be called a VST3! - return factory; - } - - void* getFunction (const char* functionName) - { - #if JUCE_WINDOWS - return library.getFunction (functionName); - #else - if (bundleRef == nullptr) - return nullptr; - - CFStringRef name = String (functionName).toCFString(); - void* fn = CFBundleGetFunctionPointerForName (bundleRef, name); - CFRelease (name); - return fn; - #endif - } - -private: - IPluginFactory* factory; - - void releaseFactory() - { - if (factory != nullptr) - factory->release(); - } - - #if JUCE_WINDOWS - DynamicLibrary library; - - bool open (const String& filePath) - { - if (library.open (filePath)) - { - typedef bool (PLUGIN_API *InitModuleProc) (); - if (InitModuleProc proc = (InitModuleProc) getFunction ("InitDll")) - { - if (proc()) - return true; - } - else - { - return true; - } - - library.close(); - } - - return false; - } - - #else - CFBundleRef bundleRef; - - bool open (const String& filePath) - { - const File file (filePath); - const char* const utf8 = file.getFullPathName().toRawUTF8(); - - if (CFURLRef url = CFURLCreateFromFileSystemRepresentation (0, (const UInt8*) utf8, (CFIndex) std::strlen (utf8), file.isDirectory())) - { - bundleRef = CFBundleCreate (kCFAllocatorDefault, url); - CFRelease (url); - - if (bundleRef != nullptr) - { - CFErrorRef error = nullptr; - - if (CFBundleLoadExecutableAndReturnError (bundleRef, &error)) - { - typedef bool (*BundleEntryProc)(CFBundleRef); - - if (BundleEntryProc proc = (BundleEntryProc) getFunction ("bundleEntry")) - { - if (proc (bundleRef)) - return true; - } - else - { - return true; - } - } - - if (error != nullptr) - { - if (CFStringRef failureMessage = CFErrorCopyFailureReason (error)) - { - DBG (String::fromCFString (failureMessage)); - CFRelease (failureMessage); - } - - CFRelease (error); - } - - CFRelease (bundleRef); - bundleRef = nullptr; - } - } - - return false; - } - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DLLHandle) -}; - -//============================================================================== -class VST3ModuleHandle : public ReferenceCountedObject -{ -public: - explicit VST3ModuleHandle (const File& pluginFile) : file (pluginFile) - { - getActiveModules().add (this); - } - - ~VST3ModuleHandle() - { - getActiveModules().removeFirstMatchingValue (this); - } - - /** - Since there is no apparent indication if a VST3 plugin is a shell or not, - we're stuck iterating through a VST3's factory, creating a description - for every housed plugin. - */ - static bool getAllDescriptionsForFile (OwnedArray& results, - const String& fileOrIdentifier) - { - DLLHandle tempModule (fileOrIdentifier); - - ComSmartPtr pluginFactory (tempModule.getPluginFactory()); - - if (pluginFactory != nullptr) - { - ComSmartPtr host (new VST3HostContext (nullptr)); - DescriptionLister lister (host, pluginFactory); - const Result result (lister.findDescriptionsAndPerform (File (fileOrIdentifier))); - - results.addCopiesOf (lister.list); - - return result.wasOk(); - } - - jassertfalse; - return false; - } - - //============================================================================== - typedef ReferenceCountedObjectPtr Ptr; - - static VST3ModuleHandle::Ptr findOrCreateModule (const File& file, const PluginDescription& description) - { - Array& activeModules = getActiveModules(); - - for (int i = activeModules.size(); --i >= 0;) - { - VST3ModuleHandle* const module = activeModules.getUnchecked (i); - - // VST3s are basically shells, you must therefore check their name along with their file: - if (module->file == file && module->name == description.name) - return module; - } - - VST3ModuleHandle::Ptr m (new VST3ModuleHandle (file)); - - if (! m->open (file, description)) - m = nullptr; - - return m; - } - - //============================================================================== - IPluginFactory* getPluginFactory() { return dllHandle->getPluginFactory(); } - - File file; - String name; - -private: - ScopedPointer dllHandle; - - //============================================================================== - static Array& getActiveModules() - { - static Array activeModules; - return activeModules; - } - - //============================================================================== - bool open (const File& f, const PluginDescription& description) - { - dllHandle = new DLLHandle (f.getFullPathName()); - - ComSmartPtr pluginFactory (dllHandle->getPluginFactory()); - - if (pluginFactory != nullptr) - { - ComSmartPtr host (new VST3HostContext (nullptr)); - MatchingDescriptionFinder finder (host, pluginFactory, description); - - const Result result (finder.findDescriptionsAndPerform (f)); - - if (result.getErrorMessage() == MatchingDescriptionFinder::getSuccessString()) - { - name = description.name; - return true; - } - } - - return false; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3ModuleHandle) -}; - -//============================================================================== -class VST3PluginWindow : public AudioProcessorEditor, - public ComponentMovementWatcher, - public IPlugFrame -{ -public: - VST3PluginWindow (AudioProcessor* owner, IPlugView* pluginView) - : AudioProcessorEditor (owner), - ComponentMovementWatcher (this), - refCount (1), - view (pluginView, false), - pluginHandle (nullptr), - recursiveResize (false) - { - setSize (10, 10); - setOpaque (true); - setVisible (true); - - warnOnFailure (view->setFrame (this)); - - ViewRect rect; - warnOnFailure (view->getSize (&rect)); - resizeWithRect (*this, rect); - } - - ~VST3PluginWindow() - { - warnOnFailure (view->removed()); - warnOnFailure (view->setFrame (nullptr)); - - processor.editorBeingDeleted (this); - - #if JUCE_MAC - dummyComponent.setView (nullptr); - #endif - - view = nullptr; - } - - JUCE_DECLARE_VST3_COM_REF_METHODS - JUCE_DECLARE_VST3_COM_QUERY_METHODS - - void paint (Graphics& g) override - { - g.fillAll (Colours::black); - } - - void mouseWheelMove (const MouseEvent&, const MouseWheelDetails& wheel) override - { - view->onWheel (wheel.deltaY); - } - - void focusGained (FocusChangeType) override { view->onFocus (true); } - void focusLost (FocusChangeType) override { view->onFocus (false); } - - /** It seems that most, if not all, plugins do their own keyboard hooks, - but IPlugView does have a set of keyboard related methods... - */ - bool keyStateChanged (bool /*isKeyDown*/) override { return true; } - bool keyPressed (const KeyPress& /*key*/) override { return true; } - - //============================================================================== - void componentMovedOrResized (bool, bool wasResized) override - { - if (recursiveResize) - return; - - Component* const topComp = getTopLevelComponent(); - - if (topComp->getPeer() != nullptr) - { - #if JUCE_WINDOWS - const Point pos (topComp->getLocalPoint (this, Point())); - #endif - - recursiveResize = true; - - ViewRect rect; - - if (wasResized && view->canResize() == kResultTrue) - { - rect.right = (Steinberg::int32) getWidth(); - rect.bottom = (Steinberg::int32) getHeight(); - view->checkSizeConstraint (&rect); - - setSize ((int) rect.getWidth(), (int) rect.getHeight()); - - #if JUCE_WINDOWS - SetWindowPos (pluginHandle, 0, - pos.x, pos.y, rect.getWidth(), rect.getHeight(), - isVisible() ? SWP_SHOWWINDOW : SWP_HIDEWINDOW); - #elif JUCE_MAC - dummyComponent.setBounds (getLocalBounds()); - #endif - - view->onSize (&rect); - } - else - { - warnOnFailure (view->getSize (&rect)); - - #if JUCE_WINDOWS - SetWindowPos (pluginHandle, 0, - pos.x, pos.y, rect.getWidth(), rect.getHeight(), - isVisible() ? SWP_SHOWWINDOW : SWP_HIDEWINDOW); - #elif JUCE_MAC - dummyComponent.setBounds (0, 0, (int) rect.getWidth(), (int) rect.getHeight()); - #endif - } - - // Some plugins don't update their cursor correctly when mousing out the window - Desktop::getInstance().getMainMouseSource().forceMouseCursorUpdate(); - - recursiveResize = false; - } - } - - void componentPeerChanged() override { } - - void componentVisibilityChanged() override - { - attachPluginWindow(); - componentMovedOrResized (true, true); - } - - tresult PLUGIN_API resizeView (IPlugView* incomingView, ViewRect* newSize) override - { - if (incomingView != nullptr - && newSize != nullptr - && incomingView == view) - { - resizeWithRect (dummyComponent, *newSize); - setSize (dummyComponent.getWidth(), dummyComponent.getHeight()); - return kResultTrue; - } - - jassertfalse; - return kInvalidArgument; - } - -private: - //============================================================================== - Atomic refCount; - ComSmartPtr view; - - #if JUCE_WINDOWS - class ChildComponent : public Component - { - public: - ChildComponent() {} - void paint (Graphics& g) override { g.fillAll (Colours::cornflowerblue); } - - using Component::createNewPeer; - - private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildComponent) - }; - - ChildComponent dummyComponent; - ScopedPointer peer; - typedef HWND HandleFormat; - #elif JUCE_MAC - AutoResizingNSViewComponentWithParent dummyComponent; - typedef NSView* HandleFormat; - #else - Component dummyComponent; - typedef void* HandleFormat; - #endif - - HandleFormat pluginHandle; - bool recursiveResize; - - //============================================================================== - static void resizeWithRect (Component& comp, const ViewRect& rect) - { - comp.setBounds ((int) rect.left, (int) rect.top, - jmax (10, std::abs ((int) rect.getWidth())), - jmax (10, std::abs ((int) rect.getHeight()))); - } - - void attachPluginWindow() - { - if (pluginHandle == nullptr) - { - #if JUCE_WINDOWS - if (Component* topComp = getTopLevelComponent()) - peer = dummyComponent.createNewPeer (0, topComp->getWindowHandle()); - else - peer = nullptr; - - if (peer != nullptr) - pluginHandle = (HandleFormat) peer->getNativeHandle(); - #elif JUCE_MAC - dummyComponent.setBounds (getLocalBounds()); - addAndMakeVisible (dummyComponent); - pluginHandle = (NSView*) dummyComponent.getView(); - jassert (pluginHandle != nil); - #endif - - if (pluginHandle != nullptr) - warnOnFailure (view->attached (pluginHandle, defaultVST3WindowType)); - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginWindow) -}; - -//============================================================================== -class VST3PluginInstance : public AudioPluginInstance -{ -public: - VST3PluginInstance (const VST3ModuleHandle::Ptr& handle) - : module (handle), - numInputAudioBusses (0), - numOutputAudioBusses (0), - inputParameterChanges (new ParamValueQueueList()), - outputParameterChanges (new ParamValueQueueList()), - midiInputs (new MidiEventList()), - midiOutputs (new MidiEventList()), - isComponentInitialised (false), - isControllerInitialised (false), - isActive (false) - { - host = new VST3HostContext (this); - } - - ~VST3PluginInstance() - { - jassert (getActiveEditor() == nullptr); // You must delete any editors before deleting the plugin instance! - - releaseResources(); - - if (editControllerConnection != nullptr && componentConnection != nullptr) - { - editControllerConnection->disconnect (componentConnection); - componentConnection->disconnect (editControllerConnection); - } - - editController->setComponentHandler (nullptr); - - if (isControllerInitialised) editController->terminate(); - if (isComponentInitialised) component->terminate(); - - componentConnection = nullptr; - editControllerConnection = nullptr; - unitData = nullptr; - unitInfo = nullptr; - programListData = nullptr; - componentHandler2 = nullptr; - componentHandler = nullptr; - processor = nullptr; - editController2 = nullptr; - editController = nullptr; - component = nullptr; - host = nullptr; - module = nullptr; - } - - bool initialise() - { - #if JUCE_WINDOWS - // On Windows it's highly advisable to create your plugins using the message thread, - // because many plugins need a chance to create HWNDs that will get their messages - // delivered by the main message thread, and that's not possible from a background thread. - jassert (MessageManager::getInstance()->isThisTheMessageThread()); - #endif - - ComSmartPtr factory (module->getPluginFactory()); - - PFactoryInfo factoryInfo; - factory->getFactoryInfo (&factoryInfo); - company = toString (factoryInfo.vendor).trim(); - - if (! fetchComponentAndController (factory, factory->countClasses())) - return false; - - // (May return an error if the plugin combines the IComponent and IEditController implementations) - editController->initialize (host->getFUnknown()); - - isControllerInitialised = true; - editController->setComponentHandler (host); - grabInformationObjects(); - synchroniseStates(); - interconnectComponentAndController(); - setupIO(); - return true; - } - - //============================================================================== - void fillInPluginDescription (PluginDescription& description) const override - { - jassert (module != nullptr); - - createPluginDescription (description, module->file, - company, module->name, - *info, info2, infoW, - getNumInputChannels(), - getNumOutputChannels()); - } - - void* getPlatformSpecificData() override { return component; } - void refreshParameterList() override {} - - //============================================================================== - const String getName() const override - { - return module != nullptr ? module->name : String::empty; - } - - void repopulateArrangements() - { - inputArrangements.clearQuick(); - outputArrangements.clearQuick(); - - // NB: Some plugins need a valid arrangement despite specifying 0 for their I/O busses - for (int i = 0; i < jmax (1, numInputAudioBusses); ++i) - inputArrangements.add (getArrangementForBus (processor, true, i)); - - for (int i = 0; i < jmax (1, numOutputAudioBusses); ++i) - outputArrangements.add (getArrangementForBus (processor, false, i)); - } - - void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock) override - { - // Avoid redundantly calling things like setActive, which can be a heavy-duty call for some plugins: - if (isActive - && getSampleRate() == sampleRate - && getBlockSize() == estimatedSamplesPerBlock) - return; - - using namespace Vst; - - ProcessSetup setup; - setup.symbolicSampleSize = kSample32; - setup.maxSamplesPerBlock = estimatedSamplesPerBlock; - setup.sampleRate = sampleRate; - setup.processMode = isNonRealtime() ? kOffline : kRealtime; - - warnOnFailure (processor->setupProcessing (setup)); - - if (! isComponentInitialised) - isComponentInitialised = component->initialize (host->getFUnknown()) == kResultTrue; - - editController->setComponentHandler (host); - - if (inputArrangements.size() <= 0 || outputArrangements.size() <= 0) - repopulateArrangements(); - - warnOnFailure (processor->setBusArrangements (inputArrangements.getRawDataPointer(), numInputAudioBusses, - outputArrangements.getRawDataPointer(), numOutputAudioBusses)); - - // Update the num. busses in case the configuration has been modified by the plugin. (May affect number of channels!): - const int newNumInputAudioBusses = getNumSingleDirectionBussesFor (component, true, true); - const int newNumOutputAudioBusses = getNumSingleDirectionBussesFor (component, false, true); - - // Repopulate arrangements if the number of busses have changed: - if (numInputAudioBusses != newNumInputAudioBusses - || numOutputAudioBusses != newNumOutputAudioBusses) - { - numInputAudioBusses = newNumInputAudioBusses; - numOutputAudioBusses = newNumOutputAudioBusses; - - repopulateArrangements(); - } - - // Needed for having the same sample rate in processBlock(); some plugins need this! - setPlayConfigDetails (getNumSingleDirectionChannelsFor (component, true, true), - getNumSingleDirectionChannelsFor (component, false, true), - sampleRate, estimatedSamplesPerBlock); - - setStateForAllBusses (true); - - setLatencySamples (jmax (0, (int) processor->getLatencySamples())); - - warnOnFailure (component->setActive (true)); - warnOnFailure (processor->setProcessing (true)); - - isActive = true; - } - - void releaseResources() override - { - if (! isActive) - return; // Avoids redundantly calling things like setActive - - JUCE_TRY - { - isActive = false; - - setStateForAllBusses (false); - - if (processor != nullptr) - warnOnFailure (processor->setProcessing (false)); - - if (component != nullptr) - warnOnFailure (component->setActive (false)); - } - JUCE_CATCH_ALL_ASSERT - } - - void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) override - { - using namespace Vst; - - if (isActive - && processor != nullptr - && processor->canProcessSampleSize (kSample32) == kResultTrue) - { - const int numSamples = buffer.getNumSamples(); - - ProcessData data; - data.processMode = isNonRealtime() ? kOffline : kRealtime; - data.symbolicSampleSize = kSample32; - data.numInputs = numInputAudioBusses; - data.numOutputs = numOutputAudioBusses; - data.inputParameterChanges = inputParameterChanges; - data.outputParameterChanges = outputParameterChanges; - data.numSamples = (Steinberg::int32) numSamples; - - updateTimingInformation (data, getSampleRate()); - - for (int i = getNumInputChannels(); i < buffer.getNumChannels(); ++i) - buffer.clear (i, 0, numSamples); - - associateTo (data, buffer); - associateTo (data, midiMessages); - - processor->process (data); - - MidiEventList::toMidiBuffer (midiMessages, *midiOutputs); - - inputParameterChanges->clearAllQueues(); - } - } - - //============================================================================== - String getChannelName (int channelIndex, bool forInput, bool forAudioChannel) const - { - const int numBusses = getNumSingleDirectionBussesFor (component, forInput, forAudioChannel); - int numCountedChannels = 0; - - for (int i = 0; i < numBusses; ++i) - { - Vst::BusInfo busInfo (getBusInfo (forInput, forAudioChannel, i)); - - numCountedChannels += busInfo.channelCount; - - if (channelIndex < numCountedChannels) - return toString (busInfo.name); - } - - return String::empty; - } - - const String getInputChannelName (int channelIndex) const override { return getChannelName (channelIndex, true, true); } - const String getOutputChannelName (int channelIndex) const override { return getChannelName (channelIndex, false, true); } - - bool isInputChannelStereoPair (int channelIndex) const override - { - if (channelIndex < 0 || channelIndex >= getNumInputChannels()) - return false; - - return getBusInfo (true, true).channelCount == 2; - } - - bool isOutputChannelStereoPair (int channelIndex) const override - { - if (channelIndex < 0 || channelIndex >= getNumOutputChannels()) - return false; - - return getBusInfo (false, true).channelCount == 2; - } - - bool acceptsMidi() const override { return getBusInfo (true, false).channelCount > 0; } - bool producesMidi() const override { return getBusInfo (false, false).channelCount > 0; } - - //============================================================================== - bool silenceInProducesSilenceOut() const override - { - if (processor != nullptr) - return processor->getTailSamples() == Vst::kNoTail; - - return true; - } - - /** May return a negative value as a means of informing us that the plugin has "infinite tail," or 0 for "no tail." */ - double getTailLengthSeconds() const override - { - if (processor != nullptr) - { - const double sampleRate = getSampleRate(); - - if (sampleRate > 0.0) - return jlimit (0, 0x7fffffff, (int) processor->getTailSamples()) / sampleRate; - } - - return 0.0; - } - - //============================================================================== - AudioProcessorEditor* createEditor() override - { - if (IPlugView* view = tryCreatingView()) - return new VST3PluginWindow (this, view); - - return nullptr; - } - - bool hasEditor() const override - { - // (if possible, avoid creating a second instance of the editor, because that crashes some plugins) - if (getActiveEditor() != nullptr) - return true; - - ComSmartPtr view (tryCreatingView(), false); - return view != nullptr; - } - - //============================================================================== - int getNumParameters() override - { - if (editController != nullptr) - return (int) editController->getParameterCount(); - - return 0; - } - - const String getParameterName (int parameterIndex) override - { - return toString (getParameterInfoForIndex (parameterIndex).title); - } - - float getParameter (int parameterIndex) override - { - if (editController != nullptr) - { - const uint32 id = getParameterInfoForIndex (parameterIndex).id; - return (float) editController->getParamNormalized (id); - } - - return 0.0f; - } - - const String getParameterText (int parameterIndex) override - { - if (editController != nullptr) - { - const uint32 id = getParameterInfoForIndex (parameterIndex).id; - - Vst::String128 result; - warnOnFailure (editController->getParamStringByValue (id, editController->getParamNormalized (id), result)); - - return toString (result); - } - - return String::empty; - } - - void setParameter (int parameterIndex, float newValue) override - { - if (editController != nullptr) - { - const uint32 paramID = getParameterInfoForIndex (parameterIndex).id; - editController->setParamNormalized (paramID, (double) newValue); - - Steinberg::int32 index; - inputParameterChanges->addParameterData (paramID, index)->addPoint (0, newValue, index); - } - } - - //============================================================================== - int getNumPrograms() override { return getProgramListInfo (0).programCount; } - int getCurrentProgram() override { return 0; } - void setCurrentProgram (int) override {} - void changeProgramName (int, const String&) override {} - - const String getProgramName (int index) override - { - Vst::String128 result; - unitInfo->getProgramName (getProgramListInfo (0).id, index, result); - return toString (result); - } - - //============================================================================== - void reset() override - { - if (component != nullptr) - { - component->setActive (false); - component->setActive (true); - } - } - - //============================================================================== - void getStateInformation (MemoryBlock& destData) override - { - XmlElement state ("VST3PluginState"); - - appendStateFrom (state, component, "IComponent"); - appendStateFrom (state, editController, "IEditController"); - - AudioProcessor::copyXmlToBinary (state, destData); - } - - void setStateInformation (const void* data, int sizeInBytes) override - { - ScopedPointer head (AudioProcessor::getXmlFromBinary (data, sizeInBytes)); - - if (head != nullptr) - { - ComSmartPtr s (createMemoryStreamForState (*head, "IComponent")); - - if (s != nullptr && component != nullptr) - component->setState (s); - - if (editController != nullptr) - { - if (s != nullptr) - editController->setComponentState (s); - - s = createMemoryStreamForState (*head, "IEditController"); - - if (s != nullptr) - editController->setState (s); - } - } - } - - /** @note Not applicable to VST3 */ - void getCurrentProgramStateInformation (MemoryBlock& destData) override - { - destData.setSize (0, true); - } - - /** @note Not applicable to VST3 */ - void setCurrentProgramStateInformation (const void* data, int sizeInBytes) override - { - (void) data; - (void) sizeInBytes; - } - - //============================================================================== - // NB: this class and its subclasses must be public to avoid problems in - // DLL builds under MSVC. - class ParamValueQueueList : public Vst::IParameterChanges - { - public: - ParamValueQueueList() {} - virtual ~ParamValueQueueList() {} - - JUCE_DECLARE_VST3_COM_REF_METHODS - JUCE_DECLARE_VST3_COM_QUERY_METHODS - - Steinberg::int32 PLUGIN_API getParameterCount() override { return (Steinberg::int32) queues.size(); } - Vst::IParamValueQueue* PLUGIN_API getParameterData (Steinberg::int32 index) override { return queues[(int) index]; } - - Vst::IParamValueQueue* PLUGIN_API addParameterData (const Vst::ParamID& id, Steinberg::int32& index) override - { - for (int i = queues.size(); --i >= 0;) - { - if (queues.getUnchecked (i)->getParameterId() == id) - { - index = (Steinberg::int32) i; - return queues.getUnchecked (i); - } - } - - index = getParameterCount(); - return queues.add (new ParamValueQueue (id)); - } - - void clearAllQueues() noexcept - { - for (int i = queues.size(); --i >= 0;) - queues.getUnchecked (i)->clear(); - } - - struct ParamValueQueue : public Vst::IParamValueQueue - { - ParamValueQueue (Vst::ParamID parameterID) : paramID (parameterID) - { - points.ensureStorageAllocated (1024); - } - - virtual ~ParamValueQueue() {} - - JUCE_DECLARE_VST3_COM_REF_METHODS - JUCE_DECLARE_VST3_COM_QUERY_METHODS - - Steinberg::Vst::ParamID PLUGIN_API getParameterId() override { return paramID; } - Steinberg::int32 PLUGIN_API getPointCount() override { return (Steinberg::int32) points.size(); } - - Steinberg::tresult PLUGIN_API getPoint (Steinberg::int32 index, - Steinberg::int32& sampleOffset, - Steinberg::Vst::ParamValue& value) override - { - const ScopedLock sl (pointLock); - - if (isPositiveAndBelow ((int) index, points.size())) - { - ParamPoint e (points.getUnchecked ((int) index)); - sampleOffset = e.sampleOffset; - value = e.value; - return kResultTrue; - } - - sampleOffset = -1; - value = 0.0; - return kResultFalse; - } - - Steinberg::tresult PLUGIN_API addPoint (Steinberg::int32 sampleOffset, - Steinberg::Vst::ParamValue value, - Steinberg::int32& index) override - { - ParamPoint p = { sampleOffset, value }; - - const ScopedLock sl (pointLock); - index = (Steinberg::int32) points.size(); - points.add (p); - return kResultTrue; - } - - void clear() noexcept - { - const ScopedLock sl (pointLock); - points.clearQuick(); - } - - private: - struct ParamPoint - { - Steinberg::int32 sampleOffset; - Steinberg::Vst::ParamValue value; - }; - - Atomic refCount; - const Vst::ParamID paramID; - Array points; - CriticalSection pointLock; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParamValueQueue) - }; - - Atomic refCount; - OwnedArray queues; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParamValueQueueList) - }; - -private: - //============================================================================== - VST3ModuleHandle::Ptr module; - - friend VST3HostContext; - ComSmartPtr host; - - // Information objects: - String company; - ScopedPointer info; - ScopedPointer info2; - ScopedPointer infoW; - - // Rudimentary interfaces: - ComSmartPtr component; - ComSmartPtr editController; - ComSmartPtr editController2; - ComSmartPtr processor; - ComSmartPtr componentHandler; - ComSmartPtr componentHandler2; - ComSmartPtr unitInfo; - ComSmartPtr unitData; - ComSmartPtr programListData; - ComSmartPtr componentConnection; - ComSmartPtr editControllerConnection; - - /** The number of IO busses MUST match that of the plugin, - even if there aren't enough channels to process, - as very poorly specified by the Steinberg SDK - */ - int numInputAudioBusses, numOutputAudioBusses; - Array inputArrangements, outputArrangements; // Caching to improve performance and to avoid possible non-thread-safe calls to getBusArrangements(). - VST3BufferExchange::BusMap inputBusMap, outputBusMap; - Array inputBusses, outputBusses; - - //============================================================================== - template - static void appendStateFrom (XmlElement& head, ComSmartPtr& object, const String& identifier) - { - if (object != nullptr) - { - Steinberg::MemoryStream stream; - - if (object->getState (&stream) == kResultTrue) - { - MemoryBlock info (stream.getData(), (size_t) stream.getSize()); - head.createNewChildElement (identifier)->addTextElement (info.toBase64Encoding()); - } - } - } - - static Steinberg::MemoryStream* createMemoryStreamForState (XmlElement& head, StringRef identifier) - { - Steinberg::MemoryStream* stream = nullptr; - - if (XmlElement* const state = head.getChildByName (identifier)) - { - MemoryBlock mem; - - if (mem.fromBase64Encoding (state->getAllSubText())) - { - stream = new Steinberg::MemoryStream(); - stream->setSize ((TSize) mem.getSize()); - mem.copyTo (stream->getData(), 0, mem.getSize()); - } - } - - return stream; - } - - ComSmartPtr inputParameterChanges, outputParameterChanges; - ComSmartPtr midiInputs, midiOutputs; - Vst::ProcessContext timingInfo; //< Only use this in processBlock()! - bool isComponentInitialised, isControllerInitialised, isActive; - - //============================================================================== - bool fetchComponentAndController (IPluginFactory* factory, const Steinberg::int32 numClasses) - { - jassert (numClasses >= 0); // The plugin must provide at least an IComponent and IEditController! - - for (Steinberg::int32 j = 0; j < numClasses; ++j) - { - info = new PClassInfo(); - factory->getClassInfo (j, info); - - if (std::strcmp (info->category, kVstAudioEffectClass) != 0) - continue; - - const String name (toString (info->name).trim()); - - if (module->name != name) - continue; - - { - ComSmartPtr pf2; - ComSmartPtr pf3; - - if (pf2.loadFrom (factory)) - { - info2 = new PClassInfo2(); - pf2->getClassInfo2 (j, info2); - } - else - { - info2 = nullptr; - } - - if (pf3.loadFrom (factory)) - { - pf3->setHostContext (host->getFUnknown()); - infoW = new PClassInfoW(); - pf3->getClassInfoUnicode (j, infoW); - } - else - { - infoW = nullptr; - } - } - - bool failed = true; - - if (component.loadFrom (factory, info->cid) && component != nullptr) - { - warnOnFailure (component->setIoMode (isNonRealtime() ? Vst::kOffline : Vst::kRealtime)); - - if (warnOnFailure (component->initialize (host->getFUnknown())) != kResultOk) - return false; - - isComponentInitialised = true; - - // Get the IEditController: - TUID controllerCID = { 0 }; - - if (component->getControllerClassId (controllerCID) == kResultTrue && FUID (controllerCID).isValid()) - editController.loadFrom (factory, controllerCID); - - if (editController == nullptr) - { - // Try finding the IEditController the long way around: - for (Steinberg::int32 i = 0; i < numClasses; ++i) - { - PClassInfo classInfo; - factory->getClassInfo (i, &classInfo); - - if (std::strcmp (classInfo.category, kVstComponentControllerClass) == 0) - editController.loadFrom (factory, classInfo.cid); - } - } - - if (editController == nullptr) - editController.loadFrom (component); - - failed = editController == nullptr; - } - - if (failed) - { - jassertfalse; // The plugin won't function without a valid IComponent and IEditController implementation! - - if (component != nullptr) - { - component->terminate(); - component = nullptr; - } - - if (editController != nullptr) - { - editController->terminate(); - editController = nullptr; - } - - break; - } - - return true; - } - - return false; - } - - /** Some plugins need to be "connected" to intercommunicate between their implemented classes */ - void interconnectComponentAndController() - { - componentConnection.loadFrom (component); - editControllerConnection.loadFrom (editController); - - if (componentConnection != nullptr && editControllerConnection != nullptr) - { - warnOnFailure (editControllerConnection->connect (componentConnection)); - warnOnFailure (componentConnection->connect (editControllerConnection)); - } - } - - void synchroniseStates() - { - Steinberg::MemoryStream stream; - - if (component->getState (&stream) == kResultTrue) - if (stream.seek (0, Steinberg::IBStream::kIBSeekSet, nullptr) == kResultTrue) - warnOnFailure (editController->setComponentState (&stream)); - } - - void grabInformationObjects() - { - processor.loadFrom (component); - unitInfo.loadFrom (component); - programListData.loadFrom (component); - unitData.loadFrom (component); - editController2.loadFrom (component); - componentHandler.loadFrom (component); - componentHandler2.loadFrom (component); - - if (processor == nullptr) processor.loadFrom (editController); - if (unitInfo == nullptr) unitInfo.loadFrom (editController); - if (programListData == nullptr) programListData.loadFrom (editController); - if (unitData == nullptr) unitData.loadFrom (editController); - if (editController2 == nullptr) editController2.loadFrom (editController); - if (componentHandler == nullptr) componentHandler.loadFrom (editController); - if (componentHandler2 == nullptr) componentHandler2.loadFrom (editController); - } - - void setStateForAllBusses (bool newState) - { - setStateForAllBussesOfType (component, newState, true, true); // Activate/deactivate audio inputs - setStateForAllBussesOfType (component, newState, false, true); // Activate/deactivate audio outputs - setStateForAllBussesOfType (component, newState, true, false); // Activate/deactivate MIDI inputs - setStateForAllBussesOfType (component, newState, false, false); // Activate/deactivate MIDI outputs - } - - void setupIO() - { - setStateForAllBusses (true); - - Vst::ProcessSetup setup; - setup.symbolicSampleSize = Vst::kSample32; - setup.maxSamplesPerBlock = 1024; - setup.sampleRate = 44100.0; - setup.processMode = Vst::kRealtime; - - warnOnFailure (processor->setupProcessing (setup)); - - numInputAudioBusses = getNumSingleDirectionBussesFor (component, true, true); - numOutputAudioBusses = getNumSingleDirectionBussesFor (component, false, true); - - setPlayConfigDetails (getNumSingleDirectionChannelsFor (component, true, true), - getNumSingleDirectionChannelsFor (component, false, true), - setup.sampleRate, (int) setup.maxSamplesPerBlock); - } - - //============================================================================== - Vst::BusInfo getBusInfo (bool forInput, bool forAudio, int index = 0) const - { - Vst::BusInfo busInfo; - busInfo.mediaType = forAudio ? Vst::kAudio : Vst::kEvent; - busInfo.direction = forInput ? Vst::kInput : Vst::kOutput; - - component->getBusInfo (busInfo.mediaType, busInfo.direction, - (Steinberg::int32) index, busInfo); - return busInfo; - } - - //============================================================================== - /** @note An IPlugView, when first created, should start with a ref-count of 1! */ - IPlugView* tryCreatingView() const - { - IPlugView* v = editController->createView (Vst::ViewType::kEditor); - - if (v == nullptr) v = editController->createView (nullptr); - if (v == nullptr) editController->queryInterface (IPlugView::iid, (void**) &v); - - return v; - } - - //============================================================================== - void associateTo (Vst::ProcessData& destination, AudioSampleBuffer& buffer) - { - using namespace VST3BufferExchange; - - mapBufferToBusses (inputBusses, inputBusMap, inputArrangements, buffer); - mapBufferToBusses (outputBusses, outputBusMap, outputArrangements, buffer); - - destination.inputs = inputBusses.getRawDataPointer(); - destination.outputs = outputBusses.getRawDataPointer(); - } - - void associateTo (Vst::ProcessData& destination, MidiBuffer& midiBuffer) - { - midiInputs->clear(); - midiOutputs->clear(); - - MidiEventList::toEventList (*midiInputs, midiBuffer); - - destination.inputEvents = midiInputs; - destination.outputEvents = midiOutputs; - } - - void updateTimingInformation (Vst::ProcessData& destination, double processSampleRate) - { - toProcessContext (timingInfo, getPlayHead(), processSampleRate); - destination.processContext = &timingInfo; - } - - Vst::ParameterInfo getParameterInfoForIndex (int index) const - { - Vst::ParameterInfo paramInfo = { 0 }; - - if (processor != nullptr) - editController->getParameterInfo (index, paramInfo); - - return paramInfo; - } - - Vst::ProgramListInfo getProgramListInfo (int index) const - { - Vst::ProgramListInfo paramInfo = { 0 }; - - if (unitInfo != nullptr) - unitInfo->getProgramListInfo (index, paramInfo); - - return paramInfo; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginInstance) -}; - -}; - -//============================================================================== -VST3PluginFormat::VST3PluginFormat() {} -VST3PluginFormat::~VST3PluginFormat() {} - -void VST3PluginFormat::findAllTypesForFile (OwnedArray& results, const String& fileOrIdentifier) -{ - if (! fileMightContainThisPluginType (fileOrIdentifier)) - return; - - VST3Classes::VST3ModuleHandle::getAllDescriptionsForFile (results, fileOrIdentifier); -} - -AudioPluginInstance* VST3PluginFormat::createInstanceFromDescription (const PluginDescription& description, double, int) -{ - ScopedPointer result; - - if (fileMightContainThisPluginType (description.fileOrIdentifier)) - { - File file (description.fileOrIdentifier); - - const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); - file.getParentDirectory().setAsCurrentWorkingDirectory(); - - if (const VST3Classes::VST3ModuleHandle::Ptr module = VST3Classes::VST3ModuleHandle::findOrCreateModule (file, description)) - { - result = new VST3Classes::VST3PluginInstance (module); - - if (! result->initialise()) - result = nullptr; - } - - previousWorkingDirectory.setAsCurrentWorkingDirectory(); - } - - return result.release(); -} - -bool VST3PluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) -{ - const File f (File::createFileWithoutCheckingPath (fileOrIdentifier)); - - return f.hasFileExtension (".vst3") - #if JUCE_MAC - && f.exists(); - #else - && f.existsAsFile(); - #endif -} - -String VST3PluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) -{ - return fileOrIdentifier; //Impossible to tell because every VST3 is a type of shell... -} - -bool VST3PluginFormat::pluginNeedsRescanning (const PluginDescription& description) -{ - return File (description.fileOrIdentifier).getLastModificationTime() != description.lastFileModTime; -} - -bool VST3PluginFormat::doesPluginStillExist (const PluginDescription& description) -{ - return File (description.fileOrIdentifier).exists(); -} - -StringArray VST3PluginFormat::searchPathsForPlugins (const FileSearchPath& directoriesToSearch, const bool recursive) -{ - StringArray results; - - for (int i = 0; i < directoriesToSearch.getNumPaths(); ++i) - recursiveFileSearch (results, directoriesToSearch[i], recursive); - - return results; -} - -void VST3PluginFormat::recursiveFileSearch (StringArray& results, const File& directory, const bool recursive) -{ - DirectoryIterator iter (directory, false, "*", File::findFilesAndDirectories); - - while (iter.next()) - { - const File f (iter.getFile()); - bool isPlugin = false; - - if (fileMightContainThisPluginType (f.getFullPathName())) - { - isPlugin = true; - results.add (f.getFullPathName()); - } - - if (recursive && (! isPlugin) && f.isDirectory()) - recursiveFileSearch (results, f, true); - } -} - -FileSearchPath VST3PluginFormat::getDefaultLocationsToSearch() -{ - #if JUCE_WINDOWS - const String programFiles (File::getSpecialLocation (File::globalApplicationsDirectory).getFullPathName()); - return FileSearchPath (programFiles + "\\Common Files\\VST3"); - #elif JUCE_MAC - return FileSearchPath ("/Library/Audio/Plug-Ins/VST3;~/Library/Audio/Plug-Ins/VST3"); - #else - return FileSearchPath(); - #endif -} - -#endif //JUCE_PLUGINHOST_VST3 diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h deleted file mode 100755 index 308ff5a..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_VST3PLUGINFORMAT_H_INCLUDED -#define JUCE_VST3PLUGINFORMAT_H_INCLUDED - -#if JUCE_PLUGINHOST_VST3 -/** - Implements a plugin format for VST3s. -*/ -class JUCE_API VST3PluginFormat : public AudioPluginFormat -{ -public: - /** Constructor */ - VST3PluginFormat(); - - /** Destructor */ - ~VST3PluginFormat(); - - //============================================================================== - /** @internal */ - String getName() const override { return "VST3"; } - /** @internal */ - void findAllTypesForFile (OwnedArray& results, const String& fileOrIdentifier) override; - /** @internal */ - AudioPluginInstance* createInstanceFromDescription (const PluginDescription& description, double, int) override; - /** @internal */ - bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; - /** @internal */ - String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; - /** @internal */ - bool pluginNeedsRescanning (const PluginDescription& description) override; - /** @internal */ - StringArray searchPathsForPlugins (const FileSearchPath& searchPath, bool recursive) override; - /** @internal */ - bool doesPluginStillExist (const PluginDescription& description) override; - /** @internal */ - FileSearchPath getDefaultLocationsToSearch() override; - /** @internal */ - bool canScanForPlugins() const override { return true; } - -private: - //============================================================================== - void recursiveFileSearch (StringArray&, const File&, bool recursive); - - //============================================================================== - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VST3PluginFormat) -}; - -#endif // JUCE_PLUGINHOST_VST3 -#endif // JUCE_VST3PLUGINFORMAT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h deleted file mode 100755 index f442eab..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTMidiEventList.h +++ /dev/null @@ -1,187 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifdef __aeffect__ // NB: this must come first, *before* the header-guard. - -#ifndef JUCE_VSTMIDIEVENTLIST_H_INCLUDED -#define JUCE_VSTMIDIEVENTLIST_H_INCLUDED - -//============================================================================== -/** Holds a set of VSTMidiEvent objects and makes it easy to add - events to the list. - - This is used by both the VST hosting code and the plugin wrapper. -*/ -class VSTMidiEventList -{ -public: - //============================================================================== - VSTMidiEventList() - : numEventsUsed (0), numEventsAllocated (0) - { - } - - ~VSTMidiEventList() - { - freeEvents(); - } - - //============================================================================== - void clear() - { - numEventsUsed = 0; - - if (events != nullptr) - events->numEvents = 0; - } - - void addEvent (const void* const midiData, const int numBytes, const int frameOffset) - { - ensureSize (numEventsUsed + 1); - - VstMidiEvent* const e = (VstMidiEvent*) (events->events [numEventsUsed]); - events->numEvents = ++numEventsUsed; - - if (numBytes <= 4) - { - if (e->type == kVstSysExType) - { - delete[] (((VstMidiSysexEvent*) e)->sysexDump); - e->type = kVstMidiType; - e->byteSize = sizeof (VstMidiEvent); - e->noteLength = 0; - e->noteOffset = 0; - e->detune = 0; - e->noteOffVelocity = 0; - } - - e->deltaFrames = frameOffset; - memcpy (e->midiData, midiData, (size_t) numBytes); - } - else - { - VstMidiSysexEvent* const se = (VstMidiSysexEvent*) e; - - if (se->type == kVstSysExType) - delete[] se->sysexDump; - - se->sysexDump = new char [numBytes]; - memcpy (se->sysexDump, midiData, (size_t) numBytes); - - se->type = kVstSysExType; - se->byteSize = sizeof (VstMidiSysexEvent); - se->deltaFrames = frameOffset; - se->flags = 0; - se->dumpBytes = numBytes; - se->resvd1 = 0; - se->resvd2 = 0; - } - } - - //============================================================================== - // Handy method to pull the events out of an event buffer supplied by the host - // or plugin. - static void addEventsToMidiBuffer (const VstEvents* events, MidiBuffer& dest) - { - for (int i = 0; i < events->numEvents; ++i) - { - const VstEvent* const e = events->events[i]; - - if (e != nullptr) - { - if (e->type == kVstMidiType) - { - dest.addEvent ((const juce::uint8*) ((const VstMidiEvent*) e)->midiData, - 4, e->deltaFrames); - } - else if (e->type == kVstSysExType) - { - dest.addEvent ((const juce::uint8*) ((const VstMidiSysexEvent*) e)->sysexDump, - (int) ((const VstMidiSysexEvent*) e)->dumpBytes, - e->deltaFrames); - } - } - } - } - - //============================================================================== - void ensureSize (int numEventsNeeded) - { - if (numEventsNeeded > numEventsAllocated) - { - numEventsNeeded = (numEventsNeeded + 32) & ~31; - - const size_t size = 20 + sizeof (VstEvent*) * (size_t) numEventsNeeded; - - if (events == nullptr) - events.calloc (size, 1); - else - events.realloc (size, 1); - - for (int i = numEventsAllocated; i < numEventsNeeded; ++i) - events->events[i] = allocateVSTEvent(); - - numEventsAllocated = numEventsNeeded; - } - } - - void freeEvents() - { - if (events != nullptr) - { - for (int i = numEventsAllocated; --i >= 0;) - freeVSTEvent (events->events[i]); - - events.free(); - numEventsUsed = 0; - numEventsAllocated = 0; - } - } - - //============================================================================== - HeapBlock events; - -private: - int numEventsUsed, numEventsAllocated; - - static VstEvent* allocateVSTEvent() - { - VstEvent* const e = (VstEvent*) std::calloc (1, sizeof (VstMidiEvent) > sizeof (VstMidiSysexEvent) ? sizeof (VstMidiEvent) - : sizeof (VstMidiSysexEvent)); - e->type = kVstMidiType; - e->byteSize = sizeof (VstMidiEvent); - return e; - } - - static void freeVSTEvent (VstEvent* e) - { - if (e->type == kVstSysExType) - delete[] (((VstMidiSysexEvent*) e)->sysexDump); - - std::free (e); - } -}; - -#endif // JUCE_VSTMIDIEVENTLIST_H_INCLUDED -#endif diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp deleted file mode 100755 index 3859061..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ /dev/null @@ -1,2896 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_PLUGINHOST_VST - -//============================================================================== -#if JUCE_MAC && JUCE_SUPPORT_CARBON - #include "../../juce_gui_extra/native/juce_mac_CarbonViewWrapperComponent.h" -#endif - -//============================================================================== -#undef PRAGMA_ALIGN_SUPPORTED -#define VST_FORCE_DEPRECATED 0 - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4996) -#elif ! JUCE_MINGW - #define __cdecl -#endif - -/* Obviously you're going to need the Steinberg vstsdk2.4 folder in - your include path if you want to add VST support. - - If you're not interested in VSTs, you can disable them by setting the - JUCE_PLUGINHOST_VST flag to 0. -*/ -#include "pluginterfaces/vst2.x/aeffectx.h" - -#if JUCE_MSVC - #pragma warning (pop) - #pragma warning (disable: 4355) // ("this" used in initialiser list warning) -#endif - -//============================================================================== -#include "juce_VSTMidiEventList.h" - -#if JUCE_MINGW - #ifndef WM_APPCOMMAND - #define WM_APPCOMMAND 0x0319 - #endif - - extern "C" void _fpreset(); - extern "C" void _clearfp(); -#elif ! JUCE_WINDOWS - static void _fpreset() {} - static void _clearfp() {} -#endif - -#ifndef JUCE_VST_WRAPPER_LOAD_CUSTOM_MAIN - #define JUCE_VST_WRAPPER_LOAD_CUSTOM_MAIN -#endif - -#ifndef JUCE_VST_WRAPPER_INVOKE_MAIN - #define JUCE_VST_WRAPPER_INVOKE_MAIN effect = module->moduleMain (&audioMaster); -#endif - -//============================================================================== -namespace -{ - const int fxbVersionNum = 1; - - struct fxProgram - { - VstInt32 chunkMagic; // 'CcnK' - VstInt32 byteSize; // of this chunk, excl. magic + byteSize - VstInt32 fxMagic; // 'FxCk' - VstInt32 version; - VstInt32 fxID; // fx unique id - VstInt32 fxVersion; - VstInt32 numParams; - char prgName[28]; - float params[1]; // variable no. of parameters - }; - - struct fxSet - { - VstInt32 chunkMagic; // 'CcnK' - VstInt32 byteSize; // of this chunk, excl. magic + byteSize - VstInt32 fxMagic; // 'FxBk' - VstInt32 version; - VstInt32 fxID; // fx unique id - VstInt32 fxVersion; - VstInt32 numPrograms; - char future[128]; - fxProgram programs[1]; // variable no. of programs - }; - - struct fxChunkSet - { - VstInt32 chunkMagic; // 'CcnK' - VstInt32 byteSize; // of this chunk, excl. magic + byteSize - VstInt32 fxMagic; // 'FxCh', 'FPCh', or 'FBCh' - VstInt32 version; - VstInt32 fxID; // fx unique id - VstInt32 fxVersion; - VstInt32 numPrograms; - char future[128]; - VstInt32 chunkSize; - char chunk[8]; // variable - }; - - struct fxProgramSet - { - VstInt32 chunkMagic; // 'CcnK' - VstInt32 byteSize; // of this chunk, excl. magic + byteSize - VstInt32 fxMagic; // 'FxCh', 'FPCh', or 'FBCh' - VstInt32 version; - VstInt32 fxID; // fx unique id - VstInt32 fxVersion; - VstInt32 numPrograms; - char name[28]; - VstInt32 chunkSize; - char chunk[8]; // variable - }; - - // Compares a magic value in either endianness. - static bool compareMagic (VstInt32 magic, const char* name) noexcept - { - return magic == (VstInt32) ByteOrder::littleEndianInt (name) - || magic == (VstInt32) ByteOrder::bigEndianInt (name); - } - - static VstInt32 fxbName (const char* name) noexcept { return (VstInt32) ByteOrder::littleEndianInt (name); } - static VstInt32 fxbSwap (const VstInt32 x) noexcept { return (VstInt32) ByteOrder::swapIfLittleEndian ((uint32) x); } - - static float fxbSwapFloat (const float x) noexcept - { - #ifdef JUCE_LITTLE_ENDIAN - union { uint32 asInt; float asFloat; } n; - n.asFloat = x; - n.asInt = ByteOrder::swap (n.asInt); - return n.asFloat; - #else - return x; - #endif - } -} - -//============================================================================== -namespace -{ - static double getVSTHostTimeNanoseconds() noexcept - { - #if JUCE_WINDOWS - return timeGetTime() * 1000000.0; - #elif JUCE_LINUX - timeval micro; - gettimeofday (µ, 0); - return micro.tv_usec * 1000.0; - #elif JUCE_MAC - UnsignedWide micro; - Microseconds (µ); - return micro.lo * 1000.0; - #endif - } - - static int shellUIDToCreate = 0; - static int insideVSTCallback = 0; - - struct IdleCallRecursionPreventer - { - IdleCallRecursionPreventer() : isMessageThread (MessageManager::getInstance()->isThisTheMessageThread()) - { - if (isMessageThread) - ++insideVSTCallback; - } - - ~IdleCallRecursionPreventer() - { - if (isMessageThread) - --insideVSTCallback; - } - - const bool isMessageThread; - JUCE_DECLARE_NON_COPYABLE (IdleCallRecursionPreventer) - }; - - #if JUCE_MAC - static bool makeFSRefFromPath (FSRef* destFSRef, const String& path) - { - return FSPathMakeRef (reinterpret_cast (path.toRawUTF8()), destFSRef, 0) == noErr; - } - #endif - - #if JUCE_MAC && JUCE_PPC - static void* newCFMFromMachO (void* const machofp) noexcept - { - void* result = (void*) new char[8]; - - ((void**) result)[0] = machofp; - ((void**) result)[1] = result; - - return result; - } - #endif -} - -//============================================================================== -typedef AEffect* (VSTCALLBACK *MainCall) (audioMasterCallback); -static VstIntPtr VSTCALLBACK audioMaster (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt); - -//============================================================================== -// Change this to disable logging of various VST activities -#ifndef VST_LOGGING - #define VST_LOGGING 1 -#endif - -#if VST_LOGGING - #define JUCE_VST_LOG(a) Logger::writeToLog(a); -#else - #define JUCE_VST_LOG(a) -#endif - -//============================================================================== -#if JUCE_LINUX - -extern Display* display; -extern XContext windowHandleXContext; - -namespace -{ - static bool xErrorTriggered = false; - - static int temporaryErrorHandler (Display*, XErrorEvent*) - { - xErrorTriggered = true; - return 0; - } - - typedef void (*EventProcPtr) (XEvent* ev); - - static EventProcPtr getPropertyFromXWindow (Window handle, Atom atom) - { - XErrorHandler oldErrorHandler = XSetErrorHandler (temporaryErrorHandler); - xErrorTriggered = false; - - int userSize; - unsigned long bytes, userCount; - unsigned char* data; - Atom userType; - - XGetWindowProperty (display, handle, atom, 0, 1, false, AnyPropertyType, - &userType, &userSize, &userCount, &bytes, &data); - - XSetErrorHandler (oldErrorHandler); - - return (userCount == 1 && ! xErrorTriggered) ? *reinterpret_cast (data) : nullptr; - } - - Window getChildWindow (Window windowToCheck) - { - Window rootWindow, parentWindow; - Window* childWindows; - unsigned int numChildren = 0; - - XQueryTree (display, windowToCheck, &rootWindow, &parentWindow, &childWindows, &numChildren); - - if (numChildren > 0) - return childWindows [0]; - - return 0; - } - - static void translateJuceToXButtonModifiers (const MouseEvent& e, XEvent& ev) noexcept - { - if (e.mods.isLeftButtonDown()) - { - ev.xbutton.button = Button1; - ev.xbutton.state |= Button1Mask; - } - else if (e.mods.isRightButtonDown()) - { - ev.xbutton.button = Button3; - ev.xbutton.state |= Button3Mask; - } - else if (e.mods.isMiddleButtonDown()) - { - ev.xbutton.button = Button2; - ev.xbutton.state |= Button2Mask; - } - } - - static void translateJuceToXMotionModifiers (const MouseEvent& e, XEvent& ev) noexcept - { - if (e.mods.isLeftButtonDown()) ev.xmotion.state |= Button1Mask; - else if (e.mods.isRightButtonDown()) ev.xmotion.state |= Button3Mask; - else if (e.mods.isMiddleButtonDown()) ev.xmotion.state |= Button2Mask; - } - - static void translateJuceToXCrossingModifiers (const MouseEvent& e, XEvent& ev) noexcept - { - if (e.mods.isLeftButtonDown()) ev.xcrossing.state |= Button1Mask; - else if (e.mods.isRightButtonDown()) ev.xcrossing.state |= Button3Mask; - else if (e.mods.isMiddleButtonDown()) ev.xcrossing.state |= Button2Mask; - } - - static void translateJuceToXMouseWheelModifiers (const MouseEvent& e, const float increment, XEvent& ev) noexcept - { - if (increment < 0) - { - ev.xbutton.button = Button5; - ev.xbutton.state |= Button5Mask; - } - else if (increment > 0) - { - ev.xbutton.button = Button4; - ev.xbutton.state |= Button4Mask; - } - } -} - -#endif - -//============================================================================== -class ModuleHandle : public ReferenceCountedObject -{ -public: - //============================================================================== - File file; - MainCall moduleMain, customMain; - String pluginName; - ScopedPointer vstXml; - - typedef ReferenceCountedObjectPtr Ptr; - - static Array& getActiveModules() - { - static Array activeModules; - return activeModules; - } - - //============================================================================== - static ModuleHandle* findOrCreateModule (const File& file) - { - for (int i = getActiveModules().size(); --i >= 0;) - { - ModuleHandle* const module = getActiveModules().getUnchecked(i); - - if (module->file == file) - return module; - } - - _fpreset(); // (doesn't do any harm) - - const IdleCallRecursionPreventer icrp; - shellUIDToCreate = 0; - - JUCE_VST_LOG ("Attempting to load VST: " + file.getFullPathName()); - - ScopedPointer m (new ModuleHandle (file)); - - if (! m->open()) - m = nullptr; - - _fpreset(); // (doesn't do any harm) - - return m.release(); - } - - //============================================================================== - ModuleHandle (const File& f) - : file (f), moduleMain (nullptr), customMain (nullptr) - #if JUCE_MAC - #if JUCE_PPC - , fragId (0) - #endif - , resHandle (0), bundleRef (0), resFileId (0) - #endif - { - getActiveModules().add (this); - - #if JUCE_WINDOWS || JUCE_LINUX - fullParentDirectoryPathName = f.getParentDirectory().getFullPathName(); - #elif JUCE_MAC - FSRef ref; - makeFSRefFromPath (&ref, f.getParentDirectory().getFullPathName()); - FSGetCatalogInfo (&ref, kFSCatInfoNone, 0, 0, &parentDirFSSpec, 0); - #endif - } - - ~ModuleHandle() - { - getActiveModules().removeFirstMatchingValue (this); - close(); - } - - //============================================================================== -#if JUCE_WINDOWS || JUCE_LINUX - DynamicLibrary module; - String fullParentDirectoryPathName; - - bool open() - { - pluginName = file.getFileNameWithoutExtension(); - - module.open (file.getFullPathName()); - - moduleMain = (MainCall) module.getFunction ("VSTPluginMain"); - - if (moduleMain == nullptr) - moduleMain = (MainCall) module.getFunction ("main"); - - JUCE_VST_WRAPPER_LOAD_CUSTOM_MAIN - - if (moduleMain != nullptr) - { - vstXml = XmlDocument::parse (file.withFileExtension ("vstxml")); - - #if JUCE_WINDOWS - if (vstXml == nullptr) - vstXml = XmlDocument::parse (getDLLResource (file, "VSTXML", 1)); - #endif - } - - return moduleMain != nullptr; - } - - void close() - { - _fpreset(); // (doesn't do any harm) - - module.close(); - } - - void closeEffect (AEffect* eff) - { - eff->dispatcher (eff, effClose, 0, 0, 0, 0); - } - - #if JUCE_WINDOWS - static String getDLLResource (const File& dllFile, const String& type, int resID) - { - DynamicLibrary dll (dllFile.getFullPathName()); - HMODULE dllModule = (HMODULE) dll.getNativeHandle(); - - if (dllModule != INVALID_HANDLE_VALUE) - { - if (HRSRC res = FindResource (dllModule, MAKEINTRESOURCE (resID), type.toWideCharPointer())) - { - if (HGLOBAL hGlob = LoadResource (dllModule, res)) - { - const char* data = static_cast (LockResource (hGlob)); - return String::fromUTF8 (data, SizeofResource (dllModule, res)); - } - } - } - - return String::empty; - } - #endif -#else - #if JUCE_PPC - CFragConnectionID fragId; - #endif - Handle resHandle; - CFBundleRef bundleRef; - FSSpec parentDirFSSpec; - short resFileId; - - bool open() - { - bool ok = false; - - if (file.hasFileExtension (".vst")) - { - const char* const utf8 = file.getFullPathName().toRawUTF8(); - - if (CFURLRef url = CFURLCreateFromFileSystemRepresentation (0, (const UInt8*) utf8, - strlen (utf8), file.isDirectory())) - { - bundleRef = CFBundleCreate (kCFAllocatorDefault, url); - CFRelease (url); - - if (bundleRef != 0) - { - if (CFBundleLoadExecutable (bundleRef)) - { - moduleMain = (MainCall) CFBundleGetFunctionPointerForName (bundleRef, CFSTR("main_macho")); - - if (moduleMain == nullptr) - moduleMain = (MainCall) CFBundleGetFunctionPointerForName (bundleRef, CFSTR("VSTPluginMain")); - - JUCE_VST_WRAPPER_LOAD_CUSTOM_MAIN - - if (moduleMain != nullptr) - { - if (CFTypeRef name = CFBundleGetValueForInfoDictionaryKey (bundleRef, CFSTR("CFBundleName"))) - { - if (CFGetTypeID (name) == CFStringGetTypeID()) - { - char buffer[1024]; - - if (CFStringGetCString ((CFStringRef) name, buffer, sizeof (buffer), CFStringGetSystemEncoding())) - pluginName = buffer; - } - } - - if (pluginName.isEmpty()) - pluginName = file.getFileNameWithoutExtension(); - - resFileId = CFBundleOpenBundleResourceMap (bundleRef); - - ok = true; - - Array vstXmlFiles; - file.getChildFile ("Contents") - .getChildFile ("Resources") - .findChildFiles (vstXmlFiles, File::findFiles, false, "*.vstxml"); - - if (vstXmlFiles.size() > 0) - vstXml = XmlDocument::parse (vstXmlFiles.getReference(0)); - } - } - - if (! ok) - { - CFBundleUnloadExecutable (bundleRef); - CFRelease (bundleRef); - bundleRef = 0; - } - } - } - } - #if JUCE_PPC - else - { - FSRef fn; - - if (FSPathMakeRef ((UInt8*) file.getFullPathName().toRawUTF8(), &fn, 0) == noErr) - { - resFileId = FSOpenResFile (&fn, fsRdPerm); - - if (resFileId != -1) - { - const int numEffs = Count1Resources ('aEff'); - - for (int i = 0; i < numEffs; ++i) - { - resHandle = Get1IndResource ('aEff', i + 1); - - if (resHandle != 0) - { - OSType type; - Str255 name; - SInt16 id; - GetResInfo (resHandle, &id, &type, name); - pluginName = String ((const char*) name + 1, name[0]); - DetachResource (resHandle); - HLock (resHandle); - - ::Ptr ptr; - Str255 errorText; - - OSErr err = GetMemFragment (*resHandle, GetHandleSize (resHandle), - name, kPrivateCFragCopy, - &fragId, &ptr, errorText); - - if (err == noErr) - { - moduleMain = (MainCall) newMachOFromCFM (ptr); - ok = true; - } - else - { - HUnlock (resHandle); - } - - break; - } - } - - if (! ok) - CloseResFile (resFileId); - } - } - } - #endif - - return ok; - } - - void close() - { - #if JUCE_PPC - if (fragId != 0) - { - if (moduleMain != nullptr) - disposeMachOFromCFM ((void*) moduleMain); - - CloseConnection (&fragId); - HUnlock (resHandle); - - if (resFileId != 0) - CloseResFile (resFileId); - } - else - #endif - if (bundleRef != 0) - { - CFBundleCloseBundleResourceMap (bundleRef, resFileId); - - if (CFGetRetainCount (bundleRef) == 1) - CFBundleUnloadExecutable (bundleRef); - - if (CFGetRetainCount (bundleRef) > 0) - CFRelease (bundleRef); - } - } - - void closeEffect (AEffect* eff) - { - #if JUCE_PPC - if (fragId != 0) - { - Array thingsToDelete; - thingsToDelete.add ((void*) eff->dispatcher); - thingsToDelete.add ((void*) eff->process); - thingsToDelete.add ((void*) eff->setParameter); - thingsToDelete.add ((void*) eff->getParameter); - thingsToDelete.add ((void*) eff->processReplacing); - - eff->dispatcher (eff, effClose, 0, 0, 0, 0); - - for (int i = thingsToDelete.size(); --i >= 0;) - disposeMachOFromCFM (thingsToDelete[i]); - } - else - #endif - { - eff->dispatcher (eff, effClose, 0, 0, 0, 0); - } - } - - #if JUCE_PPC - static void* newMachOFromCFM (void* cfmfp) - { - if (cfmfp == 0) - return nullptr; - - UInt32* const mfp = new UInt32[6]; - - mfp[0] = 0x3d800000 | ((UInt32) cfmfp >> 16); - mfp[1] = 0x618c0000 | ((UInt32) cfmfp & 0xffff); - mfp[2] = 0x800c0000; - mfp[3] = 0x804c0004; - mfp[4] = 0x7c0903a6; - mfp[5] = 0x4e800420; - - MakeDataExecutable (mfp, sizeof (UInt32) * 6); - return mfp; - } - - static void disposeMachOFromCFM (void* ptr) - { - delete[] static_cast (ptr); - } - - void coerceAEffectFunctionCalls (AEffect* eff) - { - if (fragId != 0) - { - eff->dispatcher = (AEffectDispatcherProc) newMachOFromCFM ((void*) eff->dispatcher); - eff->process = (AEffectProcessProc) newMachOFromCFM ((void*) eff->process); - eff->setParameter = (AEffectSetParameterProc) newMachOFromCFM ((void*) eff->setParameter); - eff->getParameter = (AEffectGetParameterProc) newMachOFromCFM ((void*) eff->getParameter); - eff->processReplacing = (AEffectProcessProc) newMachOFromCFM ((void*) eff->processReplacing); - } - } - #endif - -#endif - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ModuleHandle) -}; - -static const int defaultVSTSampleRateValue = 44100; -static const int defaultVSTBlockSizeValue = 512; - -//============================================================================== -//============================================================================== -class VSTPluginInstance : public AudioPluginInstance, - private Timer, - private AsyncUpdater -{ -public: - VSTPluginInstance (const ModuleHandle::Ptr& mh) - : effect (nullptr), - module (mh), - usesCocoaNSView (false), - name (mh->pluginName), - wantsMidiMessages (false), - initialised (false), - isPowerOn (false), - tempBuffer (1, 1) - { - try - { - const IdleCallRecursionPreventer icrp; - _fpreset(); - - JUCE_VST_LOG ("Creating VST instance: " + name); - - #if JUCE_MAC - if (module->resFileId != 0) - UseResFile (module->resFileId); - - #if JUCE_PPC - if (module->fragId != 0) - { - static void* audioMasterCoerced = nullptr; - if (audioMasterCoerced == nullptr) - audioMasterCoerced = newCFMFromMachO ((void*) &audioMaster); - - effect = module->moduleMain ((audioMasterCallback) audioMasterCoerced); - } - else - #endif - #endif - { - JUCE_VST_WRAPPER_INVOKE_MAIN - } - - if (effect != nullptr && effect->magic == kEffectMagic) - { - #if JUCE_PPC - module->coerceAEffectFunctionCalls (effect); - #endif - - jassert (effect->resvd2 == 0); - jassert (effect->object != 0); - - _fpreset(); // some dodgy plugs fuck around with this - } - else - { - effect = nullptr; - } - } - catch (...) - {} - } - - ~VSTPluginInstance() - { - const ScopedLock sl (lock); - - if (effect != nullptr && effect->magic == kEffectMagic) - { - #if JUCE_MAC - if (module->resFileId != 0) - UseResFile (module->resFileId); - #endif - - // Must delete any editors before deleting the plugin instance! - jassert (getActiveEditor() == 0); - - _fpreset(); // some dodgy plugs fuck around with this - - module->closeEffect (effect); - } - - module = nullptr; - effect = nullptr; - } - - void fillInPluginDescription (PluginDescription& desc) const override - { - desc.name = name; - - { - char buffer [512] = { 0 }; - dispatch (effGetEffectName, 0, 0, buffer, 0); - - desc.descriptiveName = String::fromUTF8 (buffer).trim(); - - if (desc.descriptiveName.isEmpty()) - desc.descriptiveName = name; - } - - desc.fileOrIdentifier = module->file.getFullPathName(); - desc.uid = getUID(); - desc.lastFileModTime = module->file.getLastModificationTime(); - desc.pluginFormatName = "VST"; - desc.category = getCategory(); - - { - char buffer [kVstMaxVendorStrLen + 8] = { 0 }; - dispatch (effGetVendorString, 0, 0, buffer, 0); - desc.manufacturerName = String::fromUTF8 (buffer); - } - - desc.version = getVersion(); - desc.numInputChannels = getNumInputChannels(); - desc.numOutputChannels = getNumOutputChannels(); - desc.isInstrument = (effect != nullptr && (effect->flags & effFlagsIsSynth) != 0); - } - - void initialise (double initialSampleRate, int initialBlockSize) - { - if (initialised || effect == nullptr) - return; - - #if JUCE_WINDOWS - // On Windows it's highly advisable to create your plugins using the message thread, - // because many plugins need a chance to create HWNDs that will get their - // messages delivered by the main message thread, and that's not possible from - // a background thread. - jassert (MessageManager::getInstance()->isThisTheMessageThread()); - #endif - - JUCE_VST_LOG ("Initialising VST: " + module->pluginName + " (" + getVersion() + ")"); - initialised = true; - - setPlayConfigDetails (effect->numInputs, effect->numOutputs, - initialSampleRate, initialBlockSize); - - dispatch (effIdentify, 0, 0, 0, 0); - - if (getSampleRate() > 0) - dispatch (effSetSampleRate, 0, 0, 0, (float) getSampleRate()); - - if (getBlockSize() > 0) - dispatch (effSetBlockSize, 0, jmax (32, getBlockSize()), 0, 0); - - dispatch (effOpen, 0, 0, 0, 0); - - setPlayConfigDetails (effect->numInputs, effect->numOutputs, - getSampleRate(), getBlockSize()); - - if (getNumPrograms() > 1) - setCurrentProgram (0); - else - dispatch (effSetProgram, 0, 0, 0, 0); - - for (int i = effect->numInputs; --i >= 0;) dispatch (effConnectInput, i, 1, 0, 0); - for (int i = effect->numOutputs; --i >= 0;) dispatch (effConnectOutput, i, 1, 0, 0); - - if (getVstCategory() != kPlugCategShell) // (workaround for Waves 5 plugins which crash during this call) - updateStoredProgramNames(); - - wantsMidiMessages = dispatch (effCanDo, 0, 0, (void*) "receiveVstMidiEvent", 0) > 0; - - #if JUCE_MAC && JUCE_SUPPORT_CARBON - usesCocoaNSView = (dispatch (effCanDo, 0, 0, (void*) "hasCockosViewAsConfig", 0) & 0xffff0000) == 0xbeef0000; - #endif - - setLatencySamples (effect->initialDelay); - } - - void* getPlatformSpecificData() override { return effect; } - const String getName() const override { return name; } - - int getUID() const - { - int uid = effect != nullptr ? effect->uniqueID : 0; - - if (uid == 0) - uid = module->file.hashCode(); - - return uid; - } - - bool silenceInProducesSilenceOut() const override - { - return effect == nullptr || (effect->flags & effFlagsNoSoundInStop) != 0; - } - - double getTailLengthSeconds() const override - { - if (effect == nullptr) - return 0.0; - - const double sampleRate = getSampleRate(); - - if (sampleRate <= 0) - return 0.0; - - VstIntPtr samples = dispatch (effGetTailSize, 0, 0, 0, 0); - return samples / sampleRate; - } - - bool acceptsMidi() const override { return wantsMidiMessages; } - bool producesMidi() const override { return dispatch (effCanDo, 0, 0, (void*) "sendVstMidiEvent", 0) > 0; } - - VstPlugCategory getVstCategory() const noexcept { return (VstPlugCategory) dispatch (effGetPlugCategory, 0, 0, 0, 0); } - - //============================================================================== - void prepareToPlay (double rate, int samplesPerBlockExpected) override - { - setPlayConfigDetails (effect->numInputs, effect->numOutputs, rate, samplesPerBlockExpected); - - vstHostTime.tempo = 120.0; - vstHostTime.timeSigNumerator = 4; - vstHostTime.timeSigDenominator = 4; - vstHostTime.sampleRate = rate; - vstHostTime.samplePos = 0; - vstHostTime.flags = kVstNanosValid | kVstAutomationWriting | kVstAutomationReading; - - initialise (rate, samplesPerBlockExpected); - - if (initialised) - { - wantsMidiMessages = wantsMidiMessages - || (dispatch (effCanDo, 0, 0, (void*) "receiveVstMidiEvent", 0) > 0); - - if (wantsMidiMessages) - midiEventsToSend.ensureSize (256); - else - midiEventsToSend.freeEvents(); - - incomingMidi.clear(); - - dispatch (effSetSampleRate, 0, 0, 0, (float) rate); - dispatch (effSetBlockSize, 0, jmax (16, samplesPerBlockExpected), 0, 0); - - tempBuffer.setSize (jmax (1, effect->numOutputs), samplesPerBlockExpected); - - if (! isPowerOn) - setPower (true); - - // dodgy hack to force some plugins to initialise the sample rate.. - if ((! hasEditor()) && getNumParameters() > 0) - { - const float old = getParameter (0); - setParameter (0, (old < 0.5f) ? 1.0f : 0.0f); - setParameter (0, old); - } - - dispatch (effStartProcess, 0, 0, 0, 0); - - setLatencySamples (effect->initialDelay); - } - } - - void releaseResources() override - { - if (initialised) - { - dispatch (effStopProcess, 0, 0, 0, 0); - setPower (false); - } - - tempBuffer.setSize (1, 1); - incomingMidi.clear(); - - midiEventsToSend.freeEvents(); - } - - void reset() override - { - if (isPowerOn) - { - setPower (false); - setPower (true); - } - } - - void processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) override - { - const int numSamples = buffer.getNumSamples(); - - if (initialised) - { - if (AudioPlayHead* const playHead = getPlayHead()) - { - AudioPlayHead::CurrentPositionInfo position; - playHead->getCurrentPosition (position); - - vstHostTime.samplePos = (double) position.timeInSamples; - vstHostTime.tempo = position.bpm; - vstHostTime.timeSigNumerator = position.timeSigNumerator; - vstHostTime.timeSigDenominator = position.timeSigDenominator; - vstHostTime.ppqPos = position.ppqPosition; - vstHostTime.barStartPos = position.ppqPositionOfLastBarStart; - vstHostTime.flags |= kVstTempoValid | kVstTimeSigValid | kVstPpqPosValid | kVstBarsValid; - - VstInt32 newTransportFlags = 0; - if (position.isPlaying) newTransportFlags |= kVstTransportPlaying; - if (position.isRecording) newTransportFlags |= kVstTransportRecording; - - if (newTransportFlags != (vstHostTime.flags & (kVstTransportPlaying | kVstTransportRecording))) - vstHostTime.flags = (vstHostTime.flags & ~(kVstTransportPlaying | kVstTransportRecording)) | newTransportFlags | kVstTransportChanged; - else - vstHostTime.flags &= ~kVstTransportChanged; - - switch (position.frameRate) - { - case AudioPlayHead::fps24: setHostTimeFrameRate (0, 24.0, position.timeInSeconds); break; - case AudioPlayHead::fps25: setHostTimeFrameRate (1, 25.0, position.timeInSeconds); break; - case AudioPlayHead::fps2997: setHostTimeFrameRate (2, 29.97, position.timeInSeconds); break; - case AudioPlayHead::fps30: setHostTimeFrameRate (3, 30.0, position.timeInSeconds); break; - case AudioPlayHead::fps2997drop: setHostTimeFrameRate (4, 29.97, position.timeInSeconds); break; - case AudioPlayHead::fps30drop: setHostTimeFrameRate (5, 29.97, position.timeInSeconds); break; - default: break; - } - - if (position.isLooping) - { - vstHostTime.cycleStartPos = position.ppqLoopStart; - vstHostTime.cycleEndPos = position.ppqLoopEnd; - vstHostTime.flags |= (kVstCyclePosValid | kVstTransportCycleActive); - } - else - { - vstHostTime.flags &= ~(kVstCyclePosValid | kVstTransportCycleActive); - } - } - - vstHostTime.nanoSeconds = getVSTHostTimeNanoseconds(); - - if (wantsMidiMessages) - { - midiEventsToSend.clear(); - midiEventsToSend.ensureSize (1); - - MidiBuffer::Iterator iter (midiMessages); - const uint8* midiData; - int numBytesOfMidiData, samplePosition; - - while (iter.getNextEvent (midiData, numBytesOfMidiData, samplePosition)) - { - midiEventsToSend.addEvent (midiData, numBytesOfMidiData, - jlimit (0, numSamples - 1, samplePosition)); - } - - effect->dispatcher (effect, effProcessEvents, 0, 0, midiEventsToSend.events, 0); - } - - _clearfp(); - - if ((effect->flags & effFlagsCanReplacing) != 0) - { - effect->processReplacing (effect, buffer.getArrayOfWritePointers(), buffer.getArrayOfWritePointers(), numSamples); - } - else - { - tempBuffer.setSize (effect->numOutputs, numSamples); - tempBuffer.clear(); - - effect->process (effect, buffer.getArrayOfWritePointers(), tempBuffer.getArrayOfWritePointers(), numSamples); - - for (int i = effect->numOutputs; --i >= 0;) - buffer.copyFrom (i, 0, tempBuffer.getReadPointer (i), numSamples); - } - } - else - { - // Not initialised, so just bypass.. - for (int i = 0; i < getNumOutputChannels(); ++i) - buffer.clear (i, 0, buffer.getNumSamples()); - } - - { - // copy any incoming midi.. - const ScopedLock sl (midiInLock); - - midiMessages.swapWith (incomingMidi); - incomingMidi.clear(); - } - } - - //============================================================================== - bool hasEditor() const override { return effect != nullptr && (effect->flags & effFlagsHasEditor) != 0; } - AudioProcessorEditor* createEditor() override; - - //============================================================================== - const String getInputChannelName (int index) const override - { - if (index >= 0 && index < getNumInputChannels()) - { - VstPinProperties pinProps; - if (dispatch (effGetInputProperties, index, 0, &pinProps, 0.0f) != 0) - return String (pinProps.label, sizeof (pinProps.label)); - } - - return String::empty; - } - - bool isInputChannelStereoPair (int index) const override - { - if (index < 0 || index >= getNumInputChannels()) - return false; - - VstPinProperties pinProps; - if (dispatch (effGetInputProperties, index, 0, &pinProps, 0.0f) != 0) - return (pinProps.flags & kVstPinIsStereo) != 0; - - return true; - } - - const String getOutputChannelName (int index) const override - { - if (index >= 0 && index < getNumOutputChannels()) - { - VstPinProperties pinProps; - if (dispatch (effGetOutputProperties, index, 0, &pinProps, 0.0f) != 0) - return String (pinProps.label, sizeof (pinProps.label)); - } - - return String::empty; - } - - bool isOutputChannelStereoPair (int index) const override - { - if (index < 0 || index >= getNumOutputChannels()) - return false; - - VstPinProperties pinProps; - if (dispatch (effGetOutputProperties, index, 0, &pinProps, 0.0f) != 0) - return (pinProps.flags & kVstPinIsStereo) != 0; - - return true; - } - - bool isValidChannel (int index, bool isInput) const - { - return isPositiveAndBelow (index, isInput ? getNumInputChannels() : getNumOutputChannels()); - } - - //============================================================================== - int getNumParameters() { return effect != nullptr ? effect->numParams : 0; } - - float getParameter (int index) override - { - if (effect != nullptr && isPositiveAndBelow (index, (int) effect->numParams)) - { - const ScopedLock sl (lock); - return effect->getParameter (effect, index); - } - - return 0.0f; - } - - void setParameter (int index, float newValue) override - { - if (effect != nullptr && isPositiveAndBelow (index, (int) effect->numParams)) - { - const ScopedLock sl (lock); - - if (effect->getParameter (effect, index) != newValue) - effect->setParameter (effect, index, newValue); - } - } - - const String getParameterName (int index) override { return getTextForOpcode (index, effGetParamName); } - const String getParameterText (int index) override { return getTextForOpcode (index, effGetParamDisplay); } - String getParameterLabel (int index) const override { return getTextForOpcode (index, effGetParamLabel); } - - bool isParameterAutomatable (int index) const override - { - if (effect != nullptr) - { - jassert (index >= 0 && index < effect->numParams); - return dispatch (effCanBeAutomated, index, 0, 0, 0) != 0; - } - - return false; - } - - //============================================================================== - int getNumPrograms() override { return effect != nullptr ? jmax (0, effect->numPrograms) : 0; } - - // NB: some plugs return negative numbers from this function. - int getCurrentProgram() override { return (int) dispatch (effGetProgram, 0, 0, 0, 0); } - - void setCurrentProgram (int newIndex) override - { - if (getNumPrograms() > 0 && newIndex != getCurrentProgram()) - dispatch (effSetProgram, 0, jlimit (0, getNumPrograms() - 1, newIndex), 0, 0); - } - - const String getProgramName (int index) override - { - if (index >= 0) - { - if (index == getCurrentProgram()) - return getCurrentProgramName(); - - if (effect != nullptr) - { - char nm[264] = { 0 }; - - if (dispatch (effGetProgramNameIndexed, jlimit (0, getNumPrograms(), index), -1, nm, 0) != 0) - return String::fromUTF8 (nm).trim(); - } - } - - return programNames [index]; - } - - void changeProgramName (int index, const String& newName) override - { - if (index >= 0 && index == getCurrentProgram()) - { - if (getNumPrograms() > 0 && newName != getCurrentProgramName()) - dispatch (effSetProgramName, 0, 0, (void*) newName.substring (0, 24).toRawUTF8(), 0.0f); - } - else - { - jassertfalse; // xxx not implemented! - } - } - - //============================================================================== - void getStateInformation (MemoryBlock& mb) override { saveToFXBFile (mb, true); } - void getCurrentProgramStateInformation (MemoryBlock& mb) override { saveToFXBFile (mb, false); } - - void setStateInformation (const void* data, int size) override { loadFromFXBFile (data, size); } - void setCurrentProgramStateInformation (const void* data, int size) override { loadFromFXBFile (data, size); } - - //============================================================================== - void timerCallback() override - { - if (dispatch (effIdle, 0, 0, 0, 0) == 0) - stopTimer(); - } - - void handleAsyncUpdate() override - { - // indicates that something about the plugin has changed.. - updateHostDisplay(); - } - - VstIntPtr handleCallback (VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) - { - switch (opcode) - { - case audioMasterAutomate: sendParamChangeMessageToListeners (index, opt); break; - case audioMasterProcessEvents: handleMidiFromPlugin ((const VstEvents*) ptr); break; - - #if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4311) - #endif - case audioMasterGetTime: return (VstIntPtr) &vstHostTime; - #if JUCE_MSVC - #pragma warning (pop) - #endif - - case audioMasterIdle: - if (insideVSTCallback == 0 && MessageManager::getInstance()->isThisTheMessageThread()) - { - const IdleCallRecursionPreventer icrp; - - #if JUCE_MAC - if (getActiveEditor() != nullptr) - dispatch (effEditIdle, 0, 0, 0, 0); - #endif - - Timer::callPendingTimersSynchronously(); - - handleUpdateNowIfNeeded(); - - for (int i = ComponentPeer::getNumPeers(); --i >= 0;) - if (ComponentPeer* p = ComponentPeer::getPeer(i)) - p->performAnyPendingRepaintsNow(); - } - break; - - case audioMasterSizeWindow: - if (AudioProcessorEditor* ed = getActiveEditor()) - ed->setSize (index, (int) value); - - return 1; - - case audioMasterUpdateDisplay: triggerAsyncUpdate(); break; - case audioMasterIOChanged: setLatencySamples (effect->initialDelay); break; - case audioMasterNeedIdle: startTimer (50); break; - - case audioMasterGetSampleRate: return (VstIntPtr) (getSampleRate() > 0 ? getSampleRate() : defaultVSTSampleRateValue); - case audioMasterGetBlockSize: return (VstIntPtr) (getBlockSize() > 0 ? getBlockSize() : defaultVSTBlockSizeValue); - case audioMasterWantMidi: wantsMidiMessages = true; break; - case audioMasterGetDirectory: return getVstDirectory(); - - case audioMasterTempoAt: - if (extraFunctions != nullptr) - return (VstIntPtr) extraFunctions->getTempoAt ((int64) value); - - break; - - case audioMasterGetAutomationState: - if (extraFunctions != nullptr) - return (VstIntPtr) extraFunctions->getAutomationState(); - - break; - - case audioMasterPinConnected: - return isValidChannel (index, value == 0) ? 0 : 1; // (yes, 0 = true) - - case audioMasterGetCurrentProcessLevel: - return isNonRealtime() ? 4 : 0; - - // none of these are handled (yet).. - case audioMasterBeginEdit: - case audioMasterEndEdit: - case audioMasterSetTime: - case audioMasterGetParameterQuantization: - case audioMasterGetInputLatency: - case audioMasterGetOutputLatency: - case audioMasterGetPreviousPlug: - case audioMasterGetNextPlug: - case audioMasterWillReplaceOrAccumulate: - case audioMasterOfflineStart: - case audioMasterOfflineRead: - case audioMasterOfflineWrite: - case audioMasterOfflineGetCurrentPass: - case audioMasterOfflineGetCurrentMetaPass: - case audioMasterVendorSpecific: - case audioMasterSetIcon: - case audioMasterGetLanguage: - case audioMasterOpenWindow: - case audioMasterCloseWindow: - break; - - default: - return handleGeneralCallback (opcode, index, value, ptr, opt); - } - - return 0; - } - - // handles non plugin-specific callbacks.. - static VstIntPtr handleGeneralCallback (VstInt32 opcode, VstInt32 /*index*/, VstIntPtr /*value*/, void *ptr, float /*opt*/) - { - switch (opcode) - { - case audioMasterCanDo: - { - static const char* canDos[] = { "supplyIdle", - "sendVstEvents", - "sendVstMidiEvent", - "sendVstTimeInfo", - "receiveVstEvents", - "receiveVstMidiEvent", - "supportShell", - "shellCategory" }; - - for (int i = 0; i < numElementsInArray (canDos); ++i) - if (strcmp (canDos[i], (const char*) ptr) == 0) - return 1; - - return 0; - } - - case audioMasterVersion: return 2400; - case audioMasterCurrentId: return shellUIDToCreate; - case audioMasterGetNumAutomatableParameters: return 0; - case audioMasterGetAutomationState: return 1; - case audioMasterGetVendorVersion: return 0x0101; - - case audioMasterGetVendorString: - case audioMasterGetProductString: - { - String hostName ("Juce VST Host"); - - if (JUCEApplicationBase* app = JUCEApplicationBase::getInstance()) - hostName = app->getApplicationName(); - - hostName.copyToUTF8 ((char*) ptr, (size_t) jmin (kVstMaxVendorStrLen, kVstMaxProductStrLen) - 1); - break; - } - - case audioMasterGetSampleRate: return (VstIntPtr) defaultVSTSampleRateValue; - case audioMasterGetBlockSize: return (VstIntPtr) defaultVSTBlockSizeValue; - case audioMasterSetOutputSampleRate: return 0; - - default: - DBG ("*** Unhandled VST Callback: " + String ((int) opcode)); - break; - } - - return 0; - } - - //============================================================================== - VstIntPtr dispatch (const int opcode, const int index, const VstIntPtr value, void* const ptr, float opt) const - { - VstIntPtr result = 0; - - if (effect != nullptr) - { - const ScopedLock sl (lock); - const IdleCallRecursionPreventer icrp; - - try - { - #if JUCE_MAC - const ResFileRefNum oldResFile = CurResFile(); - - if (module->resFileId != 0) - UseResFile (module->resFileId); - #endif - - result = effect->dispatcher (effect, opcode, index, value, ptr, opt); - - #if JUCE_MAC - const ResFileRefNum newResFile = CurResFile(); - if (newResFile != oldResFile) // avoid confusing the parent app's resource file with the plug-in's - { - module->resFileId = newResFile; - UseResFile (oldResFile); - } - #endif - } - catch (...) - {} - } - - return result; - } - - bool loadFromFXBFile (const void* const data, const size_t dataSize) - { - if (dataSize < 28) - return false; - - const fxSet* const set = (const fxSet*) data; - - if ((! compareMagic (set->chunkMagic, "CcnK")) || fxbSwap (set->version) > fxbVersionNum) - return false; - - if (compareMagic (set->fxMagic, "FxBk")) - { - // bank of programs - if (fxbSwap (set->numPrograms) >= 0) - { - const int oldProg = getCurrentProgram(); - const int numParams = fxbSwap (((const fxProgram*) (set->programs))->numParams); - const int progLen = sizeof (fxProgram) + (numParams - 1) * sizeof (float); - - for (int i = 0; i < fxbSwap (set->numPrograms); ++i) - { - if (i != oldProg) - { - const fxProgram* const prog = (const fxProgram*) (((const char*) (set->programs)) + i * progLen); - if (((const char*) prog) - ((const char*) set) >= (ssize_t) dataSize) - return false; - - if (fxbSwap (set->numPrograms) > 0) - setCurrentProgram (i); - - if (! restoreProgramSettings (prog)) - return false; - } - } - - if (fxbSwap (set->numPrograms) > 0) - setCurrentProgram (oldProg); - - const fxProgram* const prog = (const fxProgram*) (((const char*) (set->programs)) + oldProg * progLen); - if (((const char*) prog) - ((const char*) set) >= (ssize_t) dataSize) - return false; - - if (! restoreProgramSettings (prog)) - return false; - } - } - else if (compareMagic (set->fxMagic, "FxCk")) - { - // single program - const fxProgram* const prog = (const fxProgram*) data; - - if (! compareMagic (prog->chunkMagic, "CcnK")) - return false; - - changeProgramName (getCurrentProgram(), prog->prgName); - - for (int i = 0; i < fxbSwap (prog->numParams); ++i) - setParameter (i, fxbSwapFloat (prog->params[i])); - } - else if (compareMagic (set->fxMagic, "FBCh")) - { - // non-preset chunk - const fxChunkSet* const cset = (const fxChunkSet*) data; - - if (fxbSwap (cset->chunkSize) + sizeof (fxChunkSet) - 8 > (unsigned int) dataSize) - return false; - - setChunkData (cset->chunk, fxbSwap (cset->chunkSize), false); - } - else if (compareMagic (set->fxMagic, "FPCh")) - { - // preset chunk - const fxProgramSet* const cset = (const fxProgramSet*) data; - - if (fxbSwap (cset->chunkSize) + sizeof (fxProgramSet) - 8 > (unsigned int) dataSize) - return false; - - setChunkData (cset->chunk, fxbSwap (cset->chunkSize), true); - - changeProgramName (getCurrentProgram(), cset->name); - } - else - { - return false; - } - - return true; - } - - bool saveToFXBFile (MemoryBlock& dest, bool isFXB, int maxSizeMB = 128) - { - const int numPrograms = getNumPrograms(); - const int numParams = getNumParameters(); - - if (usesChunks()) - { - MemoryBlock chunk; - getChunkData (chunk, ! isFXB, maxSizeMB); - - if (isFXB) - { - const size_t totalLen = sizeof (fxChunkSet) + chunk.getSize() - 8; - dest.setSize (totalLen, true); - - fxChunkSet* const set = (fxChunkSet*) dest.getData(); - set->chunkMagic = fxbName ("CcnK"); - set->byteSize = 0; - set->fxMagic = fxbName ("FBCh"); - set->version = fxbSwap (fxbVersionNum); - set->fxID = fxbSwap (getUID()); - set->fxVersion = fxbSwap (getVersionNumber()); - set->numPrograms = fxbSwap (numPrograms); - set->chunkSize = fxbSwap ((VstInt32) chunk.getSize()); - - chunk.copyTo (set->chunk, 0, chunk.getSize()); - } - else - { - const size_t totalLen = sizeof (fxProgramSet) + chunk.getSize() - 8; - dest.setSize (totalLen, true); - - fxProgramSet* const set = (fxProgramSet*) dest.getData(); - set->chunkMagic = fxbName ("CcnK"); - set->byteSize = 0; - set->fxMagic = fxbName ("FPCh"); - set->version = fxbSwap (fxbVersionNum); - set->fxID = fxbSwap (getUID()); - set->fxVersion = fxbSwap (getVersionNumber()); - set->numPrograms = fxbSwap (numPrograms); - set->chunkSize = fxbSwap ((VstInt32) chunk.getSize()); - - getCurrentProgramName().copyToUTF8 (set->name, sizeof (set->name) - 1); - chunk.copyTo (set->chunk, 0, chunk.getSize()); - } - } - else - { - if (isFXB) - { - const int progLen = sizeof (fxProgram) + (numParams - 1) * sizeof (float); - const int len = (sizeof (fxSet) - sizeof (fxProgram)) + progLen * jmax (1, numPrograms); - dest.setSize (len, true); - - fxSet* const set = (fxSet*) dest.getData(); - set->chunkMagic = fxbName ("CcnK"); - set->byteSize = 0; - set->fxMagic = fxbName ("FxBk"); - set->version = fxbSwap (fxbVersionNum); - set->fxID = fxbSwap (getUID()); - set->fxVersion = fxbSwap (getVersionNumber()); - set->numPrograms = fxbSwap (numPrograms); - - const int oldProgram = getCurrentProgram(); - MemoryBlock oldSettings; - createTempParameterStore (oldSettings); - - setParamsInProgramBlock ((fxProgram*) (((char*) (set->programs)) + oldProgram * progLen)); - - for (int i = 0; i < numPrograms; ++i) - { - if (i != oldProgram) - { - setCurrentProgram (i); - setParamsInProgramBlock ((fxProgram*) (((char*) (set->programs)) + i * progLen)); - } - } - - setCurrentProgram (oldProgram); - restoreFromTempParameterStore (oldSettings); - } - else - { - const int totalLen = sizeof (fxProgram) + (numParams - 1) * sizeof (float); - dest.setSize (totalLen, true); - - setParamsInProgramBlock ((fxProgram*) dest.getData()); - } - } - - return true; - } - - bool usesChunks() const noexcept { return effect != nullptr && (effect->flags & effFlagsProgramChunks) != 0; } - - bool getChunkData (MemoryBlock& mb, bool isPreset, int maxSizeMB) const - { - if (usesChunks()) - { - void* data = nullptr; - const VstIntPtr bytes = dispatch (effGetChunk, isPreset ? 1 : 0, 0, &data, 0.0f); - - if (data != nullptr && bytes <= maxSizeMB * 1024 * 1024) - { - mb.setSize (bytes); - mb.copyFrom (data, 0, bytes); - - return true; - } - } - - return false; - } - - bool setChunkData (const void* data, const int size, bool isPreset) - { - if (size > 0 && usesChunks()) - { - dispatch (effSetChunk, isPreset ? 1 : 0, size, (void*) data, 0.0f); - - if (! isPreset) - updateStoredProgramNames(); - - return true; - } - - return false; - } - - AEffect* effect; - ModuleHandle::Ptr module; - - ScopedPointer extraFunctions; - bool usesCocoaNSView; - -private: - String name; - CriticalSection lock; - bool wantsMidiMessages, initialised, isPowerOn; - mutable StringArray programNames; - AudioSampleBuffer tempBuffer; - CriticalSection midiInLock; - MidiBuffer incomingMidi; - VSTMidiEventList midiEventsToSend; - VstTimeInfo vstHostTime; - - //============================================================================== - void setHostTimeFrameRate (long frameRateIndex, double frameRate, double currentTime) noexcept - { - vstHostTime.flags |= kVstSmpteValid; - vstHostTime.smpteFrameRate = (VstInt32) frameRateIndex; - vstHostTime.smpteOffset = (VstInt32) (currentTime * 80.0 * frameRate + 0.5); - } - - bool restoreProgramSettings (const fxProgram* const prog) - { - if (compareMagic (prog->chunkMagic, "CcnK") - && compareMagic (prog->fxMagic, "FxCk")) - { - changeProgramName (getCurrentProgram(), prog->prgName); - - for (int i = 0; i < fxbSwap (prog->numParams); ++i) - setParameter (i, fxbSwapFloat (prog->params[i])); - - return true; - } - - return false; - } - - String getTextForOpcode (const int index, const AEffectOpcodes opcode) const - { - if (effect == nullptr) - return String::empty; - - jassert (index >= 0 && index < effect->numParams); - char nm [256] = { 0 }; - dispatch (opcode, index, 0, nm, 0); - return String (CharPointer_UTF8 (nm)).trim(); - } - - String getCurrentProgramName() - { - String progName; - - if (effect != nullptr) - { - { - char nm[256] = { 0 }; - dispatch (effGetProgramName, 0, 0, nm, 0); - progName = String (CharPointer_UTF8 (nm)).trim(); - } - - const int index = getCurrentProgram(); - - if (index >= 0 && programNames[index].isEmpty()) - { - while (programNames.size() < index) - programNames.add (String::empty); - - programNames.set (index, progName); - } - } - - return progName; - } - - void setParamsInProgramBlock (fxProgram* const prog) - { - const int numParams = getNumParameters(); - - prog->chunkMagic = fxbName ("CcnK"); - prog->byteSize = 0; - prog->fxMagic = fxbName ("FxCk"); - prog->version = fxbSwap (fxbVersionNum); - prog->fxID = fxbSwap (getUID()); - prog->fxVersion = fxbSwap (getVersionNumber()); - prog->numParams = fxbSwap (numParams); - - getCurrentProgramName().copyToUTF8 (prog->prgName, sizeof (prog->prgName) - 1); - - for (int i = 0; i < numParams; ++i) - prog->params[i] = fxbSwapFloat (getParameter (i)); - } - - void updateStoredProgramNames() - { - if (effect != nullptr && getNumPrograms() > 0) - { - char nm[256] = { 0 }; - - // only do this if the plugin can't use indexed names.. - if (dispatch (effGetProgramNameIndexed, 0, -1, nm, 0) == 0) - { - const int oldProgram = getCurrentProgram(); - MemoryBlock oldSettings; - createTempParameterStore (oldSettings); - - for (int i = 0; i < getNumPrograms(); ++i) - { - setCurrentProgram (i); - getCurrentProgramName(); // (this updates the list) - } - - setCurrentProgram (oldProgram); - restoreFromTempParameterStore (oldSettings); - } - } - } - - void handleMidiFromPlugin (const VstEvents* const events) - { - if (events != nullptr) - { - const ScopedLock sl (midiInLock); - VSTMidiEventList::addEventsToMidiBuffer (events, incomingMidi); - } - } - - //============================================================================== - void createTempParameterStore (MemoryBlock& dest) - { - dest.setSize (64 + 4 * getNumParameters()); - dest.fillWith (0); - - getCurrentProgramName().copyToUTF8 ((char*) dest.getData(), 63); - - float* const p = (float*) (((char*) dest.getData()) + 64); - for (int i = 0; i < getNumParameters(); ++i) - p[i] = getParameter(i); - } - - void restoreFromTempParameterStore (const MemoryBlock& m) - { - changeProgramName (getCurrentProgram(), (const char*) m.getData()); - - float* p = (float*) (((char*) m.getData()) + 64); - for (int i = 0; i < getNumParameters(); ++i) - setParameter (i, p[i]); - } - - VstIntPtr getVstDirectory() const - { - #if JUCE_MAC - return (VstIntPtr) (void*) &module->parentDirFSSpec; - #else - return (VstIntPtr) (pointer_sized_uint) module->fullParentDirectoryPathName.toRawUTF8(); - #endif - } - - //============================================================================== - int getVersionNumber() const noexcept { return effect != nullptr ? effect->version : 0; } - - String getVersion() const - { - unsigned int v = (unsigned int) dispatch (effGetVendorVersion, 0, 0, 0, 0); - - String s; - - if (v == 0 || (int) v == -1) - v = getVersionNumber(); - - if (v != 0) - { - int versionBits[32]; - int n = 0; - - for (int vv = v; vv != 0; vv /= 10) - versionBits [n++] = vv % 10; - - if (n > 4) // if the number ends up silly, it's probably encoded as hex instead of decimal.. - { - n = 0; - - for (int vv = v; vv != 0; vv >>= 8) - versionBits [n++] = vv & 255; - } - - while (n > 1 && versionBits [n - 1] == 0) - --n; - - s << 'V'; - - while (n > 0) - { - s << versionBits [--n]; - - if (n > 0) - s << '.'; - } - } - - return s; - } - - const char* getCategory() const - { - switch (getVstCategory()) - { - case kPlugCategEffect: return "Effect"; - case kPlugCategSynth: return "Synth"; - case kPlugCategAnalysis: return "Analysis"; - case kPlugCategMastering: return "Mastering"; - case kPlugCategSpacializer: return "Spacial"; - case kPlugCategRoomFx: return "Reverb"; - case kPlugSurroundFx: return "Surround"; - case kPlugCategRestoration: return "Restoration"; - case kPlugCategGenerator: return "Tone generation"; - default: break; - } - - return nullptr; - } - - void setPower (const bool on) - { - dispatch (effMainsChanged, 0, on ? 1 : 0, 0, 0); - isPowerOn = on; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginInstance) -}; - -//============================================================================== -class VSTPluginWindow; -static Array activeVSTWindows; - -//============================================================================== -class VSTPluginWindow : public AudioProcessorEditor, - #if ! JUCE_MAC - public ComponentMovementWatcher, - #endif - public Timer -{ -public: - VSTPluginWindow (VSTPluginInstance& plug) - : AudioProcessorEditor (&plug), - #if ! JUCE_MAC - ComponentMovementWatcher (this), - #endif - plugin (plug), - isOpen (false), - recursiveResize (false), - pluginWantsKeys (false), - pluginRefusesToResize (false), - alreadyInside (false) - { - #if JUCE_WINDOWS - pluginHWND = 0; - sizeCheckCount = 0; - - #elif JUCE_LINUX - pluginWindow = None; - pluginProc = None; - - #elif JUCE_MAC - #if JUCE_SUPPORT_CARBON - if (! plug.usesCocoaNSView) - addAndMakeVisible (carbonWrapper = new CarbonWrapperComponent (*this)); - else - #endif - addAndMakeVisible (cocoaWrapper = new AutoResizingNSViewComponentWithParent()); - #endif - - activeVSTWindows.add (this); - - setSize (1, 1); - setOpaque (true); - setVisible (true); - } - - ~VSTPluginWindow() - { - closePluginWindow(); - - #if JUCE_MAC - #if JUCE_SUPPORT_CARBON - carbonWrapper = nullptr; - #endif - cocoaWrapper = nullptr; - #endif - - activeVSTWindows.removeFirstMatchingValue (this); - plugin.editorBeingDeleted (this); - } - - //============================================================================== - #if ! JUCE_MAC - void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) override - { - if (recursiveResize) - return; - - Component* const topComp = getTopLevelComponent(); - - if (topComp->getPeer() != nullptr) - { - const Point pos (topComp->getLocalPoint (this, Point())); - - recursiveResize = true; - - #if JUCE_WINDOWS - if (pluginHWND != 0) - MoveWindow (pluginHWND, pos.getX(), pos.getY(), getWidth(), getHeight(), TRUE); - #elif JUCE_LINUX - if (pluginWindow != 0) - { - XResizeWindow (display, pluginWindow, getWidth(), getHeight()); - XMoveWindow (display, pluginWindow, pos.getX(), pos.getY()); - XMapRaised (display, pluginWindow); - } - #endif - - recursiveResize = false; - } - } - - void componentVisibilityChanged() override - { - if (isShowing()) - openPluginWindow(); - else if (! shouldAvoidDeletingWindow()) - closePluginWindow(); - - componentMovedOrResized (true, true); - } - - void componentPeerChanged() override - { - closePluginWindow(); - openPluginWindow(); - } - #endif - - #if JUCE_MAC - void visibilityChanged() override - { - if (cocoaWrapper != nullptr) - { - if (isVisible()) - openPluginWindow ((NSView*) cocoaWrapper->getView()); - else - closePluginWindow(); - } - } - - void childBoundsChanged (Component*) override - { - if (cocoaWrapper != nullptr) - { - int w = cocoaWrapper->getWidth(); - int h = cocoaWrapper->getHeight(); - - if (w != getWidth() || h != getHeight()) - setSize (w, h); - } - } - #endif - - //============================================================================== - bool keyStateChanged (bool) override { return pluginWantsKeys; } - bool keyPressed (const juce::KeyPress&) override { return pluginWantsKeys; } - - //============================================================================== - #if JUCE_MAC - void paint (Graphics& g) override - { - g.fillAll (Colours::black); - } - #else - void paint (Graphics& g) override - { - if (isOpen) - { - #if JUCE_LINUX - if (pluginWindow != 0) - { - const Rectangle clip (g.getClipBounds()); - - XEvent ev = { 0 }; - ev.xexpose.type = Expose; - ev.xexpose.display = display; - ev.xexpose.window = pluginWindow; - ev.xexpose.x = clip.getX(); - ev.xexpose.y = clip.getY(); - ev.xexpose.width = clip.getWidth(); - ev.xexpose.height = clip.getHeight(); - - sendEventToChild (ev); - } - #endif - } - else - { - g.fillAll (Colours::black); - } - } - #endif - - //============================================================================== - void timerCallback() override - { - if (isShowing()) - { - #if JUCE_WINDOWS - if (--sizeCheckCount <= 0) - { - sizeCheckCount = 10; - checkPluginWindowSize(); - } - #endif - - static bool reentrant = false; - - if (! reentrant) - { - reentrant = true; - plugin.dispatch (effEditIdle, 0, 0, 0, 0); - reentrant = false; - } - } - } - - //============================================================================== - void mouseDown (const MouseEvent& e) override - { - (void) e; - - #if JUCE_LINUX - if (pluginWindow == 0) - return; - - toFront (true); - - XEvent ev; - prepareXEvent (ev, e); - ev.xbutton.type = ButtonPress; - translateJuceToXButtonModifiers (e, ev); - sendEventToChild (ev); - - #elif JUCE_WINDOWS - toFront (true); - #endif - } - - void broughtToFront() override - { - activeVSTWindows.removeFirstMatchingValue (this); - activeVSTWindows.add (this); - - #if JUCE_MAC - dispatch (effEditTop, 0, 0, 0, 0); - #endif - } - - //============================================================================== -private: - VSTPluginInstance& plugin; - bool isOpen, recursiveResize; - bool pluginWantsKeys, pluginRefusesToResize, alreadyInside; - - #if JUCE_WINDOWS - HWND pluginHWND; - void* originalWndProc; - int sizeCheckCount; - #elif JUCE_LINUX - Window pluginWindow; - EventProcPtr pluginProc; - #endif - - // This is a workaround for old Mackie plugins that crash if their - // window is deleted more than once. - bool shouldAvoidDeletingWindow() const - { - return plugin.getPluginDescription() - .manufacturerName.containsIgnoreCase ("Loud Technologies"); - } - - // This is an old workaround for some plugins that need a repaint when their - // windows are first created, but it breaks some Izotope plugins.. - bool shouldRepaintCarbonWindowWhenCreated() - { - return ! plugin.getName().containsIgnoreCase ("izotope"); - } - - //============================================================================== -#if JUCE_MAC - void openPluginWindow (void* parentWindow) - { - if (isOpen || parentWindow == 0) - return; - - isOpen = true; - - ERect* rect = nullptr; - dispatch (effEditGetRect, 0, 0, &rect, 0); - dispatch (effEditOpen, 0, 0, parentWindow, 0); - - // do this before and after like in the steinberg example - dispatch (effEditGetRect, 0, 0, &rect, 0); - dispatch (effGetProgram, 0, 0, 0, 0); // also in steinberg code - - // Install keyboard hooks - pluginWantsKeys = (dispatch (effKeysRequired, 0, 0, 0, 0) == 0); - - // double-check it's not too tiny - int w = 250, h = 150; - - if (rect != nullptr) - { - w = rect->right - rect->left; - h = rect->bottom - rect->top; - - if (w == 0 || h == 0) - { - w = 250; - h = 150; - } - } - - w = jmax (w, 32); - h = jmax (h, 32); - - setSize (w, h); - - startTimer (18 + juce::Random::getSystemRandom().nextInt (5)); - repaint(); - } - -#else - void openPluginWindow() - { - if (isOpen || getWindowHandle() == 0) - return; - - JUCE_VST_LOG ("Opening VST UI: " + plugin.getName()); - isOpen = true; - - ERect* rect = nullptr; - dispatch (effEditGetRect, 0, 0, &rect, 0); - dispatch (effEditOpen, 0, 0, getWindowHandle(), 0); - - // do this before and after like in the steinberg example - dispatch (effEditGetRect, 0, 0, &rect, 0); - dispatch (effGetProgram, 0, 0, 0, 0); // also in steinberg code - - // Install keyboard hooks - pluginWantsKeys = (dispatch (effKeysRequired, 0, 0, 0, 0) == 0); - - #if JUCE_WINDOWS - originalWndProc = 0; - pluginHWND = GetWindow ((HWND) getWindowHandle(), GW_CHILD); - - if (pluginHWND == 0) - { - isOpen = false; - setSize (300, 150); - return; - } - - #pragma warning (push) - #pragma warning (disable: 4244) - - if (! pluginWantsKeys) - { - originalWndProc = (void*) GetWindowLongPtr (pluginHWND, GWLP_WNDPROC); - SetWindowLongPtr (pluginHWND, GWLP_WNDPROC, (LONG_PTR) vstHookWndProc); - } - - #pragma warning (pop) - - RECT r; - GetWindowRect (pluginHWND, &r); - int w = r.right - r.left; - int h = r.bottom - r.top; - - if (rect != nullptr) - { - const int rw = rect->right - rect->left; - const int rh = rect->bottom - rect->top; - - if ((rw > 50 && rh > 50 && rw < 2000 && rh < 2000 && rw != w && rh != h) - || ((w == 0 && rw > 0) || (h == 0 && rh > 0))) - { - // very dodgy logic to decide which size is right. - if (abs (rw - w) > 350 || abs (rh - h) > 350) - { - SetWindowPos (pluginHWND, 0, - 0, 0, rw, rh, - SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOZORDER); - - GetWindowRect (pluginHWND, &r); - - w = r.right - r.left; - h = r.bottom - r.top; - - pluginRefusesToResize = (w != rw) || (h != rh); - - w = rw; - h = rh; - } - } - } - - #elif JUCE_LINUX - pluginWindow = getChildWindow ((Window) getWindowHandle()); - - if (pluginWindow != 0) - pluginProc = (EventProcPtr) getPropertyFromXWindow (pluginWindow, - XInternAtom (display, "_XEventProc", False)); - - int w = 250, h = 150; - - if (rect != nullptr) - { - w = rect->right - rect->left; - h = rect->bottom - rect->top; - - if (w == 0 || h == 0) - { - w = 250; - h = 150; - } - } - - if (pluginWindow != 0) - XMapRaised (display, pluginWindow); - #endif - - // double-check it's not too tiny - w = jmax (w, 32); - h = jmax (h, 32); - - setSize (w, h); - - #if JUCE_WINDOWS - checkPluginWindowSize(); - #endif - - startTimer (18 + juce::Random::getSystemRandom().nextInt (5)); - repaint(); - } -#endif - - //============================================================================== - void closePluginWindow() - { - if (isOpen) - { - JUCE_VST_LOG ("Closing VST UI: " + plugin.getName()); - isOpen = false; - dispatch (effEditClose, 0, 0, 0, 0); - stopTimer(); - - #if JUCE_WINDOWS - #pragma warning (push) - #pragma warning (disable: 4244) - if (originalWndProc != 0 && pluginHWND != 0 && IsWindow (pluginHWND)) - SetWindowLongPtr (pluginHWND, GWLP_WNDPROC, (LONG_PTR) originalWndProc); - #pragma warning (pop) - - originalWndProc = 0; - pluginHWND = 0; - #elif JUCE_LINUX - pluginWindow = 0; - pluginProc = 0; - #endif - } - } - - //============================================================================== - VstIntPtr dispatch (const int opcode, const int index, const int value, void* const ptr, float opt) - { - return plugin.dispatch (opcode, index, value, ptr, opt); - } - - //============================================================================== -#if JUCE_WINDOWS - void checkPluginWindowSize() - { - RECT r; - GetWindowRect (pluginHWND, &r); - const int w = r.right - r.left; - const int h = r.bottom - r.top; - - if (isShowing() && w > 0 && h > 0 - && (w != getWidth() || h != getHeight()) - && ! pluginRefusesToResize) - { - setSize (w, h); - sizeCheckCount = 0; - } - } - - // hooks to get keyboard events from VST windows.. - static LRESULT CALLBACK vstHookWndProc (HWND hW, UINT message, WPARAM wParam, LPARAM lParam) - { - for (int i = activeVSTWindows.size(); --i >= 0;) - { - Component::SafePointer w (activeVSTWindows[i]); - - if (w != nullptr && w->pluginHWND == hW) - { - if (message == WM_CHAR - || message == WM_KEYDOWN - || message == WM_SYSKEYDOWN - || message == WM_KEYUP - || message == WM_SYSKEYUP - || message == WM_APPCOMMAND) - { - SendMessage ((HWND) w->getTopLevelComponent()->getWindowHandle(), - message, wParam, lParam); - } - - if (w != nullptr) // (may have been deleted in SendMessage callback) - return CallWindowProc ((WNDPROC) w->originalWndProc, - (HWND) w->pluginHWND, - message, wParam, lParam); - } - } - - return DefWindowProc (hW, message, wParam, lParam); - } -#endif - -#if JUCE_LINUX - //============================================================================== - // overload mouse/keyboard events to forward them to the plugin's inner window.. - void sendEventToChild (XEvent& event) - { - if (pluginProc != 0) - { - // if the plugin publishes an event procedure, pass the event directly.. - pluginProc (&event); - } - else if (pluginWindow != 0) - { - // if the plugin has a window, then send the event to the window so that - // its message thread will pick it up.. - XSendEvent (display, pluginWindow, False, NoEventMask, &event); - XFlush (display); - } - } - - void prepareXEvent (XEvent& ev, const MouseEvent& e) const noexcept - { - zerostruct (ev); - ev.xcrossing.display = display; - ev.xcrossing.window = pluginWindow; - ev.xcrossing.root = RootWindow (display, DefaultScreen (display)); - ev.xcrossing.time = CurrentTime; - ev.xcrossing.x = e.x; - ev.xcrossing.y = e.y; - ev.xcrossing.x_root = e.getScreenX(); - ev.xcrossing.y_root = e.getScreenY(); - } - - void mouseEnter (const MouseEvent& e) override - { - if (pluginWindow != 0) - { - XEvent ev; - prepareXEvent (ev, e); - ev.xcrossing.type = EnterNotify; - ev.xcrossing.mode = NotifyNormal; - ev.xcrossing.detail = NotifyAncestor; - translateJuceToXCrossingModifiers (e, ev); - sendEventToChild (ev); - } - } - - void mouseExit (const MouseEvent& e) override - { - if (pluginWindow != 0) - { - XEvent ev; - prepareXEvent (ev, e); - ev.xcrossing.type = LeaveNotify; - ev.xcrossing.mode = NotifyNormal; - ev.xcrossing.detail = NotifyAncestor; - ev.xcrossing.focus = hasKeyboardFocus (true); - translateJuceToXCrossingModifiers (e, ev); - sendEventToChild (ev); - } - } - - void mouseMove (const MouseEvent& e) override - { - if (pluginWindow != 0) - { - XEvent ev; - prepareXEvent (ev, e); - ev.xmotion.type = MotionNotify; - ev.xmotion.is_hint = NotifyNormal; - sendEventToChild (ev); - } - } - - void mouseDrag (const MouseEvent& e) override - { - if (pluginWindow != 0) - { - XEvent ev; - prepareXEvent (ev, e); - ev.xmotion.type = MotionNotify; - ev.xmotion.is_hint = NotifyNormal; - translateJuceToXMotionModifiers (e, ev); - sendEventToChild (ev); - } - } - - void mouseUp (const MouseEvent& e) override - { - if (pluginWindow != 0) - { - XEvent ev; - prepareXEvent (ev, e); - ev.xbutton.type = ButtonRelease; - translateJuceToXButtonModifiers (e, ev); - sendEventToChild (ev); - } - } - - void mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel) override - { - if (pluginWindow != 0) - { - XEvent ev; - prepareXEvent (ev, e); - ev.xbutton.type = ButtonPress; - translateJuceToXMouseWheelModifiers (e, wheel.deltaY, ev); - sendEventToChild (ev); - - ev.xbutton.type = ButtonRelease; - sendEventToChild (ev); - } - } -#endif - - //============================================================================== -#if JUCE_MAC - #if JUCE_SUPPORT_CARBON - class CarbonWrapperComponent : public CarbonViewWrapperComponent - { - public: - CarbonWrapperComponent (VSTPluginWindow& w) - : owner (w), alreadyInside (false) - { - keepPluginWindowWhenHidden = w.shouldAvoidDeletingWindow(); - setRepaintsChildHIViewWhenCreated (w.shouldRepaintCarbonWindowWhenCreated()); - } - - ~CarbonWrapperComponent() - { - deleteWindow(); - } - - HIViewRef attachView (WindowRef windowRef, HIViewRef /*rootView*/) override - { - owner.openPluginWindow (windowRef); - return 0; - } - - void removeView (HIViewRef) override - { - if (owner.isOpen) - { - owner.isOpen = false; - owner.dispatch (effEditClose, 0, 0, 0, 0); - owner.dispatch (effEditSleep, 0, 0, 0, 0); - } - } - - bool getEmbeddedViewSize (int& w, int& h) override - { - ERect* rect = nullptr; - owner.dispatch (effEditGetRect, 0, 0, &rect, 0); - w = rect->right - rect->left; - h = rect->bottom - rect->top; - return true; - } - - void handleMouseDown (int x, int y) override - { - if (! alreadyInside) - { - alreadyInside = true; - getTopLevelComponent()->toFront (true); - owner.dispatch (effEditMouse, x, y, 0, 0); - alreadyInside = false; - } - else - { - PostEvent (::mouseDown, 0); - } - } - - void handlePaint() override - { - if (ComponentPeer* const peer = getPeer()) - { - const Point pos (peer->globalToLocal (getScreenPosition())); - ERect r; - r.left = (VstInt16) pos.getX(); - r.top = (VstInt16) pos.getY(); - r.right = (VstInt16) (r.left + getWidth()); - r.bottom = (VstInt16) (r.top + getHeight()); - - owner.dispatch (effEditDraw, 0, 0, &r, 0); - } - } - - private: - VSTPluginWindow& owner; - bool alreadyInside; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CarbonWrapperComponent) - }; - - friend class CarbonWrapperComponent; - ScopedPointer carbonWrapper; - #endif - - ScopedPointer cocoaWrapper; - - void resized() override - { - #if JUCE_SUPPORT_CARBON - if (carbonWrapper != nullptr) - carbonWrapper->setSize (getWidth(), getHeight()); - #endif - - if (cocoaWrapper != nullptr) - cocoaWrapper->setSize (getWidth(), getHeight()); - } -#endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginWindow) -}; - -//============================================================================== -AudioProcessorEditor* VSTPluginInstance::createEditor() -{ - return hasEditor() ? new VSTPluginWindow (*this) - : nullptr; -} - -//============================================================================== -// entry point for all callbacks from the plugin -static VstIntPtr VSTCALLBACK audioMaster (AEffect* effect, VstInt32 opcode, VstInt32 index, VstIntPtr value, void* ptr, float opt) -{ - if (effect != nullptr) - if (VSTPluginInstance* instance = (VSTPluginInstance*) (effect->resvd2)) - return instance->handleCallback (opcode, index, value, ptr, opt); - - return VSTPluginInstance::handleGeneralCallback (opcode, index, value, ptr, opt); -} - -//============================================================================== -VSTPluginFormat::VSTPluginFormat() {} -VSTPluginFormat::~VSTPluginFormat() {} - -static VSTPluginInstance* createAndUpdateDesc (VSTPluginFormat& format, PluginDescription& desc) -{ - if (AudioPluginInstance* p = format.createInstanceFromDescription (desc, 44100.0, 512)) - { - if (VSTPluginInstance* instance = dynamic_cast (p)) - { - #if JUCE_MAC - if (instance->module->resFileId != 0) - UseResFile (instance->module->resFileId); - #endif - - instance->fillInPluginDescription (desc); - return instance; - } - - jassertfalse; - } - - return nullptr; -} - -void VSTPluginFormat::findAllTypesForFile (OwnedArray& results, - const String& fileOrIdentifier) -{ - if (! fileMightContainThisPluginType (fileOrIdentifier)) - return; - - PluginDescription desc; - desc.fileOrIdentifier = fileOrIdentifier; - desc.uid = 0; - - ScopedPointer instance (createAndUpdateDesc (*this, desc)); - - if (instance == nullptr) - return; - - if (instance->getVstCategory() != kPlugCategShell) - { - // Normal plugin... - results.add (new PluginDescription (desc)); - - instance->dispatch (effOpen, 0, 0, 0, 0); - } - else - { - // It's a shell plugin, so iterate all the subtypes... - for (;;) - { - char shellEffectName [256] = { 0 }; - const int uid = (int) instance->dispatch (effShellGetNextPlugin, 0, 0, shellEffectName, 0); - - if (uid == 0) - break; - - desc.uid = uid; - desc.name = shellEffectName; - - aboutToScanVSTShellPlugin (desc); - - ScopedPointer shellInstance (createAndUpdateDesc (*this, desc)); - - if (shellInstance != nullptr) - { - jassert (desc.uid == uid); - desc.hasSharedContainer = true; - desc.name = shellEffectName; - - if (! arrayContainsPlugin (results, desc)) - results.add (new PluginDescription (desc)); - } - } - } -} - -AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const PluginDescription& desc, - double sampleRate, int blockSize) -{ - ScopedPointer result; - - if (fileMightContainThisPluginType (desc.fileOrIdentifier)) - { - File file (desc.fileOrIdentifier); - - const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); - file.getParentDirectory().setAsCurrentWorkingDirectory(); - - if (ModuleHandle::Ptr module = ModuleHandle::findOrCreateModule (file)) - { - shellUIDToCreate = desc.uid; - - result = new VSTPluginInstance (module); - - if (result->effect != nullptr) - { - result->effect->resvd2 = (VstIntPtr) (pointer_sized_int) (VSTPluginInstance*) result; - result->initialise (sampleRate, blockSize); - } - else - { - result = nullptr; - } - } - - previousWorkingDirectory.setAsCurrentWorkingDirectory(); - } - - return result.release(); -} - -bool VSTPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier) -{ - const File f (File::createFileWithoutCheckingPath (fileOrIdentifier)); - - #if JUCE_MAC - if (f.isDirectory() && f.hasFileExtension (".vst")) - return true; - - #if JUCE_PPC - FSRef fileRef; - if (makeFSRefFromPath (&fileRef, f.getFullPathName())) - { - const short resFileId = FSOpenResFile (&fileRef, fsRdPerm); - - if (resFileId != -1) - { - const int numEffects = Count1Resources ('aEff'); - CloseResFile (resFileId); - - if (numEffects > 0) - return true; - } - } - #endif - - return false; - #elif JUCE_WINDOWS - return f.existsAsFile() && f.hasFileExtension (".dll"); - #elif JUCE_LINUX - return f.existsAsFile() && f.hasFileExtension (".so"); - #endif -} - -String VSTPluginFormat::getNameOfPluginFromIdentifier (const String& fileOrIdentifier) -{ - return fileOrIdentifier; -} - -bool VSTPluginFormat::pluginNeedsRescanning (const PluginDescription& desc) -{ - return File (desc.fileOrIdentifier).getLastModificationTime() != desc.lastFileModTime; -} - -bool VSTPluginFormat::doesPluginStillExist (const PluginDescription& desc) -{ - return File (desc.fileOrIdentifier).exists(); -} - -StringArray VSTPluginFormat::searchPathsForPlugins (const FileSearchPath& directoriesToSearch, const bool recursive) -{ - StringArray results; - - for (int j = 0; j < directoriesToSearch.getNumPaths(); ++j) - recursiveFileSearch (results, directoriesToSearch [j], recursive); - - return results; -} - -void VSTPluginFormat::recursiveFileSearch (StringArray& results, const File& dir, const bool recursive) -{ - // avoid allowing the dir iterator to be recursive, because we want to avoid letting it delve inside - // .component or .vst directories. - DirectoryIterator iter (dir, false, "*", File::findFilesAndDirectories); - - while (iter.next()) - { - const File f (iter.getFile()); - bool isPlugin = false; - - if (fileMightContainThisPluginType (f.getFullPathName())) - { - isPlugin = true; - results.add (f.getFullPathName()); - } - - if (recursive && (! isPlugin) && f.isDirectory()) - recursiveFileSearch (results, f, true); - } -} - -FileSearchPath VSTPluginFormat::getDefaultLocationsToSearch() -{ - #if JUCE_MAC - return FileSearchPath ("~/Library/Audio/Plug-Ins/VST;/Library/Audio/Plug-Ins/VST"); - #elif JUCE_LINUX - return FileSearchPath (SystemStats::getEnvironmentVariable ("VST_PATH", - "/usr/lib/vst;/usr/local/lib/vst;~/.vst") - .replace (":", ";")); - #elif JUCE_WINDOWS - const String programFiles (File::getSpecialLocation (File::globalApplicationsDirectory).getFullPathName()); - - FileSearchPath paths; - paths.add (WindowsRegistry::getValue ("HKLM\\Software\\VST\\VSTPluginsPath", - programFiles + "\\Steinberg\\VstPlugins")); - paths.removeNonExistentPaths(); - - paths.add (WindowsRegistry::getValue ("HKLM\\Software\\VST\\VSTPluginsPath", - programFiles + "\\VstPlugins")); - return paths; - #endif -} - -const XmlElement* VSTPluginFormat::getVSTXML (AudioPluginInstance* plugin) -{ - if (VSTPluginInstance* const vst = dynamic_cast (plugin)) - if (vst->module != nullptr) - return vst->module->vstXml.get(); - - return nullptr; -} - -bool VSTPluginFormat::loadFromFXBFile (AudioPluginInstance* plugin, const void* data, size_t dataSize) -{ - if (VSTPluginInstance* vst = dynamic_cast (plugin)) - return vst->loadFromFXBFile (data, dataSize); - - return false; -} - -bool VSTPluginFormat::saveToFXBFile (AudioPluginInstance* plugin, MemoryBlock& dest, bool asFXB) -{ - if (VSTPluginInstance* vst = dynamic_cast (plugin)) - return vst->saveToFXBFile (dest, asFXB); - - return false; -} - -bool VSTPluginFormat::getChunkData (AudioPluginInstance* plugin, MemoryBlock& result, bool isPreset) -{ - if (VSTPluginInstance* vst = dynamic_cast (plugin)) - return vst->getChunkData (result, isPreset, 128); - - return false; -} - -bool VSTPluginFormat::setChunkData (AudioPluginInstance* plugin, const void* data, int size, bool isPreset) -{ - if (VSTPluginInstance* vst = dynamic_cast (plugin)) - return vst->setChunkData (data, size, isPreset); - - return false; -} - -void VSTPluginFormat::setExtraFunctions (AudioPluginInstance* plugin, ExtraFunctions* functions) -{ - ScopedPointer f (functions); - - if (VSTPluginInstance* vst = dynamic_cast (plugin)) - vst->extraFunctions = f; -} - -VSTPluginFormat::VstIntPtr JUCE_CALLTYPE VSTPluginFormat::dispatcher (AudioPluginInstance* plugin, int32 opcode, int32 index, VstIntPtr value, void* ptr, float opt) -{ - if (VSTPluginInstance* vst = dynamic_cast (plugin)) - return vst->dispatch (opcode, index, value, ptr, opt); - - return 0; -} - -void VSTPluginFormat::aboutToScanVSTShellPlugin (const PluginDescription&) {} - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h b/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h deleted file mode 100755 index 4e4b744..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_PLUGINHOST_VST || DOXYGEN - -//============================================================================== -/** - Implements a plugin format manager for VSTs. -*/ -class JUCE_API VSTPluginFormat : public AudioPluginFormat -{ -public: - //============================================================================== - VSTPluginFormat(); - ~VSTPluginFormat(); - - //============================================================================== - /** Attempts to retreive the VSTXML data from a plugin. - Will return nullptr if the plugin isn't a VST, or if it doesn't have any VSTXML. - */ - static const XmlElement* getVSTXML (AudioPluginInstance* plugin); - - /** Attempts to reload a VST plugin's state from some FXB or FXP data. */ - static bool loadFromFXBFile (AudioPluginInstance* plugin, const void* data, size_t dataSize); - - /** Attempts to save a VST's state to some FXP or FXB data. */ - static bool saveToFXBFile (AudioPluginInstance* plugin, MemoryBlock& result, bool asFXB); - - /** Attempts to get a VST's state as a chunk of memory. */ - static bool getChunkData (AudioPluginInstance* plugin, MemoryBlock& result, bool isPreset); - - /** Attempts to set a VST's state from a chunk of memory. */ - static bool setChunkData (AudioPluginInstance* plugin, const void* data, int size, bool isPreset); - - //============================================================================== - /** Base class for some extra functions that can be attached to a VST plugin instance. */ - class ExtraFunctions - { - public: - virtual ~ExtraFunctions() {} - - /** This should return 10000 * the BPM at this position in the current edit. */ - virtual int64 getTempoAt (int64 samplePos) = 0; - - /** This should return the host's automation state. - @returns 0 = not supported, 1 = off, 2 = read, 3 = write, 4 = read/write - */ - virtual int getAutomationState() = 0; - }; - - /** Provides an ExtraFunctions callback object for a plugin to use. - The plugin will take ownership of the object and will delete it automatically. - */ - static void setExtraFunctions (AudioPluginInstance* plugin, ExtraFunctions* functions); - - //============================================================================== - #if JUCE_64BIT - typedef int64 VstIntPtr; - #else - typedef int32 VstIntPtr; - #endif - - /** This simply calls directly to the VST's AEffect::dispatcher() function. */ - static VstIntPtr JUCE_CALLTYPE dispatcher (AudioPluginInstance*, int32, int32, VstIntPtr, void*, float); - - //============================================================================== - String getName() const override { return "VST"; } - void findAllTypesForFile (OwnedArray&, const String& fileOrIdentifier) override; - AudioPluginInstance* createInstanceFromDescription (const PluginDescription&, double, int) override; - bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; - String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; - bool pluginNeedsRescanning (const PluginDescription&) override; - StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive) override; - bool doesPluginStillExist (const PluginDescription&) override; - FileSearchPath getDefaultLocationsToSearch() override; - bool canScanForPlugins() const override { return true; } - - /** Can be overridden to receive a callback when each member of a shell plugin is about to be - tested during a call to findAllTypesForFile(). - Only the name and uid members of the PluginDescription are guaranteed to be valid when - this is called. - */ - virtual void aboutToScanVSTShellPlugin (const PluginDescription&); - -private: - void recursiveFileSearch (StringArray&, const File&, bool recursive); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VSTPluginFormat) -}; - - -#endif diff --git a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp b/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp deleted file mode 100755 index d1f1679..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.cpp +++ /dev/null @@ -1,158 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if defined (JUCE_AUDIO_PROCESSORS_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE - /* When you add this cpp file to your project, you mustn't include it in a file where you've - already included any other headers - just put it inside a file on its own, possibly with your config - flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix - header files that the compiler may be using. - */ - #error "Incorrect use of JUCE cpp file" -#endif - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../juce_core/native/juce_BasicNativeHeaders.h" -#include "juce_audio_processors.h" -#include "../juce_gui_extra/juce_gui_extra.h" - -//============================================================================== -#if JUCE_MAC - #if JUCE_SUPPORT_CARBON \ - && ((JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_AU) \ - || ! (defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6)) - #define Point CarbonDummyPointName // (workaround to avoid definition of "Point" by old Carbon headers) - #define Component CarbonDummyCompName - #include - #undef Point - #undef Component - #endif -#endif - -#if JUCE_PLUGINHOST_VST && JUCE_LINUX - #include - #include - #undef KeyPress -#endif - -#if ! JUCE_WINDOWS && ! JUCE_MAC - #undef JUCE_PLUGINHOST_VST3 - #define JUCE_PLUGINHOST_VST3 0 -#endif - -//============================================================================== -namespace juce -{ - -static inline bool arrayContainsPlugin (const OwnedArray& list, - const PluginDescription& desc) -{ - for (int i = list.size(); --i >= 0;) - if (list.getUnchecked(i)->isDuplicateOf (desc)) - return true; - - return false; -} - -#if JUCE_MAC -//============================================================================== -struct AutoResizingNSViewComponent : public NSViewComponent, - private AsyncUpdater -{ - AutoResizingNSViewComponent() : recursive (false) {} - - void childBoundsChanged (Component*) override - { - if (recursive) - { - triggerAsyncUpdate(); - } - else - { - recursive = true; - resizeToFitView(); - recursive = true; - } - } - - void handleAsyncUpdate() override { resizeToFitView(); } - - bool recursive; -}; - -//============================================================================== -struct AutoResizingNSViewComponentWithParent : public AutoResizingNSViewComponent, - private Timer -{ - AutoResizingNSViewComponentWithParent() - { - NSView* v = [[NSView alloc] init]; - setView (v); - [v release]; - - startTimer (30); - } - - NSView* getChildView() const - { - if (NSView* parent = (NSView*) getView()) - if ([[parent subviews] count] > 0) - return [[parent subviews] objectAtIndex: 0]; - - return nil; - } - - void timerCallback() override - { - if (NSView* child = getChildView()) - { - stopTimer(); - setView (child); - } - } -}; -#endif - -#if JUCE_CLANG - #pragma clang diagnostic ignored "-Wdeprecated-declarations" -#endif - -#include "format/juce_AudioPluginFormat.cpp" -#include "format/juce_AudioPluginFormatManager.cpp" -#include "processors/juce_AudioProcessor.cpp" -#include "processors/juce_AudioProcessorEditor.cpp" -#include "processors/juce_AudioProcessorGraph.cpp" -#include "processors/juce_GenericAudioProcessorEditor.cpp" -#include "processors/juce_PluginDescription.cpp" -#include "format_types/juce_LADSPAPluginFormat.cpp" -#include "format_types/juce_VSTPluginFormat.cpp" -#include "format_types/juce_VST3PluginFormat.cpp" -#include "format_types/juce_AudioUnitPluginFormat.mm" -#include "scanning/juce_KnownPluginList.cpp" -#include "scanning/juce_PluginDirectoryScanner.cpp" -#include "scanning/juce_PluginListComponent.cpp" - -} diff --git a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h b/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h deleted file mode 100755 index 2811656..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIO_PROCESSORS_H_INCLUDED -#define JUCE_AUDIO_PROCESSORS_H_INCLUDED - -#include "../juce_gui_basics/juce_gui_basics.h" -#include "../juce_audio_basics/juce_audio_basics.h" - - -//============================================================================= -/** Config: JUCE_PLUGINHOST_VST - Enables the VST audio plugin hosting classes. This requires the Steinberg VST SDK to be - installed on your machine. - - @see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_AU, JUCE_PLUGINHOST_VST3 -*/ -#ifndef JUCE_PLUGINHOST_VST - #define JUCE_PLUGINHOST_VST 0 -#endif - -/** Config: JUCE_PLUGINHOST_VST3 - Enables the VST3 audio plugin hosting classes. This requires the Steinberg VST3 SDK to be - installed on your machine. - - @see VSTPluginFormat, VST3PluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_AU -*/ -#ifndef JUCE_PLUGINHOST_VST3 - #define JUCE_PLUGINHOST_VST3 0 -#endif - -/** Config: JUCE_PLUGINHOST_AU - Enables the AudioUnit plugin hosting classes. This is Mac-only, of course. - - @see AudioUnitPluginFormat, AudioPluginFormat, AudioPluginFormatManager, JUCE_PLUGINHOST_VST, JUCE_PLUGINHOST_VST3 -*/ -#ifndef JUCE_PLUGINHOST_AU - #define JUCE_PLUGINHOST_AU 0 -#endif - -#if ! (JUCE_PLUGINHOST_AU || JUCE_PLUGINHOST_VST || JUCE_PLUGINHOST_VST3) -// #error "You need to set either the JUCE_PLUGINHOST_AU and/or JUCE_PLUGINHOST_VST and/or JUCE_PLUGINHOST_VST3 flags if you're using this module!" -#endif - -#if ! (defined (JUCE_SUPPORT_CARBON) || JUCE_64BIT) - #define JUCE_SUPPORT_CARBON 1 -#endif - -//============================================================================= -//============================================================================= -namespace juce -{ - -class AudioProcessor; -#include "processors/juce_AudioPlayHead.h" -#include "processors/juce_AudioProcessorEditor.h" -#include "processors/juce_AudioProcessorListener.h" -#include "processors/juce_AudioProcessorParameter.h" -#include "processors/juce_AudioProcessor.h" -#include "processors/juce_PluginDescription.h" -#include "processors/juce_AudioPluginInstance.h" -#include "processors/juce_AudioProcessorGraph.h" -#include "processors/juce_GenericAudioProcessorEditor.h" -#include "format/juce_AudioPluginFormat.h" -#include "format/juce_AudioPluginFormatManager.h" -#include "scanning/juce_KnownPluginList.h" -#include "format_types/juce_AudioUnitPluginFormat.h" -#include "format_types/juce_LADSPAPluginFormat.h" -#include "format_types/juce_VSTMidiEventList.h" -#include "format_types/juce_VSTPluginFormat.h" -#include "format_types/juce_VST3PluginFormat.h" -#include "scanning/juce_PluginDirectoryScanner.h" -#include "scanning/juce_PluginListComponent.h" - -} - -#endif // JUCE_AUDIO_PROCESSORS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm b/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm deleted file mode 100755 index 918e848..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/juce_audio_processors.mm +++ /dev/null @@ -1,25 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#include "juce_audio_processors.cpp" diff --git a/JuceLibraryCode/modules/juce_audio_processors/juce_module_info b/JuceLibraryCode/modules/juce_audio_processors/juce_module_info deleted file mode 100755 index 60d04ec..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/juce_module_info +++ /dev/null @@ -1,25 +0,0 @@ -{ - "id": "juce_audio_processors", - "name": "JUCE audio plugin hosting classes", - "version": "3.1.1", - "description": "Classes for loading and playing VST, AU, or internally-generated audio processors.", - "website": "http://www.juce.com/juce", - "license": "GPL/Commercial", - - "dependencies": [ { "id": "juce_gui_extra", "version": "matching" }, - { "id": "juce_audio_basics", "version": "matching" } ], - - "include": "juce_audio_processors.h", - - "compile": [ { "file": "juce_audio_processors.cpp", "target": "! xcode" }, - { "file": "juce_audio_processors.mm", "target": "xcode" } ], - - "browse": [ "processors/*", - "format/*", - "format_types/*", - "scanning/*" - ], - - "OSXFrameworks": "CoreAudio CoreMIDI AudioToolbox", - "iOSFrameworks": "AudioToolbox" -} diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h deleted file mode 100755 index e3247b5..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPlayHead.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOPLAYHEAD_H_INCLUDED -#define JUCE_AUDIOPLAYHEAD_H_INCLUDED - - -//============================================================================== -/** - A subclass of AudioPlayHead can supply information about the position and - status of a moving play head during audio playback. - - One of these can be supplied to an AudioProcessor object so that it can find - out about the position of the audio that it is rendering. - - @see AudioProcessor::setPlayHead, AudioProcessor::getPlayHead -*/ -class JUCE_API AudioPlayHead -{ -protected: - //============================================================================== - AudioPlayHead() {} - -public: - virtual ~AudioPlayHead() {} - - //============================================================================== - /** Frame rate types. */ - enum FrameRateType - { - fps24 = 0, - fps25 = 1, - fps2997 = 2, - fps30 = 3, - fps2997drop = 4, - fps30drop = 5, - fpsUnknown = 99 - }; - - //============================================================================== - /** This structure is filled-in by the AudioPlayHead::getCurrentPosition() method. - */ - struct JUCE_API CurrentPositionInfo - { - /** The tempo in BPM */ - double bpm; - - /** Time signature numerator, e.g. the 3 of a 3/4 time sig */ - int timeSigNumerator; - /** Time signature denominator, e.g. the 4 of a 3/4 time sig */ - int timeSigDenominator; - - /** The current play position, in samples from the start of the edit. */ - int64 timeInSamples; - /** The current play position, in seconds from the start of the edit. */ - double timeInSeconds; - - /** For timecode, the position of the start of the edit, in seconds from 00:00:00:00. */ - double editOriginTime; - - /** The current play position, in pulses-per-quarter-note. */ - double ppqPosition; - - /** The position of the start of the last bar, in pulses-per-quarter-note. - - This is the time from the start of the edit to the start of the current - bar, in ppq units. - - Note - this value may be unavailable on some hosts, e.g. Pro-Tools. If - it's not available, the value will be 0. - */ - double ppqPositionOfLastBarStart; - - /** The video frame rate, if applicable. */ - FrameRateType frameRate; - - /** True if the transport is currently playing. */ - bool isPlaying; - - /** True if the transport is currently recording. - - (When isRecording is true, then isPlaying will also be true). - */ - bool isRecording; - - /** The current cycle start position in pulses-per-quarter-note. - Note that not all hosts or plugin formats may provide this value. - @see isLooping - */ - double ppqLoopStart; - - /** The current cycle end position in pulses-per-quarter-note. - Note that not all hosts or plugin formats may provide this value. - @see isLooping - */ - double ppqLoopEnd; - - /** True if the transport is currently looping. */ - bool isLooping; - - //============================================================================== - bool operator== (const CurrentPositionInfo& other) const noexcept; - bool operator!= (const CurrentPositionInfo& other) const noexcept; - - void resetToDefault(); - }; - - //============================================================================== - /** Fills-in the given structure with details about the transport's - position at the start of the current processing block. - - You can ONLY call this from your processBlock() method! Calling it at other - times will produce undefined behaviour, as the host may not have any context - in which a time would make sense, and some hosts will almost certainly have - multithreading issues if it's not called on the audio thread. - */ - virtual bool getCurrentPosition (CurrentPositionInfo& result) = 0; -}; - - -#endif // JUCE_AUDIOPLAYHEAD_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h deleted file mode 100755 index b7c7b7d..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioPluginInstance.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOPLUGININSTANCE_H_INCLUDED -#define JUCE_AUDIOPLUGININSTANCE_H_INCLUDED - - -//============================================================================== -/** - Base class for an active instance of a plugin. - - This derives from the AudioProcessor class, and adds some extra functionality - that helps when wrapping dynamically loaded plugins. - - This class is not needed when writing plugins, and you should never need to derive - your own sub-classes from it. The plugin hosting classes use it internally and will - return AudioPluginInstance objects which wrap external plugins. - - @see AudioProcessor, AudioPluginFormat -*/ -class JUCE_API AudioPluginInstance : public AudioProcessor -{ -public: - //============================================================================== - /** Destructor. - - Make sure that you delete any UI components that belong to this plugin before - deleting the plugin. - */ - virtual ~AudioPluginInstance() {} - - //============================================================================== - /** Fills-in the appropriate parts of this plugin description object. */ - virtual void fillInPluginDescription (PluginDescription& description) const = 0; - - /** Returns a PluginDescription for this plugin. - This is just a convenience method to avoid calling fillInPluginDescription. - */ - PluginDescription getPluginDescription() const - { - PluginDescription desc; - fillInPluginDescription (desc); - return desc; - } - - /** Returns a pointer to some kind of platform-specific data about the plugin. - E.g. For a VST, this value can be cast to an AEffect*. For an AudioUnit, it can be - cast to an AudioUnit handle. - */ - virtual void* getPlatformSpecificData() { return nullptr; } - - /** For some formats (currently AudioUnit), this forces a reload of the list of - available parameters. - */ - virtual void refreshParameterList() {} - -protected: - //============================================================================== - AudioPluginInstance() {} - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioPluginInstance) -}; - - -#endif // JUCE_AUDIOPLUGININSTANCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp deleted file mode 100755 index e46dba3..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.cpp +++ /dev/null @@ -1,474 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -static ThreadLocalValue wrapperTypeBeingCreated; - -void JUCE_CALLTYPE AudioProcessor::setTypeOfNextNewPlugin (AudioProcessor::WrapperType type) -{ - wrapperTypeBeingCreated = type; -} - -AudioProcessor::AudioProcessor() - : wrapperType (wrapperTypeBeingCreated.get()), - playHead (nullptr), - sampleRate (0), - blockSize (0), - numInputChannels (0), - numOutputChannels (0), - latencySamples (0), - suspended (false), - nonRealtime (false) -{ -} - -AudioProcessor::~AudioProcessor() -{ - // ooh, nasty - the editor should have been deleted before the filter - // that it refers to is deleted.. - jassert (activeEditor == nullptr); - - #if JUCE_DEBUG - // This will fail if you've called beginParameterChangeGesture() for one - // or more parameters without having made a corresponding call to endParameterChangeGesture... - jassert (changingParams.countNumberOfSetBits() == 0); - #endif -} - -void AudioProcessor::setPlayHead (AudioPlayHead* const newPlayHead) -{ - playHead = newPlayHead; -} - -void AudioProcessor::addListener (AudioProcessorListener* const newListener) -{ - const ScopedLock sl (listenerLock); - listeners.addIfNotAlreadyThere (newListener); -} - -void AudioProcessor::removeListener (AudioProcessorListener* const listenerToRemove) -{ - const ScopedLock sl (listenerLock); - listeners.removeFirstMatchingValue (listenerToRemove); -} - -void AudioProcessor::setPlayConfigDetails (const int newNumIns, - const int newNumOuts, - const double newSampleRate, - const int newBlockSize) noexcept -{ - sampleRate = newSampleRate; - blockSize = newBlockSize; - - if (numInputChannels != newNumIns || numOutputChannels != newNumOuts) - { - numInputChannels = newNumIns; - numOutputChannels = newNumOuts; - - numChannelsChanged(); - } -} - -void AudioProcessor::numChannelsChanged() {} - -void AudioProcessor::setSpeakerArrangement (const String& inputs, const String& outputs) -{ - inputSpeakerArrangement = inputs; - outputSpeakerArrangement = outputs; -} - -void AudioProcessor::setNonRealtime (const bool newNonRealtime) noexcept -{ - nonRealtime = newNonRealtime; -} - -void AudioProcessor::setLatencySamples (const int newLatency) -{ - if (latencySamples != newLatency) - { - latencySamples = newLatency; - updateHostDisplay(); - } -} - -void AudioProcessor::setParameterNotifyingHost (const int parameterIndex, - const float newValue) -{ - setParameter (parameterIndex, newValue); - sendParamChangeMessageToListeners (parameterIndex, newValue); -} - -AudioProcessorListener* AudioProcessor::getListenerLocked (const int index) const noexcept -{ - const ScopedLock sl (listenerLock); - return listeners [index]; -} - -void AudioProcessor::sendParamChangeMessageToListeners (const int parameterIndex, const float newValue) -{ - if (isPositiveAndBelow (parameterIndex, getNumParameters())) - { - for (int i = listeners.size(); --i >= 0;) - if (AudioProcessorListener* l = getListenerLocked (i)) - l->audioProcessorParameterChanged (this, parameterIndex, newValue); - } - else - { - jassertfalse; // called with an out-of-range parameter index! - } -} - -void AudioProcessor::beginParameterChangeGesture (int parameterIndex) -{ - if (isPositiveAndBelow (parameterIndex, getNumParameters())) - { - #if JUCE_DEBUG - // This means you've called beginParameterChangeGesture twice in succession without a matching - // call to endParameterChangeGesture. That might be fine in most hosts, but better to avoid doing it. - jassert (! changingParams [parameterIndex]); - changingParams.setBit (parameterIndex); - #endif - - for (int i = listeners.size(); --i >= 0;) - if (AudioProcessorListener* l = getListenerLocked (i)) - l->audioProcessorParameterChangeGestureBegin (this, parameterIndex); - } - else - { - jassertfalse; // called with an out-of-range parameter index! - } -} - -void AudioProcessor::endParameterChangeGesture (int parameterIndex) -{ - if (isPositiveAndBelow (parameterIndex, getNumParameters())) - { - #if JUCE_DEBUG - // This means you've called endParameterChangeGesture without having previously called - // endParameterChangeGesture. That might be fine in most hosts, but better to keep the - // calls matched correctly. - jassert (changingParams [parameterIndex]); - changingParams.clearBit (parameterIndex); - #endif - - for (int i = listeners.size(); --i >= 0;) - if (AudioProcessorListener* l = getListenerLocked (i)) - l->audioProcessorParameterChangeGestureEnd (this, parameterIndex); - } - else - { - jassertfalse; // called with an out-of-range parameter index! - } -} - -void AudioProcessor::updateHostDisplay() -{ - for (int i = listeners.size(); --i >= 0;) - if (AudioProcessorListener* l = getListenerLocked (i)) - l->audioProcessorChanged (this); -} - -const OwnedArray& AudioProcessor::getParameters() const noexcept -{ - return managedParameters; -} - -int AudioProcessor::getNumParameters() -{ - return managedParameters.size(); -} - -float AudioProcessor::getParameter (int index) -{ - if (AudioProcessorParameter* p = getParamChecked (index)) - return p->getValue(); - - return 0; -} - -void AudioProcessor::setParameter (int index, float newValue) -{ - if (AudioProcessorParameter* p = getParamChecked (index)) - p->setValue (newValue); -} - -float AudioProcessor::getParameterDefaultValue (int index) -{ - if (AudioProcessorParameter* p = managedParameters[index]) - return p->getDefaultValue(); - - return 0; -} - -const String AudioProcessor::getParameterName (int index) -{ - if (AudioProcessorParameter* p = getParamChecked (index)) - return p->getName (512); - - return String(); -} - -String AudioProcessor::getParameterName (int index, int maximumStringLength) -{ - if (AudioProcessorParameter* p = managedParameters[index]) - return p->getName (maximumStringLength); - - return getParameterName (index).substring (0, maximumStringLength); -} - -const String AudioProcessor::getParameterText (int index) -{ - return getParameterText (index, 1024); -} - -String AudioProcessor::getParameterText (int index, int maximumStringLength) -{ - if (AudioProcessorParameter* p = managedParameters[index]) - return p->getText (p->getValue(), maximumStringLength); - - return getParameterText (index).substring (0, maximumStringLength); -} - -int AudioProcessor::getParameterNumSteps (int index) -{ - if (AudioProcessorParameter* p = managedParameters[index]) - return p->getNumSteps(); - - return AudioProcessor::getDefaultNumParameterSteps(); -} - -int AudioProcessor::getDefaultNumParameterSteps() noexcept -{ - return 0x7fffffff; -} - -String AudioProcessor::getParameterLabel (int index) const -{ - if (AudioProcessorParameter* p = managedParameters[index]) - return p->getLabel(); - - return String(); -} - -bool AudioProcessor::isParameterAutomatable (int index) const -{ - if (AudioProcessorParameter* p = managedParameters[index]) - return p->isAutomatable(); - - return true; -} - -bool AudioProcessor::isParameterOrientationInverted (int index) const -{ - if (AudioProcessorParameter* p = managedParameters[index]) - return p->isOrientationInverted(); - - return false; -} - -bool AudioProcessor::isMetaParameter (int index) const -{ - if (AudioProcessorParameter* p = managedParameters[index]) - return p->isMetaParameter(); - - return false; -} - -AudioProcessorParameter* AudioProcessor::getParamChecked (int index) const noexcept -{ - AudioProcessorParameter* p = managedParameters[index]; - - // If you hit this, then you're either trying to access parameters that are out-of-range, - // or you're not using addParameter and the managed parameter list, but have failed - // to override some essential virtual methods and implement them appropriately. - jassert (p != nullptr); - return p; -} - -void AudioProcessor::addParameter (AudioProcessorParameter* p) -{ - p->processor = this; - p->parameterIndex = managedParameters.size(); - managedParameters.add (p); -} - -void AudioProcessor::suspendProcessing (const bool shouldBeSuspended) -{ - const ScopedLock sl (callbackLock); - suspended = shouldBeSuspended; -} - -void AudioProcessor::reset() {} -void AudioProcessor::processBlockBypassed (AudioSampleBuffer&, MidiBuffer&) {} - -//============================================================================== -void AudioProcessor::editorBeingDeleted (AudioProcessorEditor* const editor) noexcept -{ - const ScopedLock sl (callbackLock); - - if (activeEditor == editor) - activeEditor = nullptr; -} - -AudioProcessorEditor* AudioProcessor::createEditorIfNeeded() -{ - if (activeEditor != nullptr) - return activeEditor; - - AudioProcessorEditor* const ed = createEditor(); - - if (ed != nullptr) - { - // you must give your editor comp a size before returning it.. - jassert (ed->getWidth() > 0 && ed->getHeight() > 0); - - const ScopedLock sl (callbackLock); - activeEditor = ed; - } - - // You must make your hasEditor() method return a consistent result! - jassert (hasEditor() == (ed != nullptr)); - - return ed; -} - -//============================================================================== -void AudioProcessor::getCurrentProgramStateInformation (juce::MemoryBlock& destData) -{ - getStateInformation (destData); -} - -void AudioProcessor::setCurrentProgramStateInformation (const void* data, int sizeInBytes) -{ - setStateInformation (data, sizeInBytes); -} - -//============================================================================== -// magic number to identify memory blocks that we've stored as XML -const uint32 magicXmlNumber = 0x21324356; - -void AudioProcessor::copyXmlToBinary (const XmlElement& xml, juce::MemoryBlock& destData) -{ - { - MemoryOutputStream out (destData, false); - out.writeInt (magicXmlNumber); - out.writeInt (0); - xml.writeToStream (out, String(), true, false); - out.writeByte (0); - } - - // go back and write the string length.. - static_cast (destData.getData())[1] - = ByteOrder::swapIfBigEndian ((uint32) destData.getSize() - 9); -} - -XmlElement* AudioProcessor::getXmlFromBinary (const void* data, const int sizeInBytes) -{ - if (sizeInBytes > 8 - && ByteOrder::littleEndianInt (data) == magicXmlNumber) - { - const int stringLength = (int) ByteOrder::littleEndianInt (addBytesToPointer (data, 4)); - - if (stringLength > 0) - return XmlDocument::parse (String::fromUTF8 (static_cast (data) + 8, - jmin ((sizeInBytes - 8), stringLength))); - } - - return nullptr; -} - -//============================================================================== -void AudioProcessorListener::audioProcessorParameterChangeGestureBegin (AudioProcessor*, int) {} -void AudioProcessorListener::audioProcessorParameterChangeGestureEnd (AudioProcessor*, int) {} - -//============================================================================== -AudioProcessorParameter::AudioProcessorParameter() noexcept - : processor (nullptr), parameterIndex (-1) -{} - -AudioProcessorParameter::~AudioProcessorParameter() {} - -void AudioProcessorParameter::setValueNotifyingHost (float newValue) -{ - // This method can't be used until the parameter has been attached to a processor! - jassert (processor != nullptr && parameterIndex >= 0); - - return processor->setParameterNotifyingHost (parameterIndex, newValue); -} - -void AudioProcessorParameter::beginChangeGesture() -{ - // This method can't be used until the parameter has been attached to a processor! - jassert (processor != nullptr && parameterIndex >= 0); - - processor->beginParameterChangeGesture (parameterIndex); -} - -void AudioProcessorParameter::endChangeGesture() -{ - // This method can't be used until the parameter has been attached to a processor! - jassert (processor != nullptr && parameterIndex >= 0); - - processor->endParameterChangeGesture (parameterIndex); -} - -bool AudioProcessorParameter::isOrientationInverted() const { return false; } -bool AudioProcessorParameter::isAutomatable() const { return true; } -bool AudioProcessorParameter::isMetaParameter() const { return false; } -int AudioProcessorParameter::getNumSteps() const { return AudioProcessor::getDefaultNumParameterSteps(); } - -String AudioProcessorParameter::getText (float value, int /*maximumStringLength*/) const -{ - return String (value, 2); -} - -//============================================================================== -bool AudioPlayHead::CurrentPositionInfo::operator== (const CurrentPositionInfo& other) const noexcept -{ - return timeInSamples == other.timeInSamples - && ppqPosition == other.ppqPosition - && editOriginTime == other.editOriginTime - && ppqPositionOfLastBarStart == other.ppqPositionOfLastBarStart - && frameRate == other.frameRate - && isPlaying == other.isPlaying - && isRecording == other.isRecording - && bpm == other.bpm - && timeSigNumerator == other.timeSigNumerator - && timeSigDenominator == other.timeSigDenominator - && ppqLoopStart == other.ppqLoopStart - && ppqLoopEnd == other.ppqLoopEnd - && isLooping == other.isLooping; -} - -bool AudioPlayHead::CurrentPositionInfo::operator!= (const CurrentPositionInfo& other) const noexcept -{ - return ! operator== (other); -} - -void AudioPlayHead::CurrentPositionInfo::resetToDefault() -{ - zerostruct (*this); - timeSigNumerator = 4; - timeSigDenominator = 4; - bpm = 120; -} diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h deleted file mode 100755 index ea81339..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessor.h +++ /dev/null @@ -1,695 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOPROCESSOR_H_INCLUDED -#define JUCE_AUDIOPROCESSOR_H_INCLUDED - - -//============================================================================== -/** - Base class for audio processing filters or plugins. - - This is intended to act as a base class of audio filter that is general enough to - be wrapped as a VST, AU, RTAS, etc, or used internally. - - It is also used by the plugin hosting code as the wrapper around an instance - of a loaded plugin. - - Derive your filter class from this base class, and if you're building a plugin, - you should implement a global function called createPluginFilter() which creates - and returns a new instance of your subclass. -*/ -class JUCE_API AudioProcessor -{ -protected: - //============================================================================== - /** Constructor. */ - AudioProcessor(); - -public: - /** Destructor. */ - virtual ~AudioProcessor(); - - //============================================================================== - /** Returns the name of this processor. */ - virtual const String getName() const = 0; - - //============================================================================== - /** Called before playback starts, to let the filter prepare itself. - - The sample rate is the target sample rate, and will remain constant until - playback stops. - - The estimatedSamplesPerBlock value is a HINT about the typical number of - samples that will be processed for each callback, but isn't any kind - of guarantee. The actual block sizes that the host uses may be different - each time the callback happens, and may be more or less than this value. - */ - virtual void prepareToPlay (double sampleRate, - int estimatedSamplesPerBlock) = 0; - - /** Called after playback has stopped, to let the filter free up any resources it - no longer needs. - */ - virtual void releaseResources() = 0; - - /** Renders the next block. - - When this method is called, the buffer contains a number of channels which is - at least as great as the maximum number of input and output channels that - this filter is using. It will be filled with the filter's input data and - should be replaced with the filter's output. - - So for example if your filter has 2 input channels and 4 output channels, then - the buffer will contain 4 channels, the first two being filled with the - input data. Your filter should read these, do its processing, and replace - the contents of all 4 channels with its output. - - Or if your filter has 5 inputs and 2 outputs, the buffer will have 5 channels, - all filled with data, and your filter should overwrite the first 2 of these - with its output. But be VERY careful not to write anything to the last 3 - channels, as these might be mapped to memory that the host assumes is read-only! - - Note that if you have more outputs than inputs, then only those channels that - correspond to an input channel are guaranteed to contain sensible data - e.g. - in the case of 2 inputs and 4 outputs, the first two channels contain the input, - but the last two channels may contain garbage, so you should be careful not to - let this pass through without being overwritten or cleared. - - Also note that the buffer may have more channels than are strictly necessary, - but you should only read/write from the ones that your filter is supposed to - be using. - - The number of samples in these buffers is NOT guaranteed to be the same for every - callback, and may be more or less than the estimated value given to prepareToPlay(). - Your code must be able to cope with variable-sized blocks, or you're going to get - clicks and crashes! - - If the filter is receiving a midi input, then the midiMessages array will be filled - with the midi messages for this block. Each message's timestamp will indicate the - message's time, as a number of samples from the start of the block. - - Any messages left in the midi buffer when this method has finished are assumed to - be the filter's midi output. This means that your filter should be careful to - clear any incoming messages from the array if it doesn't want them to be passed-on. - - Be very careful about what you do in this callback - it's going to be called by - the audio thread, so any kind of interaction with the UI is absolutely - out of the question. If you change a parameter in here and need to tell your UI to - update itself, the best way is probably to inherit from a ChangeBroadcaster, let - the UI components register as listeners, and then call sendChangeMessage() inside the - processBlock() method to send out an asynchronous message. You could also use - the AsyncUpdater class in a similar way. - */ - virtual void processBlock (AudioSampleBuffer& buffer, - MidiBuffer& midiMessages) = 0; - - /** Renders the next block when the processor is being bypassed. - The default implementation of this method will pass-through any incoming audio, but - you may override this method e.g. to add latency compensation to the data to match - the processor's latency characteristics. This will avoid situations where bypassing - will shift the signal forward in time, possibly creating pre-echo effects and odd timings. - Another use for this method would be to cross-fade or morph between the wet (not bypassed) - and dry (bypassed) signals. - */ - virtual void processBlockBypassed (AudioSampleBuffer& buffer, - MidiBuffer& midiMessages); - - //============================================================================== - /** Returns the current AudioPlayHead object that should be used to find - out the state and position of the playhead. - - You can ONLY call this from your processBlock() method! Calling it at other - times will produce undefined behaviour, as the host may not have any context - in which a time would make sense, and some hosts will almost certainly have - multithreading issues if it's not called on the audio thread. - - The AudioPlayHead object that is returned can be used to get the details about - the time of the start of the block currently being processed. But do not - store this pointer or use it outside of the current audio callback, because - the host may delete or re-use it. - - If the host can't or won't provide any time info, this will return nullptr. - */ - AudioPlayHead* getPlayHead() const noexcept { return playHead; } - - - //============================================================================== - /** Returns the current sample rate. - - This can be called from your processBlock() method - it's not guaranteed - to be valid at any other time, and may return 0 if it's unknown. - */ - double getSampleRate() const noexcept { return sampleRate; } - - /** Returns the current typical block size that is being used. - - This can be called from your processBlock() method - it's not guaranteed - to be valid at any other time. - - Remember it's not the ONLY block size that may be used when calling - processBlock, it's just the normal one. The actual block sizes used may be - larger or smaller than this, and will vary between successive calls. - */ - int getBlockSize() const noexcept { return blockSize; } - - //============================================================================== - /** Returns the number of input channels that the host will be sending the filter. - - If writing a plugin, your configuration macros should specify the number of - channels that your filter would prefer to have, and this method lets - you know how many the host is actually using. - - Note that this method is only valid during or after the prepareToPlay() - method call. Until that point, the number of channels will be unknown. - */ - int getNumInputChannels() const noexcept { return numInputChannels; } - - /** Returns the number of output channels that the host will be sending the filter. - - If writing a plugin, your configuration macros should specify the number of - channels that your filter would prefer to have, and this method lets - you know how many the host is actually using. - - Note that this method is only valid during or after the prepareToPlay() - method call. Until that point, the number of channels will be unknown. - */ - int getNumOutputChannels() const noexcept { return numOutputChannels; } - - /** Returns a string containing a whitespace-separated list of speaker types - corresponding to each input channel. - For example in a 5.1 arrangement, the string may be "L R C Lfe Ls Rs" - If the speaker arrangement is unknown, the returned string will be empty. - */ - const String& getInputSpeakerArrangement() const noexcept { return inputSpeakerArrangement; } - - /** Returns a string containing a whitespace-separated list of speaker types - corresponding to each output channel. - For example in a 5.1 arrangement, the string may be "L R C Lfe Ls Rs" - If the speaker arrangement is unknown, the returned string will be empty. - */ - const String& getOutputSpeakerArrangement() const noexcept { return outputSpeakerArrangement; } - - //============================================================================== - /** Returns the name of one of the processor's input channels. - - The processor might not supply very useful names for channels, and this might be - something like "1", "2", "left", "right", etc. - */ - virtual const String getInputChannelName (int channelIndex) const = 0; - - /** Returns the name of one of the processor's output channels. - - The processor might not supply very useful names for channels, and this might be - something like "1", "2", "left", "right", etc. - */ - virtual const String getOutputChannelName (int channelIndex) const = 0; - - /** Returns true if the specified channel is part of a stereo pair with its neighbour. */ - virtual bool isInputChannelStereoPair (int index) const = 0; - - /** Returns true if the specified channel is part of a stereo pair with its neighbour. */ - virtual bool isOutputChannelStereoPair (int index) const = 0; - - /** This returns the number of samples delay that the filter imposes on the audio - passing through it. - - The host will call this to find the latency - the filter itself should set this value - by calling setLatencySamples() as soon as it can during its initialisation. - */ - int getLatencySamples() const noexcept { return latencySamples; } - - /** The filter should call this to set the number of samples delay that it introduces. - - The filter should call this as soon as it can during initialisation, and can call it - later if the value changes. - */ - void setLatencySamples (int newLatency); - - /** Returns true if a silent input always produces a silent output. */ - virtual bool silenceInProducesSilenceOut() const = 0; - - /** Returns the length of the filter's tail, in seconds. */ - virtual double getTailLengthSeconds() const = 0; - - /** Returns true if the processor wants midi messages. */ - virtual bool acceptsMidi() const = 0; - - /** Returns true if the processor produces midi messages. */ - virtual bool producesMidi() const = 0; - - //============================================================================== - /** This returns a critical section that will automatically be locked while the host - is calling the processBlock() method. - - Use it from your UI or other threads to lock access to variables that are used - by the process callback, but obviously be careful not to keep it locked for - too long, because that could cause stuttering playback. If you need to do something - that'll take a long time and need the processing to stop while it happens, use the - suspendProcessing() method instead. - - @see suspendProcessing - */ - const CriticalSection& getCallbackLock() const noexcept { return callbackLock; } - - /** Enables and disables the processing callback. - - If you need to do something time-consuming on a thread and would like to make sure - the audio processing callback doesn't happen until you've finished, use this - to disable the callback and re-enable it again afterwards. - - E.g. - @code - void loadNewPatch() - { - suspendProcessing (true); - - ..do something that takes ages.. - - suspendProcessing (false); - } - @endcode - - If the host tries to make an audio callback while processing is suspended, the - filter will return an empty buffer, but won't block the audio thread like it would - do if you use the getCallbackLock() critical section to synchronise access. - - Any code that calls processBlock() should call isSuspended() before doing so, and - if the processor is suspended, it should avoid the call and emit silence or - whatever is appropriate. - - @see getCallbackLock - */ - void suspendProcessing (bool shouldBeSuspended); - - /** Returns true if processing is currently suspended. - @see suspendProcessing - */ - bool isSuspended() const noexcept { return suspended; } - - /** A plugin can override this to be told when it should reset any playing voices. - - The default implementation does nothing, but a host may call this to tell the - plugin that it should stop any tails or sounds that have been left running. - */ - virtual void reset(); - - //============================================================================== - /** Returns true if the processor is being run in an offline mode for rendering. - - If the processor is being run live on realtime signals, this returns false. - If the mode is unknown, this will assume it's realtime and return false. - - This value may be unreliable until the prepareToPlay() method has been called, - and could change each time prepareToPlay() is called. - - @see setNonRealtime() - */ - bool isNonRealtime() const noexcept { return nonRealtime; } - - /** Called by the host to tell this processor whether it's being used in a non-realtime - capacity for offline rendering or bouncing. - */ - virtual void setNonRealtime (bool isNonRealtime) noexcept; - - //============================================================================== - /** Creates the filter's UI. - - This can return nullptr if you want a UI-less filter, in which case the host may create - a generic UI that lets the user twiddle the parameters directly. - - If you do want to pass back a component, the component should be created and set to - the correct size before returning it. If you implement this method, you must - also implement the hasEditor() method and make it return true. - - Remember not to do anything silly like allowing your filter to keep a pointer to - the component that gets created - it could be deleted later without any warning, which - would make your pointer into a dangler. Use the getActiveEditor() method instead. - - The correct way to handle the connection between an editor component and its - filter is to use something like a ChangeBroadcaster so that the editor can - register itself as a listener, and be told when a change occurs. This lets them - safely unregister themselves when they are deleted. - - Here are a few things to bear in mind when writing an editor: - - - Initially there won't be an editor, until the user opens one, or they might - not open one at all. Your filter mustn't rely on it being there. - - An editor object may be deleted and a replacement one created again at any time. - - It's safe to assume that an editor will be deleted before its filter. - - @see hasEditor - */ - virtual AudioProcessorEditor* createEditor() = 0; - - /** Your filter must override this and return true if it can create an editor component. - @see createEditor - */ - virtual bool hasEditor() const = 0; - - //============================================================================== - /** Returns the active editor, if there is one. - Bear in mind this can return nullptr, even if an editor has previously been opened. - */ - AudioProcessorEditor* getActiveEditor() const noexcept { return activeEditor; } - - /** Returns the active editor, or if there isn't one, it will create one. - This may call createEditor() internally to create the component. - */ - AudioProcessorEditor* createEditorIfNeeded(); - - //============================================================================== - /** This must return the correct value immediately after the object has been - created, and mustn't change the number of parameters later. - */ - virtual int getNumParameters(); - - /** Returns the name of a particular parameter. */ - virtual const String getParameterName (int parameterIndex); - - /** Called by the host to find out the value of one of the filter's parameters. - - The host will expect the value returned to be between 0 and 1.0. - - This could be called quite frequently, so try to make your code efficient. - It's also likely to be called by non-UI threads, so the code in here should - be thread-aware. - */ - virtual float getParameter (int parameterIndex); - - /** Returns the value of a parameter as a text string. */ - virtual const String getParameterText (int parameterIndex); - - /** Returns the name of a parameter as a text string with a preferred maximum length. - If you want to provide customised short versions of your parameter names that - will look better in constrained spaces (e.g. the displays on hardware controller - devices or mixing desks) then you should implement this method. - If you don't override it, the default implementation will call getParameterText(int), - and truncate the result. - */ - virtual String getParameterName (int parameterIndex, int maximumStringLength); - - /** Returns the value of a parameter as a text string with a preferred maximum length. - If you want to provide customised short versions of your parameter values that - will look better in constrained spaces (e.g. the displays on hardware controller - devices or mixing desks) then you should implement this method. - If you don't override it, the default implementation will call getParameterText(int), - and truncate the result. - */ - virtual String getParameterText (int parameterIndex, int maximumStringLength); - - /** Returns the number of discrete steps that this parameter can represent. - The default return value if you don't implement this method is - AudioProcessor::getDefaultNumParameterSteps(). - If your parameter is boolean, then you may want to make this return 2. - The value that is returned may or may not be used, depending on the host. - */ - virtual int getParameterNumSteps (int parameterIndex); - - /** Returns the default number of steps for a parameter. - @see getParameterNumSteps - */ - static int getDefaultNumParameterSteps() noexcept; - - /** Returns the default value for the parameter. - By default, this just returns 0. - The value that is returned may or may not be used, depending on the host. - */ - virtual float getParameterDefaultValue (int parameterIndex); - - /** Some plugin types may be able to return a label string for a - parameter's units. - */ - virtual String getParameterLabel (int index) const; - - /** This can be overridden to tell the host that particular parameters operate in the - reverse direction. (Not all plugin formats or hosts will actually use this information). - */ - virtual bool isParameterOrientationInverted (int index) const; - - /** The host will call this method to change the value of one of the filter's parameters. - - The host may call this at any time, including during the audio processing - callback, so the filter has to process this very fast and avoid blocking. - - If you want to set the value of a parameter internally, e.g. from your - editor component, then don't call this directly - instead, use the - setParameterNotifyingHost() method, which will also send a message to - the host telling it about the change. If the message isn't sent, the host - won't be able to automate your parameters properly. - - The value passed will be between 0 and 1.0. - */ - virtual void setParameter (int parameterIndex, float newValue); - - /** Your filter can call this when it needs to change one of its parameters. - - This could happen when the editor or some other internal operation changes - a parameter. This method will call the setParameter() method to change the - value, and will then send a message to the host telling it about the change. - - Note that to make sure the host correctly handles automation, you should call - the beginParameterChangeGesture() and endParameterChangeGesture() methods to - tell the host when the user has started and stopped changing the parameter. - */ - void setParameterNotifyingHost (int parameterIndex, float newValue); - - /** Returns true if the host can automate this parameter. - By default, this returns true for all parameters. - */ - virtual bool isParameterAutomatable (int parameterIndex) const; - - /** Should return true if this parameter is a "meta" parameter. - A meta-parameter is a parameter that changes other params. It is used - by some hosts (e.g. AudioUnit hosts). - By default this returns false. - */ - virtual bool isMetaParameter (int parameterIndex) const; - - /** Sends a signal to the host to tell it that the user is about to start changing this - parameter. - - This allows the host to know when a parameter is actively being held by the user, and - it may use this information to help it record automation. - - If you call this, it must be matched by a later call to endParameterChangeGesture(). - */ - void beginParameterChangeGesture (int parameterIndex); - - /** Tells the host that the user has finished changing this parameter. - - This allows the host to know when a parameter is actively being held by the user, and - it may use this information to help it record automation. - - A call to this method must follow a call to beginParameterChangeGesture(). - */ - void endParameterChangeGesture (int parameterIndex); - - /** The filter can call this when something (apart from a parameter value) has changed. - - It sends a hint to the host that something like the program, number of parameters, - etc, has changed, and that it should update itself. - */ - void updateHostDisplay(); - - //============================================================================== - /** Adds a parameter to the list. - The parameter object will be managed and deleted automatically by the list - when no longer needed. - */ - void addParameter (AudioProcessorParameter*); - - /** Returns the current list of parameters. */ - const OwnedArray& getParameters() const noexcept; - - //============================================================================== - /** Returns the number of preset programs the filter supports. - - The value returned must be valid as soon as this object is created, and - must not change over its lifetime. - - This value shouldn't be less than 1. - */ - virtual int getNumPrograms() = 0; - - /** Returns the number of the currently active program. */ - virtual int getCurrentProgram() = 0; - - /** Called by the host to change the current program. */ - virtual void setCurrentProgram (int index) = 0; - - /** Must return the name of a given program. */ - virtual const String getProgramName (int index) = 0; - - /** Called by the host to rename a program. */ - virtual void changeProgramName (int index, const String& newName) = 0; - - //============================================================================== - /** The host will call this method when it wants to save the filter's internal state. - - This must copy any info about the filter's state into the block of memory provided, - so that the host can store this and later restore it using setStateInformation(). - - Note that there's also a getCurrentProgramStateInformation() method, which only - stores the current program, not the state of the entire filter. - - See also the helper function copyXmlToBinary() for storing settings as XML. - - @see getCurrentProgramStateInformation - */ - virtual void getStateInformation (juce::MemoryBlock& destData) = 0; - - /** The host will call this method if it wants to save the state of just the filter's - current program. - - Unlike getStateInformation, this should only return the current program's state. - - Not all hosts support this, and if you don't implement it, the base class - method just calls getStateInformation() instead. If you do implement it, be - sure to also implement getCurrentProgramStateInformation. - - @see getStateInformation, setCurrentProgramStateInformation - */ - virtual void getCurrentProgramStateInformation (juce::MemoryBlock& destData); - - /** This must restore the filter's state from a block of data previously created - using getStateInformation(). - - Note that there's also a setCurrentProgramStateInformation() method, which tries - to restore just the current program, not the state of the entire filter. - - See also the helper function getXmlFromBinary() for loading settings as XML. - - @see setCurrentProgramStateInformation - */ - virtual void setStateInformation (const void* data, int sizeInBytes) = 0; - - /** The host will call this method if it wants to restore the state of just the filter's - current program. - - Not all hosts support this, and if you don't implement it, the base class - method just calls setStateInformation() instead. If you do implement it, be - sure to also implement getCurrentProgramStateInformation. - - @see setStateInformation, getCurrentProgramStateInformation - */ - virtual void setCurrentProgramStateInformation (const void* data, int sizeInBytes); - - /** This method is called when the number of input or output channels is changed. */ - virtual void numChannelsChanged(); - - //============================================================================== - /** Adds a listener that will be called when an aspect of this processor changes. */ - virtual void addListener (AudioProcessorListener* newListener); - - /** Removes a previously added listener. */ - virtual void removeListener (AudioProcessorListener* listenerToRemove); - - //============================================================================== - /** Tells the processor to use this playhead object. - The processor will not take ownership of the object, so the caller must delete it when - it is no longer being used. - */ - virtual void setPlayHead (AudioPlayHead* newPlayHead); - - //============================================================================== - /** This is called by the processor to specify its details before being played. */ - void setPlayConfigDetails (int numIns, int numOuts, double sampleRate, int blockSize) noexcept; - - //============================================================================== - /** Not for public use - this is called before deleting an editor component. */ - void editorBeingDeleted (AudioProcessorEditor*) noexcept; - - /** Not for public use - this is called to initialise the processor before playing. */ - void setSpeakerArrangement (const String& inputs, const String& outputs); - - /** Flags to indicate the type of plugin context in which a processor is being used. */ - enum WrapperType - { - wrapperType_Undefined = 0, - wrapperType_VST, - wrapperType_VST3, - wrapperType_AudioUnit, - wrapperType_RTAS, - wrapperType_AAX, - wrapperType_Standalone - }; - - /** When loaded by a plugin wrapper, this flag will be set to indicate the type - of plugin within which the processor is running. - */ - WrapperType wrapperType; - - //============================================================================== - /** Helper function that just converts an xml element into a binary blob. - - Use this in your filter's getStateInformation() method if you want to - store its state as xml. - - Then use getXmlFromBinary() to reverse this operation and retrieve the XML - from a binary blob. - */ - static void copyXmlToBinary (const XmlElement& xml, - juce::MemoryBlock& destData); - - /** Retrieves an XML element that was stored as binary with the copyXmlToBinary() method. - - This might return nullptr if the data's unsuitable or corrupted. Otherwise it will return - an XmlElement object that the caller must delete when no longer needed. - */ - static XmlElement* getXmlFromBinary (const void* data, int sizeInBytes); - - /** @internal */ - static void JUCE_CALLTYPE setTypeOfNextNewPlugin (WrapperType); - -protected: - /** @internal */ - AudioPlayHead* playHead; - - /** @internal */ - void sendParamChangeMessageToListeners (int parameterIndex, float newValue); - -private: - Array listeners; - Component::SafePointer activeEditor; - double sampleRate; - int blockSize, numInputChannels, numOutputChannels, latencySamples; - bool suspended, nonRealtime; - CriticalSection callbackLock, listenerLock; - String inputSpeakerArrangement, outputSpeakerArrangement; - - OwnedArray managedParameters; - AudioProcessorParameter* getParamChecked (int) const noexcept; - - #if JUCE_DEBUG - BigInteger changingParams; - #endif - - AudioProcessorListener* getListenerLocked (int) const noexcept; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessor) -}; - - -#endif // JUCE_AUDIOPROCESSOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp deleted file mode 100755 index a625411..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AudioProcessorEditor::AudioProcessorEditor (AudioProcessor& p) noexcept : processor (p) -{ -} - -AudioProcessorEditor::AudioProcessorEditor (AudioProcessor* p) noexcept : processor (*p) -{ - // the filter must be valid.. - jassert (p != nullptr); -} - -AudioProcessorEditor::~AudioProcessorEditor() -{ - // if this fails, then the wrapper hasn't called editorBeingDeleted() on the - // filter for some reason.. - jassert (processor.getActiveEditor() != this); -} - -void AudioProcessorEditor::setControlHighlight (ParameterControlHighlightInfo) {} -int AudioProcessorEditor::getControlParameterIndex (Component&) { return -1; } diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h deleted file mode 100755 index 1755497..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorEditor.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOPROCESSOREDITOR_H_INCLUDED -#define JUCE_AUDIOPROCESSOREDITOR_H_INCLUDED - - -//============================================================================== -/** - Base class for the component that acts as the GUI for an AudioProcessor. - - Derive your editor component from this class, and create an instance of it - by overriding the AudioProcessor::createEditor() method. - - @see AudioProcessor, GenericAudioProcessorEditor -*/ -class JUCE_API AudioProcessorEditor : public Component -{ -protected: - //============================================================================== - /** Creates an editor for the specified processor. */ - AudioProcessorEditor (AudioProcessor&) noexcept; - - /** Creates an editor for the specified processor. */ - AudioProcessorEditor (AudioProcessor*) noexcept; - -public: - /** Destructor. */ - ~AudioProcessorEditor(); - - - //============================================================================== - /** The AudioProcessor that this editor represents. */ - AudioProcessor& processor; - - /** Returns a pointer to the processor that this editor represents. - This method is here to support legacy code, but it's easier to just use the - AudioProcessorEditor::processor member variable directly to get this object. - */ - AudioProcessor* getAudioProcessor() const noexcept { return &processor; } - - //============================================================================== - /** Used by the setParameterHighlighting() method. */ - struct ParameterControlHighlightInfo - { - int parameterIndex; - bool isHighlighted; - Colour suggestedColour; - }; - - /** Some types of plugin can call this to suggest that the control for a particular - parameter should be highlighted. - Currently only AAX plugins will call this, and implementing it is optional. - */ - virtual void setControlHighlight (ParameterControlHighlightInfo); - - /** Called by certain plug-in wrappers to find out whether a component is used - to control a parameter. - - If the given component represents a particular plugin parameter, then this - method should return the index of that parameter. If not, it should return -1. - Currently only AAX plugins will call this, and implementing it is optional. - */ - virtual int getControlParameterIndex (Component&); - -private: - JUCE_DECLARE_NON_COPYABLE (AudioProcessorEditor) -}; - - -#endif // JUCE_AUDIOPROCESSOREDITOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp deleted file mode 100755 index 84dd0e2..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ /dev/null @@ -1,1511 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -const int AudioProcessorGraph::midiChannelIndex = 0x1000; - -//============================================================================== -namespace GraphRenderingOps -{ - -//============================================================================== -struct AudioGraphRenderingOp -{ - AudioGraphRenderingOp() noexcept {} - virtual ~AudioGraphRenderingOp() {} - - virtual void perform (AudioSampleBuffer& sharedBufferChans, - const OwnedArray& sharedMidiBuffers, - const int numSamples) = 0; - - JUCE_LEAK_DETECTOR (AudioGraphRenderingOp) -}; - -//============================================================================== -struct ClearChannelOp : public AudioGraphRenderingOp -{ - ClearChannelOp (const int channel) noexcept : channelNum (channel) {} - - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray&, const int numSamples) - { - sharedBufferChans.clear (channelNum, 0, numSamples); - } - - const int channelNum; - - JUCE_DECLARE_NON_COPYABLE (ClearChannelOp) -}; - -//============================================================================== -struct CopyChannelOp : public AudioGraphRenderingOp -{ - CopyChannelOp (const int srcChan, const int dstChan) noexcept - : srcChannelNum (srcChan), dstChannelNum (dstChan) - {} - - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray&, const int numSamples) - { - sharedBufferChans.copyFrom (dstChannelNum, 0, sharedBufferChans, srcChannelNum, 0, numSamples); - } - - const int srcChannelNum, dstChannelNum; - - JUCE_DECLARE_NON_COPYABLE (CopyChannelOp) -}; - -//============================================================================== -struct AddChannelOp : public AudioGraphRenderingOp -{ - AddChannelOp (const int srcChan, const int dstChan) noexcept - : srcChannelNum (srcChan), dstChannelNum (dstChan) - {} - - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray&, const int numSamples) - { - sharedBufferChans.addFrom (dstChannelNum, 0, sharedBufferChans, srcChannelNum, 0, numSamples); - } - - const int srcChannelNum, dstChannelNum; - - JUCE_DECLARE_NON_COPYABLE (AddChannelOp) -}; - -//============================================================================== -struct ClearMidiBufferOp : public AudioGraphRenderingOp -{ - ClearMidiBufferOp (const int buffer) noexcept : bufferNum (buffer) {} - - void perform (AudioSampleBuffer&, const OwnedArray& sharedMidiBuffers, const int) - { - sharedMidiBuffers.getUnchecked (bufferNum)->clear(); - } - - const int bufferNum; - - JUCE_DECLARE_NON_COPYABLE (ClearMidiBufferOp) -}; - -//============================================================================== -struct CopyMidiBufferOp : public AudioGraphRenderingOp -{ - CopyMidiBufferOp (const int srcBuffer, const int dstBuffer) noexcept - : srcBufferNum (srcBuffer), dstBufferNum (dstBuffer) - {} - - void perform (AudioSampleBuffer&, const OwnedArray& sharedMidiBuffers, const int) - { - *sharedMidiBuffers.getUnchecked (dstBufferNum) = *sharedMidiBuffers.getUnchecked (srcBufferNum); - } - - const int srcBufferNum, dstBufferNum; - - JUCE_DECLARE_NON_COPYABLE (CopyMidiBufferOp) -}; - -//============================================================================== -struct AddMidiBufferOp : public AudioGraphRenderingOp -{ - AddMidiBufferOp (const int srcBuffer, const int dstBuffer) - : srcBufferNum (srcBuffer), dstBufferNum (dstBuffer) - {} - - void perform (AudioSampleBuffer&, const OwnedArray& sharedMidiBuffers, const int numSamples) - { - sharedMidiBuffers.getUnchecked (dstBufferNum) - ->addEvents (*sharedMidiBuffers.getUnchecked (srcBufferNum), 0, numSamples, 0); - } - - const int srcBufferNum, dstBufferNum; - - JUCE_DECLARE_NON_COPYABLE (AddMidiBufferOp) -}; - -//============================================================================== -struct DelayChannelOp : public AudioGraphRenderingOp -{ - DelayChannelOp (const int chan, const int delaySize) - : channel (chan), - bufferSize (delaySize + 1), - readIndex (0), writeIndex (delaySize) - { - buffer.calloc ((size_t) bufferSize); - } - - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray&, const int numSamples) - { - float* data = sharedBufferChans.getWritePointer (channel, 0); - - for (int i = numSamples; --i >= 0;) - { - buffer [writeIndex] = *data; - *data++ = buffer [readIndex]; - - if (++readIndex >= bufferSize) readIndex = 0; - if (++writeIndex >= bufferSize) writeIndex = 0; - } - } - -private: - HeapBlock buffer; - const int channel, bufferSize; - int readIndex, writeIndex; - - JUCE_DECLARE_NON_COPYABLE (DelayChannelOp) -}; - - -//============================================================================== -struct ProcessBufferOp : public AudioGraphRenderingOp -{ - ProcessBufferOp (const AudioProcessorGraph::Node::Ptr& n, - const Array& audioChannels, - const int totalNumChans, - const int midiBuffer) - : node (n), - processor (n->getProcessor()), - audioChannelsToUse (audioChannels), - totalChans (jmax (1, totalNumChans)), - midiBufferToUse (midiBuffer) - { - channels.calloc ((size_t) totalChans); - - while (audioChannelsToUse.size() < totalChans) - audioChannelsToUse.add (0); - } - - void perform (AudioSampleBuffer& sharedBufferChans, const OwnedArray& sharedMidiBuffers, const int numSamples) - { - for (int i = totalChans; --i >= 0;) - channels[i] = sharedBufferChans.getWritePointer (audioChannelsToUse.getUnchecked (i), 0); - - AudioSampleBuffer buffer (channels, totalChans, numSamples); - - processor->processBlock (buffer, *sharedMidiBuffers.getUnchecked (midiBufferToUse)); - } - - const AudioProcessorGraph::Node::Ptr node; - AudioProcessor* const processor; - -private: - Array audioChannelsToUse; - HeapBlock channels; - const int totalChans; - const int midiBufferToUse; - - JUCE_DECLARE_NON_COPYABLE (ProcessBufferOp) -}; - -//============================================================================== -/** Used to calculate the correct sequence of rendering ops needed, based on - the best re-use of shared buffers at each stage. -*/ -struct RenderingOpSequenceCalculator -{ - RenderingOpSequenceCalculator (AudioProcessorGraph& g, - const Array& nodes, - Array& renderingOps) - : graph (g), - orderedNodes (nodes), - totalLatency (0) - { - nodeIds.add ((uint32) zeroNodeID); // first buffer is read-only zeros - channels.add (0); - - midiNodeIds.add ((uint32) zeroNodeID); - - for (int i = 0; i < orderedNodes.size(); ++i) - { - createRenderingOpsForNode (*orderedNodes.getUnchecked(i), renderingOps, i); - markAnyUnusedBuffersAsFree (i); - } - - graph.setLatencySamples (totalLatency); - } - - int getNumBuffersNeeded() const noexcept { return nodeIds.size(); } - int getNumMidiBuffersNeeded() const noexcept { return midiNodeIds.size(); } - -private: - //============================================================================== - AudioProcessorGraph& graph; - const Array& orderedNodes; - Array channels; - Array nodeIds, midiNodeIds; - - enum { freeNodeID = 0xffffffff, zeroNodeID = 0xfffffffe }; - - static bool isNodeBusy (uint32 nodeID) noexcept { return nodeID != freeNodeID && nodeID != zeroNodeID; } - - Array nodeDelayIDs; - Array nodeDelays; - int totalLatency; - - int getNodeDelay (const uint32 nodeID) const { return nodeDelays [nodeDelayIDs.indexOf (nodeID)]; } - - void setNodeDelay (const uint32 nodeID, const int latency) - { - const int index = nodeDelayIDs.indexOf (nodeID); - - if (index >= 0) - { - nodeDelays.set (index, latency); - } - else - { - nodeDelayIDs.add (nodeID); - nodeDelays.add (latency); - } - } - - int getInputLatencyForNode (const uint32 nodeID) const - { - int maxLatency = 0; - - for (int i = graph.getNumConnections(); --i >= 0;) - { - const AudioProcessorGraph::Connection* const c = graph.getConnection (i); - - if (c->destNodeId == nodeID) - maxLatency = jmax (maxLatency, getNodeDelay (c->sourceNodeId)); - } - - return maxLatency; - } - - //============================================================================== - void createRenderingOpsForNode (AudioProcessorGraph::Node& node, - Array& renderingOps, - const int ourRenderingIndex) - { - AudioProcessor& processor = *node.getProcessor(); - const int numIns = processor.getNumInputChannels(); - const int numOuts = processor.getNumOutputChannels(); - const int totalChans = jmax (numIns, numOuts); - - Array audioChannelsToUse; - int midiBufferToUse = -1; - - int maxLatency = getInputLatencyForNode (node.nodeId); - - for (int inputChan = 0; inputChan < numIns; ++inputChan) - { - // get a list of all the inputs to this node - Array sourceNodes; - Array sourceOutputChans; - - for (int i = graph.getNumConnections(); --i >= 0;) - { - const AudioProcessorGraph::Connection* const c = graph.getConnection (i); - - if (c->destNodeId == node.nodeId && c->destChannelIndex == inputChan) - { - sourceNodes.add (c->sourceNodeId); - sourceOutputChans.add (c->sourceChannelIndex); - } - } - - int bufIndex = -1; - - if (sourceNodes.size() == 0) - { - // unconnected input channel - - if (inputChan >= numOuts) - { - bufIndex = getReadOnlyEmptyBuffer(); - jassert (bufIndex >= 0); - } - else - { - bufIndex = getFreeBuffer (false); - renderingOps.add (new ClearChannelOp (bufIndex)); - } - } - else if (sourceNodes.size() == 1) - { - // channel with a straightforward single input.. - const uint32 srcNode = sourceNodes.getUnchecked(0); - const int srcChan = sourceOutputChans.getUnchecked(0); - - bufIndex = getBufferContaining (srcNode, srcChan); - - if (bufIndex < 0) - { - // if not found, this is probably a feedback loop - bufIndex = getReadOnlyEmptyBuffer(); - jassert (bufIndex >= 0); - } - - if (inputChan < numOuts - && isBufferNeededLater (ourRenderingIndex, - inputChan, - srcNode, srcChan)) - { - // can't mess up this channel because it's needed later by another node, so we - // need to use a copy of it.. - const int newFreeBuffer = getFreeBuffer (false); - - renderingOps.add (new CopyChannelOp (bufIndex, newFreeBuffer)); - - bufIndex = newFreeBuffer; - } - - const int nodeDelay = getNodeDelay (srcNode); - - if (nodeDelay < maxLatency) - renderingOps.add (new DelayChannelOp (bufIndex, maxLatency - nodeDelay)); - } - else - { - // channel with a mix of several inputs.. - - // try to find a re-usable channel from our inputs.. - int reusableInputIndex = -1; - - for (int i = 0; i < sourceNodes.size(); ++i) - { - const int sourceBufIndex = getBufferContaining (sourceNodes.getUnchecked(i), - sourceOutputChans.getUnchecked(i)); - - if (sourceBufIndex >= 0 - && ! isBufferNeededLater (ourRenderingIndex, - inputChan, - sourceNodes.getUnchecked(i), - sourceOutputChans.getUnchecked(i))) - { - // we've found one of our input chans that can be re-used.. - reusableInputIndex = i; - bufIndex = sourceBufIndex; - - const int nodeDelay = getNodeDelay (sourceNodes.getUnchecked (i)); - if (nodeDelay < maxLatency) - renderingOps.add (new DelayChannelOp (sourceBufIndex, maxLatency - nodeDelay)); - - break; - } - } - - if (reusableInputIndex < 0) - { - // can't re-use any of our input chans, so get a new one and copy everything into it.. - bufIndex = getFreeBuffer (false); - jassert (bufIndex != 0); - - const int srcIndex = getBufferContaining (sourceNodes.getUnchecked (0), - sourceOutputChans.getUnchecked (0)); - if (srcIndex < 0) - { - // if not found, this is probably a feedback loop - renderingOps.add (new ClearChannelOp (bufIndex)); - } - else - { - renderingOps.add (new CopyChannelOp (srcIndex, bufIndex)); - } - - reusableInputIndex = 0; - const int nodeDelay = getNodeDelay (sourceNodes.getFirst()); - - if (nodeDelay < maxLatency) - renderingOps.add (new DelayChannelOp (bufIndex, maxLatency - nodeDelay)); - } - - for (int j = 0; j < sourceNodes.size(); ++j) - { - if (j != reusableInputIndex) - { - int srcIndex = getBufferContaining (sourceNodes.getUnchecked(j), - sourceOutputChans.getUnchecked(j)); - if (srcIndex >= 0) - { - const int nodeDelay = getNodeDelay (sourceNodes.getUnchecked (j)); - - if (nodeDelay < maxLatency) - { - if (! isBufferNeededLater (ourRenderingIndex, inputChan, - sourceNodes.getUnchecked(j), - sourceOutputChans.getUnchecked(j))) - { - renderingOps.add (new DelayChannelOp (srcIndex, maxLatency - nodeDelay)); - } - else // buffer is reused elsewhere, can't be delayed - { - const int bufferToDelay = getFreeBuffer (false); - renderingOps.add (new CopyChannelOp (srcIndex, bufferToDelay)); - renderingOps.add (new DelayChannelOp (bufferToDelay, maxLatency - nodeDelay)); - srcIndex = bufferToDelay; - } - } - - renderingOps.add (new AddChannelOp (srcIndex, bufIndex)); - } - } - } - } - - jassert (bufIndex >= 0); - audioChannelsToUse.add (bufIndex); - - if (inputChan < numOuts) - markBufferAsContaining (bufIndex, node.nodeId, inputChan); - } - - for (int outputChan = numIns; outputChan < numOuts; ++outputChan) - { - const int bufIndex = getFreeBuffer (false); - jassert (bufIndex != 0); - audioChannelsToUse.add (bufIndex); - - markBufferAsContaining (bufIndex, node.nodeId, outputChan); - } - - // Now the same thing for midi.. - Array midiSourceNodes; - - for (int i = graph.getNumConnections(); --i >= 0;) - { - const AudioProcessorGraph::Connection* const c = graph.getConnection (i); - - if (c->destNodeId == node.nodeId && c->destChannelIndex == AudioProcessorGraph::midiChannelIndex) - midiSourceNodes.add (c->sourceNodeId); - } - - if (midiSourceNodes.size() == 0) - { - // No midi inputs.. - midiBufferToUse = getFreeBuffer (true); // need to pick a buffer even if the processor doesn't use midi - - if (processor.acceptsMidi() || processor.producesMidi()) - renderingOps.add (new ClearMidiBufferOp (midiBufferToUse)); - } - else if (midiSourceNodes.size() == 1) - { - // One midi input.. - midiBufferToUse = getBufferContaining (midiSourceNodes.getUnchecked(0), - AudioProcessorGraph::midiChannelIndex); - - if (midiBufferToUse >= 0) - { - if (isBufferNeededLater (ourRenderingIndex, - AudioProcessorGraph::midiChannelIndex, - midiSourceNodes.getUnchecked(0), - AudioProcessorGraph::midiChannelIndex)) - { - // can't mess up this channel because it's needed later by another node, so we - // need to use a copy of it.. - const int newFreeBuffer = getFreeBuffer (true); - renderingOps.add (new CopyMidiBufferOp (midiBufferToUse, newFreeBuffer)); - midiBufferToUse = newFreeBuffer; - } - } - else - { - // probably a feedback loop, so just use an empty one.. - midiBufferToUse = getFreeBuffer (true); // need to pick a buffer even if the processor doesn't use midi - } - } - else - { - // More than one midi input being mixed.. - int reusableInputIndex = -1; - - for (int i = 0; i < midiSourceNodes.size(); ++i) - { - const int sourceBufIndex = getBufferContaining (midiSourceNodes.getUnchecked(i), - AudioProcessorGraph::midiChannelIndex); - - if (sourceBufIndex >= 0 - && ! isBufferNeededLater (ourRenderingIndex, - AudioProcessorGraph::midiChannelIndex, - midiSourceNodes.getUnchecked(i), - AudioProcessorGraph::midiChannelIndex)) - { - // we've found one of our input buffers that can be re-used.. - reusableInputIndex = i; - midiBufferToUse = sourceBufIndex; - break; - } - } - - if (reusableInputIndex < 0) - { - // can't re-use any of our input buffers, so get a new one and copy everything into it.. - midiBufferToUse = getFreeBuffer (true); - jassert (midiBufferToUse >= 0); - - const int srcIndex = getBufferContaining (midiSourceNodes.getUnchecked(0), - AudioProcessorGraph::midiChannelIndex); - if (srcIndex >= 0) - renderingOps.add (new CopyMidiBufferOp (srcIndex, midiBufferToUse)); - else - renderingOps.add (new ClearMidiBufferOp (midiBufferToUse)); - - reusableInputIndex = 0; - } - - for (int j = 0; j < midiSourceNodes.size(); ++j) - { - if (j != reusableInputIndex) - { - const int srcIndex = getBufferContaining (midiSourceNodes.getUnchecked(j), - AudioProcessorGraph::midiChannelIndex); - if (srcIndex >= 0) - renderingOps.add (new AddMidiBufferOp (srcIndex, midiBufferToUse)); - } - } - } - - if (processor.producesMidi()) - markBufferAsContaining (midiBufferToUse, node.nodeId, - AudioProcessorGraph::midiChannelIndex); - - setNodeDelay (node.nodeId, maxLatency + processor.getLatencySamples()); - - if (numOuts == 0) - totalLatency = maxLatency; - - renderingOps.add (new ProcessBufferOp (&node, audioChannelsToUse, - totalChans, midiBufferToUse)); - } - - //============================================================================== - int getFreeBuffer (const bool forMidi) - { - if (forMidi) - { - for (int i = 1; i < midiNodeIds.size(); ++i) - if (midiNodeIds.getUnchecked(i) == freeNodeID) - return i; - - midiNodeIds.add ((uint32) freeNodeID); - return midiNodeIds.size() - 1; - } - else - { - for (int i = 1; i < nodeIds.size(); ++i) - if (nodeIds.getUnchecked(i) == freeNodeID) - return i; - - nodeIds.add ((uint32) freeNodeID); - channels.add (0); - return nodeIds.size() - 1; - } - } - - int getReadOnlyEmptyBuffer() const noexcept - { - return 0; - } - - int getBufferContaining (const uint32 nodeId, const int outputChannel) const noexcept - { - if (outputChannel == AudioProcessorGraph::midiChannelIndex) - { - for (int i = midiNodeIds.size(); --i >= 0;) - if (midiNodeIds.getUnchecked(i) == nodeId) - return i; - } - else - { - for (int i = nodeIds.size(); --i >= 0;) - if (nodeIds.getUnchecked(i) == nodeId - && channels.getUnchecked(i) == outputChannel) - return i; - } - - return -1; - } - - void markAnyUnusedBuffersAsFree (const int stepIndex) - { - for (int i = 0; i < nodeIds.size(); ++i) - { - if (isNodeBusy (nodeIds.getUnchecked(i)) - && ! isBufferNeededLater (stepIndex, -1, - nodeIds.getUnchecked(i), - channels.getUnchecked(i))) - { - nodeIds.set (i, (uint32) freeNodeID); - } - } - - for (int i = 0; i < midiNodeIds.size(); ++i) - { - if (isNodeBusy (midiNodeIds.getUnchecked(i)) - && ! isBufferNeededLater (stepIndex, -1, - midiNodeIds.getUnchecked(i), - AudioProcessorGraph::midiChannelIndex)) - { - midiNodeIds.set (i, (uint32) freeNodeID); - } - } - } - - bool isBufferNeededLater (int stepIndexToSearchFrom, - int inputChannelOfIndexToIgnore, - const uint32 nodeId, - const int outputChanIndex) const - { - while (stepIndexToSearchFrom < orderedNodes.size()) - { - const AudioProcessorGraph::Node* const node = (const AudioProcessorGraph::Node*) orderedNodes.getUnchecked (stepIndexToSearchFrom); - - if (outputChanIndex == AudioProcessorGraph::midiChannelIndex) - { - if (inputChannelOfIndexToIgnore != AudioProcessorGraph::midiChannelIndex - && graph.getConnectionBetween (nodeId, AudioProcessorGraph::midiChannelIndex, - node->nodeId, AudioProcessorGraph::midiChannelIndex) != nullptr) - return true; - } - else - { - for (int i = 0; i < node->getProcessor()->getNumInputChannels(); ++i) - if (i != inputChannelOfIndexToIgnore - && graph.getConnectionBetween (nodeId, outputChanIndex, - node->nodeId, i) != nullptr) - return true; - } - - inputChannelOfIndexToIgnore = -1; - ++stepIndexToSearchFrom; - } - - return false; - } - - void markBufferAsContaining (int bufferNum, uint32 nodeId, int outputIndex) - { - if (outputIndex == AudioProcessorGraph::midiChannelIndex) - { - jassert (bufferNum > 0 && bufferNum < midiNodeIds.size()); - - midiNodeIds.set (bufferNum, nodeId); - } - else - { - jassert (bufferNum >= 0 && bufferNum < nodeIds.size()); - - nodeIds.set (bufferNum, nodeId); - channels.set (bufferNum, outputIndex); - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RenderingOpSequenceCalculator) -}; - -//============================================================================== -// Holds a fast lookup table for checking which nodes are inputs to others. -class ConnectionLookupTable -{ -public: - explicit ConnectionLookupTable (const OwnedArray& connections) - { - for (int i = 0; i < connections.size(); ++i) - { - const AudioProcessorGraph::Connection* const c = connections.getUnchecked(i); - - int index; - Entry* entry = findEntry (c->destNodeId, index); - - if (entry == nullptr) - { - entry = new Entry (c->destNodeId); - entries.insert (index, entry); - } - - entry->srcNodes.add (c->sourceNodeId); - } - } - - bool isAnInputTo (const uint32 possibleInputId, - const uint32 possibleDestinationId) const noexcept - { - return isAnInputToRecursive (possibleInputId, possibleDestinationId, entries.size()); - } - -private: - //============================================================================== - struct Entry - { - explicit Entry (const uint32 destNodeId_) noexcept : destNodeId (destNodeId_) {} - - const uint32 destNodeId; - SortedSet srcNodes; - - JUCE_DECLARE_NON_COPYABLE (Entry) - }; - - OwnedArray entries; - - bool isAnInputToRecursive (const uint32 possibleInputId, - const uint32 possibleDestinationId, - int recursionCheck) const noexcept - { - int index; - - if (const Entry* const entry = findEntry (possibleDestinationId, index)) - { - const SortedSet& srcNodes = entry->srcNodes; - - if (srcNodes.contains (possibleInputId)) - return true; - - if (--recursionCheck >= 0) - { - for (int i = 0; i < srcNodes.size(); ++i) - if (isAnInputToRecursive (possibleInputId, srcNodes.getUnchecked(i), recursionCheck)) - return true; - } - } - - return false; - } - - Entry* findEntry (const uint32 destNodeId, int& insertIndex) const noexcept - { - Entry* result = nullptr; - - int start = 0; - int end = entries.size(); - - for (;;) - { - if (start >= end) - { - break; - } - else if (destNodeId == entries.getUnchecked (start)->destNodeId) - { - result = entries.getUnchecked (start); - break; - } - else - { - const int halfway = (start + end) / 2; - - if (halfway == start) - { - if (destNodeId >= entries.getUnchecked (halfway)->destNodeId) - ++start; - - break; - } - else if (destNodeId >= entries.getUnchecked (halfway)->destNodeId) - start = halfway; - else - end = halfway; - } - } - - insertIndex = start; - return result; - } - - JUCE_DECLARE_NON_COPYABLE (ConnectionLookupTable) -}; - -//============================================================================== -struct ConnectionSorter -{ - static int compareElements (const AudioProcessorGraph::Connection* const first, - const AudioProcessorGraph::Connection* const second) noexcept - { - if (first->sourceNodeId < second->sourceNodeId) return -1; - if (first->sourceNodeId > second->sourceNodeId) return 1; - if (first->destNodeId < second->destNodeId) return -1; - if (first->destNodeId > second->destNodeId) return 1; - if (first->sourceChannelIndex < second->sourceChannelIndex) return -1; - if (first->sourceChannelIndex > second->sourceChannelIndex) return 1; - if (first->destChannelIndex < second->destChannelIndex) return -1; - if (first->destChannelIndex > second->destChannelIndex) return 1; - - return 0; - } -}; - -} - -//============================================================================== -AudioProcessorGraph::Connection::Connection (const uint32 sourceID, const int sourceChannel, - const uint32 destID, const int destChannel) noexcept - : sourceNodeId (sourceID), sourceChannelIndex (sourceChannel), - destNodeId (destID), destChannelIndex (destChannel) -{ -} - -//============================================================================== -AudioProcessorGraph::Node::Node (const uint32 nodeID, AudioProcessor* const p) noexcept - : nodeId (nodeID), processor (p), isPrepared (false) -{ - jassert (processor != nullptr); -} - -void AudioProcessorGraph::Node::prepare (const double sampleRate, const int blockSize, - AudioProcessorGraph* const graph) -{ - if (! isPrepared) - { - isPrepared = true; - setParentGraph (graph); - - processor->setPlayConfigDetails (processor->getNumInputChannels(), - processor->getNumOutputChannels(), - sampleRate, blockSize); - - processor->prepareToPlay (sampleRate, blockSize); - } -} - -void AudioProcessorGraph::Node::unprepare() -{ - if (isPrepared) - { - isPrepared = false; - processor->releaseResources(); - } -} - -void AudioProcessorGraph::Node::setParentGraph (AudioProcessorGraph* const graph) const -{ - if (AudioProcessorGraph::AudioGraphIOProcessor* const ioProc - = dynamic_cast (processor.get())) - ioProc->setParentGraph (graph); -} - -//============================================================================== -AudioProcessorGraph::AudioProcessorGraph() - : lastNodeId (0), - currentAudioInputBuffer (nullptr), - currentMidiInputBuffer (nullptr) -{ -} - -AudioProcessorGraph::~AudioProcessorGraph() -{ - clearRenderingSequence(); - clear(); -} - -const String AudioProcessorGraph::getName() const -{ - return "Audio Graph"; -} - -//============================================================================== -void AudioProcessorGraph::clear() -{ - nodes.clear(); - connections.clear(); - triggerAsyncUpdate(); -} - -AudioProcessorGraph::Node* AudioProcessorGraph::getNodeForId (const uint32 nodeId) const -{ - for (int i = nodes.size(); --i >= 0;) - if (nodes.getUnchecked(i)->nodeId == nodeId) - return nodes.getUnchecked(i); - - return nullptr; -} - -AudioProcessorGraph::Node* AudioProcessorGraph::addNode (AudioProcessor* const newProcessor, uint32 nodeId) -{ - if (newProcessor == nullptr || newProcessor == this) - { - jassertfalse; - return nullptr; - } - - for (int i = nodes.size(); --i >= 0;) - { - if (nodes.getUnchecked(i)->getProcessor() == newProcessor) - { - jassertfalse; // Cannot add the same object to the graph twice! - return nullptr; - } - } - - if (nodeId == 0) - { - nodeId = ++lastNodeId; - } - else - { - // you can't add a node with an id that already exists in the graph.. - jassert (getNodeForId (nodeId) == nullptr); - removeNode (nodeId); - - if (nodeId > lastNodeId) - lastNodeId = nodeId; - } - - newProcessor->setPlayHead (getPlayHead()); - - Node* const n = new Node (nodeId, newProcessor); - nodes.add (n); - triggerAsyncUpdate(); - - n->setParentGraph (this); - return n; -} - -bool AudioProcessorGraph::removeNode (const uint32 nodeId) -{ - disconnectNode (nodeId); - - for (int i = nodes.size(); --i >= 0;) - { - if (nodes.getUnchecked(i)->nodeId == nodeId) - { - nodes.getUnchecked(i)->setParentGraph (nullptr); - nodes.remove (i); - triggerAsyncUpdate(); - - return true; - } - } - - return false; -} - -//============================================================================== -const AudioProcessorGraph::Connection* AudioProcessorGraph::getConnectionBetween (const uint32 sourceNodeId, - const int sourceChannelIndex, - const uint32 destNodeId, - const int destChannelIndex) const -{ - const Connection c (sourceNodeId, sourceChannelIndex, destNodeId, destChannelIndex); - GraphRenderingOps::ConnectionSorter sorter; - return connections [connections.indexOfSorted (sorter, &c)]; -} - -bool AudioProcessorGraph::isConnected (const uint32 possibleSourceNodeId, - const uint32 possibleDestNodeId) const -{ - for (int i = connections.size(); --i >= 0;) - { - const Connection* const c = connections.getUnchecked(i); - - if (c->sourceNodeId == possibleSourceNodeId - && c->destNodeId == possibleDestNodeId) - { - return true; - } - } - - return false; -} - -bool AudioProcessorGraph::canConnect (const uint32 sourceNodeId, - const int sourceChannelIndex, - const uint32 destNodeId, - const int destChannelIndex) const -{ - if (sourceChannelIndex < 0 - || destChannelIndex < 0 - || sourceNodeId == destNodeId - || (destChannelIndex == midiChannelIndex) != (sourceChannelIndex == midiChannelIndex)) - return false; - - const Node* const source = getNodeForId (sourceNodeId); - - if (source == nullptr - || (sourceChannelIndex != midiChannelIndex && sourceChannelIndex >= source->processor->getNumOutputChannels()) - || (sourceChannelIndex == midiChannelIndex && ! source->processor->producesMidi())) - return false; - - const Node* const dest = getNodeForId (destNodeId); - - if (dest == nullptr - || (destChannelIndex != midiChannelIndex && destChannelIndex >= dest->processor->getNumInputChannels()) - || (destChannelIndex == midiChannelIndex && ! dest->processor->acceptsMidi())) - return false; - - return getConnectionBetween (sourceNodeId, sourceChannelIndex, - destNodeId, destChannelIndex) == nullptr; -} - -bool AudioProcessorGraph::addConnection (const uint32 sourceNodeId, - const int sourceChannelIndex, - const uint32 destNodeId, - const int destChannelIndex) -{ - if (! canConnect (sourceNodeId, sourceChannelIndex, destNodeId, destChannelIndex)) - return false; - - GraphRenderingOps::ConnectionSorter sorter; - connections.addSorted (sorter, new Connection (sourceNodeId, sourceChannelIndex, - destNodeId, destChannelIndex)); - triggerAsyncUpdate(); - return true; -} - -void AudioProcessorGraph::removeConnection (const int index) -{ - connections.remove (index); - triggerAsyncUpdate(); -} - -bool AudioProcessorGraph::removeConnection (const uint32 sourceNodeId, const int sourceChannelIndex, - const uint32 destNodeId, const int destChannelIndex) -{ - bool doneAnything = false; - - for (int i = connections.size(); --i >= 0;) - { - const Connection* const c = connections.getUnchecked(i); - - if (c->sourceNodeId == sourceNodeId - && c->destNodeId == destNodeId - && c->sourceChannelIndex == sourceChannelIndex - && c->destChannelIndex == destChannelIndex) - { - removeConnection (i); - doneAnything = true; - } - } - - return doneAnything; -} - -bool AudioProcessorGraph::disconnectNode (const uint32 nodeId) -{ - bool doneAnything = false; - - for (int i = connections.size(); --i >= 0;) - { - const Connection* const c = connections.getUnchecked(i); - - if (c->sourceNodeId == nodeId || c->destNodeId == nodeId) - { - removeConnection (i); - doneAnything = true; - } - } - - return doneAnything; -} - -bool AudioProcessorGraph::isConnectionLegal (const Connection* const c) const -{ - jassert (c != nullptr); - - const Node* const source = getNodeForId (c->sourceNodeId); - const Node* const dest = getNodeForId (c->destNodeId); - - return source != nullptr - && dest != nullptr - && (c->sourceChannelIndex != midiChannelIndex ? isPositiveAndBelow (c->sourceChannelIndex, source->processor->getNumOutputChannels()) - : source->processor->producesMidi()) - && (c->destChannelIndex != midiChannelIndex ? isPositiveAndBelow (c->destChannelIndex, dest->processor->getNumInputChannels()) - : dest->processor->acceptsMidi()); -} - -bool AudioProcessorGraph::removeIllegalConnections() -{ - bool doneAnything = false; - - for (int i = connections.size(); --i >= 0;) - { - if (! isConnectionLegal (connections.getUnchecked(i))) - { - removeConnection (i); - doneAnything = true; - } - } - - return doneAnything; -} - -//============================================================================== -static void deleteRenderOpArray (Array& ops) -{ - for (int i = ops.size(); --i >= 0;) - delete static_cast (ops.getUnchecked(i)); -} - -void AudioProcessorGraph::clearRenderingSequence() -{ - Array oldOps; - - { - const ScopedLock sl (getCallbackLock()); - renderingOps.swapWith (oldOps); - } - - deleteRenderOpArray (oldOps); -} - -bool AudioProcessorGraph::isAnInputTo (const uint32 possibleInputId, - const uint32 possibleDestinationId, - const int recursionCheck) const -{ - if (recursionCheck > 0) - { - for (int i = connections.size(); --i >= 0;) - { - const AudioProcessorGraph::Connection* const c = connections.getUnchecked (i); - - if (c->destNodeId == possibleDestinationId - && (c->sourceNodeId == possibleInputId - || isAnInputTo (possibleInputId, c->sourceNodeId, recursionCheck - 1))) - return true; - } - } - - return false; -} - -void AudioProcessorGraph::buildRenderingSequence() -{ - Array newRenderingOps; - int numRenderingBuffersNeeded = 2; - int numMidiBuffersNeeded = 1; - - { - MessageManagerLock mml; - - Array orderedNodes; - - { - const GraphRenderingOps::ConnectionLookupTable table (connections); - - for (int i = 0; i < nodes.size(); ++i) - { - Node* const node = nodes.getUnchecked(i); - - node->prepare (getSampleRate(), getBlockSize(), this); - - int j = 0; - for (; j < orderedNodes.size(); ++j) - if (table.isAnInputTo (node->nodeId, ((Node*) orderedNodes.getUnchecked(j))->nodeId)) - break; - - orderedNodes.insert (j, node); - } - } - - GraphRenderingOps::RenderingOpSequenceCalculator calculator (*this, orderedNodes, newRenderingOps); - - numRenderingBuffersNeeded = calculator.getNumBuffersNeeded(); - numMidiBuffersNeeded = calculator.getNumMidiBuffersNeeded(); - } - - { - // swap over to the new rendering sequence.. - const ScopedLock sl (getCallbackLock()); - - renderingBuffers.setSize (numRenderingBuffersNeeded, getBlockSize()); - renderingBuffers.clear(); - - for (int i = midiBuffers.size(); --i >= 0;) - midiBuffers.getUnchecked(i)->clear(); - - while (midiBuffers.size() < numMidiBuffersNeeded) - midiBuffers.add (new MidiBuffer()); - - renderingOps.swapWith (newRenderingOps); - } - - // delete the old ones.. - deleteRenderOpArray (newRenderingOps); -} - -void AudioProcessorGraph::handleAsyncUpdate() -{ - buildRenderingSequence(); -} - -//============================================================================== -void AudioProcessorGraph::prepareToPlay (double /*sampleRate*/, int estimatedSamplesPerBlock) -{ - currentAudioInputBuffer = nullptr; - currentAudioOutputBuffer.setSize (jmax (1, getNumOutputChannels()), estimatedSamplesPerBlock); - currentMidiInputBuffer = nullptr; - currentMidiOutputBuffer.clear(); - - clearRenderingSequence(); - buildRenderingSequence(); -} - -void AudioProcessorGraph::releaseResources() -{ - for (int i = 0; i < nodes.size(); ++i) - nodes.getUnchecked(i)->unprepare(); - - renderingBuffers.setSize (1, 1); - midiBuffers.clear(); - - currentAudioInputBuffer = nullptr; - currentAudioOutputBuffer.setSize (1, 1); - currentMidiInputBuffer = nullptr; - currentMidiOutputBuffer.clear(); -} - -void AudioProcessorGraph::reset() -{ - const ScopedLock sl (getCallbackLock()); - - for (int i = 0; i < nodes.size(); ++i) - nodes.getUnchecked(i)->getProcessor()->reset(); -} - -void AudioProcessorGraph::setNonRealtime (bool isNonRealtime) noexcept -{ - const ScopedLock sl (getCallbackLock()); - - for (int i = 0; i < nodes.size(); ++i) - nodes.getUnchecked(i)->getProcessor()->setNonRealtime (isNonRealtime); -} - -void AudioProcessorGraph::setPlayHead (AudioPlayHead* audioPlayHead) -{ - const ScopedLock sl (getCallbackLock()); - - for (int i = 0; i < nodes.size(); ++i) - nodes.getUnchecked(i)->getProcessor()->setPlayHead (audioPlayHead); -} - -void AudioProcessorGraph::processBlock (AudioSampleBuffer& buffer, MidiBuffer& midiMessages) -{ - const int numSamples = buffer.getNumSamples(); - - currentAudioInputBuffer = &buffer; - currentAudioOutputBuffer.setSize (jmax (1, buffer.getNumChannels()), numSamples); - currentAudioOutputBuffer.clear(); - currentMidiInputBuffer = &midiMessages; - currentMidiOutputBuffer.clear(); - - for (int i = 0; i < renderingOps.size(); ++i) - { - GraphRenderingOps::AudioGraphRenderingOp* const op - = (GraphRenderingOps::AudioGraphRenderingOp*) renderingOps.getUnchecked(i); - - op->perform (renderingBuffers, midiBuffers, numSamples); - } - - for (int i = 0; i < buffer.getNumChannels(); ++i) - buffer.copyFrom (i, 0, currentAudioOutputBuffer, i, 0, numSamples); - - midiMessages.clear(); - midiMessages.addEvents (currentMidiOutputBuffer, 0, buffer.getNumSamples(), 0); -} - -const String AudioProcessorGraph::getInputChannelName (int channelIndex) const -{ - return "Input " + String (channelIndex + 1); -} - -const String AudioProcessorGraph::getOutputChannelName (int channelIndex) const -{ - return "Output " + String (channelIndex + 1); -} - -bool AudioProcessorGraph::isInputChannelStereoPair (int) const { return true; } -bool AudioProcessorGraph::isOutputChannelStereoPair (int) const { return true; } -bool AudioProcessorGraph::silenceInProducesSilenceOut() const { return false; } -double AudioProcessorGraph::getTailLengthSeconds() const { return 0; } -bool AudioProcessorGraph::acceptsMidi() const { return true; } -bool AudioProcessorGraph::producesMidi() const { return true; } -void AudioProcessorGraph::getStateInformation (juce::MemoryBlock&) {} -void AudioProcessorGraph::setStateInformation (const void*, int) {} - - -//============================================================================== -AudioProcessorGraph::AudioGraphIOProcessor::AudioGraphIOProcessor (const IODeviceType deviceType) - : type (deviceType), graph (nullptr) -{ -} - -AudioProcessorGraph::AudioGraphIOProcessor::~AudioGraphIOProcessor() -{ -} - -const String AudioProcessorGraph::AudioGraphIOProcessor::getName() const -{ - switch (type) - { - case audioOutputNode: return "Audio Output"; - case audioInputNode: return "Audio Input"; - case midiOutputNode: return "Midi Output"; - case midiInputNode: return "Midi Input"; - default: break; - } - - return String(); -} - -void AudioProcessorGraph::AudioGraphIOProcessor::fillInPluginDescription (PluginDescription& d) const -{ - d.name = getName(); - d.uid = d.name.hashCode(); - d.category = "I/O devices"; - d.pluginFormatName = "Internal"; - d.manufacturerName = "Raw Material Software"; - d.version = "1.0"; - d.isInstrument = false; - - d.numInputChannels = getNumInputChannels(); - if (type == audioOutputNode && graph != nullptr) - d.numInputChannels = graph->getNumInputChannels(); - - d.numOutputChannels = getNumOutputChannels(); - if (type == audioInputNode && graph != nullptr) - d.numOutputChannels = graph->getNumOutputChannels(); -} - -void AudioProcessorGraph::AudioGraphIOProcessor::prepareToPlay (double, int) -{ - jassert (graph != nullptr); -} - -void AudioProcessorGraph::AudioGraphIOProcessor::releaseResources() -{ -} - -void AudioProcessorGraph::AudioGraphIOProcessor::processBlock (AudioSampleBuffer& buffer, - MidiBuffer& midiMessages) -{ - jassert (graph != nullptr); - - switch (type) - { - case audioOutputNode: - { - for (int i = jmin (graph->currentAudioOutputBuffer.getNumChannels(), - buffer.getNumChannels()); --i >= 0;) - { - graph->currentAudioOutputBuffer.addFrom (i, 0, buffer, i, 0, buffer.getNumSamples()); - } - - break; - } - - case audioInputNode: - { - for (int i = jmin (graph->currentAudioInputBuffer->getNumChannels(), - buffer.getNumChannels()); --i >= 0;) - { - buffer.copyFrom (i, 0, *graph->currentAudioInputBuffer, i, 0, buffer.getNumSamples()); - } - - break; - } - - case midiOutputNode: - graph->currentMidiOutputBuffer.addEvents (midiMessages, 0, buffer.getNumSamples(), 0); - break; - - case midiInputNode: - midiMessages.addEvents (*graph->currentMidiInputBuffer, 0, buffer.getNumSamples(), 0); - break; - - default: - break; - } -} - -bool AudioProcessorGraph::AudioGraphIOProcessor::silenceInProducesSilenceOut() const -{ - return isOutput(); -} - -double AudioProcessorGraph::AudioGraphIOProcessor::getTailLengthSeconds() const -{ - return 0; -} - -bool AudioProcessorGraph::AudioGraphIOProcessor::acceptsMidi() const -{ - return type == midiOutputNode; -} - -bool AudioProcessorGraph::AudioGraphIOProcessor::producesMidi() const -{ - return type == midiInputNode; -} - -const String AudioProcessorGraph::AudioGraphIOProcessor::getInputChannelName (int channelIndex) const -{ - switch (type) - { - case audioOutputNode: return "Output " + String (channelIndex + 1); - case midiOutputNode: return "Midi Output"; - default: break; - } - - return String(); -} - -const String AudioProcessorGraph::AudioGraphIOProcessor::getOutputChannelName (int channelIndex) const -{ - switch (type) - { - case audioInputNode: return "Input " + String (channelIndex + 1); - case midiInputNode: return "Midi Input"; - default: break; - } - - return String(); -} - -bool AudioProcessorGraph::AudioGraphIOProcessor::isInputChannelStereoPair (int /*index*/) const -{ - return type == audioInputNode || type == audioOutputNode; -} - -bool AudioProcessorGraph::AudioGraphIOProcessor::isOutputChannelStereoPair (int index) const -{ - return isInputChannelStereoPair (index); -} - -bool AudioProcessorGraph::AudioGraphIOProcessor::isInput() const noexcept { return type == audioInputNode || type == midiInputNode; } -bool AudioProcessorGraph::AudioGraphIOProcessor::isOutput() const noexcept { return type == audioOutputNode || type == midiOutputNode; } - -bool AudioProcessorGraph::AudioGraphIOProcessor::hasEditor() const { return false; } -AudioProcessorEditor* AudioProcessorGraph::AudioGraphIOProcessor::createEditor() { return nullptr; } - -int AudioProcessorGraph::AudioGraphIOProcessor::getNumPrograms() { return 0; } -int AudioProcessorGraph::AudioGraphIOProcessor::getCurrentProgram() { return 0; } -void AudioProcessorGraph::AudioGraphIOProcessor::setCurrentProgram (int) { } - -const String AudioProcessorGraph::AudioGraphIOProcessor::getProgramName (int) { return String(); } -void AudioProcessorGraph::AudioGraphIOProcessor::changeProgramName (int, const String&) {} - -void AudioProcessorGraph::AudioGraphIOProcessor::getStateInformation (juce::MemoryBlock&) {} -void AudioProcessorGraph::AudioGraphIOProcessor::setStateInformation (const void*, int) {} - -void AudioProcessorGraph::AudioGraphIOProcessor::setParentGraph (AudioProcessorGraph* const newGraph) -{ - graph = newGraph; - - if (graph != nullptr) - { - setPlayConfigDetails (type == audioOutputNode ? graph->getNumOutputChannels() : 0, - type == audioInputNode ? graph->getNumInputChannels() : 0, - getSampleRate(), - getBlockSize()); - - updateHostDisplay(); - } -} diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h deleted file mode 100755 index 319218f..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.h +++ /dev/null @@ -1,398 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOPROCESSORGRAPH_H_INCLUDED -#define JUCE_AUDIOPROCESSORGRAPH_H_INCLUDED - - -//============================================================================== -/** - A type of AudioProcessor which plays back a graph of other AudioProcessors. - - Use one of these objects if you want to wire-up a set of AudioProcessors - and play back the result. - - Processors can be added to the graph as "nodes" using addNode(), and once - added, you can connect any of their input or output channels to other - nodes using addConnection(). - - To play back a graph through an audio device, you might want to use an - AudioProcessorPlayer object. -*/ -class JUCE_API AudioProcessorGraph : public AudioProcessor, - private AsyncUpdater -{ -public: - //============================================================================== - /** Creates an empty graph. */ - AudioProcessorGraph(); - - /** Destructor. - Any processor objects that have been added to the graph will also be deleted. - */ - ~AudioProcessorGraph(); - - //============================================================================== - /** Represents one of the nodes, or processors, in an AudioProcessorGraph. - - To create a node, call AudioProcessorGraph::addNode(). - */ - class JUCE_API Node : public ReferenceCountedObject - { - public: - //============================================================================== - /** The ID number assigned to this node. - This is assigned by the graph that owns it, and can't be changed. - */ - const uint32 nodeId; - - /** The actual processor object that this node represents. */ - AudioProcessor* getProcessor() const noexcept { return processor; } - - /** A set of user-definable properties that are associated with this node. - - This can be used to attach values to the node for whatever purpose seems - useful. For example, you might store an x and y position if your application - is displaying the nodes on-screen. - */ - NamedValueSet properties; - - //============================================================================== - /** A convenient typedef for referring to a pointer to a node object. */ - typedef ReferenceCountedObjectPtr Ptr; - - private: - //============================================================================== - friend class AudioProcessorGraph; - - const ScopedPointer processor; - bool isPrepared; - - Node (uint32 nodeId, AudioProcessor*) noexcept; - - void setParentGraph (AudioProcessorGraph*) const; - void prepare (double sampleRate, int blockSize, AudioProcessorGraph*); - void unprepare(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Node) - }; - - //============================================================================== - /** Represents a connection between two channels of two nodes in an AudioProcessorGraph. - - To create a connection, use AudioProcessorGraph::addConnection(). - */ - struct JUCE_API Connection - { - public: - //============================================================================== - Connection (uint32 sourceNodeId, int sourceChannelIndex, - uint32 destNodeId, int destChannelIndex) noexcept; - - //============================================================================== - /** The ID number of the node which is the input source for this connection. - @see AudioProcessorGraph::getNodeForId - */ - uint32 sourceNodeId; - - /** The index of the output channel of the source node from which this - connection takes its data. - - If this value is the special number AudioProcessorGraph::midiChannelIndex, then - it is referring to the source node's midi output. Otherwise, it is the zero-based - index of an audio output channel in the source node. - */ - int sourceChannelIndex; - - /** The ID number of the node which is the destination for this connection. - @see AudioProcessorGraph::getNodeForId - */ - uint32 destNodeId; - - /** The index of the input channel of the destination node to which this - connection delivers its data. - - If this value is the special number AudioProcessorGraph::midiChannelIndex, then - it is referring to the destination node's midi input. Otherwise, it is the zero-based - index of an audio input channel in the destination node. - */ - int destChannelIndex; - - private: - //============================================================================== - JUCE_LEAK_DETECTOR (Connection) - }; - - //============================================================================== - /** Deletes all nodes and connections from this graph. - Any processor objects in the graph will be deleted. - */ - void clear(); - - /** Returns the number of nodes in the graph. */ - int getNumNodes() const noexcept { return nodes.size(); } - - /** Returns a pointer to one of the nodes in the graph. - This will return nullptr if the index is out of range. - @see getNodeForId - */ - Node* getNode (const int index) const noexcept { return nodes [index]; } - - /** Searches the graph for a node with the given ID number and returns it. - If no such node was found, this returns nullptr. - @see getNode - */ - Node* getNodeForId (const uint32 nodeId) const; - - /** Adds a node to the graph. - - This creates a new node in the graph, for the specified processor. Once you have - added a processor to the graph, the graph owns it and will delete it later when - it is no longer needed. - - The optional nodeId parameter lets you specify an ID to use for the node, but - if the value is already in use, this new node will overwrite the old one. - - If this succeeds, it returns a pointer to the newly-created node. - */ - Node* addNode (AudioProcessor* newProcessor, uint32 nodeId = 0); - - /** Deletes a node within the graph which has the specified ID. - - This will also delete any connections that are attached to this node. - */ - bool removeNode (uint32 nodeId); - - //============================================================================== - /** Returns the number of connections in the graph. */ - int getNumConnections() const { return connections.size(); } - - /** Returns a pointer to one of the connections in the graph. */ - const Connection* getConnection (int index) const { return connections [index]; } - - /** Searches for a connection between some specified channels. - If no such connection is found, this returns nullptr. - */ - const Connection* getConnectionBetween (uint32 sourceNodeId, - int sourceChannelIndex, - uint32 destNodeId, - int destChannelIndex) const; - - /** Returns true if there is a connection between any of the channels of - two specified nodes. - */ - bool isConnected (uint32 possibleSourceNodeId, - uint32 possibleDestNodeId) const; - - /** Returns true if it would be legal to connect the specified points. */ - bool canConnect (uint32 sourceNodeId, int sourceChannelIndex, - uint32 destNodeId, int destChannelIndex) const; - - /** Attempts to connect two specified channels of two nodes. - - If this isn't allowed (e.g. because you're trying to connect a midi channel - to an audio one or other such nonsense), then it'll return false. - */ - bool addConnection (uint32 sourceNodeId, int sourceChannelIndex, - uint32 destNodeId, int destChannelIndex); - - /** Deletes the connection with the specified index. */ - void removeConnection (int index); - - /** Deletes any connection between two specified points. - Returns true if a connection was actually deleted. - */ - bool removeConnection (uint32 sourceNodeId, int sourceChannelIndex, - uint32 destNodeId, int destChannelIndex); - - /** Removes all connections from the specified node. */ - bool disconnectNode (uint32 nodeId); - - /** Returns true if the given connection's channel numbers map on to valid - channels at each end. - Even if a connection is valid when created, its status could change if - a node changes its channel config. - */ - bool isConnectionLegal (const Connection* connection) const; - - /** Performs a sanity checks of all the connections. - - This might be useful if some of the processors are doing things like changing - their channel counts, which could render some connections obsolete. - */ - bool removeIllegalConnections(); - - //============================================================================== - /** A special number that represents the midi channel of a node. - - This is used as a channel index value if you want to refer to the midi input - or output instead of an audio channel. - */ - static const int midiChannelIndex; - - - //============================================================================== - /** A special type of AudioProcessor that can live inside an AudioProcessorGraph - in order to use the audio that comes into and out of the graph itself. - - If you create an AudioGraphIOProcessor in "input" mode, it will act as a - node in the graph which delivers the audio that is coming into the parent - graph. This allows you to stream the data to other nodes and process the - incoming audio. - - Likewise, one of these in "output" mode can be sent data which it will add to - the sum of data being sent to the graph's output. - - @see AudioProcessorGraph - */ - class JUCE_API AudioGraphIOProcessor : public AudioPluginInstance - { - public: - /** Specifies the mode in which this processor will operate. - */ - enum IODeviceType - { - audioInputNode, /**< In this mode, the processor has output channels - representing all the audio input channels that are - coming into its parent audio graph. */ - audioOutputNode, /**< In this mode, the processor has input channels - representing all the audio output channels that are - going out of its parent audio graph. */ - midiInputNode, /**< In this mode, the processor has a midi output which - delivers the same midi data that is arriving at its - parent graph. */ - midiOutputNode /**< In this mode, the processor has a midi input and - any data sent to it will be passed out of the parent - graph. */ - }; - - //============================================================================== - /** Returns the mode of this processor. */ - IODeviceType getType() const noexcept { return type; } - - /** Returns the parent graph to which this processor belongs, or nullptr if it - hasn't yet been added to one. */ - AudioProcessorGraph* getParentGraph() const noexcept { return graph; } - - /** True if this is an audio or midi input. */ - bool isInput() const noexcept; - /** True if this is an audio or midi output. */ - bool isOutput() const noexcept; - - //============================================================================== - AudioGraphIOProcessor (const IODeviceType type); - ~AudioGraphIOProcessor(); - - const String getName() const override; - void fillInPluginDescription (PluginDescription&) const override; - void prepareToPlay (double sampleRate, int estimatedSamplesPerBlock) override; - void releaseResources() override; - void processBlock (AudioSampleBuffer&, MidiBuffer&); - - const String getInputChannelName (int channelIndex) const override; - const String getOutputChannelName (int channelIndex) const override; - bool isInputChannelStereoPair (int index) const override; - bool isOutputChannelStereoPair (int index) const override; - bool silenceInProducesSilenceOut() const override; - double getTailLengthSeconds() const override; - bool acceptsMidi() const override; - bool producesMidi() const override; - - bool hasEditor() const override; - AudioProcessorEditor* createEditor() override; - - int getNumPrograms() override; - int getCurrentProgram() override; - void setCurrentProgram (int) override; - const String getProgramName (int) override; - void changeProgramName (int, const String&) override; - - void getStateInformation (juce::MemoryBlock& destData) override; - void setStateInformation (const void* data, int sizeInBytes) override; - - /** @internal */ - void setParentGraph (AudioProcessorGraph*); - - private: - const IODeviceType type; - AudioProcessorGraph* graph; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioGraphIOProcessor) - }; - - //============================================================================== - const String getName() const override; - void prepareToPlay (double, int) override; - void releaseResources() override; - void processBlock (AudioSampleBuffer&, MidiBuffer&) override; - - void reset() override; - void setNonRealtime (bool) noexcept override; - void setPlayHead (AudioPlayHead*) override; - - const String getInputChannelName (int) const override; - const String getOutputChannelName (int) const override; - bool isInputChannelStereoPair (int) const override; - bool isOutputChannelStereoPair (int) const override; - - bool silenceInProducesSilenceOut() const override; - double getTailLengthSeconds() const override; - bool acceptsMidi() const override; - bool producesMidi() const override; - - bool hasEditor() const override { return false; } - AudioProcessorEditor* createEditor() override { return nullptr; } - int getNumPrograms() override { return 0; } - int getCurrentProgram() override { return 0; } - void setCurrentProgram (int) override { } - const String getProgramName (int) override { return String(); } - void changeProgramName (int, const String&) override { } - void getStateInformation (juce::MemoryBlock&) override; - void setStateInformation (const void* data, int sizeInBytes) override; - -private: - //============================================================================== - ReferenceCountedArray nodes; - OwnedArray connections; - uint32 lastNodeId; - AudioSampleBuffer renderingBuffers; - OwnedArray midiBuffers; - Array renderingOps; - - friend class AudioGraphIOProcessor; - AudioSampleBuffer* currentAudioInputBuffer; - AudioSampleBuffer currentAudioOutputBuffer; - MidiBuffer* currentMidiInputBuffer; - MidiBuffer currentMidiOutputBuffer; - - void handleAsyncUpdate() override; - void clearRenderingSequence(); - void buildRenderingSequence(); - bool isAnInputTo (uint32 possibleInputId, uint32 possibleDestinationId, int recursionCheck) const; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorGraph) -}; - - -#endif // JUCE_AUDIOPROCESSORGRAPH_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h deleted file mode 100755 index d8ea93c..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorListener.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOPROCESSORLISTENER_H_INCLUDED -#define JUCE_AUDIOPROCESSORLISTENER_H_INCLUDED - - -//============================================================================== -/** - Base class for listeners that want to know about changes to an AudioProcessor. - - Use AudioProcessor::addListener() to register your listener with an AudioProcessor. - - @see AudioProcessor -*/ -class JUCE_API AudioProcessorListener -{ -public: - //============================================================================== - /** Destructor. */ - virtual ~AudioProcessorListener() {} - - //============================================================================== - /** Receives a callback when a parameter is changed. - - IMPORTANT NOTE: this will be called synchronously when a parameter changes, and - many audio processors will change their parameter during their audio callback. - This means that not only has your handler code got to be completely thread-safe, - but it's also got to be VERY fast, and avoid blocking. If you need to handle - this event on your message thread, use this callback to trigger an AsyncUpdater - or ChangeBroadcaster which you can respond to on the message thread. - */ - virtual void audioProcessorParameterChanged (AudioProcessor* processor, - int parameterIndex, - float newValue) = 0; - - /** Called to indicate that something else in the plugin has changed, like its - program, number of parameters, etc. - - IMPORTANT NOTE: this will be called synchronously, and many audio processors will - call it during their audio callback. This means that not only has your handler code - got to be completely thread-safe, but it's also got to be VERY fast, and avoid - blocking. If you need to handle this event on your message thread, use this callback - to trigger an AsyncUpdater or ChangeBroadcaster which you can respond to later on the - message thread. - */ - virtual void audioProcessorChanged (AudioProcessor* processor) = 0; - - /** Indicates that a parameter change gesture has started. - - E.g. if the user is dragging a slider, this would be called when they first - press the mouse button, and audioProcessorParameterChangeGestureEnd would be - called when they release it. - - IMPORTANT NOTE: this will be called synchronously, and many audio processors will - call it during their audio callback. This means that not only has your handler code - got to be completely thread-safe, but it's also got to be VERY fast, and avoid - blocking. If you need to handle this event on your message thread, use this callback - to trigger an AsyncUpdater or ChangeBroadcaster which you can respond to later on the - message thread. - - @see audioProcessorParameterChangeGestureEnd - */ - virtual void audioProcessorParameterChangeGestureBegin (AudioProcessor* processor, - int parameterIndex); - - /** Indicates that a parameter change gesture has finished. - - E.g. if the user is dragging a slider, this would be called when they release - the mouse button. - - IMPORTANT NOTE: this will be called synchronously, and many audio processors will - call it during their audio callback. This means that not only has your handler code - got to be completely thread-safe, but it's also got to be VERY fast, and avoid - blocking. If you need to handle this event on your message thread, use this callback - to trigger an AsyncUpdater or ChangeBroadcaster which you can respond to later on the - message thread. - - @see audioProcessorParameterChangeGestureBegin - */ - virtual void audioProcessorParameterChangeGestureEnd (AudioProcessor* processor, - int parameterIndex); -}; - -#endif // JUCE_AUDIOPROCESSORLISTENER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h deleted file mode 100755 index 8b4d2cf..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_AudioProcessorParameter.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AUDIOPROCESSORPARAMETER_H_INCLUDED -#define JUCE_AUDIOPROCESSORPARAMETER_H_INCLUDED - - -//============================================================================== -/** An abstract base class for parameter objects that can be added to an - AudioProcessor. - - @see AudioProcessor::addParameter -*/ -class JUCE_API AudioProcessorParameter -{ -public: - AudioProcessorParameter() noexcept; - - /** Destructor. */ - virtual ~AudioProcessorParameter(); - - /** Called by the host to find out the value of this parameter. - - Hosts will expect the value returned to be between 0 and 1.0. - - This could be called quite frequently, so try to make your code efficient. - It's also likely to be called by non-UI threads, so the code in here should - be thread-aware. - */ - virtual float getValue() const = 0; - - /** The host will call this method to change the value of one of the filter's parameters. - - The host may call this at any time, including during the audio processing - callback, so the filter has to process this very fast and avoid blocking. - - If you want to set the value of a parameter internally, e.g. from your - editor component, then don't call this directly - instead, use the - setValueNotifyingHost() method, which will also send a message to - the host telling it about the change. If the message isn't sent, the host - won't be able to automate your parameters properly. - - The value passed will be between 0 and 1.0. - */ - virtual void setValue (float newValue) = 0; - - /** Your filter can call this when it needs to change one of its parameters. - - This could happen when the editor or some other internal operation changes - a parameter. This method will call the setParameter() method to change the - value, and will then send a message to the host telling it about the change. - - Note that to make sure the host correctly handles automation, you should call - the beginChangeGesture() and endChangeGesture() methods to tell the host when - the user has started and stopped changing the parameter. - */ - void setValueNotifyingHost (float newValue); - - /** Sends a signal to the host to tell it that the user is about to start changing this - parameter. - This allows the host to know when a parameter is actively being held by the user, and - it may use this information to help it record automation. - If you call this, it must be matched by a later call to endChangeGesture(). - */ - void beginChangeGesture(); - - /** Tells the host that the user has finished changing this parameter. - This allows the host to know when a parameter is actively being held by the user, - and it may use this information to help it record automation. - A call to this method must follow a call to beginChangeGesture(). - */ - void endChangeGesture(); - - /** This should return the default value for this parameter. */ - virtual float getDefaultValue() const = 0; - - /** Returns the name to display for this parameter, which should be made - to fit within the given string length. - */ - virtual String getName (int maximumStringLength) const = 0; - - /** Some parameters may be able to return a label string for - their units. For example "Hz" or "%". - */ - virtual String getLabel() const = 0; - - /** Returns the number of discrete interval steps that this parameter's range - should be quantised into. - - If you want a continuous range of values, don't override this method, and allow - the default implementation to return AudioProcessor::getDefaultNumParameterSteps(). - If your parameter is boolean, then you may want to make this return 2. - The value that is returned may or may not be used, depending on the host. - */ - virtual int getNumSteps() const; - - /** Returns a textual version of the supplied parameter value. - The default implementation just returns the floating point value - as a string, but this could do anything you need for a custom type - of value. - */ - virtual String getText (float value, int /*maximumStringLength*/) const; - - /** Should parse a string and return the appropriate value for it. */ - virtual float getValueForText (const String& text) const = 0; - - /** This can be overridden to tell the host that this parameter operates in the - reverse direction. - (Not all plugin formats or hosts will actually use this information). - */ - virtual bool isOrientationInverted() const; - - /** Returns true if the host can automate this parameter. - By default, this returns true. - */ - virtual bool isAutomatable() const; - - /** Should return true if this parameter is a "meta" parameter. - A meta-parameter is a parameter that changes other params. It is used - by some hosts (e.g. AudioUnit hosts). - By default this returns false. - */ - virtual bool isMetaParameter() const; - - /** Returns the index of this parameter in its parent processor's parameter list. */ - int getParameterIndex() const noexcept { return parameterIndex; } - -private: - friend class AudioProcessor; - AudioProcessor* processor; - int parameterIndex; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioProcessorParameter) -}; - - -#endif // JUCE_AUDIOPROCESSORPARAMETER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp deleted file mode 100755 index 196e9ac..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class ProcessorParameterPropertyComp : public PropertyComponent, - private AudioProcessorListener, - private Timer -{ -public: - ProcessorParameterPropertyComp (const String& name, AudioProcessor& p, int paramIndex) - : PropertyComponent (name), - owner (p), - index (paramIndex), - paramHasChanged (false), - slider (p, paramIndex) - { - startTimer (100); - addAndMakeVisible (slider); - owner.addListener (this); - } - - ~ProcessorParameterPropertyComp() - { - owner.removeListener (this); - } - - void refresh() override - { - paramHasChanged = false; - - if (slider.getThumbBeingDragged() < 0) - slider.setValue (owner.getParameter (index), dontSendNotification); - - slider.updateText(); - } - - void audioProcessorChanged (AudioProcessor*) override {} - - void audioProcessorParameterChanged (AudioProcessor*, int parameterIndex, float) override - { - if (parameterIndex == index) - paramHasChanged = true; - } - - void timerCallback() override - { - if (paramHasChanged) - { - refresh(); - startTimerHz (50); - } - else - { - startTimer (jmin (1000 / 4, getTimerInterval() + 10)); - } - } - -private: - //============================================================================== - class ParamSlider : public Slider - { - public: - ParamSlider (AudioProcessor& p, int paramIndex) : owner (p), index (paramIndex) - { - const int steps = owner.getParameterNumSteps (index); - - if (steps > 1 && steps < 0x7fffffff) - setRange (0.0, 1.0, 1.0 / (steps - 1.0)); - else - setRange (0.0, 1.0); - - setSliderStyle (Slider::LinearBar); - setTextBoxIsEditable (false); - setScrollWheelEnabled (true); - } - - void valueChanged() override - { - const float newVal = (float) getValue(); - - if (owner.getParameter (index) != newVal) - { - owner.setParameterNotifyingHost (index, newVal); - updateText(); - } - } - - String getTextFromValue (double /*value*/) override - { - return owner.getParameterText (index) + " " + owner.getParameterLabel (index).trimEnd(); - } - - private: - //============================================================================== - AudioProcessor& owner; - const int index; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParamSlider) - }; - - AudioProcessor& owner; - const int index; - bool volatile paramHasChanged; - ParamSlider slider; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProcessorParameterPropertyComp) -}; - - -//============================================================================== -GenericAudioProcessorEditor::GenericAudioProcessorEditor (AudioProcessor* const p) - : AudioProcessorEditor (p) -{ - jassert (p != nullptr); - setOpaque (true); - - addAndMakeVisible (panel); - - Array params; - - const int numParams = p->getNumParameters(); - int totalHeight = 0; - - for (int i = 0; i < numParams; ++i) - { - String name (p->getParameterName (i)); - if (name.trim().isEmpty()) - name = "Unnamed"; - - ProcessorParameterPropertyComp* const pc = new ProcessorParameterPropertyComp (name, *p, i); - params.add (pc); - totalHeight += pc->getPreferredHeight(); - } - - panel.addProperties (params); - - setSize (400, jlimit (25, 400, totalHeight)); -} - -GenericAudioProcessorEditor::~GenericAudioProcessorEditor() -{ -} - -void GenericAudioProcessorEditor::paint (Graphics& g) -{ - g.fillAll (Colours::white); -} - -void GenericAudioProcessorEditor::resized() -{ - panel.setBounds (getLocalBounds()); -} diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h deleted file mode 100755 index 1189f88..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_GenericAudioProcessorEditor.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_GENERICAUDIOPROCESSOREDITOR_H_INCLUDED -#define JUCE_GENERICAUDIOPROCESSOREDITOR_H_INCLUDED - - -//============================================================================== -/** - A type of UI component that displays the parameters of an AudioProcessor as - a simple list of sliders. - - This can be used for showing an editor for a processor that doesn't supply - its own custom editor. - - @see AudioProcessor -*/ -class JUCE_API GenericAudioProcessorEditor : public AudioProcessorEditor -{ -public: - //============================================================================== - GenericAudioProcessorEditor (AudioProcessor* owner); - ~GenericAudioProcessorEditor(); - - //============================================================================== - void paint (Graphics&) override; - void resized() override; - -private: - //============================================================================== - PropertyPanel panel; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GenericAudioProcessorEditor) -}; - - -#endif // JUCE_GENERICAUDIOPROCESSOREDITOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp deleted file mode 100755 index 5eafc07..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.cpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -PluginDescription::PluginDescription() - : uid (0), - isInstrument (false), - numInputChannels (0), - numOutputChannels (0), - hasSharedContainer (false) -{ -} - -PluginDescription::~PluginDescription() -{ -} - -PluginDescription::PluginDescription (const PluginDescription& other) - : name (other.name), - descriptiveName (other.descriptiveName), - pluginFormatName (other.pluginFormatName), - category (other.category), - manufacturerName (other.manufacturerName), - version (other.version), - fileOrIdentifier (other.fileOrIdentifier), - lastFileModTime (other.lastFileModTime), - uid (other.uid), - isInstrument (other.isInstrument), - numInputChannels (other.numInputChannels), - numOutputChannels (other.numOutputChannels), - hasSharedContainer (other.hasSharedContainer) -{ -} - -PluginDescription& PluginDescription::operator= (const PluginDescription& other) -{ - name = other.name; - descriptiveName = other.descriptiveName; - pluginFormatName = other.pluginFormatName; - category = other.category; - manufacturerName = other.manufacturerName; - version = other.version; - fileOrIdentifier = other.fileOrIdentifier; - uid = other.uid; - isInstrument = other.isInstrument; - lastFileModTime = other.lastFileModTime; - numInputChannels = other.numInputChannels; - numOutputChannels = other.numOutputChannels; - hasSharedContainer = other.hasSharedContainer; - - return *this; -} - -bool PluginDescription::isDuplicateOf (const PluginDescription& other) const noexcept -{ - return fileOrIdentifier == other.fileOrIdentifier - && uid == other.uid; -} - -static String getPluginDescSuffix (const PluginDescription& d) -{ - return "-" + String::toHexString (d.fileOrIdentifier.hashCode()) - + "-" + String::toHexString (d.uid); -} - -bool PluginDescription::matchesIdentifierString (const String& identifierString) const -{ - return identifierString.endsWithIgnoreCase (getPluginDescSuffix (*this)); -} - -String PluginDescription::createIdentifierString() const -{ - return pluginFormatName + "-" + name + getPluginDescSuffix (*this); -} - -XmlElement* PluginDescription::createXml() const -{ - XmlElement* const e = new XmlElement ("PLUGIN"); - e->setAttribute ("name", name); - if (descriptiveName != name) - e->setAttribute ("descriptiveName", descriptiveName); - - e->setAttribute ("format", pluginFormatName); - e->setAttribute ("category", category); - e->setAttribute ("manufacturer", manufacturerName); - e->setAttribute ("version", version); - e->setAttribute ("file", fileOrIdentifier); - e->setAttribute ("uid", String::toHexString (uid)); - e->setAttribute ("isInstrument", isInstrument); - e->setAttribute ("fileTime", String::toHexString (lastFileModTime.toMilliseconds())); - e->setAttribute ("numInputs", numInputChannels); - e->setAttribute ("numOutputs", numOutputChannels); - e->setAttribute ("isShell", hasSharedContainer); - - return e; -} - -bool PluginDescription::loadFromXml (const XmlElement& xml) -{ - if (xml.hasTagName ("PLUGIN")) - { - name = xml.getStringAttribute ("name"); - descriptiveName = xml.getStringAttribute ("descriptiveName", name); - pluginFormatName = xml.getStringAttribute ("format"); - category = xml.getStringAttribute ("category"); - manufacturerName = xml.getStringAttribute ("manufacturer"); - version = xml.getStringAttribute ("version"); - fileOrIdentifier = xml.getStringAttribute ("file"); - uid = xml.getStringAttribute ("uid").getHexValue32(); - isInstrument = xml.getBoolAttribute ("isInstrument", false); - lastFileModTime = Time (xml.getStringAttribute ("fileTime").getHexValue64()); - numInputChannels = xml.getIntAttribute ("numInputs"); - numOutputChannels = xml.getIntAttribute ("numOutputs"); - hasSharedContainer = xml.getBoolAttribute ("isShell", false); - - return true; - } - - return false; -} diff --git a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h b/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h deleted file mode 100755 index 24b17e5..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/processors/juce_PluginDescription.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_PLUGINDESCRIPTION_H_INCLUDED -#define JUCE_PLUGINDESCRIPTION_H_INCLUDED - - -//============================================================================== -/** - A small class to represent some facts about a particular type of plug-in. - - This class is for storing and managing the details about a plug-in without - actually having to load an instance of it. - - A KnownPluginList contains a list of PluginDescription objects. - - @see KnownPluginList -*/ -class JUCE_API PluginDescription -{ -public: - //============================================================================== - PluginDescription(); - PluginDescription (const PluginDescription& other); - PluginDescription& operator= (const PluginDescription& other); - ~PluginDescription(); - - //============================================================================== - /** The name of the plug-in. */ - String name; - - /** A more descriptive name for the plug-in. - This may be the same as the 'name' field, but some plug-ins may provide an - alternative name. - */ - String descriptiveName; - - /** The plug-in format, e.g. "VST", "AudioUnit", etc. */ - String pluginFormatName; - - /** A category, such as "Dynamics", "Reverbs", etc. */ - String category; - - /** The manufacturer. */ - String manufacturerName; - - /** The version. This string doesn't have any particular format. */ - String version; - - /** Either the file containing the plug-in module, or some other unique way - of identifying it. - - E.g. for an AU, this would be an ID string that the component manager - could use to retrieve the plug-in. For a VST, it's the file path. - */ - String fileOrIdentifier; - - /** The last time the plug-in file was changed. - This is handy when scanning for new or changed plug-ins. - */ - Time lastFileModTime; - - /** A unique ID for the plug-in. - - Note that this might not be unique between formats, e.g. a VST and some - other format might actually have the same id. - - @see createIdentifierString - */ - int uid; - - /** True if the plug-in identifies itself as a synthesiser. */ - bool isInstrument; - - /** The number of inputs. */ - int numInputChannels; - - /** The number of outputs. */ - int numOutputChannels; - - /** True if the plug-in is part of a multi-type container, e.g. a VST Shell. */ - bool hasSharedContainer; - - /** Returns true if the two descriptions refer to the same plug-in. - - This isn't quite as simple as them just having the same file (because of - shell plug-ins). - */ - bool isDuplicateOf (const PluginDescription& other) const noexcept; - - /** Return true if this description is equivalent to another one which created the - given identifier string. - - Note that this isn't quite as simple as them just calling createIdentifierString() - and comparing the strings, because the identifers can differ (thanks to shell plug-ins). - */ - bool matchesIdentifierString (const String& identifierString) const; - - //============================================================================== - /** Returns a string that can be saved and used to uniquely identify the - plugin again. - - This contains less info than the XML encoding, and is independent of the - plug-in's file location, so can be used to store a plug-in ID for use - across different machines. - */ - String createIdentifierString() const; - - //============================================================================== - /** Creates an XML object containing these details. - - @see loadFromXml - */ - XmlElement* createXml() const; - - /** Reloads the info in this structure from an XML record that was previously - saved with createXML(). - - Returns true if the XML was a valid plug-in description. - */ - bool loadFromXml (const XmlElement& xml); - - -private: - //============================================================================== - JUCE_LEAK_DETECTOR (PluginDescription) -}; - - -#endif // JUCE_PLUGINDESCRIPTION_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp deleted file mode 100755 index 081ba11..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.cpp +++ /dev/null @@ -1,549 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -KnownPluginList::KnownPluginList() {} -KnownPluginList::~KnownPluginList() {} - -void KnownPluginList::clear() -{ - if (types.size() > 0) - { - types.clear(); - sendChangeMessage(); - } -} - -PluginDescription* KnownPluginList::getTypeForFile (const String& fileOrIdentifier) const -{ - for (int i = 0; i < types.size(); ++i) - if (types.getUnchecked(i)->fileOrIdentifier == fileOrIdentifier) - return types.getUnchecked(i); - - return nullptr; -} - -PluginDescription* KnownPluginList::getTypeForIdentifierString (const String& identifierString) const -{ - for (int i = 0; i < types.size(); ++i) - if (types.getUnchecked(i)->matchesIdentifierString (identifierString)) - return types.getUnchecked(i); - - return nullptr; -} - -bool KnownPluginList::addType (const PluginDescription& type) -{ - for (int i = types.size(); --i >= 0;) - { - if (types.getUnchecked(i)->isDuplicateOf (type)) - { - // strange - found a duplicate plugin with different info.. - jassert (types.getUnchecked(i)->name == type.name); - jassert (types.getUnchecked(i)->isInstrument == type.isInstrument); - - *types.getUnchecked(i) = type; - return false; - } - } - - types.insert (0, new PluginDescription (type)); - sendChangeMessage(); - return true; -} - -void KnownPluginList::removeType (const int index) -{ - types.remove (index); - sendChangeMessage(); -} - -bool KnownPluginList::isListingUpToDate (const String& fileOrIdentifier, - AudioPluginFormat& formatToUse) const -{ - if (getTypeForFile (fileOrIdentifier) == nullptr) - return false; - - for (int i = types.size(); --i >= 0;) - { - const PluginDescription* const d = types.getUnchecked(i); - - if (d->fileOrIdentifier == fileOrIdentifier - && formatToUse.pluginNeedsRescanning (*d)) - return false; - } - - return true; -} - -void KnownPluginList::setCustomScanner (CustomScanner* newScanner) -{ - scanner = newScanner; -} - -bool KnownPluginList::scanAndAddFile (const String& fileOrIdentifier, - const bool dontRescanIfAlreadyInList, - OwnedArray & typesFound, - AudioPluginFormat& format) -{ - const ScopedLock sl (scanLock); - - if (dontRescanIfAlreadyInList - && getTypeForFile (fileOrIdentifier) != nullptr) - { - bool needsRescanning = false; - - for (int i = types.size(); --i >= 0;) - { - const PluginDescription* const d = types.getUnchecked(i); - - if (d->fileOrIdentifier == fileOrIdentifier && d->pluginFormatName == format.getName()) - { - if (format.pluginNeedsRescanning (*d)) - needsRescanning = true; - else - typesFound.add (new PluginDescription (*d)); - } - } - - if (! needsRescanning) - return false; - } - - if (blacklist.contains (fileOrIdentifier)) - return false; - - OwnedArray found; - - { - const ScopedUnlock sl2 (scanLock); - - if (scanner != nullptr) - { - if (! scanner->findPluginTypesFor (format, found, fileOrIdentifier)) - addToBlacklist (fileOrIdentifier); - } - else - { - format.findAllTypesForFile (found, fileOrIdentifier); - } - } - - for (int i = 0; i < found.size(); ++i) - { - PluginDescription* const desc = found.getUnchecked(i); - jassert (desc != nullptr); - - addType (*desc); - typesFound.add (new PluginDescription (*desc)); - } - - return found.size() > 0; -} - -void KnownPluginList::scanAndAddDragAndDroppedFiles (AudioPluginFormatManager& formatManager, - const StringArray& files, - OwnedArray & typesFound) -{ - for (int i = 0; i < files.size(); ++i) - { - const String filenameOrID (files[i]); - bool found = false; - - for (int j = 0; j < formatManager.getNumFormats(); ++j) - { - AudioPluginFormat* const format = formatManager.getFormat (j); - - if (format->fileMightContainThisPluginType (filenameOrID) - && scanAndAddFile (filenameOrID, true, typesFound, *format)) - { - found = true; - break; - } - } - - if (! found) - { - const File f (filenameOrID); - - if (f.isDirectory()) - { - StringArray s; - - { - Array subFiles; - f.findChildFiles (subFiles, File::findFilesAndDirectories, false); - - for (int j = 0; j < subFiles.size(); ++j) - s.add (subFiles.getReference(j).getFullPathName()); - } - - scanAndAddDragAndDroppedFiles (formatManager, s, typesFound); - } - } - } - - scanFinished(); -} - -void KnownPluginList::scanFinished() -{ - if (scanner != nullptr) - scanner->scanFinished(); -} - -const StringArray& KnownPluginList::getBlacklistedFiles() const -{ - return blacklist; -} - -void KnownPluginList::addToBlacklist (const String& pluginID) -{ - if (! blacklist.contains (pluginID)) - { - blacklist.add (pluginID); - sendChangeMessage(); - } -} - -void KnownPluginList::removeFromBlacklist (const String& pluginID) -{ - const int index = blacklist.indexOf (pluginID); - - if (index >= 0) - { - blacklist.remove (index); - sendChangeMessage(); - } -} - -void KnownPluginList::clearBlacklistedFiles() -{ - if (blacklist.size() > 0) - { - blacklist.clear(); - sendChangeMessage(); - } -} - -//============================================================================== -struct PluginSorter -{ - PluginSorter (KnownPluginList::SortMethod sortMethod, bool forwards) noexcept - : method (sortMethod), direction (forwards ? 1 : -1) {} - - int compareElements (const PluginDescription* const first, - const PluginDescription* const second) const - { - int diff = 0; - - switch (method) - { - case KnownPluginList::sortByCategory: diff = first->category.compareNatural (second->category); break; - case KnownPluginList::sortByManufacturer: diff = first->manufacturerName.compareNatural (second->manufacturerName); break; - case KnownPluginList::sortByFormat: diff = first->pluginFormatName.compare (second->pluginFormatName); break; - case KnownPluginList::sortByFileSystemLocation: diff = lastPathPart (first->fileOrIdentifier).compare (lastPathPart (second->fileOrIdentifier)); break; - default: break; - } - - if (diff == 0) - diff = first->name.compareNatural (second->name); - - return diff * direction; - } - -private: - static String lastPathPart (const String& path) - { - return path.replaceCharacter ('\\', '/').upToLastOccurrenceOf ("/", false, false); - } - - const KnownPluginList::SortMethod method; - const int direction; - - JUCE_DECLARE_NON_COPYABLE (PluginSorter) -}; - -void KnownPluginList::sort (const SortMethod method, bool forwards) -{ - if (method != defaultOrder) - { - Array oldOrder, newOrder; - oldOrder.addArray (types); - - PluginSorter sorter (method, forwards); - types.sort (sorter, true); - - newOrder.addArray (types); - - if (oldOrder != newOrder) - sendChangeMessage(); - } -} - -//============================================================================== -XmlElement* KnownPluginList::createXml() const -{ - XmlElement* const e = new XmlElement ("KNOWNPLUGINS"); - - for (int i = types.size(); --i >= 0;) - e->prependChildElement (types.getUnchecked(i)->createXml()); - - for (int i = 0; i < blacklist.size(); ++i) - e->createNewChildElement ("BLACKLISTED")->setAttribute ("id", blacklist[i]); - - return e; -} - -void KnownPluginList::recreateFromXml (const XmlElement& xml) -{ - clear(); - clearBlacklistedFiles(); - - if (xml.hasTagName ("KNOWNPLUGINS")) - { - forEachXmlChildElement (xml, e) - { - PluginDescription info; - - if (e->hasTagName ("BLACKLISTED")) - blacklist.add (e->getStringAttribute ("id")); - else if (info.loadFromXml (*e)) - addType (info); - } - } -} - -//============================================================================== -struct PluginTreeUtils -{ - enum { menuIdBase = 0x324503f4 }; - - static void buildTreeByFolder (KnownPluginList::PluginTree& tree, const Array & allPlugins) - { - for (int i = 0; i < allPlugins.size(); ++i) - { - PluginDescription* const pd = allPlugins.getUnchecked (i); - - String path (pd->fileOrIdentifier.replaceCharacter ('\\', '/') - .upToLastOccurrenceOf ("/", false, false)); - - if (path.substring (1, 2) == ":") - path = path.substring (2); - - addPlugin (tree, pd, path); - } - - optimiseFolders (tree, false); - } - - static void optimiseFolders (KnownPluginList::PluginTree& tree, bool concatenateName) - { - for (int i = tree.subFolders.size(); --i >= 0;) - { - KnownPluginList::PluginTree& sub = *tree.subFolders.getUnchecked(i); - optimiseFolders (sub, concatenateName || (tree.subFolders.size() > 1)); - - if (sub.plugins.size() == 0) - { - for (int j = 0; j < sub.subFolders.size(); ++j) - { - KnownPluginList::PluginTree* const s = sub.subFolders.getUnchecked(j); - - if (concatenateName) - s->folder = sub.folder + "/" + s->folder; - - tree.subFolders.add (s); - } - - sub.subFolders.clear (false); - tree.subFolders.remove (i); - } - } - } - - static void buildTreeByCategory (KnownPluginList::PluginTree& tree, - const Array & sorted, - const KnownPluginList::SortMethod sortMethod) - { - String lastType; - ScopedPointer current (new KnownPluginList::PluginTree()); - - for (int i = 0; i < sorted.size(); ++i) - { - const PluginDescription* const pd = sorted.getUnchecked(i); - String thisType (sortMethod == KnownPluginList::sortByCategory ? pd->category - : pd->manufacturerName); - - if (! thisType.containsNonWhitespaceChars()) - thisType = "Other"; - - if (thisType != lastType) - { - if (current->plugins.size() + current->subFolders.size() > 0) - { - current->folder = lastType; - tree.subFolders.add (current.release()); - current = new KnownPluginList::PluginTree(); - } - - lastType = thisType; - } - - current->plugins.add (pd); - } - - if (current->plugins.size() + current->subFolders.size() > 0) - { - current->folder = lastType; - tree.subFolders.add (current.release()); - } - } - - static void addPlugin (KnownPluginList::PluginTree& tree, PluginDescription* const pd, String path) - { - if (path.isEmpty()) - { - tree.plugins.add (pd); - } - else - { - #if JUCE_MAC - if (path.containsChar (':')) - path = path.fromFirstOccurrenceOf (":", false, false); // avoid the special AU formatting nonsense on Mac.. - #endif - - const String firstSubFolder (path.upToFirstOccurrenceOf ("/", false, false)); - const String remainingPath (path.fromFirstOccurrenceOf ("/", false, false)); - - for (int i = tree.subFolders.size(); --i >= 0;) - { - KnownPluginList::PluginTree& subFolder = *tree.subFolders.getUnchecked(i); - - if (subFolder.folder.equalsIgnoreCase (firstSubFolder)) - { - addPlugin (subFolder, pd, remainingPath); - return; - } - } - - KnownPluginList::PluginTree* const newFolder = new KnownPluginList::PluginTree(); - newFolder->folder = firstSubFolder; - tree.subFolders.add (newFolder); - addPlugin (*newFolder, pd, remainingPath); - } - } - - static bool containsDuplicateNames (const Array& plugins, const String& name) - { - int matches = 0; - - for (int i = 0; i < plugins.size(); ++i) - if (plugins.getUnchecked(i)->name == name) - if (++matches > 1) - return true; - - return false; - } - - static void addToMenu (const KnownPluginList::PluginTree& tree, PopupMenu& m, const OwnedArray & allPlugins) - { - for (int i = 0; i < tree.subFolders.size(); ++i) - { - const KnownPluginList::PluginTree& sub = *tree.subFolders.getUnchecked(i); - - PopupMenu subMenu; - addToMenu (sub, subMenu, allPlugins); - m.addSubMenu (sub.folder, subMenu); - } - - for (int i = 0; i < tree.plugins.size(); ++i) - { - const PluginDescription* const plugin = tree.plugins.getUnchecked(i); - - String name (plugin->name); - - if (containsDuplicateNames (tree.plugins, name)) - name << " (" << plugin->pluginFormatName << ')'; - - m.addItem (allPlugins.indexOf (plugin) + menuIdBase, name, true, false); - } - } -}; - -KnownPluginList::PluginTree* KnownPluginList::createTree (const SortMethod sortMethod) const -{ - Array sorted; - - { - PluginSorter sorter (sortMethod, true); - - for (int i = 0; i < types.size(); ++i) - sorted.addSorted (sorter, types.getUnchecked(i)); - } - - PluginTree* tree = new PluginTree(); - - if (sortMethod == sortByCategory || sortMethod == sortByManufacturer || sortMethod == sortByFormat) - { - PluginTreeUtils::buildTreeByCategory (*tree, sorted, sortMethod); - } - else if (sortMethod == sortByFileSystemLocation) - { - PluginTreeUtils::buildTreeByFolder (*tree, sorted); - } - else - { - for (int i = 0; i < sorted.size(); ++i) - tree->plugins.add (sorted.getUnchecked(i)); - } - - return tree; -} - -//============================================================================== -void KnownPluginList::addToMenu (PopupMenu& menu, const SortMethod sortMethod) const -{ - ScopedPointer tree (createTree (sortMethod)); - PluginTreeUtils::addToMenu (*tree, menu, types); -} - -int KnownPluginList::getIndexChosenByMenu (const int menuResultCode) const -{ - const int i = menuResultCode - PluginTreeUtils::menuIdBase; - return isPositiveAndBelow (i, types.size()) ? i : -1; -} - -//============================================================================== -KnownPluginList::CustomScanner::CustomScanner() {} -KnownPluginList::CustomScanner::~CustomScanner() {} - -void KnownPluginList::CustomScanner::scanFinished() {} - -bool KnownPluginList::CustomScanner::shouldExit() const noexcept -{ - if (ThreadPoolJob* job = ThreadPoolJob::getCurrentThreadPoolJob()) - return job->shouldExit(); - - return false; -} diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h deleted file mode 100755 index 3c8df25..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_KnownPluginList.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_KNOWNPLUGINLIST_H_INCLUDED -#define JUCE_KNOWNPLUGINLIST_H_INCLUDED - - -//============================================================================== -/** - Manages a list of plugin types. - - This can be easily edited, saved and loaded, and used to create instances of - the plugin types in it. - - @see PluginListComponent -*/ -class JUCE_API KnownPluginList : public ChangeBroadcaster -{ -public: - //============================================================================== - /** Creates an empty list. */ - KnownPluginList(); - - /** Destructor. */ - ~KnownPluginList(); - - //============================================================================== - /** Clears the list. */ - void clear(); - - /** Returns the number of types currently in the list. - @see getType - */ - int getNumTypes() const noexcept { return types.size(); } - - /** Returns one of the types. - @see getNumTypes - */ - PluginDescription* getType (int index) const noexcept { return types [index]; } - - /** Type iteration. */ - PluginDescription** begin() const noexcept { return types.begin(); } - /** Type iteration. */ - PluginDescription** end() const noexcept { return types.end(); } - - /** Looks for a type in the list which comes from this file. */ - PluginDescription* getTypeForFile (const String& fileOrIdentifier) const; - - /** Looks for a type in the list which matches a plugin type ID. - - The identifierString parameter must have been created by - PluginDescription::createIdentifierString(). - */ - PluginDescription* getTypeForIdentifierString (const String& identifierString) const; - - /** Adds a type manually from its description. */ - bool addType (const PluginDescription& type); - - /** Removes a type. */ - void removeType (int index); - - /** Looks for all types that can be loaded from a given file, and adds them - to the list. - - If dontRescanIfAlreadyInList is true, then the file will only be loaded and - re-tested if it's not already in the list, or if the file's modification - time has changed since the list was created. If dontRescanIfAlreadyInList is - false, the file will always be reloaded and tested. - - Returns true if any new types were added, and all the types found in this - file (even if it was already known and hasn't been re-scanned) get returned - in the array. - */ - bool scanAndAddFile (const String& possiblePluginFileOrIdentifier, - bool dontRescanIfAlreadyInList, - OwnedArray & typesFound, - AudioPluginFormat& formatToUse); - - /** Tells a custom scanner that a scan has finished, and it can release any resources. */ - void scanFinished(); - - /** Returns true if the specified file is already known about and if it - hasn't been modified since our entry was created. - */ - bool isListingUpToDate (const String& possiblePluginFileOrIdentifier, - AudioPluginFormat& formatToUse) const; - - /** Scans and adds a bunch of files that might have been dragged-and-dropped. - If any types are found in the files, their descriptions are returned in the array. - */ - void scanAndAddDragAndDroppedFiles (AudioPluginFormatManager& formatManager, - const StringArray& filenames, - OwnedArray & typesFound); - - //============================================================================== - /** Returns the list of blacklisted files. */ - const StringArray& getBlacklistedFiles() const; - - /** Adds a plugin ID to the black-list. */ - void addToBlacklist (const String& pluginID); - - /** Removes a plugin ID from the black-list. */ - void removeFromBlacklist (const String& pluginID); - - /** Clears all the blacklisted files. */ - void clearBlacklistedFiles(); - - //============================================================================== - /** Sort methods used to change the order of the plugins in the list. - */ - enum SortMethod - { - defaultOrder = 0, - sortAlphabetically, - sortByCategory, - sortByManufacturer, - sortByFormat, - sortByFileSystemLocation - }; - - //============================================================================== - /** Adds all the plugin types to a popup menu so that the user can select one. - - Depending on the sort method, it may add sub-menus for categories, - manufacturers, etc. - - Use getIndexChosenByMenu() to find out the type that was chosen. - */ - void addToMenu (PopupMenu& menu, SortMethod sortMethod) const; - - /** Converts a menu item index that has been chosen into its index in this list. - Returns -1 if it's not an ID that was used. - @see addToMenu - */ - int getIndexChosenByMenu (int menuResultCode) const; - - //============================================================================== - /** Sorts the list. */ - void sort (SortMethod method, bool forwards); - - //============================================================================== - /** Creates some XML that can be used to store the state of this list. */ - XmlElement* createXml() const; - - /** Recreates the state of this list from its stored XML format. */ - void recreateFromXml (const XmlElement& xml); - - //============================================================================== - /** A structure that recursively holds a tree of plugins. - @see KnownPluginList::createTree() - */ - struct PluginTree - { - String folder; /**< The name of this folder in the tree */ - OwnedArray subFolders; - Array plugins; - }; - - /** Creates a PluginTree object containing all the known plugins. */ - PluginTree* createTree (const SortMethod sortMethod) const; - - //============================================================================== - class CustomScanner - { - public: - CustomScanner(); - virtual ~CustomScanner(); - - /** Attempts to load the given file and find a list of plugins in it. - @returns true if the plugin loaded, false if it crashed - */ - virtual bool findPluginTypesFor (AudioPluginFormat& format, - OwnedArray & result, - const String& fileOrIdentifier) = 0; - - /** Called when a scan has finished, to allow clean-up of resources. */ - virtual void scanFinished(); - - /** Returns true if the current scan should be abandoned. - Any blocking methods should check this value repeatedly and return if - if becomes true. - */ - bool shouldExit() const noexcept; - }; - - /** Supplies a custom scanner to be used in future scans. - The KnownPluginList will take ownership of the object passed in. - */ - void setCustomScanner (CustomScanner*); - -private: - //============================================================================== - OwnedArray types; - StringArray blacklist; - ScopedPointer scanner; - CriticalSection scanLock; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (KnownPluginList) -}; - - -#endif // JUCE_KNOWNPLUGINLIST_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp deleted file mode 100755 index a7beea7..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -static StringArray readDeadMansPedalFile (const File& file) -{ - StringArray lines; - file.readLines (lines); - lines.removeEmptyStrings(); - return lines; -} - -PluginDirectoryScanner::PluginDirectoryScanner (KnownPluginList& listToAddTo, - AudioPluginFormat& formatToLookFor, - FileSearchPath directoriesToSearch, - const bool recursive, - const File& deadMansPedal) - : list (listToAddTo), - format (formatToLookFor), - deadMansPedalFile (deadMansPedal), - progress (0) -{ - directoriesToSearch.removeRedundantPaths(); - - filesOrIdentifiersToScan = format.searchPathsForPlugins (directoriesToSearch, recursive); - - // If any plugins have crashed recently when being loaded, move them to the - // end of the list to give the others a chance to load correctly.. - const StringArray crashedPlugins (readDeadMansPedalFile (deadMansPedalFile)); - - for (int i = 0; i < crashedPlugins.size(); ++i) - { - const String f = crashedPlugins[i]; - - for (int j = filesOrIdentifiersToScan.size(); --j >= 0;) - if (f == filesOrIdentifiersToScan[j]) - filesOrIdentifiersToScan.move (j, -1); - } - - applyBlacklistingsFromDeadMansPedal (listToAddTo, deadMansPedalFile); - nextIndex.set (filesOrIdentifiersToScan.size()); -} - -PluginDirectoryScanner::~PluginDirectoryScanner() -{ - list.scanFinished(); -} - -//============================================================================== -String PluginDirectoryScanner::getNextPluginFileThatWillBeScanned() const -{ - return format.getNameOfPluginFromIdentifier (filesOrIdentifiersToScan [nextIndex.get() - 1]); -} - -void PluginDirectoryScanner::updateProgress() -{ - progress = (1.0f - nextIndex.get() / (float) filesOrIdentifiersToScan.size()); -} - -bool PluginDirectoryScanner::scanNextFile (const bool dontRescanIfAlreadyInList, - String& nameOfPluginBeingScanned) -{ - const int index = --nextIndex; - - if (index >= 0) - { - const String file (filesOrIdentifiersToScan [index]); - - if (file.isNotEmpty() && ! list.isListingUpToDate (file, format)) - { - nameOfPluginBeingScanned = format.getNameOfPluginFromIdentifier (file); - - OwnedArray typesFound; - - // Add this plugin to the end of the dead-man's pedal list in case it crashes... - StringArray crashedPlugins (readDeadMansPedalFile (deadMansPedalFile)); - crashedPlugins.removeString (file); - crashedPlugins.add (file); - setDeadMansPedalFile (crashedPlugins); - - list.scanAndAddFile (file, dontRescanIfAlreadyInList, typesFound, format); - - // Managed to load without crashing, so remove it from the dead-man's-pedal.. - crashedPlugins.removeString (file); - setDeadMansPedalFile (crashedPlugins); - - if (typesFound.size() == 0 && ! list.getBlacklistedFiles().contains (file)) - failedFiles.add (file); - } - } - - updateProgress(); - return index > 0; -} - -bool PluginDirectoryScanner::skipNextFile() -{ - updateProgress(); - return --nextIndex > 0; -} - -void PluginDirectoryScanner::setDeadMansPedalFile (const StringArray& newContents) -{ - if (deadMansPedalFile.getFullPathName().isNotEmpty()) - deadMansPedalFile.replaceWithText (newContents.joinIntoString ("\n"), true, true); -} - -void PluginDirectoryScanner::applyBlacklistingsFromDeadMansPedal (KnownPluginList& list, const File& file) -{ - // If any plugins have crashed recently when being loaded, move them to the - // end of the list to give the others a chance to load correctly.. - const StringArray crashedPlugins (readDeadMansPedalFile (file)); - - for (int i = 0; i < crashedPlugins.size(); ++i) - list.addToBlacklist (crashedPlugins[i]); -} diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h deleted file mode 100755 index 762e742..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_PLUGINDIRECTORYSCANNER_H_INCLUDED -#define JUCE_PLUGINDIRECTORYSCANNER_H_INCLUDED - - -//============================================================================== -/** - Scans a directory for plugins, and adds them to a KnownPluginList. - - To use one of these, create it and call scanNextFile() repeatedly, until - it returns false. -*/ -class JUCE_API PluginDirectoryScanner -{ -public: - //============================================================================== - /** - Creates a scanner. - - @param listToAddResultsTo this will get the new types added to it. - @param formatToLookFor this is the type of format that you want to look for - @param directoriesToSearch the path to search - @param searchRecursively true to search recursively - @param deadMansPedalFile if this isn't File::nonexistent, then it will - be used as a file to store the names of any plugins - that crash during initialisation. If there are - any plugins listed in it, then these will always - be scanned after all other possible files have - been tried - in this way, even if there's a few - dodgy plugins in your path, then a couple of rescans - will still manage to find all the proper plugins. - It's probably best to choose a file in the user's - application data directory (alongside your app's - settings file) for this. The file format it uses - is just a list of filenames of the modules that - failed. - */ - PluginDirectoryScanner (KnownPluginList& listToAddResultsTo, - AudioPluginFormat& formatToLookFor, - FileSearchPath directoriesToSearch, - bool searchRecursively, - const File& deadMansPedalFile); - - /** Destructor. */ - ~PluginDirectoryScanner(); - - //============================================================================== - /** Tries the next likely-looking file. - - If dontRescanIfAlreadyInList is true, then the file will only be loaded and - re-tested if it's not already in the list, or if the file's modification - time has changed since the list was created. If dontRescanIfAlreadyInList is - false, the file will always be reloaded and tested. - The nameOfPluginBeingScanned will be updated to the name of the plugin being - scanned before the scan starts. - - Returns false when there are no more files to try. - */ - bool scanNextFile (bool dontRescanIfAlreadyInList, - String& nameOfPluginBeingScanned); - - /** Skips over the next file without scanning it. - Returns false when there are no more files to try. - */ - bool skipNextFile(); - - /** Returns the description of the plugin that will be scanned during the next - call to scanNextFile(). - - This is handy if you want to show the user which file is currently getting - scanned. - */ - String getNextPluginFileThatWillBeScanned() const; - - /** Returns the estimated progress, between 0 and 1. */ - float getProgress() const { return progress; } - - /** This returns a list of all the filenames of things that looked like being - a plugin file, but which failed to open for some reason. - */ - const StringArray& getFailedFiles() const noexcept { return failedFiles; } - - /** Reads the given dead-mans-pedal file and applies its contents to the list. */ - static void applyBlacklistingsFromDeadMansPedal (KnownPluginList& listToApplyTo, - const File& deadMansPedalFile); - -private: - //============================================================================== - KnownPluginList& list; - AudioPluginFormat& format; - StringArray filesOrIdentifiersToScan; - File deadMansPedalFile; - StringArray failedFiles; - Atomic nextIndex; - float progress; - - void updateProgress(); - void setDeadMansPedalFile (const StringArray& newContents); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginDirectoryScanner) -}; - - -#endif // JUCE_PLUGINDIRECTORYSCANNER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp deleted file mode 100755 index a0c2388..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp +++ /dev/null @@ -1,554 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class PluginListComponent::TableModel : public TableListBoxModel -{ -public: - TableModel (PluginListComponent& c, KnownPluginList& l) : owner (c), list (l) {} - - int getNumRows() override - { - return list.getNumTypes() + list.getBlacklistedFiles().size(); - } - - void paintRowBackground (Graphics& g, int /*rowNumber*/, int /*width*/, int /*height*/, bool rowIsSelected) override - { - if (rowIsSelected) - g.fillAll (owner.findColour (TextEditor::highlightColourId)); - } - - enum - { - nameCol = 1, - typeCol = 2, - categoryCol = 3, - manufacturerCol = 4, - descCol = 5 - }; - - void paintCell (Graphics& g, int row, int columnId, int width, int height, bool /*rowIsSelected*/) override - { - String text; - bool isBlacklisted = row >= list.getNumTypes(); - - if (isBlacklisted) - { - if (columnId == nameCol) - text = list.getBlacklistedFiles() [row - list.getNumTypes()]; - else if (columnId == descCol) - text = TRANS("Deactivated after failing to initialise correctly"); - } - else if (const PluginDescription* const desc = list.getType (row)) - { - switch (columnId) - { - case nameCol: text = desc->name; break; - case typeCol: text = desc->pluginFormatName; break; - case categoryCol: text = desc->category.isNotEmpty() ? desc->category : "-"; break; - case manufacturerCol: text = desc->manufacturerName; break; - case descCol: text = getPluginDescription (*desc); break; - - default: jassertfalse; break; - } - } - - if (text.isNotEmpty()) - { - g.setColour (isBlacklisted ? Colours::red - : columnId == nameCol ? Colours::black - : Colours::grey); - g.setFont (Font (height * 0.7f, Font::bold)); - g.drawFittedText (text, 4, 0, width - 6, height, Justification::centredLeft, 1, 0.9f); - } - } - - void deleteKeyPressed (int) override - { - owner.removeSelected(); - } - - void sortOrderChanged (int newSortColumnId, bool isForwards) override - { - switch (newSortColumnId) - { - case nameCol: list.sort (KnownPluginList::sortAlphabetically, isForwards); break; - case typeCol: list.sort (KnownPluginList::sortByFormat, isForwards); break; - case categoryCol: list.sort (KnownPluginList::sortByCategory, isForwards); break; - case manufacturerCol: list.sort (KnownPluginList::sortByManufacturer, isForwards); break; - case descCol: break; - - default: jassertfalse; break; - } - } - - static void removePluginItem (KnownPluginList& list, int index) - { - if (index < list.getNumTypes()) - list.removeType (index); - else - list.removeFromBlacklist (list.getBlacklistedFiles() [index - list.getNumTypes()]); - } - - static String getPluginDescription (const PluginDescription& desc) - { - StringArray items; - - if (desc.descriptiveName != desc.name) - items.add (desc.descriptiveName); - - items.add (desc.version); - - items.removeEmptyStrings(); - return items.joinIntoString (" - "); - } - - PluginListComponent& owner; - KnownPluginList& list; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TableModel) -}; - -//============================================================================== -PluginListComponent::PluginListComponent (AudioPluginFormatManager& manager, KnownPluginList& listToEdit, - const File& deadMansPedal, PropertiesFile* const props) - : formatManager (manager), - list (listToEdit), - deadMansPedalFile (deadMansPedal), - optionsButton ("Options..."), - propertiesToUse (props), - numThreads (0) -{ - tableModel = new TableModel (*this, listToEdit); - - TableHeaderComponent& header = table.getHeader(); - - header.addColumn (TRANS("Name"), TableModel::nameCol, 200, 100, 700, TableHeaderComponent::defaultFlags | TableHeaderComponent::sortedForwards); - header.addColumn (TRANS("Format"), TableModel::typeCol, 80, 80, 80, TableHeaderComponent::notResizable); - header.addColumn (TRANS("Category"), TableModel::categoryCol, 100, 100, 200); - header.addColumn (TRANS("Manufacturer"), TableModel::manufacturerCol, 200, 100, 300); - header.addColumn (TRANS("Description"), TableModel::descCol, 300, 100, 500, TableHeaderComponent::notSortable); - - table.setHeaderHeight (22); - table.setRowHeight (20); - table.setModel (tableModel); - table.setMultipleSelectionEnabled (true); - addAndMakeVisible (table); - - addAndMakeVisible (optionsButton); - optionsButton.addListener (this); - optionsButton.setTriggeredOnMouseDown (true); - - setSize (400, 600); - list.addChangeListener (this); - updateList(); - table.getHeader().reSortTable(); - - PluginDirectoryScanner::applyBlacklistingsFromDeadMansPedal (list, deadMansPedalFile); - deadMansPedalFile.deleteFile(); -} - -PluginListComponent::~PluginListComponent() -{ - list.removeChangeListener (this); -} - -void PluginListComponent::setOptionsButtonText (const String& newText) -{ - optionsButton.setButtonText (newText); - resized(); -} - -void PluginListComponent::setNumberOfThreadsForScanning (int num) -{ - numThreads = num; -} - -void PluginListComponent::resized() -{ - Rectangle r (getLocalBounds().reduced (2)); - - optionsButton.setBounds (r.removeFromBottom (24)); - optionsButton.changeWidthToFitText (24); - - r.removeFromBottom (3); - table.setBounds (r); -} - -void PluginListComponent::changeListenerCallback (ChangeBroadcaster*) -{ - table.getHeader().reSortTable(); - updateList(); -} - -void PluginListComponent::updateList() -{ - table.updateContent(); - table.repaint(); -} - -void PluginListComponent::removeSelected() -{ - const SparseSet selected (table.getSelectedRows()); - - for (int i = table.getNumRows(); --i >= 0;) - if (selected.contains (i)) - TableModel::removePluginItem (list, i); -} - -bool PluginListComponent::canShowSelectedFolder() const -{ - if (const PluginDescription* const desc = list.getType (table.getSelectedRow())) - return File::createFileWithoutCheckingPath (desc->fileOrIdentifier).exists(); - - return false; -} - -void PluginListComponent::showSelectedFolder() -{ - if (canShowSelectedFolder()) - if (const PluginDescription* const desc = list.getType (table.getSelectedRow())) - File (desc->fileOrIdentifier).getParentDirectory().startAsProcess(); -} - -void PluginListComponent::removeMissingPlugins() -{ - for (int i = list.getNumTypes(); --i >= 0;) - if (! formatManager.doesPluginStillExist (*list.getType (i))) - list.removeType (i); -} - -void PluginListComponent::optionsMenuStaticCallback (int result, PluginListComponent* pluginList) -{ - if (pluginList != nullptr) - pluginList->optionsMenuCallback (result); -} - -void PluginListComponent::optionsMenuCallback (int result) -{ - switch (result) - { - case 0: break; - case 1: list.clear(); break; - case 2: removeSelected(); break; - case 3: showSelectedFolder(); break; - case 4: removeMissingPlugins(); break; - - default: - if (AudioPluginFormat* format = formatManager.getFormat (result - 10)) - scanFor (*format); - - break; - } -} - -void PluginListComponent::buttonClicked (Button* button) -{ - if (button == &optionsButton) - { - PopupMenu menu; - menu.addItem (1, TRANS("Clear list")); - menu.addItem (2, TRANS("Remove selected plug-in from list"), table.getNumSelectedRows() > 0); - menu.addItem (3, TRANS("Show folder containing selected plug-in"), canShowSelectedFolder()); - menu.addItem (4, TRANS("Remove any plug-ins whose files no longer exist")); - menu.addSeparator(); - - for (int i = 0; i < formatManager.getNumFormats(); ++i) - { - AudioPluginFormat* const format = formatManager.getFormat (i); - - if (format->canScanForPlugins()) - menu.addItem (10 + i, "Scan for new or updated " + format->getName() + " plug-ins"); - } - - menu.showMenuAsync (PopupMenu::Options().withTargetComponent (&optionsButton), - ModalCallbackFunction::forComponent (optionsMenuStaticCallback, this)); - } -} - -bool PluginListComponent::isInterestedInFileDrag (const StringArray& /*files*/) -{ - return true; -} - -void PluginListComponent::filesDropped (const StringArray& files, int, int) -{ - OwnedArray typesFound; - list.scanAndAddDragAndDroppedFiles (formatManager, files, typesFound); -} - -FileSearchPath PluginListComponent::getLastSearchPath (PropertiesFile& properties, AudioPluginFormat& format) -{ - return FileSearchPath (properties.getValue ("lastPluginScanPath_" + format.getName(), - format.getDefaultLocationsToSearch().toString())); -} - -void PluginListComponent::setLastSearchPath (PropertiesFile& properties, AudioPluginFormat& format, - const FileSearchPath& newPath) -{ - properties.setValue ("lastPluginScanPath_" + format.getName(), newPath.toString()); -} - -//============================================================================== -class PluginListComponent::Scanner : private Timer -{ -public: - Scanner (PluginListComponent& plc, AudioPluginFormat& format, PropertiesFile* properties, int threads) - : owner (plc), formatToScan (format), propertiesToUse (properties), - pathChooserWindow (TRANS("Select folders to scan..."), String::empty, AlertWindow::NoIcon), - progressWindow (TRANS("Scanning for plug-ins..."), - TRANS("Searching for all possible plug-in files..."), AlertWindow::NoIcon), - progress (0.0), numThreads (threads), finished (false) - { - FileSearchPath path (formatToScan.getDefaultLocationsToSearch()); - - if (path.getNumPaths() > 0) // if the path is empty, then paths aren't used for this format. - { - if (propertiesToUse != nullptr) - path = getLastSearchPath (*propertiesToUse, formatToScan); - - pathList.setSize (500, 300); - pathList.setPath (path); - - pathChooserWindow.addCustomComponent (&pathList); - pathChooserWindow.addButton (TRANS("Scan"), 1, KeyPress (KeyPress::returnKey)); - pathChooserWindow.addButton (TRANS("Cancel"), 0, KeyPress (KeyPress::escapeKey)); - - pathChooserWindow.enterModalState (true, - ModalCallbackFunction::forComponent (startScanCallback, - &pathChooserWindow, this), - false); - } - else - { - startScan(); - } - } - - ~Scanner() - { - if (pool != nullptr) - { - pool->removeAllJobs (true, 60000); - pool = nullptr; - } - } - -private: - PluginListComponent& owner; - AudioPluginFormat& formatToScan; - PropertiesFile* propertiesToUse; - ScopedPointer scanner; - AlertWindow pathChooserWindow, progressWindow; - FileSearchPathListComponent pathList; - String pluginBeingScanned; - double progress; - int numThreads; - bool finished; - ScopedPointer pool; - - static void startScanCallback (int result, AlertWindow* alert, Scanner* scanner) - { - if (alert != nullptr && scanner != nullptr) - { - if (result != 0) - scanner->warnUserAboutStupidPaths(); - else - scanner->finishedScan(); - } - } - - // Try to dissuade people from to scanning their entire C: drive, or other system folders. - void warnUserAboutStupidPaths() - { - for (int i = 0; i < pathList.getPath().getNumPaths(); ++i) - { - const File f (pathList.getPath()[i]); - - if (isStupidPath (f)) - { - AlertWindow::showOkCancelBox (AlertWindow::WarningIcon, - TRANS("Plugin Scanning"), - TRANS("If you choose to scan folders that contain non-plugin files, " - "then scanning may take a long time, and can cause crashes when " - "attempting to load unsuitable files.") - + newLine - + TRANS ("Are you sure you want to scan the folder \"XYZ\"?") - .replace ("XYZ", f.getFullPathName()), - TRANS ("Scan"), - String::empty, - nullptr, - ModalCallbackFunction::create (warnAboutStupidPathsCallback, this)); - return; - } - } - - startScan(); - } - - static bool isStupidPath (const File& f) - { - Array roots; - File::findFileSystemRoots (roots); - - if (roots.contains (f)) - return true; - - File::SpecialLocationType pathsThatWouldBeStupidToScan[] - = { File::globalApplicationsDirectory, - File::userHomeDirectory, - File::userDocumentsDirectory, - File::userDesktopDirectory, - File::tempDirectory, - File::userMusicDirectory, - File::userMoviesDirectory, - File::userPicturesDirectory }; - - for (int i = 0; i < numElementsInArray (pathsThatWouldBeStupidToScan); ++i) - { - const File sillyFolder (File::getSpecialLocation (pathsThatWouldBeStupidToScan[i])); - - if (f == sillyFolder || sillyFolder.isAChildOf (f)) - return true; - } - - return false; - } - - static void warnAboutStupidPathsCallback (int result, Scanner* scanner) - { - if (result != 0) - scanner->startScan(); - else - scanner->finishedScan(); - } - - void startScan() - { - pathChooserWindow.setVisible (false); - - scanner = new PluginDirectoryScanner (owner.list, formatToScan, pathList.getPath(), - true, owner.deadMansPedalFile); - - if (propertiesToUse != nullptr) - { - setLastSearchPath (*propertiesToUse, formatToScan, pathList.getPath()); - propertiesToUse->saveIfNeeded(); - } - - progressWindow.addButton (TRANS("Cancel"), 0, KeyPress (KeyPress::escapeKey)); - progressWindow.addProgressBarComponent (progress); - progressWindow.enterModalState(); - - if (numThreads > 0) - { - pool = new ThreadPool (numThreads); - - for (int i = numThreads; --i >= 0;) - pool->addJob (new ScanJob (*this), true); - } - - startTimer (20); - } - - void finishedScan() - { - owner.scanFinished (scanner != nullptr ? scanner->getFailedFiles() - : StringArray()); - } - - void timerCallback() override - { - if (pool == nullptr) - { - if (doNextScan()) - startTimer (20); - } - - if (! progressWindow.isCurrentlyModal()) - finished = true; - - if (finished) - finishedScan(); - else - progressWindow.setMessage (TRANS("Testing") + ":\n\n" + pluginBeingScanned); - } - - bool doNextScan() - { - if (scanner->scanNextFile (true, pluginBeingScanned)) - { - progress = scanner->getProgress(); - return true; - } - - finished = true; - return false; - } - - struct ScanJob : public ThreadPoolJob - { - ScanJob (Scanner& s) : ThreadPoolJob ("pluginscan"), scanner (s) {} - - JobStatus runJob() - { - while (scanner.doNextScan() && ! shouldExit()) - {} - - return jobHasFinished; - } - - Scanner& scanner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScanJob) - }; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Scanner) -}; - -void PluginListComponent::scanFor (AudioPluginFormat& format) -{ - currentScanner = new Scanner (*this, format, propertiesToUse, numThreads); -} - -bool PluginListComponent::isScanning() const noexcept -{ - return currentScanner != nullptr; -} - -void PluginListComponent::scanFinished (const StringArray& failedFiles) -{ - StringArray shortNames; - - for (int i = 0; i < failedFiles.size(); ++i) - shortNames.add (File::createFileWithoutCheckingPath (failedFiles[i]).getFileName()); - - currentScanner = nullptr; // mustn't delete this before using the failed files array - - if (shortNames.size() > 0) - AlertWindow::showMessageBoxAsync (AlertWindow::InfoIcon, - TRANS("Scan complete"), - TRANS("Note that the following files appeared to be plugin files, but failed to load correctly") - + ":\n\n" - + shortNames.joinIntoString (", ")); -} diff --git a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h b/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h deleted file mode 100755 index 97751a8..0000000 --- a/JuceLibraryCode/modules/juce_audio_processors/scanning/juce_PluginListComponent.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_PLUGINLISTCOMPONENT_H_INCLUDED -#define JUCE_PLUGINLISTCOMPONENT_H_INCLUDED - - -//============================================================================== -/** - A component displaying a list of plugins, with options to scan for them, - add, remove and sort them. -*/ -class JUCE_API PluginListComponent : public Component, - public FileDragAndDropTarget, - private ChangeListener, - private ButtonListener // (can't use Button::Listener due to idiotic VC2005 bug) -{ -public: - //============================================================================== - /** - Creates the list component. - - For info about the deadMansPedalFile, see the PluginDirectoryScanner constructor. - The properties file, if supplied, is used to store the user's last search paths. - */ - PluginListComponent (AudioPluginFormatManager& formatManager, - KnownPluginList& listToRepresent, - const File& deadMansPedalFile, - PropertiesFile* propertiesToUse); - - /** Destructor. */ - ~PluginListComponent(); - - /** Changes the text in the panel's options button. */ - void setOptionsButtonText (const String& newText); - - /** Sets how many threads to simultaneously scan for plugins. - If this is 0, then all scanning happens on the message thread (this is the default) - */ - void setNumberOfThreadsForScanning (int numThreads); - - /** Returns the last search path stored in a given properties file for the specified format. */ - static FileSearchPath getLastSearchPath (PropertiesFile&, AudioPluginFormat&); - - /** Stores a search path in a properties file for the given format. */ - static void setLastSearchPath (PropertiesFile&, AudioPluginFormat&, const FileSearchPath&); - - /** Triggers an asynchronous scan for the given format. */ - void scanFor (AudioPluginFormat&); - - /** Returns true if there's currently a scan in progress. */ - bool isScanning() const noexcept; - -private: - //============================================================================== - AudioPluginFormatManager& formatManager; - KnownPluginList& list; - File deadMansPedalFile; - TableListBox table; - TextButton optionsButton; - PropertiesFile* propertiesToUse; - int numThreads; - - class TableModel; - friend class TableModel; - friend struct ContainerDeletePolicy; - ScopedPointer tableModel; - - class Scanner; - friend class Scanner; - friend struct ContainerDeletePolicy; - ScopedPointer currentScanner; - - void scanFinished (const StringArray&); - static void optionsMenuStaticCallback (int, PluginListComponent*); - void optionsMenuCallback (int); - void updateList(); - void showSelectedFolder(); - bool canShowSelectedFolder() const; - void removeSelected(); - void removeMissingPlugins(); - - void resized() override; - bool isInterestedInFileDrag (const StringArray&) override; - void filesDropped (const StringArray&, int, int) override; - void buttonClicked (Button*) override; - void changeListenerCallback (ChangeBroadcaster*) override; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginListComponent) -}; - - -#endif // JUCE_PLUGINLISTCOMPONENT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp b/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp deleted file mode 100755 index 65b1615..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.cpp +++ /dev/null @@ -1,235 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -AbstractFifo::AbstractFifo (const int capacity) noexcept - : bufferSize (capacity) -{ - jassert (bufferSize > 0); -} - -AbstractFifo::~AbstractFifo() {} - -int AbstractFifo::getTotalSize() const noexcept { return bufferSize; } -int AbstractFifo::getFreeSpace() const noexcept { return bufferSize - getNumReady() - 1; } - -int AbstractFifo::getNumReady() const noexcept -{ - const int vs = validStart.get(); - const int ve = validEnd.get(); - return ve >= vs ? (ve - vs) : (bufferSize - (vs - ve)); -} - -void AbstractFifo::reset() noexcept -{ - validEnd = 0; - validStart = 0; -} - -void AbstractFifo::setTotalSize (int newSize) noexcept -{ - jassert (newSize > 0); - reset(); - bufferSize = newSize; -} - -//============================================================================== -void AbstractFifo::prepareToWrite (int numToWrite, int& startIndex1, int& blockSize1, int& startIndex2, int& blockSize2) const noexcept -{ - const int vs = validStart.get(); - const int ve = validEnd.value; - - const int freeSpace = ve >= vs ? (bufferSize - (ve - vs)) : (vs - ve); - numToWrite = jmin (numToWrite, freeSpace - 1); - - if (numToWrite <= 0) - { - startIndex1 = 0; - startIndex2 = 0; - blockSize1 = 0; - blockSize2 = 0; - } - else - { - startIndex1 = ve; - startIndex2 = 0; - blockSize1 = jmin (bufferSize - ve, numToWrite); - numToWrite -= blockSize1; - blockSize2 = numToWrite <= 0 ? 0 : jmin (numToWrite, vs); - } -} - -void AbstractFifo::finishedWrite (int numWritten) noexcept -{ - jassert (numWritten >= 0 && numWritten < bufferSize); - int newEnd = validEnd.value + numWritten; - if (newEnd >= bufferSize) - newEnd -= bufferSize; - - validEnd = newEnd; -} - -void AbstractFifo::prepareToRead (int numWanted, int& startIndex1, int& blockSize1, int& startIndex2, int& blockSize2) const noexcept -{ - const int vs = validStart.value; - const int ve = validEnd.get(); - - const int numReady = ve >= vs ? (ve - vs) : (bufferSize - (vs - ve)); - numWanted = jmin (numWanted, numReady); - - if (numWanted <= 0) - { - startIndex1 = 0; - startIndex2 = 0; - blockSize1 = 0; - blockSize2 = 0; - } - else - { - startIndex1 = vs; - startIndex2 = 0; - blockSize1 = jmin (bufferSize - vs, numWanted); - numWanted -= blockSize1; - blockSize2 = numWanted <= 0 ? 0 : jmin (numWanted, ve); - } -} - -void AbstractFifo::finishedRead (int numRead) noexcept -{ - jassert (numRead >= 0 && numRead <= bufferSize); - - int newStart = validStart.value + numRead; - if (newStart >= bufferSize) - newStart -= bufferSize; - - validStart = newStart; -} - -//============================================================================== -//============================================================================== -#if JUCE_UNIT_TESTS - -class AbstractFifoTests : public UnitTest -{ -public: - AbstractFifoTests() : UnitTest ("Abstract Fifo") {} - - class WriteThread : public Thread - { - public: - WriteThread (AbstractFifo& f, int* b, Random rng) - : Thread ("fifo writer"), fifo (f), buffer (b), random (rng) - { - startThread(); - } - - ~WriteThread() - { - stopThread (5000); - } - - void run() - { - int n = 0; - - while (! threadShouldExit()) - { - int num = random.nextInt (2000) + 1; - - int start1, size1, start2, size2; - fifo.prepareToWrite (num, start1, size1, start2, size2); - - jassert (size1 >= 0 && size2 >= 0); - jassert (size1 == 0 || (start1 >= 0 && start1 < fifo.getTotalSize())); - jassert (size2 == 0 || (start2 >= 0 && start2 < fifo.getTotalSize())); - - for (int i = 0; i < size1; ++i) - buffer [start1 + i] = n++; - - for (int i = 0; i < size2; ++i) - buffer [start2 + i] = n++; - - fifo.finishedWrite (size1 + size2); - } - } - - private: - AbstractFifo& fifo; - int* buffer; - Random random; - }; - - void runTest() - { - beginTest ("AbstractFifo"); - - int buffer [5000]; - AbstractFifo fifo (numElementsInArray (buffer)); - - WriteThread writer (fifo, buffer, getRandom()); - - int n = 0; - Random r = getRandom(); - r.combineSeed (12345); - - for (int count = 100000; --count >= 0;) - { - int num = r.nextInt (6000) + 1; - - int start1, size1, start2, size2; - fifo.prepareToRead (num, start1, size1, start2, size2); - - if (! (size1 >= 0 && size2 >= 0) - && (size1 == 0 || (start1 >= 0 && start1 < fifo.getTotalSize())) - && (size2 == 0 || (start2 >= 0 && start2 < fifo.getTotalSize()))) - { - expect (false, "prepareToRead returned -ve values"); - break; - } - - bool failed = false; - - for (int i = 0; i < size1; ++i) - failed = (buffer [start1 + i] != n++) || failed; - - for (int i = 0; i < size2; ++i) - failed = (buffer [start2 + i] != n++) || failed; - - if (failed) - { - expect (false, "read values were incorrect"); - break; - } - - fifo.finishedRead (size1 + size2); - } - } -}; - -static AbstractFifoTests fifoUnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h b/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h deleted file mode 100755 index 02feac7..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_AbstractFifo.h +++ /dev/null @@ -1,220 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_ABSTRACTFIFO_H_INCLUDED -#define JUCE_ABSTRACTFIFO_H_INCLUDED - - -//============================================================================== -/** - Encapsulates the logic required to implement a lock-free FIFO. - - This class handles the logic needed when building a single-reader, single-writer FIFO. - - It doesn't actually hold any data itself, but your FIFO class can use one of these to manage - its position and status when reading or writing to it. - - To use it, you can call prepareToWrite() to determine the position within your own buffer that - an incoming block of data should be stored, and prepareToRead() to find out when the next - outgoing block should be read from. - - e.g. - @code - class MyFifo - { - public: - MyFifo() : abstractFifo (1024) - { - } - - void addToFifo (const int* someData, int numItems) - { - int start1, size1, start2, size2; - abstractFifo.prepareToWrite (numItems, start1, size1, start2, size2); - - if (size1 > 0) - copySomeData (myBuffer + start1, someData, size1); - - if (size2 > 0) - copySomeData (myBuffer + start2, someData + size1, size2); - - abstractFifo.finishedWrite (size1 + size2); - } - - void readFromFifo (int* someData, int numItems) - { - int start1, size1, start2, size2; - abstractFifo.prepareToRead (numSamples, start1, size1, start2, size2); - - if (size1 > 0) - copySomeData (someData, myBuffer + start1, size1); - - if (size2 > 0) - copySomeData (someData + size1, myBuffer + start2, size2); - - abstractFifo.finishedRead (size1 + size2); - } - - private: - AbstractFifo abstractFifo; - int myBuffer [1024]; - }; - @endcode -*/ -class JUCE_API AbstractFifo -{ -public: - //============================================================================== - /** Creates a FIFO to manage a buffer with the specified capacity. */ - AbstractFifo (int capacity) noexcept; - - /** Destructor */ - ~AbstractFifo(); - - //============================================================================== - /** Returns the total size of the buffer being managed. */ - int getTotalSize() const noexcept; - - /** Returns the number of items that can currently be added to the buffer without it overflowing. */ - int getFreeSpace() const noexcept; - - /** Returns the number of items that can currently be read from the buffer. */ - int getNumReady() const noexcept; - - /** Clears the buffer positions, so that it appears empty. */ - void reset() noexcept; - - /** Changes the buffer's total size. - Note that this isn't thread-safe, so don't call it if there's any danger that it - might overlap with a call to any other method in this class! - */ - void setTotalSize (int newSize) noexcept; - - //============================================================================== - /** Returns the location within the buffer at which an incoming block of data should be written. - - Because the section of data that you want to add to the buffer may overlap the end - and wrap around to the start, two blocks within your buffer are returned, and you - should copy your data into the first one, with any remaining data spilling over into - the second. - - If the number of items you ask for is too large to fit within the buffer's free space, then - blockSize1 + blockSize2 may add up to a lower value than numToWrite. If this happens, you - may decide to keep waiting and re-trying the method until there's enough space available. - - After calling this method, if you choose to write your data into the blocks returned, you - must call finishedWrite() to tell the FIFO how much data you actually added. - - e.g. - @code - void addToFifo (const int* someData, int numItems) - { - int start1, size1, start2, size2; - prepareToWrite (numItems, start1, size1, start2, size2); - - if (size1 > 0) - copySomeData (myBuffer + start1, someData, size1); - - if (size2 > 0) - copySomeData (myBuffer + start2, someData + size1, size2); - - finishedWrite (size1 + size2); - } - @endcode - - @param numToWrite indicates how many items you'd like to add to the buffer - @param startIndex1 on exit, this will contain the start index in your buffer at which your data should be written - @param blockSize1 on exit, this indicates how many items can be written to the block starting at startIndex1 - @param startIndex2 on exit, this will contain the start index in your buffer at which any data that didn't fit into - the first block should be written - @param blockSize2 on exit, this indicates how many items can be written to the block starting at startIndex2 - @see finishedWrite - */ - void prepareToWrite (int numToWrite, int& startIndex1, int& blockSize1, int& startIndex2, int& blockSize2) const noexcept; - - /** Called after writing from the FIFO, to indicate that this many items have been added. - @see prepareToWrite - */ - void finishedWrite (int numWritten) noexcept; - - /** Returns the location within the buffer from which the next block of data should be read. - - Because the section of data that you want to read from the buffer may overlap the end - and wrap around to the start, two blocks within your buffer are returned, and you - should read from both of them. - - If the number of items you ask for is greater than the amount of data available, then - blockSize1 + blockSize2 may add up to a lower value than numWanted. If this happens, you - may decide to keep waiting and re-trying the method until there's enough data available. - - After calling this method, if you choose to read the data, you must call finishedRead() to - tell the FIFO how much data you have consumed. - - e.g. - @code - void readFromFifo (int* someData, int numItems) - { - int start1, size1, start2, size2; - prepareToRead (numSamples, start1, size1, start2, size2); - - if (size1 > 0) - copySomeData (someData, myBuffer + start1, size1); - - if (size2 > 0) - copySomeData (someData + size1, myBuffer + start2, size2); - - finishedRead (size1 + size2); - } - @endcode - - @param numWanted indicates how many items you'd like to add to the buffer - @param startIndex1 on exit, this will contain the start index in your buffer at which your data should be written - @param blockSize1 on exit, this indicates how many items can be written to the block starting at startIndex1 - @param startIndex2 on exit, this will contain the start index in your buffer at which any data that didn't fit into - the first block should be written - @param blockSize2 on exit, this indicates how many items can be written to the block starting at startIndex2 - @see finishedRead - */ - void prepareToRead (int numWanted, int& startIndex1, int& blockSize1, int& startIndex2, int& blockSize2) const noexcept; - - /** Called after reading from the FIFO, to indicate that this many items have now been consumed. - @see prepareToRead - */ - void finishedRead (int numRead) noexcept; - - -private: - //============================================================================== - int bufferSize; - Atomic validStart, validEnd; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AbstractFifo) -}; - - -#endif // JUCE_ABSTRACTFIFO_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_Array.h b/JuceLibraryCode/modules/juce_core/containers/juce_Array.h deleted file mode 100755 index b729c99..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_Array.h +++ /dev/null @@ -1,1137 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_ARRAY_H_INCLUDED -#define JUCE_ARRAY_H_INCLUDED - - -//============================================================================== -/** - Holds a resizable array of primitive or copy-by-value objects. - - Examples of arrays are: Array, Array or Array - - The Array class can be used to hold simple, non-polymorphic objects as well as primitive types - to - do so, the class must fulfil these requirements: - - it must have a copy constructor and assignment operator - - it must be able to be relocated in memory by a memcpy without this causing any problems - so - objects whose functionality relies on external pointers or references to themselves can not be used. - - You can of course have an array of pointers to any kind of object, e.g. Array, but if - you do this, the array doesn't take any ownership of the objects - see the OwnedArray class or the - ReferenceCountedArray class for more powerful ways of holding lists of objects. - - For holding lists of strings, you can use Array\, but it's usually better to use the - specialised class StringArray, which provides more useful functions. - - To make all the array's methods thread-safe, pass in "CriticalSection" as the templated - TypeOfCriticalSectionToUse parameter, instead of the default DummyCriticalSection. - - @see OwnedArray, ReferenceCountedArray, StringArray, CriticalSection -*/ -template -class Array -{ -private: - typedef PARAMETER_TYPE (ElementType) ParameterType; - -public: - //============================================================================== - /** Creates an empty array. */ - Array() noexcept : numUsed (0) - { - } - - /** Creates a copy of another array. - @param other the array to copy - */ - Array (const Array& other) - { - const ScopedLockType lock (other.getLock()); - numUsed = other.numUsed; - data.setAllocatedSize (other.numUsed); - - for (int i = 0; i < numUsed; ++i) - new (data.elements + i) ElementType (other.data.elements[i]); - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Array (Array&& other) noexcept - : data (static_cast&&> (other.data)), - numUsed (other.numUsed) - { - other.numUsed = 0; - } - #endif - - /** Initalises from a null-terminated C array of values. - - @param values the array to copy from - */ - template - explicit Array (const TypeToCreateFrom* values) : numUsed (0) - { - while (*values != TypeToCreateFrom()) - add (*values++); - } - - /** Initalises from a C array of values. - - @param values the array to copy from - @param numValues the number of values in the array - */ - template - Array (const TypeToCreateFrom* values, int numValues) : numUsed (numValues) - { - data.setAllocatedSize (numValues); - - for (int i = 0; i < numValues; ++i) - new (data.elements + i) ElementType (values[i]); - } - - #if JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS - template - Array (const std::initializer_list& items) : numUsed (0) - { - addArray (items); - } - #endif - - /** Destructor. */ - ~Array() - { - deleteAllElements(); - } - - /** Copies another array. - @param other the array to copy - */ - Array& operator= (const Array& other) - { - if (this != &other) - { - Array otherCopy (other); - swapWith (otherCopy); - } - - return *this; - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Array& operator= (Array&& other) noexcept - { - const ScopedLockType lock (getLock()); - deleteAllElements(); - data = static_cast&&> (other.data); - numUsed = other.numUsed; - other.numUsed = 0; - return *this; - } - #endif - - //============================================================================== - /** Compares this array to another one. - Two arrays are considered equal if they both contain the same set of - elements, in the same order. - @param other the other array to compare with - */ - template - bool operator== (const OtherArrayType& other) const - { - const ScopedLockType lock (getLock()); - const typename OtherArrayType::ScopedLockType lock2 (other.getLock()); - - if (numUsed != other.numUsed) - return false; - - for (int i = numUsed; --i >= 0;) - if (! (data.elements [i] == other.data.elements [i])) - return false; - - return true; - } - - /** Compares this array to another one. - Two arrays are considered equal if they both contain the same set of - elements, in the same order. - @param other the other array to compare with - */ - template - bool operator!= (const OtherArrayType& other) const - { - return ! operator== (other); - } - - //============================================================================== - /** Removes all elements from the array. - This will remove all the elements, and free any storage that the array is - using. To clear the array without freeing the storage, use the clearQuick() - method instead. - - @see clearQuick - */ - void clear() - { - const ScopedLockType lock (getLock()); - deleteAllElements(); - data.setAllocatedSize (0); - numUsed = 0; - } - - /** Removes all elements from the array without freeing the array's allocated storage. - @see clear - */ - void clearQuick() - { - const ScopedLockType lock (getLock()); - deleteAllElements(); - numUsed = 0; - } - - //============================================================================== - /** Returns the current number of elements in the array. - */ - inline int size() const noexcept - { - return numUsed; - } - - /** Returns one of the elements in the array. - If the index passed in is beyond the range of valid elements, this - will return a default value. - - If you're certain that the index will always be a valid element, you - can call getUnchecked() instead, which is faster. - - @param index the index of the element being requested (0 is the first element in the array) - @see getUnchecked, getFirst, getLast - */ - ElementType operator[] (const int index) const - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (index, numUsed)) - { - jassert (data.elements != nullptr); - return data.elements [index]; - } - - return ElementType(); - } - - /** Returns one of the elements in the array, without checking the index passed in. - - Unlike the operator[] method, this will try to return an element without - checking that the index is within the bounds of the array, so should only - be used when you're confident that it will always be a valid index. - - @param index the index of the element being requested (0 is the first element in the array) - @see operator[], getFirst, getLast - */ - inline ElementType getUnchecked (const int index) const - { - const ScopedLockType lock (getLock()); - jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr); - return data.elements [index]; - } - - /** Returns a direct reference to one of the elements in the array, without checking the index passed in. - - This is like getUnchecked, but returns a direct reference to the element, so that - you can alter it directly. Obviously this can be dangerous, so only use it when - absolutely necessary. - - @param index the index of the element being requested (0 is the first element in the array) - @see operator[], getFirst, getLast - */ - inline ElementType& getReference (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr); - return data.elements [index]; - } - - /** Returns the first element in the array, or a default value if the array is empty. - - @see operator[], getUnchecked, getLast - */ - inline ElementType getFirst() const - { - const ScopedLockType lock (getLock()); - - if (numUsed > 0) - { - jassert (data.elements != nullptr); - return data.elements[0]; - } - - return ElementType(); - } - - /** Returns the last element in the array, or a default value if the array is empty. - - @see operator[], getUnchecked, getFirst - */ - inline ElementType getLast() const - { - const ScopedLockType lock (getLock()); - - if (numUsed > 0) - { - jassert (data.elements != nullptr); - return data.elements[numUsed - 1]; - } - - return ElementType(); - } - - /** Returns a pointer to the actual array data. - This pointer will only be valid until the next time a non-const method - is called on the array. - */ - inline ElementType* getRawDataPointer() noexcept - { - return data.elements; - } - - //============================================================================== - /** Returns a pointer to the first element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ElementType* begin() const noexcept - { - return data.elements; - } - - /** Returns a pointer to the element which follows the last element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ElementType* end() const noexcept - { - #if JUCE_DEBUG - if (data.elements == nullptr || numUsed <= 0) // (to keep static analysers happy) - return data.elements; - #endif - - return data.elements + numUsed; - } - - //============================================================================== - /** Finds the index of the first element which matches the value passed in. - - This will search the array for the given object, and return the index - of its first occurrence. If the object isn't found, the method will return -1. - - @param elementToLookFor the value or object to look for - @returns the index of the object, or -1 if it's not found - */ - int indexOf (ParameterType elementToLookFor) const - { - const ScopedLockType lock (getLock()); - const ElementType* e = data.elements.getData(); - const ElementType* const end_ = e + numUsed; - - for (; e != end_; ++e) - if (elementToLookFor == *e) - return static_cast (e - data.elements.getData()); - - return -1; - } - - /** Returns true if the array contains at least one occurrence of an object. - - @param elementToLookFor the value or object to look for - @returns true if the item is found - */ - bool contains (ParameterType elementToLookFor) const - { - const ScopedLockType lock (getLock()); - const ElementType* e = data.elements.getData(); - const ElementType* const end_ = e + numUsed; - - for (; e != end_; ++e) - if (elementToLookFor == *e) - return true; - - return false; - } - - //============================================================================== - /** Appends a new element at the end of the array. - - @param newElement the new object to add to the array - @see set, insert, addIfNotAlreadyThere, addSorted, addUsingDefaultSort, addArray - */ - void add (const ElementType& newElement) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - new (data.elements + numUsed++) ElementType (newElement); - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - /** Appends a new element at the end of the array. - - @param newElement the new object to add to the array - @see set, insert, addIfNotAlreadyThere, addSorted, addUsingDefaultSort, addArray - */ - void add (ElementType&& newElement) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - new (data.elements + numUsed++) ElementType (static_cast (newElement)); - } - #endif - - /** Inserts a new element into the array at a given position. - - If the index is less than 0 or greater than the size of the array, the - element will be added to the end of the array. - Otherwise, it will be inserted into the array, moving all the later elements - along to make room. - - @param indexToInsertAt the index at which the new element should be - inserted (pass in -1 to add it to the end) - @param newElement the new object to add to the array - @see add, addSorted, addUsingDefaultSort, set - */ - void insert (int indexToInsertAt, ParameterType newElement) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - jassert (data.elements != nullptr); - - if (isPositiveAndBelow (indexToInsertAt, numUsed)) - { - ElementType* const insertPos = data.elements + indexToInsertAt; - const int numberToMove = numUsed - indexToInsertAt; - - if (numberToMove > 0) - memmove (insertPos + 1, insertPos, ((size_t) numberToMove) * sizeof (ElementType)); - - new (insertPos) ElementType (newElement); - ++numUsed; - } - else - { - new (data.elements + numUsed++) ElementType (newElement); - } - } - - /** Inserts multiple copies of an element into the array at a given position. - - If the index is less than 0 or greater than the size of the array, the - element will be added to the end of the array. - Otherwise, it will be inserted into the array, moving all the later elements - along to make room. - - @param indexToInsertAt the index at which the new element should be inserted - @param newElement the new object to add to the array - @param numberOfTimesToInsertIt how many copies of the value to insert - @see insert, add, addSorted, set - */ - void insertMultiple (int indexToInsertAt, ParameterType newElement, - int numberOfTimesToInsertIt) - { - if (numberOfTimesToInsertIt > 0) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + numberOfTimesToInsertIt); - ElementType* insertPos; - - if (isPositiveAndBelow (indexToInsertAt, numUsed)) - { - insertPos = data.elements + indexToInsertAt; - const int numberToMove = numUsed - indexToInsertAt; - memmove (insertPos + numberOfTimesToInsertIt, insertPos, ((size_t) numberToMove) * sizeof (ElementType)); - } - else - { - insertPos = data.elements + numUsed; - } - - numUsed += numberOfTimesToInsertIt; - - while (--numberOfTimesToInsertIt >= 0) - { - new (insertPos) ElementType (newElement); - ++insertPos; // NB: this increment is done separately from the - // new statement to avoid a compiler bug in VS2014 - } - } - } - - /** Inserts an array of values into this array at a given position. - - If the index is less than 0 or greater than the size of the array, the - new elements will be added to the end of the array. - Otherwise, they will be inserted into the array, moving all the later elements - along to make room. - - @param indexToInsertAt the index at which the first new element should be inserted - @param newElements the new values to add to the array - @param numberOfElements how many items are in the array - @see insert, add, addSorted, set - */ - void insertArray (int indexToInsertAt, - const ElementType* newElements, - int numberOfElements) - { - if (numberOfElements > 0) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + numberOfElements); - ElementType* insertPos = data.elements; - - if (isPositiveAndBelow (indexToInsertAt, numUsed)) - { - insertPos += indexToInsertAt; - const int numberToMove = numUsed - indexToInsertAt; - memmove (insertPos + numberOfElements, insertPos, numberToMove * sizeof (ElementType)); - } - else - { - insertPos += numUsed; - } - - numUsed += numberOfElements; - - while (--numberOfElements >= 0) - new (insertPos++) ElementType (*newElements++); - } - } - - /** Appends a new element at the end of the array as long as the array doesn't - already contain it. - - If the array already contains an element that matches the one passed in, nothing - will be done. - - @param newElement the new object to add to the array - */ - void addIfNotAlreadyThere (ParameterType newElement) - { - const ScopedLockType lock (getLock()); - - if (! contains (newElement)) - add (newElement); - } - - /** Replaces an element with a new value. - - If the index is less than zero, this method does nothing. - If the index is beyond the end of the array, the item is added to the end of the array. - - @param indexToChange the index whose value you want to change - @param newValue the new value to set for this index. - @see add, insert - */ - void set (const int indexToChange, ParameterType newValue) - { - jassert (indexToChange >= 0); - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToChange, numUsed)) - { - jassert (data.elements != nullptr); - data.elements [indexToChange] = newValue; - } - else if (indexToChange >= 0) - { - data.ensureAllocatedSize (numUsed + 1); - new (data.elements + numUsed++) ElementType (newValue); - } - } - - /** Replaces an element with a new value without doing any bounds-checking. - - This just sets a value directly in the array's internal storage, so you'd - better make sure it's in range! - - @param indexToChange the index whose value you want to change - @param newValue the new value to set for this index. - @see set, getUnchecked - */ - void setUnchecked (const int indexToChange, ParameterType newValue) - { - const ScopedLockType lock (getLock()); - jassert (isPositiveAndBelow (indexToChange, numUsed)); - data.elements [indexToChange] = newValue; - } - - /** Adds elements from an array to the end of this array. - - @param elementsToAdd an array of some kind of object from which elements - can be constructed. - @param numElementsToAdd how many elements are in this other array - @see add - */ - template - void addArray (const Type* elementsToAdd, int numElementsToAdd) - { - const ScopedLockType lock (getLock()); - - if (numElementsToAdd > 0) - { - data.ensureAllocatedSize (numUsed + numElementsToAdd); - - while (--numElementsToAdd >= 0) - { - new (data.elements + numUsed) ElementType (*elementsToAdd++); - ++numUsed; - } - } - } - - #if JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS - template - void addArray (const std::initializer_list& items) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + (int) items.size()); - - for (auto& item : items) - { - new (data.elements + numUsed) ElementType (item); - ++numUsed; - } - } - #endif - - /** Adds elements from a null-terminated array of pointers to the end of this array. - - @param elementsToAdd an array of pointers to some kind of object from which elements - can be constructed. This array must be terminated by a nullptr - @see addArray - */ - template - void addNullTerminatedArray (const Type* const* elementsToAdd) - { - int num = 0; - for (const Type* const* e = elementsToAdd; *e != nullptr; ++e) - ++num; - - addArray (elementsToAdd, num); - } - - /** This swaps the contents of this array with those of another array. - - If you need to exchange two arrays, this is vastly quicker than using copy-by-value - because it just swaps their internal pointers. - */ - template - void swapWith (OtherArrayType& otherArray) noexcept - { - const ScopedLockType lock1 (getLock()); - const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock()); - data.swapWith (otherArray.data); - std::swap (numUsed, otherArray.numUsed); - } - - /** Adds elements from another array to the end of this array. - - @param arrayToAddFrom the array from which to copy the elements - @param startIndex the first element of the other array to start copying from - @param numElementsToAdd how many elements to add from the other array. If this - value is negative or greater than the number of available elements, - all available elements will be copied. - @see add - */ - template - void addArray (const OtherArrayType& arrayToAddFrom, - int startIndex = 0, - int numElementsToAdd = -1) - { - const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock()); - - { - const ScopedLockType lock2 (getLock()); - - if (startIndex < 0) - { - jassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size()) - numElementsToAdd = arrayToAddFrom.size() - startIndex; - - while (--numElementsToAdd >= 0) - add (arrayToAddFrom.getUnchecked (startIndex++)); - } - } - - /** This will enlarge or shrink the array to the given number of elements, by adding - or removing items from its end. - - If the array is smaller than the given target size, empty elements will be appended - until its size is as specified. If its size is larger than the target, items will be - removed from its end to shorten it. - */ - void resize (const int targetNumItems) - { - jassert (targetNumItems >= 0); - - const int numToAdd = targetNumItems - numUsed; - if (numToAdd > 0) - insertMultiple (numUsed, ElementType(), numToAdd); - else if (numToAdd < 0) - removeRange (targetNumItems, -numToAdd); - } - - /** Inserts a new element into the array, assuming that the array is sorted. - - This will use a comparator to find the position at which the new element - should go. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator to use to compare the elements - see the sort() - method for details about the form this object should take - @param newElement the new element to insert to the array - @returns the index at which the new item was added - @see addUsingDefaultSort, add, sort - */ - template - int addSorted (ElementComparator& comparator, ParameterType newElement) - { - const ScopedLockType lock (getLock()); - const int index = findInsertIndexInSortedArray (comparator, data.elements.getData(), newElement, 0, numUsed); - insert (index, newElement); - return index; - } - - /** Inserts a new element into the array, assuming that the array is sorted. - - This will use the DefaultElementComparator class for sorting, so your ElementType - must be suitable for use with that class. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param newElement the new element to insert to the array - @see addSorted, sort - */ - void addUsingDefaultSort (ParameterType newElement) - { - DefaultElementComparator comparator; - addSorted (comparator, newElement); - } - - /** Finds the index of an element in the array, assuming that the array is sorted. - - This will use a comparator to do a binary-chop to find the index of the given - element, if it exists. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator to use to compare the elements - see the sort() - method for details about the form this object should take - @param elementToLookFor the element to search for - @returns the index of the element, or -1 if it's not found - @see addSorted, sort - */ - template - int indexOfSorted (ElementComparator& comparator, TargetValueType elementToLookFor) const - { - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - const ScopedLockType lock (getLock()); - - for (int s = 0, e = numUsed;;) - { - if (s >= e) - return -1; - - if (comparator.compareElements (elementToLookFor, data.elements [s]) == 0) - return s; - - const int halfway = (s + e) / 2; - if (halfway == s) - return -1; - - if (comparator.compareElements (elementToLookFor, data.elements [halfway]) >= 0) - s = halfway; - else - e = halfway; - } - } - - //============================================================================== - /** Removes an element from the array. - - This will remove the element at a given index, and move back - all the subsequent elements to close the gap. - If the index passed in is out-of-range, nothing will happen. - - @param indexToRemove the index of the element to remove - @returns the element that has been removed - @see removeFirstMatchingValue, removeAllInstancesOf, removeRange - */ - ElementType remove (const int indexToRemove) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - jassert (data.elements != nullptr); - ElementType removed (data.elements[indexToRemove]); - removeInternal (indexToRemove); - return removed; - } - - return ElementType(); - } - - /** Removes an item from the array. - - This will remove the first occurrence of the given element from the array. - If the item isn't found, no action is taken. - - @param valueToRemove the object to try to remove - @see remove, removeRange - */ - void removeFirstMatchingValue (ParameterType valueToRemove) - { - const ScopedLockType lock (getLock()); - ElementType* const e = data.elements; - - for (int i = 0; i < numUsed; ++i) - { - if (valueToRemove == e[i]) - { - removeInternal (i); - break; - } - } - } - - /** Removes an item from the array. - - This will remove the first occurrence of the given element from the array. - If the item isn't found, no action is taken. - - @param valueToRemove the object to try to remove - @see remove, removeRange - */ - void removeAllInstancesOf (ParameterType valueToRemove) - { - const ScopedLockType lock (getLock()); - - for (int i = numUsed; --i >= 0;) - if (valueToRemove == data.elements[i]) - removeInternal (i); - } - - /** Removes a range of elements from the array. - - This will remove a set of elements, starting from the given index, - and move subsequent elements down to close the gap. - - If the range extends beyond the bounds of the array, it will - be safely clipped to the size of the array. - - @param startIndex the index of the first element to remove - @param numberToRemove how many elements should be removed - @see remove, removeFirstMatchingValue, removeAllInstancesOf - */ - void removeRange (int startIndex, int numberToRemove) - { - const ScopedLockType lock (getLock()); - const int endIndex = jlimit (0, numUsed, startIndex + numberToRemove); - startIndex = jlimit (0, numUsed, startIndex); - - if (endIndex > startIndex) - { - ElementType* const e = data.elements + startIndex; - - numberToRemove = endIndex - startIndex; - for (int i = 0; i < numberToRemove; ++i) - e[i].~ElementType(); - - const int numToShift = numUsed - endIndex; - if (numToShift > 0) - memmove (e, e + numberToRemove, ((size_t) numToShift) * sizeof (ElementType)); - - numUsed -= numberToRemove; - minimiseStorageAfterRemoval(); - } - } - - /** Removes the last n elements from the array. - - @param howManyToRemove how many elements to remove from the end of the array - @see remove, removeFirstMatchingValue, removeAllInstancesOf, removeRange - */ - void removeLast (int howManyToRemove = 1) - { - const ScopedLockType lock (getLock()); - - if (howManyToRemove > numUsed) - howManyToRemove = numUsed; - - for (int i = 1; i <= howManyToRemove; ++i) - data.elements [numUsed - i].~ElementType(); - - numUsed -= howManyToRemove; - minimiseStorageAfterRemoval(); - } - - /** Removes any elements which are also in another array. - - @param otherArray the other array in which to look for elements to remove - @see removeValuesNotIn, remove, removeFirstMatchingValue, removeAllInstancesOf, removeRange - */ - template - void removeValuesIn (const OtherArrayType& otherArray) - { - const typename OtherArrayType::ScopedLockType lock1 (otherArray.getLock()); - const ScopedLockType lock2 (getLock()); - - if (this == &otherArray) - { - clear(); - } - else - { - if (otherArray.size() > 0) - { - for (int i = numUsed; --i >= 0;) - if (otherArray.contains (data.elements [i])) - removeInternal (i); - } - } - } - - /** Removes any elements which are not found in another array. - - Only elements which occur in this other array will be retained. - - @param otherArray the array in which to look for elements NOT to remove - @see removeValuesIn, remove, removeFirstMatchingValue, removeAllInstancesOf, removeRange - */ - template - void removeValuesNotIn (const OtherArrayType& otherArray) - { - const typename OtherArrayType::ScopedLockType lock1 (otherArray.getLock()); - const ScopedLockType lock2 (getLock()); - - if (this != &otherArray) - { - if (otherArray.size() <= 0) - { - clear(); - } - else - { - for (int i = numUsed; --i >= 0;) - if (! otherArray.contains (data.elements [i])) - removeInternal (i); - } - } - } - - /** Swaps over two elements in the array. - - This swaps over the elements found at the two indexes passed in. - If either index is out-of-range, this method will do nothing. - - @param index1 index of one of the elements to swap - @param index2 index of the other element to swap - */ - void swap (const int index1, - const int index2) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (index1, numUsed) - && isPositiveAndBelow (index2, numUsed)) - { - std::swap (data.elements [index1], - data.elements [index2]); - } - } - - /** Moves one of the values to a different position. - - This will move the value to a specified index, shuffling along - any intervening elements as required. - - So for example, if you have the array { 0, 1, 2, 3, 4, 5 } then calling - move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }. - - @param currentIndex the index of the value to be moved. If this isn't a - valid index, then nothing will be done - @param newIndex the index at which you'd like this value to end up. If this - is less than zero, the value will be moved to the end - of the array - */ - void move (const int currentIndex, int newIndex) noexcept - { - if (currentIndex != newIndex) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (currentIndex, numUsed)) - { - if (! isPositiveAndBelow (newIndex, numUsed)) - newIndex = numUsed - 1; - - char tempCopy [sizeof (ElementType)]; - memcpy (tempCopy, data.elements + currentIndex, sizeof (ElementType)); - - if (newIndex > currentIndex) - { - memmove (data.elements + currentIndex, - data.elements + currentIndex + 1, - sizeof (ElementType) * (size_t) (newIndex - currentIndex)); - } - else - { - memmove (data.elements + newIndex + 1, - data.elements + newIndex, - sizeof (ElementType) * (size_t) (currentIndex - newIndex)); - } - - memcpy (data.elements + newIndex, tempCopy, sizeof (ElementType)); - } - } - } - - //============================================================================== - /** Reduces the amount of storage being used by the array. - - Arrays typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads() - { - const ScopedLockType lock (getLock()); - data.shrinkToNoMoreThan (numUsed); - } - - /** Increases the array's internal storage to hold a minimum number of elements. - - Calling this before adding a large known number of elements means that - the array won't have to keep dynamically resizing itself as the elements - are added, and it'll therefore be more efficient. - */ - void ensureStorageAllocated (const int minNumElements) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (minNumElements); - } - - //============================================================================== - /** Sorts the elements in the array. - - This will use a comparator object to sort the elements into order. The object - passed must have a method of the form: - @code - int compareElements (ElementType first, ElementType second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator the comparator to use for comparing elements. - @param retainOrderOfEquivalentItems if this is true, then items - which the comparator says are equivalent will be - kept in the order in which they currently appear - in the array. This is slower to perform, but may - be important in some cases. If it's false, a faster - algorithm is used, but equivalent elements may be - rearranged. - - @see addSorted, indexOfSorted, sortArray - */ - template - void sort (ElementComparator& comparator, - const bool retainOrderOfEquivalentItems = false) const - { - const ScopedLockType lock (getLock()); - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - sortArray (comparator, data.elements.getData(), 0, size() - 1, retainOrderOfEquivalentItems); - } - - //============================================================================== - /** Returns the CriticalSection that locks this array. - To lock, you can call getLock().enter() and getLock().exit(), or preferably use - an object of ScopedLockType as an RAII lock for it. - */ - inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data; } - - /** Returns the type of scoped lock to use for locking this array */ - typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType; - - - //============================================================================== - #ifndef DOXYGEN - // Note that the swapWithArray method has been replaced by a more flexible templated version, - // and renamed "swapWith" to be more consistent with the names used in other classes. - JUCE_DEPRECATED_WITH_BODY (void swapWithArray (Array& other) noexcept, { swapWith (other); }) - #endif - -private: - //============================================================================== - ArrayAllocationBase data; - int numUsed; - - void removeInternal (const int indexToRemove) - { - --numUsed; - ElementType* const e = data.elements + indexToRemove; - e->~ElementType(); - const int numberToShift = numUsed - indexToRemove; - - if (numberToShift > 0) - memmove (e, e + 1, ((size_t) numberToShift) * sizeof (ElementType)); - - minimiseStorageAfterRemoval(); - } - - inline void deleteAllElements() noexcept - { - for (int i = 0; i < numUsed; ++i) - data.elements[i].~ElementType(); - } - - void minimiseStorageAfterRemoval() - { - if (data.numAllocated > jmax (minimumAllocatedSize, numUsed * 2)) - data.shrinkToNoMoreThan (jmax (numUsed, jmax (minimumAllocatedSize, 64 / (int) sizeof (ElementType)))); - } -}; - - -#endif // JUCE_ARRAY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h b/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h deleted file mode 100755 index cfbe464..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_ArrayAllocationBase.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_ARRAYALLOCATIONBASE_H_INCLUDED -#define JUCE_ARRAYALLOCATIONBASE_H_INCLUDED - - -//============================================================================== -/** - Implements some basic array storage allocation functions. - - This class isn't really for public use - it's used by the other - array classes, but might come in handy for some purposes. - - It inherits from a critical section class to allow the arrays to use - the "empty base class optimisation" pattern to reduce their footprint. - - @see Array, OwnedArray, ReferenceCountedArray -*/ -template -class ArrayAllocationBase : public TypeOfCriticalSectionToUse -{ -public: - //============================================================================== - /** Creates an empty array. */ - ArrayAllocationBase() noexcept - : numAllocated (0) - { - } - - /** Destructor. */ - ~ArrayAllocationBase() noexcept - { - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - ArrayAllocationBase (ArrayAllocationBase&& other) noexcept - : elements (static_cast &&> (other.elements)), - numAllocated (other.numAllocated) - { - } - - ArrayAllocationBase& operator= (ArrayAllocationBase&& other) noexcept - { - elements = static_cast &&> (other.elements); - numAllocated = other.numAllocated; - return *this; - } - #endif - - //============================================================================== - /** Changes the amount of storage allocated. - - This will retain any data currently held in the array, and either add or - remove extra space at the end. - - @param numElements the number of elements that are needed - */ - void setAllocatedSize (const int numElements) - { - if (numAllocated != numElements) - { - if (numElements > 0) - elements.realloc ((size_t) numElements); - else - elements.free(); - - numAllocated = numElements; - } - } - - /** Increases the amount of storage allocated if it is less than a given amount. - - This will retain any data currently held in the array, but will add - extra space at the end to make sure there it's at least as big as the size - passed in. If it's already bigger, no action is taken. - - @param minNumElements the minimum number of elements that are needed - */ - void ensureAllocatedSize (const int minNumElements) - { - if (minNumElements > numAllocated) - setAllocatedSize ((minNumElements + minNumElements / 2 + 8) & ~7); - - jassert (numAllocated <= 0 || elements != nullptr); - } - - /** Minimises the amount of storage allocated so that it's no more than - the given number of elements. - */ - void shrinkToNoMoreThan (const int maxNumElements) - { - if (maxNumElements < numAllocated) - setAllocatedSize (maxNumElements); - } - - /** Swap the contents of two objects. */ - void swapWith (ArrayAllocationBase & other) noexcept - { - elements.swapWith (other.elements); - std::swap (numAllocated, other.numAllocated); - } - - //============================================================================== - HeapBlock elements; - int numAllocated; - -private: - JUCE_DECLARE_NON_COPYABLE (ArrayAllocationBase) -}; - - -#endif // JUCE_ARRAYALLOCATIONBASE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp b/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp deleted file mode 100755 index 3351f19..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -DynamicObject::DynamicObject() -{ -} - -DynamicObject::DynamicObject (const DynamicObject& other) - : ReferenceCountedObject(), properties (other.properties) -{ -} - -DynamicObject::~DynamicObject() -{ -} - -bool DynamicObject::hasProperty (const Identifier& propertyName) const -{ - const var* const v = properties.getVarPointer (propertyName); - return v != nullptr && ! v->isMethod(); -} - -const var& DynamicObject::getProperty (const Identifier& propertyName) const -{ - return properties [propertyName]; -} - -void DynamicObject::setProperty (const Identifier& propertyName, const var& newValue) -{ - properties.set (propertyName, newValue); -} - -void DynamicObject::removeProperty (const Identifier& propertyName) -{ - properties.remove (propertyName); -} - -bool DynamicObject::hasMethod (const Identifier& methodName) const -{ - return getProperty (methodName).isMethod(); -} - -var DynamicObject::invokeMethod (Identifier method, const var::NativeFunctionArgs& args) -{ - if (var::NativeFunction function = properties [method].getNativeFunction()) - return function (args); - - return var(); -} - -void DynamicObject::setMethod (Identifier name, var::NativeFunction function) -{ - properties.set (name, var (function)); -} - -void DynamicObject::clear() -{ - properties.clear(); -} - -void DynamicObject::cloneAllProperties() -{ - for (int i = properties.size(); --i >= 0;) - if (var* v = properties.getVarPointerAt (i)) - *v = v->clone(); -} - -DynamicObject::Ptr DynamicObject::clone() -{ - Ptr d (new DynamicObject (*this)); - d->cloneAllProperties(); - return d; -} - -void DynamicObject::writeAsJSON (OutputStream& out, const int indentLevel, const bool allOnOneLine) -{ - out << '{'; - if (! allOnOneLine) - out << newLine; - - const int numValues = properties.size(); - - for (int i = 0; i < numValues; ++i) - { - if (! allOnOneLine) - JSONFormatter::writeSpaces (out, indentLevel + JSONFormatter::indentSize); - - out << '"'; - JSONFormatter::writeString (out, properties.getName (i)); - out << "\": "; - JSONFormatter::write (out, properties.getValueAt (i), indentLevel + JSONFormatter::indentSize, allOnOneLine); - - if (i < numValues - 1) - { - if (allOnOneLine) - out << ", "; - else - out << ',' << newLine; - } - else if (! allOnOneLine) - out << newLine; - } - - if (! allOnOneLine) - JSONFormatter::writeSpaces (out, indentLevel); - - out << '}'; -} diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h b/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h deleted file mode 100755 index 598df6e..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_DynamicObject.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_DYNAMICOBJECT_H_INCLUDED -#define JUCE_DYNAMICOBJECT_H_INCLUDED - - -//============================================================================== -/** - Represents a dynamically implemented object. - - This class is primarily intended for wrapping scripting language objects, - but could be used for other purposes. - - An instance of a DynamicObject can be used to store named properties, and - by subclassing hasMethod() and invokeMethod(), you can give your object - methods. -*/ -class JUCE_API DynamicObject : public ReferenceCountedObject -{ -public: - //============================================================================== - DynamicObject(); - DynamicObject (const DynamicObject&); - ~DynamicObject(); - - typedef ReferenceCountedObjectPtr Ptr; - - //============================================================================== - /** Returns true if the object has a property with this name. - Note that if the property is actually a method, this will return false. - */ - virtual bool hasProperty (const Identifier& propertyName) const; - - /** Returns a named property. - This returns var::null if no such property exists. - */ - virtual const var& getProperty (const Identifier& propertyName) const; - - /** Sets a named property. */ - virtual void setProperty (const Identifier& propertyName, const var& newValue); - - /** Removes a named property. */ - virtual void removeProperty (const Identifier& propertyName); - - //============================================================================== - /** Checks whether this object has the specified method. - - The default implementation of this just checks whether there's a property - with this name that's actually a method, but this can be overridden for - building objects with dynamic invocation. - */ - virtual bool hasMethod (const Identifier& methodName) const; - - /** Invokes a named method on this object. - - The default implementation looks up the named property, and if it's a method - call, then it invokes it. - - This method is virtual to allow more dynamic invocation to used for objects - where the methods may not already be set as properies. - */ - virtual var invokeMethod (Identifier methodName, - const var::NativeFunctionArgs& args); - - /** Adds a method to the class. - - This is basically the same as calling setProperty (methodName, (var::NativeFunction) myFunction), but - helps to avoid accidentally invoking the wrong type of var constructor. It also makes - the code easier to read, - */ - void setMethod (Identifier methodName, var::NativeFunction function); - - //============================================================================== - /** Removes all properties and methods from the object. */ - void clear(); - - /** Returns the NamedValueSet that holds the object's properties. */ - NamedValueSet& getProperties() noexcept { return properties; } - - /** Calls var::clone() on all the properties that this object contains. */ - void cloneAllProperties(); - - //============================================================================== - /** Returns a clone of this object. - The default implementation of this method just returns a new DynamicObject - with a (deep) copy of all of its properties. Subclasses can override this to - implement their own custom copy routines. - */ - virtual Ptr clone(); - - //============================================================================== - /** Writes this object to a text stream in JSON format. - This method is used by JSON::toString and JSON::writeToStream, and you should - never need to call it directly, but it's virtual so that custom object types - can stringify themselves appropriately. - */ - virtual void writeAsJSON (OutputStream&, int indentLevel, bool allOnOneLine); - -private: - //============================================================================== - NamedValueSet properties; - - #if JUCE_CATCH_DEPRECATED_CODE_MISUSE - // These methods have been deprecated - use var::invoke instead - virtual void invokeMethod (const Identifier&, const var*, int) {} - #endif - - JUCE_LEAK_DETECTOR (DynamicObject) -}; - - - -#endif // JUCE_DYNAMICOBJECT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h b/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h deleted file mode 100755 index 01dc5b7..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_ElementComparator.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_ELEMENTCOMPARATOR_H_INCLUDED -#define JUCE_ELEMENTCOMPARATOR_H_INCLUDED - -#ifndef DOXYGEN - -/** This is an internal helper class which converts a juce ElementComparator style - class (using a "compareElements" method) into a class that's compatible with - std::sort (i.e. using an operator() to compare the elements) -*/ -template -struct SortFunctionConverter -{ - SortFunctionConverter (ElementComparator& e) : comparator (e) {} - - template - bool operator() (Type a, Type b) { return comparator.compareElements (a, b) < 0; } - -private: - ElementComparator& comparator; - SortFunctionConverter& operator= (const SortFunctionConverter&) JUCE_DELETED_FUNCTION; -}; - -#endif - - -//============================================================================== -/** - Sorts a range of elements in an array. - - The comparator object that is passed-in must define a public method with the following - signature: - @code - int compareElements (ElementType first, ElementType second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator an object which defines a compareElements() method - @param array the array to sort - @param firstElement the index of the first element of the range to be sorted - @param lastElement the index of the last element in the range that needs - sorting (this is inclusive) - @param retainOrderOfEquivalentItems if true, the order of items that the - comparator deems the same will be maintained - this will be - a slower algorithm than if they are allowed to be moved around. - - @see sortArrayRetainingOrder -*/ -template -static void sortArray (ElementComparator& comparator, - ElementType* const array, - int firstElement, - int lastElement, - const bool retainOrderOfEquivalentItems) -{ - SortFunctionConverter converter (comparator); - - if (retainOrderOfEquivalentItems) - std::stable_sort (array + firstElement, array + lastElement + 1, converter); - else - std::sort (array + firstElement, array + lastElement + 1, converter); -} - - -//============================================================================== -/** - Searches a sorted array of elements, looking for the index at which a specified value - should be inserted for it to be in the correct order. - - The comparator object that is passed-in must define a public method with the following - signature: - @code - int compareElements (ElementType first, ElementType second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator an object which defines a compareElements() method - @param array the array to search - @param newElement the value that is going to be inserted - @param firstElement the index of the first element to search - @param lastElement the index of the last element in the range (this is non-inclusive) -*/ -template -static int findInsertIndexInSortedArray (ElementComparator& comparator, - ElementType* const array, - const ElementType newElement, - int firstElement, - int lastElement) -{ - jassert (firstElement <= lastElement); - - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - while (firstElement < lastElement) - { - if (comparator.compareElements (newElement, array [firstElement]) == 0) - { - ++firstElement; - break; - } - else - { - const int halfway = (firstElement + lastElement) >> 1; - - if (halfway == firstElement) - { - if (comparator.compareElements (newElement, array [halfway]) >= 0) - ++firstElement; - - break; - } - else if (comparator.compareElements (newElement, array [halfway]) >= 0) - { - firstElement = halfway; - } - else - { - lastElement = halfway; - } - } - } - - return firstElement; -} - -//============================================================================== -/** - A simple ElementComparator class that can be used to sort an array of - objects that support the '<' operator. - - This will work for primitive types and objects that implement operator<(). - - Example: @code - Array myArray; - DefaultElementComparator sorter; - myArray.sort (sorter); - @endcode - - @see ElementComparator -*/ -template -class DefaultElementComparator -{ -private: - typedef PARAMETER_TYPE (ElementType) ParameterType; - -public: - static int compareElements (ParameterType first, ParameterType second) - { - return (first < second) ? -1 : ((second < first) ? 1 : 0); - } -}; - - -#endif // JUCE_ELEMENTCOMPARATOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h b/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h deleted file mode 100755 index 07d02b4..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_HashMap.h +++ /dev/null @@ -1,455 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_HASHMAP_H_INCLUDED -#define JUCE_HASHMAP_H_INCLUDED - - -//============================================================================== -/** - A simple class to generate hash functions for some primitive types, intended for - use with the HashMap class. - @see HashMap -*/ -struct DefaultHashFunctions -{ - /** Generates a simple hash from an integer. */ - int generateHash (const int key, const int upperLimit) const noexcept { return std::abs (key) % upperLimit; } - /** Generates a simple hash from an int64. */ - int generateHash (const int64 key, const int upperLimit) const noexcept { return std::abs ((int) key) % upperLimit; } - /** Generates a simple hash from a string. */ - int generateHash (const String& key, const int upperLimit) const noexcept { return (int) (((uint32) key.hashCode()) % (uint32) upperLimit); } - /** Generates a simple hash from a variant. */ - int generateHash (const var& key, const int upperLimit) const noexcept { return generateHash (key.toString(), upperLimit); } -}; - - -//============================================================================== -/** - Holds a set of mappings between some key/value pairs. - - The types of the key and value objects are set as template parameters. - You can also specify a class to supply a hash function that converts a key value - into an hashed integer. This class must have the form: - - @code - struct MyHashGenerator - { - int generateHash (MyKeyType key, int upperLimit) const - { - // The function must return a value 0 <= x < upperLimit - return someFunctionOfMyKeyType (key) % upperLimit; - } - }; - @endcode - - Like the Array class, the key and value types are expected to be copy-by-value - types, so if you define them to be pointer types, this class won't delete the - objects that they point to. - - If you don't supply a class for the HashFunctionType template parameter, the - default one provides some simple mappings for strings and ints. - - @code - HashMap hash; - hash.set (1, "item1"); - hash.set (2, "item2"); - - DBG (hash [1]); // prints "item1" - DBG (hash [2]); // prints "item2" - - // This iterates the map, printing all of its key -> value pairs.. - for (HashMap::Iterator i (hash); i.next();) - DBG (i.getKey() << " -> " << i.getValue()); - @endcode - - @tparam HashFunctionType The class of hash function, which must be copy-constructible. - @see CriticalSection, DefaultHashFunctions, NamedValueSet, SortedSet -*/ -template -class HashMap -{ -private: - typedef PARAMETER_TYPE (KeyType) KeyTypeParameter; - typedef PARAMETER_TYPE (ValueType) ValueTypeParameter; - -public: - //============================================================================== - /** Creates an empty hash-map. - - @param numberOfSlots Specifies the number of hash entries the map will use. This will be - the "upperLimit" parameter that is passed to your generateHash() - function. The number of hash slots will grow automatically if necessary, - or it can be remapped manually using remapTable(). - @param hashFunction An instance of HashFunctionType, which will be copied and - stored to use with the HashMap. This parameter can be omitted - if HashFunctionType has a default constructor. - */ - explicit HashMap (int numberOfSlots = defaultHashTableSize, - HashFunctionType hashFunction = HashFunctionType()) - : hashFunctionToUse (hashFunction), totalNumItems (0) - { - hashSlots.insertMultiple (0, nullptr, numberOfSlots); - } - - /** Destructor. */ - ~HashMap() - { - clear(); - } - - //============================================================================== - /** Removes all values from the map. - Note that this will clear the content, but won't affect the number of slots (see - remapTable and getNumSlots). - */ - void clear() - { - const ScopedLockType sl (getLock()); - - for (int i = hashSlots.size(); --i >= 0;) - { - HashEntry* h = hashSlots.getUnchecked(i); - - while (h != nullptr) - { - const ScopedPointer deleter (h); - h = h->nextEntry; - } - - hashSlots.set (i, nullptr); - } - - totalNumItems = 0; - } - - //============================================================================== - /** Returns the current number of items in the map. */ - inline int size() const noexcept - { - return totalNumItems; - } - - /** Returns the value corresponding to a given key. - If the map doesn't contain the key, a default instance of the value type is returned. - @param keyToLookFor the key of the item being requested - */ - inline ValueType operator[] (KeyTypeParameter keyToLookFor) const - { - const ScopedLockType sl (getLock()); - - for (const HashEntry* entry = hashSlots.getUnchecked (generateHashFor (keyToLookFor)); entry != nullptr; entry = entry->nextEntry) - if (entry->key == keyToLookFor) - return entry->value; - - return ValueType(); - } - - //============================================================================== - /** Returns true if the map contains an item with the specied key. */ - bool contains (KeyTypeParameter keyToLookFor) const - { - const ScopedLockType sl (getLock()); - - for (const HashEntry* entry = hashSlots.getUnchecked (generateHashFor (keyToLookFor)); entry != nullptr; entry = entry->nextEntry) - if (entry->key == keyToLookFor) - return true; - - return false; - } - - /** Returns true if the hash contains at least one occurrence of a given value. */ - bool containsValue (ValueTypeParameter valueToLookFor) const - { - const ScopedLockType sl (getLock()); - - for (int i = getNumSlots(); --i >= 0;) - for (const HashEntry* entry = hashSlots.getUnchecked(i); entry != nullptr; entry = entry->nextEntry) - if (entry->value == valueToLookFor) - return true; - - return false; - } - - //============================================================================== - /** Adds or replaces an element in the hash-map. - If there's already an item with the given key, this will replace its value. Otherwise, a new item - will be added to the map. - */ - void set (KeyTypeParameter newKey, ValueTypeParameter newValue) - { - const ScopedLockType sl (getLock()); - const int hashIndex = generateHashFor (newKey); - - HashEntry* const firstEntry = hashSlots.getUnchecked (hashIndex); - - for (HashEntry* entry = firstEntry; entry != nullptr; entry = entry->nextEntry) - { - if (entry->key == newKey) - { - entry->value = newValue; - return; - } - } - - hashSlots.set (hashIndex, new HashEntry (newKey, newValue, firstEntry)); - ++totalNumItems; - - if (totalNumItems > (getNumSlots() * 3) / 2) - remapTable (getNumSlots() * 2); - } - - /** Removes an item with the given key. */ - void remove (KeyTypeParameter keyToRemove) - { - const ScopedLockType sl (getLock()); - const int hashIndex = generateHashFor (keyToRemove); - HashEntry* entry = hashSlots.getUnchecked (hashIndex); - HashEntry* previous = nullptr; - - while (entry != nullptr) - { - if (entry->key == keyToRemove) - { - const ScopedPointer deleter (entry); - - entry = entry->nextEntry; - - if (previous != nullptr) - previous->nextEntry = entry; - else - hashSlots.set (hashIndex, entry); - - --totalNumItems; - } - else - { - previous = entry; - entry = entry->nextEntry; - } - } - } - - /** Removes all items with the given value. */ - void removeValue (ValueTypeParameter valueToRemove) - { - const ScopedLockType sl (getLock()); - - for (int i = getNumSlots(); --i >= 0;) - { - HashEntry* entry = hashSlots.getUnchecked(i); - HashEntry* previous = nullptr; - - while (entry != nullptr) - { - if (entry->value == valueToRemove) - { - const ScopedPointer deleter (entry); - - entry = entry->nextEntry; - - if (previous != nullptr) - previous->nextEntry = entry; - else - hashSlots.set (i, entry); - - --totalNumItems; - } - else - { - previous = entry; - entry = entry->nextEntry; - } - } - } - } - - /** Remaps the hash-map to use a different number of slots for its hash function. - Each slot corresponds to a single hash-code, and each one can contain multiple items. - @see getNumSlots() - */ - void remapTable (int newNumberOfSlots) - { - HashMap newTable (newNumberOfSlots); - - for (int i = getNumSlots(); --i >= 0;) - for (const HashEntry* entry = hashSlots.getUnchecked(i); entry != nullptr; entry = entry->nextEntry) - newTable.set (entry->key, entry->value); - - swapWith (newTable); - } - - /** Returns the number of slots which are available for hashing. - Each slot corresponds to a single hash-code, and each one can contain multiple items. - @see getNumSlots() - */ - inline int getNumSlots() const noexcept - { - return hashSlots.size(); - } - - //============================================================================== - /** Efficiently swaps the contents of two hash-maps. */ - template - void swapWith (OtherHashMapType& otherHashMap) noexcept - { - const ScopedLockType lock1 (getLock()); - const typename OtherHashMapType::ScopedLockType lock2 (otherHashMap.getLock()); - - hashSlots.swapWith (otherHashMap.hashSlots); - std::swap (totalNumItems, otherHashMap.totalNumItems); - } - - //============================================================================== - /** Returns the CriticalSection that locks this structure. - To lock, you can call getLock().enter() and getLock().exit(), or preferably use - an object of ScopedLockType as an RAII lock for it. - */ - inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return lock; } - - /** Returns the type of scoped lock to use for locking this array */ - typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType; - -private: - //============================================================================== - class HashEntry - { - public: - HashEntry (KeyTypeParameter k, ValueTypeParameter val, HashEntry* const next) - : key (k), value (val), nextEntry (next) - {} - - const KeyType key; - ValueType value; - HashEntry* nextEntry; - - JUCE_DECLARE_NON_COPYABLE (HashEntry) - }; - -public: - //============================================================================== - /** Iterates over the items in a HashMap. - - To use it, repeatedly call next() until it returns false, e.g. - @code - HashMap myMap; - - HashMap::Iterator i (myMap); - - while (i.next()) - { - DBG (i.getKey() << " -> " << i.getValue()); - } - @endcode - - The order in which items are iterated bears no resemblence to the order in which - they were originally added! - - Obviously as soon as you call any non-const methods on the original hash-map, any - iterators that were created beforehand will cease to be valid, and should not be used. - - @see HashMap - */ - class Iterator - { - public: - //============================================================================== - Iterator (const HashMap& hashMapToIterate) - : hashMap (hashMapToIterate), entry (nullptr), index (0) - {} - - /** Moves to the next item, if one is available. - When this returns true, you can get the item's key and value using getKey() and - getValue(). If it returns false, the iteration has finished and you should stop. - */ - bool next() - { - if (entry != nullptr) - entry = entry->nextEntry; - - while (entry == nullptr) - { - if (index >= hashMap.getNumSlots()) - return false; - - entry = hashMap.hashSlots.getUnchecked (index++); - } - - return true; - } - - /** Returns the current item's key. - This should only be called when a call to next() has just returned true. - */ - KeyType getKey() const - { - return entry != nullptr ? entry->key : KeyType(); - } - - /** Returns the current item's value. - This should only be called when a call to next() has just returned true. - */ - ValueType getValue() const - { - return entry != nullptr ? entry->value : ValueType(); - } - - private: - //============================================================================== - const HashMap& hashMap; - HashEntry* entry; - int index; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Iterator) - }; - -private: - //============================================================================== - enum { defaultHashTableSize = 101 }; - friend class Iterator; - - HashFunctionType hashFunctionToUse; - Array hashSlots; - int totalNumItems; - TypeOfCriticalSectionToUse lock; - - int generateHashFor (KeyTypeParameter key) const - { - const int hash = hashFunctionToUse.generateHash (key, getNumSlots()); - jassert (isPositiveAndBelow (hash, getNumSlots())); // your hash function is generating out-of-range numbers! - return hash; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HashMap) -}; - - -#endif // JUCE_HASHMAP_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h b/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h deleted file mode 100755 index a27e521..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_LinkedListPointer.h +++ /dev/null @@ -1,371 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_LINKEDLISTPOINTER_H_INCLUDED -#define JUCE_LINKEDLISTPOINTER_H_INCLUDED - - -//============================================================================== -/** - Helps to manipulate singly-linked lists of objects. - - For objects that are designed to contain a pointer to the subsequent item in the - list, this class contains methods to deal with the list. To use it, the ObjectType - class that it points to must contain a LinkedListPointer called nextListItem, e.g. - - @code - struct MyObject - { - int x, y, z; - - // A linkable object must contain a member with this name and type, which must be - // accessible by the LinkedListPointer class. (This doesn't mean it has to be public - - // you could make your class a friend of a LinkedListPointer instead). - LinkedListPointer nextListItem; - }; - - LinkedListPointer myList; - myList.append (new MyObject()); - myList.append (new MyObject()); - - int numItems = myList.size(); // returns 2 - MyObject* lastInList = myList.getLast(); - @endcode -*/ -template -class LinkedListPointer -{ -public: - //============================================================================== - /** Creates a null pointer to an empty list. */ - LinkedListPointer() noexcept - : item (nullptr) - { - } - - /** Creates a pointer to a list whose head is the item provided. */ - explicit LinkedListPointer (ObjectType* const headItem) noexcept - : item (headItem) - { - } - - /** Sets this pointer to point to a new list. */ - LinkedListPointer& operator= (ObjectType* const newItem) noexcept - { - item = newItem; - return *this; - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - LinkedListPointer (LinkedListPointer&& other) noexcept - : item (other.item) - { - other.item = nullptr; - } - - LinkedListPointer& operator= (LinkedListPointer&& other) noexcept - { - jassert (this != &other); // hopefully the compiler should make this situation impossible! - - item = other.item; - other.item = nullptr; - return *this; - } - #endif - - //============================================================================== - /** Returns the item which this pointer points to. */ - inline operator ObjectType*() const noexcept - { - return item; - } - - /** Returns the item which this pointer points to. */ - inline ObjectType* get() const noexcept - { - return item; - } - - /** Returns the last item in the list which this pointer points to. - This will iterate the list and return the last item found. Obviously the speed - of this operation will be proportional to the size of the list. If the list is - empty the return value will be this object. - If you're planning on appending a number of items to your list, it's much more - efficient to use the Appender class than to repeatedly call getLast() to find the end. - */ - LinkedListPointer& getLast() noexcept - { - LinkedListPointer* l = this; - - while (l->item != nullptr) - l = &(l->item->nextListItem); - - return *l; - } - - /** Returns the number of items in the list. - Obviously with a simple linked list, getting the size involves iterating the list, so - this can be a lengthy operation - be careful when using this method in your code. - */ - int size() const noexcept - { - int total = 0; - - for (ObjectType* i = item; i != nullptr; i = i->nextListItem) - ++total; - - return total; - } - - /** Returns the item at a given index in the list. - Since the only way to find an item is to iterate the list, this operation can obviously - be slow, depending on its size, so you should be careful when using this in algorithms. - */ - LinkedListPointer& operator[] (int index) noexcept - { - LinkedListPointer* l = this; - - while (--index >= 0 && l->item != nullptr) - l = &(l->item->nextListItem); - - return *l; - } - - /** Returns the item at a given index in the list. - Since the only way to find an item is to iterate the list, this operation can obviously - be slow, depending on its size, so you should be careful when using this in algorithms. - */ - const LinkedListPointer& operator[] (int index) const noexcept - { - const LinkedListPointer* l = this; - - while (--index >= 0 && l->item != nullptr) - l = &(l->item->nextListItem); - - return *l; - } - - /** Returns true if the list contains the given item. */ - bool contains (const ObjectType* const itemToLookFor) const noexcept - { - for (ObjectType* i = item; i != nullptr; i = i->nextListItem) - if (itemToLookFor == i) - return true; - - return false; - } - - //============================================================================== - /** Inserts an item into the list, placing it before the item that this pointer - currently points to. - */ - void insertNext (ObjectType* const newItem) - { - jassert (newItem != nullptr); - jassert (newItem->nextListItem == nullptr); - newItem->nextListItem = item; - item = newItem; - } - - /** Inserts an item at a numeric index in the list. - Obviously this will involve iterating the list to find the item at the given index, - so be careful about the impact this may have on execution time. - */ - void insertAtIndex (int index, ObjectType* newItem) - { - jassert (newItem != nullptr); - LinkedListPointer* l = this; - - while (index != 0 && l->item != nullptr) - { - l = &(l->item->nextListItem); - --index; - } - - l->insertNext (newItem); - } - - /** Replaces the object that this pointer points to, appending the rest of the list to - the new object, and returning the old one. - */ - ObjectType* replaceNext (ObjectType* const newItem) noexcept - { - jassert (newItem != nullptr); - jassert (newItem->nextListItem == nullptr); - - ObjectType* const oldItem = item; - item = newItem; - item->nextListItem = oldItem->nextListItem.item; - oldItem->nextListItem.item = nullptr; - return oldItem; - } - - /** Adds an item to the end of the list. - - This operation involves iterating the whole list, so can be slow - if you need to - append a number of items to your list, it's much more efficient to use the Appender - class than to repeatedly call append(). - */ - void append (ObjectType* const newItem) - { - getLast().item = newItem; - } - - /** Creates copies of all the items in another list and adds them to this one. - This will use the ObjectType's copy constructor to try to create copies of each - item in the other list, and appends them to this list. - */ - void addCopyOfList (const LinkedListPointer& other) - { - LinkedListPointer* insertPoint = this; - - for (ObjectType* i = other.item; i != nullptr; i = i->nextListItem) - { - insertPoint->insertNext (new ObjectType (*i)); - insertPoint = &(insertPoint->item->nextListItem); - } - } - - /** Removes the head item from the list. - This won't delete the object that is removed, but returns it, so the caller can - delete it if necessary. - */ - ObjectType* removeNext() noexcept - { - ObjectType* const oldItem = item; - - if (oldItem != nullptr) - { - item = oldItem->nextListItem; - oldItem->nextListItem.item = nullptr; - } - - return oldItem; - } - - /** Removes a specific item from the list. - Note that this will not delete the item, it simply unlinks it from the list. - */ - void remove (ObjectType* const itemToRemove) - { - if (LinkedListPointer* const l = findPointerTo (itemToRemove)) - l->removeNext(); - } - - /** Iterates the list, calling the delete operator on all of its elements and - leaving this pointer empty. - */ - void deleteAll() - { - while (item != nullptr) - { - ObjectType* const oldItem = item; - item = oldItem->nextListItem; - delete oldItem; - } - } - - /** Finds a pointer to a given item. - If the item is found in the list, this returns the pointer that points to it. If - the item isn't found, this returns null. - */ - LinkedListPointer* findPointerTo (ObjectType* const itemToLookFor) noexcept - { - LinkedListPointer* l = this; - - while (l->item != nullptr) - { - if (l->item == itemToLookFor) - return l; - - l = &(l->item->nextListItem); - } - - return nullptr; - } - - /** Copies the items in the list to an array. - The destArray must contain enough elements to hold the entire list - no checks are - made for this! - */ - void copyToArray (ObjectType** destArray) const noexcept - { - jassert (destArray != nullptr); - - for (ObjectType* i = item; i != nullptr; i = i->nextListItem) - *destArray++ = i; - } - - /** Swaps this pointer with another one */ - void swapWith (LinkedListPointer& other) noexcept - { - std::swap (item, other.item); - } - - //============================================================================== - /** - Allows efficient repeated insertions into a list. - - You can create an Appender object which points to the last element in your - list, and then repeatedly call Appender::append() to add items to the end - of the list in O(1) time. - */ - class Appender - { - public: - /** Creates an appender which will add items to the given list. - */ - Appender (LinkedListPointer& endOfListPointer) noexcept - : endOfList (&endOfListPointer) - { - // This can only be used to add to the end of a list. - jassert (endOfListPointer.item == nullptr); - } - - /** Appends an item to the list. */ - void append (ObjectType* const newItem) noexcept - { - *endOfList = newItem; - endOfList = &(newItem->nextListItem); - } - - private: - LinkedListPointer* endOfList; - - JUCE_DECLARE_NON_COPYABLE (Appender) - }; - -private: - //============================================================================== - ObjectType* item; - - JUCE_DECLARE_NON_COPYABLE (LinkedListPointer) -}; - - -#endif // JUCE_LINKEDLISTPOINTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp b/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp deleted file mode 100755 index 504ab78..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -struct NamedValueSet::NamedValue -{ - NamedValue() noexcept {} - NamedValue (Identifier n, const var& v) : name (n), value (v) {} - NamedValue (const NamedValue& other) : name (other.name), value (other.value) {} - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - NamedValue (NamedValue&& other) noexcept - : name (static_cast (other.name)), - value (static_cast (other.value)) - { - } - - NamedValue (Identifier n, var&& v) : name (n), value (static_cast (v)) - { - } - - NamedValue& operator= (NamedValue&& other) noexcept - { - name = static_cast (other.name); - value = static_cast (other.value); - return *this; - } - #endif - - bool operator== (const NamedValue& other) const noexcept { return name == other.name && value == other.value; } - bool operator!= (const NamedValue& other) const noexcept { return ! operator== (other); } - - Identifier name; - var value; -}; - -//============================================================================== -NamedValueSet::NamedValueSet() noexcept -{ -} - -NamedValueSet::NamedValueSet (const NamedValueSet& other) - : values (other.values) -{ -} - -NamedValueSet& NamedValueSet::operator= (const NamedValueSet& other) -{ - clear(); - values = other.values; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -NamedValueSet::NamedValueSet (NamedValueSet&& other) noexcept - : values (static_cast &&> (other.values)) -{ -} - -NamedValueSet& NamedValueSet::operator= (NamedValueSet&& other) noexcept -{ - other.values.swapWith (values); - return *this; -} -#endif - -NamedValueSet::~NamedValueSet() noexcept -{ -} - -void NamedValueSet::clear() -{ - values.clear(); -} - -bool NamedValueSet::operator== (const NamedValueSet& other) const -{ - return values == other.values; -} - -bool NamedValueSet::operator!= (const NamedValueSet& other) const -{ - return ! operator== (other); -} - -int NamedValueSet::size() const noexcept -{ - return values.size(); -} - -const var& NamedValueSet::operator[] (const Identifier& name) const noexcept -{ - if (const var* v = getVarPointer (name)) - return *v; - - return var::null; -} - -var NamedValueSet::getWithDefault (const Identifier& name, const var& defaultReturnValue) const -{ - if (const var* const v = getVarPointer (name)) - return *v; - - return defaultReturnValue; -} - -var* NamedValueSet::getVarPointer (const Identifier& name) const noexcept -{ - for (NamedValue* e = values.end(), *i = values.begin(); i != e; ++i) - if (i->name == name) - return &(i->value); - - return nullptr; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -bool NamedValueSet::set (Identifier name, var&& newValue) -{ - if (var* const v = getVarPointer (name)) - { - if (v->equalsWithSameType (newValue)) - return false; - - *v = static_cast (newValue); - return true; - } - - values.add (NamedValue (name, static_cast (newValue))); - return true; -} -#endif - -bool NamedValueSet::set (Identifier name, const var& newValue) -{ - if (var* const v = getVarPointer (name)) - { - if (v->equalsWithSameType (newValue)) - return false; - - *v = newValue; - return true; - } - - values.add (NamedValue (name, newValue)); - return true; -} - -bool NamedValueSet::contains (const Identifier& name) const noexcept -{ - return getVarPointer (name) != nullptr; -} - -int NamedValueSet::indexOf (const Identifier& name) const noexcept -{ - const int numValues = values.size(); - - for (int i = 0; i < numValues; ++i) - if (values.getReference(i).name == name) - return i; - - return -1; -} - -bool NamedValueSet::remove (const Identifier& name) -{ - const int numValues = values.size(); - - for (int i = 0; i < numValues; ++i) - { - if (values.getReference(i).name == name) - { - values.remove (i); - return true; - } - } - - return false; -} - -Identifier NamedValueSet::getName (const int index) const noexcept -{ - if (isPositiveAndBelow (index, values.size())) - return values.getReference (index).name; - - jassertfalse; - return Identifier(); -} - -const var& NamedValueSet::getValueAt (const int index) const noexcept -{ - if (isPositiveAndBelow (index, values.size())) - return values.getReference (index).value; - - jassertfalse; - return var::null; -} - -var* NamedValueSet::getVarPointerAt (int index) const noexcept -{ - if (isPositiveAndBelow (index, values.size())) - return &(values.getReference (index).value); - - return nullptr; -} - -void NamedValueSet::setFromXmlAttributes (const XmlElement& xml) -{ - values.clearQuick(); - - for (const XmlElement::XmlAttributeNode* att = xml.attributes; att != nullptr; att = att->nextListItem) - { - if (att->name.toString().startsWith ("base64:")) - { - MemoryBlock mb; - - if (mb.fromBase64Encoding (att->value)) - { - values.add (NamedValue (att->name.toString().substring (7), var (mb))); - continue; - } - } - - values.add (NamedValue (att->name, var (att->value))); - } -} - -void NamedValueSet::copyToXmlAttributes (XmlElement& xml) const -{ - for (NamedValue* e = values.end(), *i = values.begin(); i != e; ++i) - { - if (const MemoryBlock* mb = i->value.getBinaryData()) - { - xml.setAttribute ("base64:" + i->name.toString(), mb->toBase64Encoding()); - } - else - { - // These types can't be stored as XML! - jassert (! i->value.isObject()); - jassert (! i->value.isMethod()); - jassert (! i->value.isArray()); - - xml.setAttribute (i->name.toString(), - i->value.toString()); - } - } -} diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h b/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h deleted file mode 100755 index e4a98ed..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_NamedValueSet.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_NAMEDVALUESET_H_INCLUDED -#define JUCE_NAMEDVALUESET_H_INCLUDED - - -//============================================================================== -/** Holds a set of named var objects. - - This can be used as a basic structure to hold a set of var object, which can - be retrieved by using their identifier. -*/ -class JUCE_API NamedValueSet -{ -public: - /** Creates an empty set. */ - NamedValueSet() noexcept; - - /** Creates a copy of another set. */ - NamedValueSet (const NamedValueSet&); - - /** Replaces this set with a copy of another set. */ - NamedValueSet& operator= (const NamedValueSet&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - NamedValueSet (NamedValueSet&&) noexcept; - NamedValueSet& operator= (NamedValueSet&&) noexcept; - #endif - - /** Destructor. */ - ~NamedValueSet() noexcept; - - bool operator== (const NamedValueSet&) const; - bool operator!= (const NamedValueSet&) const; - - //============================================================================== - /** Returns the total number of values that the set contains. */ - int size() const noexcept; - - /** Returns the value of a named item. - If the name isn't found, this will return a void variant. - @see getProperty - */ - const var& operator[] (const Identifier& name) const noexcept; - - /** Tries to return the named value, but if no such value is found, this will - instead return the supplied default value. - */ - var getWithDefault (const Identifier& name, const var& defaultReturnValue) const; - - /** Changes or adds a named value. - @returns true if a value was changed or added; false if the - value was already set the value passed-in. - */ - bool set (Identifier name, const var& newValue); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - /** Changes or adds a named value. - @returns true if a value was changed or added; false if the - value was already set the value passed-in. - */ - bool set (Identifier name, var&& newValue); - #endif - - /** Returns true if the set contains an item with the specified name. */ - bool contains (const Identifier& name) const noexcept; - - /** Removes a value from the set. - @returns true if a value was removed; false if there was no value - with the name that was given. - */ - bool remove (const Identifier& name); - - /** Returns the name of the value at a given index. - The index must be between 0 and size() - 1. - */ - Identifier getName (int index) const noexcept; - - /** Returns a pointer to the var that holds a named value, or null if there is - no value with this name. - - Do not use this method unless you really need access to the internal var object - for some reason - for normal reading and writing always prefer operator[]() and set(). - */ - var* getVarPointer (const Identifier& name) const noexcept; - - /** Returns the value of the item at a given index. - The index must be between 0 and size() - 1. - */ - const var& getValueAt (int index) const noexcept; - - /** Returns the value of the item at a given index. - The index must be between 0 and size() - 1, or this will return a nullptr - */ - var* getVarPointerAt (int index) const noexcept; - - /** Returns the index of the given name, or -1 if it's not found. */ - int indexOf (const Identifier& name) const noexcept; - - /** Removes all values. */ - void clear(); - - //============================================================================== - /** Sets properties to the values of all of an XML element's attributes. */ - void setFromXmlAttributes (const XmlElement& xml); - - /** Sets attributes in an XML element corresponding to each of this object's - properties. - */ - void copyToXmlAttributes (XmlElement& xml) const; - -private: - //============================================================================== - struct NamedValue; - Array values; -}; - - -#endif // JUCE_NAMEDVALUESET_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h b/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h deleted file mode 100755 index be7448c..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_OwnedArray.h +++ /dev/null @@ -1,897 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_OWNEDARRAY_H_INCLUDED -#define JUCE_OWNEDARRAY_H_INCLUDED - - -//============================================================================== -/** An array designed for holding objects. - - This holds a list of pointers to objects, and will automatically - delete the objects when they are removed from the array, or when the - array is itself deleted. - - Declare it in the form: OwnedArray - - ..and then add new objects, e.g. myOwnedArray.add (new MyObjectClass()); - - After adding objects, they are 'owned' by the array and will be deleted when - removed or replaced. - - To make all the array's methods thread-safe, pass in "CriticalSection" as the templated - TypeOfCriticalSectionToUse parameter, instead of the default DummyCriticalSection. - - @see Array, ReferenceCountedArray, StringArray, CriticalSection -*/ -template - -class OwnedArray -{ -public: - //============================================================================== - /** Creates an empty array. */ - OwnedArray() noexcept - : numUsed (0) - { - } - - /** Deletes the array and also deletes any objects inside it. - - To get rid of the array without deleting its objects, use its - clear (false) method before deleting it. - */ - ~OwnedArray() - { - deleteAllObjects(); - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - OwnedArray (OwnedArray&& other) noexcept - : data (static_cast &&> (other.data)), - numUsed (other.numUsed) - { - other.numUsed = 0; - } - - OwnedArray& operator= (OwnedArray&& other) noexcept - { - const ScopedLockType lock (getLock()); - deleteAllObjects(); - - data = static_cast &&> (other.data); - numUsed = other.numUsed; - other.numUsed = 0; - return *this; - } - #endif - - //============================================================================== - /** Clears the array, optionally deleting the objects inside it first. */ - void clear (bool deleteObjects = true) - { - const ScopedLockType lock (getLock()); - - if (deleteObjects) - deleteAllObjects(); - - data.setAllocatedSize (0); - numUsed = 0; - } - - //============================================================================== - /** Clears the array, optionally deleting the objects inside it first. */ - void clearQuick (bool deleteObjects) - { - const ScopedLockType lock (getLock()); - - if (deleteObjects) - deleteAllObjects(); - - numUsed = 0; - } - - //============================================================================== - /** Returns the number of items currently in the array. - @see operator[] - */ - inline int size() const noexcept - { - return numUsed; - } - - /** Returns a pointer to the object at this index in the array. - - If the index is out-of-range, this will return a null pointer, (and - it could be null anyway, because it's ok for the array to hold null - pointers as well as objects). - - @see getUnchecked - */ - inline ObjectClass* operator[] (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - if (isPositiveAndBelow (index, numUsed)) - { - jassert (data.elements != nullptr); - return data.elements [index]; - } - - return nullptr; - } - - /** Returns a pointer to the object at this index in the array, without checking whether the index is in-range. - - This is a faster and less safe version of operator[] which doesn't check the index passed in, so - it can be used when you're sure the index is always going to be legal. - */ - inline ObjectClass* getUnchecked (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr); - return data.elements [index]; - } - - /** Returns a pointer to the first object in the array. - - This will return a null pointer if the array's empty. - @see getLast - */ - inline ObjectClass* getFirst() const noexcept - { - const ScopedLockType lock (getLock()); - - if (numUsed > 0) - { - jassert (data.elements != nullptr); - return data.elements [0]; - } - - return nullptr; - } - - /** Returns a pointer to the last object in the array. - - This will return a null pointer if the array's empty. - @see getFirst - */ - inline ObjectClass* getLast() const noexcept - { - const ScopedLockType lock (getLock()); - - if (numUsed > 0) - { - jassert (data.elements != nullptr); - return data.elements [numUsed - 1]; - } - - return nullptr; - } - - /** Returns a pointer to the actual array data. - This pointer will only be valid until the next time a non-const method - is called on the array. - */ - inline ObjectClass** getRawDataPointer() noexcept - { - return data.elements; - } - - //============================================================================== - /** Returns a pointer to the first element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ObjectClass** begin() const noexcept - { - return data.elements; - } - - /** Returns a pointer to the element which follows the last element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ObjectClass** end() const noexcept - { - #if JUCE_DEBUG - if (data.elements == nullptr || numUsed <= 0) // (to keep static analysers happy) - return data.elements; - #endif - - return data.elements + numUsed; - } - - //============================================================================== - /** Finds the index of an object which might be in the array. - - @param objectToLookFor the object to look for - @returns the index at which the object was found, or -1 if it's not found - */ - int indexOf (const ObjectClass* objectToLookFor) const noexcept - { - const ScopedLockType lock (getLock()); - ObjectClass* const* e = data.elements.getData(); - ObjectClass* const* const end_ = e + numUsed; - - for (; e != end_; ++e) - if (objectToLookFor == *e) - return static_cast (e - data.elements.getData()); - - return -1; - } - - /** Returns true if the array contains a specified object. - - @param objectToLookFor the object to look for - @returns true if the object is in the array - */ - bool contains (const ObjectClass* objectToLookFor) const noexcept - { - const ScopedLockType lock (getLock()); - ObjectClass* const* e = data.elements.getData(); - ObjectClass* const* const end_ = e + numUsed; - - for (; e != end_; ++e) - if (objectToLookFor == *e) - return true; - - return false; - } - - //============================================================================== - /** Appends a new object to the end of the array. - - Note that the this object will be deleted by the OwnedArray when it - is removed, so be careful not to delete it somewhere else. - - Also be careful not to add the same object to the array more than once, - as this will obviously cause deletion of dangling pointers. - - @param newObject the new object to add to the array - @returns the new object that was added - @see set, insert, addIfNotAlreadyThere, addSorted - */ - ObjectClass* add (ObjectClass* newObject) noexcept - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - jassert (data.elements != nullptr); - data.elements [numUsed++] = newObject; - return newObject; - } - - /** Inserts a new object into the array at the given index. - - Note that the this object will be deleted by the OwnedArray when it - is removed, so be careful not to delete it somewhere else. - - If the index is less than 0 or greater than the size of the array, the - element will be added to the end of the array. - Otherwise, it will be inserted into the array, moving all the later elements - along to make room. - - Be careful not to add the same object to the array more than once, - as this will obviously cause deletion of dangling pointers. - - @param indexToInsertAt the index at which the new element should be inserted - @param newObject the new object to add to the array - @returns the new object that was added - @see add, addSorted, addIfNotAlreadyThere, set - */ - ObjectClass* insert (int indexToInsertAt, ObjectClass* newObject) noexcept - { - if (indexToInsertAt < 0) - return add (newObject); - - const ScopedLockType lock (getLock()); - - if (indexToInsertAt > numUsed) - indexToInsertAt = numUsed; - - data.ensureAllocatedSize (numUsed + 1); - jassert (data.elements != nullptr); - - ObjectClass** const e = data.elements + indexToInsertAt; - const int numToMove = numUsed - indexToInsertAt; - - if (numToMove > 0) - memmove (e + 1, e, sizeof (ObjectClass*) * (size_t) numToMove); - - *e = newObject; - ++numUsed; - return newObject; - } - - /** Inserts an array of values into this array at a given position. - - If the index is less than 0 or greater than the size of the array, the - new elements will be added to the end of the array. - Otherwise, they will be inserted into the array, moving all the later elements - along to make room. - - @param indexToInsertAt the index at which the first new element should be inserted - @param newObjects the new values to add to the array - @param numberOfElements how many items are in the array - @see insert, add, addSorted, set - */ - void insertArray (int indexToInsertAt, - ObjectClass* const* newObjects, - int numberOfElements) - { - if (numberOfElements > 0) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + numberOfElements); - ObjectClass** insertPos = data.elements; - - if (isPositiveAndBelow (indexToInsertAt, numUsed)) - { - insertPos += indexToInsertAt; - const size_t numberToMove = (size_t) (numUsed - indexToInsertAt); - memmove (insertPos + numberOfElements, insertPos, numberToMove * sizeof (ObjectClass*)); - } - else - { - insertPos += numUsed; - } - - numUsed += numberOfElements; - - while (--numberOfElements >= 0) - *insertPos++ = *newObjects++; - } - } - - /** Appends a new object at the end of the array as long as the array doesn't - already contain it. - - If the array already contains a matching object, nothing will be done. - - @param newObject the new object to add to the array - @returns the new object that was added - */ - ObjectClass* addIfNotAlreadyThere (ObjectClass* newObject) noexcept - { - const ScopedLockType lock (getLock()); - - if (! contains (newObject)) - add (newObject); - - return newObject; - } - - /** Replaces an object in the array with a different one. - - If the index is less than zero, this method does nothing. - If the index is beyond the end of the array, the new object is added to the end of the array. - - Be careful not to add the same object to the array more than once, - as this will obviously cause deletion of dangling pointers. - - @param indexToChange the index whose value you want to change - @param newObject the new value to set for this index. - @param deleteOldElement whether to delete the object that's being replaced with the new one - @see add, insert, remove - */ - ObjectClass* set (int indexToChange, ObjectClass* newObject, bool deleteOldElement = true) - { - if (indexToChange >= 0) - { - ScopedPointer toDelete; - - { - const ScopedLockType lock (getLock()); - - if (indexToChange < numUsed) - { - if (deleteOldElement) - { - toDelete = data.elements [indexToChange]; - - if (toDelete == newObject) - toDelete.release(); - } - - data.elements [indexToChange] = newObject; - } - else - { - data.ensureAllocatedSize (numUsed + 1); - data.elements [numUsed++] = newObject; - } - } - } - else - { - jassertfalse; // you're trying to set an object at a negative index, which doesn't have - // any effect - but since the object is not being added, it may be leaking.. - } - - return newObject; - } - - /** Adds elements from another array to the end of this array. - - @param arrayToAddFrom the array from which to copy the elements - @param startIndex the first element of the other array to start copying from - @param numElementsToAdd how many elements to add from the other array. If this - value is negative or greater than the number of available elements, - all available elements will be copied. - @see add - */ - template - void addArray (const OtherArrayType& arrayToAddFrom, - int startIndex = 0, - int numElementsToAdd = -1) - { - const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock()); - const ScopedLockType lock2 (getLock()); - - if (startIndex < 0) - { - jassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size()) - numElementsToAdd = arrayToAddFrom.size() - startIndex; - - data.ensureAllocatedSize (numUsed + numElementsToAdd); - jassert (numElementsToAdd <= 0 || data.elements != nullptr); - - while (--numElementsToAdd >= 0) - { - data.elements [numUsed] = arrayToAddFrom.getUnchecked (startIndex++); - ++numUsed; - } - } - - /** Adds copies of the elements in another array to the end of this array. - - The other array must be either an OwnedArray of a compatible type of object, or an Array - containing pointers to the same kind of object. The objects involved must provide - a copy constructor, and this will be used to create new copies of each element, and - add them to this array. - - @param arrayToAddFrom the array from which to copy the elements - @param startIndex the first element of the other array to start copying from - @param numElementsToAdd how many elements to add from the other array. If this - value is negative or greater than the number of available elements, - all available elements will be copied. - @see add - */ - template - void addCopiesOf (const OtherArrayType& arrayToAddFrom, - int startIndex = 0, - int numElementsToAdd = -1) - { - const typename OtherArrayType::ScopedLockType lock1 (arrayToAddFrom.getLock()); - const ScopedLockType lock2 (getLock()); - - if (startIndex < 0) - { - jassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size()) - numElementsToAdd = arrayToAddFrom.size() - startIndex; - - data.ensureAllocatedSize (numUsed + numElementsToAdd); - jassert (numElementsToAdd <= 0 || data.elements != nullptr); - - while (--numElementsToAdd >= 0) - data.elements [numUsed++] = createCopyIfNotNull (arrayToAddFrom.getUnchecked (startIndex++)); - } - - /** Inserts a new object into the array assuming that the array is sorted. - - This will use a comparator to find the position at which the new object - should go. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator to use to compare the elements - see the sort method - for details about this object's structure - @param newObject the new object to insert to the array - @returns the index at which the new object was added - @see add, sort, indexOfSorted - */ - template - int addSorted (ElementComparator& comparator, ObjectClass* const newObject) noexcept - { - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - const ScopedLockType lock (getLock()); - const int index = findInsertIndexInSortedArray (comparator, data.elements.getData(), newObject, 0, numUsed); - insert (index, newObject); - return index; - } - - /** Finds the index of an object in the array, assuming that the array is sorted. - - This will use a comparator to do a binary-chop to find the index of the given - element, if it exists. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator to use to compare the elements - see the sort() - method for details about the form this object should take - @param objectToLookFor the object to search for - @returns the index of the element, or -1 if it's not found - @see addSorted, sort - */ - template - int indexOfSorted (ElementComparator& comparator, const ObjectClass* const objectToLookFor) const noexcept - { - (void) comparator; - const ScopedLockType lock (getLock()); - int s = 0, e = numUsed; - - while (s < e) - { - if (comparator.compareElements (objectToLookFor, data.elements [s]) == 0) - return s; - - const int halfway = (s + e) / 2; - if (halfway == s) - break; - - if (comparator.compareElements (objectToLookFor, data.elements [halfway]) >= 0) - s = halfway; - else - e = halfway; - } - - return -1; - } - - //============================================================================== - /** Removes an object from the array. - - This will remove the object at a given index (optionally also - deleting it) and move back all the subsequent objects to close the gap. - If the index passed in is out-of-range, nothing will happen. - - @param indexToRemove the index of the element to remove - @param deleteObject whether to delete the object that is removed - @see removeObject, removeRange - */ - void remove (int indexToRemove, bool deleteObject = true) - { - ScopedPointer toDelete; - - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - ObjectClass** const e = data.elements + indexToRemove; - - if (deleteObject) - toDelete = *e; - - --numUsed; - const int numToShift = numUsed - indexToRemove; - - if (numToShift > 0) - memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numToShift); - } - } - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - - /** Removes and returns an object from the array without deleting it. - - This will remove the object at a given index and return it, moving back all - the subsequent objects to close the gap. If the index passed in is out-of-range, - nothing will happen. - - @param indexToRemove the index of the element to remove - @see remove, removeObject, removeRange - */ - ObjectClass* removeAndReturn (int indexToRemove) - { - ObjectClass* removedItem = nullptr; - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - ObjectClass** const e = data.elements + indexToRemove; - removedItem = *e; - - --numUsed; - const int numToShift = numUsed - indexToRemove; - - if (numToShift > 0) - memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numToShift); - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - - return removedItem; - } - - /** Removes a specified object from the array. - - If the item isn't found, no action is taken. - - @param objectToRemove the object to try to remove - @param deleteObject whether to delete the object (if it's found) - @see remove, removeRange - */ - void removeObject (const ObjectClass* objectToRemove, bool deleteObject = true) - { - const ScopedLockType lock (getLock()); - ObjectClass** const e = data.elements.getData(); - - for (int i = 0; i < numUsed; ++i) - { - if (objectToRemove == e[i]) - { - remove (i, deleteObject); - break; - } - } - } - - /** Removes a range of objects from the array. - - This will remove a set of objects, starting from the given index, - and move any subsequent elements down to close the gap. - - If the range extends beyond the bounds of the array, it will - be safely clipped to the size of the array. - - @param startIndex the index of the first object to remove - @param numberToRemove how many objects should be removed - @param deleteObjects whether to delete the objects that get removed - @see remove, removeObject - */ - void removeRange (int startIndex, int numberToRemove, bool deleteObjects = true) - { - const ScopedLockType lock (getLock()); - const int endIndex = jlimit (0, numUsed, startIndex + numberToRemove); - startIndex = jlimit (0, numUsed, startIndex); - - if (endIndex > startIndex) - { - if (deleteObjects) - { - for (int i = startIndex; i < endIndex; ++i) - { - ContainerDeletePolicy::destroy (data.elements [i]); - data.elements [i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer) - } - } - - const int rangeSize = endIndex - startIndex; - ObjectClass** e = data.elements + startIndex; - int numToShift = numUsed - endIndex; - numUsed -= rangeSize; - - while (--numToShift >= 0) - { - *e = e [rangeSize]; - ++e; - } - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - } - - /** Removes the last n objects from the array. - - @param howManyToRemove how many objects to remove from the end of the array - @param deleteObjects whether to also delete the objects that are removed - @see remove, removeObject, removeRange - */ - void removeLast (int howManyToRemove = 1, - bool deleteObjects = true) - { - const ScopedLockType lock (getLock()); - - if (howManyToRemove >= numUsed) - clear (deleteObjects); - else - removeRange (numUsed - howManyToRemove, howManyToRemove, deleteObjects); - } - - /** Swaps a pair of objects in the array. - - If either of the indexes passed in is out-of-range, nothing will happen, - otherwise the two objects at these positions will be exchanged. - */ - void swap (int index1, - int index2) noexcept - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (index1, numUsed) - && isPositiveAndBelow (index2, numUsed)) - { - std::swap (data.elements [index1], - data.elements [index2]); - } - } - - /** Moves one of the objects to a different position. - - This will move the object to a specified index, shuffling along - any intervening elements as required. - - So for example, if you have the array { 0, 1, 2, 3, 4, 5 } then calling - move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }. - - @param currentIndex the index of the object to be moved. If this isn't a - valid index, then nothing will be done - @param newIndex the index at which you'd like this object to end up. If this - is less than zero, it will be moved to the end of the array - */ - void move (int currentIndex, int newIndex) noexcept - { - if (currentIndex != newIndex) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (currentIndex, numUsed)) - { - if (! isPositiveAndBelow (newIndex, numUsed)) - newIndex = numUsed - 1; - - ObjectClass* const value = data.elements [currentIndex]; - - if (newIndex > currentIndex) - { - memmove (data.elements + currentIndex, - data.elements + currentIndex + 1, - sizeof (ObjectClass*) * (size_t) (newIndex - currentIndex)); - } - else - { - memmove (data.elements + newIndex + 1, - data.elements + newIndex, - sizeof (ObjectClass*) * (size_t) (currentIndex - newIndex)); - } - - data.elements [newIndex] = value; - } - } - } - - /** This swaps the contents of this array with those of another array. - - If you need to exchange two arrays, this is vastly quicker than using copy-by-value - because it just swaps their internal pointers. - */ - template - void swapWith (OtherArrayType& otherArray) noexcept - { - const ScopedLockType lock1 (getLock()); - const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock()); - data.swapWith (otherArray.data); - std::swap (numUsed, otherArray.numUsed); - } - - //============================================================================== - /** Reduces the amount of storage being used by the array. - - Arrays typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads() noexcept - { - const ScopedLockType lock (getLock()); - data.shrinkToNoMoreThan (numUsed); - } - - /** Increases the array's internal storage to hold a minimum number of elements. - - Calling this before adding a large known number of elements means that - the array won't have to keep dynamically resizing itself as the elements - are added, and it'll therefore be more efficient. - */ - void ensureStorageAllocated (const int minNumElements) noexcept - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (minNumElements); - } - - //============================================================================== - /** Sorts the elements in the array. - - This will use a comparator object to sort the elements into order. The object - passed must have a method of the form: - @code - int compareElements (ElementType* first, ElementType* second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator the comparator to use for comparing elements. - @param retainOrderOfEquivalentItems if this is true, then items - which the comparator says are equivalent will be - kept in the order in which they currently appear - in the array. This is slower to perform, but may - be important in some cases. If it's false, a faster - algorithm is used, but equivalent elements may be - rearranged. - @see sortArray, indexOfSorted - */ - template - void sort (ElementComparator& comparator, - bool retainOrderOfEquivalentItems = false) const noexcept - { - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - const ScopedLockType lock (getLock()); - sortArray (comparator, data.elements.getData(), 0, size() - 1, retainOrderOfEquivalentItems); - } - - //============================================================================== - /** Returns the CriticalSection that locks this array. - To lock, you can call getLock().enter() and getLock().exit(), or preferably use - an object of ScopedLockType as an RAII lock for it. - */ - inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data; } - - /** Returns the type of scoped lock to use for locking this array */ - typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType; - - - //============================================================================== - #ifndef DOXYGEN - // Note that the swapWithArray method has been replaced by a more flexible templated version, - // and renamed "swapWith" to be more consistent with the names used in other classes. - JUCE_DEPRECATED_WITH_BODY (void swapWithArray (OwnedArray& other) noexcept, { swapWith (other); }) - #endif - -private: - //============================================================================== - ArrayAllocationBase data; - int numUsed; - - void deleteAllObjects() - { - while (numUsed > 0) - ContainerDeletePolicy::destroy (data.elements [--numUsed]); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OwnedArray) -}; - - -#endif // JUCE_OWNEDARRAY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp b/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp deleted file mode 100755 index 6b02baf..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -PropertySet::PropertySet (const bool ignoreCaseOfKeyNames) - : properties (ignoreCaseOfKeyNames), - fallbackProperties (nullptr), - ignoreCaseOfKeys (ignoreCaseOfKeyNames) -{ -} - -PropertySet::PropertySet (const PropertySet& other) - : properties (other.properties), - fallbackProperties (other.fallbackProperties), - ignoreCaseOfKeys (other.ignoreCaseOfKeys) -{ -} - -PropertySet& PropertySet::operator= (const PropertySet& other) -{ - properties = other.properties; - fallbackProperties = other.fallbackProperties; - ignoreCaseOfKeys = other.ignoreCaseOfKeys; - - propertyChanged(); - return *this; -} - -PropertySet::~PropertySet() -{ -} - -void PropertySet::clear() -{ - const ScopedLock sl (lock); - - if (properties.size() > 0) - { - properties.clear(); - propertyChanged(); - } -} - -String PropertySet::getValue (StringRef keyName, const String& defaultValue) const noexcept -{ - const ScopedLock sl (lock); - - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index >= 0) - return properties.getAllValues() [index]; - - return fallbackProperties != nullptr ? fallbackProperties->getValue (keyName, defaultValue) - : defaultValue; -} - -int PropertySet::getIntValue (StringRef keyName, const int defaultValue) const noexcept -{ - const ScopedLock sl (lock); - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index >= 0) - return properties.getAllValues() [index].getIntValue(); - - return fallbackProperties != nullptr ? fallbackProperties->getIntValue (keyName, defaultValue) - : defaultValue; -} - -double PropertySet::getDoubleValue (StringRef keyName, const double defaultValue) const noexcept -{ - const ScopedLock sl (lock); - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index >= 0) - return properties.getAllValues()[index].getDoubleValue(); - - return fallbackProperties != nullptr ? fallbackProperties->getDoubleValue (keyName, defaultValue) - : defaultValue; -} - -bool PropertySet::getBoolValue (StringRef keyName, const bool defaultValue) const noexcept -{ - const ScopedLock sl (lock); - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index >= 0) - return properties.getAllValues() [index].getIntValue() != 0; - - return fallbackProperties != nullptr ? fallbackProperties->getBoolValue (keyName, defaultValue) - : defaultValue; -} - -XmlElement* PropertySet::getXmlValue (StringRef keyName) const -{ - return XmlDocument::parse (getValue (keyName)); -} - -void PropertySet::setValue (const String& keyName, const var& v) -{ - jassert (keyName.isNotEmpty()); // shouldn't use an empty key name! - - if (keyName.isNotEmpty()) - { - const String value (v.toString()); - const ScopedLock sl (lock); - - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index < 0 || properties.getAllValues() [index] != value) - { - properties.set (keyName, value); - propertyChanged(); - } - } -} - -void PropertySet::removeValue (StringRef keyName) -{ - if (keyName.isNotEmpty()) - { - const ScopedLock sl (lock); - const int index = properties.getAllKeys().indexOf (keyName, ignoreCaseOfKeys); - - if (index >= 0) - { - properties.remove (keyName); - propertyChanged(); - } - } -} - -void PropertySet::setValue (const String& keyName, const XmlElement* const xml) -{ - setValue (keyName, xml == nullptr ? var() - : var (xml->createDocument ("", true))); -} - -bool PropertySet::containsKey (StringRef keyName) const noexcept -{ - const ScopedLock sl (lock); - return properties.getAllKeys().contains (keyName, ignoreCaseOfKeys); -} - -void PropertySet::addAllPropertiesFrom (const PropertySet& source) -{ - const ScopedLock sl (source.getLock()); - - for (int i = 0; i < source.properties.size(); ++i) - setValue (source.properties.getAllKeys() [i], - source.properties.getAllValues() [i]); -} - -void PropertySet::setFallbackPropertySet (PropertySet* fallbackProperties_) noexcept -{ - const ScopedLock sl (lock); - fallbackProperties = fallbackProperties_; -} - -XmlElement* PropertySet::createXml (const String& nodeName) const -{ - const ScopedLock sl (lock); - XmlElement* const xml = new XmlElement (nodeName); - - for (int i = 0; i < properties.getAllKeys().size(); ++i) - { - XmlElement* const e = xml->createNewChildElement ("VALUE"); - e->setAttribute ("name", properties.getAllKeys()[i]); - e->setAttribute ("val", properties.getAllValues()[i]); - } - - return xml; -} - -void PropertySet::restoreFromXml (const XmlElement& xml) -{ - const ScopedLock sl (lock); - clear(); - - forEachXmlChildElementWithTagName (xml, e, "VALUE") - { - if (e->hasAttribute ("name") - && e->hasAttribute ("val")) - { - properties.set (e->getStringAttribute ("name"), - e->getStringAttribute ("val")); - } - } - - if (properties.size() > 0) - propertyChanged(); -} - -void PropertySet::propertyChanged() -{ -} diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h b/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h deleted file mode 100755 index 2a4ecb1..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_PropertySet.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_PROPERTYSET_H_INCLUDED -#define JUCE_PROPERTYSET_H_INCLUDED - - -//============================================================================== -/** - A set of named property values, which can be strings, integers, floating point, etc. - - Effectively, this just wraps a StringPairArray in an interface that makes it easier - to load and save types other than strings. - - See the PropertiesFile class for a subclass of this, which automatically broadcasts change - messages and saves/loads the list from a file. -*/ -class JUCE_API PropertySet -{ -public: - //============================================================================== - /** Creates an empty PropertySet. - @param ignoreCaseOfKeyNames if true, the names of properties are compared in a - case-insensitive way - */ - PropertySet (bool ignoreCaseOfKeyNames = false); - - /** Creates a copy of another PropertySet. */ - PropertySet (const PropertySet& other); - - /** Copies another PropertySet over this one. */ - PropertySet& operator= (const PropertySet& other); - - /** Destructor. */ - virtual ~PropertySet(); - - //============================================================================== - /** Returns one of the properties as a string. - - If the value isn't found in this set, then this will look for it in a fallback - property set (if you've specified one with the setFallbackPropertySet() method), - and if it can't find one there, it'll return the default value passed-in. - - @param keyName the name of the property to retrieve - @param defaultReturnValue a value to return if the named property doesn't actually exist - */ - String getValue (StringRef keyName, const String& defaultReturnValue = String()) const noexcept; - - /** Returns one of the properties as an integer. - - If the value isn't found in this set, then this will look for it in a fallback - property set (if you've specified one with the setFallbackPropertySet() method), - and if it can't find one there, it'll return the default value passed-in. - - @param keyName the name of the property to retrieve - @param defaultReturnValue a value to return if the named property doesn't actually exist - */ - int getIntValue (StringRef keyName, int defaultReturnValue = 0) const noexcept; - - /** Returns one of the properties as an double. - - If the value isn't found in this set, then this will look for it in a fallback - property set (if you've specified one with the setFallbackPropertySet() method), - and if it can't find one there, it'll return the default value passed-in. - - @param keyName the name of the property to retrieve - @param defaultReturnValue a value to return if the named property doesn't actually exist - */ - double getDoubleValue (StringRef keyName, double defaultReturnValue = 0.0) const noexcept; - - /** Returns one of the properties as an boolean. - - The result will be true if the string found for this key name can be parsed as a non-zero - integer. - - If the value isn't found in this set, then this will look for it in a fallback - property set (if you've specified one with the setFallbackPropertySet() method), - and if it can't find one there, it'll return the default value passed-in. - - @param keyName the name of the property to retrieve - @param defaultReturnValue a value to return if the named property doesn't actually exist - */ - bool getBoolValue (StringRef keyName, bool defaultReturnValue = false) const noexcept; - - /** Returns one of the properties as an XML element. - - The result will a new XMLElement object that the caller must delete. If may return nullptr - if the key isn't found, or if the entry contains an string that isn't valid XML. - - If the value isn't found in this set, then this will look for it in a fallback - property set (if you've specified one with the setFallbackPropertySet() method), - and if it can't find one there, it'll return the default value passed-in. - - @param keyName the name of the property to retrieve - */ - XmlElement* getXmlValue (StringRef keyName) const; - - //============================================================================== - /** Sets a named property. - - @param keyName the name of the property to set. (This mustn't be an empty string) - @param value the new value to set it to - */ - void setValue (const String& keyName, const var& value); - - /** Sets a named property to an XML element. - - @param keyName the name of the property to set. (This mustn't be an empty string) - @param xml the new element to set it to. If this is zero, the value will be set to - an empty string - @see getXmlValue - */ - void setValue (const String& keyName, const XmlElement* xml); - - /** This copies all the values from a source PropertySet to this one. - This won't remove any existing settings, it just adds any that it finds in the source set. - */ - void addAllPropertiesFrom (const PropertySet& source); - - //============================================================================== - /** Deletes a property. - @param keyName the name of the property to delete. (This mustn't be an empty string) - */ - void removeValue (StringRef keyName); - - /** Returns true if the properies include the given key. */ - bool containsKey (StringRef keyName) const noexcept; - - /** Removes all values. */ - void clear(); - - //============================================================================== - /** Returns the keys/value pair array containing all the properties. */ - StringPairArray& getAllProperties() noexcept { return properties; } - - /** Returns the lock used when reading or writing to this set */ - const CriticalSection& getLock() const noexcept { return lock; } - - //============================================================================== - /** Returns an XML element which encapsulates all the items in this property set. - The string parameter is the tag name that should be used for the node. - @see restoreFromXml - */ - XmlElement* createXml (const String& nodeName) const; - - /** Reloads a set of properties that were previously stored as XML. - The node passed in must have been created by the createXml() method. - @see createXml - */ - void restoreFromXml (const XmlElement& xml); - - //============================================================================== - /** Sets up a second PopertySet that will be used to look up any values that aren't - set in this one. - - If you set this up to be a pointer to a second property set, then whenever one - of the getValue() methods fails to find an entry in this set, it will look up that - value in the fallback set, and if it finds it, it will return that. - - Make sure that you don't delete the fallback set while it's still being used by - another set! To remove the fallback set, just call this method with a null pointer. - - @see getFallbackPropertySet - */ - void setFallbackPropertySet (PropertySet* fallbackProperties) noexcept; - - /** Returns the fallback property set. - @see setFallbackPropertySet - */ - PropertySet* getFallbackPropertySet() const noexcept { return fallbackProperties; } - -protected: - /** Subclasses can override this to be told when one of the properies has been changed. */ - virtual void propertyChanged(); - -private: - StringPairArray properties; - PropertySet* fallbackProperties; - CriticalSection lock; - bool ignoreCaseOfKeys; - - JUCE_LEAK_DETECTOR (PropertySet) -}; - - -#endif // JUCE_PROPERTYSET_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h b/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h deleted file mode 100755 index 6b02c3e..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_ReferenceCountedArray.h +++ /dev/null @@ -1,897 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_REFERENCECOUNTEDARRAY_H_INCLUDED -#define JUCE_REFERENCECOUNTEDARRAY_H_INCLUDED - - -//============================================================================== -/** - Holds a list of objects derived from ReferenceCountedObject, or which implement basic - reference-count handling methods. - - The template parameter specifies the class of the object you want to point to - the easiest - way to make a class reference-countable is to simply make it inherit from ReferenceCountedObject - or SingleThreadedReferenceCountedObject, but if you need to, you can roll your own reference-countable - class by implementing a set of methods called incReferenceCount(), decReferenceCount(), and - decReferenceCountWithoutDeleting(). See ReferenceCountedObject for examples of how these methods - should behave. - - A ReferenceCountedArray holds objects derived from ReferenceCountedObject, - and takes care of incrementing and decrementing their ref counts when they - are added and removed from the array. - - To make all the array's methods thread-safe, pass in "CriticalSection" as the templated - TypeOfCriticalSectionToUse parameter, instead of the default DummyCriticalSection. - - @see Array, OwnedArray, StringArray -*/ -template -class ReferenceCountedArray -{ -public: - typedef ReferenceCountedObjectPtr ObjectClassPtr; - - //============================================================================== - /** Creates an empty array. - @see ReferenceCountedObject, Array, OwnedArray - */ - ReferenceCountedArray() noexcept - : numUsed (0) - { - } - - /** Creates a copy of another array */ - ReferenceCountedArray (const ReferenceCountedArray& other) noexcept - { - const ScopedLockType lock (other.getLock()); - numUsed = other.size(); - data.setAllocatedSize (numUsed); - memcpy (data.elements, other.getRawDataPointer(), (size_t) numUsed * sizeof (ObjectClass*)); - - for (int i = numUsed; --i >= 0;) - if (ObjectClass* o = data.elements[i]) - o->incReferenceCount(); - } - - /** Creates a copy of another array */ - template - ReferenceCountedArray (const ReferenceCountedArray& other) noexcept - { - const typename ReferenceCountedArray::ScopedLockType lock (other.getLock()); - numUsed = other.size(); - data.setAllocatedSize (numUsed); - memcpy (data.elements, other.getRawDataPointer(), numUsed * sizeof (ObjectClass*)); - - for (int i = numUsed; --i >= 0;) - if (ObjectClass* o = data.elements[i]) - o->incReferenceCount(); - } - - /** Copies another array into this one. - Any existing objects in this array will first be released. - */ - ReferenceCountedArray& operator= (const ReferenceCountedArray& other) noexcept - { - ReferenceCountedArray otherCopy (other); - swapWith (otherCopy); - return *this; - } - - /** Copies another array into this one. - Any existing objects in this array will first be released. - */ - template - ReferenceCountedArray& operator= (const ReferenceCountedArray& other) noexcept - { - ReferenceCountedArray otherCopy (other); - swapWith (otherCopy); - return *this; - } - - /** Destructor. - Any objects in the array will be released, and may be deleted if not referenced from elsewhere. - */ - ~ReferenceCountedArray() - { - clear(); - } - - //============================================================================== - /** Removes all objects from the array. - - Any objects in the array that are not referenced from elsewhere will be deleted. - */ - void clear() - { - const ScopedLockType lock (getLock()); - - while (numUsed > 0) - if (ObjectClass* o = data.elements [--numUsed]) - releaseObject (o); - - jassert (numUsed == 0); - data.setAllocatedSize (0); - } - - /** Returns the current number of objects in the array. */ - inline int size() const noexcept - { - return numUsed; - } - - /** Returns a pointer to the object at this index in the array. - - If the index is out-of-range, this will return a null pointer, (and - it could be null anyway, because it's ok for the array to hold null - pointers as well as objects). - - @see getUnchecked - */ - inline ObjectClassPtr operator[] (const int index) const noexcept - { - return getObjectPointer (index); - } - - /** Returns a pointer to the object at this index in the array, without checking - whether the index is in-range. - - This is a faster and less safe version of operator[] which doesn't check the index passed in, so - it can be used when you're sure the index is always going to be legal. - */ - inline ObjectClassPtr getUnchecked (const int index) const noexcept - { - return getObjectPointerUnchecked (index); - } - - /** Returns a raw pointer to the object at this index in the array. - - If the index is out-of-range, this will return a null pointer, (and - it could be null anyway, because it's ok for the array to hold null - pointers as well as objects). - - @see getUnchecked - */ - inline ObjectClass* getObjectPointer (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (index, numUsed)) - { - jassert (data.elements != nullptr); - return data.elements [index]; - } - - return ObjectClassPtr(); - } - - /** Returns a raw pointer to the object at this index in the array, without checking - whether the index is in-range. - */ - inline ObjectClass* getObjectPointerUnchecked (const int index) const noexcept - { - const ScopedLockType lock (getLock()); - jassert (isPositiveAndBelow (index, numUsed) && data.elements != nullptr); - return data.elements [index]; - } - - /** Returns a pointer to the first object in the array. - - This will return a null pointer if the array's empty. - @see getLast - */ - inline ObjectClassPtr getFirst() const noexcept - { - const ScopedLockType lock (getLock()); - - if (numUsed > 0) - { - jassert (data.elements != nullptr); - return data.elements [0]; - } - - return ObjectClassPtr(); - } - - /** Returns a pointer to the last object in the array. - - This will return a null pointer if the array's empty. - @see getFirst - */ - inline ObjectClassPtr getLast() const noexcept - { - const ScopedLockType lock (getLock()); - - if (numUsed > 0) - { - jassert (data.elements != nullptr); - return data.elements [numUsed - 1]; - } - - return ObjectClassPtr(); - } - - /** Returns a pointer to the actual array data. - This pointer will only be valid until the next time a non-const method - is called on the array. - */ - inline ObjectClass** getRawDataPointer() const noexcept - { - return data.elements; - } - - //============================================================================== - /** Returns a pointer to the first element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ObjectClass** begin() const noexcept - { - return data.elements; - } - - /** Returns a pointer to the element which follows the last element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ObjectClass** end() const noexcept - { - return data.elements + numUsed; - } - - //============================================================================== - /** Finds the index of the first occurrence of an object in the array. - - @param objectToLookFor the object to look for - @returns the index at which the object was found, or -1 if it's not found - */ - int indexOf (const ObjectClass* const objectToLookFor) const noexcept - { - const ScopedLockType lock (getLock()); - ObjectClass** e = data.elements.getData(); - ObjectClass** const endPointer = e + numUsed; - - while (e != endPointer) - { - if (objectToLookFor == *e) - return static_cast (e - data.elements.getData()); - - ++e; - } - - return -1; - } - - /** Returns true if the array contains a specified object. - - @param objectToLookFor the object to look for - @returns true if the object is in the array - */ - bool contains (const ObjectClass* const objectToLookFor) const noexcept - { - const ScopedLockType lock (getLock()); - ObjectClass** e = data.elements.getData(); - ObjectClass** const endPointer = e + numUsed; - - while (e != endPointer) - { - if (objectToLookFor == *e) - return true; - - ++e; - } - - return false; - } - - /** Appends a new object to the end of the array. - - This will increase the new object's reference count. - - @param newObject the new object to add to the array - @see set, insert, addIfNotAlreadyThere, addSorted, addArray - */ - ObjectClass* add (ObjectClass* const newObject) noexcept - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (numUsed + 1); - jassert (data.elements != nullptr); - data.elements [numUsed++] = newObject; - - if (newObject != nullptr) - newObject->incReferenceCount(); - - return newObject; - } - - /** Inserts a new object into the array at the given index. - - If the index is less than 0 or greater than the size of the array, the - element will be added to the end of the array. - Otherwise, it will be inserted into the array, moving all the later elements - along to make room. - - This will increase the new object's reference count. - - @param indexToInsertAt the index at which the new element should be inserted - @param newObject the new object to add to the array - @see add, addSorted, addIfNotAlreadyThere, set - */ - ObjectClass* insert (int indexToInsertAt, - ObjectClass* const newObject) noexcept - { - if (indexToInsertAt < 0) - return add (newObject); - - const ScopedLockType lock (getLock()); - - if (indexToInsertAt > numUsed) - indexToInsertAt = numUsed; - - data.ensureAllocatedSize (numUsed + 1); - jassert (data.elements != nullptr); - - ObjectClass** const e = data.elements + indexToInsertAt; - const int numToMove = numUsed - indexToInsertAt; - - if (numToMove > 0) - memmove (e + 1, e, sizeof (ObjectClass*) * (size_t) numToMove); - - *e = newObject; - - if (newObject != nullptr) - newObject->incReferenceCount(); - - ++numUsed; - - return newObject; - } - - /** Appends a new object at the end of the array as long as the array doesn't - already contain it. - - If the array already contains a matching object, nothing will be done. - - @param newObject the new object to add to the array - */ - void addIfNotAlreadyThere (ObjectClass* const newObject) noexcept - { - const ScopedLockType lock (getLock()); - if (! contains (newObject)) - add (newObject); - } - - /** Replaces an object in the array with a different one. - - If the index is less than zero, this method does nothing. - If the index is beyond the end of the array, the new object is added to the end of the array. - - The object being added has its reference count increased, and if it's replacing - another object, then that one has its reference count decreased, and may be deleted. - - @param indexToChange the index whose value you want to change - @param newObject the new value to set for this index. - @see add, insert, remove - */ - void set (const int indexToChange, - ObjectClass* const newObject) - { - if (indexToChange >= 0) - { - const ScopedLockType lock (getLock()); - - if (newObject != nullptr) - newObject->incReferenceCount(); - - if (indexToChange < numUsed) - { - if (ObjectClass* o = data.elements [indexToChange]) - releaseObject (o); - - data.elements [indexToChange] = newObject; - } - else - { - data.ensureAllocatedSize (numUsed + 1); - jassert (data.elements != nullptr); - data.elements [numUsed++] = newObject; - } - } - } - - /** Adds elements from another array to the end of this array. - - @param arrayToAddFrom the array from which to copy the elements - @param startIndex the first element of the other array to start copying from - @param numElementsToAdd how many elements to add from the other array. If this - value is negative or greater than the number of available elements, - all available elements will be copied. - @see add - */ - void addArray (const ReferenceCountedArray& arrayToAddFrom, - int startIndex = 0, - int numElementsToAdd = -1) noexcept - { - const ScopedLockType lock1 (arrayToAddFrom.getLock()); - - { - const ScopedLockType lock2 (getLock()); - - if (startIndex < 0) - { - jassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > arrayToAddFrom.size()) - numElementsToAdd = arrayToAddFrom.size() - startIndex; - - if (numElementsToAdd > 0) - { - data.ensureAllocatedSize (numUsed + numElementsToAdd); - - while (--numElementsToAdd >= 0) - add (arrayToAddFrom.getUnchecked (startIndex++)); - } - } - } - - /** Inserts a new object into the array assuming that the array is sorted. - - This will use a comparator to find the position at which the new object - should go. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator object to use to compare the elements - see the - sort() method for details about this object's form - @param newObject the new object to insert to the array - @returns the index at which the new object was added - @see add, sort - */ - template - int addSorted (ElementComparator& comparator, ObjectClass* newObject) noexcept - { - const ScopedLockType lock (getLock()); - const int index = findInsertIndexInSortedArray (comparator, data.elements.getData(), newObject, 0, numUsed); - insert (index, newObject); - return index; - } - - /** Inserts or replaces an object in the array, assuming it is sorted. - - This is similar to addSorted, but if a matching element already exists, then it will be - replaced by the new one, rather than the new one being added as well. - */ - template - void addOrReplaceSorted (ElementComparator& comparator, - ObjectClass* newObject) noexcept - { - const ScopedLockType lock (getLock()); - const int index = findInsertIndexInSortedArray (comparator, data.elements.getData(), newObject, 0, numUsed); - - if (index > 0 && comparator.compareElements (newObject, data.elements [index - 1]) == 0) - set (index - 1, newObject); // replace an existing object that matches - else - insert (index, newObject); // no match, so insert the new one - } - - /** Finds the index of an object in the array, assuming that the array is sorted. - - This will use a comparator to do a binary-chop to find the index of the given - element, if it exists. If the array isn't sorted, the behaviour of this - method will be unpredictable. - - @param comparator the comparator to use to compare the elements - see the sort() - method for details about the form this object should take - @param objectToLookFor the object to search for - @returns the index of the element, or -1 if it's not found - @see addSorted, sort - */ - template - int indexOfSorted (ElementComparator& comparator, - const ObjectClass* const objectToLookFor) const noexcept - { - (void) comparator; - const ScopedLockType lock (getLock()); - int s = 0, e = numUsed; - - while (s < e) - { - if (comparator.compareElements (objectToLookFor, data.elements [s]) == 0) - return s; - - const int halfway = (s + e) / 2; - if (halfway == s) - break; - - if (comparator.compareElements (objectToLookFor, data.elements [halfway]) >= 0) - s = halfway; - else - e = halfway; - } - - return -1; - } - - //============================================================================== - /** Removes an object from the array. - - This will remove the object at a given index and move back all the - subsequent objects to close the gap. - - If the index passed in is out-of-range, nothing will happen. - - The object that is removed will have its reference count decreased, - and may be deleted if not referenced from elsewhere. - - @param indexToRemove the index of the element to remove - @see removeObject, removeRange - */ - void remove (const int indexToRemove) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - ObjectClass** const e = data.elements + indexToRemove; - - if (ObjectClass* o = *e) - releaseObject (o); - - --numUsed; - const int numberToShift = numUsed - indexToRemove; - - if (numberToShift > 0) - memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numberToShift); - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - } - - /** Removes and returns an object from the array. - - This will remove the object at a given index and return it, moving back all - the subsequent objects to close the gap. If the index passed in is out-of-range, - nothing will happen and a null pointer will be returned. - - @param indexToRemove the index of the element to remove - @see remove, removeObject, removeRange - */ - ObjectClassPtr removeAndReturn (const int indexToRemove) - { - ObjectClassPtr removedItem; - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (indexToRemove, numUsed)) - { - ObjectClass** const e = data.elements + indexToRemove; - - if (ObjectClass* o = *e) - { - removedItem = o; - releaseObject (o); - } - - --numUsed; - const int numberToShift = numUsed - indexToRemove; - - if (numberToShift > 0) - memmove (e, e + 1, sizeof (ObjectClass*) * (size_t) numberToShift); - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - - return removedItem; - } - - /** Removes the first occurrence of a specified object from the array. - - If the item isn't found, no action is taken. If it is found, it is - removed and has its reference count decreased. - - @param objectToRemove the object to try to remove - @see remove, removeRange - */ - void removeObject (ObjectClass* const objectToRemove) - { - const ScopedLockType lock (getLock()); - remove (indexOf (objectToRemove)); - } - - /** Removes a range of objects from the array. - - This will remove a set of objects, starting from the given index, - and move any subsequent elements down to close the gap. - - If the range extends beyond the bounds of the array, it will - be safely clipped to the size of the array. - - The objects that are removed will have their reference counts decreased, - and may be deleted if not referenced from elsewhere. - - @param startIndex the index of the first object to remove - @param numberToRemove how many objects should be removed - @see remove, removeObject - */ - void removeRange (const int startIndex, - const int numberToRemove) - { - const ScopedLockType lock (getLock()); - - const int start = jlimit (0, numUsed, startIndex); - const int endIndex = jlimit (0, numUsed, startIndex + numberToRemove); - - if (endIndex > start) - { - int i; - for (i = start; i < endIndex; ++i) - { - if (ObjectClass* o = data.elements[i]) - { - releaseObject (o); - data.elements[i] = nullptr; // (in case one of the destructors accesses this array and hits a dangling pointer) - } - } - - const int rangeSize = endIndex - start; - ObjectClass** e = data.elements + start; - i = numUsed - endIndex; - numUsed -= rangeSize; - - while (--i >= 0) - { - *e = e [rangeSize]; - ++e; - } - - if ((numUsed << 1) < data.numAllocated) - minimiseStorageOverheads(); - } - } - - /** Removes the last n objects from the array. - - The objects that are removed will have their reference counts decreased, - and may be deleted if not referenced from elsewhere. - - @param howManyToRemove how many objects to remove from the end of the array - @see remove, removeObject, removeRange - */ - void removeLast (int howManyToRemove = 1) - { - const ScopedLockType lock (getLock()); - - if (howManyToRemove > numUsed) - howManyToRemove = numUsed; - - while (--howManyToRemove >= 0) - remove (numUsed - 1); - } - - /** Swaps a pair of objects in the array. - - If either of the indexes passed in is out-of-range, nothing will happen, - otherwise the two objects at these positions will be exchanged. - */ - void swap (const int index1, - const int index2) noexcept - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (index1, numUsed) - && isPositiveAndBelow (index2, numUsed)) - { - std::swap (data.elements [index1], - data.elements [index2]); - } - } - - /** Moves one of the objects to a different position. - - This will move the object to a specified index, shuffling along - any intervening elements as required. - - So for example, if you have the array { 0, 1, 2, 3, 4, 5 } then calling - move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }. - - @param currentIndex the index of the object to be moved. If this isn't a - valid index, then nothing will be done - @param newIndex the index at which you'd like this object to end up. If this - is less than zero, it will be moved to the end of the array - */ - void move (const int currentIndex, - int newIndex) noexcept - { - if (currentIndex != newIndex) - { - const ScopedLockType lock (getLock()); - - if (isPositiveAndBelow (currentIndex, numUsed)) - { - if (! isPositiveAndBelow (newIndex, numUsed)) - newIndex = numUsed - 1; - - ObjectClass* const value = data.elements [currentIndex]; - - if (newIndex > currentIndex) - { - memmove (data.elements + currentIndex, - data.elements + currentIndex + 1, - sizeof (ObjectClass*) * (size_t) (newIndex - currentIndex)); - } - else - { - memmove (data.elements + newIndex + 1, - data.elements + newIndex, - sizeof (ObjectClass*) * (size_t) (currentIndex - newIndex)); - } - - data.elements [newIndex] = value; - } - } - } - - //============================================================================== - /** This swaps the contents of this array with those of another array. - - If you need to exchange two arrays, this is vastly quicker than using copy-by-value - because it just swaps their internal pointers. - */ - template - void swapWith (OtherArrayType& otherArray) noexcept - { - const ScopedLockType lock1 (getLock()); - const typename OtherArrayType::ScopedLockType lock2 (otherArray.getLock()); - data.swapWith (otherArray.data); - std::swap (numUsed, otherArray.numUsed); - } - - //============================================================================== - /** Compares this array to another one. - - @returns true only if the other array contains the same objects in the same order - */ - bool operator== (const ReferenceCountedArray& other) const noexcept - { - const ScopedLockType lock2 (other.getLock()); - const ScopedLockType lock1 (getLock()); - - if (numUsed != other.numUsed) - return false; - - for (int i = numUsed; --i >= 0;) - if (data.elements [i] != other.data.elements [i]) - return false; - - return true; - } - - /** Compares this array to another one. - - @see operator== - */ - bool operator!= (const ReferenceCountedArray& other) const noexcept - { - return ! operator== (other); - } - - //============================================================================== - /** Sorts the elements in the array. - - This will use a comparator object to sort the elements into order. The object - passed must have a method of the form: - @code - int compareElements (ElementType first, ElementType second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator the comparator to use for comparing elements. - @param retainOrderOfEquivalentItems if this is true, then items - which the comparator says are equivalent will be - kept in the order in which they currently appear - in the array. This is slower to perform, but may - be important in some cases. If it's false, a faster - algorithm is used, but equivalent elements may be - rearranged. - - @see sortArray - */ - template - void sort (ElementComparator& comparator, - const bool retainOrderOfEquivalentItems = false) const noexcept - { - (void) comparator; // if you pass in an object with a static compareElements() method, this - // avoids getting warning messages about the parameter being unused - - const ScopedLockType lock (getLock()); - sortArray (comparator, data.elements.getData(), 0, size() - 1, retainOrderOfEquivalentItems); - } - - //============================================================================== - /** Reduces the amount of storage being used by the array. - - Arrays typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads() noexcept - { - const ScopedLockType lock (getLock()); - data.shrinkToNoMoreThan (numUsed); - } - - /** Increases the array's internal storage to hold a minimum number of elements. - - Calling this before adding a large known number of elements means that - the array won't have to keep dynamically resizing itself as the elements - are added, and it'll therefore be more efficient. - */ - void ensureStorageAllocated (const int minNumElements) - { - const ScopedLockType lock (getLock()); - data.ensureAllocatedSize (minNumElements); - } - - //============================================================================== - /** Returns the CriticalSection that locks this array. - To lock, you can call getLock().enter() and getLock().exit(), or preferably use - an object of ScopedLockType as an RAII lock for it. - */ - inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data; } - - /** Returns the type of scoped lock to use for locking this array */ - typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType; - - - //============================================================================== - #ifndef DOXYGEN - // Note that the swapWithArray method has been replaced by a more flexible templated version, - // and renamed "swapWith" to be more consistent with the names used in other classes. - JUCE_DEPRECATED_WITH_BODY (void swapWithArray (ReferenceCountedArray& other) noexcept, { swapWith (other); }) - #endif - -private: - //============================================================================== - ArrayAllocationBase data; - int numUsed; - - static void releaseObject (ObjectClass* o) - { - if (o->decReferenceCountWithoutDeleting()) - ContainerDeletePolicy::destroy (o); - } -}; - - -#endif // JUCE_REFERENCECOUNTEDARRAY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h b/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h deleted file mode 100755 index 13b871e..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_ScopedValueSetter.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SCOPEDVALUESETTER_H_INCLUDED -#define JUCE_SCOPEDVALUESETTER_H_INCLUDED - - -//============================================================================== -/** - Helper class providing an RAII-based mechanism for temporarily setting and - then re-setting a value. - - E.g. @code - int x = 1; - - { - ScopedValueSetter setter (x, 2); - - // x is now 2 - } - - // x is now 1 again - - { - ScopedValueSetter setter (x, 3, 4); - - // x is now 3 - } - - // x is now 4 - @endcode - -*/ -template -class ScopedValueSetter -{ -public: - /** Creates a ScopedValueSetter that will immediately change the specified value to the - given new value, and will then reset it to its original value when this object is deleted. - */ - ScopedValueSetter (ValueType& valueToSet, - ValueType newValue) - : value (valueToSet), - originalValue (valueToSet) - { - valueToSet = newValue; - } - - /** Creates a ScopedValueSetter that will immediately change the specified value to the - given new value, and will then reset it to be valueWhenDeleted when this object is deleted. - */ - ScopedValueSetter (ValueType& valueToSet, - ValueType newValue, - ValueType valueWhenDeleted) - : value (valueToSet), - originalValue (valueWhenDeleted) - { - valueToSet = newValue; - } - - ~ScopedValueSetter() - { - value = originalValue; - } - -private: - //============================================================================== - ValueType& value; - const ValueType originalValue; - - JUCE_DECLARE_NON_COPYABLE (ScopedValueSetter) -}; - - -#endif // JUCE_SCOPEDVALUESETTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h b/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h deleted file mode 100755 index 62fd923..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_SortedSet.h +++ /dev/null @@ -1,494 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SORTEDSET_H_INCLUDED -#define JUCE_SORTEDSET_H_INCLUDED - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4512) -#endif - -//============================================================================== -/** - Holds a set of unique primitive objects, such as ints or doubles. - - A set can only hold one item with a given value, so if for example it's a - set of integers, attempting to add the same integer twice will do nothing - the second time. - - Internally, the list of items is kept sorted (which means that whatever - kind of primitive type is used must support the ==, <, >, <= and >= operators - to determine the order), and searching the set for known values is very fast - because it uses a binary-chop method. - - Note that if you're using a class or struct as the element type, it must be - capable of being copied or moved with a straightforward memcpy, rather than - needing construction and destruction code. - - To make all the set's methods thread-safe, pass in "CriticalSection" as the templated - TypeOfCriticalSectionToUse parameter, instead of the default DummyCriticalSection. - - @see Array, OwnedArray, ReferenceCountedArray, StringArray, CriticalSection -*/ -template -class SortedSet -{ -public: - //============================================================================== - /** Creates an empty set. */ - SortedSet() noexcept - { - } - - /** Creates a copy of another set. - @param other the set to copy - */ - SortedSet (const SortedSet& other) - : data (other.data) - { - } - - /** Destructor. */ - ~SortedSet() noexcept - { - } - - /** Copies another set over this one. - @param other the set to copy - */ - SortedSet& operator= (const SortedSet& other) noexcept - { - data = other.data; - return *this; - } - - //============================================================================== - /** Compares this set to another one. - Two sets are considered equal if they both contain the same set of elements. - @param other the other set to compare with - */ - bool operator== (const SortedSet& other) const noexcept - { - return data == other.data; - } - - /** Compares this set to another one. - Two sets are considered equal if they both contain the same set of elements. - @param other the other set to compare with - */ - bool operator!= (const SortedSet& other) const noexcept - { - return ! operator== (other); - } - - //============================================================================== - /** Removes all elements from the set. - - This will remove all the elements, and free any storage that the set is - using. To clear it without freeing the storage, use the clearQuick() - method instead. - - @see clearQuick - */ - void clear() noexcept - { - data.clear(); - } - - /** Removes all elements from the set without freeing the array's allocated storage. - @see clear - */ - void clearQuick() noexcept - { - data.clearQuick(); - } - - //============================================================================== - /** Returns the current number of elements in the set. */ - inline int size() const noexcept - { - return data.size(); - } - - /** Returns one of the elements in the set. - - If the index passed in is beyond the range of valid elements, this - will return zero. - - If you're certain that the index will always be a valid element, you - can call getUnchecked() instead, which is faster. - - @param index the index of the element being requested (0 is the first element in the set) - @see getUnchecked, getFirst, getLast - */ - inline ElementType operator[] (const int index) const noexcept - { - return data [index]; - } - - /** Returns one of the elements in the set, without checking the index passed in. - Unlike the operator[] method, this will try to return an element without - checking that the index is within the bounds of the set, so should only - be used when you're confident that it will always be a valid index. - - @param index the index of the element being requested (0 is the first element in the set) - @see operator[], getFirst, getLast - */ - inline ElementType getUnchecked (const int index) const noexcept - { - return data.getUnchecked (index); - } - - /** Returns a direct reference to one of the elements in the set, without checking the index passed in. - - This is like getUnchecked, but returns a direct reference to the element, so that - you can alter it directly. Obviously this can be dangerous, so only use it when - absolutely necessary. - - @param index the index of the element being requested (0 is the first element in the array) - */ - inline ElementType& getReference (const int index) const noexcept - { - return data.getReference (index); - } - - /** Returns the first element in the set, or 0 if the set is empty. - @see operator[], getUnchecked, getLast - */ - inline ElementType getFirst() const noexcept - { - return data.getFirst(); - } - - /** Returns the last element in the set, or 0 if the set is empty. - @see operator[], getUnchecked, getFirst - */ - inline ElementType getLast() const noexcept - { - return data.getLast(); - } - - //============================================================================== - /** Returns a pointer to the first element in the set. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ElementType* begin() const noexcept - { - return data.begin(); - } - - /** Returns a pointer to the element which follows the last element in the set. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline ElementType* end() const noexcept - { - return data.end(); - } - - //============================================================================== - /** Finds the index of the first element which matches the value passed in. - - This will search the set for the given object, and return the index - of its first occurrence. If the object isn't found, the method will return -1. - - @param elementToLookFor the value or object to look for - @returns the index of the object, or -1 if it's not found - */ - int indexOf (const ElementType& elementToLookFor) const noexcept - { - const ScopedLockType lock (data.getLock()); - - int s = 0; - int e = data.size(); - - for (;;) - { - if (s >= e) - return -1; - - if (elementToLookFor == data.getReference (s)) - return s; - - const int halfway = (s + e) / 2; - - if (halfway == s) - return -1; - - if (elementToLookFor < data.getReference (halfway)) - e = halfway; - else - s = halfway; - } - } - - /** Returns true if the set contains at least one occurrence of an object. - - @param elementToLookFor the value or object to look for - @returns true if the item is found - */ - bool contains (const ElementType& elementToLookFor) const noexcept - { - return indexOf (elementToLookFor) >= 0; - } - - //============================================================================== - /** Adds a new element to the set, (as long as it's not already in there). - - Note that if a matching element already exists, the new value will be assigned - to the existing one using operator=, so that if there are any differences between - the objects which were not recognised by the object's operator==, then the - set will always contain a copy of the most recently added one. - - @param newElement the new object to add to the set - @returns true if the value was added, or false if it already existed - @see set, insert, addIfNotAlreadyThere, addSorted, addSet, addArray - */ - bool add (const ElementType& newElement) noexcept - { - const ScopedLockType lock (getLock()); - - int s = 0; - int e = data.size(); - - while (s < e) - { - ElementType& elem = data.getReference (s); - if (newElement == elem) - { - elem = newElement; // force an update in case operator== permits differences. - return false; - } - - const int halfway = (s + e) / 2; - const bool isBeforeHalfway = (newElement < data.getReference (halfway)); - - if (halfway == s) - { - if (! isBeforeHalfway) - ++s; - - break; - } - - if (isBeforeHalfway) - e = halfway; - else - s = halfway; - } - - data.insert (s, newElement); - return true; - } - - /** Adds elements from an array to this set. - - @param elementsToAdd the array of elements to add - @param numElementsToAdd how many elements are in this other array - @see add - */ - void addArray (const ElementType* elementsToAdd, - int numElementsToAdd) noexcept - { - const ScopedLockType lock (getLock()); - - while (--numElementsToAdd >= 0) - add (*elementsToAdd++); - } - - /** Adds elements from another set to this one. - - @param setToAddFrom the set from which to copy the elements - @param startIndex the first element of the other set to start copying from - @param numElementsToAdd how many elements to add from the other set. If this - value is negative or greater than the number of available elements, - all available elements will be copied. - @see add - */ - template - void addSet (const OtherSetType& setToAddFrom, - int startIndex = 0, - int numElementsToAdd = -1) noexcept - { - const typename OtherSetType::ScopedLockType lock1 (setToAddFrom.getLock()); - - { - const ScopedLockType lock2 (getLock()); - jassert (this != &setToAddFrom); - - if (this != &setToAddFrom) - { - if (startIndex < 0) - { - jassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > setToAddFrom.size()) - numElementsToAdd = setToAddFrom.size() - startIndex; - - if (numElementsToAdd > 0) - addArray (&setToAddFrom.data.getReference (startIndex), numElementsToAdd); - } - } - } - - //============================================================================== - /** Removes an element from the set. - - This will remove the element at a given index. - If the index passed in is out-of-range, nothing will happen. - - @param indexToRemove the index of the element to remove - @returns the element that has been removed - @see removeValue, removeRange - */ - ElementType remove (const int indexToRemove) noexcept - { - return data.remove (indexToRemove); - } - - /** Removes an item from the set. - - This will remove the given element from the set, if it's there. - - @param valueToRemove the object to try to remove - @see remove, removeRange - */ - void removeValue (const ElementType valueToRemove) noexcept - { - const ScopedLockType lock (getLock()); - data.remove (indexOf (valueToRemove)); - } - - /** Removes any elements which are also in another set. - - @param otherSet the other set in which to look for elements to remove - @see removeValuesNotIn, remove, removeValue, removeRange - */ - template - void removeValuesIn (const OtherSetType& otherSet) noexcept - { - const typename OtherSetType::ScopedLockType lock1 (otherSet.getLock()); - const ScopedLockType lock2 (getLock()); - - if (this == &otherSet) - { - clear(); - } - else if (otherSet.size() > 0) - { - for (int i = data.size(); --i >= 0;) - if (otherSet.contains (data.getReference (i))) - remove (i); - } - } - - /** Removes any elements which are not found in another set. - - Only elements which occur in this other set will be retained. - - @param otherSet the set in which to look for elements NOT to remove - @see removeValuesIn, remove, removeValue, removeRange - */ - template - void removeValuesNotIn (const OtherSetType& otherSet) noexcept - { - const typename OtherSetType::ScopedLockType lock1 (otherSet.getLock()); - const ScopedLockType lock2 (getLock()); - - if (this != &otherSet) - { - if (otherSet.size() <= 0) - { - clear(); - } - else - { - for (int i = data.size(); --i >= 0;) - if (! otherSet.contains (data.getReference (i))) - remove (i); - } - } - } - - /** This swaps the contents of this array with those of another array. - - If you need to exchange two arrays, this is vastly quicker than using copy-by-value - because it just swaps their internal pointers. - */ - template - void swapWith (OtherSetType& otherSet) noexcept - { - data.swapWith (otherSet.data); - } - - //============================================================================== - /** Reduces the amount of storage being used by the set. - - Sets typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads() noexcept - { - data.minimiseStorageOverheads(); - } - - /** Increases the set's internal storage to hold a minimum number of elements. - - Calling this before adding a large known number of elements means that - the set won't have to keep dynamically resizing itself as the elements - are added, and it'll therefore be more efficient. - */ - void ensureStorageAllocated (const int minNumElements) - { - data.ensureStorageAllocated (minNumElements); - } - - //============================================================================== - /** Returns the CriticalSection that locks this array. - To lock, you can call getLock().enter() and getLock().exit(), or preferably use - an object of ScopedLockType as an RAII lock for it. - */ - inline const TypeOfCriticalSectionToUse& getLock() const noexcept { return data.getLock(); } - - /** Returns the type of scoped lock to use for locking this array */ - typedef typename TypeOfCriticalSectionToUse::ScopedLockType ScopedLockType; - - -private: - //============================================================================== - Array data; -}; - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -#endif // JUCE_SORTEDSET_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h b/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h deleted file mode 100755 index 86366fc..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_SparseSet.h +++ /dev/null @@ -1,298 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SPARSESET_H_INCLUDED -#define JUCE_SPARSESET_H_INCLUDED - - -//============================================================================== -/** - Holds a set of primitive values, storing them as a set of ranges. - - This container acts like an array, but can efficiently hold large contiguous - ranges of values. It's quite a specialised class, mostly useful for things - like keeping the set of selected rows in a listbox. - - The type used as a template parameter must be an integer type, such as int, short, - int64, etc. -*/ -template -class SparseSet -{ -public: - //============================================================================== - /** Creates a new empty set. */ - SparseSet() - { - } - - /** Creates a copy of another SparseSet. */ - SparseSet (const SparseSet& other) - : values (other.values) - { - } - - //============================================================================== - /** Clears the set. */ - void clear() - { - values.clear(); - } - - /** Checks whether the set is empty. - - This is much quicker than using (size() == 0). - */ - bool isEmpty() const noexcept - { - return values.size() == 0; - } - - /** Returns the number of values in the set. - - Because of the way the data is stored, this method can take longer if there - are a lot of items in the set. Use isEmpty() for a quick test of whether there - are any items. - */ - Type size() const - { - Type total (0); - - for (int i = 0; i < values.size(); i += 2) - total += values.getUnchecked (i + 1) - values.getUnchecked (i); - - return total; - } - - /** Returns one of the values in the set. - - @param index the index of the value to retrieve, in the range 0 to (size() - 1). - @returns the value at this index, or 0 if it's out-of-range - */ - Type operator[] (Type index) const - { - for (int i = 0; i < values.size(); i += 2) - { - const Type start (values.getUnchecked (i)); - const Type len (values.getUnchecked (i + 1) - start); - - if (index < len) - return start + index; - - index -= len; - } - - return Type(); - } - - /** Checks whether a particular value is in the set. */ - bool contains (const Type valueToLookFor) const - { - for (int i = 0; i < values.size(); ++i) - if (valueToLookFor < values.getUnchecked(i)) - return (i & 1) != 0; - - return false; - } - - //============================================================================== - /** Returns the number of contiguous blocks of values. - @see getRange - */ - int getNumRanges() const noexcept - { - return values.size() >> 1; - } - - /** Returns one of the contiguous ranges of values stored. - @param rangeIndex the index of the range to look up, between 0 - and (getNumRanges() - 1) - @see getTotalRange - */ - const Range getRange (const int rangeIndex) const - { - if (isPositiveAndBelow (rangeIndex, getNumRanges())) - return Range (values.getUnchecked (rangeIndex << 1), - values.getUnchecked ((rangeIndex << 1) + 1)); - - return Range(); - } - - /** Returns the range between the lowest and highest values in the set. - @see getRange - */ - Range getTotalRange() const - { - if (values.size() > 0) - { - jassert ((values.size() & 1) == 0); - return Range (values.getUnchecked (0), - values.getUnchecked (values.size() - 1)); - } - - return Range(); - } - - //============================================================================== - /** Adds a range of contiguous values to the set. - e.g. addRange (Range \ (10, 14)) will add (10, 11, 12, 13) to the set. - */ - void addRange (const Range range) - { - jassert (range.getLength() >= 0); - if (range.getLength() > 0) - { - removeRange (range); - - values.addUsingDefaultSort (range.getStart()); - values.addUsingDefaultSort (range.getEnd()); - - simplify(); - } - } - - /** Removes a range of values from the set. - e.g. removeRange (Range\ (10, 14)) will remove (10, 11, 12, 13) from the set. - */ - void removeRange (const Range rangeToRemove) - { - jassert (rangeToRemove.getLength() >= 0); - - if (rangeToRemove.getLength() > 0 - && values.size() > 0 - && rangeToRemove.getStart() < values.getUnchecked (values.size() - 1) - && values.getUnchecked(0) < rangeToRemove.getEnd()) - { - const bool onAtStart = contains (rangeToRemove.getStart() - 1); - const Type lastValue (jmin (rangeToRemove.getEnd(), values.getLast())); - const bool onAtEnd = contains (lastValue); - - for (int i = values.size(); --i >= 0;) - { - if (values.getUnchecked(i) <= lastValue) - { - while (values.getUnchecked(i) >= rangeToRemove.getStart()) - { - values.remove (i); - - if (--i < 0) - break; - } - - break; - } - } - - if (onAtStart) values.addUsingDefaultSort (rangeToRemove.getStart()); - if (onAtEnd) values.addUsingDefaultSort (lastValue); - - simplify(); - } - } - - /** Does an XOR of the values in a given range. */ - void invertRange (const Range range) - { - SparseSet newItems; - newItems.addRange (range); - - for (int i = getNumRanges(); --i >= 0;) - newItems.removeRange (getRange (i)); - - removeRange (range); - - for (int i = newItems.getNumRanges(); --i >= 0;) - addRange (newItems.getRange(i)); - } - - /** Checks whether any part of a given range overlaps any part of this set. */ - bool overlapsRange (const Range range) - { - if (range.getLength() > 0) - { - for (int i = getNumRanges(); --i >= 0;) - { - if (values.getUnchecked ((i << 1) + 1) <= range.getStart()) - return false; - - if (values.getUnchecked (i << 1) < range.getEnd()) - return true; - } - } - - return false; - } - - /** Checks whether the whole of a given range is contained within this one. */ - bool containsRange (const Range range) - { - if (range.getLength() > 0) - { - for (int i = getNumRanges(); --i >= 0;) - { - if (values.getUnchecked ((i << 1) + 1) <= range.getStart()) - return false; - - if (values.getUnchecked (i << 1) <= range.getStart() - && range.getEnd() <= values.getUnchecked ((i << 1) + 1)) - return true; - } - } - - return false; - } - - //============================================================================== - bool operator== (const SparseSet& other) noexcept - { - return values == other.values; - } - - bool operator!= (const SparseSet& other) noexcept - { - return values != other.values; - } - -private: - //============================================================================== - // alternating start/end values of ranges of values that are present. - Array values; - - void simplify() - { - jassert ((values.size() & 1) == 0); - - for (int i = values.size(); --i > 0;) - if (values.getUnchecked(i) == values.getUnchecked (i - 1)) - values.removeRange (--i, 2); - } -}; - - - -#endif // JUCE_SPARSESET_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp b/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp deleted file mode 100755 index 7943ab5..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_Variant.cpp +++ /dev/null @@ -1,780 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -enum VariantStreamMarkers -{ - varMarker_Int = 1, - varMarker_BoolTrue = 2, - varMarker_BoolFalse = 3, - varMarker_Double = 4, - varMarker_String = 5, - varMarker_Int64 = 6, - varMarker_Array = 7, - varMarker_Binary = 8, - varMarker_Undefined = 9 -}; - -//============================================================================== -class var::VariantType -{ -public: - VariantType() noexcept {} - virtual ~VariantType() noexcept {} - - virtual int toInt (const ValueUnion&) const noexcept { return 0; } - virtual int64 toInt64 (const ValueUnion&) const noexcept { return 0; } - virtual double toDouble (const ValueUnion&) const noexcept { return 0; } - virtual String toString (const ValueUnion&) const { return String::empty; } - virtual bool toBool (const ValueUnion&) const noexcept { return false; } - virtual ReferenceCountedObject* toObject (const ValueUnion&) const noexcept { return nullptr; } - virtual Array* toArray (const ValueUnion&) const noexcept { return nullptr; } - virtual MemoryBlock* toBinary (const ValueUnion&) const noexcept { return nullptr; } - virtual var clone (const var& original) const { return original; } - - virtual bool isVoid() const noexcept { return false; } - virtual bool isUndefined() const noexcept { return false; } - virtual bool isInt() const noexcept { return false; } - virtual bool isInt64() const noexcept { return false; } - virtual bool isBool() const noexcept { return false; } - virtual bool isDouble() const noexcept { return false; } - virtual bool isString() const noexcept { return false; } - virtual bool isObject() const noexcept { return false; } - virtual bool isArray() const noexcept { return false; } - virtual bool isBinary() const noexcept { return false; } - virtual bool isMethod() const noexcept { return false; } - - virtual void cleanUp (ValueUnion&) const noexcept {} - virtual void createCopy (ValueUnion& dest, const ValueUnion& source) const { dest = source; } - virtual bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept = 0; - virtual void writeToStream (const ValueUnion& data, OutputStream& output) const = 0; -}; - -//============================================================================== -class var::VariantType_Void : public var::VariantType -{ -public: - VariantType_Void() noexcept {} - static const VariantType_Void instance; - - bool isVoid() const noexcept override { return true; } - bool equals (const ValueUnion&, const ValueUnion&, const VariantType& otherType) const noexcept override { return otherType.isVoid() || otherType.isUndefined(); } - void writeToStream (const ValueUnion&, OutputStream& output) const override { output.writeCompressedInt (0); } -}; - -//============================================================================== -class var::VariantType_Undefined : public var::VariantType -{ -public: - VariantType_Undefined() noexcept {} - static const VariantType_Undefined instance; - - bool isUndefined() const noexcept override { return true; } - String toString (const ValueUnion&) const override { return "undefined"; } - bool equals (const ValueUnion&, const ValueUnion&, const VariantType& otherType) const noexcept override { return otherType.isVoid() || otherType.isUndefined(); } - - void writeToStream (const ValueUnion&, OutputStream& output) const override - { - output.writeCompressedInt (1); - output.writeByte (varMarker_Undefined); - } -}; - -//============================================================================== -class var::VariantType_Int : public var::VariantType -{ -public: - VariantType_Int() noexcept {} - static const VariantType_Int instance; - - int toInt (const ValueUnion& data) const noexcept override { return data.intValue; }; - int64 toInt64 (const ValueUnion& data) const noexcept override { return (int64) data.intValue; }; - double toDouble (const ValueUnion& data) const noexcept override { return (double) data.intValue; } - String toString (const ValueUnion& data) const override { return String (data.intValue); } - bool toBool (const ValueUnion& data) const noexcept override { return data.intValue != 0; } - bool isInt() const noexcept override { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override - { - if (otherType.isDouble() || otherType.isInt64() || otherType.isString()) - return otherType.equals (otherData, data, *this); - - return otherType.toInt (otherData) == data.intValue; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const override - { - output.writeCompressedInt (5); - output.writeByte (varMarker_Int); - output.writeInt (data.intValue); - } -}; - -//============================================================================== -class var::VariantType_Int64 : public var::VariantType -{ -public: - VariantType_Int64() noexcept {} - static const VariantType_Int64 instance; - - int toInt (const ValueUnion& data) const noexcept override { return (int) data.int64Value; }; - int64 toInt64 (const ValueUnion& data) const noexcept override { return data.int64Value; }; - double toDouble (const ValueUnion& data) const noexcept override { return (double) data.int64Value; } - String toString (const ValueUnion& data) const override { return String (data.int64Value); } - bool toBool (const ValueUnion& data) const noexcept override { return data.int64Value != 0; } - bool isInt64() const noexcept override { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override - { - if (otherType.isDouble() || otherType.isString()) - return otherType.equals (otherData, data, *this); - - return otherType.toInt64 (otherData) == data.int64Value; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const override - { - output.writeCompressedInt (9); - output.writeByte (varMarker_Int64); - output.writeInt64 (data.int64Value); - } -}; - -//============================================================================== -class var::VariantType_Double : public var::VariantType -{ -public: - VariantType_Double() noexcept {} - static const VariantType_Double instance; - - int toInt (const ValueUnion& data) const noexcept override { return (int) data.doubleValue; }; - int64 toInt64 (const ValueUnion& data) const noexcept override { return (int64) data.doubleValue; }; - double toDouble (const ValueUnion& data) const noexcept override { return data.doubleValue; } - String toString (const ValueUnion& data) const override { return String (data.doubleValue); } - bool toBool (const ValueUnion& data) const noexcept override { return data.doubleValue != 0; } - bool isDouble() const noexcept override { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override - { - return std::abs (otherType.toDouble (otherData) - data.doubleValue) < std::numeric_limits::epsilon(); - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const override - { - output.writeCompressedInt (9); - output.writeByte (varMarker_Double); - output.writeDouble (data.doubleValue); - } -}; - -//============================================================================== -class var::VariantType_Bool : public var::VariantType -{ -public: - VariantType_Bool() noexcept {} - static const VariantType_Bool instance; - - int toInt (const ValueUnion& data) const noexcept override { return data.boolValue ? 1 : 0; }; - int64 toInt64 (const ValueUnion& data) const noexcept override { return data.boolValue ? 1 : 0; }; - double toDouble (const ValueUnion& data) const noexcept override { return data.boolValue ? 1.0 : 0.0; } - String toString (const ValueUnion& data) const override { return String::charToString (data.boolValue ? (juce_wchar) '1' : (juce_wchar) '0'); } - bool toBool (const ValueUnion& data) const noexcept override { return data.boolValue; } - bool isBool() const noexcept override { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override - { - return otherType.toBool (otherData) == data.boolValue; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const override - { - output.writeCompressedInt (1); - output.writeByte (data.boolValue ? (char) varMarker_BoolTrue : (char) varMarker_BoolFalse); - } -}; - -//============================================================================== -class var::VariantType_String : public var::VariantType -{ -public: - VariantType_String() noexcept {} - static const VariantType_String instance; - - void cleanUp (ValueUnion& data) const noexcept override { getString (data)-> ~String(); } - void createCopy (ValueUnion& dest, const ValueUnion& source) const override { new (dest.stringValue) String (*getString (source)); } - - bool isString() const noexcept override { return true; } - int toInt (const ValueUnion& data) const noexcept override { return getString (data)->getIntValue(); }; - int64 toInt64 (const ValueUnion& data) const noexcept override { return getString (data)->getLargeIntValue(); }; - double toDouble (const ValueUnion& data) const noexcept override { return getString (data)->getDoubleValue(); } - String toString (const ValueUnion& data) const override { return *getString (data); } - bool toBool (const ValueUnion& data) const noexcept override { return getString (data)->getIntValue() != 0 - || getString (data)->trim().equalsIgnoreCase ("true") - || getString (data)->trim().equalsIgnoreCase ("yes"); } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override - { - return otherType.toString (otherData) == *getString (data); - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const override - { - const String* const s = getString (data); - const size_t len = s->getNumBytesAsUTF8() + 1; - HeapBlock temp (len); - s->copyToUTF8 (temp, len); - output.writeCompressedInt ((int) (len + 1)); - output.writeByte (varMarker_String); - output.write (temp, len); - } - -private: - static inline const String* getString (const ValueUnion& data) noexcept { return reinterpret_cast (data.stringValue); } - static inline String* getString (ValueUnion& data) noexcept { return reinterpret_cast (data.stringValue); } -}; - -//============================================================================== -class var::VariantType_Object : public var::VariantType -{ -public: - VariantType_Object() noexcept {} - static const VariantType_Object instance; - - void cleanUp (ValueUnion& data) const noexcept override { if (data.objectValue != nullptr) data.objectValue->decReferenceCount(); } - - void createCopy (ValueUnion& dest, const ValueUnion& source) const override - { - dest.objectValue = source.objectValue; - if (dest.objectValue != nullptr) - dest.objectValue->incReferenceCount(); - } - - String toString (const ValueUnion& data) const override { return "Object 0x" + String::toHexString ((int) (pointer_sized_int) data.objectValue); } - bool toBool (const ValueUnion& data) const noexcept override { return data.objectValue != 0; } - ReferenceCountedObject* toObject (const ValueUnion& data) const noexcept override { return data.objectValue; } - bool isObject() const noexcept override { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override - { - return otherType.toObject (otherData) == data.objectValue; - } - - var clone (const var& original) const override - { - if (DynamicObject* d = original.getDynamicObject()) - return d->clone().get(); - - jassertfalse; // can only clone DynamicObjects! - return var(); - } - - void writeToStream (const ValueUnion&, OutputStream& output) const override - { - jassertfalse; // Can't write an object to a stream! - output.writeCompressedInt (0); - } -}; - -//============================================================================== -class var::VariantType_Array : public var::VariantType_Object -{ -public: - VariantType_Array() noexcept {} - static const VariantType_Array instance; - - String toString (const ValueUnion&) const override { return "[Array]"; } - ReferenceCountedObject* toObject (const ValueUnion&) const noexcept override { return nullptr; } - bool isArray() const noexcept override { return true; } - - Array* toArray (const ValueUnion& data) const noexcept override - { - if (RefCountedArray* a = dynamic_cast (data.objectValue)) - return &(a->array); - - return nullptr; - } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override - { - const Array* const thisArray = toArray (data); - const Array* const otherArray = otherType.toArray (otherData); - return thisArray == otherArray || (thisArray != nullptr && otherArray != nullptr && *otherArray == *thisArray); - } - - var clone (const var& original) const override - { - Array arrayCopy; - - if (const Array* array = toArray (original.value)) - for (int i = 0; i < array->size(); ++i) - arrayCopy.add (array->getReference(i).clone()); - - return var (arrayCopy); - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const override - { - if (const Array* array = toArray (data)) - { - MemoryOutputStream buffer (512); - const int numItems = array->size(); - buffer.writeCompressedInt (numItems); - - for (int i = 0; i < numItems; ++i) - array->getReference(i).writeToStream (buffer); - - output.writeCompressedInt (1 + (int) buffer.getDataSize()); - output.writeByte (varMarker_Array); - output << buffer; - } - } - - struct RefCountedArray : public ReferenceCountedObject - { - RefCountedArray (const Array& a) : array (a) { incReferenceCount(); } - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - RefCountedArray (Array&& a) : array (static_cast&&> (a)) { incReferenceCount(); } - #endif - Array array; - }; -}; - -//============================================================================== -class var::VariantType_Binary : public var::VariantType -{ -public: - VariantType_Binary() noexcept {} - - static const VariantType_Binary instance; - - void cleanUp (ValueUnion& data) const noexcept override { delete data.binaryValue; } - void createCopy (ValueUnion& dest, const ValueUnion& source) const override { dest.binaryValue = new MemoryBlock (*source.binaryValue); } - - String toString (const ValueUnion& data) const override { return data.binaryValue->toBase64Encoding(); } - bool isBinary() const noexcept override { return true; } - MemoryBlock* toBinary (const ValueUnion& data) const noexcept override { return data.binaryValue; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override - { - const MemoryBlock* const otherBlock = otherType.toBinary (otherData); - return otherBlock != nullptr && *otherBlock == *data.binaryValue; - } - - void writeToStream (const ValueUnion& data, OutputStream& output) const override - { - output.writeCompressedInt (1 + (int) data.binaryValue->getSize()); - output.writeByte (varMarker_Binary); - output << *data.binaryValue; - } -}; - -//============================================================================== -class var::VariantType_Method : public var::VariantType -{ -public: - VariantType_Method() noexcept {} - static const VariantType_Method instance; - - String toString (const ValueUnion&) const override { return "Method"; } - bool toBool (const ValueUnion& data) const noexcept override { return data.methodValue != nullptr; } - bool isMethod() const noexcept override { return true; } - - bool equals (const ValueUnion& data, const ValueUnion& otherData, const VariantType& otherType) const noexcept override - { - return otherType.isMethod() && otherData.methodValue == data.methodValue; - } - - void writeToStream (const ValueUnion&, OutputStream& output) const override - { - jassertfalse; // Can't write a method to a stream! - output.writeCompressedInt (0); - } -}; - -//============================================================================== -const var::VariantType_Void var::VariantType_Void::instance; -const var::VariantType_Undefined var::VariantType_Undefined::instance; -const var::VariantType_Int var::VariantType_Int::instance; -const var::VariantType_Int64 var::VariantType_Int64::instance; -const var::VariantType_Bool var::VariantType_Bool::instance; -const var::VariantType_Double var::VariantType_Double::instance; -const var::VariantType_String var::VariantType_String::instance; -const var::VariantType_Object var::VariantType_Object::instance; -const var::VariantType_Array var::VariantType_Array::instance; -const var::VariantType_Binary var::VariantType_Binary::instance; -const var::VariantType_Method var::VariantType_Method::instance; - - -//============================================================================== -var::var() noexcept : type (&VariantType_Void::instance) {} -var::var (const VariantType& t) noexcept : type (&t) {} -var::~var() noexcept { type->cleanUp (value); } - -const var var::null; - -//============================================================================== -var::var (const var& valueToCopy) : type (valueToCopy.type) -{ - type->createCopy (value, valueToCopy.value); -} - -var::var (const int v) noexcept : type (&VariantType_Int::instance) { value.intValue = v; } -var::var (const int64 v) noexcept : type (&VariantType_Int64::instance) { value.int64Value = v; } -var::var (const bool v) noexcept : type (&VariantType_Bool::instance) { value.boolValue = v; } -var::var (const double v) noexcept : type (&VariantType_Double::instance) { value.doubleValue = v; } -var::var (NativeFunction m) noexcept : type (&VariantType_Method::instance) { value.methodValue = m; } -var::var (const Array& v) : type (&VariantType_Array::instance) { value.objectValue = new VariantType_Array::RefCountedArray(v); } -var::var (const String& v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } -var::var (const char* const v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } -var::var (const wchar_t* const v) : type (&VariantType_String::instance) { new (value.stringValue) String (v); } -var::var (const void* v, size_t sz) : type (&VariantType_Binary::instance) { value.binaryValue = new MemoryBlock (v, sz); } -var::var (const MemoryBlock& v) : type (&VariantType_Binary::instance) { value.binaryValue = new MemoryBlock (v); } - -var::var (ReferenceCountedObject* const object) : type (&VariantType_Object::instance) -{ - value.objectValue = object; - - if (object != nullptr) - object->incReferenceCount(); -} - -var var::undefined() noexcept { return var (VariantType_Undefined::instance); } - -//============================================================================== -bool var::isVoid() const noexcept { return type->isVoid(); } -bool var::isUndefined() const noexcept { return type->isUndefined(); } -bool var::isInt() const noexcept { return type->isInt(); } -bool var::isInt64() const noexcept { return type->isInt64(); } -bool var::isBool() const noexcept { return type->isBool(); } -bool var::isDouble() const noexcept { return type->isDouble(); } -bool var::isString() const noexcept { return type->isString(); } -bool var::isObject() const noexcept { return type->isObject(); } -bool var::isArray() const noexcept { return type->isArray(); } -bool var::isBinaryData() const noexcept { return type->isBinary(); } -bool var::isMethod() const noexcept { return type->isMethod(); } - -var::operator int() const noexcept { return type->toInt (value); } -var::operator int64() const noexcept { return type->toInt64 (value); } -var::operator bool() const noexcept { return type->toBool (value); } -var::operator float() const noexcept { return (float) type->toDouble (value); } -var::operator double() const noexcept { return type->toDouble (value); } -String var::toString() const { return type->toString (value); } -var::operator String() const { return type->toString (value); } -ReferenceCountedObject* var::getObject() const noexcept { return type->toObject (value); } -Array* var::getArray() const noexcept { return type->toArray (value); } -MemoryBlock* var::getBinaryData() const noexcept { return type->toBinary (value); } -DynamicObject* var::getDynamicObject() const noexcept { return dynamic_cast (getObject()); } - -//============================================================================== -void var::swapWith (var& other) noexcept -{ - std::swap (type, other.type); - std::swap (value, other.value); -} - -var& var::operator= (const var& v) { type->cleanUp (value); type = v.type; type->createCopy (value, v.value); return *this; } -var& var::operator= (const int v) { type->cleanUp (value); type = &VariantType_Int::instance; value.intValue = v; return *this; } -var& var::operator= (const int64 v) { type->cleanUp (value); type = &VariantType_Int64::instance; value.int64Value = v; return *this; } -var& var::operator= (const bool v) { type->cleanUp (value); type = &VariantType_Bool::instance; value.boolValue = v; return *this; } -var& var::operator= (const double v) { type->cleanUp (value); type = &VariantType_Double::instance; value.doubleValue = v; return *this; } -var& var::operator= (const char* const v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } -var& var::operator= (const wchar_t* const v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } -var& var::operator= (const String& v) { type->cleanUp (value); type = &VariantType_String::instance; new (value.stringValue) String (v); return *this; } -var& var::operator= (const Array& v) { var v2 (v); swapWith (v2); return *this; } -var& var::operator= (ReferenceCountedObject* v) { var v2 (v); swapWith (v2); return *this; } -var& var::operator= (NativeFunction v) { var v2 (v); swapWith (v2); return *this; } - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -var::var (var&& other) noexcept - : type (other.type), - value (other.value) -{ - other.type = &VariantType_Void::instance; -} - -var& var::operator= (var&& other) noexcept -{ - swapWith (other); - return *this; -} - -var::var (String&& v) : type (&VariantType_String::instance) -{ - new (value.stringValue) String (static_cast (v)); -} - -var::var (MemoryBlock&& v) : type (&VariantType_Binary::instance) -{ - value.binaryValue = new MemoryBlock (static_cast (v)); -} - -var::var (Array&& v) : type (&VariantType_Array::instance) -{ - value.objectValue = new VariantType_Array::RefCountedArray (static_cast&&> (v)); -} - -var& var::operator= (String&& v) -{ - type->cleanUp (value); - type = &VariantType_String::instance; - new (value.stringValue) String (static_cast (v)); - return *this; -} -#endif - -//============================================================================== -bool var::equals (const var& other) const noexcept -{ - return type->equals (value, other.value, *other.type); -} - -bool var::equalsWithSameType (const var& other) const noexcept -{ - return type == other.type && equals (other); -} - -bool var::hasSameTypeAs (const var& other) const noexcept -{ - return type == other.type; -} - -bool operator== (const var& v1, const var& v2) noexcept { return v1.equals (v2); } -bool operator!= (const var& v1, const var& v2) noexcept { return ! v1.equals (v2); } -bool operator== (const var& v1, const String& v2) { return v1.toString() == v2; } -bool operator!= (const var& v1, const String& v2) { return v1.toString() != v2; } -bool operator== (const var& v1, const char* const v2) { return v1.toString() == v2; } -bool operator!= (const var& v1, const char* const v2) { return v1.toString() != v2; } - -//============================================================================== -var var::clone() const noexcept -{ - return type->clone (*this); -} - -//============================================================================== -const var& var::operator[] (Identifier propertyName) const -{ - if (DynamicObject* const o = getDynamicObject()) - return o->getProperty (propertyName); - - return var::null; -} - -const var& var::operator[] (const char* const propertyName) const -{ - return operator[] (Identifier (propertyName)); -} - -var var::getProperty (const Identifier propertyName, const var& defaultReturnValue) const -{ - if (DynamicObject* const o = getDynamicObject()) - return o->getProperties().getWithDefault (propertyName, defaultReturnValue); - - return defaultReturnValue; -} - -var::NativeFunction var::getNativeFunction() const -{ - return isMethod() ? value.methodValue : nullptr; -} - -var var::invoke (Identifier method, const var* arguments, int numArguments) const -{ - if (DynamicObject* const o = getDynamicObject()) - return o->invokeMethod (method, var::NativeFunctionArgs (*this, arguments, numArguments)); - - return var(); -} - -var var::call (const Identifier method) const -{ - return invoke (method, nullptr, 0); -} - -var var::call (const Identifier method, const var& arg1) const -{ - return invoke (method, &arg1, 1); -} - -var var::call (const Identifier method, const var& arg1, const var& arg2) const -{ - var args[] = { arg1, arg2 }; - return invoke (method, args, 2); -} - -var var::call (const Identifier method, const var& arg1, const var& arg2, const var& arg3) -{ - var args[] = { arg1, arg2, arg3 }; - return invoke (method, args, 3); -} - -var var::call (const Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const -{ - var args[] = { arg1, arg2, arg3, arg4 }; - return invoke (method, args, 4); -} - -var var::call (const Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const -{ - var args[] = { arg1, arg2, arg3, arg4, arg5 }; - return invoke (method, args, 5); -} - -//============================================================================== -int var::size() const -{ - if (const Array* const array = getArray()) - return array->size(); - - return 0; -} - -const var& var::operator[] (int arrayIndex) const -{ - const Array* const array = getArray(); - - // When using this method, the var must actually be an array, and the index - // must be in-range! - jassert (array != nullptr && isPositiveAndBelow (arrayIndex, array->size())); - - return array->getReference (arrayIndex); -} - -var& var::operator[] (int arrayIndex) -{ - const Array* const array = getArray(); - - // When using this method, the var must actually be an array, and the index - // must be in-range! - jassert (array != nullptr && isPositiveAndBelow (arrayIndex, array->size())); - - return array->getReference (arrayIndex); -} - -Array* var::convertToArray() -{ - if (Array* array = getArray()) - return array; - - Array tempVar; - if (! isVoid()) - tempVar.add (*this); - - *this = tempVar; - return getArray(); -} - -void var::append (const var& n) -{ - convertToArray()->add (n); -} - -void var::remove (const int index) -{ - if (Array* const array = getArray()) - array->remove (index); -} - -void var::insert (const int index, const var& n) -{ - convertToArray()->insert (index, n); -} - -void var::resize (const int numArrayElementsWanted) -{ - convertToArray()->resize (numArrayElementsWanted); -} - -int var::indexOf (const var& n) const -{ - if (const Array* const array = getArray()) - return array->indexOf (n); - - return -1; -} - -//============================================================================== -void var::writeToStream (OutputStream& output) const -{ - type->writeToStream (value, output); -} - -var var::readFromStream (InputStream& input) -{ - const int numBytes = input.readCompressedInt(); - - if (numBytes > 0) - { - switch (input.readByte()) - { - case varMarker_Int: return var (input.readInt()); - case varMarker_Int64: return var (input.readInt64()); - case varMarker_BoolTrue: return var (true); - case varMarker_BoolFalse: return var (false); - case varMarker_Double: return var (input.readDouble()); - case varMarker_String: - { - MemoryOutputStream mo; - mo.writeFromInputStream (input, numBytes - 1); - return var (mo.toUTF8()); - } - - case varMarker_Binary: - { - MemoryBlock mb ((size_t) numBytes - 1); - - if (numBytes > 1) - { - const int numRead = input.read (mb.getData(), numBytes - 1); - mb.setSize ((size_t) numRead); - } - - return var (mb); - } - - case varMarker_Array: - { - var v; - Array* const destArray = v.convertToArray(); - - for (int i = input.readCompressedInt(); --i >= 0;) - destArray->add (readFromStream (input)); - - return v; - } - - default: - input.skipNextBytes (numBytes - 1); break; - } - } - - return var(); -} - -var::NativeFunctionArgs::NativeFunctionArgs (const var& t, const var* args, int numArgs) noexcept - : thisObject (t), arguments (args), numArguments (numArgs) -{} diff --git a/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h b/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h deleted file mode 100755 index 1e0f03c..0000000 --- a/JuceLibraryCode/modules/juce_core/containers/juce_Variant.h +++ /dev/null @@ -1,327 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_VARIANT_H_INCLUDED -#define JUCE_VARIANT_H_INCLUDED - - -//============================================================================== -/** - A variant class, that can be used to hold a range of primitive values. - - A var object can hold a range of simple primitive values, strings, or - any kind of ReferenceCountedObject. The var class is intended to act like - the kind of values used in dynamic scripting languages. - - You can save/load var objects either in a small, proprietary binary format - using writeToStream()/readFromStream(), or as JSON by using the JSON class. - - @see JSON, DynamicObject -*/ -class JUCE_API var -{ -public: - //============================================================================== - /** This structure is passed to a NativeFunction callback, and contains invocation - details about the function's arguments and context. - */ - struct NativeFunctionArgs - { - NativeFunctionArgs (const var& thisObject, const var* args, int numArgs) noexcept; - - const var& thisObject; - const var* arguments; - int numArguments; - - JUCE_DECLARE_NON_COPYABLE (NativeFunctionArgs) - }; - - typedef var (*NativeFunction) (const NativeFunctionArgs&); - typedef Identifier identifier; - - //============================================================================== - /** Creates a void variant. */ - var() noexcept; - - /** Destructor. */ - ~var() noexcept; - - /** A static var object that can be used where you need an empty variant object. */ - static const var null; - - var (const var& valueToCopy); - var (int value) noexcept; - var (int64 value) noexcept; - var (bool value) noexcept; - var (double value) noexcept; - var (const char* value); - var (const wchar_t* value); - var (const String& value); - var (const Array& value); - var (ReferenceCountedObject* object); - var (NativeFunction method) noexcept; - var (const void* binaryData, size_t dataSize); - var (const MemoryBlock& binaryData); - - var& operator= (const var& valueToCopy); - var& operator= (int value); - var& operator= (int64 value); - var& operator= (bool value); - var& operator= (double value); - var& operator= (const char* value); - var& operator= (const wchar_t* value); - var& operator= (const String& value); - var& operator= (const Array& value); - var& operator= (ReferenceCountedObject* object); - var& operator= (NativeFunction method); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - var (var&& other) noexcept; - var (String&& value); - var (MemoryBlock&& binaryData); - var (Array&& value); - var& operator= (var&& other) noexcept; - var& operator= (String&& value); - #endif - - void swapWith (var& other) noexcept; - - /** Returns a var object that can be used where you need the javascript "undefined" value. */ - static var undefined() noexcept; - - //============================================================================== - operator int() const noexcept; - operator int64() const noexcept; - operator bool() const noexcept; - operator float() const noexcept; - operator double() const noexcept; - operator String() const; - String toString() const; - - /** If this variant holds an array, this provides access to it. - NOTE: Beware when you use this - the array pointer is only valid for the lifetime - of the variant that returned it, so be very careful not to call this method on temporary - var objects that are the return-value of a function, and which may go out of scope before - you use the array! - */ - Array* getArray() const noexcept; - - /** If this variant holds a memory block, this provides access to it. - NOTE: Beware when you use this - the MemoryBlock pointer is only valid for the lifetime - of the variant that returned it, so be very careful not to call this method on temporary - var objects that are the return-value of a function, and which may go out of scope before - you use the MemoryBlock! - */ - MemoryBlock* getBinaryData() const noexcept; - - ReferenceCountedObject* getObject() const noexcept; - DynamicObject* getDynamicObject() const noexcept; - - //============================================================================== - bool isVoid() const noexcept; - bool isUndefined() const noexcept; - bool isInt() const noexcept; - bool isInt64() const noexcept; - bool isBool() const noexcept; - bool isDouble() const noexcept; - bool isString() const noexcept; - bool isObject() const noexcept; - bool isArray() const noexcept; - bool isBinaryData() const noexcept; - bool isMethod() const noexcept; - - /** Returns true if this var has the same value as the one supplied. - Note that this ignores the type, so a string var "123" and an integer var with the - value 123 are considered to be equal. - @see equalsWithSameType - */ - bool equals (const var& other) const noexcept; - - /** Returns true if this var has the same value and type as the one supplied. - This differs from equals() because e.g. "123" and 123 will be considered different. - @see equals - */ - bool equalsWithSameType (const var& other) const noexcept; - - /** Returns true if this var has the same type as the one supplied. */ - bool hasSameTypeAs (const var& other) const noexcept; - - /** Returns a deep copy of this object. - For simple types this just returns a copy, but if the object contains any arrays - or DynamicObjects, they will be cloned (recursively). - */ - var clone() const noexcept; - - //============================================================================== - /** If the var is an array, this returns the number of elements. - If the var isn't actually an array, this will return 0. - */ - int size() const; - - /** If the var is an array, this can be used to return one of its elements. - To call this method, you must make sure that the var is actually an array, and - that the index is a valid number. If these conditions aren't met, behaviour is - undefined. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - const var& operator[] (int arrayIndex) const; - - /** If the var is an array, this can be used to return one of its elements. - To call this method, you must make sure that the var is actually an array, and - that the index is a valid number. If these conditions aren't met, behaviour is - undefined. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - var& operator[] (int arrayIndex); - - /** Appends an element to the var, converting it to an array if it isn't already one. - If the var isn't an array, it will be converted to one, and if its value was non-void, - this value will be kept as the first element of the new array. The parameter value - will then be appended to it. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - void append (const var& valueToAppend); - - /** Inserts an element to the var, converting it to an array if it isn't already one. - If the var isn't an array, it will be converted to one, and if its value was non-void, - this value will be kept as the first element of the new array. The parameter value - will then be inserted into it. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - void insert (int index, const var& value); - - /** If the var is an array, this removes one of its elements. - If the index is out-of-range or the var isn't an array, nothing will be done. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - void remove (int index); - - /** Treating the var as an array, this resizes it to contain the specified number of elements. - If the var isn't an array, it will be converted to one, and if its value was non-void, - this value will be kept as the first element of the new array before resizing. - For more control over the array's contents, you can call getArray() and manipulate - it directly as an Array\. - */ - void resize (int numArrayElementsWanted); - - /** If the var is an array, this searches it for the first occurrence of the specified value, - and returns its index. - If the var isn't an array, or if the value isn't found, this returns -1. - */ - int indexOf (const var& value) const; - - //============================================================================== - /** If this variant is an object, this returns one of its properties. */ - const var& operator[] (Identifier propertyName) const; - /** If this variant is an object, this returns one of its properties. */ - const var& operator[] (const char* propertyName) const; - /** If this variant is an object, this returns one of its properties, or a default - fallback value if the property is not set. */ - var getProperty (Identifier propertyName, const var& defaultReturnValue) const; - - /** Invokes a named method call with no arguments. */ - var call (Identifier method) const; - /** Invokes a named method call with one argument. */ - var call (Identifier method, const var& arg1) const; - /** Invokes a named method call with 2 arguments. */ - var call (Identifier method, const var& arg1, const var& arg2) const; - /** Invokes a named method call with 3 arguments. */ - var call (Identifier method, const var& arg1, const var& arg2, const var& arg3); - /** Invokes a named method call with 4 arguments. */ - var call (Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4) const; - /** Invokes a named method call with 5 arguments. */ - var call (Identifier method, const var& arg1, const var& arg2, const var& arg3, const var& arg4, const var& arg5) const; - /** Invokes a named method call with a list of arguments. */ - var invoke (Identifier method, const var* arguments, int numArguments) const; - /** If this object is a method, this returns the function pointer. */ - NativeFunction getNativeFunction() const; - - //============================================================================== - /** Writes a binary representation of this value to a stream. - The data can be read back later using readFromStream(). - @see JSON - */ - void writeToStream (OutputStream& output) const; - - /** Reads back a stored binary representation of a value. - The data in the stream must have been written using writeToStream(), or this - will have unpredictable results. - @see JSON - */ - static var readFromStream (InputStream& input); - -private: - //============================================================================== - class VariantType; friend class VariantType; - class VariantType_Void; friend class VariantType_Void; - class VariantType_Undefined; friend class VariantType_Undefined; - class VariantType_Int; friend class VariantType_Int; - class VariantType_Int64; friend class VariantType_Int64; - class VariantType_Double; friend class VariantType_Double; - class VariantType_Bool; friend class VariantType_Bool; - class VariantType_String; friend class VariantType_String; - class VariantType_Object; friend class VariantType_Object; - class VariantType_Array; friend class VariantType_Array; - class VariantType_Binary; friend class VariantType_Binary; - class VariantType_Method; friend class VariantType_Method; - - union ValueUnion - { - int intValue; - int64 int64Value; - bool boolValue; - double doubleValue; - char stringValue [sizeof (String)]; - ReferenceCountedObject* objectValue; - MemoryBlock* binaryValue; - NativeFunction methodValue; - }; - - const VariantType* type; - ValueUnion value; - - Array* convertToArray(); - var (const VariantType&) noexcept; -}; - -/** Compares the values of two var objects, using the var::equals() comparison. */ -bool operator== (const var& v1, const var& v2) noexcept; -/** Compares the values of two var objects, using the var::equals() comparison. */ -bool operator!= (const var& v1, const var& v2) noexcept; -bool operator== (const var& v1, const String& v2); -bool operator!= (const var& v1, const String& v2); -bool operator== (const var& v1, const char* v2); -bool operator!= (const var& v1, const char* v2); - - -#endif // JUCE_VARIANT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp b/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp deleted file mode 100755 index f2e09a6..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -DirectoryIterator::DirectoryIterator (const File& directory, bool recursive, - const String& pattern, const int type) - : wildCards (parseWildcards (pattern)), - fileFinder (directory, (recursive || wildCards.size() > 1) ? "*" : pattern), - wildCard (pattern), - path (File::addTrailingSeparator (directory.getFullPathName())), - index (-1), - totalNumFiles (-1), - whatToLookFor (type), - isRecursive (recursive), - hasBeenAdvanced (false) -{ - // you have to specify the type of files you're looking for! - jassert ((type & (File::findFiles | File::findDirectories)) != 0); - jassert (type > 0 && type <= 7); -} - -DirectoryIterator::~DirectoryIterator() -{ -} - -StringArray DirectoryIterator::parseWildcards (const String& pattern) -{ - StringArray s; - s.addTokens (pattern, ";,", "\"'"); - s.trim(); - s.removeEmptyStrings(); - return s; -} - -bool DirectoryIterator::fileMatches (const StringArray& wildCards, const String& filename) -{ - for (int i = 0; i < wildCards.size(); ++i) - if (filename.matchesWildcard (wildCards[i], ! File::areFileNamesCaseSensitive())) - return true; - - return false; -} - -bool DirectoryIterator::next() -{ - return next (nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); -} - -bool DirectoryIterator::next (bool* const isDirResult, bool* const isHiddenResult, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) -{ - for (;;) - { - hasBeenAdvanced = true; - - if (subIterator != nullptr) - { - if (subIterator->next (isDirResult, isHiddenResult, fileSize, modTime, creationTime, isReadOnly)) - return true; - - subIterator = nullptr; - } - - String filename; - bool isDirectory, isHidden = false, shouldContinue = false; - - while (fileFinder.next (filename, &isDirectory, - (isHiddenResult != nullptr || (whatToLookFor & File::ignoreHiddenFiles) != 0) ? &isHidden : nullptr, - fileSize, modTime, creationTime, isReadOnly)) - { - ++index; - - if (! filename.containsOnly (".")) - { - bool matches = false; - - if (isDirectory) - { - if (isRecursive && ((whatToLookFor & File::ignoreHiddenFiles) == 0 || ! isHidden)) - subIterator = new DirectoryIterator (File::createFileWithoutCheckingPath (path + filename), - true, wildCard, whatToLookFor); - - matches = (whatToLookFor & File::findDirectories) != 0; - } - else - { - matches = (whatToLookFor & File::findFiles) != 0; - } - - // if we're not relying on the OS iterator to do the wildcard match, do it now.. - if (matches && (isRecursive || wildCards.size() > 1)) - matches = fileMatches (wildCards, filename); - - if (matches && (whatToLookFor & File::ignoreHiddenFiles) != 0) - matches = ! isHidden; - - if (matches) - { - currentFile = File::createFileWithoutCheckingPath (path + filename); - if (isHiddenResult != nullptr) *isHiddenResult = isHidden; - if (isDirResult != nullptr) *isDirResult = isDirectory; - - return true; - } - - if (subIterator != nullptr) - { - shouldContinue = true; - break; - } - } - } - - if (! shouldContinue) - return false; - } -} - -const File& DirectoryIterator::getFile() const -{ - if (subIterator != nullptr && subIterator->hasBeenAdvanced) - return subIterator->getFile(); - - // You need to call DirectoryIterator::next() before asking it for the file that it found! - jassert (hasBeenAdvanced); - - return currentFile; -} - -float DirectoryIterator::getEstimatedProgress() const -{ - if (totalNumFiles < 0) - totalNumFiles = File (path).getNumberOfChildFiles (File::findFilesAndDirectories); - - if (totalNumFiles <= 0) - return 0.0f; - - const float detailedIndex = (subIterator != nullptr) ? index + subIterator->getEstimatedProgress() - : (float) index; - - return detailedIndex / totalNumFiles; -} diff --git a/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h b/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h deleted file mode 100755 index 3ca2265..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_DirectoryIterator.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_DIRECTORYITERATOR_H_INCLUDED -#define JUCE_DIRECTORYITERATOR_H_INCLUDED - - -//============================================================================== -/** - Searches through the files in a directory, returning each file that is found. - - A DirectoryIterator will search through a directory and its subdirectories using - a wildcard filepattern match. - - If you may be scanning a large number of files, it's usually smarter to use this - class than File::findChildFiles() because it allows you to stop at any time, rather - than having to wait for the entire scan to finish before getting the results. - - It also provides an estimate of its progress, using a (highly inaccurate!) algorithm. -*/ -class JUCE_API DirectoryIterator -{ -public: - //============================================================================== - /** Creates a DirectoryIterator for a given directory. - - After creating one of these, call its next() method to get the - first file - e.g. @code - - DirectoryIterator iter (File ("/animals/mooses"), true, "*.moose"); - - while (iter.next()) - { - File theFileItFound (iter.getFile()); - - ... etc - } - @endcode - - @param directory the directory to search in - @param isRecursive whether all the subdirectories should also be searched - @param wildCard the file pattern to match. This may contain multiple patterns - separated by a semi-colon or comma, e.g. "*.jpg;*.png" - @param whatToLookFor a value from the File::TypesOfFileToFind enum, specifying - whether to look for files, directories, or both. - */ - DirectoryIterator (const File& directory, - bool isRecursive, - const String& wildCard = "*", - int whatToLookFor = File::findFiles); - - /** Destructor. */ - ~DirectoryIterator(); - - /** Moves the iterator along to the next file. - - @returns true if a file was found (you can then use getFile() to see what it was) - or - false if there are no more matching files. - */ - bool next(); - - /** Moves the iterator along to the next file, and returns various properties of that file. - - If you need to find out details about the file, it's more efficient to call this method than - to call the normal next() method and then find out the details afterwards. - - All the parameters are optional, so pass null pointers for any items that you're not - interested in. - - @returns true if a file was found (you can then use getFile() to see what it was) - or - false if there are no more matching files. If it returns false, then none of the - parameters will be filled-in. - */ - bool next (bool* isDirectory, - bool* isHidden, - int64* fileSize, - Time* modTime, - Time* creationTime, - bool* isReadOnly); - - /** Returns the file that the iterator is currently pointing at. - - The result of this call is only valid after a call to next() has returned true. - */ - const File& getFile() const; - - /** Returns a guess of how far through the search the iterator has got. - - @returns a value 0.0 to 1.0 to show the progress, although this won't be - very accurate. - */ - float getEstimatedProgress() const; - -private: - //============================================================================== - class NativeIterator - { - public: - NativeIterator (const File& directory, const String& wildCard); - ~NativeIterator(); - - bool next (String& filenameFound, - bool* isDirectory, bool* isHidden, int64* fileSize, - Time* modTime, Time* creationTime, bool* isReadOnly); - - class Pimpl; - - private: - friend class DirectoryIterator; - friend struct ContainerDeletePolicy; - ScopedPointer pimpl; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NativeIterator) - }; - - friend struct ContainerDeletePolicy; - StringArray wildCards; - NativeIterator fileFinder; - String wildCard, path; - int index; - mutable int totalNumFiles; - const int whatToLookFor; - const bool isRecursive; - bool hasBeenAdvanced; - ScopedPointer subIterator; - File currentFile; - - static StringArray parseWildcards (const String& pattern); - static bool fileMatches (const StringArray& wildCards, const String& filename); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectoryIterator) -}; - -#endif // JUCE_DIRECTORYITERATOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/files/juce_File.cpp b/JuceLibraryCode/modules/juce_core/files/juce_File.cpp deleted file mode 100755 index 19d724b..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_File.cpp +++ /dev/null @@ -1,1091 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -File::File (const String& fullPathName) - : fullPath (parseAbsolutePath (fullPathName)) -{ -} - -File File::createFileWithoutCheckingPath (const String& path) noexcept -{ - File f; - f.fullPath = path; - return f; -} - -File::File (const File& other) - : fullPath (other.fullPath) -{ -} - -File& File::operator= (const String& newPath) -{ - fullPath = parseAbsolutePath (newPath); - return *this; -} - -File& File::operator= (const File& other) -{ - fullPath = other.fullPath; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -File::File (File&& other) noexcept - : fullPath (static_cast (other.fullPath)) -{ -} - -File& File::operator= (File&& other) noexcept -{ - fullPath = static_cast (other.fullPath); - return *this; -} -#endif - -const File File::nonexistent; - - -//============================================================================== -String File::parseAbsolutePath (const String& p) -{ - if (p.isEmpty()) - return String(); - -#if JUCE_WINDOWS - // Windows.. - String path (p.replaceCharacter ('/', '\\')); - - if (path.startsWithChar (separator)) - { - if (path[1] != separator) - { - /* When you supply a raw string to the File object constructor, it must be an absolute path. - If you're trying to parse a string that may be either a relative path or an absolute path, - you MUST provide a context against which the partial path can be evaluated - you can do - this by simply using File::getChildFile() instead of the File constructor. E.g. saying - "File::getCurrentWorkingDirectory().getChildFile (myUnknownPath)" would return an absolute - path if that's what was supplied, or would evaluate a partial path relative to the CWD. - */ - jassertfalse; - - path = File::getCurrentWorkingDirectory().getFullPathName().substring (0, 2) + path; - } - } - else if (! path.containsChar (':')) - { - /* When you supply a raw string to the File object constructor, it must be an absolute path. - If you're trying to parse a string that may be either a relative path or an absolute path, - you MUST provide a context against which the partial path can be evaluated - you can do - this by simply using File::getChildFile() instead of the File constructor. E.g. saying - "File::getCurrentWorkingDirectory().getChildFile (myUnknownPath)" would return an absolute - path if that's what was supplied, or would evaluate a partial path relative to the CWD. - */ - jassertfalse; - - return File::getCurrentWorkingDirectory().getChildFile (path).getFullPathName(); - } -#else - // Mac or Linux.. - - // Yes, I know it's legal for a unix pathname to contain a backslash, but this assertion is here - // to catch anyone who's trying to run code that was written on Windows with hard-coded path names. - // If that's why you've ended up here, use File::getChildFile() to build your paths instead. - jassert ((! p.containsChar ('\\')) || (p.indexOfChar ('/') >= 0 && p.indexOfChar ('/') < p.indexOfChar ('\\'))); - - String path (p); - - if (path.startsWithChar ('~')) - { - if (path[1] == separator || path[1] == 0) - { - // expand a name of the form "~/abc" - path = File::getSpecialLocation (File::userHomeDirectory).getFullPathName() - + path.substring (1); - } - else - { - // expand a name of type "~dave/abc" - const String userName (path.substring (1).upToFirstOccurrenceOf ("/", false, false)); - - if (struct passwd* const pw = getpwnam (userName.toUTF8())) - path = addTrailingSeparator (pw->pw_dir) + path.fromFirstOccurrenceOf ("/", false, false); - } - } - else if (! path.startsWithChar (separator)) - { - #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS - if (! (path.startsWith ("./") || path.startsWith ("../"))) - { - /* When you supply a raw string to the File object constructor, it must be an absolute path. - If you're trying to parse a string that may be either a relative path or an absolute path, - you MUST provide a context against which the partial path can be evaluated - you can do - this by simply using File::getChildFile() instead of the File constructor. E.g. saying - "File::getCurrentWorkingDirectory().getChildFile (myUnknownPath)" would return an absolute - path if that's what was supplied, or would evaluate a partial path relative to the CWD. - */ - jassertfalse; - - #if JUCE_LOG_ASSERTIONS - Logger::writeToLog ("Illegal absolute path: " + path); - #endif - } - #endif - - return File::getCurrentWorkingDirectory().getChildFile (path).getFullPathName(); - } -#endif - - while (path.endsWithChar (separator) && path != separatorString) // careful not to turn a single "/" into an empty string. - path = path.dropLastCharacters (1); - - return path; -} - -String File::addTrailingSeparator (const String& path) -{ - return path.endsWithChar (separator) ? path - : path + separator; -} - -//============================================================================== -#if JUCE_LINUX - #define NAMES_ARE_CASE_SENSITIVE 1 -#endif - -bool File::areFileNamesCaseSensitive() -{ - #if NAMES_ARE_CASE_SENSITIVE - return true; - #else - return false; - #endif -} - -static int compareFilenames (const String& name1, const String& name2) noexcept -{ - #if NAMES_ARE_CASE_SENSITIVE - return name1.compare (name2); - #else - return name1.compareIgnoreCase (name2); - #endif -} - -bool File::operator== (const File& other) const { return compareFilenames (fullPath, other.fullPath) == 0; } -bool File::operator!= (const File& other) const { return compareFilenames (fullPath, other.fullPath) != 0; } -bool File::operator< (const File& other) const { return compareFilenames (fullPath, other.fullPath) < 0; } -bool File::operator> (const File& other) const { return compareFilenames (fullPath, other.fullPath) > 0; } - -//============================================================================== -bool File::setReadOnly (const bool shouldBeReadOnly, - const bool applyRecursively) const -{ - bool worked = true; - - if (applyRecursively && isDirectory()) - { - Array subFiles; - findChildFiles (subFiles, File::findFilesAndDirectories, false); - - for (int i = subFiles.size(); --i >= 0;) - worked = subFiles.getReference(i).setReadOnly (shouldBeReadOnly, true) && worked; - } - - return setFileReadOnlyInternal (shouldBeReadOnly) && worked; -} - -bool File::setExecutePermission (bool shouldBeExecutable) const -{ - return setFileExecutableInternal (shouldBeExecutable); -} - -bool File::deleteRecursively() const -{ - bool worked = true; - - if (isDirectory()) - { - Array subFiles; - findChildFiles (subFiles, File::findFilesAndDirectories, false); - - for (int i = subFiles.size(); --i >= 0;) - worked = subFiles.getReference(i).deleteRecursively() && worked; - } - - return deleteFile() && worked; -} - -bool File::moveFileTo (const File& newFile) const -{ - if (newFile.fullPath == fullPath) - return true; - - if (! exists()) - return false; - - #if ! NAMES_ARE_CASE_SENSITIVE - if (*this != newFile) - #endif - if (! newFile.deleteFile()) - return false; - - return moveInternal (newFile); -} - -bool File::copyFileTo (const File& newFile) const -{ - return (*this == newFile) - || (exists() && newFile.deleteFile() && copyInternal (newFile)); -} - -bool File::copyDirectoryTo (const File& newDirectory) const -{ - if (isDirectory() && newDirectory.createDirectory()) - { - Array subFiles; - findChildFiles (subFiles, File::findFiles, false); - - for (int i = 0; i < subFiles.size(); ++i) - if (! subFiles.getReference(i).copyFileTo (newDirectory.getChildFile (subFiles.getReference(i).getFileName()))) - return false; - - subFiles.clear(); - findChildFiles (subFiles, File::findDirectories, false); - - for (int i = 0; i < subFiles.size(); ++i) - if (! subFiles.getReference(i).copyDirectoryTo (newDirectory.getChildFile (subFiles.getReference(i).getFileName()))) - return false; - - return true; - } - - return false; -} - -//============================================================================== -String File::getPathUpToLastSlash() const -{ - const int lastSlash = fullPath.lastIndexOfChar (separator); - - if (lastSlash > 0) - return fullPath.substring (0, lastSlash); - - if (lastSlash == 0) - return separatorString; - - return fullPath; -} - -File File::getParentDirectory() const -{ - File f; - f.fullPath = getPathUpToLastSlash(); - return f; -} - -//============================================================================== -String File::getFileName() const -{ - return fullPath.substring (fullPath.lastIndexOfChar (separator) + 1); -} - -String File::getFileNameWithoutExtension() const -{ - const int lastSlash = fullPath.lastIndexOfChar (separator) + 1; - const int lastDot = fullPath.lastIndexOfChar ('.'); - - if (lastDot > lastSlash) - return fullPath.substring (lastSlash, lastDot); - - return fullPath.substring (lastSlash); -} - -bool File::isAChildOf (const File& potentialParent) const -{ - if (potentialParent.fullPath.isEmpty()) - return false; - - const String ourPath (getPathUpToLastSlash()); - - if (compareFilenames (potentialParent.fullPath, ourPath) == 0) - return true; - - if (potentialParent.fullPath.length() >= ourPath.length()) - return false; - - return getParentDirectory().isAChildOf (potentialParent); -} - -int File::hashCode() const { return fullPath.hashCode(); } -int64 File::hashCode64() const { return fullPath.hashCode64(); } - -//============================================================================== -bool File::isAbsolutePath (StringRef path) -{ - return path.text[0] == separator - #if JUCE_WINDOWS - || (path.isNotEmpty() && path.text[1] == ':'); - #else - || path.text[0] == '~'; - #endif -} - -File File::getChildFile (StringRef relativePath) const -{ - if (isAbsolutePath (relativePath)) - return File (String (relativePath.text)); - - if (relativePath[0] != '.') - return File (addTrailingSeparator (fullPath) + relativePath); - - String path (fullPath); - - // It's relative, so remove any ../ or ./ bits at the start.. - #if JUCE_WINDOWS - if (relativePath.text.indexOf ((juce_wchar) '/') >= 0) - return getChildFile (String (relativePath.text).replaceCharacter ('/', '\\')); - #endif - - while (relativePath[0] == '.') - { - const juce_wchar secondChar = relativePath[1]; - - if (secondChar == '.') - { - const juce_wchar thirdChar = relativePath[2]; - - if (thirdChar == 0 || thirdChar == separator) - { - const int lastSlash = path.lastIndexOfChar (separator); - if (lastSlash >= 0) - path = path.substring (0, lastSlash); - - relativePath = relativePath.text + (thirdChar == 0 ? 2 : 3); - } - else - { - break; - } - } - else if (secondChar == separator) - { - relativePath = relativePath.text + 2; - } - else - { - break; - } - } - - return File (addTrailingSeparator (path) + relativePath); -} - -File File::getSiblingFile (StringRef fileName) const -{ - return getParentDirectory().getChildFile (fileName); -} - -//============================================================================== -String File::descriptionOfSizeInBytes (const int64 bytes) -{ - const char* suffix; - double divisor = 0; - - if (bytes == 1) { suffix = " byte"; } - else if (bytes < 1024) { suffix = " bytes"; } - else if (bytes < 1024 * 1024) { suffix = " KB"; divisor = 1024.0; } - else if (bytes < 1024 * 1024 * 1024) { suffix = " MB"; divisor = 1024.0 * 1024.0; } - else { suffix = " GB"; divisor = 1024.0 * 1024.0 * 1024.0; } - - return (divisor > 0 ? String (bytes / divisor, 1) : String (bytes)) + suffix; -} - -//============================================================================== -Result File::create() const -{ - if (exists()) - return Result::ok(); - - const File parentDir (getParentDirectory()); - - if (parentDir == *this) - return Result::fail ("Cannot create parent directory"); - - Result r (parentDir.createDirectory()); - - if (r.wasOk()) - { - FileOutputStream fo (*this, 8); - r = fo.getStatus(); - } - - return r; -} - -Result File::createDirectory() const -{ - if (isDirectory()) - return Result::ok(); - - const File parentDir (getParentDirectory()); - - if (parentDir == *this) - return Result::fail ("Cannot create parent directory"); - - Result r (parentDir.createDirectory()); - - if (r.wasOk()) - r = createDirectoryInternal (fullPath.trimCharactersAtEnd (separatorString)); - - return r; -} - -//============================================================================== -Time File::getLastModificationTime() const { int64 m, a, c; getFileTimesInternal (m, a, c); return Time (m); } -Time File::getLastAccessTime() const { int64 m, a, c; getFileTimesInternal (m, a, c); return Time (a); } -Time File::getCreationTime() const { int64 m, a, c; getFileTimesInternal (m, a, c); return Time (c); } - -bool File::setLastModificationTime (Time t) const { return setFileTimesInternal (t.toMilliseconds(), 0, 0); } -bool File::setLastAccessTime (Time t) const { return setFileTimesInternal (0, t.toMilliseconds(), 0); } -bool File::setCreationTime (Time t) const { return setFileTimesInternal (0, 0, t.toMilliseconds()); } - -//============================================================================== -bool File::loadFileAsData (MemoryBlock& destBlock) const -{ - if (! existsAsFile()) - return false; - - FileInputStream in (*this); - return in.openedOk() && getSize() == (int64) in.readIntoMemoryBlock (destBlock); -} - -String File::loadFileAsString() const -{ - if (! existsAsFile()) - return String(); - - FileInputStream in (*this); - return in.openedOk() ? in.readEntireStreamAsString() - : String(); -} - -void File::readLines (StringArray& destLines) const -{ - destLines.addLines (loadFileAsString()); -} - -//============================================================================== -int File::findChildFiles (Array& results, - const int whatToLookFor, - const bool searchRecursively, - const String& wildCardPattern) const -{ - int total = 0; - - for (DirectoryIterator di (*this, searchRecursively, wildCardPattern, whatToLookFor); di.next();) - { - results.add (di.getFile()); - ++total; - } - - return total; -} - -int File::getNumberOfChildFiles (const int whatToLookFor, const String& wildCardPattern) const -{ - int total = 0; - - for (DirectoryIterator di (*this, false, wildCardPattern, whatToLookFor); di.next();) - ++total; - - return total; -} - -bool File::containsSubDirectories() const -{ - if (! isDirectory()) - return false; - - DirectoryIterator di (*this, false, "*", findDirectories); - return di.next(); -} - -//============================================================================== -File File::getNonexistentChildFile (const String& suggestedPrefix, - const String& suffix, - bool putNumbersInBrackets) const -{ - File f (getChildFile (suggestedPrefix + suffix)); - - if (f.exists()) - { - int number = 1; - String prefix (suggestedPrefix); - - // remove any bracketed numbers that may already be on the end.. - if (prefix.trim().endsWithChar (')')) - { - putNumbersInBrackets = true; - - const int openBracks = prefix.lastIndexOfChar ('('); - const int closeBracks = prefix.lastIndexOfChar (')'); - - if (openBracks > 0 - && closeBracks > openBracks - && prefix.substring (openBracks + 1, closeBracks).containsOnly ("0123456789")) - { - number = prefix.substring (openBracks + 1, closeBracks).getIntValue(); - prefix = prefix.substring (0, openBracks); - } - } - - // also use brackets if it ends in a digit. - putNumbersInBrackets = putNumbersInBrackets - || CharacterFunctions::isDigit (prefix.getLastCharacter()); - - do - { - String newName (prefix); - - if (putNumbersInBrackets) - newName << '(' << ++number << ')'; - else - newName << ++number; - - f = getChildFile (newName + suffix); - - } while (f.exists()); - } - - return f; -} - -File File::getNonexistentSibling (const bool putNumbersInBrackets) const -{ - if (! exists()) - return *this; - - return getParentDirectory().getNonexistentChildFile (getFileNameWithoutExtension(), - getFileExtension(), - putNumbersInBrackets); -} - -//============================================================================== -String File::getFileExtension() const -{ - const int indexOfDot = fullPath.lastIndexOfChar ('.'); - - if (indexOfDot > fullPath.lastIndexOfChar (separator)) - return fullPath.substring (indexOfDot); - - return String(); -} - -bool File::hasFileExtension (StringRef possibleSuffix) const -{ - if (possibleSuffix.isEmpty()) - return fullPath.lastIndexOfChar ('.') <= fullPath.lastIndexOfChar (separator); - - const int semicolon = possibleSuffix.text.indexOf ((juce_wchar) ';'); - - if (semicolon >= 0) - return hasFileExtension (String (possibleSuffix.text).substring (0, semicolon).trimEnd()) - || hasFileExtension ((possibleSuffix.text + (semicolon + 1)).findEndOfWhitespace()); - - if (fullPath.endsWithIgnoreCase (possibleSuffix)) - { - if (possibleSuffix.text[0] == '.') - return true; - - const int dotPos = fullPath.length() - possibleSuffix.length() - 1; - - if (dotPos >= 0) - return fullPath [dotPos] == '.'; - } - - return false; -} - -File File::withFileExtension (StringRef newExtension) const -{ - if (fullPath.isEmpty()) - return File(); - - String filePart (getFileName()); - - const int i = filePart.lastIndexOfChar ('.'); - if (i >= 0) - filePart = filePart.substring (0, i); - - if (newExtension.isNotEmpty() && newExtension.text[0] != '.') - filePart << '.'; - - return getSiblingFile (filePart + newExtension); -} - -//============================================================================== -bool File::startAsProcess (const String& parameters) const -{ - return exists() && Process::openDocument (fullPath, parameters); -} - -//============================================================================== -FileInputStream* File::createInputStream() const -{ - ScopedPointer fin (new FileInputStream (*this)); - - if (fin->openedOk()) - return fin.release(); - - return nullptr; -} - -FileOutputStream* File::createOutputStream (const size_t bufferSize) const -{ - ScopedPointer out (new FileOutputStream (*this, bufferSize)); - - return out->failedToOpen() ? nullptr - : out.release(); -} - -//============================================================================== -bool File::appendData (const void* const dataToAppend, - const size_t numberOfBytes) const -{ - jassert (((ssize_t) numberOfBytes) >= 0); - - if (numberOfBytes == 0) - return true; - - FileOutputStream out (*this, 8192); - return out.openedOk() && out.write (dataToAppend, numberOfBytes); -} - -bool File::replaceWithData (const void* const dataToWrite, - const size_t numberOfBytes) const -{ - if (numberOfBytes == 0) - return deleteFile(); - - TemporaryFile tempFile (*this, TemporaryFile::useHiddenFile); - tempFile.getFile().appendData (dataToWrite, numberOfBytes); - return tempFile.overwriteTargetFileWithTemporary(); -} - -bool File::appendText (const String& text, - const bool asUnicode, - const bool writeUnicodeHeaderBytes) const -{ - FileOutputStream out (*this); - - if (out.failedToOpen()) - return false; - - out.writeText (text, asUnicode, writeUnicodeHeaderBytes); - return true; -} - -bool File::replaceWithText (const String& textToWrite, - const bool asUnicode, - const bool writeUnicodeHeaderBytes) const -{ - TemporaryFile tempFile (*this, TemporaryFile::useHiddenFile); - tempFile.getFile().appendText (textToWrite, asUnicode, writeUnicodeHeaderBytes); - return tempFile.overwriteTargetFileWithTemporary(); -} - -bool File::hasIdenticalContentTo (const File& other) const -{ - if (other == *this) - return true; - - if (getSize() == other.getSize() && existsAsFile() && other.existsAsFile()) - { - FileInputStream in1 (*this), in2 (other); - - if (in1.openedOk() && in2.openedOk()) - { - const int bufferSize = 4096; - HeapBlock buffer1 (bufferSize), buffer2 (bufferSize); - - for (;;) - { - const int num1 = in1.read (buffer1, bufferSize); - const int num2 = in2.read (buffer2, bufferSize); - - if (num1 != num2) - break; - - if (num1 <= 0) - return true; - - if (memcmp (buffer1, buffer2, (size_t) num1) != 0) - break; - } - } - } - - return false; -} - -//============================================================================== -String File::createLegalPathName (const String& original) -{ - String s (original); - String start; - - if (s.isNotEmpty() && s[1] == ':') - { - start = s.substring (0, 2); - s = s.substring (2); - } - - return start + s.removeCharacters ("\"#@,;:<>*^|?") - .substring (0, 1024); -} - -String File::createLegalFileName (const String& original) -{ - String s (original.removeCharacters ("\"#@,;:<>*^|?\\/")); - - const int maxLength = 128; // only the length of the filename, not the whole path - const int len = s.length(); - - if (len > maxLength) - { - const int lastDot = s.lastIndexOfChar ('.'); - - if (lastDot > jmax (0, len - 12)) - { - s = s.substring (0, maxLength - (len - lastDot)) - + s.substring (lastDot); - } - else - { - s = s.substring (0, maxLength); - } - } - - return s; -} - -//============================================================================== -static int countNumberOfSeparators (String::CharPointerType s) -{ - int num = 0; - - for (;;) - { - const juce_wchar c = s.getAndAdvance(); - - if (c == 0) - break; - - if (c == File::separator) - ++num; - } - - return num; -} - -String File::getRelativePathFrom (const File& dir) const -{ - String thisPath (fullPath); - - while (thisPath.endsWithChar (separator)) - thisPath = thisPath.dropLastCharacters (1); - - String dirPath (addTrailingSeparator (dir.existsAsFile() ? dir.getParentDirectory().getFullPathName() - : dir.fullPath)); - - int commonBitLength = 0; - String::CharPointerType thisPathAfterCommon (thisPath.getCharPointer()); - String::CharPointerType dirPathAfterCommon (dirPath.getCharPointer()); - - { - String::CharPointerType thisPathIter (thisPath.getCharPointer()); - String::CharPointerType dirPathIter (dirPath.getCharPointer()); - - for (int i = 0;;) - { - const juce_wchar c1 = thisPathIter.getAndAdvance(); - const juce_wchar c2 = dirPathIter.getAndAdvance(); - - #if NAMES_ARE_CASE_SENSITIVE - if (c1 != c2 - #else - if ((c1 != c2 && CharacterFunctions::toLowerCase (c1) != CharacterFunctions::toLowerCase (c2)) - #endif - || c1 == 0) - break; - - ++i; - - if (c1 == separator) - { - thisPathAfterCommon = thisPathIter; - dirPathAfterCommon = dirPathIter; - commonBitLength = i; - } - } - } - - // if the only common bit is the root, then just return the full path.. - if (commonBitLength == 0 || (commonBitLength == 1 && thisPath[1] == separator)) - return fullPath; - - const int numUpDirectoriesNeeded = countNumberOfSeparators (dirPathAfterCommon); - - if (numUpDirectoriesNeeded == 0) - return thisPathAfterCommon; - - #if JUCE_WINDOWS - String s (String::repeatedString ("..\\", numUpDirectoriesNeeded)); - #else - String s (String::repeatedString ("../", numUpDirectoriesNeeded)); - #endif - s.appendCharPointer (thisPathAfterCommon); - return s; -} - -//============================================================================== -File File::createTempFile (StringRef fileNameEnding) -{ - const File tempFile (getSpecialLocation (tempDirectory) - .getChildFile ("temp_" + String::toHexString (Random::getSystemRandom().nextInt())) - .withFileExtension (fileNameEnding)); - - if (tempFile.exists()) - return createTempFile (fileNameEnding); - - return tempFile; -} - -//============================================================================== -MemoryMappedFile::MemoryMappedFile (const File& file, MemoryMappedFile::AccessMode mode) - : address (nullptr), range (0, file.getSize()), fileHandle (0) -{ - openInternal (file, mode); -} - -MemoryMappedFile::MemoryMappedFile (const File& file, const Range& fileRange, AccessMode mode) - : address (nullptr), range (fileRange.getIntersectionWith (Range (0, file.getSize()))), fileHandle (0) -{ - openInternal (file, mode); -} - - -//============================================================================== -#if JUCE_UNIT_TESTS - -class FileTests : public UnitTest -{ -public: - FileTests() : UnitTest ("Files") {} - - void runTest() - { - beginTest ("Reading"); - - const File home (File::getSpecialLocation (File::userHomeDirectory)); - const File temp (File::getSpecialLocation (File::tempDirectory)); - - expect (! File::nonexistent.exists()); - expect (home.isDirectory()); - expect (home.exists()); - expect (! home.existsAsFile()); - expect (File::getSpecialLocation (File::userDocumentsDirectory).isDirectory()); - expect (File::getSpecialLocation (File::userApplicationDataDirectory).isDirectory()); - expect (File::getSpecialLocation (File::currentExecutableFile).exists()); - expect (File::getSpecialLocation (File::currentApplicationFile).exists()); - expect (File::getSpecialLocation (File::invokedExecutableFile).exists()); - expect (home.getVolumeTotalSize() > 1024 * 1024); - expect (home.getBytesFreeOnVolume() > 0); - expect (! home.isHidden()); - expect (home.isOnHardDisk()); - expect (! home.isOnCDRomDrive()); - expect (File::getCurrentWorkingDirectory().exists()); - expect (home.setAsCurrentWorkingDirectory()); - expect (File::getCurrentWorkingDirectory() == home); - - { - Array roots; - File::findFileSystemRoots (roots); - expect (roots.size() > 0); - - int numRootsExisting = 0; - for (int i = 0; i < roots.size(); ++i) - if (roots[i].exists()) - ++numRootsExisting; - - // (on windows, some of the drives may not contain media, so as long as at least one is ok..) - expect (numRootsExisting > 0); - } - - beginTest ("Writing"); - - File demoFolder (temp.getChildFile ("Juce UnitTests Temp Folder.folder")); - expect (demoFolder.deleteRecursively()); - expect (demoFolder.createDirectory()); - expect (demoFolder.isDirectory()); - expect (demoFolder.getParentDirectory() == temp); - expect (temp.isDirectory()); - - { - Array files; - temp.findChildFiles (files, File::findFilesAndDirectories, false, "*"); - expect (files.contains (demoFolder)); - } - - { - Array files; - temp.findChildFiles (files, File::findDirectories, true, "*.folder"); - expect (files.contains (demoFolder)); - } - - File tempFile (demoFolder.getNonexistentChildFile ("test", ".txt", false)); - - expect (tempFile.getFileExtension() == ".txt"); - expect (tempFile.hasFileExtension (".txt")); - expect (tempFile.hasFileExtension ("txt")); - expect (tempFile.withFileExtension ("xyz").hasFileExtension (".xyz")); - expect (tempFile.withFileExtension ("xyz").hasFileExtension ("abc;xyz;foo")); - expect (tempFile.withFileExtension ("xyz").hasFileExtension ("xyz;foo")); - expect (! tempFile.withFileExtension ("h").hasFileExtension ("bar;foo;xx")); - expect (tempFile.getSiblingFile ("foo").isAChildOf (temp)); - expect (tempFile.hasWriteAccess()); - - { - FileOutputStream fo (tempFile); - fo.write ("0123456789", 10); - } - - expect (tempFile.exists()); - expect (tempFile.getSize() == 10); - expect (std::abs ((int) (tempFile.getLastModificationTime().toMilliseconds() - Time::getCurrentTime().toMilliseconds())) < 3000); - expectEquals (tempFile.loadFileAsString(), String ("0123456789")); - expect (! demoFolder.containsSubDirectories()); - - expectEquals (tempFile.getRelativePathFrom (demoFolder.getParentDirectory()), demoFolder.getFileName() + File::separatorString + tempFile.getFileName()); - expectEquals (demoFolder.getParentDirectory().getRelativePathFrom (tempFile), ".." + File::separatorString + ".." + File::separatorString + demoFolder.getParentDirectory().getFileName()); - - expect (demoFolder.getNumberOfChildFiles (File::findFiles) == 1); - expect (demoFolder.getNumberOfChildFiles (File::findFilesAndDirectories) == 1); - expect (demoFolder.getNumberOfChildFiles (File::findDirectories) == 0); - demoFolder.getNonexistentChildFile ("tempFolder", "", false).createDirectory(); - expect (demoFolder.getNumberOfChildFiles (File::findDirectories) == 1); - expect (demoFolder.getNumberOfChildFiles (File::findFilesAndDirectories) == 2); - expect (demoFolder.containsSubDirectories()); - - expect (tempFile.hasWriteAccess()); - tempFile.setReadOnly (true); - expect (! tempFile.hasWriteAccess()); - tempFile.setReadOnly (false); - expect (tempFile.hasWriteAccess()); - - Time t (Time::getCurrentTime()); - tempFile.setLastModificationTime (t); - Time t2 = tempFile.getLastModificationTime(); - expect (std::abs ((int) (t2.toMilliseconds() - t.toMilliseconds())) <= 1000); - - { - MemoryBlock mb; - tempFile.loadFileAsData (mb); - expect (mb.getSize() == 10); - expect (mb[0] == '0'); - } - - { - expect (tempFile.getSize() == 10); - FileOutputStream fo (tempFile); - expect (fo.openedOk()); - - expect (fo.setPosition (7)); - expect (fo.truncate().wasOk()); - expect (tempFile.getSize() == 7); - fo.write ("789", 3); - fo.flush(); - expect (tempFile.getSize() == 10); - } - - beginTest ("Memory-mapped files"); - - { - MemoryMappedFile mmf (tempFile, MemoryMappedFile::readOnly); - expect (mmf.getSize() == 10); - expect (mmf.getData() != nullptr); - expect (memcmp (mmf.getData(), "0123456789", 10) == 0); - } - - { - const File tempFile2 (tempFile.getNonexistentSibling (false)); - expect (tempFile2.create()); - expect (tempFile2.appendData ("xxxxxxxxxx", 10)); - - { - MemoryMappedFile mmf (tempFile2, MemoryMappedFile::readWrite); - expect (mmf.getSize() == 10); - expect (mmf.getData() != nullptr); - memcpy (mmf.getData(), "abcdefghij", 10); - } - - { - MemoryMappedFile mmf (tempFile2, MemoryMappedFile::readWrite); - expect (mmf.getSize() == 10); - expect (mmf.getData() != nullptr); - expect (memcmp (mmf.getData(), "abcdefghij", 10) == 0); - } - - expect (tempFile2.deleteFile()); - } - - beginTest ("More writing"); - - expect (tempFile.appendData ("abcdefghij", 10)); - expect (tempFile.getSize() == 20); - expect (tempFile.replaceWithData ("abcdefghij", 10)); - expect (tempFile.getSize() == 10); - - File tempFile2 (tempFile.getNonexistentSibling (false)); - expect (tempFile.copyFileTo (tempFile2)); - expect (tempFile2.exists()); - expect (tempFile2.hasIdenticalContentTo (tempFile)); - expect (tempFile.deleteFile()); - expect (! tempFile.exists()); - expect (tempFile2.moveFileTo (tempFile)); - expect (tempFile.exists()); - expect (! tempFile2.exists()); - - expect (demoFolder.deleteRecursively()); - expect (! demoFolder.exists()); - } -}; - -static FileTests fileUnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_core/files/juce_File.h b/JuceLibraryCode/modules/juce_core/files/juce_File.h deleted file mode 100755 index 5c9a1cd..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_File.h +++ /dev/null @@ -1,984 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_FILE_H_INCLUDED -#define JUCE_FILE_H_INCLUDED - - -//============================================================================== -/** - Represents a local file or directory. - - This class encapsulates the absolute pathname of a file or directory, and - has methods for finding out about the file and changing its properties. - - To read or write to the file, there are methods for returning an input or - output stream. - - @see FileInputStream, FileOutputStream -*/ -class JUCE_API File -{ -public: - //============================================================================== - /** Creates an (invalid) file object. - - The file is initially set to an empty path, so getFullPath() will return - an empty string, and comparing the file to File::nonexistent will return - true. - - You can use its operator= method to point it at a proper file. - */ - File() noexcept {} - - /** Creates a file from an absolute path. - - If the path supplied is a relative path, it is taken to be relative - to the current working directory (see File::getCurrentWorkingDirectory()), - but this isn't a recommended way of creating a file, because you - never know what the CWD is going to be. - - On the Mac/Linux, the path can include "~" notation for referring to - user home directories. - */ - File (const String& absolutePath); - - /** Creates a copy of another file object. */ - File (const File&); - - /** Destructor. */ - ~File() noexcept {} - - /** Sets the file based on an absolute pathname. - - If the path supplied is a relative path, it is taken to be relative - to the current working directory (see File::getCurrentWorkingDirectory()), - but this isn't a recommended way of creating a file, because you - never know what the CWD is going to be. - - On the Mac/Linux, the path can include "~" notation for referring to - user home directories. - */ - File& operator= (const String& newAbsolutePath); - - /** Copies from another file object. */ - File& operator= (const File& otherFile); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - File (File&&) noexcept; - File& operator= (File&&) noexcept; - #endif - - //============================================================================== - /** This static constant is used for referring to an 'invalid' file. */ - static const File nonexistent; - - //============================================================================== - /** Checks whether the file actually exists. - - @returns true if the file exists, either as a file or a directory. - @see existsAsFile, isDirectory - */ - bool exists() const; - - /** Checks whether the file exists and is a file rather than a directory. - - @returns true only if this is a real file, false if it's a directory - or doesn't exist - @see exists, isDirectory - */ - bool existsAsFile() const; - - /** Checks whether the file is a directory that exists. - - @returns true only if the file is a directory which actually exists, so - false if it's a file or doesn't exist at all - @see exists, existsAsFile - */ - bool isDirectory() const; - - /** Returns the size of the file in bytes. - - @returns the number of bytes in the file, or 0 if it doesn't exist. - */ - int64 getSize() const; - - /** Utility function to convert a file size in bytes to a neat string description. - - So for example 100 would return "100 bytes", 2000 would return "2 KB", - 2000000 would produce "2 MB", etc. - */ - static String descriptionOfSizeInBytes (int64 bytes); - - //============================================================================== - /** Returns the complete, absolute path of this file. - - This includes the filename and all its parent folders. On Windows it'll - also include the drive letter prefix; on Mac or Linux it'll be a complete - path starting from the root folder. - - If you just want the file's name, you should use getFileName() or - getFileNameWithoutExtension(). - - @see getFileName, getRelativePathFrom - */ - const String& getFullPathName() const noexcept { return fullPath; } - - /** Returns the last section of the pathname. - - Returns just the final part of the path - e.g. if the whole path - is "/moose/fish/foo.txt" this will return "foo.txt". - - For a directory, it returns the final part of the path - e.g. for the - directory "/moose/fish" it'll return "fish". - - If the filename begins with a dot, it'll return the whole filename, e.g. for - "/moose/.fish", it'll return ".fish" - - @see getFullPathName, getFileNameWithoutExtension - */ - String getFileName() const; - - /** Creates a relative path that refers to a file relatively to a given directory. - - e.g. File ("/moose/foo.txt").getRelativePathFrom (File ("/moose/fish/haddock")) - would return "../../foo.txt". - - If it's not possible to navigate from one file to the other, an absolute - path is returned. If the paths are invalid, an empty string may also be - returned. - - @param directoryToBeRelativeTo the directory which the resultant string will - be relative to. If this is actually a file rather than - a directory, its parent directory will be used instead. - If it doesn't exist, it's assumed to be a directory. - @see getChildFile, isAbsolutePath - */ - String getRelativePathFrom (const File& directoryToBeRelativeTo) const; - - //============================================================================== - /** Returns the file's extension. - - Returns the file extension of this file, also including the dot. - - e.g. "/moose/fish/foo.txt" would return ".txt" - - @see hasFileExtension, withFileExtension, getFileNameWithoutExtension - */ - String getFileExtension() const; - - /** Checks whether the file has a given extension. - - @param extensionToTest the extension to look for - it doesn't matter whether or - not this string has a dot at the start, so ".wav" and "wav" - will have the same effect. To compare with multiple extensions, this - parameter can contain multiple strings, separated by semi-colons - - so, for example: hasFileExtension (".jpeg;png;gif") would return - true if the file has any of those three extensions. - - @see getFileExtension, withFileExtension, getFileNameWithoutExtension - */ - bool hasFileExtension (StringRef extensionToTest) const; - - /** Returns a version of this file with a different file extension. - - e.g. File ("/moose/fish/foo.txt").withFileExtension ("html") returns "/moose/fish/foo.html" - - @param newExtension the new extension, either with or without a dot at the start (this - doesn't make any difference). To get remove a file's extension altogether, - pass an empty string into this function. - - @see getFileName, getFileExtension, hasFileExtension, getFileNameWithoutExtension - */ - File withFileExtension (StringRef newExtension) const; - - /** Returns the last part of the filename, without its file extension. - - e.g. for "/moose/fish/foo.txt" this will return "foo". - - @see getFileName, getFileExtension, hasFileExtension, withFileExtension - */ - String getFileNameWithoutExtension() const; - - //============================================================================== - /** Returns a 32-bit hash-code that identifies this file. - - This is based on the filename. Obviously it's possible, although unlikely, that - two files will have the same hash-code. - */ - int hashCode() const; - - /** Returns a 64-bit hash-code that identifies this file. - - This is based on the filename. Obviously it's possible, although unlikely, that - two files will have the same hash-code. - */ - int64 hashCode64() const; - - //============================================================================== - /** Returns a file that represents a relative (or absolute) sub-path of the current one. - - This will find a child file or directory of the current object. - - e.g. - File ("/moose/fish").getChildFile ("foo.txt") will produce "/moose/fish/foo.txt". - File ("/moose/fish").getChildFile ("haddock/foo.txt") will produce "/moose/fish/haddock/foo.txt". - File ("/moose/fish").getChildFile ("../foo.txt") will produce "/moose/foo.txt". - - If the string is actually an absolute path, it will be treated as such, e.g. - File ("/moose/fish").getChildFile ("/foo.txt") will produce "/foo.txt" - - @see getSiblingFile, getParentDirectory, getRelativePathFrom, isAChildOf - */ - File getChildFile (StringRef relativeOrAbsolutePath) const; - - /** Returns a file which is in the same directory as this one. - - This is equivalent to getParentDirectory().getChildFile (name). - - @see getChildFile, getParentDirectory - */ - File getSiblingFile (StringRef siblingFileName) const; - - //============================================================================== - /** Returns the directory that contains this file or directory. - - e.g. for "/moose/fish/foo.txt" this will return "/moose/fish". - */ - File getParentDirectory() const; - - /** Checks whether a file is somewhere inside a directory. - - Returns true if this file is somewhere inside a subdirectory of the directory - that is passed in. Neither file actually has to exist, because the function - just checks the paths for similarities. - - e.g. File ("/moose/fish/foo.txt").isAChildOf ("/moose") is true. - File ("/moose/fish/foo.txt").isAChildOf ("/moose/fish") is also true. - */ - bool isAChildOf (const File& potentialParentDirectory) const; - - //============================================================================== - /** Chooses a filename relative to this one that doesn't already exist. - - If this file is a directory, this will return a child file of this - directory that doesn't exist, by adding numbers to a prefix and suffix until - it finds one that isn't already there. - - If the prefix + the suffix doesn't exist, it won't bother adding a number. - - e.g. File ("/moose/fish").getNonexistentChildFile ("foo", ".txt", true) might - return "/moose/fish/foo(2).txt" if there's already a file called "foo.txt". - - @param prefix the string to use for the filename before the number - @param suffix the string to add to the filename after the number - @param putNumbersInBrackets if true, this will create filenames in the - format "prefix(number)suffix", if false, it will leave the - brackets out. - */ - File getNonexistentChildFile (const String& prefix, - const String& suffix, - bool putNumbersInBrackets = true) const; - - /** Chooses a filename for a sibling file to this one that doesn't already exist. - - If this file doesn't exist, this will just return itself, otherwise it - will return an appropriate sibling that doesn't exist, e.g. if a file - "/moose/fish/foo.txt" exists, this might return "/moose/fish/foo(2).txt". - - @param putNumbersInBrackets whether to add brackets around the numbers that - get appended to the new filename. - */ - File getNonexistentSibling (bool putNumbersInBrackets = true) const; - - //============================================================================== - /** Compares the pathnames for two files. */ - bool operator== (const File&) const; - /** Compares the pathnames for two files. */ - bool operator!= (const File&) const; - /** Compares the pathnames for two files. */ - bool operator< (const File&) const; - /** Compares the pathnames for two files. */ - bool operator> (const File&) const; - - //============================================================================== - /** Checks whether a file can be created or written to. - - @returns true if it's possible to create and write to this file. If the file - doesn't already exist, this will check its parent directory to - see if writing is allowed. - @see setReadOnly - */ - bool hasWriteAccess() const; - - /** Changes the write-permission of a file or directory. - - @param shouldBeReadOnly whether to add or remove write-permission - @param applyRecursively if the file is a directory and this is true, it will - recurse through all the subfolders changing the permissions - of all files - @returns true if it manages to change the file's permissions. - @see hasWriteAccess - */ - bool setReadOnly (bool shouldBeReadOnly, - bool applyRecursively = false) const; - - /** Changes the execute-permissions of a file. - - @param shouldBeExecutable whether to add or remove execute-permission - @returns true if it manages to change the file's permissions. - */ - bool setExecutePermission (bool shouldBeExecutable) const; - - /** Returns true if this file is a hidden or system file. - The criteria for deciding whether a file is hidden are platform-dependent. - */ - bool isHidden() const; - - /** Returns true if this file is a link or alias that can be followed using getLinkedTarget(). */ - bool isLink() const; - - /** If this file is a link or alias, this returns the file that it points to. - If the file isn't actually link, it'll just return itself. - */ - File getLinkedTarget() const; - - /** Returns a unique identifier for the file, if one is available. - - Depending on the OS and file-system, this may be a unix inode number or - a win32 file identifier, or 0 if it fails to find one. The number will - be unique on the filesystem, but not globally. - */ - uint64 getFileIdentifier() const; - - //============================================================================== - /** Returns the last modification time of this file. - - @returns the time, or an invalid time if the file doesn't exist. - @see setLastModificationTime, getLastAccessTime, getCreationTime - */ - Time getLastModificationTime() const; - - /** Returns the last time this file was accessed. - - @returns the time, or an invalid time if the file doesn't exist. - @see setLastAccessTime, getLastModificationTime, getCreationTime - */ - Time getLastAccessTime() const; - - /** Returns the time that this file was created. - - @returns the time, or an invalid time if the file doesn't exist. - @see getLastModificationTime, getLastAccessTime - */ - Time getCreationTime() const; - - /** Changes the modification time for this file. - - @param newTime the time to apply to the file - @returns true if it manages to change the file's time. - @see getLastModificationTime, setLastAccessTime, setCreationTime - */ - bool setLastModificationTime (Time newTime) const; - - /** Changes the last-access time for this file. - - @param newTime the time to apply to the file - @returns true if it manages to change the file's time. - @see getLastAccessTime, setLastModificationTime, setCreationTime - */ - bool setLastAccessTime (Time newTime) const; - - /** Changes the creation date for this file. - - @param newTime the time to apply to the file - @returns true if it manages to change the file's time. - @see getCreationTime, setLastModificationTime, setLastAccessTime - */ - bool setCreationTime (Time newTime) const; - - /** If possible, this will try to create a version string for the given file. - - The OS may be able to look at the file and give a version for it - e.g. with - executables, bundles, dlls, etc. If no version is available, this will - return an empty string. - */ - String getVersion() const; - - //============================================================================== - /** Creates an empty file if it doesn't already exist. - - If the file that this object refers to doesn't exist, this will create a file - of zero size. - - If it already exists or is a directory, this method will do nothing. - - @returns true if the file has been created (or if it already existed). - @see createDirectory - */ - Result create() const; - - /** Creates a new directory for this filename. - - This will try to create the file as a directory, and fill also create - any parent directories it needs in order to complete the operation. - - @returns a result to indicate whether the directory was created successfully, or - an error message if it failed. - @see create - */ - Result createDirectory() const; - - /** Deletes a file. - - If this file is actually a directory, it may not be deleted correctly if it - contains files. See deleteRecursively() as a better way of deleting directories. - - @returns true if the file has been successfully deleted (or if it didn't exist to - begin with). - @see deleteRecursively - */ - bool deleteFile() const; - - /** Deletes a file or directory and all its subdirectories. - - If this file is a directory, this will try to delete it and all its subfolders. If - it's just a file, it will just try to delete the file. - - @returns true if the file and all its subfolders have been successfully deleted - (or if it didn't exist to begin with). - @see deleteFile - */ - bool deleteRecursively() const; - - /** Moves this file or folder to the trash. - - @returns true if the operation succeeded. It could fail if the trash is full, or - if the file is write-protected, so you should check the return value - and act appropriately. - */ - bool moveToTrash() const; - - /** Moves or renames a file. - - Tries to move a file to a different location. - If the target file already exists, this will attempt to delete it first, and - will fail if this can't be done. - - Note that the destination file isn't the directory to put it in, it's the actual - filename that you want the new file to have. - - Also note that on some OSes (e.g. Windows), moving files between different - volumes may not be possible. - - @returns true if the operation succeeds - */ - bool moveFileTo (const File& targetLocation) const; - - /** Copies a file. - - Tries to copy a file to a different location. - If the target file already exists, this will attempt to delete it first, and - will fail if this can't be done. - - @returns true if the operation succeeds - */ - bool copyFileTo (const File& targetLocation) const; - - /** Copies a directory. - - Tries to copy an entire directory, recursively. - - If this file isn't a directory or if any target files can't be created, this - will return false. - - @param newDirectory the directory that this one should be copied to. Note that this - is the name of the actual directory to create, not the directory - into which the new one should be placed, so there must be enough - write privileges to create it if it doesn't exist. Any files inside - it will be overwritten by similarly named ones that are copied. - */ - bool copyDirectoryTo (const File& newDirectory) const; - - //============================================================================== - /** Used in file searching, to specify whether to return files, directories, or both. - */ - enum TypesOfFileToFind - { - findDirectories = 1, /**< Use this flag to indicate that you want to find directories. */ - findFiles = 2, /**< Use this flag to indicate that you want to find files. */ - findFilesAndDirectories = 3, /**< Use this flag to indicate that you want to find both files and directories. */ - ignoreHiddenFiles = 4 /**< Add this flag to avoid returning any hidden files in the results. */ - }; - - /** Searches inside a directory for files matching a wildcard pattern. - - Assuming that this file is a directory, this method will search it - for either files or subdirectories whose names match a filename pattern. - - @param results an array to which File objects will be added for the - files that the search comes up with - @param whatToLookFor a value from the TypesOfFileToFind enum, specifying whether to - return files, directories, or both. If the ignoreHiddenFiles flag - is also added to this value, hidden files won't be returned - @param searchRecursively if true, all subdirectories will be recursed into to do - an exhaustive search - @param wildCardPattern the filename pattern to search for, e.g. "*.txt" - @returns the number of results that have been found - - @see getNumberOfChildFiles, DirectoryIterator - */ - int findChildFiles (Array& results, - int whatToLookFor, - bool searchRecursively, - const String& wildCardPattern = "*") const; - - /** Searches inside a directory and counts how many files match a wildcard pattern. - - Assuming that this file is a directory, this method will search it - for either files or subdirectories whose names match a filename pattern, - and will return the number of matches found. - - This isn't a recursive call, and will only search this directory, not - its children. - - @param whatToLookFor a value from the TypesOfFileToFind enum, specifying whether to - count files, directories, or both. If the ignoreHiddenFiles flag - is also added to this value, hidden files won't be counted - @param wildCardPattern the filename pattern to search for, e.g. "*.txt" - @returns the number of matches found - @see findChildFiles, DirectoryIterator - */ - int getNumberOfChildFiles (int whatToLookFor, - const String& wildCardPattern = "*") const; - - /** Returns true if this file is a directory that contains one or more subdirectories. - @see isDirectory, findChildFiles - */ - bool containsSubDirectories() const; - - //============================================================================== - /** Creates a stream to read from this file. - - @returns a stream that will read from this file (initially positioned at the - start of the file), or nullptr if the file can't be opened for some reason - @see createOutputStream, loadFileAsData - */ - FileInputStream* createInputStream() const; - - /** Creates a stream to write to this file. - - If the file exists, the stream that is returned will be positioned ready for - writing at the end of the file, so you might want to use deleteFile() first - to write to an empty file. - - @returns a stream that will write to this file (initially positioned at the - end of the file), or nullptr if the file can't be opened for some reason - @see createInputStream, appendData, appendText - */ - FileOutputStream* createOutputStream (size_t bufferSize = 0x8000) const; - - //============================================================================== - /** Loads a file's contents into memory as a block of binary data. - - Of course, trying to load a very large file into memory will blow up, so - it's better to check first. - - @param result the data block to which the file's contents should be appended - note - that if the memory block might already contain some data, you - might want to clear it first - @returns true if the file could all be read into memory - */ - bool loadFileAsData (MemoryBlock& result) const; - - /** Reads a file into memory as a string. - - Attempts to load the entire file as a zero-terminated string. - - This makes use of InputStream::readEntireStreamAsString, which can - read either UTF-16 or UTF-8 file formats. - */ - String loadFileAsString() const; - - /** Reads the contents of this file as text and splits it into lines, which are - appended to the given StringArray. - */ - void readLines (StringArray& destLines) const; - - //============================================================================== - /** Appends a block of binary data to the end of the file. - - This will try to write the given buffer to the end of the file. - - @returns false if it can't write to the file for some reason - */ - bool appendData (const void* dataToAppend, - size_t numberOfBytes) const; - - /** Replaces this file's contents with a given block of data. - - This will delete the file and replace it with the given data. - - A nice feature of this method is that it's safe - instead of deleting - the file first and then re-writing it, it creates a new temporary file, - writes the data to that, and then moves the new file to replace the existing - file. This means that if the power gets pulled out or something crashes, - you're a lot less likely to end up with a corrupted or unfinished file.. - - Returns true if the operation succeeds, or false if it fails. - - @see appendText - */ - bool replaceWithData (const void* dataToWrite, - size_t numberOfBytes) const; - - /** Appends a string to the end of the file. - - This will try to append a text string to the file, as either 16-bit unicode - or 8-bit characters in the default system encoding. - - It can also write the 'ff fe' unicode header bytes before the text to indicate - the endianness of the file. - - Any single \\n characters in the string are replaced with \\r\\n before it is written. - - @see replaceWithText - */ - bool appendText (const String& textToAppend, - bool asUnicode = false, - bool writeUnicodeHeaderBytes = false) const; - - /** Replaces this file's contents with a given text string. - - This will delete the file and replace it with the given text. - - A nice feature of this method is that it's safe - instead of deleting - the file first and then re-writing it, it creates a new temporary file, - writes the text to that, and then moves the new file to replace the existing - file. This means that if the power gets pulled out or something crashes, - you're a lot less likely to end up with an empty file.. - - For an explanation of the parameters here, see the appendText() method. - - Returns true if the operation succeeds, or false if it fails. - - @see appendText - */ - bool replaceWithText (const String& textToWrite, - bool asUnicode = false, - bool writeUnicodeHeaderBytes = false) const; - - /** Attempts to scan the contents of this file and compare it to another file, returning - true if this is possible and they match byte-for-byte. - */ - bool hasIdenticalContentTo (const File& other) const; - - //============================================================================== - /** Creates a set of files to represent each file root. - - e.g. on Windows this will create files for "c:\", "d:\" etc according - to which ones are available. On the Mac/Linux, this will probably - just add a single entry for "/". - */ - static void findFileSystemRoots (Array& results); - - /** Finds the name of the drive on which this file lives. - @returns the volume label of the drive, or an empty string if this isn't possible - */ - String getVolumeLabel() const; - - /** Returns the serial number of the volume on which this file lives. - @returns the serial number, or zero if there's a problem doing this - */ - int getVolumeSerialNumber() const; - - /** Returns the number of bytes free on the drive that this file lives on. - - @returns the number of bytes free, or 0 if there's a problem finding this out - @see getVolumeTotalSize - */ - int64 getBytesFreeOnVolume() const; - - /** Returns the total size of the drive that contains this file. - - @returns the total number of bytes that the volume can hold - @see getBytesFreeOnVolume - */ - int64 getVolumeTotalSize() const; - - /** Returns true if this file is on a CD or DVD drive. */ - bool isOnCDRomDrive() const; - - /** Returns true if this file is on a hard disk. - - This will fail if it's a network drive, but will still be true for - removable hard-disks. - */ - bool isOnHardDisk() const; - - /** Returns true if this file is on a removable disk drive. - - This might be a usb-drive, a CD-rom, or maybe a network drive. - */ - bool isOnRemovableDrive() const; - - //============================================================================== - /** Launches the file as a process. - - - if the file is executable, this will run it. - - - if it's a document of some kind, it will launch the document with its - default viewer application. - - - if it's a folder, it will be opened in Explorer, Finder, or equivalent. - - @see revealToUser - */ - bool startAsProcess (const String& parameters = String()) const; - - /** Opens Finder, Explorer, or whatever the OS uses, to show the user this file's location. - @see startAsProcess - */ - void revealToUser() const; - - //============================================================================== - /** A set of types of location that can be passed to the getSpecialLocation() method. - */ - enum SpecialLocationType - { - /** The user's home folder. This is the same as using File ("~"). */ - userHomeDirectory, - - /** The user's default documents folder. On Windows, this might be the user's - "My Documents" folder. On the Mac it'll be their "Documents" folder. Linux - doesn't tend to have one of these, so it might just return their home folder. - */ - userDocumentsDirectory, - - /** The folder that contains the user's desktop objects. */ - userDesktopDirectory, - - /** The most likely place where a user might store their music files. */ - userMusicDirectory, - - /** The most likely place where a user might store their movie files. */ - userMoviesDirectory, - - /** The most likely place where a user might store their picture files. */ - userPicturesDirectory, - - /** The folder in which applications store their persistent user-specific settings. - On Windows, this might be "\Documents and Settings\username\Application Data". - On the Mac, it might be "~/Library". If you're going to store your settings in here, - always create your own sub-folder to put them in, to avoid making a mess. - */ - userApplicationDataDirectory, - - /** An equivalent of the userApplicationDataDirectory folder that is shared by all users - of the computer, rather than just the current user. - - On the Mac it'll be "/Library", on Windows, it could be something like - "\Documents and Settings\All Users\Application Data". - - Depending on the setup, this folder may be read-only. - */ - commonApplicationDataDirectory, - - /** A place to put documents which are shared by all users of the machine. - On Windows this may be somewhere like "C:\Users\Public\Documents", on OSX it - will be something like "/Users/Shared". Other OSes may have no such concept - though, so be careful. - */ - commonDocumentsDirectory, - - /** The folder that should be used for temporary files. - Always delete them when you're finished, to keep the user's computer tidy! - */ - tempDirectory, - - /** Returns this application's executable file. - - If running as a plug-in or DLL, this will (where possible) be the DLL rather than the - host app. - - On the mac this will return the unix binary, not the package folder - see - currentApplicationFile for that. - - See also invokedExecutableFile, which is similar, but if the exe was launched from a - file link, invokedExecutableFile will return the name of the link. - */ - currentExecutableFile, - - /** Returns this application's location. - - If running as a plug-in or DLL, this will (where possible) be the DLL rather than the - host app. - - On the mac this will return the package folder (if it's in one), not the unix binary - that's inside it - compare with currentExecutableFile. - */ - currentApplicationFile, - - /** Returns the file that was invoked to launch this executable. - This may differ from currentExecutableFile if the app was started from e.g. a link - this - will return the name of the link that was used, whereas currentExecutableFile will return - the actual location of the target executable. - */ - invokedExecutableFile, - - /** In a plugin, this will return the path of the host executable. */ - hostApplicationPath, - - #if JUCE_WINDOWS - /** On a Windows machine, returns the location of the Windows/System32 folder. */ - windowsSystemDirectory, - #endif - - /** The directory in which applications normally get installed. - So on windows, this would be something like "c:\program files", on the - Mac "/Applications", or "/usr" on linux. - */ - globalApplicationsDirectory - }; - - /** Finds the location of a special type of file or directory, such as a home folder or - documents folder. - - @see SpecialLocationType - */ - static File JUCE_CALLTYPE getSpecialLocation (const SpecialLocationType type); - - //============================================================================== - /** Returns a temporary file in the system's temp directory. - This will try to return the name of a non-existent temp file. - To get the temp folder, you can use getSpecialLocation (File::tempDirectory). - */ - static File createTempFile (StringRef fileNameEnding); - - - //============================================================================== - /** Returns the current working directory. - @see setAsCurrentWorkingDirectory - */ - static File getCurrentWorkingDirectory(); - - /** Sets the current working directory to be this file. - - For this to work the file must point to a valid directory. - - @returns true if the current directory has been changed. - @see getCurrentWorkingDirectory - */ - bool setAsCurrentWorkingDirectory() const; - - //============================================================================== - /** The system-specific file separator character. - On Windows, this will be '\', on Mac/Linux, it'll be '/' - */ - static const juce_wchar separator; - - /** The system-specific file separator character, as a string. - On Windows, this will be '\', on Mac/Linux, it'll be '/' - */ - static const String separatorString; - - //============================================================================== - /** Returns a version of a filename with any illegal characters removed. - - This will return a copy of the given string after removing characters - that are not allowed in a legal filename, and possibly shortening the - string if it's too long. - - Because this will remove slashes, don't use it on an absolute pathname - use - createLegalPathName() for that. - - @see createLegalPathName - */ - static String createLegalFileName (const String& fileNameToFix); - - /** Returns a version of a path with any illegal characters removed. - - Similar to createLegalFileName(), but this won't remove slashes, so can - be used on a complete pathname. - - @see createLegalFileName - */ - static String createLegalPathName (const String& pathNameToFix); - - /** Indicates whether filenames are case-sensitive on the current operating system. */ - static bool areFileNamesCaseSensitive(); - - /** Returns true if the string seems to be a fully-specified absolute path. */ - static bool isAbsolutePath (StringRef path); - - /** Creates a file that simply contains this string, without doing the sanity-checking - that the normal constructors do. - - Best to avoid this unless you really know what you're doing. - */ - static File createFileWithoutCheckingPath (const String& absolutePath) noexcept; - - /** Adds a separator character to the end of a path if it doesn't already have one. */ - static String addTrailingSeparator (const String& path); - - #if JUCE_MAC || JUCE_IOS || DOXYGEN - //============================================================================== - /** OSX ONLY - Finds the OSType of a file from the its resources. */ - OSType getMacOSType() const; - - /** OSX ONLY - Returns true if this file is actually a bundle. */ - bool isBundle() const; - #endif - - #if JUCE_MAC || DOXYGEN - /** OSX ONLY - Adds this file to the OSX dock */ - void addToDock() const; - #endif - - #if JUCE_WINDOWS - /** Windows ONLY - Creates a win32 .LNK shortcut file that links to this file. */ - bool createLink (const String& description, const File& linkFileToCreate) const; - #endif - -private: - //============================================================================== - String fullPath; - - static String parseAbsolutePath (const String&); - String getPathUpToLastSlash() const; - - Result createDirectoryInternal (const String&) const; - bool copyInternal (const File&) const; - bool moveInternal (const File&) const; - bool setFileTimesInternal (int64 m, int64 a, int64 c) const; - void getFileTimesInternal (int64& m, int64& a, int64& c) const; - bool setFileReadOnlyInternal (bool) const; - bool setFileExecutableInternal (bool) const; -}; - -#endif // JUCE_FILE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp b/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp deleted file mode 100755 index bd0bdf8..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -FileFilter::FileFilter (const String& filterDescription) - : description (filterDescription) -{ -} - -FileFilter::~FileFilter() -{ -} - -const String& FileFilter::getDescription() const noexcept -{ - return description; -} diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h b/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h deleted file mode 100755 index 4c02415..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileFilter.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_FILEFILTER_H_INCLUDED -#define JUCE_FILEFILTER_H_INCLUDED - - -//============================================================================== -/** - Interface for deciding which files are suitable for something. - - For example, this is used by DirectoryContentsList to select which files - go into the list. - - @see WildcardFileFilter, DirectoryContentsList, FileListComponent, FileBrowserComponent -*/ -class JUCE_API FileFilter -{ -public: - //============================================================================== - /** Creates a filter with the given description. - - The description can be returned later with the getDescription() method. - */ - FileFilter (const String& filterDescription); - - /** Destructor. */ - virtual ~FileFilter(); - - //============================================================================== - /** Returns the description that the filter was created with. */ - const String& getDescription() const noexcept; - - //============================================================================== - /** Should return true if this file is suitable for inclusion in whatever context - the object is being used. - */ - virtual bool isFileSuitable (const File& file) const = 0; - - /** Should return true if this directory is suitable for inclusion in whatever context - the object is being used. - */ - virtual bool isDirectorySuitable (const File& file) const = 0; - - -protected: - //============================================================================== - String description; -}; - - -#endif // JUCE_FILEFILTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp b/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp deleted file mode 100755 index 801ccfa..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -int64 juce_fileSetPosition (void* handle, int64 pos); - - -//============================================================================== -FileInputStream::FileInputStream (const File& f) - : file (f), - fileHandle (nullptr), - currentPosition (0), - status (Result::ok()) -{ - openHandle(); -} - -int64 FileInputStream::getTotalLength() -{ - // You should always check that a stream opened successfully before using it! - jassert (openedOk()); - - return file.getSize(); -} - -int FileInputStream::read (void* buffer, int bytesToRead) -{ - // You should always check that a stream opened successfully before using it! - jassert (openedOk()); - - // The buffer should never be null, and a negative size is probably a - // sign that something is broken! - jassert (buffer != nullptr && bytesToRead >= 0); - - const size_t num = readInternal (buffer, (size_t) bytesToRead); - currentPosition += num; - - return (int) num; -} - -bool FileInputStream::isExhausted() -{ - return currentPosition >= getTotalLength(); -} - -int64 FileInputStream::getPosition() -{ - return currentPosition; -} - -bool FileInputStream::setPosition (int64 pos) -{ - // You should always check that a stream opened successfully before using it! - jassert (openedOk()); - - if (pos != currentPosition) - currentPosition = juce_fileSetPosition (fileHandle, pos); - - return currentPosition == pos; -} diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h b/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h deleted file mode 100755 index 35963ba..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileInputStream.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_FILEINPUTSTREAM_H_INCLUDED -#define JUCE_FILEINPUTSTREAM_H_INCLUDED - - -//============================================================================== -/** - An input stream that reads from a local file. - - @see InputStream, FileOutputStream, File::createInputStream -*/ -class JUCE_API FileInputStream : public InputStream -{ -public: - //============================================================================== - /** Creates a FileInputStream to read from the given file. - - After creating a FileInputStream, you should use openedOk() or failedToOpen() - to make sure that it's OK before trying to read from it! If it failed, you - can call getStatus() to get more error information. - */ - explicit FileInputStream (const File& fileToRead); - - /** Destructor. */ - ~FileInputStream(); - - //============================================================================== - /** Returns the file that this stream is reading from. */ - const File& getFile() const noexcept { return file; } - - /** Returns the status of the file stream. - The result will be ok if the file opened successfully. If an error occurs while - opening or reading from the file, this will contain an error message. - */ - const Result& getStatus() const noexcept { return status; } - - /** Returns true if the stream couldn't be opened for some reason. - @see getResult() - */ - bool failedToOpen() const noexcept { return status.failed(); } - - /** Returns true if the stream opened without problems. - @see getResult() - */ - bool openedOk() const noexcept { return status.wasOk(); } - - - //============================================================================== - int64 getTotalLength() override; - int read (void*, int) override; - bool isExhausted() override; - int64 getPosition() override; - bool setPosition (int64) override; - -private: - //============================================================================== - const File file; - void* fileHandle; - int64 currentPosition; - Result status; - - void openHandle(); - size_t readInternal (void*, size_t); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileInputStream) -}; - - -#endif // JUCE_FILEINPUTSTREAM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp b/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp deleted file mode 100755 index 961a8d1..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -int64 juce_fileSetPosition (void* handle, int64 pos); - -//============================================================================== -FileOutputStream::FileOutputStream (const File& f, const size_t bufferSizeToUse) - : file (f), - fileHandle (nullptr), - status (Result::ok()), - currentPosition (0), - bufferSize (bufferSizeToUse), - bytesInBuffer (0), - buffer (jmax (bufferSizeToUse, (size_t) 16)) -{ - openHandle(); -} - -FileOutputStream::~FileOutputStream() -{ - flushBuffer(); - closeHandle(); -} - -int64 FileOutputStream::getPosition() -{ - return currentPosition; -} - -bool FileOutputStream::setPosition (int64 newPosition) -{ - if (newPosition != currentPosition) - { - flushBuffer(); - currentPosition = juce_fileSetPosition (fileHandle, newPosition); - } - - return newPosition == currentPosition; -} - -bool FileOutputStream::flushBuffer() -{ - bool ok = true; - - if (bytesInBuffer > 0) - { - ok = (writeInternal (buffer, bytesInBuffer) == (ssize_t) bytesInBuffer); - bytesInBuffer = 0; - } - - return ok; -} - -void FileOutputStream::flush() -{ - flushBuffer(); - flushInternal(); -} - -bool FileOutputStream::write (const void* const src, const size_t numBytes) -{ - jassert (src != nullptr && ((ssize_t) numBytes) >= 0); - - if (bytesInBuffer + numBytes < bufferSize) - { - memcpy (buffer + bytesInBuffer, src, numBytes); - bytesInBuffer += numBytes; - currentPosition += numBytes; - } - else - { - if (! flushBuffer()) - return false; - - if (numBytes < bufferSize) - { - memcpy (buffer + bytesInBuffer, src, numBytes); - bytesInBuffer += numBytes; - currentPosition += numBytes; - } - else - { - const ssize_t bytesWritten = writeInternal (src, numBytes); - - if (bytesWritten < 0) - return false; - - currentPosition += bytesWritten; - return bytesWritten == (ssize_t) numBytes; - } - } - - return true; -} - -bool FileOutputStream::writeRepeatedByte (uint8 byte, size_t numBytes) -{ - jassert (((ssize_t) numBytes) >= 0); - - if (bytesInBuffer + numBytes < bufferSize) - { - memset (buffer + bytesInBuffer, byte, numBytes); - bytesInBuffer += numBytes; - currentPosition += numBytes; - return true; - } - - return OutputStream::writeRepeatedByte (byte, numBytes); -} diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h b/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h deleted file mode 100755 index f80705f..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileOutputStream.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_FILEOUTPUTSTREAM_H_INCLUDED -#define JUCE_FILEOUTPUTSTREAM_H_INCLUDED - - -//============================================================================== -/** - An output stream that writes into a local file. - - @see OutputStream, FileInputStream, File::createOutputStream -*/ -class JUCE_API FileOutputStream : public OutputStream -{ -public: - //============================================================================== - /** Creates a FileOutputStream. - - If the file doesn't exist, it will first be created. If the file can't be - created or opened, the failedToOpen() method will return - true. - - If the file already exists when opened, the stream's write-postion will - be set to the end of the file. To overwrite an existing file, - use File::deleteFile() before opening the stream, or use setPosition(0) - after it's opened (although this won't truncate the file). - - @see TemporaryFile - */ - FileOutputStream (const File& fileToWriteTo, - size_t bufferSizeToUse = 16384); - - /** Destructor. */ - ~FileOutputStream(); - - //============================================================================== - /** Returns the file that this stream is writing to. - */ - const File& getFile() const { return file; } - - /** Returns the status of the file stream. - The result will be ok if the file opened successfully. If an error occurs while - opening or writing to the file, this will contain an error message. - */ - const Result& getStatus() const noexcept { return status; } - - /** Returns true if the stream couldn't be opened for some reason. - @see getResult() - */ - bool failedToOpen() const noexcept { return status.failed(); } - - /** Returns true if the stream opened without problems. - @see getResult() - */ - bool openedOk() const noexcept { return status.wasOk(); } - - /** Attempts to truncate the file to the current write position. - To truncate a file to a specific size, first use setPosition() to seek to the - appropriate location, and then call this method. - */ - Result truncate(); - - //============================================================================== - void flush() override; - int64 getPosition() override; - bool setPosition (int64) override; - bool write (const void*, size_t) override; - bool writeRepeatedByte (uint8 byte, size_t numTimesToRepeat) override; - - -private: - //============================================================================== - File file; - void* fileHandle; - Result status; - int64 currentPosition; - size_t bufferSize, bytesInBuffer; - HeapBlock buffer; - - void openHandle(); - void closeHandle(); - void flushInternal(); - bool flushBuffer(); - int64 setPositionInternal (int64); - ssize_t writeInternal (const void*, size_t); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileOutputStream) -}; - -#endif // JUCE_FILEOUTPUTSTREAM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp b/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp deleted file mode 100755 index ce0af7e..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.cpp +++ /dev/null @@ -1,172 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -FileSearchPath::FileSearchPath() {} -FileSearchPath::~FileSearchPath() {} - -FileSearchPath::FileSearchPath (const String& path) -{ - init (path); -} - -FileSearchPath::FileSearchPath (const FileSearchPath& other) - : directories (other.directories) -{ -} - -FileSearchPath& FileSearchPath::operator= (const FileSearchPath& other) -{ - directories = other.directories; - return *this; -} - -FileSearchPath& FileSearchPath::operator= (const String& path) -{ - init (path); - return *this; -} - -void FileSearchPath::init (const String& path) -{ - directories.clear(); - directories.addTokens (path, ";", "\""); - directories.trim(); - directories.removeEmptyStrings(); - - for (int i = directories.size(); --i >= 0;) - directories.set (i, directories[i].unquoted()); -} - -int FileSearchPath::getNumPaths() const -{ - return directories.size(); -} - -File FileSearchPath::operator[] (const int index) const -{ - return File (directories [index]); -} - -String FileSearchPath::toString() const -{ - StringArray directories2 (directories); - for (int i = directories2.size(); --i >= 0;) - if (directories2[i].containsChar (';')) - directories2.set (i, directories2[i].quoted()); - - return directories2.joinIntoString (";"); -} - -void FileSearchPath::add (const File& dir, const int insertIndex) -{ - directories.insert (insertIndex, dir.getFullPathName()); -} - -void FileSearchPath::addIfNotAlreadyThere (const File& dir) -{ - for (int i = 0; i < directories.size(); ++i) - if (File (directories[i]) == dir) - return; - - add (dir); -} - -void FileSearchPath::remove (const int index) -{ - directories.remove (index); -} - -void FileSearchPath::addPath (const FileSearchPath& other) -{ - for (int i = 0; i < other.getNumPaths(); ++i) - addIfNotAlreadyThere (other[i]); -} - -void FileSearchPath::removeRedundantPaths() -{ - for (int i = directories.size(); --i >= 0;) - { - const File d1 (directories[i]); - - for (int j = directories.size(); --j >= 0;) - { - const File d2 (directories[j]); - - if ((i != j) && (d1.isAChildOf (d2) || d1 == d2)) - { - directories.remove (i); - break; - } - } - } -} - -void FileSearchPath::removeNonExistentPaths() -{ - for (int i = directories.size(); --i >= 0;) - if (! File (directories[i]).isDirectory()) - directories.remove (i); -} - -int FileSearchPath::findChildFiles (Array& results, - const int whatToLookFor, - const bool searchRecursively, - const String& wildCardPattern) const -{ - int total = 0; - - for (int i = 0; i < directories.size(); ++i) - total += operator[] (i).findChildFiles (results, - whatToLookFor, - searchRecursively, - wildCardPattern); - - return total; -} - -bool FileSearchPath::isFileInPath (const File& fileToCheck, - const bool checkRecursively) const -{ - for (int i = directories.size(); --i >= 0;) - { - const File d (directories[i]); - - if (checkRecursively) - { - if (fileToCheck.isAChildOf (d)) - return true; - } - else - { - if (fileToCheck.getParentDirectory() == d) - return true; - } - } - - return false; -} diff --git a/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h b/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h deleted file mode 100755 index 51baf2e..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_FileSearchPath.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_FILESEARCHPATH_H_INCLUDED -#define JUCE_FILESEARCHPATH_H_INCLUDED - - -//============================================================================== -/** - Represents a set of folders that make up a search path. - - @see File -*/ -class JUCE_API FileSearchPath -{ -public: - //============================================================================== - /** Creates an empty search path. */ - FileSearchPath(); - - /** Creates a search path from a string of pathnames. - - The path can be semicolon- or comma-separated, e.g. - "/foo/bar;/foo/moose;/fish/moose" - - The separate folders are tokenised and added to the search path. - */ - FileSearchPath (const String& path); - - /** Creates a copy of another search path. */ - FileSearchPath (const FileSearchPath&); - - /** Copies another search path. */ - FileSearchPath& operator= (const FileSearchPath&); - - /** Destructor. */ - ~FileSearchPath(); - - /** Uses a string containing a list of pathnames to re-initialise this list. - - This search path is cleared and the semicolon- or comma-separated folders - in this string are added instead. e.g. "/foo/bar;/foo/moose;/fish/moose" - */ - FileSearchPath& operator= (const String& path); - - //============================================================================== - /** Returns the number of folders in this search path. - @see operator[] - */ - int getNumPaths() const; - - /** Returns one of the folders in this search path. - The file returned isn't guaranteed to actually be a valid directory. - @see getNumPaths - */ - File operator[] (int index) const; - - /** Returns the search path as a semicolon-separated list of directories. */ - String toString() const; - - //============================================================================== - /** Adds a new directory to the search path. - - The new directory is added to the end of the list if the insertIndex parameter is - less than zero, otherwise it is inserted at the given index. - */ - void add (const File& directoryToAdd, - int insertIndex = -1); - - /** Adds a new directory to the search path if it's not already in there. */ - void addIfNotAlreadyThere (const File& directoryToAdd); - - /** Removes a directory from the search path. */ - void remove (int indexToRemove); - - /** Merges another search path into this one. - This will remove any duplicate directories. - */ - void addPath (const FileSearchPath&); - - /** Removes any directories that are actually subdirectories of one of the other directories in the search path. - - If the search is intended to be recursive, there's no point having nested folders in the search - path, because they'll just get searched twice and you'll get duplicate results. - - e.g. if the path is "c:\abc\de;c:\abc", this method will simplify it to "c:\abc" - */ - void removeRedundantPaths(); - - /** Removes any directories that don't actually exist. */ - void removeNonExistentPaths(); - - //============================================================================== - /** Searches the path for a wildcard. - - This will search all the directories in the search path in order, adding any - matching files to the results array. - - @param results an array to append the results to - @param whatToLookFor a value from the File::TypesOfFileToFind enum, specifying whether to - return files, directories, or both. - @param searchRecursively whether to recursively search the subdirectories too - @param wildCardPattern a pattern to match against the filenames - @returns the number of files added to the array - @see File::findChildFiles - */ - int findChildFiles (Array& results, - int whatToLookFor, - bool searchRecursively, - const String& wildCardPattern = "*") const; - - //============================================================================== - /** Finds out whether a file is inside one of the path's directories. - - This will return true if the specified file is a child of one of the - directories specified by this path. Note that this doesn't actually do any - searching or check that the files exist - it just looks at the pathnames - to work out whether the file would be inside a directory. - - @param fileToCheck the file to look for - @param checkRecursively if true, then this will return true if the file is inside a - subfolder of one of the path's directories (at any depth). If false - it will only return true if the file is actually a direct child - of one of the directories. - @see File::isAChildOf - - */ - bool isFileInPath (const File& fileToCheck, - bool checkRecursively) const; - -private: - //============================================================================== - StringArray directories; - - void init (const String&); - - JUCE_LEAK_DETECTOR (FileSearchPath) -}; - -#endif // JUCE_FILESEARCHPATH_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h b/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h deleted file mode 100755 index 8a79185..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_MemoryMappedFile.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_MEMORYMAPPEDFILE_H_INCLUDED -#define JUCE_MEMORYMAPPEDFILE_H_INCLUDED - - -//============================================================================== -/** - Maps a file into virtual memory for easy reading and/or writing. -*/ -class JUCE_API MemoryMappedFile -{ -public: - /** The read/write flags used when opening a memory mapped file. */ - enum AccessMode - { - readOnly, /**< Indicates that the memory can only be read. */ - readWrite /**< Indicates that the memory can be read and written to - changes that are - made will be flushed back to disk at the whim of the OS. */ - }; - - /** Opens a file and maps it to an area of virtual memory. - - The file should already exist, and should already be the size that you want to work with - when you call this. If the file is resized after being opened, the behaviour is undefined. - - If the file exists and the operation succeeds, the getData() and getSize() methods will - return the location and size of the data that can be read or written. Note that the entire - file is not read into memory immediately - the OS simply creates a virtual mapping, which - will lazily pull the data into memory when blocks are accessed. - - If the file can't be opened for some reason, the getData() method will return a null pointer. - */ - MemoryMappedFile (const File& file, AccessMode mode); - - /** Opens a section of a file and maps it to an area of virtual memory. - - The file should already exist, and should already be the size that you want to work with - when you call this. If the file is resized after being opened, the behaviour is undefined. - - If the file exists and the operation succeeds, the getData() and getSize() methods will - return the location and size of the data that can be read or written. Note that the entire - file is not read into memory immediately - the OS simply creates a virtual mapping, which - will lazily pull the data into memory when blocks are accessed. - - If the file can't be opened for some reason, the getData() method will return a null pointer. - - NOTE: the start of the actual range used may be rounded-down to a multiple of the OS's page-size, - so do not assume that the mapped memory will begin at exactly the position you requested - always - use getRange() to check the actual range that is being used. - */ - MemoryMappedFile (const File& file, - const Range& fileRange, - AccessMode mode); - - /** Destructor. */ - ~MemoryMappedFile(); - - /** Returns the address at which this file has been mapped, or a null pointer if - the file couldn't be successfully mapped. - */ - void* getData() const noexcept { return address; } - - /** Returns the number of bytes of data that are available for reading or writing. - This will normally be the size of the file. - */ - size_t getSize() const noexcept { return (size_t) range.getLength(); } - - /** Returns the section of the file at which the mapped memory represents. */ - Range getRange() const noexcept { return range; } - -private: - //============================================================================== - void* address; - Range range; - - #if JUCE_WINDOWS - void* fileHandle; - #else - int fileHandle; - #endif - - void openInternal (const File&, AccessMode); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryMappedFile) -}; - - -#endif // JUCE_MEMORYMAPPEDFILE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp b/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp deleted file mode 100755 index 50475d5..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -static File createTempFile (const File& parentDirectory, String name, - const String& suffix, const int optionFlags) -{ - if ((optionFlags & TemporaryFile::useHiddenFile) != 0) - name = "." + name; - - return parentDirectory.getNonexistentChildFile (name, suffix, (optionFlags & TemporaryFile::putNumbersInBrackets) != 0); -} - -TemporaryFile::TemporaryFile (const String& suffix, const int optionFlags) - : temporaryFile (createTempFile (File::getSpecialLocation (File::tempDirectory), - "temp_" + String::toHexString (Random::getSystemRandom().nextInt()), - suffix, optionFlags)) -{ -} - -TemporaryFile::TemporaryFile (const File& target, const int optionFlags) - : temporaryFile (createTempFile (target.getParentDirectory(), - target.getFileNameWithoutExtension() - + "_temp" + String::toHexString (Random::getSystemRandom().nextInt()), - target.getFileExtension(), optionFlags)), - targetFile (target) -{ - // If you use this constructor, you need to give it a valid target file! - jassert (targetFile != File()); -} - -TemporaryFile::TemporaryFile (const File& target, const File& temporary) - : temporaryFile (temporary), targetFile (target) -{ -} - -TemporaryFile::~TemporaryFile() -{ - if (! deleteTemporaryFile()) - { - /* Failed to delete our temporary file! The most likely reason for this would be - that you've not closed an output stream that was being used to write to file. - - If you find that something beyond your control is changing permissions on - your temporary files and preventing them from being deleted, you may want to - call TemporaryFile::deleteTemporaryFile() to detect those error cases and - handle them appropriately. - */ - jassertfalse; - } -} - -//============================================================================== -bool TemporaryFile::overwriteTargetFileWithTemporary() const -{ - // This method only works if you created this object with the constructor - // that takes a target file! - jassert (targetFile != File()); - - if (temporaryFile.exists()) - { - // Have a few attempts at overwriting the file before giving up.. - for (int i = 5; --i >= 0;) - { - if (temporaryFile.moveFileTo (targetFile)) - return true; - - Thread::sleep (100); - } - } - else - { - // There's no temporary file to use. If your write failed, you should - // probably check, and not bother calling this method. - jassertfalse; - } - - return false; -} - -bool TemporaryFile::deleteTemporaryFile() const -{ - // Have a few attempts at deleting the file before giving up.. - for (int i = 5; --i >= 0;) - { - if (temporaryFile.deleteFile()) - return true; - - Thread::sleep (50); - } - - return false; -} diff --git a/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h b/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h deleted file mode 100755 index 04561a7..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_TemporaryFile.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_TEMPORARYFILE_H_INCLUDED -#define JUCE_TEMPORARYFILE_H_INCLUDED - - -//============================================================================== -/** - Manages a temporary file, which will be deleted when this object is deleted. - - This object is intended to be used as a stack based object, using its scope - to make sure the temporary file isn't left lying around. - - For example: - - @code - { - File myTargetFile ("~/myfile.txt"); - - // this will choose a file called something like "~/myfile_temp239348.txt" - // which definitely doesn't exist at the time the constructor is called. - TemporaryFile temp (myTargetFile); - - // create a stream to the temporary file, and write some data to it... - ScopedPointer out (temp.getFile().createOutputStream()); - - if (out != nullptr) - { - out->write ( ...etc ) - out = nullptr; // (deletes the stream) - - // ..now we've finished writing, this will rename the temp file to - // make it replace the target file we specified above. - bool succeeded = temp.overwriteTargetFileWithTemporary(); - } - - // ..and even if something went wrong and our overwrite failed, - // as the TemporaryFile object goes out of scope here, it'll make sure - // that the temp file gets deleted. - } - @endcode - - @see File, FileOutputStream -*/ -class JUCE_API TemporaryFile -{ -public: - //============================================================================== - enum OptionFlags - { - useHiddenFile = 1, /**< Indicates that the temporary file should be hidden - - i.e. its name should start with a dot. */ - putNumbersInBrackets = 2 /**< Indicates that when numbers are appended to make sure - the file is unique, they should go in brackets rather - than just being appended (see File::getNonexistentSibling() )*/ - }; - - //============================================================================== - /** Creates a randomly-named temporary file in the default temp directory. - - @param suffix a file suffix to use for the file - @param optionFlags a combination of the values listed in the OptionFlags enum - The file will not be created until you write to it. And remember that when - this object is deleted, the file will also be deleted! - */ - TemporaryFile (const String& suffix = String(), - int optionFlags = 0); - - /** Creates a temporary file in the same directory as a specified file. - - This is useful if you have a file that you want to overwrite, but don't - want to harm the original file if the write operation fails. You can - use this to create a temporary file next to the target file, then - write to the temporary file, and finally use overwriteTargetFileWithTemporary() - to replace the target file with the one you've just written. - - This class won't create any files until you actually write to them. And remember - that when this object is deleted, the temporary file will also be deleted! - - @param targetFile the file that you intend to overwrite - the temporary - file will be created in the same directory as this - @param optionFlags a combination of the values listed in the OptionFlags enum - */ - TemporaryFile (const File& targetFile, - int optionFlags = 0); - - /** Creates a temporary file using an explicit filename. - The other constructors are a better choice than this one, unless for some reason - you need to explicitly specify the temporary file you want to use. - - @param targetFile the file that you intend to overwrite - @param temporaryFile the temporary file to be used - */ - TemporaryFile (const File& targetFile, - const File& temporaryFile); - - /** Destructor. - - When this object is deleted it will make sure that its temporary file is - also deleted! If the operation fails, it'll throw an assertion in debug - mode. - */ - ~TemporaryFile(); - - //============================================================================== - /** Returns the temporary file. */ - const File& getFile() const noexcept { return temporaryFile; } - - /** Returns the target file that was specified in the constructor. */ - const File& getTargetFile() const noexcept { return targetFile; } - - /** Tries to move the temporary file to overwrite the target file that was - specified in the constructor. - - If you used the constructor that specified a target file, this will attempt - to replace that file with the temporary one. - - Before calling this, make sure: - - that you've actually written to the temporary file - - that you've closed any open streams that you were using to write to it - - and that you don't have any streams open to the target file, which would - prevent it being overwritten - - If the file move succeeds, this returns false, and the temporary file will - have disappeared. If it fails, the temporary file will probably still exist, - but will be deleted when this object is destroyed. - */ - bool overwriteTargetFileWithTemporary() const; - - /** Attempts to delete the temporary file, if it exists. - @returns true if the file is successfully deleted (or if it didn't exist). - */ - bool deleteTemporaryFile() const; - - -private: - //============================================================================== - const File temporaryFile, targetFile; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TemporaryFile) -}; - -#endif // JUCE_TEMPORARYFILE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp b/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp deleted file mode 100755 index f18a2eb..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -static void parseWildcard (const String& pattern, StringArray& result) -{ - result.addTokens (pattern.toLowerCase(), ";,", "\"'"); - - result.trim(); - result.removeEmptyStrings(); - - // special case for *.*, because people use it to mean "any file", but it - // would actually ignore files with no extension. - for (int i = result.size(); --i >= 0;) - if (result[i] == "*.*") - result.set (i, "*"); -} - -static bool matchWildcard (const File& file, const StringArray& wildcards) -{ - const String filename (file.getFileName()); - - for (int i = wildcards.size(); --i >= 0;) - if (filename.matchesWildcard (wildcards[i], true)) - return true; - - return false; -} - -WildcardFileFilter::WildcardFileFilter (const String& fileWildcardPatterns, - const String& directoryWildcardPatterns, - const String& desc) - : FileFilter (desc.isEmpty() ? fileWildcardPatterns - : (desc + " (" + fileWildcardPatterns + ")")) -{ - parseWildcard (fileWildcardPatterns, fileWildcards); - parseWildcard (directoryWildcardPatterns, directoryWildcards); -} - -WildcardFileFilter::~WildcardFileFilter() -{ -} - -bool WildcardFileFilter::isFileSuitable (const File& file) const -{ - return matchWildcard (file, fileWildcards); -} - -bool WildcardFileFilter::isDirectorySuitable (const File& file) const -{ - return matchWildcard (file, directoryWildcards); -} diff --git a/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h b/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h deleted file mode 100755 index fb398ce..0000000 --- a/JuceLibraryCode/modules/juce_core/files/juce_WildcardFileFilter.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_WILDCARDFILEFILTER_H_INCLUDED -#define JUCE_WILDCARDFILEFILTER_H_INCLUDED - - -//============================================================================== -/** - A type of FileFilter that works by wildcard pattern matching. - - This filter only allows files that match one of the specified patterns, but - allows all directories through. - - @see FileFilter, DirectoryContentsList, FileListComponent, FileBrowserComponent -*/ -class JUCE_API WildcardFileFilter : public FileFilter -{ -public: - //============================================================================== - /** - Creates a wildcard filter for one or more patterns. - - The wildcardPatterns parameter is a comma or semicolon-delimited set of - patterns, e.g. "*.wav;*.aiff" would look for files ending in either .wav - or .aiff. - - Passing an empty string as a pattern will fail to match anything, so by leaving - either the file or directory pattern parameter empty means you can control - whether files or directories are found. - - The description is a name to show the user in a list of possible patterns, so - for the wav/aiff example, your description might be "audio files". - */ - WildcardFileFilter (const String& fileWildcardPatterns, - const String& directoryWildcardPatterns, - const String& description); - - /** Destructor. */ - ~WildcardFileFilter(); - - //============================================================================== - /** Returns true if the filename matches one of the patterns specified. */ - bool isFileSuitable (const File& file) const; - - /** This always returns true. */ - bool isDirectorySuitable (const File& file) const; - -private: - //============================================================================== - StringArray fileWildcards, directoryWildcards; - - JUCE_LEAK_DETECTOR (WildcardFileFilter) -}; - - -#endif // JUCE_WILDCARDFILEFILTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp b/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp deleted file mode 100755 index 5a0f7f7..0000000 --- a/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.cpp +++ /dev/null @@ -1,643 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -class JSONParser -{ -public: - static Result parseObjectOrArray (String::CharPointerType t, var& result) - { - t = t.findEndOfWhitespace(); - - switch (t.getAndAdvance()) - { - case 0: result = var(); return Result::ok(); - case '{': return parseObject (t, result); - case '[': return parseArray (t, result); - } - - return createFail ("Expected '{' or '['", &t); - } - - static Result parseString (const juce_wchar quoteChar, String::CharPointerType& t, var& result) - { - MemoryOutputStream buffer (256); - - for (;;) - { - juce_wchar c = t.getAndAdvance(); - - if (c == quoteChar) - break; - - if (c == '\\') - { - c = t.getAndAdvance(); - - switch (c) - { - case '"': - case '\'': - case '\\': - case '/': break; - - case 'a': c = '\a'; break; - case 'b': c = '\b'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - - case 'u': - { - c = 0; - - for (int i = 4; --i >= 0;) - { - const int digitValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance()); - if (digitValue < 0) - return createFail ("Syntax error in unicode escape sequence"); - - c = (juce_wchar) ((c << 4) + digitValue); - } - - break; - } - } - } - - if (c == 0) - return createFail ("Unexpected end-of-input in string constant"); - - buffer.appendUTF8Char (c); - } - - result = buffer.toUTF8(); - return Result::ok(); - } - - static Result parseAny (String::CharPointerType& t, var& result) - { - t = t.findEndOfWhitespace(); - String::CharPointerType t2 (t); - - switch (t2.getAndAdvance()) - { - case '{': t = t2; return parseObject (t, result); - case '[': t = t2; return parseArray (t, result); - case '"': t = t2; return parseString ('"', t, result); - case '\'': t = t2; return parseString ('\'', t, result); - - case '-': - t2 = t2.findEndOfWhitespace(); - if (! CharacterFunctions::isDigit (*t2)) - break; - - t = t2; - return parseNumber (t, result, true); - - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': - return parseNumber (t, result, false); - - case 't': // "true" - if (t2.getAndAdvance() == 'r' && t2.getAndAdvance() == 'u' && t2.getAndAdvance() == 'e') - { - t = t2; - result = var (true); - return Result::ok(); - } - break; - - case 'f': // "false" - if (t2.getAndAdvance() == 'a' && t2.getAndAdvance() == 'l' - && t2.getAndAdvance() == 's' && t2.getAndAdvance() == 'e') - { - t = t2; - result = var (false); - return Result::ok(); - } - break; - - case 'n': // "null" - if (t2.getAndAdvance() == 'u' && t2.getAndAdvance() == 'l' && t2.getAndAdvance() == 'l') - { - t = t2; - result = var(); - return Result::ok(); - } - break; - - default: - break; - } - - return createFail ("Syntax error", &t); - } - -private: - static Result createFail (const char* const message, const String::CharPointerType* location = nullptr) - { - String m (message); - if (location != nullptr) - m << ": \"" << String (*location, 20) << '"'; - - return Result::fail (m); - } - - static Result parseNumber (String::CharPointerType& t, var& result, const bool isNegative) - { - String::CharPointerType oldT (t); - - int64 intValue = t.getAndAdvance() - '0'; - jassert (intValue >= 0 && intValue < 10); - - for (;;) - { - String::CharPointerType previousChar (t); - const juce_wchar c = t.getAndAdvance(); - const int digit = ((int) c) - '0'; - - if (isPositiveAndBelow (digit, 10)) - { - intValue = intValue * 10 + digit; - continue; - } - - if (c == 'e' || c == 'E' || c == '.') - { - t = oldT; - const double asDouble = CharacterFunctions::readDoubleValue (t); - result = isNegative ? -asDouble : asDouble; - return Result::ok(); - } - - if (CharacterFunctions::isWhitespace (c) - || c == ',' || c == '}' || c == ']' || c == 0) - { - t = previousChar; - break; - } - - return createFail ("Syntax error in number", &oldT); - } - - const int64 correctedValue = isNegative ? -intValue : intValue; - - if ((intValue >> 31) != 0) - result = correctedValue; - else - result = (int) correctedValue; - - return Result::ok(); - } - - static Result parseObject (String::CharPointerType& t, var& result) - { - DynamicObject* const resultObject = new DynamicObject(); - result = resultObject; - NamedValueSet& resultProperties = resultObject->getProperties(); - - for (;;) - { - t = t.findEndOfWhitespace(); - - String::CharPointerType oldT (t); - const juce_wchar c = t.getAndAdvance(); - - if (c == '}') - break; - - if (c == 0) - return createFail ("Unexpected end-of-input in object declaration"); - - if (c == '"') - { - var propertyNameVar; - Result r (parseString ('"', t, propertyNameVar)); - - if (r.failed()) - return r; - - const Identifier propertyName (propertyNameVar.toString()); - - if (propertyName.isValid()) - { - t = t.findEndOfWhitespace(); - oldT = t; - - const juce_wchar c2 = t.getAndAdvance(); - if (c2 != ':') - return createFail ("Expected ':', but found", &oldT); - - resultProperties.set (propertyName, var()); - var* propertyValue = resultProperties.getVarPointer (propertyName); - - Result r2 (parseAny (t, *propertyValue)); - - if (r2.failed()) - return r2; - - t = t.findEndOfWhitespace(); - oldT = t; - - const juce_wchar nextChar = t.getAndAdvance(); - - if (nextChar == ',') - continue; - - if (nextChar == '}') - break; - } - } - - return createFail ("Expected object member declaration, but found", &oldT); - } - - return Result::ok(); - } - - static Result parseArray (String::CharPointerType& t, var& result) - { - result = var (Array()); - Array* const destArray = result.getArray(); - - for (;;) - { - t = t.findEndOfWhitespace(); - - String::CharPointerType oldT (t); - const juce_wchar c = t.getAndAdvance(); - - if (c == ']') - break; - - if (c == 0) - return createFail ("Unexpected end-of-input in array declaration"); - - t = oldT; - destArray->add (var()); - Result r (parseAny (t, destArray->getReference (destArray->size() - 1))); - - if (r.failed()) - return r; - - t = t.findEndOfWhitespace(); - oldT = t; - - const juce_wchar nextChar = t.getAndAdvance(); - - if (nextChar == ',') - continue; - - if (nextChar == ']') - break; - - return createFail ("Expected object array item, but found", &oldT); - } - - return Result::ok(); - } -}; - -//============================================================================== -class JSONFormatter -{ -public: - static void write (OutputStream& out, const var& v, - const int indentLevel, const bool allOnOneLine) - { - if (v.isString()) - { - out << '"'; - writeString (out, v.toString().getCharPointer()); - out << '"'; - } - else if (v.isVoid()) - { - out << "null"; - } - else if (v.isUndefined()) - { - out << "undefined"; - } - else if (v.isBool()) - { - out << (static_cast (v) ? "true" : "false"); - } - else if (v.isArray()) - { - writeArray (out, *v.getArray(), indentLevel, allOnOneLine); - } - else if (v.isObject()) - { - if (DynamicObject* object = v.getDynamicObject()) - object->writeAsJSON (out, indentLevel, allOnOneLine); - else - jassertfalse; // Only DynamicObjects can be converted to JSON! - } - else - { - // Can't convert these other types of object to JSON! - jassert (! (v.isMethod() || v.isBinaryData())); - - out << v.toString(); - } - } - - static void writeEscapedChar (OutputStream& out, const unsigned short value) - { - out << "\\u" << String::toHexString ((int) value).paddedLeft ('0', 4); - } - - static void writeString (OutputStream& out, String::CharPointerType t) - { - for (;;) - { - const juce_wchar c (t.getAndAdvance()); - - switch (c) - { - case 0: return; - - case '\"': out << "\\\""; break; - case '\\': out << "\\\\"; break; - case '\a': out << "\\a"; break; - case '\b': out << "\\b"; break; - case '\f': out << "\\f"; break; - case '\t': out << "\\t"; break; - case '\r': out << "\\r"; break; - case '\n': out << "\\n"; break; - - default: - if (c >= 32 && c < 127) - { - out << (char) c; - } - else - { - if (CharPointer_UTF16::getBytesRequiredFor (c) > 2) - { - CharPointer_UTF16::CharType chars[2]; - CharPointer_UTF16 utf16 (chars); - utf16.write (c); - - for (int i = 0; i < 2; ++i) - writeEscapedChar (out, (unsigned short) chars[i]); - } - else - { - writeEscapedChar (out, (unsigned short) c); - } - } - - break; - } - } - } - - static void writeSpaces (OutputStream& out, int numSpaces) - { - out.writeRepeatedByte (' ', (size_t) numSpaces); - } - - static void writeArray (OutputStream& out, const Array& array, - const int indentLevel, const bool allOnOneLine) - { - out << '['; - - if (array.size() > 0) - { - if (! allOnOneLine) - out << newLine; - - for (int i = 0; i < array.size(); ++i) - { - if (! allOnOneLine) - writeSpaces (out, indentLevel + indentSize); - - write (out, array.getReference(i), indentLevel + indentSize, allOnOneLine); - - if (i < array.size() - 1) - { - if (allOnOneLine) - out << ", "; - else - out << ',' << newLine; - } - else if (! allOnOneLine) - out << newLine; - } - - if (! allOnOneLine) - writeSpaces (out, indentLevel); - } - - out << ']'; - } - - enum { indentSize = 2 }; -}; - -//============================================================================== -var JSON::parse (const String& text) -{ - var result; - - if (! parse (text, result)) - result = var(); - - return result; -} - -var JSON::fromString (StringRef text) -{ - var result; - - if (! JSONParser::parseAny (text.text, result)) - result = var(); - - return result; -} - -var JSON::parse (InputStream& input) -{ - return parse (input.readEntireStreamAsString()); -} - -var JSON::parse (const File& file) -{ - return parse (file.loadFileAsString()); -} - -Result JSON::parse (const String& text, var& result) -{ - return JSONParser::parseObjectOrArray (text.getCharPointer(), result); -} - -String JSON::toString (const var& data, const bool allOnOneLine) -{ - MemoryOutputStream mo (1024); - JSONFormatter::write (mo, data, 0, allOnOneLine); - return mo.toUTF8(); -} - -void JSON::writeToStream (OutputStream& output, const var& data, const bool allOnOneLine) -{ - JSONFormatter::write (output, data, 0, allOnOneLine); -} - -String JSON::escapeString (StringRef s) -{ - MemoryOutputStream mo; - JSONFormatter::writeString (mo, s.text); - return mo.toString(); -} - -Result JSON::parseQuotedString (String::CharPointerType& t, var& result) -{ - const juce_wchar quote = t.getAndAdvance(); - - if (quote == '"' || quote == '\'') - return JSONParser::parseString (quote, t, result); - - return Result::fail ("Not a quoted string!"); -} - -//============================================================================== -//============================================================================== -#if JUCE_UNIT_TESTS - -class JSONTests : public UnitTest -{ -public: - JSONTests() : UnitTest ("JSON") {} - - static String createRandomWideCharString (Random& r) - { - juce_wchar buffer[40] = { 0 }; - - for (int i = 0; i < numElementsInArray (buffer) - 1; ++i) - { - if (r.nextBool()) - { - do - { - buffer[i] = (juce_wchar) (1 + r.nextInt (0x10ffff - 1)); - } - while (! CharPointer_UTF16::canRepresent (buffer[i])); - } - else - buffer[i] = (juce_wchar) (1 + r.nextInt (0xff)); - } - - return CharPointer_UTF32 (buffer); - } - - static String createRandomIdentifier (Random& r) - { - char buffer[30] = { 0 }; - - for (int i = 0; i < numElementsInArray (buffer) - 1; ++i) - { - static const char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-:"; - buffer[i] = chars [r.nextInt (sizeof (chars) - 1)]; - } - - return CharPointer_ASCII (buffer); - } - - static var createRandomVar (Random& r, int depth) - { - switch (r.nextInt (depth > 3 ? 6 : 8)) - { - case 0: return var(); - case 1: return r.nextInt(); - case 2: return r.nextInt64(); - case 3: return r.nextBool(); - case 4: return r.nextDouble(); - case 5: return createRandomWideCharString (r); - - case 6: - { - var v (createRandomVar (r, depth + 1)); - - for (int i = 1 + r.nextInt (30); --i >= 0;) - v.append (createRandomVar (r, depth + 1)); - - return v; - } - - case 7: - { - DynamicObject* o = new DynamicObject(); - - for (int i = r.nextInt (30); --i >= 0;) - o->setProperty (createRandomIdentifier (r), createRandomVar (r, depth + 1)); - - return o; - } - - default: - return var(); - } - } - - void runTest() - { - beginTest ("JSON"); - Random r = getRandom(); - - expect (JSON::parse (String::empty) == var::null); - expect (JSON::parse ("{}").isObject()); - expect (JSON::parse ("[]").isArray()); - expect (JSON::parse ("[ 1234 ]")[0].isInt()); - expect (JSON::parse ("[ 12345678901234 ]")[0].isInt64()); - expect (JSON::parse ("[ 1.123e3 ]")[0].isDouble()); - expect (JSON::parse ("[ -1234]")[0].isInt()); - expect (JSON::parse ("[-12345678901234]")[0].isInt64()); - expect (JSON::parse ("[-1.123e3]")[0].isDouble()); - - for (int i = 100; --i >= 0;) - { - var v; - - if (i > 0) - v = createRandomVar (r, 0); - - const bool oneLine = r.nextBool(); - String asString (JSON::toString (v, oneLine)); - var parsed = JSON::parse ("[" + asString + "]")[0]; - String parsedString (JSON::toString (parsed, oneLine)); - expect (asString.isNotEmpty() && parsedString == asString); - } - } -}; - -static JSONTests JSONUnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h b/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h deleted file mode 100755 index 7fb17ee..0000000 --- a/JuceLibraryCode/modules/juce_core/javascript/juce_JSON.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_JSON_H_INCLUDED -#define JUCE_JSON_H_INCLUDED - - -//============================================================================== -/** - Contains static methods for converting JSON-formatted text to and from var objects. - - The var class is structurally compatible with JSON-formatted data, so these - functions allow you to parse JSON into a var object, and to convert a var - object to JSON-formatted text. - - @see var -*/ -class JUCE_API JSON -{ -public: - //============================================================================== - /** Parses a string of JSON-formatted text, and returns a result code containing - any parse errors. - - This will return the parsed structure in the parsedResult parameter, and will - return a Result object to indicate whether parsing was successful, and if not, - it will contain an error message. - - If you're not interested in the error message, you can use one of the other - shortcut parse methods, which simply return a var::null if the parsing fails. - - Note that this will only parse valid JSON, which means that the item given must - be either an object or an array definition. If you want to also be able to parse - any kind of primitive JSON object, use the fromString() method. - */ - static Result parse (const String& text, var& parsedResult); - - /** Attempts to parse some JSON-formatted text, and returns the result as a var object. - - If the parsing fails, this simply returns var::null - if you need to find out more - detail about the parse error, use the alternative parse() method which returns a Result. - - Note that this will only parse valid JSON, which means that the item given must - be either an object or an array definition. If you want to also be able to parse - any kind of primitive JSON object, use the fromString() method. - */ - static var parse (const String& text); - - /** Attempts to parse some JSON-formatted text from a file, and returns the result - as a var object. - - Note that this is just a short-cut for reading the entire file into a string and - parsing the result. - - If the parsing fails, this simply returns var::null - if you need to find out more - detail about the parse error, use the alternative parse() method which returns a Result. - */ - static var parse (const File& file); - - /** Attempts to parse some JSON-formatted text from a stream, and returns the result - as a var object. - - Note that this is just a short-cut for reading the entire stream into a string and - parsing the result. - - If the parsing fails, this simply returns var::null - if you need to find out more - detail about the parse error, use the alternative parse() method which returns a Result. - */ - static var parse (InputStream& input); - - //============================================================================== - /** Returns a string which contains a JSON-formatted representation of the var object. - If allOnOneLine is true, the result will be compacted into a single line of text - with no carriage-returns. If false, it will be laid-out in a more human-readable format. - @see writeToStream - */ - static String toString (const var& objectToFormat, - bool allOnOneLine = false); - - /** Parses a string that was created with the toString() method. - This is slightly different to the parse() methods because they will reject primitive - values and only accept array or object definitions, whereas this method will handle - either. - */ - static var fromString (StringRef); - - /** Writes a JSON-formatted representation of the var object to the given stream. - If allOnOneLine is true, the result will be compacted into a single line of text - with no carriage-returns. If false, it will be laid-out in a more human-readable format. - @see toString - */ - static void writeToStream (OutputStream& output, - const var& objectToFormat, - bool allOnOneLine = false); - - /** Returns a version of a string with any extended characters escaped. */ - static String escapeString (StringRef); - - /** Parses a quoted string-literal in JSON format, returning the un-escaped result in the - result parameter, and an error message in case the content was illegal. - This advances the text parameter, leaving it positioned after the closing quote. - */ - static Result parseQuotedString (String::CharPointerType& text, var& result); - -private: - //============================================================================== - JSON() JUCE_DELETED_FUNCTION; // This class can't be instantiated - just use its static methods. -}; - - -#endif // JUCE_JSON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp b/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp deleted file mode 100755 index c2e6e96..0000000 --- a/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.cpp +++ /dev/null @@ -1,1725 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#define JUCE_JS_OPERATORS(X) \ - X(semicolon, ";") X(dot, ".") X(comma, ",") \ - X(openParen, "(") X(closeParen, ")") X(openBrace, "{") X(closeBrace, "}") \ - X(openBracket, "[") X(closeBracket, "]") X(colon, ":") X(question, "?") \ - X(typeEquals, "===") X(equals, "==") X(assign, "=") \ - X(typeNotEquals, "!==") X(notEquals, "!=") X(logicalNot, "!") \ - X(plusEquals, "+=") X(plusplus, "++") X(plus, "+") \ - X(minusEquals, "-=") X(minusminus, "--") X(minus, "-") \ - X(timesEquals, "*=") X(times, "*") X(divideEquals, "/=") X(divide, "/") \ - X(moduloEquals, "%=") X(modulo, "%") X(xorEquals, "^=") X(bitwiseXor, "^") \ - X(andEquals, "&=") X(logicalAnd, "&&") X(bitwiseAnd, "&") \ - X(orEquals, "|=") X(logicalOr, "||") X(bitwiseOr, "|") \ - X(leftShiftEquals, "<<=") X(lessThanOrEqual, "<=") X(leftShift, "<<") X(lessThan, "<") \ - X(rightShiftUnsigned, ">>>") X(rightShiftEquals, ">>=") X(rightShift, ">>") X(greaterThanOrEqual, ">=") X(greaterThan, ">") - -#define JUCE_JS_KEYWORDS(X) \ - X(var, "var") X(if_, "if") X(else_, "else") X(do_, "do") X(null_, "null") \ - X(while_, "while") X(for_, "for") X(break_, "break") X(continue_, "continue") X(undefined, "undefined") \ - X(function, "function") X(return_, "return") X(true_, "true") X(false_, "false") X(new_, "new") - -namespace TokenTypes -{ - #define JUCE_DECLARE_JS_TOKEN(name, str) static const char* const name = str; - JUCE_JS_KEYWORDS (JUCE_DECLARE_JS_TOKEN) - JUCE_JS_OPERATORS (JUCE_DECLARE_JS_TOKEN) - JUCE_DECLARE_JS_TOKEN (eof, "$eof") - JUCE_DECLARE_JS_TOKEN (literal, "$literal") - JUCE_DECLARE_JS_TOKEN (identifier, "$identifier") -} - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4702) -#endif - -//============================================================================== -struct JavascriptEngine::RootObject : public DynamicObject -{ - RootObject() - { - setMethod ("exec", exec); - setMethod ("eval", eval); - setMethod ("trace", trace); - setMethod ("charToInt", charToInt); - setMethod ("parseInt", IntegerClass::parseInt); - } - - Time timeout; - - typedef const var::NativeFunctionArgs& Args; - typedef const char* TokenType; - - void execute (const String& code) - { - ExpressionTreeBuilder tb (code); - ScopedPointer (tb.parseStatementList())->perform (Scope (nullptr, this, this), nullptr); - } - - var evaluate (const String& code) - { - ExpressionTreeBuilder tb (code); - return ExpPtr (tb.parseExpression())->getResult (Scope (nullptr, this, this)); - } - - //============================================================================== - static bool areTypeEqual (const var& a, const var& b) - { - return a.hasSameTypeAs (b) && isFunction (a) == isFunction (b) - && (((a.isUndefined() || a.isVoid()) && (b.isUndefined() || b.isVoid())) || a == b); - } - - static String getTokenName (TokenType t) { return t[0] == '$' ? String (t + 1) : ("'" + String (t) + "'"); } - static bool isFunction (const var& v) { return dynamic_cast (v.getObject()) != nullptr; } - static bool isNumericOrUndefined (const var& v) { return v.isInt() || v.isDouble() || v.isInt64() || v.isBool() || v.isUndefined(); } - static int64 getOctalValue (const String& s) { BigInteger b; b.parseString (s, 8); return b.toInt64(); } - static Identifier getPrototypeIdentifier() { static const Identifier i ("prototype"); return i; } - static var* getPropertyPointer (DynamicObject* o, Identifier i) { return o->getProperties().getVarPointer (i); } - - //============================================================================== - struct CodeLocation - { - CodeLocation (const String& code) noexcept : program (code), location (program.getCharPointer()) {} - CodeLocation (const CodeLocation& other) noexcept : program (other.program), location (other.location) {} - - void throwError (const String& message) const - { - int col = 1, line = 1; - - for (String::CharPointerType i (program.getCharPointer()); i < location && ! i.isEmpty(); ++i) - { - ++col; - if (*i == '\n') { col = 1; ++line; } - } - - throw "Line " + String (line) + ", column " + String (col) + " : " + message; - } - - String program; - String::CharPointerType location; - }; - - //============================================================================== - struct Scope - { - Scope (const Scope* p, RootObject* r, DynamicObject* s) noexcept : parent (p), root (r), scope (s) {} - - const Scope* parent; - ReferenceCountedObjectPtr root; - DynamicObject::Ptr scope; - - var findFunctionCall (const CodeLocation& location, const var& targetObject, Identifier functionName) const - { - if (DynamicObject* o = targetObject.getDynamicObject()) - { - if (const var* prop = getPropertyPointer (o, functionName)) - return *prop; - - for (DynamicObject* p = o->getProperty (getPrototypeIdentifier()).getDynamicObject(); p != nullptr; - p = p->getProperty (getPrototypeIdentifier()).getDynamicObject()) - { - if (const var* prop = getPropertyPointer (p, functionName)) - return *prop; - } - } - - if (targetObject.isString()) - if (var* m = findRootClassProperty (StringClass::getClassName(), functionName)) - return *m; - - if (targetObject.isArray()) - if (var* m = findRootClassProperty (ArrayClass::getClassName(), functionName)) - return *m; - - if (var* m = findRootClassProperty (ObjectClass::getClassName(), functionName)) - return *m; - - location.throwError ("Unknown function '" + functionName.toString() + "'"); - return var(); - } - - var* findRootClassProperty (Identifier className, Identifier propName) const - { - if (DynamicObject* cls = root->getProperty (className).getDynamicObject()) - return getPropertyPointer (cls, propName); - - return nullptr; - } - - var findSymbolInParentScopes (Identifier name) const - { - if (const var* v = getPropertyPointer (scope, name)) - return *v; - - return parent != nullptr ? parent->findSymbolInParentScopes (name) - : var::undefined(); - } - - bool findAndInvokeMethod (Identifier function, const var::NativeFunctionArgs& args, var& result) const - { - DynamicObject* target = args.thisObject.getDynamicObject(); - - if (target == nullptr || target == scope) - { - if (const var* m = getPropertyPointer (scope, function)) - { - if (FunctionObject* fo = dynamic_cast (m->getObject())) - { - result = fo->invoke (*this, args); - return true; - } - } - } - - const NamedValueSet& props = scope->getProperties(); - - for (int i = 0; i < props.size(); ++i) - if (DynamicObject* o = props.getValueAt (i).getDynamicObject()) - if (Scope (this, root, o).findAndInvokeMethod (function, args, result)) - return true; - - return false; - } - - void checkTimeOut (const CodeLocation& location) const - { - if (Time::getCurrentTime() > root->timeout) - location.throwError ("Execution timed-out"); - } - }; - - //============================================================================== - struct Statement - { - Statement (const CodeLocation& l) noexcept : location (l) {} - virtual ~Statement() {} - - enum ResultCode { ok = 0, returnWasHit, breakWasHit, continueWasHit }; - virtual ResultCode perform (const Scope&, var*) const { return ok; } - - CodeLocation location; - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Statement) - }; - - struct Expression : public Statement - { - Expression (const CodeLocation& l) noexcept : Statement (l) {} - - virtual var getResult (const Scope&) const { return var::undefined(); } - virtual void assign (const Scope&, const var&) const { location.throwError ("Cannot assign to this expression!"); } - - ResultCode perform (const Scope& s, var*) const override { getResult (s); return ok; } - }; - - typedef ScopedPointer ExpPtr; - - struct BlockStatement : public Statement - { - BlockStatement (const CodeLocation& l) noexcept : Statement (l) {} - - ResultCode perform (const Scope& s, var* returnedValue) const override - { - for (int i = 0; i < statements.size(); ++i) - if (ResultCode r = statements.getUnchecked(i)->perform (s, returnedValue)) - return r; - - return ok; - } - - OwnedArray statements; - }; - - struct IfStatement : public Statement - { - IfStatement (const CodeLocation& l) noexcept : Statement (l) {} - - ResultCode perform (const Scope& s, var* returnedValue) const override - { - return (condition->getResult(s) ? trueBranch : falseBranch)->perform (s, returnedValue); - } - - ExpPtr condition; - ScopedPointer trueBranch, falseBranch; - }; - - struct VarStatement : public Statement - { - VarStatement (const CodeLocation& l) noexcept : Statement (l) {} - - ResultCode perform (const Scope& s, var*) const override - { - s.scope->setProperty (name, initialiser->getResult (s)); - return ok; - } - - Identifier name; - ExpPtr initialiser; - }; - - struct LoopStatement : public Statement - { - LoopStatement (const CodeLocation& l, bool isDo) noexcept : Statement (l), isDoLoop (isDo) {} - - ResultCode perform (const Scope& s, var* returnedValue) const override - { - initialiser->perform (s, nullptr); - - while (isDoLoop || condition->getResult (s)) - { - s.checkTimeOut (location); - ResultCode r = body->perform (s, returnedValue); - - if (r == returnWasHit) return r; - if (r == breakWasHit) break; - - iterator->perform (s, nullptr); - - if (isDoLoop && r != continueWasHit && ! condition->getResult (s)) - break; - } - - return ok; - } - - ScopedPointer initialiser, iterator, body; - ExpPtr condition; - bool isDoLoop; - }; - - struct ReturnStatement : public Statement - { - ReturnStatement (const CodeLocation& l, Expression* v) noexcept : Statement (l), returnValue (v) {} - - ResultCode perform (const Scope& s, var* ret) const override - { - if (ret != nullptr) *ret = returnValue->getResult (s); - return returnWasHit; - } - - ExpPtr returnValue; - }; - - struct BreakStatement : public Statement - { - BreakStatement (const CodeLocation& l) noexcept : Statement (l) {} - ResultCode perform (const Scope&, var*) const override { return breakWasHit; } - }; - - struct ContinueStatement : public Statement - { - ContinueStatement (const CodeLocation& l) noexcept : Statement (l) {} - ResultCode perform (const Scope&, var*) const override { return continueWasHit; } - }; - - struct LiteralValue : public Expression - { - LiteralValue (const CodeLocation& l, const var& v) noexcept : Expression (l), value (v) {} - var getResult (const Scope&) const override { return value; } - var value; - }; - - struct UnqualifiedName : public Expression - { - UnqualifiedName (const CodeLocation& l, Identifier n) noexcept : Expression (l), name (n) {} - - var getResult (const Scope& s) const override { return s.findSymbolInParentScopes (name); } - - void assign (const Scope& s, const var& newValue) const override - { - if (var* v = getPropertyPointer (s.scope, name)) - *v = newValue; - else - s.root->setProperty (name, newValue); - } - - Identifier name; - }; - - struct DotOperator : public Expression - { - DotOperator (const CodeLocation& l, ExpPtr& p, Identifier c) noexcept : Expression (l), parent (p), child (c) {} - - var getResult (const Scope& s) const override - { - var p (parent->getResult (s)); - static const Identifier lengthID ("length"); - - if (child == lengthID) - { - if (Array* array = p.getArray()) return array->size(); - if (p.isString()) return p.toString().length(); - } - - if (DynamicObject* o = p.getDynamicObject()) - if (const var* v = getPropertyPointer (o, child)) - return *v; - - return var::undefined(); - } - - void assign (const Scope& s, const var& newValue) const override - { - if (DynamicObject* o = parent->getResult (s).getDynamicObject()) - o->setProperty (child, newValue); - else - Expression::assign (s, newValue); - } - - ExpPtr parent; - Identifier child; - }; - - struct ArraySubscript : public Expression - { - ArraySubscript (const CodeLocation& l) noexcept : Expression (l) {} - - var getResult (const Scope& s) const override - { - if (const Array* array = object->getResult (s).getArray()) - return (*array) [static_cast (index->getResult (s))]; - - return var::undefined(); - } - - void assign (const Scope& s, const var& newValue) const override - { - if (Array* array = object->getResult (s).getArray()) - { - const int i = index->getResult (s); - while (array->size() < i) - array->add (var::undefined()); - - array->set (i, newValue); - return; - } - - Expression::assign (s, newValue); - } - - ExpPtr object, index; - }; - - struct BinaryOperatorBase : public Expression - { - BinaryOperatorBase (const CodeLocation& l, ExpPtr& a, ExpPtr& b, TokenType op) noexcept - : Expression (l), lhs (a), rhs (b), operation (op) {} - - ExpPtr lhs, rhs; - TokenType operation; - }; - - struct BinaryOperator : public BinaryOperatorBase - { - BinaryOperator (const CodeLocation& l, ExpPtr& a, ExpPtr& b, TokenType op) noexcept - : BinaryOperatorBase (l, a, b, op) {} - - virtual var getWithUndefinedArg() const { return var::undefined(); } - virtual var getWithDoubles (double, double) const { return throwError ("Double"); } - virtual var getWithInts (int64, int64) const { return throwError ("Integer"); } - virtual var getWithArrayOrObject (const var& a, const var&) const { return throwError (a.isArray() ? "Array" : "Object"); } - virtual var getWithStrings (const String&, const String&) const { return throwError ("String"); } - - var getResult (const Scope& s) const override - { - var a (lhs->getResult (s)), b (rhs->getResult (s)); - - if ((a.isUndefined() || a.isVoid()) && (b.isUndefined() || b.isVoid())) - return getWithUndefinedArg(); - - if (isNumericOrUndefined (a) && isNumericOrUndefined (b)) - return (a.isDouble() || b.isDouble()) ? getWithDoubles (a, b) : getWithInts (a, b); - - if (a.isArray() || a.isObject()) - return getWithArrayOrObject (a, b); - - return getWithStrings (a.toString(), b.toString()); - } - - var throwError (const char* typeName) const - { location.throwError (getTokenName (operation) + " is not allowed on the " + typeName + " type"); return var(); } - }; - - struct EqualsOp : public BinaryOperator - { - EqualsOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::equals) {} - var getWithUndefinedArg() const override { return true; } - var getWithDoubles (double a, double b) const override { return a == b; } - var getWithInts (int64 a, int64 b) const override { return a == b; } - var getWithStrings (const String& a, const String& b) const override { return a == b; } - var getWithArrayOrObject (const var& a, const var& b) const override { return a == b; } - }; - - struct NotEqualsOp : public BinaryOperator - { - NotEqualsOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::notEquals) {} - var getWithUndefinedArg() const override { return false; } - var getWithDoubles (double a, double b) const override { return a != b; } - var getWithInts (int64 a, int64 b) const override { return a != b; } - var getWithStrings (const String& a, const String& b) const override { return a != b; } - var getWithArrayOrObject (const var& a, const var& b) const override { return a != b; } - }; - - struct LessThanOp : public BinaryOperator - { - LessThanOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::lessThan) {} - var getWithDoubles (double a, double b) const override { return a < b; } - var getWithInts (int64 a, int64 b) const override { return a < b; } - var getWithStrings (const String& a, const String& b) const override { return a < b; } - }; - - struct LessThanOrEqualOp : public BinaryOperator - { - LessThanOrEqualOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::lessThanOrEqual) {} - var getWithDoubles (double a, double b) const override { return a <= b; } - var getWithInts (int64 a, int64 b) const override { return a <= b; } - var getWithStrings (const String& a, const String& b) const override { return a <= b; } - }; - - struct GreaterThanOp : public BinaryOperator - { - GreaterThanOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::greaterThan) {} - var getWithDoubles (double a, double b) const override { return a > b; } - var getWithInts (int64 a, int64 b) const override { return a > b; } - var getWithStrings (const String& a, const String& b) const override { return a > b; } - }; - - struct GreaterThanOrEqualOp : public BinaryOperator - { - GreaterThanOrEqualOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::greaterThanOrEqual) {} - var getWithDoubles (double a, double b) const override { return a >= b; } - var getWithInts (int64 a, int64 b) const override { return a >= b; } - var getWithStrings (const String& a, const String& b) const override { return a >= b; } - }; - - struct AdditionOp : public BinaryOperator - { - AdditionOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::plus) {} - var getWithDoubles (double a, double b) const override { return a + b; } - var getWithInts (int64 a, int64 b) const override { return a + b; } - var getWithStrings (const String& a, const String& b) const override { return a + b; } - }; - - struct SubtractionOp : public BinaryOperator - { - SubtractionOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::minus) {} - var getWithDoubles (double a, double b) const override { return a - b; } - var getWithInts (int64 a, int64 b) const override { return a - b; } - }; - - struct MultiplyOp : public BinaryOperator - { - MultiplyOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::times) {} - var getWithDoubles (double a, double b) const override { return a * b; } - var getWithInts (int64 a, int64 b) const override { return a * b; } - }; - - struct DivideOp : public BinaryOperator - { - DivideOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::divide) {} - var getWithDoubles (double a, double b) const override { return b != 0 ? a / b : std::numeric_limits::infinity(); } - var getWithInts (int64 a, int64 b) const override { return b != 0 ? var (a / (double) b) : var (std::numeric_limits::infinity()); } - }; - - struct ModuloOp : public BinaryOperator - { - ModuloOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::modulo) {} - var getWithInts (int64 a, int64 b) const override { return b != 0 ? var (a % b) : var (std::numeric_limits::infinity()); } - }; - - struct BitwiseOrOp : public BinaryOperator - { - BitwiseOrOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::bitwiseOr) {} - var getWithInts (int64 a, int64 b) const override { return a | b; } - }; - - struct BitwiseAndOp : public BinaryOperator - { - BitwiseAndOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::bitwiseAnd) {} - var getWithInts (int64 a, int64 b) const override { return a & b; } - }; - - struct BitwiseXorOp : public BinaryOperator - { - BitwiseXorOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::bitwiseXor) {} - var getWithInts (int64 a, int64 b) const override { return a ^ b; } - }; - - struct LeftShiftOp : public BinaryOperator - { - LeftShiftOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::leftShift) {} - var getWithInts (int64 a, int64 b) const override { return ((int) a) << (int) b; } - }; - - struct RightShiftOp : public BinaryOperator - { - RightShiftOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::rightShift) {} - var getWithInts (int64 a, int64 b) const override { return ((int) a) >> (int) b; } - }; - - struct RightShiftUnsignedOp : public BinaryOperator - { - RightShiftUnsignedOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperator (l, a, b, TokenTypes::rightShiftUnsigned) {} - var getWithInts (int64 a, int64 b) const override { return (int) (((uint32) a) >> (int) b); } - }; - - struct LogicalAndOp : public BinaryOperatorBase - { - LogicalAndOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperatorBase (l, a, b, TokenTypes::logicalAnd) {} - var getResult (const Scope& s) const override { return lhs->getResult (s) && rhs->getResult (s); } - }; - - struct LogicalOrOp : public BinaryOperatorBase - { - LogicalOrOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperatorBase (l, a, b, TokenTypes::logicalOr) {} - var getResult (const Scope& s) const override { return lhs->getResult (s) || rhs->getResult (s); } - }; - - struct TypeEqualsOp : public BinaryOperatorBase - { - TypeEqualsOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperatorBase (l, a, b, TokenTypes::typeEquals) {} - var getResult (const Scope& s) const override { return areTypeEqual (lhs->getResult (s), rhs->getResult (s)); } - }; - - struct TypeNotEqualsOp : public BinaryOperatorBase - { - TypeNotEqualsOp (const CodeLocation& l, ExpPtr& a, ExpPtr& b) noexcept : BinaryOperatorBase (l, a, b, TokenTypes::typeNotEquals) {} - var getResult (const Scope& s) const override { return ! areTypeEqual (lhs->getResult (s), rhs->getResult (s)); } - }; - - struct ConditionalOp : public Expression - { - ConditionalOp (const CodeLocation& l) noexcept : Expression (l) {} - - var getResult (const Scope& s) const override { return (condition->getResult (s) ? trueBranch : falseBranch)->getResult (s); } - void assign (const Scope& s, const var& v) const override { (condition->getResult (s) ? trueBranch : falseBranch)->assign (s, v); } - - ExpPtr condition, trueBranch, falseBranch; - }; - - struct Assignment : public Expression - { - Assignment (const CodeLocation& l, ExpPtr& dest, ExpPtr& source) noexcept : Expression (l), target (dest), newValue (source) {} - - var getResult (const Scope& s) const override - { - var value (newValue->getResult (s)); - target->assign (s, value); - return value; - } - - ExpPtr target, newValue; - }; - - struct SelfAssignment : public Expression - { - SelfAssignment (const CodeLocation& l, Expression* dest, Expression* source) noexcept - : Expression (l), target (dest), newValue (source) {} - - var getResult (const Scope& s) const override - { - var value (newValue->getResult (s)); - target->assign (s, value); - return value; - } - - Expression* target; // Careful! this pointer aliases a sub-term of newValue! - ExpPtr newValue; - TokenType op; - }; - - struct PostAssignment : public SelfAssignment - { - PostAssignment (const CodeLocation& l, Expression* dest, Expression* source) noexcept : SelfAssignment (l, dest, source) {} - - var getResult (const Scope& s) const override - { - var oldValue (target->getResult (s)); - target->assign (s, newValue->getResult (s)); - return oldValue; - } - }; - - struct FunctionCall : public Expression - { - FunctionCall (const CodeLocation& l) noexcept : Expression (l) {} - - var getResult (const Scope& s) const override - { - if (DotOperator* dot = dynamic_cast (object.get())) - { - var thisObject (dot->parent->getResult (s)); - return invokeFunction (s, s.findFunctionCall (location, thisObject, dot->child), thisObject); - } - - var function (object->getResult (s)); - return invokeFunction (s, function, var (s.scope)); - } - - var invokeFunction (const Scope& s, const var& function, const var& thisObject) const - { - s.checkTimeOut (location); - - Array argVars; - for (int i = 0; i < arguments.size(); ++i) - argVars.add (arguments.getUnchecked(i)->getResult (s)); - - const var::NativeFunctionArgs args (thisObject, argVars.begin(), argVars.size()); - - if (var::NativeFunction nativeFunction = function.getNativeFunction()) - return nativeFunction (args); - - if (FunctionObject* fo = dynamic_cast (function.getObject())) - return fo->invoke (s, args); - - location.throwError ("This expression is not a function!"); return var(); - } - - ExpPtr object; - OwnedArray arguments; - }; - - struct NewOperator : public FunctionCall - { - NewOperator (const CodeLocation& l) noexcept : FunctionCall (l) {} - - var getResult (const Scope& s) const override - { - var classOrFunc = object->getResult (s); - - const bool isFunc = isFunction (classOrFunc); - if (! (isFunc || classOrFunc.getDynamicObject() != nullptr)) - return var::undefined(); - - DynamicObject::Ptr newObject (new DynamicObject()); - - if (isFunc) - invokeFunction (s, classOrFunc, newObject.get()); - else - newObject->setProperty (getPrototypeIdentifier(), classOrFunc); - - return newObject.get(); - } - }; - - struct ObjectDeclaration : public Expression - { - ObjectDeclaration (const CodeLocation& l) noexcept : Expression (l) {} - - var getResult (const Scope& s) const override - { - DynamicObject::Ptr newObject (new DynamicObject()); - - for (int i = 0; i < names.size(); ++i) - newObject->setProperty (names.getUnchecked(i), initialisers.getUnchecked(i)->getResult (s)); - - return newObject.get(); - } - - Array names; - OwnedArray initialisers; - }; - - struct ArrayDeclaration : public Expression - { - ArrayDeclaration (const CodeLocation& l) noexcept : Expression (l) {} - - var getResult (const Scope& s) const override - { - Array a; - - for (int i = 0; i < values.size(); ++i) - a.add (values.getUnchecked(i)->getResult (s)); - - return a; - } - - OwnedArray values; - }; - - //============================================================================== - struct FunctionObject : public DynamicObject - { - FunctionObject() noexcept {} - - FunctionObject (const FunctionObject& other) : DynamicObject(), functionCode (other.functionCode) - { - ExpressionTreeBuilder tb (functionCode); - tb.parseFunctionParamsAndBody (*this); - } - - DynamicObject::Ptr clone() override { return new FunctionObject (*this); } - - void writeAsJSON (OutputStream& out, int /*indentLevel*/, bool /*allOnOneLine*/) override - { - out << "function " << functionCode; - } - - var invoke (const Scope& s, const var::NativeFunctionArgs& args) const - { - DynamicObject::Ptr functionRoot (new DynamicObject()); - - static const Identifier thisIdent ("this"); - functionRoot->setProperty (thisIdent, args.thisObject); - - for (int i = 0; i < parameters.size(); ++i) - functionRoot->setProperty (parameters.getReference(i), - i < args.numArguments ? args.arguments[i] : var::undefined()); - - var result; - body->perform (Scope (&s, s.root, functionRoot), &result); - return result; - } - - String functionCode; - Array parameters; - ScopedPointer body; - }; - - //============================================================================== - struct TokenIterator - { - TokenIterator (const String& code) : location (code), p (code.getCharPointer()) { skip(); } - - void skip() - { - skipWhitespaceAndComments(); - location.location = p; - currentType = matchNextToken(); - } - - void match (TokenType expected) - { - if (currentType != expected) - location.throwError ("Found " + getTokenName (currentType) + " when expecting " + getTokenName (expected)); - - skip(); - } - - bool matchIf (TokenType expected) { if (currentType == expected) { skip(); return true; } return false; } - bool matchesAny (TokenType t1, TokenType t2) const { return currentType == t1 || currentType == t2; } - bool matchesAny (TokenType t1, TokenType t2, TokenType t3) const { return matchesAny (t1, t2) || currentType == t3; } - - CodeLocation location; - TokenType currentType; - var currentValue; - - private: - String::CharPointerType p; - - static bool isIdentifierStart (const juce_wchar c) noexcept { return CharacterFunctions::isLetter (c) || c == '_'; } - static bool isIdentifierBody (const juce_wchar c) noexcept { return CharacterFunctions::isLetterOrDigit (c) || c == '_'; } - - TokenType matchNextToken() - { - if (isIdentifierStart (*p)) - { - String::CharPointerType end (p); - while (isIdentifierBody (*++end)) {} - - const size_t len = (size_t) (end - p); - #define JUCE_JS_COMPARE_KEYWORD(name, str) if (len == sizeof (str) - 1 && matchToken (TokenTypes::name, len)) return TokenTypes::name; - JUCE_JS_KEYWORDS (JUCE_JS_COMPARE_KEYWORD) - - currentValue = String (p, end); p = end; - return TokenTypes::identifier; - } - - if (p.isDigit()) - { - if (parseHexLiteral() || parseFloatLiteral() || parseOctalLiteral() || parseDecimalLiteral()) - return TokenTypes::literal; - - location.throwError ("Syntax error in numeric constant"); - } - - if (parseStringLiteral (*p) || (*p == '.' && parseFloatLiteral())) - return TokenTypes::literal; - - #define JUCE_JS_COMPARE_OPERATOR(name, str) if (matchToken (TokenTypes::name, sizeof (str) - 1)) return TokenTypes::name; - JUCE_JS_OPERATORS (JUCE_JS_COMPARE_OPERATOR) - - if (! p.isEmpty()) - location.throwError ("Unexpected character '" + String::charToString (*p) + "' in source"); - - return TokenTypes::eof; - } - - bool matchToken (TokenType name, const size_t len) noexcept - { - if (p.compareUpTo (CharPointer_ASCII (name), (int) len) != 0) return false; - p += (int) len; return true; - } - - void skipWhitespaceAndComments() - { - for (;;) - { - p = p.findEndOfWhitespace(); - - if (*p == '/') - { - const juce_wchar c2 = p[1]; - - if (c2 == '/') { p = CharacterFunctions::find (p, (juce_wchar) '\n'); continue; } - - if (c2 == '*') - { - location.location = p; - p = CharacterFunctions::find (p + 2, CharPointer_ASCII ("*/")); - if (p.isEmpty()) location.throwError ("Unterminated '/*' comment"); - p += 2; continue; - } - } - - break; - } - } - - bool parseStringLiteral (juce_wchar quoteType) - { - if (quoteType != '"' && quoteType != '\'') - return false; - - Result r (JSON::parseQuotedString (p, currentValue)); - if (r.failed()) location.throwError (r.getErrorMessage()); - return true; - } - - bool parseHexLiteral() - { - if (*p != '0' || (p[1] != 'x' && p[1] != 'X')) return false; - - String::CharPointerType t (++p); - int64 v = CharacterFunctions::getHexDigitValue (*++t); - if (v < 0) return false; - - for (;;) - { - const int digit = CharacterFunctions::getHexDigitValue (*++t); - if (digit < 0) break; - v = v * 16 + digit; - } - - currentValue = v; p = t; - return true; - } - - bool parseFloatLiteral() - { - int numDigits = 0; - String::CharPointerType t (p); - while (t.isDigit()) { ++t; ++numDigits; } - - const bool hasPoint = (*t == '.'); - - if (hasPoint) - while ((++t).isDigit()) ++numDigits; - - if (numDigits == 0) - return false; - - juce_wchar c = *t; - const bool hasExponent = (c == 'e' || c == 'E'); - - if (hasExponent) - { - c = *++t; - if (c == '+' || c == '-') ++t; - if (! t.isDigit()) return false; - while ((++t).isDigit()) {} - } - - if (! (hasExponent || hasPoint)) return false; - - currentValue = CharacterFunctions::getDoubleValue (p); p = t; - return true; - } - - bool parseOctalLiteral() - { - String::CharPointerType t (p); - int64 v = *t - '0'; - if (v != 0) return false; // first digit of octal must be 0 - - for (;;) - { - const int digit = (int) (*++t - '0'); - if (isPositiveAndBelow (digit, 8)) v = v * 8 + digit; - else if (isPositiveAndBelow (digit, 10)) location.throwError ("Decimal digit in octal constant"); - else break; - } - - currentValue = v; p = t; - return true; - } - - bool parseDecimalLiteral() - { - int64 v = 0; - - for (;; ++p) - { - const int digit = (int) (*p - '0'); - if (isPositiveAndBelow (digit, 10)) v = v * 10 + digit; - else break; - } - - currentValue = v; - return true; - } - }; - - //============================================================================== - struct ExpressionTreeBuilder : private TokenIterator - { - ExpressionTreeBuilder (const String code) : TokenIterator (code) {} - - BlockStatement* parseStatementList() - { - ScopedPointer b (new BlockStatement (location)); - - while (currentType != TokenTypes::closeBrace && currentType != TokenTypes::eof) - b->statements.add (parseStatement()); - - return b.release(); - } - - void parseFunctionParamsAndBody (FunctionObject& fo) - { - match (TokenTypes::openParen); - - while (currentType != TokenTypes::closeParen) - { - fo.parameters.add (currentValue.toString()); - match (TokenTypes::identifier); - - if (currentType != TokenTypes::closeParen) - match (TokenTypes::comma); - } - - match (TokenTypes::closeParen); - fo.body = parseBlock(); - } - - Expression* parseExpression() - { - ExpPtr lhs (parseLogicOperator()); - - if (matchIf (TokenTypes::question)) return parseTerneryOperator (lhs); - if (matchIf (TokenTypes::assign)) { ExpPtr rhs (parseExpression()); return new Assignment (location, lhs, rhs); } - if (matchIf (TokenTypes::plusEquals)) return parseInPlaceOpExpression (lhs); - if (matchIf (TokenTypes::minusEquals)) return parseInPlaceOpExpression (lhs); - if (matchIf (TokenTypes::leftShiftEquals)) return parseInPlaceOpExpression (lhs); - if (matchIf (TokenTypes::rightShiftEquals)) return parseInPlaceOpExpression (lhs); - - return lhs.release(); - } - - private: - void throwError (const String& err) const { location.throwError (err); } - - template - Expression* parseInPlaceOpExpression (ExpPtr& lhs) - { - ExpPtr rhs (parseExpression()); - Expression* bareLHS = lhs; // careful - bare pointer is deliberately alised - return new SelfAssignment (location, bareLHS, new OpType (location, lhs, rhs)); - } - - BlockStatement* parseBlock() - { - match (TokenTypes::openBrace); - ScopedPointer b (parseStatementList()); - match (TokenTypes::closeBrace); - return b.release(); - } - - Statement* parseStatement() - { - if (currentType == TokenTypes::openBrace) return parseBlock(); - if (matchIf (TokenTypes::var)) return parseVar(); - if (matchIf (TokenTypes::if_)) return parseIf(); - if (matchIf (TokenTypes::while_)) return parseDoOrWhileLoop (false); - if (matchIf (TokenTypes::do_)) return parseDoOrWhileLoop (true); - if (matchIf (TokenTypes::for_)) return parseForLoop(); - if (matchIf (TokenTypes::return_)) return new ReturnStatement (location, matchIf (TokenTypes::semicolon) ? new Expression (location) : parseExpression()); - if (matchIf (TokenTypes::break_)) return new BreakStatement (location); - if (matchIf (TokenTypes::continue_)) return new ContinueStatement (location); - if (matchIf (TokenTypes::function)) return parseFunction(); - if (matchIf (TokenTypes::semicolon)) return new Statement (location); - if (matchIf (TokenTypes::plusplus)) return parsePreIncDec(); - if (matchIf (TokenTypes::minusminus)) return parsePreIncDec(); - - if (matchesAny (TokenTypes::openParen, TokenTypes::openBracket)) - return matchEndOfStatement (parseFactor()); - - if (matchesAny (TokenTypes::identifier, TokenTypes::literal, TokenTypes::minus)) - return matchEndOfStatement (parseExpression()); - - throwError ("Found " + getTokenName (currentType) + " when expecting a statement"); - return nullptr; - } - - Expression* matchEndOfStatement (Expression* ex) { ExpPtr e (ex); if (currentType != TokenTypes::eof) match (TokenTypes::semicolon); return e.release(); } - Expression* matchCloseParen (Expression* ex) { ExpPtr e (ex); match (TokenTypes::closeParen); return e.release(); } - - Statement* parseIf() - { - ScopedPointer s (new IfStatement (location)); - match (TokenTypes::openParen); - s->condition = parseExpression(); - match (TokenTypes::closeParen); - s->trueBranch = parseStatement(); - s->falseBranch = matchIf (TokenTypes::else_) ? parseStatement() : new Statement (location); - return s.release(); - } - - Statement* parseVar() - { - ScopedPointer s (new VarStatement (location)); - s->name = parseIdentifier(); - s->initialiser = matchIf (TokenTypes::assign) ? parseExpression() : new Expression (location); - - if (matchIf (TokenTypes::comma)) - { - ScopedPointer block (new BlockStatement (location)); - block->statements.add (s.release()); - block->statements.add (parseVar()); - return block.release(); - } - - match (TokenTypes::semicolon); - return s.release(); - } - - Statement* parseFunction() - { - Identifier name; - var fn = parseFunctionDefinition (name); - - if (name.isNull()) - throwError ("Functions defined at statement-level must have a name"); - - ExpPtr nm (new UnqualifiedName (location, name)), value (new LiteralValue (location, fn)); - return new Assignment (location, nm, value); - } - - Statement* parseForLoop() - { - ScopedPointer s (new LoopStatement (location, false)); - match (TokenTypes::openParen); - s->initialiser = parseStatement(); - - if (matchIf (TokenTypes::semicolon)) - s->condition = new LiteralValue (location, true); - else - { - s->condition = parseExpression(); - match (TokenTypes::semicolon); - } - - if (matchIf (TokenTypes::closeParen)) - s->iterator = new Statement (location); - else - { - s->iterator = parseExpression(); - match (TokenTypes::closeParen); - } - - s->body = parseStatement(); - return s.release(); - } - - Statement* parseDoOrWhileLoop (bool isDoLoop) - { - ScopedPointer s (new LoopStatement (location, isDoLoop)); - s->initialiser = new Statement (location); - s->iterator = new Statement (location); - - if (isDoLoop) - { - s->body = parseBlock(); - match (TokenTypes::while_); - } - - match (TokenTypes::openParen); - s->condition = parseExpression(); - match (TokenTypes::closeParen); - - if (! isDoLoop) - s->body = parseStatement(); - - return s.release(); - } - - Identifier parseIdentifier() - { - Identifier i; - if (currentType == TokenTypes::identifier) - i = currentValue.toString(); - - match (TokenTypes::identifier); - return i; - } - - var parseFunctionDefinition (Identifier& functionName) - { - const String::CharPointerType functionStart (location.location); - - if (currentType == TokenTypes::identifier) - functionName = parseIdentifier(); - - ScopedPointer fo (new FunctionObject()); - parseFunctionParamsAndBody (*fo); - fo->functionCode = String (functionStart, location.location); - return var (fo.release()); - } - - Expression* parseFunctionCall (FunctionCall* call, ExpPtr& function) - { - ScopedPointer s (call); - s->object = function; - match (TokenTypes::openParen); - - while (currentType != TokenTypes::closeParen) - { - s->arguments.add (parseExpression()); - if (currentType != TokenTypes::closeParen) - match (TokenTypes::comma); - } - - return matchCloseParen (s.release()); - } - - Expression* parseSuffixes (Expression* e) - { - ExpPtr input (e); - - if (matchIf (TokenTypes::dot)) - return parseSuffixes (new DotOperator (location, input, parseIdentifier())); - - if (currentType == TokenTypes::openParen) - return parseSuffixes (parseFunctionCall (new FunctionCall (location), input)); - - if (matchIf (TokenTypes::openBracket)) - { - ScopedPointer s (new ArraySubscript (location)); - s->object = input; - s->index = parseExpression(); - match (TokenTypes::closeBracket); - return parseSuffixes (s.release()); - } - - if (matchIf (TokenTypes::plusplus)) return parsePostIncDec (input); - if (matchIf (TokenTypes::minusminus)) return parsePostIncDec (input); - - return input.release(); - } - - Expression* parseFactor() - { - if (currentType == TokenTypes::identifier) return parseSuffixes (new UnqualifiedName (location, parseIdentifier())); - if (matchIf (TokenTypes::openParen)) return parseSuffixes (matchCloseParen (parseExpression())); - if (matchIf (TokenTypes::true_)) return parseSuffixes (new LiteralValue (location, (int) 1)); - if (matchIf (TokenTypes::false_)) return parseSuffixes (new LiteralValue (location, (int) 0)); - if (matchIf (TokenTypes::null_)) return parseSuffixes (new LiteralValue (location, var())); - if (matchIf (TokenTypes::undefined)) return parseSuffixes (new Expression (location)); - - if (currentType == TokenTypes::literal) - { - var v (currentValue); skip(); - return parseSuffixes (new LiteralValue (location, v)); - } - - if (matchIf (TokenTypes::openBrace)) - { - ScopedPointer e (new ObjectDeclaration (location)); - - while (currentType != TokenTypes::closeBrace) - { - e->names.add (currentValue.toString()); - match ((currentType == TokenTypes::literal && currentValue.isString()) - ? TokenTypes::literal : TokenTypes::identifier); - match (TokenTypes::colon); - e->initialisers.add (parseExpression()); - - if (currentType != TokenTypes::closeBrace) - match (TokenTypes::comma); - } - - match (TokenTypes::closeBrace); - return parseSuffixes (e.release()); - } - - if (matchIf (TokenTypes::openBracket)) - { - ScopedPointer e (new ArrayDeclaration (location)); - - while (currentType != TokenTypes::closeBracket) - { - e->values.add (parseExpression()); - - if (currentType != TokenTypes::closeBracket) - match (TokenTypes::comma); - } - - match (TokenTypes::closeBracket); - return parseSuffixes (e.release()); - } - - if (matchIf (TokenTypes::function)) - { - Identifier name; - var fn = parseFunctionDefinition (name); - - if (name.isValid()) - throwError ("Inline functions definitions cannot have a name"); - - return new LiteralValue (location, fn); - } - - if (matchIf (TokenTypes::new_)) - { - ExpPtr name (new UnqualifiedName (location, parseIdentifier())); - - while (matchIf (TokenTypes::dot)) - name = new DotOperator (location, name, parseIdentifier()); - - return parseFunctionCall (new NewOperator (location), name); - } - - throwError ("Found " + getTokenName (currentType) + " when expecting an expression"); - return nullptr; - } - - template - Expression* parsePreIncDec() - { - Expression* e = parseFactor(); // careful - bare pointer is deliberately alised - ExpPtr lhs (e), one (new LiteralValue (location, (int) 1)); - return new SelfAssignment (location, e, new OpType (location, lhs, one)); - } - - template - Expression* parsePostIncDec (ExpPtr& lhs) - { - Expression* e = lhs.release(); // careful - bare pointer is deliberately alised - ExpPtr lhs2 (e), one (new LiteralValue (location, (int) 1)); - return new PostAssignment (location, e, new OpType (location, lhs2, one)); - } - - Expression* parseUnary() - { - if (matchIf (TokenTypes::minus)) { ExpPtr a (new LiteralValue (location, (int) 0)), b (parseUnary()); return new SubtractionOp (location, a, b); } - if (matchIf (TokenTypes::logicalNot)) { ExpPtr a (new LiteralValue (location, (int) 0)), b (parseUnary()); return new EqualsOp (location, a, b); } - if (matchIf (TokenTypes::plusplus)) return parsePreIncDec(); - if (matchIf (TokenTypes::minusminus)) return parsePreIncDec(); - - return parseFactor(); - } - - Expression* parseMultiplyDivide() - { - ExpPtr a (parseUnary()); - - for (;;) - { - if (matchIf (TokenTypes::times)) { ExpPtr b (parseUnary()); a = new MultiplyOp (location, a, b); } - else if (matchIf (TokenTypes::divide)) { ExpPtr b (parseUnary()); a = new DivideOp (location, a, b); } - else if (matchIf (TokenTypes::modulo)) { ExpPtr b (parseUnary()); a = new ModuloOp (location, a, b); } - else break; - } - - return a.release(); - } - - Expression* parseAdditionSubtraction() - { - ExpPtr a (parseMultiplyDivide()); - - for (;;) - { - if (matchIf (TokenTypes::plus)) { ExpPtr b (parseMultiplyDivide()); a = new AdditionOp (location, a, b); } - else if (matchIf (TokenTypes::minus)) { ExpPtr b (parseMultiplyDivide()); a = new SubtractionOp (location, a, b); } - else break; - } - - return a.release(); - } - - Expression* parseShiftOperator() - { - ExpPtr a (parseAdditionSubtraction()); - - for (;;) - { - if (matchIf (TokenTypes::leftShift)) { ExpPtr b (parseExpression()); a = new LeftShiftOp (location, a, b); } - else if (matchIf (TokenTypes::rightShift)) { ExpPtr b (parseExpression()); a = new RightShiftOp (location, a, b); } - else if (matchIf (TokenTypes::rightShiftUnsigned)) { ExpPtr b (parseExpression()); a = new RightShiftUnsignedOp (location, a, b); } - else break; - } - - return a.release(); - } - - Expression* parseComparator() - { - ExpPtr a (parseShiftOperator()); - - for (;;) - { - if (matchIf (TokenTypes::equals)) { ExpPtr b (parseShiftOperator()); a = new EqualsOp (location, a, b); } - else if (matchIf (TokenTypes::notEquals)) { ExpPtr b (parseShiftOperator()); a = new NotEqualsOp (location, a, b); } - else if (matchIf (TokenTypes::typeEquals)) { ExpPtr b (parseShiftOperator()); a = new TypeEqualsOp (location, a, b); } - else if (matchIf (TokenTypes::typeNotEquals)) { ExpPtr b (parseShiftOperator()); a = new TypeNotEqualsOp (location, a, b); } - else if (matchIf (TokenTypes::lessThan)) { ExpPtr b (parseShiftOperator()); a = new LessThanOp (location, a, b); } - else if (matchIf (TokenTypes::lessThanOrEqual)) { ExpPtr b (parseShiftOperator()); a = new LessThanOrEqualOp (location, a, b); } - else if (matchIf (TokenTypes::greaterThan)) { ExpPtr b (parseShiftOperator()); a = new GreaterThanOp (location, a, b); } - else if (matchIf (TokenTypes::greaterThanOrEqual)) { ExpPtr b (parseShiftOperator()); a = new GreaterThanOrEqualOp (location, a, b); } - else break; - } - - return a.release(); - } - - Expression* parseLogicOperator() - { - ExpPtr a (parseComparator()); - - for (;;) - { - if (matchIf (TokenTypes::logicalAnd)) { ExpPtr b (parseComparator()); a = new LogicalAndOp (location, a, b); } - else if (matchIf (TokenTypes::logicalOr)) { ExpPtr b (parseComparator()); a = new LogicalOrOp (location, a, b); } - else if (matchIf (TokenTypes::bitwiseAnd)) { ExpPtr b (parseComparator()); a = new BitwiseAndOp (location, a, b); } - else if (matchIf (TokenTypes::bitwiseOr)) { ExpPtr b (parseComparator()); a = new BitwiseOrOp (location, a, b); } - else if (matchIf (TokenTypes::bitwiseXor)) { ExpPtr b (parseComparator()); a = new BitwiseXorOp (location, a, b); } - else break; - } - - return a.release(); - } - - Expression* parseTerneryOperator (ExpPtr& condition) - { - ScopedPointer e (new ConditionalOp (location)); - e->condition = condition; - e->trueBranch = parseExpression(); - match (TokenTypes::colon); - e->falseBranch = parseExpression(); - return e.release(); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ExpressionTreeBuilder) - }; - - //============================================================================== - static var get (Args a, int index) noexcept { return index < a.numArguments ? a.arguments[index] : var(); } - static bool isInt (Args a, int index) noexcept { return get (a, index).isInt() || get (a, index).isInt64(); } - static int getInt (Args a, int index) noexcept { return get (a, index); } - static double getDouble (Args a, int index) noexcept { return get (a, index); } - static String getString (Args a, int index) noexcept { return get (a, index).toString(); } - - //============================================================================== - struct ObjectClass : public DynamicObject - { - ObjectClass() - { - setMethod ("dump", dump); - setMethod ("clone", cloneFn); - } - - static Identifier getClassName() { static const Identifier i ("Object"); return i; } - static var dump (Args a) { DBG (JSON::toString (a.thisObject)); (void) a; return var::undefined(); } - static var cloneFn (Args a) { return a.thisObject.clone(); } - }; - - //============================================================================== - struct ArrayClass : public DynamicObject - { - ArrayClass() - { - setMethod ("contains", contains); - setMethod ("remove", remove); - setMethod ("join", join); - } - - static Identifier getClassName() { static const Identifier i ("Array"); return i; } - - static var contains (Args a) - { - if (const Array* array = a.thisObject.getArray()) - return array->contains (get (a, 0)); - - return false; - } - - static var remove (Args a) - { - if (Array* array = a.thisObject.getArray()) - array->removeAllInstancesOf (get (a, 0)); - - return var::undefined(); - } - - static var join (Args a) - { - StringArray strings; - - if (const Array* array = a.thisObject.getArray()) - for (int i = 0; i < array->size(); ++i) - strings.add (array->getReference(i).toString()); - - return strings.joinIntoString (getString (a, 0)); - } - }; - - //============================================================================== - struct StringClass : public DynamicObject - { - StringClass() - { - setMethod ("substring", substring); - setMethod ("indexOf", indexOf); - setMethod ("charAt", charAt); - setMethod ("charCodeAt", charCodeAt); - setMethod ("fromCharCode", fromCharCode); - setMethod ("split", split); - } - - static Identifier getClassName() { static const Identifier i ("String"); return i; } - - static var fromCharCode (Args a) { return String::charToString (getInt (a, 0)); } - static var substring (Args a) { return a.thisObject.toString().substring (getInt (a, 0), getInt (a, 1)); } - static var indexOf (Args a) { return a.thisObject.toString().indexOf (getString (a, 0)); } - static var charCodeAt (Args a) { return (int) a.thisObject.toString() [getInt (a, 0)]; } - static var charAt (Args a) { int p = getInt (a, 0); return a.thisObject.toString().substring (p, p + 1); } - - static var split (Args a) - { - const String str (a.thisObject.toString()); - const String sep (getString (a, 0)); - StringArray strings; - - if (sep.isNotEmpty()) - strings.addTokens (str, sep.substring (0, 1), ""); - else // special-case for empty separator: split all chars separately - for (String::CharPointerType pos = str.getCharPointer(); ! pos.isEmpty(); ++pos) - strings.add (String::charToString (*pos)); - - var array; - for (int i = 0; i < strings.size(); ++i) - array.append (strings[i]); - - return array; - } - }; - - //============================================================================== - struct MathClass : public DynamicObject - { - MathClass() - { - setMethod ("abs", Math_abs); setMethod ("round", Math_round); - setMethod ("random", Math_random); setMethod ("randInt", Math_randInt); - setMethod ("min", Math_min); setMethod ("max", Math_max); - setMethod ("range", Math_range); setMethod ("sign", Math_sign); - setMethod ("PI", Math_pi); setMethod ("E", Math_e); - setMethod ("toDegrees", Math_toDegrees); setMethod ("toRadians", Math_toRadians); - setMethod ("sin", Math_sin); setMethod ("asin", Math_asin); - setMethod ("sinh", Math_sinh); setMethod ("asinh", Math_asinh); - setMethod ("cos", Math_cos); setMethod ("acos", Math_acos); - setMethod ("cosh", Math_cosh); setMethod ("acosh", Math_acosh); - setMethod ("tan", Math_tan); setMethod ("atan", Math_atan); - setMethod ("tanh", Math_tanh); setMethod ("atanh", Math_atanh); - setMethod ("log", Math_log); setMethod ("log10", Math_log10); - setMethod ("exp", Math_exp); setMethod ("pow", Math_pow); - setMethod ("sqr", Math_sqr); setMethod ("sqrt", Math_sqrt); - setMethod ("ceil", Math_ceil); setMethod ("floor", Math_floor); - } - - static var Math_pi (Args) { return double_Pi; } - static var Math_e (Args) { return exp (1.0); } - static var Math_random (Args) { return Random::getSystemRandom().nextDouble(); } - static var Math_randInt (Args a) { return Random::getSystemRandom().nextInt (Range (getInt (a, 0), getInt (a, 1))); } - static var Math_abs (Args a) { return isInt (a, 0) ? var (std::abs (getInt (a, 0))) : var (std::abs (getDouble (a, 0))); } - static var Math_round (Args a) { return isInt (a, 0) ? var (roundToInt (getInt (a, 0))) : var (roundToInt (getDouble (a, 0))); } - static var Math_sign (Args a) { return isInt (a, 0) ? var (sign (getInt (a, 0))) : var (sign (getDouble (a, 0))); } - static var Math_range (Args a) { return isInt (a, 0) ? var (jlimit (getInt (a, 1), getInt (a, 2), getInt (a, 0))) : var (jlimit (getDouble (a, 1), getDouble (a, 2), getDouble (a, 0))); } - static var Math_min (Args a) { return (isInt (a, 0) && isInt (a, 1)) ? var (jmin (getInt (a, 0), getInt (a, 1))) : var (jmin (getDouble (a, 0), getDouble (a, 1))); } - static var Math_max (Args a) { return (isInt (a, 0) && isInt (a, 1)) ? var (jmax (getInt (a, 0), getInt (a, 1))) : var (jmax (getDouble (a, 0), getDouble (a, 1))); } - static var Math_toDegrees (Args a) { return (180.0 / double_Pi) * getDouble (a, 0); } - static var Math_toRadians (Args a) { return (double_Pi / 180.0) * getDouble (a, 0); } - static var Math_sin (Args a) { return sin (getDouble (a, 0)); } - static var Math_asin (Args a) { return asin (getDouble (a, 0)); } - static var Math_cos (Args a) { return cos (getDouble (a, 0)); } - static var Math_acos (Args a) { return acos (getDouble (a, 0)); } - static var Math_sinh (Args a) { return sinh (getDouble (a, 0)); } - static var Math_asinh (Args a) { return asinh (getDouble (a, 0)); } - static var Math_cosh (Args a) { return cosh (getDouble (a, 0)); } - static var Math_acosh (Args a) { return acosh (getDouble (a, 0)); } - static var Math_tan (Args a) { return tan (getDouble (a, 0)); } - static var Math_tanh (Args a) { return tanh (getDouble (a, 0)); } - static var Math_atan (Args a) { return atan (getDouble (a, 0)); } - static var Math_atanh (Args a) { return atanh (getDouble (a, 0)); } - static var Math_log (Args a) { return log (getDouble (a, 0)); } - static var Math_log10 (Args a) { return log10 (getDouble (a, 0)); } - static var Math_exp (Args a) { return exp (getDouble (a, 0)); } - static var Math_pow (Args a) { return pow (getDouble (a, 0), getDouble (a, 1)); } - static var Math_sqr (Args a) { double x = getDouble (a, 0); return x * x; } - static var Math_sqrt (Args a) { return std::sqrt (getDouble (a, 0)); } - static var Math_ceil (Args a) { return std::ceil (getDouble (a, 0)); } - static var Math_floor (Args a) { return std::floor (getDouble (a, 0)); } - - static Identifier getClassName() { static const Identifier i ("Math"); return i; } - template static Type sign (Type n) noexcept { return n > 0 ? (Type) 1 : (n < 0 ? (Type) -1 : 0); } - }; - - //============================================================================== - struct JSONClass : public DynamicObject - { - JSONClass() { setMethod ("stringify", stringify); } - static Identifier getClassName() { static const Identifier i ("JSON"); return i; } - static var stringify (Args a) { return JSON::toString (get (a, 0)); } - }; - - //============================================================================== - struct IntegerClass : public DynamicObject - { - IntegerClass() { setMethod ("parseInt", parseInt); } - static Identifier getClassName() { static const Identifier i ("Integer"); return i; } - - static var parseInt (Args a) - { - const String s (getString (a, 0).trim()); - - return s[0] == '0' ? (s[1] == 'x' ? s.substring(2).getHexValue64() : getOctalValue (s)) - : s.getLargeIntValue(); - } - }; - - //============================================================================== - static var trace (Args a) { Logger::outputDebugString (JSON::toString (a.thisObject)); return var::undefined(); } - static var charToInt (Args a) { return (int) (getString (a, 0)[0]); } - - static var exec (Args a) - { - if (RootObject* root = dynamic_cast (a.thisObject.getObject())) - root->execute (getString (a, 0)); - - return var::undefined(); - } - - static var eval (Args a) - { - if (RootObject* root = dynamic_cast (a.thisObject.getObject())) - return root->evaluate (getString (a, 0)); - - return var::undefined(); - } -}; - -//============================================================================== -JavascriptEngine::JavascriptEngine() : maximumExecutionTime (15.0), root (new RootObject()) -{ - registerNativeObject (RootObject::ObjectClass ::getClassName(), new RootObject::ObjectClass()); - registerNativeObject (RootObject::ArrayClass ::getClassName(), new RootObject::ArrayClass()); - registerNativeObject (RootObject::StringClass ::getClassName(), new RootObject::StringClass()); - registerNativeObject (RootObject::MathClass ::getClassName(), new RootObject::MathClass()); - registerNativeObject (RootObject::JSONClass ::getClassName(), new RootObject::JSONClass()); - registerNativeObject (RootObject::IntegerClass ::getClassName(), new RootObject::IntegerClass()); -} - -JavascriptEngine::~JavascriptEngine() {} - -void JavascriptEngine::prepareTimeout() const noexcept { root->timeout = Time::getCurrentTime() + maximumExecutionTime; } - -void JavascriptEngine::registerNativeObject (Identifier name, DynamicObject* object) -{ - root->setProperty (name, object); -} - -Result JavascriptEngine::execute (const String& code) -{ - try - { - prepareTimeout(); - root->execute (code); - } - catch (String& error) - { - return Result::fail (error); - } - - return Result::ok(); -} - -var JavascriptEngine::evaluate (const String& code, Result* result) -{ - try - { - prepareTimeout(); - if (result != nullptr) *result = Result::ok(); - return root->evaluate (code); - } - catch (String& error) - { - if (result != nullptr) *result = Result::fail (error); - } - - return var::undefined(); -} - -var JavascriptEngine::callFunction (Identifier function, const var::NativeFunctionArgs& args, Result* result) -{ - var returnVal (var::undefined()); - - try - { - prepareTimeout(); - if (result != nullptr) *result = Result::ok(); - RootObject::Scope (nullptr, root, root).findAndInvokeMethod (function, args, returnVal); - } - catch (String& error) - { - if (result != nullptr) *result = Result::fail (error); - } - - return returnVal; -} - -const NamedValueSet& JavascriptEngine::getRootObjectProperties() const noexcept -{ - return root->getProperties(); -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif diff --git a/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h b/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h deleted file mode 100755 index eafc3cd..0000000 --- a/JuceLibraryCode/modules/juce_core/javascript/juce_Javascript.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -/** - A simple javascript interpreter! - - It's not fully standards-compliant, and won't be as fast as the fancy JIT-compiled - engines that you get in browsers, but this is an extremely compact, low-overhead javascript - interpreter, which is integrated with the juce var and DynamicObject classes. If you need - a few simple bits of scripting in your app, and want to be able to easily let the JS - work with native objects defined as DynamicObject subclasses, then this might do the job. - - To use, simply create an instance of this class and call execute() to run your code. - Variables that the script sets can be retrieved with evaluate(), and if you need to provide - native objects for the script to use, you can add them with registerNativeObject(). - - One caveat: Because the values and objects that the engine works with are DynamicObject - and var objects, they use reference-counting rather than garbage-collection, so if your - script creates complex connections between objects, you run the risk of creating cyclic - dependencies and hence leaking. -*/ -class JavascriptEngine -{ -public: - /** Creates an instance of the engine. - This creates a root namespace and defines some basic Object, String, Array - and Math library methods. - */ - JavascriptEngine(); - - /** Destructor. */ - ~JavascriptEngine(); - - /** Attempts to parse and run a block of javascript code. - If there's a parse or execution error, the error description is returned in - the result. - You can specify a maximum time for which the program is allowed to run, and - it'll return with an error message if this time is exceeded. - */ - Result execute (const String& javascriptCode); - - /** Attempts to parse and run a javascript expression, and returns the result. - If there's a syntax error, or the expression can't be evaluated, the return value - will be var::undefined(). The errorMessage parameter gives you a way to find out - any parsing errors. - You can specify a maximum time for which the program is allowed to run, and - it'll return with an error message if this time is exceeded. - */ - var evaluate (const String& javascriptCode, - Result* errorMessage = nullptr); - - /** Calls a function in the root namespace, and returns the result. - The function arguments are passed in the same format as used by native - methods in the var class. - */ - var callFunction (Identifier function, - const var::NativeFunctionArgs& args, - Result* errorMessage = nullptr); - - /** Adds a native object to the root namespace. - The object passed-in is reference-counted, and will be retained by the - engine until the engine is deleted. The name must be a simple JS identifier, - without any dots. - */ - void registerNativeObject (Identifier objectName, DynamicObject* object); - - /** This value indicates how long a call to one of the evaluate methods is permitted - to run before timing-out and failing. - The default value is a number of seconds, but you can change this to whatever value - suits your application. - */ - RelativeTime maximumExecutionTime; - - /** Provides access to the set of properties of the root namespace object. */ - const NamedValueSet& getRootObjectProperties() const noexcept; - -private: - JUCE_PUBLIC_IN_DLL_BUILD (struct RootObject) - const ReferenceCountedObjectPtr root; - void prepareTimeout() const noexcept; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JavascriptEngine) -}; diff --git a/JuceLibraryCode/modules/juce_core/juce_core.cpp b/JuceLibraryCode/modules/juce_core/juce_core.cpp deleted file mode 100755 index 3b27de7..0000000 --- a/JuceLibraryCode/modules/juce_core/juce_core.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#if defined (JUCE_CORE_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE - /* When you add this cpp file to your project, you mustn't include it in a file where you've - already included any other headers - just put it inside a file on its own, possibly with your config - flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix - header files that the compiler may be using. - */ - #error "Incorrect use of JUCE cpp file" -#endif - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -//============================================================================== -#include "native/juce_BasicNativeHeaders.h" -#include "juce_core.h" - -#include -#include -#include - -#if ! JUCE_ANDROID - #include -#endif - -#if JUCE_WINDOWS - #include - - #define _WINSOCK_DEPRECATED_NO_WARNINGS 1 - #include - #include - - #if ! JUCE_MINGW - #include - - #if ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES - #pragma comment (lib, "DbgHelp.lib") - #endif - #endif - - #if JUCE_MINGW - #include - #endif - -#else - #if JUCE_LINUX || JUCE_ANDROID - #include - #include - #include - #include - #include - #endif - - #if JUCE_LINUX - #include - #include - #endif - - #include - #include - #include - #include - #include - #include - #include - #include - - #if ! JUCE_ANDROID - #include - #endif -#endif - -#if JUCE_MAC || JUCE_IOS - #include - #include -#endif - -#if JUCE_ANDROID - #include -#endif -#include - - -//============================================================================== -namespace juce -{ - -#include "containers/juce_AbstractFifo.cpp" -#include "containers/juce_NamedValueSet.cpp" -#include "containers/juce_PropertySet.cpp" -#include "containers/juce_Variant.cpp" -#include "files/juce_DirectoryIterator.cpp" -#include "files/juce_File.cpp" -#include "files/juce_FileInputStream.cpp" -#include "files/juce_FileOutputStream.cpp" -#include "files/juce_FileSearchPath.cpp" -#include "files/juce_TemporaryFile.cpp" -#include "javascript/juce_JSON.cpp" -#include "javascript/juce_Javascript.cpp" -#include "containers/juce_DynamicObject.cpp" -#include "logging/juce_FileLogger.cpp" -#include "logging/juce_Logger.cpp" -#include "maths/juce_BigInteger.cpp" -#include "maths/juce_Expression.cpp" -#include "maths/juce_Random.cpp" -#include "memory/juce_MemoryBlock.cpp" -#include "misc/juce_Result.cpp" -#include "misc/juce_Uuid.cpp" -#include "network/juce_MACAddress.cpp" -#include "network/juce_NamedPipe.cpp" -#include "network/juce_Socket.cpp" -#include "network/juce_IPAddress.cpp" -#include "streams/juce_BufferedInputStream.cpp" -#include "streams/juce_FileInputSource.cpp" -#include "streams/juce_InputStream.cpp" -#include "streams/juce_MemoryInputStream.cpp" -#include "streams/juce_MemoryOutputStream.cpp" -#include "streams/juce_SubregionStream.cpp" -#include "system/juce_SystemStats.cpp" -#include "text/juce_CharacterFunctions.cpp" -#include "text/juce_Identifier.cpp" -#include "text/juce_LocalisedStrings.cpp" -#include "text/juce_String.cpp" -#include "streams/juce_OutputStream.cpp" -#include "text/juce_StringArray.cpp" -#include "text/juce_StringPairArray.cpp" -#include "text/juce_StringPool.cpp" -#include "text/juce_TextDiff.cpp" -#include "threads/juce_ReadWriteLock.cpp" -#include "threads/juce_Thread.cpp" -#include "threads/juce_ThreadPool.cpp" -#include "threads/juce_TimeSliceThread.cpp" -#include "time/juce_PerformanceCounter.cpp" -#include "time/juce_RelativeTime.cpp" -#include "time/juce_Time.cpp" -#include "unit_tests/juce_UnitTest.cpp" -#include "xml/juce_XmlDocument.cpp" -#include "xml/juce_XmlElement.cpp" -#include "zip/juce_GZIPDecompressorInputStream.cpp" -#include "zip/juce_GZIPCompressorOutputStream.cpp" -#include "zip/juce_ZipFile.cpp" -#include "files/juce_FileFilter.cpp" -#include "files/juce_WildcardFileFilter.cpp" - -//============================================================================== -#if JUCE_MAC || JUCE_IOS -#include "native/juce_osx_ObjCHelpers.h" -#endif - -#if JUCE_ANDROID -#include "native/juce_android_JNIHelpers.h" -#endif - -#if ! JUCE_WINDOWS -#include "native/juce_posix_SharedCode.h" -#include "native/juce_posix_NamedPipe.cpp" -#endif - -//============================================================================== -#if JUCE_MAC || JUCE_IOS -#include "native/juce_mac_Files.mm" -#include "native/juce_mac_Network.mm" -#include "native/juce_mac_Strings.mm" -#include "native/juce_mac_SystemStats.mm" -#include "native/juce_mac_Threads.mm" - -//============================================================================== -#elif JUCE_WINDOWS -#include "native/juce_win32_ComSmartPtr.h" -#include "native/juce_win32_Files.cpp" -#include "native/juce_win32_Network.cpp" -#include "native/juce_win32_Registry.cpp" -#include "native/juce_win32_SystemStats.cpp" -#include "native/juce_win32_Threads.cpp" - -//============================================================================== -#elif JUCE_LINUX -#include "native/juce_linux_CommonFile.cpp" -#include "native/juce_linux_Files.cpp" -#include "native/juce_linux_Network.cpp" -#include "native/juce_linux_SystemStats.cpp" -#include "native/juce_linux_Threads.cpp" - -//============================================================================== -#elif JUCE_ANDROID -#include "native/juce_linux_CommonFile.cpp" -#include "native/juce_android_Files.cpp" -#include "native/juce_android_Misc.cpp" -#include "native/juce_android_Network.cpp" -#include "native/juce_android_SystemStats.cpp" -#include "native/juce_android_Threads.cpp" - -#endif - -#include "threads/juce_ChildProcess.cpp" -#include "threads/juce_HighResolutionTimer.cpp" -#include "network/juce_URL.cpp" - -} diff --git a/JuceLibraryCode/modules/juce_core/juce_core.h b/JuceLibraryCode/modules/juce_core/juce_core.h deleted file mode 100755 index 120773c..0000000 --- a/JuceLibraryCode/modules/juce_core/juce_core.h +++ /dev/null @@ -1,284 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_CORE_H_INCLUDED -#define JUCE_CORE_H_INCLUDED - -#ifndef JUCE_MODULE_AVAILABLE_juce_core - /* If you fail to make sure that all your compile units are building JUCE with the same set of - option flags, then there's a risk that different compile units will treat the classes as having - different memory layouts, leading to very nasty memory corruption errors when they all get - linked together. That's why it's best to always include the Introjucer-generated AppConfig.h - file before any juce headers. - - Note that if you do have an AppConfig.h file and hit this warning, it means that it doesn't - contain the JUCE_MODULE_AVAILABLE_xxx flags, which are necessary for some inter-module - functionality to work correctly. In that case, you should either rebuild your AppConfig.h with - the latest introjucer, or fix it manually to contain these flags. - */ - #ifdef _MSC_VER - #pragma message ("Have you included your AppConfig.h file before including the JUCE headers?") - #else - #warning "Have you included your AppConfig.h file before including the JUCE headers?" - #endif -#endif - -#ifdef _MSC_VER - #pragma warning (push) - // Disable warnings for long class names, padding, and undefined preprocessor definitions. - #pragma warning (disable: 4251 4786 4668 4820) - #ifdef __INTEL_COMPILER - #pragma warning (disable: 1125) - #endif -#endif - -//============================================================================== -#include "system/juce_TargetPlatform.h" - -//============================================================================= -/** Config: JUCE_FORCE_DEBUG - - Normally, JUCE_DEBUG is set to 1 or 0 based on compiler and project settings, - but if you define this value, you can override this to force it to be true or false. -*/ -#ifndef JUCE_FORCE_DEBUG - //#define JUCE_FORCE_DEBUG 0 -#endif - -//============================================================================= -/** Config: JUCE_LOG_ASSERTIONS - - If this flag is enabled, the jassert and jassertfalse macros will always use Logger::writeToLog() - to write a message when an assertion happens. - - Enabling it will also leave this turned on in release builds. When it's disabled, - however, the jassert and jassertfalse macros will not be compiled in a - release build. - - @see jassert, jassertfalse, Logger -*/ -#ifndef JUCE_LOG_ASSERTIONS - #if JUCE_ANDROID - #define JUCE_LOG_ASSERTIONS 1 - #else - #define JUCE_LOG_ASSERTIONS 0 - #endif -#endif - -//============================================================================= -/** Config: JUCE_CHECK_MEMORY_LEAKS - - Enables a memory-leak check for certain objects when the app terminates. See the LeakedObjectDetector - class and the JUCE_LEAK_DETECTOR macro for more details about enabling leak checking for specific classes. -*/ -#if JUCE_DEBUG && ! defined (JUCE_CHECK_MEMORY_LEAKS) - #define JUCE_CHECK_MEMORY_LEAKS 1 -#endif - -//============================================================================= -/** Config: JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES - - In a Visual C++ build, this can be used to stop the required system libs being - automatically added to the link stage. -*/ -#ifndef JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES - #define JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES 0 -#endif - -/** Config: JUCE_INCLUDE_ZLIB_CODE - This can be used to disable Juce's embedded 3rd-party zlib code. - You might need to tweak this if you're linking to an external zlib library in your app, - but for normal apps, this option should be left alone. - - If you disable this, you might also want to set a value for JUCE_ZLIB_INCLUDE_PATH, to - specify the path where your zlib headers live. -*/ -#ifndef JUCE_INCLUDE_ZLIB_CODE - #define JUCE_INCLUDE_ZLIB_CODE 1 -#endif - -#ifndef JUCE_ZLIB_INCLUDE_PATH - #define JUCE_ZLIB_INCLUDE_PATH -#endif - -/* Config: JUCE_CATCH_UNHANDLED_EXCEPTIONS - If enabled, this will add some exception-catching code to forward unhandled exceptions - to your JUCEApplicationBase::unhandledException() callback. -*/ -#ifndef JUCE_CATCH_UNHANDLED_EXCEPTIONS - //#define JUCE_CATCH_UNHANDLED_EXCEPTIONS 1 -#endif - -#ifndef JUCE_STRING_UTF_TYPE - #define JUCE_STRING_UTF_TYPE 8 -#endif - -//============================================================================= -//============================================================================= - -#include "system/juce_StandardHeader.h" - -namespace juce -{ - -class StringRef; -class MemoryBlock; -class File; -class InputStream; -class OutputStream; -class DynamicObject; -class FileInputStream; -class FileOutputStream; -class XmlElement; -class JSONFormatter; - -extern JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger(); -extern JUCE_API void JUCE_CALLTYPE logAssertion (const char* file, int line) noexcept; - -#include "memory/juce_Memory.h" -#include "maths/juce_MathsFunctions.h" -#include "memory/juce_ByteOrder.h" -#include "memory/juce_Atomic.h" -#include "text/juce_CharacterFunctions.h" - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4514 4996) -#endif - -#include "text/juce_CharPointer_UTF8.h" -#include "text/juce_CharPointer_UTF16.h" -#include "text/juce_CharPointer_UTF32.h" -#include "text/juce_CharPointer_ASCII.h" - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -#include "text/juce_String.h" -#include "text/juce_StringRef.h" -#include "logging/juce_Logger.h" -#include "memory/juce_LeakedObjectDetector.h" -#include "memory/juce_ContainerDeletePolicy.h" -#include "memory/juce_HeapBlock.h" -#include "memory/juce_MemoryBlock.h" -#include "memory/juce_ReferenceCountedObject.h" -#include "memory/juce_ScopedPointer.h" -#include "memory/juce_OptionalScopedPointer.h" -#include "memory/juce_Singleton.h" -#include "memory/juce_WeakReference.h" -#include "threads/juce_ScopedLock.h" -#include "threads/juce_CriticalSection.h" -#include "maths/juce_Range.h" -#include "maths/juce_NormalisableRange.h" -#include "containers/juce_ElementComparator.h" -#include "containers/juce_ArrayAllocationBase.h" -#include "containers/juce_Array.h" -#include "containers/juce_LinkedListPointer.h" -#include "containers/juce_OwnedArray.h" -#include "containers/juce_ReferenceCountedArray.h" -#include "containers/juce_ScopedValueSetter.h" -#include "containers/juce_SortedSet.h" -#include "containers/juce_SparseSet.h" -#include "containers/juce_AbstractFifo.h" -#include "text/juce_NewLine.h" -#include "text/juce_StringPool.h" -#include "text/juce_Identifier.h" -#include "text/juce_StringArray.h" -#include "text/juce_StringPairArray.h" -#include "text/juce_TextDiff.h" -#include "text/juce_LocalisedStrings.h" -#include "misc/juce_Result.h" -#include "containers/juce_Variant.h" -#include "containers/juce_NamedValueSet.h" -#include "containers/juce_DynamicObject.h" -#include "containers/juce_HashMap.h" -#include "time/juce_RelativeTime.h" -#include "time/juce_Time.h" -#include "streams/juce_InputStream.h" -#include "streams/juce_OutputStream.h" -#include "streams/juce_BufferedInputStream.h" -#include "streams/juce_MemoryInputStream.h" -#include "streams/juce_MemoryOutputStream.h" -#include "streams/juce_SubregionStream.h" -#include "streams/juce_InputSource.h" -#include "files/juce_File.h" -#include "files/juce_DirectoryIterator.h" -#include "files/juce_FileInputStream.h" -#include "files/juce_FileOutputStream.h" -#include "files/juce_FileSearchPath.h" -#include "files/juce_MemoryMappedFile.h" -#include "files/juce_TemporaryFile.h" -#include "files/juce_FileFilter.h" -#include "files/juce_WildcardFileFilter.h" -#include "streams/juce_FileInputSource.h" -#include "logging/juce_FileLogger.h" -#include "javascript/juce_JSON.h" -#include "javascript/juce_Javascript.h" -#include "maths/juce_BigInteger.h" -#include "maths/juce_Expression.h" -#include "maths/juce_Random.h" -#include "misc/juce_Uuid.h" -#include "misc/juce_WindowsRegistry.h" -#include "system/juce_SystemStats.h" -#include "threads/juce_ChildProcess.h" -#include "threads/juce_DynamicLibrary.h" -#include "threads/juce_HighResolutionTimer.h" -#include "threads/juce_InterProcessLock.h" -#include "threads/juce_Process.h" -#include "threads/juce_SpinLock.h" -#include "threads/juce_WaitableEvent.h" -#include "threads/juce_Thread.h" -#include "threads/juce_ThreadLocalValue.h" -#include "threads/juce_ThreadPool.h" -#include "threads/juce_TimeSliceThread.h" -#include "threads/juce_ReadWriteLock.h" -#include "threads/juce_ScopedReadLock.h" -#include "threads/juce_ScopedWriteLock.h" -#include "network/juce_IPAddress.h" -#include "network/juce_MACAddress.h" -#include "network/juce_NamedPipe.h" -#include "network/juce_Socket.h" -#include "network/juce_URL.h" -#include "time/juce_PerformanceCounter.h" -#include "unit_tests/juce_UnitTest.h" -#include "xml/juce_XmlDocument.h" -#include "xml/juce_XmlElement.h" -#include "zip/juce_GZIPCompressorOutputStream.h" -#include "zip/juce_GZIPDecompressorInputStream.h" -#include "zip/juce_ZipFile.h" -#include "containers/juce_PropertySet.h" -#include "memory/juce_SharedResourcePointer.h" - -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -#endif // JUCE_CORE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/juce_core.mm b/JuceLibraryCode/modules/juce_core/juce_core.mm deleted file mode 100755 index 90a2f7c..0000000 --- a/JuceLibraryCode/modules/juce_core/juce_core.mm +++ /dev/null @@ -1,29 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#include "juce_core.cpp" diff --git a/JuceLibraryCode/modules/juce_core/juce_module_info b/JuceLibraryCode/modules/juce_core/juce_module_info deleted file mode 100755 index 33eab6c..0000000 --- a/JuceLibraryCode/modules/juce_core/juce_module_info +++ /dev/null @@ -1,38 +0,0 @@ -{ - "id": "juce_core", - "name": "JUCE core classes", - "version": "3.1.1", - "description": "The essential set of basic JUCE classes, as required by all the other JUCE modules. Includes text, container, memory, threading and i/o functionality.", - "website": "http://www.juce.com/juce", - "license": "ISC Permissive", - - "dependencies": [], - - "include": "juce_core.h", - - "compile": [ { "file": "juce_core.cpp", "target": "! xcode" }, - { "file": "juce_core.mm", "target": "xcode" } ], - - "browse": [ "text/*", - "maths/*", - "memory/*", - "containers/*", - "threads/*", - "time/*", - "files/*", - "network/*", - "streams/*", - "logging/*", - "system/*", - "xml/*", - "javascript/*", - "zip/*", - "unit_tests/*", - "misc/*", - "native/*" ], - - "OSXFrameworks": "Cocoa IOKit", - "iOSFrameworks": "Foundation", - "LinuxLibs": "rt dl pthread", - "mingwLibs": "uuid wsock32 wininet version ole32 ws2_32 oleaut32 imm32 comdlg32 shlwapi rpcrt4 winmm" -} diff --git a/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp b/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp deleted file mode 100755 index 1b8f302..0000000 --- a/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.cpp +++ /dev/null @@ -1,134 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -FileLogger::FileLogger (const File& file, - const String& welcomeMessage, - const int64 maxInitialFileSizeBytes) - : logFile (file) -{ - if (maxInitialFileSizeBytes >= 0) - trimFileSize (logFile, maxInitialFileSizeBytes); - - if (! file.exists()) - file.create(); // (to create the parent directories) - - String welcome; - welcome << newLine - << "**********************************************************" << newLine - << welcomeMessage << newLine - << "Log started: " << Time::getCurrentTime().toString (true, true) << newLine; - - FileLogger::logMessage (welcome); -} - -FileLogger::~FileLogger() {} - -//============================================================================== -void FileLogger::logMessage (const String& message) -{ - const ScopedLock sl (logLock); - DBG (message); - FileOutputStream out (logFile, 256); - out << message << newLine; -} - -void FileLogger::trimFileSize (const File& file, int64 maxFileSizeBytes) -{ - if (maxFileSizeBytes <= 0) - { - file.deleteFile(); - } - else - { - const int64 fileSize = file.getSize(); - - if (fileSize > maxFileSizeBytes) - { - TemporaryFile tempFile (file); - - { - FileOutputStream out (tempFile.getFile()); - FileInputStream in (file); - - if (! (out.openedOk() && in.openedOk())) - return; - - in.setPosition (fileSize - maxFileSizeBytes); - - for (;;) - { - const char c = in.readByte(); - if (c == 0) - return; - - if (c == '\n' || c == '\r') - { - out << c; - break; - } - } - - out.writeFromInputStream (in, -1); - } - - tempFile.overwriteTargetFileWithTemporary(); - } - } -} - -//============================================================================== -File FileLogger::getSystemLogFileFolder() -{ - #if JUCE_MAC - return File ("~/Library/Logs"); - #else - return File::getSpecialLocation (File::userApplicationDataDirectory); - #endif -} - -FileLogger* FileLogger::createDefaultAppLogger (const String& logFileSubDirectoryName, - const String& logFileName, - const String& welcomeMessage, - const int64 maxInitialFileSizeBytes) -{ - return new FileLogger (getSystemLogFileFolder().getChildFile (logFileSubDirectoryName) - .getChildFile (logFileName), - welcomeMessage, maxInitialFileSizeBytes); -} - -FileLogger* FileLogger::createDateStampedLogger (const String& logFileSubDirectoryName, - const String& logFileNameRoot, - const String& logFileNameSuffix, - const String& welcomeMessage) -{ - return new FileLogger (getSystemLogFileFolder().getChildFile (logFileSubDirectoryName) - .getChildFile (logFileNameRoot + Time::getCurrentTime().formatted ("%Y-%m-%d_%H-%M-%S")) - .withFileExtension (logFileNameSuffix) - .getNonexistentSibling(), - welcomeMessage, 0); -} diff --git a/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h b/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h deleted file mode 100755 index 09301b8..0000000 --- a/JuceLibraryCode/modules/juce_core/logging/juce_FileLogger.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_FILELOGGER_H_INCLUDED -#define JUCE_FILELOGGER_H_INCLUDED - - -//============================================================================== -/** - A simple implementation of a Logger that writes to a file. - - @see Logger -*/ -class JUCE_API FileLogger : public Logger -{ -public: - //============================================================================== - /** Creates a FileLogger for a given file. - - @param fileToWriteTo the file that to use - new messages will be appended - to the file. If the file doesn't exist, it will be created, - along with any parent directories that are needed. - @param welcomeMessage when opened, the logger will write a header to the log, along - with the current date and time, and this welcome message - @param maxInitialFileSizeBytes if this is zero or greater, then if the file already exists - but is larger than this number of bytes, then the start of the - file will be truncated to keep the size down. This prevents a log - file getting ridiculously large over time. The file will be truncated - at a new-line boundary. If this value is less than zero, no size limit - will be imposed; if it's zero, the file will always be deleted. Note that - the size is only checked once when this object is created - any logging - that is done later will be appended without any checking - */ - FileLogger (const File& fileToWriteTo, - const String& welcomeMessage, - const int64 maxInitialFileSizeBytes = 128 * 1024); - - /** Destructor. */ - ~FileLogger(); - - //============================================================================== - /** Returns the file that this logger is writing to. */ - const File& getLogFile() const noexcept { return logFile; } - - //============================================================================== - /** Helper function to create a log file in the correct place for this platform. - - The method might return nullptr if the file can't be created for some reason. - - @param logFileSubDirectoryName the name of the subdirectory to create inside the logs folder (as - returned by getSystemLogFileFolder). It's best to use something - like the name of your application here. - @param logFileName the name of the file to create, e.g. "MyAppLog.txt". - @param welcomeMessage a message that will be written to the log when it's opened. - @param maxInitialFileSizeBytes (see the FileLogger constructor for more info on this) - */ - static FileLogger* createDefaultAppLogger (const String& logFileSubDirectoryName, - const String& logFileName, - const String& welcomeMessage, - const int64 maxInitialFileSizeBytes = 128 * 1024); - - /** Helper function to create a log file in the correct place for this platform. - - The filename used is based on the root and suffix strings provided, along with a - time and date string, meaning that a new, empty log file will be always be created - rather than appending to an exising one. - - The method might return nullptr if the file can't be created for some reason. - - @param logFileSubDirectoryName the name of the subdirectory to create inside the logs folder (as - returned by getSystemLogFileFolder). It's best to use something - like the name of your application here. - @param logFileNameRoot the start of the filename to use, e.g. "MyAppLog_". This will have - a timestamp and the logFileNameSuffix appended to it - @param logFileNameSuffix the file suffix to use, e.g. ".txt" - @param welcomeMessage a message that will be written to the log when it's opened. - */ - static FileLogger* createDateStampedLogger (const String& logFileSubDirectoryName, - const String& logFileNameRoot, - const String& logFileNameSuffix, - const String& welcomeMessage); - - //============================================================================== - /** Returns an OS-specific folder where log-files should be stored. - - On Windows this will return a logger with a path such as: - c:\\Documents and Settings\\username\\Application Data\\[logFileSubDirectoryName]\\[logFileName] - - On the Mac it'll create something like: - ~/Library/Logs/[logFileSubDirectoryName]/[logFileName] - - @see createDefaultAppLogger - */ - static File getSystemLogFileFolder(); - - // (implementation of the Logger virtual method) - void logMessage (const String&); - - //============================================================================== - /** This is a utility function which removes lines from the start of a text - file to make sure that its total size is below the given size. - */ - static void trimFileSize (const File& file, int64 maxFileSize); - -private: - //============================================================================== - File logFile; - CriticalSection logLock; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileLogger) -}; - - -#endif // JUCE_FILELOGGER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp b/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp deleted file mode 100755 index 0b1c8d6..0000000 --- a/JuceLibraryCode/modules/juce_core/logging/juce_Logger.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -Logger::Logger() {} - -Logger::~Logger() -{ - // You're deleting this logger while it's still being used! - // Always call Logger::setCurrentLogger (nullptr) before deleting the active logger. - jassert (currentLogger != this); -} - -Logger* Logger::currentLogger = nullptr; - -void Logger::setCurrentLogger (Logger* const newLogger) noexcept { currentLogger = newLogger; } -Logger* Logger::getCurrentLogger() noexcept { return currentLogger; } - -void Logger::writeToLog (const String& message) -{ - if (currentLogger != nullptr) - currentLogger->logMessage (message); - else - outputDebugString (message); -} - -#if JUCE_LOG_ASSERTIONS || JUCE_DEBUG -void JUCE_API JUCE_CALLTYPE logAssertion (const char* const filename, const int lineNum) noexcept -{ - String m ("JUCE Assertion failure in "); - m << File::createFileWithoutCheckingPath (filename).getFileName() << ':' << lineNum; - - #if JUCE_LOG_ASSERTIONS - Logger::writeToLog (m); - #else - DBG (m); - #endif -} -#endif diff --git a/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h b/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h deleted file mode 100755 index d0d3af5..0000000 --- a/JuceLibraryCode/modules/juce_core/logging/juce_Logger.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_LOGGER_H_INCLUDED -#define JUCE_LOGGER_H_INCLUDED - - -//============================================================================== -/** - Acts as an application-wide logging class. - - A subclass of Logger can be created and passed into the Logger::setCurrentLogger - method and this will then be used by all calls to writeToLog. - - The logger class also contains methods for writing messages to the debugger's - output stream. - - @see FileLogger -*/ -class JUCE_API Logger -{ -public: - //============================================================================== - /** Destructor. */ - virtual ~Logger(); - - //============================================================================== - /** Sets the current logging class to use. - - Note that the object passed in will not be owned or deleted by the logger, so - the caller must make sure that it is not deleted while still being used. - A null pointer can be passed-in to disable any logging. - */ - static void JUCE_CALLTYPE setCurrentLogger (Logger* newLogger) noexcept; - - /** Returns the current logger, or nullptr if none has been set. */ - static Logger* getCurrentLogger() noexcept; - - /** Writes a string to the current logger. - - This will pass the string to the logger's logMessage() method if a logger - has been set. - - @see logMessage - */ - static void JUCE_CALLTYPE writeToLog (const String& message); - - - //============================================================================== - /** Writes a message to the standard error stream. - - This can be called directly, or by using the DBG() macro in - juce_PlatformDefs.h (which will avoid calling the method in non-debug builds). - */ - static void JUCE_CALLTYPE outputDebugString (const String& text); - - -protected: - //============================================================================== - Logger(); - - /** This is overloaded by subclasses to implement custom logging behaviour. - @see setCurrentLogger - */ - virtual void logMessage (const String& message) = 0; - -private: - static Logger* currentLogger; -}; - - -#endif // JUCE_LOGGER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp b/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp deleted file mode 100755 index dd09616..0000000 --- a/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.cpp +++ /dev/null @@ -1,1014 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -namespace -{ - inline size_t bitToIndex (const int bit) noexcept { return (size_t) (bit >> 5); } - inline uint32 bitToMask (const int bit) noexcept { return (uint32) 1 << (bit & 31); } -} - -//============================================================================== -BigInteger::BigInteger() - : numValues (4), - highestBit (-1), - negative (false) -{ - values.calloc (numValues + 1); -} - -BigInteger::BigInteger (const int32 value) - : numValues (4), - highestBit (31), - negative (value < 0) -{ - values.calloc (numValues + 1); - values[0] = (uint32) abs (value); - highestBit = getHighestBit(); -} - -BigInteger::BigInteger (const uint32 value) - : numValues (4), - highestBit (31), - negative (false) -{ - values.calloc (numValues + 1); - values[0] = value; - highestBit = getHighestBit(); -} - -BigInteger::BigInteger (int64 value) - : numValues (4), - highestBit (63), - negative (value < 0) -{ - values.calloc (numValues + 1); - - if (value < 0) - value = -value; - - values[0] = (uint32) value; - values[1] = (uint32) (value >> 32); - highestBit = getHighestBit(); -} - -BigInteger::BigInteger (const BigInteger& other) - : numValues ((size_t) jmax ((size_t) 4, bitToIndex (other.highestBit) + 1)), - highestBit (other.getHighestBit()), - negative (other.negative) -{ - values.malloc (numValues + 1); - memcpy (values, other.values, sizeof (uint32) * (numValues + 1)); -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -BigInteger::BigInteger (BigInteger&& other) noexcept - : values (static_cast &&> (other.values)), - numValues (other.numValues), - highestBit (other.highestBit), - negative (other.negative) -{ -} - -BigInteger& BigInteger::operator= (BigInteger&& other) noexcept -{ - values = static_cast &&> (other.values); - numValues = other.numValues; - highestBit = other.highestBit; - negative = other.negative; - return *this; -} -#endif - -BigInteger::~BigInteger() -{ -} - -void BigInteger::swapWith (BigInteger& other) noexcept -{ - values.swapWith (other.values); - std::swap (numValues, other.numValues); - std::swap (highestBit, other.highestBit); - std::swap (negative, other.negative); -} - -BigInteger& BigInteger::operator= (const BigInteger& other) -{ - if (this != &other) - { - highestBit = other.getHighestBit(); - jassert (other.numValues >= 4); - numValues = (size_t) jmax ((size_t) 4, bitToIndex (highestBit) + 1); - negative = other.negative; - values.malloc (numValues + 1); - memcpy (values, other.values, sizeof (uint32) * (numValues + 1)); - } - - return *this; -} - -void BigInteger::ensureSize (const size_t numVals) -{ - if (numVals + 2 >= numValues) - { - size_t oldSize = numValues; - numValues = ((numVals + 2) * 3) / 2; - values.realloc (numValues + 1); - - while (oldSize < numValues) - values [oldSize++] = 0; - } -} - -//============================================================================== -bool BigInteger::operator[] (const int bit) const noexcept -{ - return bit <= highestBit && bit >= 0 - && ((values [bitToIndex (bit)] & bitToMask (bit)) != 0); -} - -int BigInteger::toInteger() const noexcept -{ - const int n = (int) (values[0] & 0x7fffffff); - return negative ? -n : n; -} - -int64 BigInteger::toInt64() const noexcept -{ - const int64 n = (((int64) (values[1] & 0x7fffffff)) << 32) | values[0]; - return negative ? -n : n; -} - -BigInteger BigInteger::getBitRange (int startBit, int numBits) const -{ - BigInteger r; - numBits = jmin (numBits, getHighestBit() + 1 - startBit); - r.ensureSize ((size_t) bitToIndex (numBits)); - r.highestBit = numBits; - - int i = 0; - while (numBits > 0) - { - r.values[i++] = getBitRangeAsInt (startBit, (int) jmin (32, numBits)); - numBits -= 32; - startBit += 32; - } - - r.highestBit = r.getHighestBit(); - return r; -} - -uint32 BigInteger::getBitRangeAsInt (const int startBit, int numBits) const noexcept -{ - if (numBits > 32) - { - jassertfalse; // use getBitRange() if you need more than 32 bits.. - numBits = 32; - } - - numBits = jmin (numBits, highestBit + 1 - startBit); - - if (numBits <= 0) - return 0; - - const size_t pos = bitToIndex (startBit); - const int offset = startBit & 31; - const int endSpace = 32 - numBits; - - uint32 n = ((uint32) values [pos]) >> offset; - - if (offset > endSpace) - n |= ((uint32) values [pos + 1]) << (32 - offset); - - return n & (((uint32) 0xffffffff) >> endSpace); -} - -void BigInteger::setBitRangeAsInt (const int startBit, int numBits, uint32 valueToSet) -{ - if (numBits > 32) - { - jassertfalse; - numBits = 32; - } - - for (int i = 0; i < numBits; ++i) - { - setBit (startBit + i, (valueToSet & 1) != 0); - valueToSet >>= 1; - } -} - -//============================================================================== -void BigInteger::clear() -{ - if (numValues > 16) - { - numValues = 4; - values.calloc (numValues + 1); - } - else - { - values.clear (numValues + 1); - } - - highestBit = -1; - negative = false; -} - -void BigInteger::setBit (const int bit) -{ - if (bit >= 0) - { - if (bit > highestBit) - { - ensureSize (bitToIndex (bit)); - highestBit = bit; - } - - values [bitToIndex (bit)] |= bitToMask (bit); - } -} - -void BigInteger::setBit (const int bit, const bool shouldBeSet) -{ - if (shouldBeSet) - setBit (bit); - else - clearBit (bit); -} - -void BigInteger::clearBit (const int bit) noexcept -{ - if (bit >= 0 && bit <= highestBit) - values [bitToIndex (bit)] &= ~bitToMask (bit); -} - -void BigInteger::setRange (int startBit, int numBits, const bool shouldBeSet) -{ - while (--numBits >= 0) - setBit (startBit++, shouldBeSet); -} - -void BigInteger::insertBit (const int bit, const bool shouldBeSet) -{ - if (bit >= 0) - shiftBits (1, bit); - - setBit (bit, shouldBeSet); -} - -//============================================================================== -bool BigInteger::isZero() const noexcept -{ - return getHighestBit() < 0; -} - -bool BigInteger::isOne() const noexcept -{ - return getHighestBit() == 0 && ! negative; -} - -bool BigInteger::isNegative() const noexcept -{ - return negative && ! isZero(); -} - -void BigInteger::setNegative (const bool neg) noexcept -{ - negative = neg; -} - -void BigInteger::negate() noexcept -{ - negative = (! negative) && ! isZero(); -} - -#if JUCE_USE_MSVC_INTRINSICS && ! defined (__INTEL_COMPILER) - #pragma intrinsic (_BitScanReverse) -#endif - -inline static int highestBitInInt (uint32 n) noexcept -{ - jassert (n != 0); // (the built-in functions may not work for n = 0) - - #if JUCE_GCC - return 31 - __builtin_clz (n); - #elif JUCE_USE_MSVC_INTRINSICS - unsigned long highest; - _BitScanReverse (&highest, n); - return (int) highest; - #else - n |= (n >> 1); - n |= (n >> 2); - n |= (n >> 4); - n |= (n >> 8); - n |= (n >> 16); - return countBitsInInt32 (n >> 1); - #endif -} - -int BigInteger::countNumberOfSetBits() const noexcept -{ - int total = 0; - - for (int i = (int) bitToIndex (highestBit) + 1; --i >= 0;) - total += countNumberOfBits (values[i]); - - return total; -} - -int BigInteger::getHighestBit() const noexcept -{ - for (int i = (int) bitToIndex (highestBit + 1); i >= 0; --i) - { - const uint32 n = values[i]; - - if (n != 0) - return highestBitInInt (n) + (i << 5); - } - - return -1; -} - -int BigInteger::findNextSetBit (int i) const noexcept -{ - for (; i <= highestBit; ++i) - if ((values [bitToIndex (i)] & bitToMask (i)) != 0) - return i; - - return -1; -} - -int BigInteger::findNextClearBit (int i) const noexcept -{ - for (; i <= highestBit; ++i) - if ((values [bitToIndex (i)] & bitToMask (i)) == 0) - break; - - return i; -} - -//============================================================================== -BigInteger& BigInteger::operator+= (const BigInteger& other) -{ - if (other.isNegative()) - return operator-= (-other); - - if (isNegative()) - { - if (compareAbsolute (other) < 0) - { - BigInteger temp (*this); - temp.negate(); - *this = other; - operator-= (temp); - } - else - { - negate(); - operator-= (other); - negate(); - } - } - else - { - if (other.highestBit > highestBit) - highestBit = other.highestBit; - - ++highestBit; - - const size_t numInts = bitToIndex (highestBit) + 1; - ensureSize (numInts); - - int64 remainder = 0; - - for (size_t i = 0; i <= numInts; ++i) - { - if (i < numValues) - remainder += values[i]; - - if (i < other.numValues) - remainder += other.values[i]; - - values[i] = (uint32) remainder; - remainder >>= 32; - } - - jassert (remainder == 0); - highestBit = getHighestBit(); - } - - return *this; -} - -BigInteger& BigInteger::operator-= (const BigInteger& other) -{ - if (other.isNegative()) - return operator+= (-other); - - if (! isNegative()) - { - if (compareAbsolute (other) < 0) - { - BigInteger temp (other); - swapWith (temp); - operator-= (temp); - negate(); - return *this; - } - } - else - { - negate(); - operator+= (other); - negate(); - return *this; - } - - const size_t numInts = bitToIndex (highestBit) + 1; - const size_t maxOtherInts = bitToIndex (other.highestBit) + 1; - int64 amountToSubtract = 0; - - for (size_t i = 0; i <= numInts; ++i) - { - if (i <= maxOtherInts) - amountToSubtract += (int64) other.values[i]; - - if (values[i] >= amountToSubtract) - { - values[i] = (uint32) (values[i] - amountToSubtract); - amountToSubtract = 0; - } - else - { - const int64 n = ((int64) values[i] + (((int64) 1) << 32)) - amountToSubtract; - values[i] = (uint32) n; - amountToSubtract = 1; - } - } - - return *this; -} - -BigInteger& BigInteger::operator*= (const BigInteger& other) -{ - BigInteger total; - highestBit = getHighestBit(); - const bool wasNegative = isNegative(); - setNegative (false); - - for (int i = 0; i <= highestBit; ++i) - { - if (operator[](i)) - { - BigInteger n (other); - n.setNegative (false); - n <<= i; - total += n; - } - } - - total.setNegative (wasNegative ^ other.isNegative()); - swapWith (total); - return *this; -} - -void BigInteger::divideBy (const BigInteger& divisor, BigInteger& remainder) -{ - jassert (this != &remainder); // (can't handle passing itself in to get the remainder) - - const int divHB = divisor.getHighestBit(); - const int ourHB = getHighestBit(); - - if (divHB < 0 || ourHB < 0) - { - // division by zero - remainder.clear(); - clear(); - } - else - { - const bool wasNegative = isNegative(); - - swapWith (remainder); - remainder.setNegative (false); - clear(); - - BigInteger temp (divisor); - temp.setNegative (false); - - int leftShift = ourHB - divHB; - temp <<= leftShift; - - while (leftShift >= 0) - { - if (remainder.compareAbsolute (temp) >= 0) - { - remainder -= temp; - setBit (leftShift); - } - - if (--leftShift >= 0) - temp >>= 1; - } - - negative = wasNegative ^ divisor.isNegative(); - remainder.setNegative (wasNegative); - } -} - -BigInteger& BigInteger::operator/= (const BigInteger& other) -{ - BigInteger remainder; - divideBy (other, remainder); - return *this; -} - -BigInteger& BigInteger::operator|= (const BigInteger& other) -{ - // this operation doesn't take into account negative values.. - jassert (isNegative() == other.isNegative()); - - if (other.highestBit >= 0) - { - ensureSize (bitToIndex (other.highestBit)); - - int n = (int) bitToIndex (other.highestBit) + 1; - - while (--n >= 0) - values[n] |= other.values[n]; - - if (other.highestBit > highestBit) - highestBit = other.highestBit; - - highestBit = getHighestBit(); - } - - return *this; -} - -BigInteger& BigInteger::operator&= (const BigInteger& other) -{ - // this operation doesn't take into account negative values.. - jassert (isNegative() == other.isNegative()); - - int n = (int) numValues; - - while (n > (int) other.numValues) - values[--n] = 0; - - while (--n >= 0) - values[n] &= other.values[n]; - - if (other.highestBit < highestBit) - highestBit = other.highestBit; - - highestBit = getHighestBit(); - return *this; -} - -BigInteger& BigInteger::operator^= (const BigInteger& other) -{ - // this operation will only work with the absolute values - jassert (isNegative() == other.isNegative()); - - if (other.highestBit >= 0) - { - ensureSize (bitToIndex (other.highestBit)); - - int n = (int) bitToIndex (other.highestBit) + 1; - - while (--n >= 0) - values[n] ^= other.values[n]; - - if (other.highestBit > highestBit) - highestBit = other.highestBit; - - highestBit = getHighestBit(); - } - - return *this; -} - -BigInteger& BigInteger::operator%= (const BigInteger& divisor) -{ - BigInteger remainder; - divideBy (divisor, remainder); - swapWith (remainder); - return *this; -} - -BigInteger& BigInteger::operator++() { return operator+= (1); } -BigInteger& BigInteger::operator--() { return operator-= (1); } -BigInteger BigInteger::operator++ (int) { const BigInteger old (*this); operator+= (1); return old; } -BigInteger BigInteger::operator-- (int) { const BigInteger old (*this); operator-= (1); return old; } - -BigInteger BigInteger::operator-() const { BigInteger b (*this); b.negate(); return b; } -BigInteger BigInteger::operator+ (const BigInteger& other) const { BigInteger b (*this); return b += other; } -BigInteger BigInteger::operator- (const BigInteger& other) const { BigInteger b (*this); return b -= other; } -BigInteger BigInteger::operator* (const BigInteger& other) const { BigInteger b (*this); return b *= other; } -BigInteger BigInteger::operator/ (const BigInteger& other) const { BigInteger b (*this); return b /= other; } -BigInteger BigInteger::operator| (const BigInteger& other) const { BigInteger b (*this); return b |= other; } -BigInteger BigInteger::operator& (const BigInteger& other) const { BigInteger b (*this); return b &= other; } -BigInteger BigInteger::operator^ (const BigInteger& other) const { BigInteger b (*this); return b ^= other; } -BigInteger BigInteger::operator% (const BigInteger& other) const { BigInteger b (*this); return b %= other; } -BigInteger BigInteger::operator<< (const int numBits) const { BigInteger b (*this); return b <<= numBits; } -BigInteger BigInteger::operator>> (const int numBits) const { BigInteger b (*this); return b >>= numBits; } -BigInteger& BigInteger::operator<<= (const int numBits) { shiftBits (numBits, 0); return *this; } -BigInteger& BigInteger::operator>>= (const int numBits) { shiftBits (-numBits, 0); return *this; } - -//============================================================================== -int BigInteger::compare (const BigInteger& other) const noexcept -{ - if (isNegative() == other.isNegative()) - { - const int absComp = compareAbsolute (other); - return isNegative() ? -absComp : absComp; - } - else - { - return isNegative() ? -1 : 1; - } -} - -int BigInteger::compareAbsolute (const BigInteger& other) const noexcept -{ - const int h1 = getHighestBit(); - const int h2 = other.getHighestBit(); - - if (h1 > h2) - return 1; - else if (h1 < h2) - return -1; - - for (int i = (int) bitToIndex (h1) + 1; --i >= 0;) - if (values[i] != other.values[i]) - return (values[i] > other.values[i]) ? 1 : -1; - - return 0; -} - -bool BigInteger::operator== (const BigInteger& other) const noexcept { return compare (other) == 0; } -bool BigInteger::operator!= (const BigInteger& other) const noexcept { return compare (other) != 0; } -bool BigInteger::operator< (const BigInteger& other) const noexcept { return compare (other) < 0; } -bool BigInteger::operator<= (const BigInteger& other) const noexcept { return compare (other) <= 0; } -bool BigInteger::operator> (const BigInteger& other) const noexcept { return compare (other) > 0; } -bool BigInteger::operator>= (const BigInteger& other) const noexcept { return compare (other) >= 0; } - -//============================================================================== -void BigInteger::shiftLeft (int bits, const int startBit) -{ - if (startBit > 0) - { - for (int i = highestBit + 1; --i >= startBit;) - setBit (i + bits, operator[] (i)); - - while (--bits >= 0) - clearBit (bits + startBit); - } - else - { - ensureSize (bitToIndex (highestBit + bits) + 1); - - const size_t wordsToMove = bitToIndex (bits); - size_t top = 1 + bitToIndex (highestBit); - highestBit += bits; - - if (wordsToMove > 0) - { - for (int i = (int) top; --i >= 0;) - values [(size_t) i + wordsToMove] = values [i]; - - for (size_t j = 0; j < wordsToMove; ++j) - values [j] = 0; - - bits &= 31; - } - - if (bits != 0) - { - const int invBits = 32 - bits; - - for (size_t i = top + 1 + wordsToMove; --i > wordsToMove;) - values[i] = (values[i] << bits) | (values [i - 1] >> invBits); - - values [wordsToMove] = values [wordsToMove] << bits; - } - - highestBit = getHighestBit(); - } -} - -void BigInteger::shiftRight (int bits, const int startBit) -{ - if (startBit > 0) - { - for (int i = startBit; i <= highestBit; ++i) - setBit (i, operator[] (i + bits)); - - highestBit = getHighestBit(); - } - else - { - if (bits > highestBit) - { - clear(); - } - else - { - const size_t wordsToMove = bitToIndex (bits); - size_t top = 1 + bitToIndex (highestBit) - wordsToMove; - highestBit -= bits; - - if (wordsToMove > 0) - { - size_t i; - for (i = 0; i < top; ++i) - values [i] = values [i + wordsToMove]; - - for (i = 0; i < wordsToMove; ++i) - values [top + i] = 0; - - bits &= 31; - } - - if (bits != 0) - { - const int invBits = 32 - bits; - - --top; - for (size_t i = 0; i < top; ++i) - values[i] = (values[i] >> bits) | (values [i + 1] << invBits); - - values[top] = (values[top] >> bits); - } - - highestBit = getHighestBit(); - } - } -} - -void BigInteger::shiftBits (int bits, const int startBit) -{ - if (highestBit >= 0) - { - if (bits < 0) - shiftRight (-bits, startBit); - else if (bits > 0) - shiftLeft (bits, startBit); - } -} - -//============================================================================== -static BigInteger simpleGCD (BigInteger* m, BigInteger* n) -{ - while (! m->isZero()) - { - if (n->compareAbsolute (*m) > 0) - std::swap (m, n); - - *m -= *n; - } - - return *n; -} - -BigInteger BigInteger::findGreatestCommonDivisor (BigInteger n) const -{ - BigInteger m (*this); - - while (! n.isZero()) - { - if (abs (m.getHighestBit() - n.getHighestBit()) <= 16) - return simpleGCD (&m, &n); - - BigInteger temp2; - m.divideBy (n, temp2); - - m.swapWith (n); - n.swapWith (temp2); - } - - return m; -} - -void BigInteger::exponentModulo (const BigInteger& exponent, const BigInteger& modulus) -{ - BigInteger exp (exponent); - exp %= modulus; - - BigInteger value (1); - swapWith (value); - value %= modulus; - - while (! exp.isZero()) - { - if (exp [0]) - { - operator*= (value); - operator%= (modulus); - } - - value *= value; - value %= modulus; - exp >>= 1; - } -} - -void BigInteger::inverseModulo (const BigInteger& modulus) -{ - if (modulus.isOne() || modulus.isNegative()) - { - clear(); - return; - } - - if (isNegative() || compareAbsolute (modulus) >= 0) - operator%= (modulus); - - if (isOne()) - return; - - if (! (*this)[0]) - { - // not invertible - clear(); - return; - } - - BigInteger a1 (modulus); - BigInteger a2 (*this); - BigInteger b1 (modulus); - BigInteger b2 (1); - - while (! a2.isOne()) - { - BigInteger temp1, multiplier (a1); - multiplier.divideBy (a2, temp1); - - temp1 = a2; - temp1 *= multiplier; - BigInteger temp2 (a1); - temp2 -= temp1; - a1 = a2; - a2 = temp2; - - temp1 = b2; - temp1 *= multiplier; - temp2 = b1; - temp2 -= temp1; - b1 = b2; - b2 = temp2; - } - - while (b2.isNegative()) - b2 += modulus; - - b2 %= modulus; - swapWith (b2); -} - -//============================================================================== -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const BigInteger& value) -{ - return stream << value.toString (10); -} - -String BigInteger::toString (const int base, const int minimumNumCharacters) const -{ - String s; - BigInteger v (*this); - - if (base == 2 || base == 8 || base == 16) - { - const int bits = (base == 2) ? 1 : (base == 8 ? 3 : 4); - static const char hexDigits[] = "0123456789abcdef"; - - for (;;) - { - const uint32 remainder = v.getBitRangeAsInt (0, bits); - - v >>= bits; - - if (remainder == 0 && v.isZero()) - break; - - s = String::charToString ((juce_wchar) (uint8) hexDigits [remainder]) + s; - } - } - else if (base == 10) - { - const BigInteger ten (10); - BigInteger remainder; - - for (;;) - { - v.divideBy (ten, remainder); - - if (remainder.isZero() && v.isZero()) - break; - - s = String (remainder.getBitRangeAsInt (0, 8)) + s; - } - } - else - { - jassertfalse; // can't do the specified base! - return String(); - } - - s = s.paddedLeft ('0', minimumNumCharacters); - - return isNegative() ? "-" + s : s; -} - -void BigInteger::parseString (StringRef text, const int base) -{ - clear(); - String::CharPointerType t (text.text.findEndOfWhitespace()); - - setNegative (*t == (juce_wchar) '-'); - - if (base == 2 || base == 8 || base == 16) - { - const int bits = (base == 2) ? 1 : (base == 8 ? 3 : 4); - - for (;;) - { - const juce_wchar c = t.getAndAdvance(); - const int digit = CharacterFunctions::getHexDigitValue (c); - - if (((uint32) digit) < (uint32) base) - { - operator<<= (bits); - operator+= (digit); - } - else if (c == 0) - { - break; - } - } - } - else if (base == 10) - { - const BigInteger ten ((uint32) 10); - - for (;;) - { - const juce_wchar c = t.getAndAdvance(); - - if (c >= '0' && c <= '9') - { - operator*= (ten); - operator+= ((int) (c - '0')); - } - else if (c == 0) - { - break; - } - } - } -} - -MemoryBlock BigInteger::toMemoryBlock() const -{ - const int numBytes = (getHighestBit() + 8) >> 3; - MemoryBlock mb ((size_t) numBytes); - - for (int i = 0; i < numBytes; ++i) - mb[i] = (char) getBitRangeAsInt (i << 3, 8); - - return mb; -} - -void BigInteger::loadFromMemoryBlock (const MemoryBlock& data) -{ - clear(); - - for (int i = (int) data.getSize(); --i >= 0;) - this->setBitRangeAsInt (i << 3, 8, (uint32) data [i]); -} diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h b/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h deleted file mode 100755 index 4c6c25c..0000000 --- a/JuceLibraryCode/modules/juce_core/maths/juce_BigInteger.h +++ /dev/null @@ -1,334 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_BIGINTEGER_H_INCLUDED -#define JUCE_BIGINTEGER_H_INCLUDED - - -//============================================================================== -/** - An arbitrarily large integer class. - - A BigInteger can be used in a similar way to a normal integer, but has no size - limit (except for memory and performance constraints). - - Negative values are possible, but the value isn't stored as 2s-complement, so - be careful if you use negative values and look at the values of individual bits. -*/ -class JUCE_API BigInteger -{ -public: - //============================================================================== - /** Creates an empty BigInteger */ - BigInteger(); - - /** Creates a BigInteger containing an integer value in its low bits. - The low 32 bits of the number are initialised with this value. - */ - BigInteger (uint32 value); - - /** Creates a BigInteger containing an integer value in its low bits. - The low 32 bits of the number are initialised with the absolute value - passed in, and its sign is set to reflect the sign of the number. - */ - BigInteger (int32 value); - - /** Creates a BigInteger containing an integer value in its low bits. - The low 64 bits of the number are initialised with the absolute value - passed in, and its sign is set to reflect the sign of the number. - */ - BigInteger (int64 value); - - /** Creates a copy of another BigInteger. */ - BigInteger (const BigInteger&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - BigInteger (BigInteger&&) noexcept; - BigInteger& operator= (BigInteger&&) noexcept; - #endif - - /** Destructor. */ - ~BigInteger(); - - //============================================================================== - /** Copies another BigInteger onto this one. */ - BigInteger& operator= (const BigInteger&); - - /** Swaps the internal contents of this with another object. */ - void swapWith (BigInteger&) noexcept; - - //============================================================================== - /** Returns the value of a specified bit in the number. - If the index is out-of-range, the result will be false. - */ - bool operator[] (int bit) const noexcept; - - /** Returns true if no bits are set. */ - bool isZero() const noexcept; - - /** Returns true if the value is 1. */ - bool isOne() const noexcept; - - /** Attempts to get the lowest 32 bits of the value as an integer. - If the value is bigger than the integer limits, this will return only the lower bits. - */ - int toInteger() const noexcept; - - /** Attempts to get the lowest 64 bits of the value as an integer. - If the value is bigger than the integer limits, this will return only the lower bits. - */ - int64 toInt64() const noexcept; - - //============================================================================== - /** Resets the value to 0. */ - void clear(); - - /** Clears a particular bit in the number. */ - void clearBit (int bitNumber) noexcept; - - /** Sets a specified bit to 1. */ - void setBit (int bitNumber); - - /** Sets or clears a specified bit. */ - void setBit (int bitNumber, bool shouldBeSet); - - /** Sets a range of bits to be either on or off. - - @param startBit the first bit to change - @param numBits the number of bits to change - @param shouldBeSet whether to turn these bits on or off - */ - void setRange (int startBit, int numBits, bool shouldBeSet); - - /** Inserts a bit an a given position, shifting up any bits above it. */ - void insertBit (int bitNumber, bool shouldBeSet); - - /** Returns a range of bits as a new BigInteger. - - e.g. getBitRangeAsInt (0, 64) would return the lowest 64 bits. - @see getBitRangeAsInt - */ - BigInteger getBitRange (int startBit, int numBits) const; - - /** Returns a range of bits as an integer value. - - e.g. getBitRangeAsInt (0, 32) would return the lowest 32 bits. - - Asking for more than 32 bits isn't allowed (obviously) - for that, use - getBitRange(). - */ - uint32 getBitRangeAsInt (int startBit, int numBits) const noexcept; - - /** Sets a range of bits to an integer value. - - Copies the given integer onto a range of bits, starting at startBit, - and using up to numBits of the available bits. - */ - void setBitRangeAsInt (int startBit, int numBits, uint32 valueToSet); - - /** Shifts a section of bits left or right. - - @param howManyBitsLeft how far to move the bits (+ve numbers shift it left, -ve numbers shift it right). - @param startBit the first bit to affect - if this is > 0, only bits above that index will be affected. - */ - void shiftBits (int howManyBitsLeft, int startBit); - - /** Returns the total number of set bits in the value. */ - int countNumberOfSetBits() const noexcept; - - /** Looks for the index of the next set bit after a given starting point. - - This searches from startIndex (inclusive) upwards for the first set bit, - and returns its index. If no set bits are found, it returns -1. - */ - int findNextSetBit (int startIndex) const noexcept; - - /** Looks for the index of the next clear bit after a given starting point. - - This searches from startIndex (inclusive) upwards for the first clear bit, - and returns its index. - */ - int findNextClearBit (int startIndex) const noexcept; - - /** Returns the index of the highest set bit in the number. - If the value is zero, this will return -1. - */ - int getHighestBit() const noexcept; - - //============================================================================== - // All the standard arithmetic ops... - - BigInteger& operator+= (const BigInteger&); - BigInteger& operator-= (const BigInteger&); - BigInteger& operator*= (const BigInteger&); - BigInteger& operator/= (const BigInteger&); - BigInteger& operator|= (const BigInteger&); - BigInteger& operator&= (const BigInteger&); - BigInteger& operator^= (const BigInteger&); - BigInteger& operator%= (const BigInteger&); - BigInteger& operator<<= (int numBitsToShift); - BigInteger& operator>>= (int numBitsToShift); - BigInteger& operator++(); - BigInteger& operator--(); - BigInteger operator++ (int); - BigInteger operator-- (int); - - BigInteger operator-() const; - BigInteger operator+ (const BigInteger&) const; - BigInteger operator- (const BigInteger&) const; - BigInteger operator* (const BigInteger&) const; - BigInteger operator/ (const BigInteger&) const; - BigInteger operator| (const BigInteger&) const; - BigInteger operator& (const BigInteger&) const; - BigInteger operator^ (const BigInteger&) const; - BigInteger operator% (const BigInteger&) const; - BigInteger operator<< (int numBitsToShift) const; - BigInteger operator>> (int numBitsToShift) const; - - bool operator== (const BigInteger&) const noexcept; - bool operator!= (const BigInteger&) const noexcept; - bool operator< (const BigInteger&) const noexcept; - bool operator<= (const BigInteger&) const noexcept; - bool operator> (const BigInteger&) const noexcept; - bool operator>= (const BigInteger&) const noexcept; - - //============================================================================== - /** Does a signed comparison of two BigIntegers. - - Return values are: - - 0 if the numbers are the same - - < 0 if this number is smaller than the other - - > 0 if this number is bigger than the other - */ - int compare (const BigInteger& other) const noexcept; - - /** Compares the magnitudes of two BigIntegers, ignoring their signs. - - Return values are: - - 0 if the numbers are the same - - < 0 if this number is smaller than the other - - > 0 if this number is bigger than the other - */ - int compareAbsolute (const BigInteger& other) const noexcept; - - /** Divides this value by another one and returns the remainder. - - This number is divided by other, leaving the quotient in this number, - with the remainder being copied to the other BigInteger passed in. - */ - void divideBy (const BigInteger& divisor, BigInteger& remainder); - - /** Returns the largest value that will divide both this value and the one passed-in. */ - BigInteger findGreatestCommonDivisor (BigInteger other) const; - - /** Performs a combined exponent and modulo operation. - This BigInteger's value becomes (this ^ exponent) % modulus. - */ - void exponentModulo (const BigInteger& exponent, const BigInteger& modulus); - - /** Performs an inverse modulo on the value. - i.e. the result is (this ^ -1) mod (modulus). - */ - void inverseModulo (const BigInteger& modulus); - - //============================================================================== - /** Returns true if the value is less than zero. - @see setNegative, negate - */ - bool isNegative() const noexcept; - - /** Changes the sign of the number to be positive or negative. - @see isNegative, negate - */ - void setNegative (bool shouldBeNegative) noexcept; - - /** Inverts the sign of the number. - @see isNegative, setNegative - */ - void negate() noexcept; - - //============================================================================== - /** Converts the number to a string. - - Specify a base such as 2 (binary), 8 (octal), 10 (decimal), 16 (hex). - If minimumNumCharacters is greater than 0, the returned string will be - padded with leading zeros to reach at least that length. - */ - String toString (int base, int minimumNumCharacters = 1) const; - - /** Reads the numeric value from a string. - - Specify a base such as 2 (binary), 8 (octal), 10 (decimal), 16 (hex). - Any invalid characters will be ignored. - */ - void parseString (StringRef text, int base); - - //============================================================================== - /** Turns the number into a block of binary data. - - The data is arranged as little-endian, so the first byte of data is the low 8 bits - of the number, and so on. - - @see loadFromMemoryBlock - */ - MemoryBlock toMemoryBlock() const; - - /** Converts a block of raw data into a number. - - The data is arranged as little-endian, so the first byte of data is the low 8 bits - of the number, and so on. - - @see toMemoryBlock - */ - void loadFromMemoryBlock (const MemoryBlock& data); - -private: - //============================================================================== - HeapBlock values; - size_t numValues; - int highestBit; - bool negative; - - void ensureSize (size_t); - void shiftLeft (int bits, int startBit); - void shiftRight (int bits, int startBit); - - JUCE_LEAK_DETECTOR (BigInteger) -}; - -/** Writes a BigInteger to an OutputStream as a UTF8 decimal string. */ -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const BigInteger& value); - -//============================================================================== -#ifndef DOXYGEN - // For backwards compatibility, BitArray is defined as an alias for BigInteger. - typedef BigInteger BitArray; -#endif - - -#endif // JUCE_BIGINTEGER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp b/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp deleted file mode 100755 index 632b90a..0000000 --- a/JuceLibraryCode/modules/juce_core/maths/juce_Expression.cpp +++ /dev/null @@ -1,1183 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -class Expression::Term : public SingleThreadedReferenceCountedObject -{ -public: - Term() {} - virtual ~Term() {} - - virtual Type getType() const noexcept = 0; - virtual Term* clone() const = 0; - virtual ReferenceCountedObjectPtr resolve (const Scope&, int recursionDepth) = 0; - virtual String toString() const = 0; - virtual double toDouble() const { return 0; } - virtual int getInputIndexFor (const Term*) const { return -1; } - virtual int getOperatorPrecedence() const { return 0; } - virtual int getNumInputs() const { return 0; } - virtual Term* getInput (int) const { return nullptr; } - virtual ReferenceCountedObjectPtr negated(); - - virtual ReferenceCountedObjectPtr createTermToEvaluateInput (const Scope&, const Term* /*inputTerm*/, - double /*overallTarget*/, Term* /*topLevelTerm*/) const - { - jassertfalse; - return ReferenceCountedObjectPtr(); - } - - virtual String getName() const - { - jassertfalse; // You shouldn't call this for an expression that's not actually a function! - return String(); - } - - virtual void renameSymbol (const Symbol& oldSymbol, const String& newName, const Scope& scope, int recursionDepth) - { - for (int i = getNumInputs(); --i >= 0;) - getInput (i)->renameSymbol (oldSymbol, newName, scope, recursionDepth); - } - - class SymbolVisitor - { - public: - virtual ~SymbolVisitor() {} - virtual void useSymbol (const Symbol&) = 0; - }; - - virtual void visitAllSymbols (SymbolVisitor& visitor, const Scope& scope, int recursionDepth) - { - for (int i = getNumInputs(); --i >= 0;) - getInput(i)->visitAllSymbols (visitor, scope, recursionDepth); - } - -private: - JUCE_DECLARE_NON_COPYABLE (Term) -}; - - -//============================================================================== -struct Expression::Helpers -{ - typedef ReferenceCountedObjectPtr TermPtr; - - static void checkRecursionDepth (const int depth) - { - if (depth > 256) - throw EvaluationError ("Recursive symbol references"); - } - - friend class Expression::Term; - - //============================================================================== - /** An exception that can be thrown by Expression::evaluate(). */ - class EvaluationError : public std::exception - { - public: - EvaluationError (const String& desc) : description (desc) - { - DBG ("Expression::EvaluationError: " + description); - } - - String description; - }; - - //============================================================================== - class Constant : public Term - { - public: - Constant (const double val, const bool resolutionTarget) - : value (val), isResolutionTarget (resolutionTarget) {} - - Type getType() const noexcept { return constantType; } - Term* clone() const { return new Constant (value, isResolutionTarget); } - TermPtr resolve (const Scope&, int) { return this; } - double toDouble() const { return value; } - TermPtr negated() { return new Constant (-value, isResolutionTarget); } - - String toString() const - { - String s (value); - if (isResolutionTarget) - s = "@" + s; - - return s; - } - - double value; - bool isResolutionTarget; - }; - - //============================================================================== - class BinaryTerm : public Term - { - public: - BinaryTerm (Term* const l, Term* const r) : left (l), right (r) - { - jassert (l != nullptr && r != nullptr); - } - - int getInputIndexFor (const Term* possibleInput) const - { - return possibleInput == left ? 0 : (possibleInput == right ? 1 : -1); - } - - Type getType() const noexcept { return operatorType; } - int getNumInputs() const { return 2; } - Term* getInput (int index) const { return index == 0 ? left.get() : (index == 1 ? right.get() : 0); } - - virtual double performFunction (double left, double right) const = 0; - virtual void writeOperator (String& dest) const = 0; - - TermPtr resolve (const Scope& scope, int recursionDepth) - { - return new Constant (performFunction (left ->resolve (scope, recursionDepth)->toDouble(), - right->resolve (scope, recursionDepth)->toDouble()), false); - } - - String toString() const - { - String s; - - const int ourPrecendence = getOperatorPrecedence(); - if (left->getOperatorPrecedence() > ourPrecendence) - s << '(' << left->toString() << ')'; - else - s = left->toString(); - - writeOperator (s); - - if (right->getOperatorPrecedence() >= ourPrecendence) - s << '(' << right->toString() << ')'; - else - s << right->toString(); - - return s; - } - - protected: - const TermPtr left, right; - - TermPtr createDestinationTerm (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const - { - jassert (input == left || input == right); - if (input != left && input != right) - return TermPtr(); - - if (const Term* const dest = findDestinationFor (topLevelTerm, this)) - return dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm); - - return new Constant (overallTarget, false); - } - }; - - //============================================================================== - class SymbolTerm : public Term - { - public: - explicit SymbolTerm (const String& sym) : symbol (sym) {} - - TermPtr resolve (const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - return scope.getSymbolValue (symbol).term->resolve (scope, recursionDepth + 1); - } - - Type getType() const noexcept { return symbolType; } - Term* clone() const { return new SymbolTerm (symbol); } - String toString() const { return symbol; } - String getName() const { return symbol; } - - void visitAllSymbols (SymbolVisitor& visitor, const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - visitor.useSymbol (Symbol (scope.getScopeUID(), symbol)); - scope.getSymbolValue (symbol).term->visitAllSymbols (visitor, scope, recursionDepth + 1); - } - - void renameSymbol (const Symbol& oldSymbol, const String& newName, const Scope& scope, int /*recursionDepth*/) - { - if (oldSymbol.symbolName == symbol && scope.getScopeUID() == oldSymbol.scopeUID) - symbol = newName; - } - - String symbol; - }; - - //============================================================================== - class Function : public Term - { - public: - explicit Function (const String& name) : functionName (name) {} - - Function (const String& name, const Array& params) - : functionName (name), parameters (params) - {} - - Type getType() const noexcept { return functionType; } - Term* clone() const { return new Function (functionName, parameters); } - int getNumInputs() const { return parameters.size(); } - Term* getInput (int i) const { return parameters.getReference(i).term; } - String getName() const { return functionName; } - - TermPtr resolve (const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - double result = 0; - const int numParams = parameters.size(); - if (numParams > 0) - { - HeapBlock params ((size_t) numParams); - for (int i = 0; i < numParams; ++i) - params[i] = parameters.getReference(i).term->resolve (scope, recursionDepth + 1)->toDouble(); - - result = scope.evaluateFunction (functionName, params, numParams); - } - else - { - result = scope.evaluateFunction (functionName, nullptr, 0); - } - - return new Constant (result, false); - } - - int getInputIndexFor (const Term* possibleInput) const - { - for (int i = 0; i < parameters.size(); ++i) - if (parameters.getReference(i).term == possibleInput) - return i; - - return -1; - } - - String toString() const - { - if (parameters.size() == 0) - return functionName + "()"; - - String s (functionName + " ("); - - for (int i = 0; i < parameters.size(); ++i) - { - s << parameters.getReference(i).term->toString(); - - if (i < parameters.size() - 1) - s << ", "; - } - - s << ')'; - return s; - } - - const String functionName; - Array parameters; - }; - - //============================================================================== - class DotOperator : public BinaryTerm - { - public: - DotOperator (SymbolTerm* const l, Term* const r) : BinaryTerm (l, r) {} - - TermPtr resolve (const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - - EvaluationVisitor visitor (right, recursionDepth + 1); - scope.visitRelativeScope (getSymbol()->symbol, visitor); - return visitor.output; - } - - Term* clone() const { return new DotOperator (getSymbol(), right); } - String getName() const { return "."; } - int getOperatorPrecedence() const { return 1; } - void writeOperator (String& dest) const { dest << '.'; } - double performFunction (double, double) const { return 0.0; } - - void visitAllSymbols (SymbolVisitor& visitor, const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - visitor.useSymbol (Symbol (scope.getScopeUID(), getSymbol()->symbol)); - - SymbolVisitingVisitor v (right, visitor, recursionDepth + 1); - - try - { - scope.visitRelativeScope (getSymbol()->symbol, v); - } - catch (...) {} - } - - void renameSymbol (const Symbol& oldSymbol, const String& newName, const Scope& scope, int recursionDepth) - { - checkRecursionDepth (recursionDepth); - getSymbol()->renameSymbol (oldSymbol, newName, scope, recursionDepth); - - SymbolRenamingVisitor visitor (right, oldSymbol, newName, recursionDepth + 1); - - try - { - scope.visitRelativeScope (getSymbol()->symbol, visitor); - } - catch (...) {} - } - - private: - //============================================================================== - class EvaluationVisitor : public Scope::Visitor - { - public: - EvaluationVisitor (const TermPtr& t, const int recursion) - : input (t), output (t), recursionCount (recursion) {} - - void visit (const Scope& scope) { output = input->resolve (scope, recursionCount); } - - const TermPtr input; - TermPtr output; - const int recursionCount; - - private: - JUCE_DECLARE_NON_COPYABLE (EvaluationVisitor) - }; - - class SymbolVisitingVisitor : public Scope::Visitor - { - public: - SymbolVisitingVisitor (const TermPtr& t, SymbolVisitor& v, const int recursion) - : input (t), visitor (v), recursionCount (recursion) {} - - void visit (const Scope& scope) { input->visitAllSymbols (visitor, scope, recursionCount); } - - private: - const TermPtr input; - SymbolVisitor& visitor; - const int recursionCount; - - JUCE_DECLARE_NON_COPYABLE (SymbolVisitingVisitor) - }; - - class SymbolRenamingVisitor : public Scope::Visitor - { - public: - SymbolRenamingVisitor (const TermPtr& t, const Expression::Symbol& symbol_, const String& newName_, const int recursionCount_) - : input (t), symbol (symbol_), newName (newName_), recursionCount (recursionCount_) {} - - void visit (const Scope& scope) { input->renameSymbol (symbol, newName, scope, recursionCount); } - - private: - const TermPtr input; - const Symbol& symbol; - const String newName; - const int recursionCount; - - JUCE_DECLARE_NON_COPYABLE (SymbolRenamingVisitor) - }; - - SymbolTerm* getSymbol() const { return static_cast (left.get()); } - - JUCE_DECLARE_NON_COPYABLE (DotOperator) - }; - - //============================================================================== - class Negate : public Term - { - public: - explicit Negate (const TermPtr& t) : input (t) - { - jassert (t != nullptr); - } - - Type getType() const noexcept { return operatorType; } - int getInputIndexFor (const Term* possibleInput) const { return possibleInput == input ? 0 : -1; } - int getNumInputs() const { return 1; } - Term* getInput (int index) const { return index == 0 ? input.get() : nullptr; } - Term* clone() const { return new Negate (input->clone()); } - - TermPtr resolve (const Scope& scope, int recursionDepth) - { - return new Constant (-input->resolve (scope, recursionDepth)->toDouble(), false); - } - - String getName() const { return "-"; } - TermPtr negated() { return input; } - - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* t, double overallTarget, Term* topLevelTerm) const - { - (void) t; - jassert (t == input); - - const Term* const dest = findDestinationFor (topLevelTerm, this); - - return new Negate (dest == nullptr ? new Constant (overallTarget, false) - : dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm)); - } - - String toString() const - { - if (input->getOperatorPrecedence() > 0) - return "-(" + input->toString() + ")"; - - return "-" + input->toString(); - } - - private: - const TermPtr input; - }; - - //============================================================================== - class Add : public BinaryTerm - { - public: - Add (Term* const l, Term* const r) : BinaryTerm (l, r) {} - - Term* clone() const { return new Add (left->clone(), right->clone()); } - double performFunction (double lhs, double rhs) const { return lhs + rhs; } - int getOperatorPrecedence() const { return 3; } - String getName() const { return "+"; } - void writeOperator (String& dest) const { dest << " + "; } - - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const - { - const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm)); - if (newDest == nullptr) - return TermPtr(); - - return new Subtract (newDest, (input == left ? right : left)->clone()); - } - - private: - JUCE_DECLARE_NON_COPYABLE (Add) - }; - - //============================================================================== - class Subtract : public BinaryTerm - { - public: - Subtract (Term* const l, Term* const r) : BinaryTerm (l, r) {} - - Term* clone() const { return new Subtract (left->clone(), right->clone()); } - double performFunction (double lhs, double rhs) const { return lhs - rhs; } - int getOperatorPrecedence() const { return 3; } - String getName() const { return "-"; } - void writeOperator (String& dest) const { dest << " - "; } - - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const - { - const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm)); - if (newDest == nullptr) - return TermPtr(); - - if (input == left) - return new Add (newDest, right->clone()); - - return new Subtract (left->clone(), newDest); - } - - private: - JUCE_DECLARE_NON_COPYABLE (Subtract) - }; - - //============================================================================== - class Multiply : public BinaryTerm - { - public: - Multiply (Term* const l, Term* const r) : BinaryTerm (l, r) {} - - Term* clone() const { return new Multiply (left->clone(), right->clone()); } - double performFunction (double lhs, double rhs) const { return lhs * rhs; } - String getName() const { return "*"; } - void writeOperator (String& dest) const { dest << " * "; } - int getOperatorPrecedence() const { return 2; } - - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const - { - const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm)); - if (newDest == nullptr) - return TermPtr(); - - return new Divide (newDest, (input == left ? right : left)->clone()); - } - - private: - JUCE_DECLARE_NON_COPYABLE (Multiply) - }; - - //============================================================================== - class Divide : public BinaryTerm - { - public: - Divide (Term* const l, Term* const r) : BinaryTerm (l, r) {} - - Term* clone() const { return new Divide (left->clone(), right->clone()); } - double performFunction (double lhs, double rhs) const { return lhs / rhs; } - String getName() const { return "/"; } - void writeOperator (String& dest) const { dest << " / "; } - int getOperatorPrecedence() const { return 2; } - - TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const - { - const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm)); - if (newDest == nullptr) - return TermPtr(); - - if (input == left) - return new Multiply (newDest, right->clone()); - - return new Divide (left->clone(), newDest); - } - - private: - JUCE_DECLARE_NON_COPYABLE (Divide) - }; - - //============================================================================== - static Term* findDestinationFor (Term* const topLevel, const Term* const inputTerm) - { - const int inputIndex = topLevel->getInputIndexFor (inputTerm); - if (inputIndex >= 0) - return topLevel; - - for (int i = topLevel->getNumInputs(); --i >= 0;) - { - Term* const t = findDestinationFor (topLevel->getInput (i), inputTerm); - - if (t != nullptr) - return t; - } - - return nullptr; - } - - static Constant* findTermToAdjust (Term* const term, const bool mustBeFlagged) - { - jassert (term != nullptr); - - if (term->getType() == constantType) - { - Constant* const c = static_cast (term); - if (c->isResolutionTarget || ! mustBeFlagged) - return c; - } - - if (term->getType() == functionType) - return nullptr; - - const int numIns = term->getNumInputs(); - - for (int i = 0; i < numIns; ++i) - { - Term* const input = term->getInput (i); - - if (input->getType() == constantType) - { - Constant* const c = static_cast (input); - - if (c->isResolutionTarget || ! mustBeFlagged) - return c; - } - } - - for (int i = 0; i < numIns; ++i) - { - Constant* const c = findTermToAdjust (term->getInput (i), mustBeFlagged); - if (c != nullptr) - return c; - } - - return nullptr; - } - - static bool containsAnySymbols (const Term* const t) - { - if (t->getType() == Expression::symbolType) - return true; - - for (int i = t->getNumInputs(); --i >= 0;) - if (containsAnySymbols (t->getInput (i))) - return true; - - return false; - } - - //============================================================================== - class SymbolCheckVisitor : public Term::SymbolVisitor - { - public: - SymbolCheckVisitor (const Symbol& symbol_) : wasFound (false), symbol (symbol_) {} - void useSymbol (const Symbol& s) { wasFound = wasFound || s == symbol; } - - bool wasFound; - - private: - const Symbol& symbol; - - JUCE_DECLARE_NON_COPYABLE (SymbolCheckVisitor) - }; - - //============================================================================== - class SymbolListVisitor : public Term::SymbolVisitor - { - public: - SymbolListVisitor (Array& list_) : list (list_) {} - void useSymbol (const Symbol& s) { list.addIfNotAlreadyThere (s); } - - private: - Array& list; - - JUCE_DECLARE_NON_COPYABLE (SymbolListVisitor) - }; - - //============================================================================== - class Parser - { - public: - //============================================================================== - Parser (String::CharPointerType& stringToParse) - : text (stringToParse) - { - } - - TermPtr readUpToComma() - { - if (text.isEmpty()) - return new Constant (0.0, false); - - const TermPtr e (readExpression()); - - if (e == nullptr || ((! readOperator (",")) && ! text.isEmpty())) - throw ParseError ("Syntax error: \"" + String (text) + "\""); - - return e; - } - - private: - String::CharPointerType& text; - - //============================================================================== - static inline bool isDecimalDigit (const juce_wchar c) noexcept - { - return c >= '0' && c <= '9'; - } - - bool readChar (const juce_wchar required) noexcept - { - if (*text == required) - { - ++text; - return true; - } - - return false; - } - - bool readOperator (const char* ops, char* const opType = nullptr) noexcept - { - text = text.findEndOfWhitespace(); - - while (*ops != 0) - { - if (readChar ((juce_wchar) (uint8) *ops)) - { - if (opType != nullptr) - *opType = *ops; - - return true; - } - - ++ops; - } - - return false; - } - - bool readIdentifier (String& identifier) noexcept - { - text = text.findEndOfWhitespace(); - String::CharPointerType t (text); - int numChars = 0; - - if (t.isLetter() || *t == '_') - { - ++t; - ++numChars; - - while (t.isLetterOrDigit() || *t == '_') - { - ++t; - ++numChars; - } - } - - if (numChars > 0) - { - identifier = String (text, (size_t) numChars); - text = t; - return true; - } - - return false; - } - - Term* readNumber() noexcept - { - text = text.findEndOfWhitespace(); - String::CharPointerType t (text); - - const bool isResolutionTarget = (*t == '@'); - if (isResolutionTarget) - { - ++t; - t = t.findEndOfWhitespace(); - text = t; - } - - if (*t == '-') - { - ++t; - t = t.findEndOfWhitespace(); - } - - if (isDecimalDigit (*t) || (*t == '.' && isDecimalDigit (t[1]))) - return new Constant (CharacterFunctions::readDoubleValue (text), isResolutionTarget); - - return nullptr; - } - - TermPtr readExpression() - { - TermPtr lhs (readMultiplyOrDivideExpression()); - - char opType; - while (lhs != nullptr && readOperator ("+-", &opType)) - { - TermPtr rhs (readMultiplyOrDivideExpression()); - - if (rhs == nullptr) - throw ParseError ("Expected expression after \"" + String::charToString ((juce_wchar) (uint8) opType) + "\""); - - if (opType == '+') - lhs = new Add (lhs, rhs); - else - lhs = new Subtract (lhs, rhs); - } - - return lhs; - } - - TermPtr readMultiplyOrDivideExpression() - { - TermPtr lhs (readUnaryExpression()); - - char opType; - while (lhs != nullptr && readOperator ("*/", &opType)) - { - TermPtr rhs (readUnaryExpression()); - - if (rhs == nullptr) - throw ParseError ("Expected expression after \"" + String::charToString ((juce_wchar) (uint8) opType) + "\""); - - if (opType == '*') - lhs = new Multiply (lhs, rhs); - else - lhs = new Divide (lhs, rhs); - } - - return lhs; - } - - TermPtr readUnaryExpression() - { - char opType; - if (readOperator ("+-", &opType)) - { - TermPtr e (readUnaryExpression()); - - if (e == nullptr) - throw ParseError ("Expected expression after \"" + String::charToString ((juce_wchar) (uint8) opType) + "\""); - - if (opType == '-') - e = e->negated(); - - return e; - } - - return readPrimaryExpression(); - } - - TermPtr readPrimaryExpression() - { - TermPtr e (readParenthesisedExpression()); - if (e != nullptr) - return e; - - e = readNumber(); - if (e != nullptr) - return e; - - return readSymbolOrFunction(); - } - - TermPtr readSymbolOrFunction() - { - String identifier; - if (readIdentifier (identifier)) - { - if (readOperator ("(")) // method call... - { - Function* const f = new Function (identifier); - ScopedPointer func (f); // (can't use ScopedPointer in MSVC) - - TermPtr param (readExpression()); - - if (param == nullptr) - { - if (readOperator (")")) - return func.release(); - - throw ParseError ("Expected parameters after \"" + identifier + " (\""); - } - - f->parameters.add (Expression (param)); - - while (readOperator (",")) - { - param = readExpression(); - - if (param == nullptr) - throw ParseError ("Expected expression after \",\""); - - f->parameters.add (Expression (param)); - } - - if (readOperator (")")) - return func.release(); - - throw ParseError ("Expected \")\""); - } - - if (readOperator (".")) - { - TermPtr rhs (readSymbolOrFunction()); - - if (rhs == nullptr) - throw ParseError ("Expected symbol or function after \".\""); - - if (identifier == "this") - return rhs; - - return new DotOperator (new SymbolTerm (identifier), rhs); - } - - // just a symbol.. - jassert (identifier.trim() == identifier); - return new SymbolTerm (identifier); - } - - return TermPtr(); - } - - TermPtr readParenthesisedExpression() - { - if (! readOperator ("(")) - return TermPtr(); - - const TermPtr e (readExpression()); - if (e == nullptr || ! readOperator (")")) - return TermPtr(); - - return e; - } - - JUCE_DECLARE_NON_COPYABLE (Parser) - }; -}; - -//============================================================================== -Expression::Expression() - : term (new Expression::Helpers::Constant (0, false)) -{ -} - -Expression::~Expression() -{ -} - -Expression::Expression (Term* const term_) - : term (term_) -{ - jassert (term != nullptr); -} - -Expression::Expression (const double constant) - : term (new Expression::Helpers::Constant (constant, false)) -{ -} - -Expression::Expression (const Expression& other) - : term (other.term) -{ -} - -Expression& Expression::operator= (const Expression& other) -{ - term = other.term; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -Expression::Expression (Expression&& other) noexcept - : term (static_cast &&> (other.term)) -{ -} - -Expression& Expression::operator= (Expression&& other) noexcept -{ - term = static_cast &&> (other.term); - return *this; -} -#endif - -Expression::Expression (const String& stringToParse) -{ - String::CharPointerType text (stringToParse.getCharPointer()); - Helpers::Parser parser (text); - term = parser.readUpToComma(); -} - -Expression Expression::parse (String::CharPointerType& stringToParse) -{ - Helpers::Parser parser (stringToParse); - return Expression (parser.readUpToComma()); -} - -double Expression::evaluate() const -{ - return evaluate (Expression::Scope()); -} - -double Expression::evaluate (const Expression::Scope& scope) const -{ - try - { - return term->resolve (scope, 0)->toDouble(); - } - catch (Helpers::EvaluationError&) - {} - - return 0; -} - -double Expression::evaluate (const Scope& scope, String& evaluationError) const -{ - try - { - return term->resolve (scope, 0)->toDouble(); - } - catch (Helpers::EvaluationError& e) - { - evaluationError = e.description; - } - - return 0; -} - -Expression Expression::operator+ (const Expression& other) const { return Expression (new Helpers::Add (term, other.term)); } -Expression Expression::operator- (const Expression& other) const { return Expression (new Helpers::Subtract (term, other.term)); } -Expression Expression::operator* (const Expression& other) const { return Expression (new Helpers::Multiply (term, other.term)); } -Expression Expression::operator/ (const Expression& other) const { return Expression (new Helpers::Divide (term, other.term)); } -Expression Expression::operator-() const { return Expression (term->negated()); } -Expression Expression::symbol (const String& symbol) { return Expression (new Helpers::SymbolTerm (symbol)); } - -Expression Expression::function (const String& functionName, const Array& parameters) -{ - return Expression (new Helpers::Function (functionName, parameters)); -} - -Expression Expression::adjustedToGiveNewResult (const double targetValue, const Expression::Scope& scope) const -{ - ScopedPointer newTerm (term->clone()); - - Helpers::Constant* termToAdjust = Helpers::findTermToAdjust (newTerm, true); - - if (termToAdjust == nullptr) - termToAdjust = Helpers::findTermToAdjust (newTerm, false); - - if (termToAdjust == nullptr) - { - newTerm = new Helpers::Add (newTerm.release(), new Helpers::Constant (0, false)); - termToAdjust = Helpers::findTermToAdjust (newTerm, false); - } - - jassert (termToAdjust != nullptr); - - const Term* const parent = Helpers::findDestinationFor (newTerm, termToAdjust); - - if (parent == nullptr) - { - termToAdjust->value = targetValue; - } - else - { - const Helpers::TermPtr reverseTerm (parent->createTermToEvaluateInput (scope, termToAdjust, targetValue, newTerm)); - - if (reverseTerm == nullptr) - return Expression (targetValue); - - termToAdjust->value = reverseTerm->resolve (scope, 0)->toDouble(); - } - - return Expression (newTerm.release()); -} - -Expression Expression::withRenamedSymbol (const Expression::Symbol& oldSymbol, const String& newName, const Scope& scope) const -{ - jassert (newName.toLowerCase().containsOnly ("abcdefghijklmnopqrstuvwxyz0123456789_")); - - if (oldSymbol.symbolName == newName) - return *this; - - Expression e (term->clone()); - e.term->renameSymbol (oldSymbol, newName, scope, 0); - return e; -} - -bool Expression::referencesSymbol (const Expression::Symbol& symbolToCheck, const Scope& scope) const -{ - Helpers::SymbolCheckVisitor visitor (symbolToCheck); - - try - { - term->visitAllSymbols (visitor, scope, 0); - } - catch (Helpers::EvaluationError&) - {} - - return visitor.wasFound; -} - -void Expression::findReferencedSymbols (Array& results, const Scope& scope) const -{ - try - { - Helpers::SymbolListVisitor visitor (results); - term->visitAllSymbols (visitor, scope, 0); - } - catch (Helpers::EvaluationError&) - {} -} - -String Expression::toString() const { return term->toString(); } -bool Expression::usesAnySymbols() const { return Helpers::containsAnySymbols (term); } -Expression::Type Expression::getType() const noexcept { return term->getType(); } -String Expression::getSymbolOrFunction() const { return term->getName(); } -int Expression::getNumInputs() const { return term->getNumInputs(); } -Expression Expression::getInput (int index) const { return Expression (term->getInput (index)); } - -//============================================================================== -ReferenceCountedObjectPtr Expression::Term::negated() -{ - return new Helpers::Negate (this); -} - -//============================================================================== -Expression::ParseError::ParseError (const String& message) - : description (message) -{ - DBG ("Expression::ParseError: " + message); -} - -//============================================================================== -Expression::Symbol::Symbol (const String& scopeUID_, const String& symbolName_) - : scopeUID (scopeUID_), symbolName (symbolName_) -{ -} - -bool Expression::Symbol::operator== (const Symbol& other) const noexcept -{ - return symbolName == other.symbolName && scopeUID == other.scopeUID; -} - -bool Expression::Symbol::operator!= (const Symbol& other) const noexcept -{ - return ! operator== (other); -} - -//============================================================================== -Expression::Scope::Scope() {} -Expression::Scope::~Scope() {} - -Expression Expression::Scope::getSymbolValue (const String& symbol) const -{ - if (symbol.isNotEmpty()) - throw Helpers::EvaluationError ("Unknown symbol: " + symbol); - - return Expression(); -} - -double Expression::Scope::evaluateFunction (const String& functionName, const double* parameters, int numParams) const -{ - if (numParams > 0) - { - if (functionName == "min") - { - double v = parameters[0]; - for (int i = 1; i < numParams; ++i) - v = jmin (v, parameters[i]); - - return v; - } - - if (functionName == "max") - { - double v = parameters[0]; - for (int i = 1; i < numParams; ++i) - v = jmax (v, parameters[i]); - - return v; - } - - if (numParams == 1) - { - if (functionName == "sin") return std::sin (parameters[0]); - if (functionName == "cos") return std::cos (parameters[0]); - if (functionName == "tan") return std::tan (parameters[0]); - if (functionName == "abs") return std::abs (parameters[0]); - } - } - - throw Helpers::EvaluationError ("Unknown function: \"" + functionName + "\""); -} - -void Expression::Scope::visitRelativeScope (const String& scopeName, Visitor&) const -{ - throw Helpers::EvaluationError ("Unknown symbol: " + scopeName); -} - -String Expression::Scope::getScopeUID() const -{ - return String(); -} diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h b/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h deleted file mode 100755 index 8939129..0000000 --- a/JuceLibraryCode/modules/juce_core/maths/juce_Expression.h +++ /dev/null @@ -1,270 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_EXPRESSION_H_INCLUDED -#define JUCE_EXPRESSION_H_INCLUDED - - -//============================================================================== -/** - A class for dynamically evaluating simple numeric expressions. - - This class can parse a simple C-style string expression involving floating point - numbers, named symbols and functions. The basic arithmetic operations of +, -, *, / - are supported, as well as parentheses, and any alphanumeric identifiers are - assumed to be named symbols which will be resolved when the expression is - evaluated. - - Expressions which use identifiers and functions require a subclass of - Expression::Scope to be supplied when evaluating them, and this object - is expected to be able to resolve the symbol names and perform the functions that - are used. -*/ -class JUCE_API Expression -{ -public: - //============================================================================== - /** Creates a simple expression with a value of 0. */ - Expression(); - - /** Destructor. */ - ~Expression(); - - /** Creates a simple expression with a specified constant value. */ - explicit Expression (double constant); - - /** Creates a copy of an expression. */ - Expression (const Expression&); - - /** Copies another expression. */ - Expression& operator= (const Expression&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Expression (Expression&&) noexcept; - Expression& operator= (Expression&&) noexcept; - #endif - - /** Creates an expression by parsing a string. - If there's a syntax error in the string, this will throw a ParseError exception. - @throws ParseError - */ - explicit Expression (const String& stringToParse); - - /** Returns a string version of the expression. */ - String toString() const; - - /** Returns an expression which is an addition operation of two existing expressions. */ - Expression operator+ (const Expression&) const; - /** Returns an expression which is a subtraction operation of two existing expressions. */ - Expression operator- (const Expression&) const; - /** Returns an expression which is a multiplication operation of two existing expressions. */ - Expression operator* (const Expression&) const; - /** Returns an expression which is a division operation of two existing expressions. */ - Expression operator/ (const Expression&) const; - /** Returns an expression which performs a negation operation on an existing expression. */ - Expression operator-() const; - - /** Returns an Expression which is an identifier reference. */ - static Expression symbol (const String& symbol); - - /** Returns an Expression which is a function call. */ - static Expression function (const String& functionName, const Array& parameters); - - /** Returns an Expression which parses a string from a character pointer, and updates the pointer - to indicate where it finished. - - The pointer is incremented so that on return, it indicates the character that follows - the end of the expression that was parsed. - - If there's a syntax error in the string, this will throw a ParseError exception. - @throws ParseError - */ - static Expression parse (String::CharPointerType& stringToParse); - - //============================================================================== - /** When evaluating an Expression object, this class is used to resolve symbols and - perform functions that the expression uses. - */ - class JUCE_API Scope - { - public: - Scope(); - virtual ~Scope(); - - /** Returns some kind of globally unique ID that identifies this scope. */ - virtual String getScopeUID() const; - - /** Returns the value of a symbol. - If the symbol is unknown, this can throw an Expression::EvaluationError exception. - The member value is set to the part of the symbol that followed the dot, if there is - one, e.g. for "foo.bar", symbol = "foo" and member = "bar". - @throws Expression::EvaluationError - */ - virtual Expression getSymbolValue (const String& symbol) const; - - /** Executes a named function. - If the function name is unknown, this can throw an Expression::EvaluationError exception. - @throws Expression::EvaluationError - */ - virtual double evaluateFunction (const String& functionName, - const double* parameters, int numParameters) const; - - /** Used as a callback by the Scope::visitRelativeScope() method. - You should never create an instance of this class yourself, it's used by the - expression evaluation code. - */ - class Visitor - { - public: - virtual ~Visitor() {} - virtual void visit (const Scope&) = 0; - }; - - /** Creates a Scope object for a named scope, and then calls a visitor - to do some kind of processing with this new scope. - - If the name is valid, this method must create a suitable (temporary) Scope - object to represent it, and must call the Visitor::visit() method with this - new scope. - */ - virtual void visitRelativeScope (const String& scopeName, Visitor& visitor) const; - }; - - /** Evaluates this expression, without using a Scope. - Without a Scope, no symbols can be used, and only basic functions such as sin, cos, tan, - min, max are available. - To find out about any errors during evaluation, use the other version of this method which - takes a String parameter. - */ - double evaluate() const; - - /** Evaluates this expression, providing a scope that should be able to evaluate any symbols - or functions that it uses. - To find out about any errors during evaluation, use the other version of this method which - takes a String parameter. - */ - double evaluate (const Scope& scope) const; - - /** Evaluates this expression, providing a scope that should be able to evaluate any symbols - or functions that it uses. - */ - double evaluate (const Scope& scope, String& evaluationError) const; - - /** Attempts to return an expression which is a copy of this one, but with a constant adjusted - to make the expression resolve to a target value. - - E.g. if the expression is "x + 10" and x is 5, then asking for a target value of 8 will return - the expression "x + 3". Obviously some expressions can't be reversed in this way, in which - case they might just be adjusted by adding a constant to the original expression. - - @throws Expression::EvaluationError - */ - Expression adjustedToGiveNewResult (double targetValue, const Scope& scope) const; - - /** Represents a symbol that is used in an Expression. */ - struct Symbol - { - Symbol (const String& scopeUID, const String& symbolName); - bool operator== (const Symbol&) const noexcept; - bool operator!= (const Symbol&) const noexcept; - - String scopeUID; /**< The unique ID of the Scope that contains this symbol. */ - String symbolName; /**< The name of the symbol. */ - }; - - /** Returns a copy of this expression in which all instances of a given symbol have been renamed. */ - Expression withRenamedSymbol (const Symbol& oldSymbol, const String& newName, const Scope& scope) const; - - /** Returns true if this expression makes use of the specified symbol. - If a suitable scope is supplied, the search will dereference and recursively check - all symbols, so that it can be determined whether this expression relies on the given - symbol at any level in its evaluation. If the scope parameter is null, this just checks - whether the expression contains any direct references to the symbol. - - @throws Expression::EvaluationError - */ - bool referencesSymbol (const Symbol& symbol, const Scope& scope) const; - - /** Returns true if this expression contains any symbols. */ - bool usesAnySymbols() const; - - /** Returns a list of all symbols that may be needed to resolve this expression in the given scope. */ - void findReferencedSymbols (Array& results, const Scope& scope) const; - - //============================================================================== - /** An exception that can be thrown by Expression::parse(). */ - class ParseError : public std::exception - { - public: - ParseError (const String& message); - - String description; - }; - - //============================================================================== - /** Expression type. - @see Expression::getType() - */ - enum Type - { - constantType, - functionType, - operatorType, - symbolType - }; - - /** Returns the type of this expression. */ - Type getType() const noexcept; - - /** If this expression is a symbol, function or operator, this returns its identifier. */ - String getSymbolOrFunction() const; - - /** Returns the number of inputs to this expression. - @see getInput - */ - int getNumInputs() const; - - /** Retrieves one of the inputs to this expression. - @see getNumInputs - */ - Expression getInput (int index) const; - -private: - //============================================================================== - class Term; - struct Helpers; - friend class Term; - friend struct Helpers; - friend struct ContainerDeletePolicy; - friend class ReferenceCountedObjectPtr; - ReferenceCountedObjectPtr term; - - explicit Expression (Term*); -}; - -#endif // JUCE_EXPRESSION_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h b/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h deleted file mode 100755 index 9e0781e..0000000 --- a/JuceLibraryCode/modules/juce_core/maths/juce_MathsFunctions.h +++ /dev/null @@ -1,565 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_MATHSFUNCTIONS_H_INCLUDED -#define JUCE_MATHSFUNCTIONS_H_INCLUDED - -//============================================================================== -/* - This file sets up some handy mathematical typdefs and functions. -*/ - -//============================================================================== -// Definitions for the int8, int16, int32, int64 and pointer_sized_int types. - -/** A platform-independent 8-bit signed integer type. */ -typedef signed char int8; -/** A platform-independent 8-bit unsigned integer type. */ -typedef unsigned char uint8; -/** A platform-independent 16-bit signed integer type. */ -typedef signed short int16; -/** A platform-independent 16-bit unsigned integer type. */ -typedef unsigned short uint16; -/** A platform-independent 32-bit signed integer type. */ -typedef signed int int32; -/** A platform-independent 32-bit unsigned integer type. */ -typedef unsigned int uint32; - -#if JUCE_MSVC - /** A platform-independent 64-bit integer type. */ - typedef __int64 int64; - /** A platform-independent 64-bit unsigned integer type. */ - typedef unsigned __int64 uint64; -#else - /** A platform-independent 64-bit integer type. */ - typedef long long int64; - /** A platform-independent 64-bit unsigned integer type. */ - typedef unsigned long long uint64; -#endif - -#ifndef DOXYGEN - /** A macro for creating 64-bit literals. - Historically, this was needed to support portability with MSVC6, and is kept here - so that old code will still compile, but nowadays every compiler will support the - LL and ULL suffixes, so you should use those in preference to this macro. - */ - #define literal64bit(longLiteral) (longLiteral##LL) -#endif - -#if JUCE_64BIT - /** A signed integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef int64 pointer_sized_int; - /** An unsigned integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef uint64 pointer_sized_uint; -#elif JUCE_MSVC - /** A signed integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef _W64 int pointer_sized_int; - /** An unsigned integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef _W64 unsigned int pointer_sized_uint; -#else - /** A signed integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef int pointer_sized_int; - /** An unsigned integer type that's guaranteed to be large enough to hold a pointer without truncating it. */ - typedef unsigned int pointer_sized_uint; -#endif - -#if JUCE_MSVC - typedef pointer_sized_int ssize_t; -#endif - -//============================================================================== -// Some indispensible min/max functions - -/** Returns the larger of two values. */ -template -inline Type jmax (const Type a, const Type b) { return (a < b) ? b : a; } - -/** Returns the larger of three values. */ -template -inline Type jmax (const Type a, const Type b, const Type c) { return (a < b) ? ((b < c) ? c : b) : ((a < c) ? c : a); } - -/** Returns the larger of four values. */ -template -inline Type jmax (const Type a, const Type b, const Type c, const Type d) { return jmax (a, jmax (b, c, d)); } - -/** Returns the smaller of two values. */ -template -inline Type jmin (const Type a, const Type b) { return (b < a) ? b : a; } - -/** Returns the smaller of three values. */ -template -inline Type jmin (const Type a, const Type b, const Type c) { return (b < a) ? ((c < b) ? c : b) : ((c < a) ? c : a); } - -/** Returns the smaller of four values. */ -template -inline Type jmin (const Type a, const Type b, const Type c, const Type d) { return jmin (a, jmin (b, c, d)); } - -/** Remaps a normalised value (between 0 and 1) to a target range. - This effectively returns (targetRangeMin + value0To1 * (targetRangeMax - targetRangeMin)) -*/ -template -static Type jmap (Type value0To1, Type targetRangeMin, Type targetRangeMax) -{ - return targetRangeMin + value0To1 * (targetRangeMax - targetRangeMin); -} - -/** Remaps a value from a source range to a target range. */ -template -static Type jmap (Type sourceValue, Type sourceRangeMin, Type sourceRangeMax, Type targetRangeMin, Type targetRangeMax) -{ - return targetRangeMin + ((targetRangeMax - targetRangeMin) * (sourceValue - sourceRangeMin)) / (sourceRangeMax - sourceRangeMin); -} - -/** Scans an array of values, returning the minimum value that it contains. */ -template -const Type findMinimum (const Type* data, int numValues) -{ - if (numValues <= 0) - return Type(); - - Type result (*data++); - - while (--numValues > 0) // (> 0 rather than >= 0 because we've already taken the first sample) - { - const Type& v = *data++; - if (v < result) result = v; - } - - return result; -} - -/** Scans an array of values, returning the maximum value that it contains. */ -template -const Type findMaximum (const Type* values, int numValues) -{ - if (numValues <= 0) - return Type(); - - Type result (*values++); - - while (--numValues > 0) // (> 0 rather than >= 0 because we've already taken the first sample) - { - const Type& v = *values++; - if (result < v) result = v; - } - - return result; -} - -/** Scans an array of values, returning the minimum and maximum values that it contains. */ -template -void findMinAndMax (const Type* values, int numValues, Type& lowest, Type& highest) -{ - if (numValues <= 0) - { - lowest = Type(); - highest = Type(); - } - else - { - Type mn (*values++); - Type mx (mn); - - while (--numValues > 0) // (> 0 rather than >= 0 because we've already taken the first sample) - { - const Type& v = *values++; - - if (mx < v) mx = v; - if (v < mn) mn = v; - } - - lowest = mn; - highest = mx; - } -} - - -//============================================================================== -/** Constrains a value to keep it within a given range. - - This will check that the specified value lies between the lower and upper bounds - specified, and if not, will return the nearest value that would be in-range. Effectively, - it's like calling jmax (lowerLimit, jmin (upperLimit, value)). - - Note that it expects that lowerLimit <= upperLimit. If this isn't true, - the results will be unpredictable. - - @param lowerLimit the minimum value to return - @param upperLimit the maximum value to return - @param valueToConstrain the value to try to return - @returns the closest value to valueToConstrain which lies between lowerLimit - and upperLimit (inclusive) - @see jlimit0To, jmin, jmax -*/ -template -inline Type jlimit (const Type lowerLimit, - const Type upperLimit, - const Type valueToConstrain) noexcept -{ - jassert (lowerLimit <= upperLimit); // if these are in the wrong order, results are unpredictable.. - - return (valueToConstrain < lowerLimit) ? lowerLimit - : ((upperLimit < valueToConstrain) ? upperLimit - : valueToConstrain); -} - -/** Returns true if a value is at least zero, and also below a specified upper limit. - This is basically a quicker way to write: - @code valueToTest >= 0 && valueToTest < upperLimit - @endcode -*/ -template -inline bool isPositiveAndBelow (Type valueToTest, Type upperLimit) noexcept -{ - jassert (Type() <= upperLimit); // makes no sense to call this if the upper limit is itself below zero.. - return Type() <= valueToTest && valueToTest < upperLimit; -} - -template <> -inline bool isPositiveAndBelow (const int valueToTest, const int upperLimit) noexcept -{ - jassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero.. - return static_cast (valueToTest) < static_cast (upperLimit); -} - -/** Returns true if a value is at least zero, and also less than or equal to a specified upper limit. - This is basically a quicker way to write: - @code valueToTest >= 0 && valueToTest <= upperLimit - @endcode -*/ -template -inline bool isPositiveAndNotGreaterThan (Type valueToTest, Type upperLimit) noexcept -{ - jassert (Type() <= upperLimit); // makes no sense to call this if the upper limit is itself below zero.. - return Type() <= valueToTest && valueToTest <= upperLimit; -} - -template <> -inline bool isPositiveAndNotGreaterThan (const int valueToTest, const int upperLimit) noexcept -{ - jassert (upperLimit >= 0); // makes no sense to call this if the upper limit is itself below zero.. - return static_cast (valueToTest) <= static_cast (upperLimit); -} - -//============================================================================== -/** Handy function to swap two values. */ -template -inline void swapVariables (Type& variable1, Type& variable2) -{ - std::swap (variable1, variable2); -} - -/** Handy function for getting the number of elements in a simple const C array. - E.g. - @code - static int myArray[] = { 1, 2, 3 }; - - int numElements = numElementsInArray (myArray) // returns 3 - @endcode -*/ -template -inline int numElementsInArray (Type (&array)[N]) -{ - (void) array; // (required to avoid a spurious warning in MS compilers) - (void) sizeof (0[array]); // This line should cause an error if you pass an object with a user-defined subscript operator - return N; -} - -//============================================================================== -// Some useful maths functions that aren't always present with all compilers and build settings. - -/** Using juce_hypot is easier than dealing with the different types of hypot function - that are provided by the various platforms and compilers. */ -template -inline Type juce_hypot (Type a, Type b) noexcept -{ - #if JUCE_MSVC - return static_cast (_hypot (a, b)); - #else - return static_cast (hypot (a, b)); - #endif -} - -/** 64-bit abs function. */ -inline int64 abs64 (const int64 n) noexcept -{ - return (n >= 0) ? n : -n; -} - -#if JUCE_MSVC && ! defined (DOXYGEN) // The MSVC libraries omit these functions for some reason... - template Type asinh (Type x) noexcept { return std::log (x + std::sqrt (x * x + (Type) 1)); } - template Type acosh (Type x) noexcept { return std::log (x + std::sqrt (x * x - (Type) 1)); } - template Type atanh (Type x) noexcept { return (std::log (x + (Type) 1) - std::log (((Type) 1) - x)) / (Type) 2; } -#endif - -//============================================================================== -/** A predefined value for Pi, at double-precision. - @see float_Pi -*/ -const double double_Pi = 3.1415926535897932384626433832795; - -/** A predefined value for Pi, at single-precision. - @see double_Pi -*/ -const float float_Pi = 3.14159265358979323846f; - - -//============================================================================== -/** The isfinite() method seems to vary between platforms, so this is a - platform-independent function for it. -*/ -template -inline bool juce_isfinite (FloatingPointType value) -{ - #if JUCE_WINDOWS - return _finite (value); - #elif JUCE_ANDROID - return isfinite (value); - #else - return std::isfinite (value); - #endif -} - -//============================================================================== -#if JUCE_MSVC - #pragma optimize ("t", off) - #ifndef __INTEL_COMPILER - #pragma float_control (precise, on, push) - #endif -#endif - -/** Fast floating-point-to-integer conversion. - - This is faster than using the normal c++ cast to convert a float to an int, and - it will round the value to the nearest integer, rather than rounding it down - like the normal cast does. - - Note that this routine gets its speed at the expense of some accuracy, and when - rounding values whose floating point component is exactly 0.5, odd numbers and - even numbers will be rounded up or down differently. -*/ -template -inline int roundToInt (const FloatType value) noexcept -{ - #ifdef __INTEL_COMPILER - #pragma float_control (precise, on, push) - #endif - - union { int asInt[2]; double asDouble; } n; - n.asDouble = ((double) value) + 6755399441055744.0; - - #if JUCE_BIG_ENDIAN - return n.asInt [1]; - #else - return n.asInt [0]; - #endif -} - -inline int roundToInt (int value) noexcept -{ - return value; -} - -#if JUCE_MSVC - #ifndef __INTEL_COMPILER - #pragma float_control (pop) - #endif - #pragma optimize ("", on) // resets optimisations to the project defaults -#endif - -/** Fast floating-point-to-integer conversion. - - This is a slightly slower and slightly more accurate version of roundDoubleToInt(). It works - fine for values above zero, but negative numbers are rounded the wrong way. -*/ -inline int roundToIntAccurate (const double value) noexcept -{ - #ifdef __INTEL_COMPILER - #pragma float_control (pop) - #endif - - return roundToInt (value + 1.5e-8); -} - -/** Fast floating-point-to-integer conversion. - - This is faster than using the normal c++ cast to convert a double to an int, and - it will round the value to the nearest integer, rather than rounding it down - like the normal cast does. - - Note that this routine gets its speed at the expense of some accuracy, and when - rounding values whose floating point component is exactly 0.5, odd numbers and - even numbers will be rounded up or down differently. For a more accurate conversion, - see roundDoubleToIntAccurate(). -*/ -inline int roundDoubleToInt (const double value) noexcept -{ - return roundToInt (value); -} - -/** Fast floating-point-to-integer conversion. - - This is faster than using the normal c++ cast to convert a float to an int, and - it will round the value to the nearest integer, rather than rounding it down - like the normal cast does. - - Note that this routine gets its speed at the expense of some accuracy, and when - rounding values whose floating point component is exactly 0.5, odd numbers and - even numbers will be rounded up or down differently. -*/ -inline int roundFloatToInt (const float value) noexcept -{ - return roundToInt (value); -} - -//============================================================================== -/** Returns true if the specified integer is a power-of-two. -*/ -template -bool isPowerOfTwo (IntegerType value) -{ - return (value & (value - 1)) == 0; -} - -/** Returns the smallest power-of-two which is equal to or greater than the given integer. -*/ -inline int nextPowerOfTwo (int n) noexcept -{ - --n; - n |= (n >> 1); - n |= (n >> 2); - n |= (n >> 4); - n |= (n >> 8); - n |= (n >> 16); - return n + 1; -} - -/** Returns the number of bits in a 32-bit integer. */ -inline int countNumberOfBits (uint32 n) noexcept -{ - n -= ((n >> 1) & 0x55555555); - n = (((n >> 2) & 0x33333333) + (n & 0x33333333)); - n = (((n >> 4) + n) & 0x0f0f0f0f); - n += (n >> 8); - n += (n >> 16); - return (int) (n & 0x3f); -} - -/** Returns the number of bits in a 64-bit integer. */ -inline int countNumberOfBits (uint64 n) noexcept -{ - return countNumberOfBits ((uint32) n) + countNumberOfBits ((uint32) (n >> 32)); -} - -/** Performs a modulo operation, but can cope with the dividend being negative. - The divisor must be greater than zero. -*/ -template -IntegerType negativeAwareModulo (IntegerType dividend, const IntegerType divisor) noexcept -{ - jassert (divisor > 0); - dividend %= divisor; - return (dividend < 0) ? (dividend + divisor) : dividend; -} - -/** Returns the square of its argument. */ -template -NumericType square (NumericType n) noexcept -{ - return n * n; -} - -//============================================================================== -#if (JUCE_INTEL && JUCE_32BIT) || defined (DOXYGEN) - /** This macro can be applied to a float variable to check whether it contains a denormalised - value, and to normalise it if necessary. - On CPUs that aren't vulnerable to denormalisation problems, this will have no effect. - */ - #define JUCE_UNDENORMALISE(x) x += 1.0f; x -= 1.0f; -#else - #define JUCE_UNDENORMALISE(x) -#endif - -//============================================================================== -/** This namespace contains a few template classes for helping work out class type variations. -*/ -namespace TypeHelpers -{ - #if JUCE_VC8_OR_EARLIER - #define PARAMETER_TYPE(type) const type& - #else - /** The ParameterType struct is used to find the best type to use when passing some kind - of object as a parameter. - - Of course, this is only likely to be useful in certain esoteric template situations. - - Because "typename TypeHelpers::ParameterType::type" is a bit of a mouthful, there's - a PARAMETER_TYPE(SomeClass) macro that you can use to get the same effect. - - E.g. "myFunction (PARAMETER_TYPE (int), PARAMETER_TYPE (MyObject))" - would evaluate to "myfunction (int, const MyObject&)", keeping any primitive types as - pass-by-value, but passing objects as a const reference, to avoid copying. - */ - template struct ParameterType { typedef const Type& type; }; - - #if ! DOXYGEN - template struct ParameterType { typedef Type& type; }; - template struct ParameterType { typedef Type* type; }; - template <> struct ParameterType { typedef char type; }; - template <> struct ParameterType { typedef unsigned char type; }; - template <> struct ParameterType { typedef short type; }; - template <> struct ParameterType { typedef unsigned short type; }; - template <> struct ParameterType { typedef int type; }; - template <> struct ParameterType { typedef unsigned int type; }; - template <> struct ParameterType { typedef long type; }; - template <> struct ParameterType { typedef unsigned long type; }; - template <> struct ParameterType { typedef int64 type; }; - template <> struct ParameterType { typedef uint64 type; }; - template <> struct ParameterType { typedef bool type; }; - template <> struct ParameterType { typedef float type; }; - template <> struct ParameterType { typedef double type; }; - #endif - - /** A helpful macro to simplify the use of the ParameterType template. - @see ParameterType - */ - #define PARAMETER_TYPE(a) typename TypeHelpers::ParameterType::type - #endif - - - /** These templates are designed to take a type, and if it's a double, they return a double - type; for anything else, they return a float type. - */ - template struct SmallestFloatType { typedef float type; }; - template <> struct SmallestFloatType { typedef double type; }; -} - - -//============================================================================== - -#endif // JUCE_MATHSFUNCTIONS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h b/JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h deleted file mode 100755 index 56424a2..0000000 --- a/JuceLibraryCode/modules/juce_core/maths/juce_NormalisableRange.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_NORMALISABLERANGE_H_INCLUDED -#define JUCE_NORMALISABLERANGE_H_INCLUDED - - -//============================================================================== -/** - Represents a mapping between an arbitrary range of values and a - normalised 0->1 range. - - The properties of the mapping also include an optional snapping interval - and skew-factor. - - @see Range -*/ -template -class NormalisableRange -{ -public: - /** Creates a continuous range that performs a dummy mapping. */ - NormalisableRange() noexcept : start(), end (1), interval(), skew (static_cast (1)) {} - - /** Creates a copy of another range. */ - NormalisableRange (const NormalisableRange& other) noexcept - : start (other.start), end (other.end), - interval (other.interval), skew (other.skew) - { - checkInvariants(); - } - - /** Creates a copy of another range. */ - NormalisableRange& operator= (const NormalisableRange& other) noexcept - { - start = other.start; - end = other.end; - interval = other.interval; - skew = other.skew; - checkInvariants(); - return *this; - } - - /** Creates a NormalisableRange with a given range, interval and skew factor. */ - NormalisableRange (ValueType rangeStart, - ValueType rangeEnd, - ValueType intervalValue, - ValueType skewFactor) noexcept - : start (rangeStart), end (rangeEnd), - interval (intervalValue), skew (skewFactor) - { - checkInvariants(); - } - - /** Creates a NormalisableRange with a given range and interval, but a dummy skew-factor. */ - NormalisableRange (ValueType rangeStart, - ValueType rangeEnd, - ValueType intervalValue) noexcept - : start (rangeStart), end (rangeEnd), - interval (intervalValue), skew (static_cast (1)) - { - checkInvariants(); - } - - /** Creates a NormalisableRange with a given range, continuous interval, but a dummy skew-factor. */ - NormalisableRange (ValueType rangeStart, - ValueType rangeEnd) noexcept - : start (rangeStart), end (rangeEnd), - interval(), skew (static_cast (1)) - { - checkInvariants(); - } - - /** Uses the properties of this mapping to convert a non-normalised value to - its 0->1 representation. - */ - ValueType convertTo0to1 (ValueType v) const noexcept - { - ValueType proportion = (v - start) / (end - start); - - if (skew != static_cast (1)) - proportion = std::pow (proportion, skew); - - return proportion; - } - - /** Uses the properties of this mapping to convert a normalised 0->1 value to - its full-range representation. - */ - ValueType convertFrom0to1 (ValueType proportion) const noexcept - { - if (skew != static_cast (1) && proportion > ValueType()) - proportion = std::exp (std::log (proportion) / skew); - - return start + (end - start) * proportion; - } - - /** Takes a non-normalised value and snaps it based on the interval property of - this NormalisedRange. */ - ValueType snapToLegalValue (ValueType v) const noexcept - { - if (interval > ValueType()) - v = start + interval * std::floor ((v - start) / interval + static_cast (0.5)); - - if (v <= start || end <= start) - return start; - - if (v >= end) - return end; - - return v; - } - - /** The start of the non-normalised range. */ - ValueType start; - - /** The end of the non-normalised range. */ - ValueType end; - - /** The snapping interval that should be used (in non-normalised value). Use 0 for a continuous range. */ - ValueType interval; - - /** An optional skew factor that alters the way values are distribute across the range. - - The skew factor lets you skew the mapping logarithmically so that larger or smaller - values are given a larger proportion of the avilable space. - - A factor of 1.0 has no skewing effect at all. If the factor is < 1.0, the lower end - of the range will fill more of the slider's length; if the factor is > 1.0, the upper - end of the range will be expanded. - */ - ValueType skew; - -private: - void checkInvariants() const - { - jassert (end > start); - jassert (interval >= ValueType()); - jassert (skew > ValueType()); - } -}; - - -#endif // JUCE_NORMALISABLERANGE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp b/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp deleted file mode 100755 index a196256..0000000 --- a/JuceLibraryCode/modules/juce_core/maths/juce_Random.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -Random::Random (const int64 seedValue) noexcept : seed (seedValue) -{ -} - -Random::Random() : seed (1) -{ - setSeedRandomly(); -} - -Random::~Random() noexcept -{ -} - -void Random::setSeed (const int64 newSeed) noexcept -{ - seed = newSeed; -} - -void Random::combineSeed (const int64 seedValue) noexcept -{ - seed ^= nextInt64() ^ seedValue; -} - -void Random::setSeedRandomly() -{ - static int64 globalSeed = 0; - - combineSeed (globalSeed ^ (int64) (pointer_sized_int) this); - combineSeed (Time::getMillisecondCounter()); - combineSeed (Time::getHighResolutionTicks()); - combineSeed (Time::getHighResolutionTicksPerSecond()); - combineSeed (Time::currentTimeMillis()); - globalSeed ^= seed; -} - -Random& Random::getSystemRandom() noexcept -{ - static Random sysRand; - return sysRand; -} - -//============================================================================== -int Random::nextInt() noexcept -{ - seed = (seed * 0x5deece66dLL + 11) & 0xffffffffffffLL; - - return (int) (seed >> 16); -} - -int Random::nextInt (const int maxValue) noexcept -{ - jassert (maxValue > 0); - return (int) ((((unsigned int) nextInt()) * (uint64) maxValue) >> 32); -} - -int Random::nextInt (Range range) noexcept -{ - return range.getStart() + nextInt (range.getLength()); -} - -int64 Random::nextInt64() noexcept -{ - return (((int64) nextInt()) << 32) | (int64) (uint64) (uint32) nextInt(); -} - -bool Random::nextBool() noexcept -{ - return (nextInt() & 0x40000000) != 0; -} - -float Random::nextFloat() noexcept -{ - return static_cast (nextInt()) / (std::numeric_limits::max() + 1.0f); -} - -double Random::nextDouble() noexcept -{ - return static_cast (nextInt()) / (std::numeric_limits::max() + 1.0); -} - -BigInteger Random::nextLargeNumber (const BigInteger& maximumValue) -{ - BigInteger n; - - do - { - fillBitsRandomly (n, 0, maximumValue.getHighestBit() + 1); - } - while (n >= maximumValue); - - return n; -} - -void Random::fillBitsRandomly (void* const buffer, size_t bytes) -{ - int* d = static_cast (buffer); - - for (; bytes >= sizeof (int); bytes -= sizeof (int)) - *d++ = nextInt(); - - if (bytes > 0) - { - const int lastBytes = nextInt(); - memcpy (d, &lastBytes, bytes); - } -} - -void Random::fillBitsRandomly (BigInteger& arrayToChange, int startBit, int numBits) -{ - arrayToChange.setBit (startBit + numBits - 1, true); // to force the array to pre-allocate space - - while ((startBit & 31) != 0 && numBits > 0) - { - arrayToChange.setBit (startBit++, nextBool()); - --numBits; - } - - while (numBits >= 32) - { - arrayToChange.setBitRangeAsInt (startBit, 32, (unsigned int) nextInt()); - startBit += 32; - numBits -= 32; - } - - while (--numBits >= 0) - arrayToChange.setBit (startBit + numBits, nextBool()); -} - -//============================================================================== -#if JUCE_UNIT_TESTS - -class RandomTests : public UnitTest -{ -public: - RandomTests() : UnitTest ("Random") {} - - void runTest() - { - beginTest ("Random"); - - Random r = getRandom(); - - for (int i = 2000; --i >= 0;) - { - expect (r.nextDouble() >= 0.0 && r.nextDouble() < 1.0); - expect (r.nextFloat() >= 0.0f && r.nextFloat() < 1.0f); - expect (r.nextInt (5) >= 0 && r.nextInt (5) < 5); - expect (r.nextInt (1) == 0); - - int n = r.nextInt (50) + 1; - expect (r.nextInt (n) >= 0 && r.nextInt (n) < n); - - n = r.nextInt (0x7ffffffe) + 1; - expect (r.nextInt (n) >= 0 && r.nextInt (n) < n); - } - } -}; - -static RandomTests randomTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_Random.h b/JuceLibraryCode/modules/juce_core/maths/juce_Random.h deleted file mode 100755 index 19e6d6e..0000000 --- a/JuceLibraryCode/modules/juce_core/maths/juce_Random.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_RANDOM_H_INCLUDED -#define JUCE_RANDOM_H_INCLUDED - - -//============================================================================== -/** - A random number generator. - - You can create a Random object and use it to generate a sequence of random numbers. -*/ -class JUCE_API Random -{ -public: - //============================================================================== - /** Creates a Random object based on a seed value. - - For a given seed value, the subsequent numbers generated by this object - will be predictable, so a good idea is to set this value based - on the time, e.g. - - new Random (Time::currentTimeMillis()) - */ - explicit Random (int64 seedValue) noexcept; - - /** Creates a Random object using a random seed value. - Internally, this calls setSeedRandomly() to randomise the seed. - */ - Random(); - - /** Destructor. */ - ~Random() noexcept; - - /** Returns the next random 32 bit integer. - @returns a random integer from the full range 0x80000000 to 0x7fffffff - */ - int nextInt() noexcept; - - /** Returns the next random number, limited to a given range. - The maxValue parameter may not be negative, or zero. - @returns a random integer between 0 (inclusive) and maxValue (exclusive). - */ - int nextInt (int maxValue) noexcept; - - /** Returns the next random number, limited to a given range. - @returns a random integer between the range start (inclusive) and its end (exclusive). - */ - int nextInt (Range range) noexcept; - - /** Returns the next 64-bit random number. - @returns a random integer from the full range 0x8000000000000000 to 0x7fffffffffffffff - */ - int64 nextInt64() noexcept; - - /** Returns the next random floating-point number. - @returns a random value in the range 0 to 1.0 - */ - float nextFloat() noexcept; - - /** Returns the next random floating-point number. - @returns a random value in the range 0 to 1.0 - */ - double nextDouble() noexcept; - - /** Returns the next random boolean value. */ - bool nextBool() noexcept; - - /** Returns a BigInteger containing a random number. - @returns a random value in the range 0 to (maximumValue - 1). - */ - BigInteger nextLargeNumber (const BigInteger& maximumValue); - - /** Fills a block of memory with random values. */ - void fillBitsRandomly (void* bufferToFill, size_t sizeInBytes); - - /** Sets a range of bits in a BigInteger to random values. */ - void fillBitsRandomly (BigInteger& arrayToChange, int startBit, int numBits); - - //============================================================================== - /** Resets this Random object to a given seed value. */ - void setSeed (int64 newSeed) noexcept; - - /** Returns the RNG's current seed. */ - int64 getSeed() const noexcept { return seed; } - - /** Merges this object's seed with another value. - This sets the seed to be a value created by combining the current seed and this - new value. - */ - void combineSeed (int64 seedValue) noexcept; - - /** Reseeds this generator using a value generated from various semi-random system - properties like the current time, etc. - - Because this function convolves the time with the last seed value, calling - it repeatedly will increase the randomness of the final result. - */ - void setSeedRandomly(); - - /** The overhead of creating a new Random object is fairly small, but if you want to avoid - it, you can call this method to get a global shared Random object. - - It's not thread-safe though, so threads should use their own Random object, otherwise - you run the risk of your random numbers becoming.. erm.. randomly corrupted.. - */ - static Random& getSystemRandom() noexcept; - -private: - //============================================================================== - int64 seed; - - JUCE_LEAK_DETECTOR (Random) -}; - - -#endif // JUCE_RANDOM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/maths/juce_Range.h b/JuceLibraryCode/modules/juce_core/maths/juce_Range.h deleted file mode 100755 index 6add152..0000000 --- a/JuceLibraryCode/modules/juce_core/maths/juce_Range.h +++ /dev/null @@ -1,304 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_RANGE_H_INCLUDED -#define JUCE_RANGE_H_INCLUDED - - -//============================================================================== -/** A general-purpose range object, that simply represents any linear range with - a start and end point. - - Note that when checking whether values fall within the range, the start value is - considered to be inclusive, and the end of the range exclusive. - - The templated parameter is expected to be a primitive integer or floating point - type, though class types could also be used if they behave in a number-like way. -*/ -template -class Range -{ -public: - //============================================================================== - /** Constructs an empty range. */ - Range() noexcept : start(), end() - { - } - - /** Constructs a range with given start and end values. */ - Range (const ValueType startValue, const ValueType endValue) noexcept - : start (startValue), end (jmax (startValue, endValue)) - { - } - - /** Constructs a copy of another range. */ - Range (const Range& other) noexcept - : start (other.start), end (other.end) - { - } - - /** Copies another range object. */ - Range& operator= (Range other) noexcept - { - start = other.start; - end = other.end; - return *this; - } - - /** Returns the range that lies between two positions (in either order). */ - static Range between (const ValueType position1, const ValueType position2) noexcept - { - return position1 < position2 ? Range (position1, position2) - : Range (position2, position1); - } - - /** Returns a range with a given start and length. */ - static Range withStartAndLength (const ValueType startValue, const ValueType length) noexcept - { - jassert (length >= ValueType()); - return Range (startValue, startValue + length); - } - - /** Returns a range with the specified start position and a length of zero. */ - static Range emptyRange (const ValueType start) noexcept - { - return Range (start, start); - } - - //============================================================================== - /** Returns the start of the range. */ - inline ValueType getStart() const noexcept { return start; } - - /** Returns the length of the range. */ - inline ValueType getLength() const noexcept { return end - start; } - - /** Returns the end of the range. */ - inline ValueType getEnd() const noexcept { return end; } - - /** Returns true if the range has a length of zero. */ - inline bool isEmpty() const noexcept { return start == end; } - - //============================================================================== - /** Changes the start position of the range, leaving the end position unchanged. - If the new start position is higher than the current end of the range, the end point - will be pushed along to equal it, leaving an empty range at the new position. - */ - void setStart (const ValueType newStart) noexcept - { - start = newStart; - if (end < newStart) - end = newStart; - } - - /** Returns a range with the same end as this one, but a different start. - If the new start position is higher than the current end of the range, the end point - will be pushed along to equal it, returning an empty range at the new position. - */ - Range withStart (const ValueType newStart) const noexcept - { - return Range (newStart, jmax (newStart, end)); - } - - /** Returns a range with the same length as this one, but moved to have the given start position. */ - Range movedToStartAt (const ValueType newStart) const noexcept - { - return Range (newStart, end + (newStart - start)); - } - - /** Changes the end position of the range, leaving the start unchanged. - If the new end position is below the current start of the range, the start point - will be pushed back to equal the new end point. - */ - void setEnd (const ValueType newEnd) noexcept - { - end = newEnd; - if (newEnd < start) - start = newEnd; - } - - /** Returns a range with the same start position as this one, but a different end. - If the new end position is below the current start of the range, the start point - will be pushed back to equal the new end point. - */ - Range withEnd (const ValueType newEnd) const noexcept - { - return Range (jmin (start, newEnd), newEnd); - } - - /** Returns a range with the same length as this one, but moved to have the given end position. */ - Range movedToEndAt (const ValueType newEnd) const noexcept - { - return Range (start + (newEnd - end), newEnd); - } - - /** Changes the length of the range. - Lengths less than zero are treated as zero. - */ - void setLength (const ValueType newLength) noexcept - { - end = start + jmax (ValueType(), newLength); - } - - /** Returns a range with the same start as this one, but a different length. - Lengths less than zero are treated as zero. - */ - Range withLength (const ValueType newLength) const noexcept - { - return Range (start, start + newLength); - } - - //============================================================================== - /** Adds an amount to the start and end of the range. */ - inline Range operator+= (const ValueType amountToAdd) noexcept - { - start += amountToAdd; - end += amountToAdd; - return *this; - } - - /** Subtracts an amount from the start and end of the range. */ - inline Range operator-= (const ValueType amountToSubtract) noexcept - { - start -= amountToSubtract; - end -= amountToSubtract; - return *this; - } - - /** Returns a range that is equal to this one with an amount added to its - start and end. - */ - Range operator+ (const ValueType amountToAdd) const noexcept - { - return Range (start + amountToAdd, end + amountToAdd); - } - - /** Returns a range that is equal to this one with the specified amount - subtracted from its start and end. */ - Range operator- (const ValueType amountToSubtract) const noexcept - { - return Range (start - amountToSubtract, end - amountToSubtract); - } - - bool operator== (Range other) const noexcept { return start == other.start && end == other.end; } - bool operator!= (Range other) const noexcept { return start != other.start || end != other.end; } - - //============================================================================== - /** Returns true if the given position lies inside this range. */ - bool contains (const ValueType position) const noexcept - { - return start <= position && position < end; - } - - /** Returns the nearest value to the one supplied, which lies within the range. */ - ValueType clipValue (const ValueType value) const noexcept - { - return jlimit (start, end, value); - } - - /** Returns true if the given range lies entirely inside this range. - When making this comparison, the start value is considered to be inclusive, - and the end of the range exclusive. - */ - bool contains (Range other) const noexcept - { - return start <= other.start && end >= other.end; - } - - /** Returns true if the given range intersects this one. */ - bool intersects (Range other) const noexcept - { - return other.start < end && start < other.end; - } - - /** Returns the range that is the intersection of the two ranges, or an empty range - with an undefined start position if they don't overlap. */ - Range getIntersectionWith (Range other) const noexcept - { - return Range (jmax (start, other.start), - jmin (end, other.end)); - } - - /** Returns the smallest range that contains both this one and the other one. */ - Range getUnionWith (Range other) const noexcept - { - return Range (jmin (start, other.start), - jmax (end, other.end)); - } - - /** Returns the smallest range that contains both this one and the given value. */ - Range getUnionWith (const ValueType valueToInclude) const noexcept - { - return Range (jmin (valueToInclude, start), - jmax (valueToInclude, end)); - } - - /** Returns a given range, after moving it forwards or backwards to fit it - within this range. - - If the supplied range has a greater length than this one, the return value - will be this range. - - Otherwise, if the supplied range is smaller than this one, the return value - will be the new range, shifted forwards or backwards so that it doesn't extend - beyond this one, but keeping its original length. - */ - Range constrainRange (Range rangeToConstrain) const noexcept - { - const ValueType otherLen = rangeToConstrain.getLength(); - return getLength() <= otherLen - ? *this - : rangeToConstrain.movedToStartAt (jlimit (start, end - otherLen, rangeToConstrain.getStart())); - } - - /** Scans an array of values for its min and max, and returns these as a Range. */ - static Range findMinAndMax (const ValueType* values, int numValues) noexcept - { - if (numValues <= 0) - return Range(); - - const ValueType first (*values++); - Range r (first, first); - - while (--numValues > 0) // (> 0 rather than >= 0 because we've already taken the first sample) - { - const ValueType v (*values++); - - if (r.end < v) r.end = v; - if (v < r.start) r.start = v; - } - - return r; - } - -private: - //============================================================================== - ValueType start, end; -}; - - -#endif // JUCE_RANGE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h b/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h deleted file mode 100755 index 5e9d30c..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_Atomic.h +++ /dev/null @@ -1,399 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_ATOMIC_H_INCLUDED -#define JUCE_ATOMIC_H_INCLUDED - - -//============================================================================== -/** - Simple class to hold a primitive value and perform atomic operations on it. - - The type used must be a 32 or 64 bit primitive, like an int, pointer, etc. - There are methods to perform most of the basic atomic operations. -*/ -template -class Atomic -{ -public: - /** Creates a new value, initialised to zero. */ - inline Atomic() noexcept - : value (0) - { - } - - /** Creates a new value, with a given initial value. */ - inline explicit Atomic (const Type initialValue) noexcept - : value (initialValue) - { - } - - /** Copies another value (atomically). */ - inline Atomic (const Atomic& other) noexcept - : value (other.get()) - { - } - - /** Destructor. */ - inline ~Atomic() noexcept - { - // This class can only be used for types which are 32 or 64 bits in size. - static_jassert (sizeof (Type) == 4 || sizeof (Type) == 8); - } - - /** Atomically reads and returns the current value. */ - Type get() const noexcept; - - /** Copies another value onto this one (atomically). */ - inline Atomic& operator= (const Atomic& other) noexcept { exchange (other.get()); return *this; } - - /** Copies another value onto this one (atomically). */ - inline Atomic& operator= (const Type newValue) noexcept { exchange (newValue); return *this; } - - /** Atomically sets the current value. */ - void set (Type newValue) noexcept { exchange (newValue); } - - /** Atomically sets the current value, returning the value that was replaced. */ - Type exchange (Type value) noexcept; - - /** Atomically adds a number to this value, returning the new value. */ - Type operator+= (Type amountToAdd) noexcept; - - /** Atomically subtracts a number from this value, returning the new value. */ - Type operator-= (Type amountToSubtract) noexcept; - - /** Atomically increments this value, returning the new value. */ - Type operator++() noexcept; - - /** Atomically decrements this value, returning the new value. */ - Type operator--() noexcept; - - /** Atomically compares this value with a target value, and if it is equal, sets - this to be equal to a new value. - - This operation is the atomic equivalent of doing this: - @code - bool compareAndSetBool (Type newValue, Type valueToCompare) - { - if (get() == valueToCompare) - { - set (newValue); - return true; - } - - return false; - } - @endcode - - @returns true if the comparison was true and the value was replaced; false if - the comparison failed and the value was left unchanged. - @see compareAndSetValue - */ - bool compareAndSetBool (Type newValue, Type valueToCompare) noexcept; - - /** Atomically compares this value with a target value, and if it is equal, sets - this to be equal to a new value. - - This operation is the atomic equivalent of doing this: - @code - Type compareAndSetValue (Type newValue, Type valueToCompare) - { - Type oldValue = get(); - if (oldValue == valueToCompare) - set (newValue); - - return oldValue; - } - @endcode - - @returns the old value before it was changed. - @see compareAndSetBool - */ - Type compareAndSetValue (Type newValue, Type valueToCompare) noexcept; - - /** Implements a memory read/write barrier. */ - static void memoryBarrier() noexcept; - - //============================================================================== - #if JUCE_64BIT - JUCE_ALIGN (8) - #else - JUCE_ALIGN (4) - #endif - - /** The raw value that this class operates on. - This is exposed publically in case you need to manipulate it directly - for performance reasons. - */ - volatile Type value; - -private: - template - static inline Dest castTo (Source value) noexcept { union { Dest d; Source s; } u; u.s = value; return u.d; } - - static inline Type castFrom32Bit (int32 value) noexcept { return castTo (value); } - static inline Type castFrom64Bit (int64 value) noexcept { return castTo (value); } - static inline int32 castTo32Bit (Type value) noexcept { return castTo (value); } - static inline int64 castTo64Bit (Type value) noexcept { return castTo (value); } - - Type operator++ (int); // better to just use pre-increment with atomics.. - Type operator-- (int); - - /** This templated negate function will negate pointers as well as integers */ - template - inline ValueType negateValue (ValueType n) noexcept - { - return sizeof (ValueType) == 1 ? (ValueType) -(signed char) n - : (sizeof (ValueType) == 2 ? (ValueType) -(short) n - : (sizeof (ValueType) == 4 ? (ValueType) -(int) n - : ((ValueType) -(int64) n))); - } - - /** This templated negate function will negate pointers as well as integers */ - template - inline PointerType* negateValue (PointerType* n) noexcept - { - return reinterpret_cast (-reinterpret_cast (n)); - } -}; - - -//============================================================================== -/* - The following code is in the header so that the atomics can be inlined where possible... -*/ -#if JUCE_MAC && (JUCE_PPC || __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)) - #define JUCE_ATOMICS_MAC_LEGACY 1 // Older OSX builds using gcc4.1 or earlier - - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - #define JUCE_MAC_ATOMICS_VOLATILE - #else - #define JUCE_MAC_ATOMICS_VOLATILE volatile - #endif - - #if JUCE_PPC - // None of these atomics are available for PPC or for iOS 3.1 or earlier!! - template static Type OSAtomicAdd64Barrier (Type b, JUCE_MAC_ATOMICS_VOLATILE Type* a) noexcept { jassertfalse; return *a += b; } - template static Type OSAtomicIncrement64Barrier (JUCE_MAC_ATOMICS_VOLATILE Type* a) noexcept { jassertfalse; return ++*a; } - template static Type OSAtomicDecrement64Barrier (JUCE_MAC_ATOMICS_VOLATILE Type* a) noexcept { jassertfalse; return --*a; } - template static bool OSAtomicCompareAndSwap64Barrier (Type old, Type newValue, JUCE_MAC_ATOMICS_VOLATILE Type* value) noexcept - { jassertfalse; if (old == *value) { *value = newValue; return true; } return false; } - #define JUCE_64BIT_ATOMICS_UNAVAILABLE 1 - #endif - -//============================================================================== -#elif JUCE_GCC || JUCE_CLANG - #define JUCE_ATOMICS_GCC 1 // GCC with intrinsics - - #if JUCE_IOS || JUCE_ANDROID // (64-bit ops will compile but not link on these mobile OSes) - #define JUCE_64BIT_ATOMICS_UNAVAILABLE 1 - #endif - -//============================================================================== -#else - #define JUCE_ATOMICS_WINDOWS 1 // Windows with intrinsics - - #if JUCE_USE_MSVC_INTRINSICS - #ifndef __INTEL_COMPILER - #pragma intrinsic (_InterlockedExchange, _InterlockedIncrement, _InterlockedDecrement, _InterlockedCompareExchange, \ - _InterlockedCompareExchange64, _InterlockedExchangeAdd, _ReadWriteBarrier) - #endif - #define juce_InterlockedExchange(a, b) _InterlockedExchange(a, b) - #define juce_InterlockedIncrement(a) _InterlockedIncrement(a) - #define juce_InterlockedDecrement(a) _InterlockedDecrement(a) - #define juce_InterlockedExchangeAdd(a, b) _InterlockedExchangeAdd(a, b) - #define juce_InterlockedCompareExchange(a, b, c) _InterlockedCompareExchange(a, b, c) - #define juce_InterlockedCompareExchange64(a, b, c) _InterlockedCompareExchange64(a, b, c) - #define juce_MemoryBarrier _ReadWriteBarrier - #else - long juce_InterlockedExchange (volatile long* a, long b) noexcept; - long juce_InterlockedIncrement (volatile long* a) noexcept; - long juce_InterlockedDecrement (volatile long* a) noexcept; - long juce_InterlockedExchangeAdd (volatile long* a, long b) noexcept; - long juce_InterlockedCompareExchange (volatile long* a, long b, long c) noexcept; - __int64 juce_InterlockedCompareExchange64 (volatile __int64* a, __int64 b, __int64 c) noexcept; - inline void juce_MemoryBarrier() noexcept { long x = 0; juce_InterlockedIncrement (&x); } - #endif - - #if JUCE_64BIT - #ifndef __INTEL_COMPILER - #pragma intrinsic (_InterlockedExchangeAdd64, _InterlockedExchange64, _InterlockedIncrement64, _InterlockedDecrement64) - #endif - #define juce_InterlockedExchangeAdd64(a, b) _InterlockedExchangeAdd64(a, b) - #define juce_InterlockedExchange64(a, b) _InterlockedExchange64(a, b) - #define juce_InterlockedIncrement64(a) _InterlockedIncrement64(a) - #define juce_InterlockedDecrement64(a) _InterlockedDecrement64(a) - #else - // None of these atomics are available in a 32-bit Windows build!! - template static Type juce_InterlockedExchangeAdd64 (volatile Type* a, Type b) noexcept { jassertfalse; Type old = *a; *a += b; return old; } - template static Type juce_InterlockedExchange64 (volatile Type* a, Type b) noexcept { jassertfalse; Type old = *a; *a = b; return old; } - template static Type juce_InterlockedIncrement64 (volatile Type* a) noexcept { jassertfalse; return ++*a; } - template static Type juce_InterlockedDecrement64 (volatile Type* a) noexcept { jassertfalse; return --*a; } - #define JUCE_64BIT_ATOMICS_UNAVAILABLE 1 - #endif -#endif - - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4311) // (truncation warning) -#endif - -//============================================================================== -template -inline Type Atomic::get() const noexcept -{ - #if JUCE_ATOMICS_MAC_LEGACY - return sizeof (Type) == 4 ? castFrom32Bit ((int32) OSAtomicAdd32Barrier ((int32_t) 0, (JUCE_MAC_ATOMICS_VOLATILE int32_t*) &value)) - : castFrom64Bit ((int64) OSAtomicAdd64Barrier ((int64_t) 0, (JUCE_MAC_ATOMICS_VOLATILE int64_t*) &value)); - #elif JUCE_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? castFrom32Bit ((int32) juce_InterlockedExchangeAdd ((volatile long*) &value, (long) 0)) - : castFrom64Bit ((int64) juce_InterlockedExchangeAdd64 ((volatile __int64*) &value, (__int64) 0)); - #elif JUCE_ATOMICS_GCC - return sizeof (Type) == 4 ? castFrom32Bit ((int32) __sync_add_and_fetch ((volatile int32*) &value, 0)) - : castFrom64Bit ((int64) __sync_add_and_fetch ((volatile int64*) &value, 0)); - #endif -} - -template -inline Type Atomic::exchange (const Type newValue) noexcept -{ - #if JUCE_ATOMICS_MAC_LEGACY || JUCE_ATOMICS_GCC - Type currentVal = value; - while (! compareAndSetBool (newValue, currentVal)) { currentVal = value; } - return currentVal; - #elif JUCE_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? castFrom32Bit ((int32) juce_InterlockedExchange ((volatile long*) &value, (long) castTo32Bit (newValue))) - : castFrom64Bit ((int64) juce_InterlockedExchange64 ((volatile __int64*) &value, (__int64) castTo64Bit (newValue))); - #endif -} - -template -inline Type Atomic::operator+= (const Type amountToAdd) noexcept -{ - #if JUCE_ATOMICS_MAC_LEGACY - return sizeof (Type) == 4 ? (Type) OSAtomicAdd32Barrier ((int32_t) castTo32Bit (amountToAdd), (JUCE_MAC_ATOMICS_VOLATILE int32_t*) &value) - : (Type) OSAtomicAdd64Barrier ((int64_t) amountToAdd, (JUCE_MAC_ATOMICS_VOLATILE int64_t*) &value); - #elif JUCE_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? (Type) (juce_InterlockedExchangeAdd ((volatile long*) &value, (long) amountToAdd) + (long) amountToAdd) - : (Type) (juce_InterlockedExchangeAdd64 ((volatile __int64*) &value, (__int64) amountToAdd) + (__int64) amountToAdd); - #elif JUCE_ATOMICS_GCC - return (Type) __sync_add_and_fetch (&value, amountToAdd); - #endif -} - -template -inline Type Atomic::operator-= (const Type amountToSubtract) noexcept -{ - return operator+= (negateValue (amountToSubtract)); -} - -template -inline Type Atomic::operator++() noexcept -{ - #if JUCE_ATOMICS_MAC_LEGACY - return sizeof (Type) == 4 ? (Type) OSAtomicIncrement32Barrier ((JUCE_MAC_ATOMICS_VOLATILE int32_t*) &value) - : (Type) OSAtomicIncrement64Barrier ((JUCE_MAC_ATOMICS_VOLATILE int64_t*) &value); - #elif JUCE_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? (Type) juce_InterlockedIncrement ((volatile long*) &value) - : (Type) juce_InterlockedIncrement64 ((volatile __int64*) &value); - #elif JUCE_ATOMICS_GCC - return sizeof (Type) == 4 ? (Type) __sync_add_and_fetch (&value, (Type) 1) - : (Type) __sync_add_and_fetch ((int64_t*) &value, 1); - #endif -} - -template -inline Type Atomic::operator--() noexcept -{ - #if JUCE_ATOMICS_MAC_LEGACY - return sizeof (Type) == 4 ? (Type) OSAtomicDecrement32Barrier ((JUCE_MAC_ATOMICS_VOLATILE int32_t*) &value) - : (Type) OSAtomicDecrement64Barrier ((JUCE_MAC_ATOMICS_VOLATILE int64_t*) &value); - #elif JUCE_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? (Type) juce_InterlockedDecrement ((volatile long*) &value) - : (Type) juce_InterlockedDecrement64 ((volatile __int64*) &value); - #elif JUCE_ATOMICS_GCC - return sizeof (Type) == 4 ? (Type) __sync_add_and_fetch (&value, (Type) -1) - : (Type) __sync_add_and_fetch ((int64_t*) &value, -1); - #endif -} - -template -inline bool Atomic::compareAndSetBool (const Type newValue, const Type valueToCompare) noexcept -{ - #if JUCE_ATOMICS_MAC_LEGACY - return sizeof (Type) == 4 ? OSAtomicCompareAndSwap32Barrier ((int32_t) castTo32Bit (valueToCompare), (int32_t) castTo32Bit (newValue), (JUCE_MAC_ATOMICS_VOLATILE int32_t*) &value) - : OSAtomicCompareAndSwap64Barrier ((int64_t) castTo64Bit (valueToCompare), (int64_t) castTo64Bit (newValue), (JUCE_MAC_ATOMICS_VOLATILE int64_t*) &value); - #elif JUCE_ATOMICS_WINDOWS - return compareAndSetValue (newValue, valueToCompare) == valueToCompare; - #elif JUCE_ATOMICS_GCC - return sizeof (Type) == 4 ? __sync_bool_compare_and_swap ((volatile int32*) &value, castTo32Bit (valueToCompare), castTo32Bit (newValue)) - : __sync_bool_compare_and_swap ((volatile int64*) &value, castTo64Bit (valueToCompare), castTo64Bit (newValue)); - #endif -} - -template -inline Type Atomic::compareAndSetValue (const Type newValue, const Type valueToCompare) noexcept -{ - #if JUCE_ATOMICS_MAC_LEGACY - for (;;) // Annoying workaround for only having a bool CAS operation.. - { - if (compareAndSetBool (newValue, valueToCompare)) - return valueToCompare; - - const Type result = value; - if (result != valueToCompare) - return result; - } - - #elif JUCE_ATOMICS_WINDOWS - return sizeof (Type) == 4 ? castFrom32Bit ((int32) juce_InterlockedCompareExchange ((volatile long*) &value, (long) castTo32Bit (newValue), (long) castTo32Bit (valueToCompare))) - : castFrom64Bit ((int64) juce_InterlockedCompareExchange64 ((volatile __int64*) &value, (__int64) castTo64Bit (newValue), (__int64) castTo64Bit (valueToCompare))); - #elif JUCE_ATOMICS_GCC - return sizeof (Type) == 4 ? castFrom32Bit ((int32) __sync_val_compare_and_swap ((volatile int32*) &value, castTo32Bit (valueToCompare), castTo32Bit (newValue))) - : castFrom64Bit ((int64) __sync_val_compare_and_swap ((volatile int64*) &value, castTo64Bit (valueToCompare), castTo64Bit (newValue))); - #endif -} - -template -inline void Atomic::memoryBarrier() noexcept -{ - #if JUCE_ATOMICS_MAC_LEGACY - OSMemoryBarrier(); - #elif JUCE_ATOMICS_GCC - __sync_synchronize(); - #elif JUCE_ATOMICS_WINDOWS - juce_MemoryBarrier(); - #endif -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -#endif // JUCE_ATOMIC_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h b/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h deleted file mode 100755 index fcd56bc..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_ByteOrder.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_BYTEORDER_H_INCLUDED -#define JUCE_BYTEORDER_H_INCLUDED - - -//============================================================================== -/** Contains static methods for converting the byte order between different - endiannesses. -*/ -class JUCE_API ByteOrder -{ -public: - //============================================================================== - /** Swaps the upper and lower bytes of a 16-bit integer. */ - static uint16 swap (uint16 value) noexcept; - - /** Reverses the order of the 4 bytes in a 32-bit integer. */ - static uint32 swap (uint32 value) noexcept; - - /** Reverses the order of the 8 bytes in a 64-bit integer. */ - static uint64 swap (uint64 value) noexcept; - - //============================================================================== - /** Swaps the byte order of a 16-bit int if the CPU is big-endian */ - static uint16 swapIfBigEndian (uint16 value) noexcept; - - /** Swaps the byte order of a 32-bit int if the CPU is big-endian */ - static uint32 swapIfBigEndian (uint32 value) noexcept; - - /** Swaps the byte order of a 64-bit int if the CPU is big-endian */ - static uint64 swapIfBigEndian (uint64 value) noexcept; - - /** Swaps the byte order of a 16-bit int if the CPU is little-endian */ - static uint16 swapIfLittleEndian (uint16 value) noexcept; - - /** Swaps the byte order of a 32-bit int if the CPU is little-endian */ - static uint32 swapIfLittleEndian (uint32 value) noexcept; - - /** Swaps the byte order of a 64-bit int if the CPU is little-endian */ - static uint64 swapIfLittleEndian (uint64 value) noexcept; - - //============================================================================== - /** Turns 4 bytes into a little-endian integer. */ - static uint32 littleEndianInt (const void* bytes) noexcept; - - /** Turns 8 bytes into a little-endian integer. */ - static uint64 littleEndianInt64 (const void* bytes) noexcept; - - /** Turns 2 bytes into a little-endian integer. */ - static uint16 littleEndianShort (const void* bytes) noexcept; - - /** Turns 4 bytes into a big-endian integer. */ - static uint32 bigEndianInt (const void* bytes) noexcept; - - /** Turns 8 bytes into a big-endian integer. */ - static uint64 bigEndianInt64 (const void* bytes) noexcept; - - /** Turns 2 bytes into a big-endian integer. */ - static uint16 bigEndianShort (const void* bytes) noexcept; - - //============================================================================== - /** Converts 3 little-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */ - static int littleEndian24Bit (const void* bytes) noexcept; - - /** Converts 3 big-endian bytes into a signed 24-bit value (which is sign-extended to 32 bits). */ - static int bigEndian24Bit (const void* bytes) noexcept; - - /** Copies a 24-bit number to 3 little-endian bytes. */ - static void littleEndian24BitToChars (int value, void* destBytes) noexcept; - - /** Copies a 24-bit number to 3 big-endian bytes. */ - static void bigEndian24BitToChars (int value, void* destBytes) noexcept; - - //============================================================================== - /** Returns true if the current CPU is big-endian. */ - static bool isBigEndian() noexcept; - -private: - ByteOrder() JUCE_DELETED_FUNCTION; - - JUCE_DECLARE_NON_COPYABLE (ByteOrder) -}; - - -//============================================================================== -#if JUCE_USE_MSVC_INTRINSICS && ! defined (__INTEL_COMPILER) - #pragma intrinsic (_byteswap_ulong) -#endif - -inline uint16 ByteOrder::swap (uint16 n) noexcept -{ - #if JUCE_USE_MSVC_INTRINSICSxxx // agh - the MS compiler has an internal error when you try to use this intrinsic! - return static_cast (_byteswap_ushort (n)); - #else - return static_cast ((n << 8) | (n >> 8)); - #endif -} - -inline uint32 ByteOrder::swap (uint32 n) noexcept -{ - #if JUCE_MAC || JUCE_IOS - return OSSwapInt32 (n); - #elif JUCE_GCC && JUCE_INTEL && ! JUCE_NO_INLINE_ASM - asm("bswap %%eax" : "=a"(n) : "a"(n)); - return n; - #elif JUCE_USE_MSVC_INTRINSICS - return _byteswap_ulong (n); - #elif JUCE_MSVC && ! JUCE_NO_INLINE_ASM - __asm { - mov eax, n - bswap eax - mov n, eax - } - return n; - #elif JUCE_ANDROID - return bswap_32 (n); - #else - return (n << 24) | (n >> 24) | ((n & 0xff00) << 8) | ((n & 0xff0000) >> 8); - #endif -} - -inline uint64 ByteOrder::swap (uint64 value) noexcept -{ - #if JUCE_MAC || JUCE_IOS - return OSSwapInt64 (value); - #elif JUCE_USE_MSVC_INTRINSICS - return _byteswap_uint64 (value); - #else - return (((int64) swap ((uint32) value)) << 32) | swap ((uint32) (value >> 32)); - #endif -} - -#if JUCE_LITTLE_ENDIAN - inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) noexcept { return v; } - inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) noexcept { return v; } - inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) noexcept { return v; } - inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) noexcept { return swap (v); } - inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) noexcept { return swap (v); } - inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) noexcept { return swap (v); } - inline uint32 ByteOrder::littleEndianInt (const void* const bytes) noexcept { return *static_cast (bytes); } - inline uint64 ByteOrder::littleEndianInt64 (const void* const bytes) noexcept { return *static_cast (bytes); } - inline uint16 ByteOrder::littleEndianShort (const void* const bytes) noexcept { return *static_cast (bytes); } - inline uint32 ByteOrder::bigEndianInt (const void* const bytes) noexcept { return swap (*static_cast (bytes)); } - inline uint64 ByteOrder::bigEndianInt64 (const void* const bytes) noexcept { return swap (*static_cast (bytes)); } - inline uint16 ByteOrder::bigEndianShort (const void* const bytes) noexcept { return swap (*static_cast (bytes)); } - inline bool ByteOrder::isBigEndian() noexcept { return false; } -#else - inline uint16 ByteOrder::swapIfBigEndian (const uint16 v) noexcept { return swap (v); } - inline uint32 ByteOrder::swapIfBigEndian (const uint32 v) noexcept { return swap (v); } - inline uint64 ByteOrder::swapIfBigEndian (const uint64 v) noexcept { return swap (v); } - inline uint16 ByteOrder::swapIfLittleEndian (const uint16 v) noexcept { return v; } - inline uint32 ByteOrder::swapIfLittleEndian (const uint32 v) noexcept { return v; } - inline uint64 ByteOrder::swapIfLittleEndian (const uint64 v) noexcept { return v; } - inline uint32 ByteOrder::littleEndianInt (const void* const bytes) noexcept { return swap (*static_cast (bytes)); } - inline uint64 ByteOrder::littleEndianInt64 (const void* const bytes) noexcept { return swap (*static_cast (bytes)); } - inline uint16 ByteOrder::littleEndianShort (const void* const bytes) noexcept { return swap (*static_cast (bytes)); } - inline uint32 ByteOrder::bigEndianInt (const void* const bytes) noexcept { return *static_cast (bytes); } - inline uint64 ByteOrder::bigEndianInt64 (const void* const bytes) noexcept { return *static_cast (bytes); } - inline uint16 ByteOrder::bigEndianShort (const void* const bytes) noexcept { return *static_cast (bytes); } - inline bool ByteOrder::isBigEndian() noexcept { return true; } -#endif - -inline int ByteOrder::littleEndian24Bit (const void* const bytes) noexcept { return (((int) static_cast (bytes)[2]) << 16) | (((int) static_cast (bytes)[1]) << 8) | ((int) static_cast (bytes)[0]); } -inline int ByteOrder::bigEndian24Bit (const void* const bytes) noexcept { return (((int) static_cast (bytes)[0]) << 16) | (((int) static_cast (bytes)[1]) << 8) | ((int) static_cast (bytes)[2]); } -inline void ByteOrder::littleEndian24BitToChars (const int value, void* const destBytes) noexcept { static_cast (destBytes)[0] = (uint8) value; static_cast (destBytes)[1] = (uint8) (value >> 8); static_cast (destBytes)[2] = (uint8) (value >> 16); } -inline void ByteOrder::bigEndian24BitToChars (const int value, void* const destBytes) noexcept { static_cast (destBytes)[0] = (uint8) (value >> 16); static_cast (destBytes)[1] = (uint8) (value >> 8); static_cast (destBytes)[2] = (uint8) value; } - - -#endif // JUCE_BYTEORDER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h b/JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h deleted file mode 100755 index 60cddaa..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_ContainerDeletePolicy.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_CONTAINERDELETEPOLICY_H_INCLUDED -#define JUCE_CONTAINERDELETEPOLICY_H_INCLUDED - -//============================================================================== -/** - Used by container classes as an indirect way to delete an object of a - particular type. - - The generic implementation of this class simply calls 'delete', but you can - create a specialised version of it for a particular class if you need to - delete that type of object in a more appropriate way. - - @see ScopedPointer, OwnedArray -*/ -template -struct ContainerDeletePolicy -{ - static void destroy (ObjectType* object) - { - delete object; - } -}; - - -#endif // JUCE_CONTAINERDELETEPOLICY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h b/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h deleted file mode 100755 index 3731f0b..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_HeapBlock.h +++ /dev/null @@ -1,308 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_HEAPBLOCK_H_INCLUDED -#define JUCE_HEAPBLOCK_H_INCLUDED - -#ifndef DOXYGEN -namespace HeapBlockHelper -{ - template - struct ThrowOnFail { static void check (void*) {} }; - - template<> - struct ThrowOnFail { static void check (void* data) { if (data == nullptr) throw std::bad_alloc(); } }; -} -#endif - -//============================================================================== -/** - Very simple container class to hold a pointer to some data on the heap. - - When you need to allocate some heap storage for something, always try to use - this class instead of allocating the memory directly using malloc/free. - - A HeapBlock object can be treated in pretty much exactly the same way - as an char*, but as long as you allocate it on the stack or as a class member, - it's almost impossible for it to leak memory. - - It also makes your code much more concise and readable than doing the same thing - using direct allocations, - - E.g. instead of this: - @code - int* temp = (int*) malloc (1024 * sizeof (int)); - memcpy (temp, xyz, 1024 * sizeof (int)); - free (temp); - temp = (int*) calloc (2048 * sizeof (int)); - temp[0] = 1234; - memcpy (foobar, temp, 2048 * sizeof (int)); - free (temp); - @endcode - - ..you could just write this: - @code - HeapBlock temp (1024); - memcpy (temp, xyz, 1024 * sizeof (int)); - temp.calloc (2048); - temp[0] = 1234; - memcpy (foobar, temp, 2048 * sizeof (int)); - @endcode - - The class is extremely lightweight, containing only a pointer to the - data, and exposes malloc/realloc/calloc/free methods that do the same jobs - as their less object-oriented counterparts. Despite adding safety, you probably - won't sacrifice any performance by using this in place of normal pointers. - - The throwOnFailure template parameter can be set to true if you'd like the class - to throw a std::bad_alloc exception when an allocation fails. If this is false, - then a failed allocation will just leave the heapblock with a null pointer (assuming - that the system's malloc() function doesn't throw). - - @see Array, OwnedArray, MemoryBlock -*/ -template -class HeapBlock -{ -public: - //============================================================================== - /** Creates a HeapBlock which is initially just a null pointer. - - After creation, you can resize the array using the malloc(), calloc(), - or realloc() methods. - */ - HeapBlock() noexcept : data (nullptr) - { - } - - /** Creates a HeapBlock containing a number of elements. - - The contents of the block are undefined, as it will have been created by a - malloc call. - - If you want an array of zero values, you can use the calloc() method or the - other constructor that takes an InitialisationState parameter. - */ - explicit HeapBlock (const size_t numElements) - : data (static_cast (std::malloc (numElements * sizeof (ElementType)))) - { - throwOnAllocationFailure(); - } - - /** Creates a HeapBlock containing a number of elements. - - The initialiseToZero parameter determines whether the new memory should be cleared, - or left uninitialised. - */ - HeapBlock (const size_t numElements, const bool initialiseToZero) - : data (static_cast (initialiseToZero - ? std::calloc (numElements, sizeof (ElementType)) - : std::malloc (numElements * sizeof (ElementType)))) - { - throwOnAllocationFailure(); - } - - /** Destructor. - This will free the data, if any has been allocated. - */ - ~HeapBlock() - { - std::free (data); - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - HeapBlock (HeapBlock&& other) noexcept - : data (other.data) - { - other.data = nullptr; - } - - HeapBlock& operator= (HeapBlock&& other) noexcept - { - std::swap (data, other.data); - return *this; - } - #endif - - //============================================================================== - /** Returns a raw pointer to the allocated data. - This may be a null pointer if the data hasn't yet been allocated, or if it has been - freed by calling the free() method. - */ - inline operator ElementType*() const noexcept { return data; } - - /** Returns a raw pointer to the allocated data. - This may be a null pointer if the data hasn't yet been allocated, or if it has been - freed by calling the free() method. - */ - inline ElementType* getData() const noexcept { return data; } - - /** Returns a void pointer to the allocated data. - This may be a null pointer if the data hasn't yet been allocated, or if it has been - freed by calling the free() method. - */ - inline operator void*() const noexcept { return static_cast (data); } - - /** Returns a void pointer to the allocated data. - This may be a null pointer if the data hasn't yet been allocated, or if it has been - freed by calling the free() method. - */ - inline operator const void*() const noexcept { return static_cast (data); } - - /** Lets you use indirect calls to the first element in the array. - Obviously this will cause problems if the array hasn't been initialised, because it'll - be referencing a null pointer. - */ - inline ElementType* operator->() const noexcept { return data; } - - /** Returns a reference to one of the data elements. - Obviously there's no bounds-checking here, as this object is just a dumb pointer and - has no idea of the size it currently has allocated. - */ - template - inline ElementType& operator[] (IndexType index) const noexcept { return data [index]; } - - /** Returns a pointer to a data element at an offset from the start of the array. - This is the same as doing pointer arithmetic on the raw pointer itself. - */ - template - inline ElementType* operator+ (IndexType index) const noexcept { return data + index; } - - //============================================================================== - /** Compares the pointer with another pointer. - This can be handy for checking whether this is a null pointer. - */ - inline bool operator== (const ElementType* const otherPointer) const noexcept { return otherPointer == data; } - - /** Compares the pointer with another pointer. - This can be handy for checking whether this is a null pointer. - */ - inline bool operator!= (const ElementType* const otherPointer) const noexcept { return otherPointer != data; } - - //============================================================================== - /** Allocates a specified amount of memory. - - This uses the normal malloc to allocate an amount of memory for this object. - Any previously allocated memory will be freed by this method. - - The number of bytes allocated will be (newNumElements * elementSize). Normally - you wouldn't need to specify the second parameter, but it can be handy if you need - to allocate a size in bytes rather than in terms of the number of elements. - - The data that is allocated will be freed when this object is deleted, or when you - call free() or any of the allocation methods. - */ - void malloc (const size_t newNumElements, const size_t elementSize = sizeof (ElementType)) - { - std::free (data); - data = static_cast (std::malloc (newNumElements * elementSize)); - throwOnAllocationFailure(); - } - - /** Allocates a specified amount of memory and clears it. - This does the same job as the malloc() method, but clears the memory that it allocates. - */ - void calloc (const size_t newNumElements, const size_t elementSize = sizeof (ElementType)) - { - std::free (data); - data = static_cast (std::calloc (newNumElements, elementSize)); - throwOnAllocationFailure(); - } - - /** Allocates a specified amount of memory and optionally clears it. - This does the same job as either malloc() or calloc(), depending on the - initialiseToZero parameter. - */ - void allocate (const size_t newNumElements, bool initialiseToZero) - { - std::free (data); - data = static_cast (initialiseToZero - ? std::calloc (newNumElements, sizeof (ElementType)) - : std::malloc (newNumElements * sizeof (ElementType))); - throwOnAllocationFailure(); - } - - /** Re-allocates a specified amount of memory. - - The semantics of this method are the same as malloc() and calloc(), but it - uses realloc() to keep as much of the existing data as possible. - */ - void realloc (const size_t newNumElements, const size_t elementSize = sizeof (ElementType)) - { - data = static_cast (data == nullptr ? std::malloc (newNumElements * elementSize) - : std::realloc (data, newNumElements * elementSize)); - throwOnAllocationFailure(); - } - - /** Frees any currently-allocated data. - This will free the data and reset this object to be a null pointer. - */ - void free() - { - std::free (data); - data = nullptr; - } - - /** Swaps this object's data with the data of another HeapBlock. - The two objects simply exchange their data pointers. - */ - template - void swapWith (HeapBlock & other) noexcept - { - std::swap (data, other.data); - } - - /** This fills the block with zeros, up to the number of elements specified. - Since the block has no way of knowing its own size, you must make sure that the number of - elements you specify doesn't exceed the allocated size. - */ - void clear (size_t numElements) noexcept - { - zeromem (data, sizeof (ElementType) * numElements); - } - - /** This typedef can be used to get the type of the heapblock's elements. */ - typedef ElementType Type; - -private: - //============================================================================== - ElementType* data; - - void throwOnAllocationFailure() const - { - HeapBlockHelper::ThrowOnFail::check (data); - } - - #if ! (defined (JUCE_DLL) || defined (JUCE_DLL_BUILD)) - JUCE_DECLARE_NON_COPYABLE (HeapBlock) - JUCE_PREVENT_HEAP_ALLOCATION // Creating a 'new HeapBlock' would be missing the point! - #endif -}; - - -#endif // JUCE_HEAPBLOCK_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h b/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h deleted file mode 100755 index 248e7bc..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_LeakedObjectDetector.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_LEAKEDOBJECTDETECTOR_H_INCLUDED -#define JUCE_LEAKEDOBJECTDETECTOR_H_INCLUDED - - -//============================================================================== -/** - Embedding an instance of this class inside another class can be used as a low-overhead - way of detecting leaked instances. - - This class keeps an internal static count of the number of instances that are - active, so that when the app is shutdown and the static destructors are called, - it can check whether there are any left-over instances that may have been leaked. - - To use it, use the JUCE_LEAK_DETECTOR macro as a simple way to put one in your - class declaration. Have a look through the juce codebase for examples, it's used - in most of the classes. -*/ -template -class LeakedObjectDetector -{ -public: - //============================================================================== - LeakedObjectDetector() noexcept { ++(getCounter().numObjects); } - LeakedObjectDetector (const LeakedObjectDetector&) noexcept { ++(getCounter().numObjects); } - - ~LeakedObjectDetector() - { - if (--(getCounter().numObjects) < 0) - { - DBG ("*** Dangling pointer deletion! Class: " << getLeakedObjectClassName()); - - /** If you hit this, then you've managed to delete more instances of this class than you've - created.. That indicates that you're deleting some dangling pointers. - - Note that although this assertion will have been triggered during a destructor, it might - not be this particular deletion that's at fault - the incorrect one may have happened - at an earlier point in the program, and simply not been detected until now. - - Most errors like this are caused by using old-fashioned, non-RAII techniques for - your object management. Tut, tut. Always, always use ScopedPointers, OwnedArrays, - ReferenceCountedObjects, etc, and avoid the 'delete' operator at all costs! - */ - jassertfalse; - } - } - -private: - //============================================================================== - class LeakCounter - { - public: - LeakCounter() noexcept {} - - ~LeakCounter() - { - if (numObjects.value > 0) - { - DBG ("*** Leaked objects detected: " << numObjects.value << " instance(s) of class " << getLeakedObjectClassName()); - - /** If you hit this, then you've leaked one or more objects of the type specified by - the 'OwnerClass' template parameter - the name should have been printed by the line above. - - If you're leaking, it's probably because you're using old-fashioned, non-RAII techniques for - your object management. Tut, tut. Always, always use ScopedPointers, OwnedArrays, - ReferenceCountedObjects, etc, and avoid the 'delete' operator at all costs! - */ - jassertfalse; - } - } - - Atomic numObjects; - }; - - static const char* getLeakedObjectClassName() - { - return OwnerClass::getLeakedObjectClassName(); - } - - static LeakCounter& getCounter() noexcept - { - static LeakCounter counter; - return counter; - } -}; - -//============================================================================== -#if DOXYGEN || ! defined (JUCE_LEAK_DETECTOR) - #if (DOXYGEN || JUCE_CHECK_MEMORY_LEAKS) - /** This macro lets you embed a leak-detecting object inside a class. - - To use it, simply declare a JUCE_LEAK_DETECTOR(YourClassName) inside a private section - of the class declaration. E.g. - - @code - class MyClass - { - public: - MyClass(); - void blahBlah(); - - private: - JUCE_LEAK_DETECTOR (MyClass) - }; - @endcode - - @see JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR, LeakedObjectDetector - */ - #define JUCE_LEAK_DETECTOR(OwnerClass) \ - friend class juce::LeakedObjectDetector; \ - static const char* getLeakedObjectClassName() noexcept { return #OwnerClass; } \ - juce::LeakedObjectDetector JUCE_JOIN_MACRO (leakDetector, __LINE__); - #else - #define JUCE_LEAK_DETECTOR(OwnerClass) - #endif -#endif - - -#endif // JUCE_LEAKEDOBJECTDETECTOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h b/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h deleted file mode 100755 index 57d1644..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_Memory.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_MEMORY_H_INCLUDED -#define JUCE_MEMORY_H_INCLUDED - -//============================================================================== -/** Fills a block of memory with zeros. */ -inline void zeromem (void* memory, size_t numBytes) noexcept { memset (memory, 0, numBytes); } - -/** Overwrites a structure or object with zeros. */ -template -inline void zerostruct (Type& structure) noexcept { memset (&structure, 0, sizeof (structure)); } - -/** Delete an object pointer, and sets the pointer to null. - - Remember that it's not good c++ practice to use delete directly - always try to use a ScopedPointer - or other automatic lifetime-management system rather than resorting to deleting raw pointers! -*/ -template -inline void deleteAndZero (Type& pointer) { delete pointer; pointer = nullptr; } - -/** A handy function which adds a number of bytes to any type of pointer and returns the result. - This can be useful to avoid casting pointers to a char* and back when you want to move them by - a specific number of bytes, -*/ -template -inline Type* addBytesToPointer (Type* pointer, IntegerType bytes) noexcept { return (Type*) (((char*) pointer) + bytes); } - -/** A handy function which returns the difference between any two pointers, in bytes. - The address of the second pointer is subtracted from the first, and the difference in bytes is returned. -*/ -template -inline int getAddressDifference (Type1* pointer1, Type2* pointer2) noexcept { return (int) (((const char*) pointer1) - (const char*) pointer2); } - -/** If a pointer is non-null, this returns a new copy of the object that it points to, or safely returns - nullptr if the pointer is null. -*/ -template -inline Type* createCopyIfNotNull (const Type* pointer) { return pointer != nullptr ? new Type (*pointer) : nullptr; } - -//============================================================================== -#if JUCE_MAC || JUCE_IOS || DOXYGEN - - /** A handy C++ wrapper that creates and deletes an NSAutoreleasePool object using RAII. - You should use the JUCE_AUTORELEASEPOOL macro to create a local auto-release pool on the stack. - */ - class JUCE_API ScopedAutoReleasePool - { - public: - ScopedAutoReleasePool(); - ~ScopedAutoReleasePool(); - - private: - void* pool; - - JUCE_DECLARE_NON_COPYABLE (ScopedAutoReleasePool) - }; - - /** A macro that can be used to easily declare a local ScopedAutoReleasePool - object for RAII-based obj-C autoreleasing. - Because this may use the \@autoreleasepool syntax, you must follow the macro with - a set of braces to mark the scope of the pool. - */ -#if (JUCE_COMPILER_SUPPORTS_ARC && defined (__OBJC__)) || DOXYGEN - #define JUCE_AUTORELEASEPOOL @autoreleasepool -#else - #define JUCE_AUTORELEASEPOOL const juce::ScopedAutoReleasePool JUCE_JOIN_MACRO (autoReleasePool_, __LINE__); -#endif - -#else - #define JUCE_AUTORELEASEPOOL -#endif - -//============================================================================== -/* In a Windows DLL build, we'll expose some malloc/free functions that live inside the DLL, and use these for - allocating all the objects - that way all juce objects in the DLL and in the host will live in the same heap, - avoiding problems when an object is created in one module and passed across to another where it is deleted. - By piggy-backing on the JUCE_LEAK_DETECTOR macro, these allocators can be injected into most juce classes. -*/ -#if JUCE_MSVC && (defined (JUCE_DLL) || defined (JUCE_DLL_BUILD)) && ! (JUCE_DISABLE_DLL_ALLOCATORS || DOXYGEN) - extern JUCE_API void* juceDLL_malloc (size_t); - extern JUCE_API void juceDLL_free (void*); - - #define JUCE_LEAK_DETECTOR(OwnerClass) public:\ - static void* operator new (size_t sz) { return juce::juceDLL_malloc (sz); } \ - static void* operator new (size_t, void* p) { return p; } \ - static void operator delete (void* p) { juce::juceDLL_free (p); } \ - static void operator delete (void*, void*) {} -#endif - -//============================================================================== -/** (Deprecated) This was a Windows-specific way of checking for object leaks - now please - use the JUCE_LEAK_DETECTOR instead. -*/ -#ifndef juce_UseDebuggingNewOperator - #define juce_UseDebuggingNewOperator -#endif - - -#endif // JUCE_MEMORY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp b/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp deleted file mode 100755 index 6097c7e..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.cpp +++ /dev/null @@ -1,416 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -MemoryBlock::MemoryBlock() noexcept - : size (0) -{ -} - -MemoryBlock::MemoryBlock (const size_t initialSize, const bool initialiseToZero) -{ - if (initialSize > 0) - { - size = initialSize; - data.allocate (initialSize, initialiseToZero); - } - else - { - size = 0; - } -} - -MemoryBlock::MemoryBlock (const MemoryBlock& other) - : size (other.size) -{ - if (size > 0) - { - jassert (other.data != nullptr); - data.malloc (size); - memcpy (data, other.data, size); - } -} - -MemoryBlock::MemoryBlock (const void* const dataToInitialiseFrom, const size_t sizeInBytes) - : size (sizeInBytes) -{ - jassert (((ssize_t) sizeInBytes) >= 0); - - if (size > 0) - { - jassert (dataToInitialiseFrom != nullptr); // non-zero size, but a zero pointer passed-in? - - data.malloc (size); - - if (dataToInitialiseFrom != nullptr) - memcpy (data, dataToInitialiseFrom, size); - } -} - -MemoryBlock::~MemoryBlock() noexcept -{ -} - -MemoryBlock& MemoryBlock::operator= (const MemoryBlock& other) -{ - if (this != &other) - { - setSize (other.size, false); - memcpy (data, other.data, size); - } - - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -MemoryBlock::MemoryBlock (MemoryBlock&& other) noexcept - : data (static_cast&&> (other.data)), - size (other.size) -{ -} - -MemoryBlock& MemoryBlock::operator= (MemoryBlock&& other) noexcept -{ - data = static_cast&&> (other.data); - size = other.size; - return *this; -} -#endif - - -//============================================================================== -bool MemoryBlock::operator== (const MemoryBlock& other) const noexcept -{ - return matches (other.data, other.size); -} - -bool MemoryBlock::operator!= (const MemoryBlock& other) const noexcept -{ - return ! operator== (other); -} - -bool MemoryBlock::matches (const void* dataToCompare, size_t dataSize) const noexcept -{ - return size == dataSize - && memcmp (data, dataToCompare, size) == 0; -} - -//============================================================================== -// this will resize the block to this size -void MemoryBlock::setSize (const size_t newSize, const bool initialiseToZero) -{ - if (size != newSize) - { - if (newSize <= 0) - { - reset(); - } - else - { - if (data != nullptr) - { - data.realloc (newSize); - - if (initialiseToZero && (newSize > size)) - zeromem (data + size, newSize - size); - } - else - { - data.allocate (newSize, initialiseToZero); - } - - size = newSize; - } - } -} - -void MemoryBlock::reset() -{ - data.free(); - size = 0; -} - -void MemoryBlock::ensureSize (const size_t minimumSize, const bool initialiseToZero) -{ - if (size < minimumSize) - setSize (minimumSize, initialiseToZero); -} - -void MemoryBlock::swapWith (MemoryBlock& other) noexcept -{ - std::swap (size, other.size); - data.swapWith (other.data); -} - -//============================================================================== -void MemoryBlock::fillWith (const uint8 value) noexcept -{ - memset (data, (int) value, size); -} - -void MemoryBlock::append (const void* const srcData, const size_t numBytes) -{ - if (numBytes > 0) - { - jassert (srcData != nullptr); // this must not be null! - const size_t oldSize = size; - setSize (size + numBytes); - memcpy (data + oldSize, srcData, numBytes); - } -} - -void MemoryBlock::replaceWith (const void* const srcData, const size_t numBytes) -{ - if (numBytes > 0) - { - jassert (srcData != nullptr); // this must not be null! - setSize (numBytes); - memcpy (data, srcData, numBytes); - } -} - -void MemoryBlock::insert (const void* const srcData, const size_t numBytes, size_t insertPosition) -{ - if (numBytes > 0) - { - jassert (srcData != nullptr); // this must not be null! - insertPosition = jmin (size, insertPosition); - const size_t trailingDataSize = size - insertPosition; - setSize (size + numBytes, false); - - if (trailingDataSize > 0) - memmove (data + insertPosition + numBytes, - data + insertPosition, - trailingDataSize); - - memcpy (data + insertPosition, srcData, numBytes); - } -} - -void MemoryBlock::removeSection (const size_t startByte, const size_t numBytesToRemove) -{ - if (startByte + numBytesToRemove >= size) - { - setSize (startByte); - } - else if (numBytesToRemove > 0) - { - memmove (data + startByte, - data + startByte + numBytesToRemove, - size - (startByte + numBytesToRemove)); - - setSize (size - numBytesToRemove); - } -} - -void MemoryBlock::copyFrom (const void* const src, int offset, size_t num) noexcept -{ - const char* d = static_cast (src); - - if (offset < 0) - { - d -= offset; - num += (size_t) -offset; - offset = 0; - } - - if ((size_t) offset + num > size) - num = size - (size_t) offset; - - if (num > 0) - memcpy (data + offset, d, num); -} - -void MemoryBlock::copyTo (void* const dst, int offset, size_t num) const noexcept -{ - char* d = static_cast (dst); - - if (offset < 0) - { - zeromem (d, (size_t) -offset); - d -= offset; - num -= (size_t) -offset; - offset = 0; - } - - if ((size_t) offset + num > size) - { - const size_t newNum = size - (size_t) offset; - zeromem (d + newNum, num - newNum); - num = newNum; - } - - if (num > 0) - memcpy (d, data + offset, num); -} - -String MemoryBlock::toString() const -{ - return String::fromUTF8 (data, (int) size); -} - -//============================================================================== -int MemoryBlock::getBitRange (const size_t bitRangeStart, size_t numBits) const noexcept -{ - int res = 0; - - size_t byte = bitRangeStart >> 3; - size_t offsetInByte = bitRangeStart & 7; - size_t bitsSoFar = 0; - - while (numBits > 0 && (size_t) byte < size) - { - const size_t bitsThisTime = jmin (numBits, 8 - offsetInByte); - const int mask = (0xff >> (8 - bitsThisTime)) << offsetInByte; - - res |= (((data[byte] & mask) >> offsetInByte) << bitsSoFar); - - bitsSoFar += bitsThisTime; - numBits -= bitsThisTime; - ++byte; - offsetInByte = 0; - } - - return res; -} - -void MemoryBlock::setBitRange (const size_t bitRangeStart, size_t numBits, int bitsToSet) noexcept -{ - size_t byte = bitRangeStart >> 3; - size_t offsetInByte = bitRangeStart & 7; - uint32 mask = ~((((uint32) 0xffffffff) << (32 - numBits)) >> (32 - numBits)); - - while (numBits > 0 && (size_t) byte < size) - { - const size_t bitsThisTime = jmin (numBits, 8 - offsetInByte); - - const uint32 tempMask = (mask << offsetInByte) | ~((((uint32) 0xffffffff) >> offsetInByte) << offsetInByte); - const uint32 tempBits = (uint32) bitsToSet << offsetInByte; - - data[byte] = (char) (((uint32) data[byte] & tempMask) | tempBits); - - ++byte; - numBits -= bitsThisTime; - bitsToSet >>= bitsThisTime; - mask >>= bitsThisTime; - offsetInByte = 0; - } -} - -//============================================================================== -void MemoryBlock::loadFromHexString (StringRef hex) -{ - ensureSize ((size_t) hex.length() >> 1); - char* dest = data; - String::CharPointerType t (hex.text); - - for (;;) - { - int byte = 0; - - for (int loop = 2; --loop >= 0;) - { - byte <<= 4; - - for (;;) - { - const juce_wchar c = t.getAndAdvance(); - - if (c >= '0' && c <= '9') { byte |= c - '0'; break; } - if (c >= 'a' && c <= 'z') { byte |= c - ('a' - 10); break; } - if (c >= 'A' && c <= 'Z') { byte |= c - ('A' - 10); break; } - - if (c == 0) - { - setSize (static_cast (dest - data)); - return; - } - } - } - - *dest++ = (char) byte; - } -} - -//============================================================================== -static const char base64EncodingTable[] = ".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+"; - -String MemoryBlock::toBase64Encoding() const -{ - const size_t numChars = ((size << 3) + 5) / 6; - - String destString ((unsigned int) size); // store the length, followed by a '.', and then the data. - const int initialLen = destString.length(); - destString.preallocateBytes (sizeof (String::CharPointerType::CharType) * (size_t) initialLen + 2 + numChars); - - String::CharPointerType d (destString.getCharPointer()); - d += initialLen; - d.write ('.'); - - for (size_t i = 0; i < numChars; ++i) - d.write ((juce_wchar) (uint8) base64EncodingTable [getBitRange (i * 6, 6)]); - - d.writeNull(); - return destString; -} - -static const char base64DecodingTable[] = -{ - 63, 0, 0, 0, 0, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52 -}; - -bool MemoryBlock::fromBase64Encoding (StringRef s) -{ - String::CharPointerType dot (CharacterFunctions::find (s.text, (juce_wchar) '.')); - - if (dot.isEmpty()) - return false; - - const int numBytesNeeded = String (s.text, dot).getIntValue(); - - setSize ((size_t) numBytesNeeded, true); - - String::CharPointerType srcChars (dot + 1); - int pos = 0; - - for (;;) - { - int c = (int) srcChars.getAndAdvance(); - - if (c == 0) - return true; - - c -= 43; - if (isPositiveAndBelow (c, numElementsInArray (base64DecodingTable))) - { - setBitRange ((size_t) pos, 6, base64DecodingTable [c]); - pos += 6; - } - } -} diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h b/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h deleted file mode 100755 index 30bb3ca..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_MemoryBlock.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_MEMORYBLOCK_H_INCLUDED -#define JUCE_MEMORYBLOCK_H_INCLUDED - - -//============================================================================== -/** - A class to hold a resizable block of raw data. - -*/ -class JUCE_API MemoryBlock -{ -public: - //============================================================================== - /** Create an uninitialised block with 0 size. */ - MemoryBlock() noexcept; - - /** Creates a memory block with a given initial size. - - @param initialSize the size of block to create - @param initialiseToZero whether to clear the memory or just leave it uninitialised - */ - MemoryBlock (const size_t initialSize, - bool initialiseToZero = false); - - /** Creates a copy of another memory block. */ - MemoryBlock (const MemoryBlock&); - - /** Creates a memory block using a copy of a block of data. - - @param dataToInitialiseFrom some data to copy into this block - @param sizeInBytes how much space to use - */ - MemoryBlock (const void* dataToInitialiseFrom, size_t sizeInBytes); - - /** Destructor. */ - ~MemoryBlock() noexcept; - - /** Copies another memory block onto this one. - This block will be resized and copied to exactly match the other one. - */ - MemoryBlock& operator= (const MemoryBlock&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - MemoryBlock (MemoryBlock&&) noexcept; - MemoryBlock& operator= (MemoryBlock&&) noexcept; - #endif - - //============================================================================== - /** Compares two memory blocks. - @returns true only if the two blocks are the same size and have identical contents. - */ - bool operator== (const MemoryBlock& other) const noexcept; - - /** Compares two memory blocks. - @returns true if the two blocks are different sizes or have different contents. - */ - bool operator!= (const MemoryBlock& other) const noexcept; - - /** Returns true if the data in this MemoryBlock matches the raw bytes passed-in. */ - bool matches (const void* data, size_t dataSize) const noexcept; - - //============================================================================== - /** Returns a void pointer to the data. - - Note that the pointer returned will probably become invalid when the - block is resized. - */ - void* getData() const noexcept { return data; } - - /** Returns a byte from the memory block. - This returns a reference, so you can also use it to set a byte. - */ - template - char& operator[] (const Type offset) const noexcept { return data [offset]; } - - - //============================================================================== - /** Returns the block's current allocated size, in bytes. */ - size_t getSize() const noexcept { return size; } - - /** Resizes the memory block. - - Any data that is present in both the old and new sizes will be retained. - When enlarging the block, the new space that is allocated at the end can either be - cleared, or left uninitialised. - - @param newSize the new desired size for the block - @param initialiseNewSpaceToZero if the block gets enlarged, this determines - whether to clear the new section or just leave it - uninitialised - @see ensureSize - */ - void setSize (const size_t newSize, - bool initialiseNewSpaceToZero = false); - - /** Increases the block's size only if it's smaller than a given size. - - @param minimumSize if the block is already bigger than this size, no action - will be taken; otherwise it will be increased to this size - @param initialiseNewSpaceToZero if the block gets enlarged, this determines - whether to clear the new section or just leave it - uninitialised - @see setSize - */ - void ensureSize (const size_t minimumSize, - bool initialiseNewSpaceToZero = false); - - /** Frees all the blocks data, setting its size to 0. */ - void reset(); - - //============================================================================== - /** Fills the entire memory block with a repeated byte value. - This is handy for clearing a block of memory to zero. - */ - void fillWith (uint8 valueToUse) noexcept; - - /** Adds another block of data to the end of this one. - The data pointer must not be null. This block's size will be increased accordingly. - */ - void append (const void* data, size_t numBytes); - - /** Resizes this block to the given size and fills its contents from the supplied buffer. - The data pointer must not be null. - */ - void replaceWith (const void* data, size_t numBytes); - - /** Inserts some data into the block. - The dataToInsert pointer must not be null. This block's size will be increased accordingly. - If the insert position lies outside the valid range of the block, it will be clipped to - within the range before being used. - */ - void insert (const void* dataToInsert, size_t numBytesToInsert, size_t insertPosition); - - /** Chops out a section of the block. - - This will remove a section of the memory block and close the gap around it, - shifting any subsequent data downwards and reducing the size of the block. - - If the range specified goes beyond the size of the block, it will be clipped. - */ - void removeSection (size_t startByte, size_t numBytesToRemove); - - //============================================================================== - /** Copies data into this MemoryBlock from a memory address. - - @param srcData the memory location of the data to copy into this block - @param destinationOffset the offset in this block at which the data being copied should begin - @param numBytes how much to copy in (if this goes beyond the size of the memory block, - it will be clipped so not to do anything nasty) - */ - void copyFrom (const void* srcData, - int destinationOffset, - size_t numBytes) noexcept; - - /** Copies data from this MemoryBlock to a memory address. - - @param destData the memory location to write to - @param sourceOffset the offset within this block from which the copied data will be read - @param numBytes how much to copy (if this extends beyond the limits of the memory block, - zeros will be used for that portion of the data) - */ - void copyTo (void* destData, - int sourceOffset, - size_t numBytes) const noexcept; - - //============================================================================== - /** Exchanges the contents of this and another memory block. - No actual copying is required for this, so it's very fast. - */ - void swapWith (MemoryBlock& other) noexcept; - - //============================================================================== - /** Attempts to parse the contents of the block as a zero-terminated UTF8 string. */ - String toString() const; - - //============================================================================== - /** Parses a string of hexadecimal numbers and writes this data into the memory block. - - The block will be resized to the number of valid bytes read from the string. - Non-hex characters in the string will be ignored. - - @see String::toHexString() - */ - void loadFromHexString (StringRef sourceHexString); - - //============================================================================== - /** Sets a number of bits in the memory block, treating it as a long binary sequence. */ - void setBitRange (size_t bitRangeStart, - size_t numBits, - int binaryNumberToApply) noexcept; - - /** Reads a number of bits from the memory block, treating it as one long binary sequence */ - int getBitRange (size_t bitRangeStart, - size_t numBitsToRead) const noexcept; - - //============================================================================== - /** Returns a string of characters that represent the binary contents of this block. - - Uses a 64-bit encoding system to allow binary data to be turned into a string - of simple non-extended characters, e.g. for storage in XML. - - @see fromBase64Encoding - */ - String toBase64Encoding() const; - - /** Takes a string of encoded characters and turns it into binary data. - - The string passed in must have been created by to64BitEncoding(), and this - block will be resized to recreate the original data block. - - @see toBase64Encoding - */ - bool fromBase64Encoding (StringRef encodedString); - - -private: - //============================================================================== - HeapBlock data; - size_t size; - - JUCE_LEAK_DETECTOR (MemoryBlock) -}; - - -#endif // JUCE_MEMORYBLOCK_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h b/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h deleted file mode 100755 index a633dca..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_OptionalScopedPointer.h +++ /dev/null @@ -1,186 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_OPTIONALSCOPEDPOINTER_H_INCLUDED -#define JUCE_OPTIONALSCOPEDPOINTER_H_INCLUDED - - -//============================================================================== -/** - Holds a pointer to an object which can optionally be deleted when this pointer - goes out of scope. - - This acts in many ways like a ScopedPointer, but allows you to specify whether or - not the object is deleted. - - @see ScopedPointer -*/ -template -class OptionalScopedPointer -{ -public: - //============================================================================== - /** Creates an empty OptionalScopedPointer. */ - OptionalScopedPointer() : shouldDelete (false) {} - - /** Creates an OptionalScopedPointer to point to a given object, and specifying whether - the OptionalScopedPointer will delete it. - - If takeOwnership is true, then the OptionalScopedPointer will act like a ScopedPointer, - deleting the object when it is itself deleted. If this parameter is false, then the - OptionalScopedPointer just holds a normal pointer to the object, and won't delete it. - */ - OptionalScopedPointer (ObjectType* objectToHold, bool takeOwnership) - : object (objectToHold), shouldDelete (takeOwnership) - { - } - - /** Takes ownership of the object that another OptionalScopedPointer holds. - - Like a normal ScopedPointer, the objectToTransferFrom object will become null, - as ownership of the managed object is transferred to this object. - - The flag to indicate whether or not to delete the managed object is also - copied from the source object. - */ - OptionalScopedPointer (OptionalScopedPointer& objectToTransferFrom) - : object (objectToTransferFrom.release()), - shouldDelete (objectToTransferFrom.shouldDelete) - { - } - - /** Takes ownership of the object that another OptionalScopedPointer holds. - - Like a normal ScopedPointer, the objectToTransferFrom object will become null, - as ownership of the managed object is transferred to this object. - - The ownership flag that says whether or not to delete the managed object is also - copied from the source object. - */ - OptionalScopedPointer& operator= (OptionalScopedPointer& objectToTransferFrom) - { - if (object != objectToTransferFrom.object) - { - clear(); - object = objectToTransferFrom.object; - } - - shouldDelete = objectToTransferFrom.shouldDelete; - return *this; - } - - /** The destructor may or may not delete the object that is being held, depending on the - takeOwnership flag that was specified when the object was first passed into an - OptionalScopedPointer constructor. - */ - ~OptionalScopedPointer() - { - clear(); - } - - //============================================================================== - /** Returns the object that this pointer is managing. */ - inline operator ObjectType*() const noexcept { return object; } - - /** Returns the object that this pointer is managing. */ - inline ObjectType* get() const noexcept { return object; } - - /** Returns the object that this pointer is managing. */ - inline ObjectType& operator*() const noexcept { return *object; } - - /** Lets you access methods and properties of the object that this pointer is holding. */ - inline ObjectType* operator->() const noexcept { return object; } - - //============================================================================== - /** Removes the current object from this OptionalScopedPointer without deleting it. - This will return the current object, and set this OptionalScopedPointer to a null pointer. - */ - ObjectType* release() noexcept { return object.release(); } - - /** Resets this pointer to null, possibly deleting the object that it holds, if it has - ownership of it. - */ - void clear() - { - if (! shouldDelete) - object.release(); - } - - /** Makes this OptionalScopedPointer point at a new object, specifying whether the - OptionalScopedPointer will take ownership of the object. - - If takeOwnership is true, then the OptionalScopedPointer will act like a ScopedPointer, - deleting the object when it is itself deleted. If this parameter is false, then the - OptionalScopedPointer just holds a normal pointer to the object, and won't delete it. - */ - void set (ObjectType* newObject, bool takeOwnership) - { - if (object != newObject) - { - clear(); - object = newObject; - } - - shouldDelete = takeOwnership; - } - - /** Makes this OptionalScopedPointer point at a new object, and take ownership of that object. */ - void setOwned (ObjectType* newObject) - { - set (newObject, true); - } - - /** Makes this OptionalScopedPointer point at a new object, but will not take ownership of that object. */ - void setNonOwned (ObjectType* newObject) - { - set (newObject, false); - } - - /** Returns true if the target object will be deleted when this pointer - object is deleted. - */ - bool willDeleteObject() const noexcept { return shouldDelete; } - - //============================================================================== - /** Swaps this object with another OptionalScopedPointer. - The two objects simply exchange their states. - */ - void swapWith (OptionalScopedPointer& other) noexcept - { - object.swapWith (other.object); - std::swap (shouldDelete, other.shouldDelete); - } - -private: - //============================================================================== - ScopedPointer object; - bool shouldDelete; -}; - - -#endif // JUCE_OPTIONALSCOPEDPOINTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h b/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h deleted file mode 100755 index 36ac5c3..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_ReferenceCountedObject.h +++ /dev/null @@ -1,415 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_REFERENCECOUNTEDOBJECT_H_INCLUDED -#define JUCE_REFERENCECOUNTEDOBJECT_H_INCLUDED - - -//============================================================================== -/** - A base class which provides methods for reference-counting. - - To add reference-counting to a class, derive it from this class, and - use the ReferenceCountedObjectPtr class to point to it. - - e.g. @code - class MyClass : public ReferenceCountedObject - { - void foo(); - - // This is a neat way of declaring a typedef for a pointer class, - // rather than typing out the full templated name each time.. - typedef ReferenceCountedObjectPtr Ptr; - }; - - MyClass::Ptr p = new MyClass(); - MyClass::Ptr p2 = p; - p = nullptr; - p2->foo(); - @endcode - - Once a new ReferenceCountedObject has been assigned to a pointer, be - careful not to delete the object manually. - - This class uses an Atomic value to hold the reference count, so that it - the pointers can be passed between threads safely. For a faster but non-thread-safe - version, use SingleThreadedReferenceCountedObject instead. - - @see ReferenceCountedObjectPtr, ReferenceCountedArray, SingleThreadedReferenceCountedObject -*/ -class JUCE_API ReferenceCountedObject -{ -public: - //============================================================================== - /** Increments the object's reference count. - - This is done automatically by the smart pointer, but is public just - in case it's needed for nefarious purposes. - */ - void incReferenceCount() noexcept - { - ++refCount; - } - - /** Decreases the object's reference count. - If the count gets to zero, the object will be deleted. - */ - void decReferenceCount() noexcept - { - jassert (getReferenceCount() > 0); - - if (--refCount == 0) - delete this; - } - - /** Decreases the object's reference count. - If the count gets to zero, the object will not be deleted, but this method - will return true, allowing the caller to take care of deletion. - */ - bool decReferenceCountWithoutDeleting() noexcept - { - jassert (getReferenceCount() > 0); - return --refCount == 0; - } - - /** Returns the object's current reference count. */ - int getReferenceCount() const noexcept { return refCount.get(); } - - -protected: - //============================================================================== - /** Creates the reference-counted object (with an initial ref count of zero). */ - ReferenceCountedObject() {} - - /** Destructor. */ - virtual ~ReferenceCountedObject() - { - // it's dangerous to delete an object that's still referenced by something else! - jassert (getReferenceCount() == 0); - } - - /** Resets the reference count to zero without deleting the object. - You should probably never need to use this! - */ - void resetReferenceCount() noexcept - { - refCount = 0; - } - -private: - //============================================================================== - Atomic refCount; - - friend struct ContainerDeletePolicy; - JUCE_DECLARE_NON_COPYABLE (ReferenceCountedObject) -}; - - -//============================================================================== -/** - Adds reference-counting to an object. - - This is effectively a version of the ReferenceCountedObject class, but which - uses a non-atomic counter, and so is not thread-safe (but which will be more - efficient). - For more details on how to use it, see the ReferenceCountedObject class notes. - - @see ReferenceCountedObject, ReferenceCountedObjectPtr, ReferenceCountedArray -*/ -class JUCE_API SingleThreadedReferenceCountedObject -{ -public: - //============================================================================== - /** Increments the object's reference count. - - This is done automatically by the smart pointer, but is public just - in case it's needed for nefarious purposes. - */ - void incReferenceCount() noexcept - { - ++refCount; - } - - /** Decreases the object's reference count. - If the count gets to zero, the object will be deleted. - */ - void decReferenceCount() noexcept - { - jassert (getReferenceCount() > 0); - - if (--refCount == 0) - delete this; - } - - /** Decreases the object's reference count. - If the count gets to zero, the object will not be deleted, but this method - will return true, allowing the caller to take care of deletion. - */ - bool decReferenceCountWithoutDeleting() noexcept - { - jassert (getReferenceCount() > 0); - return --refCount == 0; - } - - /** Returns the object's current reference count. */ - int getReferenceCount() const noexcept { return refCount; } - - -protected: - //============================================================================== - /** Creates the reference-counted object (with an initial ref count of zero). */ - SingleThreadedReferenceCountedObject() : refCount (0) {} - - /** Destructor. */ - virtual ~SingleThreadedReferenceCountedObject() - { - // it's dangerous to delete an object that's still referenced by something else! - jassert (getReferenceCount() == 0); - } - -private: - //============================================================================== - int refCount; - - friend struct ContainerDeletePolicy; - JUCE_DECLARE_NON_COPYABLE (SingleThreadedReferenceCountedObject) -}; - - -//============================================================================== -/** - A smart-pointer class which points to a reference-counted object. - - The template parameter specifies the class of the object you want to point to - the easiest - way to make a class reference-countable is to simply make it inherit from ReferenceCountedObject - or SingleThreadedReferenceCountedObject, but if you need to, you can roll your own reference-countable - class by implementing a set of methods called incReferenceCount(), decReferenceCount(), and - decReferenceCountWithoutDeleting(). See ReferenceCountedObject for examples of how these methods - should behave. - - When using this class, you'll probably want to create a typedef to abbreviate the full - templated name - e.g. - @code - struct MyClass : public ReferenceCountedObject - { - typedef ReferenceCountedObjectPtr Ptr; - ... - @endcode - - @see ReferenceCountedObject, ReferenceCountedObjectArray -*/ -template -class ReferenceCountedObjectPtr -{ -public: - /** The class being referenced by this pointer. */ - typedef ReferenceCountedObjectClass ReferencedType; - - //============================================================================== - /** Creates a pointer to a null object. */ - ReferenceCountedObjectPtr() noexcept - : referencedObject (nullptr) - { - } - - /** Creates a pointer to an object. - This will increment the object's reference-count. - */ - ReferenceCountedObjectPtr (ReferencedType* refCountedObject) noexcept - : referencedObject (refCountedObject) - { - incIfNotNull (refCountedObject); - } - - /** Copies another pointer. - This will increment the object's reference-count. - */ - ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr& other) noexcept - : referencedObject (other.referencedObject) - { - incIfNotNull (referencedObject); - } - - /** Copies another pointer. - This will increment the object's reference-count (if it is non-null). - */ - template - ReferenceCountedObjectPtr (const ReferenceCountedObjectPtr& other) noexcept - : referencedObject (static_cast (other.get())) - { - incIfNotNull (referencedObject); - } - - /** Changes this pointer to point at a different object. - The reference count of the old object is decremented, and it might be - deleted if it hits zero. The new object's count is incremented. - */ - ReferenceCountedObjectPtr& operator= (const ReferenceCountedObjectPtr& other) - { - return operator= (other.referencedObject); - } - - /** Changes this pointer to point at a different object. - The reference count of the old object is decremented, and it might be - deleted if it hits zero. The new object's count is incremented. - */ - template - ReferenceCountedObjectPtr& operator= (const ReferenceCountedObjectPtr& other) - { - return operator= (static_cast (other.get())); - } - - /** Changes this pointer to point at a different object. - - The reference count of the old object is decremented, and it might be - deleted if it hits zero. The new object's count is incremented. - */ - ReferenceCountedObjectPtr& operator= (ReferencedType* const newObject) - { - if (referencedObject != newObject) - { - incIfNotNull (newObject); - ReferencedType* const oldObject = referencedObject; - referencedObject = newObject; - decIfNotNull (oldObject); - } - - return *this; - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - /** Takes-over the object from another pointer. */ - ReferenceCountedObjectPtr (ReferenceCountedObjectPtr&& other) noexcept - : referencedObject (other.referencedObject) - { - other.referencedObject = nullptr; - } - - /** Takes-over the object from another pointer. */ - ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other) - { - std::swap (referencedObject, other.referencedObject); - return *this; - } - #endif - - /** Destructor. - This will decrement the object's reference-count, which will cause the - object to be deleted when the ref-count hits zero. - */ - ~ReferenceCountedObjectPtr() - { - decIfNotNull (referencedObject); - } - - //============================================================================== - /** Returns the object that this pointer references. - The pointer returned may be null, of course. - */ - operator ReferencedType*() const noexcept { return referencedObject; } - - /** Returns the object that this pointer references. - The pointer returned may be null, of course. - */ - ReferencedType* get() const noexcept { return referencedObject; } - - /** Returns the object that this pointer references. - The pointer returned may be null, of course. - */ - ReferencedType* getObject() const noexcept { return referencedObject; } - - // the -> operator is called on the referenced object - ReferencedType* operator->() const noexcept - { - jassert (referencedObject != nullptr); // null pointer method call! - return referencedObject; - } - -private: - //============================================================================== - ReferencedType* referencedObject; - - static void incIfNotNull (ReferencedType* o) noexcept - { - if (o != nullptr) - o->incReferenceCount(); - } - - static void decIfNotNull (ReferencedType* o) noexcept - { - if (o != nullptr && o->decReferenceCountWithoutDeleting()) - ContainerDeletePolicy::destroy (o); - } -}; - - -//============================================================================== -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator== (const ReferenceCountedObjectPtr& object1, ReferenceCountedObjectClass* const object2) noexcept -{ - return object1.get() == object2; -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator== (const ReferenceCountedObjectPtr& object1, const ReferenceCountedObjectPtr& object2) noexcept -{ - return object1.get() == object2.get(); -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator== (ReferenceCountedObjectClass* object1, const ReferenceCountedObjectPtr& object2) noexcept -{ - return object1 == object2.get(); -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator!= (const ReferenceCountedObjectPtr& object1, const ReferenceCountedObjectClass* object2) noexcept -{ - return object1.get() != object2; -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator!= (const ReferenceCountedObjectPtr& object1, const ReferenceCountedObjectPtr& object2) noexcept -{ - return object1.get() != object2.get(); -} - -/** Compares two ReferenceCountedObjectPointers. */ -template -bool operator!= (ReferenceCountedObjectClass* object1, const ReferenceCountedObjectPtr& object2) noexcept -{ - return object1 != object2.get(); -} - - -#endif // JUCE_REFERENCECOUNTEDOBJECT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h b/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h deleted file mode 100755 index 1aa8031..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_ScopedPointer.h +++ /dev/null @@ -1,253 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SCOPEDPOINTER_H_INCLUDED -#define JUCE_SCOPEDPOINTER_H_INCLUDED - -//============================================================================== -/** - This class holds a pointer which is automatically deleted when this object goes - out of scope. - - Once a pointer has been passed to a ScopedPointer, it will make sure that the pointer - gets deleted when the ScopedPointer is deleted. Using the ScopedPointer on the stack or - as member variables is a good way to use RAII to avoid accidentally leaking dynamically - created objects. - - A ScopedPointer can be used in pretty much the same way that you'd use a normal pointer - to an object. If you use the assignment operator to assign a different object to a - ScopedPointer, the old one will be automatically deleted. - - Important note: The class is designed to hold a pointer to an object, NOT to an array! - It calls delete on its payload, not delete[], so do not give it an array to hold! For - that kind of purpose, you should be using HeapBlock or Array instead. - - A const ScopedPointer is guaranteed not to lose ownership of its object or change the - object to which it points during its lifetime. This means that making a copy of a const - ScopedPointer is impossible, as that would involve the new copy taking ownership from the - old one. - - If you need to get a pointer out of a ScopedPointer without it being deleted, you - can use the release() method. - - Something to note is the main difference between this class and the std::auto_ptr class, - which is that ScopedPointer provides a cast-to-object operator, wheras std::auto_ptr - requires that you always call get() to retrieve the pointer. The advantages of providing - the cast is that you don't need to call get(), so can use the ScopedPointer in pretty much - exactly the same way as a raw pointer. The disadvantage is that the compiler is free to - use the cast in unexpected and sometimes dangerous ways - in particular, it becomes difficult - to return a ScopedPointer as the result of a function. To avoid this causing errors, - ScopedPointer contains an overloaded constructor that should cause a syntax error in these - circumstances, but it does mean that instead of returning a ScopedPointer from a function, - you'd need to return a raw pointer (or use a std::auto_ptr instead). -*/ -template -class ScopedPointer -{ -public: - //============================================================================== - /** Creates a ScopedPointer containing a null pointer. */ - inline ScopedPointer() noexcept : object (nullptr) - { - } - - /** Creates a ScopedPointer that owns the specified object. */ - inline ScopedPointer (ObjectType* const objectToTakePossessionOf) noexcept - : object (objectToTakePossessionOf) - { - } - - /** Creates a ScopedPointer that takes its pointer from another ScopedPointer. - - Because a pointer can only belong to one ScopedPointer, this transfers - the pointer from the other object to this one, and the other object is reset to - be a null pointer. - */ - ScopedPointer (ScopedPointer& objectToTransferFrom) noexcept - : object (objectToTransferFrom.object) - { - objectToTransferFrom.object = nullptr; - } - - /** Destructor. - This will delete the object that this ScopedPointer currently refers to. - */ - inline ~ScopedPointer() { ContainerDeletePolicy::destroy (object); } - - /** Changes this ScopedPointer to point to a new object. - - Because a pointer can only belong to one ScopedPointer, this transfers - the pointer from the other object to this one, and the other object is reset to - be a null pointer. - - If this ScopedPointer already points to an object, that object - will first be deleted. - */ - ScopedPointer& operator= (ScopedPointer& objectToTransferFrom) - { - if (this != objectToTransferFrom.getAddress()) - { - // Two ScopedPointers should never be able to refer to the same object - if - // this happens, you must have done something dodgy! - jassert (object == nullptr || object != objectToTransferFrom.object); - - ObjectType* const oldObject = object; - object = objectToTransferFrom.object; - objectToTransferFrom.object = nullptr; - ContainerDeletePolicy::destroy (oldObject); - } - - return *this; - } - - /** Changes this ScopedPointer to point to a new object. - - If this ScopedPointer already points to an object, that object - will first be deleted. - - The pointer that you pass in may be a nullptr. - */ - ScopedPointer& operator= (ObjectType* const newObjectToTakePossessionOf) - { - if (object != newObjectToTakePossessionOf) - { - ObjectType* const oldObject = object; - object = newObjectToTakePossessionOf; - ContainerDeletePolicy::destroy (oldObject); - } - - return *this; - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - ScopedPointer (ScopedPointer&& other) noexcept - : object (other.object) - { - other.object = nullptr; - } - - ScopedPointer& operator= (ScopedPointer&& other) noexcept - { - object = other.object; - other.object = nullptr; - return *this; - } - #endif - - //============================================================================== - /** Returns the object that this ScopedPointer refers to. */ - inline operator ObjectType*() const noexcept { return object; } - - /** Returns the object that this ScopedPointer refers to. */ - inline ObjectType* get() const noexcept { return object; } - - /** Returns the object that this ScopedPointer refers to. */ - inline ObjectType& operator*() const noexcept { return *object; } - - /** Lets you access methods and properties of the object that this ScopedPointer refers to. */ - inline ObjectType* operator->() const noexcept { return object; } - - //============================================================================== - /** Removes the current object from this ScopedPointer without deleting it. - This will return the current object, and set the ScopedPointer to a null pointer. - */ - ObjectType* release() noexcept { ObjectType* const o = object; object = nullptr; return o; } - - //============================================================================== - /** Swaps this object with that of another ScopedPointer. - The two objects simply exchange their pointers. - */ - void swapWith (ScopedPointer& other) noexcept - { - // Two ScopedPointers should never be able to refer to the same object - if - // this happens, you must have done something dodgy! - jassert (object != other.object || this == other.getAddress() || object == nullptr); - - std::swap (object, other.object); - } - - /** If the pointer is non-null, this will attempt to return a new copy of the object that is pointed to. - If the pointer is null, this will safely return a nullptr. - */ - inline ObjectType* createCopy() const { return createCopyIfNotNull (object); } - -private: - //============================================================================== - ObjectType* object; - - // (Required as an alternative to the overloaded & operator). - const ScopedPointer* getAddress() const noexcept { return this; } - - #if ! JUCE_MSVC // (MSVC can't deal with multiple copy constructors) - /* The copy constructors are private to stop people accidentally copying a const ScopedPointer - (the compiler would let you do so by implicitly casting the source to its raw object pointer). - - A side effect of this is that in a compiler that doesn't support C++11, you may hit an - error when you write something like this: - - ScopedPointer m = new MyClass(); // Compile error: copy constructor is private. - - Even though the compiler would normally ignore the assignment here, it can't do so when the - copy constructor is private. It's very easy to fix though - just write it like this: - - ScopedPointer m (new MyClass()); // Compiles OK - - It's probably best to use the latter form when writing your object declarations anyway, as - this is a better representation of the code that you actually want the compiler to produce. - */ - JUCE_DECLARE_NON_COPYABLE (ScopedPointer) - #endif -}; - -//============================================================================== -/** Compares a ScopedPointer with another pointer. - This can be handy for checking whether this is a null pointer. -*/ -template -bool operator== (const ScopedPointer& pointer1, ObjectType* const pointer2) noexcept -{ - return static_cast (pointer1) == pointer2; -} - -/** Compares a ScopedPointer with another pointer. - This can be handy for checking whether this is a null pointer. -*/ -template -bool operator!= (const ScopedPointer& pointer1, ObjectType* const pointer2) noexcept -{ - return static_cast (pointer1) != pointer2; -} - -//============================================================================== -#ifndef DOXYGEN -// NB: This is just here to prevent any silly attempts to call deleteAndZero() on a ScopedPointer. -template -void deleteAndZero (ScopedPointer&) { static_jassert (sizeof (Type) == 12345); } -#endif - -#endif // JUCE_SCOPEDPOINTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h b/JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h deleted file mode 100755 index 53d314b..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_SharedResourcePointer.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SHAREDRESOURCEPOINTER_H_INCLUDED -#define JUCE_SHAREDRESOURCEPOINTER_H_INCLUDED - - -//============================================================================== -/** - A smart-pointer that automatically creates and manages the lifetime of a - shared static instance of a class. - - The SharedObjectType template type indicates the class to use for the shared - object - the only requirements on this class are that it must have a public - default constructor and destructor. - - The SharedResourcePointer offers a pattern that differs from using a singleton or - static instance of an object, because it uses reference-counting to make sure that - the underlying shared object is automatically created/destroyed according to the - number of SharedResourcePointer objects that exist. When the last one is deleted, - the underlying object is also immediately destroyed. This allows you to use scoping - to manage the lifetime of a shared resource. - - Note: the construction/deletion of the shared object must not involve any - code that makes recursive calls to a SharedResourcePointer, or you'll cause - a deadlock. - - Example: - @code - // An example of a class that contains the shared data you want to use. - struct MySharedData - { - // There's no need to ever create an instance of this class directly yourself, - // but it does need a public constructor that does the initialisation. - MySharedData() - { - sharedStuff = generateHeavyweightStuff(); - } - - Array sharedStuff; - }; - - struct DataUserClass - { - DataUserClass() - { - // Multiple instances of the DataUserClass will all have the same - // shared common instance of MySharedData referenced by their sharedData - // member variables. - useSharedStuff (sharedData->sharedStuff); - } - - // By keeping this pointer as a member variable, the shared resource - // is guaranteed to be available for as long as the DataUserClass object. - SharedResourcePointer sharedData; - }; - - @endcode - */ -template -class SharedResourcePointer -{ -public: - /** Creates an instance of the shared object. - If other SharedResourcePointer objects for this type already exist, then - this one will simply point to the same shared object that they are already - using. Otherwise, if this is the first SharedResourcePointer to be created, - then a shared object will be created automatically. - */ - SharedResourcePointer() - { - SharedObjectHolder& holder = getSharedObjectHolder(); - const SpinLock::ScopedLockType sl (holder.lock); - - if (++(holder.refCount) == 1) - holder.sharedInstance = new SharedObjectType(); - - sharedObject = holder.sharedInstance; - } - - /** Destructor. - If no other SharedResourcePointer objects exist, this will also delete - the shared object to which it refers. - */ - ~SharedResourcePointer() - { - SharedObjectHolder& holder = getSharedObjectHolder(); - const SpinLock::ScopedLockType sl (holder.lock); - - if (--(holder.refCount) == 0) - holder.sharedInstance = nullptr; - } - - /** Returns the shared object. */ - operator SharedObjectType*() const noexcept { return sharedObject; } - - /** Returns the shared object. */ - SharedObjectType& get() const noexcept { return *sharedObject; } - - /** Returns the object that this pointer references. - The pointer returned may be zero, of course. - */ - SharedObjectType& getObject() const noexcept { return *sharedObject; } - - SharedObjectType* operator->() const noexcept { return sharedObject; } - -private: - struct SharedObjectHolder : public ReferenceCountedObject - { - SpinLock lock; - ScopedPointer sharedInstance; - int refCount; - }; - - static SharedObjectHolder& getSharedObjectHolder() noexcept - { - static void* holder [(sizeof (SharedObjectHolder) + sizeof(void*) - 1) / sizeof(void*)] = { 0 }; - return *reinterpret_cast (holder); - } - - SharedObjectType* sharedObject; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SharedResourcePointer) -}; - - -#endif // JUCE_SHAREDRESOURCEPOINTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h b/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h deleted file mode 100755 index 00ea0af..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_Singleton.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SINGLETON_H_INCLUDED -#define JUCE_SINGLETON_H_INCLUDED - - -//============================================================================== -/** - Macro to declare member variables and methods for a singleton class. - - To use this, add the line juce_DeclareSingleton (MyClass, doNotRecreateAfterDeletion) - to the class's definition. - - Then put a macro juce_ImplementSingleton (MyClass) along with the class's - implementation code. - - It's also a very good idea to also add the call clearSingletonInstance() in your class's - destructor, in case it is deleted by other means than deleteInstance() - - Clients can then call the static method MyClass::getInstance() to get a pointer - to the singleton, or MyClass::getInstanceWithoutCreating() which will return 0 if - no instance currently exists. - - e.g. @code - - class MySingleton - { - public: - MySingleton() - { - } - - ~MySingleton() - { - // this ensures that no dangling pointers are left when the - // singleton is deleted. - clearSingletonInstance(); - } - - juce_DeclareSingleton (MySingleton, false) - }; - - juce_ImplementSingleton (MySingleton) - - - // example of usage: - MySingleton* m = MySingleton::getInstance(); // creates the singleton if there isn't already one. - - ... - - MySingleton::deleteInstance(); // safely deletes the singleton (if it's been created). - - @endcode - - If doNotRecreateAfterDeletion = true, it won't allow the object to be created more - than once during the process's lifetime - i.e. after you've created and deleted the - object, getInstance() will refuse to create another one. This can be useful to stop - objects being accidentally re-created during your app's shutdown code. - - If you know that your object will only be created and deleted by a single thread, you - can use the slightly more efficient juce_DeclareSingleton_SingleThreaded() macro instead - of this one. - - @see juce_ImplementSingleton, juce_DeclareSingleton_SingleThreaded -*/ -#define juce_DeclareSingleton(classname, doNotRecreateAfterDeletion) \ -\ - static classname* _singletonInstance; \ - static juce::CriticalSection _singletonLock; \ -\ - static classname* JUCE_CALLTYPE getInstance() \ - { \ - if (_singletonInstance == nullptr) \ - {\ - const juce::ScopedLock sl (_singletonLock); \ -\ - if (_singletonInstance == nullptr) \ - { \ - static bool alreadyInside = false; \ - static bool createdOnceAlready = false; \ -\ - const bool problem = alreadyInside || ((doNotRecreateAfterDeletion) && createdOnceAlready); \ - jassert (! problem); \ - if (! problem) \ - { \ - createdOnceAlready = true; \ - alreadyInside = true; \ - classname* newObject = new classname(); /* (use a stack variable to avoid setting the newObject value before the class has finished its constructor) */ \ - alreadyInside = false; \ -\ - _singletonInstance = newObject; \ - } \ - } \ - } \ -\ - return _singletonInstance; \ - } \ -\ - static inline classname* JUCE_CALLTYPE getInstanceWithoutCreating() noexcept\ - { \ - return _singletonInstance; \ - } \ -\ - static void JUCE_CALLTYPE deleteInstance() \ - { \ - const juce::ScopedLock sl (_singletonLock); \ - if (_singletonInstance != nullptr) \ - { \ - classname* const old = _singletonInstance; \ - _singletonInstance = nullptr; \ - delete old; \ - } \ - } \ -\ - void clearSingletonInstance() noexcept\ - { \ - if (_singletonInstance == this) \ - _singletonInstance = nullptr; \ - } - - -//============================================================================== -/** This is a counterpart to the juce_DeclareSingleton macro. - - After adding the juce_DeclareSingleton to the class definition, this macro has - to be used in the cpp file. -*/ -#define juce_ImplementSingleton(classname) \ -\ - classname* classname::_singletonInstance = nullptr; \ - juce::CriticalSection classname::_singletonLock; - - -//============================================================================== -/** - Macro to declare member variables and methods for a singleton class. - - This is exactly the same as juce_DeclareSingleton, but doesn't use a critical - section to make access to it thread-safe. If you know that your object will - only ever be created or deleted by a single thread, then this is a - more efficient version to use. - - If doNotRecreateAfterDeletion = true, it won't allow the object to be created more - than once during the process's lifetime - i.e. after you've created and deleted the - object, getInstance() will refuse to create another one. This can be useful to stop - objects being accidentally re-created during your app's shutdown code. - - See the documentation for juce_DeclareSingleton for more information about - how to use it, the only difference being that you have to use - juce_ImplementSingleton_SingleThreaded instead of juce_ImplementSingleton. - - @see juce_ImplementSingleton_SingleThreaded, juce_DeclareSingleton, juce_DeclareSingleton_SingleThreaded_Minimal -*/ -#define juce_DeclareSingleton_SingleThreaded(classname, doNotRecreateAfterDeletion) \ -\ - static classname* _singletonInstance; \ -\ - static classname* getInstance() \ - { \ - if (_singletonInstance == nullptr) \ - { \ - static bool alreadyInside = false; \ - static bool createdOnceAlready = false; \ -\ - const bool problem = alreadyInside || ((doNotRecreateAfterDeletion) && createdOnceAlready); \ - jassert (! problem); \ - if (! problem) \ - { \ - createdOnceAlready = true; \ - alreadyInside = true; \ - classname* newObject = new classname(); /* (use a stack variable to avoid setting the newObject value before the class has finished its constructor) */ \ - alreadyInside = false; \ -\ - _singletonInstance = newObject; \ - } \ - } \ -\ - return _singletonInstance; \ - } \ -\ - static inline classname* getInstanceWithoutCreating() noexcept\ - { \ - return _singletonInstance; \ - } \ -\ - static void deleteInstance() \ - { \ - if (_singletonInstance != nullptr) \ - { \ - classname* const old = _singletonInstance; \ - _singletonInstance = nullptr; \ - delete old; \ - } \ - } \ -\ - void clearSingletonInstance() noexcept\ - { \ - if (_singletonInstance == this) \ - _singletonInstance = nullptr; \ - } - -//============================================================================== -/** - Macro to declare member variables and methods for a singleton class. - - This is like juce_DeclareSingleton_SingleThreaded, but doesn't do any checking - for recursion or repeated instantiation. It's intended for use as a lightweight - version of a singleton, where you're using it in very straightforward - circumstances and don't need the extra checking. - - Juce use the normal juce_ImplementSingleton_SingleThreaded as the counterpart - to this declaration, as you would with juce_DeclareSingleton_SingleThreaded. - - See the documentation for juce_DeclareSingleton for more information about - how to use it, the only difference being that you have to use - juce_ImplementSingleton_SingleThreaded instead of juce_ImplementSingleton. - - @see juce_ImplementSingleton_SingleThreaded, juce_DeclareSingleton -*/ -#define juce_DeclareSingleton_SingleThreaded_Minimal(classname) \ -\ - static classname* _singletonInstance; \ -\ - static classname* getInstance() \ - { \ - if (_singletonInstance == nullptr) \ - _singletonInstance = new classname(); \ -\ - return _singletonInstance; \ - } \ -\ - static inline classname* getInstanceWithoutCreating() noexcept\ - { \ - return _singletonInstance; \ - } \ -\ - static void deleteInstance() \ - { \ - if (_singletonInstance != nullptr) \ - { \ - classname* const old = _singletonInstance; \ - _singletonInstance = nullptr; \ - delete old; \ - } \ - } \ -\ - void clearSingletonInstance() noexcept\ - { \ - if (_singletonInstance == this) \ - _singletonInstance = nullptr; \ - } - - -//============================================================================== -/** This is a counterpart to the juce_DeclareSingleton_SingleThreaded macro. - - After adding juce_DeclareSingleton_SingleThreaded or juce_DeclareSingleton_SingleThreaded_Minimal - to the class definition, this macro has to be used somewhere in the cpp file. -*/ -#define juce_ImplementSingleton_SingleThreaded(classname) \ -\ - classname* classname::_singletonInstance = nullptr; - - - -#endif // JUCE_SINGLETON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h b/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h deleted file mode 100755 index c11b19f..0000000 --- a/JuceLibraryCode/modules/juce_core/memory/juce_WeakReference.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_WEAKREFERENCE_H_INCLUDED -#define JUCE_WEAKREFERENCE_H_INCLUDED - - -//============================================================================== -/** - This class acts as a pointer which will automatically become null if the object - to which it points is deleted. - - To accomplish this, the source object needs to cooperate by performing a couple of simple tasks. - It must embed a WeakReference::Master object, which stores a shared pointer object, and must clear - this master pointer in its destructor. - - E.g. - @code - class MyObject - { - public: - MyObject() - { - // If you're planning on using your WeakReferences in a multi-threaded situation, you may choose - // to create a WeakReference to the object here in the constructor, which will pre-initialise the - // embedded object, avoiding an (extremely unlikely) race condition that could occur if multiple - // threads overlap while creating the first WeakReference to it. - } - - ~MyObject() - { - // This will zero all the references - you need to call this in your destructor. - masterReference.clear(); - } - - private: - // You need to embed a variable of this type, with the name "masterReference" inside your object. If the - // variable is not public, you should make your class a friend of WeakReference so that the - // WeakReference class can access it. - WeakReference::Master masterReference; - friend class WeakReference; - }; - - // Here's an example of using a pointer.. - - MyObject* n = new MyObject(); - WeakReference myObjectRef = n; - - MyObject* pointer1 = myObjectRef; // returns a valid pointer to 'n' - delete n; - MyObject* pointer2 = myObjectRef; // returns a null pointer - @endcode - - @see WeakReference::Master -*/ -template -class WeakReference -{ -public: - /** Creates a null SafePointer. */ - inline WeakReference() noexcept {} - - /** Creates a WeakReference that points at the given object. */ - WeakReference (ObjectType* const object) : holder (getRef (object)) {} - - /** Creates a copy of another WeakReference. */ - WeakReference (const WeakReference& other) noexcept : holder (other.holder) {} - - /** Copies another pointer to this one. */ - WeakReference& operator= (const WeakReference& other) { holder = other.holder; return *this; } - - /** Copies another pointer to this one. */ - WeakReference& operator= (ObjectType* const newObject) { holder = getRef (newObject); return *this; } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - WeakReference (WeakReference&& other) noexcept : holder (static_cast (other.holder)) {} - WeakReference& operator= (WeakReference&& other) noexcept { holder = static_cast (other.holder); return *this; } - #endif - - /** Returns the object that this pointer refers to, or null if the object no longer exists. */ - ObjectType* get() const noexcept { return holder != nullptr ? holder->get() : nullptr; } - - /** Returns the object that this pointer refers to, or null if the object no longer exists. */ - operator ObjectType*() const noexcept { return get(); } - - /** Returns the object that this pointer refers to, or null if the object no longer exists. */ - ObjectType* operator->() noexcept { return get(); } - - /** Returns the object that this pointer refers to, or null if the object no longer exists. */ - const ObjectType* operator->() const noexcept { return get(); } - - /** This returns true if this reference has been pointing at an object, but that object has - since been deleted. - - If this reference was only ever pointing at a null pointer, this will return false. Using - operator=() to make this refer to a different object will reset this flag to match the status - of the reference from which you're copying. - */ - bool wasObjectDeleted() const noexcept { return holder != nullptr && holder->get() == nullptr; } - - bool operator== (ObjectType* const object) const noexcept { return get() == object; } - bool operator!= (ObjectType* const object) const noexcept { return get() != object; } - - //============================================================================== - /** This class is used internally by the WeakReference class - don't use it directly - in your code! - @see WeakReference - */ - class SharedPointer : public ReferenceCountingType - { - public: - explicit SharedPointer (ObjectType* const obj) noexcept : owner (obj) {} - - inline ObjectType* get() const noexcept { return owner; } - void clearPointer() noexcept { owner = nullptr; } - - private: - ObjectType* volatile owner; - - JUCE_DECLARE_NON_COPYABLE (SharedPointer) - }; - - typedef ReferenceCountedObjectPtr SharedRef; - - //============================================================================== - /** - This class is embedded inside an object to which you want to attach WeakReference pointers. - See the WeakReference class notes for an example of how to use this class. - @see WeakReference - */ - class Master - { - public: - Master() noexcept {} - - ~Master() noexcept - { - // You must remember to call clear() in your source object's destructor! See the notes - // for the WeakReference class for an example of how to do this. - jassert (sharedPointer == nullptr || sharedPointer->get() == nullptr); - } - - /** The first call to this method will create an internal object that is shared by all weak - references to the object. - */ - SharedPointer* getSharedPointer (ObjectType* const object) - { - if (sharedPointer == nullptr) - { - sharedPointer = new SharedPointer (object); - } - else - { - // You're trying to create a weak reference to an object that has already been deleted!! - jassert (sharedPointer->get() != nullptr); - } - - return sharedPointer; - } - - /** The object that owns this master pointer should call this before it gets destroyed, - to zero all the references to this object that may be out there. See the WeakReference - class notes for an example of how to do this. - */ - void clear() noexcept - { - if (sharedPointer != nullptr) - sharedPointer->clearPointer(); - } - - private: - SharedRef sharedPointer; - - JUCE_DECLARE_NON_COPYABLE (Master) - }; - -private: - SharedRef holder; - - static inline SharedPointer* getRef (ObjectType* const o) - { - return (o != nullptr) ? o->masterReference.getSharedPointer (o) : nullptr; - } -}; - - -#endif // JUCE_WEAKREFERENCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp b/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp deleted file mode 100755 index 1734907..0000000 --- a/JuceLibraryCode/modules/juce_core/misc/juce_Result.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -Result::Result() noexcept {} - -Result::Result (const String& message) noexcept - : errorMessage (message) -{ -} - -Result::Result (const Result& other) - : errorMessage (other.errorMessage) -{ -} - -Result& Result::operator= (const Result& other) -{ - errorMessage = other.errorMessage; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -Result::Result (Result&& other) noexcept - : errorMessage (static_cast (other.errorMessage)) -{ -} - -Result& Result::operator= (Result&& other) noexcept -{ - errorMessage = static_cast (other.errorMessage); - return *this; -} -#endif - -bool Result::operator== (const Result& other) const noexcept -{ - return errorMessage == other.errorMessage; -} - -bool Result::operator!= (const Result& other) const noexcept -{ - return errorMessage != other.errorMessage; -} - -Result Result::fail (const String& errorMessage) noexcept -{ - return Result (errorMessage.isEmpty() ? "Unknown Error" : errorMessage); -} - -const String& Result::getErrorMessage() const noexcept -{ - return errorMessage; -} - -bool Result::wasOk() const noexcept { return errorMessage.isEmpty(); } -Result::operator bool() const noexcept { return errorMessage.isEmpty(); } -bool Result::failed() const noexcept { return errorMessage.isNotEmpty(); } -bool Result::operator!() const noexcept { return errorMessage.isNotEmpty(); } diff --git a/JuceLibraryCode/modules/juce_core/misc/juce_Result.h b/JuceLibraryCode/modules/juce_core/misc/juce_Result.h deleted file mode 100755 index 7c320ac..0000000 --- a/JuceLibraryCode/modules/juce_core/misc/juce_Result.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_RESULT_H_INCLUDED -#define JUCE_RESULT_H_INCLUDED - - -//============================================================================== -/** - Represents the 'success' or 'failure' of an operation, and holds an associated - error message to describe the error when there's a failure. - - E.g. - @code - Result myOperation() - { - if (doSomeKindOfFoobar()) - return Result::ok(); - else - return Result::fail ("foobar didn't work!"); - } - - const Result result (myOperation()); - - if (result.wasOk()) - { - ...it's all good... - } - else - { - warnUserAboutFailure ("The foobar operation failed! Error message was: " - + result.getErrorMessage()); - } - @endcode -*/ -class JUCE_API Result -{ -public: - //============================================================================== - /** Creates and returns a 'successful' result. */ - static Result ok() noexcept { return Result(); } - - /** Creates a 'failure' result. - If you pass a blank error message in here, a default "Unknown Error" message - will be used instead. - */ - static Result fail (const String& errorMessage) noexcept; - - //============================================================================== - /** Returns true if this result indicates a success. */ - bool wasOk() const noexcept; - - /** Returns true if this result indicates a failure. - You can use getErrorMessage() to retrieve the error message associated - with the failure. - */ - bool failed() const noexcept; - - /** Returns true if this result indicates a success. - This is equivalent to calling wasOk(). - */ - operator bool() const noexcept; - - /** Returns true if this result indicates a failure. - This is equivalent to calling failed(). - */ - bool operator!() const noexcept; - - /** Returns the error message that was set when this result was created. - For a successful result, this will be an empty string; - */ - const String& getErrorMessage() const noexcept; - - //============================================================================== - Result (const Result&); - Result& operator= (const Result&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Result (Result&&) noexcept; - Result& operator= (Result&&) noexcept; - #endif - - bool operator== (const Result& other) const noexcept; - bool operator!= (const Result& other) const noexcept; - -private: - String errorMessage; - - // The default constructor is not for public use! - // Instead, use Result::ok() or Result::fail() - Result() noexcept; - explicit Result (const String&) noexcept; - - // These casts are private to prevent people trying to use the Result object in numeric contexts - operator int() const; - operator void*() const; -}; - - -#endif // JUCE_RESULT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp b/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp deleted file mode 100755 index eb74964..0000000 --- a/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -Uuid::Uuid() -{ - Random r; - - for (size_t i = 0; i < sizeof (uuid); ++i) - uuid[i] = (uint8) (r.nextInt (256)); - - // To make it RFC 4122 compliant, need to force a few bits... - uuid[6] = (uuid[6] & 0x0f) | 0x40; - uuid[8] = (uuid[8] & 0x3f) | 0x80; -} - -Uuid::~Uuid() noexcept {} - -Uuid::Uuid (const Uuid& other) noexcept -{ - memcpy (uuid, other.uuid, sizeof (uuid)); -} - -Uuid& Uuid::operator= (const Uuid& other) noexcept -{ - memcpy (uuid, other.uuid, sizeof (uuid)); - return *this; -} - -bool Uuid::operator== (const Uuid& other) const noexcept { return memcmp (uuid, other.uuid, sizeof (uuid)) == 0; } -bool Uuid::operator!= (const Uuid& other) const noexcept { return ! operator== (other); } - -Uuid Uuid::null() noexcept -{ - return Uuid ((const uint8*) nullptr); -} - -bool Uuid::isNull() const noexcept -{ - for (size_t i = 0; i < sizeof (uuid); ++i) - if (uuid[i] != 0) - return false; - - return true; -} - -String Uuid::getHexRegion (int start, int length) const -{ - return String::toHexString (uuid + start, length, 0); -} - -String Uuid::toString() const -{ - return getHexRegion (0, 16); -} - -String Uuid::toDashedString() const -{ - return getHexRegion (0, 4) - + "-" + getHexRegion (4, 2) - + "-" + getHexRegion (6, 2) - + "-" + getHexRegion (8, 2) - + "-" + getHexRegion (10, 6); -} - -Uuid::Uuid (const String& uuidString) -{ - operator= (uuidString); -} - -Uuid& Uuid::operator= (const String& uuidString) -{ - MemoryBlock mb; - mb.loadFromHexString (uuidString); - mb.ensureSize (sizeof (uuid), true); - mb.copyTo (uuid, 0, sizeof (uuid)); - return *this; -} - -Uuid::Uuid (const uint8* const rawData) noexcept -{ - operator= (rawData); -} - -Uuid& Uuid::operator= (const uint8* const rawData) noexcept -{ - if (rawData != nullptr) - memcpy (uuid, rawData, sizeof (uuid)); - else - zeromem (uuid, sizeof (uuid)); - - return *this; -} diff --git a/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h b/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h deleted file mode 100755 index cd7af0d..0000000 --- a/JuceLibraryCode/modules/juce_core/misc/juce_Uuid.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_UUID_H_INCLUDED -#define JUCE_UUID_H_INCLUDED - - -//============================================================================== -/** - A universally unique 128-bit identifier. - - This class generates very random unique numbers. It's vanishingly unlikely - that two identical UUIDs would ever be created by chance. The values are - formatted to meet the RFC 4122 version 4 standard. - - The class includes methods for saving the ID as a string or as raw binary data. -*/ -class JUCE_API Uuid -{ -public: - //============================================================================== - /** Creates a new unique ID, compliant with RFC 4122 version 4. */ - Uuid(); - - /** Destructor. */ - ~Uuid() noexcept; - - /** Creates a copy of another UUID. */ - Uuid (const Uuid&) noexcept; - - /** Copies another UUID. */ - Uuid& operator= (const Uuid&) noexcept; - - //============================================================================== - /** Returns true if the ID is zero. */ - bool isNull() const noexcept; - - /** Returns a null Uuid object. */ - static Uuid null() noexcept; - - bool operator== (const Uuid&) const noexcept; - bool operator!= (const Uuid&) const noexcept; - - //============================================================================== - /** Returns a stringified version of this UUID. - - A Uuid object can later be reconstructed from this string using operator= or - the constructor that takes a string parameter. - - @returns a 32 character hex string. - */ - String toString() const; - - /** Returns a stringified version of this UUID, separating it into sections with dashes. - @returns a string in the format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx - */ - String toDashedString() const; - - /** Creates an ID from an encoded string version. - @see toString - */ - Uuid (const String& uuidString); - - /** Copies from a stringified UUID. - The string passed in should be one that was created with the toString() method. - */ - Uuid& operator= (const String& uuidString); - - - //============================================================================== - /** Returns a pointer to the internal binary representation of the ID. - - This is an array of 16 bytes. To reconstruct a Uuid from its data, use - the constructor or operator= method that takes an array of uint8s. - */ - const uint8* getRawData() const noexcept { return uuid; } - - /** Creates a UUID from a 16-byte array. - @see getRawData - */ - Uuid (const uint8* rawData) noexcept; - - /** Sets this UUID from 16-bytes of raw data. */ - Uuid& operator= (const uint8* rawData) noexcept; - - -private: - //============================================================================== - uint8 uuid[16]; - String getHexRegion (int, int) const; - - JUCE_LEAK_DETECTOR (Uuid) -}; - - -#endif // JUCE_UUID_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h b/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h deleted file mode 100755 index a1fb2a2..0000000 --- a/JuceLibraryCode/modules/juce_core/misc/juce_WindowsRegistry.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_WINDOWSREGISTRY_H_INCLUDED -#define JUCE_WINDOWSREGISTRY_H_INCLUDED - -#if JUCE_WINDOWS || DOXYGEN - -/** - Contains some static helper functions for manipulating the MS Windows registry - (Only available on Windows, of course!) -*/ -class JUCE_API WindowsRegistry -{ -public: - /** These values can be used to specify whether the 32- or 64-bit registry should be used. - When running on a 32-bit OS, there is no 64-bit registry, so the mode will be ignored. - */ - enum WoW64Mode - { - /** Default handling: 32-bit apps will use the 32-bit registry, and 64-bit apps - will use the 64-bit registry. */ - WoW64_Default = 0, - - /** Always use the 64-bit registry store. (KEY_WOW64_64KEY). */ - WoW64_64bit = 0x100, - - /** Always use the 32-bit registry store. (KEY_WOW64_32KEY). */ - WoW64_32bit = 0x200 - }; - - //============================================================================== - /** Returns a string from the registry. - The path is a string for the entire path of a value in the registry, - e.g. "HKEY_CURRENT_USER\Software\foo\bar" - */ - static String JUCE_CALLTYPE getValue (const String& regValuePath, - const String& defaultValue = String::empty, - WoW64Mode mode = WoW64_Default); - - /** Reads a binary block from the registry. - The path is a string for the entire path of a value in the registry, - e.g. "HKEY_CURRENT_USER\Software\foo\bar" - @returns a DWORD indicating the type of the key. - */ - static uint32 JUCE_CALLTYPE getBinaryValue (const String& regValuePath, MemoryBlock& resultData, WoW64Mode mode = WoW64_Default); - - /** Sets a registry value as a string. - This will take care of creating any groups needed to get to the given registry value. - */ - static bool JUCE_CALLTYPE setValue (const String& regValuePath, const String& value, WoW64Mode mode = WoW64_Default); - - /** Sets a registry value as a DWORD. - This will take care of creating any groups needed to get to the given registry value. - */ - static bool JUCE_CALLTYPE setValue (const String& regValuePath, uint32 value, WoW64Mode mode = WoW64_Default); - - /** Sets a registry value as a QWORD. - This will take care of creating any groups needed to get to the given registry value. - */ - static bool JUCE_CALLTYPE setValue (const String& regValuePath, uint64 value, WoW64Mode mode = WoW64_Default); - - /** Sets a registry value as a binary block. - This will take care of creating any groups needed to get to the given registry value. - */ - static bool JUCE_CALLTYPE setValue (const String& regValuePath, const MemoryBlock& value, WoW64Mode mode = WoW64_Default); - - /** Returns true if the given value exists in the registry. */ - static bool JUCE_CALLTYPE valueExists (const String& regValuePath, WoW64Mode mode = WoW64_Default); - - /** Returns true if the given key exists in the registry. */ - static bool JUCE_CALLTYPE keyExists (const String& regValuePath, WoW64Mode mode = WoW64_Default); - - /** Deletes a registry value. */ - static void JUCE_CALLTYPE deleteValue (const String& regValuePath, WoW64Mode mode = WoW64_Default); - - /** Deletes a registry key (which is registry-talk for 'folder'). */ - static void JUCE_CALLTYPE deleteKey (const String& regKeyPath, WoW64Mode mode = WoW64_Default); - - /** Creates a file association in the registry. - - This lets you set the executable that should be launched by a given file extension. - @param fileExtension the file extension to associate, including the - initial dot, e.g. ".txt" - @param symbolicDescription a space-free short token to identify the file type - @param fullDescription a human-readable description of the file type - @param targetExecutable the executable that should be launched - @param iconResourceNumber the icon that gets displayed for the file type will be - found by looking up this resource number in the - executable. Pass 0 here to not use an icon - @param registerForCurrentUserOnly if false, this will try to register the association - for all users (you might not have permission to do this - unless running in an installer). If true, it will register the - association in HKEY_CURRENT_USER. - @param mode the WoW64 mode to use for choosing the database - */ - static bool JUCE_CALLTYPE registerFileAssociation (const String& fileExtension, - const String& symbolicDescription, - const String& fullDescription, - const File& targetExecutable, - int iconResourceNumber, - bool registerForCurrentUserOnly, - WoW64Mode mode = WoW64_Default); - - // DEPRECATED: use the other methods with a WoW64Mode parameter of WoW64_64bit instead. - JUCE_DEPRECATED (static String getValueWow64 (const String&, const String& defaultValue = String::empty)); - JUCE_DEPRECATED (static bool valueExistsWow64 (const String&)); - JUCE_DEPRECATED (static bool keyExistsWow64 (const String&)); - -private: - WindowsRegistry() JUCE_DELETED_FUNCTION; - JUCE_DECLARE_NON_COPYABLE (WindowsRegistry) -}; - -#endif -#endif // JUCE_WINDOWSREGISTRY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java b/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java deleted file mode 100755 index d1757db..0000000 --- a/JuceLibraryCode/modules/juce_core/native/java/JuceAppActivity.java +++ /dev/null @@ -1,819 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -package com.juce; - -import android.app.Activity; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.Context; -import android.content.Intent; -import android.content.res.Configuration; -import android.net.Uri; -import android.os.Bundle; -import android.view.*; -import android.view.inputmethod.BaseInputConnection; -import android.view.inputmethod.EditorInfo; -import android.view.inputmethod.InputConnection; -import android.view.inputmethod.InputMethodManager; -import android.graphics.*; -import android.opengl.*; -import android.text.ClipboardManager; -import android.text.InputType; -import android.util.DisplayMetrics; -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URL; -import java.net.HttpURLConnection; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.opengles.GL10; -import android.media.AudioManager; -import android.media.MediaScannerConnection; -import android.media.MediaScannerConnection.MediaScannerConnectionClient; - -//============================================================================== -public class JuceAppActivity extends Activity -{ - //============================================================================== - static - { - System.loadLibrary ("juce_jni"); - } - - @Override - public void onCreate (Bundle savedInstanceState) - { - super.onCreate (savedInstanceState); - - viewHolder = new ViewHolder (this); - setContentView (viewHolder); - - setVolumeControlStream (AudioManager.STREAM_MUSIC); - } - - @Override - protected void onDestroy() - { - quitApp(); - super.onDestroy(); - } - - @Override - protected void onPause() - { - if (viewHolder != null) - viewHolder.onPause(); - - suspendApp(); - super.onPause(); - } - - @Override - protected void onResume() - { - super.onResume(); - - if (viewHolder != null) - viewHolder.onResume(); - - resumeApp(); - } - - @Override - public void onConfigurationChanged (Configuration cfg) - { - super.onConfigurationChanged (cfg); - setContentView (viewHolder); - } - - private void callAppLauncher() - { - launchApp (getApplicationInfo().publicSourceDir, - getApplicationInfo().dataDir); - } - - //============================================================================== - private native void launchApp (String appFile, String appDataDir); - private native void quitApp(); - private native void suspendApp(); - private native void resumeApp(); - private native void setScreenSize (int screenWidth, int screenHeight, int dpi); - - //============================================================================== - public native void deliverMessage (long value); - private android.os.Handler messageHandler = new android.os.Handler(); - - public final void postMessage (long value) - { - messageHandler.post (new MessageCallback (value)); - } - - private final class MessageCallback implements Runnable - { - public MessageCallback (long value_) { value = value_; } - public final void run() { deliverMessage (value); } - - private long value; - } - - //============================================================================== - private ViewHolder viewHolder; - - public final ComponentPeerView createNewView (boolean opaque, long host) - { - ComponentPeerView v = new ComponentPeerView (this, opaque, host); - viewHolder.addView (v); - return v; - } - - public final void deleteView (ComponentPeerView view) - { - ViewGroup group = (ViewGroup) (view.getParent()); - - if (group != null) - group.removeView (view); - } - - public final void deleteOpenGLView (OpenGLView view) - { - ViewGroup group = (ViewGroup) (view.getParent()); - - if (group != null) - group.removeView (view); - } - - final class ViewHolder extends ViewGroup - { - public ViewHolder (Context context) - { - super (context); - setDescendantFocusability (ViewGroup.FOCUS_AFTER_DESCENDANTS); - setFocusable (false); - } - - protected final void onLayout (boolean changed, int left, int top, int right, int bottom) - { - setScreenSize (getWidth(), getHeight(), getDPI()); - - if (isFirstResize) - { - isFirstResize = false; - callAppLauncher(); - } - } - - public final void onPause() - { - for (int i = getChildCount(); --i >= 0;) - { - View v = getChildAt (i); - - if (v instanceof ComponentPeerView) - ((ComponentPeerView) v).onPause(); - } - } - - public final void onResume() - { - for (int i = getChildCount(); --i >= 0;) - { - View v = getChildAt (i); - - if (v instanceof ComponentPeerView) - ((ComponentPeerView) v).onResume(); - } - } - - private final int getDPI() - { - DisplayMetrics metrics = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics (metrics); - return metrics.densityDpi; - } - - private boolean isFirstResize = true; - } - - public final void excludeClipRegion (android.graphics.Canvas canvas, float left, float top, float right, float bottom) - { - canvas.clipRect (left, top, right, bottom, android.graphics.Region.Op.DIFFERENCE); - } - - //============================================================================== - public final String getClipboardContent() - { - ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE); - return clipboard.getText().toString(); - } - - public final void setClipboardContent (String newText) - { - ClipboardManager clipboard = (ClipboardManager) getSystemService (CLIPBOARD_SERVICE); - clipboard.setText (newText); - } - - //============================================================================== - public final void showMessageBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setPositiveButton ("OK", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - JuceAppActivity.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public final void showOkCancelBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setPositiveButton ("OK", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - JuceAppActivity.this.alertDismissed (callback, 1); - } - }) - .setNegativeButton ("Cancel", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - JuceAppActivity.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public final void showYesNoCancelBox (String title, String message, final long callback) - { - AlertDialog.Builder builder = new AlertDialog.Builder (this); - builder.setTitle (title) - .setMessage (message) - .setCancelable (true) - .setPositiveButton ("Yes", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - JuceAppActivity.this.alertDismissed (callback, 1); - } - }) - .setNegativeButton ("No", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - JuceAppActivity.this.alertDismissed (callback, 2); - } - }) - .setNeutralButton ("Cancel", new DialogInterface.OnClickListener() - { - public void onClick (DialogInterface dialog, int id) - { - dialog.cancel(); - JuceAppActivity.this.alertDismissed (callback, 0); - } - }); - - builder.create().show(); - } - - public native void alertDismissed (long callback, int id); - - //============================================================================== - public final class ComponentPeerView extends ViewGroup - implements View.OnFocusChangeListener - { - public ComponentPeerView (Context context, boolean opaque_, long host) - { - super (context); - this.host = host; - setWillNotDraw (false); - opaque = opaque_; - - setFocusable (true); - setFocusableInTouchMode (true); - setOnFocusChangeListener (this); - requestFocus(); - } - - //============================================================================== - private native void handlePaint (long host, Canvas canvas); - - @Override - public void onDraw (Canvas canvas) - { - handlePaint (host, canvas); - } - - @Override - public boolean isOpaque() - { - return opaque; - } - - private boolean opaque; - private long host; - - //============================================================================== - private native void handleMouseDown (long host, int index, float x, float y, long time); - private native void handleMouseDrag (long host, int index, float x, float y, long time); - private native void handleMouseUp (long host, int index, float x, float y, long time); - - @Override - public boolean onTouchEvent (MotionEvent event) - { - int action = event.getAction(); - long time = event.getEventTime(); - - switch (action & MotionEvent.ACTION_MASK) - { - case MotionEvent.ACTION_DOWN: - handleMouseDown (host, event.getPointerId(0), event.getX(), event.getY(), time); - return true; - - case MotionEvent.ACTION_CANCEL: - case MotionEvent.ACTION_UP: - handleMouseUp (host, event.getPointerId(0), event.getX(), event.getY(), time); - return true; - - case MotionEvent.ACTION_MOVE: - { - int n = event.getPointerCount(); - for (int i = 0; i < n; ++i) - handleMouseDrag (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - - return true; - } - - case MotionEvent.ACTION_POINTER_UP: - { - int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - handleMouseUp (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - return true; - } - - case MotionEvent.ACTION_POINTER_DOWN: - { - int i = (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; - handleMouseDown (host, event.getPointerId(i), event.getX(i), event.getY(i), time); - return true; - } - - default: - break; - } - - return false; - } - - //============================================================================== - private native void handleKeyDown (long host, int keycode, int textchar); - private native void handleKeyUp (long host, int keycode, int textchar); - - public void showKeyboard (String type) - { - InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); - - if (imm != null) - { - if (type.length() > 0) - { - imm.showSoftInput (this, android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT); - imm.setInputMethod (getWindowToken(), type); - } - else - { - imm.hideSoftInputFromWindow (getWindowToken(), 0); - } - } - } - - @Override - public boolean onKeyDown (int keyCode, KeyEvent event) - { - switch (keyCode) - { - case KeyEvent.KEYCODE_VOLUME_UP: - case KeyEvent.KEYCODE_VOLUME_DOWN: - return super.onKeyDown (keyCode, event); - - default: break; - } - - handleKeyDown (host, keyCode, event.getUnicodeChar()); - return true; - } - - @Override - public boolean onKeyUp (int keyCode, KeyEvent event) - { - handleKeyUp (host, keyCode, event.getUnicodeChar()); - return true; - } - - // this is here to make keyboard entry work on a Galaxy Tab2 10.1 - @Override - public InputConnection onCreateInputConnection (EditorInfo outAttrs) - { - outAttrs.actionLabel = ""; - outAttrs.hintText = ""; - outAttrs.initialCapsMode = 0; - outAttrs.initialSelEnd = outAttrs.initialSelStart = -1; - outAttrs.label = ""; - outAttrs.imeOptions = EditorInfo.IME_ACTION_DONE | EditorInfo.IME_FLAG_NO_EXTRACT_UI; - outAttrs.inputType = InputType.TYPE_NULL; - - return new BaseInputConnection (this, false); - } - - //============================================================================== - @Override - protected void onSizeChanged (int w, int h, int oldw, int oldh) - { - super.onSizeChanged (w, h, oldw, oldh); - viewSizeChanged (host); - } - - @Override - protected void onLayout (boolean changed, int left, int top, int right, int bottom) - { - for (int i = getChildCount(); --i >= 0;) - requestTransparentRegion (getChildAt (i)); - } - - private native void viewSizeChanged (long host); - - @Override - public void onFocusChange (View v, boolean hasFocus) - { - if (v == this) - focusChanged (host, hasFocus); - } - - private native void focusChanged (long host, boolean hasFocus); - - public void setViewName (String newName) {} - - public boolean isVisible() { return getVisibility() == VISIBLE; } - public void setVisible (boolean b) { setVisibility (b ? VISIBLE : INVISIBLE); } - - public boolean containsPoint (int x, int y) - { - return true; //xxx needs to check overlapping views - } - - public final void onPause() - { - for (int i = getChildCount(); --i >= 0;) - { - View v = getChildAt (i); - - if (v instanceof OpenGLView) - ((OpenGLView) v).onPause(); - } - } - - public final void onResume() - { - for (int i = getChildCount(); --i >= 0;) - { - View v = getChildAt (i); - - if (v instanceof OpenGLView) - ((OpenGLView) v).onResume(); - } - } - - public OpenGLView createGLView() - { - OpenGLView glView = new OpenGLView (getContext()); - addView (glView); - return glView; - } - } - - //============================================================================== - public final class OpenGLView extends GLSurfaceView - implements GLSurfaceView.Renderer - { - OpenGLView (Context context) - { - super (context); - setEGLContextClientVersion (2); - setRenderer (this); - setRenderMode (RENDERMODE_WHEN_DIRTY); - } - - @Override - public void onSurfaceCreated (GL10 unused, EGLConfig config) - { - contextCreated(); - } - - @Override - public void onSurfaceChanged (GL10 unused, int width, int height) - { - contextChangedSize(); - } - - @Override - public void onDrawFrame (GL10 unused) - { - render(); - } - - private native void contextCreated(); - private native void contextChangedSize(); - private native void render(); - } - - //============================================================================== - public final int[] renderGlyph (char glyph, Paint paint, android.graphics.Matrix matrix, Rect bounds) - { - Path p = new Path(); - paint.getTextPath (String.valueOf (glyph), 0, 1, 0.0f, 0.0f, p); - - RectF boundsF = new RectF(); - p.computeBounds (boundsF, true); - matrix.mapRect (boundsF); - - boundsF.roundOut (bounds); - bounds.left--; - bounds.right++; - - final int w = bounds.width(); - final int h = Math.max (1, bounds.height()); - - Bitmap bm = Bitmap.createBitmap (w, h, Bitmap.Config.ARGB_8888); - - Canvas c = new Canvas (bm); - matrix.postTranslate (-bounds.left, -bounds.top); - c.setMatrix (matrix); - c.drawPath (p, paint); - - final int sizeNeeded = w * h; - if (cachedRenderArray.length < sizeNeeded) - cachedRenderArray = new int [sizeNeeded]; - - bm.getPixels (cachedRenderArray, 0, w, 0, 0, w, h); - bm.recycle(); - return cachedRenderArray; - } - - private int[] cachedRenderArray = new int [256]; - - //============================================================================== - public static class HTTPStream - { - public HTTPStream (HttpURLConnection connection_, - int[] statusCode, StringBuffer responseHeaders) throws IOException - { - connection = connection_; - - try - { - inputStream = new BufferedInputStream (connection.getInputStream()); - } - catch (IOException e) - { - if (connection.getResponseCode() < org.apache.http.HttpStatus.SC_BAD_REQUEST) - throw e; - } - finally - { - statusCode[0] = connection.getResponseCode(); - } - - if (statusCode[0] >= org.apache.http.HttpStatus.SC_BAD_REQUEST) - inputStream = connection.getErrorStream(); - else - inputStream = connection.getInputStream(); - - for (java.util.Map.Entry> entry : connection.getHeaderFields().entrySet()) - if (entry.getKey() != null && entry.getValue() != null) - responseHeaders.append (entry.getKey() + ": " - + android.text.TextUtils.join (",", entry.getValue()) + "\n"); - } - - public final void release() - { - try - { - inputStream.close(); - } - catch (IOException e) - {} - - connection.disconnect(); - } - - public final int read (byte[] buffer, int numBytes) - { - int num = 0; - - try - { - num = inputStream.read (buffer, 0, numBytes); - } - catch (IOException e) - {} - - if (num > 0) - position += num; - - return num; - } - - public final long getPosition() { return position; } - public final long getTotalLength() { return -1; } - public final boolean isExhausted() { return false; } - public final boolean setPosition (long newPos) { return false; } - - private HttpURLConnection connection; - private InputStream inputStream; - private long position; - } - - public static final HTTPStream createHTTPStream (String address, - boolean isPost, byte[] postData, String headers, - int timeOutMs, int[] statusCode, - StringBuffer responseHeaders, - int numRedirectsToFollow) - { - // timeout parameter of zero for HttpUrlConnection is a blocking connect (negative value for juce::URL) - if (timeOutMs < 0) - timeOutMs = 0; - else if (timeOutMs == 0) - timeOutMs = 30000; - - // headers - if not empty, this string is appended onto the headers that are used for the request. It must therefore be a valid set of HTML header directives, separated by newlines. - // So convert headers string to an array, with an element for each line - String headerLines[] = headers.split("\\n"); - - for (;;) - { - try - { - HttpURLConnection connection = (HttpURLConnection) (new URL(address).openConnection()); - - if (connection != null) - { - try - { - connection.setInstanceFollowRedirects (false); - connection.setConnectTimeout (timeOutMs); - connection.setReadTimeout (timeOutMs); - - // Set request headers - for (int i = 0; i < headerLines.length; ++i) - { - int pos = headerLines[i].indexOf (":"); - - if (pos > 0 && pos < headerLines[i].length()) - { - String field = headerLines[i].substring (0, pos); - String value = headerLines[i].substring (pos + 1); - - if (value.length() > 0) - connection.setRequestProperty (field, value); - } - } - - if (isPost) - { - connection.setRequestMethod ("POST"); - connection.setDoOutput (true); - - if (postData != null) - { - OutputStream out = connection.getOutputStream(); - out.write(postData); - out.flush(); - } - } - - HTTPStream httpStream = new HTTPStream (connection, statusCode, responseHeaders); - - // Process redirect & continue as necessary - int status = statusCode[0]; - - if (--numRedirectsToFollow >= 0 - && (status == 301 || status == 302 || status == 303 || status == 307)) - { - // Assumes only one occurrence of "Location" - int pos1 = responseHeaders.indexOf ("Location:") + 10; - int pos2 = responseHeaders.indexOf ("\n", pos1); - - if (pos2 > pos1) - { - String newLocation = responseHeaders.substring(pos1, pos2); - // Handle newLocation whether it's absolute or relative - URL baseUrl = new URL (address); - URL newUrl = new URL (baseUrl, newLocation); - String transformedNewLocation = newUrl.toString(); - - if (transformedNewLocation != address) - { - address = transformedNewLocation; - // Clear responseHeaders before next iteration - responseHeaders.delete (0, responseHeaders.length()); - continue; - } - } - } - - return httpStream; - } - catch (Throwable e) - { - connection.disconnect(); - } - } - } - catch (Throwable e) {} - - return null; - } - } - - public final void launchURL (String url) - { - startActivity (new Intent (Intent.ACTION_VIEW, Uri.parse (url))); - } - - public static final String getLocaleValue (boolean isRegion) - { - java.util.Locale locale = java.util.Locale.getDefault(); - - return isRegion ? locale.getDisplayCountry (java.util.Locale.US) - : locale.getDisplayLanguage (java.util.Locale.US); - } - - //============================================================================== - private final class SingleMediaScanner implements MediaScannerConnectionClient - { - public SingleMediaScanner (Context context, String filename) - { - file = filename; - msc = new MediaScannerConnection (context, this); - msc.connect(); - } - - @Override - public void onMediaScannerConnected() - { - msc.scanFile (file, null); - } - - @Override - public void onScanCompleted (String path, Uri uri) - { - msc.disconnect(); - } - - private MediaScannerConnection msc; - private String file; - } - - public final void scanFile (String filename) - { - new SingleMediaScanner (this, filename); - } -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h b/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h deleted file mode 100755 index cdaa0ef..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_BasicNativeHeaders.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_BASICNATIVEHEADERS_H_INCLUDED -#define JUCE_BASICNATIVEHEADERS_H_INCLUDED - -#include "../system/juce_TargetPlatform.h" -#undef T - -//============================================================================== -#if JUCE_MAC || JUCE_IOS - - #if JUCE_IOS - #import - #import - #import - #import - #include - #else - #define Point CarbonDummyPointName - #define Component CarbonDummyCompName - #import - #import - #undef Point - #undef Component - #include - #endif - - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - -//============================================================================== -#elif JUCE_WINDOWS - #if JUCE_MSVC - #ifndef _CPPRTTI - #error "You're compiling without RTTI enabled! This is needed for a lot of JUCE classes, please update your compiler settings!" - #endif - - #ifndef _CPPUNWIND - #error "You're compiling without exceptions enabled! This is needed for a lot of JUCE classes, please update your compiler settings!" - #endif - - #pragma warning (push) - #pragma warning (disable : 4100 4201 4514 4312 4995) - #endif - - #define STRICT 1 - #define WIN32_LEAN_AND_MEAN 1 - #if JUCE_MINGW - #define _WIN32_WINNT 0x0501 - #else - #define _WIN32_WINNT 0x0600 - #endif - #define _UNICODE 1 - #define UNICODE 1 - #ifndef _WIN32_IE - #define _WIN32_IE 0x0500 - #endif - - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - - #if JUCE_MINGW - #include - #else - #include - #include - #endif - - #undef PACKED - - #if JUCE_MSVC - #pragma warning (pop) - #pragma warning (4: 4511 4512 4100 /*4365*/) // (enable some warnings that are turned off in VC8) - #endif - - #if JUCE_MSVC && ! JUCE_DONT_AUTOLINK_TO_WIN32_LIBRARIES - #pragma comment (lib, "kernel32.lib") - #pragma comment (lib, "user32.lib") - #pragma comment (lib, "wininet.lib") - #pragma comment (lib, "advapi32.lib") - #pragma comment (lib, "ws2_32.lib") - #pragma comment (lib, "version.lib") - #pragma comment (lib, "shlwapi.lib") - #pragma comment (lib, "winmm.lib") - - #ifdef _NATIVE_WCHAR_T_DEFINED - #ifdef _DEBUG - #pragma comment (lib, "comsuppwd.lib") - #else - #pragma comment (lib, "comsuppw.lib") - #endif - #else - #ifdef _DEBUG - #pragma comment (lib, "comsuppd.lib") - #else - #pragma comment (lib, "comsupp.lib") - #endif - #endif - #endif - - /* Used with DynamicLibrary to simplify importing functions from a win32 DLL. - - dll: the DynamicLibrary object - functionName: function to import - localFunctionName: name you want to use to actually call it (must be different) - returnType: the return type - params: list of params (bracketed) - */ - #define JUCE_LOAD_WINAPI_FUNCTION(dll, functionName, localFunctionName, returnType, params) \ - typedef returnType (WINAPI *type##localFunctionName) params; \ - type##localFunctionName localFunctionName = (type##localFunctionName) dll.getFunction (#functionName); - -//============================================================================== -#elif JUCE_LINUX - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - -//============================================================================== -#elif JUCE_ANDROID - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include -#endif - -// Need to clear various moronic redefinitions made by system headers.. -#undef max -#undef min -#undef direct -#undef check - -#endif // JUCE_BASICNATIVEHEADERS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp b/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp deleted file mode 100755 index 45903b1..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_Files.cpp +++ /dev/null @@ -1,104 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -bool File::isOnCDRomDrive() const -{ - return false; -} - -bool File::isOnHardDisk() const -{ - return true; -} - -bool File::isOnRemovableDrive() const -{ - return false; -} - -String File::getVersion() const -{ - return String::empty; -} - -File File::getSpecialLocation (const SpecialLocationType type) -{ - switch (type) - { - case userHomeDirectory: - case userDocumentsDirectory: - case userMusicDirectory: - case userMoviesDirectory: - case userPicturesDirectory: - case userApplicationDataDirectory: - case userDesktopDirectory: - return File (android.appDataDir); - - case commonApplicationDataDirectory: - case commonDocumentsDirectory: - return File (android.appDataDir); - - case globalApplicationsDirectory: - return File ("/system/app"); - - case tempDirectory: - return File (android.appDataDir).getChildFile (".temp"); - - case invokedExecutableFile: - case currentExecutableFile: - case currentApplicationFile: - case hostApplicationPath: - return juce_getExecutableFile(); - - default: - jassertfalse; // unknown type? - break; - } - - return File(); -} - -bool File::moveToTrash() const -{ - if (! exists()) - return true; - - // TODO - return false; -} - -JUCE_API bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& parameters) -{ - const LocalRef t (javaString (fileName)); - android.activity.callVoidMethod (JuceAppActivity.launchURL, t.get()); - return true; -} - -void File::revealToUser() const -{ -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h b/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h deleted file mode 100755 index f2935d5..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_JNIHelpers.h +++ /dev/null @@ -1,429 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_ANDROID_JNIHELPERS_H_INCLUDED -#define JUCE_ANDROID_JNIHELPERS_H_INCLUDED - -#if ! (defined (JUCE_ANDROID_ACTIVITY_CLASSNAME) && defined (JUCE_ANDROID_ACTIVITY_CLASSPATH)) - #error "The JUCE_ANDROID_ACTIVITY_CLASSNAME and JUCE_ANDROID_ACTIVITY_CLASSPATH macros must be set!" -#endif - -//============================================================================== -extern JNIEnv* getEnv() noexcept; - -//============================================================================== -class GlobalRef -{ -public: - inline GlobalRef() noexcept : obj (0) {} - inline explicit GlobalRef (jobject o) : obj (retain (o)) {} - inline GlobalRef (const GlobalRef& other) : obj (retain (other.obj)) {} - ~GlobalRef() { clear(); } - - inline void clear() - { - if (obj != 0) - { - getEnv()->DeleteGlobalRef (obj); - obj = 0; - } - } - - inline GlobalRef& operator= (const GlobalRef& other) - { - jobject newObj = retain (other.obj); - clear(); - obj = newObj; - return *this; - } - - //============================================================================== - inline operator jobject() const noexcept { return obj; } - inline jobject get() const noexcept { return obj; } - - //============================================================================== - #define DECLARE_CALL_TYPE_METHOD(returnType, typeName) \ - returnType call##typeName##Method (jmethodID methodID, ... ) const \ - { \ - va_list args; \ - va_start (args, methodID); \ - returnType result = getEnv()->Call##typeName##MethodV (obj, methodID, args); \ - va_end (args); \ - return result; \ - } - - DECLARE_CALL_TYPE_METHOD (jobject, Object) - DECLARE_CALL_TYPE_METHOD (jboolean, Boolean) - DECLARE_CALL_TYPE_METHOD (jbyte, Byte) - DECLARE_CALL_TYPE_METHOD (jchar, Char) - DECLARE_CALL_TYPE_METHOD (jshort, Short) - DECLARE_CALL_TYPE_METHOD (jint, Int) - DECLARE_CALL_TYPE_METHOD (jlong, Long) - DECLARE_CALL_TYPE_METHOD (jfloat, Float) - DECLARE_CALL_TYPE_METHOD (jdouble, Double) - #undef DECLARE_CALL_TYPE_METHOD - - void callVoidMethod (jmethodID methodID, ... ) const - { - va_list args; - va_start (args, methodID); - getEnv()->CallVoidMethodV (obj, methodID, args); - va_end (args); - } - -private: - //============================================================================== - jobject obj; - - static inline jobject retain (jobject obj) - { - return obj == 0 ? 0 : getEnv()->NewGlobalRef (obj); - } -}; - -//============================================================================== -template -class LocalRef -{ -public: - explicit inline LocalRef (JavaType o) noexcept : obj (o) {} - inline LocalRef (const LocalRef& other) noexcept : obj (retain (other.obj)) {} - ~LocalRef() { clear(); } - - void clear() - { - if (obj != 0) - getEnv()->DeleteLocalRef (obj); - } - - LocalRef& operator= (const LocalRef& other) - { - jobject newObj = retain (other.obj); - clear(); - obj = newObj; - return *this; - } - - inline operator JavaType() const noexcept { return obj; } - inline JavaType get() const noexcept { return obj; } - -private: - JavaType obj; - - static JavaType retain (JavaType obj) - { - return obj == 0 ? 0 : (JavaType) getEnv()->NewLocalRef (obj); - } -}; - -//============================================================================== -namespace -{ - String juceString (JNIEnv* env, jstring s) - { - const char* const utf8 = env->GetStringUTFChars (s, nullptr); - CharPointer_UTF8 utf8CP (utf8); - const String result (utf8CP); - env->ReleaseStringUTFChars (s, utf8); - return result; - } - - String juceString (jstring s) - { - return juceString (getEnv(), s); - } - - LocalRef javaString (const String& s) - { - return LocalRef (getEnv()->NewStringUTF (s.toUTF8())); - } - - LocalRef javaStringFromChar (const juce_wchar c) - { - char utf8[8] = { 0 }; - CharPointer_UTF8 (utf8).write (c); - return LocalRef (getEnv()->NewStringUTF (utf8)); - } -} - -//============================================================================== -class JNIClassBase -{ -public: - explicit JNIClassBase (const char* classPath); - virtual ~JNIClassBase(); - - inline operator jclass() const noexcept { return classRef; } - - static void initialiseAllClasses (JNIEnv*); - static void releaseAllClasses (JNIEnv*); - -protected: - virtual void initialiseFields (JNIEnv*) = 0; - - jmethodID resolveMethod (JNIEnv*, const char* methodName, const char* params); - jmethodID resolveStaticMethod (JNIEnv*, const char* methodName, const char* params); - jfieldID resolveField (JNIEnv*, const char* fieldName, const char* signature); - jfieldID resolveStaticField (JNIEnv*, const char* fieldName, const char* signature); - -private: - const char* const classPath; - jclass classRef; - - static Array& getClasses(); - void initialise (JNIEnv*); - void release (JNIEnv*); - - JUCE_DECLARE_NON_COPYABLE (JNIClassBase) -}; - -//============================================================================== -#define CREATE_JNI_METHOD(methodID, stringName, params) methodID = resolveMethod (env, stringName, params); -#define CREATE_JNI_STATICMETHOD(methodID, stringName, params) methodID = resolveStaticMethod (env, stringName, params); -#define CREATE_JNI_FIELD(fieldID, stringName, signature) fieldID = resolveField (env, stringName, signature); -#define CREATE_JNI_STATICFIELD(fieldID, stringName, signature) fieldID = resolveStaticField (env, stringName, signature); -#define DECLARE_JNI_METHOD(methodID, stringName, params) jmethodID methodID; -#define DECLARE_JNI_FIELD(fieldID, stringName, signature) jfieldID fieldID; - -#define DECLARE_JNI_CLASS(CppClassName, javaPath) \ - class CppClassName ## _Class : public JNIClassBase \ - { \ - public: \ - CppClassName ## _Class() : JNIClassBase (javaPath) {} \ - \ - void initialiseFields (JNIEnv* env) \ - { \ - JNI_CLASS_MEMBERS (CREATE_JNI_METHOD, CREATE_JNI_STATICMETHOD, CREATE_JNI_FIELD, CREATE_JNI_STATICFIELD); \ - } \ - \ - JNI_CLASS_MEMBERS (DECLARE_JNI_METHOD, DECLARE_JNI_METHOD, DECLARE_JNI_FIELD, DECLARE_JNI_FIELD); \ - }; \ - static CppClassName ## _Class CppClassName; - - -//============================================================================== -#define JUCE_JNI_CALLBACK(className, methodName, returnType, params) \ - extern "C" __attribute__ ((visibility("default"))) returnType JUCE_JOIN_MACRO (JUCE_JOIN_MACRO (Java_, className), _ ## methodName) params - -//============================================================================== -class AndroidSystem -{ -public: - AndroidSystem(); - - void initialise (JNIEnv*, jobject activity, jstring appFile, jstring appDataDir); - void shutdown (JNIEnv*); - - //============================================================================== - GlobalRef activity; - String appFile, appDataDir; - int screenWidth, screenHeight, dpi; -}; - -extern AndroidSystem android; - -//============================================================================== -class ThreadLocalJNIEnvHolder -{ -public: - ThreadLocalJNIEnvHolder() noexcept - : jvm (nullptr) - { - zeromem (threads, sizeof (threads)); - zeromem (envs, sizeof (envs)); - } - - void initialise (JNIEnv* env) - { - // NB: the DLL can be left loaded by the JVM, so the same static - // objects can end up being reused by subsequent runs of the app - zeromem (threads, sizeof (threads)); - zeromem (envs, sizeof (envs)); - - env->GetJavaVM (&jvm); - addEnv (env); - } - - JNIEnv* attach() noexcept - { - if (android.activity != nullptr) - { - if (JNIEnv* env = attachToCurrentThread()) - { - SpinLock::ScopedLockType sl (addRemoveLock); - return addEnv (env); - } - - jassertfalse; - } - - return nullptr; - } - - void detach() noexcept - { - if (android.activity != nullptr) - { - jvm->DetachCurrentThread(); - - const pthread_t thisThread = pthread_self(); - - SpinLock::ScopedLockType sl (addRemoveLock); - for (int i = 0; i < maxThreads; ++i) - if (threads[i] == thisThread) - threads[i] = 0; - } - } - - JNIEnv* getOrAttach() noexcept - { - if (JNIEnv* env = get()) - return env; - - SpinLock::ScopedLockType sl (addRemoveLock); - - if (JNIEnv* env = get()) - return env; - - if (JNIEnv* env = attachToCurrentThread()) - return addEnv (env); - - return nullptr; - } - -private: - JavaVM* jvm; - enum { maxThreads = 32 }; - pthread_t threads [maxThreads]; - JNIEnv* envs [maxThreads]; - SpinLock addRemoveLock; - - JNIEnv* addEnv (JNIEnv* env) noexcept - { - const pthread_t thisThread = pthread_self(); - - for (int i = 0; i < maxThreads; ++i) - { - if (threads[i] == 0) - { - envs[i] = env; - threads[i] = thisThread; - return env; - } - } - - jassertfalse; // too many threads! - return nullptr; - } - - JNIEnv* get() const noexcept - { - const pthread_t thisThread = pthread_self(); - - for (int i = 0; i < maxThreads; ++i) - if (threads[i] == thisThread) - return envs[i]; - - return nullptr; - } - - JNIEnv* attachToCurrentThread() - { - JNIEnv* env = nullptr; - jvm->AttachCurrentThread (&env, nullptr); - return env; - } -}; - -extern ThreadLocalJNIEnvHolder threadLocalJNIEnvHolder; - -struct AndroidThreadScope -{ - AndroidThreadScope() { threadLocalJNIEnvHolder.attach(); } - ~AndroidThreadScope() { threadLocalJNIEnvHolder.detach(); } -}; - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (createNewView, "createNewView", "(ZJ)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;") \ - METHOD (deleteView, "deleteView", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$ComponentPeerView;)V") \ - METHOD (deleteOpenGLView, "deleteOpenGLView", "(L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$OpenGLView;)V") \ - METHOD (postMessage, "postMessage", "(J)V") \ - METHOD (finish, "finish", "()V") \ - METHOD (getClipboardContent, "getClipboardContent", "()Ljava/lang/String;") \ - METHOD (setClipboardContent, "setClipboardContent", "(Ljava/lang/String;)V") \ - METHOD (excludeClipRegion, "excludeClipRegion", "(Landroid/graphics/Canvas;FFFF)V") \ - METHOD (renderGlyph, "renderGlyph", "(CLandroid/graphics/Paint;Landroid/graphics/Matrix;Landroid/graphics/Rect;)[I") \ - STATICMETHOD (createHTTPStream, "createHTTPStream", "(Ljava/lang/String;Z[BLjava/lang/String;I[ILjava/lang/StringBuffer;I)L" JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream;") \ - METHOD (launchURL, "launchURL", "(Ljava/lang/String;)V") \ - METHOD (showMessageBox, "showMessageBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ - METHOD (showOkCancelBox, "showOkCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ - METHOD (showYesNoCancelBox, "showYesNoCancelBox", "(Ljava/lang/String;Ljava/lang/String;J)V") \ - STATICMETHOD (getLocaleValue, "getLocaleValue", "(Z)Ljava/lang/String;") \ - METHOD (scanFile, "scanFile", "(Ljava/lang/String;)V") - -DECLARE_JNI_CLASS (JuceAppActivity, JUCE_ANDROID_ACTIVITY_CLASSPATH); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (constructor, "", "(I)V") \ - METHOD (setColor, "setColor", "(I)V") \ - METHOD (setAlpha, "setAlpha", "(I)V") \ - METHOD (setTypeface, "setTypeface", "(Landroid/graphics/Typeface;)Landroid/graphics/Typeface;") \ - METHOD (ascent, "ascent", "()F") \ - METHOD (descent, "descent", "()F") \ - METHOD (setTextSize, "setTextSize", "(F)V") \ - METHOD (getTextWidths, "getTextWidths", "(Ljava/lang/String;[F)I") \ - METHOD (setTextScaleX, "setTextScaleX", "(F)V") \ - METHOD (getTextPath, "getTextPath", "(Ljava/lang/String;IIFFLandroid/graphics/Path;)V") \ - METHOD (setShader, "setShader", "(Landroid/graphics/Shader;)Landroid/graphics/Shader;") \ - -DECLARE_JNI_CLASS (Paint, "android/graphics/Paint"); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (constructor, "", "()V") \ - METHOD (setValues, "setValues", "([F)V") \ - -DECLARE_JNI_CLASS (Matrix, "android/graphics/Matrix"); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (constructor, "", "(IIII)V") \ - FIELD (left, "left", "I") \ - FIELD (right, "right", "I") \ - FIELD (top, "top", "I") \ - FIELD (bottom, "bottom", "I") \ - -DECLARE_JNI_CLASS (RectClass, "android/graphics/Rect"); -#undef JNI_CLASS_MEMBERS - -#endif // JUCE_ANDROID_JNIHELPERS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp b/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp deleted file mode 100755 index d26adc1..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_Misc.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -void Logger::outputDebugString (const String& text) -{ - __android_log_print (ANDROID_LOG_INFO, "JUCE", "%s", text.toUTF8().getAddress()); -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp b/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp deleted file mode 100755 index 46d13fe..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_Network.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (constructor, "", "()V") \ - METHOD (toString, "toString", "()Ljava/lang/String;") \ - -DECLARE_JNI_CLASS (StringBuffer, "java/lang/StringBuffer"); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - METHOD (release, "release", "()V") \ - METHOD (read, "read", "([BI)I") \ - METHOD (getPosition, "getPosition", "()J") \ - METHOD (getTotalLength, "getTotalLength", "()J") \ - METHOD (isExhausted, "isExhausted", "()Z") \ - METHOD (setPosition, "setPosition", "(J)Z") \ - -DECLARE_JNI_CLASS (HTTPStream, JUCE_ANDROID_ACTIVITY_CLASSPATH "$HTTPStream"); -#undef JNI_CLASS_MEMBERS - - -//============================================================================== -void MACAddress::findAllAddresses (Array& result) -{ - // TODO -} - - -JUCE_API bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach) -{ - // TODO - return false; -} - - -//============================================================================== -class WebInputStream : public InputStream -{ -public: - WebInputStream (String address, bool isPost, const MemoryBlock& postData, - URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers, int timeOutMs, StringPairArray* responseHeaders, const int numRedirectsToFollow) - : statusCode (0) - { - if (! address.contains ("://")) - address = "http://" + address; - - JNIEnv* env = getEnv(); - - jbyteArray postDataArray = 0; - - if (postData.getSize() > 0) - { - postDataArray = env->NewByteArray (postData.getSize()); - env->SetByteArrayRegion (postDataArray, 0, postData.getSize(), (const jbyte*) postData.getData()); - } - - LocalRef responseHeaderBuffer (env->NewObject (StringBuffer, StringBuffer.constructor)); - - // Annoyingly, the android HTTP functions will choke on this call if you try to do it on the message - // thread. You'll need to move your networking code to a background thread to keep it happy.. - jassert (Thread::getCurrentThread() != nullptr); - - jintArray statusCodeArray = env->NewIntArray (1); - jassert (statusCodeArray != 0); - - stream = GlobalRef (env->CallStaticObjectMethod (JuceAppActivity, - JuceAppActivity.createHTTPStream, - javaString (address).get(), - (jboolean) isPost, - postDataArray, - javaString (headers).get(), - (jint) timeOutMs, - statusCodeArray, - responseHeaderBuffer.get(), - (jint) numRedirectsToFollow)); - - jint* const statusCodeElements = env->GetIntArrayElements (statusCodeArray, 0); - statusCode = statusCodeElements[0]; - env->ReleaseIntArrayElements (statusCodeArray, statusCodeElements, 0); - env->DeleteLocalRef (statusCodeArray); - - if (postDataArray != 0) - env->DeleteLocalRef (postDataArray); - - if (stream != 0) - { - StringArray headerLines; - - { - LocalRef headersString ((jstring) env->CallObjectMethod (responseHeaderBuffer.get(), - StringBuffer.toString)); - headerLines.addLines (juceString (env, headersString)); - } - - if (responseHeaders != 0) - { - for (int i = 0; i < headerLines.size(); ++i) - { - const String& header = headerLines[i]; - const String key (header.upToFirstOccurrenceOf (": ", false, false)); - const String value (header.fromFirstOccurrenceOf (": ", false, false)); - const String previousValue ((*responseHeaders) [key]); - - responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); - } - } - } - } - - ~WebInputStream() - { - if (stream != 0) - stream.callVoidMethod (HTTPStream.release); - } - - //============================================================================== - bool isError() const { return stream == nullptr; } - - bool isExhausted() override { return stream != nullptr && stream.callBooleanMethod (HTTPStream.isExhausted); } - int64 getTotalLength() override { return stream != nullptr ? stream.callLongMethod (HTTPStream.getTotalLength) : 0; } - int64 getPosition() override { return stream != nullptr ? stream.callLongMethod (HTTPStream.getPosition) : 0; } - bool setPosition (int64 wantedPos) override { return stream != nullptr && stream.callBooleanMethod (HTTPStream.setPosition, (jlong) wantedPos); } - - int read (void* buffer, int bytesToRead) override - { - jassert (buffer != nullptr && bytesToRead >= 0); - - if (stream == nullptr) - return 0; - - JNIEnv* env = getEnv(); - - jbyteArray javaArray = env->NewByteArray (bytesToRead); - - int numBytes = stream.callIntMethod (HTTPStream.read, javaArray, (jint) bytesToRead); - - if (numBytes > 0) - env->GetByteArrayRegion (javaArray, 0, numBytes, static_cast (buffer)); - - env->DeleteLocalRef (javaArray); - return numBytes; - } - - //============================================================================== - GlobalRef stream; - int statusCode; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream) -}; diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp b/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp deleted file mode 100755 index b012381..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_SystemStats.cpp +++ /dev/null @@ -1,315 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -JNIClassBase::JNIClassBase (const char* cp) : classPath (cp), classRef (0) -{ - getClasses().add (this); -} - -JNIClassBase::~JNIClassBase() -{ - getClasses().removeFirstMatchingValue (this); -} - -Array& JNIClassBase::getClasses() -{ - static Array classes; - return classes; -} - -void JNIClassBase::initialise (JNIEnv* env) -{ - classRef = (jclass) env->NewGlobalRef (env->FindClass (classPath)); - jassert (classRef != 0); - - initialiseFields (env); -} - -void JNIClassBase::release (JNIEnv* env) -{ - env->DeleteGlobalRef (classRef); -} - -void JNIClassBase::initialiseAllClasses (JNIEnv* env) -{ - const Array& classes = getClasses(); - for (int i = classes.size(); --i >= 0;) - classes.getUnchecked(i)->initialise (env); -} - -void JNIClassBase::releaseAllClasses (JNIEnv* env) -{ - const Array& classes = getClasses(); - for (int i = classes.size(); --i >= 0;) - classes.getUnchecked(i)->release (env); -} - -jmethodID JNIClassBase::resolveMethod (JNIEnv* env, const char* methodName, const char* params) -{ - jmethodID m = env->GetMethodID (classRef, methodName, params); - jassert (m != 0); - return m; -} - -jmethodID JNIClassBase::resolveStaticMethod (JNIEnv* env, const char* methodName, const char* params) -{ - jmethodID m = env->GetStaticMethodID (classRef, methodName, params); - jassert (m != 0); - return m; -} - -jfieldID JNIClassBase::resolveField (JNIEnv* env, const char* fieldName, const char* signature) -{ - jfieldID f = env->GetFieldID (classRef, fieldName, signature); - jassert (f != 0); - return f; -} - -jfieldID JNIClassBase::resolveStaticField (JNIEnv* env, const char* fieldName, const char* signature) -{ - jfieldID f = env->GetStaticFieldID (classRef, fieldName, signature); - jassert (f != 0); - return f; -} - -//============================================================================== -ThreadLocalJNIEnvHolder threadLocalJNIEnvHolder; - -#if JUCE_DEBUG -static bool systemInitialised = false; -#endif - -JNIEnv* getEnv() noexcept -{ - #if JUCE_DEBUG - if (! systemInitialised) - { - DBG ("*** Call to getEnv() when system not initialised"); - jassertfalse; - std::exit (EXIT_FAILURE); - } - #endif - - return threadLocalJNIEnvHolder.getOrAttach(); -} - -extern "C" jint JNI_OnLoad (JavaVM*, void*) -{ - return JNI_VERSION_1_2; -} - -//============================================================================== -AndroidSystem::AndroidSystem() : screenWidth (0), screenHeight (0), dpi (160) -{ -} - -void AndroidSystem::initialise (JNIEnv* env, jobject act, jstring file, jstring dataDir) -{ - screenWidth = screenHeight = 0; - dpi = 160; - JNIClassBase::initialiseAllClasses (env); - - threadLocalJNIEnvHolder.initialise (env); - #if JUCE_DEBUG - systemInitialised = true; - #endif - - activity = GlobalRef (act); - appFile = juceString (env, file); - appDataDir = juceString (env, dataDir); -} - -void AndroidSystem::shutdown (JNIEnv* env) -{ - activity.clear(); - - #if JUCE_DEBUG - systemInitialised = false; - #endif - - JNIClassBase::releaseAllClasses (env); -} - -AndroidSystem android; - -//============================================================================== -namespace AndroidStatsHelpers -{ - #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - STATICMETHOD (getProperty, "getProperty", "(Ljava/lang/String;)Ljava/lang/String;") - - DECLARE_JNI_CLASS (SystemClass, "java/lang/System"); - #undef JNI_CLASS_MEMBERS - - String getSystemProperty (const String& name) - { - return juceString (LocalRef ((jstring) getEnv()->CallStaticObjectMethod (SystemClass, - SystemClass.getProperty, - javaString (name).get()))); - } - - String getLocaleValue (bool isRegion) - { - return juceString (LocalRef ((jstring) getEnv()->CallStaticObjectMethod (JuceAppActivity, - JuceAppActivity.getLocaleValue, - isRegion))); - } - - #define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) - DECLARE_JNI_CLASS (BuildClass, "android/os/Build"); - #undef JNI_CLASS_MEMBERS - - String getAndroidOsBuildValue (const char* fieldName) - { - return juceString (LocalRef ((jstring) getEnv()->GetStaticObjectField ( - BuildClass, getEnv()->GetStaticFieldID (BuildClass, fieldName, "Ljava/lang/String;")))); - } -} - -//============================================================================== -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - return Android; -} - -String SystemStats::getOperatingSystemName() -{ - return "Android " + AndroidStatsHelpers::getSystemProperty ("os.version"); -} - -String SystemStats::getDeviceDescription() -{ - return AndroidStatsHelpers::getAndroidOsBuildValue ("MODEL") - + "-" + AndroidStatsHelpers::getAndroidOsBuildValue ("SERIAL"); -} - -bool SystemStats::isOperatingSystem64Bit() -{ - #if JUCE_64BIT - return true; - #else - return false; - #endif -} - -String SystemStats::getCpuVendor() -{ - return AndroidStatsHelpers::getSystemProperty ("os.arch"); -} - -int SystemStats::getCpuSpeedInMegaherz() -{ - return 0; // TODO -} - -int SystemStats::getMemorySizeInMegabytes() -{ - #if __ANDROID_API__ >= 9 - struct sysinfo sysi; - - if (sysinfo (&sysi) == 0) - return (sysi.totalram * sysi.mem_unit / (1024 * 1024)); - #endif - - return 0; -} - -int SystemStats::getPageSize() -{ - return sysconf (_SC_PAGESIZE); -} - -//============================================================================== -String SystemStats::getLogonName() -{ - if (const char* user = getenv ("USER")) - return CharPointer_UTF8 (user); - - if (struct passwd* const pw = getpwuid (getuid())) - return CharPointer_UTF8 (pw->pw_name); - - return String::empty; -} - -String SystemStats::getFullUserName() -{ - return getLogonName(); -} - -String SystemStats::getComputerName() -{ - char name [256] = { 0 }; - if (gethostname (name, sizeof (name) - 1) == 0) - return name; - - return String::empty; -} - - -String SystemStats::getUserLanguage() { return AndroidStatsHelpers::getLocaleValue (false); } -String SystemStats::getUserRegion() { return AndroidStatsHelpers::getLocaleValue (true); } -String SystemStats::getDisplayLanguage() { return getUserLanguage() + "-" + getUserRegion(); } - -//============================================================================== -void CPUInformation::initialise() noexcept -{ - numCpus = jmax (1, (int) sysconf (_SC_NPROCESSORS_ONLN)); -} - -//============================================================================== -uint32 juce_millisecondsSinceStartup() noexcept -{ - timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - - return t.tv_sec * 1000 + t.tv_nsec / 1000000; -} - -int64 Time::getHighResolutionTicks() noexcept -{ - timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - - return (t.tv_sec * (int64) 1000000) + (t.tv_nsec / 1000); -} - -int64 Time::getHighResolutionTicksPerSecond() noexcept -{ - return 1000000; // (microseconds) -} - -double Time::getMillisecondCounterHiRes() noexcept -{ - return getHighResolutionTicks() * 0.001; -} - -bool Time::setSystemTimeToThisTime() const -{ - jassertfalse; - return false; -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp b/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp deleted file mode 100755 index 981be9a..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_android_Threads.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -/* - Note that a lot of methods that you'd expect to find in this file actually - live in juce_posix_SharedCode.h! -*/ - -//============================================================================== -// sets the process to 0=low priority, 1=normal, 2=high, 3=realtime -JUCE_API void JUCE_CALLTYPE Process::setPriority (ProcessPriority prior) -{ - // TODO - - struct sched_param param; - int policy, maxp, minp; - - const int p = (int) prior; - - if (p <= 1) - policy = SCHED_OTHER; - else - policy = SCHED_RR; - - minp = sched_get_priority_min (policy); - maxp = sched_get_priority_max (policy); - - if (p < 2) - param.sched_priority = 0; - else if (p == 2 ) - // Set to middle of lower realtime priority range - param.sched_priority = minp + (maxp - minp) / 4; - else - // Set to middle of higher realtime priority range - param.sched_priority = minp + (3 * (maxp - minp) / 4); - - pthread_setschedparam (pthread_self(), policy, ¶m); -} - -JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() -{ - return false; -} - -JUCE_API bool JUCE_CALLTYPE Process::isRunningUnderDebugger() -{ - return juce_isRunningUnderDebugger(); -} - -JUCE_API void JUCE_CALLTYPE Process::raisePrivilege() {} -JUCE_API void JUCE_CALLTYPE Process::lowerPrivilege() {} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp b/JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp deleted file mode 100755 index 2ce98b3..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_linux_CommonFile.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -bool File::copyInternal (const File& dest) const -{ - FileInputStream in (*this); - - if (dest.deleteFile()) - { - { - FileOutputStream out (dest); - - if (out.failedToOpen()) - return false; - - if (out.writeFromInputStream (in, -1) == getSize()) - return true; - } - - dest.deleteFile(); - } - - return false; -} - -void File::findFileSystemRoots (Array& destArray) -{ - destArray.add (File ("/")); -} - -bool File::isHidden() const -{ - return getFileName().startsWithChar ('.'); -} - -static String getLinkedFile (StringRef file) -{ - HeapBlock buffer (8194); - const int numBytes = (int) readlink (file.text, buffer, 8192); - return String::fromUTF8 (buffer, jmax (0, numBytes)); -}; - -bool File::isLink() const -{ - return getLinkedFile (getFullPathName()).isNotEmpty(); -} - -File File::getLinkedTarget() const -{ - String f (getLinkedFile (getFullPathName())); - - if (f.isNotEmpty()) - return getSiblingFile (f); - - return *this; -} - -//============================================================================== -class DirectoryIterator::NativeIterator::Pimpl -{ -public: - Pimpl (const File& directory, const String& wc) - : parentDir (File::addTrailingSeparator (directory.getFullPathName())), - wildCard (wc), dir (opendir (directory.getFullPathName().toUTF8())) - { - } - - ~Pimpl() - { - if (dir != nullptr) - closedir (dir); - } - - bool next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) - { - if (dir != nullptr) - { - const char* wildcardUTF8 = nullptr; - - for (;;) - { - struct dirent* const de = readdir (dir); - - if (de == nullptr) - break; - - if (wildcardUTF8 == nullptr) - wildcardUTF8 = wildCard.toUTF8(); - - if (fnmatch (wildcardUTF8, de->d_name, FNM_CASEFOLD) == 0) - { - filenameFound = CharPointer_UTF8 (de->d_name); - - updateStatInfoForFile (parentDir + filenameFound, isDir, fileSize, modTime, creationTime, isReadOnly); - - if (isHidden != nullptr) - *isHidden = filenameFound.startsWithChar ('.'); - - return true; - } - } - } - - return false; - } - -private: - String parentDir, wildCard; - DIR* dir; - - JUCE_DECLARE_NON_COPYABLE (Pimpl) -}; - -DirectoryIterator::NativeIterator::NativeIterator (const File& directory, const String& wildCard) - : pimpl (new DirectoryIterator::NativeIterator::Pimpl (directory, wildCard)) -{ -} - -DirectoryIterator::NativeIterator::~NativeIterator() {} - -bool DirectoryIterator::NativeIterator::next (String& filenameFound, - bool* isDir, bool* isHidden, int64* fileSize, - Time* modTime, Time* creationTime, bool* isReadOnly) -{ - return pimpl->next (filenameFound, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp b/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp deleted file mode 100755 index d0dd54d..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_linux_Files.cpp +++ /dev/null @@ -1,241 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -enum -{ - U_ISOFS_SUPER_MAGIC = 0x9660, // linux/iso_fs.h - U_MSDOS_SUPER_MAGIC = 0x4d44, // linux/msdos_fs.h - U_NFS_SUPER_MAGIC = 0x6969, // linux/nfs_fs.h - U_SMB_SUPER_MAGIC = 0x517B // linux/smb_fs.h -}; - -bool File::isOnCDRomDrive() const -{ - struct statfs buf; - - return statfs (getFullPathName().toUTF8(), &buf) == 0 - && buf.f_type == (short) U_ISOFS_SUPER_MAGIC; -} - -bool File::isOnHardDisk() const -{ - struct statfs buf; - - if (statfs (getFullPathName().toUTF8(), &buf) == 0) - { - switch (buf.f_type) - { - case U_ISOFS_SUPER_MAGIC: // CD-ROM - case U_MSDOS_SUPER_MAGIC: // Probably floppy (but could be mounted FAT filesystem) - case U_NFS_SUPER_MAGIC: // Network NFS - case U_SMB_SUPER_MAGIC: // Network Samba - return false; - - default: break; - } - } - - // Assume so if this fails for some reason - return true; -} - -bool File::isOnRemovableDrive() const -{ - jassertfalse; // xxx not implemented for linux! - return false; -} - -String File::getVersion() const -{ - return String(); // xxx not yet implemented -} - -//============================================================================== -static File resolveXDGFolder (const char* const type, const char* const fallbackFolder) -{ - StringArray confLines; - File ("~/.config/user-dirs.dirs").readLines (confLines); - - for (int i = 0; i < confLines.size(); ++i) - { - const String line (confLines[i].trimStart()); - - if (line.startsWith (type)) - { - // eg. resolve XDG_MUSIC_DIR="$HOME/Music" to /home/user/Music - const File f (line.replace ("$HOME", File ("~").getFullPathName()) - .fromFirstOccurrenceOf ("=", false, false) - .trim().unquoted()); - - if (f.isDirectory()) - return f; - } - } - - return File (fallbackFolder); -} - -const char* const* juce_argv = nullptr; -int juce_argc = 0; - -File File::getSpecialLocation (const SpecialLocationType type) -{ - switch (type) - { - case userHomeDirectory: - { - if (const char* homeDir = getenv ("HOME")) - return File (CharPointer_UTF8 (homeDir)); - - if (struct passwd* const pw = getpwuid (getuid())) - return File (CharPointer_UTF8 (pw->pw_dir)); - - return File(); - } - - case userDocumentsDirectory: return resolveXDGFolder ("XDG_DOCUMENTS_DIR", "~"); - case userMusicDirectory: return resolveXDGFolder ("XDG_MUSIC_DIR", "~"); - case userMoviesDirectory: return resolveXDGFolder ("XDG_VIDEOS_DIR", "~"); - case userPicturesDirectory: return resolveXDGFolder ("XDG_PICTURES_DIR", "~"); - case userDesktopDirectory: return resolveXDGFolder ("XDG_DESKTOP_DIR", "~/Desktop"); - case userApplicationDataDirectory: return resolveXDGFolder ("XDG_CONFIG_HOME", "~"); - case commonDocumentsDirectory: - case commonApplicationDataDirectory: return File ("/var"); - case globalApplicationsDirectory: return File ("/usr"); - - case tempDirectory: - { - File tmp ("/var/tmp"); - - if (! tmp.isDirectory()) - { - tmp = "/tmp"; - - if (! tmp.isDirectory()) - tmp = File::getCurrentWorkingDirectory(); - } - - return tmp; - } - - case invokedExecutableFile: - if (juce_argv != nullptr && juce_argc > 0) - return File (CharPointer_UTF8 (juce_argv[0])); - // deliberate fall-through... - - case currentExecutableFile: - case currentApplicationFile: - return juce_getExecutableFile(); - - case hostApplicationPath: - { - const File f ("/proc/self/exe"); - return f.isLink() ? f.getLinkedTarget() : juce_getExecutableFile(); - } - - default: - jassertfalse; // unknown type? - break; - } - - return File(); -} - -//============================================================================== -bool File::moveToTrash() const -{ - if (! exists()) - return true; - - File trashCan ("~/.Trash"); - - if (! trashCan.isDirectory()) - trashCan = "~/.local/share/Trash/files"; - - if (! trashCan.isDirectory()) - return false; - - return moveFileTo (trashCan.getNonexistentChildFile (getFileNameWithoutExtension(), - getFileExtension())); -} - -//============================================================================== -static bool isFileExecutable (const String& filename) -{ - juce_statStruct info; - - return juce_stat (filename, info) - && S_ISREG (info.st_mode) - && access (filename.toUTF8(), X_OK) == 0; -} - -bool Process::openDocument (const String& fileName, const String& parameters) -{ - String cmdString (fileName.replace (" ", "\\ ",false)); - cmdString << " " << parameters; - - if (URL::isProbablyAWebsiteURL (fileName) - || cmdString.startsWithIgnoreCase ("file:") - || URL::isProbablyAnEmailAddress (fileName) - || File::createFileWithoutCheckingPath (fileName).isDirectory() - || ! isFileExecutable (fileName)) - { - // create a command that tries to launch a bunch of likely browsers - static const char* const browserNames[] = { "xdg-open", "/etc/alternatives/x-www-browser", "firefox", "mozilla", - "google-chrome", "chromium-browser", "opera", "konqueror" }; - StringArray cmdLines; - - for (int i = 0; i < numElementsInArray (browserNames); ++i) - cmdLines.add (String (browserNames[i]) + " " + cmdString.trim().quoted()); - - cmdString = cmdLines.joinIntoString (" || "); - } - - const char* const argv[4] = { "/bin/sh", "-c", cmdString.toUTF8(), 0 }; - - const int cpid = fork(); - - if (cpid == 0) - { - setsid(); - - // Child process - execve (argv[0], (char**) argv, environ); - exit (0); - } - - return cpid >= 0; -} - -void File::revealToUser() const -{ - if (isDirectory()) - startAsProcess(); - else if (getParentDirectory().exists()) - getParentDirectory().startAsProcess(); -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp b/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp deleted file mode 100755 index d077668..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_linux_Network.cpp +++ /dev/null @@ -1,453 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -void MACAddress::findAllAddresses (Array& result) -{ - const int s = socket (AF_INET, SOCK_DGRAM, 0); - if (s != -1) - { - struct ifaddrs* addrs = nullptr; - - if (getifaddrs (&addrs) != -1) - { - for (struct ifaddrs* i = addrs; i != nullptr; i = i->ifa_next) - { - struct ifreq ifr; - strcpy (ifr.ifr_name, i->ifa_name); - ifr.ifr_addr.sa_family = AF_INET; - - if (ioctl (s, SIOCGIFHWADDR, &ifr) == 0) - { - MACAddress ma ((const uint8*) ifr.ifr_hwaddr.sa_data); - - if (! ma.isNull()) - result.addIfNotAlreadyThere (ma); - } - } - - freeifaddrs (addrs); - } - - close (s); - } -} - - -bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& /* targetEmailAddress */, - const String& /* emailSubject */, - const String& /* bodyText */, - const StringArray& /* filesToAttach */) -{ - jassertfalse; // xxx todo - return false; -} - - -//============================================================================== -class WebInputStream : public InputStream -{ -public: - WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, - URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers_, int timeOutMs_, StringPairArray* responseHeaders, - const int maxRedirects) - : statusCode (0), socketHandle (-1), levelsOfRedirection (0), - address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_), numRedirectsToFollow (maxRedirects) - { - statusCode = createConnection (progressCallback, progressCallbackContext, numRedirectsToFollow); - - if (responseHeaders != nullptr && ! isError()) - { - for (int i = 0; i < headerLines.size(); ++i) - { - const String& headersEntry = headerLines[i]; - const String key (headersEntry.upToFirstOccurrenceOf (": ", false, false)); - const String value (headersEntry.fromFirstOccurrenceOf (": ", false, false)); - const String previousValue ((*responseHeaders) [key]); - responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); - } - } - } - - ~WebInputStream() - { - closeSocket(); - } - - //============================================================================== - bool isError() const { return socketHandle < 0; } - bool isExhausted() override { return finished; } - int64 getPosition() override { return position; } - - int64 getTotalLength() override - { - //xxx to do - return -1; - } - - int read (void* buffer, int bytesToRead) override - { - if (finished || isError()) - return 0; - - fd_set readbits; - FD_ZERO (&readbits); - FD_SET (socketHandle, &readbits); - - struct timeval tv; - tv.tv_sec = jmax (1, timeOutMs / 1000); - tv.tv_usec = 0; - - if (select (socketHandle + 1, &readbits, 0, 0, &tv) <= 0) - return 0; // (timeout) - - const int bytesRead = jmax (0, (int) recv (socketHandle, buffer, bytesToRead, MSG_WAITALL)); - if (bytesRead == 0) - finished = true; - - position += bytesRead; - return bytesRead; - } - - bool setPosition (int64 wantedPos) override - { - if (isError()) - return false; - - if (wantedPos != position) - { - finished = false; - - if (wantedPos < position) - { - closeSocket(); - position = 0; - statusCode = createConnection (0, 0, numRedirectsToFollow); - } - - skipNextBytes (wantedPos - position); - } - - return true; - } - - //============================================================================== - int statusCode; - -private: - int socketHandle, levelsOfRedirection; - StringArray headerLines; - String address, headers; - MemoryBlock postData; - int64 position; - bool finished; - const bool isPost; - const int timeOutMs; - const int numRedirectsToFollow; - - void closeSocket (bool resetLevelsOfRedirection = true) - { - if (socketHandle >= 0) - close (socketHandle); - - socketHandle = -1; - if (resetLevelsOfRedirection) - levelsOfRedirection = 0; - } - - int createConnection (URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const int numRedirectsToFollow) - { - closeSocket (false); - - uint32 timeOutTime = Time::getMillisecondCounter(); - - if (timeOutMs == 0) - timeOutTime += 30000; - else if (timeOutMs < 0) - timeOutTime = 0xffffffff; - else - timeOutTime += timeOutMs; - - String hostName, hostPath; - int hostPort; - if (! decomposeURL (address, hostName, hostPath, hostPort)) - return 0; - - String serverName, proxyName, proxyPath; - int proxyPort = 0; - int port = 0; - - const String proxyURL (getenv ("http_proxy")); - if (proxyURL.startsWithIgnoreCase ("http://")) - { - if (! decomposeURL (proxyURL, proxyName, proxyPath, proxyPort)) - return 0; - - serverName = proxyName; - port = proxyPort; - } - else - { - serverName = hostName; - port = hostPort; - } - - struct addrinfo hints; - zerostruct (hints); - - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_flags = AI_NUMERICSERV; - - struct addrinfo* result = nullptr; - if (getaddrinfo (serverName.toUTF8(), String (port).toUTF8(), &hints, &result) != 0 || result == 0) - return 0; - - socketHandle = socket (result->ai_family, result->ai_socktype, 0); - - if (socketHandle == -1) - { - freeaddrinfo (result); - return 0; - } - - int receiveBufferSize = 16384; - setsockopt (socketHandle, SOL_SOCKET, SO_RCVBUF, (char*) &receiveBufferSize, sizeof (receiveBufferSize)); - setsockopt (socketHandle, SOL_SOCKET, SO_KEEPALIVE, 0, 0); - - #if JUCE_MAC - setsockopt (socketHandle, SOL_SOCKET, SO_NOSIGPIPE, 0, 0); - #endif - - if (connect (socketHandle, result->ai_addr, result->ai_addrlen) == -1) - { - closeSocket(); - freeaddrinfo (result); - return 0; - } - - freeaddrinfo (result); - - { - const MemoryBlock requestHeader (createRequestHeader (hostName, hostPort, proxyName, proxyPort, - hostPath, address, headers, postData, isPost)); - - if (! sendHeader (socketHandle, requestHeader, timeOutTime, - progressCallback, progressCallbackContext)) - { - closeSocket(); - return 0; - } - } - - String responseHeader (readResponse (timeOutTime)); - position = 0; - - if (responseHeader.isNotEmpty()) - { - headerLines = StringArray::fromLines (responseHeader); - - const int status = responseHeader.fromFirstOccurrenceOf (" ", false, false) - .substring (0, 3).getIntValue(); - - String location (findHeaderItem (headerLines, "Location:")); - - if (++levelsOfRedirection <= numRedirectsToFollow - && status >= 300 && status < 400 - && location.isNotEmpty() && location != address) - { - if (! (location.startsWithIgnoreCase ("http://") - || location.startsWithIgnoreCase ("https://") - || location.startsWithIgnoreCase ("ftp://"))) - { - // The following is a bit dodgy. Ideally, we should do a proper transform of the relative URI to a target URI - if (location.startsWithChar ('/')) - location = URL (address).withNewSubPath (location).toString (true); - else - location = address + "/" + location; - } - - address = location; - return createConnection (progressCallback, progressCallbackContext, numRedirectsToFollow); - } - - return status; - } - - closeSocket(); - return 0; - } - - //============================================================================== - String readResponse (const uint32 timeOutTime) - { - int numConsecutiveLFs = 0; - MemoryOutputStream buffer; - - while (numConsecutiveLFs < 2 - && buffer.getDataSize() < 32768 - && Time::getMillisecondCounter() <= timeOutTime - && ! (finished || isError())) - { - char c = 0; - if (read (&c, 1) != 1) - return String(); - - buffer.writeByte (c); - - if (c == '\n') - ++numConsecutiveLFs; - else if (c != '\r') - numConsecutiveLFs = 0; - } - - const String header (buffer.toString().trimEnd()); - - if (header.startsWithIgnoreCase ("HTTP/")) - return header; - - return String(); - } - - static void writeValueIfNotPresent (MemoryOutputStream& dest, const String& headers, const String& key, const String& value) - { - if (! headers.containsIgnoreCase (key)) - dest << "\r\n" << key << ' ' << value; - } - - static void writeHost (MemoryOutputStream& dest, const bool isPost, - const String& path, const String& host, int /*port*/) - { - dest << (isPost ? "POST " : "GET ") << path << " HTTP/1.0\r\nHost: " << host; - } - - static MemoryBlock createRequestHeader (const String& hostName, const int hostPort, - const String& proxyName, const int proxyPort, - const String& hostPath, const String& originalURL, - const String& userHeaders, const MemoryBlock& postData, - const bool isPost) - { - MemoryOutputStream header; - - if (proxyName.isEmpty()) - writeHost (header, isPost, hostPath, hostName, hostPort); - else - writeHost (header, isPost, originalURL, proxyName, proxyPort); - - writeValueIfNotPresent (header, userHeaders, "User-Agent:", "JUCE/" JUCE_STRINGIFY(JUCE_MAJOR_VERSION) - "." JUCE_STRINGIFY(JUCE_MINOR_VERSION) - "." JUCE_STRINGIFY(JUCE_BUILDNUMBER)); - writeValueIfNotPresent (header, userHeaders, "Connection:", "close"); - - if (isPost) - { - writeValueIfNotPresent (header, userHeaders, "Content-Length:", String ((int) postData.getSize())); - header << userHeaders << "\r\n" << postData; - } - else - { - header << "\r\n" << userHeaders << "\r\n"; - } - - return header.getMemoryBlock(); - } - - static bool sendHeader (int socketHandle, const MemoryBlock& requestHeader, const uint32 timeOutTime, - URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext) - { - size_t totalHeaderSent = 0; - - while (totalHeaderSent < requestHeader.getSize()) - { - if (Time::getMillisecondCounter() > timeOutTime) - return false; - - const int numToSend = jmin (1024, (int) (requestHeader.getSize() - totalHeaderSent)); - - if (send (socketHandle, static_cast (requestHeader.getData()) + totalHeaderSent, numToSend, 0) != numToSend) - return false; - - totalHeaderSent += numToSend; - - if (progressCallback != nullptr && ! progressCallback (progressCallbackContext, totalHeaderSent, requestHeader.getSize())) - return false; - } - - return true; - } - - static bool decomposeURL (const String& url, String& host, String& path, int& port) - { - if (! url.startsWithIgnoreCase ("http://")) - return false; - - const int nextSlash = url.indexOfChar (7, '/'); - int nextColon = url.indexOfChar (7, ':'); - if (nextColon > nextSlash && nextSlash > 0) - nextColon = -1; - - if (nextColon >= 0) - { - host = url.substring (7, nextColon); - - if (nextSlash >= 0) - port = url.substring (nextColon + 1, nextSlash).getIntValue(); - else - port = url.substring (nextColon + 1).getIntValue(); - } - else - { - port = 80; - - if (nextSlash >= 0) - host = url.substring (7, nextSlash); - else - host = url.substring (7); - } - - if (nextSlash >= 0) - path = url.substring (nextSlash); - else - path = "/"; - - return true; - } - - static String findHeaderItem (const StringArray& lines, const String& itemName) - { - for (int i = 0; i < lines.size(); ++i) - if (lines[i].startsWithIgnoreCase (itemName)) - return lines[i].substring (itemName.length()).trim(); - - return String(); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream) -}; diff --git a/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp b/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp deleted file mode 100755 index 939edb4..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_linux_SystemStats.cpp +++ /dev/null @@ -1,191 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -void Logger::outputDebugString (const String& text) -{ - std::cerr << text << std::endl; -} - -//============================================================================== -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - return Linux; -} - -String SystemStats::getOperatingSystemName() -{ - return "Linux"; -} - -bool SystemStats::isOperatingSystem64Bit() -{ - #if JUCE_64BIT - return true; - #else - //xxx not sure how to find this out?.. - return false; - #endif -} - -//============================================================================== -namespace LinuxStatsHelpers -{ - String getCpuInfo (const char* const key) - { - StringArray lines; - File ("/proc/cpuinfo").readLines (lines); - - for (int i = lines.size(); --i >= 0;) // (NB - it's important that this runs in reverse order) - if (lines[i].upToFirstOccurrenceOf (":", false, false).trim().equalsIgnoreCase (key)) - return lines[i].fromFirstOccurrenceOf (":", false, false).trim(); - - return String(); - } -} - -String SystemStats::getDeviceDescription() -{ - return LinuxStatsHelpers::getCpuInfo ("Hardware"); -} - -String SystemStats::getCpuVendor() -{ - String v (LinuxStatsHelpers::getCpuInfo ("vendor_id")); - - if (v.isEmpty()) - v = LinuxStatsHelpers::getCpuInfo ("model name"); - - return v; -} - -int SystemStats::getCpuSpeedInMegaherz() -{ - return roundToInt (LinuxStatsHelpers::getCpuInfo ("cpu MHz").getFloatValue()); -} - -int SystemStats::getMemorySizeInMegabytes() -{ - struct sysinfo sysi; - - if (sysinfo (&sysi) == 0) - return sysi.totalram * sysi.mem_unit / (1024 * 1024); - - return 0; -} - -int SystemStats::getPageSize() -{ - return sysconf (_SC_PAGESIZE); -} - -//============================================================================== -String SystemStats::getLogonName() -{ - if (const char* user = getenv ("USER")) - return CharPointer_UTF8 (user); - - if (struct passwd* const pw = getpwuid (getuid())) - return CharPointer_UTF8 (pw->pw_name); - - return String(); -} - -String SystemStats::getFullUserName() -{ - return getLogonName(); -} - -String SystemStats::getComputerName() -{ - char name [256] = { 0 }; - if (gethostname (name, sizeof (name) - 1) == 0) - return name; - - return String(); -} - -static String getLocaleValue (nl_item key) -{ - const char* oldLocale = ::setlocale (LC_ALL, ""); - String result (String::fromUTF8 (nl_langinfo (key))); - ::setlocale (LC_ALL, oldLocale); - return result; -} - -String SystemStats::getUserLanguage() { return getLocaleValue (_NL_IDENTIFICATION_LANGUAGE); } -String SystemStats::getUserRegion() { return getLocaleValue (_NL_IDENTIFICATION_TERRITORY); } -String SystemStats::getDisplayLanguage() { return getUserLanguage() + "-" + getUserRegion(); } - -//============================================================================== -void CPUInformation::initialise() noexcept -{ - const String flags (LinuxStatsHelpers::getCpuInfo ("flags")); - hasMMX = flags.contains ("mmx"); - hasSSE = flags.contains ("sse"); - hasSSE2 = flags.contains ("sse2"); - hasSSE3 = flags.contains ("sse3"); - has3DNow = flags.contains ("3dnow"); - - numCpus = LinuxStatsHelpers::getCpuInfo ("processor").getIntValue() + 1; -} - -//============================================================================== -uint32 juce_millisecondsSinceStartup() noexcept -{ - timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - - return t.tv_sec * 1000 + t.tv_nsec / 1000000; -} - -int64 Time::getHighResolutionTicks() noexcept -{ - timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - - return (t.tv_sec * (int64) 1000000) + (t.tv_nsec / 1000); -} - -int64 Time::getHighResolutionTicksPerSecond() noexcept -{ - return 1000000; // (microseconds) -} - -double Time::getMillisecondCounterHiRes() noexcept -{ - return getHighResolutionTicks() * 0.001; -} - -bool Time::setSystemTimeToThisTime() const -{ - timeval t; - t.tv_sec = millisSinceEpoch / 1000; - t.tv_usec = (millisSinceEpoch - t.tv_sec * 1000) * 1000; - - return settimeofday (&t, 0) == 0; -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp b/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp deleted file mode 100755 index 659fbd9..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_linux_Threads.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -/* - Note that a lot of methods that you'd expect to find in this file actually - live in juce_posix_SharedCode.h! -*/ - -//============================================================================== -JUCE_API void JUCE_CALLTYPE Process::setPriority (const ProcessPriority prior) -{ - const int policy = (prior <= NormalPriority) ? SCHED_OTHER : SCHED_RR; - const int minp = sched_get_priority_min (policy); - const int maxp = sched_get_priority_max (policy); - - struct sched_param param; - - switch (prior) - { - case LowPriority: - case NormalPriority: param.sched_priority = 0; break; - case HighPriority: param.sched_priority = minp + (maxp - minp) / 4; break; - case RealtimePriority: param.sched_priority = minp + (3 * (maxp - minp) / 4); break; - default: jassertfalse; break; - } - - pthread_setschedparam (pthread_self(), policy, ¶m); -} - -JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() -{ - #if JUCE_BSD - return false; - #else - static char testResult = 0; - - if (testResult == 0) - { - testResult = (char) ptrace (PT_TRACE_ME, 0, 0, 0); - - if (testResult >= 0) - { - ptrace (PT_DETACH, 0, (caddr_t) 1, 0); - testResult = 1; - } - } - - return testResult < 0; - #endif -} - -JUCE_API bool JUCE_CALLTYPE Process::isRunningUnderDebugger() -{ - return juce_isRunningUnderDebugger(); -} - -static bool swapUserAndEffectiveUser() -{ - int result1 = setreuid (geteuid(), getuid()); - int result2 = setregid (getegid(), getgid()); - return result1 == 0 && result2 == 0; -} - -JUCE_API void JUCE_CALLTYPE Process::raisePrivilege() { if (geteuid() != 0 && getuid() == 0) swapUserAndEffectiveUser(); } -JUCE_API void JUCE_CALLTYPE Process::lowerPrivilege() { if (geteuid() == 0 && getuid() != 0) swapUserAndEffectiveUser(); } diff --git a/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm b/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm deleted file mode 100755 index 0a00e92..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_mac_Files.mm +++ /dev/null @@ -1,498 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -/* - Note that a lot of methods that you'd expect to find in this file actually - live in juce_posix_SharedCode.h! -*/ - -//============================================================================== -bool File::copyInternal (const File& dest) const -{ - JUCE_AUTORELEASEPOOL - { - NSFileManager* fm = [NSFileManager defaultManager]; - - return [fm fileExistsAtPath: juceStringToNS (fullPath)] - #if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6 - && [fm copyItemAtPath: juceStringToNS (fullPath) - toPath: juceStringToNS (dest.getFullPathName()) - error: nil]; - #else - && [fm copyPath: juceStringToNS (fullPath) - toPath: juceStringToNS (dest.getFullPathName()) - handler: nil]; - #endif - } -} - -void File::findFileSystemRoots (Array& destArray) -{ - destArray.add (File ("/")); -} - - -//============================================================================== -namespace FileHelpers -{ - static bool isFileOnDriveType (const File& f, const char* const* types) - { - struct statfs buf; - - if (juce_doStatFS (f, buf)) - { - const String type (buf.f_fstypename); - - while (*types != 0) - if (type.equalsIgnoreCase (*types++)) - return true; - } - - return false; - } - - static bool isHiddenFile (const String& path) - { - #if defined (MAC_OS_X_VERSION_10_6) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_6 - JUCE_AUTORELEASEPOOL - { - NSNumber* hidden = nil; - NSError* err = nil; - - return [[NSURL fileURLWithPath: juceStringToNS (path)] - getResourceValue: &hidden forKey: NSURLIsHiddenKey error: &err] - && [hidden boolValue]; - } - #elif JUCE_IOS - return File (path).getFileName().startsWithChar ('.'); - #else - FSRef ref; - LSItemInfoRecord info; - - return FSPathMakeRefWithOptions ((const UInt8*) path.toRawUTF8(), kFSPathMakeRefDoNotFollowLeafSymlink, &ref, 0) == noErr - && LSCopyItemInfoForRef (&ref, kLSRequestBasicFlagsOnly, &info) == noErr - && (info.flags & kLSItemInfoIsInvisible) != 0; - #endif - } - - #if JUCE_IOS - static String getIOSSystemLocation (NSSearchPathDirectory type) - { - return nsStringToJuce ([NSSearchPathForDirectoriesInDomains (type, NSUserDomainMask, YES) - objectAtIndex: 0]); - } - #endif - - static bool launchExecutable (const String& pathAndArguments) - { - const char* const argv[4] = { "/bin/sh", "-c", pathAndArguments.toUTF8(), 0 }; - - const int cpid = fork(); - - if (cpid == 0) - { - // Child process - if (execve (argv[0], (char**) argv, 0) < 0) - exit (0); - } - else - { - if (cpid < 0) - return false; - } - - return true; - } -} - -bool File::isOnCDRomDrive() const -{ - static const char* const cdTypes[] = { "cd9660", "cdfs", "cddafs", "udf", nullptr }; - - return FileHelpers::isFileOnDriveType (*this, cdTypes); -} - -bool File::isOnHardDisk() const -{ - static const char* const nonHDTypes[] = { "nfs", "smbfs", "ramfs", nullptr }; - - return ! (isOnCDRomDrive() || FileHelpers::isFileOnDriveType (*this, nonHDTypes)); -} - -bool File::isOnRemovableDrive() const -{ - #if JUCE_IOS - return false; // xxx is this possible? - #else - JUCE_AUTORELEASEPOOL - { - BOOL removable = false; - - [[NSWorkspace sharedWorkspace] - getFileSystemInfoForPath: juceStringToNS (getFullPathName()) - isRemovable: &removable - isWritable: nil - isUnmountable: nil - description: nil - type: nil]; - - return removable; - } - #endif -} - -bool File::isHidden() const -{ - return FileHelpers::isHiddenFile (getFullPathName()); -} - -//============================================================================== -const char* const* juce_argv = nullptr; -int juce_argc = 0; - -File File::getSpecialLocation (const SpecialLocationType type) -{ - JUCE_AUTORELEASEPOOL - { - String resultPath; - - switch (type) - { - case userHomeDirectory: resultPath = nsStringToJuce (NSHomeDirectory()); break; - - #if JUCE_IOS - case userDocumentsDirectory: resultPath = FileHelpers::getIOSSystemLocation (NSDocumentDirectory); break; - case userDesktopDirectory: resultPath = FileHelpers::getIOSSystemLocation (NSDesktopDirectory); break; - - case tempDirectory: - { - File tmp (FileHelpers::getIOSSystemLocation (NSCachesDirectory)); - tmp = tmp.getChildFile (juce_getExecutableFile().getFileNameWithoutExtension()); - tmp.createDirectory(); - return tmp.getFullPathName(); - } - - #else - case userDocumentsDirectory: resultPath = "~/Documents"; break; - case userDesktopDirectory: resultPath = "~/Desktop"; break; - - case tempDirectory: - { - File tmp ("~/Library/Caches/" + juce_getExecutableFile().getFileNameWithoutExtension()); - tmp.createDirectory(); - return File (tmp.getFullPathName()); - } - #endif - case userMusicDirectory: resultPath = "~/Music"; break; - case userMoviesDirectory: resultPath = "~/Movies"; break; - case userPicturesDirectory: resultPath = "~/Pictures"; break; - case userApplicationDataDirectory: resultPath = "~/Library"; break; - case commonApplicationDataDirectory: resultPath = "/Library"; break; - case commonDocumentsDirectory: resultPath = "/Users/Shared"; break; - case globalApplicationsDirectory: resultPath = "/Applications"; break; - - case invokedExecutableFile: - if (juce_argv != nullptr && juce_argc > 0) - return File (CharPointer_UTF8 (juce_argv[0])); - // deliberate fall-through... - - case currentExecutableFile: - return juce_getExecutableFile(); - - case currentApplicationFile: - { - const File exe (juce_getExecutableFile()); - const File parent (exe.getParentDirectory()); - - #if JUCE_IOS - return parent; - #else - return parent.getFullPathName().endsWithIgnoreCase ("Contents/MacOS") - ? parent.getParentDirectory().getParentDirectory() - : exe; - #endif - } - - case hostApplicationPath: - { - unsigned int size = 8192; - HeapBlock buffer; - buffer.calloc (size + 8); - - _NSGetExecutablePath (buffer.getData(), &size); - return File (String::fromUTF8 (buffer, (int) size)); - } - - default: - jassertfalse; // unknown type? - break; - } - - if (resultPath.isNotEmpty()) - return File (resultPath.convertToPrecomposedUnicode()); - } - - return File(); -} - -//============================================================================== -String File::getVersion() const -{ - JUCE_AUTORELEASEPOOL - { - if (NSBundle* bundle = [NSBundle bundleWithPath: juceStringToNS (getFullPathName())]) - if (NSDictionary* info = [bundle infoDictionary]) - if (NSString* name = [info valueForKey: nsStringLiteral ("CFBundleShortVersionString")]) - return nsStringToJuce (name); - } - - return String(); -} - -//============================================================================== -static NSString* getFileLink (const String& path) -{ - #if JUCE_IOS || (defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) - return [[NSFileManager defaultManager] destinationOfSymbolicLinkAtPath: juceStringToNS (path) error: nil]; - #else - // (the cast here avoids a deprecation warning) - return [((id) [NSFileManager defaultManager]) pathContentOfSymbolicLinkAtPath: juceStringToNS (path)]; - #endif -} - -bool File::isLink() const -{ - return getFileLink (fullPath) != nil; -} - -File File::getLinkedTarget() const -{ - if (NSString* dest = getFileLink (fullPath)) - return getSiblingFile (nsStringToJuce (dest)); - - return *this; -} - -//============================================================================== -bool File::moveToTrash() const -{ - if (! exists()) - return true; - - #if JUCE_IOS - return deleteFile(); //xxx is there a trashcan on the iOS? - #else - JUCE_AUTORELEASEPOOL - { - NSString* p = juceStringToNS (getFullPathName()); - - return [[NSWorkspace sharedWorkspace] - performFileOperation: NSWorkspaceRecycleOperation - source: [p stringByDeletingLastPathComponent] - destination: nsEmptyString() - files: [NSArray arrayWithObject: [p lastPathComponent]] - tag: nil ]; - } - #endif -} - -//============================================================================== -class DirectoryIterator::NativeIterator::Pimpl -{ -public: - Pimpl (const File& directory, const String& wildCard_) - : parentDir (File::addTrailingSeparator (directory.getFullPathName())), - wildCard (wildCard_), - enumerator (nil) - { - JUCE_AUTORELEASEPOOL - { - enumerator = [[[NSFileManager defaultManager] enumeratorAtPath: juceStringToNS (directory.getFullPathName())] retain]; - } - } - - ~Pimpl() - { - [enumerator release]; - } - - bool next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) - { - JUCE_AUTORELEASEPOOL - { - const char* wildcardUTF8 = nullptr; - - for (;;) - { - NSString* file; - if (enumerator == nil || (file = [enumerator nextObject]) == nil) - return false; - - [enumerator skipDescendents]; - filenameFound = nsStringToJuce (file).convertToPrecomposedUnicode(); - - if (wildcardUTF8 == nullptr) - wildcardUTF8 = wildCard.toUTF8(); - - if (fnmatch (wildcardUTF8, filenameFound.toUTF8(), FNM_CASEFOLD) != 0) - continue; - - const String fullPath (parentDir + filenameFound); - updateStatInfoForFile (fullPath, isDir, fileSize, modTime, creationTime, isReadOnly); - - if (isHidden != nullptr) - *isHidden = FileHelpers::isHiddenFile (fullPath); - - return true; - } - } - } - -private: - String parentDir, wildCard; - NSDirectoryEnumerator* enumerator; - - JUCE_DECLARE_NON_COPYABLE (Pimpl) -}; - -DirectoryIterator::NativeIterator::NativeIterator (const File& directory, const String& wildcard) - : pimpl (new DirectoryIterator::NativeIterator::Pimpl (directory, wildcard)) -{ -} - -DirectoryIterator::NativeIterator::~NativeIterator() -{ -} - -bool DirectoryIterator::NativeIterator::next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) -{ - return pimpl->next (filenameFound, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); -} - - -//============================================================================== -bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& parameters) -{ - JUCE_AUTORELEASEPOOL - { - NSURL* filenameAsURL = [NSURL URLWithString: juceStringToNS (fileName)]; - - #if JUCE_IOS - (void) parameters; - return [[UIApplication sharedApplication] openURL: filenameAsURL]; - #else - NSWorkspace* workspace = [NSWorkspace sharedWorkspace]; - - if (parameters.isEmpty()) - return [workspace openFile: juceStringToNS (fileName)] - || [workspace openURL: filenameAsURL]; - - const File file (fileName); - - if (file.isBundle()) - { - StringArray params; - params.addTokens (parameters, true); - - NSMutableArray* paramArray = [[[NSMutableArray alloc] init] autorelease]; - for (int i = 0; i < params.size(); ++i) - [paramArray addObject: juceStringToNS (params[i])]; - - NSMutableDictionary* dict = [[[NSMutableDictionary alloc] init] autorelease]; - [dict setObject: paramArray - forKey: nsStringLiteral ("NSWorkspaceLaunchConfigurationArguments")]; - - return [workspace launchApplicationAtURL: filenameAsURL - options: NSWorkspaceLaunchDefault | NSWorkspaceLaunchNewInstance - configuration: dict - error: nil]; - } - - if (file.exists()) - return FileHelpers::launchExecutable ("\"" + fileName + "\" " + parameters); - - return false; - #endif - } -} - -void File::revealToUser() const -{ - #if ! JUCE_IOS - if (exists()) - [[NSWorkspace sharedWorkspace] selectFile: juceStringToNS (getFullPathName()) inFileViewerRootedAtPath: nsEmptyString()]; - else if (getParentDirectory().exists()) - getParentDirectory().revealToUser(); - #endif -} - -//============================================================================== -OSType File::getMacOSType() const -{ - JUCE_AUTORELEASEPOOL - { - #if JUCE_IOS || (defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) - NSDictionary* fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath: juceStringToNS (getFullPathName()) error: nil]; - #else - // (the cast here avoids a deprecation warning) - NSDictionary* fileDict = [((id) [NSFileManager defaultManager]) fileAttributesAtPath: juceStringToNS (getFullPathName()) traverseLink: NO]; - #endif - - return [fileDict fileHFSTypeCode]; - } -} - -bool File::isBundle() const -{ - #if JUCE_IOS - return false; // xxx can't find a sensible way to do this without trying to open the bundle.. - #else - JUCE_AUTORELEASEPOOL - { - return [[NSWorkspace sharedWorkspace] isFilePackageAtPath: juceStringToNS (getFullPathName())]; - } - #endif -} - -#if JUCE_MAC -void File::addToDock() const -{ - // check that it's not already there... - if (! juce_getOutputFromCommand ("defaults read com.apple.dock persistent-apps").containsIgnoreCase (getFullPathName())) - { - juce_runSystemCommand ("defaults write com.apple.dock persistent-apps -array-add \"tile-datafile-data_CFURLString" - + getFullPathName() + "_CFURLStringType0\""); - - juce_runSystemCommand ("osascript -e \"tell application \\\"Dock\\\" to quit\""); - } -} -#endif diff --git a/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm b/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm deleted file mode 100755 index a0ddef5..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_mac_Network.mm +++ /dev/null @@ -1,467 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -void MACAddress::findAllAddresses (Array& result) -{ - ifaddrs* addrs = nullptr; - - if (getifaddrs (&addrs) == 0) - { - for (const ifaddrs* cursor = addrs; cursor != nullptr; cursor = cursor->ifa_next) - { - sockaddr_storage* sto = (sockaddr_storage*) cursor->ifa_addr; - if (sto->ss_family == AF_LINK) - { - const sockaddr_dl* const sadd = (const sockaddr_dl*) cursor->ifa_addr; - - #ifndef IFT_ETHER - enum { IFT_ETHER = 6 }; - #endif - - if (sadd->sdl_type == IFT_ETHER) - { - MACAddress ma (MACAddress (((const uint8*) sadd->sdl_data) + sadd->sdl_nlen)); - - if (! ma.isNull()) - result.addIfNotAlreadyThere (ma); - } - } - } - - freeifaddrs (addrs); - } -} - -//============================================================================== -bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach) -{ - #if JUCE_IOS - (void) targetEmailAddress; - (void) emailSubject; - (void) bodyText; - (void) filesToAttach; - - //xxx probably need to use MFMailComposeViewController - jassertfalse; - return false; - #else - JUCE_AUTORELEASEPOOL - { - String script; - script << "tell application \"Mail\"\r\n" - "set newMessage to make new outgoing message with properties {subject:\"" - << emailSubject.replace ("\"", "\\\"") - << "\", content:\"" - << bodyText.replace ("\"", "\\\"") - << "\" & return & return}\r\n" - "tell newMessage\r\n" - "set visible to true\r\n" - "set sender to \"sdfsdfsdfewf\"\r\n" - "make new to recipient at end of to recipients with properties {address:\"" - << targetEmailAddress - << "\"}\r\n"; - - for (int i = 0; i < filesToAttach.size(); ++i) - { - script << "tell content\r\n" - "make new attachment with properties {file name:\"" - << filesToAttach[i].replace ("\"", "\\\"") - << "\"} at after the last paragraph\r\n" - "end tell\r\n"; - } - - script << "end tell\r\n" - "end tell\r\n"; - - NSAppleScript* s = [[NSAppleScript alloc] initWithSource: juceStringToNS (script)]; - NSDictionary* error = nil; - const bool ok = [s executeAndReturnError: &error] != nil; - [s release]; - - return ok; - } - #endif -} - -//============================================================================== -class URLConnectionState : public Thread -{ -public: - URLConnectionState (NSURLRequest* req, const int maxRedirects) - : Thread ("http connection"), - contentLength (-1), - delegate (nil), - request ([req retain]), - connection (nil), - data ([[NSMutableData data] retain]), - headers (nil), - statusCode (0), - initialised (false), - hasFailed (false), - hasFinished (false), - numRedirectsToFollow (maxRedirects), - numRedirects (0) - { - static DelegateClass cls; - delegate = [cls.createInstance() init]; - DelegateClass::setState (delegate, this); - } - - ~URLConnectionState() - { - stop(); - [connection release]; - [data release]; - [request release]; - [headers release]; - [delegate release]; - } - - bool start (URL::OpenStreamProgressCallback* callback, void* context) - { - startThread(); - - while (isThreadRunning() && ! initialised) - { - if (callback != nullptr) - callback (context, -1, (int) [[request HTTPBody] length]); - - Thread::sleep (1); - } - - return connection != nil && ! hasFailed; - } - - void stop() - { - [connection cancel]; - stopThread (10000); - } - - int read (char* dest, int numBytes) - { - int numDone = 0; - - while (numBytes > 0) - { - const int available = jmin (numBytes, (int) [data length]); - - if (available > 0) - { - const ScopedLock sl (dataLock); - [data getBytes: dest length: (NSUInteger) available]; - [data replaceBytesInRange: NSMakeRange (0, (NSUInteger) available) withBytes: nil length: 0]; - - numDone += available; - numBytes -= available; - dest += available; - } - else - { - if (hasFailed || hasFinished) - break; - - Thread::sleep (1); - } - } - - return numDone; - } - - void didReceiveResponse (NSURLResponse* response) - { - { - const ScopedLock sl (dataLock); - [data setLength: 0]; - } - - initialised = true; - contentLength = [response expectedContentLength]; - - [headers release]; - headers = nil; - - if ([response isKindOfClass: [NSHTTPURLResponse class]]) - { - NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response; - headers = [[httpResponse allHeaderFields] retain]; - statusCode = (int) [httpResponse statusCode]; - } - } - - NSURLRequest* willSendRequest (NSURLRequest* newRequest, NSURLResponse* redirectResponse) - { - if (redirectResponse != nullptr) - { - if (numRedirects >= numRedirectsToFollow) - return nil; // Cancel redirect and allow connection to continue - - ++numRedirects; - } - - return newRequest; - } - - void didFailWithError (NSError* error) - { - DBG (nsStringToJuce ([error description])); (void) error; - hasFailed = true; - initialised = true; - signalThreadShouldExit(); - } - - void didReceiveData (NSData* newData) - { - const ScopedLock sl (dataLock); - [data appendData: newData]; - initialised = true; - } - - void didSendBodyData (NSInteger /*totalBytesWritten*/, NSInteger /*totalBytesExpected*/) - { - } - - void finishedLoading() - { - hasFinished = true; - initialised = true; - signalThreadShouldExit(); - } - - void run() override - { - connection = [[NSURLConnection alloc] initWithRequest: request - delegate: delegate]; - while (! threadShouldExit()) - { - JUCE_AUTORELEASEPOOL - { - [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.01]]; - } - } - } - - int64 contentLength; - CriticalSection dataLock; - NSObject* delegate; - NSURLRequest* request; - NSURLConnection* connection; - NSMutableData* data; - NSDictionary* headers; - int statusCode; - bool initialised, hasFailed, hasFinished; - const int numRedirectsToFollow; - int numRedirects; - -private: - //============================================================================== - struct DelegateClass : public ObjCClass - { - DelegateClass() : ObjCClass ("JUCEAppDelegate_") - { - addIvar ("state"); - - addMethod (@selector (connection:didReceiveResponse:), didReceiveResponse, "v@:@@"); - addMethod (@selector (connection:didFailWithError:), didFailWithError, "v@:@@"); - addMethod (@selector (connection:didReceiveData:), didReceiveData, "v@:@@"); - addMethod (@selector (connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:), - connectionDidSendBodyData, "v@:@iii"); - addMethod (@selector (connectionDidFinishLoading:), connectionDidFinishLoading, "v@:@"); - addMethod (@selector (connection:willSendRequest:redirectResponse:), willSendRequest, "@@:@@@"); - - registerClass(); - } - - static void setState (id self, URLConnectionState* state) { object_setInstanceVariable (self, "state", state); } - static URLConnectionState* getState (id self) { return getIvar (self, "state"); } - - private: - static void didReceiveResponse (id self, SEL, NSURLConnection*, NSURLResponse* response) - { - getState (self)->didReceiveResponse (response); - } - - static void didFailWithError (id self, SEL, NSURLConnection*, NSError* error) - { - getState (self)->didFailWithError (error); - } - - static void didReceiveData (id self, SEL, NSURLConnection*, NSData* newData) - { - getState (self)->didReceiveData (newData); - } - - static NSURLRequest* willSendRequest (id self, SEL, NSURLConnection*, NSURLRequest* request, NSURLResponse* response) - { - return getState (self)->willSendRequest (request, response); - } - - static void connectionDidSendBodyData (id self, SEL, NSURLConnection*, NSInteger, NSInteger totalBytesWritten, NSInteger totalBytesExpected) - { - getState (self)->didSendBodyData (totalBytesWritten, totalBytesExpected); - } - - static void connectionDidFinishLoading (id self, SEL, NSURLConnection*) - { - getState (self)->finishedLoading(); - } - }; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (URLConnectionState) -}; - - -//============================================================================== -class WebInputStream : public InputStream -{ -public: - WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, - URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers_, int timeOutMs_, StringPairArray* responseHeaders, - const int numRedirectsToFollow_) - : statusCode (0), address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_), numRedirectsToFollow (numRedirectsToFollow_) - { - JUCE_AUTORELEASEPOOL - { - createConnection (progressCallback, progressCallbackContext); - - if (connection != nullptr && connection->headers != nil) - { - statusCode = connection->statusCode; - - if (responseHeaders != nullptr) - { - NSEnumerator* enumerator = [connection->headers keyEnumerator]; - - while (NSString* key = [enumerator nextObject]) - responseHeaders->set (nsStringToJuce (key), - nsStringToJuce ((NSString*) [connection->headers objectForKey: key])); - } - } - } - } - - //============================================================================== - bool isError() const { return connection == nullptr; } - int64 getTotalLength() override { return connection == nullptr ? -1 : connection->contentLength; } - bool isExhausted() override { return finished; } - int64 getPosition() override { return position; } - - int read (void* buffer, int bytesToRead) override - { - jassert (buffer != nullptr && bytesToRead >= 0); - - if (finished || isError()) - return 0; - - JUCE_AUTORELEASEPOOL - { - const int bytesRead = connection->read (static_cast (buffer), bytesToRead); - position += bytesRead; - - if (bytesRead == 0) - finished = true; - - return bytesRead; - } - } - - bool setPosition (int64 wantedPos) override - { - if (wantedPos != position) - { - finished = false; - - if (wantedPos < position) - { - connection = nullptr; - position = 0; - createConnection (0, 0); - } - - skipNextBytes (wantedPos - position); - } - - return true; - } - - int statusCode; - -private: - ScopedPointer connection; - String address, headers; - MemoryBlock postData; - int64 position; - bool finished; - const bool isPost; - const int timeOutMs; - const int numRedirectsToFollow; - - void createConnection (URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext) - { - jassert (connection == nullptr); - - NSMutableURLRequest* req = [NSMutableURLRequest requestWithURL: [NSURL URLWithString: juceStringToNS (address)] - cachePolicy: NSURLRequestReloadIgnoringLocalCacheData - timeoutInterval: timeOutMs <= 0 ? 60.0 : (timeOutMs / 1000.0)]; - - if (req != nil) - { - [req setHTTPMethod: nsStringLiteral (isPost ? "POST" : "GET")]; - //[req setCachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData]; - - StringArray headerLines; - headerLines.addLines (headers); - headerLines.removeEmptyStrings (true); - - for (int i = 0; i < headerLines.size(); ++i) - { - const String key (headerLines[i].upToFirstOccurrenceOf (":", false, false).trim()); - const String value (headerLines[i].fromFirstOccurrenceOf (":", false, false).trim()); - - if (key.isNotEmpty() && value.isNotEmpty()) - [req addValue: juceStringToNS (value) forHTTPHeaderField: juceStringToNS (key)]; - } - - if (isPost && postData.getSize() > 0) - [req setHTTPBody: [NSData dataWithBytes: postData.getData() - length: postData.getSize()]]; - - connection = new URLConnectionState (req, numRedirectsToFollow); - - if (! connection->start (progressCallback, progressCallbackContext)) - connection = nullptr; - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream) -}; diff --git a/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm b/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm deleted file mode 100755 index 7a38b3d..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_mac_Strings.mm +++ /dev/null @@ -1,100 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -String String::fromCFString (CFStringRef cfString) -{ - if (cfString == 0) - return String(); - - CFRange range = { 0, CFStringGetLength (cfString) }; - CFIndex bytesNeeded = 0; - CFStringGetBytes (cfString, range, kCFStringEncodingUTF8, 0, false, nullptr, 0, &bytesNeeded); - - HeapBlock utf8 ((size_t) bytesNeeded + 1); - CFStringGetBytes (cfString, range, kCFStringEncodingUTF8, 0, false, utf8, bytesNeeded + 1, nullptr); - - return String (CharPointer_UTF8 ((const CharPointer_UTF8::CharType*) utf8.getData()), - CharPointer_UTF8 ((const CharPointer_UTF8::CharType*) utf8.getData() + bytesNeeded)); -} - -CFStringRef String::toCFString() const -{ - const char* const utf8 = toRawUTF8(); - return CFStringCreateWithBytes (kCFAllocatorDefault, (const UInt8*) utf8, - (CFIndex) strlen (utf8), kCFStringEncodingUTF8, false); -} - -String String::convertToPrecomposedUnicode() const -{ - #if JUCE_IOS - JUCE_AUTORELEASEPOOL - { - return nsStringToJuce ([juceStringToNS (*this) precomposedStringWithCanonicalMapping]); - } - #else - UnicodeMapping map; - - map.unicodeEncoding = CreateTextEncoding (kTextEncodingUnicodeDefault, - kUnicodeNoSubset, - kTextEncodingDefaultFormat); - - map.otherEncoding = CreateTextEncoding (kTextEncodingUnicodeDefault, - kUnicodeCanonicalCompVariant, - kTextEncodingDefaultFormat); - - map.mappingVersion = kUnicodeUseLatestMapping; - - UnicodeToTextInfo conversionInfo = 0; - String result; - - if (CreateUnicodeToTextInfo (&map, &conversionInfo) == noErr) - { - const size_t bytesNeeded = CharPointer_UTF16::getBytesRequiredFor (getCharPointer()); - - HeapBlock tempOut; - tempOut.calloc (bytesNeeded + 4); - - ByteCount bytesRead = 0; - ByteCount outputBufferSize = 0; - - if (ConvertFromUnicodeToText (conversionInfo, - bytesNeeded, (ConstUniCharArrayPtr) toUTF16().getAddress(), - kUnicodeDefaultDirectionMask, - 0, 0, 0, 0, - bytesNeeded, &bytesRead, - &outputBufferSize, tempOut) == noErr) - { - result = String (CharPointer_UTF16 ((CharPointer_UTF16::CharType*) tempOut.getData())); - } - - DisposeUnicodeToTextInfo (&conversionInfo); - } - - return result; - #endif -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm b/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm deleted file mode 100755 index 2d49ae6..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_mac_SystemStats.mm +++ /dev/null @@ -1,306 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -ScopedAutoReleasePool::ScopedAutoReleasePool() -{ - pool = [[NSAutoreleasePool alloc] init]; -} - -ScopedAutoReleasePool::~ScopedAutoReleasePool() -{ - [((NSAutoreleasePool*) pool) release]; -} - -//============================================================================== -void Logger::outputDebugString (const String& text) -{ - // Would prefer to use std::cerr here, but avoiding it for - // the moment, due to clang JIT linkage problems. - fputs (text.toRawUTF8(), stderr); - fputs ("\n", stderr); - fflush (stderr); -} - -//============================================================================== -namespace SystemStatsHelpers -{ - #if JUCE_INTEL && ! JUCE_NO_INLINE_ASM - static void doCPUID (uint32& a, uint32& b, uint32& c, uint32& d, uint32 type) - { - uint32 la = a, lb = b, lc = c, ld = d; - - asm ("mov %%ebx, %%esi \n\t" - "cpuid \n\t" - "xchg %%esi, %%ebx" - : "=a" (la), "=S" (lb), "=c" (lc), "=d" (ld) : "a" (type) - #if JUCE_64BIT - , "b" (lb), "c" (lc), "d" (ld) - #endif - ); - - a = la; b = lb; c = lc; d = ld; - } - #endif -} - -//============================================================================== -void CPUInformation::initialise() noexcept -{ - #if JUCE_INTEL && ! JUCE_NO_INLINE_ASM - uint32 a = 0, b = 0, d = 0, c = 0; - SystemStatsHelpers::doCPUID (a, b, c, d, 1); - - hasMMX = (d & (1u << 23)) != 0; - hasSSE = (d & (1u << 25)) != 0; - hasSSE2 = (d & (1u << 26)) != 0; - has3DNow = (b & (1u << 31)) != 0; - hasSSE3 = (c & (1u << 0)) != 0; - #endif - - #if JUCE_IOS || (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) - numCpus = (int) [[NSProcessInfo processInfo] activeProcessorCount]; - #else - numCpus = (int) MPProcessors(); - #endif -} - -#if JUCE_MAC -struct RLimitInitialiser -{ - RLimitInitialiser() - { - rlimit lim; - getrlimit (RLIMIT_NOFILE, &lim); - lim.rlim_cur = lim.rlim_max = RLIM_INFINITY; - setrlimit (RLIMIT_NOFILE, &lim); - } -}; - -static RLimitInitialiser rLimitInitialiser; -#endif - -//============================================================================== -#if ! JUCE_IOS -static String getOSXVersion() -{ - JUCE_AUTORELEASEPOOL - { - NSDictionary* dict = [NSDictionary dictionaryWithContentsOfFile: - nsStringLiteral ("/System/Library/CoreServices/SystemVersion.plist")]; - - return nsStringToJuce ([dict objectForKey: nsStringLiteral ("ProductVersion")]); - } -} -#endif - -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - #if JUCE_IOS - return iOS; - #else - StringArray parts; - parts.addTokens (getOSXVersion(), ".", StringRef()); - - jassert (parts[0].getIntValue() == 10); - const int major = parts[1].getIntValue(); - jassert (major > 2); - - return (OperatingSystemType) (major + MacOSX_10_4 - 4); - #endif -} - -String SystemStats::getOperatingSystemName() -{ - #if JUCE_IOS - return "iOS " + nsStringToJuce ([[UIDevice currentDevice] systemVersion]); - #else - return "Mac OSX " + getOSXVersion(); - #endif -} - -String SystemStats::getDeviceDescription() -{ - #if JUCE_IOS - return nsStringToJuce ([[UIDevice currentDevice] model]); - #else - return String(); - #endif -} - -bool SystemStats::isOperatingSystem64Bit() -{ - #if JUCE_IOS - return false; - #elif JUCE_64BIT - return true; - #else - return getOperatingSystemType() >= MacOSX_10_6; - #endif -} - -int SystemStats::getMemorySizeInMegabytes() -{ - uint64 mem = 0; - size_t memSize = sizeof (mem); - int mib[] = { CTL_HW, HW_MEMSIZE }; - sysctl (mib, 2, &mem, &memSize, 0, 0); - return (int) (mem / (1024 * 1024)); -} - -String SystemStats::getCpuVendor() -{ - #if JUCE_INTEL && ! JUCE_NO_INLINE_ASM - uint32 dummy = 0; - uint32 vendor[4] = { 0 }; - - SystemStatsHelpers::doCPUID (dummy, vendor[0], vendor[2], vendor[1], 0); - - return String (reinterpret_cast (vendor), 12); - #else - return String(); - #endif -} - -int SystemStats::getCpuSpeedInMegaherz() -{ - uint64 speedHz = 0; - size_t speedSize = sizeof (speedHz); - int mib[] = { CTL_HW, HW_CPU_FREQ }; - sysctl (mib, 2, &speedHz, &speedSize, 0, 0); - - #if JUCE_BIG_ENDIAN - if (speedSize == 4) - speedHz >>= 32; - #endif - - return (int) (speedHz / 1000000); -} - -//============================================================================== -String SystemStats::getLogonName() -{ - return nsStringToJuce (NSUserName()); -} - -String SystemStats::getFullUserName() -{ - return nsStringToJuce (NSFullUserName()); -} - -String SystemStats::getComputerName() -{ - char name [256] = { 0 }; - if (gethostname (name, sizeof (name) - 1) == 0) - return String (name).upToLastOccurrenceOf (".local", false, true); - - return String(); -} - -static String getLocaleValue (CFStringRef key) -{ - CFLocaleRef cfLocale = CFLocaleCopyCurrent(); - const String result (String::fromCFString ((CFStringRef) CFLocaleGetValue (cfLocale, key))); - CFRelease (cfLocale); - return result; -} - -String SystemStats::getUserLanguage() { return getLocaleValue (kCFLocaleLanguageCode); } -String SystemStats::getUserRegion() { return getLocaleValue (kCFLocaleCountryCode); } - -String SystemStats::getDisplayLanguage() -{ - CFArrayRef cfPrefLangs = CFLocaleCopyPreferredLanguages(); - const String result (String::fromCFString ((CFStringRef) CFArrayGetValueAtIndex (cfPrefLangs, 0))); - CFRelease (cfPrefLangs); - return result; -} - -//============================================================================== -/* NB: these are kept outside the HiResCounterInfo struct and initialised to 1 to avoid - division-by-zero errors if some other static constructor calls us before this file's - static constructors have had a chance to fill them in correctly.. -*/ -static uint64 hiResCounterNumerator = 0, hiResCounterDenominator = 1; - -class HiResCounterInfo -{ -public: - HiResCounterInfo() - { - mach_timebase_info_data_t timebase; - (void) mach_timebase_info (&timebase); - - if (timebase.numer % 1000000 == 0) - { - hiResCounterNumerator = timebase.numer / 1000000; - hiResCounterDenominator = timebase.denom; - } - else - { - hiResCounterNumerator = timebase.numer; - hiResCounterDenominator = timebase.denom * (uint64) 1000000; - } - - highResTimerFrequency = (timebase.denom * (uint64) 1000000000) / timebase.numer; - highResTimerToMillisecRatio = hiResCounterNumerator / (double) hiResCounterDenominator; - } - - uint32 millisecondsSinceStartup() const noexcept - { - return (uint32) ((mach_absolute_time() * hiResCounterNumerator) / hiResCounterDenominator); - } - - double getMillisecondCounterHiRes() const noexcept - { - return mach_absolute_time() * highResTimerToMillisecRatio; - } - - int64 highResTimerFrequency; - -private: - double highResTimerToMillisecRatio; -}; - -static HiResCounterInfo hiResCounterInfo; - -uint32 juce_millisecondsSinceStartup() noexcept { return hiResCounterInfo.millisecondsSinceStartup(); } -double Time::getMillisecondCounterHiRes() noexcept { return hiResCounterInfo.getMillisecondCounterHiRes(); } -int64 Time::getHighResolutionTicksPerSecond() noexcept { return hiResCounterInfo.highResTimerFrequency; } -int64 Time::getHighResolutionTicks() noexcept { return (int64) mach_absolute_time(); } - -bool Time::setSystemTimeToThisTime() const -{ - jassertfalse; - return false; -} - -//============================================================================== -int SystemStats::getPageSize() -{ - return (int) NSPageSize(); -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm b/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm deleted file mode 100755 index 004baeb..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_mac_Threads.mm +++ /dev/null @@ -1,97 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -/* - Note that a lot of methods that you'd expect to find in this file actually - live in juce_posix_SharedCode.h! -*/ - -#if JUCE_IOS -bool isIOSAppActive = true; -#endif - -//============================================================================== -JUCE_API bool JUCE_CALLTYPE Process::isForegroundProcess() -{ - #if JUCE_MAC - return [NSApp isActive]; - #else - return isIOSAppActive; - #endif -} - -JUCE_API void JUCE_CALLTYPE Process::makeForegroundProcess() -{ - #if JUCE_MAC - [NSApp activateIgnoringOtherApps: YES]; - #endif -} - -JUCE_API void JUCE_CALLTYPE Process::hide() -{ - #if JUCE_MAC - [NSApp hide: nil]; - #endif -} - -JUCE_API void JUCE_CALLTYPE Process::raisePrivilege() -{ - jassertfalse; -} - -JUCE_API void JUCE_CALLTYPE Process::lowerPrivilege() -{ - jassertfalse; -} - -JUCE_API void JUCE_CALLTYPE Process::setPriority (ProcessPriority) -{ - // xxx -} - -//============================================================================== -JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() -{ - static char testResult = 0; - - if (testResult == 0) - { - struct kinfo_proc info; - int m[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid() }; - size_t sz = sizeof (info); - sysctl (m, 4, &info, &sz, 0, 0); - testResult = ((info.kp_proc.p_flag & P_TRACED) != 0) ? 1 : -1; - } - - return testResult > 0; -} - -JUCE_API bool JUCE_CALLTYPE Process::isRunningUnderDebugger() -{ - return juce_isRunningUnderDebugger(); -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h b/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h deleted file mode 100755 index 10878d0..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_osx_ObjCHelpers.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_OSX_OBJCHELPERS_H_INCLUDED -#define JUCE_OSX_OBJCHELPERS_H_INCLUDED - - -/* This file contains a few helper functions that are used internally but which - need to be kept away from the public headers because they use obj-C symbols. -*/ -namespace -{ - //============================================================================== - static inline String nsStringToJuce (NSString* s) - { - return CharPointer_UTF8 ([s UTF8String]); - } - - static inline NSString* juceStringToNS (const String& s) - { - return [NSString stringWithUTF8String: s.toUTF8()]; - } - - static inline NSString* nsStringLiteral (const char* const s) noexcept - { - return [NSString stringWithUTF8String: s]; - } - - static inline NSString* nsEmptyString() noexcept - { - return [NSString string]; - } - - #if JUCE_MAC - template - static NSRect makeNSRect (const RectangleType& r) noexcept - { - return NSMakeRect (static_cast (r.getX()), - static_cast (r.getY()), - static_cast (r.getWidth()), - static_cast (r.getHeight())); - } - #endif -} - -//============================================================================== -template -struct NSObjectRetainer -{ - inline NSObjectRetainer (ObjectType* o) : object (o) { [object retain]; } - inline ~NSObjectRetainer() { [object release]; } - - ObjectType* object; -}; - -//============================================================================== -template -struct ObjCClass -{ - ObjCClass (const char* nameRoot) - : cls (objc_allocateClassPair ([SuperclassType class], getRandomisedName (nameRoot).toUTF8(), 0)) - { - } - - ~ObjCClass() - { - objc_disposeClassPair (cls); - } - - void registerClass() - { - objc_registerClassPair (cls); - } - - SuperclassType* createInstance() const - { - return class_createInstance (cls, 0); - } - - template - void addIvar (const char* name) - { - BOOL b = class_addIvar (cls, name, sizeof (Type), (uint8_t) rint (log2 (sizeof (Type))), @encode (Type)); - jassert (b); (void) b; - } - - template - void addMethod (SEL selector, FunctionType callbackFn, const char* signature) - { - BOOL b = class_addMethod (cls, selector, (IMP) callbackFn, signature); - jassert (b); (void) b; - } - - template - void addMethod (SEL selector, FunctionType callbackFn, const char* sig1, const char* sig2) - { - addMethod (selector, callbackFn, (String (sig1) + sig2).toUTF8()); - } - - template - void addMethod (SEL selector, FunctionType callbackFn, const char* sig1, const char* sig2, const char* sig3) - { - addMethod (selector, callbackFn, (String (sig1) + sig2 + sig3).toUTF8()); - } - - template - void addMethod (SEL selector, FunctionType callbackFn, const char* sig1, const char* sig2, const char* sig3, const char* sig4) - { - addMethod (selector, callbackFn, (String (sig1) + sig2 + sig3 + sig4).toUTF8()); - } - - void addProtocol (Protocol* protocol) - { - BOOL b = class_addProtocol (cls, protocol); - jassert (b); (void) b; - } - - static id sendSuperclassMessage (id self, SEL selector) - { - objc_super s = { self, [SuperclassType class] }; - return objc_msgSendSuper (&s, selector); - } - - template - static Type getIvar (id self, const char* name) - { - void* v = nullptr; - object_getInstanceVariable (self, name, &v); - return static_cast (v); - } - - Class cls; - -private: - static String getRandomisedName (const char* root) - { - return root + String::toHexString (juce::Random::getSystemRandom().nextInt64()); - } - - JUCE_DECLARE_NON_COPYABLE (ObjCClass) -}; - - -#endif // JUCE_OSX_OBJCHELPERS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp b/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp deleted file mode 100755 index d0c0b09..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_posix_NamedPipe.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -class NamedPipe::Pimpl -{ -public: - Pimpl (const String& pipePath, bool createPipe) - : pipeInName (pipePath + "_in"), - pipeOutName (pipePath + "_out"), - pipeIn (-1), pipeOut (-1), - createdPipe (createPipe), - stopReadOperation (false) - { - signal (SIGPIPE, signalHandler); - juce_siginterrupt (SIGPIPE, 1); - } - - ~Pimpl() - { - if (pipeIn != -1) ::close (pipeIn); - if (pipeOut != -1) ::close (pipeOut); - - if (createdPipe) - { - unlink (pipeInName.toUTF8()); - unlink (pipeOutName.toUTF8()); - } - } - - int read (char* destBuffer, int maxBytesToRead, int timeOutMilliseconds) - { - const uint32 timeoutEnd = getTimeoutEnd (timeOutMilliseconds); - - if (pipeIn == -1) - { - pipeIn = openPipe (createdPipe ? pipeInName : pipeOutName, O_RDWR | O_NONBLOCK, timeoutEnd); - - if (pipeIn == -1) - return -1; - } - - int bytesRead = 0; - - while (bytesRead < maxBytesToRead) - { - const int bytesThisTime = maxBytesToRead - bytesRead; - const int numRead = (int) ::read (pipeIn, destBuffer, (size_t) bytesThisTime); - - if (numRead <= 0) - { - if (errno != EWOULDBLOCK || stopReadOperation || hasExpired (timeoutEnd)) - return -1; - - const int maxWaitingTime = 30; - waitForInput (pipeIn, timeoutEnd == 0 ? maxWaitingTime - : jmin (maxWaitingTime, - (int) (timeoutEnd - Time::getMillisecondCounter()))); - continue; - } - - bytesRead += numRead; - destBuffer += numRead; - } - - return bytesRead; - } - - int write (const char* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) - { - const uint32 timeoutEnd = getTimeoutEnd (timeOutMilliseconds); - - if (pipeOut == -1) - { - pipeOut = openPipe (createdPipe ? pipeOutName : pipeInName, O_WRONLY, timeoutEnd); - - if (pipeOut == -1) - return -1; - } - - int bytesWritten = 0; - - while (bytesWritten < numBytesToWrite && ! hasExpired (timeoutEnd)) - { - const int bytesThisTime = numBytesToWrite - bytesWritten; - const int numWritten = (int) ::write (pipeOut, sourceBuffer, (size_t) bytesThisTime); - - if (numWritten <= 0) - return -1; - - bytesWritten += numWritten; - sourceBuffer += numWritten; - } - - return bytesWritten; - } - - bool createFifos() const - { - return (mkfifo (pipeInName .toUTF8(), 0666) == 0 || errno == EEXIST) - && (mkfifo (pipeOutName.toUTF8(), 0666) == 0 || errno == EEXIST); - } - - const String pipeInName, pipeOutName; - int pipeIn, pipeOut; - - const bool createdPipe; - bool stopReadOperation; - -private: - static void signalHandler (int) {} - - static uint32 getTimeoutEnd (const int timeOutMilliseconds) - { - return timeOutMilliseconds >= 0 ? Time::getMillisecondCounter() + (uint32) timeOutMilliseconds : 0; - } - - static bool hasExpired (const uint32 timeoutEnd) - { - return timeoutEnd != 0 && Time::getMillisecondCounter() >= timeoutEnd; - } - - int openPipe (const String& name, int flags, const uint32 timeoutEnd) - { - for (;;) - { - const int p = ::open (name.toUTF8(), flags); - - if (p != -1 || hasExpired (timeoutEnd) || stopReadOperation) - return p; - - Thread::sleep (2); - } - } - - static void waitForInput (const int handle, const int timeoutMsecs) noexcept - { - struct timeval timeout; - timeout.tv_sec = timeoutMsecs / 1000; - timeout.tv_usec = (timeoutMsecs % 1000) * 1000; - - fd_set rset; - FD_ZERO (&rset); - FD_SET (handle, &rset); - - select (handle + 1, &rset, nullptr, 0, &timeout); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl) -}; - -void NamedPipe::close() -{ - if (pimpl != nullptr) - { - pimpl->stopReadOperation = true; - - char buffer[1] = { 0 }; - ssize_t done = ::write (pimpl->pipeIn, buffer, 1); - (void) done; - - ScopedWriteLock sl (lock); - pimpl = nullptr; - } -} - -bool NamedPipe::openInternal (const String& pipeName, const bool createPipe) -{ - #if JUCE_IOS - pimpl = new Pimpl (File::getSpecialLocation (File::tempDirectory) - .getChildFile (File::createLegalFileName (pipeName)).getFullPathName(), createPipe); - #else - String file (pipeName); - - if (! File::isAbsolutePath (file)) - file = "/tmp/" + File::createLegalFileName (file); - - pimpl = new Pimpl (file, createPipe); - #endif - - if (createPipe && ! pimpl->createFifos()) - { - pimpl = nullptr; - return false; - } - - return true; -} - -int NamedPipe::read (void* destBuffer, int maxBytesToRead, int timeOutMilliseconds) -{ - ScopedReadLock sl (lock); - return pimpl != nullptr ? pimpl->read (static_cast (destBuffer), maxBytesToRead, timeOutMilliseconds) : -1; -} - -int NamedPipe::write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) -{ - ScopedReadLock sl (lock); - return pimpl != nullptr ? pimpl->write (static_cast (sourceBuffer), numBytesToWrite, timeOutMilliseconds) : -1; -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h b/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h deleted file mode 100755 index c94d3a6..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_posix_SharedCode.h +++ /dev/null @@ -1,1319 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -CriticalSection::CriticalSection() noexcept -{ - pthread_mutexattr_t atts; - pthread_mutexattr_init (&atts); - pthread_mutexattr_settype (&atts, PTHREAD_MUTEX_RECURSIVE); - #if ! JUCE_ANDROID - pthread_mutexattr_setprotocol (&atts, PTHREAD_PRIO_INHERIT); - #endif - pthread_mutex_init (&lock, &atts); - pthread_mutexattr_destroy (&atts); -} - -CriticalSection::~CriticalSection() noexcept { pthread_mutex_destroy (&lock); } -void CriticalSection::enter() const noexcept { pthread_mutex_lock (&lock); } -bool CriticalSection::tryEnter() const noexcept { return pthread_mutex_trylock (&lock) == 0; } -void CriticalSection::exit() const noexcept { pthread_mutex_unlock (&lock); } - -//============================================================================== -WaitableEvent::WaitableEvent (const bool useManualReset) noexcept - : triggered (false), manualReset (useManualReset) -{ - pthread_cond_init (&condition, 0); - - pthread_mutexattr_t atts; - pthread_mutexattr_init (&atts); - #if ! JUCE_ANDROID - pthread_mutexattr_setprotocol (&atts, PTHREAD_PRIO_INHERIT); - #endif - pthread_mutex_init (&mutex, &atts); -} - -WaitableEvent::~WaitableEvent() noexcept -{ - pthread_cond_destroy (&condition); - pthread_mutex_destroy (&mutex); -} - -bool WaitableEvent::wait (const int timeOutMillisecs) const noexcept -{ - pthread_mutex_lock (&mutex); - - if (! triggered) - { - if (timeOutMillisecs < 0) - { - do - { - pthread_cond_wait (&condition, &mutex); - } - while (! triggered); - } - else - { - struct timeval now; - gettimeofday (&now, 0); - - struct timespec time; - time.tv_sec = now.tv_sec + (timeOutMillisecs / 1000); - time.tv_nsec = (now.tv_usec + ((timeOutMillisecs % 1000) * 1000)) * 1000; - - if (time.tv_nsec >= 1000000000) - { - time.tv_nsec -= 1000000000; - time.tv_sec++; - } - - do - { - if (pthread_cond_timedwait (&condition, &mutex, &time) == ETIMEDOUT) - { - pthread_mutex_unlock (&mutex); - return false; - } - } - while (! triggered); - } - } - - if (! manualReset) - triggered = false; - - pthread_mutex_unlock (&mutex); - return true; -} - -void WaitableEvent::signal() const noexcept -{ - pthread_mutex_lock (&mutex); - - if (! triggered) - { - triggered = true; - pthread_cond_broadcast (&condition); - } - - pthread_mutex_unlock (&mutex); -} - -void WaitableEvent::reset() const noexcept -{ - pthread_mutex_lock (&mutex); - triggered = false; - pthread_mutex_unlock (&mutex); -} - -//============================================================================== -void JUCE_CALLTYPE Thread::sleep (int millisecs) -{ - struct timespec time; - time.tv_sec = millisecs / 1000; - time.tv_nsec = (millisecs % 1000) * 1000000; - nanosleep (&time, nullptr); -} - -void JUCE_CALLTYPE Process::terminate() -{ - #if JUCE_ANDROID - _exit (EXIT_FAILURE); - #else - std::_Exit (EXIT_FAILURE); - #endif -} - -//============================================================================== -const juce_wchar File::separator = '/'; -const String File::separatorString ("/"); - -//============================================================================== -File File::getCurrentWorkingDirectory() -{ - HeapBlock heapBuffer; - - char localBuffer [1024]; - char* cwd = getcwd (localBuffer, sizeof (localBuffer) - 1); - size_t bufferSize = 4096; - - while (cwd == nullptr && errno == ERANGE) - { - heapBuffer.malloc (bufferSize); - cwd = getcwd (heapBuffer, bufferSize - 1); - bufferSize += 1024; - } - - return File (CharPointer_UTF8 (cwd)); -} - -bool File::setAsCurrentWorkingDirectory() const -{ - return chdir (getFullPathName().toUTF8()) == 0; -} - -//============================================================================== -// The unix siginterrupt function is deprecated - this does the same job. -int juce_siginterrupt (int sig, int flag) -{ - struct ::sigaction act; - (void) ::sigaction (sig, nullptr, &act); - - if (flag != 0) - act.sa_flags &= ~SA_RESTART; - else - act.sa_flags |= SA_RESTART; - - return ::sigaction (sig, &act, nullptr); -} - -//============================================================================== -namespace -{ - #if JUCE_LINUX || (JUCE_IOS && ! __DARWIN_ONLY_64_BIT_INO_T) // (this iOS stuff is to avoid a simulator bug) - typedef struct stat64 juce_statStruct; - #define JUCE_STAT stat64 - #else - typedef struct stat juce_statStruct; - #define JUCE_STAT stat - #endif - - bool juce_stat (const String& fileName, juce_statStruct& info) - { - return fileName.isNotEmpty() - && JUCE_STAT (fileName.toUTF8(), &info) == 0; - } - - // if this file doesn't exist, find a parent of it that does.. - bool juce_doStatFS (File f, struct statfs& result) - { - for (int i = 5; --i >= 0;) - { - if (f.exists()) - break; - - f = f.getParentDirectory(); - } - - return statfs (f.getFullPathName().toUTF8(), &result) == 0; - } - - #if (JUCE_MAC && MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5) || JUCE_IOS - static int64 getCreationTime (const juce_statStruct& s) noexcept { return (int64) s.st_birthtime; } - #else - static int64 getCreationTime (const juce_statStruct& s) noexcept { return (int64) s.st_ctime; } - #endif - - void updateStatInfoForFile (const String& path, bool* const isDir, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) - { - if (isDir != nullptr || fileSize != nullptr || modTime != nullptr || creationTime != nullptr) - { - juce_statStruct info; - const bool statOk = juce_stat (path, info); - - if (isDir != nullptr) *isDir = statOk && ((info.st_mode & S_IFDIR) != 0); - if (fileSize != nullptr) *fileSize = statOk ? (int64) info.st_size : 0; - if (modTime != nullptr) *modTime = Time (statOk ? (int64) info.st_mtime * 1000 : 0); - if (creationTime != nullptr) *creationTime = Time (statOk ? getCreationTime (info) * 1000 : 0); - } - - if (isReadOnly != nullptr) - *isReadOnly = access (path.toUTF8(), W_OK) != 0; - } - - Result getResultForErrno() - { - return Result::fail (String (strerror (errno))); - } - - Result getResultForReturnValue (int value) - { - return value == -1 ? getResultForErrno() : Result::ok(); - } - - int getFD (void* handle) noexcept { return (int) (pointer_sized_int) handle; } - void* fdToVoidPointer (int fd) noexcept { return (void*) (pointer_sized_int) fd; } -} - -bool File::isDirectory() const -{ - juce_statStruct info; - - return fullPath.isEmpty() - || (juce_stat (fullPath, info) && ((info.st_mode & S_IFDIR) != 0)); -} - -bool File::exists() const -{ - return fullPath.isNotEmpty() - && access (fullPath.toUTF8(), F_OK) == 0; -} - -bool File::existsAsFile() const -{ - return exists() && ! isDirectory(); -} - -int64 File::getSize() const -{ - juce_statStruct info; - return juce_stat (fullPath, info) ? info.st_size : 0; -} - -uint64 File::getFileIdentifier() const -{ - juce_statStruct info; - return juce_stat (fullPath, info) ? (uint64) info.st_ino : 0; -} - -//============================================================================== -bool File::hasWriteAccess() const -{ - if (exists()) - return access (fullPath.toUTF8(), W_OK) == 0; - - if ((! isDirectory()) && fullPath.containsChar (separator)) - return getParentDirectory().hasWriteAccess(); - - return false; -} - -static bool setFileModeFlags (const String& fullPath, mode_t flags, bool shouldSet) noexcept -{ - juce_statStruct info; - if (! juce_stat (fullPath, info)) - return false; - - info.st_mode &= 0777; - - if (shouldSet) - info.st_mode |= flags; - else - info.st_mode &= ~flags; - - return chmod (fullPath.toUTF8(), info.st_mode) == 0; -} - -bool File::setFileReadOnlyInternal (bool shouldBeReadOnly) const -{ - // Hmm.. should we give global write permission or just the current user? - return setFileModeFlags (fullPath, S_IWUSR | S_IWGRP | S_IWOTH, ! shouldBeReadOnly); -} - -bool File::setFileExecutableInternal (bool shouldBeExecutable) const -{ - return setFileModeFlags (fullPath, S_IXUSR | S_IXGRP | S_IXOTH, shouldBeExecutable); -} - -void File::getFileTimesInternal (int64& modificationTime, int64& accessTime, int64& creationTime) const -{ - modificationTime = 0; - accessTime = 0; - creationTime = 0; - - juce_statStruct info; - - if (juce_stat (fullPath, info)) - { - modificationTime = (int64) info.st_mtime * 1000; - accessTime = (int64) info.st_atime * 1000; - creationTime = (int64) info.st_ctime * 1000; - } -} - -bool File::setFileTimesInternal (int64 modificationTime, int64 accessTime, int64 /*creationTime*/) const -{ - juce_statStruct info; - - if ((modificationTime != 0 || accessTime != 0) && juce_stat (fullPath, info)) - { - struct utimbuf times; - times.actime = accessTime != 0 ? (time_t) (accessTime / 1000) : info.st_atime; - times.modtime = modificationTime != 0 ? (time_t) (modificationTime / 1000) : info.st_mtime; - - return utime (fullPath.toUTF8(), ×) == 0; - } - - return false; -} - -bool File::deleteFile() const -{ - if (! exists()) - return true; - - if (isDirectory()) - return rmdir (fullPath.toUTF8()) == 0; - - return remove (fullPath.toUTF8()) == 0; -} - -bool File::moveInternal (const File& dest) const -{ - if (rename (fullPath.toUTF8(), dest.getFullPathName().toUTF8()) == 0) - return true; - - if (hasWriteAccess() && copyInternal (dest)) - { - if (deleteFile()) - return true; - - dest.deleteFile(); - } - - return false; -} - -Result File::createDirectoryInternal (const String& fileName) const -{ - return getResultForReturnValue (mkdir (fileName.toUTF8(), 0777)); -} - -//===================================================================== -int64 juce_fileSetPosition (void* handle, int64 pos) -{ - if (handle != 0 && lseek (getFD (handle), pos, SEEK_SET) == pos) - return pos; - - return -1; -} - -void FileInputStream::openHandle() -{ - const int f = open (file.getFullPathName().toUTF8(), O_RDONLY, 00644); - - if (f != -1) - fileHandle = fdToVoidPointer (f); - else - status = getResultForErrno(); -} - -FileInputStream::~FileInputStream() -{ - if (fileHandle != 0) - close (getFD (fileHandle)); -} - -size_t FileInputStream::readInternal (void* const buffer, const size_t numBytes) -{ - ssize_t result = 0; - - if (fileHandle != 0) - { - result = ::read (getFD (fileHandle), buffer, numBytes); - - if (result < 0) - { - status = getResultForErrno(); - result = 0; - } - } - - return (size_t) result; -} - -//============================================================================== -void FileOutputStream::openHandle() -{ - if (file.exists()) - { - const int f = open (file.getFullPathName().toUTF8(), O_RDWR, 00644); - - if (f != -1) - { - currentPosition = lseek (f, 0, SEEK_END); - - if (currentPosition >= 0) - { - fileHandle = fdToVoidPointer (f); - } - else - { - status = getResultForErrno(); - close (f); - } - } - else - { - status = getResultForErrno(); - } - } - else - { - const int f = open (file.getFullPathName().toUTF8(), O_RDWR + O_CREAT, 00644); - - if (f != -1) - fileHandle = fdToVoidPointer (f); - else - status = getResultForErrno(); - } -} - -void FileOutputStream::closeHandle() -{ - if (fileHandle != 0) - { - close (getFD (fileHandle)); - fileHandle = 0; - } -} - -ssize_t FileOutputStream::writeInternal (const void* const data, const size_t numBytes) -{ - ssize_t result = 0; - - if (fileHandle != 0) - { - result = ::write (getFD (fileHandle), data, numBytes); - - if (result == -1) - status = getResultForErrno(); - } - - return result; -} - -void FileOutputStream::flushInternal() -{ - if (fileHandle != 0) - { - if (fsync (getFD (fileHandle)) == -1) - status = getResultForErrno(); - - #if JUCE_ANDROID - // This stuff tells the OS to asynchronously update the metadata - // that the OS has cached aboud the file - this metadata is used - // when the device is acting as a USB drive, and unless it's explicitly - // refreshed, it'll get out of step with the real file. - const LocalRef t (javaString (file.getFullPathName())); - android.activity.callVoidMethod (JuceAppActivity.scanFile, t.get()); - #endif - } -} - -Result FileOutputStream::truncate() -{ - if (fileHandle == 0) - return status; - - flush(); - return getResultForReturnValue (ftruncate (getFD (fileHandle), (off_t) currentPosition)); -} - -//============================================================================== -String SystemStats::getEnvironmentVariable (const String& name, const String& defaultValue) -{ - if (const char* s = ::getenv (name.toUTF8())) - return String::fromUTF8 (s); - - return defaultValue; -} - -//============================================================================== -void MemoryMappedFile::openInternal (const File& file, AccessMode mode) -{ - jassert (mode == readOnly || mode == readWrite); - - if (range.getStart() > 0) - { - const long pageSize = sysconf (_SC_PAGE_SIZE); - range.setStart (range.getStart() - (range.getStart() % pageSize)); - } - - fileHandle = open (file.getFullPathName().toUTF8(), - mode == readWrite ? (O_CREAT + O_RDWR) : O_RDONLY, 00644); - - if (fileHandle != -1) - { - void* m = mmap (0, (size_t) range.getLength(), - mode == readWrite ? (PROT_READ | PROT_WRITE) : PROT_READ, - MAP_SHARED, fileHandle, - (off_t) range.getStart()); - - if (m != MAP_FAILED) - { - address = m; - madvise (m, (size_t) range.getLength(), MADV_SEQUENTIAL); - } - else - { - range = Range(); - } - } -} - -MemoryMappedFile::~MemoryMappedFile() -{ - if (address != nullptr) - munmap (address, (size_t) range.getLength()); - - if (fileHandle != 0) - close (fileHandle); -} - -//============================================================================== -#if JUCE_PROJUCER_LIVE_BUILD -extern "C" const char* juce_getCurrentExecutablePath(); -#endif - -File juce_getExecutableFile(); -File juce_getExecutableFile() -{ - #if JUCE_PROJUCER_LIVE_BUILD - return File (juce_getCurrentExecutablePath()); - #elif JUCE_ANDROID - return File (android.appFile); - #else - struct DLAddrReader - { - static String getFilename() - { - Dl_info exeInfo; - dladdr ((void*) juce_getExecutableFile, &exeInfo); - return CharPointer_UTF8 (exeInfo.dli_fname); - } - }; - - static String filename (DLAddrReader::getFilename()); - return File::getCurrentWorkingDirectory().getChildFile (filename); - #endif -} - -//============================================================================== -int64 File::getBytesFreeOnVolume() const -{ - struct statfs buf; - if (juce_doStatFS (*this, buf)) - return (int64) buf.f_bsize * (int64) buf.f_bavail; // Note: this returns space available to non-super user - - return 0; -} - -int64 File::getVolumeTotalSize() const -{ - struct statfs buf; - if (juce_doStatFS (*this, buf)) - return (int64) buf.f_bsize * (int64) buf.f_blocks; - - return 0; -} - -String File::getVolumeLabel() const -{ - #if JUCE_MAC - struct VolAttrBuf - { - u_int32_t length; - attrreference_t mountPointRef; - char mountPointSpace [MAXPATHLEN]; - } attrBuf; - - struct attrlist attrList; - zerostruct (attrList); // (can't use "= { 0 }" on this object because it's typedef'ed as a C struct) - attrList.bitmapcount = ATTR_BIT_MAP_COUNT; - attrList.volattr = ATTR_VOL_INFO | ATTR_VOL_NAME; - - File f (*this); - - for (;;) - { - if (getattrlist (f.getFullPathName().toUTF8(), &attrList, &attrBuf, sizeof (attrBuf), 0) == 0) - return String::fromUTF8 (((const char*) &attrBuf.mountPointRef) + attrBuf.mountPointRef.attr_dataoffset, - (int) attrBuf.mountPointRef.attr_length); - - const File parent (f.getParentDirectory()); - - if (f == parent) - break; - - f = parent; - } - #endif - - return String(); -} - -int File::getVolumeSerialNumber() const -{ - int result = 0; -/* int fd = open (getFullPathName().toUTF8(), O_RDONLY | O_NONBLOCK); - - char info [512]; - - #ifndef HDIO_GET_IDENTITY - #define HDIO_GET_IDENTITY 0x030d - #endif - - if (ioctl (fd, HDIO_GET_IDENTITY, info) == 0) - { - DBG (String (info + 20, 20)); - result = String (info + 20, 20).trim().getIntValue(); - } - - close (fd);*/ - return result; -} - -//============================================================================== -#if ! JUCE_IOS -void juce_runSystemCommand (const String&); -void juce_runSystemCommand (const String& command) -{ - int result = system (command.toUTF8()); - (void) result; -} - -String juce_getOutputFromCommand (const String&); -String juce_getOutputFromCommand (const String& command) -{ - // slight bodge here, as we just pipe the output into a temp file and read it... - const File tempFile (File::getSpecialLocation (File::tempDirectory) - .getNonexistentChildFile (String::toHexString (Random::getSystemRandom().nextInt()), ".tmp", false)); - - juce_runSystemCommand (command + " > " + tempFile.getFullPathName()); - - String result (tempFile.loadFileAsString()); - tempFile.deleteFile(); - return result; -} -#endif - -//============================================================================== -#if JUCE_IOS -class InterProcessLock::Pimpl -{ -public: - Pimpl (const String&, int) - : handle (1), refCount (1) // On iOS just fake success.. - { - } - - int handle, refCount; -}; - -#else - -class InterProcessLock::Pimpl -{ -public: - Pimpl (const String& lockName, const int timeOutMillisecs) - : handle (0), refCount (1) - { - #if JUCE_MAC - if (! createLockFile (File ("~/Library/Caches/com.juce.locks").getChildFile (lockName), timeOutMillisecs)) - // Fallback if the user's home folder is on a network drive with no ability to lock.. - createLockFile (File ("/tmp/com.juce.locks").getChildFile (lockName), timeOutMillisecs); - - #else - File tempFolder ("/var/tmp"); - if (! tempFolder.isDirectory()) - tempFolder = "/tmp"; - - createLockFile (tempFolder.getChildFile (lockName), timeOutMillisecs); - #endif - } - - ~Pimpl() - { - closeFile(); - } - - bool createLockFile (const File& file, const int timeOutMillisecs) - { - file.create(); - handle = open (file.getFullPathName().toUTF8(), O_RDWR); - - if (handle != 0) - { - struct flock fl; - zerostruct (fl); - - fl.l_whence = SEEK_SET; - fl.l_type = F_WRLCK; - - const int64 endTime = Time::currentTimeMillis() + timeOutMillisecs; - - for (;;) - { - const int result = fcntl (handle, F_SETLK, &fl); - - if (result >= 0) - return true; - - const int error = errno; - - if (error != EINTR) - { - if (error == EBADF || error == ENOTSUP) - return false; - - if (timeOutMillisecs == 0 - || (timeOutMillisecs > 0 && Time::currentTimeMillis() >= endTime)) - break; - - Thread::sleep (10); - } - } - } - - closeFile(); - return true; // only false if there's a file system error. Failure to lock still returns true. - } - - void closeFile() - { - if (handle != 0) - { - struct flock fl; - zerostruct (fl); - - fl.l_whence = SEEK_SET; - fl.l_type = F_UNLCK; - - while (! (fcntl (handle, F_SETLKW, &fl) >= 0 || errno != EINTR)) - {} - - close (handle); - handle = 0; - } - } - - int handle, refCount; -}; -#endif - -InterProcessLock::InterProcessLock (const String& nm) : name (nm) -{ -} - -InterProcessLock::~InterProcessLock() -{ -} - -bool InterProcessLock::enter (const int timeOutMillisecs) -{ - const ScopedLock sl (lock); - - if (pimpl == nullptr) - { - pimpl = new Pimpl (name, timeOutMillisecs); - - if (pimpl->handle == 0) - pimpl = nullptr; - } - else - { - pimpl->refCount++; - } - - return pimpl != nullptr; -} - -void InterProcessLock::exit() -{ - const ScopedLock sl (lock); - - // Trying to release the lock too many times! - jassert (pimpl != nullptr); - - if (pimpl != nullptr && --(pimpl->refCount) == 0) - pimpl = nullptr; -} - -//============================================================================== -void JUCE_API juce_threadEntryPoint (void*); - -extern "C" void* threadEntryProc (void*); -extern "C" void* threadEntryProc (void* userData) -{ - JUCE_AUTORELEASEPOOL - { - #if JUCE_ANDROID - const AndroidThreadScope androidEnv; - #endif - - juce_threadEntryPoint (userData); - } - - return nullptr; -} - -void Thread::launchThread() -{ - threadHandle = 0; - pthread_t handle = 0; - - if (pthread_create (&handle, 0, threadEntryProc, this) == 0) - { - pthread_detach (handle); - threadHandle = (void*) handle; - threadId = (ThreadID) threadHandle; - } -} - -void Thread::closeThreadHandle() -{ - threadId = 0; - threadHandle = 0; -} - -void Thread::killThread() -{ - if (threadHandle != 0) - { - #if JUCE_ANDROID - jassertfalse; // pthread_cancel not available! - #else - pthread_cancel ((pthread_t) threadHandle); - #endif - } -} - -void JUCE_CALLTYPE Thread::setCurrentThreadName (const String& name) -{ - #if JUCE_IOS || (JUCE_MAC && defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) - JUCE_AUTORELEASEPOOL - { - [[NSThread currentThread] setName: juceStringToNS (name)]; - } - #elif JUCE_LINUX - #if (__GLIBC__ * 1000 + __GLIBC_MINOR__) >= 2012 - pthread_setname_np (pthread_self(), name.toRawUTF8()); - #else - prctl (PR_SET_NAME, name.toRawUTF8(), 0, 0, 0); - #endif - #endif -} - -bool Thread::setThreadPriority (void* handle, int priority) -{ - struct sched_param param; - int policy; - priority = jlimit (0, 10, priority); - - if (handle == nullptr) - handle = (void*) pthread_self(); - - if (pthread_getschedparam ((pthread_t) handle, &policy, ¶m) != 0) - return false; - - policy = priority == 0 ? SCHED_OTHER : SCHED_RR; - - const int minPriority = sched_get_priority_min (policy); - const int maxPriority = sched_get_priority_max (policy); - - param.sched_priority = ((maxPriority - minPriority) * priority) / 10 + minPriority; - return pthread_setschedparam ((pthread_t) handle, policy, ¶m) == 0; -} - -Thread::ThreadID JUCE_CALLTYPE Thread::getCurrentThreadId() -{ - return (ThreadID) pthread_self(); -} - -void JUCE_CALLTYPE Thread::yield() -{ - sched_yield(); -} - -//============================================================================== -/* Remove this macro if you're having problems compiling the cpu affinity - calls (the API for these has changed about quite a bit in various Linux - versions, and a lot of distros seem to ship with obsolete versions) -*/ -#if defined (CPU_ISSET) && ! defined (SUPPORT_AFFINITIES) - #define SUPPORT_AFFINITIES 1 -#endif - -void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) -{ - #if SUPPORT_AFFINITIES - cpu_set_t affinity; - CPU_ZERO (&affinity); - - for (int i = 0; i < 32; ++i) - if ((affinityMask & (1 << i)) != 0) - CPU_SET (i, &affinity); - - /* - N.B. If this line causes a compile error, then you've probably not got the latest - version of glibc installed. - - If you don't want to update your copy of glibc and don't care about cpu affinities, - then you can just disable all this stuff by setting the SUPPORT_AFFINITIES macro to 0. - */ - sched_setaffinity (getpid(), sizeof (cpu_set_t), &affinity); - sched_yield(); - - #else - /* affinities aren't supported because either the appropriate header files weren't found, - or the SUPPORT_AFFINITIES macro was turned off - */ - jassertfalse; - (void) affinityMask; - #endif -} - -//============================================================================== -bool DynamicLibrary::open (const String& name) -{ - close(); - handle = dlopen (name.isEmpty() ? nullptr : name.toUTF8().getAddress(), RTLD_LOCAL | RTLD_NOW); - return handle != nullptr; -} - -void DynamicLibrary::close() -{ - if (handle != nullptr) - { - dlclose (handle); - handle = nullptr; - } -} - -void* DynamicLibrary::getFunction (const String& functionName) noexcept -{ - return handle != nullptr ? dlsym (handle, functionName.toUTF8()) : nullptr; -} - - - -//============================================================================== -class ChildProcess::ActiveProcess -{ -public: - ActiveProcess (const StringArray& arguments, int streamFlags) - : childPID (0), pipeHandle (0), readHandle (0) - { - // Looks like you're trying to launch a non-existent exe or a folder (perhaps on OSX - // you're trying to launch the .app folder rather than the actual binary inside it?) - jassert ((! arguments[0].containsChar ('/')) - || File::getCurrentWorkingDirectory().getChildFile (arguments[0]).existsAsFile()); - - int pipeHandles[2] = { 0 }; - - if (pipe (pipeHandles) == 0) - { - const pid_t result = fork(); - - if (result < 0) - { - close (pipeHandles[0]); - close (pipeHandles[1]); - } - else if (result == 0) - { - // we're the child process.. - close (pipeHandles[0]); // close the read handle - - if ((streamFlags & wantStdOut) != 0) - dup2 (pipeHandles[1], 1); // turns the pipe into stdout - else - close (STDOUT_FILENO); - - if ((streamFlags & wantStdErr) != 0) - dup2 (pipeHandles[1], 2); - else - close (STDERR_FILENO); - - close (pipeHandles[1]); - - Array argv; - for (int i = 0; i < arguments.size(); ++i) - if (arguments[i].isNotEmpty()) - argv.add (const_cast (arguments[i].toUTF8().getAddress())); - - argv.add (nullptr); - - execvp (argv[0], argv.getRawDataPointer()); - exit (-1); - } - else - { - // we're the parent process.. - childPID = result; - pipeHandle = pipeHandles[0]; - close (pipeHandles[1]); // close the write handle - } - } - } - - ~ActiveProcess() - { - if (readHandle != 0) - fclose (readHandle); - - if (pipeHandle != 0) - close (pipeHandle); - } - - bool isRunning() const noexcept - { - if (childPID != 0) - { - int childState; - const int pid = waitpid (childPID, &childState, WNOHANG); - return pid == 0 || ! (WIFEXITED (childState) || WIFSIGNALED (childState)); - } - - return false; - } - - int read (void* const dest, const int numBytes) noexcept - { - jassert (dest != nullptr); - - #ifdef fdopen - #error // the zlib headers define this function as NULL! - #endif - - if (readHandle == 0 && childPID != 0) - readHandle = fdopen (pipeHandle, "r"); - - if (readHandle != 0) - return (int) fread (dest, 1, (size_t) numBytes, readHandle); - - return 0; - } - - bool killProcess() const noexcept - { - return ::kill (childPID, SIGKILL) == 0; - } - - uint32 getExitCode() const noexcept - { - if (childPID != 0) - { - int childState = 0; - const int pid = waitpid (childPID, &childState, WNOHANG); - - if (pid >= 0 && WIFEXITED (childState)) - return WEXITSTATUS (childState); - } - - return 0; - } - - int childPID; - -private: - int pipeHandle; - FILE* readHandle; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActiveProcess) -}; - -bool ChildProcess::start (const String& command, int streamFlags) -{ - return start (StringArray::fromTokens (command, true), streamFlags); -} - -bool ChildProcess::start (const StringArray& args, int streamFlags) -{ - if (args.size() == 0) - return false; - - activeProcess = new ActiveProcess (args, streamFlags); - - if (activeProcess->childPID == 0) - activeProcess = nullptr; - - return activeProcess != nullptr; -} - -//============================================================================== -struct HighResolutionTimer::Pimpl -{ - Pimpl (HighResolutionTimer& t) : owner (t), thread (0), shouldStop (false) - { - } - - ~Pimpl() - { - jassert (thread == 0); - } - - void start (int newPeriod) - { - if (periodMs != newPeriod) - { - if (thread != pthread_self()) - { - stop(); - - periodMs = newPeriod; - shouldStop = false; - - if (pthread_create (&thread, nullptr, timerThread, this) == 0) - setThreadToRealtime (thread, (uint64) newPeriod); - else - jassertfalse; - } - else - { - periodMs = newPeriod; - shouldStop = false; - } - } - } - - void stop() - { - if (thread != 0) - { - shouldStop = true; - - while (thread != 0 && thread != pthread_self()) - Thread::yield(); - } - } - - HighResolutionTimer& owner; - int volatile periodMs; - -private: - pthread_t thread; - bool volatile shouldStop; - - static void* timerThread (void* param) - { - #if JUCE_ANDROID - const AndroidThreadScope androidEnv; - #else - int dummy; - pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, &dummy); - #endif - - reinterpret_cast (param)->timerThread(); - return nullptr; - } - - void timerThread() - { - int lastPeriod = periodMs; - Clock clock (lastPeriod); - - while (! shouldStop) - { - clock.wait(); - owner.hiResTimerCallback(); - - if (lastPeriod != periodMs) - { - lastPeriod = periodMs; - clock = Clock (lastPeriod); - } - } - - periodMs = 0; - thread = 0; - } - - struct Clock - { - #if JUCE_MAC || JUCE_IOS - Clock (double millis) noexcept - { - mach_timebase_info_data_t timebase; - (void) mach_timebase_info (&timebase); - delta = (((uint64_t) (millis * 1000000.0)) * timebase.denom) / timebase.numer; - time = mach_absolute_time(); - } - - void wait() noexcept - { - time += delta; - mach_wait_until (time); - } - - uint64_t time, delta; - - #elif JUCE_ANDROID - Clock (double millis) noexcept : delta ((uint64) (millis * 1000000)) - { - } - - void wait() noexcept - { - struct timespec t; - t.tv_sec = (time_t) (delta / 1000000000); - t.tv_nsec = (long) (delta % 1000000000); - nanosleep (&t, nullptr); - } - - uint64 delta; - #else - Clock (double millis) noexcept : delta ((uint64) (millis * 1000000)) - { - struct timespec t; - clock_gettime (CLOCK_MONOTONIC, &t); - time = 1000000000 * (int64) t.tv_sec + t.tv_nsec; - } - - void wait() noexcept - { - time += delta; - - struct timespec t; - t.tv_sec = (time_t) (time / 1000000000); - t.tv_nsec = (long) (time % 1000000000); - - clock_nanosleep (CLOCK_MONOTONIC, TIMER_ABSTIME, &t, nullptr); - } - - uint64 time, delta; - #endif - }; - - static bool setThreadToRealtime (pthread_t thread, uint64 periodMs) - { - #if JUCE_MAC || JUCE_IOS - thread_time_constraint_policy_data_t policy; - policy.period = (uint32_t) (periodMs * 1000000); - policy.computation = 50000; - policy.constraint = policy.period; - policy.preemptible = true; - - return thread_policy_set (pthread_mach_thread_np (thread), - THREAD_TIME_CONSTRAINT_POLICY, - (thread_policy_t) &policy, - THREAD_TIME_CONSTRAINT_POLICY_COUNT) == KERN_SUCCESS; - - #else - (void) periodMs; - struct sched_param param; - param.sched_priority = sched_get_priority_max (SCHED_RR); - return pthread_setschedparam (thread, SCHED_RR, ¶m) == 0; - - #endif - } - - JUCE_DECLARE_NON_COPYABLE (Pimpl) -}; diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h b/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h deleted file mode 100755 index 0dc0efc..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_ComSmartPtr.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_WIN32_COMSMARTPTR_H_INCLUDED -#define JUCE_WIN32_COMSMARTPTR_H_INCLUDED - -#if ! (defined (_MSC_VER) || defined (__uuidof)) -template struct UUIDGetter { static CLSID get() { jassertfalse; return CLSID(); } }; -#define __uuidof(x) UUIDGetter::get() -#endif - -inline GUID uuidFromString (const char* const s) noexcept -{ - unsigned long p0; - unsigned int p1, p2, p3, p4, p5, p6, p7, p8, p9, p10; - - #ifndef _MSC_VER - sscanf - #else - sscanf_s - #endif - (s, "%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", - &p0, &p1, &p2, &p3, &p4, &p5, &p6, &p7, &p8, &p9, &p10); - - GUID g = { p0, (uint16) p1, (uint16) p2, { (uint8) p3, (uint8) p4, (uint8) p5, (uint8) p6, - (uint8) p7, (uint8) p8, (uint8) p9, (uint8) p10 }}; - return g; -} - -//============================================================================== -/** A simple COM smart pointer. -*/ -template -class ComSmartPtr -{ -public: - ComSmartPtr() throw() : p (0) {} - ComSmartPtr (ComClass* const obj) : p (obj) { if (p) p->AddRef(); } - ComSmartPtr (const ComSmartPtr& other) : p (other.p) { if (p) p->AddRef(); } - ~ComSmartPtr() { release(); } - - operator ComClass*() const throw() { return p; } - ComClass& operator*() const throw() { return *p; } - ComClass* operator->() const throw() { return p; } - - ComSmartPtr& operator= (ComClass* const newP) - { - if (newP != 0) newP->AddRef(); - release(); - p = newP; - return *this; - } - - ComSmartPtr& operator= (const ComSmartPtr& newP) { return operator= (newP.p); } - - // Releases and nullifies this pointer and returns its address - ComClass** resetAndGetPointerAddress() - { - release(); - p = 0; - return &p; - } - - HRESULT CoCreateInstance (REFCLSID classUUID, DWORD dwClsContext = CLSCTX_INPROC_SERVER) - { - HRESULT hr = ::CoCreateInstance (classUUID, 0, dwClsContext, __uuidof (ComClass), (void**) resetAndGetPointerAddress()); - jassert (hr != CO_E_NOTINITIALIZED); // You haven't called CoInitialize for the current thread! - return hr; - } - - template - HRESULT QueryInterface (REFCLSID classUUID, ComSmartPtr& destObject) const - { - if (p == 0) - return E_POINTER; - - return p->QueryInterface (classUUID, (void**) destObject.resetAndGetPointerAddress()); - } - - template - HRESULT QueryInterface (ComSmartPtr& destObject) const - { - return this->QueryInterface (__uuidof (OtherComClass), destObject); - } - -private: - ComClass* p; - - void release() { if (p != 0) p->Release(); } - - ComClass** operator&() throw(); // private to avoid it being used accidentally -}; - -//============================================================================== -#define JUCE_COMRESULT HRESULT __stdcall - -//============================================================================== -template -class ComBaseClassHelperBase : public ComClass -{ -public: - ComBaseClassHelperBase (unsigned int initialRefCount) : refCount (initialRefCount) {} - virtual ~ComBaseClassHelperBase() {} - - ULONG __stdcall AddRef() { return ++refCount; } - ULONG __stdcall Release() { const ULONG r = --refCount; if (r == 0) delete this; return r; } - -protected: - ULONG refCount; - - JUCE_COMRESULT QueryInterface (REFIID refId, void** result) - { - if (refId == IID_IUnknown) - return castToType (result); - - *result = 0; - return E_NOINTERFACE; - } - - template - JUCE_COMRESULT castToType (void** result) - { - this->AddRef(); *result = dynamic_cast (this); return S_OK; - } -}; - -/** Handy base class for writing COM objects, providing ref-counting and a basic QueryInterface method. -*/ -template -class ComBaseClassHelper : public ComBaseClassHelperBase -{ -public: - ComBaseClassHelper (unsigned int initialRefCount = 1) : ComBaseClassHelperBase (initialRefCount) {} - ~ComBaseClassHelper() {} - - JUCE_COMRESULT QueryInterface (REFIID refId, void** result) - { - if (refId == __uuidof (ComClass)) - return this->template castToType (result); - - return ComBaseClassHelperBase ::QueryInterface (refId, result); - } -}; - -#endif // JUCE_WIN32_COMSMARTPTR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp b/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp deleted file mode 100755 index b4bbd9b..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_Files.cpp +++ /dev/null @@ -1,1010 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef INVALID_FILE_ATTRIBUTES - #define INVALID_FILE_ATTRIBUTES ((DWORD) -1) -#endif - -//============================================================================== -namespace WindowsFileHelpers -{ - DWORD getAtts (const String& path) - { - return GetFileAttributes (path.toWideCharPointer()); - } - - int64 fileTimeToTime (const FILETIME* const ft) - { - static_jassert (sizeof (ULARGE_INTEGER) == sizeof (FILETIME)); // tell me if this fails! - - return (int64) ((reinterpret_cast (ft)->QuadPart - 116444736000000000LL) / 10000); - } - - FILETIME* timeToFileTime (const int64 time, FILETIME* const ft) noexcept - { - if (time <= 0) - return nullptr; - - reinterpret_cast (ft)->QuadPart = (ULONGLONG) (time * 10000 + 116444736000000000LL); - return ft; - } - - String getDriveFromPath (String path) - { - if (path.isNotEmpty() && path[1] == ':' && path[2] == 0) - path << '\\'; - - const size_t numBytes = CharPointer_UTF16::getBytesRequiredFor (path.getCharPointer()) + 4; - HeapBlock pathCopy; - pathCopy.calloc (numBytes, 1); - path.copyToUTF16 (pathCopy, numBytes); - - if (PathStripToRoot (pathCopy)) - path = static_cast (pathCopy); - - return path; - } - - int64 getDiskSpaceInfo (const String& path, const bool total) - { - ULARGE_INTEGER spc, tot, totFree; - - if (GetDiskFreeSpaceEx (getDriveFromPath (path).toWideCharPointer(), &spc, &tot, &totFree)) - return total ? (int64) tot.QuadPart - : (int64) spc.QuadPart; - - return 0; - } - - unsigned int getWindowsDriveType (const String& path) - { - return GetDriveType (getDriveFromPath (path).toWideCharPointer()); - } - - File getSpecialFolderPath (int type) - { - WCHAR path [MAX_PATH + 256]; - - if (SHGetSpecialFolderPath (0, path, type, FALSE)) - return File (String (path)); - - return File(); - } - - File getModuleFileName (HINSTANCE moduleHandle) - { - WCHAR dest [MAX_PATH + 256]; - dest[0] = 0; - GetModuleFileName (moduleHandle, dest, (DWORD) numElementsInArray (dest)); - return File (String (dest)); - } - - Result getResultForLastError() - { - TCHAR messageBuffer [256] = { 0 }; - - FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - nullptr, GetLastError(), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - messageBuffer, (DWORD) numElementsInArray (messageBuffer) - 1, nullptr); - - return Result::fail (String (messageBuffer)); - } -} - -//============================================================================== -const juce_wchar File::separator = '\\'; -const String File::separatorString ("\\"); - - -//============================================================================== -bool File::exists() const -{ - return fullPath.isNotEmpty() - && WindowsFileHelpers::getAtts (fullPath) != INVALID_FILE_ATTRIBUTES; -} - -bool File::existsAsFile() const -{ - return fullPath.isNotEmpty() - && (WindowsFileHelpers::getAtts (fullPath) & FILE_ATTRIBUTE_DIRECTORY) == 0; -} - -bool File::isDirectory() const -{ - const DWORD attr = WindowsFileHelpers::getAtts (fullPath); - return (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 && attr != INVALID_FILE_ATTRIBUTES; -} - -bool File::hasWriteAccess() const -{ - if (fullPath.isEmpty()) - return true; - - const DWORD attr = WindowsFileHelpers::getAtts (fullPath); - - // NB: According to MS, the FILE_ATTRIBUTE_READONLY attribute doesn't work for - // folders, and can be incorrectly set for some special folders, so we'll just say - // that folders are always writable. - return attr == INVALID_FILE_ATTRIBUTES - || (attr & FILE_ATTRIBUTE_DIRECTORY) != 0 - || (attr & FILE_ATTRIBUTE_READONLY) == 0; -} - -bool File::setFileReadOnlyInternal (const bool shouldBeReadOnly) const -{ - const DWORD oldAtts = WindowsFileHelpers::getAtts (fullPath); - - if (oldAtts == INVALID_FILE_ATTRIBUTES) - return false; - - const DWORD newAtts = shouldBeReadOnly ? (oldAtts | FILE_ATTRIBUTE_READONLY) - : (oldAtts & ~FILE_ATTRIBUTE_READONLY); - return newAtts == oldAtts - || SetFileAttributes (fullPath.toWideCharPointer(), newAtts) != FALSE; -} - -bool File::setFileExecutableInternal (bool /*shouldBeExecutable*/) const -{ - // XXX is this possible? - return false; -} - -bool File::isHidden() const -{ - return (WindowsFileHelpers::getAtts (fullPath) & FILE_ATTRIBUTE_HIDDEN) != 0; -} - -//============================================================================== -bool File::deleteFile() const -{ - if (! exists()) - return true; - - return isDirectory() ? RemoveDirectory (fullPath.toWideCharPointer()) != 0 - : DeleteFile (fullPath.toWideCharPointer()) != 0; -} - -bool File::moveToTrash() const -{ - if (! exists()) - return true; - - // The string we pass in must be double null terminated.. - const size_t numBytes = CharPointer_UTF16::getBytesRequiredFor (fullPath.getCharPointer()) + 8; - HeapBlock doubleNullTermPath; - doubleNullTermPath.calloc (numBytes, 1); - fullPath.copyToUTF16 (doubleNullTermPath, numBytes); - - SHFILEOPSTRUCT fos = { 0 }; - fos.wFunc = FO_DELETE; - fos.pFrom = doubleNullTermPath; - fos.fFlags = FOF_ALLOWUNDO | FOF_NOERRORUI | FOF_SILENT | FOF_NOCONFIRMATION - | FOF_NOCONFIRMMKDIR | FOF_RENAMEONCOLLISION; - - return SHFileOperation (&fos) == 0; -} - -bool File::copyInternal (const File& dest) const -{ - return CopyFile (fullPath.toWideCharPointer(), dest.getFullPathName().toWideCharPointer(), false) != 0; -} - -bool File::moveInternal (const File& dest) const -{ - return MoveFile (fullPath.toWideCharPointer(), dest.getFullPathName().toWideCharPointer()) != 0; -} - -Result File::createDirectoryInternal (const String& fileName) const -{ - return CreateDirectory (fileName.toWideCharPointer(), 0) ? Result::ok() - : WindowsFileHelpers::getResultForLastError(); -} - -//============================================================================== -int64 juce_fileSetPosition (void* handle, int64 pos) -{ - LARGE_INTEGER li; - li.QuadPart = pos; - li.LowPart = SetFilePointer ((HANDLE) handle, (LONG) li.LowPart, &li.HighPart, FILE_BEGIN); // (returns -1 if it fails) - return li.QuadPart; -} - -void FileInputStream::openHandle() -{ - HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0); - - if (h != INVALID_HANDLE_VALUE) - fileHandle = (void*) h; - else - status = WindowsFileHelpers::getResultForLastError(); -} - -FileInputStream::~FileInputStream() -{ - CloseHandle ((HANDLE) fileHandle); -} - -size_t FileInputStream::readInternal (void* buffer, size_t numBytes) -{ - if (fileHandle != 0) - { - DWORD actualNum = 0; - if (! ReadFile ((HANDLE) fileHandle, buffer, (DWORD) numBytes, &actualNum, 0)) - status = WindowsFileHelpers::getResultForLastError(); - - return (size_t) actualNum; - } - - return 0; -} - -//============================================================================== -void FileOutputStream::openHandle() -{ - HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), GENERIC_WRITE, FILE_SHARE_READ, 0, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); - - if (h != INVALID_HANDLE_VALUE) - { - LARGE_INTEGER li; - li.QuadPart = 0; - li.LowPart = SetFilePointer (h, 0, &li.HighPart, FILE_END); - - if (li.LowPart != INVALID_SET_FILE_POINTER) - { - fileHandle = (void*) h; - currentPosition = li.QuadPart; - return; - } - } - - status = WindowsFileHelpers::getResultForLastError(); -} - -void FileOutputStream::closeHandle() -{ - CloseHandle ((HANDLE) fileHandle); -} - -ssize_t FileOutputStream::writeInternal (const void* buffer, size_t numBytes) -{ - if (fileHandle != nullptr) - { - DWORD actualNum = 0; - if (! WriteFile ((HANDLE) fileHandle, buffer, (DWORD) numBytes, &actualNum, 0)) - status = WindowsFileHelpers::getResultForLastError(); - - return (ssize_t) actualNum; - } - - return 0; -} - -void FileOutputStream::flushInternal() -{ - if (fileHandle != nullptr) - if (! FlushFileBuffers ((HANDLE) fileHandle)) - status = WindowsFileHelpers::getResultForLastError(); -} - -Result FileOutputStream::truncate() -{ - if (fileHandle == nullptr) - return status; - - flush(); - return SetEndOfFile ((HANDLE) fileHandle) ? Result::ok() - : WindowsFileHelpers::getResultForLastError(); -} - -//============================================================================== -void MemoryMappedFile::openInternal (const File& file, AccessMode mode) -{ - jassert (mode == readOnly || mode == readWrite); - - if (range.getStart() > 0) - { - SYSTEM_INFO systemInfo; - GetNativeSystemInfo (&systemInfo); - - range.setStart (range.getStart() - (range.getStart() % systemInfo.dwAllocationGranularity)); - } - - DWORD accessMode = GENERIC_READ, createType = OPEN_EXISTING; - DWORD protect = PAGE_READONLY, access = FILE_MAP_READ; - - if (mode == readWrite) - { - accessMode = GENERIC_READ | GENERIC_WRITE; - createType = OPEN_ALWAYS; - protect = PAGE_READWRITE; - access = FILE_MAP_ALL_ACCESS; - } - - HANDLE h = CreateFile (file.getFullPathName().toWideCharPointer(), accessMode, FILE_SHARE_READ, 0, - createType, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 0); - - if (h != INVALID_HANDLE_VALUE) - { - fileHandle = (void*) h; - - HANDLE mappingHandle = CreateFileMapping (h, 0, protect, (DWORD) (range.getEnd() >> 32), (DWORD) range.getEnd(), 0); - - if (mappingHandle != 0) - { - address = MapViewOfFile (mappingHandle, access, (DWORD) (range.getStart() >> 32), - (DWORD) range.getStart(), (SIZE_T) range.getLength()); - - if (address == nullptr) - range = Range(); - - CloseHandle (mappingHandle); - } - } -} - -MemoryMappedFile::~MemoryMappedFile() -{ - if (address != nullptr) - UnmapViewOfFile (address); - - if (fileHandle != nullptr) - CloseHandle ((HANDLE) fileHandle); -} - -//============================================================================== -int64 File::getSize() const -{ - WIN32_FILE_ATTRIBUTE_DATA attributes; - - if (GetFileAttributesEx (fullPath.toWideCharPointer(), GetFileExInfoStandard, &attributes)) - return (((int64) attributes.nFileSizeHigh) << 32) | attributes.nFileSizeLow; - - return 0; -} - -void File::getFileTimesInternal (int64& modificationTime, int64& accessTime, int64& creationTime) const -{ - using namespace WindowsFileHelpers; - WIN32_FILE_ATTRIBUTE_DATA attributes; - - if (GetFileAttributesEx (fullPath.toWideCharPointer(), GetFileExInfoStandard, &attributes)) - { - modificationTime = fileTimeToTime (&attributes.ftLastWriteTime); - creationTime = fileTimeToTime (&attributes.ftCreationTime); - accessTime = fileTimeToTime (&attributes.ftLastAccessTime); - } - else - { - creationTime = accessTime = modificationTime = 0; - } -} - -bool File::setFileTimesInternal (int64 modificationTime, int64 accessTime, int64 creationTime) const -{ - using namespace WindowsFileHelpers; - - bool ok = false; - HANDLE h = CreateFile (fullPath.toWideCharPointer(), GENERIC_WRITE, FILE_SHARE_READ, 0, - OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); - - if (h != INVALID_HANDLE_VALUE) - { - FILETIME m, a, c; - - ok = SetFileTime (h, - timeToFileTime (creationTime, &c), - timeToFileTime (accessTime, &a), - timeToFileTime (modificationTime, &m)) != 0; - - CloseHandle (h); - } - - return ok; -} - -//============================================================================== -void File::findFileSystemRoots (Array& destArray) -{ - TCHAR buffer [2048] = { 0 }; - GetLogicalDriveStrings (2048, buffer); - - const TCHAR* n = buffer; - StringArray roots; - - while (*n != 0) - { - roots.add (String (n)); - - while (*n++ != 0) - {} - } - - roots.sort (true); - - for (int i = 0; i < roots.size(); ++i) - destArray.add (roots [i]); -} - -//============================================================================== -String File::getVolumeLabel() const -{ - TCHAR dest[64]; - if (! GetVolumeInformation (WindowsFileHelpers::getDriveFromPath (getFullPathName()).toWideCharPointer(), dest, - (DWORD) numElementsInArray (dest), 0, 0, 0, 0, 0)) - dest[0] = 0; - - return dest; -} - -int File::getVolumeSerialNumber() const -{ - TCHAR dest[64]; - DWORD serialNum; - - if (! GetVolumeInformation (WindowsFileHelpers::getDriveFromPath (getFullPathName()).toWideCharPointer(), dest, - (DWORD) numElementsInArray (dest), &serialNum, 0, 0, 0, 0)) - return 0; - - return (int) serialNum; -} - -int64 File::getBytesFreeOnVolume() const -{ - return WindowsFileHelpers::getDiskSpaceInfo (getFullPathName(), false); -} - -int64 File::getVolumeTotalSize() const -{ - return WindowsFileHelpers::getDiskSpaceInfo (getFullPathName(), true); -} - -uint64 File::getFileIdentifier() const -{ - uint64 result = 0; - - HANDLE h = CreateFile (getFullPathName().toWideCharPointer(), - GENERIC_READ, FILE_SHARE_READ, nullptr, - OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); - - if (h != INVALID_HANDLE_VALUE) - { - BY_HANDLE_FILE_INFORMATION info; - zerostruct (info); - - if (GetFileInformationByHandle (h, &info)) - result = (((uint64) info.nFileIndexHigh) << 32) | info.nFileIndexLow; - - CloseHandle (h); - } - - return result; -} - -//============================================================================== -bool File::isOnCDRomDrive() const -{ - return WindowsFileHelpers::getWindowsDriveType (getFullPathName()) == DRIVE_CDROM; -} - -bool File::isOnHardDisk() const -{ - if (fullPath.isEmpty()) - return false; - - const unsigned int n = WindowsFileHelpers::getWindowsDriveType (getFullPathName()); - - if (fullPath.toLowerCase()[0] <= 'b' && fullPath[1] == ':') - return n != DRIVE_REMOVABLE; - - return n != DRIVE_CDROM && n != DRIVE_REMOTE; -} - -bool File::isOnRemovableDrive() const -{ - if (fullPath.isEmpty()) - return false; - - const unsigned int n = WindowsFileHelpers::getWindowsDriveType (getFullPathName()); - - return n == DRIVE_CDROM - || n == DRIVE_REMOTE - || n == DRIVE_REMOVABLE - || n == DRIVE_RAMDISK; -} - -//============================================================================== -File JUCE_CALLTYPE File::getSpecialLocation (const SpecialLocationType type) -{ - int csidlType = 0; - - switch (type) - { - case userHomeDirectory: csidlType = CSIDL_PROFILE; break; - case userDocumentsDirectory: csidlType = CSIDL_PERSONAL; break; - case userDesktopDirectory: csidlType = CSIDL_DESKTOP; break; - case userApplicationDataDirectory: csidlType = CSIDL_APPDATA; break; - case commonApplicationDataDirectory: csidlType = CSIDL_COMMON_APPDATA; break; - case commonDocumentsDirectory: csidlType = CSIDL_COMMON_DOCUMENTS; break; - case globalApplicationsDirectory: csidlType = CSIDL_PROGRAM_FILES; break; - case userMusicDirectory: csidlType = 0x0d; /*CSIDL_MYMUSIC*/ break; - case userMoviesDirectory: csidlType = 0x0e; /*CSIDL_MYVIDEO*/ break; - case userPicturesDirectory: csidlType = 0x27; /*CSIDL_MYPICTURES*/ break; - - case tempDirectory: - { - WCHAR dest [2048]; - dest[0] = 0; - GetTempPath ((DWORD) numElementsInArray (dest), dest); - return File (String (dest)); - } - - case windowsSystemDirectory: - { - WCHAR dest [2048]; - dest[0] = 0; - GetSystemDirectoryW (dest, (UINT) numElementsInArray (dest)); - return File (String (dest)); - } - - case invokedExecutableFile: - case currentExecutableFile: - case currentApplicationFile: - return WindowsFileHelpers::getModuleFileName ((HINSTANCE) Process::getCurrentModuleInstanceHandle()); - - case hostApplicationPath: - return WindowsFileHelpers::getModuleFileName (0); - - default: - jassertfalse; // unknown type? - return File(); - } - - return WindowsFileHelpers::getSpecialFolderPath (csidlType); -} - -//============================================================================== -File File::getCurrentWorkingDirectory() -{ - WCHAR dest [MAX_PATH + 256]; - dest[0] = 0; - GetCurrentDirectory ((DWORD) numElementsInArray (dest), dest); - return File (String (dest)); -} - -bool File::setAsCurrentWorkingDirectory() const -{ - return SetCurrentDirectory (getFullPathName().toWideCharPointer()) != FALSE; -} - -//============================================================================== -String File::getVersion() const -{ - String result; - - DWORD handle = 0; - DWORD bufferSize = GetFileVersionInfoSize (getFullPathName().toWideCharPointer(), &handle); - HeapBlock buffer; - buffer.calloc (bufferSize); - - if (GetFileVersionInfo (getFullPathName().toWideCharPointer(), 0, bufferSize, buffer)) - { - VS_FIXEDFILEINFO* vffi; - UINT len = 0; - - if (VerQueryValue (buffer, (LPTSTR) _T("\\"), (LPVOID*) &vffi, &len)) - { - result << (int) HIWORD (vffi->dwFileVersionMS) << '.' - << (int) LOWORD (vffi->dwFileVersionMS) << '.' - << (int) HIWORD (vffi->dwFileVersionLS) << '.' - << (int) LOWORD (vffi->dwFileVersionLS); - } - } - - return result; -} - -//============================================================================== -bool File::isLink() const -{ - return hasFileExtension (".lnk"); -} - -File File::getLinkedTarget() const -{ - File result (*this); - String p (getFullPathName()); - - if (! exists()) - p += ".lnk"; - else if (! hasFileExtension (".lnk")) - return result; - - ComSmartPtr shellLink; - ComSmartPtr persistFile; - - if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink)) - && SUCCEEDED (shellLink.QueryInterface (persistFile)) - && SUCCEEDED (persistFile->Load (p.toWideCharPointer(), STGM_READ)) - && SUCCEEDED (shellLink->Resolve (0, SLR_ANY_MATCH | SLR_NO_UI))) - { - WIN32_FIND_DATA winFindData; - WCHAR resolvedPath [MAX_PATH]; - - if (SUCCEEDED (shellLink->GetPath (resolvedPath, MAX_PATH, &winFindData, SLGP_UNCPRIORITY))) - result = File (resolvedPath); - } - - return result; -} - -bool File::createLink (const String& description, const File& linkFileToCreate) const -{ - linkFileToCreate.deleteFile(); - - ComSmartPtr shellLink; - ComSmartPtr persistFile; - - CoInitialize (0); - - return SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink)) - && SUCCEEDED (shellLink->SetPath (getFullPathName().toWideCharPointer())) - && SUCCEEDED (shellLink->SetDescription (description.toWideCharPointer())) - && SUCCEEDED (shellLink.QueryInterface (persistFile)) - && SUCCEEDED (persistFile->Save (linkFileToCreate.getFullPathName().toWideCharPointer(), TRUE)); -} - -//============================================================================== -class DirectoryIterator::NativeIterator::Pimpl -{ -public: - Pimpl (const File& directory, const String& wildCard) - : directoryWithWildCard (File::addTrailingSeparator (directory.getFullPathName()) + wildCard), - handle (INVALID_HANDLE_VALUE) - { - } - - ~Pimpl() - { - if (handle != INVALID_HANDLE_VALUE) - FindClose (handle); - } - - bool next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) - { - using namespace WindowsFileHelpers; - WIN32_FIND_DATA findData; - - if (handle == INVALID_HANDLE_VALUE) - { - handle = FindFirstFile (directoryWithWildCard.toWideCharPointer(), &findData); - - if (handle == INVALID_HANDLE_VALUE) - return false; - } - else - { - if (FindNextFile (handle, &findData) == 0) - return false; - } - - filenameFound = findData.cFileName; - - if (isDir != nullptr) *isDir = ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0); - if (isHidden != nullptr) *isHidden = ((findData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0); - if (isReadOnly != nullptr) *isReadOnly = ((findData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) != 0); - if (fileSize != nullptr) *fileSize = findData.nFileSizeLow + (((int64) findData.nFileSizeHigh) << 32); - if (modTime != nullptr) *modTime = Time (fileTimeToTime (&findData.ftLastWriteTime)); - if (creationTime != nullptr) *creationTime = Time (fileTimeToTime (&findData.ftCreationTime)); - - return true; - } - -private: - const String directoryWithWildCard; - HANDLE handle; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl) -}; - -DirectoryIterator::NativeIterator::NativeIterator (const File& directory, const String& wildCard) - : pimpl (new DirectoryIterator::NativeIterator::Pimpl (directory, wildCard)) -{ -} - -DirectoryIterator::NativeIterator::~NativeIterator() -{ -} - -bool DirectoryIterator::NativeIterator::next (String& filenameFound, - bool* const isDir, bool* const isHidden, int64* const fileSize, - Time* const modTime, Time* const creationTime, bool* const isReadOnly) -{ - return pimpl->next (filenameFound, isDir, isHidden, fileSize, modTime, creationTime, isReadOnly); -} - - -//============================================================================== -bool JUCE_CALLTYPE Process::openDocument (const String& fileName, const String& parameters) -{ - HINSTANCE hInstance = 0; - - JUCE_TRY - { - hInstance = ShellExecute (0, 0, fileName.toWideCharPointer(), - parameters.toWideCharPointer(), 0, SW_SHOWDEFAULT); - } - JUCE_CATCH_ALL - - return hInstance > (HINSTANCE) 32; -} - -void File::revealToUser() const -{ - DynamicLibrary dll ("Shell32.dll"); - JUCE_LOAD_WINAPI_FUNCTION (dll, ILCreateFromPathW, ilCreateFromPathW, ITEMIDLIST*, (LPCWSTR)) - JUCE_LOAD_WINAPI_FUNCTION (dll, ILFree, ilFree, void, (ITEMIDLIST*)) - JUCE_LOAD_WINAPI_FUNCTION (dll, SHOpenFolderAndSelectItems, shOpenFolderAndSelectItems, HRESULT, (ITEMIDLIST*, UINT, void*, DWORD)) - - if (ilCreateFromPathW != nullptr && shOpenFolderAndSelectItems != nullptr && ilFree != nullptr) - { - if (ITEMIDLIST* const itemIDList = ilCreateFromPathW (fullPath.toWideCharPointer())) - { - shOpenFolderAndSelectItems (itemIDList, 0, nullptr, 0); - ilFree (itemIDList); - } - } -} - -//============================================================================== -class NamedPipe::Pimpl -{ -public: - Pimpl (const String& pipeName, const bool createPipe) - : filename ("\\\\.\\pipe\\" + File::createLegalFileName (pipeName)), - pipeH (INVALID_HANDLE_VALUE), - cancelEvent (CreateEvent (0, FALSE, FALSE, 0)), - connected (false), ownsPipe (createPipe), shouldStop (false) - { - if (createPipe) - pipeH = CreateNamedPipe (filename.toWideCharPointer(), - PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 0, - PIPE_UNLIMITED_INSTANCES, 4096, 4096, 0, 0); - } - - ~Pimpl() - { - disconnectPipe(); - - if (pipeH != INVALID_HANDLE_VALUE) - CloseHandle (pipeH); - - CloseHandle (cancelEvent); - } - - bool connect (const int timeOutMs) - { - if (! ownsPipe) - { - if (pipeH != INVALID_HANDLE_VALUE) - return true; - - const Time timeOutEnd (Time::getCurrentTime() + RelativeTime::milliseconds (timeOutMs)); - - for (;;) - { - { - const ScopedLock sl (createFileLock); - - if (pipeH == INVALID_HANDLE_VALUE) - pipeH = CreateFile (filename.toWideCharPointer(), - GENERIC_READ | GENERIC_WRITE, 0, 0, - OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); - } - - if (pipeH != INVALID_HANDLE_VALUE) - return true; - - if (shouldStop || (timeOutMs >= 0 && Time::getCurrentTime() > timeOutEnd)) - return false; - - Thread::sleep (1); - } - } - - if (! connected) - { - OverlappedEvent over; - - if (ConnectNamedPipe (pipeH, &over.over) == 0) - { - switch (GetLastError()) - { - case ERROR_PIPE_CONNECTED: connected = true; break; - case ERROR_IO_PENDING: - case ERROR_PIPE_LISTENING: connected = waitForIO (over, timeOutMs); break; - default: break; - } - } - } - - return connected; - } - - void disconnectPipe() - { - if (ownsPipe && connected) - { - DisconnectNamedPipe (pipeH); - connected = false; - } - } - - int read (void* destBuffer, const int maxBytesToRead, const int timeOutMilliseconds) - { - while (connect (timeOutMilliseconds)) - { - if (maxBytesToRead <= 0) - return 0; - - OverlappedEvent over; - unsigned long numRead; - - if (ReadFile (pipeH, destBuffer, (DWORD) maxBytesToRead, &numRead, &over.over)) - return (int) numRead; - - const DWORD lastError = GetLastError(); - - if (lastError == ERROR_IO_PENDING) - { - if (! waitForIO (over, timeOutMilliseconds)) - return -1; - - if (GetOverlappedResult (pipeH, &over.over, &numRead, FALSE)) - return (int) numRead; - } - - if (ownsPipe && (GetLastError() == ERROR_BROKEN_PIPE || GetLastError() == ERROR_PIPE_NOT_CONNECTED)) - disconnectPipe(); - else - break; - } - - return -1; - } - - int write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) - { - if (connect (timeOutMilliseconds)) - { - if (numBytesToWrite <= 0) - return 0; - - OverlappedEvent over; - unsigned long numWritten; - - if (WriteFile (pipeH, sourceBuffer, (DWORD) numBytesToWrite, &numWritten, &over.over)) - return (int) numWritten; - - if (GetLastError() == ERROR_IO_PENDING) - { - if (! waitForIO (over, timeOutMilliseconds)) - return -1; - - if (GetOverlappedResult (pipeH, &over.over, &numWritten, FALSE)) - return (int) numWritten; - - if (GetLastError() == ERROR_BROKEN_PIPE && ownsPipe) - disconnectPipe(); - } - } - - return -1; - } - - const String filename; - HANDLE pipeH, cancelEvent; - bool connected, ownsPipe, shouldStop; - CriticalSection createFileLock; - -private: - struct OverlappedEvent - { - OverlappedEvent() - { - zerostruct (over); - over.hEvent = CreateEvent (0, TRUE, FALSE, 0); - } - - ~OverlappedEvent() - { - CloseHandle (over.hEvent); - } - - OVERLAPPED over; - }; - - bool waitForIO (OverlappedEvent& over, int timeOutMilliseconds) - { - if (shouldStop) - return false; - - HANDLE handles[] = { over.over.hEvent, cancelEvent }; - DWORD waitResult = WaitForMultipleObjects (2, handles, FALSE, - timeOutMilliseconds >= 0 ? timeOutMilliseconds - : INFINITE); - - if (waitResult == WAIT_OBJECT_0) - return true; - - CancelIo (pipeH); - return false; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Pimpl) -}; - -void NamedPipe::close() -{ - if (pimpl != nullptr) - { - pimpl->shouldStop = true; - SetEvent (pimpl->cancelEvent); - - ScopedWriteLock sl (lock); - pimpl = nullptr; - } -} - -bool NamedPipe::openInternal (const String& pipeName, const bool createPipe) -{ - pimpl = new Pimpl (pipeName, createPipe); - - if (createPipe && pimpl->pipeH == INVALID_HANDLE_VALUE) - { - pimpl = nullptr; - return false; - } - - return true; -} - -int NamedPipe::read (void* destBuffer, int maxBytesToRead, int timeOutMilliseconds) -{ - ScopedReadLock sl (lock); - return pimpl != nullptr ? pimpl->read (destBuffer, maxBytesToRead, timeOutMilliseconds) : -1; -} - -int NamedPipe::write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds) -{ - ScopedReadLock sl (lock); - return pimpl != nullptr ? pimpl->write (sourceBuffer, numBytesToWrite, timeOutMilliseconds) : -1; -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp b/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp deleted file mode 100755 index 7e555cc..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_Network.cpp +++ /dev/null @@ -1,519 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef INTERNET_FLAG_NEED_FILE - #define INTERNET_FLAG_NEED_FILE 0x00000010 -#endif - -#ifndef INTERNET_OPTION_DISABLE_AUTODIAL - #define INTERNET_OPTION_DISABLE_AUTODIAL 70 -#endif - -//============================================================================== -class WebInputStream : public InputStream -{ -public: - WebInputStream (const String& address_, bool isPost_, const MemoryBlock& postData_, - URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, - const String& headers_, int timeOutMs_, StringPairArray* responseHeaders, int numRedirectsToFollow) - : statusCode (0), connection (0), request (0), - address (address_), headers (headers_), postData (postData_), position (0), - finished (false), isPost (isPost_), timeOutMs (timeOutMs_) - { - while (numRedirectsToFollow-- >= 0) - { - createConnection (progressCallback, progressCallbackContext); - - if (! isError()) - { - DWORD bufferSizeBytes = 4096; - StringPairArray headers (false); - - for (;;) - { - HeapBlock buffer ((size_t) bufferSizeBytes); - - if (HttpQueryInfo (request, HTTP_QUERY_RAW_HEADERS_CRLF, buffer.getData(), &bufferSizeBytes, 0)) - { - StringArray headersArray; - headersArray.addLines (String (reinterpret_cast (buffer.getData()))); - - for (int i = 0; i < headersArray.size(); ++i) - { - const String& header = headersArray[i]; - const String key (header.upToFirstOccurrenceOf (": ", false, false)); - const String value (header.fromFirstOccurrenceOf (": ", false, false)); - const String previousValue (headers[key]); - headers.set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); - } - - break; - } - - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) - break; - - bufferSizeBytes += 4096; - } - - DWORD status = 0; - DWORD statusSize = sizeof (status); - - if (HttpQueryInfo (request, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &status, &statusSize, 0)) - { - statusCode = (int) status; - - if (numRedirectsToFollow >= 0 - && (statusCode == 301 || statusCode == 302 || statusCode == 303 || statusCode == 307)) - { - String newLocation (headers["Location"]); - - // Check whether location is a relative URI - this is an incomplete test for relative path, - // but we'll use it for now (valid protocols for this implementation are http, https & ftp) - if (! (newLocation.startsWithIgnoreCase ("http://") - || newLocation.startsWithIgnoreCase ("https://") - || newLocation.startsWithIgnoreCase ("ftp://"))) - { - if (newLocation.startsWithChar ('/')) - newLocation = URL (address).withNewSubPath (newLocation).toString (true); - else - newLocation = address + "/" + newLocation; - } - - if (newLocation.isNotEmpty() && newLocation != address) - { - address = newLocation; - continue; - } - } - } - - if (responseHeaders != nullptr) - responseHeaders->addArray (headers); - } - - break; - } - } - - ~WebInputStream() - { - close(); - } - - //============================================================================== - bool isError() const { return request == 0; } - bool isExhausted() { return finished; } - int64 getPosition() { return position; } - - int64 getTotalLength() - { - if (! isError()) - { - DWORD index = 0, result = 0, size = sizeof (result); - - if (HttpQueryInfo (request, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &result, &size, &index)) - return (int64) result; - } - - return -1; - } - - int read (void* buffer, int bytesToRead) - { - jassert (buffer != nullptr && bytesToRead >= 0); - DWORD bytesRead = 0; - - if (! (finished || isError())) - { - InternetReadFile (request, buffer, (DWORD) bytesToRead, &bytesRead); - position += bytesRead; - - if (bytesRead == 0) - finished = true; - } - - return (int) bytesRead; - } - - bool setPosition (int64 wantedPos) - { - if (isError()) - return false; - - if (wantedPos != position) - { - finished = false; - position = (int64) InternetSetFilePointer (request, (LONG) wantedPos, 0, FILE_BEGIN, 0); - - if (position == wantedPos) - return true; - - if (wantedPos < position) - { - close(); - position = 0; - createConnection (0, 0); - } - - skipNextBytes (wantedPos - position); - } - - return true; - } - - int statusCode; - -private: - //============================================================================== - HINTERNET connection, request; - String address, headers; - MemoryBlock postData; - int64 position; - bool finished; - const bool isPost; - int timeOutMs; - - void close() - { - if (request != 0) - { - InternetCloseHandle (request); - request = 0; - } - - if (connection != 0) - { - InternetCloseHandle (connection); - connection = 0; - } - } - - void createConnection (URL::OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext) - { - static HINTERNET sessionHandle = InternetOpen (_T("juce"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0); - - close(); - - if (sessionHandle != 0) - { - // break up the url.. - const int fileNumChars = 65536; - const int serverNumChars = 2048; - const int usernameNumChars = 1024; - const int passwordNumChars = 1024; - HeapBlock file (fileNumChars), server (serverNumChars), - username (usernameNumChars), password (passwordNumChars); - - URL_COMPONENTS uc = { 0 }; - uc.dwStructSize = sizeof (uc); - uc.lpszUrlPath = file; - uc.dwUrlPathLength = fileNumChars; - uc.lpszHostName = server; - uc.dwHostNameLength = serverNumChars; - uc.lpszUserName = username; - uc.dwUserNameLength = usernameNumChars; - uc.lpszPassword = password; - uc.dwPasswordLength = passwordNumChars; - - if (InternetCrackUrl (address.toWideCharPointer(), 0, 0, &uc)) - openConnection (uc, sessionHandle, progressCallback, progressCallbackContext); - } - } - - void openConnection (URL_COMPONENTS& uc, HINTERNET sessionHandle, - URL::OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext) - { - int disable = 1; - InternetSetOption (sessionHandle, INTERNET_OPTION_DISABLE_AUTODIAL, &disable, sizeof (disable)); - - if (timeOutMs == 0) - timeOutMs = 30000; - else if (timeOutMs < 0) - timeOutMs = -1; - - applyTimeout (sessionHandle, INTERNET_OPTION_CONNECT_TIMEOUT); - applyTimeout (sessionHandle, INTERNET_OPTION_RECEIVE_TIMEOUT); - applyTimeout (sessionHandle, INTERNET_OPTION_SEND_TIMEOUT); - applyTimeout (sessionHandle, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT); - applyTimeout (sessionHandle, INTERNET_OPTION_DATA_SEND_TIMEOUT); - - const bool isFtp = address.startsWithIgnoreCase ("ftp:"); - - connection = InternetConnect (sessionHandle, uc.lpszHostName, uc.nPort, - uc.lpszUserName, uc.lpszPassword, - isFtp ? (DWORD) INTERNET_SERVICE_FTP - : (DWORD) INTERNET_SERVICE_HTTP, - 0, 0); - if (connection != 0) - { - if (isFtp) - request = FtpOpenFile (connection, uc.lpszUrlPath, GENERIC_READ, - FTP_TRANSFER_TYPE_BINARY | INTERNET_FLAG_NEED_FILE, 0); - else - openHTTPConnection (uc, progressCallback, progressCallbackContext); - } - } - - void applyTimeout (HINTERNET sessionHandle, const DWORD option) - { - InternetSetOption (sessionHandle, option, &timeOutMs, sizeof (timeOutMs)); - } - - void openHTTPConnection (URL_COMPONENTS& uc, URL::OpenStreamProgressCallback* progressCallback, - void* progressCallbackContext) - { - const TCHAR* mimeTypes[] = { _T("*/*"), nullptr }; - - DWORD flags = INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_COOKIES - | INTERNET_FLAG_NO_AUTO_REDIRECT | SECURITY_SET_MASK; - - if (address.startsWithIgnoreCase ("https:")) - flags |= INTERNET_FLAG_SECURE; // (this flag only seems necessary if the OS is running IE6 - - // IE7 seems to automatically work out when it's https) - - request = HttpOpenRequest (connection, isPost ? _T("POST") : _T("GET"), - uc.lpszUrlPath, 0, 0, mimeTypes, flags, 0); - - if (request != 0) - { - setSecurityFlags(); - - INTERNET_BUFFERS buffers = { 0 }; - buffers.dwStructSize = sizeof (INTERNET_BUFFERS); - buffers.lpcszHeader = headers.toWideCharPointer(); - buffers.dwHeadersLength = (DWORD) headers.length(); - buffers.dwBufferTotal = (DWORD) postData.getSize(); - - if (HttpSendRequestEx (request, &buffers, 0, HSR_INITIATE, 0)) - { - int bytesSent = 0; - - for (;;) - { - const int bytesToDo = jmin (1024, (int) postData.getSize() - bytesSent); - DWORD bytesDone = 0; - - if (bytesToDo > 0 - && ! InternetWriteFile (request, - static_cast (postData.getData()) + bytesSent, - (DWORD) bytesToDo, &bytesDone)) - { - break; - } - - if (bytesToDo == 0 || (int) bytesDone < bytesToDo) - { - if (HttpEndRequest (request, 0, 0, 0)) - return; - - break; - } - - bytesSent += bytesDone; - - if (progressCallback != nullptr - && ! progressCallback (progressCallbackContext, bytesSent, (int) postData.getSize())) - break; - } - } - } - - close(); - } - - void setSecurityFlags() - { - DWORD dwFlags = 0, dwBuffLen = sizeof (DWORD); - InternetQueryOption (request, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, &dwBuffLen); - dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_SET_MASK; - InternetSetOption (request, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof (dwFlags)); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebInputStream) -}; - - -//============================================================================== -struct GetAdaptersInfoHelper -{ - bool callGetAdaptersInfo() - { - DynamicLibrary dll ("iphlpapi.dll"); - JUCE_LOAD_WINAPI_FUNCTION (dll, GetAdaptersInfo, getAdaptersInfo, DWORD, (PIP_ADAPTER_INFO, PULONG)) - - if (getAdaptersInfo == nullptr) - return false; - - adapterInfo.malloc (1); - ULONG len = sizeof (IP_ADAPTER_INFO); - - if (getAdaptersInfo (adapterInfo, &len) == ERROR_BUFFER_OVERFLOW) - adapterInfo.malloc (len, 1); - - return getAdaptersInfo (adapterInfo, &len) == NO_ERROR; - } - - HeapBlock adapterInfo; -}; - -namespace MACAddressHelpers -{ - static void addAddress (Array& result, const MACAddress& ma) - { - if (! ma.isNull()) - result.addIfNotAlreadyThere (ma); - } - - static void getViaGetAdaptersInfo (Array& result) - { - GetAdaptersInfoHelper gah; - - if (gah.callGetAdaptersInfo()) - { - for (PIP_ADAPTER_INFO adapter = gah.adapterInfo; adapter != nullptr; adapter = adapter->Next) - if (adapter->AddressLength >= 6) - addAddress (result, MACAddress (adapter->Address)); - } - } - - static void getViaNetBios (Array& result) - { - DynamicLibrary dll ("netapi32.dll"); - JUCE_LOAD_WINAPI_FUNCTION (dll, Netbios, NetbiosCall, UCHAR, (PNCB)) - - if (NetbiosCall != 0) - { - LANA_ENUM enums = { 0 }; - - { - NCB ncb = { 0 }; - ncb.ncb_command = NCBENUM; - ncb.ncb_buffer = (unsigned char*) &enums; - ncb.ncb_length = sizeof (LANA_ENUM); - NetbiosCall (&ncb); - } - - for (int i = 0; i < enums.length; ++i) - { - NCB ncb2 = { 0 }; - ncb2.ncb_command = NCBRESET; - ncb2.ncb_lana_num = enums.lana[i]; - - if (NetbiosCall (&ncb2) == 0) - { - NCB ncb = { 0 }; - memcpy (ncb.ncb_callname, "* ", NCBNAMSZ); - ncb.ncb_command = NCBASTAT; - ncb.ncb_lana_num = enums.lana[i]; - - struct ASTAT - { - ADAPTER_STATUS adapt; - NAME_BUFFER NameBuff [30]; - }; - - ASTAT astat; - zerostruct (astat); - ncb.ncb_buffer = (unsigned char*) &astat; - ncb.ncb_length = sizeof (ASTAT); - - if (NetbiosCall (&ncb) == 0 && astat.adapt.adapter_type == 0xfe) - addAddress (result, MACAddress (astat.adapt.adapter_address)); - } - } - } - } -} - -void MACAddress::findAllAddresses (Array& result) -{ - MACAddressHelpers::getViaGetAdaptersInfo (result); - MACAddressHelpers::getViaNetBios (result); -} - -void IPAddress::findAllAddresses (Array& result) -{ - result.addIfNotAlreadyThere (IPAddress::local()); - - GetAdaptersInfoHelper gah; - - if (gah.callGetAdaptersInfo()) - { - for (PIP_ADAPTER_INFO adapter = gah.adapterInfo; adapter != nullptr; adapter = adapter->Next) - { - IPAddress ip (adapter->IpAddressList.IpAddress.String); - - if (ip != IPAddress::any()) - result.addIfNotAlreadyThere (ip); - } - } -} - -//============================================================================== -bool JUCE_CALLTYPE Process::openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach) -{ - DynamicLibrary dll ("MAPI32.dll"); - JUCE_LOAD_WINAPI_FUNCTION (dll, MAPISendMail, mapiSendMail, - ULONG, (LHANDLE, ULONG, lpMapiMessage, ::FLAGS, ULONG)) - - if (mapiSendMail == nullptr) - return false; - - MapiMessage message = { 0 }; - message.lpszSubject = (LPSTR) emailSubject.toRawUTF8(); - message.lpszNoteText = (LPSTR) bodyText.toRawUTF8(); - - MapiRecipDesc recip = { 0 }; - recip.ulRecipClass = MAPI_TO; - String targetEmailAddress_ (targetEmailAddress); - if (targetEmailAddress_.isEmpty()) - targetEmailAddress_ = " "; // (Windows Mail can't deal with a blank address) - recip.lpszName = (LPSTR) targetEmailAddress_.toRawUTF8(); - message.nRecipCount = 1; - message.lpRecips = &recip; - - HeapBlock files; - files.calloc ((size_t) filesToAttach.size()); - - message.nFileCount = (ULONG) filesToAttach.size(); - message.lpFiles = files; - - for (int i = 0; i < filesToAttach.size(); ++i) - { - files[i].nPosition = (ULONG) -1; - files[i].lpszPathName = (LPSTR) filesToAttach[i].toRawUTF8(); - } - - return mapiSendMail (0, 0, &message, MAPI_DIALOG | MAPI_LOGON_UI, 0) == SUCCESS_SUCCESS; -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp b/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp deleted file mode 100755 index 8119474..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_Registry.cpp +++ /dev/null @@ -1,227 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -struct RegistryKeyWrapper -{ - RegistryKeyWrapper (String name, const bool createForWriting, const DWORD wow64Flags) - : key (0), wideCharValueName (nullptr) - { - HKEY rootKey = 0; - - if (name.startsWithIgnoreCase ("HKEY_CURRENT_USER\\")) rootKey = HKEY_CURRENT_USER; - else if (name.startsWithIgnoreCase ("HKEY_LOCAL_MACHINE\\")) rootKey = HKEY_LOCAL_MACHINE; - else if (name.startsWithIgnoreCase ("HKEY_CLASSES_ROOT\\")) rootKey = HKEY_CLASSES_ROOT; - - if (rootKey != 0) - { - name = name.substring (name.indexOfChar ('\\') + 1); - - const int lastSlash = name.lastIndexOfChar ('\\'); - valueName = name.substring (lastSlash + 1); - wideCharValueName = valueName.toWideCharPointer(); - - name = name.substring (0, lastSlash); - const wchar_t* const wideCharName = name.toWideCharPointer(); - DWORD result; - - if (createForWriting) - RegCreateKeyEx (rootKey, wideCharName, 0, 0, REG_OPTION_NON_VOLATILE, - KEY_WRITE | KEY_QUERY_VALUE | wow64Flags, 0, &key, &result); - else - RegOpenKeyEx (rootKey, wideCharName, 0, KEY_READ | wow64Flags, &key); - } - } - - ~RegistryKeyWrapper() - { - if (key != 0) - RegCloseKey (key); - } - - static bool setValue (const String& regValuePath, const DWORD type, - const void* data, size_t dataSize, const DWORD wow64Flags) - { - const RegistryKeyWrapper key (regValuePath, true, wow64Flags); - - return key.key != 0 - && RegSetValueEx (key.key, key.wideCharValueName, 0, type, - reinterpret_cast (data), - (DWORD) dataSize) == ERROR_SUCCESS; - } - - static uint32 getBinaryValue (const String& regValuePath, MemoryBlock& result, DWORD wow64Flags) - { - const RegistryKeyWrapper key (regValuePath, false, wow64Flags); - - if (key.key != 0) - { - for (unsigned long bufferSize = 1024; ; bufferSize *= 2) - { - result.setSize (bufferSize, false); - DWORD type = REG_NONE; - - const LONG err = RegQueryValueEx (key.key, key.wideCharValueName, 0, &type, - (LPBYTE) result.getData(), &bufferSize); - - if (err == ERROR_SUCCESS) - { - result.setSize (bufferSize, false); - return type; - } - - if (err != ERROR_MORE_DATA) - break; - } - } - - return REG_NONE; - } - - static String getValue (const String& regValuePath, const String& defaultValue, DWORD wow64Flags) - { - MemoryBlock buffer; - switch (getBinaryValue (regValuePath, buffer, wow64Flags)) - { - case REG_SZ: return static_cast (buffer.getData()); - case REG_DWORD: return String ((int) *reinterpret_cast (buffer.getData())); - default: break; - } - - return defaultValue; - } - - static bool keyExists (const String& regValuePath, const DWORD wow64Flags) - { - return RegistryKeyWrapper (regValuePath, false, wow64Flags).key != 0; - } - - static bool valueExists (const String& regValuePath, const DWORD wow64Flags) - { - const RegistryKeyWrapper key (regValuePath, false, wow64Flags); - - if (key.key == 0) - return false; - - unsigned char buffer [512]; - unsigned long bufferSize = sizeof (buffer); - DWORD type = 0; - - const LONG result = RegQueryValueEx (key.key, key.wideCharValueName, - 0, &type, buffer, &bufferSize); - - return result == ERROR_SUCCESS || result == ERROR_MORE_DATA; - } - - HKEY key; - const wchar_t* wideCharValueName; - String valueName; - - JUCE_DECLARE_NON_COPYABLE (RegistryKeyWrapper) -}; - -uint32 JUCE_CALLTYPE WindowsRegistry::getBinaryValue (const String& regValuePath, MemoryBlock& result, WoW64Mode mode) -{ - return RegistryKeyWrapper::getBinaryValue (regValuePath, result, (DWORD) mode); -} - -String JUCE_CALLTYPE WindowsRegistry::getValue (const String& regValuePath, const String& defaultValue, WoW64Mode mode) -{ - return RegistryKeyWrapper::getValue (regValuePath, defaultValue, (DWORD) mode); -} - -bool JUCE_CALLTYPE WindowsRegistry::setValue (const String& regValuePath, const String& value, WoW64Mode mode) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_SZ, value.toWideCharPointer(), - CharPointer_UTF16::getBytesRequiredFor (value.getCharPointer()), mode); -} - -bool JUCE_CALLTYPE WindowsRegistry::setValue (const String& regValuePath, const uint32 value, WoW64Mode mode) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_DWORD, &value, sizeof (value), (DWORD) mode); -} - -bool JUCE_CALLTYPE WindowsRegistry::setValue (const String& regValuePath, const uint64 value, WoW64Mode mode) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_QWORD, &value, sizeof (value), (DWORD) mode); -} - -bool JUCE_CALLTYPE WindowsRegistry::setValue (const String& regValuePath, const MemoryBlock& value, WoW64Mode mode) -{ - return RegistryKeyWrapper::setValue (regValuePath, REG_BINARY, value.getData(), value.getSize(), (DWORD) mode); -} - -bool JUCE_CALLTYPE WindowsRegistry::valueExists (const String& regValuePath, WoW64Mode mode) -{ - return RegistryKeyWrapper::valueExists (regValuePath, (DWORD) mode); -} - -bool JUCE_CALLTYPE WindowsRegistry::keyExists (const String& regValuePath, WoW64Mode mode) -{ - return RegistryKeyWrapper::keyExists (regValuePath, (DWORD) mode); -} - -void JUCE_CALLTYPE WindowsRegistry::deleteValue (const String& regValuePath, WoW64Mode mode) -{ - const RegistryKeyWrapper key (regValuePath, true, (DWORD) mode); - - if (key.key != 0) - RegDeleteValue (key.key, key.wideCharValueName); -} - -void JUCE_CALLTYPE WindowsRegistry::deleteKey (const String& regKeyPath, WoW64Mode mode) -{ - const RegistryKeyWrapper key (regKeyPath, true, (DWORD) mode); - - if (key.key != 0) - RegDeleteKey (key.key, key.wideCharValueName); -} - -bool JUCE_CALLTYPE WindowsRegistry::registerFileAssociation (const String& fileExtension, - const String& symbolicDescription, - const String& fullDescription, - const File& targetExecutable, - const int iconResourceNumber, - const bool registerForCurrentUserOnly, - WoW64Mode mode) -{ - const char* const root = registerForCurrentUserOnly ? "HKEY_CURRENT_USER\\Software\\Classes\\" - : "HKEY_CLASSES_ROOT\\"; - const String key (root + symbolicDescription); - - return setValue (root + fileExtension + "\\", symbolicDescription, mode) - && setValue (key + "\\", fullDescription, mode) - && setValue (key + "\\shell\\open\\command\\", targetExecutable.getFullPathName() + " \"%1\"", mode) - && (iconResourceNumber == 0 - || setValue (key + "\\DefaultIcon\\", - targetExecutable.getFullPathName() + "," + String (iconResourceNumber))); -} - -// These methods are deprecated: -String WindowsRegistry::getValueWow64 (const String& p, const String& defVal) { return getValue (p, defVal, WoW64_64bit); } -bool WindowsRegistry::valueExistsWow64 (const String& p) { return valueExists (p, WoW64_64bit); } -bool WindowsRegistry::keyExistsWow64 (const String& p) { return keyExists (p, WoW64_64bit); } diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp b/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp deleted file mode 100755 index d98e323..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_SystemStats.cpp +++ /dev/null @@ -1,459 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -void Logger::outputDebugString (const String& text) -{ - OutputDebugString ((text + "\n").toWideCharPointer()); -} - -//============================================================================== -#ifdef JUCE_DLL_BUILD - JUCE_API void* juceDLL_malloc (size_t sz) { return std::malloc (sz); } - JUCE_API void juceDLL_free (void* block) { std::free (block); } -#endif - -//============================================================================== -#if JUCE_USE_MSVC_INTRINSICS - -// CPU info functions using intrinsics... - -#pragma intrinsic (__cpuid) -#pragma intrinsic (__rdtsc) - -static void callCPUID (int result[4], int infoType) -{ - __cpuid (result, infoType); -} - -#else - -static void callCPUID (int result[4], int infoType) -{ - #if ! JUCE_MINGW - __try - #endif - { - #if JUCE_GCC - __asm__ __volatile__ ("cpuid" : "=a" (result[0]), "=b" (result[1]), "=c" (result[2]),"=d" (result[3]) : "a" (infoType)); - #else - __asm - { - mov esi, result - mov eax, infoType - xor ecx, ecx - cpuid - mov dword ptr [esi + 0], eax - mov dword ptr [esi + 4], ebx - mov dword ptr [esi + 8], ecx - mov dword ptr [esi + 12], edx - } - #endif - } - #if ! JUCE_MINGW - __except (EXCEPTION_EXECUTE_HANDLER) {} - #endif -} - -#endif - -String SystemStats::getCpuVendor() -{ - int info[4] = { 0 }; - callCPUID (info, 0); - - char v [12]; - memcpy (v, info + 1, 4); - memcpy (v + 4, info + 3, 4); - memcpy (v + 8, info + 2, 4); - - return String (v, 12); -} - -//============================================================================== -void CPUInformation::initialise() noexcept -{ - int info[4] = { 0 }; - callCPUID (info, 1); - - // NB: IsProcessorFeaturePresent doesn't work on XP - hasMMX = (info[3] & (1 << 23)) != 0; - hasSSE = (info[3] & (1 << 25)) != 0; - hasSSE2 = (info[3] & (1 << 26)) != 0; - hasSSE3 = (info[2] & (1 << 0)) != 0; - has3DNow = (info[1] & (1 << 31)) != 0; - - SYSTEM_INFO systemInfo; - GetNativeSystemInfo (&systemInfo); - numCpus = (int) systemInfo.dwNumberOfProcessors; -} - -#if JUCE_MSVC && JUCE_CHECK_MEMORY_LEAKS -struct DebugFlagsInitialiser -{ - DebugFlagsInitialiser() - { - _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); - } -}; - -static DebugFlagsInitialiser debugFlagsInitialiser; -#endif - -//============================================================================== -static bool isWindowsVersionOrLater (SystemStats::OperatingSystemType target) -{ - OSVERSIONINFOEX info; - zerostruct (info); - info.dwOSVersionInfoSize = sizeof (OSVERSIONINFOEX); - - if (target >= SystemStats::WinVista) - { - info.dwMajorVersion = 6; - - switch (target) - { - case SystemStats::WinVista: break; - case SystemStats::Windows7: info.dwMinorVersion = 1; break; - case SystemStats::Windows8_0: info.dwMinorVersion = 2; break; - case SystemStats::Windows8_1: info.dwMinorVersion = 3; break; - default: jassertfalse; break; - } - } - else - { - info.dwMajorVersion = 5; - info.dwMinorVersion = target >= SystemStats::WinXP ? 1 : 0; - } - - DWORDLONG mask = 0; - - VER_SET_CONDITION (mask, VER_MAJORVERSION, VER_GREATER_EQUAL); - VER_SET_CONDITION (mask, VER_MINORVERSION, VER_GREATER_EQUAL); - VER_SET_CONDITION (mask, VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL); - VER_SET_CONDITION (mask, VER_SERVICEPACKMINOR, VER_GREATER_EQUAL); - - return VerifyVersionInfo (&info, - VER_MAJORVERSION | VER_MINORVERSION - | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR, - mask) != FALSE; -} - -SystemStats::OperatingSystemType SystemStats::getOperatingSystemType() -{ - const SystemStats::OperatingSystemType types[] - = { Windows8_1, Windows8_0, Windows7, WinVista, WinXP, Win2000 }; - - for (int i = 0; i < numElementsInArray (types); ++i) - if (isWindowsVersionOrLater (types[i])) - return types[i]; - - jassertfalse; // need to support whatever new version is running! - return UnknownOS; -} - -String SystemStats::getOperatingSystemName() -{ - const char* name = "Unknown OS"; - - switch (getOperatingSystemType()) - { - case Windows8_1: name = "Windows 8.1"; break; - case Windows8_0: name = "Windows 8.0"; break; - case Windows7: name = "Windows 7"; break; - case WinVista: name = "Windows Vista"; break; - case WinXP: name = "Windows XP"; break; - case Win2000: name = "Windows 2000"; break; - default: jassertfalse; break; // !! new type of OS? - } - - return name; -} - -String SystemStats::getDeviceDescription() -{ - return String(); -} - -bool SystemStats::isOperatingSystem64Bit() -{ - #if JUCE_64BIT - return true; - #else - typedef BOOL (WINAPI* LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); - - LPFN_ISWOW64PROCESS fnIsWow64Process - = (LPFN_ISWOW64PROCESS) GetProcAddress (GetModuleHandleA ("kernel32"), "IsWow64Process"); - - BOOL isWow64 = FALSE; - - return fnIsWow64Process != nullptr - && fnIsWow64Process (GetCurrentProcess(), &isWow64) - && isWow64 != FALSE; - #endif -} - -//============================================================================== -int SystemStats::getMemorySizeInMegabytes() -{ - MEMORYSTATUSEX mem; - mem.dwLength = sizeof (mem); - GlobalMemoryStatusEx (&mem); - return (int) (mem.ullTotalPhys / (1024 * 1024)) + 1; -} - -//============================================================================== -String SystemStats::getEnvironmentVariable (const String& name, const String& defaultValue) -{ - DWORD len = GetEnvironmentVariableW (name.toWideCharPointer(), nullptr, 0); - if (GetLastError() == ERROR_ENVVAR_NOT_FOUND) - return String (defaultValue); - - HeapBlock buffer (len); - len = GetEnvironmentVariableW (name.toWideCharPointer(), buffer, len); - - return String (CharPointer_wchar_t (buffer), - CharPointer_wchar_t (buffer + len)); -} - -//============================================================================== -uint32 juce_millisecondsSinceStartup() noexcept -{ - return (uint32) timeGetTime(); -} - -//============================================================================== -class HiResCounterHandler -{ -public: - HiResCounterHandler() - : hiResTicksOffset (0) - { - // This macro allows you to override the default timer-period - // used on Windows. By default this is set to 1, because that has - // always been the value used in JUCE apps, and changing it could - // affect the behaviour of existing code, but you may wish to make - // it larger (or set it to 0 to use the system default) to make your - // app less demanding on the CPU. - // For more info, see win32 documentation about the timeBeginPeriod - // function. - #ifndef JUCE_WIN32_TIMER_PERIOD - #define JUCE_WIN32_TIMER_PERIOD 1 - #endif - - #if JUCE_WIN32_TIMER_PERIOD > 0 - const MMRESULT res = timeBeginPeriod (JUCE_WIN32_TIMER_PERIOD); - (void) res; - jassert (res == TIMERR_NOERROR); - #endif - - LARGE_INTEGER f; - QueryPerformanceFrequency (&f); - hiResTicksPerSecond = f.QuadPart; - hiResTicksScaleFactor = 1000.0 / hiResTicksPerSecond; - } - - inline int64 getHighResolutionTicks() noexcept - { - LARGE_INTEGER ticks; - QueryPerformanceCounter (&ticks); - - const int64 mainCounterAsHiResTicks = (juce_millisecondsSinceStartup() * hiResTicksPerSecond) / 1000; - const int64 newOffset = mainCounterAsHiResTicks - ticks.QuadPart; - - // fix for a very obscure PCI hardware bug that can make the counter - // sometimes jump forwards by a few seconds.. - const int64 offsetDrift = abs64 (newOffset - hiResTicksOffset); - - if (offsetDrift > (hiResTicksPerSecond >> 1)) - hiResTicksOffset = newOffset; - - return ticks.QuadPart + hiResTicksOffset; - } - - inline double getMillisecondCounterHiRes() noexcept - { - return getHighResolutionTicks() * hiResTicksScaleFactor; - } - - int64 hiResTicksPerSecond, hiResTicksOffset; - double hiResTicksScaleFactor; -}; - -static HiResCounterHandler hiResCounterHandler; - -int64 Time::getHighResolutionTicksPerSecond() noexcept { return hiResCounterHandler.hiResTicksPerSecond; } -int64 Time::getHighResolutionTicks() noexcept { return hiResCounterHandler.getHighResolutionTicks(); } -double Time::getMillisecondCounterHiRes() noexcept { return hiResCounterHandler.getMillisecondCounterHiRes(); } - -//============================================================================== -static int64 juce_getClockCycleCounter() noexcept -{ - #if JUCE_USE_MSVC_INTRINSICS - // MS intrinsics version... - return (int64) __rdtsc(); - - #elif JUCE_GCC - // GNU inline asm version... - unsigned int hi = 0, lo = 0; - - __asm__ __volatile__ ( - "xor %%eax, %%eax \n\ - xor %%edx, %%edx \n\ - rdtsc \n\ - movl %%eax, %[lo] \n\ - movl %%edx, %[hi]" - : - : [hi] "m" (hi), - [lo] "m" (lo) - : "cc", "eax", "ebx", "ecx", "edx", "memory"); - - return (int64) ((((uint64) hi) << 32) | lo); - #else - // MSVC inline asm version... - unsigned int hi = 0, lo = 0; - - __asm - { - xor eax, eax - xor edx, edx - rdtsc - mov lo, eax - mov hi, edx - } - - return (int64) ((((uint64) hi) << 32) | lo); - #endif -} - -int SystemStats::getCpuSpeedInMegaherz() -{ - const int64 cycles = juce_getClockCycleCounter(); - const uint32 millis = Time::getMillisecondCounter(); - int lastResult = 0; - - for (;;) - { - int n = 1000000; - while (--n > 0) {} - - const uint32 millisElapsed = Time::getMillisecondCounter() - millis; - const int64 cyclesNow = juce_getClockCycleCounter(); - - if (millisElapsed > 80) - { - const int newResult = (int) (((cyclesNow - cycles) / millisElapsed) / 1000); - - if (millisElapsed > 500 || (lastResult == newResult && newResult > 100)) - return newResult; - - lastResult = newResult; - } - } -} - - -//============================================================================== -bool Time::setSystemTimeToThisTime() const -{ - SYSTEMTIME st; - - st.wDayOfWeek = 0; - st.wYear = (WORD) getYear(); - st.wMonth = (WORD) (getMonth() + 1); - st.wDay = (WORD) getDayOfMonth(); - st.wHour = (WORD) getHours(); - st.wMinute = (WORD) getMinutes(); - st.wSecond = (WORD) getSeconds(); - st.wMilliseconds = (WORD) (millisSinceEpoch % 1000); - - // do this twice because of daylight saving conversion problems - the - // first one sets it up, the second one kicks it in. - return SetLocalTime (&st) != 0 - && SetLocalTime (&st) != 0; -} - -int SystemStats::getPageSize() -{ - SYSTEM_INFO systemInfo; - GetNativeSystemInfo (&systemInfo); - - return (int) systemInfo.dwPageSize; -} - -//============================================================================== -String SystemStats::getLogonName() -{ - TCHAR text [256] = { 0 }; - DWORD len = (DWORD) numElementsInArray (text) - 1; - GetUserName (text, &len); - return String (text, len); -} - -String SystemStats::getFullUserName() -{ - return getLogonName(); -} - -String SystemStats::getComputerName() -{ - TCHAR text [MAX_COMPUTERNAME_LENGTH + 1] = { 0 }; - DWORD len = (DWORD) numElementsInArray (text) - 1; - GetComputerName (text, &len); - return String (text, len); -} - -static String getLocaleValue (LCID locale, LCTYPE key, const char* defaultValue) -{ - TCHAR buffer [256] = { 0 }; - if (GetLocaleInfo (locale, key, buffer, 255) > 0) - return buffer; - - return defaultValue; -} - -String SystemStats::getUserLanguage() { return getLocaleValue (LOCALE_USER_DEFAULT, LOCALE_SISO639LANGNAME, "en"); } -String SystemStats::getUserRegion() { return getLocaleValue (LOCALE_USER_DEFAULT, LOCALE_SISO3166CTRYNAME, "US"); } - -String SystemStats::getDisplayLanguage() -{ - DynamicLibrary dll ("kernel32.dll"); - JUCE_LOAD_WINAPI_FUNCTION (dll, GetUserDefaultUILanguage, getUserDefaultUILanguage, LANGID, (void)) - - if (getUserDefaultUILanguage == nullptr) - return "en"; - - const DWORD langID = MAKELCID (getUserDefaultUILanguage(), SORT_DEFAULT); - - String mainLang (getLocaleValue (langID, LOCALE_SISO639LANGNAME, "en")); - String region (getLocaleValue (langID, LOCALE_SISO3166CTRYNAME, nullptr)); - - if (region.isNotEmpty()) - mainLang << '-' << region; - - return mainLang; -} diff --git a/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp b/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp deleted file mode 100755 index 116bbd6..0000000 --- a/JuceLibraryCode/modules/juce_core/native/juce_win32_Threads.cpp +++ /dev/null @@ -1,625 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -HWND juce_messageWindowHandle = 0; // (this is used by other parts of the codebase) - -void* getUser32Function (const char* functionName) -{ - HMODULE module = GetModuleHandleA ("user32.dll"); - jassert (module != 0); - return (void*) GetProcAddress (module, functionName); -} - -//============================================================================== -#if ! JUCE_USE_MSVC_INTRINSICS -// In newer compilers, the inline versions of these are used (in juce_Atomic.h), but in -// older ones we have to actually call the ops as win32 functions.. -long juce_InterlockedExchange (volatile long* a, long b) noexcept { return InterlockedExchange (a, b); } -long juce_InterlockedIncrement (volatile long* a) noexcept { return InterlockedIncrement (a); } -long juce_InterlockedDecrement (volatile long* a) noexcept { return InterlockedDecrement (a); } -long juce_InterlockedExchangeAdd (volatile long* a, long b) noexcept { return InterlockedExchangeAdd (a, b); } -long juce_InterlockedCompareExchange (volatile long* a, long b, long c) noexcept { return InterlockedCompareExchange (a, b, c); } - -__int64 juce_InterlockedCompareExchange64 (volatile __int64* value, __int64 newValue, __int64 valueToCompare) noexcept -{ - jassertfalse; // This operation isn't available in old MS compiler versions! - - __int64 oldValue = *value; - if (oldValue == valueToCompare) - *value = newValue; - - return oldValue; -} - -#endif - -//============================================================================== -CriticalSection::CriticalSection() noexcept -{ - // (just to check the MS haven't changed this structure and broken things...) - #if JUCE_VC7_OR_EARLIER - static_jassert (sizeof (CRITICAL_SECTION) <= 24); - #else - static_jassert (sizeof (CRITICAL_SECTION) <= sizeof (lock)); - #endif - - InitializeCriticalSection ((CRITICAL_SECTION*) lock); -} - -CriticalSection::~CriticalSection() noexcept { DeleteCriticalSection ((CRITICAL_SECTION*) lock); } -void CriticalSection::enter() const noexcept { EnterCriticalSection ((CRITICAL_SECTION*) lock); } -bool CriticalSection::tryEnter() const noexcept { return TryEnterCriticalSection ((CRITICAL_SECTION*) lock) != FALSE; } -void CriticalSection::exit() const noexcept { LeaveCriticalSection ((CRITICAL_SECTION*) lock); } - - -//============================================================================== -WaitableEvent::WaitableEvent (const bool manualReset) noexcept - : handle (CreateEvent (0, manualReset ? TRUE : FALSE, FALSE, 0)) {} - -WaitableEvent::~WaitableEvent() noexcept { CloseHandle (handle); } - -void WaitableEvent::signal() const noexcept { SetEvent (handle); } -void WaitableEvent::reset() const noexcept { ResetEvent (handle); } - -bool WaitableEvent::wait (const int timeOutMs) const noexcept -{ - return WaitForSingleObject (handle, (DWORD) timeOutMs) == WAIT_OBJECT_0; -} - -//============================================================================== -void JUCE_API juce_threadEntryPoint (void*); - -static unsigned int __stdcall threadEntryProc (void* userData) -{ - if (juce_messageWindowHandle != 0) - AttachThreadInput (GetWindowThreadProcessId (juce_messageWindowHandle, 0), - GetCurrentThreadId(), TRUE); - - juce_threadEntryPoint (userData); - - _endthreadex (0); - return 0; -} - -void Thread::launchThread() -{ - unsigned int newThreadId; - threadHandle = (void*) _beginthreadex (0, 0, &threadEntryProc, this, 0, &newThreadId); - threadId = (ThreadID)(std::uintptr_t)newThreadId; -} - -void Thread::closeThreadHandle() -{ - CloseHandle ((HANDLE) threadHandle); - threadId = 0; - threadHandle = 0; -} - -void Thread::killThread() -{ - if (threadHandle != 0) - { - #if JUCE_DEBUG - OutputDebugStringA ("** Warning - Forced thread termination **\n"); - #endif - TerminateThread (threadHandle, 0); - } -} - -void JUCE_CALLTYPE Thread::setCurrentThreadName (const String& name) -{ - #if JUCE_DEBUG && JUCE_MSVC - struct - { - DWORD dwType; - LPCSTR szName; - DWORD dwThreadID; - DWORD dwFlags; - } info; - - info.dwType = 0x1000; - info.szName = name.toUTF8(); - info.dwThreadID = GetCurrentThreadId(); - info.dwFlags = 0; - - __try - { - RaiseException (0x406d1388 /*MS_VC_EXCEPTION*/, 0, sizeof (info) / sizeof (ULONG_PTR), (ULONG_PTR*) &info); - } - __except (EXCEPTION_CONTINUE_EXECUTION) - {} - #else - (void) name; - #endif -} - -Thread::ThreadID JUCE_CALLTYPE Thread::getCurrentThreadId() -{ - return (ThreadID) (pointer_sized_int) GetCurrentThreadId(); -} - -bool Thread::setThreadPriority (void* handle, int priority) -{ - int pri = THREAD_PRIORITY_TIME_CRITICAL; - - if (priority < 1) pri = THREAD_PRIORITY_IDLE; - else if (priority < 2) pri = THREAD_PRIORITY_LOWEST; - else if (priority < 5) pri = THREAD_PRIORITY_BELOW_NORMAL; - else if (priority < 7) pri = THREAD_PRIORITY_NORMAL; - else if (priority < 9) pri = THREAD_PRIORITY_ABOVE_NORMAL; - else if (priority < 10) pri = THREAD_PRIORITY_HIGHEST; - - if (handle == 0) - handle = GetCurrentThread(); - - return SetThreadPriority (handle, pri) != FALSE; -} - -void JUCE_CALLTYPE Thread::setCurrentThreadAffinityMask (const uint32 affinityMask) -{ - SetThreadAffinityMask (GetCurrentThread(), affinityMask); -} - -//============================================================================== -struct SleepEvent -{ - SleepEvent() noexcept - : handle (CreateEvent (nullptr, FALSE, FALSE, - #if JUCE_DEBUG - _T("JUCE Sleep Event"))) - #else - nullptr)) - #endif - {} - - ~SleepEvent() noexcept - { - CloseHandle (handle); - handle = 0; - } - - HANDLE handle; -}; - -static SleepEvent sleepEvent; - -void JUCE_CALLTYPE Thread::sleep (const int millisecs) -{ - jassert (millisecs >= 0); - - if (millisecs >= 10 || sleepEvent.handle == 0) - Sleep ((DWORD) millisecs); - else - // unlike Sleep() this is guaranteed to return to the current thread after - // the time expires, so we'll use this for short waits, which are more likely - // to need to be accurate - WaitForSingleObject (sleepEvent.handle, (DWORD) millisecs); -} - -void Thread::yield() -{ - Sleep (0); -} - -//============================================================================== -static int lastProcessPriority = -1; - -// called when the app gains focus because Windows does weird things to process priority -// when you swap apps, and this forces an update when the app is brought to the front. -void juce_repeatLastProcessPriority() -{ - if (lastProcessPriority >= 0) // (avoid changing this if it's not been explicitly set by the app..) - { - DWORD p; - - switch (lastProcessPriority) - { - case Process::LowPriority: p = IDLE_PRIORITY_CLASS; break; - case Process::NormalPriority: p = NORMAL_PRIORITY_CLASS; break; - case Process::HighPriority: p = HIGH_PRIORITY_CLASS; break; - case Process::RealtimePriority: p = REALTIME_PRIORITY_CLASS; break; - default: jassertfalse; return; // bad priority value - } - - SetPriorityClass (GetCurrentProcess(), p); - } -} - -void JUCE_CALLTYPE Process::setPriority (ProcessPriority prior) -{ - if (lastProcessPriority != (int) prior) - { - lastProcessPriority = (int) prior; - juce_repeatLastProcessPriority(); - } -} - -JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger() -{ - return IsDebuggerPresent() != FALSE; -} - -bool JUCE_CALLTYPE Process::isRunningUnderDebugger() -{ - return juce_isRunningUnderDebugger(); -} - -static void* currentModuleHandle = nullptr; - -void* JUCE_CALLTYPE Process::getCurrentModuleInstanceHandle() noexcept -{ - if (currentModuleHandle == nullptr) - currentModuleHandle = GetModuleHandleA (nullptr); - - return currentModuleHandle; -} - -void JUCE_CALLTYPE Process::setCurrentModuleInstanceHandle (void* const newHandle) noexcept -{ - currentModuleHandle = newHandle; -} - -void JUCE_CALLTYPE Process::raisePrivilege() -{ - jassertfalse; // xxx not implemented -} - -void JUCE_CALLTYPE Process::lowerPrivilege() -{ - jassertfalse; // xxx not implemented -} - -void JUCE_CALLTYPE Process::terminate() -{ - #if JUCE_MSVC && JUCE_CHECK_MEMORY_LEAKS - _CrtDumpMemoryLeaks(); - #endif - - // bullet in the head in case there's a problem shutting down.. - ExitProcess (1); -} - -bool juce_isRunningInWine() -{ - HMODULE ntdll = GetModuleHandleA ("ntdll"); - return ntdll != 0 && GetProcAddress (ntdll, "wine_get_version") != nullptr; -} - -//============================================================================== -bool DynamicLibrary::open (const String& name) -{ - close(); - - JUCE_TRY - { - handle = LoadLibrary (name.toWideCharPointer()); - } - JUCE_CATCH_ALL - - return handle != nullptr; -} - -void DynamicLibrary::close() -{ - JUCE_TRY - { - if (handle != nullptr) - { - FreeLibrary ((HMODULE) handle); - handle = nullptr; - } - } - JUCE_CATCH_ALL -} - -void* DynamicLibrary::getFunction (const String& functionName) noexcept -{ - return handle != nullptr ? (void*) GetProcAddress ((HMODULE) handle, functionName.toUTF8()) // (void* cast is required for mingw) - : nullptr; -} - - -//============================================================================== -class InterProcessLock::Pimpl -{ -public: - Pimpl (String name, const int timeOutMillisecs) - : handle (0), refCount (1) - { - name = name.replaceCharacter ('\\', '/'); - handle = CreateMutexW (0, TRUE, ("Global\\" + name).toWideCharPointer()); - - // Not 100% sure why a global mutex sometimes can't be allocated, but if it fails, fall back to - // a local one. (A local one also sometimes fails on other machines so neither type appears to be - // universally reliable) - if (handle == 0) - handle = CreateMutexW (0, TRUE, ("Local\\" + name).toWideCharPointer()); - - if (handle != 0 && GetLastError() == ERROR_ALREADY_EXISTS) - { - if (timeOutMillisecs == 0) - { - close(); - return; - } - - switch (WaitForSingleObject (handle, timeOutMillisecs < 0 ? INFINITE : timeOutMillisecs)) - { - case WAIT_OBJECT_0: - case WAIT_ABANDONED: - break; - - case WAIT_TIMEOUT: - default: - close(); - break; - } - } - } - - ~Pimpl() - { - close(); - } - - void close() - { - if (handle != 0) - { - ReleaseMutex (handle); - CloseHandle (handle); - handle = 0; - } - } - - HANDLE handle; - int refCount; -}; - -InterProcessLock::InterProcessLock (const String& name_) - : name (name_) -{ -} - -InterProcessLock::~InterProcessLock() -{ -} - -bool InterProcessLock::enter (const int timeOutMillisecs) -{ - const ScopedLock sl (lock); - - if (pimpl == nullptr) - { - pimpl = new Pimpl (name, timeOutMillisecs); - - if (pimpl->handle == 0) - pimpl = nullptr; - } - else - { - pimpl->refCount++; - } - - return pimpl != nullptr; -} - -void InterProcessLock::exit() -{ - const ScopedLock sl (lock); - - // Trying to release the lock too many times! - jassert (pimpl != nullptr); - - if (pimpl != nullptr && --(pimpl->refCount) == 0) - pimpl = nullptr; -} - -//============================================================================== -class ChildProcess::ActiveProcess -{ -public: - ActiveProcess (const String& command, int streamFlags) - : ok (false), readPipe (0), writePipe (0) - { - SECURITY_ATTRIBUTES securityAtts = { 0 }; - securityAtts.nLength = sizeof (securityAtts); - securityAtts.bInheritHandle = TRUE; - - if (CreatePipe (&readPipe, &writePipe, &securityAtts, 0) - && SetHandleInformation (readPipe, HANDLE_FLAG_INHERIT, 0)) - { - STARTUPINFOW startupInfo = { 0 }; - startupInfo.cb = sizeof (startupInfo); - - startupInfo.hStdOutput = (streamFlags | wantStdOut) != 0 ? writePipe : 0; - startupInfo.hStdError = (streamFlags | wantStdErr) != 0 ? writePipe : 0; - startupInfo.dwFlags = STARTF_USESTDHANDLES; - - ok = CreateProcess (nullptr, const_cast (command.toWideCharPointer()), - nullptr, nullptr, TRUE, CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT, - nullptr, nullptr, &startupInfo, &processInfo) != FALSE; - } - } - - ~ActiveProcess() - { - if (ok) - { - CloseHandle (processInfo.hThread); - CloseHandle (processInfo.hProcess); - } - - if (readPipe != 0) - CloseHandle (readPipe); - - if (writePipe != 0) - CloseHandle (writePipe); - } - - bool isRunning() const noexcept - { - return WaitForSingleObject (processInfo.hProcess, 0) != WAIT_OBJECT_0; - } - - int read (void* dest, int numNeeded) const noexcept - { - int total = 0; - - while (ok && numNeeded > 0) - { - DWORD available = 0; - - if (! PeekNamedPipe ((HANDLE) readPipe, nullptr, 0, nullptr, &available, nullptr)) - break; - - const int numToDo = jmin ((int) available, numNeeded); - - if (available == 0) - { - if (! isRunning()) - break; - - Thread::yield(); - } - else - { - DWORD numRead = 0; - if (! ReadFile ((HANDLE) readPipe, dest, numToDo, &numRead, nullptr)) - break; - - total += numRead; - dest = addBytesToPointer (dest, numRead); - numNeeded -= numRead; - } - } - - return total; - } - - bool killProcess() const noexcept - { - return TerminateProcess (processInfo.hProcess, 0) != FALSE; - } - - uint32 getExitCode() const noexcept - { - DWORD exitCode = 0; - GetExitCodeProcess (processInfo.hProcess, &exitCode); - return (uint32) exitCode; - } - - bool ok; - -private: - HANDLE readPipe, writePipe; - PROCESS_INFORMATION processInfo; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ActiveProcess) -}; - -bool ChildProcess::start (const String& command, int streamFlags) -{ - activeProcess = new ActiveProcess (command, streamFlags); - - if (! activeProcess->ok) - activeProcess = nullptr; - - return activeProcess != nullptr; -} - -bool ChildProcess::start (const StringArray& args, int streamFlags) -{ - String escaped; - - for (int i = 0; i < args.size(); ++i) - { - String arg (args[i]); - - // If there are spaces, surround it with quotes. If there are quotes, - // replace them with \" so that CommandLineToArgv will correctly parse them. - if (arg.containsAnyOf ("\" ")) - arg = arg.replace ("\"", "\\\"").quoted(); - - escaped << arg << ' '; - } - - return start (escaped.trim(), streamFlags); -} - -//============================================================================== -struct HighResolutionTimer::Pimpl -{ - Pimpl (HighResolutionTimer& t) noexcept : owner (t), periodMs (0) - { - } - - ~Pimpl() - { - jassert (periodMs == 0); - } - - void start (int newPeriod) - { - if (newPeriod != periodMs) - { - stop(); - periodMs = newPeriod; - - TIMECAPS tc; - if (timeGetDevCaps (&tc, sizeof (tc)) == TIMERR_NOERROR) - { - const int actualPeriod = jlimit ((int) tc.wPeriodMin, (int) tc.wPeriodMax, newPeriod); - - timerID = timeSetEvent (actualPeriod, tc.wPeriodMin, callbackFunction, (DWORD_PTR) this, - TIME_PERIODIC | TIME_CALLBACK_FUNCTION | 0x100 /*TIME_KILL_SYNCHRONOUS*/); - } - } - } - - void stop() - { - periodMs = 0; - timeKillEvent (timerID); - } - - HighResolutionTimer& owner; - int periodMs; - -private: - unsigned int timerID; - - static void __stdcall callbackFunction (UINT, UINT, DWORD_PTR userInfo, DWORD_PTR, DWORD_PTR) - { - if (Pimpl* const timer = reinterpret_cast (userInfo)) - if (timer->periodMs != 0) - timer->owner.hiResTimerCallback(); - } - - JUCE_DECLARE_NON_COPYABLE (Pimpl) -}; diff --git a/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp b/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp deleted file mode 100755 index 6c4d087..0000000 --- a/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.cpp +++ /dev/null @@ -1,149 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -IPAddress::IPAddress() noexcept -{ - address[0] = 0; address[1] = 0; - address[2] = 0; address[3] = 0; -} - -IPAddress::IPAddress (const uint8 bytes[4]) noexcept -{ - address[0] = bytes[0]; address[1] = bytes[1]; - address[2] = bytes[2]; address[3] = bytes[3]; -} - -IPAddress::IPAddress (uint8 a0, uint8 a1, uint8 a2, uint8 a3) noexcept -{ - address[0] = a0; address[1] = a1; - address[2] = a2; address[3] = a3; -} - -IPAddress::IPAddress (uint32 n) noexcept -{ - address[0] = (n >> 24); - address[1] = (n >> 16) & 255; - address[2] = (n >> 8) & 255; - address[3] = (n & 255); -} - -IPAddress::IPAddress (const String& adr) -{ - StringArray tokens; - tokens.addTokens (adr, ".", String()); - - for (int i = 0; i < 4; ++i) - address[i] = (uint8) tokens[i].getIntValue(); -} - -String IPAddress::toString() const -{ - String s ((int) address[0]); - - for (int i = 1; i < 4; ++i) - s << '.' << (int) address[i]; - - return s; -} - -IPAddress IPAddress::any() noexcept { return IPAddress(); } -IPAddress IPAddress::broadcast() noexcept { return IPAddress (255, 255, 255, 255); } -IPAddress IPAddress::local() noexcept { return IPAddress (127, 0, 0, 1); } - -bool IPAddress::operator== (const IPAddress& other) const noexcept -{ - return address[0] == other.address[0] - && address[1] == other.address[1] - && address[2] == other.address[2] - && address[3] == other.address[3]; -} - -bool IPAddress::operator!= (const IPAddress& other) const noexcept -{ - return ! operator== (other); -} - -#if ! JUCE_WINDOWS -static void addAddress (const sockaddr_in* addr_in, Array& result) -{ - in_addr_t addr = addr_in->sin_addr.s_addr; - - if (addr != INADDR_NONE) - result.addIfNotAlreadyThere (IPAddress (ntohl (addr))); -} - -static void findIPAddresses (int sock, Array& result) -{ - ifconf cfg; - HeapBlock buffer; - int bufferSize = 1024; - - do - { - bufferSize *= 2; - buffer.calloc ((size_t) bufferSize); - - cfg.ifc_len = bufferSize; - cfg.ifc_buf = buffer; - - if (ioctl (sock, SIOCGIFCONF, &cfg) < 0 && errno != EINVAL) - return; - - } while (bufferSize < cfg.ifc_len + 2 * (int) (IFNAMSIZ + sizeof (struct sockaddr_in6))); - - #if JUCE_MAC || JUCE_IOS - while (cfg.ifc_len >= (int) (IFNAMSIZ + sizeof (struct sockaddr_in))) - { - if (cfg.ifc_req->ifr_addr.sa_family == AF_INET) // Skip non-internet addresses - addAddress ((const sockaddr_in*) &cfg.ifc_req->ifr_addr, result); - - cfg.ifc_len -= IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len; - cfg.ifc_buf += IFNAMSIZ + cfg.ifc_req->ifr_addr.sa_len; - } - #else - for (size_t i = 0; i < cfg.ifc_len / sizeof (struct ifreq); ++i) - { - const ifreq& item = cfg.ifc_req[i]; - - if (item.ifr_addr.sa_family == AF_INET) - addAddress ((const sockaddr_in*) &item.ifr_addr, result); - } - #endif -} - -void IPAddress::findAllAddresses (Array& result) -{ - const int sock = socket (AF_INET, SOCK_DGRAM, 0); // a dummy socket to execute the IO control - - if (sock >= 0) - { - findIPAddresses (sock, result); - ::close (sock); - } -} -#endif diff --git a/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h b/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h deleted file mode 100755 index 1f2f0e8..0000000 --- a/JuceLibraryCode/modules/juce_core/network/juce_IPAddress.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_IPADDRESS_H_INCLUDED -#define JUCE_IPADDRESS_H_INCLUDED - - -//============================================================================== -/** - An IPV4 address. -*/ -class JUCE_API IPAddress -{ -public: - //============================================================================== - /** Populates a list of all the IP addresses that this machine is using. */ - static void findAllAddresses (Array& results); - - //============================================================================== - /** Creates a null address (0.0.0.0). */ - IPAddress() noexcept; - - /** Creates an address from 4 bytes. */ - explicit IPAddress (const uint8 bytes[4]) noexcept; - - /** Creates an address from 4 bytes. */ - IPAddress (uint8 address1, uint8 address2, uint8 address3, uint8 address4) noexcept; - - /** Creates an address from a packed 32-bit integer, where the MSB is - the first number in the address, and the LSB is the last. - */ - explicit IPAddress (uint32 asNativeEndian32Bit) noexcept; - - /** Parses a string IP address of the form "a.b.c.d". */ - explicit IPAddress (const String& address); - - /** Returns a dot-separated string in the form "1.2.3.4" */ - String toString() const; - - /** Returns an address meaning "any" (0.0.0.0) */ - static IPAddress any() noexcept; - - /** Returns an address meaning "broadcast" (255.255.255.255) */ - static IPAddress broadcast() noexcept; - - /** Returns an address meaning "localhost" (127.0.0.1) */ - static IPAddress local() noexcept; - - bool operator== (const IPAddress& other) const noexcept; - bool operator!= (const IPAddress& other) const noexcept; - - /** The elements of the IP address. */ - uint8 address[4]; -}; - - -#endif // JUCE_IPADDRESS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp b/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp deleted file mode 100755 index b7cb3c1..0000000 --- a/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.cpp +++ /dev/null @@ -1,78 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -MACAddress::MACAddress() -{ - zeromem (address, sizeof (address)); -} - -MACAddress::MACAddress (const MACAddress& other) -{ - memcpy (address, other.address, sizeof (address)); -} - -MACAddress& MACAddress::operator= (const MACAddress& other) -{ - memcpy (address, other.address, sizeof (address)); - return *this; -} - -MACAddress::MACAddress (const uint8 bytes[6]) -{ - memcpy (address, bytes, sizeof (address)); -} - -String MACAddress::toString() const -{ - String s; - - for (size_t i = 0; i < sizeof (address); ++i) - { - s << String::toHexString ((int) address[i]).paddedLeft ('0', 2); - - if (i < sizeof (address) - 1) - s << '-'; - } - - return s; -} - -int64 MACAddress::toInt64() const noexcept -{ - int64 n = 0; - - for (int i = (int) sizeof (address); --i >= 0;) - n = (n << 8) | address[i]; - - return n; -} - -bool MACAddress::isNull() const noexcept { return toInt64() == 0; } - -bool MACAddress::operator== (const MACAddress& other) const noexcept { return memcmp (address, other.address, sizeof (address)) == 0; } -bool MACAddress::operator!= (const MACAddress& other) const noexcept { return ! operator== (other); } diff --git a/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h b/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h deleted file mode 100755 index 67e119e..0000000 --- a/JuceLibraryCode/modules/juce_core/network/juce_MACAddress.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_MACADDRESS_H_INCLUDED -#define JUCE_MACADDRESS_H_INCLUDED - - -//============================================================================== -/** - Represents a MAC network card adapter address ID. -*/ -class JUCE_API MACAddress -{ -public: - //============================================================================== - /** Populates a list of the MAC addresses of all the available network cards. */ - static void findAllAddresses (Array& results); - - //============================================================================== - /** Creates a null address (00-00-00-00-00-00). */ - MACAddress(); - - /** Creates a copy of another address. */ - MACAddress (const MACAddress&); - - /** Creates a copy of another address. */ - MACAddress& operator= (const MACAddress&); - - /** Creates an address from 6 bytes. */ - explicit MACAddress (const uint8 bytes[6]); - - /** Returns a pointer to the 6 bytes that make up this address. */ - const uint8* getBytes() const noexcept { return address; } - - /** Returns a dash-separated string in the form "11-22-33-44-55-66" */ - String toString() const; - - /** Returns the address in the lower 6 bytes of an int64. - - This uses a little-endian arrangement, with the first byte of the address being - stored in the least-significant byte of the result value. - */ - int64 toInt64() const noexcept; - - /** Returns true if this address is null (00-00-00-00-00-00). */ - bool isNull() const noexcept; - - bool operator== (const MACAddress&) const noexcept; - bool operator!= (const MACAddress&) const noexcept; - - //============================================================================== -private: - uint8 address[6]; -}; - - -#endif // JUCE_MACADDRESS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp b/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp deleted file mode 100755 index 488e63f..0000000 --- a/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -NamedPipe::NamedPipe() -{ -} - -NamedPipe::~NamedPipe() -{ - close(); -} - -bool NamedPipe::openExisting (const String& pipeName) -{ - close(); - - ScopedWriteLock sl (lock); - currentPipeName = pipeName; - return openInternal (pipeName, false); -} - -bool NamedPipe::isOpen() const -{ - return pimpl != nullptr; -} - -bool NamedPipe::createNewPipe (const String& pipeName) -{ - close(); - - ScopedWriteLock sl (lock); - currentPipeName = pipeName; - return openInternal (pipeName, true); -} - -String NamedPipe::getName() const -{ - return currentPipeName; -} - -// other methods for this class are implemented in the platform-specific files diff --git a/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h b/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h deleted file mode 100755 index d2029bd..0000000 --- a/JuceLibraryCode/modules/juce_core/network/juce_NamedPipe.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_NAMEDPIPE_H_INCLUDED -#define JUCE_NAMEDPIPE_H_INCLUDED - - -//============================================================================== -/** - A cross-process pipe that can have data written to and read from it. - - Two processes can use NamedPipe objects to exchange blocks of data. - - @see InterprocessConnection -*/ -class JUCE_API NamedPipe -{ -public: - //============================================================================== - /** Creates a NamedPipe. */ - NamedPipe(); - - /** Destructor. */ - ~NamedPipe(); - - //============================================================================== - /** Tries to open a pipe that already exists. - Returns true if it succeeds. - */ - bool openExisting (const String& pipeName); - - /** Tries to create a new pipe. - Returns true if it succeeds. - */ - bool createNewPipe (const String& pipeName); - - /** Closes the pipe, if it's open. */ - void close(); - - /** True if the pipe is currently open. */ - bool isOpen() const; - - /** Returns the last name that was used to try to open this pipe. */ - String getName() const; - - //============================================================================== - /** Reads data from the pipe. - - This will block until another thread has written enough data into the pipe to fill - the number of bytes specified, or until another thread calls the cancelPendingReads() - method. - - If the operation fails, it returns -1, otherwise, it will return the number of - bytes read. - - If timeOutMilliseconds is less than zero, it will wait indefinitely, otherwise - this is a maximum timeout for reading from the pipe. - */ - int read (void* destBuffer, int maxBytesToRead, int timeOutMilliseconds); - - /** Writes some data to the pipe. - @returns the number of bytes written, or -1 on failure. - */ - int write (const void* sourceBuffer, int numBytesToWrite, int timeOutMilliseconds); - -private: - //============================================================================== - JUCE_PUBLIC_IN_DLL_BUILD (class Pimpl) - ScopedPointer pimpl; - String currentPipeName; - ReadWriteLock lock; - - bool openInternal (const String& pipeName, const bool createPipe); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (NamedPipe) -}; - - -#endif // JUCE_NAMEDPIPE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp b/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp deleted file mode 100755 index 291b580..0000000 --- a/JuceLibraryCode/modules/juce_core/network/juce_Socket.cpp +++ /dev/null @@ -1,604 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable : 4127 4389 4018) -#endif - -#ifndef AI_NUMERICSERV // (missing in older Mac SDKs) - #define AI_NUMERICSERV 0x1000 -#endif - -#if JUCE_WINDOWS - typedef int juce_socklen_t; - typedef SOCKET SocketHandle; -#else - typedef socklen_t juce_socklen_t; - typedef int SocketHandle; -#endif - -//============================================================================== -namespace SocketHelpers -{ - static void initSockets() - { - #if JUCE_WINDOWS - static bool socketsStarted = false; - - if (! socketsStarted) - { - socketsStarted = true; - - WSADATA wsaData; - const WORD wVersionRequested = MAKEWORD (1, 1); - WSAStartup (wVersionRequested, &wsaData); - } - #endif - } - - static bool resetSocketOptions (const SocketHandle handle, const bool isDatagram, const bool allowBroadcast) noexcept - { - const int sndBufSize = 65536; - const int rcvBufSize = 65536; - const int one = 1; - - return handle > 0 - && setsockopt (handle, SOL_SOCKET, SO_RCVBUF, (const char*) &rcvBufSize, sizeof (rcvBufSize)) == 0 - && setsockopt (handle, SOL_SOCKET, SO_SNDBUF, (const char*) &sndBufSize, sizeof (sndBufSize)) == 0 - && (isDatagram ? ((! allowBroadcast) || setsockopt (handle, SOL_SOCKET, SO_BROADCAST, (const char*) &one, sizeof (one)) == 0) - : (setsockopt (handle, IPPROTO_TCP, TCP_NODELAY, (const char*) &one, sizeof (one)) == 0)); - } - - static bool bindSocketToPort (const SocketHandle handle, const int port) noexcept - { - if (handle <= 0 || port <= 0) - return false; - - struct sockaddr_in servTmpAddr; - zerostruct (servTmpAddr); // (can't use "= { 0 }" on this object because it's typedef'ed as a C struct) - servTmpAddr.sin_family = PF_INET; - servTmpAddr.sin_addr.s_addr = htonl (INADDR_ANY); - servTmpAddr.sin_port = htons ((uint16) port); - - return bind (handle, (struct sockaddr*) &servTmpAddr, sizeof (struct sockaddr_in)) >= 0; - } - - static int readSocket (const SocketHandle handle, - void* const destBuffer, const int maxBytesToRead, - bool volatile& connected, - const bool blockUntilSpecifiedAmountHasArrived) noexcept - { - int bytesRead = 0; - - while (bytesRead < maxBytesToRead) - { - int bytesThisTime; - - #if JUCE_WINDOWS - bytesThisTime = recv (handle, static_cast (destBuffer) + bytesRead, maxBytesToRead - bytesRead, 0); - #else - while ((bytesThisTime = (int) ::read (handle, addBytesToPointer (destBuffer, bytesRead), - (size_t) (maxBytesToRead - bytesRead))) < 0 - && errno == EINTR - && connected) - { - } - #endif - - if (bytesThisTime <= 0 || ! connected) - { - if (bytesRead == 0) - bytesRead = -1; - - break; - } - - bytesRead += bytesThisTime; - - if (! blockUntilSpecifiedAmountHasArrived) - break; - } - - return bytesRead; - } - - static int waitForReadiness (const SocketHandle handle, const bool forReading, const int timeoutMsecs) noexcept - { - struct timeval timeout; - struct timeval* timeoutp; - - if (timeoutMsecs >= 0) - { - timeout.tv_sec = timeoutMsecs / 1000; - timeout.tv_usec = (timeoutMsecs % 1000) * 1000; - timeoutp = &timeout; - } - else - { - timeoutp = 0; - } - - fd_set rset, wset; - FD_ZERO (&rset); - FD_SET (handle, &rset); - FD_ZERO (&wset); - FD_SET (handle, &wset); - - fd_set* const prset = forReading ? &rset : nullptr; - fd_set* const pwset = forReading ? nullptr : &wset; - - #if JUCE_WINDOWS - if (select ((int) handle + 1, prset, pwset, 0, timeoutp) < 0) - return -1; - #else - { - int result; - while ((result = select (handle + 1, prset, pwset, 0, timeoutp)) < 0 - && errno == EINTR) - { - } - - if (result < 0) - return -1; - } - #endif - - { - int opt; - juce_socklen_t len = sizeof (opt); - - if (getsockopt (handle, SOL_SOCKET, SO_ERROR, (char*) &opt, &len) < 0 - || opt != 0) - return -1; - } - - return FD_ISSET (handle, forReading ? &rset : &wset) ? 1 : 0; - } - - static bool setSocketBlockingState (const SocketHandle handle, const bool shouldBlock) noexcept - { - #if JUCE_WINDOWS - u_long nonBlocking = shouldBlock ? 0 : (u_long) 1; - return ioctlsocket (handle, FIONBIO, &nonBlocking) == 0; - #else - int socketFlags = fcntl (handle, F_GETFL, 0); - - if (socketFlags == -1) - return false; - - if (shouldBlock) - socketFlags &= ~O_NONBLOCK; - else - socketFlags |= O_NONBLOCK; - - return fcntl (handle, F_SETFL, socketFlags) == 0; - #endif - } - - static bool connectSocket (int volatile& handle, - const bool isDatagram, - struct addrinfo** const serverAddress, - const String& hostName, - const int portNumber, - const int timeOutMillisecs) noexcept - { - struct addrinfo hints; - zerostruct (hints); - - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = isDatagram ? SOCK_DGRAM : SOCK_STREAM; - hints.ai_flags = AI_NUMERICSERV; - - struct addrinfo* info = nullptr; - if (getaddrinfo (hostName.toUTF8(), String (portNumber).toUTF8(), &hints, &info) != 0 - || info == nullptr) - return false; - - if (handle < 0) - handle = (int) socket (info->ai_family, info->ai_socktype, 0); - - if (handle < 0) - { - freeaddrinfo (info); - return false; - } - - if (isDatagram) - { - if (*serverAddress != nullptr) - freeaddrinfo (*serverAddress); - - *serverAddress = info; - return true; - } - - setSocketBlockingState (handle, false); - const int result = ::connect (handle, info->ai_addr, (socklen_t) info->ai_addrlen); - freeaddrinfo (info); - - if (result < 0) - { - #if JUCE_WINDOWS - if (result == SOCKET_ERROR && WSAGetLastError() == WSAEWOULDBLOCK) - #else - if (errno == EINPROGRESS) - #endif - { - if (waitForReadiness (handle, false, timeOutMillisecs) != 1) - { - setSocketBlockingState (handle, true); - return false; - } - } - } - - setSocketBlockingState (handle, true); - resetSocketOptions (handle, false, false); - - return true; - } - - static void makeReusable (int handle) noexcept - { - const int reuse = 1; - setsockopt (handle, SOL_SOCKET, SO_REUSEADDR, (const char*) &reuse, sizeof (reuse)); - } -} - -//============================================================================== -StreamingSocket::StreamingSocket() - : portNumber (0), - handle (-1), - connected (false), - isListener (false) -{ - SocketHelpers::initSockets(); -} - -StreamingSocket::StreamingSocket (const String& host, int portNum, int h) - : hostName (host), - portNumber (portNum), - handle (h), - connected (true), - isListener (false) -{ - SocketHelpers::initSockets(); - SocketHelpers::resetSocketOptions (h, false, false); -} - -StreamingSocket::~StreamingSocket() -{ - close(); -} - -//============================================================================== -int StreamingSocket::read (void* destBuffer, const int maxBytesToRead, - const bool blockUntilSpecifiedAmountHasArrived) -{ - return (connected && ! isListener) ? SocketHelpers::readSocket (handle, destBuffer, maxBytesToRead, - connected, blockUntilSpecifiedAmountHasArrived) - : -1; -} - -int StreamingSocket::write (const void* sourceBuffer, const int numBytesToWrite) -{ - if (isListener || ! connected) - return -1; - - #if JUCE_WINDOWS - return send (handle, (const char*) sourceBuffer, numBytesToWrite, 0); - #else - int result; - - while ((result = (int) ::write (handle, sourceBuffer, (size_t) numBytesToWrite)) < 0 - && errno == EINTR) - { - } - - return result; - #endif -} - -//============================================================================== -int StreamingSocket::waitUntilReady (const bool readyForReading, - const int timeoutMsecs) const -{ - return connected ? SocketHelpers::waitForReadiness (handle, readyForReading, timeoutMsecs) - : -1; -} - -//============================================================================== -bool StreamingSocket::bindToPort (const int port) -{ - return SocketHelpers::bindSocketToPort (handle, port); -} - -bool StreamingSocket::connect (const String& remoteHostName, - const int remotePortNumber, - const int timeOutMillisecs) -{ - if (isListener) - { - jassertfalse; // a listener socket can't connect to another one! - return false; - } - - if (connected) - close(); - - hostName = remoteHostName; - portNumber = remotePortNumber; - isListener = false; - - connected = SocketHelpers::connectSocket (handle, false, nullptr, remoteHostName, - remotePortNumber, timeOutMillisecs); - - if (! (connected && SocketHelpers::resetSocketOptions (handle, false, false))) - { - close(); - return false; - } - - return true; -} - -void StreamingSocket::close() -{ - #if JUCE_WINDOWS - if (handle != SOCKET_ERROR || connected) - closesocket (handle); - - connected = false; - #else - if (connected) - { - connected = false; - - if (isListener) - { - // need to do this to interrupt the accept() function.. - StreamingSocket temp; - temp.connect (IPAddress::local().toString(), portNumber, 1000); - } - } - - if (handle != -1) - { - ::shutdown (handle, SHUT_RDWR); - ::close (handle); - } - #endif - - hostName.clear(); - portNumber = 0; - handle = -1; - isListener = false; -} - -//============================================================================== -bool StreamingSocket::createListener (const int newPortNumber, const String& localHostName) -{ - if (connected) - close(); - - hostName = "listener"; - portNumber = newPortNumber; - isListener = true; - - struct sockaddr_in servTmpAddr; - zerostruct (servTmpAddr); - - servTmpAddr.sin_family = PF_INET; - servTmpAddr.sin_addr.s_addr = htonl (INADDR_ANY); - - if (localHostName.isNotEmpty()) - servTmpAddr.sin_addr.s_addr = ::inet_addr (localHostName.toUTF8()); - - servTmpAddr.sin_port = htons ((uint16) portNumber); - - handle = (int) socket (AF_INET, SOCK_STREAM, 0); - - if (handle < 0) - return false; - - #if ! JUCE_WINDOWS // on windows, adding this option produces behaviour different to posix - SocketHelpers::makeReusable (handle); - #endif - - if (bind (handle, (struct sockaddr*) &servTmpAddr, sizeof (struct sockaddr_in)) < 0 - || listen (handle, SOMAXCONN) < 0) - { - close(); - return false; - } - - connected = true; - return true; -} - -StreamingSocket* StreamingSocket::waitForNextConnection() const -{ - // To call this method, you first have to use createListener() to - // prepare this socket as a listener. - jassert (isListener || ! connected); - - if (connected && isListener) - { - struct sockaddr_storage address; - juce_socklen_t len = sizeof (address); - const int newSocket = (int) accept (handle, (struct sockaddr*) &address, &len); - - if (newSocket >= 0 && connected) - return new StreamingSocket (inet_ntoa (((struct sockaddr_in*) &address)->sin_addr), - portNumber, newSocket); - } - - return nullptr; -} - -bool StreamingSocket::isLocal() const noexcept -{ - return hostName == "127.0.0.1"; -} - - -//============================================================================== -//============================================================================== -DatagramSocket::DatagramSocket (const int localPortNumber, const bool canBroadcast) - : portNumber (0), - handle (-1), - connected (true), - allowBroadcast (canBroadcast), - serverAddress (nullptr) -{ - SocketHelpers::initSockets(); - - handle = (int) socket (AF_INET, SOCK_DGRAM, 0); - SocketHelpers::makeReusable (handle); - bindToPort (localPortNumber); -} - -DatagramSocket::DatagramSocket (const String& host, const int portNum, - const int h, const int localPortNumber) - : hostName (host), - portNumber (portNum), - handle (h), - connected (true), - allowBroadcast (false), - serverAddress (nullptr) -{ - SocketHelpers::initSockets(); - - SocketHelpers::resetSocketOptions (h, true, allowBroadcast); - bindToPort (localPortNumber); -} - -DatagramSocket::~DatagramSocket() -{ - close(); - - if (serverAddress != nullptr) - freeaddrinfo (static_cast (serverAddress)); -} - -void DatagramSocket::close() -{ - #if JUCE_WINDOWS - closesocket (handle); - connected = false; - #else - connected = false; - ::close (handle); - #endif - - hostName.clear(); - portNumber = 0; - handle = -1; -} - -bool DatagramSocket::bindToPort (const int port) -{ - return SocketHelpers::bindSocketToPort (handle, port); -} - -bool DatagramSocket::connect (const String& remoteHostName, - const int remotePortNumber, - const int timeOutMillisecs) -{ - if (connected) - close(); - - hostName = remoteHostName; - portNumber = remotePortNumber; - - connected = SocketHelpers::connectSocket (handle, true, (struct addrinfo**) &serverAddress, - remoteHostName, remotePortNumber, - timeOutMillisecs); - - if (! (connected && SocketHelpers::resetSocketOptions (handle, true, allowBroadcast))) - { - close(); - return false; - } - - return true; -} - -DatagramSocket* DatagramSocket::waitForNextConnection() const -{ - while (waitUntilReady (true, -1) == 1) - { - struct sockaddr_storage address; - juce_socklen_t len = sizeof (address); - char buf[1]; - - if (recvfrom (handle, buf, 0, 0, (struct sockaddr*) &address, &len) > 0) - return new DatagramSocket (inet_ntoa (((struct sockaddr_in*) &address)->sin_addr), - ntohs (((struct sockaddr_in*) &address)->sin_port), - -1, -1); - } - - return nullptr; -} - -//============================================================================== -int DatagramSocket::waitUntilReady (const bool readyForReading, - const int timeoutMsecs) const -{ - return connected ? SocketHelpers::waitForReadiness (handle, readyForReading, timeoutMsecs) - : -1; -} - -int DatagramSocket::read (void* destBuffer, const int maxBytesToRead, const bool blockUntilSpecifiedAmountHasArrived) -{ - return connected ? SocketHelpers::readSocket (handle, destBuffer, maxBytesToRead, - connected, blockUntilSpecifiedAmountHasArrived) - : -1; -} - -int DatagramSocket::write (const void* sourceBuffer, const int numBytesToWrite) -{ - // You need to call connect() first to set the server address.. - jassert (serverAddress != nullptr && connected); - - return connected ? (int) sendto (handle, (const char*) sourceBuffer, - (size_t) numBytesToWrite, 0, - static_cast (serverAddress)->ai_addr, - (juce_socklen_t) static_cast (serverAddress)->ai_addrlen) - : -1; -} - -bool DatagramSocket::isLocal() const noexcept -{ - return hostName == "127.0.0.1"; -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif diff --git a/JuceLibraryCode/modules/juce_core/network/juce_Socket.h b/JuceLibraryCode/modules/juce_core/network/juce_Socket.h deleted file mode 100755 index 73795c9..0000000 --- a/JuceLibraryCode/modules/juce_core/network/juce_Socket.h +++ /dev/null @@ -1,305 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SOCKET_H_INCLUDED -#define JUCE_SOCKET_H_INCLUDED - - -//============================================================================== -/** - A wrapper for a streaming (TCP) socket. - - This allows low-level use of sockets; for an easier-to-use messaging layer on top of - sockets, you could also try the InterprocessConnection class. - - @see DatagramSocket, InterprocessConnection, InterprocessConnectionServer -*/ -class JUCE_API StreamingSocket -{ -public: - //============================================================================== - /** Creates an uninitialised socket. - - To connect it, use the connect() method, after which you can read() or write() - to it. - - To wait for other sockets to connect to this one, the createListener() method - enters "listener" mode, and can be used to spawn new sockets for each connection - that comes along. - */ - StreamingSocket(); - - /** Destructor. */ - ~StreamingSocket(); - - //============================================================================== - /** Binds the socket to the specified local port. - - @returns true on success; false may indicate that another socket is already bound - on the same port - */ - bool bindToPort (int localPortNumber); - - /** Tries to connect the socket to hostname:port. - - If timeOutMillisecs is 0, then this method will block until the operating system - rejects the connection (which could take a long time). - - @returns true if it succeeds. - @see isConnected - */ - bool connect (const String& remoteHostname, - int remotePortNumber, - int timeOutMillisecs = 3000); - - /** True if the socket is currently connected. */ - bool isConnected() const noexcept { return connected; } - - /** Closes the connection. */ - void close(); - - /** Returns the name of the currently connected host. */ - const String& getHostName() const noexcept { return hostName; } - - /** Returns the port number that's currently open. */ - int getPort() const noexcept { return portNumber; } - - /** True if the socket is connected to this machine rather than over the network. */ - bool isLocal() const noexcept; - - /** Returns the OS's socket handle that's currently open. */ - int getRawSocketHandle() const noexcept { return handle; } - - //============================================================================== - /** Waits until the socket is ready for reading or writing. - - If readyForReading is true, it will wait until the socket is ready for - reading; if false, it will wait until it's ready for writing. - - If the timeout is < 0, it will wait forever, or else will give up after - the specified time. - - If the socket is ready on return, this returns 1. If it times-out before - the socket becomes ready, it returns 0. If an error occurs, it returns -1. - */ - int waitUntilReady (bool readyForReading, - int timeoutMsecs) const; - - /** Reads bytes from the socket. - - If blockUntilSpecifiedAmountHasArrived is true, the method will block until - maxBytesToRead bytes have been read, (or until an error occurs). If this - flag is false, the method will return as much data as is currently available - without blocking. - - @returns the number of bytes read, or -1 if there was an error. - @see waitUntilReady - */ - int read (void* destBuffer, int maxBytesToRead, - bool blockUntilSpecifiedAmountHasArrived); - - /** Writes bytes to the socket from a buffer. - - Note that this method will block unless you have checked the socket is ready - for writing before calling it (see the waitUntilReady() method). - - @returns the number of bytes written, or -1 if there was an error. - */ - int write (const void* sourceBuffer, int numBytesToWrite); - - //============================================================================== - /** Puts this socket into "listener" mode. - - When in this mode, your thread can call waitForNextConnection() repeatedly, - which will spawn new sockets for each new connection, so that these can - be handled in parallel by other threads. - - @param portNumber the port number to listen on - @param localHostName the interface address to listen on - pass an empty - string to listen on all addresses - @returns true if it manages to open the socket successfully. - - @see waitForNextConnection - */ - bool createListener (int portNumber, const String& localHostName = String()); - - /** When in "listener" mode, this waits for a connection and spawns it as a new - socket. - - The object that gets returned will be owned by the caller. - - This method can only be called after using createListener(). - - @see createListener - */ - StreamingSocket* waitForNextConnection() const; - -private: - //============================================================================== - String hostName; - int volatile portNumber, handle; - bool connected, isListener; - - StreamingSocket (const String& hostname, int portNumber, int handle); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StreamingSocket) -}; - - -//============================================================================== -/** - A wrapper for a datagram (UDP) socket. - - This allows low-level use of sockets; for an easier-to-use messaging layer on top of - sockets, you could also try the InterprocessConnection class. - - @see StreamingSocket, InterprocessConnection, InterprocessConnectionServer -*/ -class JUCE_API DatagramSocket -{ -public: - //============================================================================== - /** - Creates an (uninitialised) datagram socket. - - The localPortNumber is the port on which to bind this socket. If this value is 0, - the port number is assigned by the operating system. - - To use the socket for sending, call the connect() method. This will not immediately - make a connection, but will save the destination you've provided. After this, you can - call read() or write(). - - If enableBroadcasting is true, the socket will be allowed to send broadcast messages - (may require extra privileges on linux) - - To wait for other sockets to connect to this one, call waitForNextConnection(). - */ - DatagramSocket (int localPortNumber, - bool enableBroadcasting = false); - - /** Destructor. */ - ~DatagramSocket(); - - //============================================================================== - /** Binds the socket to the specified local port. - - @returns true on success; false may indicate that another socket is already bound - on the same port - */ - bool bindToPort (int localPortNumber); - - /** Tries to connect the socket to hostname:port. - - If timeOutMillisecs is 0, then this method will block until the operating system - rejects the connection (which could take a long time). - - @returns true if it succeeds. - @see isConnected - */ - bool connect (const String& remoteHostname, - int remotePortNumber, - int timeOutMillisecs = 3000); - - /** True if the socket is currently connected. */ - bool isConnected() const noexcept { return connected; } - - /** Closes the connection. */ - void close(); - - /** Returns the name of the currently connected host. */ - const String& getHostName() const noexcept { return hostName; } - - /** Returns the port number that's currently open. */ - int getPort() const noexcept { return portNumber; } - - /** True if the socket is connected to this machine rather than over the network. */ - bool isLocal() const noexcept; - - /** Returns the OS's socket handle that's currently open. */ - int getRawSocketHandle() const noexcept { return handle; } - - //============================================================================== - /** Waits until the socket is ready for reading or writing. - - If readyForReading is true, it will wait until the socket is ready for - reading; if false, it will wait until it's ready for writing. - - If the timeout is < 0, it will wait forever, or else will give up after - the specified time. - - If the socket is ready on return, this returns 1. If it times-out before - the socket becomes ready, it returns 0. If an error occurs, it returns -1. - */ - int waitUntilReady (bool readyForReading, - int timeoutMsecs) const; - - /** Reads bytes from the socket. - - If blockUntilSpecifiedAmountHasArrived is true, the method will block until - maxBytesToRead bytes have been read, (or until an error occurs). If this - flag is false, the method will return as much data as is currently available - without blocking. - - @returns the number of bytes read, or -1 if there was an error. - @see waitUntilReady - */ - int read (void* destBuffer, int maxBytesToRead, - bool blockUntilSpecifiedAmountHasArrived); - - /** Writes bytes to the socket from a buffer. - - Note that this method will block unless you have checked the socket is ready - for writing before calling it (see the waitUntilReady() method). - - @returns the number of bytes written, or -1 if there was an error. - */ - int write (const void* sourceBuffer, int numBytesToWrite); - - //============================================================================== - /** This waits for incoming data to be sent, and returns a socket that can be used - to read it. - - The object that gets returned is owned by the caller, and can't be used for - sending, but can be used to read the data. - */ - DatagramSocket* waitForNextConnection() const; - -private: - //============================================================================== - String hostName; - int volatile portNumber, handle; - bool connected, allowBroadcast; - void* serverAddress; - - DatagramSocket (const String& hostname, int portNumber, int handle, int localPortNumber); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DatagramSocket) -}; - - -#endif // JUCE_SOCKET_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp b/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp deleted file mode 100755 index f6f8620..0000000 --- a/JuceLibraryCode/modules/juce_core/network/juce_URL.cpp +++ /dev/null @@ -1,515 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -URL::URL() -{ -} - -URL::URL (const String& u) : url (u) -{ - int i = url.indexOfChar ('?'); - - if (i >= 0) - { - do - { - const int nextAmp = url.indexOfChar (i + 1, '&'); - const int equalsPos = url.indexOfChar (i + 1, '='); - - if (equalsPos > i + 1) - { - if (nextAmp < 0) - { - addParameter (removeEscapeChars (url.substring (i + 1, equalsPos)), - removeEscapeChars (url.substring (equalsPos + 1))); - } - else if (nextAmp > 0 && equalsPos < nextAmp) - { - addParameter (removeEscapeChars (url.substring (i + 1, equalsPos)), - removeEscapeChars (url.substring (equalsPos + 1, nextAmp))); - } - } - - i = nextAmp; - } - while (i >= 0); - - url = url.upToFirstOccurrenceOf ("?", false, false); - } -} - -URL::URL (const String& u, int) : url (u) {} - -URL URL::createWithoutParsing (const String& u) -{ - return URL (u, 0); -} - -URL::URL (const URL& other) - : url (other.url), - postData (other.postData), - parameterNames (other.parameterNames), - parameterValues (other.parameterValues), - filesToUpload (other.filesToUpload) -{ -} - -URL& URL::operator= (const URL& other) -{ - url = other.url; - postData = other.postData; - parameterNames = other.parameterNames; - parameterValues = other.parameterValues; - filesToUpload = other.filesToUpload; - - return *this; -} - -bool URL::operator== (const URL& other) const -{ - return url == other.url - && postData == other.postData - && parameterNames == other.parameterNames - && parameterValues == other.parameterValues - && filesToUpload == other.filesToUpload; -} - -bool URL::operator!= (const URL& other) const -{ - return ! operator== (other); -} - -URL::~URL() -{ -} - -namespace URLHelpers -{ - static String getMangledParameters (const URL& url) - { - jassert (url.getParameterNames().size() == url.getParameterValues().size()); - String p; - - for (int i = 0; i < url.getParameterNames().size(); ++i) - { - if (i > 0) - p << '&'; - - p << URL::addEscapeChars (url.getParameterNames()[i], true) - << '=' - << URL::addEscapeChars (url.getParameterValues()[i], true); - } - - return p; - } - - static int findEndOfScheme (const String& url) - { - int i = 0; - - while (CharacterFunctions::isLetterOrDigit (url[i]) - || url[i] == '+' || url[i] == '-' || url[i] == '.') - ++i; - - return url[i] == ':' ? i + 1 : 0; - } - - static int findStartOfNetLocation (const String& url) - { - int start = findEndOfScheme (url); - while (url[start] == '/') - ++start; - - return start; - } - - static int findStartOfPath (const String& url) - { - return url.indexOfChar (findStartOfNetLocation (url), '/') + 1; - } - - static void concatenatePaths (String& path, const String& suffix) - { - if (! path.endsWithChar ('/')) - path << '/'; - - if (suffix.startsWithChar ('/')) - path += suffix.substring (1); - else - path += suffix; - } -} - -void URL::addParameter (const String& name, const String& value) -{ - parameterNames.add (name); - parameterValues.add (value); -} - -String URL::toString (const bool includeGetParameters) const -{ - if (includeGetParameters && parameterNames.size() > 0) - return url + "?" + URLHelpers::getMangledParameters (*this); - - return url; -} - -bool URL::isEmpty() const noexcept -{ - return url.isEmpty(); -} - -bool URL::isWellFormed() const -{ - //xxx TODO - return url.isNotEmpty(); -} - -String URL::getDomain() const -{ - const int start = URLHelpers::findStartOfNetLocation (url); - const int end1 = url.indexOfChar (start, '/'); - const int end2 = url.indexOfChar (start, ':'); - - const int end = (end1 < 0 && end2 < 0) ? std::numeric_limits::max() - : ((end1 < 0 || end2 < 0) ? jmax (end1, end2) - : jmin (end1, end2)); - return url.substring (start, end); -} - -String URL::getSubPath() const -{ - const int startOfPath = URLHelpers::findStartOfPath (url); - - return startOfPath <= 0 ? String() - : url.substring (startOfPath); -} - -String URL::getScheme() const -{ - return url.substring (0, URLHelpers::findEndOfScheme (url) - 1); -} - -int URL::getPort() const -{ - const int colonPos = url.indexOfChar (URLHelpers::findStartOfNetLocation (url), ':'); - - return colonPos > 0 ? url.substring (colonPos + 1).getIntValue() : 0; -} - -URL URL::withNewSubPath (const String& newPath) const -{ - const int startOfPath = URLHelpers::findStartOfPath (url); - - URL u (*this); - - if (startOfPath > 0) - u.url = url.substring (0, startOfPath); - - URLHelpers::concatenatePaths (u.url, newPath); - return u; -} - -URL URL::getChildURL (const String& subPath) const -{ - URL u (*this); - URLHelpers::concatenatePaths (u.url, subPath); - return u; -} - -void URL::createHeadersAndPostData (String& headers, MemoryBlock& headersAndPostData) const -{ - MemoryOutputStream data (headersAndPostData, false); - - if (filesToUpload.size() > 0) - { - // (this doesn't currently support mixing custom post-data with uploads..) - jassert (postData.isEmpty()); - - const String boundary (String::toHexString (Random::getSystemRandom().nextInt64())); - - headers << "Content-Type: multipart/form-data; boundary=" << boundary << "\r\n"; - - data << "--" << boundary; - - for (int i = 0; i < parameterNames.size(); ++i) - { - data << "\r\nContent-Disposition: form-data; name=\"" << parameterNames[i] - << "\"\r\n\r\n" << parameterValues[i] - << "\r\n--" << boundary; - } - - for (int i = 0; i < filesToUpload.size(); ++i) - { - const Upload& f = *filesToUpload.getObjectPointerUnchecked(i); - - data << "\r\nContent-Disposition: form-data; name=\"" << f.parameterName - << "\"; filename=\"" << f.filename << "\"\r\n"; - - if (f.mimeType.isNotEmpty()) - data << "Content-Type: " << f.mimeType << "\r\n"; - - data << "Content-Transfer-Encoding: binary\r\n\r\n"; - - if (f.data != nullptr) - data << *f.data; - else - data << f.file; - - data << "\r\n--" << boundary; - } - - data << "--\r\n"; - } - else - { - data << URLHelpers::getMangledParameters (*this) - << postData; - - // if the user-supplied headers didn't contain a content-type, add one now.. - if (! headers.containsIgnoreCase ("Content-Type")) - headers << "Content-Type: application/x-www-form-urlencoded\r\n"; - - headers << "Content-length: " << (int) data.getDataSize() << "\r\n"; - } -} - -//============================================================================== -bool URL::isProbablyAWebsiteURL (const String& possibleURL) -{ - static const char* validProtocols[] = { "http:", "ftp:", "https:" }; - - for (int i = 0; i < numElementsInArray (validProtocols); ++i) - if (possibleURL.startsWithIgnoreCase (validProtocols[i])) - return true; - - if (possibleURL.containsChar ('@') - || possibleURL.containsChar (' ')) - return false; - - const String topLevelDomain (possibleURL.upToFirstOccurrenceOf ("/", false, false) - .fromLastOccurrenceOf (".", false, false)); - - return topLevelDomain.isNotEmpty() && topLevelDomain.length() <= 3; -} - -bool URL::isProbablyAnEmailAddress (const String& possibleEmailAddress) -{ - const int atSign = possibleEmailAddress.indexOfChar ('@'); - - return atSign > 0 - && possibleEmailAddress.lastIndexOfChar ('.') > (atSign + 1) - && ! possibleEmailAddress.endsWithChar ('.'); -} - -//============================================================================== -InputStream* URL::createInputStream (const bool usePostCommand, - OpenStreamProgressCallback* const progressCallback, - void* const progressCallbackContext, - String headers, - const int timeOutMs, - StringPairArray* const responseHeaders, - int* statusCode, - const int numRedirectsToFollow) const -{ - MemoryBlock headersAndPostData; - - if (! headers.endsWithChar ('\n')) - headers << "\r\n"; - - if (usePostCommand) - createHeadersAndPostData (headers, headersAndPostData); - - if (! headers.endsWithChar ('\n')) - headers << "\r\n"; - - ScopedPointer wi (new WebInputStream (toString (! usePostCommand), - usePostCommand, headersAndPostData, - progressCallback, progressCallbackContext, - headers, timeOutMs, responseHeaders, - numRedirectsToFollow)); - - if (statusCode != nullptr) - *statusCode = wi->statusCode; - - return wi->isError() ? nullptr : wi.release(); -} - -//============================================================================== -bool URL::readEntireBinaryStream (MemoryBlock& destData, - const bool usePostCommand) const -{ - const ScopedPointer in (createInputStream (usePostCommand)); - - if (in != nullptr) - { - in->readIntoMemoryBlock (destData); - return true; - } - - return false; -} - -String URL::readEntireTextStream (const bool usePostCommand) const -{ - const ScopedPointer in (createInputStream (usePostCommand)); - - if (in != nullptr) - return in->readEntireStreamAsString(); - - return String(); -} - -XmlElement* URL::readEntireXmlStream (const bool usePostCommand) const -{ - return XmlDocument::parse (readEntireTextStream (usePostCommand)); -} - -//============================================================================== -URL URL::withParameter (const String& parameterName, - const String& parameterValue) const -{ - URL u (*this); - u.addParameter (parameterName, parameterValue); - return u; -} - -URL URL::withParameters (const StringPairArray& parametersToAdd) const -{ - URL u (*this); - - for (int i = 0; i < parametersToAdd.size(); ++i) - u.addParameter (parametersToAdd.getAllKeys()[i], - parametersToAdd.getAllValues()[i]); - - return u; -} - -URL URL::withPOSTData (const String& newPostData) const -{ - URL u (*this); - u.postData = newPostData; - return u; -} - -URL::Upload::Upload (const String& param, const String& name, - const String& mime, const File& f, MemoryBlock* mb) - : parameterName (param), filename (name), mimeType (mime), file (f), data (mb) -{ - jassert (mimeType.isNotEmpty()); // You need to supply a mime type! -} - -URL URL::withUpload (Upload* const f) const -{ - URL u (*this); - - for (int i = u.filesToUpload.size(); --i >= 0;) - if (u.filesToUpload.getObjectPointerUnchecked(i)->parameterName == f->parameterName) - u.filesToUpload.remove (i); - - u.filesToUpload.add (f); - return u; -} - -URL URL::withFileToUpload (const String& parameterName, const File& fileToUpload, - const String& mimeType) const -{ - return withUpload (new Upload (parameterName, fileToUpload.getFileName(), - mimeType, fileToUpload, nullptr)); -} - -URL URL::withDataToUpload (const String& parameterName, const String& filename, - const MemoryBlock& fileContentToUpload, const String& mimeType) const -{ - return withUpload (new Upload (parameterName, filename, mimeType, File(), - new MemoryBlock (fileContentToUpload))); -} - -//============================================================================== -String URL::removeEscapeChars (const String& s) -{ - String result (s.replaceCharacter ('+', ' ')); - - if (! result.containsChar ('%')) - return result; - - // We need to operate on the string as raw UTF8 chars, and then recombine them into unicode - // after all the replacements have been made, so that multi-byte chars are handled. - Array utf8 (result.toRawUTF8(), (int) result.getNumBytesAsUTF8()); - - for (int i = 0; i < utf8.size(); ++i) - { - if (utf8.getUnchecked(i) == '%') - { - const int hexDigit1 = CharacterFunctions::getHexDigitValue ((juce_wchar) (uint8) utf8 [i + 1]); - const int hexDigit2 = CharacterFunctions::getHexDigitValue ((juce_wchar) (uint8) utf8 [i + 2]); - - if (hexDigit1 >= 0 && hexDigit2 >= 0) - { - utf8.set (i, (char) ((hexDigit1 << 4) + hexDigit2)); - utf8.removeRange (i + 1, 2); - } - } - } - - return String::fromUTF8 (utf8.getRawDataPointer(), utf8.size()); -} - -String URL::addEscapeChars (const String& s, const bool isParameter) -{ - const CharPointer_UTF8 legalChars (isParameter ? "_-.*!'()" - : ",$_-.*!'()"); - - Array utf8 (s.toRawUTF8(), (int) s.getNumBytesAsUTF8()); - - for (int i = 0; i < utf8.size(); ++i) - { - const char c = utf8.getUnchecked(i); - - if (! (CharacterFunctions::isLetterOrDigit (c) - || legalChars.indexOf ((juce_wchar) c) >= 0)) - { - utf8.set (i, '%'); - utf8.insert (++i, "0123456789ABCDEF" [((uint8) c) >> 4]); - utf8.insert (++i, "0123456789ABCDEF" [c & 15]); - } - } - - return String::fromUTF8 (utf8.getRawDataPointer(), utf8.size()); -} - -//============================================================================== -bool URL::launchInDefaultBrowser() const -{ - String u (toString (true)); - - if (u.containsChar ('@') && ! u.containsChar (':')) - u = "mailto:" + u; - - return Process::openDocument (u, String()); -} diff --git a/JuceLibraryCode/modules/juce_core/network/juce_URL.h b/JuceLibraryCode/modules/juce_core/network/juce_URL.h deleted file mode 100755 index d3a87c1..0000000 --- a/JuceLibraryCode/modules/juce_core/network/juce_URL.h +++ /dev/null @@ -1,387 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_URL_H_INCLUDED -#define JUCE_URL_H_INCLUDED - - -//============================================================================== -/** - Represents a URL and has a bunch of useful functions to manipulate it. - - This class can be used to launch URLs in browsers, and also to create - InputStreams that can read from remote http or ftp sources. -*/ -class JUCE_API URL -{ -public: - //============================================================================== - /** Creates an empty URL. */ - URL(); - - /** Creates a URL from a string. - This will parse any embedded parameters after a '?' character and store them - in the list (see getParameterNames etc). If you don't want this to happen, you - can use createWithoutParsing(). - */ - URL (const String& url); - - /** Creates a copy of another URL. */ - URL (const URL& other); - - /** Destructor. */ - ~URL(); - - /** Copies this URL from another one. */ - URL& operator= (const URL& other); - - /** Compares two URLs. - All aspects of the URLs must be identical for them to match, including any parameters, - upload files, etc. - */ - bool operator== (const URL&) const; - bool operator!= (const URL&) const; - - //============================================================================== - /** Returns a string version of the URL. - - If includeGetParameters is true and any parameters have been set with the - withParameter() method, then the string will have these appended on the - end and url-encoded. - */ - String toString (bool includeGetParameters) const; - - /** Returns true if the URL is an empty string. */ - bool isEmpty() const noexcept; - - /** True if it seems to be valid. */ - bool isWellFormed() const; - - /** Returns just the domain part of the URL. - - E.g. for "http://www.xyz.com/foobar", this will return "www.xyz.com". - */ - String getDomain() const; - - /** Returns the path part of the URL. - - E.g. for "http://www.xyz.com/foo/bar?x=1", this will return "foo/bar". - */ - String getSubPath() const; - - /** Returns the scheme of the URL. - - E.g. for "http://www.xyz.com/foobar", this will return "http". (It won't - include the colon). - */ - String getScheme() const; - - /** Attempts to read a port number from the URL. - @returns the port number, or 0 if none is explicitly specified. - */ - int getPort() const; - - /** Returns a new version of this URL that uses a different sub-path. - - E.g. if the URL is "http://www.xyz.com/foo?x=1" and you call this with - "bar", it'll return "http://www.xyz.com/bar?x=1". - */ - URL withNewSubPath (const String& newPath) const; - - /** Returns a new URL that refers to a sub-path relative to this one. - - E.g. if the URL is "http://www.xyz.com/foo" and you call this with - "bar", it'll return "http://www.xyz.com/foo/bar". Note that there's no way for - this method to know whether the original URL is a file or directory, so it's - up to you to make sure it's a directory. It also won't attempt to be smart about - the content of the childPath string, so if this string is an absolute URL, it'll - still just get bolted onto the end of the path. - - @see File::getChildFile - */ - URL getChildURL (const String& subPath) const; - - //============================================================================== - /** Returns a copy of this URL, with a GET or POST parameter added to the end. - - Any control characters in the value will be encoded. - - e.g. calling "withParameter ("amount", "some fish") for the url "www.fish.com" - would produce a new url whose toString(true) method would return - "www.fish.com?amount=some+fish". - - @see getParameterNames, getParameterValues - */ - URL withParameter (const String& parameterName, - const String& parameterValue) const; - - /** Returns a copy of this URL, with a set of GET or POST parameters added. - This is a convenience method, equivalent to calling withParameter for each value. - @see withParameter - */ - URL withParameters (const StringPairArray& parametersToAdd) const; - - /** Returns a copy of this URL, with a file-upload type parameter added to it. - - When performing a POST where one of your parameters is a binary file, this - lets you specify the file. - - Note that the filename is stored, but the file itself won't actually be read - until this URL is later used to create a network input stream. If you want to - upload data from memory, use withDataToUpload(). - - @see withDataToUpload - */ - URL withFileToUpload (const String& parameterName, - const File& fileToUpload, - const String& mimeType) const; - - /** Returns a copy of this URL, with a file-upload type parameter added to it. - - When performing a POST where one of your parameters is a binary file, this - lets you specify the file content. - Note that the filename parameter should not be a full path, it's just the - last part of the filename. - - @see withFileToUpload - */ - URL withDataToUpload (const String& parameterName, - const String& filename, - const MemoryBlock& fileContentToUpload, - const String& mimeType) const; - - /** Returns an array of the names of all the URL's parameters. - - E.g. for the url "www.fish.com?type=haddock&amount=some+fish", this array would - contain two items: "type" and "amount". - - You can call getParameterValues() to get the corresponding value of each - parameter. Note that the list can contain multiple parameters with the same name. - - @see getParameterValues, withParameter - */ - const StringArray& getParameterNames() const noexcept { return parameterNames; } - - /** Returns an array of the values of all the URL's parameters. - - E.g. for the url "www.fish.com?type=haddock&amount=some+fish", this array would - contain two items: "haddock" and "some fish". - - The values returned will have been cleaned up to remove any escape characters. - - You can call getParameterNames() to get the corresponding name of each - parameter. Note that the list can contain multiple parameters with the same name. - - @see getParameterNames, withParameter - */ - const StringArray& getParameterValues() const noexcept { return parameterValues; } - - /** Returns a copy of this URL, with a block of data to send as the POST data. - - If you're setting the POST data, be careful not to have any parameters set - as well, otherwise it'll all get thrown in together, and might not have the - desired effect. - - If the URL already contains some POST data, this will replace it, rather - than being appended to it. - - This data will only be used if you specify a post operation when you call - createInputStream(). - */ - URL withPOSTData (const String& postData) const; - - /** Returns the data that was set using withPOSTData(). */ - const String& getPostData() const noexcept { return postData; } - - //============================================================================== - /** Tries to launch the system's default browser to open the URL. - - Returns true if this seems to have worked. - */ - bool launchInDefaultBrowser() const; - - //============================================================================== - /** Takes a guess as to whether a string might be a valid website address. - - This isn't foolproof! - */ - static bool isProbablyAWebsiteURL (const String& possibleURL); - - /** Takes a guess as to whether a string might be a valid email address. - - This isn't foolproof! - */ - static bool isProbablyAnEmailAddress (const String& possibleEmailAddress); - - //============================================================================== - /** This callback function can be used by the createInputStream() method. - - It allows your app to receive progress updates during a lengthy POST operation. If you - want to continue the operation, this should return true, or false to abort. - */ - typedef bool (OpenStreamProgressCallback) (void* context, int bytesSent, int totalBytes); - - /** Attempts to open a stream that can read from this URL. - - @param usePostCommand if true, it will try to do use a http 'POST' to pass - the parameters, otherwise it'll encode them into the - URL and do a 'GET'. - @param progressCallback if this is non-zero, it lets you supply a callback function - to keep track of the operation's progress. This can be useful - for lengthy POST operations, so that you can provide user feedback. - @param progressCallbackContext if a callback is specified, this value will be passed to - the function - @param extraHeaders if not empty, this string is appended onto the headers that - are used for the request. It must therefore be a valid set of HTML - header directives, separated by newlines. - @param connectionTimeOutMs if 0, this will use whatever default setting the OS chooses. If - a negative number, it will be infinite. Otherwise it specifies a - time in milliseconds. - @param responseHeaders if this is non-null, all the (key, value) pairs received as headers - in the response will be stored in this array - @param statusCode if this is non-null, it will get set to the http status code, if one - is known, or 0 if a code isn't available - @param numRedirectsToFollow specifies the number of redirects that will be followed before - returning a response (ignored for Android which follows up to 5 redirects) - @returns an input stream that the caller must delete, or a null pointer if there was an - error trying to open it. - */ - InputStream* createInputStream (bool usePostCommand, - OpenStreamProgressCallback* progressCallback = nullptr, - void* progressCallbackContext = nullptr, - String extraHeaders = String(), - int connectionTimeOutMs = 0, - StringPairArray* responseHeaders = nullptr, - int* statusCode = nullptr, - int numRedirectsToFollow = 5) const; - - - //============================================================================== - /** Tries to download the entire contents of this URL into a binary data block. - - If it succeeds, this will return true and append the data it read onto the end - of the memory block. - - @param destData the memory block to append the new data to - @param usePostCommand whether to use a POST command to get the data (uses - a GET command if this is false) - @see readEntireTextStream, readEntireXmlStream - */ - bool readEntireBinaryStream (MemoryBlock& destData, - bool usePostCommand = false) const; - - /** Tries to download the entire contents of this URL as a string. - - If it fails, this will return an empty string, otherwise it will return the - contents of the downloaded file. If you need to distinguish between a read - operation that fails and one that returns an empty string, you'll need to use - a different method, such as readEntireBinaryStream(). - - @param usePostCommand whether to use a POST command to get the data (uses - a GET command if this is false) - @see readEntireBinaryStream, readEntireXmlStream - */ - String readEntireTextStream (bool usePostCommand = false) const; - - /** Tries to download the entire contents of this URL and parse it as XML. - - If it fails, or if the text that it reads can't be parsed as XML, this will - return 0. - - When it returns a valid XmlElement object, the caller is responsibile for deleting - this object when no longer needed. - - @param usePostCommand whether to use a POST command to get the data (uses - a GET command if this is false) - - @see readEntireBinaryStream, readEntireTextStream - */ - XmlElement* readEntireXmlStream (bool usePostCommand = false) const; - - //============================================================================== - /** Adds escape sequences to a string to encode any characters that aren't - legal in a URL. - - E.g. any spaces will be replaced with "%20". - - This is the opposite of removeEscapeChars(). - - If isParameter is true, it means that the string is going to be used - as a parameter, so it also encodes '$' and ',' (which would otherwise - be legal in a URL. - - @see removeEscapeChars - */ - static String addEscapeChars (const String& stringToAddEscapeCharsTo, - bool isParameter); - - /** Replaces any escape character sequences in a string with their original - character codes. - - E.g. any instances of "%20" will be replaced by a space. - - This is the opposite of addEscapeChars(). - - @see addEscapeChars - */ - static String removeEscapeChars (const String& stringToRemoveEscapeCharsFrom); - - /** Returns a URL without attempting to remove any embedded parameters from the string. - This may be necessary if you need to create a request that involves both POST - parameters and parameters which are embedded in the URL address itself. - */ - static URL createWithoutParsing (const String& url); - -private: - //============================================================================== - String url, postData; - StringArray parameterNames, parameterValues; - - struct Upload : public ReferenceCountedObject - { - Upload (const String&, const String&, const String&, const File&, MemoryBlock*); - String parameterName, filename, mimeType; - File file; - ScopedPointer data; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Upload) - }; - - friend struct ContainerDeletePolicy; - ReferenceCountedArray filesToUpload; - - URL (const String&, int); - void addParameter (const String&, const String&); - void createHeadersAndPostData (String&, MemoryBlock&) const; - URL withUpload (Upload*) const; - - JUCE_LEAK_DETECTOR (URL) -}; - - -#endif // JUCE_URL_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp deleted file mode 100755 index ec01f8e..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -namespace -{ - int calcBufferStreamBufferSize (int requestedSize, InputStream* const source) noexcept - { - // You need to supply a real stream when creating a BufferedInputStream - jassert (source != nullptr); - - requestedSize = jmax (256, requestedSize); - - const int64 sourceSize = source->getTotalLength(); - if (sourceSize >= 0 && sourceSize < requestedSize) - requestedSize = jmax (32, (int) sourceSize); - - return requestedSize; - } -} - -//============================================================================== -BufferedInputStream::BufferedInputStream (InputStream* const sourceStream, const int bufferSize_, - const bool deleteSourceWhenDestroyed) - : source (sourceStream, deleteSourceWhenDestroyed), - bufferSize (calcBufferStreamBufferSize (bufferSize_, sourceStream)), - position (sourceStream->getPosition()), - lastReadPos (0), - bufferStart (position), - bufferOverlap (128) -{ - buffer.malloc ((size_t) bufferSize); -} - -BufferedInputStream::BufferedInputStream (InputStream& sourceStream, const int bufferSize_) - : source (&sourceStream, false), - bufferSize (calcBufferStreamBufferSize (bufferSize_, &sourceStream)), - position (sourceStream.getPosition()), - lastReadPos (0), - bufferStart (position), - bufferOverlap (128) -{ - buffer.malloc ((size_t) bufferSize); -} - -BufferedInputStream::~BufferedInputStream() -{ -} - -//============================================================================== -int64 BufferedInputStream::getTotalLength() -{ - return source->getTotalLength(); -} - -int64 BufferedInputStream::getPosition() -{ - return position; -} - -bool BufferedInputStream::setPosition (int64 newPosition) -{ - position = jmax ((int64) 0, newPosition); - return true; -} - -bool BufferedInputStream::isExhausted() -{ - return position >= lastReadPos && source->isExhausted(); -} - -void BufferedInputStream::ensureBuffered() -{ - const int64 bufferEndOverlap = lastReadPos - bufferOverlap; - - if (position < bufferStart || position >= bufferEndOverlap) - { - int bytesRead; - - if (position < lastReadPos - && position >= bufferEndOverlap - && position >= bufferStart) - { - const int bytesToKeep = (int) (lastReadPos - position); - memmove (buffer, buffer + (int) (position - bufferStart), (size_t) bytesToKeep); - - bufferStart = position; - - bytesRead = source->read (buffer + bytesToKeep, - (int) (bufferSize - bytesToKeep)); - - lastReadPos += bytesRead; - bytesRead += bytesToKeep; - } - else - { - bufferStart = position; - source->setPosition (bufferStart); - bytesRead = source->read (buffer, bufferSize); - lastReadPos = bufferStart + bytesRead; - } - - while (bytesRead < bufferSize) - buffer [bytesRead++] = 0; - } -} - -int BufferedInputStream::read (void* destBuffer, int maxBytesToRead) -{ - jassert (destBuffer != nullptr && maxBytesToRead >= 0); - - if (position >= bufferStart - && position + maxBytesToRead <= lastReadPos) - { - memcpy (destBuffer, buffer + (int) (position - bufferStart), (size_t) maxBytesToRead); - position += maxBytesToRead; - - return maxBytesToRead; - } - else - { - if (position < bufferStart || position >= lastReadPos) - ensureBuffered(); - - int bytesRead = 0; - - while (maxBytesToRead > 0) - { - const int bytesAvailable = jmin (maxBytesToRead, (int) (lastReadPos - position)); - - if (bytesAvailable > 0) - { - memcpy (destBuffer, buffer + (int) (position - bufferStart), (size_t) bytesAvailable); - maxBytesToRead -= bytesAvailable; - bytesRead += bytesAvailable; - position += bytesAvailable; - destBuffer = static_cast (destBuffer) + bytesAvailable; - } - - const int64 oldLastReadPos = lastReadPos; - ensureBuffered(); - - if (oldLastReadPos == lastReadPos) - break; // if ensureBuffered() failed to read any more data, bail out - - if (isExhausted()) - break; - } - - return bytesRead; - } -} - -String BufferedInputStream::readString() -{ - if (position >= bufferStart - && position < lastReadPos) - { - const int maxChars = (int) (lastReadPos - position); - - const char* const src = buffer + (int) (position - bufferStart); - - for (int i = 0; i < maxChars; ++i) - { - if (src[i] == 0) - { - position += i + 1; - return String::fromUTF8 (src, i); - } - } - } - - return InputStream::readString(); -} diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h deleted file mode 100755 index 8f1e633..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_BufferedInputStream.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_BUFFEREDINPUTSTREAM_H_INCLUDED -#define JUCE_BUFFEREDINPUTSTREAM_H_INCLUDED - - -//============================================================================== -/** Wraps another input stream, and reads from it using an intermediate buffer - - If you're using an input stream such as a file input stream, and making lots of - small read accesses to it, it's probably sensible to wrap it in one of these, - so that the source stream gets accessed in larger chunk sizes, meaning less - work for the underlying stream. -*/ -class JUCE_API BufferedInputStream : public InputStream -{ -public: - //============================================================================== - /** Creates a BufferedInputStream from an input source. - - @param sourceStream the source stream to read from - @param bufferSize the size of reservoir to use to buffer the source - @param deleteSourceWhenDestroyed whether the sourceStream that is passed in should be - deleted by this object when it is itself deleted. - */ - BufferedInputStream (InputStream* sourceStream, - int bufferSize, - bool deleteSourceWhenDestroyed); - - /** Creates a BufferedInputStream from an input source. - - @param sourceStream the source stream to read from - the source stream must not - be deleted until this object has been destroyed. - @param bufferSize the size of reservoir to use to buffer the source - */ - BufferedInputStream (InputStream& sourceStream, int bufferSize); - - /** Destructor. - - This may also delete the source stream, if that option was chosen when the - buffered stream was created. - */ - ~BufferedInputStream(); - - - //============================================================================== - int64 getTotalLength() override; - int64 getPosition() override; - bool setPosition (int64 newPosition) override; - int read (void* destBuffer, int maxBytesToRead) override; - String readString() override; - bool isExhausted() override; - - -private: - //============================================================================== - OptionalScopedPointer source; - int bufferSize; - int64 position, lastReadPos, bufferStart, bufferOverlap; - HeapBlock buffer; - void ensureBuffered(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BufferedInputStream) -}; - -#endif // JUCE_BUFFEREDINPUTSTREAM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp deleted file mode 100755 index 51b9db9..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -FileInputSource::FileInputSource (const File& f, bool useFileTimeInHash) - : file (f), useFileTimeInHashGeneration (useFileTimeInHash) -{ -} - -FileInputSource::~FileInputSource() -{ -} - -InputStream* FileInputSource::createInputStream() -{ - return file.createInputStream(); -} - -InputStream* FileInputSource::createInputStreamFor (const String& relatedItemPath) -{ - return file.getSiblingFile (relatedItemPath).createInputStream(); -} - -int64 FileInputSource::hashCode() const -{ - int64 h = file.hashCode(); - - if (useFileTimeInHashGeneration) - h ^= file.getLastModificationTime().toMilliseconds(); - - return h; -} diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h b/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h deleted file mode 100755 index d2e6d86..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_FileInputSource.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_FILEINPUTSOURCE_H_INCLUDED -#define JUCE_FILEINPUTSOURCE_H_INCLUDED - - -//============================================================================== -/** - A type of InputSource that represents a normal file. - - @see InputSource -*/ -class JUCE_API FileInputSource : public InputSource -{ -public: - //============================================================================== - /** Creates a FileInputSource for a file. - If the useFileTimeInHashGeneration parameter is true, then this object's - hashCode() method will incorporate the file time into its hash code; if - false, only the file name will be used for the hash. - */ - FileInputSource (const File& file, bool useFileTimeInHashGeneration = false); - - /** Destructor. */ - ~FileInputSource(); - - InputStream* createInputStream(); - InputStream* createInputStreamFor (const String& relatedItemPath); - int64 hashCode() const; - -private: - //============================================================================== - const File file; - bool useFileTimeInHashGeneration; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FileInputSource) -}; - - -#endif // JUCE_FILEINPUTSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h b/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h deleted file mode 100755 index 0e13ac5..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_InputSource.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_INPUTSOURCE_H_INCLUDED -#define JUCE_INPUTSOURCE_H_INCLUDED - - -//============================================================================== -/** - A lightweight object that can create a stream to read some kind of resource. - - This may be used to refer to a file, or some other kind of source, allowing a - caller to create an input stream that can read from it when required. - - @see FileInputSource -*/ -class JUCE_API InputSource -{ -public: - //============================================================================== - InputSource() noexcept {} - - /** Destructor. */ - virtual ~InputSource() {} - - //============================================================================== - /** Returns a new InputStream to read this item. - - @returns an inputstream that the caller will delete, or nullptr if - the filename isn't found. - */ - virtual InputStream* createInputStream() = 0; - - /** Returns a new InputStream to read an item, relative. - - @param relatedItemPath the relative pathname of the resource that is required - @returns an inputstream that the caller will delete, or nullptr if - the item isn't found. - */ - virtual InputStream* createInputStreamFor (const String& relatedItemPath) = 0; - - /** Returns a hash code that uniquely represents this item. - */ - virtual int64 hashCode() const = 0; - - -private: - //============================================================================== - JUCE_LEAK_DETECTOR (InputSource) -}; - - -#endif // JUCE_INPUTSOURCE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp deleted file mode 100755 index 07b9976..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -int64 InputStream::getNumBytesRemaining() -{ - int64 len = getTotalLength(); - - if (len >= 0) - len -= getPosition(); - - return len; -} - -char InputStream::readByte() -{ - char temp = 0; - read (&temp, 1); - return temp; -} - -bool InputStream::readBool() -{ - return readByte() != 0; -} - -short InputStream::readShort() -{ - char temp[2]; - - if (read (temp, 2) == 2) - return (short) ByteOrder::littleEndianShort (temp); - - return 0; -} - -short InputStream::readShortBigEndian() -{ - char temp[2]; - - if (read (temp, 2) == 2) - return (short) ByteOrder::bigEndianShort (temp); - - return 0; -} - -int InputStream::readInt() -{ - char temp[4]; - - if (read (temp, 4) == 4) - return (int) ByteOrder::littleEndianInt (temp); - - return 0; -} - -int InputStream::readIntBigEndian() -{ - char temp[4]; - - if (read (temp, 4) == 4) - return (int) ByteOrder::bigEndianInt (temp); - - return 0; -} - -int InputStream::readCompressedInt() -{ - const uint8 sizeByte = (uint8) readByte(); - if (sizeByte == 0) - return 0; - - const int numBytes = (sizeByte & 0x7f); - if (numBytes > 4) - { - jassertfalse; // trying to read corrupt data - this method must only be used - // to read data that was written by OutputStream::writeCompressedInt() - return 0; - } - - char bytes[4] = { 0, 0, 0, 0 }; - if (read (bytes, numBytes) != numBytes) - return 0; - - const int num = (int) ByteOrder::littleEndianInt (bytes); - return (sizeByte >> 7) ? -num : num; -} - -int64 InputStream::readInt64() -{ - union { uint8 asBytes[8]; uint64 asInt64; } n; - - if (read (n.asBytes, 8) == 8) - return (int64) ByteOrder::swapIfBigEndian (n.asInt64); - - return 0; -} - -int64 InputStream::readInt64BigEndian() -{ - union { uint8 asBytes[8]; uint64 asInt64; } n; - - if (read (n.asBytes, 8) == 8) - return (int64) ByteOrder::swapIfLittleEndian (n.asInt64); - - return 0; -} - -float InputStream::readFloat() -{ - // the union below relies on these types being the same size... - static_jassert (sizeof (int32) == sizeof (float)); - union { int32 asInt; float asFloat; } n; - n.asInt = (int32) readInt(); - return n.asFloat; -} - -float InputStream::readFloatBigEndian() -{ - union { int32 asInt; float asFloat; } n; - n.asInt = (int32) readIntBigEndian(); - return n.asFloat; -} - -double InputStream::readDouble() -{ - union { int64 asInt; double asDouble; } n; - n.asInt = readInt64(); - return n.asDouble; -} - -double InputStream::readDoubleBigEndian() -{ - union { int64 asInt; double asDouble; } n; - n.asInt = readInt64BigEndian(); - return n.asDouble; -} - -String InputStream::readString() -{ - MemoryBlock buffer (256); - char* data = static_cast (buffer.getData()); - size_t i = 0; - - while ((data[i] = readByte()) != 0) - { - if (++i >= buffer.getSize()) - { - buffer.setSize (buffer.getSize() + 512); - data = static_cast (buffer.getData()); - } - } - - return String::fromUTF8 (data, (int) i); -} - -String InputStream::readNextLine() -{ - MemoryBlock buffer (256); - char* data = static_cast (buffer.getData()); - size_t i = 0; - - while ((data[i] = readByte()) != 0) - { - if (data[i] == '\n') - break; - - if (data[i] == '\r') - { - const int64 lastPos = getPosition(); - - if (readByte() != '\n') - setPosition (lastPos); - - break; - } - - if (++i >= buffer.getSize()) - { - buffer.setSize (buffer.getSize() + 512); - data = static_cast (buffer.getData()); - } - } - - return String::fromUTF8 (data, (int) i); -} - -size_t InputStream::readIntoMemoryBlock (MemoryBlock& block, ssize_t numBytes) -{ - MemoryOutputStream mo (block, true); - return (size_t) mo.writeFromInputStream (*this, numBytes); -} - -String InputStream::readEntireStreamAsString() -{ - MemoryOutputStream mo; - mo << *this; - return mo.toString(); -} - -//============================================================================== -void InputStream::skipNextBytes (int64 numBytesToSkip) -{ - if (numBytesToSkip > 0) - { - const int skipBufferSize = (int) jmin (numBytesToSkip, (int64) 16384); - HeapBlock temp ((size_t) skipBufferSize); - - while (numBytesToSkip > 0 && ! isExhausted()) - numBytesToSkip -= read (temp, (int) jmin (numBytesToSkip, (int64) skipBufferSize)); - } -} diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h deleted file mode 100755 index ebdc795..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_InputStream.h +++ /dev/null @@ -1,266 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_INPUTSTREAM_H_INCLUDED -#define JUCE_INPUTSTREAM_H_INCLUDED - - -//============================================================================== -/** The base class for streams that read data. - - Input and output streams are used throughout the library - subclasses can override - some or all of the virtual functions to implement their behaviour. - - @see OutputStream, MemoryInputStream, BufferedInputStream, FileInputStream -*/ -class JUCE_API InputStream -{ -public: - /** Destructor. */ - virtual ~InputStream() {} - - //============================================================================== - /** Returns the total number of bytes available for reading in this stream. - - Note that this is the number of bytes available from the start of the - stream, not from the current position. - - If the size of the stream isn't actually known, this will return -1. - - @see getNumBytesRemaining - */ - virtual int64 getTotalLength() = 0; - - /** Returns the number of bytes available for reading, or a negative value if - the remaining length is not known. - @see getTotalLength - */ - int64 getNumBytesRemaining(); - - /** Returns true if the stream has no more data to read. */ - virtual bool isExhausted() = 0; - - //============================================================================== - /** Reads some data from the stream into a memory buffer. - - This is the only read method that subclasses actually need to implement, as the - InputStream base class implements the other read methods in terms of this one (although - it's often more efficient for subclasses to implement them directly). - - @param destBuffer the destination buffer for the data. This must not be null. - @param maxBytesToRead the maximum number of bytes to read - make sure the - memory block passed in is big enough to contain this - many bytes. This value must not be negative. - - @returns the actual number of bytes that were read, which may be less than - maxBytesToRead if the stream is exhausted before it gets that far - */ - virtual int read (void* destBuffer, int maxBytesToRead) = 0; - - /** Reads a byte from the stream. - If the stream is exhausted, this will return zero. - @see OutputStream::writeByte - */ - virtual char readByte(); - - /** Reads a boolean from the stream. - The bool is encoded as a single byte - non-zero for true, 0 for false. - If the stream is exhausted, this will return false. - @see OutputStream::writeBool - */ - virtual bool readBool(); - - /** Reads two bytes from the stream as a little-endian 16-bit value. - If the next two bytes read are byte1 and byte2, this returns (byte1 | (byte2 << 8)). - If the stream is exhausted partway through reading the bytes, this will return zero. - @see OutputStream::writeShort, readShortBigEndian - */ - virtual short readShort(); - - /** Reads two bytes from the stream as a little-endian 16-bit value. - If the next two bytes read are byte1 and byte2, this returns (byte2 | (byte1 << 8)). - If the stream is exhausted partway through reading the bytes, this will return zero. - @see OutputStream::writeShortBigEndian, readShort - */ - virtual short readShortBigEndian(); - - /** Reads four bytes from the stream as a little-endian 32-bit value. - - If the next four bytes are byte1 to byte4, this returns - (byte1 | (byte2 << 8) | (byte3 << 16) | (byte4 << 24)). - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeInt, readIntBigEndian - */ - virtual int readInt(); - - /** Reads four bytes from the stream as a big-endian 32-bit value. - - If the next four bytes are byte1 to byte4, this returns - (byte4 | (byte3 << 8) | (byte2 << 16) | (byte1 << 24)). - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeIntBigEndian, readInt - */ - virtual int readIntBigEndian(); - - /** Reads eight bytes from the stream as a little-endian 64-bit value. - - If the next eight bytes are byte1 to byte8, this returns - (byte1 | (byte2 << 8) | (byte3 << 16) | (byte4 << 24) | (byte5 << 32) | (byte6 << 40) | (byte7 << 48) | (byte8 << 56)). - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeInt64, readInt64BigEndian - */ - virtual int64 readInt64(); - - /** Reads eight bytes from the stream as a big-endian 64-bit value. - - If the next eight bytes are byte1 to byte8, this returns - (byte8 | (byte7 << 8) | (byte6 << 16) | (byte5 << 24) | (byte4 << 32) | (byte3 << 40) | (byte2 << 48) | (byte1 << 56)). - - If the stream is exhausted partway through reading the bytes, this will return zero. - - @see OutputStream::writeInt64BigEndian, readInt64 - */ - virtual int64 readInt64BigEndian(); - - /** Reads four bytes as a 32-bit floating point value. - The raw 32-bit encoding of the float is read from the stream as a little-endian int. - If the stream is exhausted partway through reading the bytes, this will return zero. - @see OutputStream::writeFloat, readDouble - */ - virtual float readFloat(); - - /** Reads four bytes as a 32-bit floating point value. - The raw 32-bit encoding of the float is read from the stream as a big-endian int. - If the stream is exhausted partway through reading the bytes, this will return zero. - @see OutputStream::writeFloatBigEndian, readDoubleBigEndian - */ - virtual float readFloatBigEndian(); - - /** Reads eight bytes as a 64-bit floating point value. - The raw 64-bit encoding of the double is read from the stream as a little-endian int64. - If the stream is exhausted partway through reading the bytes, this will return zero. - @see OutputStream::writeDouble, readFloat - */ - virtual double readDouble(); - - /** Reads eight bytes as a 64-bit floating point value. - The raw 64-bit encoding of the double is read from the stream as a big-endian int64. - If the stream is exhausted partway through reading the bytes, this will return zero. - @see OutputStream::writeDoubleBigEndian, readFloatBigEndian - */ - virtual double readDoubleBigEndian(); - - /** Reads an encoded 32-bit number from the stream using a space-saving compressed format. - For small values, this is more space-efficient than using readInt() and OutputStream::writeInt() - The format used is: number of significant bytes + up to 4 bytes in little-endian order. - @see OutputStream::writeCompressedInt() - */ - virtual int readCompressedInt(); - - //============================================================================== - /** Reads a UTF-8 string from the stream, up to the next linefeed or carriage return. - - This will read up to the next "\n" or "\r\n" or end-of-stream. - - After this call, the stream's position will be left pointing to the next character - following the line-feed, but the linefeeds aren't included in the string that - is returned. - */ - virtual String readNextLine(); - - /** Reads a zero-terminated UTF-8 string from the stream. - - This will read characters from the stream until it hits a null character - or end-of-stream. - - @see OutputStream::writeString, readEntireStreamAsString - */ - virtual String readString(); - - /** Tries to read the whole stream and turn it into a string. - - This will read from the stream's current position until the end-of-stream. - It can read from UTF-8 data, or UTF-16 if it detects suitable header-bytes. - */ - virtual String readEntireStreamAsString(); - - /** Reads from the stream and appends the data to a MemoryBlock. - - @param destBlock the block to append the data onto - @param maxNumBytesToRead if this is a positive value, it sets a limit to the number - of bytes that will be read - if it's negative, data - will be read until the stream is exhausted. - @returns the number of bytes that were added to the memory block - */ - virtual size_t readIntoMemoryBlock (MemoryBlock& destBlock, - ssize_t maxNumBytesToRead = -1); - - //============================================================================== - /** Returns the offset of the next byte that will be read from the stream. - @see setPosition - */ - virtual int64 getPosition() = 0; - - /** Tries to move the current read position of the stream. - - The position is an absolute number of bytes from the stream's start. - - Some streams might not be able to do this, in which case they should do - nothing and return false. Others might be able to manage it by resetting - themselves and skipping to the correct position, although this is - obviously a bit slow. - - @returns true if the stream manages to reposition itself correctly - @see getPosition - */ - virtual bool setPosition (int64 newPosition) = 0; - - /** Reads and discards a number of bytes from the stream. - - Some input streams might implement this efficiently, but the base - class will just keep reading data until the requisite number of bytes - have been done. - */ - virtual void skipNextBytes (int64 numBytesToSkip); - - -protected: - //============================================================================== - InputStream() noexcept {} - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InputStream) -}; - -#endif // JUCE_INPUTSTREAM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp deleted file mode 100755 index 82b2d14..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -MemoryInputStream::MemoryInputStream (const void* const sourceData, - const size_t sourceDataSize, - const bool keepInternalCopy) - : data (sourceData), - dataSize (sourceDataSize), - position (0) -{ - if (keepInternalCopy) - createInternalCopy(); -} - -MemoryInputStream::MemoryInputStream (const MemoryBlock& sourceData, - const bool keepInternalCopy) - : data (sourceData.getData()), - dataSize (sourceData.getSize()), - position (0) -{ - if (keepInternalCopy) - createInternalCopy(); -} - -void MemoryInputStream::createInternalCopy() -{ - internalCopy.malloc (dataSize); - memcpy (internalCopy, data, dataSize); - data = internalCopy; -} - -MemoryInputStream::~MemoryInputStream() -{ -} - -int64 MemoryInputStream::getTotalLength() -{ - return (int64) dataSize; -} - -int MemoryInputStream::read (void* const buffer, const int howMany) -{ - jassert (buffer != nullptr && howMany >= 0); - - const int num = jmin (howMany, (int) (dataSize - position)); - if (num <= 0) - return 0; - - memcpy (buffer, addBytesToPointer (data, position), (size_t) num); - position += (unsigned int) num; - return num; -} - -bool MemoryInputStream::isExhausted() -{ - return position >= dataSize; -} - -bool MemoryInputStream::setPosition (const int64 pos) -{ - position = (size_t) jlimit ((int64) 0, (int64) dataSize, pos); - return true; -} - -int64 MemoryInputStream::getPosition() -{ - return (int64) position; -} - - -//============================================================================== -#if JUCE_UNIT_TESTS - -class MemoryStreamTests : public UnitTest -{ -public: - MemoryStreamTests() : UnitTest ("MemoryInputStream & MemoryOutputStream") {} - - void runTest() - { - beginTest ("Basics"); - Random r = getRandom(); - - int randomInt = r.nextInt(); - int64 randomInt64 = r.nextInt64(); - double randomDouble = r.nextDouble(); - String randomString (createRandomWideCharString (r)); - - MemoryOutputStream mo; - mo.writeInt (randomInt); - mo.writeIntBigEndian (randomInt); - mo.writeCompressedInt (randomInt); - mo.writeString (randomString); - mo.writeInt64 (randomInt64); - mo.writeInt64BigEndian (randomInt64); - mo.writeDouble (randomDouble); - mo.writeDoubleBigEndian (randomDouble); - - MemoryInputStream mi (mo.getData(), mo.getDataSize(), false); - expect (mi.readInt() == randomInt); - expect (mi.readIntBigEndian() == randomInt); - expect (mi.readCompressedInt() == randomInt); - expectEquals (mi.readString(), randomString); - expect (mi.readInt64() == randomInt64); - expect (mi.readInt64BigEndian() == randomInt64); - expect (mi.readDouble() == randomDouble); - expect (mi.readDoubleBigEndian() == randomDouble); - } - - static String createRandomWideCharString (Random& r) - { - juce_wchar buffer [50] = { 0 }; - - for (int i = 0; i < numElementsInArray (buffer) - 1; ++i) - { - if (r.nextBool()) - { - do - { - buffer[i] = (juce_wchar) (1 + r.nextInt (0x10ffff - 1)); - } - while (! CharPointer_UTF16::canRepresent (buffer[i])); - } - else - buffer[i] = (juce_wchar) (1 + r.nextInt (0xff)); - } - - return CharPointer_UTF32 (buffer); - } -}; - -static MemoryStreamTests memoryInputStreamUnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h deleted file mode 100755 index 013bc39..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryInputStream.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_MEMORYINPUTSTREAM_H_INCLUDED -#define JUCE_MEMORYINPUTSTREAM_H_INCLUDED - - -//============================================================================== -/** - Allows a block of data to be accessed as a stream. - - This can either be used to refer to a shared block of memory, or can make its - own internal copy of the data when the MemoryInputStream is created. -*/ -class JUCE_API MemoryInputStream : public InputStream -{ -public: - //============================================================================== - /** Creates a MemoryInputStream. - - @param sourceData the block of data to use as the stream's source - @param sourceDataSize the number of bytes in the source data block - @param keepInternalCopyOfData if false, the stream will just keep a pointer to - the source data, so this data shouldn't be changed - for the lifetime of the stream; if this parameter is - true, the stream will make its own copy of the - data and use that. - */ - MemoryInputStream (const void* sourceData, - size_t sourceDataSize, - bool keepInternalCopyOfData); - - /** Creates a MemoryInputStream. - - @param data a block of data to use as the stream's source - @param keepInternalCopyOfData if false, the stream will just keep a reference to - the source data, so this data shouldn't be changed - for the lifetime of the stream; if this parameter is - true, the stream will make its own copy of the - data and use that. - */ - MemoryInputStream (const MemoryBlock& data, - bool keepInternalCopyOfData); - - /** Destructor. */ - ~MemoryInputStream(); - - /** Returns a pointer to the source data block from which this stream is reading. */ - const void* getData() const noexcept { return data; } - - /** Returns the number of bytes of source data in the block from which this stream is reading. */ - size_t getDataSize() const noexcept { return dataSize; } - - //============================================================================== - int64 getPosition() override; - bool setPosition (int64 pos) override; - int64 getTotalLength() override; - bool isExhausted() override; - int read (void* destBuffer, int maxBytesToRead) override; - -private: - //============================================================================== - const void* data; - size_t dataSize, position; - HeapBlock internalCopy; - - void createInternalCopy(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryInputStream) -}; - -#endif // JUCE_MEMORYINPUTSTREAM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp deleted file mode 100755 index 28a5585..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.cpp +++ /dev/null @@ -1,214 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -MemoryOutputStream::MemoryOutputStream (const size_t initialSize) - : blockToUse (&internalBlock), externalData (nullptr), - position (0), size (0), availableSize (0) -{ - internalBlock.setSize (initialSize, false); -} - -MemoryOutputStream::MemoryOutputStream (MemoryBlock& memoryBlockToWriteTo, - const bool appendToExistingBlockContent) - : blockToUse (&memoryBlockToWriteTo), externalData (nullptr), - position (0), size (0), availableSize (0) -{ - if (appendToExistingBlockContent) - position = size = memoryBlockToWriteTo.getSize(); -} - -MemoryOutputStream::MemoryOutputStream (void* destBuffer, size_t destBufferSize) - : blockToUse (nullptr), externalData (destBuffer), - position (0), size (0), availableSize (destBufferSize) -{ - jassert (externalData != nullptr); // This must be a valid pointer. -} - -MemoryOutputStream::~MemoryOutputStream() -{ - trimExternalBlockSize(); -} - -void MemoryOutputStream::flush() -{ - trimExternalBlockSize(); -} - -void MemoryOutputStream::trimExternalBlockSize() -{ - if (blockToUse != &internalBlock && blockToUse != nullptr) - blockToUse->setSize (size, false); -} - -void MemoryOutputStream::preallocate (const size_t bytesToPreallocate) -{ - if (blockToUse != nullptr) - blockToUse->ensureSize (bytesToPreallocate + 1); -} - -void MemoryOutputStream::reset() noexcept -{ - position = 0; - size = 0; -} - -char* MemoryOutputStream::prepareToWrite (size_t numBytes) -{ - jassert ((ssize_t) numBytes >= 0); - size_t storageNeeded = position + numBytes; - - char* data; - - if (blockToUse != nullptr) - { - if (storageNeeded >= blockToUse->getSize()) - blockToUse->ensureSize ((storageNeeded + jmin (storageNeeded / 2, (size_t) (1024 * 1024)) + 32) & ~31u); - - data = static_cast (blockToUse->getData()); - } - else - { - if (storageNeeded > availableSize) - return nullptr; - - data = static_cast (externalData); - } - - char* const writePointer = data + position; - position += numBytes; - size = jmax (size, position); - return writePointer; -} - -bool MemoryOutputStream::write (const void* const buffer, size_t howMany) -{ - jassert (buffer != nullptr); - - if (howMany == 0) - return true; - - if (char* dest = prepareToWrite (howMany)) - { - memcpy (dest, buffer, howMany); - return true; - } - - return false; -} - -bool MemoryOutputStream::writeRepeatedByte (uint8 byte, size_t howMany) -{ - if (howMany == 0) - return true; - - if (char* dest = prepareToWrite (howMany)) - { - memset (dest, byte, howMany); - return true; - } - - return false; -} - -bool MemoryOutputStream::appendUTF8Char (juce_wchar c) -{ - if (char* dest = prepareToWrite (CharPointer_UTF8::getBytesRequiredFor (c))) - { - CharPointer_UTF8 (dest).write (c); - return true; - } - - return false; -} - -MemoryBlock MemoryOutputStream::getMemoryBlock() const -{ - return MemoryBlock (getData(), getDataSize()); -} - -const void* MemoryOutputStream::getData() const noexcept -{ - if (blockToUse == nullptr) - return externalData; - - if (blockToUse->getSize() > size) - static_cast (blockToUse->getData()) [size] = 0; - - return blockToUse->getData(); -} - -bool MemoryOutputStream::setPosition (int64 newPosition) -{ - if (newPosition <= (int64) size) - { - // ok to seek backwards - position = jlimit ((size_t) 0, size, (size_t) newPosition); - return true; - } - - // can't move beyond the end of the stream.. - return false; -} - -int64 MemoryOutputStream::writeFromInputStream (InputStream& source, int64 maxNumBytesToWrite) -{ - // before writing from an input, see if we can preallocate to make it more efficient.. - int64 availableData = source.getTotalLength() - source.getPosition(); - - if (availableData > 0) - { - if (maxNumBytesToWrite > availableData || maxNumBytesToWrite < 0) - maxNumBytesToWrite = availableData; - - if (blockToUse != nullptr) - preallocate (blockToUse->getSize() + (size_t) maxNumBytesToWrite); - } - - return OutputStream::writeFromInputStream (source, maxNumBytesToWrite); -} - -String MemoryOutputStream::toUTF8() const -{ - const char* const d = static_cast (getData()); - return String (CharPointer_UTF8 (d), CharPointer_UTF8 (d + getDataSize())); -} - -String MemoryOutputStream::toString() const -{ - return String::createStringFromData (getData(), (int) getDataSize()); -} - -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const MemoryOutputStream& streamToRead) -{ - const size_t dataSize = streamToRead.getDataSize(); - - if (dataSize > 0) - stream.write (streamToRead.getData(), dataSize); - - return stream; -} diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h deleted file mode 100755 index 2e764ef..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_MemoryOutputStream.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_MEMORYOUTPUTSTREAM_H_INCLUDED -#define JUCE_MEMORYOUTPUTSTREAM_H_INCLUDED - - -//============================================================================== -/** - Writes data to an internal memory buffer, which grows as required. - - The data that was written into the stream can then be accessed later as - a contiguous block of memory. -*/ -class JUCE_API MemoryOutputStream : public OutputStream -{ -public: - //============================================================================== - /** Creates an empty memory stream, ready to be written into. - @param initialSize the intial amount of capacity to allocate for writing into - */ - MemoryOutputStream (size_t initialSize = 256); - - /** Creates a memory stream for writing into into a pre-existing MemoryBlock object. - - Note that the destination block will always be larger than the amount of data - that has been written to the stream, because the MemoryOutputStream keeps some - spare capactity at its end. To trim the block's size down to fit the actual - data, call flush(), or delete the MemoryOutputStream. - - @param memoryBlockToWriteTo the block into which new data will be written. - @param appendToExistingBlockContent if this is true, the contents of the block will be - kept, and new data will be appended to it. If false, - the block will be cleared before use - */ - MemoryOutputStream (MemoryBlock& memoryBlockToWriteTo, - bool appendToExistingBlockContent); - - /** Creates a MemoryOutputStream that will write into a user-supplied, fixed-size - block of memory. - When using this mode, the stream will write directly into this memory area until - it's full, at which point write operations will fail. - */ - MemoryOutputStream (void* destBuffer, size_t destBufferSize); - - /** Destructor. - This will free any data that was written to it. - */ - ~MemoryOutputStream(); - - //============================================================================== - /** Returns a pointer to the data that has been written to the stream. - @see getDataSize - */ - const void* getData() const noexcept; - - /** Returns the number of bytes of data that have been written to the stream. - @see getData - */ - size_t getDataSize() const noexcept { return size; } - - /** Resets the stream, clearing any data that has been written to it so far. */ - void reset() noexcept; - - /** Increases the internal storage capacity to be able to contain at least the specified - amount of data without needing to be resized. - */ - void preallocate (size_t bytesToPreallocate); - - /** Appends the utf-8 bytes for a unicode character */ - bool appendUTF8Char (juce_wchar character); - - /** Returns a String created from the (UTF8) data that has been written to the stream. */ - String toUTF8() const; - - /** Attempts to detect the encoding of the data and convert it to a string. - @see String::createStringFromData - */ - String toString() const; - - /** Returns a copy of the stream's data as a memory block. */ - MemoryBlock getMemoryBlock() const; - - //============================================================================== - /** If the stream is writing to a user-supplied MemoryBlock, this will trim any excess - capacity off the block, so that its length matches the amount of actual data that - has been written so far. - */ - void flush(); - - bool write (const void*, size_t) override; - int64 getPosition() override { return (int64) position; } - bool setPosition (int64) override; - int64 writeFromInputStream (InputStream&, int64 maxNumBytesToWrite) override; - bool writeRepeatedByte (uint8 byte, size_t numTimesToRepeat) override; - -private: - //============================================================================== - MemoryBlock* const blockToUse; - MemoryBlock internalBlock; - void* externalData; - size_t position, size, availableSize; - - void trimExternalBlockSize(); - char* prepareToWrite (size_t); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MemoryOutputStream) -}; - -/** Copies all the data that has been written to a MemoryOutputStream into another stream. */ -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const MemoryOutputStream& streamToRead); - - -#endif // JUCE_MEMORYOUTPUTSTREAM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp deleted file mode 100755 index c67e3fb..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.cpp +++ /dev/null @@ -1,351 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#if JUCE_DEBUG - -struct DanglingStreamChecker -{ - DanglingStreamChecker() {} - - ~DanglingStreamChecker() - { - /* - It's always a bad idea to leak any object, but if you're leaking output - streams, then there's a good chance that you're failing to flush a file - to disk properly, which could result in corrupted data and other similar - nastiness.. - */ - jassert (activeStreams.size() == 0); - } - - Array activeStreams; -}; - -static DanglingStreamChecker danglingStreamChecker; -#endif - -//============================================================================== -OutputStream::OutputStream() - : newLineString (NewLine::getDefault()) -{ - #if JUCE_DEBUG - danglingStreamChecker.activeStreams.add (this); - #endif -} - -OutputStream::~OutputStream() -{ - #if JUCE_DEBUG - danglingStreamChecker.activeStreams.removeFirstMatchingValue (this); - #endif -} - -//============================================================================== -bool OutputStream::writeBool (const bool b) -{ - return writeByte (b ? (char) 1 - : (char) 0); -} - -bool OutputStream::writeByte (char byte) -{ - return write (&byte, 1); -} - -bool OutputStream::writeRepeatedByte (uint8 byte, size_t numTimesToRepeat) -{ - for (size_t i = 0; i < numTimesToRepeat; ++i) - if (! writeByte ((char) byte)) - return false; - - return true; -} - -bool OutputStream::writeShort (short value) -{ - const unsigned short v = ByteOrder::swapIfBigEndian ((unsigned short) value); - return write (&v, 2); -} - -bool OutputStream::writeShortBigEndian (short value) -{ - const unsigned short v = ByteOrder::swapIfLittleEndian ((unsigned short) value); - return write (&v, 2); -} - -bool OutputStream::writeInt (int value) -{ - const unsigned int v = ByteOrder::swapIfBigEndian ((unsigned int) value); - return write (&v, 4); -} - -bool OutputStream::writeIntBigEndian (int value) -{ - const unsigned int v = ByteOrder::swapIfLittleEndian ((unsigned int) value); - return write (&v, 4); -} - -bool OutputStream::writeCompressedInt (int value) -{ - unsigned int un = (value < 0) ? (unsigned int) -value - : (unsigned int) value; - - uint8 data[5]; - int num = 0; - - while (un > 0) - { - data[++num] = (uint8) un; - un >>= 8; - } - - data[0] = (uint8) num; - - if (value < 0) - data[0] |= 0x80; - - return write (data, (size_t) num + 1); -} - -bool OutputStream::writeInt64 (int64 value) -{ - const uint64 v = ByteOrder::swapIfBigEndian ((uint64) value); - return write (&v, 8); -} - -bool OutputStream::writeInt64BigEndian (int64 value) -{ - const uint64 v = ByteOrder::swapIfLittleEndian ((uint64) value); - return write (&v, 8); -} - -bool OutputStream::writeFloat (float value) -{ - union { int asInt; float asFloat; } n; - n.asFloat = value; - return writeInt (n.asInt); -} - -bool OutputStream::writeFloatBigEndian (float value) -{ - union { int asInt; float asFloat; } n; - n.asFloat = value; - return writeIntBigEndian (n.asInt); -} - -bool OutputStream::writeDouble (double value) -{ - union { int64 asInt; double asDouble; } n; - n.asDouble = value; - return writeInt64 (n.asInt); -} - -bool OutputStream::writeDoubleBigEndian (double value) -{ - union { int64 asInt; double asDouble; } n; - n.asDouble = value; - return writeInt64BigEndian (n.asInt); -} - -bool OutputStream::writeString (const String& text) -{ - #if (JUCE_STRING_UTF_TYPE == 8) - return write (text.toRawUTF8(), text.getNumBytesAsUTF8() + 1); - #else - // (This avoids using toUTF8() to prevent the memory bloat that it would leave behind - // if lots of large, persistent strings were to be written to streams). - const size_t numBytes = text.getNumBytesAsUTF8() + 1; - HeapBlock temp (numBytes); - text.copyToUTF8 (temp, numBytes); - return write (temp, numBytes); - #endif -} - -bool OutputStream::writeText (const String& text, const bool asUTF16, - const bool writeUTF16ByteOrderMark) -{ - if (asUTF16) - { - if (writeUTF16ByteOrderMark) - write ("\x0ff\x0fe", 2); - - String::CharPointerType src (text.getCharPointer()); - bool lastCharWasReturn = false; - - for (;;) - { - const juce_wchar c = src.getAndAdvance(); - - if (c == 0) - break; - - if (c == '\n' && ! lastCharWasReturn) - writeShort ((short) '\r'); - - lastCharWasReturn = (c == L'\r'); - - if (! writeShort ((short) c)) - return false; - } - } - else - { - const char* src = text.toUTF8(); - const char* t = src; - - for (;;) - { - if (*t == '\n') - { - if (t > src) - if (! write (src, (size_t) (t - src))) - return false; - - if (! write ("\r\n", 2)) - return false; - - src = t + 1; - } - else if (*t == '\r') - { - if (t[1] == '\n') - ++t; - } - else if (*t == 0) - { - if (t > src) - if (! write (src, (size_t) (t - src))) - return false; - - break; - } - - ++t; - } - } - - return true; -} - -int64 OutputStream::writeFromInputStream (InputStream& source, int64 numBytesToWrite) -{ - if (numBytesToWrite < 0) - numBytesToWrite = std::numeric_limits::max(); - - int64 numWritten = 0; - - while (numBytesToWrite > 0) - { - char buffer [8192]; - const int num = source.read (buffer, (int) jmin (numBytesToWrite, (int64) sizeof (buffer))); - - if (num <= 0) - break; - - write (buffer, (size_t) num); - - numBytesToWrite -= num; - numWritten += num; - } - - return numWritten; -} - -//============================================================================== -void OutputStream::setNewLineString (const String& newLineString_) -{ - newLineString = newLineString_; -} - -//============================================================================== -template -static void writeIntToStream (OutputStream& stream, IntegerType number) -{ - char buffer [NumberToStringConverters::charsNeededForInt]; - char* end = buffer + numElementsInArray (buffer); - const char* start = NumberToStringConverters::numberToString (end, number); - stream.write (start, (size_t) (end - start - 1)); -} - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const int number) -{ - writeIntToStream (stream, number); - return stream; -} - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const int64 number) -{ - writeIntToStream (stream, number); - return stream; -} - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const double number) -{ - return stream << String (number); -} - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const char character) -{ - stream.writeByte (character); - return stream; -} - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const char* const text) -{ - stream.write (text, strlen (text)); - return stream; -} - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const MemoryBlock& data) -{ - if (data.getSize() > 0) - stream.write (data.getData(), data.getSize()); - - return stream; -} - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const File& fileToRead) -{ - FileInputStream in (fileToRead); - - if (in.openedOk()) - return stream << in; - - return stream; -} - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, InputStream& streamToRead) -{ - stream.writeFromInputStream (streamToRead, -1); - return stream; -} - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const NewLine&) -{ - return stream << stream.getNewLineString(); -} diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h deleted file mode 100755 index 102ab5a..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_OutputStream.h +++ /dev/null @@ -1,278 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_OUTPUTSTREAM_H_INCLUDED -#define JUCE_OUTPUTSTREAM_H_INCLUDED - - -//============================================================================== -/** - The base class for streams that write data to some kind of destination. - - Input and output streams are used throughout the library - subclasses can override - some or all of the virtual functions to implement their behaviour. - - @see InputStream, MemoryOutputStream, FileOutputStream -*/ -class JUCE_API OutputStream -{ -protected: - //============================================================================== - OutputStream(); - -public: - /** Destructor. - - Some subclasses might want to do things like call flush() during their - destructors. - */ - virtual ~OutputStream(); - - //============================================================================== - /** If the stream is using a buffer, this will ensure it gets written - out to the destination. */ - virtual void flush() = 0; - - /** Tries to move the stream's output position. - - Not all streams will be able to seek to a new position - this will return - false if it fails to work. - - @see getPosition - */ - virtual bool setPosition (int64 newPosition) = 0; - - /** Returns the stream's current position. - - @see setPosition - */ - virtual int64 getPosition() = 0; - - //============================================================================== - /** Writes a block of data to the stream. - - When creating a subclass of OutputStream, this is the only write method - that needs to be overloaded - the base class has methods for writing other - types of data which use this to do the work. - - @param dataToWrite the target buffer to receive the data. This must not be null. - @param numberOfBytes the number of bytes to write. - @returns false if the write operation fails for some reason - */ - virtual bool write (const void* dataToWrite, - size_t numberOfBytes) = 0; - - //============================================================================== - /** Writes a single byte to the stream. - @returns false if the write operation fails for some reason - @see InputStream::readByte - */ - virtual bool writeByte (char byte); - - /** Writes a boolean to the stream as a single byte. - This is encoded as a binary byte (not as text) with a value of 1 or 0. - @returns false if the write operation fails for some reason - @see InputStream::readBool - */ - virtual bool writeBool (bool boolValue); - - /** Writes a 16-bit integer to the stream in a little-endian byte order. - This will write two bytes to the stream: (value & 0xff), then (value >> 8). - @returns false if the write operation fails for some reason - @see InputStream::readShort - */ - virtual bool writeShort (short value); - - /** Writes a 16-bit integer to the stream in a big-endian byte order. - This will write two bytes to the stream: (value >> 8), then (value & 0xff). - @returns false if the write operation fails for some reason - @see InputStream::readShortBigEndian - */ - virtual bool writeShortBigEndian (short value); - - /** Writes a 32-bit integer to the stream in a little-endian byte order. - @returns false if the write operation fails for some reason - @see InputStream::readInt - */ - virtual bool writeInt (int value); - - /** Writes a 32-bit integer to the stream in a big-endian byte order. - @returns false if the write operation fails for some reason - @see InputStream::readIntBigEndian - */ - virtual bool writeIntBigEndian (int value); - - /** Writes a 64-bit integer to the stream in a little-endian byte order. - @returns false if the write operation fails for some reason - @see InputStream::readInt64 - */ - virtual bool writeInt64 (int64 value); - - /** Writes a 64-bit integer to the stream in a big-endian byte order. - @returns false if the write operation fails for some reason - @see InputStream::readInt64BigEndian - */ - virtual bool writeInt64BigEndian (int64 value); - - /** Writes a 32-bit floating point value to the stream in a binary format. - The binary 32-bit encoding of the float is written as a little-endian int. - @returns false if the write operation fails for some reason - @see InputStream::readFloat - */ - virtual bool writeFloat (float value); - - /** Writes a 32-bit floating point value to the stream in a binary format. - The binary 32-bit encoding of the float is written as a big-endian int. - @returns false if the write operation fails for some reason - @see InputStream::readFloatBigEndian - */ - virtual bool writeFloatBigEndian (float value); - - /** Writes a 64-bit floating point value to the stream in a binary format. - The eight raw bytes of the double value are written out as a little-endian 64-bit int. - @returns false if the write operation fails for some reason - @see InputStream::readDouble - */ - virtual bool writeDouble (double value); - - /** Writes a 64-bit floating point value to the stream in a binary format. - The eight raw bytes of the double value are written out as a big-endian 64-bit int. - @see InputStream::readDoubleBigEndian - @returns false if the write operation fails for some reason - */ - virtual bool writeDoubleBigEndian (double value); - - /** Writes a byte to the output stream a given number of times. - @returns false if the write operation fails for some reason - */ - virtual bool writeRepeatedByte (uint8 byte, size_t numTimesToRepeat); - - /** Writes a condensed binary encoding of a 32-bit integer. - - If you're storing a lot of integers which are unlikely to have very large values, - this can save a lot of space, because values under 0xff will only take up 2 bytes, - under 0xffff only 3 bytes, etc. - - The format used is: number of significant bytes + up to 4 bytes in little-endian order. - - @returns false if the write operation fails for some reason - @see InputStream::readCompressedInt - */ - virtual bool writeCompressedInt (int value); - - /** Stores a string in the stream in a binary format. - - This isn't the method to use if you're trying to append text to the end of a - text-file! It's intended for storing a string so that it can be retrieved later - by InputStream::readString(). - - It writes the string to the stream as UTF8, including the null termination character. - - For appending text to a file, instead use writeText, or operator<< - - @returns false if the write operation fails for some reason - @see InputStream::readString, writeText, operator<< - */ - virtual bool writeString (const String& text); - - /** Writes a string of text to the stream. - - It can either write the text as UTF-8 or UTF-16, and can also add the UTF-16 byte-order-mark - bytes (0xff, 0xfe) to indicate the endianness (these should only be used at the start - of a file). - - The method also replaces '\\n' characters in the text with '\\r\\n'. - @returns false if the write operation fails for some reason - */ - virtual bool writeText (const String& text, - bool asUTF16, - bool writeUTF16ByteOrderMark); - - /** Reads data from an input stream and writes it to this stream. - - @param source the stream to read from - @param maxNumBytesToWrite the number of bytes to read from the stream (if this is - less than zero, it will keep reading until the input - is exhausted) - @returns the number of bytes written - */ - virtual int64 writeFromInputStream (InputStream& source, int64 maxNumBytesToWrite); - - //============================================================================== - /** Sets the string that will be written to the stream when the writeNewLine() - method is called. - By default this will be set the value of NewLine::getDefault(). - */ - void setNewLineString (const String& newLineString); - - /** Returns the current new-line string that was set by setNewLineString(). */ - const String& getNewLineString() const noexcept { return newLineString; } - -private: - //============================================================================== - String newLineString; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OutputStream) -}; - -//============================================================================== -/** Writes a number to a stream as 8-bit characters in the default system encoding. */ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, int number); - -/** Writes a number to a stream as 8-bit characters in the default system encoding. */ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, int64 number); - -/** Writes a number to a stream as 8-bit characters in the default system encoding. */ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, double number); - -/** Writes a character to a stream. */ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, char character); - -/** Writes a null-terminated text string to a stream. */ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const char* text); - -/** Writes a block of data from a MemoryBlock to a stream. */ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const MemoryBlock& data); - -/** Writes the contents of a file to a stream. */ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const File& fileToRead); - -/** Writes the complete contents of an input stream to an output stream. */ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, InputStream& streamToRead); - -/** Writes a new-line to a stream. - You can use the predefined symbol 'newLine' to invoke this, e.g. - @code - myOutputStream << "Hello World" << newLine << newLine; - @endcode - @see OutputStream::setNewLineString -*/ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const NewLine&); - - -#endif // JUCE_OUTPUTSTREAM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp b/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp deleted file mode 100755 index c998c79..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -SubregionStream::SubregionStream (InputStream* const sourceStream, - const int64 start, const int64 length, - const bool deleteSourceWhenDestroyed) - : source (sourceStream, deleteSourceWhenDestroyed), - startPositionInSourceStream (start), - lengthOfSourceStream (length) -{ - SubregionStream::setPosition (0); -} - -SubregionStream::~SubregionStream() -{ -} - -int64 SubregionStream::getTotalLength() -{ - const int64 srcLen = source->getTotalLength() - startPositionInSourceStream; - - return lengthOfSourceStream >= 0 ? jmin (lengthOfSourceStream, srcLen) - : srcLen; -} - -int64 SubregionStream::getPosition() -{ - return source->getPosition() - startPositionInSourceStream; -} - -bool SubregionStream::setPosition (int64 newPosition) -{ - return source->setPosition (jmax ((int64) 0, newPosition + startPositionInSourceStream)); -} - -int SubregionStream::read (void* destBuffer, int maxBytesToRead) -{ - jassert (destBuffer != nullptr && maxBytesToRead >= 0); - - if (lengthOfSourceStream < 0) - return source->read (destBuffer, maxBytesToRead); - - maxBytesToRead = (int) jmin ((int64) maxBytesToRead, lengthOfSourceStream - getPosition()); - - if (maxBytesToRead <= 0) - return 0; - - return source->read (destBuffer, maxBytesToRead); -} - -bool SubregionStream::isExhausted() -{ - if (lengthOfSourceStream >= 0 && getPosition() >= lengthOfSourceStream) - return true; - - return source->isExhausted(); -} diff --git a/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h b/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h deleted file mode 100755 index d291a03..0000000 --- a/JuceLibraryCode/modules/juce_core/streams/juce_SubregionStream.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SUBREGIONSTREAM_H_INCLUDED -#define JUCE_SUBREGIONSTREAM_H_INCLUDED - - -//============================================================================== -/** Wraps another input stream, and reads from a specific part of it. - - This lets you take a subsection of a stream and present it as an entire - stream in its own right. -*/ -class JUCE_API SubregionStream : public InputStream -{ -public: - //============================================================================== - /** Creates a SubregionStream from an input source. - - @param sourceStream the source stream to read from - @param startPositionInSourceStream this is the position in the source stream that - corresponds to position 0 in this stream - @param lengthOfSourceStream this specifies the maximum number of bytes - from the source stream that will be passed through - by this stream. When the position of this stream - exceeds lengthOfSourceStream, it will cause an end-of-stream. - If the length passed in here is greater than the length - of the source stream (as returned by getTotalLength()), - then the smaller value will be used. - Passing a negative value for this parameter means it - will keep reading until the source's end-of-stream. - @param deleteSourceWhenDestroyed whether the sourceStream that is passed in should be - deleted by this object when it is itself deleted. - */ - SubregionStream (InputStream* sourceStream, - int64 startPositionInSourceStream, - int64 lengthOfSourceStream, - bool deleteSourceWhenDestroyed); - - /** Destructor. - - This may also delete the source stream, if that option was chosen when the - buffered stream was created. - */ - ~SubregionStream(); - - - //============================================================================== - int64 getTotalLength() override; - int64 getPosition() override; - bool setPosition (int64 newPosition) override; - int read (void* destBuffer, int maxBytesToRead) override; - bool isExhausted() override; - -private: - //============================================================================== - OptionalScopedPointer source; - const int64 startPositionInSourceStream, lengthOfSourceStream; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SubregionStream) -}; - -#endif // JUCE_SUBREGIONSTREAM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h b/JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h deleted file mode 100755 index dbed46c..0000000 --- a/JuceLibraryCode/modules/juce_core/system/juce_CompilerSupport.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_COMPILERSUPPORT_H_INCLUDED -#define JUCE_COMPILERSUPPORT_H_INCLUDED - -/* This file has some checks to see whether the compiler supports various C++11/14 features, - When these aren't available, the code defines a few workarounds, so that we can still use - some of the newer language features like nullptr and noexcept, even on old compilers. -*/ - -//============================================================================== -// GCC -#if (__cplusplus >= 201103L || defined (__GXX_EXPERIMENTAL_CXX0X__)) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 - #define JUCE_COMPILER_SUPPORTS_NOEXCEPT 1 - #define JUCE_COMPILER_SUPPORTS_NULLPTR 1 - #define JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS 1 - #define JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS 1 - #define JUCE_COMPILER_SUPPORTS_VARIADIC_TEMPLATES 1 - - #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && ! defined (JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL) - #define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1 - #endif - - #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && ! defined (JUCE_DELETED_FUNCTION) - #define JUCE_DELETED_FUNCTION = delete - #endif - - #if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && ! defined (JUCE_COMPILER_SUPPORTS_LAMBDAS) - #define JUCE_COMPILER_SUPPORTS_LAMBDAS 1 - #endif -#endif - -//============================================================================== -// Clang -#if JUCE_CLANG && defined (__has_feature) - #if __has_feature (cxx_nullptr) - #define JUCE_COMPILER_SUPPORTS_NULLPTR 1 - #endif - - #if __has_feature (cxx_noexcept) - #define JUCE_COMPILER_SUPPORTS_NOEXCEPT 1 - #endif - - #if __has_feature (cxx_rvalue_references) - #define JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS 1 - #endif - - #if __has_feature (cxx_deleted_functions) - #define JUCE_DELETED_FUNCTION = delete - #endif - - #if __has_feature (cxx_lambdas) && (defined (_LIBCPP_VERSION) || ! (JUCE_MAC || JUCE_IOS)) - #define JUCE_COMPILER_SUPPORTS_LAMBDAS 1 - #endif - - #if __has_feature (cxx_generalized_initializers) && (defined (_LIBCPP_VERSION) || ! (JUCE_MAC || JUCE_IOS)) - #define JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS 1 - #endif - - #if __has_feature (cxx_variadic_templates) - #define JUCE_COMPILER_SUPPORTS_VARIADIC_TEMPLATES 1 - #endif - - #ifndef JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL - #define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1 - #endif - - #ifndef JUCE_COMPILER_SUPPORTS_ARC - #define JUCE_COMPILER_SUPPORTS_ARC 1 - #endif - -#endif - -//============================================================================== -// MSVC -#ifdef _MSC_VER - #if _MSC_VER >= 1600 - #define JUCE_COMPILER_SUPPORTS_NULLPTR 1 - #define JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS 1 - #endif - - #if _MSC_VER >= 1700 - #define JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL 1 - #define JUCE_COMPILER_SUPPORTS_LAMBDAS 1 - #endif - - #if _MSC_VER >= 1800 - #define JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS 1 - #define JUCE_COMPILER_SUPPORTS_VARIADIC_TEMPLATES 1 - #endif - - #if _MSC_VER >= 1900 - #define JUCE_COMPILER_SUPPORTS_NOEXCEPT 1 - #define JUCE_DELETED_FUNCTION = delete - #endif -#endif - -//============================================================================== -// Declare some fake versions of nullptr and noexcept, for older compilers: - -#ifndef JUCE_DELETED_FUNCTION - /** This macro can be placed after a method declaration to allow the use of - the C++11 feature "= delete" on all compilers. - On newer compilers that support it, it does the C++11 "= delete", but on - older ones it's just an empty definition. - */ - #define JUCE_DELETED_FUNCTION -#endif - -#if ! DOXYGEN - #if ! JUCE_COMPILER_SUPPORTS_NOEXCEPT - #ifdef noexcept - #undef noexcept - #endif - #define noexcept throw() - #if defined (_MSC_VER) && _MSC_VER > 1600 - #define _ALLOW_KEYWORD_MACROS 1 // (to stop VC2012 complaining) - #endif - #endif - - #if ! JUCE_COMPILER_SUPPORTS_NULLPTR - #ifdef nullptr - #undef nullptr - #endif - #define nullptr (0) - #endif - - #if ! JUCE_COMPILER_SUPPORTS_OVERRIDE_AND_FINAL - #undef override - #define override - #endif -#endif - -#endif // JUCE_COMPILERSUPPORT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h b/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h deleted file mode 100755 index 3252fdb..0000000 --- a/JuceLibraryCode/modules/juce_core/system/juce_PlatformDefs.h +++ /dev/null @@ -1,339 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_PLATFORMDEFS_H_INCLUDED -#define JUCE_PLATFORMDEFS_H_INCLUDED - -//============================================================================== -/* This file defines miscellaneous macros for debugging, assertions, etc. -*/ - -//============================================================================== -#ifdef JUCE_FORCE_DEBUG - #undef JUCE_DEBUG - - #if JUCE_FORCE_DEBUG - #define JUCE_DEBUG 1 - #endif -#endif - -/** This macro defines the C calling convention used as the standard for Juce calls. */ -#if JUCE_MSVC - #define JUCE_CALLTYPE __stdcall - #define JUCE_CDECL __cdecl -#else - #define JUCE_CALLTYPE - #define JUCE_CDECL -#endif - -//============================================================================== -// Debugging and assertion macros - -#if JUCE_LOG_ASSERTIONS || JUCE_DEBUG - #define juce_LogCurrentAssertion juce::logAssertion (__FILE__, __LINE__); -#else - #define juce_LogCurrentAssertion -#endif - -//============================================================================== -#if JUCE_IOS || JUCE_LINUX || JUCE_ANDROID || JUCE_PPC - /** This will try to break into the debugger if the app is currently being debugged. - If called by an app that's not being debugged, the behaiour isn't defined - it may crash or not, depending - on the platform. - @see jassert() - */ - #define juce_breakDebugger { ::kill (0, SIGTRAP); } -#elif JUCE_USE_MSVC_INTRINSICS - #ifndef __INTEL_COMPILER - #pragma intrinsic (__debugbreak) - #endif - #define juce_breakDebugger { __debugbreak(); } -#elif JUCE_GCC || JUCE_MAC - #if JUCE_NO_INLINE_ASM - #define juce_breakDebugger { } - #else - #define juce_breakDebugger { asm ("int $3"); } - #endif -#else - #define juce_breakDebugger { __asm int 3 } -#endif - -#if JUCE_CLANG && defined (__has_feature) && ! defined (JUCE_ANALYZER_NORETURN) - #if __has_feature (attribute_analyzer_noreturn) - inline void __attribute__((analyzer_noreturn)) juce_assert_noreturn() {} - #define JUCE_ANALYZER_NORETURN juce_assert_noreturn(); - #endif -#endif - -#ifndef JUCE_ANALYZER_NORETURN - #define JUCE_ANALYZER_NORETURN -#endif - -//============================================================================== -#if JUCE_MSVC && ! DOXYGEN - #define MACRO_WITH_FORCED_SEMICOLON(x) \ - __pragma(warning(push)) \ - __pragma(warning(disable:4127)) \ - do { x } while (false) \ - __pragma(warning(pop)) -#else - /** This is the good old C++ trick for creating a macro that forces the user to put - a semicolon after it when they use it. - */ - #define MACRO_WITH_FORCED_SEMICOLON(x) do { x } while (false) -#endif - -//============================================================================== -#if JUCE_DEBUG || DOXYGEN - /** Writes a string to the standard error stream. - This is only compiled in a debug build. - @see Logger::outputDebugString - */ - #define DBG(dbgtext) MACRO_WITH_FORCED_SEMICOLON (juce::String tempDbgBuf; tempDbgBuf << dbgtext; juce::Logger::outputDebugString (tempDbgBuf);) - - //============================================================================== - /** This will always cause an assertion failure. - It is only compiled in a debug build, (unless JUCE_LOG_ASSERTIONS is enabled for your build). - @see jassert - */ - #define jassertfalse MACRO_WITH_FORCED_SEMICOLON (juce_LogCurrentAssertion; if (juce::juce_isRunningUnderDebugger()) juce_breakDebugger; JUCE_ANALYZER_NORETURN) - - //============================================================================== - /** Platform-independent assertion macro. - - This macro gets turned into a no-op when you're building with debugging turned off, so be - careful that the expression you pass to it doesn't perform any actions that are vital for the - correct behaviour of your program! - @see jassertfalse - */ - #define jassert(expression) MACRO_WITH_FORCED_SEMICOLON (if (! (expression)) jassertfalse;) - -#else - //============================================================================== - // If debugging is disabled, these dummy debug and assertion macros are used.. - - #define DBG(dbgtext) - #define jassertfalse MACRO_WITH_FORCED_SEMICOLON (juce_LogCurrentAssertion) - - #if JUCE_LOG_ASSERTIONS - #define jassert(expression) MACRO_WITH_FORCED_SEMICOLON (if (! (expression)) jassertfalse;) - #else - #define jassert(a) MACRO_WITH_FORCED_SEMICOLON ( ; ) - #endif - -#endif - -//============================================================================== -#ifndef DOXYGEN -namespace juce -{ - template struct JuceStaticAssert; - template <> struct JuceStaticAssert { static void dummy() {} }; -} -#endif - -/** A compile-time assertion macro. - If the expression parameter is false, the macro will cause a compile error. (The actual error - message that the compiler generates may be completely bizarre and seem to have no relation to - the place where you put the static_assert though!) -*/ -#define static_jassert(expression) juce::JuceStaticAssert::dummy(); - -/** This is a shorthand macro for declaring stubs for a class's copy constructor and operator=. - - For example, instead of - @code - class MyClass - { - etc.. - - private: - MyClass (const MyClass&); - MyClass& operator= (const MyClass&); - };@endcode - - ..you can just write: - - @code - class MyClass - { - etc.. - - private: - JUCE_DECLARE_NON_COPYABLE (MyClass) - };@endcode -*/ -#define JUCE_DECLARE_NON_COPYABLE(className) \ - className (const className&) JUCE_DELETED_FUNCTION;\ - className& operator= (const className&) JUCE_DELETED_FUNCTION; - -/** This is a shorthand way of writing both a JUCE_DECLARE_NON_COPYABLE and - JUCE_LEAK_DETECTOR macro for a class. -*/ -#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className) \ - JUCE_DECLARE_NON_COPYABLE(className) \ - JUCE_LEAK_DETECTOR(className) - -/** This macro can be added to class definitions to disable the use of new/delete to - allocate the object on the heap, forcing it to only be used as a stack or member variable. -*/ -#define JUCE_PREVENT_HEAP_ALLOCATION \ - private: \ - static void* operator new (size_t) JUCE_DELETED_FUNCTION; \ - static void operator delete (void*) JUCE_DELETED_FUNCTION; - - -//============================================================================== -#if ! DOXYGEN - #define JUCE_JOIN_MACRO_HELPER(a, b) a ## b - #define JUCE_STRINGIFY_MACRO_HELPER(a) #a -#endif - -/** A good old-fashioned C macro concatenation helper. - This combines two items (which may themselves be macros) into a single string, - avoiding the pitfalls of the ## macro operator. -*/ -#define JUCE_JOIN_MACRO(item1, item2) JUCE_JOIN_MACRO_HELPER (item1, item2) - -/** A handy C macro for stringifying any symbol, rather than just a macro parameter. -*/ -#define JUCE_STRINGIFY(item) JUCE_STRINGIFY_MACRO_HELPER (item) - - -//============================================================================== -#if JUCE_MSVC && ! defined (DOXYGEN) - #define JUCE_WARNING_HELPER(file, line, mess) message(file "(" JUCE_STRINGIFY (line) ") : Warning: " #mess) - #define JUCE_COMPILER_WARNING(message) __pragma(JUCE_WARNING_HELPER (__FILE__, __LINE__, message)); -#else - #ifndef DOXYGEN - #define JUCE_WARNING_HELPER(mess) message(#mess) - #endif - - /** This macro allows you to emit a custom compiler warning message. - Very handy for marking bits of code as "to-do" items, or for shaming - code written by your co-workers in a way that's hard to ignore. - - GCC and Clang provide the \#warning directive, but MSVC doesn't, so this macro - is a cross-compiler way to get the same functionality as \#warning. - */ - #define JUCE_COMPILER_WARNING(message) _Pragma(JUCE_STRINGIFY (JUCE_WARNING_HELPER (message))); -#endif - - -//============================================================================== -#if JUCE_CATCH_UNHANDLED_EXCEPTIONS - - #define JUCE_TRY try - - #define JUCE_CATCH_ALL catch (...) {} - #define JUCE_CATCH_ALL_ASSERT catch (...) { jassertfalse; } - - #if ! JUCE_MODULE_AVAILABLE_juce_gui_basics - #define JUCE_CATCH_EXCEPTION JUCE_CATCH_ALL - #else - /** Used in try-catch blocks, this macro will send exceptions to the JUCEApplicationBase - object so they can be logged by the application if it wants to. - */ - #define JUCE_CATCH_EXCEPTION \ - catch (const std::exception& e) \ - { \ - juce::JUCEApplicationBase::sendUnhandledException (&e, __FILE__, __LINE__); \ - } \ - catch (...) \ - { \ - juce::JUCEApplicationBase::sendUnhandledException (nullptr, __FILE__, __LINE__); \ - } - #endif - -#else - - #define JUCE_TRY - #define JUCE_CATCH_EXCEPTION - #define JUCE_CATCH_ALL - #define JUCE_CATCH_ALL_ASSERT - -#endif - -//============================================================================== -#if JUCE_DEBUG || DOXYGEN - /** A platform-independent way of forcing an inline function. - Use the syntax: @code - forcedinline void myfunction (int x) - @endcode - */ - #define forcedinline inline -#else - #if JUCE_MSVC - #define forcedinline __forceinline - #else - #define forcedinline inline __attribute__((always_inline)) - #endif -#endif - -#if JUCE_MSVC || DOXYGEN - /** This can be placed before a stack or member variable declaration to tell the compiler - to align it to the specified number of bytes. */ - #define JUCE_ALIGN(bytes) __declspec (align (bytes)) -#else - #define JUCE_ALIGN(bytes) __attribute__ ((aligned (bytes))) -#endif - -//============================================================================== -// Cross-compiler deprecation macros.. -#ifdef DOXYGEN - /** This macro can be used to wrap a function which has been deprecated. */ - #define JUCE_DEPRECATED(functionDef) - #define JUCE_DEPRECATED_WITH_BODY(functionDef, body) -#elif JUCE_MSVC && ! JUCE_NO_DEPRECATION_WARNINGS - #define JUCE_DEPRECATED(functionDef) __declspec(deprecated) functionDef - #define JUCE_DEPRECATED_WITH_BODY(functionDef, body) __declspec(deprecated) functionDef body -#elif JUCE_GCC && ! JUCE_NO_DEPRECATION_WARNINGS - #define JUCE_DEPRECATED(functionDef) functionDef __attribute__ ((deprecated)) - #define JUCE_DEPRECATED_WITH_BODY(functionDef, body) functionDef __attribute__ ((deprecated)) body -#else - #define JUCE_DEPRECATED(functionDef) functionDef - #define JUCE_DEPRECATED_WITH_BODY(functionDef, body) functionDef body -#endif - -//============================================================================== -#if JUCE_ANDROID && ! DOXYGEN - #define JUCE_MODAL_LOOPS_PERMITTED 0 -#elif ! defined (JUCE_MODAL_LOOPS_PERMITTED) - /** Some operating environments don't provide a modal loop mechanism, so this flag can be - used to disable any functions that try to run a modal loop. */ - #define JUCE_MODAL_LOOPS_PERMITTED 1 -#endif - -//============================================================================== -#if JUCE_GCC - #define JUCE_PACKED __attribute__((packed)) -#elif ! DOXYGEN - #define JUCE_PACKED -#endif - -#endif // JUCE_PLATFORMDEFS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h b/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h deleted file mode 100755 index b70c981..0000000 --- a/JuceLibraryCode/modules/juce_core/system/juce_StandardHeader.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_STANDARDHEADER_H_INCLUDED -#define JUCE_STANDARDHEADER_H_INCLUDED - -//============================================================================== -/** Current JUCE version number. - - See also SystemStats::getJUCEVersion() for a string version. -*/ -#define JUCE_MAJOR_VERSION 3 -#define JUCE_MINOR_VERSION 1 -#define JUCE_BUILDNUMBER 1 - -/** Current Juce version number. - - Bits 16 to 32 = major version. - Bits 8 to 16 = minor version. - Bits 0 to 8 = point release. - - See also SystemStats::getJUCEVersion() for a string version. -*/ -#define JUCE_VERSION ((JUCE_MAJOR_VERSION << 16) + (JUCE_MINOR_VERSION << 8) + JUCE_BUILDNUMBER) - - -//============================================================================== -#include // included before platform defs to provide a definition of _LIBCPP_VERSION - -#include "juce_PlatformDefs.h" -#include "juce_CompilerSupport.h" - -//============================================================================== -// Now we'll include some common OS headers.. -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4514 4245 4100) -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if JUCE_USE_MSVC_INTRINSICS - #include -#endif - -#if JUCE_MAC || JUCE_IOS - #include -#endif - -#if JUCE_LINUX - #include - - #if __INTEL_COMPILER - #if __ia64__ - #include - #else - #include - #endif - #endif -#endif - -#if JUCE_MSVC && JUCE_DEBUG - #include -#endif - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -#if JUCE_ANDROID - #include - #include -#endif - -// undef symbols that are sometimes set by misguided 3rd-party headers.. -#undef check -#undef TYPE_BOOL -#undef max -#undef min - -//============================================================================== -// DLL building settings on Windows -#if JUCE_MSVC - #ifdef JUCE_DLL_BUILD - #define JUCE_API __declspec (dllexport) - #pragma warning (disable: 4251) - #elif defined (JUCE_DLL) - #define JUCE_API __declspec (dllimport) - #pragma warning (disable: 4251) - #endif - #ifdef __INTEL_COMPILER - #pragma warning (disable: 1125) // (virtual override warning) - #endif -#elif defined (JUCE_DLL) || defined (JUCE_DLL_BUILD) - #define JUCE_API __attribute__ ((visibility("default"))) -#endif - -//============================================================================== -#ifndef JUCE_API - #define JUCE_API /**< This macro is added to all juce public class declarations. */ -#endif - -#if JUCE_MSVC && JUCE_DLL_BUILD - #define JUCE_PUBLIC_IN_DLL_BUILD(declaration) public: declaration; private: -#else - #define JUCE_PUBLIC_IN_DLL_BUILD(declaration) declaration; -#endif - -/** This macro is added to all juce public function declarations. */ -#define JUCE_PUBLIC_FUNCTION JUCE_API JUCE_CALLTYPE - -#if (! defined (JUCE_CATCH_DEPRECATED_CODE_MISUSE)) && JUCE_DEBUG && ! DOXYGEN - /** This turns on some non-essential bits of code that should prevent old code from compiling - in cases where method signatures have changed, etc. - */ - #define JUCE_CATCH_DEPRECATED_CODE_MISUSE 1 -#endif - -#ifndef DOXYGEN - #define JUCE_NAMESPACE juce // This old macro is deprecated: you should just use the juce namespace directly. -#endif - -#endif // JUCE_STANDARDHEADER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp b/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp deleted file mode 100755 index 365e94d..0000000 --- a/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -String SystemStats::getJUCEVersion() -{ - // Some basic tests, to keep an eye on things and make sure these types work ok - // on all platforms. Let me know if any of these assertions fail on your system! - static_jassert (sizeof (pointer_sized_int) == sizeof (void*)); - static_jassert (sizeof (int8) == 1); - static_jassert (sizeof (uint8) == 1); - static_jassert (sizeof (int16) == 2); - static_jassert (sizeof (uint16) == 2); - static_jassert (sizeof (int32) == 4); - static_jassert (sizeof (uint32) == 4); - static_jassert (sizeof (int64) == 8); - static_jassert (sizeof (uint64) == 8); - - return "JUCE v" JUCE_STRINGIFY(JUCE_MAJOR_VERSION) - "." JUCE_STRINGIFY(JUCE_MINOR_VERSION) - "." JUCE_STRINGIFY(JUCE_BUILDNUMBER); -} - -#if JUCE_ANDROID && ! defined (JUCE_DISABLE_JUCE_VERSION_PRINTING) - #define JUCE_DISABLE_JUCE_VERSION_PRINTING 1 -#endif - -#if JUCE_DEBUG && ! JUCE_DISABLE_JUCE_VERSION_PRINTING - struct JuceVersionPrinter - { - JuceVersionPrinter() - { - DBG (SystemStats::getJUCEVersion()); - } - }; - - static JuceVersionPrinter juceVersionPrinter; -#endif - - -//============================================================================== -struct CPUInformation -{ - CPUInformation() noexcept - : numCpus (0), hasMMX (false), hasSSE (false), - hasSSE2 (false), hasSSE3 (false), has3DNow (false) - { - initialise(); - } - - void initialise() noexcept; - - int numCpus; - bool hasMMX, hasSSE, hasSSE2, hasSSE3, has3DNow; -}; - -static const CPUInformation& getCPUInformation() noexcept -{ - static CPUInformation info; - return info; -} - -int SystemStats::getNumCpus() noexcept { return getCPUInformation().numCpus; } -bool SystemStats::hasMMX() noexcept { return getCPUInformation().hasMMX; } -bool SystemStats::hasSSE() noexcept { return getCPUInformation().hasSSE; } -bool SystemStats::hasSSE2() noexcept { return getCPUInformation().hasSSE2; } -bool SystemStats::hasSSE3() noexcept { return getCPUInformation().hasSSE3; } -bool SystemStats::has3DNow() noexcept { return getCPUInformation().has3DNow; } - - -//============================================================================== -String SystemStats::getStackBacktrace() -{ - String result; - - #if JUCE_ANDROID || JUCE_MINGW - jassertfalse; // sorry, not implemented yet! - - #elif JUCE_WINDOWS - HANDLE process = GetCurrentProcess(); - SymInitialize (process, nullptr, TRUE); - - void* stack[128]; - int frames = (int) CaptureStackBackTrace (0, numElementsInArray (stack), stack, nullptr); - - HeapBlock symbol; - symbol.calloc (sizeof (SYMBOL_INFO) + 256, 1); - symbol->MaxNameLen = 255; - symbol->SizeOfStruct = sizeof (SYMBOL_INFO); - - for (int i = 0; i < frames; ++i) - { - DWORD64 displacement = 0; - - if (SymFromAddr (process, (DWORD64) stack[i], &displacement, symbol)) - { - result << i << ": "; - - IMAGEHLP_MODULE64 moduleInfo; - zerostruct (moduleInfo); - moduleInfo.SizeOfStruct = sizeof (moduleInfo); - - if (::SymGetModuleInfo64 (process, symbol->ModBase, &moduleInfo)) - result << moduleInfo.ModuleName << ": "; - - result << symbol->Name << " + 0x" << String::toHexString ((int64) displacement) << newLine; - } - } - - #else - void* stack[128]; - int frames = backtrace (stack, numElementsInArray (stack)); - char** frameStrings = backtrace_symbols (stack, frames); - - for (int i = 0; i < frames; ++i) - result << frameStrings[i] << newLine; - - ::free (frameStrings); - #endif - - return result; -} - -//============================================================================== -static SystemStats::CrashHandlerFunction globalCrashHandler = nullptr; - -#if JUCE_WINDOWS -static LONG WINAPI handleCrash (LPEXCEPTION_POINTERS) -{ - globalCrashHandler(); - return EXCEPTION_EXECUTE_HANDLER; -} -#else -static void handleCrash (int) -{ - globalCrashHandler(); - kill (getpid(), SIGKILL); -} - -int juce_siginterrupt (int sig, int flag); -#endif - -void SystemStats::setApplicationCrashHandler (CrashHandlerFunction handler) -{ - jassert (handler != nullptr); // This must be a valid function. - globalCrashHandler = handler; - - #if JUCE_WINDOWS - SetUnhandledExceptionFilter (handleCrash); - #else - const int signals[] = { SIGFPE, SIGILL, SIGSEGV, SIGBUS, SIGABRT, SIGSYS }; - - for (int i = 0; i < numElementsInArray (signals); ++i) - { - ::signal (signals[i], handleCrash); - juce_siginterrupt (signals[i], 1); - } - #endif -} diff --git a/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h b/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h deleted file mode 100755 index 023dcc0..0000000 --- a/JuceLibraryCode/modules/juce_core/system/juce_SystemStats.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SYSTEMSTATS_H_INCLUDED -#define JUCE_SYSTEMSTATS_H_INCLUDED - - -//============================================================================== -/** - Contains methods for finding out about the current hardware and OS configuration. -*/ -class JUCE_API SystemStats -{ -public: - //============================================================================== - /** Returns the current version of JUCE, - See also the JUCE_VERSION, JUCE_MAJOR_VERSION and JUCE_MINOR_VERSION macros. - */ - static String getJUCEVersion(); - - //============================================================================== - /** The set of possible results of the getOperatingSystemType() method. */ - enum OperatingSystemType - { - UnknownOS = 0, - - Linux = 0x2000, - Android = 0x3000, - iOS = 0x8000, - - MacOSX_10_4 = 0x1004, - MacOSX_10_5 = 0x1005, - MacOSX_10_6 = 0x1006, - MacOSX_10_7 = 0x1007, - MacOSX_10_8 = 0x1008, - MacOSX_10_9 = 0x1009, - MacOSX_10_10 = 0x100a, - - Win2000 = 0x4105, - WinXP = 0x4106, - WinVista = 0x4107, - Windows7 = 0x4108, - Windows8_0 = 0x4109, - Windows8_1 = 0x410a, - - Windows = 0x4000, /**< To test whether any version of Windows is running, - you can use the expression ((getOperatingSystemType() & Windows) != 0). */ - }; - - /** Returns the type of operating system we're running on. - - @returns one of the values from the OperatingSystemType enum. - @see getOperatingSystemName - */ - static OperatingSystemType getOperatingSystemType(); - - /** Returns the name of the type of operating system we're running on. - - @returns a string describing the OS type. - @see getOperatingSystemType - */ - static String getOperatingSystemName(); - - /** Returns true if the OS is 64-bit, or false for a 32-bit OS. */ - static bool isOperatingSystem64Bit(); - - /** Returns an environment variable. - If the named value isn't set, this will return the defaultValue string instead. - */ - static String getEnvironmentVariable (const String& name, const String& defaultValue); - - //============================================================================== - /** Returns the current user's name, if available. - @see getFullUserName() - */ - static String getLogonName(); - - /** Returns the current user's full name, if available. - On some OSes, this may just return the same value as getLogonName(). - @see getLogonName() - */ - static String getFullUserName(); - - /** Returns the host-name of the computer. */ - static String getComputerName(); - - /** Returns the language of the user's locale. - The return value is a 2 or 3 letter language code (ISO 639-1 or ISO 639-2) - */ - static String getUserLanguage(); - - /** Returns the region of the user's locale. - The return value is a 2 letter country code (ISO 3166-1 alpha-2). - */ - static String getUserRegion(); - - /** Returns the user's display language. - The return value is a 2 or 3 letter language code (ISO 639-1 or ISO 639-2). - Note that depending on the OS and region, this may also be followed by a dash - and a sub-region code, e.g "en-GB" - */ - static String getDisplayLanguage(); - - /** This will attempt to return some kind of string describing the device. - If no description is available, it'll just return an empty string. You may - want to use this for things like determining the type of phone/iPad, etc. - */ - static String getDeviceDescription(); - - //============================================================================== - // CPU and memory information.. - - /** Returns the number of CPU cores. */ - static int getNumCpus() noexcept; - - /** Returns the approximate CPU speed. - @returns the speed in megahertz, e.g. 1500, 2500, 32000 (depending on - what year you're reading this...) - */ - static int getCpuSpeedInMegaherz(); - - /** Returns a string to indicate the CPU vendor. - Might not be known on some systems. - */ - static String getCpuVendor(); - - static bool hasMMX() noexcept; /**< Returns true if Intel MMX instructions are available. */ - static bool hasSSE() noexcept; /**< Returns true if Intel SSE instructions are available. */ - static bool hasSSE2() noexcept; /**< Returns true if Intel SSE2 instructions are available. */ - static bool hasSSE3() noexcept; /**< Returns true if Intel SSE2 instructions are available. */ - static bool has3DNow() noexcept; /**< Returns true if AMD 3DNOW instructions are available. */ - - //============================================================================== - /** Finds out how much RAM is in the machine. - @returns the approximate number of megabytes of memory, or zero if - something goes wrong when finding out. - */ - static int getMemorySizeInMegabytes(); - - /** Returns the system page-size. - This is only used by programmers with beards. - */ - static int getPageSize(); - - //============================================================================== - /** Returns a backtrace of the current call-stack. - The usefulness of the result will depend on the level of debug symbols - that are available in the executable. - */ - static String getStackBacktrace(); - - /** A void() function type, used by setApplicationCrashHandler(). */ - typedef void (*CrashHandlerFunction)(); - - /** Sets up a global callback function that will be called if the application - executes some kind of illegal instruction. - - You may want to call getStackBacktrace() in your handler function, to find out - where the problem happened and log it, etc. - */ - static void setApplicationCrashHandler (CrashHandlerFunction); - -private: - //============================================================================== - SystemStats(); - - JUCE_DECLARE_NON_COPYABLE (SystemStats) -}; - - -#endif // JUCE_SYSTEMSTATS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h b/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h deleted file mode 100755 index 63470b6..0000000 --- a/JuceLibraryCode/modules/juce_core/system/juce_TargetPlatform.h +++ /dev/null @@ -1,201 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_TARGETPLATFORM_H_INCLUDED -#define JUCE_TARGETPLATFORM_H_INCLUDED - -//============================================================================== -/* This file figures out which platform is being built, and defines some macros - that the rest of the code can use for OS-specific compilation. - - Macros that will be set here are: - - - One of JUCE_WINDOWS, JUCE_MAC JUCE_LINUX, JUCE_IOS, JUCE_ANDROID, etc. - - Either JUCE_32BIT or JUCE_64BIT, depending on the architecture. - - Either JUCE_LITTLE_ENDIAN or JUCE_BIG_ENDIAN. - - Either JUCE_INTEL or JUCE_PPC - - Either JUCE_GCC or JUCE_MSVC -*/ - -//============================================================================== -#if (defined (_WIN32) || defined (_WIN64)) - #define JUCE_WIN32 1 - #define JUCE_WINDOWS 1 -#elif defined (JUCE_ANDROID) - #undef JUCE_ANDROID - #define JUCE_ANDROID 1 -#elif defined (LINUX) || defined (__linux__) - #define JUCE_LINUX 1 -#elif defined (__APPLE_CPP__) || defined(__APPLE_CC__) - #define Point CarbonDummyPointName // (workaround to avoid definition of "Point" by old Carbon headers) - #define Component CarbonDummyCompName - #include // (needed to find out what platform we're using) - #undef Point - #undef Component - - #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR - #define JUCE_IPHONE 1 - #define JUCE_IOS 1 - #else - #define JUCE_MAC 1 - #endif -#elif defined (__FreeBSD__) - #define JUCE_BSD 1 -#else - #error "Unknown platform!" -#endif - -//============================================================================== -#if JUCE_WINDOWS - #ifdef _MSC_VER - #ifdef _WIN64 - #define JUCE_64BIT 1 - #else - #define JUCE_32BIT 1 - #endif - #endif - - #ifdef _DEBUG - #define JUCE_DEBUG 1 - #endif - - #ifdef __MINGW32__ - #define JUCE_MINGW 1 - #ifdef __MINGW64__ - #define JUCE_64BIT 1 - #else - #define JUCE_32BIT 1 - #endif - #endif - - /** If defined, this indicates that the processor is little-endian. */ - #define JUCE_LITTLE_ENDIAN 1 - - #define JUCE_INTEL 1 -#endif - -//============================================================================== -#if JUCE_MAC || JUCE_IOS - - #if defined (DEBUG) || defined (_DEBUG) || ! (defined (NDEBUG) || defined (_NDEBUG)) - #define JUCE_DEBUG 1 - #endif - - #if ! (defined (DEBUG) || defined (_DEBUG) || defined (NDEBUG) || defined (_NDEBUG)) - #warning "Neither NDEBUG or DEBUG has been defined - you should set one of these to make it clear whether this is a release build," - #endif - - #ifdef __LITTLE_ENDIAN__ - #define JUCE_LITTLE_ENDIAN 1 - #else - #define JUCE_BIG_ENDIAN 1 - #endif - - #ifdef __LP64__ - #define JUCE_64BIT 1 - #else - #define JUCE_32BIT 1 - #endif - - #if defined (__ppc__) || defined (__ppc64__) - #define JUCE_PPC 1 - #elif defined (__arm__) || defined (__arm64__) - #define JUCE_ARM 1 - #else - #define JUCE_INTEL 1 - #endif - - #if JUCE_MAC && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4 - #error "Building for OSX 10.3 is no longer supported!" - #endif - - #if JUCE_MAC && ! defined (MAC_OS_X_VERSION_10_5) - #error "To build with 10.4 compatibility, use a 10.5 or 10.6 SDK and set the deployment target to 10.4" - #endif -#endif - -//============================================================================== -#if JUCE_LINUX || JUCE_ANDROID - - #ifdef _DEBUG - #define JUCE_DEBUG 1 - #endif - - // Allow override for big-endian Linux platforms - #if defined (__LITTLE_ENDIAN__) || ! defined (JUCE_BIG_ENDIAN) - #define JUCE_LITTLE_ENDIAN 1 - #undef JUCE_BIG_ENDIAN - #else - #undef JUCE_LITTLE_ENDIAN - #define JUCE_BIG_ENDIAN 1 - #endif - - #if defined (__LP64__) || defined (_LP64) || defined (__arm64__) - #define JUCE_64BIT 1 - #else - #define JUCE_32BIT 1 - #endif - - #if defined (__arm__) || defined (__arm64__) - #define JUCE_ARM 1 - #elif __MMX__ || __SSE__ || __amd64__ - #define JUCE_INTEL 1 - #endif -#endif - -//============================================================================== -// Compiler type macros. - -#ifdef __clang__ - #define JUCE_CLANG 1 - #define JUCE_GCC 1 -#elif defined (__GNUC__) - #define JUCE_GCC 1 -#elif defined (_MSC_VER) - #define JUCE_MSVC 1 - - #if _MSC_VER < 1500 - #define JUCE_VC8_OR_EARLIER 1 - - #if _MSC_VER < 1400 - #define JUCE_VC7_OR_EARLIER 1 - - #if _MSC_VER < 1300 - #warning "MSVC 6.0 is no longer supported!" - #endif - #endif - #endif - - #if JUCE_64BIT || ! JUCE_VC7_OR_EARLIER - #define JUCE_USE_MSVC_INTRINSICS 1 - #endif -#else - #error unknown compiler -#endif - -#endif // JUCE_TARGETPLATFORM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h deleted file mode 100755 index a8e8de8..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_ASCII.h +++ /dev/null @@ -1,389 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_CHARPOINTER_ASCII_H_INCLUDED -#define JUCE_CHARPOINTER_ASCII_H_INCLUDED - - -//============================================================================== -/** - Wraps a pointer to a null-terminated ASCII character string, and provides - various methods to operate on the data. - - A valid ASCII string is assumed to not contain any characters above 127. - - @see CharPointer_UTF8, CharPointer_UTF16, CharPointer_UTF32 -*/ -class CharPointer_ASCII -{ -public: - typedef char CharType; - - inline explicit CharPointer_ASCII (const CharType* const rawPointer) noexcept - : data (const_cast (rawPointer)) - { - } - - inline CharPointer_ASCII (const CharPointer_ASCII& other) noexcept - : data (other.data) - { - } - - inline CharPointer_ASCII operator= (const CharPointer_ASCII other) noexcept - { - data = other.data; - return *this; - } - - inline CharPointer_ASCII operator= (const CharType* text) noexcept - { - data = const_cast (text); - return *this; - } - - /** This is a pointer comparison, it doesn't compare the actual text. */ - inline bool operator== (CharPointer_ASCII other) const noexcept { return data == other.data; } - inline bool operator!= (CharPointer_ASCII other) const noexcept { return data != other.data; } - inline bool operator<= (CharPointer_ASCII other) const noexcept { return data <= other.data; } - inline bool operator< (CharPointer_ASCII other) const noexcept { return data < other.data; } - inline bool operator>= (CharPointer_ASCII other) const noexcept { return data >= other.data; } - inline bool operator> (CharPointer_ASCII other) const noexcept { return data > other.data; } - - /** Returns the address that this pointer is pointing to. */ - inline CharType* getAddress() const noexcept { return data; } - - /** Returns the address that this pointer is pointing to. */ - inline operator const CharType*() const noexcept { return data; } - - /** Returns true if this pointer is pointing to a null character. */ - inline bool isEmpty() const noexcept { return *data == 0; } - - /** Returns the unicode character that this pointer is pointing to. */ - inline juce_wchar operator*() const noexcept { return (juce_wchar) (uint8) *data; } - - /** Moves this pointer along to the next character in the string. */ - inline CharPointer_ASCII operator++() noexcept - { - ++data; - return *this; - } - - /** Moves this pointer to the previous character in the string. */ - inline CharPointer_ASCII operator--() noexcept - { - --data; - return *this; - } - - /** Returns the character that this pointer is currently pointing to, and then - advances the pointer to point to the next character. */ - inline juce_wchar getAndAdvance() noexcept { return (juce_wchar) (uint8) *data++; } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_ASCII operator++ (int) noexcept - { - CharPointer_ASCII temp (*this); - ++data; - return temp; - } - - /** Moves this pointer forwards by the specified number of characters. */ - inline void operator+= (const int numToSkip) noexcept - { - data += numToSkip; - } - - inline void operator-= (const int numToSkip) noexcept - { - data -= numToSkip; - } - - /** Returns the character at a given character index from the start of the string. */ - inline juce_wchar operator[] (const int characterIndex) const noexcept - { - return (juce_wchar) (unsigned char) data [characterIndex]; - } - - /** Returns a pointer which is moved forwards from this one by the specified number of characters. */ - CharPointer_ASCII operator+ (const int numToSkip) const noexcept - { - return CharPointer_ASCII (data + numToSkip); - } - - /** Returns a pointer which is moved backwards from this one by the specified number of characters. */ - CharPointer_ASCII operator- (const int numToSkip) const noexcept - { - return CharPointer_ASCII (data - numToSkip); - } - - /** Writes a unicode character to this string, and advances this pointer to point to the next position. */ - inline void write (const juce_wchar charToWrite) noexcept - { - *data++ = (char) charToWrite; - } - - inline void replaceChar (const juce_wchar newChar) noexcept - { - *data = (char) newChar; - } - - /** Writes a null character to this string (leaving the pointer's position unchanged). */ - inline void writeNull() const noexcept - { - *data = 0; - } - - /** Returns the number of characters in this string. */ - size_t length() const noexcept - { - return (size_t) strlen (data); - } - - /** Returns the number of characters in this string, or the given value, whichever is lower. */ - size_t lengthUpTo (const size_t maxCharsToCount) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, maxCharsToCount); - } - - /** Returns the number of characters in this string, or up to the given end pointer, whichever is lower. */ - size_t lengthUpTo (const CharPointer_ASCII end) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, end); - } - - /** Returns the number of bytes that are used to represent this string. - This includes the terminating null character. - */ - size_t sizeInBytes() const noexcept - { - return length() + 1; - } - - /** Returns the number of bytes that would be needed to represent the given - unicode character in this encoding format. - */ - static inline size_t getBytesRequiredFor (const juce_wchar) noexcept - { - return 1; - } - - /** Returns the number of bytes that would be needed to represent the given - string in this encoding format. - The value returned does NOT include the terminating null character. - */ - template - static size_t getBytesRequiredFor (const CharPointer text) noexcept - { - return text.length(); - } - - /** Returns a pointer to the null character that terminates this string. */ - CharPointer_ASCII findTerminatingNull() const noexcept - { - return CharPointer_ASCII (data + length()); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - template - void writeAll (const CharPointer src) noexcept - { - CharacterFunctions::copyAll (*this, src); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - void writeAll (const CharPointer_ASCII src) noexcept - { - strcpy (data, src.data); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxDestBytes parameter specifies the maximum number of bytes that can be written - to the destination buffer before stopping. - */ - template - size_t writeWithDestByteLimit (const CharPointer src, const size_t maxDestBytes) noexcept - { - return CharacterFunctions::copyWithDestByteLimit (*this, src, maxDestBytes); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxChars parameter specifies the maximum number of characters that can be - written to the destination buffer before stopping (including the terminating null). - */ - template - void writeWithCharLimit (const CharPointer src, const int maxChars) noexcept - { - CharacterFunctions::copyWithCharLimit (*this, src, maxChars); - } - - /** Compares this string with another one. */ - template - int compare (const CharPointer other) const noexcept - { - return CharacterFunctions::compare (*this, other); - } - - /** Compares this string with another one. */ - int compare (const CharPointer_ASCII other) const noexcept - { - return strcmp (data, other.data); - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareUpTo (*this, other, maxChars); - } - - /** Compares this string with another one, up to a specified number of characters. */ - int compareUpTo (const CharPointer_ASCII other, const int maxChars) const noexcept - { - return strncmp (data, other.data, (size_t) maxChars); - } - - /** Compares this string with another one. */ - template - int compareIgnoreCase (const CharPointer other) const - { - return CharacterFunctions::compareIgnoreCase (*this, other); - } - - int compareIgnoreCase (const CharPointer_ASCII other) const - { - #if JUCE_MSVC - return stricmp (data, other.data); - #elif JUCE_MINGW - return CharacterFunctions::compareIgnoreCase (*this, other); - #else - return strcasecmp (data, other.data); - #endif - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareIgnoreCaseUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareIgnoreCaseUpTo (*this, other, maxChars); - } - - /** Returns the character index of a substring, or -1 if it isn't found. */ - template - int indexOf (const CharPointer stringToFind) const noexcept - { - return CharacterFunctions::indexOf (*this, stringToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const juce_wchar charToFind) const noexcept - { - int i = 0; - - while (data[i] != 0) - { - if (data[i] == (char) charToFind) - return i; - - ++i; - } - - return -1; - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const juce_wchar charToFind, const bool ignoreCase) const noexcept - { - return ignoreCase ? CharacterFunctions::indexOfCharIgnoreCase (*this, charToFind) - : CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns true if the first character of this string is whitespace. */ - bool isWhitespace() const { return CharacterFunctions::isWhitespace (*data) != 0; } - /** Returns true if the first character of this string is a digit. */ - bool isDigit() const { return CharacterFunctions::isDigit (*data) != 0; } - /** Returns true if the first character of this string is a letter. */ - bool isLetter() const { return CharacterFunctions::isLetter (*data) != 0; } - /** Returns true if the first character of this string is a letter or digit. */ - bool isLetterOrDigit() const { return CharacterFunctions::isLetterOrDigit (*data) != 0; } - /** Returns true if the first character of this string is upper-case. */ - bool isUpperCase() const { return CharacterFunctions::isUpperCase ((juce_wchar) (uint8) *data) != 0; } - /** Returns true if the first character of this string is lower-case. */ - bool isLowerCase() const { return CharacterFunctions::isLowerCase ((juce_wchar) (uint8) *data) != 0; } - - /** Returns an upper-case version of the first character of this string. */ - juce_wchar toUpperCase() const noexcept { return CharacterFunctions::toUpperCase ((juce_wchar) (uint8) *data); } - /** Returns a lower-case version of the first character of this string. */ - juce_wchar toLowerCase() const noexcept { return CharacterFunctions::toLowerCase ((juce_wchar) (uint8) *data); } - - /** Parses this string as a 32-bit integer. */ - int getIntValue32() const noexcept { return atoi (data); } - - /** Parses this string as a 64-bit integer. */ - int64 getIntValue64() const noexcept - { - #if JUCE_LINUX || JUCE_ANDROID || JUCE_MINGW - return atoll (data); - #elif JUCE_WINDOWS - return _atoi64 (data); - #else - return CharacterFunctions::getIntValue (*this); - #endif - } - - /** Parses this string as a floating point double. */ - double getDoubleValue() const noexcept { return CharacterFunctions::getDoubleValue (*this); } - - /** Returns the first non-whitespace character in the string. */ - CharPointer_ASCII findEndOfWhitespace() const noexcept { return CharacterFunctions::findEndOfWhitespace (*this); } - - /** Returns true if the given unicode character can be represented in this encoding. */ - static bool canRepresent (juce_wchar character) noexcept - { - return ((unsigned int) character) < (unsigned int) 128; - } - - /** Returns true if this data contains a valid string in this encoding. */ - static bool isValidString (const CharType* dataToTest, int maxBytesToRead) - { - while (--maxBytesToRead >= 0) - { - if (((signed char) *dataToTest) <= 0) - return *dataToTest == 0; - - ++dataToTest; - } - - return true; - } - -private: - CharType* data; -}; - - -#endif // JUCE_CHARPOINTER_ASCII_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h deleted file mode 100755 index 50d1890..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF16.h +++ /dev/null @@ -1,525 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_CHARPOINTER_UTF16_H_INCLUDED -#define JUCE_CHARPOINTER_UTF16_H_INCLUDED - - -//============================================================================== -/** - Wraps a pointer to a null-terminated UTF-16 character string, and provides - various methods to operate on the data. - @see CharPointer_UTF8, CharPointer_UTF32 -*/ -class CharPointer_UTF16 -{ -public: - #if JUCE_NATIVE_WCHAR_IS_UTF16 - typedef wchar_t CharType; - #else - typedef int16 CharType; - #endif - - inline explicit CharPointer_UTF16 (const CharType* const rawPointer) noexcept - : data (const_cast (rawPointer)) - { - } - - inline CharPointer_UTF16 (const CharPointer_UTF16& other) noexcept - : data (other.data) - { - } - - inline CharPointer_UTF16 operator= (CharPointer_UTF16 other) noexcept - { - data = other.data; - return *this; - } - - inline CharPointer_UTF16 operator= (const CharType* text) noexcept - { - data = const_cast (text); - return *this; - } - - /** This is a pointer comparison, it doesn't compare the actual text. */ - inline bool operator== (CharPointer_UTF16 other) const noexcept { return data == other.data; } - inline bool operator!= (CharPointer_UTF16 other) const noexcept { return data != other.data; } - inline bool operator<= (CharPointer_UTF16 other) const noexcept { return data <= other.data; } - inline bool operator< (CharPointer_UTF16 other) const noexcept { return data < other.data; } - inline bool operator>= (CharPointer_UTF16 other) const noexcept { return data >= other.data; } - inline bool operator> (CharPointer_UTF16 other) const noexcept { return data > other.data; } - - /** Returns the address that this pointer is pointing to. */ - inline CharType* getAddress() const noexcept { return data; } - - /** Returns the address that this pointer is pointing to. */ - inline operator const CharType*() const noexcept { return data; } - - /** Returns true if this pointer is pointing to a null character. */ - inline bool isEmpty() const noexcept { return *data == 0; } - - /** Returns the unicode character that this pointer is pointing to. */ - juce_wchar operator*() const noexcept - { - uint32 n = (uint32) (uint16) *data; - - if (n >= 0xd800 && n <= 0xdfff && ((uint32) (uint16) data[1]) >= 0xdc00) - n = 0x10000 + (((n - 0xd800) << 10) | (((uint32) (uint16) data[1]) - 0xdc00)); - - return (juce_wchar) n; - } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_UTF16 operator++() noexcept - { - const juce_wchar n = *data++; - - if (n >= 0xd800 && n <= 0xdfff && ((uint32) (uint16) *data) >= 0xdc00) - ++data; - - return *this; - } - - /** Moves this pointer back to the previous character in the string. */ - CharPointer_UTF16 operator--() noexcept - { - const juce_wchar n = *--data; - - if (n >= 0xdc00 && n <= 0xdfff) - --data; - - return *this; - } - - /** Returns the character that this pointer is currently pointing to, and then - advances the pointer to point to the next character. */ - juce_wchar getAndAdvance() noexcept - { - uint32 n = (uint32) (uint16) *data++; - - if (n >= 0xd800 && n <= 0xdfff && ((uint32) (uint16) *data) >= 0xdc00) - n = 0x10000 + ((((n - 0xd800) << 10) | (((uint32) (uint16) *data++) - 0xdc00))); - - return (juce_wchar) n; - } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_UTF16 operator++ (int) noexcept - { - CharPointer_UTF16 temp (*this); - ++*this; - return temp; - } - - /** Moves this pointer forwards by the specified number of characters. */ - void operator+= (int numToSkip) noexcept - { - if (numToSkip < 0) - { - while (++numToSkip <= 0) - --*this; - } - else - { - while (--numToSkip >= 0) - ++*this; - } - } - - /** Moves this pointer backwards by the specified number of characters. */ - void operator-= (int numToSkip) noexcept - { - operator+= (-numToSkip); - } - - /** Returns the character at a given character index from the start of the string. */ - juce_wchar operator[] (const int characterIndex) const noexcept - { - CharPointer_UTF16 p (*this); - p += characterIndex; - return *p; - } - - /** Returns a pointer which is moved forwards from this one by the specified number of characters. */ - CharPointer_UTF16 operator+ (const int numToSkip) const noexcept - { - CharPointer_UTF16 p (*this); - p += numToSkip; - return p; - } - - /** Returns a pointer which is moved backwards from this one by the specified number of characters. */ - CharPointer_UTF16 operator- (const int numToSkip) const noexcept - { - CharPointer_UTF16 p (*this); - p += -numToSkip; - return p; - } - - /** Writes a unicode character to this string, and advances this pointer to point to the next position. */ - void write (juce_wchar charToWrite) noexcept - { - if (charToWrite >= 0x10000) - { - charToWrite -= 0x10000; - *data++ = (CharType) (0xd800 + (charToWrite >> 10)); - *data++ = (CharType) (0xdc00 + (charToWrite & 0x3ff)); - } - else - { - *data++ = (CharType) charToWrite; - } - } - - /** Writes a null character to this string (leaving the pointer's position unchanged). */ - inline void writeNull() const noexcept - { - *data = 0; - } - - /** Returns the number of characters in this string. */ - size_t length() const noexcept - { - const CharType* d = data; - size_t count = 0; - - for (;;) - { - const int n = *d++; - - if (n >= 0xd800 && n <= 0xdfff) - { - if (*d++ == 0) - break; - } - else if (n == 0) - break; - - ++count; - } - - return count; - } - - /** Returns the number of characters in this string, or the given value, whichever is lower. */ - size_t lengthUpTo (const size_t maxCharsToCount) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, maxCharsToCount); - } - - /** Returns the number of characters in this string, or up to the given end pointer, whichever is lower. */ - size_t lengthUpTo (const CharPointer_UTF16 end) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, end); - } - - /** Returns the number of bytes that are used to represent this string. - This includes the terminating null character. - */ - size_t sizeInBytes() const noexcept - { - return sizeof (CharType) * (findNullIndex (data) + 1); - } - - /** Returns the number of bytes that would be needed to represent the given - unicode character in this encoding format. - */ - static size_t getBytesRequiredFor (const juce_wchar charToWrite) noexcept - { - return (charToWrite >= 0x10000) ? (sizeof (CharType) * 2) : sizeof (CharType); - } - - /** Returns the number of bytes that would be needed to represent the given - string in this encoding format. - The value returned does NOT include the terminating null character. - */ - template - static size_t getBytesRequiredFor (CharPointer text) noexcept - { - size_t count = 0; - juce_wchar n; - - while ((n = text.getAndAdvance()) != 0) - count += getBytesRequiredFor (n); - - return count; - } - - /** Returns a pointer to the null character that terminates this string. */ - CharPointer_UTF16 findTerminatingNull() const noexcept - { - const CharType* t = data; - - while (*t != 0) - ++t; - - return CharPointer_UTF16 (t); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - template - void writeAll (const CharPointer src) noexcept - { - CharacterFunctions::copyAll (*this, src); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - void writeAll (const CharPointer_UTF16 src) noexcept - { - const CharType* s = src.data; - - while ((*data = *s) != 0) - { - ++data; - ++s; - } - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxDestBytes parameter specifies the maximum number of bytes that can be written - to the destination buffer before stopping. - */ - template - size_t writeWithDestByteLimit (const CharPointer src, const size_t maxDestBytes) noexcept - { - return CharacterFunctions::copyWithDestByteLimit (*this, src, maxDestBytes); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxChars parameter specifies the maximum number of characters that can be - written to the destination buffer before stopping (including the terminating null). - */ - template - void writeWithCharLimit (const CharPointer src, const int maxChars) noexcept - { - CharacterFunctions::copyWithCharLimit (*this, src, maxChars); - } - - /** Compares this string with another one. */ - template - int compare (const CharPointer other) const noexcept - { - return CharacterFunctions::compare (*this, other); - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareUpTo (*this, other, maxChars); - } - - /** Compares this string with another one. */ - template - int compareIgnoreCase (const CharPointer other) const noexcept - { - return CharacterFunctions::compareIgnoreCase (*this, other); - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareIgnoreCaseUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareIgnoreCaseUpTo (*this, other, maxChars); - } - - #if JUCE_MSVC && ! DOXYGEN - int compareIgnoreCase (const CharPointer_UTF16 other) const noexcept - { - return _wcsicmp (data, other.data); - } - - int compareIgnoreCaseUpTo (const CharPointer_UTF16 other, int maxChars) const noexcept - { - return _wcsnicmp (data, other.data, (size_t) maxChars); - } - - int indexOf (const CharPointer_UTF16 stringToFind) const noexcept - { - const CharType* const t = wcsstr (data, stringToFind.getAddress()); - return t == nullptr ? -1 : (int) (t - data); - } - #endif - - /** Returns the character index of a substring, or -1 if it isn't found. */ - template - int indexOf (const CharPointer stringToFind) const noexcept - { - return CharacterFunctions::indexOf (*this, stringToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const juce_wchar charToFind) const noexcept - { - return CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const juce_wchar charToFind, const bool ignoreCase) const noexcept - { - return ignoreCase ? CharacterFunctions::indexOfCharIgnoreCase (*this, charToFind) - : CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns true if the first character of this string is whitespace. */ - bool isWhitespace() const noexcept { return CharacterFunctions::isWhitespace (operator*()) != 0; } - /** Returns true if the first character of this string is a digit. */ - bool isDigit() const noexcept { return CharacterFunctions::isDigit (operator*()) != 0; } - /** Returns true if the first character of this string is a letter. */ - bool isLetter() const noexcept { return CharacterFunctions::isLetter (operator*()) != 0; } - /** Returns true if the first character of this string is a letter or digit. */ - bool isLetterOrDigit() const noexcept { return CharacterFunctions::isLetterOrDigit (operator*()) != 0; } - /** Returns true if the first character of this string is upper-case. */ - bool isUpperCase() const noexcept { return CharacterFunctions::isUpperCase (operator*()) != 0; } - /** Returns true if the first character of this string is lower-case. */ - bool isLowerCase() const noexcept { return CharacterFunctions::isLowerCase (operator*()) != 0; } - - /** Returns an upper-case version of the first character of this string. */ - juce_wchar toUpperCase() const noexcept { return CharacterFunctions::toUpperCase (operator*()); } - /** Returns a lower-case version of the first character of this string. */ - juce_wchar toLowerCase() const noexcept { return CharacterFunctions::toLowerCase (operator*()); } - - /** Parses this string as a 32-bit integer. */ - int getIntValue32() const noexcept - { - #if JUCE_MSVC - return _wtoi (data); - #else - return CharacterFunctions::getIntValue (*this); - #endif - } - - /** Parses this string as a 64-bit integer. */ - int64 getIntValue64() const noexcept - { - #if JUCE_MSVC - return _wtoi64 (data); - #else - return CharacterFunctions::getIntValue (*this); - #endif - } - - /** Parses this string as a floating point double. */ - double getDoubleValue() const noexcept { return CharacterFunctions::getDoubleValue (*this); } - - /** Returns the first non-whitespace character in the string. */ - CharPointer_UTF16 findEndOfWhitespace() const noexcept { return CharacterFunctions::findEndOfWhitespace (*this); } - - /** Returns true if the given unicode character can be represented in this encoding. */ - static bool canRepresent (juce_wchar character) noexcept - { - return ((unsigned int) character) < (unsigned int) 0x10ffff - && (((unsigned int) character) < 0xd800 || ((unsigned int) character) > 0xdfff); - } - - /** Returns true if this data contains a valid string in this encoding. */ - static bool isValidString (const CharType* dataToTest, int maxBytesToRead) - { - maxBytesToRead /= (int) sizeof (CharType); - - while (--maxBytesToRead >= 0 && *dataToTest != 0) - { - const uint32 n = (uint32) (uint16) *dataToTest++; - - if (n >= 0xd800) - { - if (n > 0x10ffff) - return false; - - if (n <= 0xdfff) - { - if (n > 0xdc00) - return false; - - const uint32 nextChar = (uint32) (uint16) *dataToTest++; - - if (nextChar < 0xdc00 || nextChar > 0xdfff) - return false; - } - } - } - - return true; - } - - /** Atomically swaps this pointer for a new value, returning the previous value. */ - CharPointer_UTF16 atomicSwap (const CharPointer_UTF16 newValue) - { - return CharPointer_UTF16 (reinterpret_cast &> (data).exchange (newValue.data)); - } - - /** These values are the byte-order-mark (BOM) values for a UTF-16 stream. */ - enum - { - byteOrderMarkBE1 = 0xfe, - byteOrderMarkBE2 = 0xff, - byteOrderMarkLE1 = 0xff, - byteOrderMarkLE2 = 0xfe - }; - - /** Returns true if the first pair of bytes in this pointer are the UTF16 byte-order mark (big endian). - The pointer must not be null, and must contain at least two valid bytes. - */ - static bool isByteOrderMarkBigEndian (const void* possibleByteOrder) noexcept - { - jassert (possibleByteOrder != nullptr); - const uint8* const c = static_cast (possibleByteOrder); - - return c[0] == (uint8) byteOrderMarkBE1 - && c[1] == (uint8) byteOrderMarkBE2; - } - - /** Returns true if the first pair of bytes in this pointer are the UTF16 byte-order mark (little endian). - The pointer must not be null, and must contain at least two valid bytes. - */ - static bool isByteOrderMarkLittleEndian (const void* possibleByteOrder) noexcept - { - jassert (possibleByteOrder != nullptr); - const uint8* const c = static_cast (possibleByteOrder); - - return c[0] == (uint8) byteOrderMarkLE1 - && c[1] == (uint8) byteOrderMarkLE2; - } - -private: - CharType* data; - - static unsigned int findNullIndex (const CharType* const t) noexcept - { - unsigned int n = 0; - - while (t[n] != 0) - ++n; - - return n; - } -}; - - -#endif // JUCE_CHARPOINTER_UTF16_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h deleted file mode 100755 index 42cfe48..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF32.h +++ /dev/null @@ -1,378 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_CHARPOINTER_UTF32_H_INCLUDED -#define JUCE_CHARPOINTER_UTF32_H_INCLUDED - - -//============================================================================== -/** - Wraps a pointer to a null-terminated UTF-32 character string, and provides - various methods to operate on the data. - @see CharPointer_UTF8, CharPointer_UTF16 -*/ -class CharPointer_UTF32 -{ -public: - typedef juce_wchar CharType; - - inline explicit CharPointer_UTF32 (const CharType* const rawPointer) noexcept - : data (const_cast (rawPointer)) - { - } - - inline CharPointer_UTF32 (const CharPointer_UTF32& other) noexcept - : data (other.data) - { - } - - inline CharPointer_UTF32 operator= (CharPointer_UTF32 other) noexcept - { - data = other.data; - return *this; - } - - inline CharPointer_UTF32 operator= (const CharType* text) noexcept - { - data = const_cast (text); - return *this; - } - - /** This is a pointer comparison, it doesn't compare the actual text. */ - inline bool operator== (CharPointer_UTF32 other) const noexcept { return data == other.data; } - inline bool operator!= (CharPointer_UTF32 other) const noexcept { return data != other.data; } - inline bool operator<= (CharPointer_UTF32 other) const noexcept { return data <= other.data; } - inline bool operator< (CharPointer_UTF32 other) const noexcept { return data < other.data; } - inline bool operator>= (CharPointer_UTF32 other) const noexcept { return data >= other.data; } - inline bool operator> (CharPointer_UTF32 other) const noexcept { return data > other.data; } - - /** Returns the address that this pointer is pointing to. */ - inline CharType* getAddress() const noexcept { return data; } - - /** Returns the address that this pointer is pointing to. */ - inline operator const CharType*() const noexcept { return data; } - - /** Returns true if this pointer is pointing to a null character. */ - inline bool isEmpty() const noexcept { return *data == 0; } - - /** Returns the unicode character that this pointer is pointing to. */ - inline juce_wchar operator*() const noexcept { return *data; } - - /** Moves this pointer along to the next character in the string. */ - inline CharPointer_UTF32 operator++() noexcept - { - ++data; - return *this; - } - - /** Moves this pointer to the previous character in the string. */ - inline CharPointer_UTF32 operator--() noexcept - { - --data; - return *this; - } - - /** Returns the character that this pointer is currently pointing to, and then - advances the pointer to point to the next character. */ - inline juce_wchar getAndAdvance() noexcept { return *data++; } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_UTF32 operator++ (int) noexcept - { - CharPointer_UTF32 temp (*this); - ++data; - return temp; - } - - /** Moves this pointer forwards by the specified number of characters. */ - inline void operator+= (const int numToSkip) noexcept - { - data += numToSkip; - } - - inline void operator-= (const int numToSkip) noexcept - { - data -= numToSkip; - } - - /** Returns the character at a given character index from the start of the string. */ - inline juce_wchar& operator[] (const int characterIndex) const noexcept - { - return data [characterIndex]; - } - - /** Returns a pointer which is moved forwards from this one by the specified number of characters. */ - CharPointer_UTF32 operator+ (const int numToSkip) const noexcept - { - return CharPointer_UTF32 (data + numToSkip); - } - - /** Returns a pointer which is moved backwards from this one by the specified number of characters. */ - CharPointer_UTF32 operator- (const int numToSkip) const noexcept - { - return CharPointer_UTF32 (data - numToSkip); - } - - /** Writes a unicode character to this string, and advances this pointer to point to the next position. */ - inline void write (const juce_wchar charToWrite) noexcept - { - *data++ = charToWrite; - } - - inline void replaceChar (const juce_wchar newChar) noexcept - { - *data = newChar; - } - - /** Writes a null character to this string (leaving the pointer's position unchanged). */ - inline void writeNull() const noexcept - { - *data = 0; - } - - /** Returns the number of characters in this string. */ - size_t length() const noexcept - { - #if JUCE_NATIVE_WCHAR_IS_UTF32 && ! JUCE_ANDROID - return wcslen (data); - #else - size_t n = 0; - while (data[n] != 0) - ++n; - return n; - #endif - } - - /** Returns the number of characters in this string, or the given value, whichever is lower. */ - size_t lengthUpTo (const size_t maxCharsToCount) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, maxCharsToCount); - } - - /** Returns the number of characters in this string, or up to the given end pointer, whichever is lower. */ - size_t lengthUpTo (const CharPointer_UTF32 end) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, end); - } - - /** Returns the number of bytes that are used to represent this string. - This includes the terminating null character. - */ - size_t sizeInBytes() const noexcept - { - return sizeof (CharType) * (length() + 1); - } - - /** Returns the number of bytes that would be needed to represent the given - unicode character in this encoding format. - */ - static inline size_t getBytesRequiredFor (const juce_wchar) noexcept - { - return sizeof (CharType); - } - - /** Returns the number of bytes that would be needed to represent the given - string in this encoding format. - The value returned does NOT include the terminating null character. - */ - template - static size_t getBytesRequiredFor (const CharPointer text) noexcept - { - return sizeof (CharType) * text.length(); - } - - /** Returns a pointer to the null character that terminates this string. */ - CharPointer_UTF32 findTerminatingNull() const noexcept - { - return CharPointer_UTF32 (data + length()); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - template - void writeAll (const CharPointer src) noexcept - { - CharacterFunctions::copyAll (*this, src); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - void writeAll (const CharPointer_UTF32 src) noexcept - { - const CharType* s = src.data; - - while ((*data = *s) != 0) - { - ++data; - ++s; - } - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxDestBytes parameter specifies the maximum number of bytes that can be written - to the destination buffer before stopping. - */ - template - size_t writeWithDestByteLimit (const CharPointer src, const size_t maxDestBytes) noexcept - { - return CharacterFunctions::copyWithDestByteLimit (*this, src, maxDestBytes); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxChars parameter specifies the maximum number of characters that can be - written to the destination buffer before stopping (including the terminating null). - */ - template - void writeWithCharLimit (const CharPointer src, const int maxChars) noexcept - { - CharacterFunctions::copyWithCharLimit (*this, src, maxChars); - } - - /** Compares this string with another one. */ - template - int compare (const CharPointer other) const noexcept - { - return CharacterFunctions::compare (*this, other); - } - - #if JUCE_NATIVE_WCHAR_IS_UTF32 && ! JUCE_ANDROID - /** Compares this string with another one. */ - int compare (const CharPointer_UTF32 other) const noexcept - { - return wcscmp (data, other.data); - } - #endif - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareUpTo (*this, other, maxChars); - } - - /** Compares this string with another one. */ - template - int compareIgnoreCase (const CharPointer other) const - { - return CharacterFunctions::compareIgnoreCase (*this, other); - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareIgnoreCaseUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareIgnoreCaseUpTo (*this, other, maxChars); - } - - /** Returns the character index of a substring, or -1 if it isn't found. */ - template - int indexOf (const CharPointer stringToFind) const noexcept - { - return CharacterFunctions::indexOf (*this, stringToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const juce_wchar charToFind) const noexcept - { - int i = 0; - - while (data[i] != 0) - { - if (data[i] == charToFind) - return i; - - ++i; - } - - return -1; - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const juce_wchar charToFind, const bool ignoreCase) const noexcept - { - return ignoreCase ? CharacterFunctions::indexOfCharIgnoreCase (*this, charToFind) - : CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns true if the first character of this string is whitespace. */ - bool isWhitespace() const { return CharacterFunctions::isWhitespace (*data) != 0; } - /** Returns true if the first character of this string is a digit. */ - bool isDigit() const { return CharacterFunctions::isDigit (*data) != 0; } - /** Returns true if the first character of this string is a letter. */ - bool isLetter() const { return CharacterFunctions::isLetter (*data) != 0; } - /** Returns true if the first character of this string is a letter or digit. */ - bool isLetterOrDigit() const { return CharacterFunctions::isLetterOrDigit (*data) != 0; } - /** Returns true if the first character of this string is upper-case. */ - bool isUpperCase() const { return CharacterFunctions::isUpperCase (*data) != 0; } - /** Returns true if the first character of this string is lower-case. */ - bool isLowerCase() const { return CharacterFunctions::isLowerCase (*data) != 0; } - - /** Returns an upper-case version of the first character of this string. */ - juce_wchar toUpperCase() const noexcept { return CharacterFunctions::toUpperCase (*data); } - /** Returns a lower-case version of the first character of this string. */ - juce_wchar toLowerCase() const noexcept { return CharacterFunctions::toLowerCase (*data); } - - /** Parses this string as a 32-bit integer. */ - int getIntValue32() const noexcept { return CharacterFunctions::getIntValue (*this); } - /** Parses this string as a 64-bit integer. */ - int64 getIntValue64() const noexcept { return CharacterFunctions::getIntValue (*this); } - - /** Parses this string as a floating point double. */ - double getDoubleValue() const noexcept { return CharacterFunctions::getDoubleValue (*this); } - - /** Returns the first non-whitespace character in the string. */ - CharPointer_UTF32 findEndOfWhitespace() const noexcept { return CharacterFunctions::findEndOfWhitespace (*this); } - - /** Returns true if the given unicode character can be represented in this encoding. */ - static bool canRepresent (juce_wchar character) noexcept - { - return ((unsigned int) character) < (unsigned int) 0x10ffff; - } - - /** Returns true if this data contains a valid string in this encoding. */ - static bool isValidString (const CharType* dataToTest, int maxBytesToRead) - { - maxBytesToRead /= (int) sizeof (CharType); - - while (--maxBytesToRead >= 0 && *dataToTest != 0) - if (! canRepresent (*dataToTest++)) - return false; - - return true; - } - - /** Atomically swaps this pointer for a new value, returning the previous value. */ - CharPointer_UTF32 atomicSwap (const CharPointer_UTF32 newValue) - { - return CharPointer_UTF32 (reinterpret_cast &> (data).exchange (newValue.data)); - } - -private: - CharType* data; -}; - - -#endif // JUCE_CHARPOINTER_UTF32_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h b/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h deleted file mode 100755 index f6e156e..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharPointer_UTF8.h +++ /dev/null @@ -1,574 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_CHARPOINTER_UTF8_H_INCLUDED -#define JUCE_CHARPOINTER_UTF8_H_INCLUDED - -//============================================================================== -/** - Wraps a pointer to a null-terminated UTF-8 character string, and provides - various methods to operate on the data. - @see CharPointer_UTF16, CharPointer_UTF32 -*/ -class CharPointer_UTF8 -{ -public: - typedef char CharType; - - inline explicit CharPointer_UTF8 (const CharType* const rawPointer) noexcept - : data (const_cast (rawPointer)) - { - } - - inline CharPointer_UTF8 (const CharPointer_UTF8& other) noexcept - : data (other.data) - { - } - - inline CharPointer_UTF8 operator= (CharPointer_UTF8 other) noexcept - { - data = other.data; - return *this; - } - - inline CharPointer_UTF8 operator= (const CharType* text) noexcept - { - data = const_cast (text); - return *this; - } - - /** This is a pointer comparison, it doesn't compare the actual text. */ - inline bool operator== (CharPointer_UTF8 other) const noexcept { return data == other.data; } - inline bool operator!= (CharPointer_UTF8 other) const noexcept { return data != other.data; } - inline bool operator<= (CharPointer_UTF8 other) const noexcept { return data <= other.data; } - inline bool operator< (CharPointer_UTF8 other) const noexcept { return data < other.data; } - inline bool operator>= (CharPointer_UTF8 other) const noexcept { return data >= other.data; } - inline bool operator> (CharPointer_UTF8 other) const noexcept { return data > other.data; } - - /** Returns the address that this pointer is pointing to. */ - inline CharType* getAddress() const noexcept { return data; } - - /** Returns the address that this pointer is pointing to. */ - inline operator const CharType*() const noexcept { return data; } - - /** Returns true if this pointer is pointing to a null character. */ - inline bool isEmpty() const noexcept { return *data == 0; } - - /** Returns the unicode character that this pointer is pointing to. */ - juce_wchar operator*() const noexcept - { - const signed char byte = (signed char) *data; - - if (byte >= 0) - return (juce_wchar) (uint8) byte; - - uint32 n = (uint32) (uint8) byte; - uint32 mask = 0x7f; - uint32 bit = 0x40; - size_t numExtraValues = 0; - - while ((n & bit) != 0 && bit > 0x10) - { - mask >>= 1; - ++numExtraValues; - bit >>= 1; - } - - n &= mask; - - for (size_t i = 1; i <= numExtraValues; ++i) - { - const uint8 nextByte = (uint8) data [i]; - - if ((nextByte & 0xc0) != 0x80) - break; - - n <<= 6; - n |= (nextByte & 0x3f); - } - - return (juce_wchar) n; - } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_UTF8& operator++() noexcept - { - jassert (*data != 0); // trying to advance past the end of the string? - const signed char n = (signed char) *data++; - - if (n < 0) - { - juce_wchar bit = 0x40; - - while ((n & bit) != 0 && bit > 0x8) - { - ++data; - bit >>= 1; - } - } - - return *this; - } - - /** Moves this pointer back to the previous character in the string. */ - CharPointer_UTF8 operator--() noexcept - { - int count = 0; - - while ((*--data & 0xc0) == 0x80 && ++count < 4) - {} - - return *this; - } - - /** Returns the character that this pointer is currently pointing to, and then - advances the pointer to point to the next character. */ - juce_wchar getAndAdvance() noexcept - { - const signed char byte = (signed char) *data++; - - if (byte >= 0) - return (juce_wchar) (uint8) byte; - - uint32 n = (uint32) (uint8) byte; - uint32 mask = 0x7f; - uint32 bit = 0x40; - int numExtraValues = 0; - - while ((n & bit) != 0 && bit > 0x8) - { - mask >>= 1; - ++numExtraValues; - bit >>= 1; - } - - n &= mask; - - while (--numExtraValues >= 0) - { - const uint32 nextByte = (uint32) (uint8) *data; - - if ((nextByte & 0xc0) != 0x80) - break; - - ++data; - n <<= 6; - n |= (nextByte & 0x3f); - } - - return (juce_wchar) n; - } - - /** Moves this pointer along to the next character in the string. */ - CharPointer_UTF8 operator++ (int) noexcept - { - CharPointer_UTF8 temp (*this); - ++*this; - return temp; - } - - /** Moves this pointer forwards by the specified number of characters. */ - void operator+= (int numToSkip) noexcept - { - if (numToSkip < 0) - { - while (++numToSkip <= 0) - --*this; - } - else - { - while (--numToSkip >= 0) - ++*this; - } - } - - /** Moves this pointer backwards by the specified number of characters. */ - void operator-= (int numToSkip) noexcept - { - operator+= (-numToSkip); - } - - /** Returns the character at a given character index from the start of the string. */ - juce_wchar operator[] (int characterIndex) const noexcept - { - CharPointer_UTF8 p (*this); - p += characterIndex; - return *p; - } - - /** Returns a pointer which is moved forwards from this one by the specified number of characters. */ - CharPointer_UTF8 operator+ (int numToSkip) const noexcept - { - CharPointer_UTF8 p (*this); - p += numToSkip; - return p; - } - - /** Returns a pointer which is moved backwards from this one by the specified number of characters. */ - CharPointer_UTF8 operator- (int numToSkip) const noexcept - { - CharPointer_UTF8 p (*this); - p += -numToSkip; - return p; - } - - /** Returns the number of characters in this string. */ - size_t length() const noexcept - { - const CharType* d = data; - size_t count = 0; - - for (;;) - { - const uint32 n = (uint32) (uint8) *d++; - - if ((n & 0x80) != 0) - { - while ((*d & 0xc0) == 0x80) - ++d; - } - else if (n == 0) - break; - - ++count; - } - - return count; - } - - /** Returns the number of characters in this string, or the given value, whichever is lower. */ - size_t lengthUpTo (const size_t maxCharsToCount) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, maxCharsToCount); - } - - /** Returns the number of characters in this string, or up to the given end pointer, whichever is lower. */ - size_t lengthUpTo (const CharPointer_UTF8 end) const noexcept - { - return CharacterFunctions::lengthUpTo (*this, end); - } - - /** Returns the number of bytes that are used to represent this string. - This includes the terminating null character. - */ - size_t sizeInBytes() const noexcept - { - jassert (data != nullptr); - return strlen (data) + 1; - } - - /** Returns the number of bytes that would be needed to represent the given - unicode character in this encoding format. - */ - static size_t getBytesRequiredFor (const juce_wchar charToWrite) noexcept - { - size_t num = 1; - const uint32 c = (uint32) charToWrite; - - if (c >= 0x80) - { - ++num; - if (c >= 0x800) - { - ++num; - if (c >= 0x10000) - ++num; - } - } - - return num; - } - - /** Returns the number of bytes that would be needed to represent the given - string in this encoding format. - The value returned does NOT include the terminating null character. - */ - template - static size_t getBytesRequiredFor (CharPointer text) noexcept - { - size_t count = 0; - juce_wchar n; - - while ((n = text.getAndAdvance()) != 0) - count += getBytesRequiredFor (n); - - return count; - } - - /** Returns a pointer to the null character that terminates this string. */ - CharPointer_UTF8 findTerminatingNull() const noexcept - { - return CharPointer_UTF8 (data + strlen (data)); - } - - /** Writes a unicode character to this string, and advances this pointer to point to the next position. */ - void write (const juce_wchar charToWrite) noexcept - { - const uint32 c = (uint32) charToWrite; - - if (c >= 0x80) - { - int numExtraBytes = 1; - if (c >= 0x800) - { - ++numExtraBytes; - if (c >= 0x10000) - ++numExtraBytes; - } - - *data++ = (CharType) ((uint32) (0xff << (7 - numExtraBytes)) | (c >> (numExtraBytes * 6))); - - while (--numExtraBytes >= 0) - *data++ = (CharType) (0x80 | (0x3f & (c >> (numExtraBytes * 6)))); - } - else - { - *data++ = (CharType) c; - } - } - - /** Writes a null character to this string (leaving the pointer's position unchanged). */ - inline void writeNull() const noexcept - { - *data = 0; - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - template - void writeAll (const CharPointer src) noexcept - { - CharacterFunctions::copyAll (*this, src); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. */ - void writeAll (const CharPointer_UTF8 src) noexcept - { - const CharType* s = src.data; - - while ((*data = *s) != 0) - { - ++data; - ++s; - } - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxDestBytes parameter specifies the maximum number of bytes that can be written - to the destination buffer before stopping. - */ - template - size_t writeWithDestByteLimit (const CharPointer src, const size_t maxDestBytes) noexcept - { - return CharacterFunctions::copyWithDestByteLimit (*this, src, maxDestBytes); - } - - /** Copies a source string to this pointer, advancing this pointer as it goes. - The maxChars parameter specifies the maximum number of characters that can be - written to the destination buffer before stopping (including the terminating null). - */ - template - void writeWithCharLimit (const CharPointer src, const int maxChars) noexcept - { - CharacterFunctions::copyWithCharLimit (*this, src, maxChars); - } - - /** Compares this string with another one. */ - template - int compare (const CharPointer other) const noexcept - { - return CharacterFunctions::compare (*this, other); - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareUpTo (*this, other, maxChars); - } - - /** Compares this string with another one. */ - template - int compareIgnoreCase (const CharPointer other) const noexcept - { - return CharacterFunctions::compareIgnoreCase (*this, other); - } - - /** Compares this string with another one. */ - int compareIgnoreCase (const CharPointer_UTF8 other) const noexcept - { - #if JUCE_MSVC - return stricmp (data, other.data); - #elif JUCE_MINGW - return CharacterFunctions::compareIgnoreCase (*this, other); - #else - return strcasecmp (data, other.data); - #endif - } - - /** Compares this string with another one, up to a specified number of characters. */ - template - int compareIgnoreCaseUpTo (const CharPointer other, const int maxChars) const noexcept - { - return CharacterFunctions::compareIgnoreCaseUpTo (*this, other, maxChars); - } - - /** Returns the character index of a substring, or -1 if it isn't found. */ - template - int indexOf (const CharPointer stringToFind) const noexcept - { - return CharacterFunctions::indexOf (*this, stringToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const juce_wchar charToFind) const noexcept - { - return CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns the character index of a unicode character, or -1 if it isn't found. */ - int indexOf (const juce_wchar charToFind, const bool ignoreCase) const noexcept - { - return ignoreCase ? CharacterFunctions::indexOfCharIgnoreCase (*this, charToFind) - : CharacterFunctions::indexOfChar (*this, charToFind); - } - - /** Returns true if the first character of this string is whitespace. */ - bool isWhitespace() const noexcept { const CharType c = *data; return c == ' ' || (c <= 13 && c >= 9); } - /** Returns true if the first character of this string is a digit. */ - bool isDigit() const noexcept { const CharType c = *data; return c >= '0' && c <= '9'; } - /** Returns true if the first character of this string is a letter. */ - bool isLetter() const noexcept { return CharacterFunctions::isLetter (operator*()) != 0; } - /** Returns true if the first character of this string is a letter or digit. */ - bool isLetterOrDigit() const noexcept { return CharacterFunctions::isLetterOrDigit (operator*()) != 0; } - /** Returns true if the first character of this string is upper-case. */ - bool isUpperCase() const noexcept { return CharacterFunctions::isUpperCase (operator*()) != 0; } - /** Returns true if the first character of this string is lower-case. */ - bool isLowerCase() const noexcept { return CharacterFunctions::isLowerCase (operator*()) != 0; } - - /** Returns an upper-case version of the first character of this string. */ - juce_wchar toUpperCase() const noexcept { return CharacterFunctions::toUpperCase (operator*()); } - /** Returns a lower-case version of the first character of this string. */ - juce_wchar toLowerCase() const noexcept { return CharacterFunctions::toLowerCase (operator*()); } - - /** Parses this string as a 32-bit integer. */ - int getIntValue32() const noexcept { return atoi (data); } - - /** Parses this string as a 64-bit integer. */ - int64 getIntValue64() const noexcept - { - #if JUCE_LINUX || JUCE_ANDROID || JUCE_MINGW - return atoll (data); - #elif JUCE_WINDOWS - return _atoi64 (data); - #else - return CharacterFunctions::getIntValue (*this); - #endif - } - - /** Parses this string as a floating point double. */ - double getDoubleValue() const noexcept { return CharacterFunctions::getDoubleValue (*this); } - - /** Returns the first non-whitespace character in the string. */ - CharPointer_UTF8 findEndOfWhitespace() const noexcept { return CharacterFunctions::findEndOfWhitespace (*this); } - - /** Returns true if the given unicode character can be represented in this encoding. */ - static bool canRepresent (juce_wchar character) noexcept - { - return ((unsigned int) character) < (unsigned int) 0x10ffff; - } - - /** Returns true if this data contains a valid string in this encoding. */ - static bool isValidString (const CharType* dataToTest, int maxBytesToRead) - { - while (--maxBytesToRead >= 0 && *dataToTest != 0) - { - const signed char byte = (signed char) *dataToTest++; - - if (byte < 0) - { - uint8 bit = 0x40; - int numExtraValues = 0; - - while ((byte & bit) != 0) - { - if (bit < 8) - return false; - - ++numExtraValues; - bit >>= 1; - - if (bit == 8 && (numExtraValues > maxBytesToRead - || *CharPointer_UTF8 (dataToTest - 1) > 0x10ffff)) - return false; - } - - maxBytesToRead -= numExtraValues; - if (maxBytesToRead < 0) - return false; - - while (--numExtraValues >= 0) - if ((*dataToTest++ & 0xc0) != 0x80) - return false; - } - } - - return true; - } - - /** Atomically swaps this pointer for a new value, returning the previous value. */ - CharPointer_UTF8 atomicSwap (const CharPointer_UTF8 newValue) - { - return CharPointer_UTF8 (reinterpret_cast &> (data).exchange (newValue.data)); - } - - /** These values are the byte-order mark (BOM) values for a UTF-8 stream. */ - enum - { - byteOrderMark1 = 0xef, - byteOrderMark2 = 0xbb, - byteOrderMark3 = 0xbf - }; - - /** Returns true if the first three bytes in this pointer are the UTF8 byte-order mark (BOM). - The pointer must not be null, and must point to at least 3 valid bytes. - */ - static bool isByteOrderMark (const void* possibleByteOrder) noexcept - { - jassert (possibleByteOrder != nullptr); - const uint8* const c = static_cast (possibleByteOrder); - - return c[0] == (uint8) byteOrderMark1 - && c[1] == (uint8) byteOrderMark2 - && c[2] == (uint8) byteOrderMark3; - } - -private: - CharType* data; -}; - -#endif // JUCE_CHARPOINTER_UTF8_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp b/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp deleted file mode 100755 index 11eaa18..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.cpp +++ /dev/null @@ -1,154 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -//============================================================================== -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4514 4996) -#endif - -juce_wchar CharacterFunctions::toUpperCase (const juce_wchar character) noexcept -{ - return towupper ((wchar_t) character); -} - -juce_wchar CharacterFunctions::toLowerCase (const juce_wchar character) noexcept -{ - return towlower ((wchar_t) character); -} - -bool CharacterFunctions::isUpperCase (const juce_wchar character) noexcept -{ - #if JUCE_WINDOWS - return iswupper ((wchar_t) character) != 0; - #else - return toLowerCase (character) != character; - #endif -} - -bool CharacterFunctions::isLowerCase (const juce_wchar character) noexcept -{ - #if JUCE_WINDOWS - return iswlower ((wchar_t) character) != 0; - #else - return toUpperCase (character) != character; - #endif -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -//============================================================================== -bool CharacterFunctions::isWhitespace (const char character) noexcept -{ - return character == ' ' || (character <= 13 && character >= 9); -} - -bool CharacterFunctions::isWhitespace (const juce_wchar character) noexcept -{ - return iswspace ((wchar_t) character) != 0; -} - -bool CharacterFunctions::isDigit (const char character) noexcept -{ - return (character >= '0' && character <= '9'); -} - -bool CharacterFunctions::isDigit (const juce_wchar character) noexcept -{ - return iswdigit ((wchar_t) character) != 0; -} - -bool CharacterFunctions::isLetter (const char character) noexcept -{ - return (character >= 'a' && character <= 'z') - || (character >= 'A' && character <= 'Z'); -} - -bool CharacterFunctions::isLetter (const juce_wchar character) noexcept -{ - return iswalpha ((wchar_t) character) != 0; -} - -bool CharacterFunctions::isLetterOrDigit (const char character) noexcept -{ - return (character >= 'a' && character <= 'z') - || (character >= 'A' && character <= 'Z') - || (character >= '0' && character <= '9'); -} - -bool CharacterFunctions::isLetterOrDigit (const juce_wchar character) noexcept -{ - return iswalnum ((wchar_t) character) != 0; -} - -int CharacterFunctions::getHexDigitValue (const juce_wchar digit) noexcept -{ - unsigned int d = (unsigned int) digit - '0'; - if (d < (unsigned int) 10) - return (int) d; - - d += (unsigned int) ('0' - 'a'); - if (d < (unsigned int) 6) - return (int) d + 10; - - d += (unsigned int) ('a' - 'A'); - if (d < (unsigned int) 6) - return (int) d + 10; - - return -1; -} - -double CharacterFunctions::mulexp10 (const double value, int exponent) noexcept -{ - if (exponent == 0) - return value; - - if (value == 0) - return 0; - - const bool negative = (exponent < 0); - if (negative) - exponent = -exponent; - - double result = 1.0, power = 10.0; - for (int bit = 1; exponent != 0; bit <<= 1) - { - if ((exponent & bit) != 0) - { - exponent ^= bit; - result *= power; - if (exponent == 0) - break; - } - power *= power; - } - - return negative ? (value / result) : (value * result); -} diff --git a/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h b/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h deleted file mode 100755 index bade0dd..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_CharacterFunctions.h +++ /dev/null @@ -1,629 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_CHARACTERFUNCTIONS_H_INCLUDED -#define JUCE_CHARACTERFUNCTIONS_H_INCLUDED - - -//============================================================================== -#if JUCE_WINDOWS && ! DOXYGEN - #define JUCE_NATIVE_WCHAR_IS_UTF8 0 - #define JUCE_NATIVE_WCHAR_IS_UTF16 1 - #define JUCE_NATIVE_WCHAR_IS_UTF32 0 -#else - /** This macro will be set to 1 if the compiler's native wchar_t is an 8-bit type. */ - #define JUCE_NATIVE_WCHAR_IS_UTF8 0 - /** This macro will be set to 1 if the compiler's native wchar_t is a 16-bit type. */ - #define JUCE_NATIVE_WCHAR_IS_UTF16 0 - /** This macro will be set to 1 if the compiler's native wchar_t is a 32-bit type. */ - #define JUCE_NATIVE_WCHAR_IS_UTF32 1 -#endif - -#if JUCE_NATIVE_WCHAR_IS_UTF32 || DOXYGEN - /** A platform-independent 32-bit unicode character type. */ - typedef wchar_t juce_wchar; -#else - typedef uint32 juce_wchar; -#endif - -#ifndef DOXYGEN - /** This macro is deprecated, but preserved for compatibility with old code. */ - #define JUCE_T(stringLiteral) (L##stringLiteral) -#endif - -#if JUCE_DEFINE_T_MACRO - /** The 'T' macro is an alternative for using the "L" prefix in front of a string literal. - - This macro is deprecated, but available for compatibility with old code if you set - JUCE_DEFINE_T_MACRO = 1. The fastest, most portable and best way to write your string - literals is as standard char strings, using escaped utf-8 character sequences for extended - characters, rather than trying to store them as wide-char strings. - */ - #define T(stringLiteral) JUCE_T(stringLiteral) -#endif - -//============================================================================== -/** - A collection of functions for manipulating characters and character strings. - - Most of these methods are designed for internal use by the String and CharPointer - classes, but some of them may be useful to call directly. - - @see String, CharPointer_UTF8, CharPointer_UTF16, CharPointer_UTF32 -*/ -class JUCE_API CharacterFunctions -{ -public: - //============================================================================== - /** Converts a character to upper-case. */ - static juce_wchar toUpperCase (juce_wchar character) noexcept; - /** Converts a character to lower-case. */ - static juce_wchar toLowerCase (juce_wchar character) noexcept; - - /** Checks whether a unicode character is upper-case. */ - static bool isUpperCase (juce_wchar character) noexcept; - /** Checks whether a unicode character is lower-case. */ - static bool isLowerCase (juce_wchar character) noexcept; - - /** Checks whether a character is whitespace. */ - static bool isWhitespace (char character) noexcept; - /** Checks whether a character is whitespace. */ - static bool isWhitespace (juce_wchar character) noexcept; - - /** Checks whether a character is a digit. */ - static bool isDigit (char character) noexcept; - /** Checks whether a character is a digit. */ - static bool isDigit (juce_wchar character) noexcept; - - /** Checks whether a character is alphabetic. */ - static bool isLetter (char character) noexcept; - /** Checks whether a character is alphabetic. */ - static bool isLetter (juce_wchar character) noexcept; - - /** Checks whether a character is alphabetic or numeric. */ - static bool isLetterOrDigit (char character) noexcept; - /** Checks whether a character is alphabetic or numeric. */ - static bool isLetterOrDigit (juce_wchar character) noexcept; - - /** Returns 0 to 16 for '0' to 'F", or -1 for characters that aren't a legal hex digit. */ - static int getHexDigitValue (juce_wchar digit) noexcept; - - //============================================================================== - /** Parses a character string to read a floating-point number. - Note that this will advance the pointer that is passed in, leaving it at - the end of the number. - */ - template - static double readDoubleValue (CharPointerType& text) noexcept - { - double result[3] = { 0 }, accumulator[2] = { 0 }; - int exponentAdjustment[2] = { 0 }, exponentAccumulator[2] = { -1, -1 }; - int exponent = 0, decPointIndex = 0, digit = 0; - int lastDigit = 0, numSignificantDigits = 0; - bool isNegative = false, digitsFound = false; - const int maxSignificantDigits = 15 + 2; - - text = text.findEndOfWhitespace(); - juce_wchar c = *text; - - switch (c) - { - case '-': isNegative = true; // fall-through.. - case '+': c = *++text; - } - - switch (c) - { - case 'n': - case 'N': - if ((text[1] == 'a' || text[1] == 'A') && (text[2] == 'n' || text[2] == 'N')) - return std::numeric_limits::quiet_NaN(); - break; - - case 'i': - case 'I': - if ((text[1] == 'n' || text[1] == 'N') && (text[2] == 'f' || text[2] == 'F')) - return std::numeric_limits::infinity(); - break; - } - - for (;;) - { - if (text.isDigit()) - { - lastDigit = digit; - digit = (int) text.getAndAdvance() - '0'; - digitsFound = true; - - if (decPointIndex != 0) - exponentAdjustment[1]++; - - if (numSignificantDigits == 0 && digit == 0) - continue; - - if (++numSignificantDigits > maxSignificantDigits) - { - if (digit > 5) - ++accumulator [decPointIndex]; - else if (digit == 5 && (lastDigit & 1) != 0) - ++accumulator [decPointIndex]; - - if (decPointIndex > 0) - exponentAdjustment[1]--; - else - exponentAdjustment[0]++; - - while (text.isDigit()) - { - ++text; - if (decPointIndex == 0) - exponentAdjustment[0]++; - } - } - else - { - const double maxAccumulatorValue = (double) ((std::numeric_limits::max() - 9) / 10); - if (accumulator [decPointIndex] > maxAccumulatorValue) - { - result [decPointIndex] = mulexp10 (result [decPointIndex], exponentAccumulator [decPointIndex]) - + accumulator [decPointIndex]; - accumulator [decPointIndex] = 0; - exponentAccumulator [decPointIndex] = 0; - } - - accumulator [decPointIndex] = accumulator[decPointIndex] * 10 + digit; - exponentAccumulator [decPointIndex]++; - } - } - else if (decPointIndex == 0 && *text == '.') - { - ++text; - decPointIndex = 1; - - if (numSignificantDigits > maxSignificantDigits) - { - while (text.isDigit()) - ++text; - break; - } - } - else - { - break; - } - } - - result[0] = mulexp10 (result[0], exponentAccumulator[0]) + accumulator[0]; - - if (decPointIndex != 0) - result[1] = mulexp10 (result[1], exponentAccumulator[1]) + accumulator[1]; - - c = *text; - if ((c == 'e' || c == 'E') && digitsFound) - { - bool negativeExponent = false; - - switch (*++text) - { - case '-': negativeExponent = true; // fall-through.. - case '+': ++text; - } - - while (text.isDigit()) - exponent = (exponent * 10) + ((int) text.getAndAdvance() - '0'); - - if (negativeExponent) - exponent = -exponent; - } - - double r = mulexp10 (result[0], exponent + exponentAdjustment[0]); - if (decPointIndex != 0) - r += mulexp10 (result[1], exponent - exponentAdjustment[1]); - - return isNegative ? -r : r; - } - - /** Parses a character string, to read a floating-point value. */ - template - static double getDoubleValue (CharPointerType text) noexcept - { - return readDoubleValue (text); - } - - //============================================================================== - /** Parses a character string, to read an integer value. */ - template - static IntType getIntValue (const CharPointerType text) noexcept - { - IntType v = 0; - CharPointerType s (text.findEndOfWhitespace()); - - const bool isNeg = *s == '-'; - if (isNeg) - ++s; - - for (;;) - { - const juce_wchar c = s.getAndAdvance(); - - if (c >= '0' && c <= '9') - v = v * 10 + (IntType) (c - '0'); - else - break; - } - - return isNeg ? -v : v; - } - - template - struct HexParser - { - template - static ResultType parse (CharPointerType t) noexcept - { - ResultType result = 0; - - while (! t.isEmpty()) - { - const int hexValue = CharacterFunctions::getHexDigitValue (t.getAndAdvance()); - - if (hexValue >= 0) - result = (result << 4) | hexValue; - } - - return result; - } - }; - - //============================================================================== - /** Counts the number of characters in a given string, stopping if the count exceeds - a specified limit. */ - template - static size_t lengthUpTo (CharPointerType text, const size_t maxCharsToCount) noexcept - { - size_t len = 0; - - while (len < maxCharsToCount && text.getAndAdvance() != 0) - ++len; - - return len; - } - - /** Counts the number of characters in a given string, stopping if the count exceeds - a specified end-pointer. */ - template - static size_t lengthUpTo (CharPointerType start, const CharPointerType end) noexcept - { - size_t len = 0; - - while (start < end && start.getAndAdvance() != 0) - ++len; - - return len; - } - - /** Copies null-terminated characters from one string to another. */ - template - static void copyAll (DestCharPointerType& dest, SrcCharPointerType src) noexcept - { - for (;;) - { - const juce_wchar c = src.getAndAdvance(); - - if (c == 0) - break; - - dest.write (c); - } - - dest.writeNull(); - } - - /** Copies characters from one string to another, up to a null terminator - or a given byte size limit. */ - template - static size_t copyWithDestByteLimit (DestCharPointerType& dest, SrcCharPointerType src, size_t maxBytesToWrite) noexcept - { - typename DestCharPointerType::CharType const* const startAddress = dest.getAddress(); - ssize_t maxBytes = (ssize_t) maxBytesToWrite; - maxBytes -= sizeof (typename DestCharPointerType::CharType); // (allow for a terminating null) - - for (;;) - { - const juce_wchar c = src.getAndAdvance(); - const size_t bytesNeeded = DestCharPointerType::getBytesRequiredFor (c); - - maxBytes -= bytesNeeded; - if (c == 0 || maxBytes < 0) - break; - - dest.write (c); - } - - dest.writeNull(); - - return (size_t) getAddressDifference (dest.getAddress(), startAddress) - + sizeof (typename DestCharPointerType::CharType); - } - - /** Copies characters from one string to another, up to a null terminator - or a given maximum number of characters. */ - template - static void copyWithCharLimit (DestCharPointerType& dest, SrcCharPointerType src, int maxChars) noexcept - { - while (--maxChars > 0) - { - const juce_wchar c = src.getAndAdvance(); - if (c == 0) - break; - - dest.write (c); - } - - dest.writeNull(); - } - - /** Compares two null-terminated character strings. */ - template - static int compare (CharPointerType1 s1, CharPointerType2 s2) noexcept - { - for (;;) - { - const int c1 = (int) s1.getAndAdvance(); - const int c2 = (int) s2.getAndAdvance(); - const int diff = c1 - c2; - - if (diff != 0) return diff < 0 ? -1 : 1; - if (c1 == 0) break; - } - - return 0; - } - - /** Compares two null-terminated character strings, up to a given number of characters. */ - template - static int compareUpTo (CharPointerType1 s1, CharPointerType2 s2, int maxChars) noexcept - { - while (--maxChars >= 0) - { - const int c1 = (int) s1.getAndAdvance(); - const int c2 = (int) s2.getAndAdvance(); - const int diff = c1 - c2; - - if (diff != 0) return diff < 0 ? -1 : 1; - if (c1 == 0) break; - } - - return 0; - } - - /** Compares two null-terminated character strings, using a case-independant match. */ - template - static int compareIgnoreCase (CharPointerType1 s1, CharPointerType2 s2) noexcept - { - for (;;) - { - const int c1 = (int) s1.toUpperCase(); - const int c2 = (int) s2.toUpperCase(); - const int diff = c1 - c2; - - if (diff != 0) return diff < 0 ? -1 : 1; - if (c1 == 0) break; - - ++s1; ++s2; - } - - return 0; - } - - /** Compares two null-terminated character strings, using a case-independent match. */ - template - static int compareIgnoreCaseUpTo (CharPointerType1 s1, CharPointerType2 s2, int maxChars) noexcept - { - while (--maxChars >= 0) - { - const int c1 = (int) s1.toUpperCase(); - const int c2 = (int) s2.toUpperCase(); - const int diff = c1 - c2; - - if (diff != 0) return diff < 0 ? -1 : 1; - if (c1 == 0) break; - - ++s1; ++s2; - } - - return 0; - } - - /** Finds the character index of a given substring in another string. - Returns -1 if the substring is not found. - */ - template - static int indexOf (CharPointerType1 textToSearch, const CharPointerType2 substringToLookFor) noexcept - { - int index = 0; - const int substringLength = (int) substringToLookFor.length(); - - for (;;) - { - if (textToSearch.compareUpTo (substringToLookFor, substringLength) == 0) - return index; - - if (textToSearch.getAndAdvance() == 0) - return -1; - - ++index; - } - } - - /** Returns a pointer to the first occurrence of a substring in a string. - If the substring is not found, this will return a pointer to the string's - null terminator. - */ - template - static CharPointerType1 find (CharPointerType1 textToSearch, const CharPointerType2 substringToLookFor) noexcept - { - const int substringLength = (int) substringToLookFor.length(); - - while (textToSearch.compareUpTo (substringToLookFor, substringLength) != 0 - && ! textToSearch.isEmpty()) - ++textToSearch; - - return textToSearch; - } - - /** Returns a pointer to the first occurrence of a substring in a string. - If the substring is not found, this will return a pointer to the string's - null terminator. - */ - template - static CharPointerType find (CharPointerType textToSearch, const juce_wchar charToLookFor) noexcept - { - for (;; ++textToSearch) - { - const juce_wchar c = *textToSearch; - - if (c == charToLookFor || c == 0) - break; - } - - return textToSearch; - } - - /** Finds the character index of a given substring in another string, using - a case-independent match. - Returns -1 if the substring is not found. - */ - template - static int indexOfIgnoreCase (CharPointerType1 haystack, const CharPointerType2 needle) noexcept - { - int index = 0; - const int needleLength = (int) needle.length(); - - for (;;) - { - if (haystack.compareIgnoreCaseUpTo (needle, needleLength) == 0) - return index; - - if (haystack.getAndAdvance() == 0) - return -1; - - ++index; - } - } - - /** Finds the character index of a given character in another string. - Returns -1 if the character is not found. - */ - template - static int indexOfChar (Type text, const juce_wchar charToFind) noexcept - { - int i = 0; - - while (! text.isEmpty()) - { - if (text.getAndAdvance() == charToFind) - return i; - - ++i; - } - - return -1; - } - - /** Finds the character index of a given character in another string, using - a case-independent match. - Returns -1 if the character is not found. - */ - template - static int indexOfCharIgnoreCase (Type text, juce_wchar charToFind) noexcept - { - charToFind = CharacterFunctions::toLowerCase (charToFind); - int i = 0; - - while (! text.isEmpty()) - { - if (text.toLowerCase() == charToFind) - return i; - - ++text; - ++i; - } - - return -1; - } - - /** Returns a pointer to the first non-whitespace character in a string. - If the string contains only whitespace, this will return a pointer - to its null terminator. - */ - template - static Type findEndOfWhitespace (Type text) noexcept - { - while (text.isWhitespace()) - ++text; - - return text; - } - - /** Returns a pointer to the first character in the string which is found in - the breakCharacters string. - */ - template - static Type findEndOfToken (Type text, const BreakType breakCharacters, const Type quoteCharacters) - { - juce_wchar currentQuoteChar = 0; - - while (! text.isEmpty()) - { - const juce_wchar c = text.getAndAdvance(); - - if (currentQuoteChar == 0 && breakCharacters.indexOf (c) >= 0) - { - --text; - break; - } - - if (quoteCharacters.indexOf (c) >= 0) - { - if (currentQuoteChar == 0) - currentQuoteChar = c; - else if (currentQuoteChar == c) - currentQuoteChar = 0; - } - } - - return text; - } - -private: - static double mulexp10 (const double value, int exponent) noexcept; -}; - - -#endif // JUCE_CHARACTERFUNCTIONS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp b/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp deleted file mode 100755 index bac4dd5..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_Identifier.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -Identifier::Identifier() noexcept {} -Identifier::~Identifier() noexcept {} - -Identifier::Identifier (const Identifier& other) noexcept : name (other.name) {} - -Identifier& Identifier::operator= (const Identifier other) noexcept -{ - name = other.name; - return *this; -} - -Identifier::Identifier (const String& nm) - : name (StringPool::getGlobalPool().getPooledString (nm)) -{ - /* An Identifier string must be suitable for use as a script variable or XML - attribute, so it can only contain this limited set of characters.. */ - jassert (isValidIdentifier (toString())); -} - -Identifier::Identifier (const char* nm) - : name (StringPool::getGlobalPool().getPooledString (nm)) -{ - /* An Identifier string must be suitable for use as a script variable or XML - attribute, so it can only contain this limited set of characters.. */ - jassert (isValidIdentifier (toString())); -} - -Identifier::Identifier (String::CharPointerType start, String::CharPointerType end) - : name (StringPool::getGlobalPool().getPooledString (start, end)) -{ - /* An Identifier string must be suitable for use as a script variable or XML - attribute, so it can only contain this limited set of characters.. */ - jassert (isValidIdentifier (toString())); -} - -Identifier Identifier::null; - -bool Identifier::isValidIdentifier (const String& possibleIdentifier) noexcept -{ - return possibleIdentifier.isNotEmpty() - && possibleIdentifier.containsOnly ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-:#@$%"); -} diff --git a/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h b/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h deleted file mode 100755 index f60eec8..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_Identifier.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_IDENTIFIER_H_INCLUDED -#define JUCE_IDENTIFIER_H_INCLUDED - - -//============================================================================== -/** - Represents a string identifier, designed for accessing properties by name. - - Comparing two Identifier objects is very fast (an O(1) operation), but creating - them can be slower than just using a String directly, so the optimal way to use them - is to keep some static Identifier objects for the things you use often. - - @see NamedValueSet, ValueTree -*/ -class JUCE_API Identifier -{ -public: - /** Creates a null identifier. */ - Identifier() noexcept; - - /** Creates an identifier with a specified name. - Because this name may need to be used in contexts such as script variables or XML - tags, it must only contain ascii letters and digits, or the underscore character. - */ - Identifier (const char* name); - - /** Creates an identifier with a specified name. - Because this name may need to be used in contexts such as script variables or XML - tags, it must only contain ascii letters and digits, or the underscore character. - */ - Identifier (const String& name); - - /** Creates an identifier with a specified name. - Because this name may need to be used in contexts such as script variables or XML - tags, it must only contain ascii letters and digits, or the underscore character. - */ - Identifier (String::CharPointerType nameStart, String::CharPointerType nameEnd); - - /** Creates a copy of another identifier. */ - Identifier (const Identifier& other) noexcept; - - /** Creates a copy of another identifier. */ - Identifier& operator= (const Identifier other) noexcept; - - /** Destructor */ - ~Identifier() noexcept; - - /** Compares two identifiers. This is a very fast operation. */ - inline bool operator== (Identifier other) const noexcept { return name.getCharPointer() == other.name.getCharPointer(); } - - /** Compares two identifiers. This is a very fast operation. */ - inline bool operator!= (Identifier other) const noexcept { return name.getCharPointer() != other.name.getCharPointer(); } - - /** Compares the identifier with a string. */ - inline bool operator== (StringRef other) const noexcept { return name == other; } - - /** Compares the identifier with a string. */ - inline bool operator!= (StringRef other) const noexcept { return name != other; } - - /** Returns this identifier as a string. */ - const String& toString() const noexcept { return name; } - - /** Returns this identifier's raw string pointer. */ - operator String::CharPointerType() const noexcept { return name.getCharPointer(); } - - /** Returns this identifier's raw string pointer. */ - String::CharPointerType getCharPointer() const noexcept { return name.getCharPointer(); } - - /** Returns this identifier as a StringRef. */ - operator StringRef() const noexcept { return name; } - - /** Returns true if this Identifier is not null */ - bool isValid() const noexcept { return name.isNotEmpty(); } - - /** Returns true if this Identifier is null */ - bool isNull() const noexcept { return name.isEmpty(); } - - /** A null identifier. */ - static Identifier null; - - /** Checks a given string for characters that might not be valid in an Identifier. - Since Identifiers are used as a script variables and XML attributes, they should only contain - alphanumeric characters, underscores, or the '-' and ':' characters. - */ - static bool isValidIdentifier (const String& possibleIdentifier) noexcept; - -private: - String name; -}; - - -#endif // JUCE_IDENTIFIER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp b/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp deleted file mode 100755 index e6118d3..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -LocalisedStrings::LocalisedStrings (const String& fileContents, bool ignoreCase) -{ - loadFromText (fileContents, ignoreCase); -} - -LocalisedStrings::LocalisedStrings (const File& fileToLoad, bool ignoreCase) -{ - loadFromText (fileToLoad.loadFileAsString(), ignoreCase); -} - -LocalisedStrings::LocalisedStrings (const LocalisedStrings& other) - : languageName (other.languageName), countryCodes (other.countryCodes), - translations (other.translations), fallback (createCopyIfNotNull (other.fallback.get())) -{ -} - -LocalisedStrings& LocalisedStrings::operator= (const LocalisedStrings& other) -{ - languageName = other.languageName; - countryCodes = other.countryCodes; - translations = other.translations; - fallback = createCopyIfNotNull (other.fallback.get()); - return *this; -} - -LocalisedStrings::~LocalisedStrings() -{ -} - -//============================================================================== -String LocalisedStrings::translate (const String& text) const -{ - if (fallback != nullptr && ! translations.containsKey (text)) - return fallback->translate (text); - - return translations.getValue (text, text); -} - -String LocalisedStrings::translate (const String& text, const String& resultIfNotFound) const -{ - if (fallback != nullptr && ! translations.containsKey (text)) - return fallback->translate (text, resultIfNotFound); - - return translations.getValue (text, resultIfNotFound); -} - -namespace -{ - #if JUCE_CHECK_MEMORY_LEAKS - // By using this object to force a LocalisedStrings object to be created - // before the currentMappings object, we can force the static order-of-destruction to - // delete the currentMappings object first, which avoids a bogus leak warning. - // (Oddly, just creating a LocalisedStrings on the stack doesn't work in gcc, it - // has to be created with 'new' for this to work..) - struct LeakAvoidanceTrick - { - LeakAvoidanceTrick() - { - const ScopedPointer dummy (new LocalisedStrings (String(), false)); - } - }; - - LeakAvoidanceTrick leakAvoidanceTrick; - #endif - - SpinLock currentMappingsLock; - ScopedPointer currentMappings; - - static int findCloseQuote (const String& text, int startPos) - { - juce_wchar lastChar = 0; - String::CharPointerType t (text.getCharPointer() + startPos); - - for (;;) - { - const juce_wchar c = t.getAndAdvance(); - - if (c == 0 || (c == '"' && lastChar != '\\')) - break; - - lastChar = c; - ++startPos; - } - - return startPos; - } - - static String unescapeString (const String& s) - { - return s.replace ("\\\"", "\"") - .replace ("\\\'", "\'") - .replace ("\\t", "\t") - .replace ("\\r", "\r") - .replace ("\\n", "\n"); - } -} - -void LocalisedStrings::loadFromText (const String& fileContents, bool ignoreCase) -{ - translations.setIgnoresCase (ignoreCase); - - StringArray lines; - lines.addLines (fileContents); - - for (int i = 0; i < lines.size(); ++i) - { - String line (lines[i].trim()); - - if (line.startsWithChar ('"')) - { - int closeQuote = findCloseQuote (line, 1); - - const String originalText (unescapeString (line.substring (1, closeQuote))); - - if (originalText.isNotEmpty()) - { - const int openingQuote = findCloseQuote (line, closeQuote + 1); - closeQuote = findCloseQuote (line, openingQuote + 1); - - const String newText (unescapeString (line.substring (openingQuote + 1, closeQuote))); - - if (newText.isNotEmpty()) - translations.set (originalText, newText); - } - } - else if (line.startsWithIgnoreCase ("language:")) - { - languageName = line.substring (9).trim(); - } - else if (line.startsWithIgnoreCase ("countries:")) - { - countryCodes.addTokens (line.substring (10).trim(), true); - countryCodes.trim(); - countryCodes.removeEmptyStrings(); - } - } - - translations.minimiseStorageOverheads(); -} - -void LocalisedStrings::addStrings (const LocalisedStrings& other) -{ - jassert (languageName == other.languageName); - jassert (countryCodes == other.countryCodes); - - translations.addArray (other.translations); -} - -void LocalisedStrings::setFallback (LocalisedStrings* f) -{ - fallback = f; -} - -//============================================================================== -void LocalisedStrings::setCurrentMappings (LocalisedStrings* newTranslations) -{ - const SpinLock::ScopedLockType sl (currentMappingsLock); - currentMappings = newTranslations; -} - -LocalisedStrings* LocalisedStrings::getCurrentMappings() -{ - return currentMappings; -} - -String LocalisedStrings::translateWithCurrentMappings (const String& text) { return juce::translate (text); } -String LocalisedStrings::translateWithCurrentMappings (const char* text) { return juce::translate (text); } - -JUCE_API String translate (const String& text) { return juce::translate (text, text); } -JUCE_API String translate (const char* text) { return juce::translate (String (text)); } -JUCE_API String translate (CharPointer_UTF8 text) { return juce::translate (String (text)); } - -JUCE_API String translate (const String& text, const String& resultIfNotFound) -{ - const SpinLock::ScopedLockType sl (currentMappingsLock); - - if (const LocalisedStrings* const mappings = LocalisedStrings::getCurrentMappings()) - return mappings->translate (text, resultIfNotFound); - - return resultIfNotFound; -} diff --git a/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h b/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h deleted file mode 100755 index a594919..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_LocalisedStrings.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_LOCALISEDSTRINGS_H_INCLUDED -#define JUCE_LOCALISEDSTRINGS_H_INCLUDED - - -//============================================================================== -/** - Used to convert strings to localised foreign-language versions. - - This is basically a look-up table of strings and their translated equivalents. - It can be loaded from a text file, so that you can supply a set of localised - versions of strings that you use in your app. - - To use it in your code, simply call the translate() method on each string that - might have foreign versions, and if none is found, the method will just return - the original string. - - The translation file should start with some lines specifying a description of - the language it contains, and also a list of ISO country codes where it might - be appropriate to use the file. After that, each line of the file should contain - a pair of quoted strings with an '=' sign. - - E.g. for a french translation, the file might be: - - @code - language: French - countries: fr be mc ch lu - - "hello" = "bonjour" - "goodbye" = "au revoir" - @endcode - - If the strings need to contain a quote character, they can use '\"' instead, and - if the first non-whitespace character on a line isn't a quote, then it's ignored, - (you can use this to add comments). - - Note that this is a singleton class, so don't create or destroy the object directly. - There's also a TRANS(text) macro defined to make it easy to use the this. - - E.g. @code - printSomething (TRANS("hello")); - @endcode - - This macro is used in the Juce classes themselves, so your application has a chance to - intercept and translate any internal Juce text strings that might be shown. (You can easily - get a list of all the messages by searching for the TRANS() macro in the Juce source - code). -*/ -class JUCE_API LocalisedStrings -{ -public: - //============================================================================== - /** Creates a set of translations from the text of a translation file. - - When you create one of these, you can call setCurrentMappings() to make it - the set of mappings that the system's using. - */ - LocalisedStrings (const String& fileContents, bool ignoreCaseOfKeys); - - /** Creates a set of translations from a file. - - When you create one of these, you can call setCurrentMappings() to make it - the set of mappings that the system's using. - */ - LocalisedStrings (const File& fileToLoad, bool ignoreCaseOfKeys); - - LocalisedStrings (const LocalisedStrings&); - LocalisedStrings& operator= (const LocalisedStrings&); - - /** Destructor. */ - ~LocalisedStrings(); - - //============================================================================== - /** Selects the current set of mappings to be used by the system. - - The object you pass in will be automatically deleted when no longer needed, so - don't keep a pointer to it. You can also pass in nullptr to remove the current - mappings. - - See also the TRANS() macro, which uses the current set to do its translation. - - @see translateWithCurrentMappings - */ - static void setCurrentMappings (LocalisedStrings* newTranslations); - - /** Returns the currently selected set of mappings. - - This is the object that was last passed to setCurrentMappings(). It may - be nullptr if none has been created. - */ - static LocalisedStrings* getCurrentMappings(); - - /** Tries to translate a string using the currently selected set of mappings. - - If no mapping has been set, or if the mapping doesn't contain a translation - for the string, this will just return the original string. - - See also the TRANS() macro, which uses this method to do its translation. - - @see setCurrentMappings, getCurrentMappings - */ - static String translateWithCurrentMappings (const String& text); - - /** Tries to translate a string using the currently selected set of mappings. - - If no mapping has been set, or if the mapping doesn't contain a translation - for the string, this will just return the original string. - - See also the TRANS() macro, which uses this method to do its translation. - - @see setCurrentMappings, getCurrentMappings - */ - static String translateWithCurrentMappings (const char* text); - - //============================================================================== - /** Attempts to look up a string and return its localised version. - If the string isn't found in the list, the original string will be returned. - */ - String translate (const String& text) const; - - /** Attempts to look up a string and return its localised version. - If the string isn't found in the list, the resultIfNotFound string will be returned. - */ - String translate (const String& text, const String& resultIfNotFound) const; - - /** Returns the name of the language specified in the translation file. - - This is specified in the file using a line starting with "language:", e.g. - @code - language: german - @endcode - */ - String getLanguageName() const { return languageName; } - - /** Returns the list of suitable country codes listed in the translation file. - - These is specified in the file using a line starting with "countries:", e.g. - @code - countries: fr be mc ch lu - @endcode - - The country codes are supposed to be 2-character ISO complient codes. - */ - const StringArray& getCountryCodes() const { return countryCodes; } - - /** Provides access to the actual list of mappings. */ - const StringPairArray& getMappings() const { return translations; } - - //============================================================================== - /** Adds and merges another set of translations into this set. - - Note that the language name and country codes of the new LocalisedStrings - object must match that of this object - an assertion will be thrown if they - don't match. - - Any existing values will have their mappings overwritten by the new ones. - */ - void addStrings (const LocalisedStrings&); - - /** Gives this object a set of strings to use as a fallback if a string isn't found. - The object that is passed-in will be owned and deleted by this object - when no longer needed. It can be nullptr to clear the existing fallback object. - */ - void setFallback (LocalisedStrings* fallbackStrings); - -private: - //============================================================================== - String languageName; - StringArray countryCodes; - StringPairArray translations; - ScopedPointer fallback; - friend struct ContainerDeletePolicy; - - void loadFromText (const String&, bool ignoreCase); - - JUCE_LEAK_DETECTOR (LocalisedStrings) -}; - -//============================================================================== -#ifndef TRANS - /** Uses the LocalisedStrings class to translate the given string literal. - This macro is provided for backwards-compatibility, and just calls the translate() - function. In new code, it's recommended that you just call translate() directly - instead, and avoid using macros. - @see translate(), LocalisedStrings - */ - #define TRANS(stringLiteral) juce::translate (stringLiteral) -#endif - -/** A dummy version of the TRANS macro, used to indicate a string literal that should be - added to the translation file by source-code scanner tools. - - Wrapping a string literal in this macro has no effect, but by using it around strings - that your app needs to translate at a later stage, it lets automatic code-scanning tools - find this string and add it to the list of strings that need translation. -*/ -#define NEEDS_TRANS(stringLiteral) (stringLiteral) - -/** Uses the LocalisedStrings class to translate the given string literal. - @see LocalisedStrings -*/ -JUCE_API String translate (const String& stringLiteral); - -/** Uses the LocalisedStrings class to translate the given string literal. - @see LocalisedStrings -*/ -JUCE_API String translate (const char* stringLiteral); - -/** Uses the LocalisedStrings class to translate the given string literal. - @see LocalisedStrings -*/ -JUCE_API String translate (CharPointer_UTF8 stringLiteral); - -/** Uses the LocalisedStrings class to translate the given string literal. - @see LocalisedStrings -*/ -JUCE_API String translate (const String& stringLiteral, const String& resultIfNotFound); - - -#endif // JUCE_LOCALISEDSTRINGS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h b/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h deleted file mode 100755 index 980ac23..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_NewLine.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_NEWLINE_H_INCLUDED -#define JUCE_NEWLINE_H_INCLUDED - - -//============================================================================== -/** This class is used for represent a new-line character sequence. - - To write a new-line to a stream, you can use the predefined 'newLine' variable, e.g. - @code - myOutputStream << "Hello World" << newLine << newLine; - @endcode - - The exact character sequence that will be used for the new-line can be set and - retrieved with OutputStream::setNewLineString() and OutputStream::getNewLineString(). -*/ -class JUCE_API NewLine -{ -public: - /** Returns the default new-line sequence that the library uses. - @see OutputStream::setNewLineString() - */ - static const char* getDefault() noexcept { return "\r\n"; } - - /** Returns the default new-line sequence that the library uses. - @see getDefault() - */ - operator String() const { return getDefault(); } - - /** Returns the default new-line sequence that the library uses. - @see OutputStream::setNewLineString() - */ - operator StringRef() const noexcept { return getDefault(); } -}; - -//============================================================================== -/** A predefined object representing a new-line, which can be written to a string or stream. - - To write a new-line to a stream, you can use the predefined 'newLine' variable like this: - @code - myOutputStream << "Hello World" << newLine << newLine; - @endcode -*/ -extern NewLine newLine; - -//============================================================================== -/** Writes a new-line sequence to a string. - You can use the predefined object 'newLine' to invoke this, e.g. - @code - myString << "Hello World" << newLine << newLine; - @endcode -*/ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const NewLine&); - -#if JUCE_STRING_UTF_TYPE != 8 && ! defined (DOXYGEN) - inline String operator+ (String s1, const NewLine&) { return s1 += NewLine::getDefault(); } -#endif - -#endif // JUCE_NEWLINE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_String.cpp b/JuceLibraryCode/modules/juce_core/text/juce_String.cpp deleted file mode 100755 index 3dbc0c0..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_String.cpp +++ /dev/null @@ -1,2547 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4514 4996) -#endif - -NewLine newLine; - -#if defined (JUCE_STRINGS_ARE_UNICODE) && ! JUCE_STRINGS_ARE_UNICODE - #error "JUCE_STRINGS_ARE_UNICODE is deprecated! All strings are now unicode by default." -#endif - -#if JUCE_NATIVE_WCHAR_IS_UTF8 - typedef CharPointer_UTF8 CharPointer_wchar_t; -#elif JUCE_NATIVE_WCHAR_IS_UTF16 - typedef CharPointer_UTF16 CharPointer_wchar_t; -#else - typedef CharPointer_UTF32 CharPointer_wchar_t; -#endif - -static inline CharPointer_wchar_t castToCharPointer_wchar_t (const void* t) noexcept -{ - return CharPointer_wchar_t (static_cast (t)); -} - -//============================================================================== -// (Mirrors the structure of StringHolder, but without the atomic member, so can be statically constructed) -struct EmptyString -{ - int refCount; - size_t allocatedBytes; - String::CharPointerType::CharType text; -}; - -static const EmptyString emptyString = { 0x3fffffff, sizeof (String::CharPointerType::CharType), 0 }; - -//============================================================================== -class StringHolder -{ -public: - StringHolder() JUCE_DELETED_FUNCTION; - - typedef String::CharPointerType CharPointerType; - typedef String::CharPointerType::CharType CharType; - - //============================================================================== - static CharPointerType createUninitialisedBytes (size_t numBytes) - { - numBytes = (numBytes + 3) & ~(size_t) 3; - StringHolder* const s = reinterpret_cast (new char [sizeof (StringHolder) - sizeof (CharType) + numBytes]); - s->refCount.value = 0; - s->allocatedNumBytes = numBytes; - return CharPointerType (s->text); - } - - template - static CharPointerType createFromCharPointer (const CharPointer text) - { - if (text.getAddress() == nullptr || text.isEmpty()) - return CharPointerType (&(emptyString.text)); - - CharPointer t (text); - size_t bytesNeeded = sizeof (CharType); - - while (! t.isEmpty()) - bytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance()); - - const CharPointerType dest (createUninitialisedBytes (bytesNeeded)); - CharPointerType (dest).writeAll (text); - return dest; - } - - template - static CharPointerType createFromCharPointer (const CharPointer text, size_t maxChars) - { - if (text.getAddress() == nullptr || text.isEmpty() || maxChars == 0) - return CharPointerType (&(emptyString.text)); - - CharPointer end (text); - size_t numChars = 0; - size_t bytesNeeded = sizeof (CharType); - - while (numChars < maxChars && ! end.isEmpty()) - { - bytesNeeded += CharPointerType::getBytesRequiredFor (end.getAndAdvance()); - ++numChars; - } - - const CharPointerType dest (createUninitialisedBytes (bytesNeeded)); - CharPointerType (dest).writeWithCharLimit (text, (int) numChars + 1); - return dest; - } - - template - static CharPointerType createFromCharPointer (const CharPointer start, const CharPointer end) - { - if (start.getAddress() == nullptr || start.isEmpty()) - return CharPointerType (&(emptyString.text)); - - CharPointer e (start); - int numChars = 0; - size_t bytesNeeded = sizeof (CharType); - - while (e < end && ! e.isEmpty()) - { - bytesNeeded += CharPointerType::getBytesRequiredFor (e.getAndAdvance()); - ++numChars; - } - - const CharPointerType dest (createUninitialisedBytes (bytesNeeded)); - CharPointerType (dest).writeWithCharLimit (start, numChars + 1); - return dest; - } - - static CharPointerType createFromCharPointer (const CharPointerType start, const CharPointerType end) - { - if (start.getAddress() == nullptr || start.isEmpty()) - return CharPointerType (&(emptyString.text)); - - const size_t numBytes = (size_t) (reinterpret_cast (end.getAddress()) - - reinterpret_cast (start.getAddress())); - const CharPointerType dest (createUninitialisedBytes (numBytes + sizeof (CharType))); - memcpy (dest.getAddress(), start, numBytes); - dest.getAddress()[numBytes / sizeof (CharType)] = 0; - return dest; - } - - static CharPointerType createFromFixedLength (const char* const src, const size_t numChars) - { - const CharPointerType dest (createUninitialisedBytes (numChars * sizeof (CharType) + sizeof (CharType))); - CharPointerType (dest).writeWithCharLimit (CharPointer_UTF8 (src), (int) (numChars + 1)); - return dest; - } - - //============================================================================== - static void retain (const CharPointerType text) noexcept - { - StringHolder* const b = bufferFromText (text); - - if (b != (StringHolder*) &emptyString) - ++(b->refCount); - } - - static inline void release (StringHolder* const b) noexcept - { - if (b != (StringHolder*) &emptyString) - if (--(b->refCount) == -1) - delete[] reinterpret_cast (b); - } - - static void release (const CharPointerType text) noexcept - { - release (bufferFromText (text)); - } - - static inline int getReferenceCount (const CharPointerType text) noexcept - { - return bufferFromText (text)->refCount.get() + 1; - } - - //============================================================================== - static CharPointerType makeUniqueWithByteSize (const CharPointerType text, size_t numBytes) - { - StringHolder* const b = bufferFromText (text); - - if (b == (StringHolder*) &emptyString) - { - CharPointerType newText (createUninitialisedBytes (numBytes)); - newText.writeNull(); - return newText; - } - - if (b->allocatedNumBytes >= numBytes && b->refCount.get() <= 0) - return text; - - CharPointerType newText (createUninitialisedBytes (jmax (b->allocatedNumBytes, numBytes))); - memcpy (newText.getAddress(), text.getAddress(), b->allocatedNumBytes); - release (b); - - return newText; - } - - static size_t getAllocatedNumBytes (const CharPointerType text) noexcept - { - return bufferFromText (text)->allocatedNumBytes; - } - - //============================================================================== - Atomic refCount; - size_t allocatedNumBytes; - CharType text[1]; - -private: - static inline StringHolder* bufferFromText (const CharPointerType text) noexcept - { - // (Can't use offsetof() here because of warnings about this not being a POD) - return reinterpret_cast (reinterpret_cast (text.getAddress()) - - (reinterpret_cast (reinterpret_cast (1)->text) - 1)); - } - - void compileTimeChecks() - { - // Let me know if any of these assertions fail on your system! - #if JUCE_NATIVE_WCHAR_IS_UTF8 - static_jassert (sizeof (wchar_t) == 1); - #elif JUCE_NATIVE_WCHAR_IS_UTF16 - static_jassert (sizeof (wchar_t) == 2); - #elif JUCE_NATIVE_WCHAR_IS_UTF32 - static_jassert (sizeof (wchar_t) == 4); - #else - #error "native wchar_t size is unknown" - #endif - - static_jassert (sizeof (EmptyString) == sizeof (StringHolder)); - } -}; - -const String String::empty; - -//============================================================================== -String::String() noexcept : text (&(emptyString.text)) -{ -} - -String::~String() noexcept -{ - StringHolder::release (text); -} - -String::String (const String& other) noexcept : text (other.text) -{ - StringHolder::retain (text); -} - -void String::swapWith (String& other) noexcept -{ - std::swap (text, other.text); -} - -void String::clear() noexcept -{ - StringHolder::release (text); - text = &(emptyString.text); -} - -String& String::operator= (const String& other) noexcept -{ - StringHolder::retain (other.text); - StringHolder::release (text.atomicSwap (other.text)); - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -String::String (String&& other) noexcept : text (other.text) -{ - other.text = &(emptyString.text); -} - -String& String::operator= (String&& other) noexcept -{ - std::swap (text, other.text); - return *this; -} -#endif - -inline String::PreallocationBytes::PreallocationBytes (const size_t num) noexcept : numBytes (num) {} - -String::String (const PreallocationBytes& preallocationSize) - : text (StringHolder::createUninitialisedBytes (preallocationSize.numBytes + sizeof (CharPointerType::CharType))) -{ -} - -void String::preallocateBytes (const size_t numBytesNeeded) -{ - text = StringHolder::makeUniqueWithByteSize (text, numBytesNeeded + sizeof (CharPointerType::CharType)); -} - -int String::getReferenceCount() const noexcept -{ - return StringHolder::getReferenceCount (text); -} - -//============================================================================== -String::String (const char* const t) - : text (StringHolder::createFromCharPointer (CharPointer_ASCII (t))) -{ - /* If you get an assertion here, then you're trying to create a string from 8-bit data - that contains values greater than 127. These can NOT be correctly converted to unicode - because there's no way for the String class to know what encoding was used to - create them. The source data could be UTF-8, ASCII or one of many local code-pages. - - To get around this problem, you must be more explicit when you pass an ambiguous 8-bit - string to the String class - so for example if your source data is actually UTF-8, - you'd call String (CharPointer_UTF8 ("my utf8 string..")), and it would be able to - correctly convert the multi-byte characters to unicode. It's *highly* recommended that - you use UTF-8 with escape characters in your source code to represent extended characters, - because there's no other way to represent these strings in a way that isn't dependent on - the compiler, source code editor and platform. - - Note that the Introjucer has a handy string literal generator utility that will convert - any unicode string to a valid C++ string literal, creating ascii escape sequences that will - work in any compiler. - */ - jassert (t == nullptr || CharPointer_ASCII::isValidString (t, std::numeric_limits::max())); -} - -String::String (const char* const t, const size_t maxChars) - : text (StringHolder::createFromCharPointer (CharPointer_ASCII (t), maxChars)) -{ - /* If you get an assertion here, then you're trying to create a string from 8-bit data - that contains values greater than 127. These can NOT be correctly converted to unicode - because there's no way for the String class to know what encoding was used to - create them. The source data could be UTF-8, ASCII or one of many local code-pages. - - To get around this problem, you must be more explicit when you pass an ambiguous 8-bit - string to the String class - so for example if your source data is actually UTF-8, - you'd call String (CharPointer_UTF8 ("my utf8 string..")), and it would be able to - correctly convert the multi-byte characters to unicode. It's *highly* recommended that - you use UTF-8 with escape characters in your source code to represent extended characters, - because there's no other way to represent these strings in a way that isn't dependent on - the compiler, source code editor and platform. - - Note that the Introjucer has a handy string literal generator utility that will convert - any unicode string to a valid C++ string literal, creating ascii escape sequences that will - work in any compiler. - */ - jassert (t == nullptr || CharPointer_ASCII::isValidString (t, (int) maxChars)); -} - -String::String (const wchar_t* const t) : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t))) {} -String::String (const CharPointer_UTF8 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_UTF16 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_UTF32 t) : text (StringHolder::createFromCharPointer (t)) {} -String::String (const CharPointer_ASCII t) : text (StringHolder::createFromCharPointer (t)) {} - -String::String (const CharPointer_UTF8 t, const size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (const CharPointer_UTF16 t, const size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (const CharPointer_UTF32 t, const size_t maxChars) : text (StringHolder::createFromCharPointer (t, maxChars)) {} -String::String (const wchar_t* const t, size_t maxChars) : text (StringHolder::createFromCharPointer (castToCharPointer_wchar_t (t), maxChars)) {} - -String::String (const CharPointer_UTF8 start, const CharPointer_UTF8 end) : text (StringHolder::createFromCharPointer (start, end)) {} -String::String (const CharPointer_UTF16 start, const CharPointer_UTF16 end) : text (StringHolder::createFromCharPointer (start, end)) {} -String::String (const CharPointer_UTF32 start, const CharPointer_UTF32 end) : text (StringHolder::createFromCharPointer (start, end)) {} - -String::String (const std::string& s) : text (StringHolder::createFromFixedLength (s.data(), s.size())) {} - -String String::charToString (const juce_wchar character) -{ - String result (PreallocationBytes (CharPointerType::getBytesRequiredFor (character))); - CharPointerType t (result.text); - t.write (character); - t.writeNull(); - return result; -} - -//============================================================================== -namespace NumberToStringConverters -{ - enum - { - charsNeededForInt = 32, - charsNeededForDouble = 48 - }; - - template - static char* printDigits (char* t, Type v) noexcept - { - *--t = 0; - - do - { - *--t = '0' + (char) (v % 10); - v /= 10; - - } while (v > 0); - - return t; - } - - // pass in a pointer to the END of a buffer.. - static char* numberToString (char* t, const int64 n) noexcept - { - if (n >= 0) - return printDigits (t, static_cast (n)); - - // NB: this needs to be careful not to call -std::numeric_limits::min(), - // which has undefined behaviour - t = printDigits (t, static_cast (-(n + 1)) + 1); - *--t = '-'; - return t; - } - - static char* numberToString (char* t, uint64 v) noexcept - { - return printDigits (t, v); - } - - static char* numberToString (char* t, const int n) noexcept - { - if (n >= 0) - return printDigits (t, static_cast (n)); - - // NB: this needs to be careful not to call -std::numeric_limits::min(), - // which has undefined behaviour - t = printDigits (t, static_cast (-(n + 1)) + 1); - *--t = '-'; - return t; - } - - static char* numberToString (char* t, unsigned int v) noexcept - { - return printDigits (t, v); - } - - struct StackArrayStream : public std::basic_streambuf > - { - explicit StackArrayStream (char* d) - { - static const std::locale classicLocale (std::locale::classic()); - imbue (classicLocale); - setp (d, d + charsNeededForDouble); - } - - size_t writeDouble (double n, int numDecPlaces) - { - { - std::ostream o (this); - - if (numDecPlaces > 0) - o.precision ((std::streamsize) numDecPlaces); - - o << n; - } - - return (size_t) (pptr() - pbase()); - } - }; - - static char* doubleToString (char* buffer, const int numChars, double n, int numDecPlaces, size_t& len) noexcept - { - if (numDecPlaces > 0 && numDecPlaces < 7 && n > -1.0e20 && n < 1.0e20) - { - char* const end = buffer + numChars; - char* t = end; - int64 v = (int64) (pow (10.0, numDecPlaces) * std::abs (n) + 0.5); - *--t = (char) 0; - - while (numDecPlaces >= 0 || v > 0) - { - if (numDecPlaces == 0) - *--t = '.'; - - *--t = (char) ('0' + (v % 10)); - - v /= 10; - --numDecPlaces; - } - - if (n < 0) - *--t = '-'; - - len = (size_t) (end - t - 1); - return t; - } - - StackArrayStream strm (buffer); - len = strm.writeDouble (n, numDecPlaces); - jassert (len <= charsNeededForDouble); - return buffer; - } - - template - static String::CharPointerType createFromInteger (const IntegerType number) - { - char buffer [charsNeededForInt]; - char* const end = buffer + numElementsInArray (buffer); - char* const start = numberToString (end, number); - return StringHolder::createFromFixedLength (start, (size_t) (end - start - 1)); - } - - static String::CharPointerType createFromDouble (const double number, const int numberOfDecimalPlaces) - { - char buffer [charsNeededForDouble]; - size_t len; - char* const start = doubleToString (buffer, numElementsInArray (buffer), (double) number, numberOfDecimalPlaces, len); - return StringHolder::createFromFixedLength (start, len); - } -} - -//============================================================================== -String::String (const int number) : text (NumberToStringConverters::createFromInteger (number)) {} -String::String (const unsigned int number) : text (NumberToStringConverters::createFromInteger (number)) {} -String::String (const short number) : text (NumberToStringConverters::createFromInteger ((int) number)) {} -String::String (const unsigned short number) : text (NumberToStringConverters::createFromInteger ((unsigned int) number)) {} -String::String (const int64 number) : text (NumberToStringConverters::createFromInteger (number)) {} -String::String (const uint64 number) : text (NumberToStringConverters::createFromInteger (number)) {} - -String::String (const float number) : text (NumberToStringConverters::createFromDouble ((double) number, 0)) {} -String::String (const double number) : text (NumberToStringConverters::createFromDouble (number, 0)) {} -String::String (const float number, const int numberOfDecimalPlaces) : text (NumberToStringConverters::createFromDouble ((double) number, numberOfDecimalPlaces)) {} -String::String (const double number, const int numberOfDecimalPlaces) : text (NumberToStringConverters::createFromDouble (number, numberOfDecimalPlaces)) {} - -//============================================================================== -int String::length() const noexcept -{ - return (int) text.length(); -} - -static size_t findByteOffsetOfEnd (String::CharPointerType text) noexcept -{ - return (size_t) (((char*) text.findTerminatingNull().getAddress()) - (char*) text.getAddress()); -} - -size_t String::getByteOffsetOfEnd() const noexcept -{ - return findByteOffsetOfEnd (text); -} - -juce_wchar String::operator[] (int index) const noexcept -{ - jassert (index == 0 || (index > 0 && index <= (int) text.lengthUpTo ((size_t) index + 1))); - return text [index]; -} - -template -struct HashGenerator -{ - template - static Type calculate (CharPointer t) noexcept - { - Type result = Type(); - - while (! t.isEmpty()) - result = ((Type) multiplier) * result + (Type) t.getAndAdvance(); - - return result; - } - - enum { multiplier = sizeof (Type) > 4 ? 101 : 31 }; -}; - -int String::hashCode() const noexcept { return HashGenerator ::calculate (text); } -int64 String::hashCode64() const noexcept { return HashGenerator ::calculate (text); } -size_t String::hash() const noexcept { return HashGenerator ::calculate (text); } - -//============================================================================== -JUCE_API bool JUCE_CALLTYPE operator== (const String& s1, const String& s2) noexcept { return s1.compare (s2) == 0; } -JUCE_API bool JUCE_CALLTYPE operator!= (const String& s1, const String& s2) noexcept { return s1.compare (s2) != 0; } -JUCE_API bool JUCE_CALLTYPE operator== (const String& s1, const char* s2) noexcept { return s1.compare (s2) == 0; } -JUCE_API bool JUCE_CALLTYPE operator!= (const String& s1, const char* s2) noexcept { return s1.compare (s2) != 0; } -JUCE_API bool JUCE_CALLTYPE operator== (const String& s1, const wchar_t* s2) noexcept { return s1.compare (s2) == 0; } -JUCE_API bool JUCE_CALLTYPE operator!= (const String& s1, const wchar_t* s2) noexcept { return s1.compare (s2) != 0; } -JUCE_API bool JUCE_CALLTYPE operator== (const String& s1, StringRef s2) noexcept { return s1.getCharPointer().compare (s2.text) == 0; } -JUCE_API bool JUCE_CALLTYPE operator!= (const String& s1, StringRef s2) noexcept { return s1.getCharPointer().compare (s2.text) != 0; } -JUCE_API bool JUCE_CALLTYPE operator== (const String& s1, const CharPointer_UTF8 s2) noexcept { return s1.getCharPointer().compare (s2) == 0; } -JUCE_API bool JUCE_CALLTYPE operator!= (const String& s1, const CharPointer_UTF8 s2) noexcept { return s1.getCharPointer().compare (s2) != 0; } -JUCE_API bool JUCE_CALLTYPE operator== (const String& s1, const CharPointer_UTF16 s2) noexcept { return s1.getCharPointer().compare (s2) == 0; } -JUCE_API bool JUCE_CALLTYPE operator!= (const String& s1, const CharPointer_UTF16 s2) noexcept { return s1.getCharPointer().compare (s2) != 0; } -JUCE_API bool JUCE_CALLTYPE operator== (const String& s1, const CharPointer_UTF32 s2) noexcept { return s1.getCharPointer().compare (s2) == 0; } -JUCE_API bool JUCE_CALLTYPE operator!= (const String& s1, const CharPointer_UTF32 s2) noexcept { return s1.getCharPointer().compare (s2) != 0; } -JUCE_API bool JUCE_CALLTYPE operator> (const String& s1, const String& s2) noexcept { return s1.compare (s2) > 0; } -JUCE_API bool JUCE_CALLTYPE operator< (const String& s1, const String& s2) noexcept { return s1.compare (s2) < 0; } -JUCE_API bool JUCE_CALLTYPE operator>= (const String& s1, const String& s2) noexcept { return s1.compare (s2) >= 0; } -JUCE_API bool JUCE_CALLTYPE operator<= (const String& s1, const String& s2) noexcept { return s1.compare (s2) <= 0; } - -bool String::equalsIgnoreCase (const wchar_t* const t) const noexcept -{ - return t != nullptr ? text.compareIgnoreCase (castToCharPointer_wchar_t (t)) == 0 - : isEmpty(); -} - -bool String::equalsIgnoreCase (const char* const t) const noexcept -{ - return t != nullptr ? text.compareIgnoreCase (CharPointer_UTF8 (t)) == 0 - : isEmpty(); -} - -bool String::equalsIgnoreCase (StringRef t) const noexcept -{ - return text.compareIgnoreCase (t.text) == 0; -} - -bool String::equalsIgnoreCase (const String& other) const noexcept -{ - return text == other.text - || text.compareIgnoreCase (other.text) == 0; -} - -int String::compare (const String& other) const noexcept { return (text == other.text) ? 0 : text.compare (other.text); } -int String::compare (const char* const other) const noexcept { return text.compare (CharPointer_UTF8 (other)); } -int String::compare (const wchar_t* const other) const noexcept { return text.compare (castToCharPointer_wchar_t (other)); } -int String::compareIgnoreCase (const String& other) const noexcept { return (text == other.text) ? 0 : text.compareIgnoreCase (other.text); } - -static int stringCompareRight (String::CharPointerType s1, String::CharPointerType s2) noexcept -{ - for (int bias = 0;;) - { - const juce_wchar c1 = s1.getAndAdvance(); - const bool isDigit1 = CharacterFunctions::isDigit (c1); - - const juce_wchar c2 = s2.getAndAdvance(); - const bool isDigit2 = CharacterFunctions::isDigit (c2); - - if (! (isDigit1 || isDigit2)) return bias; - if (! isDigit1) return -1; - if (! isDigit2) return 1; - - if (c1 != c2 && bias == 0) - bias = c1 < c2 ? -1 : 1; - - jassert (c1 != 0 && c2 != 0); - } -} - -static int stringCompareLeft (String::CharPointerType s1, String::CharPointerType s2) noexcept -{ - for (;;) - { - const juce_wchar c1 = s1.getAndAdvance(); - const bool isDigit1 = CharacterFunctions::isDigit (c1); - - const juce_wchar c2 = s2.getAndAdvance(); - const bool isDigit2 = CharacterFunctions::isDigit (c2); - - if (! (isDigit1 || isDigit2)) return 0; - if (! isDigit1) return -1; - if (! isDigit2) return 1; - if (c1 < c2) return -1; - if (c1 > c2) return 1; - } -} - -static int naturalStringCompare (String::CharPointerType s1, String::CharPointerType s2) noexcept -{ - bool firstLoop = true; - - for (;;) - { - const bool hasSpace1 = s1.isWhitespace(); - const bool hasSpace2 = s2.isWhitespace(); - - if ((! firstLoop) && (hasSpace1 ^ hasSpace2)) - return hasSpace2 ? 1 : -1; - - firstLoop = false; - - if (hasSpace1) s1 = s1.findEndOfWhitespace(); - if (hasSpace2) s2 = s2.findEndOfWhitespace(); - - if (s1.isDigit() && s2.isDigit()) - { - const int result = (*s1 == '0' || *s2 == '0') ? stringCompareLeft (s1, s2) - : stringCompareRight (s1, s2); - - if (result != 0) - return result; - } - - juce_wchar c1 = s1.getAndAdvance(); - juce_wchar c2 = s2.getAndAdvance(); - - if (c1 != c2) - { - c1 = CharacterFunctions::toUpperCase (c1); - c2 = CharacterFunctions::toUpperCase (c2); - } - - if (c1 == c2) - { - if (c1 == 0) - return 0; - } - else - { - const bool isAlphaNum1 = CharacterFunctions::isLetterOrDigit (c1); - const bool isAlphaNum2 = CharacterFunctions::isLetterOrDigit (c2); - - if (isAlphaNum2 && ! isAlphaNum1) return -1; - if (isAlphaNum1 && ! isAlphaNum2) return 1; - - return c1 < c2 ? -1 : 1; - } - - jassert (c1 != 0 && c2 != 0); - } -} - -int String::compareNatural (StringRef other) const noexcept -{ - return naturalStringCompare (getCharPointer(), other.text); -} - -//============================================================================== -void String::append (const String& textToAppend, size_t maxCharsToTake) -{ - appendCharPointer (this == &textToAppend ? String (textToAppend).text - : textToAppend.text, maxCharsToTake); -} - -void String::appendCharPointer (const CharPointerType textToAppend) -{ - appendCharPointer (textToAppend, textToAppend.findTerminatingNull()); -} - -void String::appendCharPointer (const CharPointerType startOfTextToAppend, - const CharPointerType endOfTextToAppend) -{ - jassert (startOfTextToAppend.getAddress() != nullptr && endOfTextToAppend.getAddress() != nullptr); - - const int extraBytesNeeded = getAddressDifference (endOfTextToAppend.getAddress(), - startOfTextToAppend.getAddress()); - jassert (extraBytesNeeded >= 0); - - if (extraBytesNeeded > 0) - { - const size_t byteOffsetOfNull = getByteOffsetOfEnd(); - preallocateBytes (byteOffsetOfNull + (size_t) extraBytesNeeded); - - CharPointerType::CharType* const newStringStart = addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull); - memcpy (newStringStart, startOfTextToAppend.getAddress(), (size_t) extraBytesNeeded); - CharPointerType (addBytesToPointer (newStringStart, extraBytesNeeded)).writeNull(); - } -} - -String& String::operator+= (const wchar_t* const t) -{ - appendCharPointer (castToCharPointer_wchar_t (t)); - return *this; -} - -String& String::operator+= (const char* const t) -{ - appendCharPointer (CharPointer_UTF8 (t)); // (using UTF8 here triggers a faster code-path than ascii) - return *this; -} - -String& String::operator+= (const String& other) -{ - if (isEmpty()) - return operator= (other); - - if (this == &other) - return operator+= (String (*this)); - - appendCharPointer (other.text); - return *this; -} - -String& String::operator+= (const char ch) -{ - const char asString[] = { ch, 0 }; - return operator+= (asString); -} - -String& String::operator+= (const wchar_t ch) -{ - const wchar_t asString[] = { ch, 0 }; - return operator+= (asString); -} - -#if ! JUCE_NATIVE_WCHAR_IS_UTF32 -String& String::operator+= (const juce_wchar ch) -{ - const juce_wchar asString[] = { ch, 0 }; - appendCharPointer (CharPointer_UTF32 (asString)); - return *this; -} -#endif - -String& String::operator+= (const int number) -{ - char buffer [16]; - char* end = buffer + numElementsInArray (buffer); - char* start = NumberToStringConverters::numberToString (end, number); - - #if (JUCE_STRING_UTF_TYPE == 8) - appendCharPointer (CharPointerType (start), CharPointerType (end)); - #else - appendCharPointer (CharPointer_ASCII (start), CharPointer_ASCII (end)); - #endif - return *this; -} - -String& String::operator+= (int64 number) -{ - char buffer [32]; - char* end = buffer + numElementsInArray (buffer); - char* start = NumberToStringConverters::numberToString (end, number); - - #if (JUCE_STRING_UTF_TYPE == 8) - appendCharPointer (CharPointerType (start), CharPointerType (end)); - #else - appendCharPointer (CharPointer_ASCII (start), CharPointer_ASCII (end)); - #endif - return *this; -} - -//============================================================================== -JUCE_API String JUCE_CALLTYPE operator+ (const char* const s1, const String& s2) { String s (s1); return s += s2; } -JUCE_API String JUCE_CALLTYPE operator+ (const wchar_t* const s1, const String& s2) { String s (s1); return s += s2; } - -JUCE_API String JUCE_CALLTYPE operator+ (const char s1, const String& s2) { return String::charToString ((juce_wchar) (uint8) s1) + s2; } -JUCE_API String JUCE_CALLTYPE operator+ (const wchar_t s1, const String& s2) { return String::charToString (s1) + s2; } - -JUCE_API String JUCE_CALLTYPE operator+ (String s1, const String& s2) { return s1 += s2; } -JUCE_API String JUCE_CALLTYPE operator+ (String s1, const char* const s2) { return s1 += s2; } -JUCE_API String JUCE_CALLTYPE operator+ (String s1, const wchar_t* s2) { return s1 += s2; } - -JUCE_API String JUCE_CALLTYPE operator+ (String s1, const char s2) { return s1 += s2; } -JUCE_API String JUCE_CALLTYPE operator+ (String s1, const wchar_t s2) { return s1 += s2; } - -#if ! JUCE_NATIVE_WCHAR_IS_UTF32 -JUCE_API String JUCE_CALLTYPE operator+ (const juce_wchar s1, const String& s2) { return String::charToString (s1) + s2; } -JUCE_API String JUCE_CALLTYPE operator+ (String s1, const juce_wchar s2) { return s1 += s2; } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const juce_wchar s2) { return s1 += s2; } -#endif - -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const char s2) { return s1 += s2; } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const wchar_t s2) { return s1 += s2; } - -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const char* const s2) { return s1 += s2; } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const wchar_t* const s2) { return s1 += s2; } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const String& s2) { return s1 += s2; } - -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const int number) { return s1 += number; } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const short number) { return s1 += (int) number; } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const long number) { return s1 += (int) number; } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const int64 number) { return s1 += String (number); } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const float number) { return s1 += String (number); } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const double number) { return s1 += String (number); } -JUCE_API String& JUCE_CALLTYPE operator<< (String& s1, const uint64 number) { return s1 += String (number); } - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const String& text) -{ - return operator<< (stream, StringRef (text)); -} - -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, StringRef text) -{ - const size_t numBytes = CharPointer_UTF8::getBytesRequiredFor (text.text); - - #if (JUCE_STRING_UTF_TYPE == 8) - stream.write (text.text.getAddress(), numBytes); - #else - // (This avoids using toUTF8() to prevent the memory bloat that it would leave behind - // if lots of large, persistent strings were to be written to streams). - HeapBlock temp (numBytes + 1); - CharPointer_UTF8 (temp).writeAll (text.text); - stream.write (temp, numBytes); - #endif - - return stream; -} - -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const NewLine&) -{ - return string1 += NewLine::getDefault(); -} - -//============================================================================== -int String::indexOfChar (const juce_wchar character) const noexcept -{ - return text.indexOf (character); -} - -int String::indexOfChar (const int startIndex, const juce_wchar character) const noexcept -{ - CharPointerType t (text); - - for (int i = 0; ! t.isEmpty(); ++i) - { - if (i >= startIndex) - { - if (t.getAndAdvance() == character) - return i; - } - else - { - ++t; - } - } - - return -1; -} - -int String::lastIndexOfChar (const juce_wchar character) const noexcept -{ - CharPointerType t (text); - int last = -1; - - for (int i = 0; ! t.isEmpty(); ++i) - if (t.getAndAdvance() == character) - last = i; - - return last; -} - -int String::indexOfAnyOf (StringRef charactersToLookFor, const int startIndex, const bool ignoreCase) const noexcept -{ - CharPointerType t (text); - - for (int i = 0; ! t.isEmpty(); ++i) - { - if (i >= startIndex) - { - if (charactersToLookFor.text.indexOf (t.getAndAdvance(), ignoreCase) >= 0) - return i; - } - else - { - ++t; - } - } - - return -1; -} - -int String::indexOf (StringRef other) const noexcept -{ - return other.isEmpty() ? 0 : text.indexOf (other.text); -} - -int String::indexOfIgnoreCase (StringRef other) const noexcept -{ - return other.isEmpty() ? 0 : CharacterFunctions::indexOfIgnoreCase (text, other.text); -} - -int String::indexOf (const int startIndex, StringRef other) const noexcept -{ - if (other.isEmpty()) - return -1; - - CharPointerType t (text); - - for (int i = startIndex; --i >= 0;) - { - if (t.isEmpty()) - return -1; - - ++t; - } - - int found = t.indexOf (other.text); - if (found >= 0) - found += startIndex; - return found; -} - -int String::indexOfIgnoreCase (const int startIndex, StringRef other) const noexcept -{ - if (other.isEmpty()) - return -1; - - CharPointerType t (text); - - for (int i = startIndex; --i >= 0;) - { - if (t.isEmpty()) - return -1; - - ++t; - } - - int found = CharacterFunctions::indexOfIgnoreCase (t, other.text); - if (found >= 0) - found += startIndex; - return found; -} - -int String::lastIndexOf (StringRef other) const noexcept -{ - if (other.isNotEmpty()) - { - const int len = other.length(); - int i = length() - len; - - if (i >= 0) - { - for (CharPointerType n (text + i); i >= 0; --i) - { - if (n.compareUpTo (other.text, len) == 0) - return i; - - --n; - } - } - } - - return -1; -} - -int String::lastIndexOfIgnoreCase (StringRef other) const noexcept -{ - if (other.isNotEmpty()) - { - const int len = other.length(); - int i = length() - len; - - if (i >= 0) - { - for (CharPointerType n (text + i); i >= 0; --i) - { - if (n.compareIgnoreCaseUpTo (other.text, len) == 0) - return i; - - --n; - } - } - } - - return -1; -} - -int String::lastIndexOfAnyOf (StringRef charactersToLookFor, const bool ignoreCase) const noexcept -{ - CharPointerType t (text); - int last = -1; - - for (int i = 0; ! t.isEmpty(); ++i) - if (charactersToLookFor.text.indexOf (t.getAndAdvance(), ignoreCase) >= 0) - last = i; - - return last; -} - -bool String::contains (StringRef other) const noexcept -{ - return indexOf (other) >= 0; -} - -bool String::containsChar (const juce_wchar character) const noexcept -{ - return text.indexOf (character) >= 0; -} - -bool String::containsIgnoreCase (StringRef t) const noexcept -{ - return indexOfIgnoreCase (t) >= 0; -} - -int String::indexOfWholeWord (StringRef word) const noexcept -{ - if (word.isNotEmpty()) - { - CharPointerType t (text); - const int wordLen = word.length(); - const int end = (int) t.length() - wordLen; - - for (int i = 0; i <= end; ++i) - { - if (t.compareUpTo (word.text, wordLen) == 0 - && (i == 0 || ! (t - 1).isLetterOrDigit()) - && ! (t + wordLen).isLetterOrDigit()) - return i; - - ++t; - } - } - - return -1; -} - -int String::indexOfWholeWordIgnoreCase (StringRef word) const noexcept -{ - if (word.isNotEmpty()) - { - CharPointerType t (text); - const int wordLen = word.length(); - const int end = (int) t.length() - wordLen; - - for (int i = 0; i <= end; ++i) - { - if (t.compareIgnoreCaseUpTo (word.text, wordLen) == 0 - && (i == 0 || ! (t - 1).isLetterOrDigit()) - && ! (t + wordLen).isLetterOrDigit()) - return i; - - ++t; - } - } - - return -1; -} - -bool String::containsWholeWord (StringRef wordToLookFor) const noexcept -{ - return indexOfWholeWord (wordToLookFor) >= 0; -} - -bool String::containsWholeWordIgnoreCase (StringRef wordToLookFor) const noexcept -{ - return indexOfWholeWordIgnoreCase (wordToLookFor) >= 0; -} - -//============================================================================== -template -struct WildCardMatcher -{ - static bool matches (CharPointer wildcard, CharPointer test, const bool ignoreCase) noexcept - { - for (;;) - { - const juce_wchar wc = wildcard.getAndAdvance(); - - if (wc == '*') - return wildcard.isEmpty() || matchesAnywhere (wildcard, test, ignoreCase); - - if (! characterMatches (wc, test.getAndAdvance(), ignoreCase)) - return false; - - if (wc == 0) - return true; - } - } - - static bool characterMatches (const juce_wchar wc, const juce_wchar tc, const bool ignoreCase) noexcept - { - return (wc == tc) || (wc == '?' && tc != 0) - || (ignoreCase && CharacterFunctions::toLowerCase (wc) == CharacterFunctions::toLowerCase (tc)); - } - - static bool matchesAnywhere (const CharPointer wildcard, CharPointer test, const bool ignoreCase) noexcept - { - for (; ! test.isEmpty(); ++test) - if (matches (wildcard, test, ignoreCase)) - return true; - - return false; - } -}; - -bool String::matchesWildcard (StringRef wildcard, const bool ignoreCase) const noexcept -{ - return WildCardMatcher::matches (wildcard.text, text, ignoreCase); -} - -//============================================================================== -String String::repeatedString (StringRef stringToRepeat, int numberOfTimesToRepeat) -{ - if (numberOfTimesToRepeat <= 0) - return String(); - - String result (PreallocationBytes (findByteOffsetOfEnd (stringToRepeat) * (size_t) numberOfTimesToRepeat)); - CharPointerType n (result.text); - - while (--numberOfTimesToRepeat >= 0) - n.writeAll (stringToRepeat.text); - - return result; -} - -String String::paddedLeft (const juce_wchar padCharacter, int minimumLength) const -{ - jassert (padCharacter != 0); - - int extraChars = minimumLength; - CharPointerType end (text); - - while (! end.isEmpty()) - { - --extraChars; - ++end; - } - - if (extraChars <= 0 || padCharacter == 0) - return *this; - - const size_t currentByteSize = (size_t) (((char*) end.getAddress()) - (char*) text.getAddress()); - String result (PreallocationBytes (currentByteSize + (size_t) extraChars * CharPointerType::getBytesRequiredFor (padCharacter))); - CharPointerType n (result.text); - - while (--extraChars >= 0) - n.write (padCharacter); - - n.writeAll (text); - return result; -} - -String String::paddedRight (const juce_wchar padCharacter, int minimumLength) const -{ - jassert (padCharacter != 0); - - int extraChars = minimumLength; - CharPointerType end (text); - - while (! end.isEmpty()) - { - --extraChars; - ++end; - } - - if (extraChars <= 0 || padCharacter == 0) - return *this; - - const size_t currentByteSize = (size_t) (((char*) end.getAddress()) - (char*) text.getAddress()); - String result (PreallocationBytes (currentByteSize + (size_t) extraChars * CharPointerType::getBytesRequiredFor (padCharacter))); - CharPointerType n (result.text); - - n.writeAll (text); - - while (--extraChars >= 0) - n.write (padCharacter); - - n.writeNull(); - return result; -} - -//============================================================================== -String String::replaceSection (int index, int numCharsToReplace, StringRef stringToInsert) const -{ - if (index < 0) - { - // a negative index to replace from? - jassertfalse; - index = 0; - } - - if (numCharsToReplace < 0) - { - // replacing a negative number of characters? - numCharsToReplace = 0; - jassertfalse; - } - - CharPointerType insertPoint (text); - - for (int i = 0; i < index; ++i) - { - if (insertPoint.isEmpty()) - { - // replacing beyond the end of the string? - jassertfalse; - return *this + stringToInsert; - } - - ++insertPoint; - } - - CharPointerType startOfRemainder (insertPoint); - - for (int i = 0; i < numCharsToReplace && ! startOfRemainder.isEmpty(); ++i) - ++startOfRemainder; - - if (insertPoint == text && startOfRemainder.isEmpty()) - return stringToInsert.text; - - const size_t initialBytes = (size_t) (((char*) insertPoint.getAddress()) - (char*) text.getAddress()); - const size_t newStringBytes = findByteOffsetOfEnd (stringToInsert); - const size_t remainderBytes = (size_t) (((char*) startOfRemainder.findTerminatingNull().getAddress()) - (char*) startOfRemainder.getAddress()); - - const size_t newTotalBytes = initialBytes + newStringBytes + remainderBytes; - if (newTotalBytes <= 0) - return String(); - - String result (PreallocationBytes ((size_t) newTotalBytes)); - - char* dest = (char*) result.text.getAddress(); - memcpy (dest, text.getAddress(), initialBytes); - dest += initialBytes; - memcpy (dest, stringToInsert.text.getAddress(), newStringBytes); - dest += newStringBytes; - memcpy (dest, startOfRemainder.getAddress(), remainderBytes); - dest += remainderBytes; - CharPointerType ((CharPointerType::CharType*) dest).writeNull(); - - return result; -} - -String String::replace (StringRef stringToReplace, StringRef stringToInsert, const bool ignoreCase) const -{ - const int stringToReplaceLen = stringToReplace.length(); - const int stringToInsertLen = stringToInsert.length(); - - int i = 0; - String result (*this); - - while ((i = (ignoreCase ? result.indexOfIgnoreCase (i, stringToReplace) - : result.indexOf (i, stringToReplace))) >= 0) - { - result = result.replaceSection (i, stringToReplaceLen, stringToInsert); - i += stringToInsertLen; - } - - return result; -} - -class StringCreationHelper -{ -public: - StringCreationHelper (const size_t initialBytes) - : source (nullptr), dest (nullptr), allocatedBytes (initialBytes), bytesWritten (0) - { - result.preallocateBytes (allocatedBytes); - dest = result.getCharPointer(); - } - - StringCreationHelper (const String::CharPointerType s) - : source (s), dest (nullptr), allocatedBytes (StringHolder::getAllocatedNumBytes (s)), bytesWritten (0) - { - result.preallocateBytes (allocatedBytes); - dest = result.getCharPointer(); - } - - void write (juce_wchar c) - { - bytesWritten += String::CharPointerType::getBytesRequiredFor (c); - - if (bytesWritten > allocatedBytes) - { - allocatedBytes += jmax ((size_t) 8, allocatedBytes / 16); - const size_t destOffset = (size_t) (((char*) dest.getAddress()) - (char*) result.getCharPointer().getAddress()); - result.preallocateBytes (allocatedBytes); - dest = addBytesToPointer (result.getCharPointer().getAddress(), (int) destOffset); - } - - dest.write (c); - } - - String result; - String::CharPointerType source; - -private: - String::CharPointerType dest; - size_t allocatedBytes, bytesWritten; -}; - -String String::replaceCharacter (const juce_wchar charToReplace, const juce_wchar charToInsert) const -{ - if (! containsChar (charToReplace)) - return *this; - - StringCreationHelper builder (text); - - for (;;) - { - juce_wchar c = builder.source.getAndAdvance(); - - if (c == charToReplace) - c = charToInsert; - - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -String String::replaceCharacters (StringRef charactersToReplace, StringRef charactersToInsertInstead) const -{ - StringCreationHelper builder (text); - - for (;;) - { - juce_wchar c = builder.source.getAndAdvance(); - - const int index = charactersToReplace.text.indexOf (c); - if (index >= 0) - c = charactersToInsertInstead [index]; - - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -//============================================================================== -bool String::startsWith (StringRef other) const noexcept -{ - return text.compareUpTo (other.text, other.length()) == 0; -} - -bool String::startsWithIgnoreCase (StringRef other) const noexcept -{ - return text.compareIgnoreCaseUpTo (other.text, other.length()) == 0; -} - -bool String::startsWithChar (const juce_wchar character) const noexcept -{ - jassert (character != 0); // strings can't contain a null character! - - return *text == character; -} - -bool String::endsWithChar (const juce_wchar character) const noexcept -{ - jassert (character != 0); // strings can't contain a null character! - - if (text.isEmpty()) - return false; - - CharPointerType t (text.findTerminatingNull()); - return *--t == character; -} - -bool String::endsWith (StringRef other) const noexcept -{ - CharPointerType end (text.findTerminatingNull()); - CharPointerType otherEnd (other.text.findTerminatingNull()); - - while (end > text && otherEnd > other.text) - { - --end; - --otherEnd; - - if (*end != *otherEnd) - return false; - } - - return otherEnd == other.text; -} - -bool String::endsWithIgnoreCase (StringRef other) const noexcept -{ - CharPointerType end (text.findTerminatingNull()); - CharPointerType otherEnd (other.text.findTerminatingNull()); - - while (end > text && otherEnd > other.text) - { - --end; - --otherEnd; - - if (end.toLowerCase() != otherEnd.toLowerCase()) - return false; - } - - return otherEnd == other.text; -} - -//============================================================================== -String String::toUpperCase() const -{ - StringCreationHelper builder (text); - - for (;;) - { - const juce_wchar c = builder.source.toUpperCase(); - builder.write (c); - - if (c == 0) - break; - - ++(builder.source); - } - - return builder.result; -} - -String String::toLowerCase() const -{ - StringCreationHelper builder (text); - - for (;;) - { - const juce_wchar c = builder.source.toLowerCase(); - builder.write (c); - - if (c == 0) - break; - - ++(builder.source); - } - - return builder.result; -} - -//============================================================================== -juce_wchar String::getLastCharacter() const noexcept -{ - return isEmpty() ? juce_wchar() : text [length() - 1]; -} - -String String::substring (int start, const int end) const -{ - if (start < 0) - start = 0; - - if (end <= start) - return String(); - - int i = 0; - CharPointerType t1 (text); - - while (i < start) - { - if (t1.isEmpty()) - return String(); - - ++i; - ++t1; - } - - CharPointerType t2 (t1); - while (i < end) - { - if (t2.isEmpty()) - { - if (start == 0) - return *this; - - break; - } - - ++i; - ++t2; - } - - return String (t1, t2); -} - -String String::substring (int start) const -{ - if (start <= 0) - return *this; - - CharPointerType t (text); - - while (--start >= 0) - { - if (t.isEmpty()) - return String(); - - ++t; - } - - return String (t); -} - -String String::dropLastCharacters (const int numberToDrop) const -{ - return String (text, (size_t) jmax (0, length() - numberToDrop)); -} - -String String::getLastCharacters (const int numCharacters) const -{ - return String (text + jmax (0, length() - jmax (0, numCharacters))); -} - -String String::fromFirstOccurrenceOf (StringRef sub, - const bool includeSubString, - const bool ignoreCase) const -{ - const int i = ignoreCase ? indexOfIgnoreCase (sub) - : indexOf (sub); - if (i < 0) - return String(); - - return substring (includeSubString ? i : i + sub.length()); -} - -String String::fromLastOccurrenceOf (StringRef sub, - const bool includeSubString, - const bool ignoreCase) const -{ - const int i = ignoreCase ? lastIndexOfIgnoreCase (sub) - : lastIndexOf (sub); - if (i < 0) - return *this; - - return substring (includeSubString ? i : i + sub.length()); -} - -String String::upToFirstOccurrenceOf (StringRef sub, - const bool includeSubString, - const bool ignoreCase) const -{ - const int i = ignoreCase ? indexOfIgnoreCase (sub) - : indexOf (sub); - if (i < 0) - return *this; - - return substring (0, includeSubString ? i + sub.length() : i); -} - -String String::upToLastOccurrenceOf (StringRef sub, - const bool includeSubString, - const bool ignoreCase) const -{ - const int i = ignoreCase ? lastIndexOfIgnoreCase (sub) - : lastIndexOf (sub); - if (i < 0) - return *this; - - return substring (0, includeSubString ? i + sub.length() : i); -} - -bool String::isQuotedString() const -{ - const String trimmed (trimStart()); - - return trimmed[0] == '"' - || trimmed[0] == '\''; -} - -String String::unquoted() const -{ - const int len = length(); - - if (len == 0) - return String(); - - const juce_wchar lastChar = text [len - 1]; - const int dropAtStart = (*text == '"' || *text == '\'') ? 1 : 0; - const int dropAtEnd = (lastChar == '"' || lastChar == '\'') ? 1 : 0; - - return substring (dropAtStart, len - dropAtEnd); -} - -String String::quoted (const juce_wchar quoteCharacter) const -{ - if (isEmpty()) - return charToString (quoteCharacter) + quoteCharacter; - - String t (*this); - - if (! t.startsWithChar (quoteCharacter)) - t = charToString (quoteCharacter) + t; - - if (! t.endsWithChar (quoteCharacter)) - t += quoteCharacter; - - return t; -} - -//============================================================================== -static String::CharPointerType findTrimmedEnd (const String::CharPointerType start, - String::CharPointerType end) -{ - while (end > start) - { - if (! (--end).isWhitespace()) - { - ++end; - break; - } - } - - return end; -} - -String String::trim() const -{ - if (isNotEmpty()) - { - CharPointerType start (text.findEndOfWhitespace()); - - const CharPointerType end (start.findTerminatingNull()); - CharPointerType trimmedEnd (findTrimmedEnd (start, end)); - - if (trimmedEnd <= start) - return String(); - - if (text < start || trimmedEnd < end) - return String (start, trimmedEnd); - } - - return *this; -} - -String String::trimStart() const -{ - if (isNotEmpty()) - { - const CharPointerType t (text.findEndOfWhitespace()); - - if (t != text) - return String (t); - } - - return *this; -} - -String String::trimEnd() const -{ - if (isNotEmpty()) - { - const CharPointerType end (text.findTerminatingNull()); - CharPointerType trimmedEnd (findTrimmedEnd (text, end)); - - if (trimmedEnd < end) - return String (text, trimmedEnd); - } - - return *this; -} - -String String::trimCharactersAtStart (StringRef charactersToTrim) const -{ - CharPointerType t (text); - - while (charactersToTrim.text.indexOf (*t) >= 0) - ++t; - - return t == text ? *this : String (t); -} - -String String::trimCharactersAtEnd (StringRef charactersToTrim) const -{ - if (isNotEmpty()) - { - const CharPointerType end (text.findTerminatingNull()); - CharPointerType trimmedEnd (end); - - while (trimmedEnd > text) - { - if (charactersToTrim.text.indexOf (*--trimmedEnd) < 0) - { - ++trimmedEnd; - break; - } - } - - if (trimmedEnd < end) - return String (text, trimmedEnd); - } - - return *this; -} - -//============================================================================== -String String::retainCharacters (StringRef charactersToRetain) const -{ - if (isEmpty()) - return String(); - - StringCreationHelper builder (text); - - for (;;) - { - juce_wchar c = builder.source.getAndAdvance(); - - if (charactersToRetain.text.indexOf (c) >= 0) - builder.write (c); - - if (c == 0) - break; - } - - builder.write (0); - return builder.result; -} - -String String::removeCharacters (StringRef charactersToRemove) const -{ - if (isEmpty()) - return String(); - - StringCreationHelper builder (text); - - for (;;) - { - juce_wchar c = builder.source.getAndAdvance(); - - if (charactersToRemove.text.indexOf (c) < 0) - builder.write (c); - - if (c == 0) - break; - } - - return builder.result; -} - -String String::initialSectionContainingOnly (StringRef permittedCharacters) const -{ - for (CharPointerType t (text); ! t.isEmpty(); ++t) - if (permittedCharacters.text.indexOf (*t) < 0) - return String (text, t); - - return *this; -} - -String String::initialSectionNotContaining (StringRef charactersToStopAt) const -{ - for (CharPointerType t (text); ! t.isEmpty(); ++t) - if (charactersToStopAt.text.indexOf (*t) >= 0) - return String (text, t); - - return *this; -} - -bool String::containsOnly (StringRef chars) const noexcept -{ - for (CharPointerType t (text); ! t.isEmpty();) - if (chars.text.indexOf (t.getAndAdvance()) < 0) - return false; - - return true; -} - -bool String::containsAnyOf (StringRef chars) const noexcept -{ - for (CharPointerType t (text); ! t.isEmpty();) - if (chars.text.indexOf (t.getAndAdvance()) >= 0) - return true; - - return false; -} - -bool String::containsNonWhitespaceChars() const noexcept -{ - for (CharPointerType t (text); ! t.isEmpty(); ++t) - if (! t.isWhitespace()) - return true; - - return false; -} - -// Note! The format parameter here MUST NOT be a reference, otherwise MS's va_start macro fails to work (but still compiles). -String String::formatted (const String pf, ... ) -{ - size_t bufferSize = 256; - - for (;;) - { - va_list args; - va_start (args, pf); - - #if JUCE_WINDOWS - HeapBlock temp (bufferSize); - const int num = (int) _vsnwprintf (temp.getData(), bufferSize - 1, pf.toWideCharPointer(), args); - #elif JUCE_ANDROID - HeapBlock temp (bufferSize); - const int num = (int) vsnprintf (temp.getData(), bufferSize - 1, pf.toUTF8(), args); - #else - HeapBlock temp (bufferSize); - const int num = (int) vswprintf (temp.getData(), bufferSize - 1, pf.toWideCharPointer(), args); - #endif - - va_end (args); - - if (num > 0) - return String (temp); - - bufferSize += 256; - - if (num == 0 || bufferSize > 65536) // the upper limit is a sanity check to avoid situations where vprintf repeatedly - break; // returns -1 because of an error rather than because it needs more space. - } - - return String(); -} - -//============================================================================== -int String::getIntValue() const noexcept { return text.getIntValue32(); } -int64 String::getLargeIntValue() const noexcept { return text.getIntValue64(); } -float String::getFloatValue() const noexcept { return (float) getDoubleValue(); } -double String::getDoubleValue() const noexcept { return text.getDoubleValue(); } - -int String::getTrailingIntValue() const noexcept -{ - int n = 0; - int mult = 1; - CharPointerType t (text.findTerminatingNull()); - - while (--t >= text) - { - if (! t.isDigit()) - { - if (*t == '-') - n = -n; - - break; - } - - n += mult * (*t - '0'); - mult *= 10; - } - - return n; -} - -static const char hexDigits[] = "0123456789abcdef"; - -template -static String hexToString (Type v) -{ - String::CharPointerType::CharType buffer[32]; - String::CharPointerType::CharType* const end = buffer + numElementsInArray (buffer) - 1; - String::CharPointerType::CharType* t = end; - *t = 0; - - do - { - *--t = hexDigits [(int) (v & 15)]; - v >>= 4; - - } while (v != 0); - - return String (String::CharPointerType (t), - String::CharPointerType (end)); -} - -String String::toHexString (int number) { return hexToString ((unsigned int) number); } -String String::toHexString (int64 number) { return hexToString ((uint64) number); } -String String::toHexString (short number) { return toHexString ((int) (unsigned short) number); } - -String String::toHexString (const void* const d, const int size, const int groupSize) -{ - if (size <= 0) - return String(); - - int numChars = (size * 2) + 2; - if (groupSize > 0) - numChars += size / groupSize; - - String s (PreallocationBytes (sizeof (CharPointerType::CharType) * (size_t) numChars)); - - const unsigned char* data = static_cast (d); - CharPointerType dest (s.text); - - for (int i = 0; i < size; ++i) - { - const unsigned char nextByte = *data++; - dest.write ((juce_wchar) hexDigits [nextByte >> 4]); - dest.write ((juce_wchar) hexDigits [nextByte & 0xf]); - - if (groupSize > 0 && (i % groupSize) == (groupSize - 1) && i < (size - 1)) - dest.write ((juce_wchar) ' '); - } - - dest.writeNull(); - return s; -} - -int String::getHexValue32() const noexcept { return CharacterFunctions::HexParser ::parse (text); } -int64 String::getHexValue64() const noexcept { return CharacterFunctions::HexParser::parse (text); } - -//============================================================================== -String String::createStringFromData (const void* const unknownData, const int size) -{ - const uint8* const data = static_cast (unknownData); - - if (size <= 0 || data == nullptr) - return String(); - - if (size == 1) - return charToString ((juce_wchar) data[0]); - - if (CharPointer_UTF16::isByteOrderMarkBigEndian (data) - || CharPointer_UTF16::isByteOrderMarkLittleEndian (data)) - { - const int numChars = size / 2 - 1; - - StringCreationHelper builder ((size_t) numChars); - - const uint16* const src = (const uint16*) (data + 2); - - if (CharPointer_UTF16::isByteOrderMarkBigEndian (data)) - { - for (int i = 0; i < numChars; ++i) - builder.write ((juce_wchar) ByteOrder::swapIfLittleEndian (src[i])); - } - else - { - for (int i = 0; i < numChars; ++i) - builder.write ((juce_wchar) ByteOrder::swapIfBigEndian (src[i])); - } - - builder.write (0); - return builder.result; - } - - const uint8* start = data; - - if (size >= 3 && CharPointer_UTF8::isByteOrderMark (data)) - start += 3; - - return String (CharPointer_UTF8 ((const char*) start), - CharPointer_UTF8 ((const char*) (data + size))); -} - -//============================================================================== -static const juce_wchar emptyChar = 0; - -template -struct StringEncodingConverter -{ - static CharPointerType_Dest convert (const String& s) - { - String& source = const_cast (s); - - typedef typename CharPointerType_Dest::CharType DestChar; - - if (source.isEmpty()) - return CharPointerType_Dest (reinterpret_cast (&emptyChar)); - - CharPointerType_Src text (source.getCharPointer()); - const size_t extraBytesNeeded = CharPointerType_Dest::getBytesRequiredFor (text) + sizeof (typename CharPointerType_Dest::CharType); - const size_t endOffset = (text.sizeInBytes() + 3) & ~3u; // the new string must be word-aligned or many Windows - // functions will fail to read it correctly! - source.preallocateBytes (endOffset + extraBytesNeeded); - text = source.getCharPointer(); - - void* const newSpace = addBytesToPointer (text.getAddress(), (int) endOffset); - const CharPointerType_Dest extraSpace (static_cast (newSpace)); - - #if JUCE_DEBUG // (This just avoids spurious warnings from valgrind about the uninitialised bytes at the end of the buffer..) - const size_t bytesToClear = (size_t) jmin ((int) extraBytesNeeded, 4); - zeromem (addBytesToPointer (newSpace, extraBytesNeeded - bytesToClear), bytesToClear); - #endif - - CharPointerType_Dest (extraSpace).writeAll (text); - return extraSpace; - } -}; - -template <> -struct StringEncodingConverter -{ - static CharPointer_UTF8 convert (const String& source) noexcept { return CharPointer_UTF8 ((CharPointer_UTF8::CharType*) source.getCharPointer().getAddress()); } -}; - -template <> -struct StringEncodingConverter -{ - static CharPointer_UTF16 convert (const String& source) noexcept { return CharPointer_UTF16 ((CharPointer_UTF16::CharType*) source.getCharPointer().getAddress()); } -}; - -template <> -struct StringEncodingConverter -{ - static CharPointer_UTF32 convert (const String& source) noexcept { return CharPointer_UTF32 ((CharPointer_UTF32::CharType*) source.getCharPointer().getAddress()); } -}; - -CharPointer_UTF8 String::toUTF8() const { return StringEncodingConverter::convert (*this); } -CharPointer_UTF16 String::toUTF16() const { return StringEncodingConverter::convert (*this); } -CharPointer_UTF32 String::toUTF32() const { return StringEncodingConverter::convert (*this); } - -const char* String::toRawUTF8() const -{ - return toUTF8().getAddress(); -} - -const wchar_t* String::toWideCharPointer() const -{ - return StringEncodingConverter::convert (*this).getAddress(); -} - -std::string String::toStdString() const -{ - return std::string (toRawUTF8()); -} - -//============================================================================== -template -struct StringCopier -{ - static size_t copyToBuffer (const CharPointerType_Src source, typename CharPointerType_Dest::CharType* const buffer, const size_t maxBufferSizeBytes) - { - jassert (((ssize_t) maxBufferSizeBytes) >= 0); // keep this value positive! - - if (buffer == nullptr) - return CharPointerType_Dest::getBytesRequiredFor (source) + sizeof (typename CharPointerType_Dest::CharType); - - return CharPointerType_Dest (buffer).writeWithDestByteLimit (source, maxBufferSizeBytes); - } -}; - -size_t String::copyToUTF8 (CharPointer_UTF8::CharType* const buffer, size_t maxBufferSizeBytes) const noexcept -{ - return StringCopier::copyToBuffer (text, buffer, maxBufferSizeBytes); -} - -size_t String::copyToUTF16 (CharPointer_UTF16::CharType* const buffer, size_t maxBufferSizeBytes) const noexcept -{ - return StringCopier::copyToBuffer (text, buffer, maxBufferSizeBytes); -} - -size_t String::copyToUTF32 (CharPointer_UTF32::CharType* const buffer, size_t maxBufferSizeBytes) const noexcept -{ - return StringCopier::copyToBuffer (text, buffer, maxBufferSizeBytes); -} - -//============================================================================== -size_t String::getNumBytesAsUTF8() const noexcept -{ - return CharPointer_UTF8::getBytesRequiredFor (text); -} - -String String::fromUTF8 (const char* const buffer, int bufferSizeBytes) -{ - if (buffer != nullptr) - { - if (bufferSizeBytes < 0) - return String (CharPointer_UTF8 (buffer)); - - if (bufferSizeBytes > 0) - { - jassert (CharPointer_UTF8::isValidString (buffer, bufferSizeBytes)); - return String (CharPointer_UTF8 (buffer), CharPointer_UTF8 (buffer + bufferSizeBytes)); - } - } - - return String(); -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -//============================================================================== -StringRef::StringRef() noexcept : text ((const String::CharPointerType::CharType*) "\0\0\0") -{ -} - -StringRef::StringRef (const char* stringLiteral) noexcept - #if JUCE_STRING_UTF_TYPE != 8 - : text (nullptr), stringCopy (stringLiteral) - #else - : text (stringLiteral) - #endif -{ - #if JUCE_STRING_UTF_TYPE != 8 - text = stringCopy.getCharPointer(); - #endif - - jassert (stringLiteral != nullptr); // This must be a valid string literal, not a null pointer!! - - #if JUCE_NATIVE_WCHAR_IS_UTF8 - /* If you get an assertion here, then you're trying to create a string from 8-bit data - that contains values greater than 127. These can NOT be correctly converted to unicode - because there's no way for the String class to know what encoding was used to - create them. The source data could be UTF-8, ASCII or one of many local code-pages. - - To get around this problem, you must be more explicit when you pass an ambiguous 8-bit - string to the StringRef class - so for example if your source data is actually UTF-8, - you'd call StringRef (CharPointer_UTF8 ("my utf8 string..")), and it would be able to - correctly convert the multi-byte characters to unicode. It's *highly* recommended that - you use UTF-8 with escape characters in your source code to represent extended characters, - because there's no other way to represent these strings in a way that isn't dependent on - the compiler, source code editor and platform. - */ - jassert (CharPointer_ASCII::isValidString (stringLiteral, std::numeric_limits::max())); - #endif -} - -StringRef::StringRef (String::CharPointerType stringLiteral) noexcept : text (stringLiteral) -{ - jassert (stringLiteral.getAddress() != nullptr); // This must be a valid string literal, not a null pointer!! -} - -StringRef::StringRef (const String& string) noexcept : text (string.getCharPointer()) {} - - -//============================================================================== -//============================================================================== -#if JUCE_UNIT_TESTS - -class StringTests : public UnitTest -{ -public: - StringTests() : UnitTest ("String class") {} - - template - struct TestUTFConversion - { - static void test (UnitTest& test, Random& r) - { - String s (createRandomWideCharString (r)); - - typename CharPointerType::CharType buffer [300]; - - memset (buffer, 0xff, sizeof (buffer)); - CharPointerType (buffer).writeAll (s.toUTF32()); - test.expectEquals (String (CharPointerType (buffer)), s); - - memset (buffer, 0xff, sizeof (buffer)); - CharPointerType (buffer).writeAll (s.toUTF16()); - test.expectEquals (String (CharPointerType (buffer)), s); - - memset (buffer, 0xff, sizeof (buffer)); - CharPointerType (buffer).writeAll (s.toUTF8()); - test.expectEquals (String (CharPointerType (buffer)), s); - - test.expect (CharPointerType::isValidString (buffer, (int) strlen ((const char*) buffer))); - } - }; - - static String createRandomWideCharString (Random& r) - { - juce_wchar buffer[50] = { 0 }; - - for (int i = 0; i < numElementsInArray (buffer) - 1; ++i) - { - if (r.nextBool()) - { - do - { - buffer[i] = (juce_wchar) (1 + r.nextInt (0x10ffff - 1)); - } - while (! CharPointer_UTF16::canRepresent (buffer[i])); - } - else - buffer[i] = (juce_wchar) (1 + r.nextInt (0xff)); - } - - return CharPointer_UTF32 (buffer); - } - - void runTest() - { - Random r = getRandom(); - - { - beginTest ("Basics"); - - expect (String().length() == 0); - expect (String() == String::empty); - String s1, s2 ("abcd"); - expect (s1.isEmpty() && ! s1.isNotEmpty()); - expect (s2.isNotEmpty() && ! s2.isEmpty()); - expect (s2.length() == 4); - s1 = "abcd"; - expect (s2 == s1 && s1 == s2); - expect (s1 == "abcd" && s1 == L"abcd"); - expect (String ("abcd") == String (L"abcd")); - expect (String ("abcdefg", 4) == L"abcd"); - expect (String ("abcdefg", 4) == String (L"abcdefg", 4)); - expect (String::charToString ('x') == "x"); - expect (String::charToString (0) == String::empty); - expect (s2 + "e" == "abcde" && s2 + 'e' == "abcde"); - expect (s2 + L'e' == "abcde" && s2 + L"e" == "abcde"); - expect (s1.equalsIgnoreCase ("abcD") && s1 < "abce" && s1 > "abbb"); - expect (s1.startsWith ("ab") && s1.startsWith ("abcd") && ! s1.startsWith ("abcde")); - expect (s1.startsWithIgnoreCase ("aB") && s1.endsWithIgnoreCase ("CD")); - expect (s1.endsWith ("bcd") && ! s1.endsWith ("aabcd")); - expectEquals (s1.indexOf (String::empty), 0); - expectEquals (s1.indexOfIgnoreCase (String::empty), 0); - expect (s1.startsWith (String::empty) && s1.endsWith (String::empty) && s1.contains (String::empty)); - expect (s1.contains ("cd") && s1.contains ("ab") && s1.contains ("abcd")); - expect (s1.containsChar ('a')); - expect (! s1.containsChar ('x')); - expect (! s1.containsChar (0)); - expect (String ("abc foo bar").containsWholeWord ("abc") && String ("abc foo bar").containsWholeWord ("abc")); - } - - { - beginTest ("Operations"); - - String s ("012345678"); - expect (s.hashCode() != 0); - expect (s.hashCode64() != 0); - expect (s.hashCode() != (s + s).hashCode()); - expect (s.hashCode64() != (s + s).hashCode64()); - expect (s.compare (String ("012345678")) == 0); - expect (s.compare (String ("012345679")) < 0); - expect (s.compare (String ("012345676")) > 0); - expect (String("a").compareNatural ("A") == 0); - expect (String("A").compareNatural ("B") < 0); - expect (String("a").compareNatural ("B") < 0); - expect (String("10").compareNatural ("2") > 0); - expect (String("Abc 10").compareNatural ("aBC 2") > 0); - expect (String("Abc 1").compareNatural ("aBC 2") < 0); - expect (s.substring (2, 3) == String::charToString (s[2])); - expect (s.substring (0, 1) == String::charToString (s[0])); - expect (s.getLastCharacter() == s [s.length() - 1]); - expect (String::charToString (s.getLastCharacter()) == s.getLastCharacters (1)); - expect (s.substring (0, 3) == L"012"); - expect (s.substring (0, 100) == s); - expect (s.substring (-1, 100) == s); - expect (s.substring (3) == "345678"); - expect (s.indexOf (String (L"45")) == 4); - expect (String ("444445").indexOf ("45") == 4); - expect (String ("444445").lastIndexOfChar ('4') == 4); - expect (String ("45454545x").lastIndexOf (String (L"45")) == 6); - expect (String ("45454545x").lastIndexOfAnyOf ("456") == 7); - expect (String ("45454545x").lastIndexOfAnyOf (String (L"456x")) == 8); - expect (String ("abABaBaBa").lastIndexOfIgnoreCase ("aB") == 6); - expect (s.indexOfChar (L'4') == 4); - expect (s + s == "012345678012345678"); - expect (s.startsWith (s)); - expect (s.startsWith (s.substring (0, 4))); - expect (s.startsWith (s.dropLastCharacters (4))); - expect (s.endsWith (s.substring (5))); - expect (s.endsWith (s)); - expect (s.contains (s.substring (3, 6))); - expect (s.contains (s.substring (3))); - expect (s.startsWithChar (s[0])); - expect (s.endsWithChar (s.getLastCharacter())); - expect (s [s.length()] == 0); - expect (String ("abcdEFGH").toLowerCase() == String ("abcdefgh")); - expect (String ("abcdEFGH").toUpperCase() == String ("ABCDEFGH")); - - String s2 ("123"); - s2 << ((int) 4) << ((short) 5) << "678" << L"9" << '0'; - s2 += "xyz"; - expect (s2 == "1234567890xyz"); - s2 += (int) 123; - expect (s2 == "1234567890xyz123"); - s2 += (int64) 123; - expect (s2 == "1234567890xyz123123"); - - beginTest ("Numeric conversions"); - expect (String::empty.getIntValue() == 0); - expect (String::empty.getDoubleValue() == 0.0); - expect (String::empty.getFloatValue() == 0.0f); - expect (s.getIntValue() == 12345678); - expect (s.getLargeIntValue() == (int64) 12345678); - expect (s.getDoubleValue() == 12345678.0); - expect (s.getFloatValue() == 12345678.0f); - expect (String (-1234).getIntValue() == -1234); - expect (String ((int64) -1234).getLargeIntValue() == -1234); - expect (String (-1234.56).getDoubleValue() == -1234.56); - expect (String (-1234.56f).getFloatValue() == -1234.56f); - expect (String (std::numeric_limits::max()).getIntValue() == std::numeric_limits::max()); - expect (String (std::numeric_limits::min()).getIntValue() == std::numeric_limits::min()); - expect (String (std::numeric_limits::max()).getLargeIntValue() == std::numeric_limits::max()); - expect (String (std::numeric_limits::min()).getLargeIntValue() == std::numeric_limits::min()); - expect (("xyz" + s).getTrailingIntValue() == s.getIntValue()); - expect (s.getHexValue32() == 0x12345678); - expect (s.getHexValue64() == (int64) 0x12345678); - expect (String::toHexString (0x1234abcd).equalsIgnoreCase ("1234abcd")); - expect (String::toHexString ((int64) 0x1234abcd).equalsIgnoreCase ("1234abcd")); - expect (String::toHexString ((short) 0x12ab).equalsIgnoreCase ("12ab")); - - unsigned char data[] = { 1, 2, 3, 4, 0xa, 0xb, 0xc, 0xd }; - expect (String::toHexString (data, 8, 0).equalsIgnoreCase ("010203040a0b0c0d")); - expect (String::toHexString (data, 8, 1).equalsIgnoreCase ("01 02 03 04 0a 0b 0c 0d")); - expect (String::toHexString (data, 8, 2).equalsIgnoreCase ("0102 0304 0a0b 0c0d")); - - beginTest ("Subsections"); - String s3; - s3 = "abcdeFGHIJ"; - expect (s3.equalsIgnoreCase ("ABCdeFGhiJ")); - expect (s3.compareIgnoreCase (L"ABCdeFGhiJ") == 0); - expect (s3.containsIgnoreCase (s3.substring (3))); - expect (s3.indexOfAnyOf ("xyzf", 2, true) == 5); - expect (s3.indexOfAnyOf (String (L"xyzf"), 2, false) == -1); - expect (s3.indexOfAnyOf ("xyzF", 2, false) == 5); - expect (s3.containsAnyOf (String (L"zzzFs"))); - expect (s3.startsWith ("abcd")); - expect (s3.startsWithIgnoreCase (String (L"abCD"))); - expect (s3.startsWith (String::empty)); - expect (s3.startsWithChar ('a')); - expect (s3.endsWith (String ("HIJ"))); - expect (s3.endsWithIgnoreCase (String (L"Hij"))); - expect (s3.endsWith (String::empty)); - expect (s3.endsWithChar (L'J')); - expect (s3.indexOf ("HIJ") == 7); - expect (s3.indexOf (String (L"HIJK")) == -1); - expect (s3.indexOfIgnoreCase ("hij") == 7); - expect (s3.indexOfIgnoreCase (String (L"hijk")) == -1); - expect (s3.toStdString() == s3.toRawUTF8()); - - String s4 (s3); - s4.append (String ("xyz123"), 3); - expect (s4 == s3 + "xyz"); - - expect (String (1234) < String (1235)); - expect (String (1235) > String (1234)); - expect (String (1234) >= String (1234)); - expect (String (1234) <= String (1234)); - expect (String (1235) >= String (1234)); - expect (String (1234) <= String (1235)); - - String s5 ("word word2 word3"); - expect (s5.containsWholeWord (String ("word2"))); - expect (s5.indexOfWholeWord ("word2") == 5); - expect (s5.containsWholeWord (String (L"word"))); - expect (s5.containsWholeWord ("word3")); - expect (s5.containsWholeWord (s5)); - expect (s5.containsWholeWordIgnoreCase (String (L"Word2"))); - expect (s5.indexOfWholeWordIgnoreCase ("Word2") == 5); - expect (s5.containsWholeWordIgnoreCase (String (L"Word"))); - expect (s5.containsWholeWordIgnoreCase ("Word3")); - expect (! s5.containsWholeWordIgnoreCase (String (L"Wordx"))); - expect (! s5.containsWholeWordIgnoreCase ("xWord2")); - expect (s5.containsNonWhitespaceChars()); - expect (s5.containsOnly ("ordw23 ")); - expect (! String (" \n\r\t").containsNonWhitespaceChars()); - - expect (s5.matchesWildcard (String (L"wor*"), false)); - expect (s5.matchesWildcard ("wOr*", true)); - expect (s5.matchesWildcard (String (L"*word3"), true)); - expect (s5.matchesWildcard ("*word?", true)); - expect (s5.matchesWildcard (String (L"Word*3"), true)); - expect (! s5.matchesWildcard (String (L"*34"), true)); - expect (String ("xx**y").matchesWildcard ("*y", true)); - expect (String ("xx**y").matchesWildcard ("x*y", true)); - expect (String ("xx**y").matchesWildcard ("xx*y", true)); - expect (String ("xx**y").matchesWildcard ("xx*", true)); - expect (String ("xx?y").matchesWildcard ("x??y", true)); - expect (String ("xx?y").matchesWildcard ("xx?y", true)); - expect (! String ("xx?y").matchesWildcard ("xx?y?", true)); - expect (String ("xx?y").matchesWildcard ("xx??", true)); - - expectEquals (s5.fromFirstOccurrenceOf (String::empty, true, false), s5); - expectEquals (s5.fromFirstOccurrenceOf ("xword2", true, false), s5.substring (100)); - expectEquals (s5.fromFirstOccurrenceOf (String (L"word2"), true, false), s5.substring (5)); - expectEquals (s5.fromFirstOccurrenceOf ("Word2", true, true), s5.substring (5)); - expectEquals (s5.fromFirstOccurrenceOf ("word2", false, false), s5.getLastCharacters (6)); - expectEquals (s5.fromFirstOccurrenceOf ("Word2", false, true), s5.getLastCharacters (6)); - - expectEquals (s5.fromLastOccurrenceOf (String::empty, true, false), s5); - expectEquals (s5.fromLastOccurrenceOf ("wordx", true, false), s5); - expectEquals (s5.fromLastOccurrenceOf ("word", true, false), s5.getLastCharacters (5)); - expectEquals (s5.fromLastOccurrenceOf ("worD", true, true), s5.getLastCharacters (5)); - expectEquals (s5.fromLastOccurrenceOf ("word", false, false), s5.getLastCharacters (1)); - expectEquals (s5.fromLastOccurrenceOf ("worD", false, true), s5.getLastCharacters (1)); - - expect (s5.upToFirstOccurrenceOf (String::empty, true, false).isEmpty()); - expectEquals (s5.upToFirstOccurrenceOf ("word4", true, false), s5); - expectEquals (s5.upToFirstOccurrenceOf ("word2", true, false), s5.substring (0, 10)); - expectEquals (s5.upToFirstOccurrenceOf ("Word2", true, true), s5.substring (0, 10)); - expectEquals (s5.upToFirstOccurrenceOf ("word2", false, false), s5.substring (0, 5)); - expectEquals (s5.upToFirstOccurrenceOf ("Word2", false, true), s5.substring (0, 5)); - - expectEquals (s5.upToLastOccurrenceOf (String::empty, true, false), s5); - expectEquals (s5.upToLastOccurrenceOf ("zword", true, false), s5); - expectEquals (s5.upToLastOccurrenceOf ("word", true, false), s5.dropLastCharacters (1)); - expectEquals (s5.dropLastCharacters(1).upToLastOccurrenceOf ("word", true, false), s5.dropLastCharacters (1)); - expectEquals (s5.upToLastOccurrenceOf ("Word", true, true), s5.dropLastCharacters (1)); - expectEquals (s5.upToLastOccurrenceOf ("word", false, false), s5.dropLastCharacters (5)); - expectEquals (s5.upToLastOccurrenceOf ("Word", false, true), s5.dropLastCharacters (5)); - - expectEquals (s5.replace ("word", "xyz", false), String ("xyz xyz2 xyz3")); - expect (s5.replace ("Word", "xyz", true) == "xyz xyz2 xyz3"); - expect (s5.dropLastCharacters (1).replace ("Word", String ("xyz"), true) == L"xyz xyz2 xyz"); - expect (s5.replace ("Word", "", true) == " 2 3"); - expectEquals (s5.replace ("Word2", "xyz", true), String ("word xyz word3")); - expect (s5.replaceCharacter (L'w', 'x') != s5); - expectEquals (s5.replaceCharacter ('w', L'x').replaceCharacter ('x', 'w'), s5); - expect (s5.replaceCharacters ("wo", "xy") != s5); - expectEquals (s5.replaceCharacters ("wo", "xy").replaceCharacters ("xy", "wo"), s5); - expectEquals (s5.retainCharacters ("1wordxya"), String ("wordwordword")); - expect (s5.retainCharacters (String::empty).isEmpty()); - expect (s5.removeCharacters ("1wordxya") == " 2 3"); - expectEquals (s5.removeCharacters (String::empty), s5); - expect (s5.initialSectionContainingOnly ("word") == L"word"); - expect (String ("word").initialSectionContainingOnly ("word") == L"word"); - expectEquals (s5.initialSectionNotContaining (String ("xyz ")), String ("word")); - expectEquals (s5.initialSectionNotContaining (String (";[:'/")), s5); - expect (! s5.isQuotedString()); - expect (s5.quoted().isQuotedString()); - expect (! s5.quoted().unquoted().isQuotedString()); - expect (! String ("x'").isQuotedString()); - expect (String ("'x").isQuotedString()); - - String s6 (" \t xyz \t\r\n"); - expectEquals (s6.trim(), String ("xyz")); - expect (s6.trim().trim() == "xyz"); - expectEquals (s5.trim(), s5); - expectEquals (s6.trimStart().trimEnd(), s6.trim()); - expectEquals (s6.trimStart().trimEnd(), s6.trimEnd().trimStart()); - expectEquals (s6.trimStart().trimStart().trimEnd().trimEnd(), s6.trimEnd().trimStart()); - expect (s6.trimStart() != s6.trimEnd()); - expectEquals (("\t\r\n " + s6 + "\t\n \r").trim(), s6.trim()); - expect (String::repeatedString ("xyz", 3) == L"xyzxyzxyz"); - } - - { - beginTest ("UTF conversions"); - - TestUTFConversion ::test (*this, r); - TestUTFConversion ::test (*this, r); - TestUTFConversion ::test (*this, r); - } - - { - beginTest ("StringArray"); - - StringArray s; - s.addTokens ("4,3,2,1,0", ";,", "x"); - expectEquals (s.size(), 5); - - expectEquals (s.joinIntoString ("-"), String ("4-3-2-1-0")); - s.remove (2); - expectEquals (s.joinIntoString ("--"), String ("4--3--1--0")); - expectEquals (s.joinIntoString (String::empty), String ("4310")); - s.clear(); - expectEquals (s.joinIntoString ("x"), String::empty); - - StringArray toks; - toks.addTokens ("x,,", ";,", ""); - expectEquals (toks.size(), 3); - expectEquals (toks.joinIntoString ("-"), String ("x--")); - toks.clear(); - - toks.addTokens (",x,", ";,", ""); - expectEquals (toks.size(), 3); - expectEquals (toks.joinIntoString ("-"), String ("-x-")); - toks.clear(); - - toks.addTokens ("x,'y,z',", ";,", "'"); - expectEquals (toks.size(), 3); - expectEquals (toks.joinIntoString ("-"), String ("x-'y,z'-")); - } - - { - beginTest ("var"); - - var v1 = 0; - var v2 = 0.1; - var v3 = "0.1"; - var v4 = (int64) 0; - var v5 = 0.0; - expect (! v2.equals (v1)); - expect (! v1.equals (v2)); - expect (v2.equals (v3)); - expect (v3.equals (v2)); - expect (! v3.equals (v1)); - expect (! v1.equals (v3)); - expect (v1.equals (v4)); - expect (v4.equals (v1)); - expect (v5.equals (v4)); - expect (v4.equals (v5)); - expect (! v2.equals (v4)); - expect (! v4.equals (v2)); - } - } -}; - -static StringTests stringUnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_core/text/juce_String.h b/JuceLibraryCode/modules/juce_core/text/juce_String.h deleted file mode 100755 index 0260acf..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_String.h +++ /dev/null @@ -1,1370 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_STRING_H_INCLUDED -#define JUCE_STRING_H_INCLUDED - - -//============================================================================== -/** - The JUCE String class! - - Using a reference-counted internal representation, these strings are fast - and efficient, and there are methods to do just about any operation you'll ever - dream of. - - @see StringArray, StringPairArray -*/ -class JUCE_API String -{ -public: - //============================================================================== - /** Creates an empty string. - @see empty - */ - String() noexcept; - - /** Creates a copy of another string. */ - String (const String& other) noexcept; - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - String (String&& other) noexcept; - #endif - - /** Creates a string from a zero-terminated ascii text string. - - The string passed-in must not contain any characters with a value above 127, because - these can't be converted to unicode without knowing the original encoding that was - used to create the string. If you attempt to pass-in values above 127, you'll get an - assertion. - - To create strings with extended characters from UTF-8, you should explicitly call - String (CharPointer_UTF8 ("my utf8 string..")). It's *highly* recommended that you - use UTF-8 with escape characters in your source code to represent extended characters, - because there's no other way to represent unicode strings in a way that isn't dependent - on the compiler, source code editor and platform. - */ - String (const char* text); - - /** Creates a string from a string of 8-bit ascii characters. - - The string passed-in must not contain any characters with a value above 127, because - these can't be converted to unicode without knowing the original encoding that was - used to create the string. If you attempt to pass-in values above 127, you'll get an - assertion. - - To create strings with extended characters from UTF-8, you should explicitly call - String (CharPointer_UTF8 ("my utf8 string..")). It's *highly* recommended that you - use UTF-8 with escape characters in your source code to represent extended characters, - because there's no other way to represent unicode strings in a way that isn't dependent - on the compiler, source code editor and platform. - - This will use up to the first maxChars characters of the string (or less if the string - is actually shorter). - */ - String (const char* text, size_t maxChars); - - /** Creates a string from a whcar_t character string. - Depending on the platform, this may be treated as either UTF-32 or UTF-16. - */ - String (const wchar_t* text); - - /** Creates a string from a whcar_t character string. - Depending on the platform, this may be treated as either UTF-32 or UTF-16. - */ - String (const wchar_t* text, size_t maxChars); - - //============================================================================== - /** Creates a string from a UTF-8 character string */ - String (const CharPointer_UTF8 text); - - /** Creates a string from a UTF-8 character string */ - String (const CharPointer_UTF8 text, size_t maxChars); - - /** Creates a string from a UTF-8 character string */ - String (const CharPointer_UTF8 start, const CharPointer_UTF8 end); - - //============================================================================== - /** Creates a string from a UTF-16 character string */ - String (const CharPointer_UTF16 text); - - /** Creates a string from a UTF-16 character string */ - String (const CharPointer_UTF16 text, size_t maxChars); - - /** Creates a string from a UTF-16 character string */ - String (const CharPointer_UTF16 start, const CharPointer_UTF16 end); - - //============================================================================== - /** Creates a string from a UTF-32 character string */ - String (const CharPointer_UTF32 text); - - /** Creates a string from a UTF-32 character string */ - String (const CharPointer_UTF32 text, size_t maxChars); - - /** Creates a string from a UTF-32 character string */ - String (const CharPointer_UTF32 start, const CharPointer_UTF32 end); - - //============================================================================== - /** Creates a string from an ASCII character string */ - String (const CharPointer_ASCII text); - - /** Creates a string from a UTF-8 encoded std::string. */ - String (const std::string&); - - //============================================================================== - /** Creates a string from a single character. */ - static String charToString (juce_wchar character); - - /** Destructor. */ - ~String() noexcept; - - //============================================================================== - /** This is an empty string that can be used whenever one is needed. - - It's better to use this than String() because it explains what's going on - and is more efficient. - */ - static const String empty; - - /** This is the character encoding type used internally to store the string. - - By setting the value of JUCE_STRING_UTF_TYPE to 8, 16, or 32, you can change the - internal storage format of the String class. UTF-8 uses the least space (if your strings - contain few extended characters), but call operator[] involves iterating the string to find - the required index. UTF-32 provides instant random access to its characters, but uses 4 bytes - per character to store them. UTF-16 uses more space than UTF-8 and is also slow to index, - but is the native wchar_t format used in Windows. - - It doesn't matter too much which format you pick, because the toUTF8(), toUTF16() and - toUTF32() methods let you access the string's content in any of the other formats. - */ - #if (JUCE_STRING_UTF_TYPE == 32) - typedef CharPointer_UTF32 CharPointerType; - #elif (JUCE_STRING_UTF_TYPE == 16) - typedef CharPointer_UTF16 CharPointerType; - #elif (DOXYGEN || JUCE_STRING_UTF_TYPE == 8) - typedef CharPointer_UTF8 CharPointerType; - #else - #error "You must set the value of JUCE_STRING_UTF_TYPE to be either 8, 16, or 32!" - #endif - - //============================================================================== - /** Generates a probably-unique 32-bit hashcode from this string. */ - int hashCode() const noexcept; - - /** Generates a probably-unique 64-bit hashcode from this string. */ - int64 hashCode64() const noexcept; - - /** Generates a probably-unique hashcode from this string. */ - size_t hash() const noexcept; - - /** Returns the number of characters in the string. */ - int length() const noexcept; - - //============================================================================== - // Assignment and concatenation operators.. - - /** Replaces this string's contents with another string. */ - String& operator= (const String& other) noexcept; - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - String& operator= (String&& other) noexcept; - #endif - - /** Appends another string at the end of this one. */ - String& operator+= (const String& stringToAppend); - /** Appends another string at the end of this one. */ - String& operator+= (const char* textToAppend); - /** Appends another string at the end of this one. */ - String& operator+= (const wchar_t* textToAppend); - /** Appends a decimal number at the end of this string. */ - String& operator+= (int numberToAppend); - /** Appends a decimal number at the end of this string. */ - String& operator+= (int64 numberToAppend); - /** Appends a character at the end of this string. */ - String& operator+= (char characterToAppend); - /** Appends a character at the end of this string. */ - String& operator+= (wchar_t characterToAppend); - #if ! JUCE_NATIVE_WCHAR_IS_UTF32 - /** Appends a character at the end of this string. */ - String& operator+= (juce_wchar characterToAppend); - #endif - - /** Appends a string to the end of this one. - - @param textToAppend the string to add - @param maxCharsToTake the maximum number of characters to take from the string passed in - */ - void append (const String& textToAppend, size_t maxCharsToTake); - - /** Appends a string to the end of this one. - - @param startOfTextToAppend the start of the string to add. This must not be a nullptr - @param endOfTextToAppend the end of the string to add. This must not be a nullptr - */ - void appendCharPointer (const CharPointerType startOfTextToAppend, - const CharPointerType endOfTextToAppend); - - /** Appends a string to the end of this one. - - @param startOfTextToAppend the start of the string to add. This must not be a nullptr - @param endOfTextToAppend the end of the string to add. This must not be a nullptr - */ - template - void appendCharPointer (const CharPointer startOfTextToAppend, - const CharPointer endOfTextToAppend) - { - jassert (startOfTextToAppend.getAddress() != nullptr && endOfTextToAppend.getAddress() != nullptr); - - size_t extraBytesNeeded = 0, numChars = 1; - - for (CharPointer t (startOfTextToAppend); t != endOfTextToAppend && ! t.isEmpty(); ++numChars) - extraBytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance()); - - if (extraBytesNeeded > 0) - { - const size_t byteOffsetOfNull = getByteOffsetOfEnd(); - - preallocateBytes (byteOffsetOfNull + extraBytesNeeded); - CharPointerType (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull)) - .writeWithCharLimit (startOfTextToAppend, (int) numChars); - } - } - - /** Appends a string to the end of this one. */ - void appendCharPointer (const CharPointerType textToAppend); - - /** Appends a string to the end of this one. - - @param textToAppend the string to add - @param maxCharsToTake the maximum number of characters to take from the string passed in - */ - template - void appendCharPointer (const CharPointer textToAppend, size_t maxCharsToTake) - { - if (textToAppend.getAddress() != nullptr) - { - size_t extraBytesNeeded = 0, numChars = 1; - - for (CharPointer t (textToAppend); numChars <= maxCharsToTake && ! t.isEmpty(); ++numChars) - extraBytesNeeded += CharPointerType::getBytesRequiredFor (t.getAndAdvance()); - - if (extraBytesNeeded > 0) - { - const size_t byteOffsetOfNull = getByteOffsetOfEnd(); - - preallocateBytes (byteOffsetOfNull + extraBytesNeeded); - CharPointerType (addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull)) - .writeWithCharLimit (textToAppend, (int) numChars); - } - } - } - - /** Appends a string to the end of this one. */ - template - void appendCharPointer (const CharPointer textToAppend) - { - appendCharPointer (textToAppend, std::numeric_limits::max()); - } - - //============================================================================== - // Comparison methods.. - - /** Returns true if the string contains no characters. - Note that there's also an isNotEmpty() method to help write readable code. - @see containsNonWhitespaceChars() - */ - inline bool isEmpty() const noexcept { return text[0] == 0; } - - /** Returns true if the string contains at least one character. - Note that there's also an isEmpty() method to help write readable code. - @see containsNonWhitespaceChars() - */ - inline bool isNotEmpty() const noexcept { return text[0] != 0; } - - /** Resets this string to be empty. */ - void clear() noexcept; - - /** Case-insensitive comparison with another string. */ - bool equalsIgnoreCase (const String& other) const noexcept; - - /** Case-insensitive comparison with another string. */ - bool equalsIgnoreCase (StringRef other) const noexcept; - - /** Case-insensitive comparison with another string. */ - bool equalsIgnoreCase (const wchar_t* other) const noexcept; - - /** Case-insensitive comparison with another string. */ - bool equalsIgnoreCase (const char* other) const noexcept; - - /** Case-sensitive comparison with another string. - @returns 0 if the two strings are identical; negative if this string comes before - the other one alphabetically, or positive if it comes after it. - */ - int compare (const String& other) const noexcept; - - /** Case-sensitive comparison with another string. - @returns 0 if the two strings are identical; negative if this string comes before - the other one alphabetically, or positive if it comes after it. - */ - int compare (const char* other) const noexcept; - - /** Case-sensitive comparison with another string. - @returns 0 if the two strings are identical; negative if this string comes before - the other one alphabetically, or positive if it comes after it. - */ - int compare (const wchar_t* other) const noexcept; - - /** Case-insensitive comparison with another string. - @returns 0 if the two strings are identical; negative if this string comes before - the other one alphabetically, or positive if it comes after it. - */ - int compareIgnoreCase (const String& other) const noexcept; - - /** Compares two strings, taking into account textual characteristics like numbers and spaces. - - This comparison is case-insensitive and can detect words and embedded numbers in the - strings, making it good for sorting human-readable lists of things like filenames. - - @returns 0 if the two strings are identical; negative if this string comes before - the other one alphabetically, or positive if it comes after it. - */ - int compareNatural (StringRef other) const noexcept; - - /** Tests whether the string begins with another string. - If the parameter is an empty string, this will always return true. - Uses a case-sensitive comparison. - */ - bool startsWith (StringRef text) const noexcept; - - /** Tests whether the string begins with a particular character. - If the character is 0, this will always return false. - Uses a case-sensitive comparison. - */ - bool startsWithChar (juce_wchar character) const noexcept; - - /** Tests whether the string begins with another string. - If the parameter is an empty string, this will always return true. - Uses a case-insensitive comparison. - */ - bool startsWithIgnoreCase (StringRef text) const noexcept; - - /** Tests whether the string ends with another string. - If the parameter is an empty string, this will always return true. - Uses a case-sensitive comparison. - */ - bool endsWith (StringRef text) const noexcept; - - /** Tests whether the string ends with a particular character. - If the character is 0, this will always return false. - Uses a case-sensitive comparison. - */ - bool endsWithChar (juce_wchar character) const noexcept; - - /** Tests whether the string ends with another string. - If the parameter is an empty string, this will always return true. - Uses a case-insensitive comparison. - */ - bool endsWithIgnoreCase (StringRef text) const noexcept; - - /** Tests whether the string contains another substring. - If the parameter is an empty string, this will always return true. - Uses a case-sensitive comparison. - */ - bool contains (StringRef text) const noexcept; - - /** Tests whether the string contains a particular character. - Uses a case-sensitive comparison. - */ - bool containsChar (juce_wchar character) const noexcept; - - /** Tests whether the string contains another substring. - Uses a case-insensitive comparison. - */ - bool containsIgnoreCase (StringRef text) const noexcept; - - /** Tests whether the string contains another substring as a distinct word. - - @returns true if the string contains this word, surrounded by - non-alphanumeric characters - @see indexOfWholeWord, containsWholeWordIgnoreCase - */ - bool containsWholeWord (StringRef wordToLookFor) const noexcept; - - /** Tests whether the string contains another substring as a distinct word. - - @returns true if the string contains this word, surrounded by - non-alphanumeric characters - @see indexOfWholeWordIgnoreCase, containsWholeWord - */ - bool containsWholeWordIgnoreCase (StringRef wordToLookFor) const noexcept; - - /** Finds an instance of another substring if it exists as a distinct word. - - @returns if the string contains this word, surrounded by non-alphanumeric characters, - then this will return the index of the start of the substring. If it isn't - found, then it will return -1 - @see indexOfWholeWordIgnoreCase, containsWholeWord - */ - int indexOfWholeWord (StringRef wordToLookFor) const noexcept; - - /** Finds an instance of another substring if it exists as a distinct word. - - @returns if the string contains this word, surrounded by non-alphanumeric characters, - then this will return the index of the start of the substring. If it isn't - found, then it will return -1 - @see indexOfWholeWord, containsWholeWordIgnoreCase - */ - int indexOfWholeWordIgnoreCase (StringRef wordToLookFor) const noexcept; - - /** Looks for any of a set of characters in the string. - Uses a case-sensitive comparison. - - @returns true if the string contains any of the characters from - the string that is passed in. - */ - bool containsAnyOf (StringRef charactersItMightContain) const noexcept; - - /** Looks for a set of characters in the string. - Uses a case-sensitive comparison. - - @returns Returns false if any of the characters in this string do not occur in - the parameter string. If this string is empty, the return value will - always be true. - */ - bool containsOnly (StringRef charactersItMightContain) const noexcept; - - /** Returns true if this string contains any non-whitespace characters. - - This will return false if the string contains only whitespace characters, or - if it's empty. - - It is equivalent to calling "myString.trim().isNotEmpty()". - */ - bool containsNonWhitespaceChars() const noexcept; - - /** Returns true if the string matches this simple wildcard expression. - - So for example String ("abcdef").matchesWildcard ("*DEF", true) would return true. - - This isn't a full-blown regex though! The only wildcard characters supported - are "*" and "?". It's mainly intended for filename pattern matching. - */ - bool matchesWildcard (StringRef wildcard, bool ignoreCase) const noexcept; - - //============================================================================== - // Substring location methods.. - - /** Searches for a character inside this string. - Uses a case-sensitive comparison. - @returns the index of the first occurrence of the character in this - string, or -1 if it's not found. - */ - int indexOfChar (juce_wchar characterToLookFor) const noexcept; - - /** Searches for a character inside this string. - Uses a case-sensitive comparison. - @param startIndex the index from which the search should proceed - @param characterToLookFor the character to look for - @returns the index of the first occurrence of the character in this - string, or -1 if it's not found. - */ - int indexOfChar (int startIndex, juce_wchar characterToLookFor) const noexcept; - - /** Returns the index of the first character that matches one of the characters - passed-in to this method. - - This scans the string, beginning from the startIndex supplied, and if it finds - a character that appears in the string charactersToLookFor, it returns its index. - - If none of these characters are found, it returns -1. - - If ignoreCase is true, the comparison will be case-insensitive. - - @see indexOfChar, lastIndexOfAnyOf - */ - int indexOfAnyOf (StringRef charactersToLookFor, - int startIndex = 0, - bool ignoreCase = false) const noexcept; - - /** Searches for a substring within this string. - Uses a case-sensitive comparison. - @returns the index of the first occurrence of this substring, or -1 if it's not found. - If textToLookFor is an empty string, this will always return 0. - */ - int indexOf (StringRef textToLookFor) const noexcept; - - /** Searches for a substring within this string. - Uses a case-sensitive comparison. - @param startIndex the index from which the search should proceed - @param textToLookFor the string to search for - @returns the index of the first occurrence of this substring, or -1 if it's not found. - If textToLookFor is an empty string, this will always return -1. - */ - int indexOf (int startIndex, StringRef textToLookFor) const noexcept; - - /** Searches for a substring within this string. - Uses a case-insensitive comparison. - @returns the index of the first occurrence of this substring, or -1 if it's not found. - If textToLookFor is an empty string, this will always return 0. - */ - int indexOfIgnoreCase (StringRef textToLookFor) const noexcept; - - /** Searches for a substring within this string. - Uses a case-insensitive comparison. - @param startIndex the index from which the search should proceed - @param textToLookFor the string to search for - @returns the index of the first occurrence of this substring, or -1 if it's not found. - If textToLookFor is an empty string, this will always return -1. - */ - int indexOfIgnoreCase (int startIndex, StringRef textToLookFor) const noexcept; - - /** Searches for a character inside this string (working backwards from the end of the string). - Uses a case-sensitive comparison. - @returns the index of the last occurrence of the character in this string, or -1 if it's not found. - */ - int lastIndexOfChar (juce_wchar character) const noexcept; - - /** Searches for a substring inside this string (working backwards from the end of the string). - Uses a case-sensitive comparison. - @returns the index of the start of the last occurrence of the substring within this string, - or -1 if it's not found. If textToLookFor is an empty string, this will always return -1. - */ - int lastIndexOf (StringRef textToLookFor) const noexcept; - - /** Searches for a substring inside this string (working backwards from the end of the string). - Uses a case-insensitive comparison. - @returns the index of the start of the last occurrence of the substring within this string, or -1 - if it's not found. If textToLookFor is an empty string, this will always return -1. - */ - int lastIndexOfIgnoreCase (StringRef textToLookFor) const noexcept; - - /** Returns the index of the last character in this string that matches one of the - characters passed-in to this method. - - This scans the string backwards, starting from its end, and if it finds - a character that appears in the string charactersToLookFor, it returns its index. - - If none of these characters are found, it returns -1. - - If ignoreCase is true, the comparison will be case-insensitive. - - @see lastIndexOf, indexOfAnyOf - */ - int lastIndexOfAnyOf (StringRef charactersToLookFor, - bool ignoreCase = false) const noexcept; - - - //============================================================================== - // Substring extraction and manipulation methods.. - - /** Returns the character at this index in the string. - In a release build, no checks are made to see if the index is within a valid range, so be - careful! In a debug build, the index is checked and an assertion fires if it's out-of-range. - - Also beware that depending on the encoding format that the string is using internally, this - method may execute in either O(1) or O(n) time, so be careful when using it in your algorithms. - If you're scanning through a string to inspect its characters, you should never use this operator - for random access, it's far more efficient to call getCharPointer() to return a pointer, and - then to use that to iterate the string. - @see getCharPointer - */ - juce_wchar operator[] (int index) const noexcept; - - /** Returns the final character of the string. - If the string is empty this will return 0. - */ - juce_wchar getLastCharacter() const noexcept; - - //============================================================================== - /** Returns a subsection of the string. - - If the range specified is beyond the limits of the string, as much as - possible is returned. - - @param startIndex the index of the start of the substring needed - @param endIndex all characters from startIndex up to (but not including) - this index are returned - @see fromFirstOccurrenceOf, dropLastCharacters, getLastCharacters, upToFirstOccurrenceOf - */ - String substring (int startIndex, int endIndex) const; - - /** Returns a section of the string, starting from a given position. - - @param startIndex the first character to include. If this is beyond the end - of the string, an empty string is returned. If it is zero or - less, the whole string is returned. - @returns the substring from startIndex up to the end of the string - @see dropLastCharacters, getLastCharacters, fromFirstOccurrenceOf, upToFirstOccurrenceOf, fromLastOccurrenceOf - */ - String substring (int startIndex) const; - - /** Returns a version of this string with a number of characters removed - from the end. - - @param numberToDrop the number of characters to drop from the end of the - string. If this is greater than the length of the string, - an empty string will be returned. If zero or less, the - original string will be returned. - @see substring, fromFirstOccurrenceOf, upToFirstOccurrenceOf, fromLastOccurrenceOf, getLastCharacter - */ - String dropLastCharacters (int numberToDrop) const; - - /** Returns a number of characters from the end of the string. - - This returns the last numCharacters characters from the end of the string. If the - string is shorter than numCharacters, the whole string is returned. - - @see substring, dropLastCharacters, getLastCharacter - */ - String getLastCharacters (int numCharacters) const; - - //============================================================================== - /** Returns a section of the string starting from a given substring. - - This will search for the first occurrence of the given substring, and - return the section of the string starting from the point where this is - found (optionally not including the substring itself). - - e.g. for the string "123456", fromFirstOccurrenceOf ("34", true) would return "3456", and - fromFirstOccurrenceOf ("34", false) would return "56". - - If the substring isn't found, the method will return an empty string. - - If ignoreCase is true, the comparison will be case-insensitive. - - @see upToFirstOccurrenceOf, fromLastOccurrenceOf - */ - String fromFirstOccurrenceOf (StringRef substringToStartFrom, - bool includeSubStringInResult, - bool ignoreCase) const; - - /** Returns a section of the string starting from the last occurrence of a given substring. - - Similar to fromFirstOccurrenceOf(), but using the last occurrence of the substring, and - unlike fromFirstOccurrenceOf(), if the substring isn't found, this method will - return the whole of the original string. - - @see fromFirstOccurrenceOf, upToLastOccurrenceOf - */ - String fromLastOccurrenceOf (StringRef substringToFind, - bool includeSubStringInResult, - bool ignoreCase) const; - - /** Returns the start of this string, up to the first occurrence of a substring. - - This will search for the first occurrence of a given substring, and then - return a copy of the string, up to the position of this substring, - optionally including or excluding the substring itself in the result. - - e.g. for the string "123456", upTo ("34", false) would return "12", and - upTo ("34", true) would return "1234". - - If the substring isn't found, this will return the whole of the original string. - - @see upToLastOccurrenceOf, fromFirstOccurrenceOf - */ - String upToFirstOccurrenceOf (StringRef substringToEndWith, - bool includeSubStringInResult, - bool ignoreCase) const; - - /** Returns the start of this string, up to the last occurrence of a substring. - - Similar to upToFirstOccurrenceOf(), but this finds the last occurrence rather than the first. - If the substring isn't found, this will return the whole of the original string. - - @see upToFirstOccurrenceOf, fromFirstOccurrenceOf - */ - String upToLastOccurrenceOf (StringRef substringToFind, - bool includeSubStringInResult, - bool ignoreCase) const; - - //============================================================================== - /** Returns a copy of this string with any whitespace characters removed from the start and end. */ - String trim() const; - - /** Returns a copy of this string with any whitespace characters removed from the start. */ - String trimStart() const; - - /** Returns a copy of this string with any whitespace characters removed from the end. */ - String trimEnd() const; - - /** Returns a copy of this string, having removed a specified set of characters from its start. - Characters are removed from the start of the string until it finds one that is not in the - specified set, and then it stops. - @param charactersToTrim the set of characters to remove. - @see trim, trimStart, trimCharactersAtEnd - */ - String trimCharactersAtStart (StringRef charactersToTrim) const; - - /** Returns a copy of this string, having removed a specified set of characters from its end. - Characters are removed from the end of the string until it finds one that is not in the - specified set, and then it stops. - @param charactersToTrim the set of characters to remove. - @see trim, trimEnd, trimCharactersAtStart - */ - String trimCharactersAtEnd (StringRef charactersToTrim) const; - - //============================================================================== - /** Returns an upper-case version of this string. */ - String toUpperCase() const; - - /** Returns an lower-case version of this string. */ - String toLowerCase() const; - - //============================================================================== - /** Replaces a sub-section of the string with another string. - - This will return a copy of this string, with a set of characters - from startIndex to startIndex + numCharsToReplace removed, and with - a new string inserted in their place. - - Note that this is a const method, and won't alter the string itself. - - @param startIndex the first character to remove. If this is beyond the bounds of the string, - it will be constrained to a valid range. - @param numCharactersToReplace the number of characters to remove. If zero or less, no - characters will be taken out. - @param stringToInsert the new string to insert at startIndex after the characters have been - removed. - */ - String replaceSection (int startIndex, - int numCharactersToReplace, - StringRef stringToInsert) const; - - /** Replaces all occurrences of a substring with another string. - - Returns a copy of this string, with any occurrences of stringToReplace - swapped for stringToInsertInstead. - - Note that this is a const method, and won't alter the string itself. - */ - String replace (StringRef stringToReplace, - StringRef stringToInsertInstead, - bool ignoreCase = false) const; - - /** Returns a string with all occurrences of a character replaced with a different one. */ - String replaceCharacter (juce_wchar characterToReplace, - juce_wchar characterToInsertInstead) const; - - /** Replaces a set of characters with another set. - - Returns a string in which each character from charactersToReplace has been replaced - by the character at the equivalent position in newCharacters (so the two strings - passed in must be the same length). - - e.g. replaceCharacters ("abc", "def") replaces 'a' with 'd', 'b' with 'e', etc. - - Note that this is a const method, and won't affect the string itself. - */ - String replaceCharacters (StringRef charactersToReplace, - StringRef charactersToInsertInstead) const; - - /** Returns a version of this string that only retains a fixed set of characters. - - This will return a copy of this string, omitting any characters which are not - found in the string passed-in. - - e.g. for "1122334455", retainCharacters ("432") would return "223344" - - Note that this is a const method, and won't alter the string itself. - */ - String retainCharacters (StringRef charactersToRetain) const; - - /** Returns a version of this string with a set of characters removed. - - This will return a copy of this string, omitting any characters which are - found in the string passed-in. - - e.g. for "1122334455", removeCharacters ("432") would return "1155" - - Note that this is a const method, and won't alter the string itself. - */ - String removeCharacters (StringRef charactersToRemove) const; - - /** Returns a section from the start of the string that only contains a certain set of characters. - - This returns the leftmost section of the string, up to (and not including) the - first character that doesn't appear in the string passed in. - */ - String initialSectionContainingOnly (StringRef permittedCharacters) const; - - /** Returns a section from the start of the string that only contains a certain set of characters. - - This returns the leftmost section of the string, up to (and not including) the - first character that occurs in the string passed in. (If none of the specified - characters are found in the string, the return value will just be the original string). - */ - String initialSectionNotContaining (StringRef charactersToStopAt) const; - - //============================================================================== - /** Checks whether the string might be in quotation marks. - - @returns true if the string begins with a quote character (either a double or single quote). - It is also true if there is whitespace before the quote, but it doesn't check the end of the string. - @see unquoted, quoted - */ - bool isQuotedString() const; - - /** Removes quotation marks from around the string, (if there are any). - - Returns a copy of this string with any quotes removed from its ends. Quotes that aren't - at the ends of the string are not affected. If there aren't any quotes, the original string - is returned. - - Note that this is a const method, and won't alter the string itself. - - @see isQuotedString, quoted - */ - String unquoted() const; - - /** Adds quotation marks around a string. - - This will return a copy of the string with a quote at the start and end, (but won't - add the quote if there's already one there, so it's safe to call this on strings that - may already have quotes around them). - - Note that this is a const method, and won't alter the string itself. - - @param quoteCharacter the character to add at the start and end - @see isQuotedString, unquoted - */ - String quoted (juce_wchar quoteCharacter = '"') const; - - - //============================================================================== - /** Creates a string which is a version of a string repeated and joined together. - - @param stringToRepeat the string to repeat - @param numberOfTimesToRepeat how many times to repeat it - */ - static String repeatedString (StringRef stringToRepeat, - int numberOfTimesToRepeat); - - /** Returns a copy of this string with the specified character repeatedly added to its - beginning until the total length is at least the minimum length specified. - */ - String paddedLeft (juce_wchar padCharacter, int minimumLength) const; - - /** Returns a copy of this string with the specified character repeatedly added to its - end until the total length is at least the minimum length specified. - */ - String paddedRight (juce_wchar padCharacter, int minimumLength) const; - - /** Creates a string from data in an unknown format. - - This looks at some binary data and tries to guess whether it's Unicode - or 8-bit characters, then returns a string that represents it correctly. - - Should be able to handle Unicode endianness correctly, by looking at - the first two bytes. - */ - static String createStringFromData (const void* data, int size); - - /** Creates a String from a printf-style parameter list. - - I don't like this method. I don't use it myself, and I recommend avoiding it and - using the operator<< methods or pretty much anything else instead. It's only provided - here because of the popular unrest that was stirred-up when I tried to remove it... - - If you're really determined to use it, at least make sure that you never, ever, - pass any String objects to it as parameters. And bear in mind that internally, depending - on the platform, it may be using wchar_t or char character types, so that even string - literals can't be safely used as parameters if you're writing portable code. - */ - static String formatted (const String formatString, ... ); - - //============================================================================== - // Numeric conversions.. - - /** Creates a string containing this signed 32-bit integer as a decimal number. - @see getIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (int decimalInteger); - - /** Creates a string containing this unsigned 32-bit integer as a decimal number. - @see getIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (unsigned int decimalInteger); - - /** Creates a string containing this signed 16-bit integer as a decimal number. - @see getIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (short decimalInteger); - - /** Creates a string containing this unsigned 16-bit integer as a decimal number. - @see getIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (unsigned short decimalInteger); - - /** Creates a string containing this signed 64-bit integer as a decimal number. - @see getLargeIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (int64 largeIntegerValue); - - /** Creates a string containing this unsigned 64-bit integer as a decimal number. - @see getLargeIntValue, getFloatValue, getDoubleValue, toHexString - */ - explicit String (uint64 largeIntegerValue); - - /** Creates a string representing this floating-point number. - @param floatValue the value to convert to a string - @see getDoubleValue, getIntValue - */ - explicit String (float floatValue); - - /** Creates a string representing this floating-point number. - @param doubleValue the value to convert to a string - @see getFloatValue, getIntValue - */ - explicit String (double doubleValue); - - /** Creates a string representing this floating-point number. - @param floatValue the value to convert to a string - @param numberOfDecimalPlaces if this is > 0, it will format the number using that many - decimal places, and will not use exponent notation. If 0 or - less, it will use exponent notation if necessary. - @see getDoubleValue, getIntValue - */ - String (float floatValue, int numberOfDecimalPlaces); - - /** Creates a string representing this floating-point number. - @param doubleValue the value to convert to a string - @param numberOfDecimalPlaces if this is > 0, it will format the number using that many - decimal places, and will not use exponent notation. If 0 or - less, it will use exponent notation if necessary. - @see getFloatValue, getIntValue - */ - String (double doubleValue, int numberOfDecimalPlaces); - - /** Reads the value of the string as a decimal number (up to 32 bits in size). - - @returns the value of the string as a 32 bit signed base-10 integer. - @see getTrailingIntValue, getHexValue32, getHexValue64 - */ - int getIntValue() const noexcept; - - /** Reads the value of the string as a decimal number (up to 64 bits in size). - @returns the value of the string as a 64 bit signed base-10 integer. - */ - int64 getLargeIntValue() const noexcept; - - /** Parses a decimal number from the end of the string. - - This will look for a value at the end of the string. - e.g. for "321 xyz654" it will return 654; for "2 3 4" it'll return 4. - - Negative numbers are not handled, so "xyz-5" returns 5. - - @see getIntValue - */ - int getTrailingIntValue() const noexcept; - - /** Parses this string as a floating point number. - - @returns the value of the string as a 32-bit floating point value. - @see getDoubleValue - */ - float getFloatValue() const noexcept; - - /** Parses this string as a floating point number. - - @returns the value of the string as a 64-bit floating point value. - @see getFloatValue - */ - double getDoubleValue() const noexcept; - - /** Parses the string as a hexadecimal number. - - Non-hexadecimal characters in the string are ignored. - - If the string contains too many characters, then the lowest significant - digits are returned, e.g. "ffff12345678" would produce 0x12345678. - - @returns a 32-bit number which is the value of the string in hex. - */ - int getHexValue32() const noexcept; - - /** Parses the string as a hexadecimal number. - - Non-hexadecimal characters in the string are ignored. - - If the string contains too many characters, then the lowest significant - digits are returned, e.g. "ffff1234567812345678" would produce 0x1234567812345678. - - @returns a 64-bit number which is the value of the string in hex. - */ - int64 getHexValue64() const noexcept; - - /** Creates a string representing this 32-bit value in hexadecimal. */ - static String toHexString (int number); - - /** Creates a string representing this 64-bit value in hexadecimal. */ - static String toHexString (int64 number); - - /** Creates a string representing this 16-bit value in hexadecimal. */ - static String toHexString (short number); - - /** Creates a string containing a hex dump of a block of binary data. - - @param data the binary data to use as input - @param size how many bytes of data to use - @param groupSize how many bytes are grouped together before inserting a - space into the output. e.g. group size 0 has no spaces, - group size 1 looks like: "be a1 c2 ff", group size 2 looks - like "bea1 c2ff". - */ - static String toHexString (const void* data, int size, int groupSize = 1); - - //============================================================================== - /** Returns the character pointer currently being used to store this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - */ - inline CharPointerType getCharPointer() const noexcept { return text; } - - /** Returns a pointer to a UTF-8 version of this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - - To find out how many bytes you need to store this string as UTF-8, you can call - CharPointer_UTF8::getBytesRequiredFor (myString.getCharPointer()) - - @see toRawUTF8, getCharPointer, toUTF16, toUTF32 - */ - CharPointer_UTF8 toUTF8() const; - - /** Returns a pointer to a UTF-8 version of this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - - To find out how many bytes you need to store this string as UTF-8, you can call - CharPointer_UTF8::getBytesRequiredFor (myString.getCharPointer()) - - @see getCharPointer, toUTF8, toUTF16, toUTF32 - */ - const char* toRawUTF8() const; - - /** Returns a pointer to a UTF-16 version of this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - - To find out how many bytes you need to store this string as UTF-16, you can call - CharPointer_UTF16::getBytesRequiredFor (myString.getCharPointer()) - - @see getCharPointer, toUTF8, toUTF32 - */ - CharPointer_UTF16 toUTF16() const; - - /** Returns a pointer to a UTF-32 version of this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - - @see getCharPointer, toUTF8, toUTF16 - */ - CharPointer_UTF32 toUTF32() const; - - /** Returns a pointer to a wchar_t version of this string. - - Because it returns a reference to the string's internal data, the pointer - that is returned must not be stored anywhere, as it can be deleted whenever the - string changes. - - Bear in mind that the wchar_t type is different on different platforms, so on - Windows, this will be equivalent to calling toUTF16(), on unix it'll be the same - as calling toUTF32(), etc. - - @see getCharPointer, toUTF8, toUTF16, toUTF32 - */ - const wchar_t* toWideCharPointer() const; - - /** */ - std::string toStdString() const; - - //============================================================================== - /** Creates a String from a UTF-8 encoded buffer. - If the size is < 0, it'll keep reading until it hits a zero. - */ - static String fromUTF8 (const char* utf8buffer, int bufferSizeBytes = -1); - - /** Returns the number of bytes required to represent this string as UTF8. - The number returned does NOT include the trailing zero. - @see toUTF8, copyToUTF8 - */ - size_t getNumBytesAsUTF8() const noexcept; - - //============================================================================== - /** Copies the string to a buffer as UTF-8 characters. - - Returns the number of bytes copied to the buffer, including the terminating null - character. - - To find out how many bytes you need to store this string as UTF-8, you can call - CharPointer_UTF8::getBytesRequiredFor (myString.getCharPointer()) - - @param destBuffer the place to copy it to; if this is a null pointer, the method just - returns the number of bytes required (including the terminating null character). - @param maxBufferSizeBytes the size of the destination buffer, in bytes. If the string won't fit, it'll - put in as many as it can while still allowing for a terminating null char at the - end, and will return the number of bytes that were actually used. - @see CharPointer_UTF8::writeWithDestByteLimit - */ - size_t copyToUTF8 (CharPointer_UTF8::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept; - - /** Copies the string to a buffer as UTF-16 characters. - - Returns the number of bytes copied to the buffer, including the terminating null - character. - - To find out how many bytes you need to store this string as UTF-16, you can call - CharPointer_UTF16::getBytesRequiredFor (myString.getCharPointer()) - - @param destBuffer the place to copy it to; if this is a null pointer, the method just - returns the number of bytes required (including the terminating null character). - @param maxBufferSizeBytes the size of the destination buffer, in bytes. If the string won't fit, it'll - put in as many as it can while still allowing for a terminating null char at the - end, and will return the number of bytes that were actually used. - @see CharPointer_UTF16::writeWithDestByteLimit - */ - size_t copyToUTF16 (CharPointer_UTF16::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept; - - /** Copies the string to a buffer as UTF-32 characters. - - Returns the number of bytes copied to the buffer, including the terminating null - character. - - To find out how many bytes you need to store this string as UTF-32, you can call - CharPointer_UTF32::getBytesRequiredFor (myString.getCharPointer()) - - @param destBuffer the place to copy it to; if this is a null pointer, the method just - returns the number of bytes required (including the terminating null character). - @param maxBufferSizeBytes the size of the destination buffer, in bytes. If the string won't fit, it'll - put in as many as it can while still allowing for a terminating null char at the - end, and will return the number of bytes that were actually used. - @see CharPointer_UTF32::writeWithDestByteLimit - */ - size_t copyToUTF32 (CharPointer_UTF32::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept; - - //============================================================================== - /** Increases the string's internally allocated storage. - - Although the string's contents won't be affected by this call, it will - increase the amount of memory allocated internally for the string to grow into. - - If you're about to make a large number of calls to methods such - as += or <<, it's more efficient to preallocate enough extra space - beforehand, so that these methods won't have to keep resizing the string - to append the extra characters. - - @param numBytesNeeded the number of bytes to allocate storage for. If this - value is less than the currently allocated size, it will - have no effect. - */ - void preallocateBytes (size_t numBytesNeeded); - - /** Swaps the contents of this string with another one. - This is a very fast operation, as no allocation or copying needs to be done. - */ - void swapWith (String& other) noexcept; - - //============================================================================== - #if JUCE_MAC || JUCE_IOS || DOXYGEN - /** OSX ONLY - Creates a String from an OSX CFString. */ - static String fromCFString (CFStringRef cfString); - - /** OSX ONLY - Converts this string to a CFString. - Remember that you must use CFRelease() to free the returned string when you're - finished with it. - */ - CFStringRef toCFString() const; - - /** OSX ONLY - Returns a copy of this string in which any decomposed unicode characters have - been converted to their precomposed equivalents. */ - String convertToPrecomposedUnicode() const; - #endif - - /** Returns the number of String objects which are currently sharing the same internal - data as this one. - */ - int getReferenceCount() const noexcept; - -private: - //============================================================================== - CharPointerType text; - - //============================================================================== - struct PreallocationBytes - { - explicit PreallocationBytes (size_t) noexcept; - size_t numBytes; - }; - - explicit String (const PreallocationBytes&); // This constructor preallocates a certain amount of memory - size_t getByteOffsetOfEnd() const noexcept; - JUCE_DEPRECATED (String (const String&, size_t)); - - // This private cast operator should prevent strings being accidentally cast - // to bools (this is possible because the compiler can add an implicit cast - // via a const char*) - operator bool() const noexcept { return false; } -}; - -//============================================================================== -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (const char* string1, const String& string2); -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (const wchar_t* string1, const String& string2); -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (char string1, const String& string2); -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (wchar_t string1, const String& string2); -#if ! JUCE_NATIVE_WCHAR_IS_UTF32 -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (juce_wchar string1, const String& string2); -#endif - -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (String string1, const String& string2); -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (String string1, const char* string2); -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (String string1, const wchar_t* string2); -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (String string1, char characterToAppend); -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (String string1, wchar_t characterToAppend); -#if ! JUCE_NATIVE_WCHAR_IS_UTF32 -/** Concatenates two strings. */ -JUCE_API String JUCE_CALLTYPE operator+ (String string1, juce_wchar characterToAppend); -#endif - -//============================================================================== -/** Appends a character at the end of a string. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, char characterToAppend); -/** Appends a character at the end of a string. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, wchar_t characterToAppend); -#if ! JUCE_NATIVE_WCHAR_IS_UTF32 -/** Appends a character at the end of a string. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, juce_wchar characterToAppend); -#endif - -/** Appends a string to the end of the first one. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const char* string2); -/** Appends a string to the end of the first one. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const wchar_t* string2); -/** Appends a string to the end of the first one. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const String& string2); - -/** Appends a decimal number at the end of a string. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, short number); -/** Appends a decimal number at the end of a string. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, int number); -/** Appends a decimal number at the end of a string. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, long number); -/** Appends a decimal number at the end of a string. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, int64 number); -/** Appends a decimal number at the end of a string. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, uint64 number); -/** Appends a decimal number at the end of a string. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, float number); -/** Appends a decimal number at the end of a string. */ -JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, double number); - -//============================================================================== -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const String& string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const char* string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const wchar_t* string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const CharPointer_UTF8 string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const CharPointer_UTF16 string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const CharPointer_UTF32 string2) noexcept; - -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const String& string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const char* string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const wchar_t* string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const CharPointer_UTF8 string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const CharPointer_UTF16 string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const CharPointer_UTF32 string2) noexcept; - -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator> (const String& string1, const String& string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator< (const String& string1, const String& string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator>= (const String& string1, const String& string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator<= (const String& string1, const String& string2) noexcept; - -//============================================================================== -/** This operator allows you to write a juce String directly to std output streams. - This is handy for writing strings to std::cout, std::cerr, etc. -*/ -template -std::basic_ostream & JUCE_CALLTYPE operator<< (std::basic_ostream & stream, const String& stringToWrite) -{ - return stream << stringToWrite.toRawUTF8(); -} - -/** This operator allows you to write a juce String directly to std output streams. - This is handy for writing strings to std::wcout, std::wcerr, etc. -*/ -template -std::basic_ostream & JUCE_CALLTYPE operator<< (std::basic_ostream & stream, const String& stringToWrite) -{ - return stream << stringToWrite.toWideCharPointer(); -} - -/** Writes a string to an OutputStream as UTF8. */ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const String& stringToWrite); - -/** Writes a string to an OutputStream as UTF8. */ -JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, StringRef stringToWrite); - - -#endif // JUCE_STRING_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp b/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp deleted file mode 100755 index 05311ff..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringArray.cpp +++ /dev/null @@ -1,492 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -StringArray::StringArray() noexcept -{ -} - -StringArray::StringArray (const StringArray& other) - : strings (other.strings) -{ -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -StringArray::StringArray (StringArray&& other) noexcept - : strings (static_cast &&> (other.strings)) -{ -} -#endif - -StringArray::StringArray (const String& firstValue) -{ - strings.add (firstValue); -} - -StringArray::StringArray (const String* initialStrings, int numberOfStrings) -{ - strings.addArray (initialStrings, numberOfStrings); -} - -StringArray::StringArray (const char* const* initialStrings) -{ - strings.addNullTerminatedArray (initialStrings); -} - -StringArray::StringArray (const char* const* initialStrings, int numberOfStrings) -{ - strings.addArray (initialStrings, numberOfStrings); -} - -StringArray::StringArray (const wchar_t* const* initialStrings) -{ - strings.addNullTerminatedArray (initialStrings); -} - -StringArray::StringArray (const wchar_t* const* initialStrings, int numberOfStrings) -{ - strings.addArray (initialStrings, numberOfStrings); -} - -StringArray& StringArray::operator= (const StringArray& other) -{ - strings = other.strings; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -StringArray& StringArray::operator= (StringArray&& other) noexcept -{ - strings = static_cast &&> (other.strings); - return *this; -} -#endif - -#if JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS -StringArray::StringArray (const std::initializer_list& stringList) -{ - strings.addArray (stringList); -} -#endif - -StringArray::~StringArray() -{ -} - -bool StringArray::operator== (const StringArray& other) const noexcept -{ - return strings == other.strings; -} - -bool StringArray::operator!= (const StringArray& other) const noexcept -{ - return ! operator== (other); -} - -void StringArray::swapWith (StringArray& other) noexcept -{ - strings.swapWith (other.strings); -} - -void StringArray::clear() -{ - strings.clear(); -} - -void StringArray::clearQuick() -{ - strings.clearQuick(); -} - -const String& StringArray::operator[] (const int index) const noexcept -{ - if (isPositiveAndBelow (index, strings.size())) - return strings.getReference (index); - - return String::empty; -} - -String& StringArray::getReference (const int index) noexcept -{ - return strings.getReference (index); -} - -void StringArray::add (const String& newString) -{ - strings.add (newString); -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -void StringArray::add (String&& stringToAdd) -{ - strings.add (static_cast (stringToAdd)); -} -#endif - -void StringArray::insert (const int index, const String& newString) -{ - strings.insert (index, newString); -} - -void StringArray::addIfNotAlreadyThere (const String& newString, const bool ignoreCase) -{ - if (! contains (newString, ignoreCase)) - add (newString); -} - -void StringArray::addArray (const StringArray& otherArray, int startIndex, int numElementsToAdd) -{ - if (startIndex < 0) - { - jassertfalse; - startIndex = 0; - } - - if (numElementsToAdd < 0 || startIndex + numElementsToAdd > otherArray.size()) - numElementsToAdd = otherArray.size() - startIndex; - - while (--numElementsToAdd >= 0) - strings.add (otherArray.strings.getReference (startIndex++)); -} - -void StringArray::set (const int index, const String& newString) -{ - strings.set (index, newString); -} - -bool StringArray::contains (StringRef stringToLookFor, const bool ignoreCase) const -{ - return indexOf (stringToLookFor, ignoreCase) >= 0; -} - -int StringArray::indexOf (StringRef stringToLookFor, const bool ignoreCase, int i) const -{ - if (i < 0) - i = 0; - - const int numElements = size(); - - if (ignoreCase) - { - for (; i < numElements; ++i) - if (strings.getReference(i).equalsIgnoreCase (stringToLookFor)) - return i; - } - else - { - for (; i < numElements; ++i) - if (stringToLookFor == strings.getReference (i)) - return i; - } - - return -1; -} - -void StringArray::move (const int currentIndex, const int newIndex) noexcept -{ - strings.move (currentIndex, newIndex); -} - -//============================================================================== -void StringArray::remove (const int index) -{ - strings.remove (index); -} - -void StringArray::removeString (StringRef stringToRemove, const bool ignoreCase) -{ - if (ignoreCase) - { - for (int i = size(); --i >= 0;) - if (strings.getReference(i).equalsIgnoreCase (stringToRemove)) - strings.remove (i); - } - else - { - for (int i = size(); --i >= 0;) - if (stringToRemove == strings.getReference (i)) - strings.remove (i); - } -} - -void StringArray::removeRange (int startIndex, int numberToRemove) -{ - strings.removeRange (startIndex, numberToRemove); -} - -//============================================================================== -void StringArray::removeEmptyStrings (const bool removeWhitespaceStrings) -{ - if (removeWhitespaceStrings) - { - for (int i = size(); --i >= 0;) - if (! strings.getReference(i).containsNonWhitespaceChars()) - strings.remove (i); - } - else - { - for (int i = size(); --i >= 0;) - if (strings.getReference(i).isEmpty()) - strings.remove (i); - } -} - -void StringArray::trim() -{ - for (int i = size(); --i >= 0;) - { - String& s = strings.getReference(i); - s = s.trim(); - } -} - -//============================================================================== -struct InternalStringArrayComparator_CaseSensitive -{ - static int compareElements (String& s1, String& s2) noexcept { return s1.compare (s2); } -}; - -struct InternalStringArrayComparator_CaseInsensitive -{ - static int compareElements (String& s1, String& s2) noexcept { return s1.compareIgnoreCase (s2); } -}; - -struct InternalStringArrayComparator_Natural -{ - static int compareElements (String& s1, String& s2) noexcept { return s1.compareNatural (s2); } -}; - -void StringArray::sort (const bool ignoreCase) -{ - if (ignoreCase) - { - InternalStringArrayComparator_CaseInsensitive comp; - strings.sort (comp); - } - else - { - InternalStringArrayComparator_CaseSensitive comp; - strings.sort (comp); - } -} - -void StringArray::sortNatural() -{ - InternalStringArrayComparator_Natural comp; - strings.sort (comp); -} - -//============================================================================== -String StringArray::joinIntoString (StringRef separator, int start, int numberToJoin) const -{ - const int last = (numberToJoin < 0) ? size() - : jmin (size(), start + numberToJoin); - - if (start < 0) - start = 0; - - if (start >= last) - return String(); - - if (start == last - 1) - return strings.getReference (start); - - const size_t separatorBytes = separator.text.sizeInBytes() - sizeof (String::CharPointerType::CharType); - size_t bytesNeeded = separatorBytes * (size_t) (last - start - 1); - - for (int i = start; i < last; ++i) - bytesNeeded += strings.getReference(i).getCharPointer().sizeInBytes() - sizeof (String::CharPointerType::CharType); - - String result; - result.preallocateBytes (bytesNeeded); - - String::CharPointerType dest (result.getCharPointer()); - - while (start < last) - { - const String& s = strings.getReference (start); - - if (! s.isEmpty()) - dest.writeAll (s.getCharPointer()); - - if (++start < last && separatorBytes > 0) - dest.writeAll (separator.text); - } - - dest.writeNull(); - - return result; -} - -int StringArray::addTokens (StringRef text, const bool preserveQuotedStrings) -{ - return addTokens (text, " \n\r\t", preserveQuotedStrings ? "\"" : ""); -} - -int StringArray::addTokens (StringRef text, StringRef breakCharacters, StringRef quoteCharacters) -{ - int num = 0; - - if (text.isNotEmpty()) - { - for (String::CharPointerType t (text.text);;) - { - String::CharPointerType tokenEnd (CharacterFunctions::findEndOfToken (t, - breakCharacters.text, - quoteCharacters.text)); - strings.add (String (t, tokenEnd)); - ++num; - - if (tokenEnd.isEmpty()) - break; - - t = ++tokenEnd; - } - } - - return num; -} - -int StringArray::addLines (StringRef sourceText) -{ - int numLines = 0; - String::CharPointerType text (sourceText.text); - bool finished = text.isEmpty(); - - while (! finished) - { - for (String::CharPointerType startOfLine (text);;) - { - const String::CharPointerType endOfLine (text); - - switch (text.getAndAdvance()) - { - case 0: finished = true; break; - case '\n': break; - case '\r': if (*text == '\n') ++text; break; - default: continue; - } - - strings.add (String (startOfLine, endOfLine)); - ++numLines; - break; - } - } - - return numLines; -} - -StringArray StringArray::fromTokens (StringRef stringToTokenise, bool preserveQuotedStrings) -{ - StringArray s; - s.addTokens (stringToTokenise, preserveQuotedStrings); - return s; -} - -StringArray StringArray::fromTokens (StringRef stringToTokenise, - StringRef breakCharacters, - StringRef quoteCharacters) -{ - StringArray s; - s.addTokens (stringToTokenise, breakCharacters, quoteCharacters); - return s; -} - -StringArray StringArray::fromLines (StringRef stringToBreakUp) -{ - StringArray s; - s.addLines (stringToBreakUp); - return s; -} - -//============================================================================== -void StringArray::removeDuplicates (const bool ignoreCase) -{ - for (int i = 0; i < size() - 1; ++i) - { - const String s (strings.getReference(i)); - - for (int nextIndex = i + 1;;) - { - nextIndex = indexOf (s, ignoreCase, nextIndex); - - if (nextIndex < 0) - break; - - strings.remove (nextIndex); - } - } -} - -void StringArray::appendNumbersToDuplicates (const bool ignoreCase, - const bool appendNumberToFirstInstance, - CharPointer_UTF8 preNumberString, - CharPointer_UTF8 postNumberString) -{ - CharPointer_UTF8 defaultPre (" ("), defaultPost (")"); - - if (preNumberString.getAddress() == nullptr) - preNumberString = defaultPre; - - if (postNumberString.getAddress() == nullptr) - postNumberString = defaultPost; - - for (int i = 0; i < size() - 1; ++i) - { - String& s = strings.getReference(i); - - int nextIndex = indexOf (s, ignoreCase, i + 1); - - if (nextIndex >= 0) - { - const String original (s); - - int number = 0; - - if (appendNumberToFirstInstance) - s = original + String (preNumberString) + String (++number) + String (postNumberString); - else - ++number; - - while (nextIndex >= 0) - { - set (nextIndex, (*this)[nextIndex] + String (preNumberString) + String (++number) + String (postNumberString)); - nextIndex = indexOf (original, ignoreCase, nextIndex + 1); - } - } - } -} - -void StringArray::ensureStorageAllocated (int minNumElements) -{ - strings.ensureStorageAllocated (minNumElements); -} - -void StringArray::minimiseStorageOverheads() -{ - strings.minimiseStorageOverheads(); -} diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h b/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h deleted file mode 100755 index c3a1a17..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringArray.h +++ /dev/null @@ -1,425 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_STRINGARRAY_H_INCLUDED -#define JUCE_STRINGARRAY_H_INCLUDED - - -//============================================================================== -/** - A special array for holding a list of strings. - - @see String, StringPairArray -*/ -class JUCE_API StringArray -{ -public: - //============================================================================== - /** Creates an empty string array */ - StringArray() noexcept; - - /** Creates a copy of another string array */ - StringArray (const StringArray&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - StringArray (StringArray&&) noexcept; - #endif - - /** Creates an array containing a single string. */ - explicit StringArray (const String& firstValue); - - /** Creates an array from a raw array of strings. - @param strings an array of strings to add - @param numberOfStrings how many items there are in the array - */ - StringArray (const String* strings, int numberOfStrings); - - /** Creates a copy of an array of string literals. - @param strings an array of strings to add. Null pointers in the array will be - treated as empty strings - @param numberOfStrings how many items there are in the array - */ - StringArray (const char* const* strings, int numberOfStrings); - - /** Creates a copy of a null-terminated array of string literals. - - Each item from the array passed-in is added, until it encounters a null pointer, - at which point it stops. - */ - explicit StringArray (const char* const* strings); - - /** Creates a copy of a null-terminated array of string literals. - Each item from the array passed-in is added, until it encounters a null pointer, - at which point it stops. - */ - explicit StringArray (const wchar_t* const* strings); - - /** Creates a copy of an array of string literals. - @param strings an array of strings to add. Null pointers in the array will be - treated as empty strings - @param numberOfStrings how many items there are in the array - */ - StringArray (const wchar_t* const* strings, int numberOfStrings); - - #if JUCE_COMPILER_SUPPORTS_INITIALIZER_LISTS - StringArray (const std::initializer_list& strings); - #endif - - /** Destructor. */ - ~StringArray(); - - /** Copies the contents of another string array into this one */ - StringArray& operator= (const StringArray&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - StringArray& operator= (StringArray&&) noexcept; - #endif - - /** Swaps the contents of this and another StringArray. */ - void swapWith (StringArray&) noexcept; - - //============================================================================== - /** Compares two arrays. - Comparisons are case-sensitive. - @returns true only if the other array contains exactly the same strings in the same order - */ - bool operator== (const StringArray&) const noexcept; - - /** Compares two arrays. - Comparisons are case-sensitive. - @returns false if the other array contains exactly the same strings in the same order - */ - bool operator!= (const StringArray&) const noexcept; - - //============================================================================== - /** Returns the number of strings in the array */ - inline int size() const noexcept { return strings.size(); }; - - /** Returns one of the strings from the array. - - If the index is out-of-range, an empty string is returned. - - Obviously the reference returned shouldn't be stored for later use, as the - string it refers to may disappear when the array changes. - */ - const String& operator[] (int index) const noexcept; - - /** Returns a reference to one of the strings in the array. - This lets you modify a string in-place in the array, but you must be sure that - the index is in-range. - */ - String& getReference (int index) noexcept; - - /** Returns a pointer to the first String in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline String* begin() const noexcept { return strings.begin(); } - - /** Returns a pointer to the String which follows the last element in the array. - This method is provided for compatibility with standard C++ iteration mechanisms. - */ - inline String* end() const noexcept { return strings.end(); } - - /** Searches for a string in the array. - - The comparison will be case-insensitive if the ignoreCase parameter is true. - - @returns true if the string is found inside the array - */ - bool contains (StringRef stringToLookFor, - bool ignoreCase = false) const; - - /** Searches for a string in the array. - - The comparison will be case-insensitive if the ignoreCase parameter is true. - - @param stringToLookFor the string to try to find - @param ignoreCase whether the comparison should be case-insensitive - @param startIndex the first index to start searching from - @returns the index of the first occurrence of the string in this array, - or -1 if it isn't found. - */ - int indexOf (StringRef stringToLookFor, - bool ignoreCase = false, - int startIndex = 0) const; - - //============================================================================== - /** Appends a string at the end of the array. */ - void add (const String& stringToAdd); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - /** Appends a string at the end of the array. */ - void add (String&& stringToAdd); - #endif - - /** Inserts a string into the array. - - This will insert a string into the array at the given index, moving - up the other elements to make room for it. - If the index is less than zero or greater than the size of the array, - the new string will be added to the end of the array. - */ - void insert (int index, const String& stringToAdd); - - /** Adds a string to the array as long as it's not already in there. - The search can optionally be case-insensitive. - */ - void addIfNotAlreadyThere (const String& stringToAdd, bool ignoreCase = false); - - /** Replaces one of the strings in the array with another one. - - If the index is higher than the array's size, the new string will be - added to the end of the array; if it's less than zero nothing happens. - */ - void set (int index, const String& newString); - - /** Appends some strings from another array to the end of this one. - - @param other the array to add - @param startIndex the first element of the other array to add - @param numElementsToAdd the maximum number of elements to add (if this is - less than zero, they are all added) - */ - void addArray (const StringArray& other, - int startIndex = 0, - int numElementsToAdd = -1); - - /** Breaks up a string into tokens and adds them to this array. - - This will tokenise the given string using whitespace characters as the - token delimiters, and will add these tokens to the end of the array. - @returns the number of tokens added - @see fromTokens - */ - int addTokens (StringRef stringToTokenise, bool preserveQuotedStrings); - - /** Breaks up a string into tokens and adds them to this array. - - This will tokenise the given string (using the string passed in to define the - token delimiters), and will add these tokens to the end of the array. - - @param stringToTokenise the string to tokenise - @param breakCharacters a string of characters, any of which will be considered - to be a token delimiter. - @param quoteCharacters if this string isn't empty, it defines a set of characters - which are treated as quotes. Any text occurring - between quotes is not broken up into tokens. - @returns the number of tokens added - @see fromTokens - */ - int addTokens (StringRef stringToTokenise, - StringRef breakCharacters, - StringRef quoteCharacters); - - /** Breaks up a string into lines and adds them to this array. - - This breaks a string down into lines separated by \\n or \\r\\n, and adds each line - to the array. Line-break characters are omitted from the strings that are added to - the array. - */ - int addLines (StringRef stringToBreakUp); - - /** Returns an array containing the tokens in a given string. - - This will tokenise the given string using whitespace characters as the - token delimiters, and return these tokens as an array. - @see addTokens - */ - static StringArray fromTokens (StringRef stringToTokenise, - bool preserveQuotedStrings); - - /** Returns an array containing the tokens in a given string. - - This will tokenise the given string using whitespace characters as the - token delimiters, and return these tokens as an array. - - @param stringToTokenise the string to tokenise - @param breakCharacters a string of characters, any of which will be considered - to be a token delimiter. - @param quoteCharacters if this string isn't empty, it defines a set of characters - which are treated as quotes. Any text occurring - between quotes is not broken up into tokens. - @see addTokens - */ - static StringArray fromTokens (StringRef stringToTokenise, - StringRef breakCharacters, - StringRef quoteCharacters); - - /** Returns an array containing the lines in a given string. - - This breaks a string down into lines separated by \\n or \\r\\n, and returns an - array containing these lines. Line-break characters are omitted from the strings that - are added to the array. - */ - static StringArray fromLines (StringRef stringToBreakUp); - - //============================================================================== - /** Removes all elements from the array. */ - void clear(); - - /** Removes all elements from the array without freeing the array's allocated storage. - @see clear - */ - void clearQuick(); - - /** Removes a string from the array. - If the index is out-of-range, no action will be taken. - */ - void remove (int index); - - /** Finds a string in the array and removes it. - This will remove the first occurrence of the given string from the array. The - comparison may be case-insensitive depending on the ignoreCase parameter. - */ - void removeString (StringRef stringToRemove, - bool ignoreCase = false); - - /** Removes a range of elements from the array. - - This will remove a set of elements, starting from the given index, - and move subsequent elements down to close the gap. - - If the range extends beyond the bounds of the array, it will - be safely clipped to the size of the array. - - @param startIndex the index of the first element to remove - @param numberToRemove how many elements should be removed - */ - void removeRange (int startIndex, int numberToRemove); - - /** Removes any duplicated elements from the array. - - If any string appears in the array more than once, only the first occurrence of - it will be retained. - - @param ignoreCase whether to use a case-insensitive comparison - */ - void removeDuplicates (bool ignoreCase); - - /** Removes empty strings from the array. - @param removeWhitespaceStrings if true, strings that only contain whitespace - characters will also be removed - */ - void removeEmptyStrings (bool removeWhitespaceStrings = true); - - /** Moves one of the strings to a different position. - - This will move the string to a specified index, shuffling along - any intervening elements as required. - - So for example, if you have the array { 0, 1, 2, 3, 4, 5 } then calling - move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }. - - @param currentIndex the index of the value to be moved. If this isn't a - valid index, then nothing will be done - @param newIndex the index at which you'd like this value to end up. If this - is less than zero, the value will be moved to the end - of the array - */ - void move (int currentIndex, int newIndex) noexcept; - - /** Deletes any whitespace characters from the starts and ends of all the strings. */ - void trim(); - - /** Adds numbers to the strings in the array, to make each string unique. - - This will add numbers to the ends of groups of similar strings. - e.g. if there are two "moose" strings, they will become "moose (1)" and "moose (2)" - - @param ignoreCaseWhenComparing whether the comparison used is case-insensitive - @param appendNumberToFirstInstance whether the first of a group of similar strings - also has a number appended to it. - @param preNumberString when adding a number, this string is added before the number. - If you pass 0, a default string will be used, which adds - brackets around the number. - @param postNumberString this string is appended after any numbers that are added. - If you pass 0, a default string will be used, which adds - brackets around the number. - */ - void appendNumbersToDuplicates (bool ignoreCaseWhenComparing, - bool appendNumberToFirstInstance, - CharPointer_UTF8 preNumberString = CharPointer_UTF8 (nullptr), - CharPointer_UTF8 postNumberString = CharPointer_UTF8 (nullptr)); - - //============================================================================== - /** Joins the strings in the array together into one string. - - This will join a range of elements from the array into a string, separating - them with a given string. - - e.g. joinIntoString (",") will turn an array of "a" "b" and "c" into "a,b,c". - - @param separatorString the string to insert between all the strings - @param startIndex the first element to join - @param numberOfElements how many elements to join together. If this is less - than zero, all available elements will be used. - */ - String joinIntoString (StringRef separatorString, - int startIndex = 0, - int numberOfElements = -1) const; - - //============================================================================== - /** Sorts the array into alphabetical order. - @param ignoreCase if true, the comparisons used will be case-sensitive. - */ - void sort (bool ignoreCase); - - /** Sorts the array using extra language-aware rules to do a better job of comparing - words containing spaces and numbers. - @see String::compareNatural() - */ - void sortNatural(); - - //============================================================================== - /** Increases the array's internal storage to hold a minimum number of elements. - - Calling this before adding a large known number of elements means that - the array won't have to keep dynamically resizing itself as the elements - are added, and it'll therefore be more efficient. - */ - void ensureStorageAllocated (int minNumElements); - - /** Reduces the amount of storage being used by the array. - - Arrays typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads(); - - /** This is the array holding the actual strings. This is public to allow direct access - to array methods that may not already be provided by the StringArray class. - */ - Array strings; - -private: - JUCE_LEAK_DETECTOR (StringArray) -}; - - -#endif // JUCE_STRINGARRAY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp b/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp deleted file mode 100755 index 3275d2d..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.cpp +++ /dev/null @@ -1,147 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -StringPairArray::StringPairArray (const bool ignoreCase_) - : ignoreCase (ignoreCase_) -{ -} - -StringPairArray::StringPairArray (const StringPairArray& other) - : keys (other.keys), - values (other.values), - ignoreCase (other.ignoreCase) -{ -} - -StringPairArray::~StringPairArray() -{ -} - -StringPairArray& StringPairArray::operator= (const StringPairArray& other) -{ - keys = other.keys; - values = other.values; - return *this; -} - -bool StringPairArray::operator== (const StringPairArray& other) const -{ - for (int i = keys.size(); --i >= 0;) - if (other [keys[i]] != values[i]) - return false; - - return true; -} - -bool StringPairArray::operator!= (const StringPairArray& other) const -{ - return ! operator== (other); -} - -const String& StringPairArray::operator[] (StringRef key) const -{ - return values [keys.indexOf (key, ignoreCase)]; -} - -String StringPairArray::getValue (StringRef key, const String& defaultReturnValue) const -{ - const int i = keys.indexOf (key, ignoreCase); - - if (i >= 0) - return values[i]; - - return defaultReturnValue; -} - -bool StringPairArray::containsKey (StringRef key) const noexcept -{ - return keys.contains (key); -} - -void StringPairArray::set (const String& key, const String& value) -{ - const int i = keys.indexOf (key, ignoreCase); - - if (i >= 0) - { - values.set (i, value); - } - else - { - keys.add (key); - values.add (value); - } -} - -void StringPairArray::addArray (const StringPairArray& other) -{ - for (int i = 0; i < other.size(); ++i) - set (other.keys[i], other.values[i]); -} - -void StringPairArray::clear() -{ - keys.clear(); - values.clear(); -} - -void StringPairArray::remove (StringRef key) -{ - remove (keys.indexOf (key, ignoreCase)); -} - -void StringPairArray::remove (const int index) -{ - keys.remove (index); - values.remove (index); -} - -void StringPairArray::setIgnoresCase (const bool shouldIgnoreCase) -{ - ignoreCase = shouldIgnoreCase; -} - -String StringPairArray::getDescription() const -{ - String s; - - for (int i = 0; i < keys.size(); ++i) - { - s << keys[i] << " = " << values[i]; - if (i < keys.size()) - s << ", "; - } - - return s; -} - -void StringPairArray::minimiseStorageOverheads() -{ - keys.minimiseStorageOverheads(); - values.minimiseStorageOverheads(); -} diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h b/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h deleted file mode 100755 index e1c774d..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringPairArray.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_STRINGPAIRARRAY_H_INCLUDED -#define JUCE_STRINGPAIRARRAY_H_INCLUDED - - -//============================================================================== -/** - A container for holding a set of strings which are keyed by another string. - - @see StringArray -*/ -class JUCE_API StringPairArray -{ -public: - //============================================================================== - /** Creates an empty array */ - StringPairArray (bool ignoreCaseWhenComparingKeys = true); - - /** Creates a copy of another array */ - StringPairArray (const StringPairArray& other); - - /** Destructor. */ - ~StringPairArray(); - - /** Copies the contents of another string array into this one */ - StringPairArray& operator= (const StringPairArray& other); - - //============================================================================== - /** Compares two arrays. - Comparisons are case-sensitive. - @returns true only if the other array contains exactly the same strings with the same keys - */ - bool operator== (const StringPairArray& other) const; - - /** Compares two arrays. - Comparisons are case-sensitive. - @returns false if the other array contains exactly the same strings with the same keys - */ - bool operator!= (const StringPairArray& other) const; - - //============================================================================== - /** Finds the value corresponding to a key string. - - If no such key is found, this will just return an empty string. To check whether - a given key actually exists (because it might actually be paired with an empty string), use - the getAllKeys() method to obtain a list. - - Obviously the reference returned shouldn't be stored for later use, as the - string it refers to may disappear when the array changes. - - @see getValue - */ - const String& operator[] (StringRef key) const; - - /** Finds the value corresponding to a key string. - If no such key is found, this will just return the value provided as a default. - @see operator[] - */ - String getValue (StringRef, const String& defaultReturnValue) const; - - /** Returns true if the given key exists. */ - bool containsKey (StringRef key) const noexcept; - - /** Returns a list of all keys in the array. */ - const StringArray& getAllKeys() const noexcept { return keys; } - - /** Returns a list of all values in the array. */ - const StringArray& getAllValues() const noexcept { return values; } - - /** Returns the number of strings in the array */ - inline int size() const noexcept { return keys.size(); }; - - - //============================================================================== - /** Adds or amends a key/value pair. - If a value already exists with this key, its value will be overwritten, - otherwise the key/value pair will be added to the array. - */ - void set (const String& key, const String& value); - - /** Adds the items from another array to this one. - This is equivalent to using set() to add each of the pairs from the other array. - */ - void addArray (const StringPairArray& other); - - //============================================================================== - /** Removes all elements from the array. */ - void clear(); - - /** Removes a string from the array based on its key. - If the key isn't found, nothing will happen. - */ - void remove (StringRef key); - - /** Removes a string from the array based on its index. - If the index is out-of-range, no action will be taken. - */ - void remove (int index); - - //============================================================================== - /** Indicates whether to use a case-insensitive search when looking up a key string. - */ - void setIgnoresCase (bool shouldIgnoreCase); - - //============================================================================== - /** Returns a descriptive string containing the items. - This is handy for dumping the contents of an array. - */ - String getDescription() const; - - //============================================================================== - /** Reduces the amount of storage being used by the array. - - Arrays typically allocate slightly more storage than they need, and after - removing elements, they may have quite a lot of unused space allocated. - This method will reduce the amount of allocated storage to a minimum. - */ - void minimiseStorageOverheads(); - - -private: - //============================================================================== - StringArray keys, values; - bool ignoreCase; - - JUCE_LEAK_DETECTOR (StringPairArray) -}; - - -#endif // JUCE_STRINGPAIRARRAY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp b/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp deleted file mode 100755 index 039a30b..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringPool.cpp +++ /dev/null @@ -1,166 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -static const int minNumberOfStringsForGarbageCollection = 300; -static const uint32 garbageCollectionInterval = 30000; - - -StringPool::StringPool() noexcept : lastGarbageCollectionTime (0) {} -StringPool::~StringPool() {} - -struct StartEndString -{ - StartEndString (String::CharPointerType s, String::CharPointerType e) noexcept : start (s), end (e) {} - operator String() const { return String (start, end); } - - String::CharPointerType start, end; -}; - -static int compareStrings (const String& s1, const String& s2) noexcept { return s1.compare (s2); } -static int compareStrings (CharPointer_UTF8 s1, const String& s2) noexcept { return s1.compare (s2.getCharPointer()); } - -static int compareStrings (const StartEndString& string1, const String& string2) noexcept -{ - String::CharPointerType s1 (string1.start), s2 (string2.getCharPointer()); - - for (;;) - { - const int c1 = s1 < string1.end ? (int) s1.getAndAdvance() : 0; - const int c2 = (int) s2.getAndAdvance(); - const int diff = c1 - c2; - - if (diff != 0) return diff < 0 ? -1 : 1; - if (c1 == 0) break; - } - - return 0; -} - -template -static String addPooledString (Array& strings, const NewStringType& newString) -{ - int start = 0; - int end = strings.size(); - - while (start < end) - { - const String& startString = strings.getReference (start); - const int startComp = compareStrings (newString, startString); - - if (startComp == 0) - return startString; - - const int halfway = (start + end) / 2; - - if (halfway == start) - { - if (startComp > 0) - ++start; - - break; - } - - const String& halfwayString = strings.getReference (halfway); - const int halfwayComp = compareStrings (newString, halfwayString); - - if (halfwayComp == 0) - return halfwayString; - - if (halfwayComp > 0) - start = halfway; - else - end = halfway; - } - - strings.insert (start, newString); - return strings.getReference (start); -} - -String StringPool::getPooledString (const char* const newString) -{ - if (newString == nullptr || *newString == 0) - return String(); - - const ScopedLock sl (lock); - garbageCollectIfNeeded(); - return addPooledString (strings, CharPointer_UTF8 (newString)); -} - -String StringPool::getPooledString (String::CharPointerType start, String::CharPointerType end) -{ - if (start.isEmpty() || start == end) - return String(); - - const ScopedLock sl (lock); - garbageCollectIfNeeded(); - return addPooledString (strings, StartEndString (start, end)); -} - -String StringPool::getPooledString (StringRef newString) -{ - if (newString.isEmpty()) - return String(); - - const ScopedLock sl (lock); - garbageCollectIfNeeded(); - return addPooledString (strings, newString.text); -} - -String StringPool::getPooledString (const String& newString) -{ - if (newString.isEmpty()) - return String(); - - const ScopedLock sl (lock); - garbageCollectIfNeeded(); - return addPooledString (strings, newString); -} - -void StringPool::garbageCollectIfNeeded() -{ - if (strings.size() > minNumberOfStringsForGarbageCollection - && Time::getApproximateMillisecondCounter() > lastGarbageCollectionTime + garbageCollectionInterval) - garbageCollect(); -} - -void StringPool::garbageCollect() -{ - const ScopedLock sl (lock); - - for (int i = strings.size(); --i >= 0;) - if (strings.getReference(i).getReferenceCount() == 1) - strings.remove (i); - - lastGarbageCollectionTime = Time::getApproximateMillisecondCounter(); -} - -StringPool& StringPool::getGlobalPool() noexcept -{ - static StringPool pool; - return pool; -} diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h b/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h deleted file mode 100755 index 64d034e..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringPool.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_STRINGPOOL_H_INCLUDED -#define JUCE_STRINGPOOL_H_INCLUDED - - -//============================================================================== -/** - A StringPool holds a set of shared strings, which reduces storage overheads and improves - comparison speed when dealing with many duplicate strings. - - When you add a string to a pool using getPooledString, it'll return a character - array containing the same string. This array is owned by the pool, and the same array - is returned every time a matching string is asked for. This means that it's trivial to - compare two pooled strings for equality, as you can simply compare their pointers. It - also cuts down on storage if you're using many copies of the same string. -*/ -class JUCE_API StringPool -{ -public: - //============================================================================== - /** Creates an empty pool. */ - StringPool() noexcept; - - /** Destructor */ - ~StringPool(); - - //============================================================================== - /** Returns a pointer to a shared copy of the string that is passed in. - The pool will always return the same String object when asked for a string that matches it. - */ - String getPooledString (const String& original); - - /** Returns a pointer to a copy of the string that is passed in. - The pool will always return the same String object when asked for a string that matches it. - */ - String getPooledString (const char* original); - - /** Returns a pointer to a shared copy of the string that is passed in. - The pool will always return the same String object when asked for a string that matches it. - */ - String getPooledString (StringRef original); - - /** Returns a pointer to a copy of the string that is passed in. - The pool will always return the same String object when asked for a string that matches it. - */ - String getPooledString (String::CharPointerType start, String::CharPointerType end); - - //============================================================================== - /** Scans the pool, and removes any strings that are unreferenced. - You don't generally need to call this - it'll be called automatically when the pool grows - large enough to warrant it. - */ - void garbageCollect(); - - /** Returns a shared global pool which is used for things like Identifiers, XML parsing. */ - static StringPool& getGlobalPool() noexcept; - -private: - Array strings; - CriticalSection lock; - uint32 lastGarbageCollectionTime; - - void garbageCollectIfNeeded(); - - JUCE_DECLARE_NON_COPYABLE (StringPool) -}; - - -#endif // JUCE_STRINGPOOL_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_StringRef.h b/JuceLibraryCode/modules/juce_core/text/juce_StringRef.h deleted file mode 100755 index 434bf4a..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_StringRef.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_STRINGREF_H_INCLUDED -#define JUCE_STRINGREF_H_INCLUDED - -//============================================================================== -/** - A simple class for holding temporary references to a string literal or String. - - Unlike a real String object, the StringRef does not allocate any memory or - take ownership of the strings you give to it - it simply holds a reference to - a string that has been allocated elsewhere. - The main purpose of the class is to be used instead of a const String& as the type - of function arguments where the caller may pass either a string literal or a String - object. This means that when the called uses a string literal, there's no need - for an temporary String object to be allocated, and this cuts down overheads - substantially. - - Because the class is simply a wrapper around a pointer, you should always pass - it by value, not by reference. - - @code - void myStringFunction1 (const String&); - void myStringFunction2 (StringRef); - - myStringFunction1 ("abc"); // Implicitly allocates a temporary String object. - myStringFunction2 ("abc"); // Much faster, as no local allocations are needed. - @endcode - - For examples of it in use, see the XmlElement or StringArray classes. - - Bear in mind that there are still many cases where it's better to use an argument - which is a const String&. For example if the function stores the string or needs - to internally create a String from the argument, then it's better for the original - argument to already be a String. - - @see String -*/ -class JUCE_API StringRef -{ -public: - /** Creates a StringRef from a raw string literal. - The StringRef object does NOT take ownership or copy this data, so you must - ensure that the data does not change during the lifetime of the StringRef. - Note that this pointer not be null! - */ - StringRef (const char* stringLiteral) noexcept; - - /** Creates a StringRef from a raw char pointer. - The StringRef object does NOT take ownership or copy this data, so you must - ensure that the data does not change during the lifetime of the StringRef. - */ - StringRef (String::CharPointerType stringLiteral) noexcept; - - /** Creates a StringRef from a String. - The StringRef object does NOT take ownership or copy the data from the String, - so you must ensure that the String is not modified or deleted during the lifetime - of the StringRef. - */ - StringRef (const String& string) noexcept; - - /** Creates a StringRef pointer to an empty string. */ - StringRef() noexcept; - - //============================================================================== - /** Returns a raw pointer to the underlying string data. */ - operator const String::CharPointerType::CharType*() const noexcept { return text.getAddress(); } - /** Returns a pointer to the underlying string data as a char pointer object. */ - operator String::CharPointerType() const noexcept { return text; } - - /** Returns true if the string is empty. */ - bool isEmpty() const noexcept { return text.isEmpty(); } - /** Returns true if the string is not empty. */ - bool isNotEmpty() const noexcept { return ! text.isEmpty(); } - /** Returns the number of characters in the string. */ - int length() const noexcept { return (int) text.length(); } - - /** Retrieves a character by index. */ - juce_wchar operator[] (int index) const noexcept { return text[index]; } - - /** Compares this StringRef with a String. */ - bool operator== (const String& s) const noexcept { return text.compare (s.getCharPointer()) == 0; } - /** Compares this StringRef with a String. */ - bool operator!= (const String& s) const noexcept { return text.compare (s.getCharPointer()) != 0; } - - /** Case-sensitive comparison of two StringRefs. */ - bool operator== (StringRef s) const noexcept { return text.compare (s.text) == 0; } - /** Case-sensitive comparison of two StringRefs. */ - bool operator!= (StringRef s) const noexcept { return text.compare (s.text) != 0; } - - //============================================================================== - /** The text that is referenced. */ - String::CharPointerType text; - - #if JUCE_STRING_UTF_TYPE != 8 && ! defined (DOXYGEN) - // Sorry, non-UTF8 people, you're unable to take advantage of StringRef, because - // you've chosen a character encoding that doesn't match C++ string literals. - String stringCopy; - #endif -}; - -//============================================================================== -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, StringRef string2) noexcept; -/** Case-sensitive comparison of two strings. */ -JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, StringRef string2) noexcept; - -#if JUCE_STRING_UTF_TYPE != 8 && ! defined (DOXYGEN) - inline String operator+ (String s1, StringRef s2) { return s1 += String (s2.text); } -#endif - -#endif // JUCE_STRINGREF_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp b/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp deleted file mode 100755 index 6b4c807..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -struct TextDiffHelpers -{ - enum { minLengthToMatch = 3 }; - - struct StringRegion - { - StringRegion (const String& s) noexcept - : text (s.getCharPointer()), start (0), length (s.length()) {} - - StringRegion (const String::CharPointerType t, int s, int len) noexcept - : text (t), start (s), length (len) {} - - String::CharPointerType text; - int start, length; - }; - - static void addInsertion (TextDiff& td, const String::CharPointerType text, int index, int length) - { - TextDiff::Change c; - c.insertedText = String (text, (size_t) length); - c.start = index; - c.length = length; - td.changes.add (c); - } - - static void addDeletion (TextDiff& td, int index, int length) - { - TextDiff::Change c; - c.start = index; - c.length = length; - td.changes.add (c); - } - - static void diffSkippingCommonStart (TextDiff& td, const StringRegion& a, const StringRegion& b) - { - String::CharPointerType sa (a.text); - String::CharPointerType sb (b.text); - const int maxLen = jmax (a.length, b.length); - - for (int i = 0; i < maxLen; ++i, ++sa, ++sb) - { - if (*sa != *sb) - { - diffRecursively (td, StringRegion (sa, a.start + i, a.length - i), - StringRegion (sb, b.start + i, b.length - i)); - break; - } - } - } - - static void diffRecursively (TextDiff& td, const StringRegion& a, const StringRegion& b) - { - int indexA, indexB; - const int len = findLongestCommonSubstring (a.text, a.length, - b.text, b.length, - indexA, indexB); - - if (len >= minLengthToMatch) - { - if (indexA > 0 && indexB > 0) - diffSkippingCommonStart (td, StringRegion (a.text, a.start, indexA), - StringRegion (b.text, b.start, indexB)); - else if (indexA > 0) - addDeletion (td, b.start, indexA); - else if (indexB > 0) - addInsertion (td, b.text, b.start, indexB); - - diffRecursively (td, StringRegion (a.text + indexA + len, a.start + indexA + len, a.length - indexA - len), - StringRegion (b.text + indexB + len, b.start + indexB + len, b.length - indexB - len)); - } - else - { - if (a.length > 0) addDeletion (td, b.start, a.length); - if (b.length > 0) addInsertion (td, b.text, b.start, b.length); - } - } - - static int findLongestCommonSubstring (String::CharPointerType a, const int lenA, - const String::CharPointerType b, const int lenB, - int& indexInA, int& indexInB) - { - if (lenA == 0 || lenB == 0) - return 0; - - HeapBlock lines; - lines.calloc (2 + 2 * (size_t) lenB); - - int* l0 = lines; - int* l1 = l0 + lenB + 1; - - int loopsWithoutImprovement = 0; - int bestLength = 0; - indexInA = indexInB = 0; - - for (int i = 0; i < lenA; ++i) - { - const juce_wchar ca = a.getAndAdvance(); - String::CharPointerType b2 (b); - - for (int j = 0; j < lenB; ++j) - { - if (ca != b2.getAndAdvance()) - { - l1[j + 1] = 0; - } - else - { - const int len = l0[j] + 1; - l1[j + 1] = len; - - if (len > bestLength) - { - loopsWithoutImprovement = 0; - bestLength = len; - indexInA = i; - indexInB = j; - } - } - } - - if (++loopsWithoutImprovement > 100) - break; - - std::swap (l0, l1); - } - - indexInA -= bestLength - 1; - indexInB -= bestLength - 1; - return bestLength; - } -}; - -TextDiff::TextDiff (const String& original, const String& target) -{ - TextDiffHelpers::diffSkippingCommonStart (*this, original, target); -} - -String TextDiff::appliedTo (String text) const -{ - for (int i = 0; i < changes.size(); ++i) - text = changes.getReference(i).appliedTo (text); - - return text; -} - -bool TextDiff::Change::isDeletion() const noexcept -{ - return insertedText.isEmpty(); -} - -String TextDiff::Change::appliedTo (const String& text) const noexcept -{ - return text.substring (0, start) + (isDeletion() ? text.substring (start + length) - : (insertedText + text.substring (start))); -} - -//============================================================================== -//============================================================================== -#if JUCE_UNIT_TESTS - -class DiffTests : public UnitTest -{ -public: - DiffTests() : UnitTest ("TextDiff class") {} - - static String createString (Random& r) - { - juce_wchar buffer[50] = { 0 }; - - for (int i = r.nextInt (49); --i >= 0;) - { - if (r.nextInt (10) == 0) - { - do - { - buffer[i] = (juce_wchar) (1 + r.nextInt (0x10ffff - 1)); - } - while (! CharPointer_UTF16::canRepresent (buffer[i])); - } - else - buffer[i] = (juce_wchar) ('a' + r.nextInt (3)); - } - - return CharPointer_UTF32 (buffer); - } - - void testDiff (const String& a, const String& b) - { - TextDiff diff (a, b); - const String result (diff.appliedTo (a)); - expectEquals (result, b); - } - - void runTest() - { - beginTest ("TextDiff"); - - Random r = getRandom(); - - testDiff (String::empty, String::empty); - testDiff ("x", String::empty); - testDiff (String::empty, "x"); - testDiff ("x", "x"); - testDiff ("x", "y"); - testDiff ("xxx", "x"); - testDiff ("x", "xxx"); - - for (int i = 5000; --i >= 0;) - { - String s (createString (r)); - testDiff (s, createString (r)); - testDiff (s + createString (r), s + createString (r)); - } - } -}; - -static DiffTests diffTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h b/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h deleted file mode 100755 index d420c3d..0000000 --- a/JuceLibraryCode/modules/juce_core/text/juce_TextDiff.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_TEXTDIFF_H_INCLUDED -#define JUCE_TEXTDIFF_H_INCLUDED - - -/** - Calculates and applies a sequence of changes to convert one text string into - another. - - Once created, the TextDiff object contains an array of change objects, where - each change can be either an insertion or a deletion. When applied in order - to the original string, these changes will convert it to the target string. -*/ -class JUCE_API TextDiff -{ -public: - /** Creates a set of diffs for converting the original string into the target. */ - TextDiff (const String& original, - const String& target); - - /** Applies this sequence of changes to the original string, producing the - target string that was specified when generating them. - - Obviously it only makes sense to call this function with the string that - was originally passed to the constructor. Any other input will produce an - undefined result. - */ - String appliedTo (String text) const; - - /** Describes a change, which can be either an insertion or deletion. */ - struct Change - { - String insertedText; /**< If this change is a deletion, this string will be empty; otherwise, - it'll be the text that should be inserted at the index specified by start. */ - int start; /**< Specifies the character index in a string at which text should be inserted or deleted. */ - int length; /**< If this change is a deletion, this specifies the number of characters to delete. For an - insertion, this is the length of the new text being inserted. */ - - /** Returns true if this change is a deletion, or false for an insertion. */ - bool isDeletion() const noexcept; - - /** Returns the result of applying this change to a string. */ - String appliedTo (const String& original) const noexcept; - }; - - /** The list of changes required to perform the transformation. - Applying each of these, in order, to the original string will produce the target. - */ - Array changes; -}; - - -#endif // JUCE_TEXTDIFF_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp deleted file mode 100755 index 4566b13..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.cpp +++ /dev/null @@ -1,113 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -ChildProcess::ChildProcess() {} -ChildProcess::~ChildProcess() {} - -bool ChildProcess::isRunning() const -{ - return activeProcess != nullptr && activeProcess->isRunning(); -} - -int ChildProcess::readProcessOutput (void* dest, int numBytes) -{ - return activeProcess != nullptr ? activeProcess->read (dest, numBytes) : 0; -} - -bool ChildProcess::kill() -{ - return activeProcess == nullptr || activeProcess->killProcess(); -} - -uint32 ChildProcess::getExitCode() const -{ - return activeProcess != nullptr ? activeProcess->getExitCode() : 0; -} - -bool ChildProcess::waitForProcessToFinish (const int timeoutMs) const -{ - const uint32 timeoutTime = Time::getMillisecondCounter() + (uint32) timeoutMs; - - do - { - if (! isRunning()) - return true; - } - while (timeoutMs < 0 || Time::getMillisecondCounter() < timeoutTime); - - return false; -} - -String ChildProcess::readAllProcessOutput() -{ - MemoryOutputStream result; - - for (;;) - { - char buffer [512]; - const int num = readProcessOutput (buffer, sizeof (buffer)); - - if (num <= 0) - break; - - result.write (buffer, (size_t) num); - } - - return result.toString(); -} - -//============================================================================== -#if JUCE_UNIT_TESTS - -class ChildProcessTests : public UnitTest -{ -public: - ChildProcessTests() : UnitTest ("ChildProcess") {} - - void runTest() - { - beginTest ("Child Processes"); - - #if JUCE_WINDOWS || JUCE_MAC || JUCE_LINUX - ChildProcess p; - - #if JUCE_WINDOWS - expect (p.start ("tasklist")); - #else - expect (p.start ("ls /")); - #endif - - //String output (p.readAllProcessOutput()); - //expect (output.isNotEmpty()); - #endif - } -}; - -static ChildProcessTests childProcessUnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h b/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h deleted file mode 100755 index 0adcb57..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ChildProcess.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_CHILDPROCESS_H_INCLUDED -#define JUCE_CHILDPROCESS_H_INCLUDED - - -//============================================================================== -/** - Launches and monitors a child process. - - This class lets you launch an executable, and read its output. You can also - use it to check whether the child process has finished. -*/ -class JUCE_API ChildProcess -{ -public: - //============================================================================== - /** Creates a process object. - To actually launch the process, use start(). - */ - ChildProcess(); - - /** Destructor. - Note that deleting this object won't terminate the child process. - */ - ~ChildProcess(); - - /** These flags are used by the start() methods. */ - enum StreamFlags - { - wantStdOut = 1, - wantStdErr = 2 - }; - - /** Attempts to launch a child process command. - - The command should be the name of the executable file, followed by any arguments - that are required. - If the process has already been launched, this will launch it again. If a problem - occurs, the method will return false. - The streamFlags is a combinations of values to indicate which of the child's output - streams should be read and returned by readProcessOutput(). - */ - bool start (const String& command, int streamFlags = wantStdOut | wantStdErr); - - /** Attempts to launch a child process command. - - The first argument should be the name of the executable file, followed by any other - arguments that are needed. - If the process has already been launched, this will launch it again. If a problem - occurs, the method will return false. - The streamFlags is a combinations of values to indicate which of the child's output - streams should be read and returned by readProcessOutput(). - */ - bool start (const StringArray& arguments, int streamFlags = wantStdOut | wantStdErr); - - /** Returns true if the child process is alive. */ - bool isRunning() const; - - /** Attempts to read some output from the child process. - This will attempt to read up to the given number of bytes of data from the - process. It returns the number of bytes that were actually read. - */ - int readProcessOutput (void* destBuffer, int numBytesToRead); - - /** Blocks until the process has finished, and then returns its complete output - as a string. - */ - String readAllProcessOutput(); - - /** Blocks until the process is no longer running. */ - bool waitForProcessToFinish (int timeoutMs) const; - - /** If the process has finished, this returns its exit code. */ - uint32 getExitCode() const; - - /** Attempts to kill the child process. - Returns true if it succeeded. Trying to read from the process after calling this may - result in undefined behaviour. - */ - bool kill(); - -private: - //============================================================================== - class ActiveProcess; - friend struct ContainerDeletePolicy; - ScopedPointer activeProcess; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcess) -}; - - -#endif // JUCE_CHILDPROCESS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h b/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h deleted file mode 100755 index 60e61dd..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_CriticalSection.h +++ /dev/null @@ -1,266 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_CRITICALSECTION_H_INCLUDED -#define JUCE_CRITICALSECTION_H_INCLUDED - - -//============================================================================== -/** - A re-entrant mutex. - - A CriticalSection acts as a re-entrant mutex object. The best way to lock and unlock - one of these is by using RAII in the form of a local ScopedLock object - have a look - through the codebase for many examples of how to do this. - - In almost all cases you'll want to declare your CriticalSection as a member variable. - Occasionally you may want to declare one as a static variable, but in that case the usual - C++ static object order-of-construction warnings should be heeded. - - @see ScopedLock, ScopedTryLock, ScopedUnlock, SpinLock, ReadWriteLock, Thread, InterProcessLock -*/ -class JUCE_API CriticalSection -{ -public: - //============================================================================== - /** Creates a CriticalSection object. */ - CriticalSection() noexcept; - - /** Destructor. - If the critical section is deleted whilst locked, any subsequent behaviour - is unpredictable. - */ - ~CriticalSection() noexcept; - - //============================================================================== - /** Acquires the lock. - - If the lock is already held by the caller thread, the method returns immediately. - If the lock is currently held by another thread, this will wait until it becomes free. - - It's strongly recommended that you never call this method directly - instead use the - ScopedLock class to manage the locking using an RAII pattern instead. - - @see exit, tryEnter, ScopedLock - */ - void enter() const noexcept; - - /** Attempts to lock this critical section without blocking. - - This method behaves identically to CriticalSection::enter, except that the caller thread - does not wait if the lock is currently held by another thread but returns false immediately. - - @returns false if the lock is currently held by another thread, true otherwise. - @see enter - */ - bool tryEnter() const noexcept; - - /** Releases the lock. - - If the caller thread hasn't got the lock, this can have unpredictable results. - - If the enter() method has been called multiple times by the thread, each - call must be matched by a call to exit() before other threads will be allowed - to take over the lock. - - @see enter, ScopedLock - */ - void exit() const noexcept; - - - //============================================================================== - /** Provides the type of scoped lock to use with a CriticalSection. */ - typedef GenericScopedLock ScopedLockType; - - /** Provides the type of scoped unlocker to use with a CriticalSection. */ - typedef GenericScopedUnlock ScopedUnlockType; - - /** Provides the type of scoped try-locker to use with a CriticalSection. */ - typedef GenericScopedTryLock ScopedTryLockType; - - -private: - //============================================================================== - #if JUCE_WINDOWS - // To avoid including windows.h in the public JUCE headers, we'll just allocate - // a block of memory here that's big enough to be used internally as a windows - // CRITICAL_SECTION structure. - #if JUCE_64BIT - uint8 lock[44]; - #else - uint8 lock[24]; - #endif - #else - mutable pthread_mutex_t lock; - #endif - - JUCE_DECLARE_NON_COPYABLE (CriticalSection) -}; - - -//============================================================================== -/** - A class that can be used in place of a real CriticalSection object, but which - doesn't perform any locking. - - This is currently used by some templated classes, and most compilers should - manage to optimise it out of existence. - - @see CriticalSection, Array, OwnedArray, ReferenceCountedArray -*/ -class JUCE_API DummyCriticalSection -{ -public: - inline DummyCriticalSection() noexcept {} - inline ~DummyCriticalSection() noexcept {} - - inline void enter() const noexcept {} - inline bool tryEnter() const noexcept { return true; } - inline void exit() const noexcept {} - - //============================================================================== - /** A dummy scoped-lock type to use with a dummy critical section. */ - struct ScopedLockType - { - ScopedLockType (const DummyCriticalSection&) noexcept {} - }; - - /** A dummy scoped-unlocker type to use with a dummy critical section. */ - typedef ScopedLockType ScopedUnlockType; - -private: - JUCE_DECLARE_NON_COPYABLE (DummyCriticalSection) -}; - -//============================================================================== -/** - Automatically locks and unlocks a CriticalSection object. - - You can use a ScopedLock as a local variable to provide RAII-based locking of a CriticalSection. - - e.g. @code - - struct MyObject - { - CriticalSection objectLock; - - // assuming that this example function will be called by multiple threads - void foo() - { - const ScopedLock myScopedLock (objectLock); - - // objectLock is now locked.. - - ...do some thread-safe work here... - - // ..and objectLock gets unlocked here, as myScopedLock goes out of - // scope at the end of the block - } - }; - @endcode - - @see CriticalSection, ScopedUnlock -*/ -typedef CriticalSection::ScopedLockType ScopedLock; - -//============================================================================== -/** - Automatically unlocks and re-locks a CriticalSection object. - - This is the reverse of a ScopedLock object - instead of locking the critical - section for the lifetime of this object, it unlocks it. - - Make sure you don't try to unlock critical sections that aren't actually locked! - - e.g. @code - - struct MyObject - { - CriticalSection objectLock; - - void foo() - { - { - const ScopedLock myScopedLock (objectLock); - - // objectLock is now locked.. - - { - ScopedUnlock myUnlocker (objectLock); - - // ..and now unlocked.. - } - - // ..and now locked again.. - } - - // ..and finally unlocked. - } - }; - @endcode - - @see CriticalSection, ScopedLock -*/ -typedef CriticalSection::ScopedUnlockType ScopedUnlock; - -//============================================================================== -/** - Automatically tries to lock and unlock a CriticalSection object. - - Use one of these as a local variable to control access to a CriticalSection. - - e.g. @code - - struct MyObject - { - CriticalSection objectLock; - - void foo() - { - const ScopedTryLock myScopedTryLock (objectLock); - - // Unlike using a ScopedLock, this may fail to actually get the lock, so you - // must call the isLocked() method before making any assumptions.. - if (myScopedTryLock.isLocked()) - { - ...safely do some work... - } - else - { - // If we get here, then our attempt at locking failed because another thread had already locked it.. - } - } - }; - @endcode - - @see CriticalSection::tryEnter, ScopedLock, ScopedUnlock, ScopedReadLock -*/ -typedef CriticalSection::ScopedTryLockType ScopedTryLock; - - -#endif // JUCE_CRITICALSECTION_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h b/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h deleted file mode 100755 index df6625b..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_DynamicLibrary.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_DYNAMICLIBRARY_H_INCLUDED -#define JUCE_DYNAMICLIBRARY_H_INCLUDED - -/** - Handles the opening and closing of DLLs. - - This class can be used to open a DLL and get some function pointers from it. - Since the DLL is freed when this object is deleted, it's handy for managing - library lifetimes using RAII. -*/ -class JUCE_API DynamicLibrary -{ -public: - /** Creates an unopened DynamicLibrary object. - Call open() to actually open one. - */ - DynamicLibrary() noexcept : handle (nullptr) {} - - /** - */ - DynamicLibrary (const String& name) : handle (nullptr) { open (name); } - - /** Destructor. - If a library is currently open, it will be closed when this object is destroyed. - */ - ~DynamicLibrary() { close(); } - - /** Opens a DLL. - The name and the method by which it gets found is of course platform-specific, and - may or may not include a path, depending on the OS. - If a library is already open when this method is called, it will first close the library - before attempting to load the new one. - @returns true if the library was successfully found and opened. - */ - bool open (const String& name); - - /** Releases the currently-open DLL, or has no effect if none was open. */ - void close(); - - /** Tries to find a named function in the currently-open DLL, and returns a pointer to it. - If no library is open, or if the function isn't found, this will return a null pointer. - */ - void* getFunction (const String& functionName) noexcept; - - /** Returns the platform-specific native library handle. - You'll need to cast this to whatever is appropriate for the OS that's in use. - */ - void* getNativeHandle() const noexcept { return handle; } - -private: - void* handle; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DynamicLibrary) -}; - - -#endif // JUCE_DYNAMICLIBRARY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp deleted file mode 100755 index 3475b74..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.cpp +++ /dev/null @@ -1,36 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -HighResolutionTimer::HighResolutionTimer() { pimpl = new Pimpl (*this); } -HighResolutionTimer::~HighResolutionTimer() { stopTimer(); } - -void HighResolutionTimer::startTimer (int periodMs) { pimpl->start (jmax (1, periodMs)); } -void HighResolutionTimer::stopTimer() { pimpl->stop(); } - -bool HighResolutionTimer::isTimerRunning() const noexcept { return pimpl->periodMs != 0; } -int HighResolutionTimer::getTimerInterval() const noexcept { return pimpl->periodMs; } diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h b/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h deleted file mode 100755 index 21022ad..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_HighResolutionTimer.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_HIGHRESOLUTIONTIMER_H_INCLUDED -#define JUCE_HIGHRESOLUTIONTIMER_H_INCLUDED - -/** - A high-resolution periodic timer. - - This provides accurately-timed regular callbacks. Unlike the normal Timer - class, this one uses a dedicated thread, not the message thread, so is - far more stable and precise. - - You should only use this class in situations where you really need accuracy, - because unlike the normal Timer class, which is very lightweight and cheap - to start/stop, the HighResolutionTimer will use far more resources, and - starting/stopping it may involve launching and killing threads. - - @see Timer -*/ -class JUCE_API HighResolutionTimer -{ -protected: - /** Creates a HighResolutionTimer. - When created, the timer is stopped, so use startTimer() to get it going. - */ - HighResolutionTimer(); - -public: - /** Destructor. */ - virtual ~HighResolutionTimer(); - - //============================================================================== - /** The user-defined callback routine that actually gets called periodically. - - This will be called on a dedicated timer thread, so make sure your - implementation is thread-safe! - - It's perfectly ok to call startTimer() or stopTimer() from within this - callback to change the subsequent intervals. - */ - virtual void hiResTimerCallback() = 0; - - //============================================================================== - /** Starts the timer and sets the length of interval required. - - If the timer is already started, this will reset its counter, so the - time between calling this method and the next timer callback will not be - less than the interval length passed in. - - @param intervalInMilliseconds the interval to use (any values less than 1 will be - rounded up to 1) - */ - void startTimer (int intervalInMilliseconds); - - /** Stops the timer. - - This method may block while it waits for pending callbacks to complete. Once it - returns, no more callbacks will be made. If it is called from the timer's own thread, - it will cancel the timer after the current callback returns. - */ - void stopTimer(); - - /** Checks if the timer has been started. - @returns true if the timer is running. - */ - bool isTimerRunning() const noexcept; - - /** Returns the timer's interval. - @returns the timer's interval in milliseconds if it's running, or 0 if it's not. - */ - int getTimerInterval() const noexcept; - -private: - struct Pimpl; - friend struct Pimpl; - friend struct ContainerDeletePolicy; - ScopedPointer pimpl; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HighResolutionTimer) -}; - - -#endif // JUCE_HIGHRESOLUTIONTIMER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h deleted file mode 100755 index dc903b0..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_InterProcessLock.h +++ /dev/null @@ -1,128 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_INTERPROCESSLOCK_H_INCLUDED -#define JUCE_INTERPROCESSLOCK_H_INCLUDED - - -//============================================================================== -/** - Acts as a critical section which processes can use to block each other. - - @see CriticalSection -*/ -class JUCE_API InterProcessLock -{ -public: - //============================================================================== - /** Creates a lock object. - @param name a name that processes will use to identify this lock object - */ - explicit InterProcessLock (const String& name); - - /** Destructor. - This will also release the lock if it's currently held by this process. - */ - ~InterProcessLock(); - - //============================================================================== - /** Attempts to lock the critical section. - - @param timeOutMillisecs how many milliseconds to wait if the lock is already - held by another process - a value of 0 will return - immediately, negative values will wait forever - @returns true if the lock could be gained within the timeout period, or - false if the timeout expired. - */ - bool enter (int timeOutMillisecs = -1); - - /** Releases the lock if it's currently held by this process. */ - void exit(); - - //============================================================================== - /** - Automatically locks and unlocks an InterProcessLock object. - - This works like a ScopedLock, but using an InterprocessLock rather than - a CriticalSection. - - @see ScopedLock - */ - class ScopedLockType - { - public: - //============================================================================== - /** Creates a scoped lock. - - As soon as it is created, this will lock the InterProcessLock, and - when the ScopedLockType object is deleted, the InterProcessLock will - be unlocked. - - Note that since an InterprocessLock can fail due to errors, you should check - isLocked() to make sure that the lock was successful before using it. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - explicit ScopedLockType (InterProcessLock& l) : ipLock (l) { lockWasSuccessful = l.enter(); } - - /** Destructor. - - The InterProcessLock will be unlocked when the destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~ScopedLockType() { ipLock.exit(); } - - /** Returns true if the InterProcessLock was successfully locked. */ - bool isLocked() const noexcept { return lockWasSuccessful; } - - private: - //============================================================================== - InterProcessLock& ipLock; - bool lockWasSuccessful; - - JUCE_DECLARE_NON_COPYABLE (ScopedLockType) - }; - -private: - //============================================================================== - class Pimpl; - friend struct ContainerDeletePolicy; - ScopedPointer pimpl; - - CriticalSection lock; - String name; - - JUCE_DECLARE_NON_COPYABLE (InterProcessLock) -}; - - -#endif // JUCE_INTERPROCESSLOCK_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_Process.h b/JuceLibraryCode/modules/juce_core/threads/juce_Process.h deleted file mode 100755 index f3efd66..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_Process.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_PROCESS_H_INCLUDED -#define JUCE_PROCESS_H_INCLUDED - - -//============================================================================== -/** Represents the current executable's process. - - This contains methods for controlling the current application at the - process-level. - - @see Thread, JUCEApplicationBase -*/ -class JUCE_API Process -{ -public: - //============================================================================== - enum ProcessPriority - { - LowPriority = 0, - NormalPriority = 1, - HighPriority = 2, - RealtimePriority = 3 - }; - - /** Changes the current process's priority. - - @param priority the process priority, where - 0=low, 1=normal, 2=high, 3=realtime - */ - static void JUCE_CALLTYPE setPriority (const ProcessPriority priority); - - /** Kills the current process immediately. - - This is an emergency process terminator that kills the application - immediately - it's intended only for use only when something goes - horribly wrong. - - @see JUCEApplicationBase::quit - */ - static void JUCE_CALLTYPE terminate(); - - //============================================================================== - /** Returns true if this application process is the one that the user is - currently using. - */ - static bool JUCE_CALLTYPE isForegroundProcess(); - - /** Attempts to make the current process the active one. - (This is not possible on some platforms). - */ - static void JUCE_CALLTYPE makeForegroundProcess(); - - /** Hides the application (on an OS that supports this, e.g. OSX) */ - static void JUCE_CALLTYPE hide(); - - //============================================================================== - /** Raises the current process's privilege level. - - Does nothing if this isn't supported by the current OS, or if process - privilege level is fixed. - */ - static void JUCE_CALLTYPE raisePrivilege(); - - /** Lowers the current process's privilege level. - - Does nothing if this isn't supported by the current OS, or if process - privilege level is fixed. - */ - static void JUCE_CALLTYPE lowerPrivilege(); - - //============================================================================== - /** Returns true if this process is being hosted by a debugger. */ - static bool JUCE_CALLTYPE isRunningUnderDebugger(); - - - //============================================================================== - /** Tries to launch the OS's default reader application for a given file or URL. */ - static bool JUCE_CALLTYPE openDocument (const String& documentURL, const String& parameters); - - /** Tries to launch the OS's default email application to let the user create a message. */ - static bool JUCE_CALLTYPE openEmailWithAttachments (const String& targetEmailAddress, - const String& emailSubject, - const String& bodyText, - const StringArray& filesToAttach); - - #if JUCE_WINDOWS || DOXYGEN - //============================================================================== - /** WINDOWS ONLY - This returns the HINSTANCE of the current module. - - The return type is a void* to avoid being dependent on windows.h - just cast - it to a HINSTANCE to use it. - - In a normal JUCE application, this will be automatically set to the module - handle of the executable. - - If you've built a DLL and plan to use any JUCE messaging or windowing classes, - you'll need to make sure you call the setCurrentModuleInstanceHandle() - to provide the correct module handle in your DllMain() function, because - the system relies on the correct instance handle when opening windows. - */ - static void* JUCE_CALLTYPE getCurrentModuleInstanceHandle() noexcept; - - /** WINDOWS ONLY - Sets a new module handle to be used by the library. - - The parameter type is a void* to avoid being dependent on windows.h, but it actually - expects a HINSTANCE value. - - @see getCurrentModuleInstanceHandle() - */ - static void JUCE_CALLTYPE setCurrentModuleInstanceHandle (void* newHandle) noexcept; - #endif - - #if JUCE_MAC || DOXYGEN - //============================================================================== - /** OSX ONLY - Shows or hides the OSX dock icon for this app. */ - static void setDockIconVisible (bool isVisible); - #endif - -private: - Process(); - JUCE_DECLARE_NON_COPYABLE (Process) -}; - - -#endif // JUCE_PROCESS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp deleted file mode 100755 index a0821b4..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -ReadWriteLock::ReadWriteLock() noexcept - : numWaitingWriters (0), - numWriters (0), - writerThreadId (0) -{ - readerThreads.ensureStorageAllocated (16); -} - -ReadWriteLock::~ReadWriteLock() noexcept -{ - jassert (readerThreads.size() == 0); - jassert (numWriters == 0); -} - -//============================================================================== -void ReadWriteLock::enterRead() const noexcept -{ - while (! tryEnterRead()) - waitEvent.wait (100); -} - -bool ReadWriteLock::tryEnterRead() const noexcept -{ - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - - const SpinLock::ScopedLockType sl (accessLock); - - for (int i = 0; i < readerThreads.size(); ++i) - { - ThreadRecursionCount& trc = readerThreads.getReference(i); - - if (trc.threadID == threadId) - { - trc.count++; - return true; - } - } - - if (numWriters + numWaitingWriters == 0 - || (threadId == writerThreadId && numWriters > 0)) - { - ThreadRecursionCount trc = { threadId, 1 }; - readerThreads.add (trc); - return true; - } - - return false; -} - -void ReadWriteLock::exitRead() const noexcept -{ - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - const SpinLock::ScopedLockType sl (accessLock); - - for (int i = 0; i < readerThreads.size(); ++i) - { - ThreadRecursionCount& trc = readerThreads.getReference(i); - - if (trc.threadID == threadId) - { - if (--(trc.count) == 0) - { - readerThreads.remove (i); - waitEvent.signal(); - } - - return; - } - } - - jassertfalse; // unlocking a lock that wasn't locked.. -} - -//============================================================================== -void ReadWriteLock::enterWrite() const noexcept -{ - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - const SpinLock::ScopedLockType sl (accessLock); - - while (! tryEnterWriteInternal (threadId)) - { - ++numWaitingWriters; - accessLock.exit(); - waitEvent.wait (100); - accessLock.enter(); - --numWaitingWriters; - } -} - -bool ReadWriteLock::tryEnterWrite() const noexcept -{ - const SpinLock::ScopedLockType sl (accessLock); - return tryEnterWriteInternal (Thread::getCurrentThreadId()); -} - -bool ReadWriteLock::tryEnterWriteInternal (Thread::ThreadID threadId) const noexcept -{ - if (readerThreads.size() + numWriters == 0 - || threadId == writerThreadId - || (readerThreads.size() == 1 && readerThreads.getReference(0).threadID == threadId)) - { - writerThreadId = threadId; - ++numWriters; - return true; - } - - return false; -} - -void ReadWriteLock::exitWrite() const noexcept -{ - const SpinLock::ScopedLockType sl (accessLock); - - // check this thread actually had the lock.. - jassert (numWriters > 0 && writerThreadId == Thread::getCurrentThreadId()); - - if (--numWriters == 0) - { - writerThreadId = 0; - waitEvent.signal(); - } -} diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h deleted file mode 100755 index c41d258..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ReadWriteLock.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_READWRITELOCK_H_INCLUDED -#define JUCE_READWRITELOCK_H_INCLUDED - - -//============================================================================== -/** - A critical section that allows multiple simultaneous readers. - - Features of this type of lock are: - - - Multiple readers can hold the lock at the same time, but only one writer - can hold it at once. - - Writers trying to gain the lock will be blocked until all readers and writers - have released it - - Readers trying to gain the lock while a writer is waiting to acquire it will be - blocked until the writer has obtained and released it - - If a thread already has a read lock and tries to obtain a write lock, it will succeed if - there are no other readers - - If a thread already has the write lock and tries to obtain a read lock, this will succeed. - - Recursive locking is supported. - - @see ScopedReadLock, ScopedWriteLock, CriticalSection -*/ -class JUCE_API ReadWriteLock -{ -public: - //============================================================================== - /** - Creates a ReadWriteLock object. - */ - ReadWriteLock() noexcept; - - /** Destructor. - If the object is deleted whilst locked, any subsequent behaviour is undefined. - */ - ~ReadWriteLock() noexcept; - - //============================================================================== - /** Locks this object for reading. - - Multiple threads can simultaneously lock the object for reading, but if another - thread has it locked for writing, then this will block until it releases the lock. - - @see exitRead, ScopedReadLock - */ - void enterRead() const noexcept; - - /** Tries to lock this object for reading. - - Multiple threads can simultaneously lock the object for reading, but if another - thread has it locked for writing, then this will fail and return false. - - @returns true if the lock is successfully gained. - @see exitRead, ScopedReadLock - */ - bool tryEnterRead() const noexcept; - - /** Releases the read-lock. - - If the caller thread hasn't got the lock, this can have unpredictable results. - - If the enterRead() method has been called multiple times by the thread, each - call must be matched by a call to exitRead() before other threads will be allowed - to take over the lock. - - @see enterRead, ScopedReadLock - */ - void exitRead() const noexcept; - - //============================================================================== - /** Locks this object for writing. - - This will block until any other threads that have it locked for reading or - writing have released their lock. - - @see exitWrite, ScopedWriteLock - */ - void enterWrite() const noexcept; - - /** Tries to lock this object for writing. - - This is like enterWrite(), but doesn't block - it returns true if it manages - to obtain the lock. - - @returns true if the lock is successfully gained. - @see enterWrite - */ - bool tryEnterWrite() const noexcept; - - /** Releases the write-lock. - - If the caller thread hasn't got the lock, this can have unpredictable results. - - If the enterWrite() method has been called multiple times by the thread, each - call must be matched by a call to exit() before other threads will be allowed - to take over the lock. - - @see enterWrite, ScopedWriteLock - */ - void exitWrite() const noexcept; - - -private: - //============================================================================== - SpinLock accessLock; - WaitableEvent waitEvent; - mutable int numWaitingWriters, numWriters; - mutable Thread::ThreadID writerThreadId; - - struct ThreadRecursionCount - { - Thread::ThreadID threadID; - int count; - }; - - mutable Array readerThreads; - - bool tryEnterWriteInternal (Thread::ThreadID) const noexcept; - - JUCE_DECLARE_NON_COPYABLE (ReadWriteLock) -}; - - -#endif // JUCE_READWRITELOCK_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h deleted file mode 100755 index 442551a..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedLock.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SCOPEDLOCK_H_INCLUDED -#define JUCE_SCOPEDLOCK_H_INCLUDED - - -//============================================================================== -/** - Automatically locks and unlocks a mutex object. - - Use one of these as a local variable to provide RAII-based locking of a mutex. - - The templated class could be a CriticalSection, SpinLock, or anything else that - provides enter() and exit() methods. - - e.g. @code - CriticalSection myCriticalSection; - - for (;;) - { - const GenericScopedLock myScopedLock (myCriticalSection); - // myCriticalSection is now locked - - ...do some stuff... - - // myCriticalSection gets unlocked here. - } - @endcode - - @see GenericScopedUnlock, CriticalSection, SpinLock, ScopedLock, ScopedUnlock -*/ -template -class GenericScopedLock -{ -public: - //============================================================================== - /** Creates a GenericScopedLock. - - As soon as it is created, this will acquire the lock, and when the GenericScopedLock - object is deleted, the lock will be released. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit GenericScopedLock (const LockType& lock) noexcept : lock_ (lock) { lock.enter(); } - - /** Destructor. - The lock will be released when the destructor is called. - Make sure this object is created and deleted by the same thread, otherwise there are - no guarantees what will happen! - */ - inline ~GenericScopedLock() noexcept { lock_.exit(); } - -private: - //============================================================================== - const LockType& lock_; - - JUCE_DECLARE_NON_COPYABLE (GenericScopedLock) -}; - - -//============================================================================== -/** - Automatically unlocks and re-locks a mutex object. - - This is the reverse of a GenericScopedLock object - instead of locking the mutex - for the lifetime of this object, it unlocks it. - - Make sure you don't try to unlock mutexes that aren't actually locked! - - e.g. @code - - CriticalSection myCriticalSection; - - for (;;) - { - const GenericScopedLock myScopedLock (myCriticalSection); - // myCriticalSection is now locked - - ... do some stuff with it locked .. - - while (xyz) - { - ... do some stuff with it locked .. - - const GenericScopedUnlock unlocker (myCriticalSection); - - // myCriticalSection is now unlocked for the remainder of this block, - // and re-locked at the end. - - ...do some stuff with it unlocked ... - } - - // myCriticalSection gets unlocked here. - } - @endcode - - @see GenericScopedLock, CriticalSection, ScopedLock, ScopedUnlock -*/ -template -class GenericScopedUnlock -{ -public: - //============================================================================== - /** Creates a GenericScopedUnlock. - - As soon as it is created, this will unlock the CriticalSection, and - when the ScopedLock object is deleted, the CriticalSection will - be re-locked. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit GenericScopedUnlock (const LockType& lock) noexcept : lock_ (lock) { lock.exit(); } - - /** Destructor. - - The CriticalSection will be unlocked when the destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~GenericScopedUnlock() noexcept { lock_.enter(); } - - -private: - //============================================================================== - const LockType& lock_; - - JUCE_DECLARE_NON_COPYABLE (GenericScopedUnlock) -}; - - -//============================================================================== -/** - Automatically locks and unlocks a mutex object. - - Use one of these as a local variable to provide RAII-based locking of a mutex. - - The templated class could be a CriticalSection, SpinLock, or anything else that - provides enter() and exit() methods. - - e.g. @code - - CriticalSection myCriticalSection; - - for (;;) - { - const GenericScopedTryLock myScopedTryLock (myCriticalSection); - - // Unlike using a ScopedLock, this may fail to actually get the lock, so you - // should test this with the isLocked() method before doing your thread-unsafe - // action.. - if (myScopedTryLock.isLocked()) - { - ...do some stuff... - } - else - { - ..our attempt at locking failed because another thread had already locked it.. - } - - // myCriticalSection gets unlocked here (if it was locked) - } - @endcode - - @see CriticalSection::tryEnter, GenericScopedLock, GenericScopedUnlock -*/ -template -class GenericScopedTryLock -{ -public: - //============================================================================== - /** Creates a GenericScopedTryLock. - - As soon as it is created, this will attempt to acquire the lock, and when the - GenericScopedTryLock is deleted, the lock will be released (if the lock was - successfully acquired). - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit GenericScopedTryLock (const LockType& lock) noexcept - : lock_ (lock), lockWasSuccessful (lock.tryEnter()) {} - - /** Destructor. - - The mutex will be unlocked (if it had been successfully locked) when the - destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~GenericScopedTryLock() noexcept { if (lockWasSuccessful) lock_.exit(); } - - /** Returns true if the mutex was successfully locked. */ - bool isLocked() const noexcept { return lockWasSuccessful; } - -private: - //============================================================================== - const LockType& lock_; - const bool lockWasSuccessful; - - JUCE_DECLARE_NON_COPYABLE (GenericScopedTryLock) -}; - - -#endif // JUCE_SCOPEDLOCK_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h deleted file mode 100755 index 107e838..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedReadLock.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SCOPEDREADLOCK_H_INCLUDED -#define JUCE_SCOPEDREADLOCK_H_INCLUDED - - -//============================================================================== -/** - Automatically locks and unlocks a ReadWriteLock object. - - Use one of these as a local variable to control access to a ReadWriteLock. - - e.g. @code - - ReadWriteLock myLock; - - for (;;) - { - const ScopedReadLock myScopedLock (myLock); - // myLock is now locked - - ...do some stuff... - - // myLock gets unlocked here. - } - @endcode - - @see ReadWriteLock, ScopedWriteLock -*/ -class JUCE_API ScopedReadLock -{ -public: - //============================================================================== - /** Creates a ScopedReadLock. - - As soon as it is created, this will call ReadWriteLock::enterRead(), and - when the ScopedReadLock object is deleted, the ReadWriteLock will - be unlocked. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit ScopedReadLock (const ReadWriteLock& lock) noexcept : lock_ (lock) { lock.enterRead(); } - - /** Destructor. - - The ReadWriteLock's exitRead() method will be called when the destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~ScopedReadLock() noexcept { lock_.exitRead(); } - - -private: - //============================================================================== - const ReadWriteLock& lock_; - - JUCE_DECLARE_NON_COPYABLE (ScopedReadLock) -}; - - -#endif // JUCE_SCOPEDREADLOCK_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h deleted file mode 100755 index 44e3198..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ScopedWriteLock.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SCOPEDWRITELOCK_H_INCLUDED -#define JUCE_SCOPEDWRITELOCK_H_INCLUDED - - -//============================================================================== -/** - Automatically locks and unlocks a ReadWriteLock object. - - Use one of these as a local variable to control access to a ReadWriteLock. - - e.g. @code - - ReadWriteLock myLock; - - for (;;) - { - const ScopedWriteLock myScopedLock (myLock); - // myLock is now locked - - ...do some stuff... - - // myLock gets unlocked here. - } - @endcode - - @see ReadWriteLock, ScopedReadLock -*/ -class JUCE_API ScopedWriteLock -{ -public: - //============================================================================== - /** Creates a ScopedWriteLock. - - As soon as it is created, this will call ReadWriteLock::enterWrite(), and - when the ScopedWriteLock object is deleted, the ReadWriteLock will - be unlocked. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! Best just to use it - as a local stack object, rather than creating one with the new() operator. - */ - inline explicit ScopedWriteLock (const ReadWriteLock& lock) noexcept : lock_ (lock) { lock.enterWrite(); } - - /** Destructor. - - The ReadWriteLock's exitWrite() method will be called when the destructor is called. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - inline ~ScopedWriteLock() noexcept { lock_.exitWrite(); } - - -private: - //============================================================================== - const ReadWriteLock& lock_; - - JUCE_DECLARE_NON_COPYABLE (ScopedWriteLock) -}; - - -#endif // JUCE_SCOPEDWRITELOCK_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h b/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h deleted file mode 100755 index 664cc3c..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_SpinLock.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_SPINLOCK_H_INCLUDED -#define JUCE_SPINLOCK_H_INCLUDED - - -//============================================================================== -/** - A simple spin-lock class that can be used as a simple, low-overhead mutex for - uncontended situations. - - Note that unlike a CriticalSection, this type of lock is not re-entrant, and may - be less efficient when used it a highly contended situation, but it's very small and - requires almost no initialisation. - It's most appropriate for simple situations where you're only going to hold the - lock for a very brief time. - - @see CriticalSection -*/ -class JUCE_API SpinLock -{ -public: - inline SpinLock() noexcept {} - inline ~SpinLock() noexcept {} - - /** Acquires the lock. - This will block until the lock has been successfully acquired by this thread. - Note that a SpinLock is NOT re-entrant, and is not smart enough to know whether the - caller thread already has the lock - so if a thread tries to acquire a lock that it - already holds, this method will never return! - - It's strongly recommended that you never call this method directly - instead use the - ScopedLockType class to manage the locking using an RAII pattern instead. - */ - void enter() const noexcept; - - /** Attempts to acquire the lock, returning true if this was successful. */ - inline bool tryEnter() const noexcept - { - return lock.compareAndSetBool (1, 0); - } - - /** Releases the lock. */ - inline void exit() const noexcept - { - jassert (lock.value == 1); // Agh! Releasing a lock that isn't currently held! - lock = 0; - } - - //============================================================================== - /** Provides the type of scoped lock to use for locking a SpinLock. */ - typedef GenericScopedLock ScopedLockType; - - /** Provides the type of scoped unlocker to use with a SpinLock. */ - typedef GenericScopedUnlock ScopedUnlockType; - -private: - //============================================================================== - mutable Atomic lock; - - JUCE_DECLARE_NON_COPYABLE (SpinLock) -}; - - -#endif // JUCE_SPINLOCK_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp deleted file mode 100755 index dbba6cb..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_Thread.cpp +++ /dev/null @@ -1,373 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -Thread::Thread (const String& threadName_) - : threadName (threadName_), - threadHandle (nullptr), - threadId (0), - threadPriority (5), - affinityMask (0), - shouldExit (false) -{ -} - -Thread::~Thread() -{ - /* If your thread class's destructor has been called without first stopping the thread, that - means that this partially destructed object is still performing some work - and that's - probably a Bad Thing! - - To avoid this type of nastiness, always make sure you call stopThread() before or during - your subclass's destructor. - */ - jassert (! isThreadRunning()); - - stopThread (-1); -} - -//============================================================================== -// Use a ref-counted object to hold this shared data, so that it can outlive its static -// shared pointer when threads are still running during static shutdown. -struct CurrentThreadHolder : public ReferenceCountedObject -{ - CurrentThreadHolder() noexcept {} - - typedef ReferenceCountedObjectPtr Ptr; - ThreadLocalValue value; - - JUCE_DECLARE_NON_COPYABLE (CurrentThreadHolder) -}; - -static char currentThreadHolderLock [sizeof (SpinLock)]; // (statically initialised to zeros). - -static SpinLock* castToSpinLockWithoutAliasingWarning (void* s) -{ - return static_cast (s); -} - -static CurrentThreadHolder::Ptr getCurrentThreadHolder() -{ - static CurrentThreadHolder::Ptr currentThreadHolder; - SpinLock::ScopedLockType lock (*castToSpinLockWithoutAliasingWarning (currentThreadHolderLock)); - - if (currentThreadHolder == nullptr) - currentThreadHolder = new CurrentThreadHolder(); - - return currentThreadHolder; -} - -void Thread::threadEntryPoint() -{ - const CurrentThreadHolder::Ptr currentThreadHolder (getCurrentThreadHolder()); - currentThreadHolder->value = this; - -#ifdef CPL_TRACEGUARD_ENTRYPOINTS - CPL_TRACEGUARD_START -#endif - if (threadName.isNotEmpty()) - setCurrentThreadName (threadName); - - if (startSuspensionEvent.wait (10000)) - { - jassert (getCurrentThreadId() == threadId); - - if (affinityMask != 0) - setCurrentThreadAffinityMask (affinityMask); - - run(); - } - #ifdef CPL_TRACEGUARD_ENTRYPOINTS - CPL_TRACEGUARD_STOP(threadName.toStdString().c_str()); - #endif - - currentThreadHolder->value.releaseCurrentThreadStorage(); - closeThreadHandle(); -} - -// used to wrap the incoming call from the platform-specific code -void JUCE_API juce_threadEntryPoint (void* userData) -{ - static_cast (userData)->threadEntryPoint(); -} - -//============================================================================== -void Thread::startThread() -{ - const ScopedLock sl (startStopLock); - - shouldExit = false; - - if (threadHandle == nullptr) - { - launchThread(); - setThreadPriority (threadHandle, threadPriority); - startSuspensionEvent.signal(); - } -} - -void Thread::startThread (const int priority) -{ - const ScopedLock sl (startStopLock); - - if (threadHandle == nullptr) - { - threadPriority = priority; - startThread(); - } - else - { - setPriority (priority); - } -} - -bool Thread::isThreadRunning() const -{ - return threadHandle != nullptr; -} - -Thread* JUCE_CALLTYPE Thread::getCurrentThread() -{ - return getCurrentThreadHolder()->value.get(); -} - -//============================================================================== -void Thread::signalThreadShouldExit() -{ - shouldExit = true; -} - -bool Thread::waitForThreadToExit (const int timeOutMilliseconds) const -{ - // Doh! So how exactly do you expect this thread to wait for itself to stop?? - jassert (getThreadId() != getCurrentThreadId() || getCurrentThreadId() == 0); - - const uint32 timeoutEnd = Time::getMillisecondCounter() + (uint32) timeOutMilliseconds; - - while (isThreadRunning()) - { - if (timeOutMilliseconds >= 0 && Time::getMillisecondCounter() > timeoutEnd) - return false; - - sleep (2); - } - - return true; -} - -bool Thread::stopThread (const int timeOutMilliseconds) -{ - // agh! You can't stop the thread that's calling this method! How on earth - // would that work?? - jassert (getCurrentThreadId() != getThreadId()); - - const ScopedLock sl (startStopLock); - - if (isThreadRunning()) - { - signalThreadShouldExit(); - notify(); - - if (timeOutMilliseconds != 0) - waitForThreadToExit (timeOutMilliseconds); - - if (isThreadRunning()) - { - // very bad karma if this point is reached, as there are bound to be - // locks and events left in silly states when a thread is killed by force.. - jassertfalse; - Logger::writeToLog ("!! killing thread by force !!"); - - killThread(); - - threadHandle = nullptr; - threadId = 0; - return false; - } - } - - return true; -} - -//============================================================================== -bool Thread::setPriority (const int newPriority) -{ - // NB: deadlock possible if you try to set the thread prio from the thread itself, - // so using setCurrentThreadPriority instead in that case. - if (getCurrentThreadId() == getThreadId()) - return setCurrentThreadPriority (newPriority); - - const ScopedLock sl (startStopLock); - - if ((! isThreadRunning()) || setThreadPriority (threadHandle, newPriority)) - { - threadPriority = newPriority; - return true; - } - - return false; -} - -bool Thread::setCurrentThreadPriority (const int newPriority) -{ - return setThreadPriority (0, newPriority); -} - -void Thread::setAffinityMask (const uint32 newAffinityMask) -{ - affinityMask = newAffinityMask; -} - -//============================================================================== -bool Thread::wait (const int timeOutMilliseconds) const -{ - return defaultEvent.wait (timeOutMilliseconds); -} - -void Thread::notify() const -{ - defaultEvent.signal(); -} - -//============================================================================== -void SpinLock::enter() const noexcept -{ - if (! tryEnter()) - { - for (int i = 20; --i >= 0;) - if (tryEnter()) - return; - - while (! tryEnter()) - Thread::yield(); - } -} - -//============================================================================== -#if JUCE_UNIT_TESTS - -class AtomicTests : public UnitTest -{ -public: - AtomicTests() : UnitTest ("Atomics") {} - - void runTest() - { - beginTest ("Misc"); - - char a1[7]; - expect (numElementsInArray(a1) == 7); - int a2[3]; - expect (numElementsInArray(a2) == 3); - - expect (ByteOrder::swap ((uint16) 0x1122) == 0x2211); - expect (ByteOrder::swap ((uint32) 0x11223344) == 0x44332211); - expect (ByteOrder::swap ((uint64) 0x1122334455667788ULL) == 0x8877665544332211LL); - - beginTest ("Atomic int"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic unsigned int"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic int32"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic uint32"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic long"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic void*"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic int*"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic float"); - AtomicTester ::testFloat (*this); - #if ! JUCE_64BIT_ATOMICS_UNAVAILABLE // 64-bit intrinsics aren't available on some old platforms - beginTest ("Atomic int64"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic uint64"); - AtomicTester ::testInteger (*this); - beginTest ("Atomic double"); - AtomicTester ::testFloat (*this); - #endif - } - - template - class AtomicTester - { - public: - AtomicTester() {} - - static void testInteger (UnitTest& test) - { - Atomic a, b; - a.set ((Type) 10); - test.expect (a.value == (Type) 10); - test.expect (a.get() == (Type) 10); - a += (Type) 15; - test.expect (a.get() == (Type) 25); - a.memoryBarrier(); - a -= (Type) 5; - test.expect (a.get() == (Type) 20); - test.expect (++a == (Type) 21); - ++a; - test.expect (--a == (Type) 21); - test.expect (a.get() == (Type) 21); - a.memoryBarrier(); - - testFloat (test); - } - - static void testFloat (UnitTest& test) - { - Atomic a, b; - a = (Type) 21; - a.memoryBarrier(); - - /* These are some simple test cases to check the atomics - let me know - if any of these assertions fail on your system! - */ - test.expect (a.get() == (Type) 21); - test.expect (a.compareAndSetValue ((Type) 100, (Type) 50) == (Type) 21); - test.expect (a.get() == (Type) 21); - test.expect (a.compareAndSetValue ((Type) 101, a.get()) == (Type) 21); - test.expect (a.get() == (Type) 101); - test.expect (! a.compareAndSetBool ((Type) 300, (Type) 200)); - test.expect (a.get() == (Type) 101); - test.expect (a.compareAndSetBool ((Type) 200, a.get())); - test.expect (a.get() == (Type) 200); - - test.expect (a.exchange ((Type) 300) == (Type) 200); - test.expect (a.get() == (Type) 300); - - b = a; - test.expect (b.get() == a.get()); - } - }; -}; - -static AtomicTests atomicUnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h b/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h deleted file mode 100755 index aef96b7..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_Thread.h +++ /dev/null @@ -1,289 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_THREAD_H_INCLUDED -#define JUCE_THREAD_H_INCLUDED - - -//============================================================================== -/** - Encapsulates a thread. - - Subclasses derive from Thread and implement the run() method, in which they - do their business. The thread can then be started with the startThread() method - and controlled with various other methods. - - This class also contains some thread-related static methods, such - as sleep(), yield(), getCurrentThreadId() etc. - - @see CriticalSection, WaitableEvent, Process, ThreadWithProgressWindow, - MessageManagerLock -*/ -class JUCE_API Thread -{ -public: - //============================================================================== - /** - Creates a thread. - - When first created, the thread is not running. Use the startThread() - method to start it. - */ - explicit Thread (const String& threadName); - - /** Destructor. - - You must never attempt to delete a Thread object while it's still running - - always call stopThread() and make sure your thread has stopped before deleting - the object. Failing to do so will throw an assertion, and put you firmly into - undefined behaviour territory. - */ - virtual ~Thread(); - - //============================================================================== - /** Must be implemented to perform the thread's actual code. - - Remember that the thread must regularly check the threadShouldExit() - method whilst running, and if this returns true it should return from - the run() method as soon as possible to avoid being forcibly killed. - - @see threadShouldExit, startThread - */ - virtual void run() = 0; - - //============================================================================== - // Thread control functions.. - - /** Starts the thread running. - - This will cause the thread's run() method to be called by a new thread. - If this thread is already running, startThread() won't do anything. - - @see stopThread - */ - void startThread(); - - /** Starts the thread with a given priority. - - Launches the thread with a given priority, where 0 = lowest, 10 = highest. - If the thread is already running, its priority will be changed. - - @see startThread, setPriority - */ - void startThread (int priority); - - /** Attempts to stop the thread running. - - This method will cause the threadShouldExit() method to return true - and call notify() in case the thread is currently waiting. - - Hopefully the thread will then respond to this by exiting cleanly, and - the stopThread method will wait for a given time-period for this to - happen. - - If the thread is stuck and fails to respond after the time-out, it gets - forcibly killed, which is a very bad thing to happen, as it could still - be holding locks, etc. which are needed by other parts of your program. - - @param timeOutMilliseconds The number of milliseconds to wait for the - thread to finish before killing it by force. A negative - value in here will wait forever. - @returns true if the thread was cleanly stopped before the timeout, or false - if it had to be killed by force. - @see signalThreadShouldExit, threadShouldExit, waitForThreadToExit, isThreadRunning - */ - bool stopThread (int timeOutMilliseconds); - - //============================================================================== - /** Returns true if the thread is currently active */ - bool isThreadRunning() const; - - /** Sets a flag to tell the thread it should stop. - - Calling this means that the threadShouldExit() method will then return true. - The thread should be regularly checking this to see whether it should exit. - - If your thread makes use of wait(), you might want to call notify() after calling - this method, to interrupt any waits that might be in progress, and allow it - to reach a point where it can exit. - - @see threadShouldExit - @see waitForThreadToExit - */ - void signalThreadShouldExit(); - - /** Checks whether the thread has been told to stop running. - - Threads need to check this regularly, and if it returns true, they should - return from their run() method at the first possible opportunity. - - @see signalThreadShouldExit - */ - inline bool threadShouldExit() const { return shouldExit; } - - /** Waits for the thread to stop. - - This will waits until isThreadRunning() is false or until a timeout expires. - - @param timeOutMilliseconds the time to wait, in milliseconds. If this value - is less than zero, it will wait forever. - @returns true if the thread exits, or false if the timeout expires first. - */ - bool waitForThreadToExit (int timeOutMilliseconds) const; - - //============================================================================== - /** Changes the thread's priority. - May return false if for some reason the priority can't be changed. - - @param priority the new priority, in the range 0 (lowest) to 10 (highest). A priority - of 5 is normal. - */ - bool setPriority (int priority); - - /** Changes the priority of the caller thread. - - Similar to setPriority(), but this static method acts on the caller thread. - May return false if for some reason the priority can't be changed. - - @see setPriority - */ - static bool setCurrentThreadPriority (int priority); - - //============================================================================== - /** Sets the affinity mask for the thread. - - This will only have an effect next time the thread is started - i.e. if the - thread is already running when called, it'll have no effect. - - @see setCurrentThreadAffinityMask - */ - void setAffinityMask (uint32 affinityMask); - - /** Changes the affinity mask for the caller thread. - This will change the affinity mask for the thread that calls this static method. - @see setAffinityMask - */ - static void JUCE_CALLTYPE setCurrentThreadAffinityMask (uint32 affinityMask); - - //============================================================================== - // this can be called from any thread that needs to pause.. - static void JUCE_CALLTYPE sleep (int milliseconds); - - /** Yields the calling thread's current time-slot. */ - static void JUCE_CALLTYPE yield(); - - //============================================================================== - /** Makes the thread wait for a notification. - - This puts the thread to sleep until either the timeout period expires, or - another thread calls the notify() method to wake it up. - - A negative time-out value means that the method will wait indefinitely. - - @returns true if the event has been signalled, false if the timeout expires. - */ - bool wait (int timeOutMilliseconds) const; - - /** Wakes up the thread. - - If the thread has called the wait() method, this will wake it up. - - @see wait - */ - void notify() const; - - //============================================================================== - /** A value type used for thread IDs. - @see getCurrentThreadId(), getThreadId() - */ - typedef void* ThreadID; - - /** Returns an id that identifies the caller thread. - - To find the ID of a particular thread object, use getThreadId(). - - @returns a unique identifier that identifies the calling thread. - @see getThreadId - */ - static ThreadID JUCE_CALLTYPE getCurrentThreadId(); - - /** Finds the thread object that is currently running. - - Note that the main UI thread (or other non-Juce threads) don't have a Thread - object associated with them, so this will return 0. - */ - static Thread* JUCE_CALLTYPE getCurrentThread(); - - /** Returns the ID of this thread. - - That means the ID of this thread object - not of the thread that's calling the method. - - This can change when the thread is started and stopped, and will be invalid if the - thread's not actually running. - - @see getCurrentThreadId - */ - ThreadID getThreadId() const noexcept { return threadId; } - - /** Returns the name of the thread. - - This is the name that gets set in the constructor. - */ - const String& getThreadName() const { return threadName; } - - /** Changes the name of the caller thread. - Different OSes may place different length or content limits on this name. - */ - static void JUCE_CALLTYPE setCurrentThreadName (const String& newThreadName); - - -private: - //============================================================================== - const String threadName; - void* volatile threadHandle; - ThreadID threadId; - CriticalSection startStopLock; - WaitableEvent startSuspensionEvent, defaultEvent; - int threadPriority; - uint32 affinityMask; - bool volatile shouldExit; - - #ifndef DOXYGEN - friend void JUCE_API juce_threadEntryPoint (void*); - #endif - - void launchThread(); - void closeThreadHandle(); - void killThread(); - void threadEntryPoint(); - static bool setThreadPriority (void*, int); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Thread) -}; - -#endif // JUCE_THREAD_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h b/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h deleted file mode 100755 index bd5c808..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadLocalValue.h +++ /dev/null @@ -1,198 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_THREADLOCALVALUE_H_INCLUDED -#define JUCE_THREADLOCALVALUE_H_INCLUDED - -// (NB: on win32, native thread-locals aren't possible in a dynamically loaded DLL in XP). -#if ! ((JUCE_MSVC && (JUCE_64BIT || ! defined (JucePlugin_PluginCode))) \ - || (JUCE_MAC && JUCE_CLANG && defined (MAC_OS_X_VERSION_10_7) \ - && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7)) - #define JUCE_NO_COMPILER_THREAD_LOCAL 1 -#endif - -//============================================================================== -/** - Provides cross-platform support for thread-local objects. - - This class holds an internal list of objects of the templated type, keeping - an instance for each thread that requests one. The first time a thread attempts - to access its value, an object is created and added to the list for that thread. - - Typically, you'll probably want to create a static instance of a ThreadLocalValue - object, or hold one within a singleton. - - The templated class for your value must be a primitive type, or a simple POD struct. - - When a thread no longer needs to use its value, it can call releaseCurrentThreadStorage() - to allow the storage to be re-used by another thread. If a thread exits without calling - this method, the object storage will be left allocated until the ThreadLocalValue object - is deleted. -*/ -template -class ThreadLocalValue -{ -public: - /** */ - ThreadLocalValue() noexcept - { - } - - /** Destructor. - When this object is deleted, all the value objects for all threads will be deleted. - */ - ~ThreadLocalValue() - { - #if JUCE_NO_COMPILER_THREAD_LOCAL - for (ObjectHolder* o = first.value; o != nullptr;) - { - ObjectHolder* const next = o->next; - delete o; - o = next; - } - #endif - } - - /** Returns a reference to this thread's instance of the value. - Note that the first time a thread tries to access the value, an instance of the - value object will be created - so if your value's class has a non-trivial - constructor, be aware that this method could invoke it. - */ - Type& operator*() const noexcept { return get(); } - - /** Returns a pointer to this thread's instance of the value. - Note that the first time a thread tries to access the value, an instance of the - value object will be created - so if your value's class has a non-trivial - constructor, be aware that this method could invoke it. - */ - operator Type*() const noexcept { return &get(); } - - /** Accesses a method or field of the value object. - Note that the first time a thread tries to access the value, an instance of the - value object will be created - so if your value's class has a non-trivial - constructor, be aware that this method could invoke it. - */ - Type* operator->() const noexcept { return &get(); } - - /** Assigns a new value to the thread-local object. */ - ThreadLocalValue& operator= (const Type& newValue) { get() = newValue; return *this; } - - /** Returns a reference to this thread's instance of the value. - Note that the first time a thread tries to access the value, an instance of the - value object will be created - so if your value's class has a non-trivial - constructor, be aware that this method could invoke it. - */ - Type& get() const noexcept - { - #if JUCE_NO_COMPILER_THREAD_LOCAL - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - - for (ObjectHolder* o = first.get(); o != nullptr; o = o->next) - if (o->threadId == threadId) - return o->object; - - for (ObjectHolder* o = first.get(); o != nullptr; o = o->next) - { - if (o->threadId == nullptr) - { - { - SpinLock::ScopedLockType sl (lock); - - if (o->threadId != nullptr) - continue; - - o->threadId = threadId; - } - - o->object = Type(); - return o->object; - } - } - - ObjectHolder* const newObject = new ObjectHolder (threadId); - - do - { - newObject->next = first.get(); - } - while (! first.compareAndSetBool (newObject, newObject->next)); - - return newObject->object; - #elif JUCE_MAC - static __thread Type object; - return object; - #elif JUCE_MSVC - static __declspec(thread) Type object; - return object; - #endif - } - - /** Called by a thread before it terminates, to allow this class to release - any storage associated with the thread. - */ - void releaseCurrentThreadStorage() - { - #if JUCE_NO_COMPILER_THREAD_LOCAL - const Thread::ThreadID threadId = Thread::getCurrentThreadId(); - - for (ObjectHolder* o = first.get(); o != nullptr; o = o->next) - { - if (o->threadId == threadId) - { - SpinLock::ScopedLockType sl (lock); - o->threadId = nullptr; - } - } - #endif - } - -private: - //============================================================================== - #if JUCE_NO_COMPILER_THREAD_LOCAL - struct ObjectHolder - { - ObjectHolder (const Thread::ThreadID& tid) - : threadId (tid), next (nullptr), object() - {} - - Thread::ThreadID threadId; - ObjectHolder* next; - Type object; - - JUCE_DECLARE_NON_COPYABLE (ObjectHolder) - }; - - mutable Atomic first; - SpinLock lock; - #endif - - JUCE_DECLARE_NON_COPYABLE (ThreadLocalValue) -}; - - -#endif // JUCE_THREADLOCALVALUE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp deleted file mode 100755 index e6b0b9f..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -class ThreadPool::ThreadPoolThread : public Thread -{ -public: - ThreadPoolThread (ThreadPool& p) - : Thread ("Pool"), currentJob (nullptr), pool (p) - { - } - - void run() override - { - while (! threadShouldExit()) - if (! pool.runNextJob (*this)) - wait (500); - } - - ThreadPoolJob* volatile currentJob; - ThreadPool& pool; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ThreadPoolThread) -}; - -//============================================================================== -ThreadPoolJob::ThreadPoolJob (const String& name) - : jobName (name), pool (nullptr), - shouldStop (false), isActive (false), shouldBeDeleted (false) -{ -} - -ThreadPoolJob::~ThreadPoolJob() -{ - // you mustn't delete a job while it's still in a pool! Use ThreadPool::removeJob() - // to remove it first! - jassert (pool == nullptr || ! pool->contains (this)); -} - -String ThreadPoolJob::getJobName() const -{ - return jobName; -} - -void ThreadPoolJob::setJobName (const String& newName) -{ - jobName = newName; -} - -void ThreadPoolJob::signalJobShouldExit() -{ - shouldStop = true; -} - -ThreadPoolJob* ThreadPoolJob::getCurrentThreadPoolJob() -{ - if (ThreadPool::ThreadPoolThread* t = dynamic_cast (Thread::getCurrentThread())) - return t->currentJob; - - return nullptr; -} - -//============================================================================== -ThreadPool::ThreadPool (const int numThreads) -{ - jassert (numThreads > 0); // not much point having a pool without any threads! - - createThreads (numThreads); -} - -ThreadPool::ThreadPool() -{ - createThreads (SystemStats::getNumCpus()); -} - -ThreadPool::~ThreadPool() -{ - removeAllJobs (true, 5000); - stopThreads(); -} - -void ThreadPool::createThreads (int numThreads) -{ - for (int i = jmax (1, numThreads); --i >= 0;) - threads.add (new ThreadPoolThread (*this)); - - for (int i = threads.size(); --i >= 0;) - threads.getUnchecked(i)->startThread(); -} - -void ThreadPool::stopThreads() -{ - for (int i = threads.size(); --i >= 0;) - threads.getUnchecked(i)->signalThreadShouldExit(); - - for (int i = threads.size(); --i >= 0;) - threads.getUnchecked(i)->stopThread (500); -} - -void ThreadPool::addJob (ThreadPoolJob* const job, const bool deleteJobWhenFinished) -{ - jassert (job != nullptr); - jassert (job->pool == nullptr); - - if (job->pool == nullptr) - { - job->pool = this; - job->shouldStop = false; - job->isActive = false; - job->shouldBeDeleted = deleteJobWhenFinished; - - { - const ScopedLock sl (lock); - jobs.add (job); - } - - for (int i = threads.size(); --i >= 0;) - threads.getUnchecked(i)->notify(); - } -} - -int ThreadPool::getNumJobs() const -{ - return jobs.size(); -} - -ThreadPoolJob* ThreadPool::getJob (const int index) const -{ - const ScopedLock sl (lock); - return jobs [index]; -} - -bool ThreadPool::contains (const ThreadPoolJob* const job) const -{ - const ScopedLock sl (lock); - return jobs.contains (const_cast (job)); -} - -bool ThreadPool::isJobRunning (const ThreadPoolJob* const job) const -{ - const ScopedLock sl (lock); - return jobs.contains (const_cast (job)) && job->isActive; -} - -bool ThreadPool::waitForJobToFinish (const ThreadPoolJob* const job, const int timeOutMs) const -{ - if (job != nullptr) - { - const uint32 start = Time::getMillisecondCounter(); - - while (contains (job)) - { - if (timeOutMs >= 0 && Time::getMillisecondCounter() >= start + (uint32) timeOutMs) - return false; - - jobFinishedSignal.wait (2); - } - } - - return true; -} - -bool ThreadPool::removeJob (ThreadPoolJob* const job, - const bool interruptIfRunning, - const int timeOutMs) -{ - bool dontWait = true; - OwnedArray deletionList; - - if (job != nullptr) - { - const ScopedLock sl (lock); - - if (jobs.contains (job)) - { - if (job->isActive) - { - if (interruptIfRunning) - job->signalJobShouldExit(); - - dontWait = false; - } - else - { - jobs.removeFirstMatchingValue (job); - addToDeleteList (deletionList, job); - } - } - } - - return dontWait || waitForJobToFinish (job, timeOutMs); -} - -bool ThreadPool::removeAllJobs (const bool interruptRunningJobs, const int timeOutMs, - ThreadPool::JobSelector* const selectedJobsToRemove) -{ - Array jobsToWaitFor; - - { - OwnedArray deletionList; - - { - const ScopedLock sl (lock); - - for (int i = jobs.size(); --i >= 0;) - { - ThreadPoolJob* const job = jobs.getUnchecked(i); - - if (selectedJobsToRemove == nullptr || selectedJobsToRemove->isJobSuitable (job)) - { - if (job->isActive) - { - jobsToWaitFor.add (job); - - if (interruptRunningJobs) - job->signalJobShouldExit(); - } - else - { - jobs.remove (i); - addToDeleteList (deletionList, job); - } - } - } - } - } - - const uint32 start = Time::getMillisecondCounter(); - - for (;;) - { - for (int i = jobsToWaitFor.size(); --i >= 0;) - { - ThreadPoolJob* const job = jobsToWaitFor.getUnchecked (i); - - if (! isJobRunning (job)) - jobsToWaitFor.remove (i); - } - - if (jobsToWaitFor.size() == 0) - break; - - if (timeOutMs >= 0 && Time::getMillisecondCounter() >= start + (uint32) timeOutMs) - return false; - - jobFinishedSignal.wait (20); - } - - return true; -} - -StringArray ThreadPool::getNamesOfAllJobs (const bool onlyReturnActiveJobs) const -{ - StringArray s; - const ScopedLock sl (lock); - - for (int i = 0; i < jobs.size(); ++i) - { - const ThreadPoolJob* const job = jobs.getUnchecked(i); - if (job->isActive || ! onlyReturnActiveJobs) - s.add (job->getJobName()); - } - - return s; -} - -bool ThreadPool::setThreadPriorities (const int newPriority) -{ - bool ok = true; - - for (int i = threads.size(); --i >= 0;) - if (! threads.getUnchecked(i)->setPriority (newPriority)) - ok = false; - - return ok; -} - -ThreadPoolJob* ThreadPool::pickNextJobToRun() -{ - OwnedArray deletionList; - - { - const ScopedLock sl (lock); - - for (int i = 0; i < jobs.size(); ++i) - { - ThreadPoolJob* job = jobs[i]; - - if (job != nullptr && ! job->isActive) - { - if (job->shouldStop) - { - jobs.remove (i); - addToDeleteList (deletionList, job); - --i; - continue; - } - - job->isActive = true; - return job; - } - } - } - - return nullptr; -} - -bool ThreadPool::runNextJob (ThreadPoolThread& thread) -{ - if (ThreadPoolJob* const job = pickNextJobToRun()) - { - ThreadPoolJob::JobStatus result = ThreadPoolJob::jobHasFinished; - thread.currentJob = job; - - JUCE_TRY - { - result = job->runJob(); - } - JUCE_CATCH_ALL_ASSERT - - thread.currentJob = nullptr; - - OwnedArray deletionList; - - { - const ScopedLock sl (lock); - - if (jobs.contains (job)) - { - job->isActive = false; - - if (result != ThreadPoolJob::jobNeedsRunningAgain || job->shouldStop) - { - jobs.removeFirstMatchingValue (job); - addToDeleteList (deletionList, job); - - jobFinishedSignal.signal(); - } - else - { - // move the job to the end of the queue if it wants another go - jobs.move (jobs.indexOf (job), -1); - } - } - } - - return true; - } - - return false; -} - -void ThreadPool::addToDeleteList (OwnedArray& deletionList, ThreadPoolJob* const job) const -{ - job->shouldStop = true; - job->pool = nullptr; - - if (job->shouldBeDeleted) - deletionList.add (job); -} diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h b/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h deleted file mode 100755 index 3d5f762..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_ThreadPool.h +++ /dev/null @@ -1,321 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_THREADPOOL_H_INCLUDED -#define JUCE_THREADPOOL_H_INCLUDED - -class ThreadPool; -class ThreadPoolThread; - - -//============================================================================== -/** - A task that is executed by a ThreadPool object. - - A ThreadPool keeps a list of ThreadPoolJob objects which are executed by - its threads. - - The runJob() method needs to be implemented to do the task, and if the code that - does the work takes a significant time to run, it must keep checking the shouldExit() - method to see if something is trying to interrupt the job. If shouldExit() returns - true, the runJob() method must return immediately. - - @see ThreadPool, Thread -*/ -class JUCE_API ThreadPoolJob -{ -public: - //============================================================================== - /** Creates a thread pool job object. - After creating your job, add it to a thread pool with ThreadPool::addJob(). - */ - explicit ThreadPoolJob (const String& name); - - /** Destructor. */ - virtual ~ThreadPoolJob(); - - //============================================================================== - /** Returns the name of this job. - @see setJobName - */ - String getJobName() const; - - /** Changes the job's name. - @see getJobName - */ - void setJobName (const String& newName); - - //============================================================================== - /** These are the values that can be returned by the runJob() method. - */ - enum JobStatus - { - jobHasFinished = 0, /**< indicates that the job has finished and can be - removed from the pool. */ - - jobNeedsRunningAgain /**< indicates that the job would like to be called - again when a thread is free. */ - }; - - /** Peforms the actual work that this job needs to do. - - Your subclass must implement this method, in which is does its work. - - If the code in this method takes a significant time to run, it must repeatedly check - the shouldExit() method to see if something is trying to interrupt the job. - If shouldExit() ever returns true, the runJob() method must return immediately. - - If this method returns jobHasFinished, then the job will be removed from the pool - immediately. If it returns jobNeedsRunningAgain, then the job will be left in the - pool and will get a chance to run again as soon as a thread is free. - - @see shouldExit() - */ - virtual JobStatus runJob() = 0; - - - //============================================================================== - /** Returns true if this job is currently running its runJob() method. */ - bool isRunning() const noexcept { return isActive; } - - /** Returns true if something is trying to interrupt this job and make it stop. - - Your runJob() method must call this whenever it gets a chance, and if it ever - returns true, the runJob() method must return immediately. - - @see signalJobShouldExit() - */ - bool shouldExit() const noexcept { return shouldStop; } - - /** Calling this will cause the shouldExit() method to return true, and the job - should (if it's been implemented correctly) stop as soon as possible. - - @see shouldExit() - */ - void signalJobShouldExit(); - - //============================================================================== - /** If the calling thread is being invoked inside a runJob() method, this will - return the ThreadPoolJob that it belongs to. - */ - static ThreadPoolJob* getCurrentThreadPoolJob(); - - //============================================================================== -private: - friend class ThreadPool; - friend class ThreadPoolThread; - String jobName; - ThreadPool* pool; - bool shouldStop, isActive, shouldBeDeleted; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ThreadPoolJob) -}; - - -//============================================================================== -/** - A set of threads that will run a list of jobs. - - When a ThreadPoolJob object is added to the ThreadPool's list, its runJob() method - will be called by the next pooled thread that becomes free. - - @see ThreadPoolJob, Thread -*/ -class JUCE_API ThreadPool -{ -public: - //============================================================================== - /** Creates a thread pool. - Once you've created a pool, you can give it some jobs by calling addJob(). - @param numberOfThreads the number of threads to run. These will be started - immediately, and will run until the pool is deleted. - */ - ThreadPool (int numberOfThreads); - - /** Creates a thread pool with one thread per CPU core. - Once you've created a pool, you can give it some jobs by calling addJob(). - If you want to specify the number of threads, use the other constructor; this - one creates a pool which has one thread for each CPU core. - @see SystemStats::getNumCpus() - */ - ThreadPool(); - - /** Destructor. - - This will attempt to remove all the jobs before deleting, but if you want to - specify a timeout, you should call removeAllJobs() explicitly before deleting - the pool. - */ - ~ThreadPool(); - - //============================================================================== - /** A callback class used when you need to select which ThreadPoolJob objects are suitable - for some kind of operation. - @see ThreadPool::removeAllJobs - */ - class JUCE_API JobSelector - { - public: - virtual ~JobSelector() {} - - /** Should return true if the specified thread matches your criteria for whatever - operation that this object is being used for. - - Any implementation of this method must be extremely fast and thread-safe! - */ - virtual bool isJobSuitable (ThreadPoolJob* job) = 0; - }; - - //============================================================================== - /** Adds a job to the queue. - - Once a job has been added, then the next time a thread is free, it will run - the job's ThreadPoolJob::runJob() method. Depending on the return value of the - runJob() method, the pool will either remove the job from the pool or add it to - the back of the queue to be run again. - - If deleteJobWhenFinished is true, then the job object will be owned and deleted by - the pool when not needed - if you do this, make sure that your object's destructor - is thread-safe. - - If deleteJobWhenFinished is false, the pointer will be used but not deleted, and - the caller is responsible for making sure the object is not deleted before it has - been removed from the pool. - */ - void addJob (ThreadPoolJob* job, - bool deleteJobWhenFinished); - - /** Tries to remove a job from the pool. - - If the job isn't yet running, this will simply remove it. If it is running, it - will wait for it to finish. - - If the timeout period expires before the job finishes running, then the job will be - left in the pool and this will return false. It returns true if the job is successfully - stopped and removed. - - @param job the job to remove - @param interruptIfRunning if true, then if the job is currently busy, its - ThreadPoolJob::signalJobShouldExit() method will be called to try - to interrupt it. If false, then if the job will be allowed to run - until it stops normally (or the timeout expires) - @param timeOutMilliseconds the length of time this method should wait for the job to finish - before giving up and returning false - */ - bool removeJob (ThreadPoolJob* job, - bool interruptIfRunning, - int timeOutMilliseconds); - - /** Tries to remove all jobs from the pool. - - @param interruptRunningJobs if true, then all running jobs will have their ThreadPoolJob::signalJobShouldExit() - methods called to try to interrupt them - @param timeOutMilliseconds the length of time this method should wait for all the jobs to finish - before giving up and returning false - @param selectedJobsToRemove if this is non-zero, the JobSelector object is asked to decide which - jobs should be removed. If it is zero, all jobs are removed - @returns true if all jobs are successfully stopped and removed; false if the timeout period - expires while waiting for one or more jobs to stop - */ - bool removeAllJobs (bool interruptRunningJobs, - int timeOutMilliseconds, - JobSelector* selectedJobsToRemove = nullptr); - - /** Returns the number of jobs currently running or queued. - */ - int getNumJobs() const; - - /** Returns one of the jobs in the queue. - - Note that this can be a very volatile list as jobs might be continuously getting shifted - around in the list, and this method may return nullptr if the index is currently out-of-range. - */ - ThreadPoolJob* getJob (int index) const; - - /** Returns true if the given job is currently queued or running. - - @see isJobRunning() - */ - bool contains (const ThreadPoolJob* job) const; - - /** Returns true if the given job is currently being run by a thread. - */ - bool isJobRunning (const ThreadPoolJob* job) const; - - /** Waits until a job has finished running and has been removed from the pool. - - This will wait until the job is no longer in the pool - i.e. until its - runJob() method returns ThreadPoolJob::jobHasFinished. - - If the timeout period expires before the job finishes, this will return false; - it returns true if the job has finished successfully. - */ - bool waitForJobToFinish (const ThreadPoolJob* job, - int timeOutMilliseconds) const; - - /** Returns a list of the names of all the jobs currently running or queued. - If onlyReturnActiveJobs is true, only the ones currently running are returned. - */ - StringArray getNamesOfAllJobs (bool onlyReturnActiveJobs) const; - - /** Changes the priority of all the threads. - - This will call Thread::setPriority() for each thread in the pool. - May return false if for some reason the priority can't be changed. - */ - bool setThreadPriorities (int newPriority); - - -private: - //============================================================================== - Array jobs; - - class ThreadPoolThread; - friend class ThreadPoolJob; - friend class ThreadPoolThread; - friend struct ContainerDeletePolicy; - OwnedArray threads; - - CriticalSection lock; - WaitableEvent jobFinishedSignal; - - bool runNextJob (ThreadPoolThread&); - ThreadPoolJob* pickNextJobToRun(); - void addToDeleteList (OwnedArray&, ThreadPoolJob*) const; - void createThreads (int numThreads); - void stopThreads(); - - // Note that this method has changed, and no longer has a parameter to indicate - // whether the jobs should be deleted - see the new method for details. - void removeAllJobs (bool, int, bool); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ThreadPool) -}; - - -#endif // JUCE_THREADPOOL_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp b/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp deleted file mode 100755 index f055a15..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -TimeSliceThread::TimeSliceThread (const String& name) - : Thread (name), - clientBeingCalled (nullptr) -{ -} - -TimeSliceThread::~TimeSliceThread() -{ - stopThread (2000); -} - -//============================================================================== -void TimeSliceThread::addTimeSliceClient (TimeSliceClient* const client, int millisecondsBeforeStarting) -{ - if (client != nullptr) - { - const ScopedLock sl (listLock); - client->nextCallTime = Time::getCurrentTime() + RelativeTime::milliseconds (millisecondsBeforeStarting); - clients.addIfNotAlreadyThere (client); - notify(); - } -} - -void TimeSliceThread::removeTimeSliceClient (TimeSliceClient* const client) -{ - const ScopedLock sl1 (listLock); - - // if there's a chance we're in the middle of calling this client, we need to - // also lock the outer lock.. - if (clientBeingCalled == client) - { - const ScopedUnlock ul (listLock); // unlock first to get the order right.. - - const ScopedLock sl2 (callbackLock); - const ScopedLock sl3 (listLock); - - clients.removeFirstMatchingValue (client); - } - else - { - clients.removeFirstMatchingValue (client); - } -} - -void TimeSliceThread::moveToFrontOfQueue (TimeSliceClient* client) -{ - const ScopedLock sl (listLock); - - if (clients.contains (client)) - { - client->nextCallTime = Time::getCurrentTime(); - notify(); - } -} - -int TimeSliceThread::getNumClients() const -{ - return clients.size(); -} - -TimeSliceClient* TimeSliceThread::getClient (const int i) const -{ - const ScopedLock sl (listLock); - return clients [i]; -} - -//============================================================================== -TimeSliceClient* TimeSliceThread::getNextClient (int index) const -{ - Time soonest; - TimeSliceClient* client = nullptr; - - for (int i = clients.size(); --i >= 0;) - { - TimeSliceClient* const c = clients.getUnchecked ((i + index) % clients.size()); - - if (client == nullptr || c->nextCallTime < soonest) - { - client = c; - soonest = c->nextCallTime; - } - } - - return client; -} - -void TimeSliceThread::run() -{ - int index = 0; - - while (! threadShouldExit()) - { - int timeToWait = 500; - - { - Time nextClientTime; - - { - const ScopedLock sl2 (listLock); - - index = clients.size() > 0 ? ((index + 1) % clients.size()) : 0; - - if (TimeSliceClient* const firstClient = getNextClient (index)) - nextClientTime = firstClient->nextCallTime; - } - - const Time now (Time::getCurrentTime()); - - if (nextClientTime > now) - { - timeToWait = (int) jmin ((int64) 500, (nextClientTime - now).inMilliseconds()); - } - else - { - timeToWait = index == 0 ? 1 : 0; - - const ScopedLock sl (callbackLock); - - { - const ScopedLock sl2 (listLock); - clientBeingCalled = getNextClient (index); - } - - if (clientBeingCalled != nullptr) - { - const int msUntilNextCall = clientBeingCalled->useTimeSlice(); - - const ScopedLock sl2 (listLock); - - if (msUntilNextCall >= 0) - clientBeingCalled->nextCallTime = now + RelativeTime::milliseconds (msUntilNextCall); - else - clients.removeFirstMatchingValue (clientBeingCalled); - - clientBeingCalled = nullptr; - } - } - } - - if (timeToWait > 0) - wait (timeToWait); - } -} diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h b/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h deleted file mode 100755 index 8c30567..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_TimeSliceThread.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_TIMESLICETHREAD_H_INCLUDED -#define JUCE_TIMESLICETHREAD_H_INCLUDED - -class TimeSliceThread; - - -//============================================================================== -/** - Used by the TimeSliceThread class. - - To register your class with a TimeSliceThread, derive from this class and - use the TimeSliceThread::addTimeSliceClient() method to add it to the list. - - Make sure you always call TimeSliceThread::removeTimeSliceClient() before - deleting your client! - - @see TimeSliceThread -*/ -class JUCE_API TimeSliceClient -{ -public: - /** Destructor. */ - virtual ~TimeSliceClient() {} - - /** Called back by a TimeSliceThread. - - When you register this class with it, a TimeSliceThread will repeatedly call - this method. - - The implementation of this method should use its time-slice to do something that's - quick - never block for longer than absolutely necessary. - - @returns Your method should return the number of milliseconds which it would like to wait before being called - again. Returning 0 will make the thread call again as soon as possible (after possibly servicing - other busy clients). If you return a value below zero, your client will be removed from the list of clients, - and won't be called again. The value you specify isn't a guaranteee, and is only used as a hint by the - thread - the actual time before the next callback may be more or less than specified. - You can force the TimeSliceThread to wake up and poll again immediately by calling its notify() method. - */ - virtual int useTimeSlice() = 0; - - -private: - friend class TimeSliceThread; - Time nextCallTime; -}; - - -//============================================================================== -/** - A thread that keeps a list of clients, and calls each one in turn, giving them - all a chance to run some sort of short task. - - @see TimeSliceClient, Thread -*/ -class JUCE_API TimeSliceThread : public Thread -{ -public: - //============================================================================== - /** - Creates a TimeSliceThread. - - When first created, the thread is not running. Use the startThread() - method to start it. - */ - explicit TimeSliceThread (const String& threadName); - - /** Destructor. - - Deleting a Thread object that is running will only give the thread a - brief opportunity to stop itself cleanly, so it's recommended that you - should always call stopThread() with a decent timeout before deleting, - to avoid the thread being forcibly killed (which is a Bad Thing). - */ - ~TimeSliceThread(); - - //============================================================================== - /** Adds a client to the list. - - The client's callbacks will start after the number of milliseconds specified - by millisecondsBeforeStarting (and this may happen before this method has returned). - */ - void addTimeSliceClient (TimeSliceClient* client, int millisecondsBeforeStarting = 0); - - /** Removes a client from the list. - - This method will make sure that all callbacks to the client have completely - finished before the method returns. - */ - void removeTimeSliceClient (TimeSliceClient* client); - - /** If the given client is waiting in the queue, it will be moved to the front - and given a time-slice as soon as possible. - If the specified client has not been added, nothing will happen. - */ - void moveToFrontOfQueue (TimeSliceClient* client); - - /** Returns the number of registered clients. */ - int getNumClients() const; - - /** Returns one of the registered clients. */ - TimeSliceClient* getClient (int index) const; - - //============================================================================== - #ifndef DOXYGEN - void run() override; - #endif - - //============================================================================== -private: - CriticalSection callbackLock, listLock; - Array clients; - TimeSliceClient* clientBeingCalled; - - TimeSliceClient* getNextClient (int index) const; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TimeSliceThread) -}; - - -#endif // JUCE_TIMESLICETHREAD_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h b/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h deleted file mode 100755 index 83f6f06..0000000 --- a/JuceLibraryCode/modules/juce_core/threads/juce_WaitableEvent.h +++ /dev/null @@ -1,118 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_WAITABLEEVENT_H_INCLUDED -#define JUCE_WAITABLEEVENT_H_INCLUDED - - -//============================================================================== -/** - Allows threads to wait for events triggered by other threads. - - A thread can call wait() on a WaitableObject, and this will suspend the - calling thread until another thread wakes it up by calling the signal() - method. -*/ -class JUCE_API WaitableEvent -{ -public: - //============================================================================== - /** Creates a WaitableEvent object. - - The object is initially in an unsignalled state. - - @param manualReset If this is false, the event will be reset automatically when the wait() - method is called. If manualReset is true, then once the event is signalled, - the only way to reset it will be by calling the reset() method. - */ - explicit WaitableEvent (bool manualReset = false) noexcept; - - /** Destructor. - - If other threads are waiting on this object when it gets deleted, this - can cause nasty errors, so be careful! - */ - ~WaitableEvent() noexcept; - - //============================================================================== - /** Suspends the calling thread until the event has been signalled. - - This will wait until the object's signal() method is called by another thread, - or until the timeout expires. - - After the event has been signalled, this method will return true and if manualReset - was set to false in the WaitableEvent's constructor, then the event will be reset. - - @param timeOutMilliseconds the maximum time to wait, in milliseconds. A negative - value will cause it to wait forever. - - @returns true if the object has been signalled, false if the timeout expires first. - @see signal, reset - */ - bool wait (int timeOutMilliseconds = -1) const noexcept; - - //============================================================================== - /** Wakes up any threads that are currently waiting on this object. - - If signal() is called when nothing is waiting, the next thread to call wait() - will return immediately and reset the signal. - - If the WaitableEvent is manual reset, all current and future threads that wait upon this - object will be woken, until reset() is explicitly called. - - If the WaitableEvent is automatic reset, and one or more threads is waiting upon the object, - then one of them will be woken up. If no threads are currently waiting, then the next thread - to call wait() will be woken up. As soon as a thread is woken, the signal is automatically - reset. - - @see wait, reset - */ - void signal() const noexcept; - - //============================================================================== - /** Resets the event to an unsignalled state. - If it's not already signalled, this does nothing. - */ - void reset() const noexcept; - - -private: - //============================================================================== - #if JUCE_WINDOWS - void* handle; - #else - mutable pthread_cond_t condition; - mutable pthread_mutex_t mutex; - mutable bool triggered, manualReset; - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WaitableEvent) -}; - - -#endif // JUCE_WAITABLEEVENT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp b/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp deleted file mode 100755 index b22d5e4..0000000 --- a/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -static void appendToFile (const File& f, const String& s) -{ - if (f.getFullPathName().isNotEmpty()) - { - FileOutputStream out (f); - - if (! out.failedToOpen()) - out << s << newLine; - } -} - -PerformanceCounter::PerformanceCounter (const String& name, int runsPerPrintout, const File& loggingFile) - : runsPerPrint (runsPerPrintout), startTime (0), outputFile (loggingFile) -{ - stats.name = name; - appendToFile (outputFile, "**** Counter for \"" + name + "\" started at: " + Time::getCurrentTime().toString (true, true)); -} - -PerformanceCounter::~PerformanceCounter() -{ - printStatistics(); -} - -PerformanceCounter::Statistics::Statistics() noexcept - : averageSeconds(), maximumSeconds(), minimumSeconds(), totalSeconds(), numRuns() -{ -} - -void PerformanceCounter::Statistics::clear() noexcept -{ - averageSeconds = maximumSeconds = minimumSeconds = totalSeconds = 0; - numRuns = 0; -} - -void PerformanceCounter::Statistics::addResult (double elapsed) noexcept -{ - if (numRuns == 0) - { - maximumSeconds = elapsed; - minimumSeconds = elapsed; - } - else - { - maximumSeconds = jmax (maximumSeconds, elapsed); - minimumSeconds = jmin (minimumSeconds, elapsed); - } - - ++numRuns; - totalSeconds += elapsed; -} - -static String timeToString (double secs) -{ - return String ((int64) (secs * (secs < 0.01 ? 1000000.0 : 1000.0) + 0.5)) - + (secs < 0.01 ? " microsecs" : " millisecs"); -} - -String PerformanceCounter::Statistics::toString() const -{ - MemoryOutputStream s; - - s << "Performance count for \"" << name << "\" over " << numRuns << " run(s)" << newLine - << "Average = " << timeToString (averageSeconds) - << ", minimum = " << timeToString (minimumSeconds) - << ", maximum = " << timeToString (maximumSeconds) - << ", total = " << timeToString (totalSeconds); - - return s.toString(); -} - -void PerformanceCounter::start() noexcept -{ - startTime = Time::getHighResolutionTicks(); -} - -bool PerformanceCounter::stop() -{ - stats.addResult (Time::highResolutionTicksToSeconds (Time::getHighResolutionTicks() - startTime)); - - if (stats.numRuns < runsPerPrint) - return false; - - printStatistics(); - return true; -} - -void PerformanceCounter::printStatistics() -{ - const String desc (getStatisticsAndReset().toString()); - - Logger::outputDebugString (desc); - appendToFile (outputFile, desc); -} - -PerformanceCounter::Statistics PerformanceCounter::getStatisticsAndReset() -{ - Statistics s (stats); - stats.clear(); - - if (s.numRuns > 0) - s.averageSeconds = s.totalSeconds / s.numRuns; - - return s; -} diff --git a/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h b/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h deleted file mode 100755 index aac50d2..0000000 --- a/JuceLibraryCode/modules/juce_core/time/juce_PerformanceCounter.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_PERFORMANCECOUNTER_H_INCLUDED -#define JUCE_PERFORMANCECOUNTER_H_INCLUDED - - -//============================================================================== -/** A timer for measuring performance of code and dumping the results to a file. - - e.g. @code - - PerformanceCounter pc ("fish", 50, "/temp/myfishlog.txt"); - - for (;;) - { - pc.start(); - - doSomethingFishy(); - - pc.stop(); - } - @endcode - - In this example, the time of each period between calling start/stop will be - measured and averaged over 50 runs, and the results printed to a file - every 50 times round the loop. -*/ -class JUCE_API PerformanceCounter -{ -public: - //============================================================================== - /** Creates a PerformanceCounter object. - - @param counterName the name used when printing out the statistics - @param runsPerPrintout the number of start/stop iterations before calling - printStatistics() - @param loggingFile a file to dump the results to - if this is File::nonexistent, - the results are just written to the debugger output - */ - PerformanceCounter (const String& counterName, - int runsPerPrintout = 100, - const File& loggingFile = File()); - - /** Destructor. */ - ~PerformanceCounter(); - - //============================================================================== - /** Starts timing. - @see stop - */ - void start() noexcept; - - /** Stops timing and prints out the results. - - The number of iterations before doing a printout of the - results is set in the constructor. - - @see start - */ - bool stop(); - - /** Dumps the current metrics to the debugger output and to a file. - - As well as using Logger::outputDebugString to print the results, - this will write then to the file specified in the constructor (if - this was valid). - */ - void printStatistics(); - - /** Holds the current statistics. */ - struct Statistics - { - Statistics() noexcept; - - void clear() noexcept; - String toString() const; - - void addResult (double elapsed) noexcept; - - String name; - double averageSeconds; - double maximumSeconds; - double minimumSeconds; - double totalSeconds; - int64 numRuns; - }; - - /** Returns a copy of the current stats, and resets the internal counter. */ - Statistics getStatisticsAndReset(); - -private: - //============================================================================== - Statistics stats; - int64 runsPerPrint, startTime; - File outputFile; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PerformanceCounter) -}; - - -#endif // JUCE_PERFORMANCECOUNTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp b/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp deleted file mode 100755 index 6fca4fe..0000000 --- a/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -RelativeTime::RelativeTime (const double secs) noexcept : numSeconds (secs) {} -RelativeTime::RelativeTime (const RelativeTime& other) noexcept : numSeconds (other.numSeconds) {} -RelativeTime::~RelativeTime() noexcept {} - -//============================================================================== -RelativeTime RelativeTime::milliseconds (const int milliseconds) noexcept { return RelativeTime (milliseconds * 0.001); } -RelativeTime RelativeTime::milliseconds (const int64 milliseconds) noexcept { return RelativeTime (milliseconds * 0.001); } -RelativeTime RelativeTime::seconds (double s) noexcept { return RelativeTime (s); } -RelativeTime RelativeTime::minutes (const double numberOfMinutes) noexcept { return RelativeTime (numberOfMinutes * 60.0); } -RelativeTime RelativeTime::hours (const double numberOfHours) noexcept { return RelativeTime (numberOfHours * (60.0 * 60.0)); } -RelativeTime RelativeTime::days (const double numberOfDays) noexcept { return RelativeTime (numberOfDays * (60.0 * 60.0 * 24.0)); } -RelativeTime RelativeTime::weeks (const double numberOfWeeks) noexcept { return RelativeTime (numberOfWeeks * (60.0 * 60.0 * 24.0 * 7.0)); } - -//============================================================================== -int64 RelativeTime::inMilliseconds() const noexcept { return (int64) (numSeconds * 1000.0); } -double RelativeTime::inMinutes() const noexcept { return numSeconds / 60.0; } -double RelativeTime::inHours() const noexcept { return numSeconds / (60.0 * 60.0); } -double RelativeTime::inDays() const noexcept { return numSeconds / (60.0 * 60.0 * 24.0); } -double RelativeTime::inWeeks() const noexcept { return numSeconds / (60.0 * 60.0 * 24.0 * 7.0); } - -//============================================================================== -RelativeTime& RelativeTime::operator= (const RelativeTime& other) noexcept { numSeconds = other.numSeconds; return *this; } - -RelativeTime RelativeTime::operator+= (RelativeTime t) noexcept { numSeconds += t.numSeconds; return *this; } -RelativeTime RelativeTime::operator-= (RelativeTime t) noexcept { numSeconds -= t.numSeconds; return *this; } -RelativeTime RelativeTime::operator+= (const double secs) noexcept { numSeconds += secs; return *this; } -RelativeTime RelativeTime::operator-= (const double secs) noexcept { numSeconds -= secs; return *this; } - -RelativeTime operator+ (RelativeTime t1, RelativeTime t2) noexcept { return t1 += t2; } -RelativeTime operator- (RelativeTime t1, RelativeTime t2) noexcept { return t1 -= t2; } - -bool operator== (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() == t2.inSeconds(); } -bool operator!= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() != t2.inSeconds(); } -bool operator> (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() > t2.inSeconds(); } -bool operator< (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() < t2.inSeconds(); } -bool operator>= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() >= t2.inSeconds(); } -bool operator<= (RelativeTime t1, RelativeTime t2) noexcept { return t1.inSeconds() <= t2.inSeconds(); } - -//============================================================================== -static void translateTimeField (String& result, int n, const char* singular, const char* plural) -{ - result << TRANS (n == 1 ? singular : plural) - .replace (n == 1 ? "1" : "2", String (n)) - << ' '; -} - -String RelativeTime::getDescription (const String& returnValueForZeroTime) const -{ - if (numSeconds < 0.001 && numSeconds > -0.001) - return returnValueForZeroTime; - - String result; - result.preallocateBytes (32); - - if (numSeconds < 0) - result << '-'; - - int fieldsShown = 0; - int n = std::abs ((int) inWeeks()); - if (n > 0) - { - translateTimeField (result, n, NEEDS_TRANS("1 week"), NEEDS_TRANS("2 weeks")); - ++fieldsShown; - } - - n = std::abs ((int) inDays()) % 7; - if (n > 0) - { - translateTimeField (result, n, NEEDS_TRANS("1 day"), NEEDS_TRANS("2 days")); - ++fieldsShown; - } - - if (fieldsShown < 2) - { - n = std::abs ((int) inHours()) % 24; - if (n > 0) - { - translateTimeField (result, n, NEEDS_TRANS("1 hr"), NEEDS_TRANS("2 hrs")); - ++fieldsShown; - } - - if (fieldsShown < 2) - { - n = std::abs ((int) inMinutes()) % 60; - if (n > 0) - { - translateTimeField (result, n, NEEDS_TRANS("1 min"), NEEDS_TRANS("2 mins")); - ++fieldsShown; - } - - if (fieldsShown < 2) - { - n = std::abs ((int) inSeconds()) % 60; - if (n > 0) - { - translateTimeField (result, n, NEEDS_TRANS("1 sec"), NEEDS_TRANS("2 secs")); - ++fieldsShown; - } - - if (fieldsShown == 0) - { - n = std::abs ((int) inMilliseconds()) % 1000; - if (n > 0) - result << n << ' ' << TRANS ("ms"); - } - } - } - } - - return result.trimEnd(); -} diff --git a/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h b/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h deleted file mode 100755 index 7e39d21..0000000 --- a/JuceLibraryCode/modules/juce_core/time/juce_RelativeTime.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_RELATIVETIME_H_INCLUDED -#define JUCE_RELATIVETIME_H_INCLUDED - - -//============================================================================== -/** A relative measure of time. - - The time is stored as a number of seconds, at double-precision floating - point accuracy, and may be positive or negative. - - If you need an absolute time, (i.e. a date + time), see the Time class. -*/ -class JUCE_API RelativeTime -{ -public: - //============================================================================== - /** Creates a RelativeTime. - - @param seconds the number of seconds, which may be +ve or -ve. - @see milliseconds, minutes, hours, days, weeks - */ - explicit RelativeTime (double seconds = 0.0) noexcept; - - /** Copies another relative time. */ - RelativeTime (const RelativeTime& other) noexcept; - - /** Copies another relative time. */ - RelativeTime& operator= (const RelativeTime& other) noexcept; - - /** Destructor. */ - ~RelativeTime() noexcept; - - //============================================================================== - /** Creates a new RelativeTime object representing a number of milliseconds. - @see seconds, minutes, hours, days, weeks - */ - static RelativeTime milliseconds (int milliseconds) noexcept; - - /** Creates a new RelativeTime object representing a number of milliseconds. - @see seconds, minutes, hours, days, weeks - */ - static RelativeTime milliseconds (int64 milliseconds) noexcept; - - /** Creates a new RelativeTime object representing a number of seconds. - @see milliseconds, minutes, hours, days, weeks - */ - static RelativeTime seconds (double seconds) noexcept; - - /** Creates a new RelativeTime object representing a number of minutes. - @see milliseconds, hours, days, weeks - */ - static RelativeTime minutes (double numberOfMinutes) noexcept; - - /** Creates a new RelativeTime object representing a number of hours. - @see milliseconds, minutes, days, weeks - */ - static RelativeTime hours (double numberOfHours) noexcept; - - /** Creates a new RelativeTime object representing a number of days. - @see milliseconds, minutes, hours, weeks - */ - static RelativeTime days (double numberOfDays) noexcept; - - /** Creates a new RelativeTime object representing a number of weeks. - @see milliseconds, minutes, hours, days - */ - static RelativeTime weeks (double numberOfWeeks) noexcept; - - //============================================================================== - /** Returns the number of milliseconds this time represents. - @see milliseconds, inSeconds, inMinutes, inHours, inDays, inWeeks - */ - int64 inMilliseconds() const noexcept; - - /** Returns the number of seconds this time represents. - @see inMilliseconds, inMinutes, inHours, inDays, inWeeks - */ - double inSeconds() const noexcept { return numSeconds; } - - /** Returns the number of minutes this time represents. - @see inMilliseconds, inSeconds, inHours, inDays, inWeeks - */ - double inMinutes() const noexcept; - - /** Returns the number of hours this time represents. - @see inMilliseconds, inSeconds, inMinutes, inDays, inWeeks - */ - double inHours() const noexcept; - - /** Returns the number of days this time represents. - @see inMilliseconds, inSeconds, inMinutes, inHours, inWeeks - */ - double inDays() const noexcept; - - /** Returns the number of weeks this time represents. - @see inMilliseconds, inSeconds, inMinutes, inHours, inDays - */ - double inWeeks() const noexcept; - - /** Returns a readable textual description of the time. - - The exact format of the string returned will depend on - the magnitude of the time - e.g. - - "1 min 4 secs", "1 hr 45 mins", "2 weeks 5 days", "140 ms" - - so that only the two most significant units are printed. - - The returnValueForZeroTime value is the result that is returned if the - length is zero. Depending on your application you might want to use this - to return something more relevant like "empty" or "0 secs", etc. - - @see inMilliseconds, inSeconds, inMinutes, inHours, inDays, inWeeks - */ - String getDescription (const String& returnValueForZeroTime = "0") const; - - - //============================================================================== - /** Adds another RelativeTime to this one. */ - RelativeTime operator+= (RelativeTime timeToAdd) noexcept; - /** Subtracts another RelativeTime from this one. */ - RelativeTime operator-= (RelativeTime timeToSubtract) noexcept; - - /** Adds a number of seconds to this time. */ - RelativeTime operator+= (double secondsToAdd) noexcept; - /** Subtracts a number of seconds from this time. */ - RelativeTime operator-= (double secondsToSubtract) noexcept; - -private: - //============================================================================== - double numSeconds; -}; - -//============================================================================== -/** Compares two RelativeTimes. */ -bool operator== (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator!= (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator> (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator< (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator>= (RelativeTime t1, RelativeTime t2) noexcept; -/** Compares two RelativeTimes. */ -bool operator<= (RelativeTime t1, RelativeTime t2) noexcept; - -//============================================================================== -/** Adds two RelativeTimes together. */ -RelativeTime operator+ (RelativeTime t1, RelativeTime t2) noexcept; -/** Subtracts two RelativeTimes. */ -RelativeTime operator- (RelativeTime t1, RelativeTime t2) noexcept; - - - -#endif // JUCE_RELATIVETIME_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp b/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp deleted file mode 100755 index 7ba8e5f..0000000 --- a/JuceLibraryCode/modules/juce_core/time/juce_Time.cpp +++ /dev/null @@ -1,473 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -namespace TimeHelpers -{ - static struct tm millisToLocal (const int64 millis) noexcept - { - struct tm result; - const int64 seconds = millis / 1000; - - if (seconds < 86400LL || seconds >= 2145916800LL) - { - // use extended maths for dates beyond 1970 to 2037.. - const int timeZoneAdjustment = 31536000 - (int) (Time (1971, 0, 1, 0, 0).toMilliseconds() / 1000); - const int64 jdm = seconds + timeZoneAdjustment + 210866803200LL; - - const int days = (int) (jdm / 86400LL); - const int a = 32044 + days; - const int b = (4 * a + 3) / 146097; - const int c = a - (b * 146097) / 4; - const int d = (4 * c + 3) / 1461; - const int e = c - (d * 1461) / 4; - const int m = (5 * e + 2) / 153; - - result.tm_mday = e - (153 * m + 2) / 5 + 1; - result.tm_mon = m + 2 - 12 * (m / 10); - result.tm_year = b * 100 + d - 6700 + (m / 10); - result.tm_wday = (days + 1) % 7; - result.tm_yday = -1; - - int t = (int) (jdm % 86400LL); - result.tm_hour = t / 3600; - t %= 3600; - result.tm_min = t / 60; - result.tm_sec = t % 60; - result.tm_isdst = -1; - } - else - { - time_t now = static_cast (seconds); - - #if JUCE_WINDOWS - #ifdef _INC_TIME_INL - if (now >= 0 && now <= 0x793406fff) - localtime_s (&result, &now); - else - zerostruct (result); - #else - result = *localtime (&now); - #endif - #else - - localtime_r (&now, &result); // more thread-safe - #endif - } - - return result; - } - - static int extendedModulo (const int64 value, const int modulo) noexcept - { - return (int) (value >= 0 ? (value % modulo) - : (value - ((value / modulo) + 1) * modulo)); - } - - static inline String formatString (const String& format, const struct tm* const tm) - { - #if JUCE_ANDROID - typedef CharPointer_UTF8 StringType; - #elif JUCE_WINDOWS - typedef CharPointer_UTF16 StringType; - #else - typedef CharPointer_UTF32 StringType; - #endif - - for (size_t bufferSize = 256; ; bufferSize += 256) - { - HeapBlock buffer (bufferSize); - - #if JUCE_ANDROID - const size_t numChars = strftime (buffer, bufferSize - 1, format.toUTF8(), tm); - #elif JUCE_WINDOWS - const size_t numChars = wcsftime (buffer, bufferSize - 1, format.toWideCharPointer(), tm); - #else - const size_t numChars = wcsftime (buffer, bufferSize - 1, format.toUTF32(), tm); - #endif - - if (numChars > 0 || format.isEmpty()) - return String (StringType (buffer), - StringType (buffer) + (int) numChars); - } - } - - static uint32 lastMSCounterValue = 0; -} - -//============================================================================== -Time::Time() noexcept - : millisSinceEpoch (0) -{ -} - -Time::Time (const Time& other) noexcept - : millisSinceEpoch (other.millisSinceEpoch) -{ -} - -Time::Time (const int64 ms) noexcept - : millisSinceEpoch (ms) -{ -} - -Time::Time (const int year, - const int month, - const int day, - const int hours, - const int minutes, - const int seconds, - const int milliseconds, - const bool useLocalTime) noexcept -{ - jassert (year > 100); // year must be a 4-digit version - - if (year < 1971 || year >= 2038 || ! useLocalTime) - { - // use extended maths for dates beyond 1970 to 2037.. - const int timeZoneAdjustment = useLocalTime ? (31536000 - (int) (Time (1971, 0, 1, 0, 0).toMilliseconds() / 1000)) - : 0; - const int a = (13 - month) / 12; - const int y = year + 4800 - a; - const int jd = day + (153 * (month + 12 * a - 2) + 2) / 5 - + (y * 365) + (y / 4) - (y / 100) + (y / 400) - - 32045; - - const int64 s = ((int64) jd) * 86400LL - 210866803200LL; - - millisSinceEpoch = 1000 * (s + (hours * 3600 + minutes * 60 + seconds - timeZoneAdjustment)) - + milliseconds; - } - else - { - struct tm t; - t.tm_year = year - 1900; - t.tm_mon = month; - t.tm_mday = day; - t.tm_hour = hours; - t.tm_min = minutes; - t.tm_sec = seconds; - t.tm_isdst = -1; - - millisSinceEpoch = 1000 * (int64) mktime (&t); - - if (millisSinceEpoch < 0) - millisSinceEpoch = 0; - else - millisSinceEpoch += milliseconds; - } -} - -Time::~Time() noexcept -{ -} - -Time& Time::operator= (const Time& other) noexcept -{ - millisSinceEpoch = other.millisSinceEpoch; - return *this; -} - -//============================================================================== -int64 Time::currentTimeMillis() noexcept -{ - #if JUCE_WINDOWS - struct _timeb t; - #ifdef _INC_TIME_INL - _ftime_s (&t); - #else - _ftime (&t); - #endif - return ((int64) t.time) * 1000 + t.millitm; - #else - struct timeval tv; - gettimeofday (&tv, nullptr); - return ((int64) tv.tv_sec) * 1000 + tv.tv_usec / 1000; - #endif -} - -Time JUCE_CALLTYPE Time::getCurrentTime() noexcept -{ - return Time (currentTimeMillis()); -} - -//============================================================================== -uint32 juce_millisecondsSinceStartup() noexcept; - -uint32 Time::getMillisecondCounter() noexcept -{ - const uint32 now = juce_millisecondsSinceStartup(); - - if (now < TimeHelpers::lastMSCounterValue) - { - // in multi-threaded apps this might be called concurrently, so - // make sure that our last counter value only increases and doesn't - // go backwards.. - if (now < TimeHelpers::lastMSCounterValue - 1000) - TimeHelpers::lastMSCounterValue = now; - } - else - { - TimeHelpers::lastMSCounterValue = now; - } - - return now; -} - -uint32 Time::getApproximateMillisecondCounter() noexcept -{ - if (TimeHelpers::lastMSCounterValue == 0) - getMillisecondCounter(); - - return TimeHelpers::lastMSCounterValue; -} - -void Time::waitForMillisecondCounter (const uint32 targetTime) noexcept -{ - for (;;) - { - const uint32 now = getMillisecondCounter(); - - if (now >= targetTime) - break; - - const int toWait = (int) (targetTime - now); - - if (toWait > 2) - { - Thread::sleep (jmin (20, toWait >> 1)); - } - else - { - // xxx should consider using mutex_pause on the mac as it apparently - // makes it seem less like a spinlock and avoids lowering the thread pri. - for (int i = 10; --i >= 0;) - Thread::yield(); - } - } -} - -//============================================================================== -double Time::highResolutionTicksToSeconds (const int64 ticks) noexcept -{ - return ticks / (double) getHighResolutionTicksPerSecond(); -} - -int64 Time::secondsToHighResolutionTicks (const double seconds) noexcept -{ - return (int64) (seconds * (double) getHighResolutionTicksPerSecond()); -} - -//============================================================================== -String Time::toString (const bool includeDate, - const bool includeTime, - const bool includeSeconds, - const bool use24HourClock) const noexcept -{ - String result; - - if (includeDate) - { - result << getDayOfMonth() << ' ' - << getMonthName (true) << ' ' - << getYear(); - - if (includeTime) - result << ' '; - } - - if (includeTime) - { - const int mins = getMinutes(); - - result << (use24HourClock ? getHours() : getHoursInAmPmFormat()) - << (mins < 10 ? ":0" : ":") << mins; - - if (includeSeconds) - { - const int secs = getSeconds(); - result << (secs < 10 ? ":0" : ":") << secs; - } - - if (! use24HourClock) - result << (isAfternoon() ? "pm" : "am"); - } - - return result.trimEnd(); -} - -String Time::formatted (const String& format) const -{ - struct tm t (TimeHelpers::millisToLocal (millisSinceEpoch)); - return TimeHelpers::formatString (format, &t); -} - -//============================================================================== -int Time::getYear() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_year + 1900; } -int Time::getMonth() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_mon; } -int Time::getDayOfYear() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_yday; } -int Time::getDayOfMonth() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_mday; } -int Time::getDayOfWeek() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_wday; } -int Time::getHours() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_hour; } -int Time::getMinutes() const noexcept { return TimeHelpers::millisToLocal (millisSinceEpoch).tm_min; } -int Time::getSeconds() const noexcept { return TimeHelpers::extendedModulo (millisSinceEpoch / 1000, 60); } -int Time::getMilliseconds() const noexcept { return TimeHelpers::extendedModulo (millisSinceEpoch, 1000); } - -int Time::getHoursInAmPmFormat() const noexcept -{ - const int hours = getHours(); - - if (hours == 0) return 12; - if (hours <= 12) return hours; - - return hours - 12; -} - -bool Time::isAfternoon() const noexcept -{ - return getHours() >= 12; -} - -bool Time::isDaylightSavingTime() const noexcept -{ - return TimeHelpers::millisToLocal (millisSinceEpoch).tm_isdst != 0; -} - -String Time::getTimeZone() const noexcept -{ - String zone[2]; - - #if JUCE_MSVC - _tzset(); - - #ifdef _INC_TIME_INL - for (int i = 0; i < 2; ++i) - { - char name[128] = { 0 }; - size_t length; - _get_tzname (&length, name, 127, i); - zone[i] = name; - } - #else - const char** const zonePtr = (const char**) _tzname; - zone[0] = zonePtr[0]; - zone[1] = zonePtr[1]; - #endif - #else - #if JUCE_MINGW - #warning "Can't find a replacement for tzset on mingw - ideas welcome!" - #else - tzset(); - #endif - const char** const zonePtr = (const char**) tzname; - zone[0] = zonePtr[0]; - zone[1] = zonePtr[1]; - #endif - - if (isDaylightSavingTime()) - { - zone[0] = zone[1]; - - if (zone[0].length() > 3 - && zone[0].containsIgnoreCase ("daylight") - && zone[0].contains ("GMT")) - zone[0] = "BST"; - } - - return zone[0].substring (0, 3); -} - -String Time::getMonthName (const bool threeLetterVersion) const -{ - return getMonthName (getMonth(), threeLetterVersion); -} - -String Time::getWeekdayName (const bool threeLetterVersion) const -{ - return getWeekdayName (getDayOfWeek(), threeLetterVersion); -} - -static const char* const shortMonthNames[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; -static const char* const longMonthNames[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }; - -String Time::getMonthName (int monthNumber, const bool threeLetterVersion) -{ - monthNumber %= 12; - - return TRANS (threeLetterVersion ? shortMonthNames [monthNumber] - : longMonthNames [monthNumber]); -} - -String Time::getWeekdayName (int day, const bool threeLetterVersion) -{ - static const char* const shortDayNames[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; - static const char* const longDayNames[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; - - day %= 7; - - return TRANS (threeLetterVersion ? shortDayNames [day] - : longDayNames [day]); -} - -//============================================================================== -Time& Time::operator+= (RelativeTime delta) noexcept { millisSinceEpoch += delta.inMilliseconds(); return *this; } -Time& Time::operator-= (RelativeTime delta) noexcept { millisSinceEpoch -= delta.inMilliseconds(); return *this; } - -Time operator+ (Time time, RelativeTime delta) noexcept { Time t (time); return t += delta; } -Time operator- (Time time, RelativeTime delta) noexcept { Time t (time); return t -= delta; } -Time operator+ (RelativeTime delta, Time time) noexcept { Time t (time); return t += delta; } -const RelativeTime operator- (Time time1, Time time2) noexcept { return RelativeTime::milliseconds (time1.toMilliseconds() - time2.toMilliseconds()); } - -bool operator== (Time time1, Time time2) noexcept { return time1.toMilliseconds() == time2.toMilliseconds(); } -bool operator!= (Time time1, Time time2) noexcept { return time1.toMilliseconds() != time2.toMilliseconds(); } -bool operator< (Time time1, Time time2) noexcept { return time1.toMilliseconds() < time2.toMilliseconds(); } -bool operator> (Time time1, Time time2) noexcept { return time1.toMilliseconds() > time2.toMilliseconds(); } -bool operator<= (Time time1, Time time2) noexcept { return time1.toMilliseconds() <= time2.toMilliseconds(); } -bool operator>= (Time time1, Time time2) noexcept { return time1.toMilliseconds() >= time2.toMilliseconds(); } - -static int getMonthNumberForCompileDate (const String& m) noexcept -{ - for (int i = 0; i < 12; ++i) - if (m.equalsIgnoreCase (shortMonthNames[i])) - return i; - - // If you hit this because your compiler has a non-standard __DATE__ format, - // let me know so we can add support for it! - jassertfalse; - return 0; -} - -Time Time::getCompilationDate() -{ - StringArray dateTokens; - dateTokens.addTokens (__DATE__, true); - dateTokens.removeEmptyStrings (true); - - return Time (dateTokens[2].getIntValue(), - getMonthNumberForCompileDate (dateTokens[0]), - dateTokens[1].getIntValue(), 12, 0); -} diff --git a/JuceLibraryCode/modules/juce_core/time/juce_Time.h b/JuceLibraryCode/modules/juce_core/time/juce_Time.h deleted file mode 100755 index 4a35e08..0000000 --- a/JuceLibraryCode/modules/juce_core/time/juce_Time.h +++ /dev/null @@ -1,404 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_TIME_H_INCLUDED -#define JUCE_TIME_H_INCLUDED - - -//============================================================================== -/** - Holds an absolute date and time. - - Internally, the time is stored at millisecond precision. - - @see RelativeTime -*/ -class JUCE_API Time -{ -public: - //============================================================================== - /** Creates a Time object. - - This default constructor creates a time of 1st January 1970, (which is - represented internally as 0ms). - - To create a time object representing the current time, use getCurrentTime(). - - @see getCurrentTime - */ - Time() noexcept; - - /** Creates a time based on a number of milliseconds. - - The internal millisecond count is set to 0 (1st January 1970). To create a - time object set to the current time, use getCurrentTime(). - - @param millisecondsSinceEpoch the number of milliseconds since the unix - 'epoch' (midnight Jan 1st 1970). - @see getCurrentTime, currentTimeMillis - */ - explicit Time (int64 millisecondsSinceEpoch) noexcept; - - /** Creates a time from a set of date components. - - The timezone is assumed to be whatever the system is using as its locale. - - @param year the year, in 4-digit format, e.g. 2004 - @param month the month, in the range 0 to 11 - @param day the day of the month, in the range 1 to 31 - @param hours hours in 24-hour clock format, 0 to 23 - @param minutes minutes 0 to 59 - @param seconds seconds 0 to 59 - @param milliseconds milliseconds 0 to 999 - @param useLocalTime if true, encode using the current machine's local time; if - false, it will always work in GMT. - */ - Time (int year, - int month, - int day, - int hours, - int minutes, - int seconds = 0, - int milliseconds = 0, - bool useLocalTime = true) noexcept; - - /** Creates a copy of another Time object. */ - Time (const Time& other) noexcept; - - /** Destructor. */ - ~Time() noexcept; - - /** Copies this time from another one. */ - Time& operator= (const Time& other) noexcept; - - //============================================================================== - /** Returns a Time object that is set to the current system time. - - @see currentTimeMillis - */ - static Time JUCE_CALLTYPE getCurrentTime() noexcept; - - /** Returns the time as a number of milliseconds. - - @returns the number of milliseconds this Time object represents, since - midnight jan 1st 1970. - @see getMilliseconds - */ - int64 toMilliseconds() const noexcept { return millisSinceEpoch; } - - /** Returns the year. - - A 4-digit format is used, e.g. 2004. - */ - int getYear() const noexcept; - - /** Returns the number of the month. - - The value returned is in the range 0 to 11. - @see getMonthName - */ - int getMonth() const noexcept; - - /** Returns the name of the month. - - @param threeLetterVersion if true, it'll be a 3-letter abbreviation, e.g. "Jan"; if false - it'll return the long form, e.g. "January" - @see getMonth - */ - String getMonthName (bool threeLetterVersion) const; - - /** Returns the day of the month. - The value returned is in the range 1 to 31. - */ - int getDayOfMonth() const noexcept; - - /** Returns the number of the day of the week. - The value returned is in the range 0 to 6 (0 = sunday, 1 = monday, etc). - */ - int getDayOfWeek() const noexcept; - - /** Returns the number of the day of the year. - The value returned is in the range 0 to 365. - */ - int getDayOfYear() const noexcept; - - /** Returns the name of the weekday. - - @param threeLetterVersion if true, it'll return a 3-letter abbreviation, e.g. "Tue"; if - false, it'll return the full version, e.g. "Tuesday". - */ - String getWeekdayName (bool threeLetterVersion) const; - - /** Returns the number of hours since midnight. - - This is in 24-hour clock format, in the range 0 to 23. - - @see getHoursInAmPmFormat, isAfternoon - */ - int getHours() const noexcept; - - /** Returns true if the time is in the afternoon. - - So it returns true for "PM", false for "AM". - - @see getHoursInAmPmFormat, getHours - */ - bool isAfternoon() const noexcept; - - /** Returns the hours in 12-hour clock format. - - This will return a value 1 to 12 - use isAfternoon() to find out - whether this is in the afternoon or morning. - - @see getHours, isAfternoon - */ - int getHoursInAmPmFormat() const noexcept; - - /** Returns the number of minutes, 0 to 59. */ - int getMinutes() const noexcept; - - /** Returns the number of seconds, 0 to 59. */ - int getSeconds() const noexcept; - - /** Returns the number of milliseconds, 0 to 999. - - Unlike toMilliseconds(), this just returns the position within the - current second rather than the total number since the epoch. - - @see toMilliseconds - */ - int getMilliseconds() const noexcept; - - /** Returns true if the local timezone uses a daylight saving correction. */ - bool isDaylightSavingTime() const noexcept; - - /** Returns a 3-character string to indicate the local timezone. */ - String getTimeZone() const noexcept; - - //============================================================================== - /** Quick way of getting a string version of a date and time. - - For a more powerful way of formatting the date and time, see the formatted() method. - - @param includeDate whether to include the date in the string - @param includeTime whether to include the time in the string - @param includeSeconds if the time is being included, this provides an option not to include - the seconds in it - @param use24HourClock if the time is being included, sets whether to use am/pm or 24 - hour notation. - @see formatted - */ - String toString (bool includeDate, - bool includeTime, - bool includeSeconds = true, - bool use24HourClock = false) const noexcept; - - /** Converts this date/time to a string with a user-defined format. - - This uses the C strftime() function to format this time as a string. To save you - looking it up, these are the escape codes that strftime uses (other codes might - work on some platforms and not others, but these are the common ones): - - %a is replaced by the locale's abbreviated weekday name. - %A is replaced by the locale's full weekday name. - %b is replaced by the locale's abbreviated month name. - %B is replaced by the locale's full month name. - %c is replaced by the locale's appropriate date and time representation. - %d is replaced by the day of the month as a decimal number [01,31]. - %H is replaced by the hour (24-hour clock) as a decimal number [00,23]. - %I is replaced by the hour (12-hour clock) as a decimal number [01,12]. - %j is replaced by the day of the year as a decimal number [001,366]. - %m is replaced by the month as a decimal number [01,12]. - %M is replaced by the minute as a decimal number [00,59]. - %p is replaced by the locale's equivalent of either a.m. or p.m. - %S is replaced by the second as a decimal number [00,61]. - %U is replaced by the week number of the year (Sunday as the first day of the week) as a decimal number [00,53]. - %w is replaced by the weekday as a decimal number [0,6], with 0 representing Sunday. - %W is replaced by the week number of the year (Monday as the first day of the week) as a decimal number [00,53]. All days in a new year preceding the first Monday are considered to be in week 0. - %x is replaced by the locale's appropriate date representation. - %X is replaced by the locale's appropriate time representation. - %y is replaced by the year without century as a decimal number [00,99]. - %Y is replaced by the year with century as a decimal number. - %Z is replaced by the timezone name or abbreviation, or by no bytes if no timezone information exists. - %% is replaced by %. - - @see toString - */ - String formatted (const String& format) const; - - //============================================================================== - /** Adds a RelativeTime to this time. */ - Time& operator+= (RelativeTime delta) noexcept; - /** Subtracts a RelativeTime from this time. */ - Time& operator-= (RelativeTime delta) noexcept; - - //============================================================================== - /** Tries to set the computer's clock. - - @returns true if this succeeds, although depending on the system, the - application might not have sufficient privileges to do this. - */ - bool setSystemTimeToThisTime() const; - - //============================================================================== - /** Returns the name of a day of the week. - - @param dayNumber the day, 0 to 6 (0 = sunday, 1 = monday, etc) - @param threeLetterVersion if true, it'll return a 3-letter abbreviation, e.g. "Tue"; if - false, it'll return the full version, e.g. "Tuesday". - */ - static String getWeekdayName (int dayNumber, bool threeLetterVersion); - - /** Returns the name of one of the months. - - @param monthNumber the month, 0 to 11 - @param threeLetterVersion if true, it'll be a 3-letter abbreviation, e.g. "Jan"; if false - it'll return the long form, e.g. "January" - */ - static String getMonthName (int monthNumber, bool threeLetterVersion); - - //============================================================================== - // Static methods for getting system timers directly.. - - /** Returns the current system time. - - Returns the number of milliseconds since midnight jan 1st 1970. - - Should be accurate to within a few millisecs, depending on platform, - hardware, etc. - */ - static int64 currentTimeMillis() noexcept; - - /** Returns the number of millisecs since a fixed event (usually system startup). - - This returns a monotonically increasing value which it unaffected by changes to the - system clock. It should be accurate to within a few millisecs, depending on platform, - hardware, etc. - - Being a 32-bit return value, it will of course wrap back to 0 after 2^32 seconds of - uptime, so be careful to take that into account. If you need a 64-bit time, you can - use currentTimeMillis() instead. - - @see getApproximateMillisecondCounter - */ - static uint32 getMillisecondCounter() noexcept; - - /** Returns the number of millisecs since a fixed event (usually system startup). - - This has the same function as getMillisecondCounter(), but returns a more accurate - value, using a higher-resolution timer if one is available. - - @see getMillisecondCounter - */ - static double getMillisecondCounterHiRes() noexcept; - - /** Waits until the getMillisecondCounter() reaches a given value. - - This will make the thread sleep as efficiently as it can while it's waiting. - */ - static void waitForMillisecondCounter (uint32 targetTime) noexcept; - - /** Less-accurate but faster version of getMillisecondCounter(). - - This will return the last value that getMillisecondCounter() returned, so doesn't - need to make a system call, but is less accurate - it shouldn't be more than - 100ms away from the correct time, though, so is still accurate enough for a - lot of purposes. - - @see getMillisecondCounter - */ - static uint32 getApproximateMillisecondCounter() noexcept; - - //============================================================================== - // High-resolution timers.. - - /** Returns the current high-resolution counter's tick-count. - - This is a similar idea to getMillisecondCounter(), but with a higher - resolution. - - @see getHighResolutionTicksPerSecond, highResolutionTicksToSeconds, - secondsToHighResolutionTicks - */ - static int64 getHighResolutionTicks() noexcept; - - /** Returns the resolution of the high-resolution counter in ticks per second. - - @see getHighResolutionTicks, highResolutionTicksToSeconds, - secondsToHighResolutionTicks - */ - static int64 getHighResolutionTicksPerSecond() noexcept; - - /** Converts a number of high-resolution ticks into seconds. - - @see getHighResolutionTicks, getHighResolutionTicksPerSecond, - secondsToHighResolutionTicks - */ - static double highResolutionTicksToSeconds (int64 ticks) noexcept; - - /** Converts a number seconds into high-resolution ticks. - - @see getHighResolutionTicks, getHighResolutionTicksPerSecond, - highResolutionTicksToSeconds - */ - static int64 secondsToHighResolutionTicks (double seconds) noexcept; - - /** Returns a Time based on the value of the __DATE__ macro when this module was compiled */ - static Time getCompilationDate(); - -private: - //============================================================================== - int64 millisSinceEpoch; -}; - -//============================================================================== -/** Adds a RelativeTime to a Time. */ -JUCE_API Time operator+ (Time time, RelativeTime delta) noexcept; -/** Adds a RelativeTime to a Time. */ -JUCE_API Time operator+ (RelativeTime delta, Time time) noexcept; - -/** Subtracts a RelativeTime from a Time. */ -JUCE_API Time operator- (Time time, RelativeTime delta) noexcept; -/** Returns the relative time difference between two times. */ -JUCE_API const RelativeTime operator- (Time time1, Time time2) noexcept; - -/** Compares two Time objects. */ -JUCE_API bool operator== (Time time1, Time time2) noexcept; -/** Compares two Time objects. */ -JUCE_API bool operator!= (Time time1, Time time2) noexcept; -/** Compares two Time objects. */ -JUCE_API bool operator< (Time time1, Time time2) noexcept; -/** Compares two Time objects. */ -JUCE_API bool operator<= (Time time1, Time time2) noexcept; -/** Compares two Time objects. */ -JUCE_API bool operator> (Time time1, Time time2) noexcept; -/** Compares two Time objects. */ -JUCE_API bool operator>= (Time time1, Time time2) noexcept; - - -#endif // JUCE_TIME_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp b/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp deleted file mode 100755 index f5a60c1..0000000 --- a/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -UnitTest::UnitTest (const String& nm) - : name (nm), runner (nullptr) -{ - getAllTests().add (this); -} - -UnitTest::~UnitTest() -{ - getAllTests().removeFirstMatchingValue (this); -} - -Array& UnitTest::getAllTests() -{ - static Array tests; - return tests; -} - -void UnitTest::initialise() {} -void UnitTest::shutdown() {} - -void UnitTest::performTest (UnitTestRunner* const newRunner) -{ - jassert (newRunner != nullptr); - runner = newRunner; - - initialise(); - runTest(); - shutdown(); -} - -void UnitTest::logMessage (const String& message) -{ - // This method's only valid while the test is being run! - jassert (runner != nullptr); - - runner->logMessage (message); -} - -void UnitTest::beginTest (const String& testName) -{ - // This method's only valid while the test is being run! - jassert (runner != nullptr); - - runner->beginNewTest (this, testName); -} - -void UnitTest::expect (const bool result, const String& failureMessage) -{ - // This method's only valid while the test is being run! - jassert (runner != nullptr); - - if (result) - runner->addPass(); - else - runner->addFail (failureMessage); -} - -Random UnitTest::getRandom() const -{ - // This method's only valid while the test is being run! - jassert (runner != nullptr); - - return runner->randomForTest; -} - -//============================================================================== -UnitTestRunner::UnitTestRunner() - : currentTest (nullptr), - assertOnFailure (true), - logPasses (false) -{ -} - -UnitTestRunner::~UnitTestRunner() -{ -} - -void UnitTestRunner::setAssertOnFailure (bool shouldAssert) noexcept -{ - assertOnFailure = shouldAssert; -} - -void UnitTestRunner::setPassesAreLogged (bool shouldDisplayPasses) noexcept -{ - logPasses = shouldDisplayPasses; -} - -int UnitTestRunner::getNumResults() const noexcept -{ - return results.size(); -} - -const UnitTestRunner::TestResult* UnitTestRunner::getResult (int index) const noexcept -{ - return results [index]; -} - -void UnitTestRunner::resultsUpdated() -{ -} - -void UnitTestRunner::runTests (const Array& tests, int64 randomSeed) -{ - results.clear(); - resultsUpdated(); - - if (randomSeed == 0) - randomSeed = Random().nextInt (0x7ffffff); - - randomForTest = Random (randomSeed); - logMessage ("Random seed: 0x" + String::toHexString (randomSeed)); - - for (int i = 0; i < tests.size(); ++i) - { - if (shouldAbortTests()) - break; - - try - { - tests.getUnchecked(i)->performTest (this); - } - catch (...) - { - addFail ("An unhandled exception was thrown!"); - } - } - - endTest(); -} - -void UnitTestRunner::runAllTests (int64 randomSeed) -{ - runTests (UnitTest::getAllTests(), randomSeed); -} - -void UnitTestRunner::logMessage (const String& message) -{ - Logger::writeToLog (message); -} - -bool UnitTestRunner::shouldAbortTests() -{ - return false; -} - -void UnitTestRunner::beginNewTest (UnitTest* const test, const String& subCategory) -{ - endTest(); - currentTest = test; - - TestResult* const r = new TestResult(); - results.add (r); - r->unitTestName = test->getName(); - r->subcategoryName = subCategory; - r->passes = 0; - r->failures = 0; - - logMessage ("-----------------------------------------------------------------"); - logMessage ("Starting test: " + r->unitTestName + " / " + subCategory + "..."); - - resultsUpdated(); -} - -void UnitTestRunner::endTest() -{ - if (results.size() > 0) - { - TestResult* const r = results.getLast(); - - if (r->failures > 0) - { - String m ("FAILED!! "); - m << r->failures << (r->failures == 1 ? " test" : " tests") - << " failed, out of a total of " << (r->passes + r->failures); - - logMessage (String::empty); - logMessage (m); - logMessage (String::empty); - } - else - { - logMessage ("All tests completed successfully"); - } - } -} - -void UnitTestRunner::addPass() -{ - { - const ScopedLock sl (results.getLock()); - - TestResult* const r = results.getLast(); - jassert (r != nullptr); // You need to call UnitTest::beginTest() before performing any tests! - - r->passes++; - - if (logPasses) - { - String message ("Test "); - message << (r->failures + r->passes) << " passed"; - logMessage (message); - } - } - - resultsUpdated(); -} - -void UnitTestRunner::addFail (const String& failureMessage) -{ - { - const ScopedLock sl (results.getLock()); - - TestResult* const r = results.getLast(); - jassert (r != nullptr); // You need to call UnitTest::beginTest() before performing any tests! - - r->failures++; - - String message ("!!! Test "); - message << (r->failures + r->passes) << " failed"; - - if (failureMessage.isNotEmpty()) - message << ": " << failureMessage; - - r->messages.add (message); - - logMessage (message); - } - - resultsUpdated(); - - if (assertOnFailure) { jassertfalse; } -} diff --git a/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h b/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h deleted file mode 100755 index f5908c1..0000000 --- a/JuceLibraryCode/modules/juce_core/unit_tests/juce_UnitTest.h +++ /dev/null @@ -1,311 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_UNITTEST_H_INCLUDED -#define JUCE_UNITTEST_H_INCLUDED - -class UnitTestRunner; - - -//============================================================================== -/** - This is a base class for classes that perform a unit test. - - To write a test using this class, your code should look something like this: - - @code - class MyTest : public UnitTest - { - public: - MyTest() : UnitTest ("Foobar testing") {} - - void runTest() - { - beginTest ("Part 1"); - - expect (myFoobar.doesSomething()); - expect (myFoobar.doesSomethingElse()); - - beginTest ("Part 2"); - - expect (myOtherFoobar.doesSomething()); - expect (myOtherFoobar.doesSomethingElse()); - - ...etc.. - } - }; - - // Creating a static instance will automatically add the instance to the array - // returned by UnitTest::getAllTests(), so the test will be included when you call - // UnitTestRunner::runAllTests() - static MyTest test; - @endcode - - To run a test, use the UnitTestRunner class. - - @see UnitTestRunner -*/ -class JUCE_API UnitTest -{ -public: - //============================================================================== - /** Creates a test with the given name. */ - explicit UnitTest (const String& name); - - /** Destructor. */ - virtual ~UnitTest(); - - /** Returns the name of the test. */ - const String& getName() const noexcept { return name; } - - /** Runs the test, using the specified UnitTestRunner. - You shouldn't need to call this method directly - use - UnitTestRunner::runTests() instead. - */ - void performTest (UnitTestRunner* runner); - - /** Returns the set of all UnitTest objects that currently exist. */ - static Array& getAllTests(); - - //============================================================================== - /** You can optionally implement this method to set up your test. - This method will be called before runTest(). - */ - virtual void initialise(); - - /** You can optionally implement this method to clear up after your test has been run. - This method will be called after runTest() has returned. - */ - virtual void shutdown(); - - /** Implement this method in your subclass to actually run your tests. - - The content of your implementation should call beginTest() and expect() - to perform the tests. - */ - virtual void runTest() = 0; - - //============================================================================== - /** Tells the system that a new subsection of tests is beginning. - This should be called from your runTest() method, and may be called - as many times as you like, to demarcate different sets of tests. - */ - void beginTest (const String& testName); - - //============================================================================== - /** Checks that the result of a test is true, and logs this result. - - In your runTest() method, you should call this method for each condition that - you want to check, e.g. - - @code - void runTest() - { - beginTest ("basic tests"); - expect (x + y == 2); - expect (getThing() == someThing); - ...etc... - } - @endcode - - If testResult is true, a pass is logged; if it's false, a failure is logged. - If the failure message is specified, it will be written to the log if the test fails. - */ - void expect (bool testResult, const String& failureMessage = String::empty); - - /** Compares two values, and if they don't match, prints out a message containing the - expected and actual result values. - */ - template - void expectEquals (ValueType actual, ValueType expected, String failureMessage = String::empty) - { - const bool result = (actual == expected); - - if (! result) - { - if (failureMessage.isNotEmpty()) - failureMessage << " -- "; - - failureMessage << "Expected value: " << expected << ", Actual value: " << actual; - } - - expect (result, failureMessage); - } - - //============================================================================== - /** Writes a message to the test log. - This can only be called from within your runTest() method. - */ - void logMessage (const String& message); - - /** Returns a shared RNG that all unit tests should use. - If a test needs random numbers, it's important that when an error is found, the - exact circumstances can be re-created in order to re-test the problem, by - repeating the test with the same random seed value. - To make this possible, the UnitTestRunner class creates a master seed value - for the run, writes this number to the log, and then this method returns a - Random object based on that seed. All tests should only use this method to - create any Random objects that they need. - - Note that this method will return an identical object each time it's called - for a given run, so if you need several different Random objects, the best - way to do that is to call Random::combineSeed() on the result to permute it - with a constant value. - */ - Random getRandom() const; - -private: - //============================================================================== - const String name; - UnitTestRunner* runner; - - JUCE_DECLARE_NON_COPYABLE (UnitTest) -}; - - -//============================================================================== -/** - Runs a set of unit tests. - - You can instantiate one of these objects and use it to invoke tests on a set of - UnitTest objects. - - By using a subclass of UnitTestRunner, you can intercept logging messages and - perform custom behaviour when each test completes. - - @see UnitTest -*/ -class JUCE_API UnitTestRunner -{ -public: - //============================================================================== - /** */ - UnitTestRunner(); - - /** Destructor. */ - virtual ~UnitTestRunner(); - - /** Runs a set of tests. - - The tests are performed in order, and the results are logged. To run all the - registered UnitTest objects that exist, use runAllTests(). - - If you want to run the tests with a predetermined seed, you can pass that into - the randomSeed argument, or pass 0 to have a randomly-generated seed chosen. - */ - void runTests (const Array& tests, int64 randomSeed = 0); - - /** Runs all the UnitTest objects that currently exist. - This calls runTests() for all the objects listed in UnitTest::getAllTests(). - - If you want to run the tests with a predetermined seed, you can pass that into - the randomSeed argument, or pass 0 to have a randomly-generated seed chosen. - */ - void runAllTests (int64 randomSeed = 0); - - /** Sets a flag to indicate whether an assertion should be triggered if a test fails. - This is true by default. - */ - void setAssertOnFailure (bool shouldAssert) noexcept; - - /** Sets a flag to indicate whether successful tests should be logged. - By default, this is set to false, so that only failures will be displayed in the log. - */ - void setPassesAreLogged (bool shouldDisplayPasses) noexcept; - - //============================================================================== - /** Contains the results of a test. - - One of these objects is instantiated each time UnitTest::beginTest() is called, and - it contains details of the number of subsequent UnitTest::expect() calls that are - made. - */ - struct TestResult - { - /** The main name of this test (i.e. the name of the UnitTest object being run). */ - String unitTestName; - /** The name of the current subcategory (i.e. the name that was set when UnitTest::beginTest() was called). */ - String subcategoryName; - - /** The number of UnitTest::expect() calls that succeeded. */ - int passes; - /** The number of UnitTest::expect() calls that failed. */ - int failures; - - /** A list of messages describing the failed tests. */ - StringArray messages; - }; - - /** Returns the number of TestResult objects that have been performed. - @see getResult - */ - int getNumResults() const noexcept; - - /** Returns one of the TestResult objects that describes a test that has been run. - @see getNumResults - */ - const TestResult* getResult (int index) const noexcept; - -protected: - /** Called when the list of results changes. - You can override this to perform some sort of behaviour when results are added. - */ - virtual void resultsUpdated(); - - /** Logs a message about the current test progress. - By default this just writes the message to the Logger class, but you could override - this to do something else with the data. - */ - virtual void logMessage (const String& message); - - /** This can be overridden to let the runner know that it should abort the tests - as soon as possible, e.g. because the thread needs to stop. - */ - virtual bool shouldAbortTests(); - -private: - //============================================================================== - friend class UnitTest; - - UnitTest* currentTest; - String currentSubCategory; - OwnedArray results; - bool assertOnFailure, logPasses; - Random randomForTest; - - void beginNewTest (UnitTest* test, const String& subCategory); - void endTest(); - - void addPass(); - void addFail (const String& failureMessage); - - JUCE_DECLARE_NON_COPYABLE (UnitTestRunner) -}; - - -#endif // JUCE_UNITTEST_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp b/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp deleted file mode 100755 index 655f885..0000000 --- a/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.cpp +++ /dev/null @@ -1,884 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -XmlDocument::XmlDocument (const String& documentText) - : originalText (documentText), - input (nullptr), - outOfData (false), - errorOccurred (false), - needToLoadDTD (false), - ignoreEmptyTextElements (true) -{ -} - -XmlDocument::XmlDocument (const File& file) - : input (nullptr), - outOfData (false), - errorOccurred (false), - needToLoadDTD (false), - ignoreEmptyTextElements (true), - inputSource (new FileInputSource (file)) -{ -} - -XmlDocument::~XmlDocument() -{ -} - -XmlElement* XmlDocument::parse (const File& file) -{ - XmlDocument doc (file); - return doc.getDocumentElement(); -} - -XmlElement* XmlDocument::parse (const String& xmlData) -{ - XmlDocument doc (xmlData); - return doc.getDocumentElement(); -} - -void XmlDocument::setInputSource (InputSource* const newSource) noexcept -{ - inputSource = newSource; -} - -void XmlDocument::setEmptyTextElementsIgnored (const bool shouldBeIgnored) noexcept -{ - ignoreEmptyTextElements = shouldBeIgnored; -} - -namespace XmlIdentifierChars -{ - static bool isIdentifierCharSlow (const juce_wchar c) noexcept - { - return CharacterFunctions::isLetterOrDigit (c) - || c == '_' || c == '-' || c == ':' || c == '.'; - } - - static bool isIdentifierChar (const juce_wchar c) noexcept - { - static const uint32 legalChars[] = { 0, 0x7ff6000, 0x87fffffe, 0x7fffffe, 0 }; - - return ((int) c < (int) numElementsInArray (legalChars) * 32) ? ((legalChars [c >> 5] & (1 << (c & 31))) != 0) - : isIdentifierCharSlow (c); - } - - /*static void generateIdentifierCharConstants() - { - uint32 n[8] = { 0 }; - for (int i = 0; i < 256; ++i) - if (isIdentifierCharSlow (i)) - n[i >> 5] |= (1 << (i & 31)); - - String s; - for (int i = 0; i < 8; ++i) - s << "0x" << String::toHexString ((int) n[i]) << ", "; - - DBG (s); - }*/ - - static String::CharPointerType findEndOfToken (String::CharPointerType p) - { - while (isIdentifierChar (*p)) - ++p; - - return p; - } -} - -XmlElement* XmlDocument::getDocumentElement (const bool onlyReadOuterDocumentElement) -{ - if (originalText.isEmpty() && inputSource != nullptr) - { - ScopedPointer in (inputSource->createInputStream()); - - if (in != nullptr) - { - MemoryOutputStream data; - data.writeFromInputStream (*in, onlyReadOuterDocumentElement ? 8192 : -1); - - #if JUCE_STRING_UTF_TYPE == 8 - if (data.getDataSize() > 2) - { - data.writeByte (0); - const char* text = static_cast (data.getData()); - - if (CharPointer_UTF16::isByteOrderMarkBigEndian (text) - || CharPointer_UTF16::isByteOrderMarkLittleEndian (text)) - { - originalText = data.toString(); - } - else - { - if (CharPointer_UTF8::isByteOrderMark (text)) - text += 3; - - // parse the input buffer directly to avoid copying it all to a string.. - return parseDocumentElement (String::CharPointerType (text), onlyReadOuterDocumentElement); - } - } - #else - originalText = data.toString(); - #endif - } - } - - return parseDocumentElement (originalText.getCharPointer(), onlyReadOuterDocumentElement); -} - -const String& XmlDocument::getLastParseError() const noexcept -{ - return lastError; -} - -void XmlDocument::setLastError (const String& desc, const bool carryOn) -{ - lastError = desc; - errorOccurred = ! carryOn; -} - -String XmlDocument::getFileContents (const String& filename) const -{ - if (inputSource != nullptr) - { - const ScopedPointer in (inputSource->createInputStreamFor (filename.trim().unquoted())); - - if (in != nullptr) - return in->readEntireStreamAsString(); - } - - return String::empty; -} - -juce_wchar XmlDocument::readNextChar() noexcept -{ - const juce_wchar c = input.getAndAdvance(); - - if (c == 0) - { - outOfData = true; - --input; - } - - return c; -} - -XmlElement* XmlDocument::parseDocumentElement (String::CharPointerType textToParse, - const bool onlyReadOuterDocumentElement) -{ - input = textToParse; - errorOccurred = false; - outOfData = false; - needToLoadDTD = true; - - if (textToParse.isEmpty()) - { - lastError = "not enough input"; - } - else if (! parseHeader()) - { - lastError = "malformed header"; - } - else if (! parseDTD()) - { - lastError = "malformed DTD"; - } - else - { - lastError.clear(); - - ScopedPointer result (readNextElement (! onlyReadOuterDocumentElement)); - - if (! errorOccurred) - return result.release(); - } - - return nullptr; -} - -bool XmlDocument::parseHeader() -{ - skipNextWhiteSpace(); - - if (CharacterFunctions::compareUpTo (input, CharPointer_ASCII (""))); - - if (headerEnd.isEmpty()) - return false; - - #if JUCE_DEBUG - const String encoding (String (input, headerEnd) - .fromFirstOccurrenceOf ("encoding", false, true) - .fromFirstOccurrenceOf ("=", false, false) - .fromFirstOccurrenceOf ("\"", false, false) - .upToFirstOccurrenceOf ("\"", false, false).trim()); - - /* If you load an XML document with a non-UTF encoding type, it may have been - loaded wrongly.. Since all the files are read via the normal juce file streams, - they're treated as UTF-8, so by the time it gets to the parser, the encoding will - have been lost. Best plan is to stick to utf-8 or if you have specific files to - read, use your own code to convert them to a unicode String, and pass that to the - XML parser. - */ - jassert (encoding.isEmpty() || encoding.startsWithIgnoreCase ("utf-")); - #endif - - input = headerEnd + 2; - skipNextWhiteSpace(); - } - - return true; -} - -bool XmlDocument::parseDTD() -{ - if (CharacterFunctions::compareUpTo (input, CharPointer_ASCII (" 0;) - { - const juce_wchar c = readNextChar(); - - if (outOfData) - return false; - - if (c == '<') - ++n; - else if (c == '>') - --n; - } - - dtdText = String (dtdStart, input - 1).trim(); - } - - return true; -} - -void XmlDocument::skipNextWhiteSpace() -{ - for (;;) - { - input = input.findEndOfWhitespace(); - - if (input.isEmpty()) - { - outOfData = true; - break; - } - - if (*input == '<') - { - if (input[1] == '!' - && input[2] == '-' - && input[3] == '-') - { - input += 4; - const int closeComment = input.indexOf (CharPointer_ASCII ("-->")); - - if (closeComment < 0) - { - outOfData = true; - break; - } - - input += closeComment + 3; - continue; - } - - if (input[1] == '?') - { - input += 2; - const int closeBracket = input.indexOf (CharPointer_ASCII ("?>")); - - if (closeBracket < 0) - { - outOfData = true; - break; - } - - input += closeBracket + 2; - continue; - } - } - - break; - } -} - -void XmlDocument::readQuotedString (String& result) -{ - const juce_wchar quote = readNextChar(); - - while (! outOfData) - { - const juce_wchar c = readNextChar(); - - if (c == quote) - break; - - --input; - - if (c == '&') - { - readEntity (result); - } - else - { - const String::CharPointerType start (input); - - for (;;) - { - const juce_wchar character = *input; - - if (character == quote) - { - result.appendCharPointer (start, input); - ++input; - return; - } - else if (character == '&') - { - result.appendCharPointer (start, input); - break; - } - else if (character == 0) - { - setLastError ("unmatched quotes", false); - outOfData = true; - break; - } - - ++input; - } - } - } -} - -XmlElement* XmlDocument::readNextElement (const bool alsoParseSubElements) -{ - XmlElement* node = nullptr; - - skipNextWhiteSpace(); - if (outOfData) - return nullptr; - - if (*input == '<') - { - ++input; - String::CharPointerType endOfToken (XmlIdentifierChars::findEndOfToken (input)); - - if (endOfToken == input) - { - // no tag name - but allow for a gap after the '<' before giving an error - skipNextWhiteSpace(); - endOfToken = XmlIdentifierChars::findEndOfToken (input); - - if (endOfToken == input) - { - setLastError ("tag name missing", false); - return node; - } - } - - node = new XmlElement (input, endOfToken); - input = endOfToken; - LinkedListPointer::Appender attributeAppender (node->attributes); - - // look for attributes - for (;;) - { - skipNextWhiteSpace(); - - const juce_wchar c = *input; - - // empty tag.. - if (c == '/' && input[1] == '>') - { - input += 2; - break; - } - - // parse the guts of the element.. - if (c == '>') - { - ++input; - - if (alsoParseSubElements) - readChildElements (*node); - - break; - } - - // get an attribute.. - if (XmlIdentifierChars::isIdentifierChar (c)) - { - String::CharPointerType attNameEnd (XmlIdentifierChars::findEndOfToken (input)); - - if (attNameEnd != input) - { - const String::CharPointerType attNameStart (input); - input = attNameEnd; - - skipNextWhiteSpace(); - - if (readNextChar() == '=') - { - skipNextWhiteSpace(); - - const juce_wchar nextChar = *input; - - if (nextChar == '"' || nextChar == '\'') - { - XmlElement::XmlAttributeNode* const newAtt - = new XmlElement::XmlAttributeNode (attNameStart, attNameEnd); - - readQuotedString (newAtt->value); - attributeAppender.append (newAtt); - continue; - } - } - else - { - setLastError ("expected '=' after attribute '" - + String (attNameStart, attNameEnd) + "'", false); - return node; - } - } - } - else - { - if (! outOfData) - setLastError ("illegal character found in " + node->getTagName() + ": '" + c + "'", false); - } - - break; - } - } - - return node; -} - -void XmlDocument::readChildElements (XmlElement& parent) -{ - LinkedListPointer::Appender childAppender (parent.firstChildElement); - - for (;;) - { - const String::CharPointerType preWhitespaceInput (input); - skipNextWhiteSpace(); - - if (outOfData) - { - setLastError ("unmatched tags", false); - break; - } - - if (*input == '<') - { - const juce_wchar c1 = input[1]; - - if (c1 == '/') - { - // our close tag.. - const int closeTag = input.indexOf ((juce_wchar) '>'); - - if (closeTag >= 0) - input += closeTag + 1; - - break; - } - - if (c1 == '!' && CharacterFunctions::compareUpTo (input + 2, CharPointer_ASCII ("[CDATA["), 7) == 0) - { - input += 9; - const String::CharPointerType inputStart (input); - - for (;;) - { - const juce_wchar c0 = *input; - - if (c0 == 0) - { - setLastError ("unterminated CDATA section", false); - outOfData = true; - break; - } - else if (c0 == ']' - && input[1] == ']' - && input[2] == '>') - { - childAppender.append (XmlElement::createTextElement (String (inputStart, input))); - input += 3; - break; - } - - ++input; - } - } - else - { - // this is some other element, so parse and add it.. - if (XmlElement* const n = readNextElement (true)) - childAppender.append (n); - else - break; - } - } - else // must be a character block - { - input = preWhitespaceInput; // roll back to include the leading whitespace - MemoryOutputStream textElementContent; - bool contentShouldBeUsed = ! ignoreEmptyTextElements; - - for (;;) - { - const juce_wchar c = *input; - - if (c == '<') - { - if (input[1] == '!' && input[2] == '-' && input[3] == '-') - { - input += 4; - const int closeComment = input.indexOf (CharPointer_ASCII ("-->")); - - if (closeComment < 0) - { - setLastError ("unterminated comment", false); - outOfData = true; - return; - } - - input += closeComment + 3; - continue; - } - - break; - } - - if (c == 0) - { - setLastError ("unmatched tags", false); - outOfData = true; - return; - } - - if (c == '&') - { - String entity; - readEntity (entity); - - if (entity.startsWithChar ('<') && entity [1] != 0) - { - const String::CharPointerType oldInput (input); - const bool oldOutOfData = outOfData; - - input = entity.getCharPointer(); - outOfData = false; - - while (XmlElement* n = readNextElement (true)) - childAppender.append (n); - - input = oldInput; - outOfData = oldOutOfData; - } - else - { - textElementContent << entity; - contentShouldBeUsed = contentShouldBeUsed || entity.containsNonWhitespaceChars(); - } - } - else - { - for (;;) - { - const juce_wchar nextChar = *input; - - if (nextChar == '<' || nextChar == '&') - break; - - if (nextChar == 0) - { - setLastError ("unmatched tags", false); - outOfData = true; - return; - } - - textElementContent.appendUTF8Char (nextChar); - contentShouldBeUsed = contentShouldBeUsed || ! CharacterFunctions::isWhitespace (nextChar); - ++input; - } - } - } - - if (contentShouldBeUsed) - childAppender.append (XmlElement::createTextElement (textElementContent.toUTF8())); - } - } -} - -void XmlDocument::readEntity (String& result) -{ - // skip over the ampersand - ++input; - - if (input.compareIgnoreCaseUpTo (CharPointer_ASCII ("amp;"), 4) == 0) - { - input += 4; - result += '&'; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_ASCII ("quot;"), 5) == 0) - { - input += 5; - result += '"'; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_ASCII ("apos;"), 5) == 0) - { - input += 5; - result += '\''; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_ASCII ("lt;"), 3) == 0) - { - input += 3; - result += '<'; - } - else if (input.compareIgnoreCaseUpTo (CharPointer_ASCII ("gt;"), 3) == 0) - { - input += 3; - result += '>'; - } - else if (*input == '#') - { - int charCode = 0; - ++input; - - if (*input == 'x' || *input == 'X') - { - ++input; - int numChars = 0; - - while (input[0] != ';') - { - const int hexValue = CharacterFunctions::getHexDigitValue (input[0]); - - if (hexValue < 0 || ++numChars > 8) - { - setLastError ("illegal escape sequence", true); - break; - } - - charCode = (charCode << 4) | hexValue; - ++input; - } - - ++input; - } - else if (input[0] >= '0' && input[0] <= '9') - { - int numChars = 0; - - while (input[0] != ';') - { - if (++numChars > 12) - { - setLastError ("illegal escape sequence", true); - break; - } - - charCode = charCode * 10 + ((int) input[0] - '0'); - ++input; - } - - ++input; - } - else - { - setLastError ("illegal escape sequence", true); - result += '&'; - return; - } - - result << (juce_wchar) charCode; - } - else - { - const String::CharPointerType entityNameStart (input); - const int closingSemiColon = input.indexOf ((juce_wchar) ';'); - - if (closingSemiColon < 0) - { - outOfData = true; - result += '&'; - } - else - { - input += closingSemiColon + 1; - - result += expandExternalEntity (String (entityNameStart, (size_t) closingSemiColon)); - } - } -} - -String XmlDocument::expandEntity (const String& ent) -{ - if (ent.equalsIgnoreCase ("amp")) return String::charToString ('&'); - if (ent.equalsIgnoreCase ("quot")) return String::charToString ('"'); - if (ent.equalsIgnoreCase ("apos")) return String::charToString ('\''); - if (ent.equalsIgnoreCase ("lt")) return String::charToString ('<'); - if (ent.equalsIgnoreCase ("gt")) return String::charToString ('>'); - - if (ent[0] == '#') - { - const juce_wchar char1 = ent[1]; - - if (char1 == 'x' || char1 == 'X') - return String::charToString (static_cast (ent.substring (2).getHexValue32())); - - if (char1 >= '0' && char1 <= '9') - return String::charToString (static_cast (ent.substring (1).getIntValue())); - - setLastError ("illegal escape sequence", false); - return String::charToString ('&'); - } - - return expandExternalEntity (ent); -} - -String XmlDocument::expandExternalEntity (const String& entity) -{ - if (needToLoadDTD) - { - if (dtdText.isNotEmpty()) - { - dtdText = dtdText.trimCharactersAtEnd (">"); - tokenisedDTD.addTokens (dtdText, true); - - if (tokenisedDTD [tokenisedDTD.size() - 2].equalsIgnoreCase ("system") - && tokenisedDTD [tokenisedDTD.size() - 1].isQuotedString()) - { - const String fn (tokenisedDTD [tokenisedDTD.size() - 1]); - - tokenisedDTD.clear(); - tokenisedDTD.addTokens (getFileContents (fn), true); - } - else - { - tokenisedDTD.clear(); - const int openBracket = dtdText.indexOfChar ('['); - - if (openBracket > 0) - { - const int closeBracket = dtdText.lastIndexOfChar (']'); - - if (closeBracket > openBracket) - tokenisedDTD.addTokens (dtdText.substring (openBracket + 1, - closeBracket), true); - } - } - - for (int i = tokenisedDTD.size(); --i >= 0;) - { - if (tokenisedDTD[i].startsWithChar ('%') - && tokenisedDTD[i].endsWithChar (';')) - { - const String parsed (getParameterEntity (tokenisedDTD[i].substring (1, tokenisedDTD[i].length() - 1))); - StringArray newToks; - newToks.addTokens (parsed, true); - - tokenisedDTD.remove (i); - - for (int j = newToks.size(); --j >= 0;) - tokenisedDTD.insert (i, newToks[j]); - } - } - } - - needToLoadDTD = false; - } - - for (int i = 0; i < tokenisedDTD.size(); ++i) - { - if (tokenisedDTD[i] == entity) - { - if (tokenisedDTD[i - 1].equalsIgnoreCase ("").trim().unquoted()); - - // check for sub-entities.. - int ampersand = ent.indexOfChar ('&'); - - while (ampersand >= 0) - { - const int semiColon = ent.indexOf (i + 1, ";"); - - if (semiColon < 0) - { - setLastError ("entity without terminating semi-colon", false); - break; - } - - const String resolved (expandEntity (ent.substring (i + 1, semiColon))); - - ent = ent.substring (0, ampersand) - + resolved - + ent.substring (semiColon + 1); - - ampersand = ent.indexOfChar (semiColon + 1, '&'); - } - - return ent; - } - } - } - - setLastError ("unknown entity", true); - - return entity; -} - -String XmlDocument::getParameterEntity (const String& entity) -{ - for (int i = 0; i < tokenisedDTD.size(); ++i) - { - if (tokenisedDTD[i] == entity - && tokenisedDTD [i - 1] == "%" - && tokenisedDTD [i - 2].equalsIgnoreCase ("")); - - if (ent.equalsIgnoreCase ("system")) - return getFileContents (tokenisedDTD [i + 2].trimCharactersAtEnd (">")); - - return ent.trim().unquoted(); - } - } - - return entity; -} diff --git a/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h b/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h deleted file mode 100755 index c032b85..0000000 --- a/JuceLibraryCode/modules/juce_core/xml/juce_XmlDocument.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_XMLDOCUMENT_H_INCLUDED -#define JUCE_XMLDOCUMENT_H_INCLUDED - - -//============================================================================== -/** - Parses a text-based XML document and creates an XmlElement object from it. - - The parser will parse DTDs to load external entities but won't - check the document for validity against the DTD. - - e.g. - @code - - XmlDocument myDocument (File ("myfile.xml")); - ScopedPointer mainElement (myDocument.getDocumentElement()); - - if (mainElement == nullptr) - { - String error = myDocument.getLastParseError(); - } - else - { - ..use the element - } - - @endcode - - Or you can use the static helper methods for quick parsing.. - - @code - ScopedPointer xml (XmlDocument::parse (myXmlFile)); - - if (xml != nullptr && xml->hasTagName ("foobar")) - { - ...etc - @endcode - - @see XmlElement -*/ -class JUCE_API XmlDocument -{ -public: - //============================================================================== - /** Creates an XmlDocument from the xml text. - The text doesn't actually get parsed until the getDocumentElement() method is called. - */ - XmlDocument (const String& documentText); - - /** Creates an XmlDocument from a file. - The text doesn't actually get parsed until the getDocumentElement() method is called. - */ - XmlDocument (const File& file); - - /** Destructor. */ - ~XmlDocument(); - - //============================================================================== - /** Creates an XmlElement object to represent the main document node. - - This method will do the actual parsing of the text, and if there's a - parse error, it may returns nullptr (and you can find out the error using - the getLastParseError() method). - - See also the parse() methods, which provide a shorthand way to quickly - parse a file or string. - - @param onlyReadOuterDocumentElement if true, the parser will only read the - first section of the file, and will only - return the outer document element - this - allows quick checking of large files to - see if they contain the correct type of - tag, without having to parse the entire file - @returns a new XmlElement which the caller will need to delete, or null if - there was an error. - @see getLastParseError - */ - XmlElement* getDocumentElement (bool onlyReadOuterDocumentElement = false); - - /** Returns the parsing error that occurred the last time getDocumentElement was called. - - @returns the error, or an empty string if there was no error. - */ - const String& getLastParseError() const noexcept; - - /** Sets an input source object to use for parsing documents that reference external entities. - - If the document has been created from a file, this probably won't be needed, but - if you're parsing some text and there might be a DTD that references external - files, you may need to create a custom input source that can retrieve the - other files it needs. - - The object that is passed-in will be deleted automatically when no longer needed. - - @see InputSource - */ - void setInputSource (InputSource* newSource) noexcept; - - /** Sets a flag to change the treatment of empty text elements. - - If this is true (the default state), then any text elements that contain only - whitespace characters will be ingored during parsing. If you need to catch - whitespace-only text, then you should set this to false before calling the - getDocumentElement() method. - */ - void setEmptyTextElementsIgnored (bool shouldBeIgnored) noexcept; - - //============================================================================== - /** A handy static method that parses a file. - This is a shortcut for creating an XmlDocument object and calling getDocumentElement() on it. - @returns a new XmlElement which the caller will need to delete, or null if there was an error. - */ - static XmlElement* parse (const File& file); - - /** A handy static method that parses some XML data. - This is a shortcut for creating an XmlDocument object and calling getDocumentElement() on it. - @returns a new XmlElement which the caller will need to delete, or null if there was an error. - */ - static XmlElement* parse (const String& xmlData); - - - //============================================================================== -private: - String originalText; - String::CharPointerType input; - bool outOfData, errorOccurred; - - String lastError, dtdText; - StringArray tokenisedDTD; - bool needToLoadDTD, ignoreEmptyTextElements; - ScopedPointer inputSource; - - XmlElement* parseDocumentElement (String::CharPointerType, bool outer); - void setLastError (const String&, bool carryOn); - bool parseHeader(); - bool parseDTD(); - void skipNextWhiteSpace(); - juce_wchar readNextChar() noexcept; - XmlElement* readNextElement (bool alsoParseSubElements); - void readChildElements (XmlElement&); - void readQuotedString (String&); - void readEntity (String&); - - String getFileContents (const String&) const; - String expandEntity (const String&); - String expandExternalEntity (const String&); - String getParameterEntity (const String&); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XmlDocument) -}; - - -#endif // JUCE_XMLDOCUMENT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp b/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp deleted file mode 100755 index 866d10a..0000000 --- a/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.cpp +++ /dev/null @@ -1,888 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -XmlElement::XmlAttributeNode::XmlAttributeNode (const XmlAttributeNode& other) noexcept - : name (other.name), - value (other.value) -{ -} - -XmlElement::XmlAttributeNode::XmlAttributeNode (const Identifier& n, const String& v) noexcept - : name (n), value (v) -{ - #if JUCE_DEBUG - // this checks whether the attribute name string contains any illegal characters.. - for (String::CharPointerType t (name.getCharPointer()); ! t.isEmpty(); ++t) - jassert (t.isLetterOrDigit() || *t == '_' || *t == '-' || *t == ':'); - #endif -} - -XmlElement::XmlAttributeNode::XmlAttributeNode (String::CharPointerType nameStart, String::CharPointerType nameEnd) - : name (nameStart, nameEnd) -{ -} - -//============================================================================== -static void sanityCheckTagName (const String& tag) -{ - (void) tag; - - // the tag name mustn't be empty, or it'll look like a text element! - jassert (tag.containsNonWhitespaceChars()); - - // The tag can't contain spaces or other characters that would create invalid XML! - jassert (! tag.containsAnyOf (" <>/&(){}")); -} - -XmlElement::XmlElement (const String& tag) - : tagName (StringPool::getGlobalPool().getPooledString (tag)) -{ - sanityCheckTagName (tagName); -} - -XmlElement::XmlElement (const char* tag) - : tagName (StringPool::getGlobalPool().getPooledString (tag)) -{ - sanityCheckTagName (tagName); -} - -XmlElement::XmlElement (StringRef tag) - : tagName (StringPool::getGlobalPool().getPooledString (tag)) -{ - sanityCheckTagName (tagName); -} - -XmlElement::XmlElement (const Identifier& tag) - : tagName (tag.toString()) -{ - sanityCheckTagName (tagName); -} - -XmlElement::XmlElement (String::CharPointerType tagNameStart, String::CharPointerType tagNameEnd) - : tagName (StringPool::getGlobalPool().getPooledString (tagNameStart, tagNameEnd)) -{ - sanityCheckTagName (tagName); -} - -XmlElement::XmlElement (int /*dummy*/) noexcept -{ -} - -XmlElement::XmlElement (const XmlElement& other) - : tagName (other.tagName) -{ - copyChildrenAndAttributesFrom (other); -} - -XmlElement& XmlElement::operator= (const XmlElement& other) -{ - if (this != &other) - { - removeAllAttributes(); - deleteAllChildElements(); - tagName = other.tagName; - copyChildrenAndAttributesFrom (other); - } - - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -XmlElement::XmlElement (XmlElement&& other) noexcept - : nextListItem (static_cast&&> (other.nextListItem)), - firstChildElement (static_cast&&> (other.firstChildElement)), - attributes (static_cast&&> (other.attributes)), - tagName (static_cast (other.tagName)) -{ -} - -XmlElement& XmlElement::operator= (XmlElement&& other) noexcept -{ - jassert (this != &other); // hopefully the compiler should make this situation impossible! - - removeAllAttributes(); - deleteAllChildElements(); - - nextListItem = static_cast&&> (other.nextListItem); - firstChildElement = static_cast&&> (other.firstChildElement); - attributes = static_cast&&> (other.attributes); - tagName = static_cast (other.tagName); - - return *this; -} -#endif - -void XmlElement::copyChildrenAndAttributesFrom (const XmlElement& other) -{ - jassert (firstChildElement.get() == nullptr); - firstChildElement.addCopyOfList (other.firstChildElement); - - jassert (attributes.get() == nullptr); - attributes.addCopyOfList (other.attributes); -} - -XmlElement::~XmlElement() noexcept -{ - firstChildElement.deleteAll(); - attributes.deleteAll(); -} - -//============================================================================== -namespace XmlOutputFunctions -{ - #if 0 // (These functions are just used to generate the lookup table used below) - bool isLegalXmlCharSlow (const juce_wchar character) noexcept - { - if ((character >= 'a' && character <= 'z') - || (character >= 'A' && character <= 'Z') - || (character >= '0' && character <= '9')) - return true; - - const char* t = " .,;:-()_+=?!'#@[]/\\*%~{}$|"; - - do - { - if (((juce_wchar) (uint8) *t) == character) - return true; - } - while (*++t != 0); - - return false; - } - - void generateLegalCharLookupTable() - { - uint8 n[32] = { 0 }; - for (int i = 0; i < 256; ++i) - if (isLegalXmlCharSlow (i)) - n[i >> 3] |= (1 << (i & 7)); - - String s; - for (int i = 0; i < 32; ++i) - s << (int) n[i] << ", "; - - DBG (s); - } - #endif - - static bool isLegalXmlChar (const uint32 c) noexcept - { - static const unsigned char legalChars[] = { 0, 0, 0, 0, 187, 255, 255, 175, 255, - 255, 255, 191, 254, 255, 255, 127 }; - return c < sizeof (legalChars) * 8 - && (legalChars [c >> 3] & (1 << (c & 7))) != 0; - } - - static void escapeIllegalXmlChars (OutputStream& outputStream, const String& text, const bool changeNewLines) - { - String::CharPointerType t (text.getCharPointer()); - - for (;;) - { - const uint32 character = (uint32) t.getAndAdvance(); - - if (character == 0) - break; - - if (isLegalXmlChar (character)) - { - outputStream << (char) character; - } - else - { - switch (character) - { - case '&': outputStream << "&"; break; - case '"': outputStream << """; break; - case '>': outputStream << ">"; break; - case '<': outputStream << "<"; break; - - case '\n': - case '\r': - if (! changeNewLines) - { - outputStream << (char) character; - break; - } - // Note: deliberate fall-through here! - default: - outputStream << "&#" << ((int) character) << ';'; - break; - } - } - } - } - - static void writeSpaces (OutputStream& out, const size_t numSpaces) - { - out.writeRepeatedByte (' ', numSpaces); - } -} - -void XmlElement::writeElementAsText (OutputStream& outputStream, - const int indentationLevel, - const int lineWrapLength) const -{ - using namespace XmlOutputFunctions; - - if (indentationLevel >= 0) - writeSpaces (outputStream, (size_t) indentationLevel); - - if (! isTextElement()) - { - outputStream.writeByte ('<'); - outputStream << tagName; - - { - const size_t attIndent = (size_t) (indentationLevel + tagName.length() + 1); - int lineLen = 0; - - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - { - if (lineLen > lineWrapLength && indentationLevel >= 0) - { - outputStream << newLine; - writeSpaces (outputStream, attIndent); - lineLen = 0; - } - - const int64 startPos = outputStream.getPosition(); - outputStream.writeByte (' '); - outputStream << att->name; - outputStream.write ("=\"", 2); - escapeIllegalXmlChars (outputStream, att->value, true); - outputStream.writeByte ('"'); - lineLen += (int) (outputStream.getPosition() - startPos); - } - } - - if (firstChildElement != nullptr) - { - outputStream.writeByte ('>'); - - bool lastWasTextNode = false; - - for (XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - { - if (child->isTextElement()) - { - escapeIllegalXmlChars (outputStream, child->getText(), false); - lastWasTextNode = true; - } - else - { - if (indentationLevel >= 0 && ! lastWasTextNode) - outputStream << newLine; - - child->writeElementAsText (outputStream, - lastWasTextNode ? 0 : (indentationLevel + (indentationLevel >= 0 ? 2 : 0)), lineWrapLength); - lastWasTextNode = false; - } - } - - if (indentationLevel >= 0 && ! lastWasTextNode) - { - outputStream << newLine; - writeSpaces (outputStream, (size_t) indentationLevel); - } - - outputStream.write ("'); - } - else - { - outputStream.write ("/>", 2); - } - } - else - { - escapeIllegalXmlChars (outputStream, getText(), false); - } -} - -String XmlElement::createDocument (StringRef dtdToUse, - const bool allOnOneLine, - const bool includeXmlHeader, - StringRef encodingType, - const int lineWrapLength) const -{ - MemoryOutputStream mem (2048); - writeToStream (mem, dtdToUse, allOnOneLine, includeXmlHeader, encodingType, lineWrapLength); - - return mem.toUTF8(); -} - -void XmlElement::writeToStream (OutputStream& output, - StringRef dtdToUse, - const bool allOnOneLine, - const bool includeXmlHeader, - StringRef encodingType, - const int lineWrapLength) const -{ - using namespace XmlOutputFunctions; - - if (includeXmlHeader) - { - output << ""; - - if (allOnOneLine) - output.writeByte (' '); - else - output << newLine << newLine; - } - - if (dtdToUse.isNotEmpty()) - { - output << dtdToUse; - - if (allOnOneLine) - output.writeByte (' '); - else - output << newLine; - } - - writeElementAsText (output, allOnOneLine ? -1 : 0, lineWrapLength); - - if (! allOnOneLine) - output << newLine; -} - -bool XmlElement::writeToFile (const File& file, - StringRef dtdToUse, - StringRef encodingType, - const int lineWrapLength) const -{ - TemporaryFile tempFile (file); - - { - FileOutputStream out (tempFile.getFile()); - - if (! out.openedOk()) - return false; - - writeToStream (out, dtdToUse, false, true, encodingType, lineWrapLength); - } - - return tempFile.overwriteTargetFileWithTemporary(); -} - -//============================================================================== -bool XmlElement::hasTagName (StringRef possibleTagName) const noexcept -{ - const bool matches = tagName.equalsIgnoreCase (possibleTagName); - - // XML tags should be case-sensitive, so although this method allows a - // case-insensitive match to pass, you should try to avoid this. - jassert ((! matches) || tagName == possibleTagName); - - return matches; -} - -String XmlElement::getNamespace() const -{ - return tagName.upToFirstOccurrenceOf (":", false, false); -} - -String XmlElement::getTagNameWithoutNamespace() const -{ - return tagName.fromLastOccurrenceOf (":", false, false); -} - -bool XmlElement::hasTagNameIgnoringNamespace (StringRef possibleTagName) const -{ - return hasTagName (possibleTagName) || getTagNameWithoutNamespace() == possibleTagName; -} - -XmlElement* XmlElement::getNextElementWithTagName (StringRef requiredTagName) const -{ - XmlElement* e = nextListItem; - - while (e != nullptr && ! e->hasTagName (requiredTagName)) - e = e->nextListItem; - - return e; -} - -//============================================================================== -int XmlElement::getNumAttributes() const noexcept -{ - return attributes.size(); -} - -const String& XmlElement::getAttributeName (const int index) const noexcept -{ - if (const XmlAttributeNode* const att = attributes [index]) - return att->name.toString(); - - return String::empty; -} - -const String& XmlElement::getAttributeValue (const int index) const noexcept -{ - if (const XmlAttributeNode* const att = attributes [index]) - return att->value; - - return String::empty; -} - -XmlElement::XmlAttributeNode* XmlElement::getAttribute (StringRef attributeName) const noexcept -{ - for (XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - if (att->name == attributeName) - return att; - - return nullptr; -} - -bool XmlElement::hasAttribute (StringRef attributeName) const noexcept -{ - return getAttribute (attributeName) != nullptr; -} - -//============================================================================== -const String& XmlElement::getStringAttribute (StringRef attributeName) const noexcept -{ - if (const XmlAttributeNode* att = getAttribute (attributeName)) - return att->value; - - return String::empty; -} - -String XmlElement::getStringAttribute (StringRef attributeName, const String& defaultReturnValue) const -{ - if (const XmlAttributeNode* att = getAttribute (attributeName)) - return att->value; - - return defaultReturnValue; -} - -int XmlElement::getIntAttribute (StringRef attributeName, const int defaultReturnValue) const -{ - if (const XmlAttributeNode* att = getAttribute (attributeName)) - return att->value.getIntValue(); - - return defaultReturnValue; -} - -double XmlElement::getDoubleAttribute (StringRef attributeName, const double defaultReturnValue) const -{ - if (const XmlAttributeNode* att = getAttribute (attributeName)) - return att->value.getDoubleValue(); - - return defaultReturnValue; -} - -bool XmlElement::getBoolAttribute (StringRef attributeName, const bool defaultReturnValue) const -{ - if (const XmlAttributeNode* att = getAttribute (attributeName)) - { - const juce_wchar firstChar = *(att->value.getCharPointer().findEndOfWhitespace()); - - return firstChar == '1' - || firstChar == 't' - || firstChar == 'y' - || firstChar == 'T' - || firstChar == 'Y'; - } - - return defaultReturnValue; -} - -bool XmlElement::compareAttribute (StringRef attributeName, - StringRef stringToCompareAgainst, - const bool ignoreCase) const noexcept -{ - if (const XmlAttributeNode* att = getAttribute (attributeName)) - return ignoreCase ? att->value.equalsIgnoreCase (stringToCompareAgainst) - : att->value == stringToCompareAgainst; - - return false; -} - -//============================================================================== -void XmlElement::setAttribute (const Identifier& attributeName, const String& value) -{ - if (attributes == nullptr) - { - attributes = new XmlAttributeNode (attributeName, value); - } - else - { - for (XmlAttributeNode* att = attributes; ; att = att->nextListItem) - { - if (att->name == attributeName) - { - att->value = value; - break; - } - - if (att->nextListItem == nullptr) - { - att->nextListItem = new XmlAttributeNode (attributeName, value); - break; - } - } - } -} - -void XmlElement::setAttribute (const Identifier& attributeName, const int number) -{ - setAttribute (attributeName, String (number)); -} - -void XmlElement::setAttribute (const Identifier& attributeName, const double number) -{ - setAttribute (attributeName, String (number, 20)); -} - -void XmlElement::removeAttribute (const Identifier& attributeName) noexcept -{ - for (LinkedListPointer* att = &attributes; - att->get() != nullptr; - att = &(att->get()->nextListItem)) - { - if (att->get()->name == attributeName) - { - delete att->removeNext(); - break; - } - } -} - -void XmlElement::removeAllAttributes() noexcept -{ - attributes.deleteAll(); -} - -//============================================================================== -int XmlElement::getNumChildElements() const noexcept -{ - return firstChildElement.size(); -} - -XmlElement* XmlElement::getChildElement (const int index) const noexcept -{ - return firstChildElement [index].get(); -} - -XmlElement* XmlElement::getChildByName (StringRef childName) const noexcept -{ - jassert (! childName.isEmpty()); - - for (XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - if (child->hasTagName (childName)) - return child; - - return nullptr; -} - -XmlElement* XmlElement::getChildByAttribute (StringRef attributeName, StringRef attributeValue) const noexcept -{ - jassert (! attributeName.isEmpty()); - - for (XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - if (child->compareAttribute (attributeName, attributeValue)) - return child; - - return nullptr; -} - -void XmlElement::addChildElement (XmlElement* const newNode) noexcept -{ - if (newNode != nullptr) - { - // The element being added must not be a child of another node! - jassert (newNode->nextListItem == nullptr); - - firstChildElement.append (newNode); - } -} - -void XmlElement::insertChildElement (XmlElement* const newNode, int indexToInsertAt) noexcept -{ - if (newNode != nullptr) - { - // The element being added must not be a child of another node! - jassert (newNode->nextListItem == nullptr); - - firstChildElement.insertAtIndex (indexToInsertAt, newNode); - } -} - -void XmlElement::prependChildElement (XmlElement* newNode) noexcept -{ - if (newNode != nullptr) - { - // The element being added must not be a child of another node! - jassert (newNode->nextListItem == nullptr); - - firstChildElement.insertNext (newNode); - } -} - -XmlElement* XmlElement::createNewChildElement (StringRef childTagName) -{ - XmlElement* const newElement = new XmlElement (childTagName); - addChildElement (newElement); - return newElement; -} - -bool XmlElement::replaceChildElement (XmlElement* const currentChildElement, - XmlElement* const newNode) noexcept -{ - if (newNode != nullptr) - { - if (LinkedListPointer* const p = firstChildElement.findPointerTo (currentChildElement)) - { - if (currentChildElement != newNode) - delete p->replaceNext (newNode); - - return true; - } - } - - return false; -} - -void XmlElement::removeChildElement (XmlElement* const childToRemove, - const bool shouldDeleteTheChild) noexcept -{ - if (childToRemove != nullptr) - { - firstChildElement.remove (childToRemove); - - if (shouldDeleteTheChild) - delete childToRemove; - } -} - -bool XmlElement::isEquivalentTo (const XmlElement* const other, - const bool ignoreOrderOfAttributes) const noexcept -{ - if (this != other) - { - if (other == nullptr || tagName != other->tagName) - return false; - - if (ignoreOrderOfAttributes) - { - int totalAtts = 0; - - for (const XmlAttributeNode* att = attributes; att != nullptr; att = att->nextListItem) - { - if (! other->compareAttribute (att->name, att->value)) - return false; - - ++totalAtts; - } - - if (totalAtts != other->getNumAttributes()) - return false; - } - else - { - const XmlAttributeNode* thisAtt = attributes; - const XmlAttributeNode* otherAtt = other->attributes; - - for (;;) - { - if (thisAtt == nullptr || otherAtt == nullptr) - { - if (thisAtt == otherAtt) // both nullptr, so it's a match - break; - - return false; - } - - if (thisAtt->name != otherAtt->name - || thisAtt->value != otherAtt->value) - { - return false; - } - - thisAtt = thisAtt->nextListItem; - otherAtt = otherAtt->nextListItem; - } - } - - const XmlElement* thisChild = firstChildElement; - const XmlElement* otherChild = other->firstChildElement; - - for (;;) - { - if (thisChild == nullptr || otherChild == nullptr) - { - if (thisChild == otherChild) // both 0, so it's a match - break; - - return false; - } - - if (! thisChild->isEquivalentTo (otherChild, ignoreOrderOfAttributes)) - return false; - - thisChild = thisChild->nextListItem; - otherChild = otherChild->nextListItem; - } - } - - return true; -} - -void XmlElement::deleteAllChildElements() noexcept -{ - firstChildElement.deleteAll(); -} - -void XmlElement::deleteAllChildElementsWithTagName (StringRef name) noexcept -{ - for (XmlElement* child = firstChildElement; child != nullptr;) - { - XmlElement* const nextChild = child->nextListItem; - - if (child->hasTagName (name)) - removeChildElement (child, true); - - child = nextChild; - } -} - -bool XmlElement::containsChildElement (const XmlElement* const possibleChild) const noexcept -{ - return firstChildElement.contains (possibleChild); -} - -XmlElement* XmlElement::findParentElementOf (const XmlElement* const elementToLookFor) noexcept -{ - if (this == elementToLookFor || elementToLookFor == nullptr) - return nullptr; - - for (XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - { - if (elementToLookFor == child) - return this; - - if (XmlElement* const found = child->findParentElementOf (elementToLookFor)) - return found; - } - - return nullptr; -} - -void XmlElement::getChildElementsAsArray (XmlElement** elems) const noexcept -{ - firstChildElement.copyToArray (elems); -} - -void XmlElement::reorderChildElements (XmlElement** const elems, const int num) noexcept -{ - XmlElement* e = firstChildElement = elems[0]; - - for (int i = 1; i < num; ++i) - { - e->nextListItem = elems[i]; - e = e->nextListItem; - } - - e->nextListItem = nullptr; -} - -//============================================================================== -bool XmlElement::isTextElement() const noexcept -{ - return tagName.isEmpty(); -} - -static const String juce_xmltextContentAttributeName ("text"); - -const String& XmlElement::getText() const noexcept -{ - jassert (isTextElement()); // you're trying to get the text from an element that - // isn't actually a text element.. If this contains text sub-nodes, you - // probably want to use getAllSubText instead. - - return getStringAttribute (juce_xmltextContentAttributeName); -} - -void XmlElement::setText (const String& newText) -{ - if (isTextElement()) - setAttribute (juce_xmltextContentAttributeName, newText); - else - jassertfalse; // you can only change the text in a text element, not a normal one. -} - -String XmlElement::getAllSubText() const -{ - if (isTextElement()) - return getText(); - - if (getNumChildElements() == 1) - return firstChildElement.get()->getAllSubText(); - - MemoryOutputStream mem (1024); - - for (const XmlElement* child = firstChildElement; child != nullptr; child = child->nextListItem) - mem << child->getAllSubText(); - - return mem.toUTF8(); -} - -String XmlElement::getChildElementAllSubText (StringRef childTagName, const String& defaultReturnValue) const -{ - if (const XmlElement* const child = getChildByName (childTagName)) - return child->getAllSubText(); - - return defaultReturnValue; -} - -XmlElement* XmlElement::createTextElement (const String& text) -{ - XmlElement* const e = new XmlElement ((int) 0); - e->setAttribute (juce_xmltextContentAttributeName, text); - return e; -} - -void XmlElement::addTextElement (const String& text) -{ - addChildElement (createTextElement (text)); -} - -void XmlElement::deleteAllTextElements() noexcept -{ - for (XmlElement* child = firstChildElement; child != nullptr;) - { - XmlElement* const next = child->nextListItem; - - if (child->isTextElement()) - removeChildElement (child, true); - - child = next; - } -} diff --git a/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h b/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h deleted file mode 100755 index 2f03e93..0000000 --- a/JuceLibraryCode/modules/juce_core/xml/juce_XmlElement.h +++ /dev/null @@ -1,770 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_XMLELEMENT_H_INCLUDED -#define JUCE_XMLELEMENT_H_INCLUDED - - -//============================================================================== -/** A handy macro to make it easy to iterate all the child elements in an XmlElement. - - The parentXmlElement should be a reference to the parent XML, and the childElementVariableName - will be the name of a pointer to each child element. - - E.g. @code - XmlElement* myParentXml = createSomeKindOfXmlDocument(); - - forEachXmlChildElement (*myParentXml, child) - { - if (child->hasTagName ("FOO")) - doSomethingWithXmlElement (child); - } - - @endcode - - @see forEachXmlChildElementWithTagName -*/ -#define forEachXmlChildElement(parentXmlElement, childElementVariableName) \ -\ - for (juce::XmlElement* childElementVariableName = (parentXmlElement).getFirstChildElement(); \ - childElementVariableName != nullptr; \ - childElementVariableName = childElementVariableName->getNextElement()) - -/** A macro that makes it easy to iterate all the child elements of an XmlElement - which have a specified tag. - - This does the same job as the forEachXmlChildElement macro, but only for those - elements that have a particular tag name. - - The parentXmlElement should be a reference to the parent XML, and the childElementVariableName - will be the name of a pointer to each child element. The requiredTagName is the - tag name to match. - - E.g. @code - XmlElement* myParentXml = createSomeKindOfXmlDocument(); - - forEachXmlChildElementWithTagName (*myParentXml, child, "MYTAG") - { - // the child object is now guaranteed to be a element.. - doSomethingWithMYTAGElement (child); - } - - @endcode - - @see forEachXmlChildElement -*/ -#define forEachXmlChildElementWithTagName(parentXmlElement, childElementVariableName, requiredTagName) \ -\ - for (juce::XmlElement* childElementVariableName = (parentXmlElement).getChildByName (requiredTagName); \ - childElementVariableName != nullptr; \ - childElementVariableName = childElementVariableName->getNextElementWithTagName (requiredTagName)) - - -//============================================================================== -/** Used to build a tree of elements representing an XML document. - - An XML document can be parsed into a tree of XmlElements, each of which - represents an XML tag structure, and which may itself contain other - nested elements. - - An XmlElement can also be converted back into a text document, and has - lots of useful methods for manipulating its attributes and sub-elements, - so XmlElements can actually be used as a handy general-purpose data - structure. - - Here's an example of parsing some elements: @code - // check we're looking at the right kind of document.. - if (myElement->hasTagName ("ANIMALS")) - { - // now we'll iterate its sub-elements looking for 'giraffe' elements.. - forEachXmlChildElement (*myElement, e) - { - if (e->hasTagName ("GIRAFFE")) - { - // found a giraffe, so use some of its attributes.. - - String giraffeName = e->getStringAttribute ("name"); - int giraffeAge = e->getIntAttribute ("age"); - bool isFriendly = e->getBoolAttribute ("friendly"); - } - } - } - @endcode - - And here's an example of how to create an XML document from scratch: @code - // create an outer node called "ANIMALS" - XmlElement animalsList ("ANIMALS"); - - for (int i = 0; i < numAnimals; ++i) - { - // create an inner element.. - XmlElement* giraffe = new XmlElement ("GIRAFFE"); - - giraffe->setAttribute ("name", "nigel"); - giraffe->setAttribute ("age", 10); - giraffe->setAttribute ("friendly", true); - - // ..and add our new element to the parent node - animalsList.addChildElement (giraffe); - } - - // now we can turn the whole thing into a text document.. - String myXmlDoc = animalsList.createDocument (String::empty); - @endcode - - @see XmlDocument -*/ -class JUCE_API XmlElement -{ -public: - //============================================================================== - /** Creates an XmlElement with this tag name. */ - explicit XmlElement (const String& tagName); - - /** Creates an XmlElement with this tag name. */ - explicit XmlElement (const char* tagName); - - /** Creates an XmlElement with this tag name. */ - explicit XmlElement (const Identifier& tagName); - - /** Creates an XmlElement with this tag name. */ - explicit XmlElement (StringRef tagName); - - /** Creates an XmlElement with this tag name. */ - XmlElement (String::CharPointerType tagNameBegin, String::CharPointerType tagNameEnd); - - /** Creates a (deep) copy of another element. */ - XmlElement (const XmlElement&); - - /** Creates a (deep) copy of another element. */ - XmlElement& operator= (const XmlElement&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - XmlElement (XmlElement&&) noexcept; - XmlElement& operator= (XmlElement&&) noexcept; - #endif - - /** Deleting an XmlElement will also delete all of its child elements. */ - ~XmlElement() noexcept; - - //============================================================================== - /** Compares two XmlElements to see if they contain the same text and attiributes. - - The elements are only considered equivalent if they contain the same attiributes - with the same values, and have the same sub-nodes. - - @param other the other element to compare to - @param ignoreOrderOfAttributes if true, this means that two elements with the - same attributes in a different order will be - considered the same; if false, the attributes must - be in the same order as well - */ - bool isEquivalentTo (const XmlElement* other, - bool ignoreOrderOfAttributes) const noexcept; - - //============================================================================== - /** Returns an XML text document that represents this element. - - The string returned can be parsed to recreate the same XmlElement that - was used to create it. - - @param dtdToUse the DTD to add to the document - @param allOnOneLine if true, this means that the document will not contain any - linefeeds, so it'll be smaller but not very easy to read. - @param includeXmlHeader whether to add the ", this would return "MOOSE". - @see hasTagName - */ - const String& getTagName() const noexcept { return tagName; } - - /** Returns the namespace portion of the tag-name, or an empty string if none is specified. */ - String getNamespace() const; - - /** Returns the part of the tag-name that follows any namespace declaration. */ - String getTagNameWithoutNamespace() const; - - /** Tests whether this element has a particular tag name. - @param possibleTagName the tag name you're comparing it with - @see getTagName - */ - bool hasTagName (StringRef possibleTagName) const noexcept; - - /** Tests whether this element has a particular tag name, ignoring any XML namespace prefix. - So a test for e.g. "xyz" will return true for "xyz" and also "foo:xyz", "bar::xyz", etc. - @see getTagName - */ - bool hasTagNameIgnoringNamespace (StringRef possibleTagName) const; - - //============================================================================== - /** Returns the number of XML attributes this element contains. - - E.g. for an element such as \, this would - return 2. - */ - int getNumAttributes() const noexcept; - - /** Returns the name of one of the elements attributes. - - E.g. for an element such as \, then - getAttributeName(1) would return "antlers". - - @see getAttributeValue, getStringAttribute - */ - const String& getAttributeName (int attributeIndex) const noexcept; - - /** Returns the value of one of the elements attributes. - - E.g. for an element such as \, then - getAttributeName(1) would return "2". - - @see getAttributeName, getStringAttribute - */ - const String& getAttributeValue (int attributeIndex) const noexcept; - - //============================================================================== - // Attribute-handling methods.. - - /** Checks whether the element contains an attribute with a certain name. */ - bool hasAttribute (StringRef attributeName) const noexcept; - - /** Returns the value of a named attribute. - @param attributeName the name of the attribute to look up - */ - const String& getStringAttribute (StringRef attributeName) const noexcept; - - /** Returns the value of a named attribute. - @param attributeName the name of the attribute to look up - @param defaultReturnValue a value to return if the element doesn't have an attribute - with this name - */ - String getStringAttribute (StringRef attributeName, const String& defaultReturnValue) const; - - /** Compares the value of a named attribute with a value passed-in. - - @param attributeName the name of the attribute to look up - @param stringToCompareAgainst the value to compare it with - @param ignoreCase whether the comparison should be case-insensitive - @returns true if the value of the attribute is the same as the string passed-in; - false if it's different (or if no such attribute exists) - */ - bool compareAttribute (StringRef attributeName, - StringRef stringToCompareAgainst, - bool ignoreCase = false) const noexcept; - - /** Returns the value of a named attribute as an integer. - - This will try to find the attribute and convert it to an integer (using - the String::getIntValue() method). - - @param attributeName the name of the attribute to look up - @param defaultReturnValue a value to return if the element doesn't have an attribute - with this name - @see setAttribute - */ - int getIntAttribute (StringRef attributeName, int defaultReturnValue = 0) const; - - /** Returns the value of a named attribute as floating-point. - - This will try to find the attribute and convert it to an integer (using - the String::getDoubleValue() method). - - @param attributeName the name of the attribute to look up - @param defaultReturnValue a value to return if the element doesn't have an attribute - with this name - @see setAttribute - */ - double getDoubleAttribute (StringRef attributeName, double defaultReturnValue = 0.0) const; - - /** Returns the value of a named attribute as a boolean. - - This will try to find the attribute and interpret it as a boolean. To do this, - it'll return true if the value is "1", "true", "y", etc, or false for other - values. - - @param attributeName the name of the attribute to look up - @param defaultReturnValue a value to return if the element doesn't have an attribute - with this name - */ - bool getBoolAttribute (StringRef attributeName, bool defaultReturnValue = false) const; - - /** Adds a named attribute to the element. - - If the element already contains an attribute with this name, it's value will - be updated to the new value. If there's no such attribute yet, a new one will - be added. - - Note that there are other setAttribute() methods that take integers, - doubles, etc. to make it easy to store numbers. - - @param attributeName the name of the attribute to set - @param newValue the value to set it to - @see removeAttribute - */ - void setAttribute (const Identifier& attributeName, const String& newValue); - - /** Adds a named attribute to the element, setting it to an integer value. - - If the element already contains an attribute with this name, it's value will - be updated to the new value. If there's no such attribute yet, a new one will - be added. - - Note that there are other setAttribute() methods that take integers, - doubles, etc. to make it easy to store numbers. - - @param attributeName the name of the attribute to set - @param newValue the value to set it to - */ - void setAttribute (const Identifier& attributeName, int newValue); - - /** Adds a named attribute to the element, setting it to a floating-point value. - - If the element already contains an attribute with this name, it's value will - be updated to the new value. If there's no such attribute yet, a new one will - be added. - - Note that there are other setAttribute() methods that take integers, - doubles, etc. to make it easy to store numbers. - - @param attributeName the name of the attribute to set - @param newValue the value to set it to - */ - void setAttribute (const Identifier& attributeName, double newValue); - - /** Removes a named attribute from the element. - - @param attributeName the name of the attribute to remove - @see removeAllAttributes - */ - void removeAttribute (const Identifier& attributeName) noexcept; - - /** Removes all attributes from this element. */ - void removeAllAttributes() noexcept; - - //============================================================================== - // Child element methods.. - - /** Returns the first of this element's sub-elements. - see getNextElement() for an example of how to iterate the sub-elements. - @see forEachXmlChildElement - */ - XmlElement* getFirstChildElement() const noexcept { return firstChildElement; } - - /** Returns the next of this element's siblings. - - This can be used for iterating an element's sub-elements, e.g. - @code - XmlElement* child = myXmlDocument->getFirstChildElement(); - - while (child != nullptr) - { - ...do stuff with this child.. - - child = child->getNextElement(); - } - @endcode - - Note that when iterating the child elements, some of them might be - text elements as well as XML tags - use isTextElement() to work this - out. - - Also, it's much easier and neater to use this method indirectly via the - forEachXmlChildElement macro. - - @returns the sibling element that follows this one, or zero if this is the last - element in its parent - - @see getNextElement, isTextElement, forEachXmlChildElement - */ - inline XmlElement* getNextElement() const noexcept { return nextListItem; } - - /** Returns the next of this element's siblings which has the specified tag - name. - - This is like getNextElement(), but will scan through the list until it - finds an element with the given tag name. - - @see getNextElement, forEachXmlChildElementWithTagName - */ - XmlElement* getNextElementWithTagName (StringRef requiredTagName) const; - - /** Returns the number of sub-elements in this element. - @see getChildElement - */ - int getNumChildElements() const noexcept; - - /** Returns the sub-element at a certain index. - - It's not very efficient to iterate the sub-elements by index - see - getNextElement() for an example of how best to iterate. - - @returns the n'th child of this element, or nullptr if the index is out-of-range - @see getNextElement, isTextElement, getChildByName - */ - XmlElement* getChildElement (int index) const noexcept; - - /** Returns the first sub-element with a given tag-name. - - @param tagNameToLookFor the tag name of the element you want to find - @returns the first element with this tag name, or nullptr if none is found - @see getNextElement, isTextElement, getChildElement, getChildByAttribute - */ - XmlElement* getChildByName (StringRef tagNameToLookFor) const noexcept; - - /** Returns the first sub-element which has an attribute that matches the given value. - - @param attributeName the name of the attribute to check - @param attributeValue the target value of the attribute - @returns the first element with this attribute value, or nullptr if none is found - @see getChildByName - */ - XmlElement* getChildByAttribute (StringRef attributeName, - StringRef attributeValue) const noexcept; - - //============================================================================== - /** Appends an element to this element's list of children. - - Child elements are deleted automatically when their parent is deleted, so - make sure the object that you pass in will not be deleted by anything else, - and make sure it's not already the child of another element. - - Note that due to the XmlElement using a singly-linked-list, prependChildElement() - is an O(1) operation, but addChildElement() is an O(N) operation - so if - you're adding large number of elements, you may prefer to do so in reverse order! - - @see getFirstChildElement, getNextElement, getNumChildElements, - getChildElement, removeChildElement - */ - void addChildElement (XmlElement* newChildElement) noexcept; - - /** Inserts an element into this element's list of children. - - Child elements are deleted automatically when their parent is deleted, so - make sure the object that you pass in will not be deleted by anything else, - and make sure it's not already the child of another element. - - @param newChildElement the element to add - @param indexToInsertAt the index at which to insert the new element - if this is - below zero, it will be added to the end of the list - @see addChildElement, insertChildElement - */ - void insertChildElement (XmlElement* newChildElement, - int indexToInsertAt) noexcept; - - /** Inserts an element at the beginning of this element's list of children. - - Child elements are deleted automatically when their parent is deleted, so - make sure the object that you pass in will not be deleted by anything else, - and make sure it's not already the child of another element. - - Note that due to the XmlElement using a singly-linked-list, prependChildElement() - is an O(1) operation, but addChildElement() is an O(N) operation - so if - you're adding large number of elements, you may prefer to do so in reverse order! - - @see addChildElement, insertChildElement - */ - void prependChildElement (XmlElement* newChildElement) noexcept; - - /** Creates a new element with the given name and returns it, after adding it - as a child element. - - This is a handy method that means that instead of writing this: - @code - XmlElement* newElement = new XmlElement ("foobar"); - myParentElement->addChildElement (newElement); - @endcode - - ..you could just write this: - @code - XmlElement* newElement = myParentElement->createNewChildElement ("foobar"); - @endcode - */ - XmlElement* createNewChildElement (StringRef tagName); - - /** Replaces one of this element's children with another node. - - If the current element passed-in isn't actually a child of this element, - this will return false and the new one won't be added. Otherwise, the - existing element will be deleted, replaced with the new one, and it - will return true. - */ - bool replaceChildElement (XmlElement* currentChildElement, - XmlElement* newChildNode) noexcept; - - /** Removes a child element. - - @param childToRemove the child to look for and remove - @param shouldDeleteTheChild if true, the child will be deleted, if false it'll - just remove it - */ - void removeChildElement (XmlElement* childToRemove, - bool shouldDeleteTheChild) noexcept; - - /** Deletes all the child elements in the element. - @see removeChildElement, deleteAllChildElementsWithTagName - */ - void deleteAllChildElements() noexcept; - - /** Deletes all the child elements with a given tag name. - @see removeChildElement - */ - void deleteAllChildElementsWithTagName (StringRef tagName) noexcept; - - /** Returns true if the given element is a child of this one. */ - bool containsChildElement (const XmlElement* possibleChild) const noexcept; - - /** Recursively searches all sub-elements of this one, looking for an element - which is the direct parent of the specified element. - - Because elements don't store a pointer to their parent, if you have one - and need to find its parent, the only way to do so is to exhaustively - search the whole tree for it. - - If the given child is found somewhere in this element's hierarchy, then - this method will return its parent. If not, it will return nullptr. - */ - XmlElement* findParentElementOf (const XmlElement* childToSearchFor) noexcept; - - //============================================================================== - /** Sorts the child elements using a comparator. - - This will use a comparator object to sort the elements into order. The object - passed must have a method of the form: - @code - int compareElements (const XmlElement* first, const XmlElement* second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator the comparator to use for comparing elements. - @param retainOrderOfEquivalentItems if this is true, then items which the comparator - says are equivalent will be kept in the order in which they - currently appear in the array. This is slower to perform, but - may be important in some cases. If it's false, a faster algorithm - is used, but equivalent elements may be rearranged. - */ - template - void sortChildElements (ElementComparator& comparator, - bool retainOrderOfEquivalentItems = false) - { - const int num = getNumChildElements(); - - if (num > 1) - { - HeapBlock elems ((size_t) num); - getChildElementsAsArray (elems); - sortArray (comparator, (XmlElement**) elems, 0, num - 1, retainOrderOfEquivalentItems); - reorderChildElements (elems, num); - } - } - - //============================================================================== - /** Returns true if this element is a section of text. - - Elements can either be an XML tag element or a secton of text, so this - is used to find out what kind of element this one is. - - @see getAllText, addTextElement, deleteAllTextElements - */ - bool isTextElement() const noexcept; - - /** Returns the text for a text element. - - Note that if you have an element like this: - - @codehello@endcode - - then calling getText on the "xyz" element won't return "hello", because that is - actually stored in a special text sub-element inside the xyz element. To get the - "hello" string, you could either call getText on the (unnamed) sub-element, or - use getAllSubText() to do this automatically. - - Note that leading and trailing whitespace will be included in the string - to remove - if, just call String::trim() on the result. - - @see isTextElement, getAllSubText, getChildElementAllSubText - */ - const String& getText() const noexcept; - - /** Sets the text in a text element. - - Note that this is only a valid call if this element is a text element. If it's - not, then no action will be performed. If you're trying to add text inside a normal - element, you probably want to use addTextElement() instead. - */ - void setText (const String& newText); - - /** Returns all the text from this element's child nodes. - - This iterates all the child elements and when it finds text elements, - it concatenates their text into a big string which it returns. - - E.g. @codehello there world@endcode - if you called getAllSubText on the "xyz" element, it'd return "hello there world". - - Note that leading and trailing whitespace will be included in the string - to remove - if, just call String::trim() on the result. - - @see isTextElement, getChildElementAllSubText, getText, addTextElement - */ - String getAllSubText() const; - - /** Returns all the sub-text of a named child element. - - If there is a child element with the given tag name, this will return - all of its sub-text (by calling getAllSubText() on it). If there is - no such child element, this will return the default string passed-in. - - @see getAllSubText - */ - String getChildElementAllSubText (StringRef childTagName, - const String& defaultReturnValue) const; - - /** Appends a section of text to this element. - @see isTextElement, getText, getAllSubText - */ - void addTextElement (const String& text); - - /** Removes all the text elements from this element. - @see isTextElement, getText, getAllSubText, addTextElement - */ - void deleteAllTextElements() noexcept; - - /** Creates a text element that can be added to a parent element. */ - static XmlElement* createTextElement (const String& text); - - //============================================================================== -private: - struct XmlAttributeNode - { - XmlAttributeNode (const XmlAttributeNode&) noexcept; - XmlAttributeNode (const Identifier&, const String&) noexcept; - XmlAttributeNode (String::CharPointerType, String::CharPointerType); - - LinkedListPointer nextListItem; - Identifier name; - String value; - - private: - XmlAttributeNode& operator= (const XmlAttributeNode&) JUCE_DELETED_FUNCTION; - }; - - friend class XmlDocument; - friend class LinkedListPointer; - friend class LinkedListPointer; - friend class LinkedListPointer::Appender; - friend class NamedValueSet; - - LinkedListPointer nextListItem; - LinkedListPointer firstChildElement; - LinkedListPointer attributes; - String tagName; - - XmlElement (int) noexcept; - void copyChildrenAndAttributesFrom (const XmlElement&); - void writeElementAsText (OutputStream&, int indentationLevel, int lineWrapLength) const; - void getChildElementsAsArray (XmlElement**) const noexcept; - void reorderChildElements (XmlElement**, int) noexcept; - XmlAttributeNode* getAttribute (StringRef) const noexcept; - - // Sigh.. L"" or _T("") string literals are problematic in general, and really inappropriate - // for XML tags. Use a UTF-8 encoded literal instead, or if you're really determined to use - // UTF-16, cast it to a String and use the other constructor. - XmlElement (const wchar_t*) JUCE_DELETED_FUNCTION; - - JUCE_LEAK_DETECTOR (XmlElement) -}; - - -#endif // JUCE_XMLELEMENT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp deleted file mode 100755 index cb9a577..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.cpp +++ /dev/null @@ -1,213 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -class GZIPCompressorOutputStream::GZIPCompressorHelper -{ -public: - GZIPCompressorHelper (const int compressionLevel, const int windowBits) - : compLevel ((compressionLevel < 1 || compressionLevel > 9) ? -1 : compressionLevel), - isFirstDeflate (true), - streamIsValid (false), - finished (false) - { - using namespace zlibNamespace; - zerostruct (stream); - - streamIsValid = (deflateInit2 (&stream, compLevel, Z_DEFLATED, - windowBits != 0 ? windowBits : MAX_WBITS, - 8, strategy) == Z_OK); - } - - ~GZIPCompressorHelper() - { - if (streamIsValid) - zlibNamespace::deflateEnd (&stream); - } - - bool write (const uint8* data, size_t dataSize, OutputStream& out) - { - // When you call flush() on a gzip stream, the stream is closed, and you can - // no longer continue to write data to it! - jassert (! finished); - - while (dataSize > 0) - if (! doNextBlock (data, dataSize, out, Z_NO_FLUSH)) - return false; - - return true; - } - - void finish (OutputStream& out) - { - const uint8* data = nullptr; - size_t dataSize = 0; - - while (! finished) - doNextBlock (data, dataSize, out, Z_FINISH); - } - -private: - enum { strategy = 0 }; - - zlibNamespace::z_stream stream; - const int compLevel; - bool isFirstDeflate, streamIsValid, finished; - zlibNamespace::Bytef buffer[32768]; - - bool doNextBlock (const uint8*& data, size_t& dataSize, OutputStream& out, const int flushMode) - { - using namespace zlibNamespace; - - if (streamIsValid) - { - stream.next_in = const_cast (data); - stream.next_out = buffer; - stream.avail_in = (z_uInt) dataSize; - stream.avail_out = (z_uInt) sizeof (buffer); - - const int result = isFirstDeflate ? deflateParams (&stream, compLevel, strategy) - : deflate (&stream, flushMode); - isFirstDeflate = false; - - switch (result) - { - case Z_STREAM_END: - finished = true; - // Deliberate fall-through.. - case Z_OK: - { - data += dataSize - stream.avail_in; - dataSize = stream.avail_in; - const ssize_t bytesDone = (ssize_t) sizeof (buffer) - (ssize_t) stream.avail_out; - return bytesDone <= 0 || out.write (buffer, (size_t) bytesDone); - } - - default: - break; - } - } - - return false; - } - - JUCE_DECLARE_NON_COPYABLE (GZIPCompressorHelper) -}; - -//============================================================================== -GZIPCompressorOutputStream::GZIPCompressorOutputStream (OutputStream* const out, - const int compressionLevel, - const bool deleteDestStream, - const int windowBits) - : destStream (out, deleteDestStream), - helper (new GZIPCompressorHelper (compressionLevel, windowBits)) -{ - jassert (out != nullptr); -} - -GZIPCompressorOutputStream::~GZIPCompressorOutputStream() -{ - flush(); -} - -void GZIPCompressorOutputStream::flush() -{ - helper->finish (*destStream); - destStream->flush(); -} - -bool GZIPCompressorOutputStream::write (const void* destBuffer, size_t howMany) -{ - jassert (destBuffer != nullptr && (ssize_t) howMany >= 0); - - return helper->write (static_cast (destBuffer), howMany, *destStream); -} - -int64 GZIPCompressorOutputStream::getPosition() -{ - return destStream->getPosition(); -} - -bool GZIPCompressorOutputStream::setPosition (int64 /*newPosition*/) -{ - jassertfalse; // can't do it! - return false; -} - -//============================================================================== -#if JUCE_UNIT_TESTS - -class GZIPTests : public UnitTest -{ -public: - GZIPTests() : UnitTest ("GZIP") {} - - void runTest() - { - beginTest ("GZIP"); - Random rng = getRandom(); - - for (int i = 100; --i >= 0;) - { - MemoryOutputStream original, compressed, uncompressed; - - { - GZIPCompressorOutputStream zipper (&compressed, rng.nextInt (10), false); - - for (int j = rng.nextInt (100); --j >= 0;) - { - MemoryBlock data ((unsigned int) (rng.nextInt (2000) + 1)); - - for (int k = (int) data.getSize(); --k >= 0;) - data[k] = (char) rng.nextInt (255); - - original << data; - zipper << data; - } - } - - { - MemoryInputStream compressedInput (compressed.getData(), compressed.getDataSize(), false); - GZIPDecompressorInputStream unzipper (compressedInput); - - uncompressed << unzipper; - } - - expectEquals ((int) uncompressed.getDataSize(), - (int) original.getDataSize()); - - if (original.getDataSize() == uncompressed.getDataSize()) - expect (memcmp (uncompressed.getData(), - original.getData(), - original.getDataSize()) == 0); - } - } -}; - -static GZIPTests gzipTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h deleted file mode 100755 index 3309486..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPCompressorOutputStream.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_GZIPCOMPRESSOROUTPUTSTREAM_H_INCLUDED -#define JUCE_GZIPCOMPRESSOROUTPUTSTREAM_H_INCLUDED - - -//============================================================================== -/** - A stream which uses zlib to compress the data written into it. - - Important note: When you call flush() on a GZIPCompressorOutputStream, - the gzip data is closed - this means that no more data can be written to - it, and any subsequent attempts to call write() will cause an assertion. - - @see GZIPDecompressorInputStream -*/ -class JUCE_API GZIPCompressorOutputStream : public OutputStream -{ -public: - //============================================================================== - /** Creates a compression stream. - - @param destStream the stream into which the compressed data should - be written - @param compressionLevel how much to compress the data, between 1 and 9, where - 1 is the fastest/lowest compression, and 9 is the - slowest/highest compression. Any value outside this range - indicates that a default compression level should be used. - @param deleteDestStreamWhenDestroyed whether or not to delete the destStream object when - this stream is destroyed - @param windowBits this is used internally to change the window size used - by zlib - leave it as 0 unless you specifically need to set - its value for some reason - */ - GZIPCompressorOutputStream (OutputStream* destStream, - int compressionLevel = 0, - bool deleteDestStreamWhenDestroyed = false, - int windowBits = 0); - - /** Destructor. */ - ~GZIPCompressorOutputStream(); - - //============================================================================== - /** Flushes and closes the stream. - Note that unlike most streams, when you call flush() on a GZIPCompressorOutputStream, - the stream is closed - this means that no more data can be written to it, and any - subsequent attempts to call write() will cause an assertion. - */ - void flush(); - - int64 getPosition() override; - bool setPosition (int64) override; - bool write (const void*, size_t) override; - - /** These are preset values that can be used for the constructor's windowBits parameter. - For more info about this, see the zlib documentation for its windowBits parameter. - */ - enum WindowBitsValues - { - windowBitsRaw = -15, - windowBitsGZIP = 15 + 16 - }; - -private: - //============================================================================== - OptionalScopedPointer destStream; - - class GZIPCompressorHelper; - friend struct ContainerDeletePolicy; - ScopedPointer helper; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GZIPCompressorOutputStream) -}; - -#endif // JUCE_GZIPCOMPRESSOROUTPUTSTREAM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp deleted file mode 100755 index 71e0850..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.cpp +++ /dev/null @@ -1,288 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4309 4305 4365) -#endif - -namespace zlibNamespace -{ - #if JUCE_INCLUDE_ZLIB_CODE - #if JUCE_CLANG - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Wshadow" - #pragma clang diagnostic ignored "-Wdeprecated-register" - #endif - - #undef OS_CODE - #undef fdopen - #define ZLIB_INTERNAL - #define NO_DUMMY_DECL - #include "zlib/zlib.h" - #include "zlib/adler32.c" - #include "zlib/compress.c" - #undef DO1 - #undef DO8 - #include "zlib/crc32.c" - #include "zlib/deflate.c" - #include "zlib/inffast.c" - #undef PULLBYTE - #undef LOAD - #undef RESTORE - #undef INITBITS - #undef NEEDBITS - #undef DROPBITS - #undef BYTEBITS - #include "zlib/inflate.c" - #include "zlib/inftrees.c" - #include "zlib/trees.c" - #include "zlib/zutil.c" - #undef Byte - #undef fdopen - #undef local - #undef Freq - #undef Code - #undef Dad - #undef Len - - #if JUCE_CLANG - #pragma clang diagnostic pop - #endif - #else - #include JUCE_ZLIB_INCLUDE_PATH - #endif -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -//============================================================================== -// internal helper object that holds the zlib structures so they don't have to be -// included publicly. -class GZIPDecompressorInputStream::GZIPDecompressHelper -{ -public: - GZIPDecompressHelper (const bool dontWrap) - : finished (true), - needsDictionary (false), - error (true), - streamIsValid (false), - data (nullptr), - dataSize (0) - { - using namespace zlibNamespace; - zerostruct (stream); - streamIsValid = (inflateInit2 (&stream, dontWrap ? -MAX_WBITS : MAX_WBITS) == Z_OK); - finished = error = ! streamIsValid; - } - - ~GZIPDecompressHelper() - { - using namespace zlibNamespace; - if (streamIsValid) - inflateEnd (&stream); - } - - bool needsInput() const noexcept { return dataSize <= 0; } - - void setInput (uint8* const data_, const size_t size) noexcept - { - data = data_; - dataSize = size; - } - - int doNextBlock (uint8* const dest, const unsigned int destSize) - { - using namespace zlibNamespace; - if (streamIsValid && data != nullptr && ! finished) - { - stream.next_in = data; - stream.next_out = dest; - stream.avail_in = (z_uInt) dataSize; - stream.avail_out = (z_uInt) destSize; - - switch (inflate (&stream, Z_PARTIAL_FLUSH)) - { - case Z_STREAM_END: - finished = true; - // deliberate fall-through - case Z_OK: - data += dataSize - stream.avail_in; - dataSize = (z_uInt) stream.avail_in; - return (int) (destSize - stream.avail_out); - - case Z_NEED_DICT: - needsDictionary = true; - data += dataSize - stream.avail_in; - dataSize = (size_t) stream.avail_in; - break; - - case Z_DATA_ERROR: - case Z_MEM_ERROR: - error = true; - - default: - break; - } - } - - return 0; - } - - bool finished, needsDictionary, error, streamIsValid; - - enum { gzipDecompBufferSize = 32768 }; - -private: - zlibNamespace::z_stream stream; - uint8* data; - size_t dataSize; - - JUCE_DECLARE_NON_COPYABLE (GZIPDecompressHelper) -}; - -//============================================================================== -GZIPDecompressorInputStream::GZIPDecompressorInputStream (InputStream* const source, - const bool deleteSourceWhenDestroyed, - const bool noWrap_, - const int64 uncompressedStreamLength_) - : sourceStream (source, deleteSourceWhenDestroyed), - uncompressedStreamLength (uncompressedStreamLength_), - noWrap (noWrap_), - isEof (false), - activeBufferSize (0), - originalSourcePos (source->getPosition()), - currentPos (0), - buffer ((size_t) GZIPDecompressHelper::gzipDecompBufferSize), - helper (new GZIPDecompressHelper (noWrap_)) -{ -} - -GZIPDecompressorInputStream::GZIPDecompressorInputStream (InputStream& source) - : sourceStream (&source, false), - uncompressedStreamLength (-1), - noWrap (false), - isEof (false), - activeBufferSize (0), - originalSourcePos (source.getPosition()), - currentPos (0), - buffer ((size_t) GZIPDecompressHelper::gzipDecompBufferSize), - helper (new GZIPDecompressHelper (false)) -{ -} - -GZIPDecompressorInputStream::~GZIPDecompressorInputStream() -{ -} - -int64 GZIPDecompressorInputStream::getTotalLength() -{ - return uncompressedStreamLength; -} - -int GZIPDecompressorInputStream::read (void* destBuffer, int howMany) -{ - jassert (destBuffer != nullptr && howMany >= 0); - - if (howMany > 0 && ! isEof) - { - int numRead = 0; - uint8* d = static_cast (destBuffer); - - while (! helper->error) - { - const int n = helper->doNextBlock (d, (unsigned int) howMany); - currentPos += n; - - if (n == 0) - { - if (helper->finished || helper->needsDictionary) - { - isEof = true; - return numRead; - } - - if (helper->needsInput()) - { - activeBufferSize = sourceStream->read (buffer, (int) GZIPDecompressHelper::gzipDecompBufferSize); - - if (activeBufferSize > 0) - { - helper->setInput (buffer, (size_t) activeBufferSize); - } - else - { - isEof = true; - return numRead; - } - } - } - else - { - numRead += n; - howMany -= n; - d += n; - - if (howMany <= 0) - return numRead; - } - } - } - - return 0; -} - -bool GZIPDecompressorInputStream::isExhausted() -{ - return helper->error || isEof; -} - -int64 GZIPDecompressorInputStream::getPosition() -{ - return currentPos; -} - -bool GZIPDecompressorInputStream::setPosition (int64 newPos) -{ - if (newPos < currentPos) - { - // to go backwards, reset the stream and start again.. - isEof = false; - activeBufferSize = 0; - currentPos = 0; - helper = new GZIPDecompressHelper (noWrap); - - sourceStream->setPosition (originalSourcePos); - } - - skipNextBytes (newPos - currentPos); - return true; -} diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h b/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h deleted file mode 100755 index 78a0b77..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/juce_GZIPDecompressorInputStream.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_GZIPDECOMPRESSORINPUTSTREAM_H_INCLUDED -#define JUCE_GZIPDECOMPRESSORINPUTSTREAM_H_INCLUDED - - -//============================================================================== -/** - This stream will decompress a source-stream using zlib. - - Tip: if you're reading lots of small items from one of these streams, you - can increase the performance enormously by passing it through a - BufferedInputStream, so that it has to read larger blocks less often. - - @see GZIPCompressorOutputStream -*/ -class JUCE_API GZIPDecompressorInputStream : public InputStream -{ -public: - //============================================================================== - /** Creates a decompressor stream. - - @param sourceStream the stream to read from - @param deleteSourceWhenDestroyed whether or not to delete the source stream - when this object is destroyed - @param noWrap this is used internally by the ZipFile class - and should be ignored by user applications - @param uncompressedStreamLength if the creator knows the length that the - uncompressed stream will be, then it can supply this - value, which will be returned by getTotalLength() - */ - GZIPDecompressorInputStream (InputStream* sourceStream, - bool deleteSourceWhenDestroyed, - bool noWrap = false, - int64 uncompressedStreamLength = -1); - - /** Creates a decompressor stream. - - @param sourceStream the stream to read from - the source stream must not be - deleted until this object has been destroyed - */ - GZIPDecompressorInputStream (InputStream& sourceStream); - - /** Destructor. */ - ~GZIPDecompressorInputStream(); - - //============================================================================== - int64 getPosition() override; - bool setPosition (int64 pos) override; - int64 getTotalLength() override; - bool isExhausted() override; - int read (void* destBuffer, int maxBytesToRead) override; - -private: - //============================================================================== - OptionalScopedPointer sourceStream; - const int64 uncompressedStreamLength; - const bool noWrap; - bool isEof; - int activeBufferSize; - int64 originalSourcePos, currentPos; - HeapBlock buffer; - - class GZIPDecompressHelper; - friend struct ContainerDeletePolicy; - ScopedPointer helper; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GZIPDecompressorInputStream) -}; - -#endif // JUCE_GZIPDECOMPRESSORINPUTSTREAM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp b/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp deleted file mode 100755 index a76d8b8..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.cpp +++ /dev/null @@ -1,608 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -class ZipFile::ZipEntryHolder -{ -public: - ZipEntryHolder (const char* const buffer, const int fileNameLen) - { - entry.filename = String::fromUTF8 (buffer + 46, fileNameLen); - - const int time = ByteOrder::littleEndianShort (buffer + 12); - const int date = ByteOrder::littleEndianShort (buffer + 14); - entry.fileTime = getFileTimeFromRawEncodings (time, date); - - compressed = ByteOrder::littleEndianShort (buffer + 10) != 0; - compressedSize = (size_t) ByteOrder::littleEndianInt (buffer + 20); - entry.uncompressedSize = ByteOrder::littleEndianInt (buffer + 24); - - streamOffset = ByteOrder::littleEndianInt (buffer + 42); - } - - struct FileNameComparator - { - static int compareElements (const ZipEntryHolder* first, const ZipEntryHolder* second) - { - return first->entry.filename.compare (second->entry.filename); - } - }; - - ZipEntry entry; - size_t streamOffset; - size_t compressedSize; - bool compressed; - -private: - static Time getFileTimeFromRawEncodings (int time, int date) - { - const int year = 1980 + (date >> 9); - const int month = ((date >> 5) & 15) - 1; - const int day = date & 31; - const int hours = time >> 11; - const int minutes = (time >> 5) & 63; - const int seconds = (time & 31) << 1; - - return Time (year, month, day, hours, minutes, seconds); - } -}; - -//============================================================================== -namespace -{ - int findEndOfZipEntryTable (InputStream& input, int& numEntries) - { - BufferedInputStream in (input, 8192); - - in.setPosition (in.getTotalLength()); - int64 pos = in.getPosition(); - const int64 lowestPos = jmax ((int64) 0, pos - 1024); - - char buffer [32] = { 0 }; - - while (pos > lowestPos) - { - in.setPosition (pos - 22); - pos = in.getPosition(); - memcpy (buffer + 22, buffer, 4); - - if (in.read (buffer, 22) != 22) - return 0; - - for (int i = 0; i < 22; ++i) - { - if (ByteOrder::littleEndianInt (buffer + i) == 0x06054b50) - { - in.setPosition (pos + i); - in.read (buffer, 22); - numEntries = ByteOrder::littleEndianShort (buffer + 10); - - return (int) ByteOrder::littleEndianInt (buffer + 16); - } - } - } - - return 0; - } -} - -//============================================================================== -class ZipFile::ZipInputStream : public InputStream -{ -public: - ZipInputStream (ZipFile& zf, ZipFile::ZipEntryHolder& zei) - : file (zf), - zipEntryHolder (zei), - pos (0), - headerSize (0), - inputStream (zf.inputStream) - { - if (zf.inputSource != nullptr) - { - inputStream = streamToDelete = file.inputSource->createInputStream(); - } - else - { - #if JUCE_DEBUG - zf.streamCounter.numOpenStreams++; - #endif - } - - char buffer [30]; - - if (inputStream != nullptr - && inputStream->setPosition ((int64) zei.streamOffset) - && inputStream->read (buffer, 30) == 30 - && ByteOrder::littleEndianInt (buffer) == 0x04034b50) - { - headerSize = 30 + ByteOrder::littleEndianShort (buffer + 26) - + ByteOrder::littleEndianShort (buffer + 28); - } - } - - ~ZipInputStream() - { - #if JUCE_DEBUG - if (inputStream != nullptr && inputStream == file.inputStream) - file.streamCounter.numOpenStreams--; - #endif - } - - int64 getTotalLength() - { - return (int64) zipEntryHolder.compressedSize; - } - - int read (void* buffer, int howMany) - { - if (headerSize <= 0) - return 0; - - howMany = (int) jmin ((int64) howMany, ((int64) zipEntryHolder.compressedSize) - pos); - - if (inputStream == nullptr) - return 0; - - int num; - - if (inputStream == file.inputStream) - { - const ScopedLock sl (file.lock); - inputStream->setPosition (pos + (int64) zipEntryHolder.streamOffset + headerSize); - num = inputStream->read (buffer, howMany); - } - else - { - inputStream->setPosition (pos + (int64) zipEntryHolder.streamOffset + headerSize); - num = inputStream->read (buffer, howMany); - } - - pos += num; - return num; - } - - bool isExhausted() - { - return headerSize <= 0 || pos >= (int64) zipEntryHolder.compressedSize; - } - - int64 getPosition() - { - return pos; - } - - bool setPosition (int64 newPos) - { - pos = jlimit ((int64) 0, (int64) zipEntryHolder.compressedSize, newPos); - return true; - } - -private: - ZipFile& file; - ZipEntryHolder zipEntryHolder; - int64 pos; - int headerSize; - InputStream* inputStream; - ScopedPointer streamToDelete; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ZipInputStream) -}; - - -//============================================================================== -ZipFile::ZipFile (InputStream* const stream, const bool deleteStreamWhenDestroyed) - : inputStream (stream) -{ - if (deleteStreamWhenDestroyed) - streamToDelete = inputStream; - - init(); -} - -ZipFile::ZipFile (InputStream& stream) - : inputStream (&stream) -{ - init(); -} - -ZipFile::ZipFile (const File& file) - : inputStream (nullptr), - inputSource (new FileInputSource (file)) -{ - init(); -} - -ZipFile::ZipFile (InputSource* const source) - : inputStream (nullptr), - inputSource (source) -{ - init(); -} - -ZipFile::~ZipFile() -{ - entries.clear(); -} - -#if JUCE_DEBUG -ZipFile::OpenStreamCounter::~OpenStreamCounter() -{ - /* If you hit this assertion, it means you've created a stream to read one of the items in the - zipfile, but you've forgotten to delete that stream object before deleting the file.. - Streams can't be kept open after the file is deleted because they need to share the input - stream that is managed by the ZipFile object. - */ - jassert (numOpenStreams == 0); -} -#endif - -//============================================================================== -int ZipFile::getNumEntries() const noexcept -{ - return entries.size(); -} - -const ZipFile::ZipEntry* ZipFile::getEntry (const int index) const noexcept -{ - if (ZipEntryHolder* const zei = entries [index]) - return &(zei->entry); - - return nullptr; -} - -int ZipFile::getIndexOfFileName (const String& fileName) const noexcept -{ - for (int i = 0; i < entries.size(); ++i) - if (entries.getUnchecked (i)->entry.filename == fileName) - return i; - - return -1; -} - -const ZipFile::ZipEntry* ZipFile::getEntry (const String& fileName) const noexcept -{ - return getEntry (getIndexOfFileName (fileName)); -} - -InputStream* ZipFile::createStreamForEntry (const int index) -{ - InputStream* stream = nullptr; - - if (ZipEntryHolder* const zei = entries[index]) - { - stream = new ZipInputStream (*this, *zei); - - if (zei->compressed) - { - stream = new GZIPDecompressorInputStream (stream, true, true, (int64) zei->entry.uncompressedSize); - - // (much faster to unzip in big blocks using a buffer..) - stream = new BufferedInputStream (stream, 32768, true); - } - } - - return stream; -} - -InputStream* ZipFile::createStreamForEntry (const ZipEntry& entry) -{ - for (int i = 0; i < entries.size(); ++i) - if (&entries.getUnchecked (i)->entry == &entry) - return createStreamForEntry (i); - - return nullptr; -} - -void ZipFile::sortEntriesByFilename() -{ - ZipEntryHolder::FileNameComparator sorter; - entries.sort (sorter); -} - -//============================================================================== -void ZipFile::init() -{ - ScopedPointer toDelete; - InputStream* in = inputStream; - - if (inputSource != nullptr) - { - in = inputSource->createInputStream(); - toDelete = in; - } - - if (in != nullptr) - { - int numEntries = 0; - int pos = findEndOfZipEntryTable (*in, numEntries); - - if (pos >= 0 && pos < in->getTotalLength()) - { - const int size = (int) (in->getTotalLength() - pos); - - in->setPosition (pos); - MemoryBlock headerData; - - if (in->readIntoMemoryBlock (headerData, size) == (size_t) size) - { - pos = 0; - - for (int i = 0; i < numEntries; ++i) - { - if (pos + 46 > size) - break; - - const char* const buffer = static_cast (headerData.getData()) + pos; - - const int fileNameLen = ByteOrder::littleEndianShort (buffer + 28); - - if (pos + 46 + fileNameLen > size) - break; - - entries.add (new ZipEntryHolder (buffer, fileNameLen)); - - pos += 46 + fileNameLen - + ByteOrder::littleEndianShort (buffer + 30) - + ByteOrder::littleEndianShort (buffer + 32); - } - } - } - } -} - -Result ZipFile::uncompressTo (const File& targetDirectory, - const bool shouldOverwriteFiles) -{ - for (int i = 0; i < entries.size(); ++i) - { - Result result (uncompressEntry (i, targetDirectory, shouldOverwriteFiles)); - if (result.failed()) - return result; - } - - return Result::ok(); -} - -Result ZipFile::uncompressEntry (const int index, - const File& targetDirectory, - bool shouldOverwriteFiles) -{ - const ZipEntryHolder* zei = entries.getUnchecked (index); - - #if JUCE_WINDOWS - const String entryPath (zei->entry.filename); - #else - const String entryPath (zei->entry.filename.replaceCharacter ('\\', '/')); - #endif - - const File targetFile (targetDirectory.getChildFile (entryPath)); - - if (entryPath.endsWithChar ('/') || entryPath.endsWithChar ('\\')) - return targetFile.createDirectory(); // (entry is a directory, not a file) - - ScopedPointer in (createStreamForEntry (index)); - - if (in == nullptr) - return Result::fail ("Failed to open the zip file for reading"); - - if (targetFile.exists()) - { - if (! shouldOverwriteFiles) - return Result::ok(); - - if (! targetFile.deleteFile()) - return Result::fail ("Failed to write to target file: " + targetFile.getFullPathName()); - } - - if (! targetFile.getParentDirectory().createDirectory()) - return Result::fail ("Failed to create target folder: " + targetFile.getParentDirectory().getFullPathName()); - - { - FileOutputStream out (targetFile); - - if (out.failedToOpen()) - return Result::fail ("Failed to write to target file: " + targetFile.getFullPathName()); - - out << *in; - } - - targetFile.setCreationTime (zei->entry.fileTime); - targetFile.setLastModificationTime (zei->entry.fileTime); - targetFile.setLastAccessTime (zei->entry.fileTime); - - return Result::ok(); -} - - -//============================================================================= -class ZipFile::Builder::Item -{ -public: - Item (const File& f, InputStream* s, const int compression, const String& storedPath, Time time) - : file (f), stream (s), storedPathname (storedPath), - fileTime (time), compressionLevel (compression), - compressedSize (0), uncompressedSize (0), headerStart (0), checksum (0) - { - } - - bool writeData (OutputStream& target, const int64 overallStartPosition) - { - MemoryOutputStream compressedData ((size_t) file.getSize()); - - if (compressionLevel > 0) - { - GZIPCompressorOutputStream compressor (&compressedData, compressionLevel, false, - GZIPCompressorOutputStream::windowBitsRaw); - if (! writeSource (compressor)) - return false; - } - else - { - if (! writeSource (compressedData)) - return false; - } - - compressedSize = (int) compressedData.getDataSize(); - headerStart = (int) (target.getPosition() - overallStartPosition); - - target.writeInt (0x04034b50); - writeFlagsAndSizes (target); - target << storedPathname - << compressedData; - - return true; - } - - bool writeDirectoryEntry (OutputStream& target) - { - target.writeInt (0x02014b50); - target.writeShort (20); // version written - writeFlagsAndSizes (target); - target.writeShort (0); // comment length - target.writeShort (0); // start disk num - target.writeShort (0); // internal attributes - target.writeInt (0); // external attributes - target.writeInt (headerStart); - target << storedPathname; - - return true; - } - -private: - const File file; - ScopedPointer stream; - String storedPathname; - Time fileTime; - int compressionLevel, compressedSize, uncompressedSize, headerStart; - unsigned long checksum; - - static void writeTimeAndDate (OutputStream& target, Time t) - { - target.writeShort ((short) (t.getSeconds() + (t.getMinutes() << 5) + (t.getHours() << 11))); - target.writeShort ((short) (t.getDayOfMonth() + ((t.getMonth() + 1) << 5) + ((t.getYear() - 1980) << 9))); - } - - bool writeSource (OutputStream& target) - { - if (stream == nullptr) - { - stream = file.createInputStream(); - - if (stream == nullptr) - return false; - } - - checksum = 0; - uncompressedSize = 0; - const int bufferSize = 4096; - HeapBlock buffer (bufferSize); - - while (! stream->isExhausted()) - { - const int bytesRead = stream->read (buffer, bufferSize); - - if (bytesRead < 0) - return false; - - checksum = zlibNamespace::crc32 (checksum, buffer, (unsigned int) bytesRead); - target.write (buffer, (size_t) bytesRead); - uncompressedSize += bytesRead; - } - - stream = nullptr; - return true; - } - - void writeFlagsAndSizes (OutputStream& target) const - { - target.writeShort (10); // version needed - target.writeShort ((short) (1 << 11)); // this flag indicates UTF-8 filename encoding - target.writeShort (compressionLevel > 0 ? (short) 8 : (short) 0); - writeTimeAndDate (target, fileTime); - target.writeInt ((int) checksum); - target.writeInt (compressedSize); - target.writeInt (uncompressedSize); - target.writeShort ((short) storedPathname.toUTF8().sizeInBytes() - 1); - target.writeShort (0); // extra field length - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Item) -}; - -//============================================================================= -ZipFile::Builder::Builder() {} -ZipFile::Builder::~Builder() {} - -void ZipFile::Builder::addFile (const File& file, const int compression, const String& path) -{ - items.add (new Item (file, nullptr, compression, - path.isEmpty() ? file.getFileName() : path, - file.getLastModificationTime())); -} - -void ZipFile::Builder::addEntry (InputStream* stream, int compression, const String& path, Time time) -{ - jassert (stream != nullptr); // must not be null! - jassert (path.isNotEmpty()); - items.add (new Item (File(), stream, compression, path, time)); -} - -bool ZipFile::Builder::writeToStream (OutputStream& target, double* const progress) const -{ - const int64 fileStart = target.getPosition(); - - for (int i = 0; i < items.size(); ++i) - { - if (progress != nullptr) - *progress = (i + 0.5) / items.size(); - - if (! items.getUnchecked (i)->writeData (target, fileStart)) - return false; - } - - const int64 directoryStart = target.getPosition(); - - for (int i = 0; i < items.size(); ++i) - if (! items.getUnchecked (i)->writeDirectoryEntry (target)) - return false; - - const int64 directoryEnd = target.getPosition(); - - target.writeInt (0x06054b50); - target.writeShort (0); - target.writeShort (0); - target.writeShort ((short) items.size()); - target.writeShort ((short) items.size()); - target.writeInt ((int) (directoryEnd - directoryStart)); - target.writeInt ((int) (directoryStart - fileStart)); - target.writeShort (0); - - if (progress != nullptr) - *progress = 1.0; - - return true; -} diff --git a/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h b/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h deleted file mode 100755 index ccf9064..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/juce_ZipFile.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - ============================================================================== - - This file is part of the juce_core module of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission to use, copy, modify, and/or distribute this software for any purpose with - or without fee is hereby granted, provided that the above copyright notice and this - permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD - TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN - NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL - DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER - IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN - CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - ------------------------------------------------------------------------------ - - NOTE! This permissive ISC license applies ONLY to files within the juce_core module! - All other JUCE modules are covered by a dual GPL/commercial license, so if you are - using any other modules, be sure to check that you also comply with their license. - - For more details, visit www.juce.com - - ============================================================================== -*/ - -#ifndef JUCE_ZIPFILE_H_INCLUDED -#define JUCE_ZIPFILE_H_INCLUDED - - -//============================================================================== -/** - Decodes a ZIP file from a stream. - - This can enumerate the items in a ZIP file and can create suitable stream objects - to read each one. -*/ -class JUCE_API ZipFile -{ -public: - /** Creates a ZipFile based for a file. */ - explicit ZipFile (const File& file); - - //============================================================================== - /** Creates a ZipFile for a given stream. - - @param inputStream the stream to read from - @param deleteStreamWhenDestroyed if set to true, the object passed-in - will be deleted when this ZipFile object is deleted - */ - ZipFile (InputStream* inputStream, bool deleteStreamWhenDestroyed); - - /** Creates a ZipFile for a given stream. - The stream will not be owned or deleted by this class - if you want the ZipFile to - manage the stream's lifetime, use the other constructor. - */ - explicit ZipFile (InputStream& inputStream); - - /** Creates a ZipFile for an input source. - - The inputSource object will be owned by the zip file, which will delete - it later when not needed. - */ - explicit ZipFile (InputSource* inputSource); - - /** Destructor. */ - ~ZipFile(); - - //============================================================================== - /** - Contains information about one of the entries in a ZipFile. - - @see ZipFile::getEntry - */ - struct ZipEntry - { - /** The name of the file, which may also include a partial pathname. */ - String filename; - - /** The file's original size. */ - unsigned int uncompressedSize; - - /** The last time the file was modified. */ - Time fileTime; - }; - - //============================================================================== - /** Returns the number of items in the zip file. */ - int getNumEntries() const noexcept; - - /** Returns a structure that describes one of the entries in the zip file. - - This may return zero if the index is out of range. - - @see ZipFile::ZipEntry - */ - const ZipEntry* getEntry (int index) const noexcept; - - /** Returns the index of the first entry with a given filename. - - This uses a case-sensitive comparison to look for a filename in the - list of entries. It might return -1 if no match is found. - - @see ZipFile::ZipEntry - */ - int getIndexOfFileName (const String& fileName) const noexcept; - - /** Returns a structure that describes one of the entries in the zip file. - - This uses a case-sensitive comparison to look for a filename in the - list of entries. It might return 0 if no match is found. - - @see ZipFile::ZipEntry - */ - const ZipEntry* getEntry (const String& fileName) const noexcept; - - /** Sorts the list of entries, based on the filename. - */ - void sortEntriesByFilename(); - - //============================================================================== - /** Creates a stream that can read from one of the zip file's entries. - - The stream that is returned must be deleted by the caller (and - zero might be returned if a stream can't be opened for some reason). - - The stream must not be used after the ZipFile object that created - has been deleted. - */ - InputStream* createStreamForEntry (int index); - - /** Creates a stream that can read from one of the zip file's entries. - - The stream that is returned must be deleted by the caller (and - zero might be returned if a stream can't be opened for some reason). - - The stream must not be used after the ZipFile object that created - has been deleted. - */ - InputStream* createStreamForEntry (const ZipEntry& entry); - - //============================================================================== - /** Uncompresses all of the files in the zip file. - - This will expand all the entries into a target directory. The relative - paths of the entries are used. - - @param targetDirectory the root folder to uncompress to - @param shouldOverwriteFiles whether to overwrite existing files with similarly-named ones - @returns success if the file is successfully unzipped - */ - Result uncompressTo (const File& targetDirectory, - bool shouldOverwriteFiles = true); - - /** Uncompresses one of the entries from the zip file. - - This will expand the entry and write it in a target directory. The entry's path is used to - determine which subfolder of the target should contain the new file. - - @param index the index of the entry to uncompress - this must be a valid index - between 0 and (getNumEntries() - 1). - @param targetDirectory the root folder to uncompress into - @param shouldOverwriteFiles whether to overwrite existing files with similarly-named ones - @returns success if all the files are successfully unzipped - */ - Result uncompressEntry (int index, - const File& targetDirectory, - bool shouldOverwriteFiles = true); - - - //============================================================================== - /** Used to create a new zip file. - - Create a ZipFile::Builder object, and call its addFile() method to add some files, - then you can write it to a stream with write(). - - Currently this just stores the files with no compression.. That will be added - soon! - */ - class Builder - { - public: - Builder(); - ~Builder(); - - /** Adds a file while should be added to the archive. - The file isn't read immediately, all the files will be read later when the writeToStream() - method is called. - - The compressionLevel can be between 0 (no compression), and 9 (maximum compression). - If the storedPathName parameter is specified, you can customise the partial pathname that - will be stored for this file. - */ - void addFile (const File& fileToAdd, int compressionLevel, - const String& storedPathName = String::empty); - - /** Adds a file while should be added to the archive. - - @param streamToRead this stream isn't read immediately - a pointer to the stream is - stored, then used later when the writeToStream() method is called, and - deleted by the Builder object when no longer needed, so be very careful - about its lifetime and the lifetime of any objects on which it depends! - This must not be null. - @param compressionLevel this can be between 0 (no compression), and 9 (maximum compression). - @param storedPathName the partial pathname that will be stored for this file - @param fileModificationTime the timestamp that will be stored as the last modification time - of this entry - */ - void addEntry (InputStream* streamToRead, int compressionLevel, - const String& storedPathName, Time fileModificationTime); - - /** Generates the zip file, writing it to the specified stream. - If the progress parameter is non-null, it will be updated with an approximate - progress status between 0 and 1.0 - */ - bool writeToStream (OutputStream& target, double* progress) const; - - //============================================================================== - private: - class Item; - friend struct ContainerDeletePolicy; - OwnedArray items; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Builder) - }; - -private: - //============================================================================== - class ZipInputStream; - class ZipEntryHolder; - friend class ZipInputStream; - friend class ZipEntryHolder; - - OwnedArray entries; - CriticalSection lock; - InputStream* inputStream; - ScopedPointer streamToDelete; - ScopedPointer inputSource; - - #if JUCE_DEBUG - struct OpenStreamCounter - { - OpenStreamCounter() : numOpenStreams (0) {} - ~OpenStreamCounter(); - - int numOpenStreams; - }; - - OpenStreamCounter streamCounter; - #endif - - void init(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ZipFile) -}; - -#endif // JUCE_ZIPFILE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/README b/JuceLibraryCode/modules/juce_core/zip/zlib/README deleted file mode 100755 index 758cc50..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/README +++ /dev/null @@ -1,125 +0,0 @@ -ZLIB DATA COMPRESSION LIBRARY - -zlib 1.2.3 is a general purpose data compression library. All the code is -thread safe. The data format used by the zlib library is described by RFCs -(Request for Comments) 1950 to 1952 in the files -http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format) -and rfc1952.txt (gzip format). These documents are also available in other -formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html - -All functions of the compression library are documented in the file zlib.h -(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example -of the library is given in the file example.c which also tests that the library -is working correctly. Another example is given in the file minigzip.c. The -compression library itself is composed of all source files except example.c and -minigzip.c. - -To compile all files and run the test program, follow the instructions given at -the top of Makefile. In short "make test; make install" should work for most -machines. For Unix: "./configure; make test; make install". For MSDOS, use one -of the special makefiles such as Makefile.msc. For VMS, use make_vms.com. - -Questions about zlib should be sent to , or to Gilles Vollant - for the Windows DLL version. The zlib home page is -http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem, -please check this site to verify that you have the latest version of zlib; -otherwise get the latest version and check whether the problem still exists or -not. - -PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking -for help. - -Mark Nelson wrote an article about zlib for the Jan. 1997 -issue of Dr. Dobb's Journal; a copy of the article is available in -http://dogma.net/markn/articles/zlibtool/zlibtool.htm - -The changes made in version 1.2.3 are documented in the file ChangeLog. - -Unsupported third party contributions are provided in directory "contrib". - -A Java implementation of zlib is available in the Java Development Kit -http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html -See the zlib home page http://www.zlib.org for details. - -A Perl interface to zlib written by Paul Marquess is in the -CPAN (Comprehensive Perl Archive Network) sites -http://www.cpan.org/modules/by-module/Compress/ - -A Python interface to zlib written by A.M. Kuchling is -available in Python 1.5 and later versions, see -http://www.python.org/doc/lib/module-zlib.html - -A zlib binding for TCL written by Andreas Kupries is -availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html - -An experimental package to read and write files in .zip format, written on top -of zlib by Gilles Vollant , is available in the -contrib/minizip directory of zlib. - - -Notes for some targets: - -- For Windows DLL versions, please see win32/DLL_FAQ.txt - -- For 64-bit Irix, deflate.c must be compiled without any optimization. With - -O, one libpng test fails. The test works in 32 bit mode (with the -n32 - compiler flag). The compiler bug has been reported to SGI. - -- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works - when compiled with cc. - -- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is - necessary to get gzprintf working correctly. This is done by configure. - -- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with - other compilers. Use "make test" to check your compiler. - -- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers. - -- For PalmOs, see http://palmzlib.sourceforge.net/ - -- When building a shared, i.e. dynamic library on Mac OS X, the library must be - installed before testing (do "make install" before "make test"), since the - library location is specified in the library. - - -Acknowledgments: - - The deflate format used by zlib was defined by Phil Katz. The deflate - and zlib specifications were written by L. Peter Deutsch. Thanks to all the - people who reported problems and suggested various improvements in zlib; - they are too numerous to cite here. - -Copyright notice: - - (C) 1995-2004 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - -If you use the zlib library in a product, we would appreciate *not* -receiving lengthy legal documents to sign. The sources are provided -for free but without warranty of any kind. The library has been -entirely written by Jean-loup Gailly and Mark Adler; it does not -include third-party code. - -If you redistribute modified sources, we would appreciate that you include -in the file ChangeLog history information documenting your changes. Please -read the FAQ for more information on the distribution of modified source -versions. diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/adler32.c b/JuceLibraryCode/modules/juce_core/zip/zlib/adler32.c deleted file mode 100755 index bf5cbd2..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/adler32.c +++ /dev/null @@ -1,143 +0,0 @@ -/* adler32.c -- compute the Adler-32 checksum of a data stream - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: adler32.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -#define BASE 65521UL /* largest prime smaller than 65536 */ -#define NMAX 5552 -/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */ - -#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;} -#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1); -#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2); -#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4); -#define DO16(buf) DO8(buf,0); DO8(buf,8); - -/* use NO_DIVIDE if your processor does not do division in hardware */ -#ifdef NO_DIVIDE -# define MOD(a) \ - do { \ - if (a >= (BASE << 16)) a -= (BASE << 16); \ - if (a >= (BASE << 15)) a -= (BASE << 15); \ - if (a >= (BASE << 14)) a -= (BASE << 14); \ - if (a >= (BASE << 13)) a -= (BASE << 13); \ - if (a >= (BASE << 12)) a -= (BASE << 12); \ - if (a >= (BASE << 11)) a -= (BASE << 11); \ - if (a >= (BASE << 10)) a -= (BASE << 10); \ - if (a >= (BASE << 9)) a -= (BASE << 9); \ - if (a >= (BASE << 8)) a -= (BASE << 8); \ - if (a >= (BASE << 7)) a -= (BASE << 7); \ - if (a >= (BASE << 6)) a -= (BASE << 6); \ - if (a >= (BASE << 5)) a -= (BASE << 5); \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -# define MOD4(a) \ - do { \ - if (a >= (BASE << 4)) a -= (BASE << 4); \ - if (a >= (BASE << 3)) a -= (BASE << 3); \ - if (a >= (BASE << 2)) a -= (BASE << 2); \ - if (a >= (BASE << 1)) a -= (BASE << 1); \ - if (a >= BASE) a -= BASE; \ - } while (0) -#else -# define MOD(a) a %= BASE -# define MOD4(a) a %= BASE -#endif - -/* ========================================================================= */ -uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len) -{ - unsigned long sum2; - unsigned n; - - /* split Adler-32 into component sums */ - sum2 = (adler >> 16) & 0xffff; - adler &= 0xffff; - - /* in case user likes doing a byte at a time, keep it fast */ - if (len == 1) { - adler += buf[0]; - if (adler >= BASE) - adler -= BASE; - sum2 += adler; - if (sum2 >= BASE) - sum2 -= BASE; - return adler | (sum2 << 16); - } - - /* initial Adler-32 value (deferred check for len == 1 speed) */ - if (buf == Z_NULL) - return 1L; - - /* in case short lengths are provided, keep it somewhat fast */ - if (len < 16) { - while (len--) { - adler += *buf++; - sum2 += adler; - } - if (adler >= BASE) - adler -= BASE; - MOD4(sum2); /* only added so many BASE's */ - return adler | (sum2 << 16); - } - - /* do length NMAX blocks -- requires just one modulo operation */ - while (len >= NMAX) { - len -= NMAX; - n = NMAX / 16; /* NMAX is divisible by 16 */ - do { - DO16(buf); /* 16 sums unrolled */ - buf += 16; - } while (--n); - MOD(adler); - MOD(sum2); - } - - /* do remaining bytes (less than NMAX, still just one modulo) */ - if (len) { /* avoid modulos if none remaining */ - while (len >= 16) { - len -= 16; - DO16(buf); - buf += 16; - } - while (len--) { - adler += *buf++; - sum2 += adler; - } - MOD(adler); - MOD(sum2); - } - - /* return recombined sums */ - return adler | (sum2 << 16); -} - -/* ========================================================================= */ -uLong ZEXPORT adler32_combine(uLong adler1, uLong adler2, z_off_t len2) -{ - unsigned long sum1; - unsigned long sum2; - unsigned rem; - - /* the derivation of this formula is left as an exercise for the reader */ - rem = (unsigned)(len2 % BASE); - sum1 = adler1 & 0xffff; - sum2 = rem * sum1; - MOD(sum2); - sum1 += (adler2 & 0xffff) + BASE - 1; - sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem; - if (sum1 > BASE) sum1 -= BASE; - if (sum1 > BASE) sum1 -= BASE; - if (sum2 > (BASE << 1)) sum2 -= (BASE << 1); - if (sum2 > BASE) sum2 -= BASE; - return sum1 | (sum2 << 16); -} diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/compress.c b/JuceLibraryCode/modules/juce_core/zip/zlib/compress.c deleted file mode 100755 index 05c49c5..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/compress.c +++ /dev/null @@ -1,70 +0,0 @@ -/* compress.c -- compress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: compress.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -/* =========================================================================== - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least 0.1% larger than sourceLen plus - 12 bytes. Upon exit, destLen is the actual size of the compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ -int ZEXPORT compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, - uLong sourceLen, int level) -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; -#ifdef MAXSEG_64K - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; -#endif - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - stream.opaque = (voidpf)0; - - err = deflateInit(&stream, level); - if (err != Z_OK) return err; - - err = deflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - deflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; - - err = deflateEnd(&stream); - return err; -} - -/* =========================================================================== - */ -int ZEXPORT compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen) -{ - return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION); -} - -/* =========================================================================== - If the default memLevel or windowBits for deflateInit() is changed, then - this function needs to be updated. - */ -uLong ZEXPORT compressBound (uLong sourceLen) -{ - return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11; -} diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.c b/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.c deleted file mode 100755 index fbd06c5..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.c +++ /dev/null @@ -1,407 +0,0 @@ -/* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Thanks to Rodney Brown for his contribution of faster - * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing - * tables for updating the shift in one step with three exclusive-ors - * instead of four steps with four exclusive-ors. This results in about a - * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. - */ - -/* @(#) $Id: crc32.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -/* - Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore - protection on the static variables used to control the first-use generation - of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should - first call get_crc_table() to initialize the tables before allowing more than - one thread to use crc32(). - */ - -#ifdef MAKECRCH -# include -# ifndef DYNAMIC_CRC_TABLE -# define DYNAMIC_CRC_TABLE -# endif /* !DYNAMIC_CRC_TABLE */ -#endif /* MAKECRCH */ - -#include "zutil.h" /* for STDC and FAR definitions */ - -#define local static - -/* Find a four-byte integer type for crc32_little() and crc32_big(). */ -#ifndef NOBYFOUR -# ifdef STDC /* need ANSI C limits.h to determine sizes */ -# include -# define BYFOUR -# if (UINT_MAX == 0xffffffffUL) - typedef unsigned int u4; -# else -# if (ULONG_MAX == 0xffffffffUL) - typedef unsigned long u4; -# else -# if (USHRT_MAX == 0xffffffffUL) - typedef unsigned short u4; -# else -# undef BYFOUR /* can't find a four-byte integer type! */ -# endif -# endif -# endif -# endif /* STDC */ -#endif /* !NOBYFOUR */ - -/* Definitions for doing the crc four data bytes at a time. */ -#ifdef BYFOUR -# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ - (((w)&0xff00)<<8)+(((w)&0xff)<<24)) - local unsigned long crc32_little OF((unsigned long, - const unsigned char FAR *, unsigned)); - local unsigned long crc32_big OF((unsigned long, - const unsigned char FAR *, unsigned)); -# define TBLS 8 -#else -# define TBLS 1 -#endif /* BYFOUR */ - -/* Local functions for crc concatenation */ -local unsigned long gf2_matrix_times OF((unsigned long *mat, - unsigned long vec)); -local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); - -#ifdef DYNAMIC_CRC_TABLE - -local volatile int crc_table_empty = 1; -local unsigned long FAR crc_table[TBLS][256]; -local void make_crc_table OF((void)); -#ifdef MAKECRCH - local void write_table OF((FILE *, const unsigned long FAR *)); -#endif /* MAKECRCH */ -/* - Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: - x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1. - - Polynomials over GF(2) are represented in binary, one bit per coefficient, - with the lowest powers in the most significant bit. Then adding polynomials - is just exclusive-or, and multiplying a polynomial by x is a right shift by - one. If we call the above polynomial p, and represent a byte as the - polynomial q, also with the lowest power in the most significant bit (so the - byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, - where a mod b means the remainder after dividing a by b. - - This calculation is done using the shift-method of multiplying and - taking the remainder. The is initialized to zero, and for each - incoming bit, x^32 is added mod p to the if the bit is a one (where - x^32 mod p is p+x^32 = x^26+...+1), and the is multiplied mod p by - x (which is shifting right by one and adding x^32 mod p if the bit shifted - out is a one). We start with the highest power (least significant bit) of - q and repeat for all eight bits of q. - - The first table is simply the CRC of all possible eight bit values. This is - all the information needed to generate CRCs on data a byte at a time for all - combinations of CRC values and incoming bytes. The remaining tables - allow for word-at-a-time CRC calculation for both big-endian and little- - endian machines, where a word is four bytes. -*/ -local void make_crc_table() -{ - unsigned long c; - int n, k; - unsigned long poly; /* polynomial exclusive-or pattern */ - /* terms of polynomial defining this crc (except x^32): */ - static volatile int first = 1; /* flag to limit concurrent making */ - static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26}; - - /* See if another task is already doing this (not thread-safe, but better - than nothing -- significantly reduces duration of vulnerability in - case the advice about DYNAMIC_CRC_TABLE is ignored) */ - if (first) { - first = 0; - - /* make exclusive-or pattern from polynomial (0xedb88320UL) */ - poly = 0UL; - for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++) - poly |= 1UL << (31 - p[n]); - - /* generate a crc for every 8-bit value */ - for (n = 0; n < 256; n++) { - c = (unsigned long)n; - for (k = 0; k < 8; k++) - c = c & 1 ? poly ^ (c >> 1) : c >> 1; - crc_table[0][n] = c; - } - -#ifdef BYFOUR - /* generate crc for each value followed by one, two, and three zeros, - and then the byte reversal of those as well as the first table */ - for (n = 0; n < 256; n++) { - c = crc_table[0][n]; - crc_table[4][n] = REV(c); - for (k = 1; k < 4; k++) { - c = crc_table[0][c & 0xff] ^ (c >> 8); - crc_table[k][n] = c; - crc_table[k + 4][n] = REV(c); - } - } -#endif /* BYFOUR */ - - crc_table_empty = 0; - } - else { /* not first */ - /* wait for the other guy to finish (not efficient, but rare) */ - while (crc_table_empty) - ; - } - -#ifdef MAKECRCH - /* write out CRC tables to crc32.h */ - { - FILE *out; - - out = fopen("crc32.h", "w"); - if (out == NULL) return; - fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n"); - fprintf(out, " * Generated automatically by crc32.c\n */\n\n"); - fprintf(out, "local const unsigned long FAR "); - fprintf(out, "crc_table[TBLS][256] =\n{\n {\n"); - write_table(out, crc_table[0]); -# ifdef BYFOUR - fprintf(out, "#ifdef BYFOUR\n"); - for (k = 1; k < 8; k++) { - fprintf(out, " },\n {\n"); - write_table(out, crc_table[k]); - } - fprintf(out, "#endif\n"); -# endif /* BYFOUR */ - fprintf(out, " }\n};\n"); - fclose(out); - } -#endif /* MAKECRCH */ -} - -#ifdef MAKECRCH -local void write_table(out, table) - FILE *out; - const unsigned long FAR *table; -{ - int n; - - for (n = 0; n < 256; n++) - fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n], - n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", ")); -} -#endif /* MAKECRCH */ - -#else /* !DYNAMIC_CRC_TABLE */ -/* ======================================================================== - * Tables of CRC-32s of all single-byte values, made by make_crc_table(). - */ -#include "crc32.h" -#endif /* DYNAMIC_CRC_TABLE */ - -/* ========================================================================= - * This function can be used by asm versions of crc32() - */ -const unsigned long FAR * ZEXPORT get_crc_table() -{ -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - return (const unsigned long FAR *)crc_table; -} - -/* ========================================================================= */ -#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8) -#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 - -/* ========================================================================= */ -unsigned long ZEXPORT crc32 (unsigned long crc, const unsigned char FAR *buf, unsigned len) -{ - if (buf == Z_NULL) return 0UL; - -#ifdef DYNAMIC_CRC_TABLE - if (crc_table_empty) - make_crc_table(); -#endif /* DYNAMIC_CRC_TABLE */ - -#ifdef BYFOUR - if (sizeof(void *) == sizeof(ptrdiff_t)) { - u4 endian; - - endian = 1; - if (*((unsigned char *)(&endian))) - return crc32_little(crc, buf, len); - else - return crc32_big(crc, buf, len); - } -#endif /* BYFOUR */ - crc = crc ^ 0xffffffffUL; - while (len >= 8) { - DO8; - len -= 8; - } - if (len) do { - DO1; - } while (--len); - return crc ^ 0xffffffffUL; -} - -#ifdef BYFOUR - -/* ========================================================================= */ -#define DOLIT4 c ^= *buf4++; \ - c = (u4) (crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \ - crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]) -#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 - -/* ========================================================================= */ -local unsigned long crc32_little(unsigned long crc, const unsigned char FAR *buf, unsigned len) -{ - u4 c; - const u4 FAR *buf4; - - c = (u4)crc; - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = (u4) (crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8)); - len--; - } - - buf4 = (const u4 FAR *)(const void FAR *)buf; - while (len >= 32) { - DOLIT32; - len -= 32; - } - while (len >= 4) { - DOLIT4; - len -= 4; - } - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = (u4) (crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8)); - } while (--len); - c = ~c; - return (unsigned long)c; -} - -/* ========================================================================= */ -#define DOBIG4 c ^= *++buf4; \ - c = (u4) (crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \ - crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]) -#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 - -/* ========================================================================= */ -local unsigned long crc32_big (unsigned long crc, const unsigned char FAR *buf, unsigned len) -{ - u4 c; - const u4 FAR *buf4; - - c = REV((u4)crc); - c = ~c; - while (len && ((ptrdiff_t)buf & 3)) { - c = (u4) (crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8)); - len--; - } - - buf4 = (const u4 FAR *)(const void FAR *)buf; - buf4--; - while (len >= 32) { - DOBIG32; - len -= 32; - } - while (len >= 4) { - DOBIG4; - len -= 4; - } - buf4++; - buf = (const unsigned char FAR *)buf4; - - if (len) do { - c = (u4) (crc_table[4][(c >> 24) ^ (u4) *buf++] ^ (c << 8)); - } while (--len); - c = ~c; - return (unsigned long)(REV(c)); -} - -#endif /* BYFOUR */ - -#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */ - -/* ========================================================================= */ -local unsigned long gf2_matrix_times (unsigned long *mat, unsigned long vec) -{ - unsigned long sum; - - sum = 0; - while (vec) { - if (vec & 1) - sum ^= *mat; - vec >>= 1; - mat++; - } - return sum; -} - -/* ========================================================================= */ -local void gf2_matrix_square (unsigned long *square, unsigned long *mat) -{ - int n; - - for (n = 0; n < GF2_DIM; n++) - square[n] = gf2_matrix_times(mat, mat[n]); -} - -/* ========================================================================= */ -uLong ZEXPORT crc32_combine (uLong crc1, uLong crc2, z_off_t len2) -{ - int n; - unsigned long row; - unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ - unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - - /* degenerate case */ - if (len2 == 0) - return crc1; - - /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320L; /* CRC-32 polynomial */ - row = 1; - for (n = 1; n < GF2_DIM; n++) { - odd[n] = row; - row <<= 1; - } - - /* put operator for two zero bits in even */ - gf2_matrix_square(even, odd); - - /* put operator for four zero bits in odd */ - gf2_matrix_square(odd, even); - - /* apply len2 zeros to crc1 (first square will put the operator for one - zero byte, eight zero bits, in even) */ - do { - /* apply zeros operator for this bit of len2 */ - gf2_matrix_square(even, odd); - if (len2 & 1) - crc1 = gf2_matrix_times(even, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - if (len2 == 0) - break; - - /* another iteration of the loop with odd and even swapped */ - gf2_matrix_square(odd, even); - if (len2 & 1) - crc1 = gf2_matrix_times(odd, crc1); - len2 >>= 1; - - /* if no more bits set, then done */ - } while (len2 != 0); - - /* return combined crc */ - crc1 ^= crc2; - return crc1; -} diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.h b/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.h deleted file mode 100755 index 5de49bc..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/crc32.h +++ /dev/null @@ -1,441 +0,0 @@ -/* crc32.h -- tables for rapid CRC calculation - * Generated automatically by crc32.c - */ - -local const unsigned long FAR crc_table[TBLS][256] = -{ - { - 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL, - 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL, - 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL, - 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL, - 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL, - 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL, - 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL, - 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL, - 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL, - 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL, - 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL, - 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL, - 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL, - 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL, - 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL, - 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL, - 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL, - 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL, - 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL, - 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL, - 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL, - 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL, - 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL, - 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL, - 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL, - 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL, - 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL, - 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL, - 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL, - 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL, - 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL, - 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL, - 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL, - 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL, - 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL, - 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL, - 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL, - 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL, - 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL, - 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL, - 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL, - 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL, - 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL, - 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL, - 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL, - 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL, - 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL, - 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL, - 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL, - 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL, - 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL, - 0x2d02ef8dUL -#ifdef BYFOUR - }, - { - 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL, - 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL, - 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL, - 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL, - 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL, - 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL, - 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL, - 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL, - 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL, - 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL, - 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL, - 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL, - 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL, - 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL, - 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL, - 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL, - 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL, - 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL, - 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL, - 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL, - 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL, - 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL, - 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL, - 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL, - 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL, - 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL, - 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL, - 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL, - 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL, - 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL, - 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL, - 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL, - 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL, - 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL, - 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL, - 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL, - 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL, - 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL, - 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL, - 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL, - 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL, - 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL, - 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL, - 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL, - 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL, - 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL, - 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL, - 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL, - 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL, - 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL, - 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL, - 0x9324fd72UL - }, - { - 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL, - 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL, - 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL, - 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL, - 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL, - 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL, - 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL, - 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL, - 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL, - 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL, - 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL, - 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL, - 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL, - 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL, - 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL, - 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL, - 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL, - 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL, - 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL, - 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL, - 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL, - 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL, - 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL, - 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL, - 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL, - 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL, - 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL, - 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL, - 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL, - 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL, - 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL, - 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL, - 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL, - 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL, - 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL, - 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL, - 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL, - 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL, - 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL, - 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL, - 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL, - 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL, - 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL, - 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL, - 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL, - 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL, - 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL, - 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL, - 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL, - 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL, - 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL, - 0xbe9834edUL - }, - { - 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL, - 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL, - 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL, - 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL, - 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL, - 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL, - 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL, - 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL, - 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL, - 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL, - 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL, - 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL, - 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL, - 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL, - 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL, - 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL, - 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL, - 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL, - 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL, - 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL, - 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL, - 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL, - 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL, - 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL, - 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL, - 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL, - 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL, - 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL, - 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL, - 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL, - 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL, - 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL, - 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL, - 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL, - 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL, - 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL, - 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL, - 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL, - 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL, - 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL, - 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL, - 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL, - 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL, - 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL, - 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL, - 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL, - 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL, - 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL, - 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL, - 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL, - 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL, - 0xde0506f1UL - }, - { - 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL, - 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL, - 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL, - 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL, - 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL, - 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL, - 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL, - 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL, - 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL, - 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL, - 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL, - 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL, - 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL, - 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL, - 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL, - 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL, - 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL, - 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL, - 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL, - 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL, - 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL, - 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL, - 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL, - 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL, - 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL, - 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL, - 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL, - 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL, - 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL, - 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL, - 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL, - 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL, - 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL, - 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL, - 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL, - 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL, - 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL, - 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL, - 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL, - 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL, - 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL, - 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL, - 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL, - 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL, - 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL, - 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL, - 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL, - 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL, - 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL, - 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL, - 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL, - 0x8def022dUL - }, - { - 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL, - 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL, - 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL, - 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL, - 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL, - 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL, - 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL, - 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL, - 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL, - 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL, - 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL, - 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL, - 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL, - 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL, - 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL, - 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL, - 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL, - 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL, - 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL, - 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL, - 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL, - 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL, - 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL, - 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL, - 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL, - 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL, - 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL, - 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL, - 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL, - 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL, - 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL, - 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL, - 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL, - 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL, - 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL, - 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL, - 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL, - 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL, - 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL, - 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL, - 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL, - 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL, - 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL, - 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL, - 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL, - 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL, - 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL, - 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL, - 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL, - 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL, - 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL, - 0x72fd2493UL - }, - { - 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL, - 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL, - 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL, - 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL, - 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL, - 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL, - 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL, - 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL, - 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL, - 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL, - 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL, - 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL, - 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL, - 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL, - 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL, - 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL, - 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL, - 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL, - 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL, - 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL, - 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL, - 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL, - 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL, - 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL, - 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL, - 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL, - 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL, - 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL, - 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL, - 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL, - 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL, - 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL, - 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL, - 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL, - 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL, - 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL, - 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL, - 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL, - 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL, - 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL, - 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL, - 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL, - 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL, - 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL, - 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL, - 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL, - 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL, - 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL, - 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL, - 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL, - 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL, - 0xed3498beUL - }, - { - 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL, - 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL, - 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL, - 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL, - 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL, - 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL, - 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL, - 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL, - 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL, - 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL, - 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL, - 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL, - 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL, - 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL, - 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL, - 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL, - 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL, - 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL, - 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL, - 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL, - 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL, - 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL, - 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL, - 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL, - 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL, - 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL, - 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL, - 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL, - 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL, - 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL, - 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL, - 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL, - 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL, - 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL, - 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL, - 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL, - 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL, - 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL, - 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL, - 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL, - 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL, - 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL, - 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL, - 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL, - 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL, - 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL, - 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL, - 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL, - 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL, - 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL, - 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL, - 0xf10605deUL -#endif - } -}; diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.c b/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.c deleted file mode 100755 index ce87dd9..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.c +++ /dev/null @@ -1,1679 +0,0 @@ -/* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process depends on being able to identify portions - * of the input text which are identical to earlier input (within a - * sliding window trailing behind the input currently being processed). - * - * The most straightforward technique turns out to be the fastest for - * most input files: try all possible matches and select the longest. - * The key feature of this algorithm is that insertions into the string - * dictionary are very simple and thus fast, and deletions are avoided - * completely. Insertions are performed at each input character, whereas - * string matches are performed only when the previous match ends. So it - * is preferable to spend more time in matches to allow very fast string - * insertions and avoid deletions. The matching algorithm for small - * strings is inspired from that of Rabin & Karp. A brute force approach - * is used to find longer strings when a small match has been found. - * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze - * (by Leonid Broukhis). - * A previous version of this file used a more sophisticated algorithm - * (by Fiala and Greene) which is guaranteed to run in linear amortized - * time, but has a larger average cost, uses more memory and is patented. - * However the F&G algorithm may be faster for some highly redundant - * files if the parameter max_chain_length (described below) is too large. - * - * ACKNOWLEDGEMENTS - * - * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and - * I found it in 'freeze' written by Leonid Broukhis. - * Thanks to many people for bug reports and testing. - * - * REFERENCES - * - * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification". - * Available in http://www.ietf.org/rfc/rfc1951.txt - * - * A description of the Rabin and Karp algorithm is given in the book - * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. - * - * Fiala,E.R., and Greene,D.H. - * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 - * - */ - -/* @(#) $Id: deflate.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#include "deflate.h" - -const char deflate_copyright[] = - " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* =========================================================================== - * Function prototypes. - */ -typedef enum { - need_more, /* block not completed, need more input or more output */ - block_done, /* block flush performed */ - finish_started, /* finish started, need only more output at next deflate */ - finish_done /* finish done, accept no more input or output */ -} block_state; - -typedef block_state (*compress_func) OF((deflate_state *s, int flush)); -/* Compression function. Returns the block state after the call. */ - -local void fill_window OF((deflate_state *s)); -local block_state deflate_stored OF((deflate_state *s, int flush)); -local block_state deflate_fast OF((deflate_state *s, int flush)); -#ifndef FASTEST -local block_state deflate_slow OF((deflate_state *s, int flush)); -#endif -local void lm_init OF((deflate_state *s)); -local void putShortMSB OF((deflate_state *s, uInt b)); -local void flush_pending OF((z_streamp strm)); -local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifndef FASTEST -#ifdef ASMV - void match_init OF((void)); /* asm code initialization */ - uInt longest_match OF((deflate_state *s, IPos cur_match)); -#else -local uInt longest_match OF((deflate_state *s, IPos cur_match)); -#endif -#endif -local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); - -#ifdef DEBUG -local void check_match OF((deflate_state *s, IPos start, IPos match, - int length)); -#endif - -/* =========================================================================== - * Local data - */ - -#define NIL 0 -/* Tail of hash chains */ - -#ifndef TOO_FAR -# define TOO_FAR 4096 -#endif -/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -/* Values for max_lazy_match, good_match and max_chain_length, depending on - * the desired pack level (0..9). The values given below have been tuned to - * exclude worst case performance for pathological files. Better values may be - * found for specific files. - */ -typedef struct config_s { - ush good_length; /* reduce lazy search above this match length */ - ush max_lazy; /* do not perform lazy search above this match length */ - ush nice_length; /* quit search above this match length */ - ush max_chain; - compress_func func; -} config; - -#ifdef FASTEST -local const config configuration_table[2] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */ -#else -local const config configuration_table[10] = { -/* good lazy nice chain */ -/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */ -/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */ -/* 2 */ {4, 5, 16, 8, deflate_fast}, -/* 3 */ {4, 6, 32, 32, deflate_fast}, - -/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */ -/* 5 */ {8, 16, 32, 32, deflate_slow}, -/* 6 */ {8, 16, 128, 128, deflate_slow}, -/* 7 */ {8, 32, 128, 256, deflate_slow}, -/* 8 */ {32, 128, 258, 1024, deflate_slow}, -/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */ -#endif - -/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4 - * For deflate_fast() (levels <= 3) good is ignored and lazy has a different - * meaning. - */ - -#define EQUAL 0 -/* result of memcmp for equal strings */ - -#ifndef NO_DUMMY_DECL -struct static_tree_desc_s {int dummy;}; /* for buggy compilers */ -#endif - -/* =========================================================================== - * Update a hash value with the given input byte - * IN assertion: all calls to to UPDATE_HASH are made with consecutive - * input characters, so that a running hash key can be computed from the - * previous key instead of complete recalculation each time. - */ -#define UPDATE_HASH(s,h,c) (h = (((h)<hash_shift) ^ (c)) & s->hash_mask) - - -/* =========================================================================== - * Insert string str in the dictionary and set match_head to the previous head - * of the hash chain (the most recent string with same hash key). Return - * the previous length of the hash chain. - * If this file is compiled with -DFASTEST, the compression level is forced - * to 1, and no hash chains are maintained. - * IN assertion: all calls to to INSERT_STRING are made with consecutive - * input characters and the first MIN_MATCH bytes of str are valid - * (except for the last MIN_MATCH-1 bytes of the input file). - */ -#ifdef FASTEST -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#else -#define INSERT_STRING(s, str, match_head) \ - (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \ - match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \ - s->head[s->ins_h] = (Pos)(str)) -#endif - -/* =========================================================================== - * Initialize the hash table (avoiding 64K overflow for 16 bit systems). - * prev[] will be initialized on the fly. - */ -#define CLEAR_HASH(s) \ - s->head[s->hash_size-1] = NIL; \ - zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); - -/* ========================================================================= */ -int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version, int stream_size) -{ - return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, - Z_DEFAULT_STRATEGY, version, stream_size); - /* To do: ignore strm->next_in if we use it as window */ -} - -/* ========================================================================= */ -int ZEXPORT deflateInit2_ (z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size) -{ - deflate_state *s; - int wrap = 1; - static const char my_version[] = ZLIB_VERSION; - - ushf *overlay; - /* We overlay pending_buf and d_buf+l_buf. This works since the average - * output size for (length,distance) codes is <= 24 bits. - */ - - if (version == Z_NULL || version[0] != my_version[0] || - stream_size != sizeof(z_stream)) { - return Z_VERSION_ERROR; - } - if (strm == Z_NULL) return Z_STREAM_ERROR; - - strm->msg = Z_NULL; - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - - if (windowBits < 0) { /* suppress zlib wrapper */ - wrap = 0; - windowBits = -windowBits; - } -#ifdef GZIP - else if (windowBits > 15) { - wrap = 2; /* write gzip wrapper instead */ - windowBits -= 16; - } -#endif - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || - windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || - strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */ - s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state)); - if (s == Z_NULL) return Z_MEM_ERROR; - strm->state = (struct internal_state FAR *)s; - s->strm = strm; - - s->wrap = wrap; - s->gzhead = Z_NULL; - s->w_bits = windowBits; - s->w_size = 1 << s->w_bits; - s->w_mask = s->w_size - 1; - - s->hash_bits = memLevel + 7; - s->hash_size = 1 << s->hash_bits; - s->hash_mask = s->hash_size - 1; - s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); - - s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte)); - s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); - s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); - - s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ - - overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); - s->pending_buf = (uchf *) overlay; - s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L); - - if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL || - s->pending_buf == Z_NULL) { - s->status = FINISH_STATE; - strm->msg = (char*)ERR_MSG(Z_MEM_ERROR); - deflateEnd (strm); - return Z_MEM_ERROR; - } - s->d_buf = overlay + s->lit_bufsize/sizeof(ush); - s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; - - s->level = level; - s->strategy = strategy; - s->method = (Byte)method; - - return deflateReset(strm); -} - -/* ========================================================================= */ -int ZEXPORT deflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength) -{ - deflate_state *s; - uInt length = dictLength; - uInt n; - IPos hash_head = 0; - - if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL || - strm->state->wrap == 2 || - (strm->state->wrap == 1 && strm->state->status != INIT_STATE)) - return Z_STREAM_ERROR; - - s = strm->state; - if (s->wrap) - strm->adler = adler32(strm->adler, dictionary, dictLength); - - if (length < MIN_MATCH) return Z_OK; - if (length > MAX_DIST(s)) { - length = MAX_DIST(s); - dictionary += dictLength - length; /* use the tail of the dictionary */ - } - zmemcpy(s->window, dictionary, length); - s->strstart = length; - s->block_start = (long)length; - - /* Insert all strings in the hash table (except for the last two bytes). - * s->lookahead stays null, so s->ins_h will be recomputed at the next - * call of fill_window. - */ - s->ins_h = s->window[0]; - UPDATE_HASH(s, s->ins_h, s->window[1]); - for (n = 0; n <= length - MIN_MATCH; n++) { - INSERT_STRING(s, n, hash_head); - } - - (void) hash_head; /* to make compiler happy */ - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateReset (z_streamp strm) -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) { - return Z_STREAM_ERROR; - } - - strm->total_in = strm->total_out = 0; - strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */ - strm->data_type = Z_UNKNOWN; - - s = (deflate_state *)strm->state; - s->pending = 0; - s->pending_out = s->pending_buf; - - if (s->wrap < 0) { - s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */ - } - s->status = s->wrap ? INIT_STATE : BUSY_STATE; - strm->adler = -#ifdef GZIP - s->wrap == 2 ? crc32(0L, Z_NULL, 0) : -#endif - adler32(0L, Z_NULL, 0); - s->last_flush = Z_NO_FLUSH; - - _tr_init(s); - lm_init(s); - - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateSetHeader (z_streamp strm, gz_headerp head) -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - if (strm->state->wrap != 2) return Z_STREAM_ERROR; - strm->state->gzhead = head; - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflatePrime (z_streamp strm, int bits, int value) -{ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - strm->state->bi_valid = bits; - strm->state->bi_buf = (ush)(value & ((1 << bits) - 1)); - return Z_OK; -} - -/* ========================================================================= */ -int ZEXPORT deflateParams (z_streamp strm, int level, int strategy) -{ - deflate_state *s; - compress_func func; - int err = Z_OK; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - -#ifdef FASTEST - if (level != 0) level = 1; -#else - if (level == Z_DEFAULT_COMPRESSION) level = 6; -#endif - if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) { - return Z_STREAM_ERROR; - } - func = configuration_table[s->level].func; - - if (func != configuration_table[level].func && strm->total_in != 0) { - /* Flush the last buffer: */ - err = deflate(strm, Z_PARTIAL_FLUSH); - } - if (s->level != level) { - s->level = level; - s->max_lazy_match = configuration_table[level].max_lazy; - s->good_match = configuration_table[level].good_length; - s->nice_match = configuration_table[level].nice_length; - s->max_chain_length = configuration_table[level].max_chain; - } - s->strategy = strategy; - return err; -} - -/* ========================================================================= */ -int ZEXPORT deflateTune (z_streamp strm, int good_length, int max_lazy, int nice_length, int max_chain) -{ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - s = strm->state; - s->good_match = good_length; - s->max_lazy_match = max_lazy; - s->nice_match = nice_length; - s->max_chain_length = max_chain; - return Z_OK; -} - -/* ========================================================================= - * For the default windowBits of 15 and memLevel of 8, this function returns - * a close to exact, as well as small, upper bound on the compressed size. - * They are coded as constants here for a reason--if the #define's are - * changed, then this function needs to be changed as well. The return - * value for 15 and 8 only works for those exact settings. - * - * For any setting other than those defaults for windowBits and memLevel, - * the value returned is a conservative worst case for the maximum expansion - * resulting from using fixed blocks instead of stored blocks, which deflate - * can emit on compressed data for some combinations of the parameters. - * - * This function could be more sophisticated to provide closer upper bounds - * for every combination of windowBits and memLevel, as well as wrap. - * But even the conservative upper bound of about 14% expansion does not - * seem onerous for output buffer allocation. - */ -uLong ZEXPORT deflateBound (z_streamp strm, uLong sourceLen) -{ - deflate_state *s; - uLong destLen; - - /* conservative upper bound */ - destLen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; - - /* if can't get parameters, return conservative bound */ - if (strm == Z_NULL || strm->state == Z_NULL) - return destLen; - - /* if not default parameters, return conservative bound */ - s = strm->state; - if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return destLen; - - /* default settings: return tight bound for that case */ - return compressBound(sourceLen); -} - -/* ========================================================================= - * Put a short in the pending buffer. The 16-bit value is put in MSB order. - * IN assertion: the stream state is correct and there is enough room in - * pending_buf. - */ -local void putShortMSB (deflate_state *s, uInt b) -{ - put_byte(s, (Byte)(b >> 8)); - put_byte(s, (Byte)(b & 0xff)); -} - -/* ========================================================================= - * Flush as much pending output as possible. All deflate() output goes - * through this function so some applications may wish to modify it - * to avoid allocating a large strm->next_out buffer and copying into it. - * (See also read_buf()). - */ -local void flush_pending (z_streamp strm) -{ - unsigned len = strm->state->pending; - - if (len > strm->avail_out) len = strm->avail_out; - if (len == 0) return; - - zmemcpy(strm->next_out, strm->state->pending_out, len); - strm->next_out += len; - strm->state->pending_out += len; - strm->total_out += len; - strm->avail_out -= len; - strm->state->pending -= len; - if (strm->state->pending == 0) { - strm->state->pending_out = strm->state->pending_buf; - } -} - -/* ========================================================================= */ -int ZEXPORT deflate (z_streamp strm, int flush) -{ - int old_flush; /* value of flush param for previous deflate call */ - deflate_state *s; - - if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_FINISH || flush < 0) { - return Z_STREAM_ERROR; - } - s = strm->state; - - if (strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0) || - (s->status == FINISH_STATE && flush != Z_FINISH)) { - ERR_RETURN(strm, Z_STREAM_ERROR); - } - if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); - - s->strm = strm; /* just in case */ - old_flush = s->last_flush; - s->last_flush = flush; - - /* Write the header */ - if (s->status == INIT_STATE) { -#ifdef GZIP - if (s->wrap == 2) { - strm->adler = crc32(0L, Z_NULL, 0); - put_byte(s, 31); - put_byte(s, 139); - put_byte(s, 8); - if (s->gzhead == NULL) { - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, 0); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, OS_CODE); - s->status = BUSY_STATE; - } - else { - put_byte(s, (s->gzhead->text ? 1 : 0) + - (s->gzhead->hcrc ? 2 : 0) + - (s->gzhead->extra == Z_NULL ? 0 : 4) + - (s->gzhead->name == Z_NULL ? 0 : 8) + - (s->gzhead->comment == Z_NULL ? 0 : 16) - ); - put_byte(s, (Byte)(s->gzhead->time & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff)); - put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff)); - put_byte(s, s->level == 9 ? 2 : - (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? - 4 : 0)); - put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != NULL) { - put_byte(s, s->gzhead->extra_len & 0xff); - put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); - } - if (s->gzhead->hcrc) - strm->adler = crc32(strm->adler, s->pending_buf, - s->pending); - s->gzindex = 0; - s->status = EXTRA_STATE; - } - } - else -#endif - { - uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8; - uInt level_flags; - - if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2) - level_flags = 0; - else if (s->level < 6) - level_flags = 1; - else if (s->level == 6) - level_flags = 2; - else - level_flags = 3; - header |= (level_flags << 6); - if (s->strstart != 0) header |= PRESET_DICT; - header += 31 - (header % 31); - - s->status = BUSY_STATE; - putShortMSB(s, header); - - /* Save the adler32 of the preset dictionary: */ - if (s->strstart != 0) { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - strm->adler = adler32(0L, Z_NULL, 0); - } - } -#ifdef GZIP - if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - - while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) - break; - } - put_byte(s, s->gzhead->extra[s->gzindex]); - s->gzindex++; - } - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (s->gzindex == s->gzhead->extra_len) { - s->gzindex = 0; - s->status = NAME_STATE; - } - } - else - s->status = NAME_STATE; - } - if (s->status == NAME_STATE) { - if (s->gzhead->name != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->name[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) { - s->gzindex = 0; - s->status = COMMENT_STATE; - } - } - else - s->status = COMMENT_STATE; - } - if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != NULL) { - uInt beg = s->pending; /* start of bytes to update crc */ - int val; - - do { - if (s->pending == s->pending_buf_size) { - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - flush_pending(strm); - beg = s->pending; - if (s->pending == s->pending_buf_size) { - val = 1; - break; - } - } - val = s->gzhead->comment[s->gzindex++]; - put_byte(s, val); - } while (val != 0); - if (s->gzhead->hcrc && s->pending > beg) - strm->adler = crc32(strm->adler, s->pending_buf + beg, - s->pending - beg); - if (val == 0) - s->status = HCRC_STATE; - } - else - s->status = HCRC_STATE; - } - if (s->status == HCRC_STATE) { - if (s->gzhead->hcrc) { - if (s->pending + 2 > s->pending_buf_size) - flush_pending(strm); - if (s->pending + 2 <= s->pending_buf_size) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - strm->adler = crc32(0L, Z_NULL, 0); - s->status = BUSY_STATE; - } - } - else - s->status = BUSY_STATE; - } -#endif - - /* Flush as much pending output as possible */ - if (s->pending != 0) { - flush_pending(strm); - if (strm->avail_out == 0) { - /* Since avail_out is 0, deflate will be called again with - * more output space, but possibly with both pending and - * avail_in equal to zero. There won't be anything to do, - * but this is not an error situation so make sure we - * return OK instead of BUF_ERROR at next call of deflate: - */ - s->last_flush = -1; - return Z_OK; - } - - /* Make sure there is something to do and avoid duplicate consecutive - * flushes. For repeated and useless calls with Z_FINISH, we keep - * returning Z_STREAM_END instead of Z_BUF_ERROR. - */ - } else if (strm->avail_in == 0 && flush <= old_flush && - flush != Z_FINISH) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* User must not provide more input after the first FINISH: */ - if (s->status == FINISH_STATE && strm->avail_in != 0) { - ERR_RETURN(strm, Z_BUF_ERROR); - } - - /* Start a new block or continue the current one. - */ - if (strm->avail_in != 0 || s->lookahead != 0 || - (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { - block_state bstate; - - bstate = (*(configuration_table[s->level].func))(s, flush); - - if (bstate == finish_started || bstate == finish_done) { - s->status = FINISH_STATE; - } - if (bstate == need_more || bstate == finish_started) { - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR next call, see above */ - } - return Z_OK; - /* If flush != Z_NO_FLUSH && avail_out == 0, the next call - * of deflate should use the same flush parameter to make sure - * that the flush is complete. So we don't have to output an - * empty block here, this will be done at next call. This also - * ensures that for a very small output buffer, we emit at most - * one empty block. - */ - } - if (bstate == block_done) { - if (flush == Z_PARTIAL_FLUSH) { - _tr_align(s); - } else { /* FULL_FLUSH or SYNC_FLUSH */ - _tr_stored_block(s, (char*)0, 0L, 0); - /* For a full flush, this empty block will be recognized - * as a special marker by inflate_sync(). - */ - if (flush == Z_FULL_FLUSH) { - CLEAR_HASH(s); /* forget history */ - } - } - flush_pending(strm); - if (strm->avail_out == 0) { - s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */ - return Z_OK; - } - } - } - Assert(strm->avail_out > 0, "bug2"); - - if (flush != Z_FINISH) return Z_OK; - if (s->wrap <= 0) return Z_STREAM_END; - - /* Write the trailer */ -#ifdef GZIP - if (s->wrap == 2) { - put_byte(s, (Byte)(strm->adler & 0xff)); - put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); - put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); - put_byte(s, (Byte)(strm->total_in & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); - put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); - } - else -#endif - { - putShortMSB(s, (uInt)(strm->adler >> 16)); - putShortMSB(s, (uInt)(strm->adler & 0xffff)); - } - flush_pending(strm); - /* If avail_out is zero, the application will call deflate again - * to flush the rest. - */ - if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */ - return s->pending != 0 ? Z_OK : Z_STREAM_END; -} - -/* ========================================================================= */ -int ZEXPORT deflateEnd (z_streamp strm) -{ - int status; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - - status = strm->state->status; - if (status != INIT_STATE && - status != EXTRA_STATE && - status != NAME_STATE && - status != COMMENT_STATE && - status != HCRC_STATE && - status != BUSY_STATE && - status != FINISH_STATE) { - return Z_STREAM_ERROR; - } - - /* Deallocate in reverse order of allocations: */ - TRY_FREE(strm, strm->state->pending_buf); - TRY_FREE(strm, strm->state->head); - TRY_FREE(strm, strm->state->prev); - TRY_FREE(strm, strm->state->window); - - ZFREE(strm, strm->state); - strm->state = Z_NULL; - - return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK; -} - -/* ========================================================================= - * Copy the source state to the destination state. - * To simplify the source, this is not supported for 16-bit MSDOS (which - * doesn't have enough memory anyway to duplicate compression states). - */ -int ZEXPORT deflateCopy (z_streamp dest, z_streamp source) -{ -#ifdef MAXSEG_64K - return Z_STREAM_ERROR; -#else - deflate_state *ds; - deflate_state *ss; - ushf *overlay; - - - if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) { - return Z_STREAM_ERROR; - } - - ss = source->state; - - zmemcpy(dest, source, sizeof(z_stream)); - - ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state)); - if (ds == Z_NULL) return Z_MEM_ERROR; - dest->state = (struct internal_state FAR *) ds; - zmemcpy(ds, ss, sizeof(deflate_state)); - ds->strm = dest; - - ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte)); - ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos)); - ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos)); - overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2); - ds->pending_buf = (uchf *) overlay; - - if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL || - ds->pending_buf == Z_NULL) { - deflateEnd (dest); - return Z_MEM_ERROR; - } - /* following zmemcpy do not work for 16-bit MSDOS */ - zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte)); - zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos)); - zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos)); - zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size); - - ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf); - ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush); - ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize; - - ds->l_desc.dyn_tree = ds->dyn_ltree; - ds->d_desc.dyn_tree = ds->dyn_dtree; - ds->bl_desc.dyn_tree = ds->bl_tree; - - return Z_OK; -#endif /* MAXSEG_64K */ -} - -/* =========================================================================== - * Read a new buffer from the current input stream, update the adler32 - * and total number of bytes read. All deflate() input goes through - * this function so some applications may wish to modify it to avoid - * allocating a large strm->next_in buffer and copying from it. - * (See also flush_pending()). - */ -local int read_buf (z_streamp strm, Bytef *buf, unsigned size) -{ - unsigned len = strm->avail_in; - - if (len > size) len = size; - if (len == 0) return 0; - - strm->avail_in -= len; - - if (strm->state->wrap == 1) { - strm->adler = adler32(strm->adler, strm->next_in, len); - } -#ifdef GZIP - else if (strm->state->wrap == 2) { - strm->adler = crc32(strm->adler, strm->next_in, len); - } -#endif - zmemcpy(buf, strm->next_in, len); - strm->next_in += len; - strm->total_in += len; - - return (int)len; -} - -/* =========================================================================== - * Initialize the "longest match" routines for a new zlib stream - */ -local void lm_init (deflate_state *s) -{ - s->window_size = (ulg)2L*s->w_size; - - CLEAR_HASH(s); - - /* Set the default configuration parameters: - */ - s->max_lazy_match = configuration_table[s->level].max_lazy; - s->good_match = configuration_table[s->level].good_length; - s->nice_match = configuration_table[s->level].nice_length; - s->max_chain_length = configuration_table[s->level].max_chain; - - s->strstart = 0; - s->block_start = 0L; - s->lookahead = 0; - s->match_length = s->prev_length = MIN_MATCH-1; - s->match_available = 0; - s->ins_h = 0; -#ifndef FASTEST -#ifdef ASMV - match_init(); /* initialize the asm code */ -#endif -#endif -} - -#ifndef FASTEST -/* =========================================================================== - * Set match_start to the longest match starting at the given string and - * return its length. Matches shorter or equal to prev_length are discarded, - * in which case the result is equal to prev_length and match_start is - * garbage. - * IN assertions: cur_match is the head of the hash chain for the current - * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 - * OUT assertion: the match length is not greater than s->lookahead. - */ -#ifndef ASMV -/* For 80x86 and 680x0, an optimized version will be provided in match.asm or - * match.S. The code will be functionally equivalent. - */ -local uInt longest_match(deflate_state *s, IPos cur_match) -{ - unsigned chain_length = s->max_chain_length;/* max hash chain length */ - Bytef *scan = s->window + s->strstart; /* current string */ - Bytef *match; /* matched string */ - int len; /* length of current match */ - int best_len = s->prev_length; /* best match length so far */ - int nice_match = s->nice_match; /* stop if match long enough */ - IPos limit = s->strstart > (IPos)MAX_DIST(s) ? - s->strstart - (IPos)MAX_DIST(s) : NIL; - /* Stop when cur_match becomes <= limit. To simplify the code, - * we prevent matches with the string of window index 0. - */ - Posf *prev = s->prev; - uInt wmask = s->w_mask; - -#ifdef UNALIGNED_OK - /* Compare two bytes at a time. Note: this is not always beneficial. - * Try with and without -DUNALIGNED_OK to check. - */ - Bytef *strend = s->window + s->strstart + MAX_MATCH - 1; - ush scan_start = *(ushf*)scan; - ush scan_end = *(ushf*)(scan+best_len-1); -#else - Bytef *strend = s->window + s->strstart + MAX_MATCH; - Byte scan_end1 = scan[best_len-1]; - Byte scan_end = scan[best_len]; -#endif - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - /* Do not waste too much time if we already have a good match: */ - if (s->prev_length >= s->good_match) { - chain_length >>= 2; - } - /* Do not look for matches beyond the end of the input. This is necessary - * to make deflate deterministic. - */ - if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - do { - Assert(cur_match < s->strstart, "no future"); - match = s->window + cur_match; - - /* Skip to next match if the match length cannot increase - * or if the match length is less than 2. Note that the checks below - * for insufficient lookahead only occur occasionally for performance - * reasons. Therefore uninitialized memory will be accessed, and - * conditional jumps will be made that depend on those values. - * However the length of the match is limited to the lookahead, so - * the output of deflate is not affected by the uninitialized values. - */ -#if (defined(UNALIGNED_OK) && MAX_MATCH == 258) - /* This code assumes sizeof(unsigned short) == 2. Do not use - * UNALIGNED_OK if your compiler uses a different size. - */ - if (*(ushf*)(match+best_len-1) != scan_end || - *(ushf*)match != scan_start) continue; - - /* It is not necessary to compare scan[2] and match[2] since they are - * always equal when the other bytes match, given that the hash keys - * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at - * strstart+3, +5, ... up to strstart+257. We check for insufficient - * lookahead only every 4th comparison; the 128th check will be made - * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is - * necessary to put more guard bytes at the end of the window, or - * to check more often for insufficient lookahead. - */ - Assert(scan[2] == match[2], "scan[2]?"); - scan++, match++; - do { - } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - *(ushf*)(scan+=2) == *(ushf*)(match+=2) && - scan < strend); - /* The funny "do {}" generates better code on most compilers */ - - /* Here, scan <= window+strstart+257 */ - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - if (*scan == *match) scan++; - - len = (MAX_MATCH - 1) - (int)(strend-scan); - scan = strend - (MAX_MATCH-1); - -#else /* UNALIGNED_OK */ - - if (match[best_len] != scan_end || - match[best_len-1] != scan_end1 || - *match != *scan || - *++match != scan[1]) continue; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match++; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - scan = strend - MAX_MATCH; - -#endif /* UNALIGNED_OK */ - - if (len > best_len) { - s->match_start = cur_match; - best_len = len; - if (len >= nice_match) break; -#ifdef UNALIGNED_OK - scan_end = *(ushf*)(scan+best_len-1); -#else - scan_end1 = scan[best_len-1]; - scan_end = scan[best_len]; -#endif - } - } while ((cur_match = prev[cur_match & wmask]) > limit - && --chain_length != 0); - - if ((uInt)best_len <= s->lookahead) return (uInt)best_len; - return s->lookahead; -} -#endif /* ASMV */ -#endif /* FASTEST */ - -/* --------------------------------------------------------------------------- - * Optimized version for level == 1 or strategy == Z_RLE only - */ -local uInt longest_match_fast (deflate_state *s, IPos cur_match) -{ - Bytef *scan = s->window + s->strstart; /* current string */ - Bytef *match; /* matched string */ - int len; /* length of current match */ - Bytef *strend = s->window + s->strstart + MAX_MATCH; - - /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - * It is easy to get rid of this optimization if necessary. - */ - Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); - - Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); - - Assert(cur_match < s->strstart, "no future"); - - match = s->window + cur_match; - - /* Return failure if the match length is less than 2: - */ - if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1; - - /* The check at best_len-1 can be removed because it will be made - * again later. (This heuristic is not always a win.) - * It is not necessary to compare scan[2] and match[2] since they - * are always equal when the other bytes match, given that - * the hash keys are equal and that HASH_BITS >= 8. - */ - scan += 2, match += 2; - Assert(*scan == *match, "match[2]?"); - - /* We check for insufficient lookahead only every 8th comparison; - * the 256th check will be made at strstart+258. - */ - do { - } while (*++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - *++scan == *++match && *++scan == *++match && - scan < strend); - - Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); - - len = MAX_MATCH - (int)(strend - scan); - - if (len < MIN_MATCH) return MIN_MATCH - 1; - - s->match_start = cur_match; - return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; -} - -#ifdef DEBUG -/* =========================================================================== - * Check that the match at match_start is indeed a match. - */ -local void check_match(deflate_state *s, IPos start, IPos match, int length) -{ - /* check that the match is indeed a match */ - if (zmemcmp(s->window + match, - s->window + start, length) != EQUAL) { - fprintf(stderr, " start %u, match %u, length %d\n", - start, match, length); - do { - fprintf(stderr, "%c%c", s->window[match++], s->window[start++]); - } while (--length != 0); - z_error("invalid match"); - } - if (z_verbose > 1) { - fprintf(stderr,"\\[%d,%d]", start-match, length); - do { putc(s->window[start++], stderr); } while (--length != 0); - } -} -#else -# define check_match(s, start, match, length) -#endif /* DEBUG */ - -/* =========================================================================== - * Fill the window when the lookahead becomes insufficient. - * Updates strstart and lookahead. - * - * IN assertion: lookahead < MIN_LOOKAHEAD - * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - * At least one byte has been read, or avail_in == 0; reads are - * performed for at least two bytes (required for the zip translate_eol - * option -- not supported here). - */ -local void fill_window (deflate_state *s) -{ - unsigned n, m; - Posf *p; - unsigned more; /* Amount of free space at the end of the window. */ - uInt wsize = s->w_size; - - do { - more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); - - /* Deal with !@#$% 64K limit: */ - if (sizeof(int) <= 2) { - if (more == 0 && s->strstart == 0 && s->lookahead == 0) { - more = wsize; - - } else if (more == (unsigned)(-1)) { - /* Very unlikely, but possible on 16 bit machine if - * strstart == 0 && lookahead == 1 (input done a byte at time) - */ - more--; - } - } - - /* If the window is almost full and there is insufficient lookahead, - * move the upper half to the lower one to make room in the upper half. - */ - if (s->strstart >= wsize+MAX_DIST(s)) { - - zmemcpy(s->window, s->window+wsize, (unsigned)wsize); - s->match_start -= wsize; - s->strstart -= wsize; /* we now have strstart >= MAX_DIST */ - s->block_start -= (long) wsize; - - /* Slide the hash table (could be avoided with 32 bit values - at the expense of memory usage). We slide even when level == 0 - to keep the hash table consistent if we switch back to level > 0 - later. (Using level 0 permanently is not an optimal usage of - zlib, so we don't care about this pathological case.) - */ - /* %%% avoid this when Z_RLE */ - n = s->hash_size; - p = &s->head[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - } while (--n); - - n = wsize; -#ifndef FASTEST - p = &s->prev[n]; - do { - m = *--p; - *p = (Pos)(m >= wsize ? m-wsize : NIL); - /* If n is not on any hash chain, prev[n] is garbage but - * its value will never be used. - */ - } while (--n); -#endif - more += wsize; - } - if (s->strm->avail_in == 0) return; - - /* If there was no sliding: - * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - * more == window_size - lookahead - strstart - * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - * => more >= window_size - 2*WSIZE + 2 - * In the BIG_MEM or MMAP case (not yet supported), - * window_size == input_size + MIN_LOOKAHEAD && - * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - * Otherwise, window_size == 2*WSIZE so more >= 2. - * If there was sliding, more >= WSIZE. So in all cases, more >= 2. - */ - Assert(more >= 2, "more < 2"); - - n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more); - s->lookahead += n; - - /* Initialize the hash value now that we have some input: */ - if (s->lookahead >= MIN_MATCH) { - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - } - /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - * but this is not important since only literal bytes will be emitted. - */ - - } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); -} - -/* =========================================================================== - * Flush the current block, with given end-of-file flag. - * IN assertion: strstart is set to the end of the current match. - */ -#define FLUSH_BLOCK_ONLY(s, eof) { \ - _tr_flush_block(s, (s->block_start >= 0L ? \ - (charf *)&s->window[(unsigned)s->block_start] : \ - (charf *)Z_NULL), \ - (ulg)((long)s->strstart - s->block_start), \ - (eof)); \ - s->block_start = s->strstart; \ - flush_pending(s->strm); \ - Tracev((stderr,"[FLUSH]")); \ -} - -/* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, eof) { \ - FLUSH_BLOCK_ONLY(s, eof); \ - if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ -} - -/* =========================================================================== - * Copy without compression as much as possible from the input stream, return - * the current block state. - * This function does not insert new strings in the dictionary since - * uncompressible data is probably not useful. This function is used - * only for the level=0 compression option. - * NOTE: this function should be optimized to avoid extra copying from - * window to pending_buf. - */ -local block_state deflate_stored(deflate_state *s, int flush) -{ - /* Stored blocks are limited to 0xffff bytes, pending_buf is limited - * to pending_buf_size, and each stored block has a 5 byte header: - */ - ulg max_block_size = 0xffff; - ulg max_start; - - if (max_block_size > s->pending_buf_size - 5) { - max_block_size = s->pending_buf_size - 5; - } - - /* Copy as much as possible from input to output: */ - for (;;) { - /* Fill the window as much as possible: */ - if (s->lookahead <= 1) { - - Assert(s->strstart < s->w_size+MAX_DIST(s) || - s->block_start >= (long)s->w_size, "slide too late"); - - fill_window(s); - if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more; - - if (s->lookahead == 0) break; /* flush the current block */ - } - Assert(s->block_start >= 0L, "block gone"); - - s->strstart += s->lookahead; - s->lookahead = 0; - - /* Emit a stored block if pending_buf will be full: */ - max_start = s->block_start + max_block_size; - if (s->strstart == 0 || (ulg)s->strstart >= max_start) { - /* strstart == 0 is possible when wraparound on 16-bit machine */ - s->lookahead = (uInt)(s->strstart - max_start); - s->strstart = (uInt)max_start; - FLUSH_BLOCK(s, 0); - } - /* Flush if we may have to slide, otherwise block_start may become - * negative and the data will be gone: - */ - if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) { - FLUSH_BLOCK(s, 0); - } - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -/* =========================================================================== - * Compress as much as possible from the input stream, return the current - * block state. - * This function does not perform lazy evaluation of matches and inserts - * new strings in the dictionary only for unmatched strings or for short - * matches. It is used only for the fast compression options. - */ -local block_state deflate_fast(deflate_state *s, int flush) -{ - IPos hash_head = NIL; /* head of the hash chain */ - int bflush; /* set if current block must be flushed */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - * At this point we have always match_length < MIN_MATCH - */ - if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ -#ifdef FASTEST - if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || - (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { - s->match_length = longest_match_fast (s, hash_head); - } -#else - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } -#endif - /* longest_match() or longest_match_fast() sets match_start */ - } - if (s->match_length >= MIN_MATCH) { - check_match(s, s->strstart, s->match_start, s->match_length); - - _tr_tally_dist(s, s->strstart - s->match_start, - s->match_length - MIN_MATCH, bflush); - - s->lookahead -= s->match_length; - - /* Insert new strings in the hash table only if the match length - * is not too large. This saves time but degrades compression. - */ -#ifndef FASTEST - if (s->match_length <= s->max_insert_length && - s->lookahead >= MIN_MATCH) { - s->match_length--; /* string at strstart already in table */ - do { - s->strstart++; - INSERT_STRING(s, s->strstart, hash_head); - /* strstart never exceeds WSIZE-MAX_MATCH, so there are - * always MIN_MATCH bytes ahead. - */ - } while (--s->match_length != 0); - s->strstart++; - } else -#endif - { - s->strstart += s->match_length; - s->match_length = 0; - s->ins_h = s->window[s->strstart]; - UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]); -#if MIN_MATCH != 3 - Call UPDATE_HASH() MIN_MATCH-3 more times -#endif - /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not - * matter since it will be recomputed at next deflate call. - */ - } - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} - -#ifndef FASTEST -/* =========================================================================== - * Same as above, but achieves better compression. We use a lazy - * evaluation for matches: a match is finally adopted only if there is - * no better match at the next window position. - */ -local block_state deflate_slow(deflate_state *s, int flush) -{ - IPos hash_head = NIL; /* head of hash chain */ - int bflush; /* set if current block must be flushed */ - - /* Process the input block. */ - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the next match, plus MIN_MATCH bytes to insert the - * string following the next match. - */ - if (s->lookahead < MIN_LOOKAHEAD) { - fill_window(s); - if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* Insert the string window[strstart .. strstart+2] in the - * dictionary, and set hash_head to the head of the hash chain: - */ - if (s->lookahead >= MIN_MATCH) { - INSERT_STRING(s, s->strstart, hash_head); - } - - /* Find the longest match, discarding those <= prev_length. - */ - s->prev_length = s->match_length, s->prev_match = s->match_start; - s->match_length = MIN_MATCH-1; - - if (hash_head != NIL && s->prev_length < s->max_lazy_match && - s->strstart - hash_head <= MAX_DIST(s)) { - /* To simplify the code, we prevent matches with the string - * of window index 0 (in particular we have to avoid a match - * of the string with itself at the start of the input file). - */ - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } - /* longest_match() or longest_match_fast() sets match_start */ - - if (s->match_length <= 5 && (s->strategy == Z_FILTERED -#if TOO_FAR <= 32767 - || (s->match_length == MIN_MATCH && - s->strstart - s->match_start > TOO_FAR) -#endif - )) { - - /* If prev_match is also MIN_MATCH, match_start is garbage - * but we will ignore the current match anyway. - */ - s->match_length = MIN_MATCH-1; - } - } - /* If there was a match at the previous step and the current - * match is not better, output the previous match: - */ - if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) { - uInt max_insert = s->strstart + s->lookahead - MIN_MATCH; - /* Do not insert strings in hash table beyond this. */ - - check_match(s, s->strstart-1, s->prev_match, s->prev_length); - - _tr_tally_dist(s, s->strstart -1 - s->prev_match, - s->prev_length - MIN_MATCH, bflush); - - /* Insert in hash table all strings up to the end of the match. - * strstart-1 and strstart are already inserted. If there is not - * enough lookahead, the last two strings are not inserted in - * the hash table. - */ - s->lookahead -= s->prev_length-1; - s->prev_length -= 2; - do { - if (++s->strstart <= max_insert) { - INSERT_STRING(s, s->strstart, hash_head); - } - } while (--s->prev_length != 0); - s->match_available = 0; - s->match_length = MIN_MATCH-1; - s->strstart++; - - if (bflush) FLUSH_BLOCK(s, 0); - - } else if (s->match_available) { - /* If there was no match at the previous position, output a - * single literal. If there was a match but the current match - * is longer, truncate the previous match to a single literal. - */ - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - if (bflush) { - FLUSH_BLOCK_ONLY(s, 0); - } - s->strstart++; - s->lookahead--; - if (s->strm->avail_out == 0) return need_more; - } else { - /* There is no previous match to compare with, wait for - * the next step to decide. - */ - s->match_available = 1; - s->strstart++; - s->lookahead--; - } - } - Assert (flush != Z_NO_FLUSH, "no flush?"); - if (s->match_available) { - Tracevv((stderr,"%c", s->window[s->strstart-1])); - _tr_tally_lit(s, s->window[s->strstart-1], bflush); - s->match_available = 0; - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} -#endif /* FASTEST */ - -#if 0 -/* =========================================================================== - * For Z_RLE, simply look for runs of bytes, generate matches only of distance - * one. Do not maintain a hash table. (It will be regenerated if this run of - * deflate switches away from Z_RLE.) - */ -local block_state deflate_rle(s, flush) - deflate_state *s; - int flush; -{ - int bflush; /* set if current block must be flushed */ - uInt run; /* length of run */ - uInt max; /* maximum length of run */ - uInt prev; /* byte at distance one to match */ - Bytef *scan; /* scan for end of run */ - - for (;;) { - /* Make sure that we always have enough lookahead, except - * at the end of the input file. We need MAX_MATCH bytes - * for the longest encodable run. - */ - if (s->lookahead < MAX_MATCH) { - fill_window(s); - if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) { - return need_more; - } - if (s->lookahead == 0) break; /* flush the current block */ - } - - /* See how many times the previous byte repeats */ - run = 0; - if (s->strstart > 0) { /* if there is a previous byte, that is */ - max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; - scan = s->window + s->strstart - 1; - prev = *scan++; - do { - if (*scan++ != prev) - break; - } while (++run < max); - } - - /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (run >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, run); - _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); - s->lookahead -= run; - s->strstart += run; - } else { - /* No match, output a literal byte */ - Tracevv((stderr,"%c", s->window[s->strstart])); - _tr_tally_lit (s, s->window[s->strstart], bflush); - s->lookahead--; - s->strstart++; - } - if (bflush) FLUSH_BLOCK(s, 0); - } - FLUSH_BLOCK(s, flush == Z_FINISH); - return flush == Z_FINISH ? finish_done : block_done; -} -#endif diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.h b/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.h deleted file mode 100755 index a3bae5f..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/deflate.h +++ /dev/null @@ -1,333 +0,0 @@ -/* deflate.h -- internal compression state - * Copyright (C) 1995-2004 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id: deflate.h,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#ifndef DEFLATE_H -#define DEFLATE_H - -#include "zutil.h" - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer creation by deflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip encoding - should be left enabled. */ -#ifndef NO_GZIP -# define GZIP -#endif - -#define NO_DUMMY_DECL - -/* =========================================================================== - * Internal compression state. - */ - -#define LENGTH_CODES 29 -/* number of length codes, not counting the special END_BLOCK code */ - -#define LITERALS 256 -/* number of literal bytes 0..255 */ - -#define L_CODES (LITERALS+1+LENGTH_CODES) -/* number of Literal or Length codes, including the END_BLOCK code */ - -#define D_CODES 30 -/* number of distance codes */ - -#define BL_CODES 19 -/* number of codes used to transfer the bit lengths */ - -#define HEAP_SIZE (2*L_CODES+1) -/* maximum heap size */ - -#define MAX_BITS 15 -/* All codes must not exceed MAX_BITS bits */ - -#define INIT_STATE 42 -#define EXTRA_STATE 69 -#define NAME_STATE 73 -#define COMMENT_STATE 91 -#define HCRC_STATE 103 -#define BUSY_STATE 113 -#define FINISH_STATE 666 -/* Stream status */ - - -/* Data structure describing a single value and its code string. */ -typedef struct ct_data_s { - union { - ush freq; /* frequency count */ - ush code; /* bit string */ - } fc; - union { - ush dad; /* father node in Huffman tree */ - ush len; /* length of bit string */ - } dl; -} FAR ct_data; - -#define Freq fc.freq -#define Code fc.code -#define Dad dl.dad -#define Len dl.len - -typedef struct static_tree_desc_s static_tree_desc; - -typedef struct tree_desc_s { - ct_data *dyn_tree; /* the dynamic tree */ - int max_code; /* largest code with non zero frequency */ - static_tree_desc *stat_desc; /* the corresponding static tree */ -} FAR tree_desc; - -typedef ush Pos; -typedef Pos FAR Posf; -typedef unsigned IPos; - -/* A Pos is an index in the character window. We use short instead of int to - * save space in the various tables. IPos is used only for parameter passing. - */ - -typedef struct internal_state { - z_streamp strm; /* pointer back to this zlib stream */ - int status; /* as the name implies */ - Bytef *pending_buf; /* output still pending */ - ulg pending_buf_size; /* size of pending_buf */ - Bytef *pending_out; /* next pending byte to output to the stream */ - uInt pending; /* nb of bytes in the pending buffer */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - gz_headerp gzhead; /* gzip header information to write */ - uInt gzindex; /* where in extra, name, or comment */ - Byte method; /* STORED (for zip only) or DEFLATED */ - int last_flush; /* value of flush param for previous deflate call */ - - /* used by deflate.c: */ - - uInt w_size; /* LZ77 window size (32K by default) */ - uInt w_bits; /* log2(w_size) (8..16) */ - uInt w_mask; /* w_size - 1 */ - - Bytef *window; - /* Sliding window. Input bytes are read into the second half of the window, - * and move to the first half later to keep a dictionary of at least wSize - * bytes. With this organization, matches are limited to a distance of - * wSize-MAX_MATCH bytes, but this ensures that IO is always - * performed with a length multiple of the block size. Also, it limits - * the window size to 64K, which is quite useful on MSDOS. - * To do: use the user input buffer as sliding window. - */ - - ulg window_size; - /* Actual size of window: 2*wSize, except when the user input buffer - * is directly used as sliding window. - */ - - Posf *prev; - /* Link to older string with same hash index. To limit the size of this - * array to 64K, this link is maintained only for the last 32K strings. - * An index in this array is thus a window index modulo 32K. - */ - - Posf *head; /* Heads of the hash chains or NIL. */ - - uInt ins_h; /* hash index of string to be inserted */ - uInt hash_size; /* number of elements in hash table */ - uInt hash_bits; /* log2(hash_size) */ - uInt hash_mask; /* hash_size-1 */ - - uInt hash_shift; - /* Number of bits by which ins_h must be shifted at each input - * step. It must be such that after MIN_MATCH steps, the oldest - * byte no longer takes part in the hash key, that is: - * hash_shift * MIN_MATCH >= hash_bits - */ - - long block_start; - /* Window position at the beginning of the current output block. Gets - * negative when the window is moved backwards. - */ - - uInt match_length; /* length of best match */ - IPos prev_match; /* previous match */ - int match_available; /* set if previous match exists */ - uInt strstart; /* start of string to insert */ - uInt match_start; /* start of matching string */ - uInt lookahead; /* number of valid bytes ahead in window */ - - uInt prev_length; - /* Length of the best match at previous step. Matches not greater than this - * are discarded. This is used in the lazy match evaluation. - */ - - uInt max_chain_length; - /* To speed up deflation, hash chains are never searched beyond this - * length. A higher limit improves compression ratio but degrades the - * speed. - */ - - uInt max_lazy_match; - /* Attempt to find a better match only when the current match is strictly - * smaller than this value. This mechanism is used only for compression - * levels >= 4. - */ -# define max_insert_length max_lazy_match - /* Insert new strings in the hash table only if the match length is not - * greater than this length. This saves time but degrades compression. - * max_insert_length is used only for compression levels <= 3. - */ - - int level; /* compression level (1..9) */ - int strategy; /* favor or force Huffman coding*/ - - uInt good_match; - /* Use a faster search when the previous match is longer than this */ - - int nice_match; /* Stop searching when current match exceeds this */ - - /* used by trees.c: */ - /* Didn't use ct_data typedef below to supress compiler warning */ - struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ - struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ - struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ - - struct tree_desc_s l_desc; /* desc. for literal tree */ - struct tree_desc_s d_desc; /* desc. for distance tree */ - struct tree_desc_s bl_desc; /* desc. for bit length tree */ - - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - int heap_len; /* number of elements in the heap */ - int heap_max; /* element of largest frequency */ - /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - * The same heap array is used to build all trees. - */ - - uch depth[2*L_CODES+1]; - /* Depth of each subtree used as tie breaker for trees of equal frequency - */ - - uchf *l_buf; /* buffer for literals or lengths */ - - uInt lit_bufsize; - /* Size of match buffer for literals/lengths. There are 4 reasons for - * limiting lit_bufsize to 64K: - * - frequencies can be kept in 16 bit counters - * - if compression is not successful for the first block, all input - * data is still in the window so we can still emit a stored block even - * when input comes from standard input. (This can also be done for - * all blocks if lit_bufsize is not greater than 32K.) - * - if compression is not successful for a file smaller than 64K, we can - * even emit a stored file instead of a stored block (saving 5 bytes). - * This is applicable only for zip (not gzip or zlib). - * - creating new Huffman trees less frequently may not provide fast - * adaptation to changes in the input data statistics. (Take for - * example a binary file with poorly compressible code followed by - * a highly compressible string table.) Smaller buffer sizes give - * fast adaptation but have of course the overhead of transmitting - * trees more frequently. - * - I can't count above 4 - */ - - uInt last_lit; /* running index in l_buf */ - - ushf *d_buf; - /* Buffer for distances. To simplify the code, d_buf and l_buf have - * the same number of elements. To use different lengths, an extra flag - * array would be necessary. - */ - - ulg opt_len; /* bit length of current block with optimal trees */ - ulg static_len; /* bit length of current block with static trees */ - uInt matches; /* number of string matches in current block */ - int last_eob_len; /* bit length of EOB code for last block */ - -#ifdef DEBUG - ulg compressed_len; /* total bit length of compressed file mod 2^32 */ - ulg bits_sent; /* bit length of compressed data sent mod 2^32 */ -#endif - - ush bi_buf; - /* Output buffer. bits are inserted starting at the bottom (least - * significant bits). - */ - int bi_valid; - /* Number of valid bits in bi_buf. All bits above the last valid bit - * are always zero. - */ - -} FAR deflate_state; - -/* Output a byte on the stream. - * IN assertion: there is enough room in pending_buf. - */ -#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);} - - -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - -#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD) -/* In order to simplify the code, particularly on 16 bit machines, match - * distances are limited to MAX_DIST instead of WSIZE. - */ - - /* in trees.c */ -void _tr_init OF((deflate_state *s)); -int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); -void _tr_align OF((deflate_state *s)); -void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); - -#define d_code(dist) \ - ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) -/* Mapping from a distance to a distance code. dist is the distance - 1 and - * must not have side effects. _dist_code[256] and _dist_code[257] are never - * used. - */ - -#ifndef DEBUG -/* Inline versions of _tr_tally for speed: */ - -#if defined(GEN_TREES_H) || !defined(STDC) - extern uch _length_code[]; - extern uch _dist_code[]; -#else - extern const uch _length_code[]; - extern const uch _dist_code[]; -#endif - -# define _tr_tally_lit(s, c, flush) \ - { uch cc = (c); \ - s->d_buf[s->last_lit] = 0; \ - s->l_buf[s->last_lit++] = cc; \ - s->dyn_ltree[cc].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -# define _tr_tally_dist(s, distance, length, flush) \ - { uch len = (length); \ - ush dist = (distance); \ - s->d_buf[s->last_lit] = dist; \ - s->l_buf[s->last_lit++] = len; \ - dist--; \ - s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \ - s->dyn_dtree[d_code(dist)].Freq++; \ - flush = (s->last_lit == s->lit_bufsize-1); \ - } -#else -# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c) -# define _tr_tally_dist(s, distance, length, flush) \ - flush = _tr_tally(s, distance, length) -#endif - -#endif /* DEFLATE_H */ diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/infback.c b/JuceLibraryCode/modules/juce_core/zip/zlib/infback.c deleted file mode 100755 index c259d01..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/infback.c +++ /dev/null @@ -1,611 +0,0 @@ -/* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - This code is largely copied from inflate.c. Normally either infback.o or - inflate.o would be linked into an application--not both. The interface - with inffast.c is retained so that optimized assembler-coded versions of - inflate_fast() can be used with either inflate.c or infback.c. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -/* function prototypes */ -local void fixedtables1 OF((struct inflate_state FAR *state)); - -/* - strm provides memory allocation functions in zalloc and zfree, or - Z_NULL to use the library memory allocation functions. - - windowBits is in the range 8..15, and window is a user-supplied - window and output buffer that is 2**windowBits bytes. - */ -int ZEXPORT inflateBackInit_(z_streamp strm, int windowBits, unsigned char FAR *window, const char *version, int stream_size) -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL || window == Z_NULL || - windowBits < 8 || windowBits > 15) - return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - state = (struct inflate_state FAR *)ZALLOC(strm, 1, - sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - state->dmax = 32768U; - state->wbits = windowBits; - state->wsize = 1U << windowBits; - state->window = window; - state->write = 0; - state->whave = 0; - return Z_OK; -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables1 (struct inflate_state FAR *state) -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -/* Macros for inflateBack(): */ - -/* Load returned state from inflate_fast() */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Set state from registers for inflate_fast() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Assure that some input is available. If input is requested, but denied, - then return a Z_BUF_ERROR from inflateBack(). */ -#define PULL() \ - do { \ - if (have == 0) { \ - have = in(in_desc, &next); \ - if (have == 0) { \ - next = Z_NULL; \ - ret = Z_BUF_ERROR; \ - goto inf_leave; \ - } \ - } \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflateBack() - with an error if there is no input available. */ -#define PULLBYTE() \ - do { \ - PULL(); \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflateBack() with - an error. */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Assure that some output space is available, by writing out the window - if it's full. If the write fails, return from inflateBack() with a - Z_BUF_ERROR. */ -#define ROOM() \ - do { \ - if (left == 0) { \ - put = state->window; \ - left = state->wsize; \ - state->whave = left; \ - if (out(out_desc, put, left)) { \ - ret = Z_BUF_ERROR; \ - goto inf_leave; \ - } \ - } \ - } while (0) - -/* - strm provides the memory allocation functions and window buffer on input, - and provides information on the unused input on return. For Z_DATA_ERROR - returns, strm will also provide an error message. - - in() and out() are the call-back input and output functions. When - inflateBack() needs more input, it calls in(). When inflateBack() has - filled the window with output, or when it completes with data in the - window, it calls out() to write out the data. The application must not - change the provided input until in() is called again or inflateBack() - returns. The application must not change the window/output buffer until - inflateBack() returns. - - in() and out() are called with a descriptor parameter provided in the - inflateBack() call. This parameter can be a structure that provides the - information required to do the read or write, as well as accumulated - information on the input and output such as totals and check values. - - in() should return zero on failure. out() should return non-zero on - failure. If either in() or out() fails, than inflateBack() returns a - Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it - was in() or out() that caused in the error. Otherwise, inflateBack() - returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format - error, or Z_MEM_ERROR if it could not allocate memory for the state. - inflateBack() can also return Z_STREAM_ERROR if the input parameters - are not correct, i.e. strm is Z_NULL or the state was not initialized. - */ -int ZEXPORT inflateBack(z_streamp strm, in_func in, void FAR *in_desc, out_func out, void FAR *out_desc) -{ - struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code thisx; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - /* Check that the strm exists and that the state was initialized */ - if (strm == Z_NULL || strm->state == Z_NULL) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - - /* Reset the state */ - strm->msg = Z_NULL; - state->mode = TYPE; - state->last = 0; - state->whave = 0; - next = strm->next_in; - have = next != Z_NULL ? strm->avail_in : 0; - hold = 0; - bits = 0; - put = state->window; - left = state->wsize; - - /* Inflate until end of block marked as last */ - for (;;) - switch (state->mode) { - case TYPE: - /* determine and dispatch block type */ - if (state->last) { - BYTEBITS(); - state->mode = DONE; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables1(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - - case STORED: - /* get and verify stored block length */ - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - - /* copy stored block from input to output */ - while (state->length != 0) { - copy = state->length; - PULL(); - ROOM(); - if (copy > have) copy = have; - if (copy > left) copy = left; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - - case TABLE: - /* get dynamic table entries descriptor */ - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - - /* get code length code lengths (not a typo) */ - state->have = 0; - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - - /* get length and distance code code lengths */ - state->have = 0; - while (state->have < state->nlen + state->ndist) { - for (;;) { - thisx = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if (thisx.val < 16) { - NEEDBITS(thisx.bits); - DROPBITS(thisx.bits); - state->lens[state->have++] = thisx.val; - } - else { - if (thisx.val == 16) { - NEEDBITS(thisx.bits + 2); - DROPBITS(thisx.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = (unsigned)(state->lens[state->have - 1]); - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (thisx.val == 17) { - NEEDBITS(thisx.bits + 3); - DROPBITS(thisx.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(thisx.bits + 7); - DROPBITS(thisx.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* build code tables */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN; - - case LEN: - /* use inflate_fast() if we have enough input and output */ - if (have >= 6 && left >= 258) { - RESTORE(); - if (state->whave < state->wsize) - state->whave = state->wsize - left; - inflate_fast(strm, state->wsize); - LOAD(); - break; - } - - /* get a literal, length, or end-of-block code */ - for (;;) { - thisx = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if (thisx.op && (thisx.op & 0xf0) == 0) { - last = thisx; - for (;;) { - thisx = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + thisx.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(thisx.bits); - state->length = (unsigned)thisx.val; - - /* process literal */ - if (thisx.op == 0) { - Tracevv((stderr, thisx.val >= 0x20 && thisx.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", thisx.val)); - ROOM(); - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - } - - /* process end of block */ - if (thisx.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - - /* invalid code */ - if (thisx.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - - /* length code -- get extra bits, if any */ - state->extra = (unsigned)(thisx.op) & 15; - if (state->extra != 0) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - - /* get distance code */ - for (;;) { - thisx = state->distcode[BITS(state->distbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if ((thisx.op & 0xf0) == 0) { - last = thisx; - for (;;) { - thisx = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + thisx.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(thisx.bits); - if (thisx.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)thisx.val; - - /* get distance extra bits, if any */ - state->extra = (unsigned)(thisx.op) & 15; - if (state->extra != 0) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - } - if (state->offset > state->wsize - (state->whave < state->wsize ? - left : 0)) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - - /* copy match from window to output */ - do { - ROOM(); - copy = state->wsize - state->offset; - if (copy < left) { - from = put + copy; - copy = left - copy; - } - else { - from = put - state->offset; - copy = left; - } - if (copy > state->length) copy = state->length; - state->length -= copy; - left -= copy; - do { - *put++ = *from++; - } while (--copy); - } while (state->length != 0); - break; - - case DONE: - /* inflate stream terminated properly -- write leftover output */ - ret = Z_STREAM_END; - if (left < state->wsize) { - if (out(out_desc, state->window, state->wsize - left)) - ret = Z_BUF_ERROR; - } - goto inf_leave; - - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - - default: /* can't happen, but makes compilers happy */ - ret = Z_STREAM_ERROR; - goto inf_leave; - } - - /* Return unused input */ - inf_leave: - strm->next_in = next; - strm->avail_in = have; - return ret; -} - -int ZEXPORT inflateBackEnd (z_streamp strm) -{ - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.c b/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.c deleted file mode 100755 index 6ac383d..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.c +++ /dev/null @@ -1,316 +0,0 @@ -/* inffast.c -- fast decoding - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifndef ASMINF - -/* Allow machine dependent optimization for post-increment or pre-increment. - Based on testing to date, - Pre-increment preferred for: - - PowerPC G3 (Adler) - - MIPS R5000 (Randers-Pehrson) - Post-increment preferred for: - - none - No measurable difference: - - Pentium III (Anderson) - - M68060 (Nikl) - */ -#ifdef POSTINC -# define OFF 0 -# define PUP(a) *(a)++ -#else -# define OFF 1 -# define PUP(a) *++(a) -#endif - -/* - Decode literal, length, and distance codes and write out the resulting - literal and match bytes until either not enough input or output is - available, an end-of-block is encountered, or a data error is encountered. - When large enough input and output buffers are supplied to inflate(), for - example, a 16K input buffer and a 64K output buffer, more than 95% of the - inflate execution time is spent in this routine. - - Entry assumptions: - - state->mode == LEN - strm->avail_in >= 6 - strm->avail_out >= 258 - start >= strm->avail_out - state->bits < 8 - - On return, state->mode is one of: - - LEN -- ran out of enough output space or enough available input - TYPE -- reached end of block code, inflate() to interpret next block - BAD -- error in block data - - Notes: - - - The maximum input bits used by a length/distance pair is 15 bits for the - length code, 5 bits for the length extra, 15 bits for the distance code, - and 13 bits for the distance extra. This totals 48 bits, or six bytes. - Therefore if strm->avail_in >= 6, then there is enough input to avoid - checking for available input while decoding. - - - The maximum bytes that a single length/distance pair can output is 258 - bytes, which is the maximum length that can be coded. inflate_fast() - requires strm->avail_out >= 258 for each loop to avoid checking for - output space. - */ -void inflate_fast (z_streamp strm, unsigned start) -{ - struct inflate_state FAR *state; - unsigned char FAR *in; /* local strm->next_in */ - unsigned char FAR *last; /* while in < last, enough input available */ - unsigned char FAR *out; /* local strm->next_out */ - unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ - unsigned char FAR *end; /* while out < end, enough space available */ -#ifdef INFLATE_STRICT - unsigned dmax; /* maximum distance from zlib header */ -#endif - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ - unsigned long hold; /* local strm->hold */ - unsigned bits; /* local strm->bits */ - code const FAR *lcode; /* local strm->lencode */ - code const FAR *dcode; /* local strm->distcode */ - unsigned lmask; /* mask for first level of length codes */ - unsigned dmask; /* mask for first level of distance codes */ - code thisx; /* retrieved table entry */ - unsigned op; /* code bits, operation, extra bits, or */ - /* window position, window bytes to copy */ - unsigned len; /* match length, unused bytes */ - unsigned dist; /* match distance */ - unsigned char FAR *from; /* where to copy match from */ - - /* copy state to local variables */ - state = (struct inflate_state FAR *)strm->state; - in = strm->next_in - OFF; - last = in + (strm->avail_in - 5); - out = strm->next_out - OFF; - beg = out - (start - strm->avail_out); - end = out + (strm->avail_out - 257); -#ifdef INFLATE_STRICT - dmax = state->dmax; -#endif - wsize = state->wsize; - whave = state->whave; - write = state->write; - window = state->window; - hold = state->hold; - bits = state->bits; - lcode = state->lencode; - dcode = state->distcode; - lmask = (1U << state->lenbits) - 1; - dmask = (1U << state->distbits) - 1; - - /* decode literals and length/distances until end-of-block or not enough - input data or output space */ - do { - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - thisx = lcode[hold & lmask]; - dolen: - op = (unsigned)(thisx.bits); - hold >>= op; - bits -= op; - op = (unsigned)(thisx.op); - if (op == 0) { /* literal */ - Tracevv((stderr, thisx.val >= 0x20 && thisx.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", thisx.val)); - PUP(out) = (unsigned char)(thisx.val); - } - else if (op & 16) { /* length base */ - len = (unsigned)(thisx.val); - op &= 15; /* number of extra bits */ - if (op) { - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - len += (unsigned)hold & ((1U << op) - 1); - hold >>= op; - bits -= op; - } - Tracevv((stderr, "inflate: length %u\n", len)); - if (bits < 15) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - thisx = dcode[hold & dmask]; - dodist: - op = (unsigned)(thisx.bits); - hold >>= op; - bits -= op; - op = (unsigned)(thisx.op); - if (op & 16) { /* distance base */ - dist = (unsigned)(thisx.val); - op &= 15; /* number of extra bits */ - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - if (bits < op) { - hold += (unsigned long)(PUP(in)) << bits; - bits += 8; - } - } - dist += (unsigned)hold & ((1U << op) - 1); -#ifdef INFLATE_STRICT - if (dist > dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - hold >>= op; - bits -= op; - Tracevv((stderr, "inflate: distance %u\n", dist)); - op = (unsigned)(out - beg); /* max distance in output */ - if (dist > op) { /* see if copy from window */ - op = dist - op; /* distance back in window */ - if (op > whave) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - from = window - OFF; - if (write == 0) { /* very common case */ - from += wsize - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - else if (write < op) { /* wrap around window */ - from += wsize + write - op; - op -= write; - if (op < len) { /* some from end of window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = window - OFF; - if (write < len) { /* some from start of window */ - op = write; - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - } - else { /* contiguous in window */ - from += write - op; - if (op < len) { /* some from window */ - len -= op; - do { - PUP(out) = PUP(from); - } while (--op); - from = out - dist; /* rest from output */ - } - } - while (len > 2) { - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - else { - from = out - dist; /* copy direct from output */ - do { /* minimum length is three */ - PUP(out) = PUP(from); - PUP(out) = PUP(from); - PUP(out) = PUP(from); - len -= 3; - } while (len > 2); - if (len) { - PUP(out) = PUP(from); - if (len > 1) - PUP(out) = PUP(from); - } - } - } - else if ((op & 64) == 0) { /* 2nd level distance code */ - thisx = dcode[thisx.val + (hold & ((1U << op) - 1))]; - goto dodist; - } - else { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - } - else if ((op & 64) == 0) { /* 2nd level length code */ - thisx = lcode[thisx.val + (hold & ((1U << op) - 1))]; - goto dolen; - } - else if (op & 32) { /* end-of-block */ - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - else { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - } while (in < last && out < end); - - /* return unused bytes (on entry, bits < 8, so in won't go too far back) */ - len = bits >> 3; - in -= len; - bits -= len << 3; - hold &= (1U << bits) - 1; - - /* update state and return */ - strm->next_in = in + OFF; - strm->next_out = out + OFF; - strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); - strm->avail_out = (unsigned)(out < end ? - 257 + (end - out) : 257 - (out - end)); - state->hold = hold; - state->bits = bits; - return; -} - -/* - inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - - Using bit fields for code structure - - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and write == 0 - - Special case for distance > 1 copies to do overlapped load and store copy - - Explicit branch predictions (based on measured branch probabilities) - - Deferring match copy and interspersed it with decoding subsequent codes - - Swapping literal/length else - - Swapping window/direct else - - Larger unrolled copy loops (three is about right) - - Moving len -= 3 statement into middle of loop - */ - -#endif /* !ASMINF */ diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.h b/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.h deleted file mode 100755 index 614fa78..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/inffast.h +++ /dev/null @@ -1,11 +0,0 @@ -/* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -void inflate_fast OF((z_streamp strm, unsigned start)); diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/inffixed.h b/JuceLibraryCode/modules/juce_core/zip/zlib/inffixed.h deleted file mode 100755 index 423d5c5..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/inffixed.h +++ /dev/null @@ -1,94 +0,0 @@ - /* inffixed.h -- table for decoding fixed codes - * Generated automatically by makefixed(). - */ - - /* WARNING: this file should *not* be used by applications. It - is part of the implementation of the compression library and - is subject to change. Applications should only use zlib.h. - */ - - static const code lenfix[512] = { - {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48}, - {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128}, - {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59}, - {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176}, - {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20}, - {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100}, - {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8}, - {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216}, - {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76}, - {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114}, - {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2}, - {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148}, - {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42}, - {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86}, - {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15}, - {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236}, - {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62}, - {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142}, - {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31}, - {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162}, - {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25}, - {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105}, - {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4}, - {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202}, - {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69}, - {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125}, - {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13}, - {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195}, - {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35}, - {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91}, - {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19}, - {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246}, - {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55}, - {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135}, - {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99}, - {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190}, - {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16}, - {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96}, - {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6}, - {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209}, - {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72}, - {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116}, - {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4}, - {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153}, - {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44}, - {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82}, - {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11}, - {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229}, - {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58}, - {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138}, - {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51}, - {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173}, - {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30}, - {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110}, - {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0}, - {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195}, - {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65}, - {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121}, - {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9}, - {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258}, - {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37}, - {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93}, - {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23}, - {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251}, - {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51}, - {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131}, - {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67}, - {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183}, - {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23}, - {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103}, - {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9}, - {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223}, - {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79}, - {0,9,255} - }; - - static const code distfix[32] = { - {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025}, - {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193}, - {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385}, - {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577}, - {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073}, - {22,5,193},{64,5,0} - }; diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.c b/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.c deleted file mode 100755 index eef0d37..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.c +++ /dev/null @@ -1,1339 +0,0 @@ -/* inflate.c -- zlib decompression - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * Change history: - * - * 1.2.beta0 24 Nov 2002 - * - First version -- complete rewrite of inflate to simplify code, avoid - * creation of window when not needed, minimize use of window when it is - * needed, make inffast.c even faster, implement gzip decoding, and to - * improve code readability and style over the previous zlib inflate code - * - * 1.2.beta1 25 Nov 2002 - * - Use pointers for available input and output checking in inffast.c - * - Remove input and output counters in inffast.c - * - Change inffast.c entry and loop from avail_in >= 7 to >= 6 - * - Remove unnecessary second byte pull from length extra in inffast.c - * - Unroll direct copy to three copies per loop in inffast.c - * - * 1.2.beta2 4 Dec 2002 - * - Change external routine names to reduce potential conflicts - * - Correct filename to inffixed.h for fixed tables in inflate.c - * - Make hbuf[] unsigned char to match parameter type in inflate.c - * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset) - * to avoid negation problem on Alphas (64 bit) in inflate.c - * - * 1.2.beta3 22 Dec 2002 - * - Add comments on state->bits assertion in inffast.c - * - Add comments on op field in inftrees.h - * - Fix bug in reuse of allocated window after inflateReset() - * - Remove bit fields--back to byte structure for speed - * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths - * - Change post-increments to pre-increments in inflate_fast(), PPC biased? - * - Add compile time option, POSTINC, to use post-increments instead (Intel?) - * - Make MATCH copy in inflate() much faster for when inflate_fast() not used - * - Use local copies of stream next and avail values, as well as local bit - * buffer and bit count in inflate()--for speed when inflate_fast() not used - * - * 1.2.beta4 1 Jan 2003 - * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings - * - Move a comment on output buffer sizes from inffast.c to inflate.c - * - Add comments in inffast.c to introduce the inflate_fast() routine - * - Rearrange window copies in inflate_fast() for speed and simplification - * - Unroll last copy for window match in inflate_fast() - * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common write == 0 case for speed in inflate_fast() - * - Make op and len in inflate_fast() unsigned for consistency - * - Add FAR to lcode and dcode declarations in inflate_fast() - * - Simplified bad distance check in inflate_fast() - * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new - * source file infback.c to provide a call-back interface to inflate for - * programs like gzip and unzip -- uses window as output buffer to avoid - * window copying - * - * 1.2.beta5 1 Jan 2003 - * - Improved inflateBack() interface to allow the caller to provide initial - * input in strm. - * - Fixed stored blocks bug in inflateBack() - * - * 1.2.beta6 4 Jan 2003 - * - Added comments in inffast.c on effectiveness of POSTINC - * - Typecasting all around to reduce compiler warnings - * - Changed loops from while (1) or do {} while (1) to for (;;), again to - * make compilers happy - * - Changed type of window in inflateBackInit() to unsigned char * - * - * 1.2.beta7 27 Jan 2003 - * - Changed many types to unsigned or unsigned short to avoid warnings - * - Added inflateCopy() function - * - * 1.2.0 9 Mar 2003 - * - Changed inflateBack() interface to provide separate opaque descriptors - * for the in() and out() functions - * - Changed inflateBack() argument and in_func typedef to swap the length - * and buffer address return values for the input function - * - Check next_in and next_out for Z_NULL on entry to inflate() - * - * The history for versions after 1.2.0 are in ChangeLog in zlib distribution. - */ - -#include "zutil.h" -#include "inftrees.h" -#include "inflate.h" -#include "inffast.h" - -#ifdef MAKEFIXED -# ifndef BUILDFIXED -# define BUILDFIXED -# endif -#endif - -/* function prototypes */ -local void fixedtables OF((struct inflate_state FAR *state)); -local int updatewindow OF((z_streamp strm, unsigned out)); -#ifdef BUILDFIXED - void makefixed OF((void)); -#endif -local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf, - unsigned len)); - -int ZEXPORT inflateReset (z_streamp strm) -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - strm->total_in = strm->total_out = state->total = 0; - strm->msg = Z_NULL; - strm->adler = 1; /* to support ill-conceived Java test suite */ - state->mode = HEAD; - state->last = 0; - state->havedict = 0; - state->dmax = 32768U; - state->head = Z_NULL; - state->wsize = 0; - state->whave = 0; - state->write = 0; - state->hold = 0; - state->bits = 0; - state->lencode = state->distcode = state->next = state->codes; - Tracev((stderr, "inflate: reset\n")); - return Z_OK; -} - -int ZEXPORT inflatePrime (z_streamp strm, int bits, int value) -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; - value &= (1 << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; - return Z_OK; -} - -int ZEXPORT inflateInit2_(z_streamp strm, int windowBits, const char *version, int stream_size) -{ - struct inflate_state FAR *state; - - if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || - stream_size != (int)(sizeof(z_stream))) - return Z_VERSION_ERROR; - if (strm == Z_NULL) return Z_STREAM_ERROR; - strm->msg = Z_NULL; /* in case we return an error */ - if (strm->zalloc == (alloc_func)0) { - strm->zalloc = zcalloc; - strm->opaque = (voidpf)0; - } - if (strm->zfree == (free_func)0) strm->zfree = zcfree; - state = (struct inflate_state FAR *) - ZALLOC(strm, 1, sizeof(struct inflate_state)); - if (state == Z_NULL) return Z_MEM_ERROR; - Tracev((stderr, "inflate: allocated\n")); - strm->state = (struct internal_state FAR *)state; - if (windowBits < 0) { - state->wrap = 0; - windowBits = -windowBits; - } - else { - state->wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) windowBits &= 15; -#endif - } - if (windowBits < 8 || windowBits > 15) { - ZFREE(strm, state); - strm->state = Z_NULL; - return Z_STREAM_ERROR; - } - state->wbits = (unsigned)windowBits; - state->window = Z_NULL; - return inflateReset(strm); -} - -int ZEXPORT inflateInit_ (z_streamp strm, const char *version, int stream_size) -{ - return inflateInit2_(strm, DEF_WBITS, version, stream_size); -} - -/* - Return state with length and distance decoding tables and index sizes set to - fixed code decoding. Normally this returns fixed tables from inffixed.h. - If BUILDFIXED is defined, then instead this routine builds the tables the - first time it's called, and returns those tables the first time and - thereafter. This reduces the size of the code by about 2K bytes, in - exchange for a little execution time. However, BUILDFIXED should not be - used for threaded applications, since the rewriting of the tables and virgin - may not be thread-safe. - */ -local void fixedtables (struct inflate_state FAR *state) -{ -#ifdef BUILDFIXED - static int virgin = 1; - static code *lenfix, *distfix; - static code fixed[544]; - - /* build fixed huffman tables if first call (may not be thread safe) */ - if (virgin) { - unsigned sym, bits; - static code *next; - - /* literal/length table */ - sym = 0; - while (sym < 144) state->lens[sym++] = 8; - while (sym < 256) state->lens[sym++] = 9; - while (sym < 280) state->lens[sym++] = 7; - while (sym < 288) state->lens[sym++] = 8; - next = fixed; - lenfix = next; - bits = 9; - inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work); - - /* distance table */ - sym = 0; - while (sym < 32) state->lens[sym++] = 5; - distfix = next; - bits = 5; - inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work); - - /* do this just once */ - virgin = 0; - } -#else /* !BUILDFIXED */ -# include "inffixed.h" -#endif /* BUILDFIXED */ - state->lencode = lenfix; - state->lenbits = 9; - state->distcode = distfix; - state->distbits = 5; -} - -#ifdef MAKEFIXED -#include - -/* - Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also - defines BUILDFIXED, so the tables are built on the fly. makefixed() writes - those tables to stdout, which would be piped to inffixed.h. A small program - can simply call makefixed to do this: - - void makefixed(void); - - int main(void) - { - makefixed(); - return 0; - } - - Then that can be linked with zlib built with MAKEFIXED defined and run: - - a.out > inffixed.h - */ -void makefixed() -{ - unsigned low, size; - struct inflate_state state; - - fixedtables(&state); - puts(" /* inffixed.h -- table for decoding fixed codes"); - puts(" * Generated automatically by makefixed()."); - puts(" */"); - puts(""); - puts(" /* WARNING: this file should *not* be used by applications."); - puts(" It is part of the implementation of this library and is"); - puts(" subject to change. Applications should only use zlib.h."); - puts(" */"); - puts(""); - size = 1U << 9; - printf(" static const code lenfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 7) == 0) printf("\n "); - printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits, - state.lencode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); - size = 1U << 5; - printf("\n static const code distfix[%u] = {", size); - low = 0; - for (;;) { - if ((low % 6) == 0) printf("\n "); - printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits, - state.distcode[low].val); - if (++low == size) break; - putchar(','); - } - puts("\n };"); -} -#endif /* MAKEFIXED */ - -/* - Update the window with the last wsize (normally 32K) bytes written before - returning. If window does not exist yet, create it. This is only called - when a window is already in use, or when output has been written during this - inflate call, but the end of the deflate stream has not been reached yet. - It is also called to create a window for dictionary data when a dictionary - is loaded. - - Providing output buffers larger than 32K to inflate() should provide a speed - advantage, since only the last 32K of output is copied to the sliding window - upon return from inflate(), and since all distances after the first 32K of - output will fall in the output data, making match copies simpler and faster. - The advantage may be dependent on the size of the processor's data caches. - */ -local int updatewindow (z_streamp strm, unsigned out) -{ - struct inflate_state FAR *state; - unsigned copy, dist; - - state = (struct inflate_state FAR *)strm->state; - - /* if it hasn't been done already, allocate space for the window */ - if (state->window == Z_NULL) { - state->window = (unsigned char FAR *) - ZALLOC(strm, 1U << state->wbits, - sizeof(unsigned char)); - if (state->window == Z_NULL) return 1; - } - - /* if window not in use yet, initialize */ - if (state->wsize == 0) { - state->wsize = 1U << state->wbits; - state->write = 0; - state->whave = 0; - } - - /* copy state->wsize or less output bytes into the circular window */ - copy = out - strm->avail_out; - if (copy >= state->wsize) { - zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); - state->write = 0; - state->whave = state->wsize; - } - else { - dist = state->wsize - state->write; - if (dist > copy) dist = copy; - zmemcpy(state->window + state->write, strm->next_out - copy, dist); - copy -= dist; - if (copy) { - zmemcpy(state->window, strm->next_out - copy, copy); - state->write = copy; - state->whave = state->wsize; - } - else { - state->write += dist; - if (state->write == state->wsize) state->write = 0; - if (state->whave < state->wsize) state->whave += dist; - } - } - return 0; -} - -/* Macros for inflate(): */ - -/* check function to use adler32() for zlib or crc32() for gzip */ -#ifdef GUNZIP -# define UPDATE(check, buf, len) \ - (state->flags ? crc32(check, buf, len) : adler32(check, buf, len)) -#else -# define UPDATE(check, buf, len) adler32(check, buf, len) -#endif - -/* check macros for header crc */ -#ifdef GUNZIP -# define CRC2(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - check = crc32(check, hbuf, 2); \ - } while (0) - -# define CRC4(check, word) \ - do { \ - hbuf[0] = (unsigned char)(word); \ - hbuf[1] = (unsigned char)((word) >> 8); \ - hbuf[2] = (unsigned char)((word) >> 16); \ - hbuf[3] = (unsigned char)((word) >> 24); \ - check = crc32(check, hbuf, 4); \ - } while (0) -#endif - -/* Load registers with state in inflate() for speed */ -#define LOAD() \ - do { \ - put = strm->next_out; \ - left = strm->avail_out; \ - next = strm->next_in; \ - have = strm->avail_in; \ - hold = state->hold; \ - bits = state->bits; \ - } while (0) - -/* Restore state from registers in inflate() */ -#define RESTORE() \ - do { \ - strm->next_out = put; \ - strm->avail_out = left; \ - strm->next_in = next; \ - strm->avail_in = have; \ - state->hold = hold; \ - state->bits = bits; \ - } while (0) - -/* Clear the input bit accumulator */ -#define INITBITS() \ - do { \ - hold = 0; \ - bits = 0; \ - } while (0) - -/* Get a byte of input into the bit accumulator, or return from inflate() - if there is no input available. */ -#define PULLBYTE() \ - do { \ - if (have == 0) goto inf_leave; \ - have--; \ - hold += (unsigned long)(*next++) << bits; \ - bits += 8; \ - } while (0) - -/* Assure that there are at least n bits in the bit accumulator. If there is - not enough available input to do that, then return from inflate(). */ -#define NEEDBITS(n) \ - do { \ - while (bits < (unsigned)(n)) \ - PULLBYTE(); \ - } while (0) - -/* Return the low n bits of the bit accumulator (n < 16) */ -#define BITS(n) \ - ((unsigned)hold & ((1U << (n)) - 1)) - -/* Remove n bits from the bit accumulator */ -#define DROPBITS(n) \ - do { \ - hold >>= (n); \ - bits -= (unsigned)(n); \ - } while (0) - -/* Remove zero to seven bits as needed to go to a byte boundary */ -#define BYTEBITS() \ - do { \ - hold >>= bits & 7; \ - bits -= bits & 7; \ - } while (0) - -/* Reverse the bytes in a 32-bit value */ -#define REVERSE(q) \ - ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \ - (((q) & 0xff00) << 8) + (((q) & 0xff) << 24)) - -/* - inflate() uses a state machine to process as much input data and generate as - much output data as possible before returning. The state machine is - structured roughly as follows: - - for (;;) switch (state) { - ... - case STATEn: - if (not enough input data or output space to make progress) - return; - ... make progress ... - state = STATEm; - break; - ... - } - - so when inflate() is called again, the same case is attempted again, and - if the appropriate resources are provided, the machine proceeds to the - next state. The NEEDBITS() macro is usually the way the state evaluates - whether it can proceed or should return. NEEDBITS() does the return if - the requested bits are not available. The typical use of the BITS macros - is: - - NEEDBITS(n); - ... do something with BITS(n) ... - DROPBITS(n); - - where NEEDBITS(n) either returns from inflate() if there isn't enough - input left to load n bits into the accumulator, or it continues. BITS(n) - gives the low n bits in the accumulator. When done, DROPBITS(n) drops - the low n bits off the accumulator. INITBITS() clears the accumulator - and sets the number of available bits to zero. BYTEBITS() discards just - enough bits to put the accumulator on a byte boundary. After BYTEBITS() - and a NEEDBITS(8), then BITS(8) would return the next byte in the stream. - - NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return - if there is no input available. The decoding of variable length codes uses - PULLBYTE() directly in order to pull just enough bytes to decode the next - code, and no more. - - Some states loop until they get enough input, making sure that enough - state information is maintained to continue the loop where it left off - if NEEDBITS() returns in the loop. For example, want, need, and keep - would all have to actually be part of the saved state in case NEEDBITS() - returns: - - case STATEw: - while (want < need) { - NEEDBITS(n); - keep[want++] = BITS(n); - DROPBITS(n); - } - state = STATEx; - case STATEx: - - As shown above, if the next state is also the next case, then the break - is omitted. - - A state may also return if there is not enough output space available to - complete that state. Those states are copying stored data, writing a - literal byte, and copying a matching string. - - When returning, a "goto inf_leave" is used to update the total counters, - update the check value, and determine whether any progress has been made - during that inflate() call in order to return the proper return code. - Progress is defined as a change in either strm->avail_in or strm->avail_out. - When there is a window, goto inf_leave will update the window with the last - output written. If a goto inf_leave occurs in the middle of decompression - and there is no window currently, goto inf_leave will create one and copy - output to the window for the next call of inflate(). - - In this implementation, the flush parameter of inflate() only affects the - return code (per zlib.h). inflate() always writes as much as possible to - strm->next_out, given the space available and the provided input--the effect - documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers - the allocation of and copying into a sliding window until necessary, which - provides the effect documented in zlib.h for Z_FINISH when the entire input - stream available. So the only thing the flush parameter actually does is: - when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it - will return Z_BUF_ERROR if it has not reached the end of the stream. - */ - -int ZEXPORT inflate (z_streamp strm, int flush) -{ - struct inflate_state FAR *state; - unsigned char FAR *next; /* next input */ - unsigned char FAR *put; /* next output */ - unsigned have, left; /* available input and output */ - unsigned long hold; /* bit buffer */ - unsigned bits; /* bits in bit buffer */ - unsigned in, out; /* save starting available input and output */ - unsigned copy; /* number of stored or match bytes to copy */ - unsigned char FAR *from; /* where to copy match bytes from */ - code thisx; /* current decoding table entry */ - code last; /* parent table entry */ - unsigned len; /* length to copy for repeats, bits to drop */ - int ret; /* return code */ -#ifdef GUNZIP - unsigned char hbuf[4]; /* buffer for gzip header crc calculation */ -#endif - static const unsigned short order[19] = /* permutation of code lengths */ - {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL || - (strm->next_in == Z_NULL && strm->avail_in != 0)) - return Z_STREAM_ERROR; - - state = (struct inflate_state FAR *)strm->state; - if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */ - LOAD(); - in = have; - out = left; - ret = Z_OK; - for (;;) - switch (state->mode) { - case HEAD: - if (state->wrap == 0) { - state->mode = TYPEDO; - break; - } - NEEDBITS(16); -#ifdef GUNZIP - if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */ - state->check = crc32(0L, Z_NULL, 0); - CRC2(state->check, hold); - INITBITS(); - state->mode = FLAGS; - break; - } - state->flags = 0; /* expect zlib header */ - if (state->head != Z_NULL) - state->head->done = -1; - if (!(state->wrap & 1) || /* check if zlib header allowed */ -#else - if ( -#endif - ((BITS(8) << 8) + (hold >> 8)) % 31) { - strm->msg = (char *)"incorrect header check"; - state->mode = BAD; - break; - } - if (BITS(4) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - DROPBITS(4); - len = BITS(4) + 8; - if (len > state->wbits) { - strm->msg = (char *)"invalid window size"; - state->mode = BAD; - break; - } - state->dmax = 1U << len; - Tracev((stderr, "inflate: zlib header ok\n")); - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = hold & 0x200 ? DICTID : TYPE; - INITBITS(); - break; -#ifdef GUNZIP - case FLAGS: - NEEDBITS(16); - state->flags = (int)(hold); - if ((state->flags & 0xff) != Z_DEFLATED) { - strm->msg = (char *)"unknown compression method"; - state->mode = BAD; - break; - } - if (state->flags & 0xe000) { - strm->msg = (char *)"unknown header flags set"; - state->mode = BAD; - break; - } - if (state->head != Z_NULL) - state->head->text = (int)((hold >> 8) & 1); - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = TIME; - case TIME: - NEEDBITS(32); - if (state->head != Z_NULL) - state->head->time = hold; - if (state->flags & 0x0200) CRC4(state->check, hold); - INITBITS(); - state->mode = OS; - case OS: - NEEDBITS(16); - if (state->head != Z_NULL) { - state->head->xflags = (int)(hold & 0xff); - state->head->os = (int)(hold >> 8); - } - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - state->mode = EXLEN; - case EXLEN: - if (state->flags & 0x0400) { - NEEDBITS(16); - state->length = (unsigned)(hold); - if (state->head != Z_NULL) - state->head->extra_len = (unsigned)hold; - if (state->flags & 0x0200) CRC2(state->check, hold); - INITBITS(); - } - else if (state->head != Z_NULL) - state->head->extra = Z_NULL; - state->mode = EXTRA; - case EXTRA: - if (state->flags & 0x0400) { - copy = state->length; - if (copy > have) copy = have; - if (copy) { - if (state->head != Z_NULL && - state->head->extra != Z_NULL) { - len = state->head->extra_len - state->length; - zmemcpy(state->head->extra + len, next, - len + copy > state->head->extra_max ? - state->head->extra_max - len : copy); - } - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - state->length -= copy; - } - if (state->length) goto inf_leave; - } - state->length = 0; - state->mode = NAME; - case NAME: - if (state->flags & 0x0800) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->name != Z_NULL && - state->length < state->head->name_max) - state->head->name[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->name = Z_NULL; - state->length = 0; - state->mode = COMMENT; - case COMMENT: - if (state->flags & 0x1000) { - if (have == 0) goto inf_leave; - copy = 0; - do { - len = (unsigned)(next[copy++]); - if (state->head != Z_NULL && - state->head->comment != Z_NULL && - state->length < state->head->comm_max) - state->head->comment[state->length++] = len; - } while (len && copy < have); - if (state->flags & 0x0200) - state->check = crc32(state->check, next, copy); - have -= copy; - next += copy; - if (len) goto inf_leave; - } - else if (state->head != Z_NULL) - state->head->comment = Z_NULL; - state->mode = HCRC; - case HCRC: - if (state->flags & 0x0200) { - NEEDBITS(16); - if (hold != (state->check & 0xffff)) { - strm->msg = (char *)"header crc mismatch"; - state->mode = BAD; - break; - } - INITBITS(); - } - if (state->head != Z_NULL) { - state->head->hcrc = (int)((state->flags >> 9) & 1); - state->head->done = 1; - } - strm->adler = state->check = crc32(0L, Z_NULL, 0); - state->mode = TYPE; - break; -#endif - case DICTID: - NEEDBITS(32); - strm->adler = state->check = REVERSE(hold); - INITBITS(); - state->mode = DICT; - case DICT: - if (state->havedict == 0) { - RESTORE(); - return Z_NEED_DICT; - } - strm->adler = state->check = adler32(0L, Z_NULL, 0); - state->mode = TYPE; - case TYPE: - if (flush == Z_BLOCK) goto inf_leave; - case TYPEDO: - if (state->last) { - BYTEBITS(); - state->mode = CHECK; - break; - } - NEEDBITS(3); - state->last = BITS(1); - DROPBITS(1); - switch (BITS(2)) { - case 0: /* stored block */ - Tracev((stderr, "inflate: stored block%s\n", - state->last ? " (last)" : "")); - state->mode = STORED; - break; - case 1: /* fixed block */ - fixedtables(state); - Tracev((stderr, "inflate: fixed codes block%s\n", - state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ - break; - case 2: /* dynamic block */ - Tracev((stderr, "inflate: dynamic codes block%s\n", - state->last ? " (last)" : "")); - state->mode = TABLE; - break; - case 3: - strm->msg = (char *)"invalid block type"; - state->mode = BAD; - } - DROPBITS(2); - break; - case STORED: - BYTEBITS(); /* go to byte boundary */ - NEEDBITS(32); - if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) { - strm->msg = (char *)"invalid stored block lengths"; - state->mode = BAD; - break; - } - state->length = (unsigned)hold & 0xffff; - Tracev((stderr, "inflate: stored length %u\n", - state->length)); - INITBITS(); - state->mode = COPY; - case COPY: - copy = state->length; - if (copy) { - if (copy > have) copy = have; - if (copy > left) copy = left; - if (copy == 0) goto inf_leave; - zmemcpy(put, next, copy); - have -= copy; - next += copy; - left -= copy; - put += copy; - state->length -= copy; - break; - } - Tracev((stderr, "inflate: stored end\n")); - state->mode = TYPE; - break; - case TABLE: - NEEDBITS(14); - state->nlen = BITS(5) + 257; - DROPBITS(5); - state->ndist = BITS(5) + 1; - DROPBITS(5); - state->ncode = BITS(4) + 4; - DROPBITS(4); -#ifndef PKZIP_BUG_WORKAROUND - if (state->nlen > 286 || state->ndist > 30) { - strm->msg = (char *)"too many length or distance symbols"; - state->mode = BAD; - break; - } -#endif - Tracev((stderr, "inflate: table sizes ok\n")); - state->have = 0; - state->mode = LENLENS; - case LENLENS: - while (state->have < state->ncode) { - NEEDBITS(3); - state->lens[order[state->have++]] = (unsigned short)BITS(3); - DROPBITS(3); - } - while (state->have < 19) - state->lens[order[state->have++]] = 0; - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 7; - ret = inflate_table(CODES, state->lens, 19, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid code lengths set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: code lengths ok\n")); - state->have = 0; - state->mode = CODELENS; - case CODELENS: - while (state->have < state->nlen + state->ndist) { - for (;;) { - thisx = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if (thisx.val < 16) { - NEEDBITS(thisx.bits); - DROPBITS(thisx.bits); - state->lens[state->have++] = thisx.val; - } - else { - if (thisx.val == 16) { - NEEDBITS(thisx.bits + 2); - DROPBITS(thisx.bits); - if (state->have == 0) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - len = state->lens[state->have - 1]; - copy = 3 + BITS(2); - DROPBITS(2); - } - else if (thisx.val == 17) { - NEEDBITS(thisx.bits + 3); - DROPBITS(thisx.bits); - len = 0; - copy = 3 + BITS(3); - DROPBITS(3); - } - else { - NEEDBITS(thisx.bits + 7); - DROPBITS(thisx.bits); - len = 0; - copy = 11 + BITS(7); - DROPBITS(7); - } - if (state->have + copy > state->nlen + state->ndist) { - strm->msg = (char *)"invalid bit length repeat"; - state->mode = BAD; - break; - } - while (copy--) - state->lens[state->have++] = (unsigned short)len; - } - } - - /* handle error breaks in while */ - if (state->mode == BAD) break; - - /* build code tables */ - state->next = state->codes; - state->lencode = (code const FAR *)(state->next); - state->lenbits = 9; - ret = inflate_table(LENS, state->lens, state->nlen, &(state->next), - &(state->lenbits), state->work); - if (ret) { - strm->msg = (char *)"invalid literal/lengths set"; - state->mode = BAD; - break; - } - state->distcode = (code const FAR *)(state->next); - state->distbits = 6; - ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist, - &(state->next), &(state->distbits), state->work); - if (ret) { - strm->msg = (char *)"invalid distances set"; - state->mode = BAD; - break; - } - Tracev((stderr, "inflate: codes ok\n")); - state->mode = LEN; - case LEN: - if (have >= 6 && left >= 258) { - RESTORE(); - inflate_fast(strm, out); - LOAD(); - break; - } - for (;;) { - thisx = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if (thisx.op && (thisx.op & 0xf0) == 0) { - last = thisx; - for (;;) { - thisx = state->lencode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + thisx.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(thisx.bits); - state->length = (unsigned)thisx.val; - if ((int)(thisx.op) == 0) { - Tracevv((stderr, thisx.val >= 0x20 && thisx.val < 0x7f ? - "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", thisx.val)); - state->mode = LIT; - break; - } - if (thisx.op & 32) { - Tracevv((stderr, "inflate: end of block\n")); - state->mode = TYPE; - break; - } - if (thisx.op & 64) { - strm->msg = (char *)"invalid literal/length code"; - state->mode = BAD; - break; - } - state->extra = (unsigned)(thisx.op) & 15; - state->mode = LENEXT; - case LENEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->length += BITS(state->extra); - DROPBITS(state->extra); - } - Tracevv((stderr, "inflate: length %u\n", state->length)); - state->mode = DIST; - case DIST: - for (;;) { - thisx = state->distcode[BITS(state->distbits)]; - if ((unsigned)(thisx.bits) <= bits) break; - PULLBYTE(); - } - if ((thisx.op & 0xf0) == 0) { - last = thisx; - for (;;) { - thisx = state->distcode[last.val + - (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + thisx.bits) <= bits) break; - PULLBYTE(); - } - DROPBITS(last.bits); - } - DROPBITS(thisx.bits); - if (thisx.op & 64) { - strm->msg = (char *)"invalid distance code"; - state->mode = BAD; - break; - } - state->offset = (unsigned)thisx.val; - state->extra = (unsigned)(thisx.op) & 15; - state->mode = DISTEXT; - case DISTEXT: - if (state->extra) { - NEEDBITS(state->extra); - state->offset += BITS(state->extra); - DROPBITS(state->extra); - } -#ifdef INFLATE_STRICT - if (state->offset > state->dmax) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } -#endif - if (state->offset > state->whave + out - left) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } - Tracevv((stderr, "inflate: distance %u\n", state->offset)); - state->mode = MATCH; - case MATCH: - if (left == 0) goto inf_leave; - copy = out - left; - if (state->offset > copy) { /* copy from window */ - copy = state->offset - copy; - if (copy > state->write) { - copy -= state->write; - from = state->window + (state->wsize - copy); - } - else - from = state->window + (state->write - copy); - if (copy > state->length) copy = state->length; - } - else { /* copy from output */ - from = put - state->offset; - copy = state->length; - } - if (copy > left) copy = left; - left -= copy; - state->length -= copy; - do { - *put++ = *from++; - } while (--copy); - if (state->length == 0) state->mode = LEN; - break; - case LIT: - if (left == 0) goto inf_leave; - *put++ = (unsigned char)(state->length); - left--; - state->mode = LEN; - break; - case CHECK: - if (state->wrap) { - NEEDBITS(32); - out -= left; - strm->total_out += out; - state->total += out; - if (out) - strm->adler = state->check = - UPDATE(state->check, put - out, out); - out = left; - if (( -#ifdef GUNZIP - state->flags ? hold : -#endif - REVERSE(hold)) != state->check) { - strm->msg = (char *)"incorrect data check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: check matches trailer\n")); - } -#ifdef GUNZIP - state->mode = LENGTH; - case LENGTH: - if (state->wrap && state->flags) { - NEEDBITS(32); - if (hold != (state->total & 0xffffffffUL)) { - strm->msg = (char *)"incorrect length check"; - state->mode = BAD; - break; - } - INITBITS(); - Tracev((stderr, "inflate: length matches trailer\n")); - } -#endif - state->mode = DONE; - case DONE: - ret = Z_STREAM_END; - goto inf_leave; - case BAD: - ret = Z_DATA_ERROR; - goto inf_leave; - case MEM: - return Z_MEM_ERROR; - case SYNC: - default: - return Z_STREAM_ERROR; - } - - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ - inf_leave: - RESTORE(); - if (state->wsize || (state->mode < CHECK && out != strm->avail_out)) - if (updatewindow(strm, out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - in -= strm->avail_in; - out -= strm->avail_out; - strm->total_in += in; - strm->total_out += out; - state->total += out; - if (state->wrap && out) - strm->adler = state->check = - UPDATE(state->check, strm->next_out - out, out); - strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0); - if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) - ret = Z_BUF_ERROR; - return ret; -} - -int ZEXPORT inflateEnd (z_streamp strm) -{ - struct inflate_state FAR *state; - if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->window != Z_NULL) ZFREE(strm, state->window); - ZFREE(strm, strm->state); - strm->state = Z_NULL; - Tracev((stderr, "inflate: end\n")); - return Z_OK; -} - -int ZEXPORT inflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength) -{ - struct inflate_state FAR *state; - unsigned long id_; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (state->wrap != 0 && state->mode != DICT) - return Z_STREAM_ERROR; - - /* check for correct dictionary id */ - if (state->mode == DICT) { - id_ = adler32(0L, Z_NULL, 0); - id_ = adler32(id_, dictionary, dictLength); - if (id_ != state->check) - return Z_DATA_ERROR; - } - - /* copy dictionary to window */ - if (updatewindow(strm, strm->avail_out)) { - state->mode = MEM; - return Z_MEM_ERROR; - } - if (dictLength > state->wsize) { - zmemcpy(state->window, dictionary + dictLength - state->wsize, - state->wsize); - state->whave = state->wsize; - } - else { - zmemcpy(state->window + state->wsize - dictLength, dictionary, - dictLength); - state->whave = dictLength; - } - state->havedict = 1; - Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; -} - -int ZEXPORT inflateGetHeader (z_streamp strm, gz_headerp head) -{ - struct inflate_state FAR *state; - - /* check state */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if ((state->wrap & 2) == 0) return Z_STREAM_ERROR; - - /* save header structure */ - state->head = head; - head->done = 0; - return Z_OK; -} - -/* - Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found - or when out of input. When called, *have is the number of pattern bytes - found in order so far, in 0..3. On return *have is updated to the new - state. If on return *have equals four, then the pattern was found and the - return value is how many bytes were read including the last byte of the - pattern. If *have is less than four, then the pattern has not been found - yet and the return value is len. In the latter case, syncsearch() can be - called again with more data and the *have state. *have is initialized to - zero for the first call. - */ -local unsigned syncsearch (unsigned FAR *have, unsigned char FAR *buf, unsigned len) -{ - unsigned got; - unsigned next; - - got = *have; - next = 0; - while (next < len && got < 4) { - if ((int)(buf[next]) == (got < 2 ? 0 : 0xff)) - got++; - else if (buf[next]) - got = 0; - else - got = 4 - got; - next++; - } - *have = got; - return next; -} - -int ZEXPORT inflateSync (z_streamp strm) -{ - unsigned len; /* number of bytes to look at or looked at */ - unsigned long in, out; /* temporary to save total_in and total_out */ - unsigned char buf[4]; /* to restore bit buffer to byte string */ - struct inflate_state FAR *state; - - /* check parameters */ - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR; - - /* if first time, start search in bit buffer */ - if (state->mode != SYNC) { - state->mode = SYNC; - state->hold <<= state->bits & 7; - state->bits -= state->bits & 7; - len = 0; - while (state->bits >= 8) { - buf[len++] = (unsigned char)(state->hold); - state->hold >>= 8; - state->bits -= 8; - } - state->have = 0; - syncsearch(&(state->have), buf, len); - } - - /* search available input */ - len = syncsearch(&(state->have), strm->next_in, strm->avail_in); - strm->avail_in -= len; - strm->next_in += len; - strm->total_in += len; - - /* return no joy or set up to restart inflate() on a new block */ - if (state->have != 4) return Z_DATA_ERROR; - in = strm->total_in; out = strm->total_out; - inflateReset(strm); - strm->total_in = in; strm->total_out = out; - state->mode = TYPE; - return Z_OK; -} - -/* - Returns true if inflate is currently at the end of a block generated by - Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - implementation to provide an additional safety check. PPP uses - Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored - block. When decompressing, PPP checks that at the end of input packet, - inflate is waiting for these length bytes. - */ -int ZEXPORT inflateSyncPoint (z_streamp strm) -{ - struct inflate_state FAR *state; - - if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)strm->state; - return state->mode == STORED && state->bits == 0; -} - -int ZEXPORT inflateCopy(z_streamp dest, z_streamp source) -{ - struct inflate_state FAR *state; - struct inflate_state FAR *copy; - unsigned char FAR *window; - unsigned wsize; - - /* check input */ - if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL || - source->zalloc == (alloc_func)0 || source->zfree == (free_func)0) - return Z_STREAM_ERROR; - state = (struct inflate_state FAR *)source->state; - - /* allocate space */ - copy = (struct inflate_state FAR *) - ZALLOC(source, 1, sizeof(struct inflate_state)); - if (copy == Z_NULL) return Z_MEM_ERROR; - window = Z_NULL; - if (state->window != Z_NULL) { - window = (unsigned char FAR *) - ZALLOC(source, 1U << state->wbits, sizeof(unsigned char)); - if (window == Z_NULL) { - ZFREE(source, copy); - return Z_MEM_ERROR; - } - } - - /* copy state */ - zmemcpy(dest, source, sizeof(z_stream)); - zmemcpy(copy, state, sizeof(struct inflate_state)); - if (state->lencode >= state->codes && - state->lencode <= state->codes + ENOUGH - 1) { - copy->lencode = copy->codes + (state->lencode - state->codes); - copy->distcode = copy->codes + (state->distcode - state->codes); - } - copy->next = copy->codes + (state->next - state->codes); - if (window != Z_NULL) { - wsize = 1U << state->wbits; - zmemcpy(window, state->window, wsize); - } - copy->window = window; - dest->state = (struct internal_state FAR *)copy; - return Z_OK; -} diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.h b/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.h deleted file mode 100755 index 31b1279..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/inflate.h +++ /dev/null @@ -1,121 +0,0 @@ -/* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2004 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -#ifndef _INFLATE_H_ -#define _INFLATE_H_ - -/* define NO_GZIP when compiling if you want to disable gzip header and - trailer decoding by inflate(). NO_GZIP would be used to avoid linking in - the crc code when it is not needed. For shared libraries, gzip decoding - should be left enabled. */ -#ifndef NO_GZIP -# define GUNZIP -#endif - -/* Possible inflate modes between inflate() calls */ -typedef enum { - HEAD, /* i: waiting for magic header */ - FLAGS, /* i: waiting for method and flags (gzip) */ - TIME, /* i: waiting for modification time (gzip) */ - OS, /* i: waiting for extra flags and operating system (gzip) */ - EXLEN, /* i: waiting for extra length (gzip) */ - EXTRA, /* i: waiting for extra bytes (gzip) */ - NAME, /* i: waiting for end of file name (gzip) */ - COMMENT, /* i: waiting for end of comment (gzip) */ - HCRC, /* i: waiting for header crc (gzip) */ - DICTID, /* i: waiting for dictionary check value */ - DICT, /* waiting for inflateSetDictionary() call */ - TYPE, /* i: waiting for type bits, including last-flag bit */ - TYPEDO, /* i: same, but skip check to exit inflate on new block */ - STORED, /* i: waiting for stored size (length and complement) */ - COPY, /* i/o: waiting for input or output to copy stored block */ - TABLE, /* i: waiting for dynamic block table lengths */ - LENLENS, /* i: waiting for code length code lengths */ - CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN, /* i: waiting for length/lit code */ - LENEXT, /* i: waiting for length extra bits */ - DIST, /* i: waiting for distance code */ - DISTEXT, /* i: waiting for distance extra bits */ - MATCH, /* o: waiting for output space to copy string */ - LIT, /* o: waiting for output space to write literal */ - CHECK, /* i: waiting for 32-bit check value */ - LENGTH, /* i: waiting for 32-bit length (gzip) */ - DONE, /* finished check, done -- remain here until reset */ - BAD, /* got a data error -- remain here until reset */ - MEM, /* got an inflate() memory error -- remain here until reset */ - SYNC /* looking for synchronization bytes to restart inflate() */ -} inflate_mode; - -/* - State transitions between above modes - - - (most modes can go to the BAD or MEM mode -- not shown for clarity) - - Process header: - HEAD -> (gzip) or (zlib) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME - NAME -> COMMENT -> HCRC -> TYPE - (zlib) -> DICTID or TYPE - DICTID -> DICT -> TYPE - Read deflate blocks: - TYPE -> STORED or TABLE or LEN or CHECK - STORED -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN - Read deflate codes: - LEN -> LENEXT or LIT or TYPE - LENEXT -> DIST -> DISTEXT -> MATCH -> LEN - LIT -> LEN - Process trailer: - CHECK -> LENGTH -> DONE - */ - -/* state maintained between inflate() calls. Approximately 7K bytes. */ -struct inflate_state { - inflate_mode mode; /* current inflate mode */ - int last; /* true if processing last block */ - int wrap; /* bit 0 true for zlib, bit 1 true for gzip */ - int havedict; /* true if dictionary provided */ - int flags; /* gzip header method and flags (0 if zlib) */ - unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */ - unsigned long check; /* protected copy of check value */ - unsigned long total; /* protected copy of output count */ - gz_headerp head; /* where to save gzip header information */ - /* sliding window */ - unsigned wbits; /* log base 2 of requested window size */ - unsigned wsize; /* window size or zero if not using window */ - unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ - unsigned char FAR *window; /* allocated sliding window, if needed */ - /* bit accumulator */ - unsigned long hold; /* input bit accumulator */ - unsigned bits; /* number of bits in "in" */ - /* for string and stored block copying */ - unsigned length; /* literal or length of data to copy */ - unsigned offset; /* distance back to copy string from */ - /* for table and code decoding */ - unsigned extra; /* extra bits needed */ - /* fixed and dynamic code tables */ - code const FAR *lencode; /* starting table for length/literal codes */ - code const FAR *distcode; /* starting table for distance codes */ - unsigned lenbits; /* index bits for lencode */ - unsigned distbits; /* index bits for distcode */ - /* dynamic table building */ - unsigned ncode; /* number of code length code lengths */ - unsigned nlen; /* number of length code lengths */ - unsigned ndist; /* number of distance code lengths */ - unsigned have; /* number of code lengths in lens[] */ - code FAR *next; /* next available space in codes[] */ - unsigned short lens[320]; /* temporary storage for code lengths */ - unsigned short work[288]; /* work area for code table building */ - code codes[ENOUGH]; /* space for code tables */ -}; - - -#endif diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.c b/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.c deleted file mode 100755 index dfc0aa7..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.c +++ /dev/null @@ -1,328 +0,0 @@ -/* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -#include "zutil.h" -#include "inftrees.h" - -#define MAXBITS 15 - -const char inflate_copyright[] = - " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; -/* - If you use the zlib library in a product, an acknowledgment is welcome - in the documentation of your product. If for some reason you cannot - include such an acknowledgment, I would appreciate that you keep this - copyright string in the executable of your product. - */ - -/* - Build a set of tables to decode the provided canonical Huffman code. - The code lengths are lens[0..codes-1]. The result starts at *table, - whose indices are 0..2^bits-1. work is a writable array of at least - lens shorts, which is used as a work area. type is the type of code - to be generated, CODES, LENS, or DISTS. On return, zero is success, - -1 is an invalid code, and +1 means that ENOUGH isn't enough. table - on return points to the next available entry's address. bits is the - requested root table index bits, and on return it is the actual root - table index bits. It will differ if the request is greater than the - longest code or if it is less than the shortest code. - */ -int inflate_table (codetype type, - unsigned short FAR *lens, - unsigned codes, - code FAR * FAR *table, - unsigned FAR *bits, - unsigned short FAR *work) -{ - unsigned len; /* a code's length in bits */ - unsigned sym; /* index of code symbols */ - unsigned min, max; /* minimum and maximum code lengths */ - unsigned root; /* number of index bits for root table */ - unsigned curr; /* number of index bits for current table */ - unsigned drop; /* code bits to drop for sub-table */ - int left; /* number of prefix codes available */ - unsigned used; /* code entries in table used */ - unsigned huff; /* Huffman code */ - unsigned incr; /* for incrementing code, index */ - unsigned fill; /* index for replicating entries */ - unsigned low; /* low bits for current root entry */ - unsigned mask; /* mask for low root bits */ - code thisx; /* table entry for duplication */ - code FAR *next; /* next available space in table */ - const unsigned short FAR *base; /* base value table to use */ - const unsigned short FAR *extra; /* extra bits table to use */ - int end; /* use base and extra for symbol > end */ - unsigned short count[MAXBITS+1]; /* number of codes of each length */ - unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ - static const unsigned short lbase[31] = { /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - static const unsigned short lext[31] = { /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; - static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0}; - static const unsigned short dext[32] = { /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64}; - - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. - - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. - - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. - */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) - count[len] = 0; - for (sym = 0; sym < codes; sym++) - count[lens[sym]]++; - - /* bound code lengths, force root to be within code lengths */ - root = *bits; - for (max = MAXBITS; max >= 1; max--) - if (count[max] != 0) break; - if (root > max) root = max; - if (max == 0) { /* no symbols to code at all */ - thisx.op = (unsigned char)64; /* invalid code marker */ - thisx.bits = (unsigned char)1; - thisx.val = (unsigned short)0; - *(*table)++ = thisx; /* make a table to force an error */ - *(*table)++ = thisx; - *bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min <= MAXBITS; min++) - if (count[min] != 0) break; - if (root < min) root = min; - - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) return -1; /* over-subscribed */ - } - if (left > 0 && (type == CODES || max != 1)) - return -1; /* incomplete set */ - - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) - offs[len + 1] = offs[len] + count[len]; - - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) - if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym; - - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. - - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. - - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked when a LENS table is being made - against the space in *table, ENOUGH, minus the maximum space needed by - the worst case distance code, MAXD. This should never happen, but the - sufficiency of ENOUGH has not been proven exhaustively, hence the check. - This assumes that when type == LENS, bits == 9. - - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ - - /* set up for code type */ - switch (type) { - case CODES: - base = extra = work; /* dummy value--not used */ - end = 19; - break; - case LENS: - base = lbase; - base -= 257; - extra = lext; - extra -= 257; - end = 256; - break; - default: /* DISTS */ - base = dbase; - extra = dext; - end = -1; - } - - /* initialize state for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = *table; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = (unsigned)(-1); /* trigger new sub-table when len > root */ - used = 1U << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ - - /* check available table space */ - if (type == LENS && used >= ENOUGH - MAXD) - return 1; - - /* process all codes and make table entries */ - for (;;) { - /* create table entry */ - thisx.bits = (unsigned char)(len - drop); - if ((int)(work[sym]) < end) { - thisx.op = (unsigned char)0; - thisx.val = work[sym]; - } - else if ((int)(work[sym]) > end) { - thisx.op = (unsigned char)(extra[work[sym]]); - thisx.val = base[work[sym]]; - } - else { - thisx.op = (unsigned char)(32 + 64); /* end of block */ - thisx.val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1U << (len - drop); - fill = 1U << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - next[(huff >> drop) + fill] = thisx; - } while (fill != 0); - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - - /* go to next symbol, update count, len */ - sym++; - if (--(count[len]) == 0) { - if (len == max) break; - len = lens[work[sym]]; - } - - /* create new sub-table if needed */ - if (len > root && (huff & mask) != low) { - /* if first time, transition to sub-tables */ - if (drop == 0) - drop = root; - - /* increment past last table */ - next += min; /* here min is 1 << curr */ - - /* determine length of next table */ - curr = len - drop; - left = (int)(1 << curr); - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) break; - curr++; - left <<= 1; - } - - /* check for enough space */ - used += 1U << curr; - if (type == LENS && used >= ENOUGH - MAXD) - return 1; - - /* point entry in root table to sub-table */ - low = huff & mask; - (*table)[low].op = (unsigned char)curr; - (*table)[low].bits = (unsigned char)root; - (*table)[low].val = (unsigned short)(next - *table); - } - } - - /* - Fill in rest of table for incomplete codes. This loop is similar to the - loop above in incrementing huff for table indices. It is assumed that - len is equal to curr + drop, so there is no loop needed to increment - through high index bits. When the current sub-table is filled, the loop - drops back to the root table to fill in any remaining entries there. - */ - thisx.op = (unsigned char)64; /* invalid code marker */ - thisx.bits = (unsigned char)(len - drop); - thisx.val = (unsigned short)0; - while (huff != 0) { - /* when done with sub-table, drop back to root table */ - if (drop != 0 && (huff & mask) != low) { - drop = 0; - len = root; - next = *table; - thisx.bits = (unsigned char)len; - } - - /* put invalid code marker in table */ - next[huff >> drop] = thisx; - - /* backwards increment the len-bit code huff */ - incr = 1U << (len - 1); - while (huff & incr) - incr >>= 1; - if (incr != 0) { - huff &= incr - 1; - huff += incr; - } - else - huff = 0; - } - - /* set return parameters */ - *table += used; - *bits = root; - return 0; -} diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.h b/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.h deleted file mode 100755 index ea64af0..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/inftrees.h +++ /dev/null @@ -1,61 +0,0 @@ -/* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005 Mark Adler - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -#ifndef _INFTREES_H_ -#define _INFTREES_H_ - -/* Structure for decoding tables. Each entry provides either the - information needed to do the operation requested by the code that - indexed that table entry, or it provides a pointer to another - table that indexes more bits of the code. op indicates whether - the entry is a pointer to another table, a literal, a length or - distance, an end-of-block, or an invalid code. For a table - pointer, the low four bits of op is the number of index bits of - that table. For a length or distance, the low four bits of op - is the number of extra bits to get after the code. bits is - the number of bits in this code or part of the code to drop off - of the bit buffer. val is the actual byte to output in the case - of a literal, the base length or distance, or the offset from - the current table to the next table. Each entry is four bytes. */ -typedef struct { - unsigned char op; /* operation, extra bits, table bits */ - unsigned char bits; /* bits in this part of the code */ - unsigned short val; /* offset in table or code value */ -} code; - -/* op values as set by inflate_table(): - 00000000 - literal - 0000tttt - table link, tttt != 0 is the number of table index bits - 0001eeee - length or distance, eeee is the number of extra bits - 01100000 - end of block - 01000000 - invalid code - */ - -/* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1444 code structures (852 for length/literals - and 592 for distances, the latter actually the result of an - exhaustive search). The true maximum is not known, but the value - below is more than safe. */ -#define ENOUGH 2048 -#define MAXD 592 - -/* Type of code to build for inftable() */ -typedef enum { - CODES, - LENS, - DISTS -} codetype; - -extern int inflate_table OF((codetype type, unsigned short FAR *lens, - unsigned codes, code FAR * FAR *table, - unsigned FAR *bits, unsigned short FAR *work)); - - -#endif diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c b/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c deleted file mode 100755 index f8aa560..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/trees.c +++ /dev/null @@ -1,1191 +0,0 @@ -/* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2005 Jean-loup Gailly - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* - * ALGORITHM - * - * The "deflation" process uses several Huffman trees. The more - * common source values are represented by shorter bit sequences. - * - * Each code tree is stored in a compressed form which is itself - * a Huffman encoding of the lengths of all the code strings (in - * ascending order by source values). The actual code strings are - * reconstructed from the lengths in the inflate process, as described - * in the deflate specification. - * - * REFERENCES - * - * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification". - * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc - * - * Storer, James A. - * Data Compression: Methods and Theory, pp. 49-50. - * Computer Science Press, 1988. ISBN 0-7167-8156-5. - * - * Sedgewick, R. - * Algorithms, p290. - * Addison-Wesley, 1983. ISBN 0-201-06672-6. - */ - -/* @(#) $Id: trees.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -/* #define GEN_TREES_H */ - -#include "deflate.h" - -#ifdef DEBUG -# include -#endif - -/* =========================================================================== - * Constants - */ - -#define MAX_BL_BITS 7 -/* Bit length codes must not exceed MAX_BL_BITS bits */ - -#define END_BLOCK 256 -/* end of block literal code */ - -#define REP_3_6 16 -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ - -#define REPZ_3_10 17 -/* repeat a zero length 3-10 times (3 bits of repeat count) */ - -#define REPZ_11_138 18 -/* repeat a zero length 11-138 times (7 bits of repeat count) */ - -local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */ - = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0}; - -local const int extra_dbits[D_CODES] /* extra bits for each distance code */ - = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - -local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */ - = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7}; - -local const uch bl_order[BL_CODES] - = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15}; -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ - -#define Buf_size (8 * 2*sizeof(char)) -/* Number of bits used within bi_buf. (bi_buf might be implemented on - * more than 16 bits on some systems.) - */ - -/* =========================================================================== - * Local data. These are initialized only once. - */ - -#define DIST_CODE_LEN 512 /* see definition of array dist_code below */ - -#if defined(GEN_TREES_H) || !defined(STDC) -/* non ANSI compilers may not accept trees.h */ - -local ct_data static_ltree[L_CODES+2]; -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ - -local ct_data static_dtree[D_CODES]; -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ - -uch _dist_code[DIST_CODE_LEN]; -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ - -uch _length_code[MAX_MATCH-MIN_MATCH+1]; -/* length code for each normalized match length (0 == MIN_MATCH) */ - -local int base_length[LENGTH_CODES]; -/* First normalized length for each code (0 = MIN_MATCH) */ - -local int base_dist[D_CODES]; -/* First normalized distance for each code (0 = distance of 1) */ - -#else -# include "trees.h" -#endif /* GEN_TREES_H */ - -struct static_tree_desc_s { - const ct_data *static_tree; /* static tree or NULL */ - const intf *extra_bits; /* extra bits for each code or NULL */ - int extra_base; /* base index for extra_bits */ - int elems; /* max number of elements in the tree */ - int max_length; /* max bit length for the codes */ -}; - -local static_tree_desc static_l_desc = -{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; - -local static_tree_desc static_d_desc = -{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; - -local static_tree_desc static_bl_desc = -{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; - -/* =========================================================================== - * Local (static) routines in this file. - */ - -local void tr_static_init OF((void)); -local void init_block OF((deflate_state *s)); -local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); -local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); -local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); -local void build_tree OF((deflate_state *s, tree_desc *desc)); -local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); -local int build_bl_tree OF((deflate_state *s)); -local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, - int blcodes)); -local void compress_block OF((deflate_state *s, ct_data *ltree, - ct_data *dtree)); -local void set_data_type OF((deflate_state *s)); -local unsigned bi_reverse OF((unsigned value, int length)); -local void bi_windup OF((deflate_state *s)); -local void bi_flush OF((deflate_state *s)); -local void copy_block OF((deflate_state *s, charf *buf, unsigned len, - int header)); - -#ifdef GEN_TREES_H -local void gen_trees_header OF((void)); -#endif - -#ifndef DEBUG -# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len) - /* Send a code of the given tree. c and tree must not have side effects */ - -#else /* DEBUG */ -# define send_code(s, c, tree) \ - { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \ - send_bits(s, tree[c].Code, tree[c].Len); } -#endif - -/* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. - */ -#define put_short(s, w) { \ - put_byte(s, (uch)((w) & 0xff)); \ - put_byte(s, (uch)((ush)(w) >> 8)); \ -} - -/* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. - */ -#ifdef DEBUG -local void send_bits OF((deflate_state *s, int value, int length)); - -local void send_bits (deflate_state *s, int value, int length) -{ - Tracevv((stderr," l %2d v %4x ", length, value)); - Assert(length > 0 && length <= 15, "invalid length"); - s->bits_sent += (ulg)length; - - /* If not enough room in bi_buf, use (valid) bits from bi_buf and - * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) - * unused bits in value. - */ - if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (value << s->bi_valid); - put_short(s, s->bi_buf); - s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); - s->bi_valid += (int) (length - Buf_size); - } else { - s->bi_buf |= value << s->bi_valid; - s->bi_valid += length; - } -} -#else /* !DEBUG */ - -#define send_bits(s, value, length) \ -{ int len = length;\ - if (s->bi_valid > (int)Buf_size - len) {\ - int val = value;\ - s->bi_buf |= (val << s->bi_valid);\ - put_short(s, s->bi_buf);\ - s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ - s->bi_valid += len - Buf_size;\ - } else {\ - s->bi_buf |= (value) << s->bi_valid;\ - s->bi_valid += len;\ - }\ -} -#endif /* DEBUG */ - - -/* the arguments must not have side effects */ - -/* =========================================================================== - * Initialize the various 'constant' tables. - */ -local void tr_static_init() -{ -#if defined(GEN_TREES_H) || !defined(STDC) - static int static_init_done = 0; - int n; /* iterates over tree elements */ - int bits; /* bit counter */ - int length; /* length value */ - int code; /* code value */ - int dist; /* distance index */ - ush bl_count[MAX_BITS+1]; - /* number of codes at each bit length for an optimal tree */ - - if (static_init_done) return; - - /* For some embedded targets, global variables are not initialized: */ - static_l_desc.static_tree = static_ltree; - static_l_desc.extra_bits = extra_lbits; - static_d_desc.static_tree = static_dtree; - static_d_desc.extra_bits = extra_dbits; - static_bl_desc.extra_bits = extra_blbits; - - /* Initialize the mapping length (0..255) -> length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { - base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ - dist = 0; - for (code = 0 ; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { - _dist_code[256 + dist++] = (uch)code; - } - } - Assert (dist == 256, "tr_static_init: 256+dist != 512"); - - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0; - n = 0; - while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++; - while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++; - while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++; - while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++; - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count); - - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n].Len = 5; - static_dtree[n].Code = bi_reverse((unsigned)n, 5); - } - static_init_done = 1; - -# ifdef GEN_TREES_H - gen_trees_header(); -# endif -#endif /* defined(GEN_TREES_H) || !defined(STDC) */ -} - -/* =========================================================================== - * Genererate the file trees.h describing the static trees. - */ -#ifdef GEN_TREES_H -# ifndef DEBUG -# include -# endif - -# define SEPARATOR(i, last, width) \ - ((i) == (last)? "\n};\n\n" : \ - ((i) % (width) == (width)-1 ? ",\n" : ", ")) - -void gen_trees_header() -{ - FILE *header = fopen("trees.h", "w"); - int i; - - Assert (header != NULL, "Can't open trees.h"); - fprintf(header, - "/* header created automatically with -DGEN_TREES_H */\n\n"); - - fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n"); - for (i = 0; i < L_CODES+2; i++) { - fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code, - static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5)); - } - - fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code, - static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); - } - - fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); - for (i = 0; i < DIST_CODE_LEN; i++) { - fprintf(header, "%2u%s", _dist_code[i], - SEPARATOR(i, DIST_CODE_LEN-1, 20)); - } - - fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); - for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { - fprintf(header, "%2u%s", _length_code[i], - SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); - } - - fprintf(header, "local const int base_length[LENGTH_CODES] = {\n"); - for (i = 0; i < LENGTH_CODES; i++) { - fprintf(header, "%1u%s", base_length[i], - SEPARATOR(i, LENGTH_CODES-1, 20)); - } - - fprintf(header, "local const int base_dist[D_CODES] = {\n"); - for (i = 0; i < D_CODES; i++) { - fprintf(header, "%5u%s", base_dist[i], - SEPARATOR(i, D_CODES-1, 10)); - } - - fclose(header); -} -#endif /* GEN_TREES_H */ - -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -void _tr_init(deflate_state *s) -{ - tr_static_init(); - - s->l_desc.dyn_tree = s->dyn_ltree; - s->l_desc.stat_desc = &static_l_desc; - - s->d_desc.dyn_tree = s->dyn_dtree; - s->d_desc.stat_desc = &static_d_desc; - - s->bl_desc.dyn_tree = s->bl_tree; - s->bl_desc.stat_desc = &static_bl_desc; - - s->bi_buf = 0; - s->bi_valid = 0; - s->last_eob_len = 8; /* enough lookahead for inflate */ -#ifdef DEBUG - s->compressed_len = 0L; - s->bits_sent = 0L; -#endif - - /* Initialize the first block of the first file: */ - init_block(s); -} - -/* =========================================================================== - * Initialize a new block. - */ -local void init_block (deflate_state *s) -{ - int n; /* iterates over tree elements */ - - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; - for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; - for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; - - s->dyn_ltree[END_BLOCK].Freq = 1; - s->opt_len = s->static_len = 0L; - s->last_lit = s->matches = 0; -} - -#define SMALLEST 1 -/* Index within the heap array of least frequent node in the Huffman tree */ - - -/* =========================================================================== - * Remove the smallest element from the heap and recreate the heap with - * one less element. Updates heap and heap_len. - */ -#define pqremove(s, tree, top) \ -{\ - top = s->heap[SMALLEST]; \ - s->heap[SMALLEST] = s->heap[s->heap_len--]; \ - pqdownheap(s, tree, SMALLEST); \ -} - -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -#define smaller(tree, n, m, depth) \ - (tree[n].Freq < tree[m].Freq || \ - (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m])) - -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -local void pqdownheap (deflate_state *s, - ct_data *tree, /* the tree to restore */ - int k) /* node to move down */ -{ - int v = s->heap[k]; - int j = k << 1; /* left son of k */ - while (j <= s->heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s->heap_len && - smaller(tree, s->heap[j+1], s->heap[j], s->depth)) { - j++; - } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s->heap[j], s->depth)) break; - - /* Exchange v with the smallest son */ - s->heap[k] = s->heap[j]; k = j; - - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s->heap[k] = v; -} - -/* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. - */ -local void gen_bitlen (deflate_state *s, tree_desc *desc) -{ - ct_data *tree = desc->dyn_tree; - int max_code = desc->max_code; - const ct_data *stree = desc->stat_desc->static_tree; - const intf *extra = desc->stat_desc->extra_bits; - int base = desc->stat_desc->extra_base; - int max_length = desc->stat_desc->max_length; - int h; /* heap index */ - int n, m; /* iterate over the tree elements */ - int bits; /* bit length */ - int xbits; /* extra bits */ - ush f; /* frequency */ - int overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0; - - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */ - - for (h = s->heap_max+1; h < HEAP_SIZE; h++) { - n = s->heap[h]; - bits = tree[tree[n].Dad].Len + 1; - if (bits > max_length) bits = max_length, overflow++; - tree[n].Len = (ush)bits; - /* We overwrite tree[n].Dad which is no longer needed */ - - if (n > max_code) continue; /* not a leaf node */ - - s->bl_count[bits]++; - xbits = 0; - if (n >= base) xbits = extra[n-base]; - f = tree[n].Freq; - s->opt_len += (ulg)f * (bits + xbits); - if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits); - } - if (overflow == 0) return; - - Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ - - /* Find the first bit length which could increase: */ - do { - bits = max_length-1; - while (s->bl_count[bits] == 0) bits--; - s->bl_count[bits]--; /* move one leaf down the tree */ - s->bl_count[bits+1] += 2; /* move one overflow item as its brother */ - s->bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] - */ - overflow -= 2; - } while (overflow > 0); - - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) - */ - for (bits = max_length; bits != 0; bits--) { - n = s->bl_count[bits]; - while (n != 0) { - m = s->heap[--h]; - if (m > max_code) continue; - if ((unsigned) tree[m].Len != (unsigned) bits) { - Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s->opt_len += ((long)bits - (long)tree[m].Len) - *(long)tree[m].Freq; - tree[m].Len = (ush)bits; - } - n--; - } - } -} - -/* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. - */ -local void gen_codes (ct_data *tree, /* the tree to decorate */ - int max_code, /* largest code with non zero frequency */ - ushf *bl_count) /* number of codes at each bit length */ -{ - ush next_code[MAX_BITS+1]; /* next code value for each bit length */ - ush code = 0; /* running code value */ - int bits; /* bit index */ - int n; /* code index */ - - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; - } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. - */ - Assert (code + bl_count[MAX_BITS]-1 == (1<dyn_tree; - const ct_data *stree = desc->stat_desc->static_tree; - int elems = desc->stat_desc->elems; - int n, m; /* iterate over heap elements */ - int max_code = -1; /* largest code with non zero frequency */ - int node; /* new node being created */ - - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s->heap_len = 0, s->heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) { - if (tree[n].Freq != 0) { - s->heap[++(s->heap_len)] = max_code = n; - s->depth[n] = 0; - } else { - tree[n].Len = 0; - } - } - - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s->heap_len < 2) { - node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0); - tree[node].Freq = 1; - s->depth[node] = 0; - s->opt_len--; if (stree) s->static_len -= stree[node].Len; - /* node is 0 or 1 so it does not have extra bits */ - } - desc->max_code = max_code; - - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n); - - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - pqremove(s, tree, n); /* n = node of least frequency */ - m = s->heap[SMALLEST]; /* m = node of next least frequency */ - - s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */ - s->heap[--(s->heap_max)] = m; - - /* Create a new node father of n and m */ - tree[node].Freq = tree[n].Freq + tree[m].Freq; - s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ? - s->depth[n] : s->depth[m]) + 1); - tree[n].Dad = tree[m].Dad = (ush)node; -#ifdef DUMP_BL_TREE - if (tree == s->bl_tree) { - fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)", - node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq); - } -#endif - /* and insert the new node in the heap */ - s->heap[SMALLEST] = node++; - pqdownheap(s, tree, SMALLEST); - - } while (s->heap_len >= 2); - - s->heap[--(s->heap_max)] = s->heap[SMALLEST]; - - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, (tree_desc *)desc); - - /* The field len is now set, we can generate the bit codes */ - gen_codes ((ct_data *)tree, max_code, s->bl_count); -} - -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -local void scan_tree (deflate_state *s, - ct_data *tree, /* the tree to be scanned */ - int max_code) /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - if (nextlen == 0) max_count = 138, min_count = 3; - tree[max_code+1].Len = (ush)0xffff; /* guard */ - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - s->bl_tree[curlen].Freq += count; - } else if (curlen != 0) { - if (curlen != prevlen) s->bl_tree[curlen].Freq++; - s->bl_tree[REP_3_6].Freq++; - } else if (count <= 10) { - s->bl_tree[REPZ_3_10].Freq++; - } else { - s->bl_tree[REPZ_11_138].Freq++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -local void send_tree (deflate_state *s, - ct_data *tree, /* the tree to be scanned */ - int max_code) /* and its largest code of non zero frequency */ -{ - int n; /* iterates over all tree elements */ - int prevlen = -1; /* last emitted length */ - int curlen; /* length of current code */ - int nextlen = tree[0].Len; /* length of next code */ - int count = 0; /* repeat count of the current code */ - int max_count = 7; /* max repeat count */ - int min_count = 4; /* min repeat count */ - - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen == 0) max_count = 138, min_count = 3; - - for (n = 0; n <= max_code; n++) { - curlen = nextlen; nextlen = tree[n+1].Len; - if (++count < max_count && curlen == nextlen) { - continue; - } else if (count < min_count) { - do { send_code(s, curlen, s->bl_tree); } while (--count != 0); - - } else if (curlen != 0) { - if (curlen != prevlen) { - send_code(s, curlen, s->bl_tree); count--; - } - Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2); - - } else if (count <= 10) { - send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3); - - } else { - send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) { - max_count = 138, min_count = 3; - } else if (curlen == nextlen) { - max_count = 6, min_count = 3; - } else { - max_count = 7, min_count = 4; - } - } -} - -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -local int build_bl_tree (deflate_state *s) -{ - int max_blindex; /* index of last bit length code of non zero freq */ - - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code); - scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code); - - /* Build the bit length tree: */ - build_tree(s, (tree_desc *)(&(s->bl_desc))); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ - - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (s->bl_tree[bl_order[max_blindex]].Len != 0) break; - } - /* Update opt_len to include the bit length tree and counts */ - s->opt_len += 3*(max_blindex+1) + 5+5+4; - Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - s->opt_len, s->static_len)); - - return max_blindex; -} - -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -local void send_all_trees (deflate_state *s, - int lcodes, int dcodes, int blcodes) /* number of codes for each tree */ -{ - int rank; /* index in bl_order */ - - Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - "too many codes"); - Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s->bl_tree[bl_order[rank]].Len, 3); - } - Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */ - Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - - send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */ - Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} - -/* =========================================================================== - * Send a stored block - */ -void _tr_stored_block (deflate_state *s, charf *buf, ulg stored_len, int eof) -{ - send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ -#ifdef DEBUG - s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; - s->compressed_len += (stored_len + 4) << 3; -#endif - copy_block(s, buf, (unsigned)stored_len, 1); /* with header */ -} - -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - * The current inflate code requires 9 bits of lookahead. If the - * last two codes for the previous block (real code plus EOB) were coded - * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - * the last real code. In this case we send two empty static blocks instead - * of one. (There are no problems if the previous block is stored or fixed.) - * To simplify the code, we assume the worst case of last real code encoded - * on one bit only. - */ -void _tr_align (deflate_state *s) -{ - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; /* 3 for block type, 7 for EOB */ -#endif - bi_flush(s); - /* Of the 10 bits for the empty block, we have already sent - * (10 - bi_valid) bits. The lookahead for the last real code (before - * the EOB of the previous block) was thus at least one plus the length - * of the EOB plus what we have just sent of the empty static block. - */ - if (1 + s->last_eob_len + 10 - s->bi_valid < 9) { - send_bits(s, STATIC_TREES<<1, 3); - send_code(s, END_BLOCK, static_ltree); -#ifdef DEBUG - s->compressed_len += 10L; -#endif - bi_flush(s); - } - s->last_eob_len = 7; -} - -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -void _tr_flush_block (deflate_state *s, - charf *buf, /* input block, or NULL if too old */ - ulg stored_len, /* length of input block */ - int eof) /* true if this is the last block for a file */ -{ - ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - int max_blindex = 0; /* index of last bit length code of non zero freq */ - - /* Build the Huffman trees unless a stored block is forced */ - if (s->level > 0) { - - /* Check if the file is binary or text */ - if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) - set_data_type(s); - - /* Construct the literal and distance trees */ - build_tree(s, (tree_desc *)(&(s->l_desc))); - Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - - build_tree(s, (tree_desc *)(&(s->d_desc))); - Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ - - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); - - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s->opt_len+3+7)>>3; - static_lenb = (s->static_len+3+7)>>3; - - Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - s->last_lit)); - - if (static_lenb <= opt_lenb) opt_lenb = static_lenb; - - } else { - Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } - -#ifdef FORCE_STORED - if (buf != (char*)0) { /* force stored block */ -#else - if (stored_len+4 <= opt_lenb && buf != (char*)0) { - /* 4: two words for the lengths */ -#endif - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, eof); - -#ifdef FORCE_STATIC - } else if (static_lenb >= 0) { /* force static trees */ -#else - } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { -#endif - send_bits(s, (STATIC_TREES<<1)+eof, 3); - compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->static_len; -#endif - } else { - send_bits(s, (DYN_TREES<<1)+eof, 3); - send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, - max_blindex+1); - compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); -#ifdef DEBUG - s->compressed_len += 3 + s->opt_len; -#endif - } - Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (eof) { - bi_windup(s); -#ifdef DEBUG - s->compressed_len += 7; /* align on byte boundary */ -#endif - } - Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*eof)); -} - -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -int _tr_tally (deflate_state *s, - unsigned dist, /* distance of matched string */ - unsigned lc) /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - s->d_buf[s->last_lit] = (ush)dist; - s->l_buf[s->last_lit++] = (uch)lc; - if (dist == 0) { - /* lc is the unmatched char */ - s->dyn_ltree[lc].Freq++; - } else { - s->matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - Assert((ush)dist < (ush)MAX_DIST(s) && - (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - - s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++; - s->dyn_dtree[d_code(dist)].Freq++; - } - -#ifdef TRUNCATE_BLOCK - /* Try to guess if it is profitable to stop the current block here */ - if ((s->last_lit & 0x1fff) == 0 && s->level > 2) { - /* Compute an upper bound for the compressed length */ - ulg out_length = (ulg)s->last_lit*8L; - ulg in_length = (ulg)((long)s->strstart - s->block_start); - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) { - out_length += (ulg)s->dyn_dtree[dcode].Freq * - (5L+extra_dbits[dcode]); - } - out_length >>= 3; - Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", - s->last_lit, in_length, out_length, - 100L - out_length*100L/in_length)); - if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1; - } -#endif - return (s->last_lit == s->lit_bufsize-1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ -} - -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -local void compress_block (deflate_state *s, - ct_data *ltree, /* literal tree */ - ct_data *dtree) /* distance tree */ -{ - unsigned dist; /* distance of matched string */ - int lc; /* match length or unmatched char (if dist == 0) */ - unsigned lx = 0; /* running index in l_buf */ - unsigned code; /* the code to send */ - int extra; /* number of extra bits to send */ - - if (s->last_lit != 0) do { - dist = s->d_buf[lx]; - lc = s->l_buf[lx++]; - if (dist == 0) { - send_code(s, lc, ltree); /* send a literal byte */ - Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra != 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - Assert (code < D_CODES, "bad d_code"); - - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra != 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ - } - } /* literal or match pair ? */ - - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - "pendingBuf overflow"); - - } while (lx < s->last_lit); - - send_code(s, END_BLOCK, ltree); - s->last_eob_len = ltree[END_BLOCK].Len; -} - -/* =========================================================================== - * Set the data type to BINARY or TEXT, using a crude approximation: - * set it to Z_TEXT if all symbols are either printable characters (33 to 255) - * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. - * IN assertion: the fields Freq of dyn_ltree are set. - */ -local void set_data_type (deflate_state *s) -{ - int n; - - for (n = 0; n < 9; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - if (n == 9) - for (n = 14; n < 32; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; -} - -/* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 - */ -local unsigned bi_reverse (unsigned code, int len) -{ - unsigned res = 0; - do { - res |= code & 1; - code >>= 1, res <<= 1; - } while (--len > 0); - return res >> 1; -} - -/* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. - */ -local void bi_flush (deflate_state *s) -{ - if (s->bi_valid == 16) { - put_short(s, s->bi_buf); - s->bi_buf = 0; - s->bi_valid = 0; - } else if (s->bi_valid >= 8) { - put_byte(s, (Byte)s->bi_buf); - s->bi_buf >>= 8; - s->bi_valid -= 8; - } -} - -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -local void bi_windup (deflate_state *s) -{ - if (s->bi_valid > 8) { - put_short(s, s->bi_buf); - } else if (s->bi_valid > 0) { - put_byte(s, (Byte)s->bi_buf); - } - s->bi_buf = 0; - s->bi_valid = 0; -#ifdef DEBUG - s->bits_sent = (s->bits_sent+7) & ~7; -#endif -} - -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -local void copy_block(deflate_state *s, - charf *buf, /* the input data */ - unsigned len, /* its length */ - int header) /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ - s->last_eob_len = 8; /* enough lookahead for inflate */ - - if (header) { - put_short(s, (ush)len); - put_short(s, (ush)~len); -#ifdef DEBUG - s->bits_sent += 2*16; -#endif - } -#ifdef DEBUG - s->bits_sent += (ulg)len<<3; -#endif - while (len--) { - put_byte(s, *buf++); - } -} diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/trees.h b/JuceLibraryCode/modules/juce_core/zip/zlib/trees.h deleted file mode 100755 index 5ac45a7..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/trees.h +++ /dev/null @@ -1,127 +0,0 @@ -/* header created automatically with -DGEN_TREES_H */ - -local const ct_data static_ltree[L_CODES+2] = { -{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}}, -{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}}, -{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}}, -{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}}, -{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}}, -{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}}, -{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}}, -{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}}, -{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}}, -{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}}, -{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}}, -{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}}, -{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}}, -{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}}, -{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}}, -{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}}, -{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}}, -{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}}, -{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}}, -{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}}, -{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}}, -{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}}, -{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}}, -{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}}, -{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}}, -{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}}, -{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}}, -{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}}, -{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}}, -{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}}, -{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}}, -{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}}, -{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}}, -{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}}, -{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}}, -{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}}, -{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}}, -{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}}, -{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}}, -{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}}, -{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}}, -{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}}, -{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}}, -{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}}, -{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}}, -{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}}, -{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}}, -{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}}, -{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}}, -{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}}, -{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}}, -{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}}, -{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}}, -{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}}, -{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}}, -{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}}, -{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}}, -{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}} -}; - -local const ct_data static_dtree[D_CODES] = { -{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}}, -{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}}, -{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}}, -{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}}, -{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}}, -{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}} -}; - -const uch _dist_code[DIST_CODE_LEN] = { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, -10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, -11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, -12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, -13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, -14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, -15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, -18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, -28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, -29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 -}; - -const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, -13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, -17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, -19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, -22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, -23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, -25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, -26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, -27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 -}; - -local const int base_length[LENGTH_CODES] = { -0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, -64, 80, 96, 112, 128, 160, 192, 224, 0 -}; - -local const int base_dist[D_CODES] = { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 -}; diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/uncompr.c b/JuceLibraryCode/modules/juce_core/zip/zlib/uncompr.c deleted file mode 100755 index 839602f..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/uncompr.c +++ /dev/null @@ -1,60 +0,0 @@ -/* uncompr.c -- decompress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: uncompr.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#define ZLIB_INTERNAL -#include "zlib.h" - -/* =========================================================================== - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted. -*/ -int ZEXPORT uncompress (Bytef *dest, - uLongf *destLen, - const Bytef *source, - uLong sourceLen) -{ - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; - - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - - err = inflateInit(&stream); - if (err != Z_OK) return err; - - err = inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - inflateEnd(&stream); - if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) - return Z_DATA_ERROR; - return err; - } - *destLen = stream.total_out; - - err = inflateEnd(&stream); - return err; -} diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.h b/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.h deleted file mode 100755 index f1e9e87..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.h +++ /dev/null @@ -1,345 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: zconf.h,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#ifndef ZCONF_H -#define ZCONF_H - -// *** Just a few hacks here to make it compile nicely with Juce.. -#define Z_PREFIX 1 -#undef __MACTYPES__ - -#ifdef _MSC_VER - #pragma warning (disable : 4131 4127 4244 4267) -#endif - - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define inflatePrime z_inflatePrime -# define inflateGetHeader z_inflateGetHeader -# define adler32_combine z_adler32_combine -# define crc32_combine z_crc32_combine -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table -# define zError z_zError - -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.in.h b/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.in.h deleted file mode 100755 index 018173a..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/zconf.in.h +++ /dev/null @@ -1,332 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: zconf.in.h,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table -# define zError z_zError - -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/zlib.h b/JuceLibraryCode/modules/juce_core/zip/zlib/zlib.h deleted file mode 100755 index bdf8af7..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/zlib.h +++ /dev/null @@ -1,1358 +0,0 @@ -/* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.3, July 18th, 2005 - - Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - - - The data format used by the zlib library is described by RFCs (Request for - Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt - (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format). -*/ - -#ifndef ZLIB_H -#define ZLIB_H - -#include "zconf.h" - -#ifdef __cplusplus -//extern "C" { -#endif - -#define ZLIB_VERSION "1.2.3" -#define ZLIB_VERNUM 0x1230 - - -/* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. - - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output - (providing more output space) before each call. - - The compressed data format used by default by the in-memory functions is - the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped - around a deflate stream, which is itself documented in RFC 1951. - - The library also supports reading and writing files in gzip (.gz) format - with an interface similar to that of stdio using the functions that start - with "gz". The gzip format is different from the zlib format. gzip is a - gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - - This library can optionally read and write gzip streams in memory as well. - - The zlib format was designed to be compact and fast for use in memory - and on communications channels. The gzip format was designed for single- - file compression on file systems, has a larger header than zlib to maintain - directory information, and uses a different, slower check method than zlib. - - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. -*/ - -typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); -typedef void (*free_func) OF((voidpf opaque, voidpf address)); - -struct internal_state; - -typedef struct z_stream_s { - Bytef *next_in; /* next input byte */ - uInt avail_in; /* number of bytes available at next_in */ - uLong total_in; /* total nb of input bytes read so far */ - - Bytef *next_out; /* next output byte should be put there */ - uInt avail_out; /* remaining free space at next_out */ - uLong total_out; /* total nb of bytes output so far */ - - char *msg; /* last error message, NULL if no error */ - struct internal_state FAR *state; /* not visible by applications */ - - alloc_func zalloc; /* used to allocate the internal state */ - free_func zfree; /* used to free the internal state */ - voidpf opaque; /* private data object passed to zalloc and zfree */ - - int data_type; /* best guess about the data type: binary or text */ - uLong adler; /* adler32 value of the uncompressed data */ - uLong reserved; /* reserved for future use */ -} z_stream; - -typedef z_stream FAR *z_streamp; - -/* - gzip header information passed to and from zlib routines. See RFC 1952 - for more details on the meanings of these fields. -*/ -typedef struct gz_header_s { - int text; /* true if compressed data believed to be text */ - uLong time; /* modification time */ - int xflags; /* extra flags (not used when writing a gzip file) */ - int os; /* operating system */ - Bytef *extra; /* pointer to extra field or Z_NULL if none */ - uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ - uInt extra_max; /* space at extra (only when reading header) */ - Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ - uInt name_max; /* space at name (only when reading header) */ - Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ - uInt comm_max; /* space at comment (only when reading header) */ - int hcrc; /* true if there was or will be a header crc */ - int done; /* true when done reading gzip header (not used - when writing a gzip file) */ -} gz_header; - -typedef gz_header FAR *gz_headerp; - -/* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. - - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the - opaque value. - - zalloc must return Z_NULL if there is not enough memory for the object. - If zlib is used in a multi-threaded application, zalloc and zfree must be - thread safe. - - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). - - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). -*/ - - /* constants */ - -#define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ -#define Z_SYNC_FLUSH 2 -#define Z_FULL_FLUSH 3 -#define Z_FINISH 4 -#define Z_BLOCK 5 -/* Allowed flush values; see deflate() and inflate() below for details */ - -#define Z_OK 0 -#define Z_STREAM_END 1 -#define Z_NEED_DICT 2 -#define Z_ERRNO (-1) -#define Z_STREAM_ERROR (-2) -#define Z_DATA_ERROR (-3) -#define Z_MEM_ERROR (-4) -#define Z_BUF_ERROR (-5) -#define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. - */ - -#define Z_NO_COMPRESSION 0 -#define Z_BEST_SPEED 1 -#define Z_BEST_COMPRESSION 9 -#define Z_DEFAULT_COMPRESSION (-1) -/* compression levels */ - -#define Z_FILTERED 1 -#define Z_HUFFMAN_ONLY 2 -#define Z_RLE 3 -#define Z_FIXED 4 -#define Z_DEFAULT_STRATEGY 0 -/* compression strategy; see deflateInit2() below for details */ - -#define Z_BINARY 0 -#define Z_TEXT 1 -#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ -#define Z_UNKNOWN 2 -/* Possible values of the data_type field (though see inflate()) */ - -#define Z_DEFLATED 8 -/* The deflate compression method (the only one supported in this version) */ - -#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ - -#define zlib_version zlibVersion() -/* for compatibility with versions < 1.0.2 */ - - /* basic functions */ - -//ZEXTERN const char * ZEXPORT zlibVersion OF((void)); -/* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. - */ - -/* -ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. - - The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). - - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, - Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). -*/ - - -ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); -/* - deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. deflate performs one or both of the - following actions: - - - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in and avail_in are updated and - processing will resume at this point for the next call of deflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. - Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. - - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. - - Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumualte before producing output, in order to - maximize compression. - - If the parameter flush is set to Z_SYNC_FLUSH, all pending output is - flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. - - If flush is set to Z_FULL_FLUSH, all output is flushed as with - Z_SYNC_FLUSH, and the compression state is reset so that decompression can - restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade - compression. - - If deflate returns with avail_out == 0, this function must be called again - with the same value of the flush parameter and more output space (updated - avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that - avail_out is greater than six to avoid repeated flush markers due to - avail_out == 0 on return. - - If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be - called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. - - Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - the value returned by deflateBound (see below). If deflate does not return - Z_STREAM_END, then it must be called again as described above. - - deflate() sets strm->adler to the adler32 checksum of all input read - so far (that is, total_in bytes). - - deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. - - deflate() returns Z_OK if some progress has been made (more input - processed or more output produced), Z_STREAM_END if all input has been - consumed and all output has been produced (only when flush is set to - Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not - fatal, and deflate() can be called again with more input and more output - space to continue compressing. -*/ - - -ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the - stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be - deallocated). -*/ - - -/* -ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - - Initializes the internal stream state for decompression. The fields - next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the - compression method from the zlib header and allocates all data structures - accordingly; otherwise the allocation will be deferred to the first call of - inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to - use default allocation functions. - - inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) -*/ - - -ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); -/* - inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce - some output latency (reading input without producing any output) except when - forced to flush. - - The detailed semantics are as follows. inflate performs one or both of the - following actions: - - - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). - - - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). - - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. - - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, - Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() stop - if and when it gets to the next deflate block boundary. When decoding the - zlib or gzip format, this will cause inflate() to return immediately after - the header and before the first block. When doing a raw inflate, inflate() - will go ahead and process the first block, and will return when it gets to - the end of that block, or when it runs out of data. - - The Z_BLOCK option assists in appending to or combining deflate streams. - Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 - if inflate() is currently decoding the last block in the deflate stream, - plus 128 if inflate() returned immediately after decoding an end-of-block - code or decoding the complete header up to just before the first byte of the - deflate stream. The end-of-block will not be indicated until all of the - uncompressed data from that block has been written to strm->next_out. The - number of unused bits may in general be greater than seven, except when - bit 7 of data_type is set, in which case the number of unused bits will be - less than eight. - - inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster approach - may be used for the single inflate() call. - - In this implementation, inflate() always flushes as much output as - possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation - is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK is used. - - If a preset dictionary is needed after this call (see inflateSetDictionary - below), inflate sets strm->adler to the adler32 checksum of the dictionary - chosen by the compressor and returns Z_NEED_DICT; otherwise it sets - strm->adler to the adler32 checksum of all output produced so far (that is, - total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 - checksum is equal to that saved by the compressor and returns Z_STREAM_END - only if the checksum is correct. - - inflate() will decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically. Any information - contained in the gzip header is not retained, so applications that need that - information should instead use raw inflate, see inflateInit2() below, or - inflateBack() and perform their own processing of the gzip header and - trailer. - - inflate() returns Z_OK if some progress has been made (more input processed - or more output produced), Z_STREAM_END if the end of the compressed data has - been reached and all uncompressed output has been produced, Z_NEED_DICT if a - preset dictionary is needed at this point, Z_DATA_ERROR if the input data was - corrupted (input stream not conforming to the zlib format or incorrect check - value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, - Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and - inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may then - call inflateSync() to look for a good compression block if a partial recovery - of the data is desired. -*/ - - -ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); -/* - All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. - - inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a - static string (which must not be deallocated). -*/ - - /* Advanced functions */ - -/* - The following functions are needed only in some special applications. -*/ - -/* -ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, - int level, - int method, - int windowBits, - int memLevel, - int strategy)); - - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. - - The method parameter is the compression method. It must be Z_DEFLATED in - this version of the library. - - The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if - deflateInit is used instead. - - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data - with no zlib header or trailer, and will not compute an adler32 check value. - - windowBits can also be greater than 15 for optional gzip encoding. Add - 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), - no header crc, and the operating system will be set to 255 (unknown). If a - gzip stream is being written, strm->adler is a crc32 instead of an adler32. - - The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. - - The strategy parameter is used to tune the compression algorithm. Use the - value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a - filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no - string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman - coding and less string matching; it is somewhat intermediate between - Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as - Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy - parameter only affects the compression ratio but not the correctness of the - compressed output even if it is not set appropriately. Z_FIXED prevents the - use of dynamic Huffman codes, allowing for a simpler decoder for special - applications. - - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same - dictionary (see inflateSetDictionary). - - The dictionary should consist of strings (byte sequences) that are likely - to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a - dictionary is most useful when the data to be compressed is short and can be - predicted with good accuracy; the data can then be compressed better than - with the default empty dictionary. - - Depending on the size of the compression data structures selected by - deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. In addition, the - current implementation of deflate will use at most the window size minus - 262 bytes of the provided dictionary. - - Upon return of this function, strm->adler is set to the adler32 value - of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value - applies to the whole dictionary even if only a subset of the dictionary is - actually used by the compressor.) If a raw deflate was requested, then the - adler32 value is not computed and strm->adler is not set. - - deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not - perform any compression: this will be done by deflate(). -*/ - -ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when several compression strategies will be - tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed - by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. - - deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); -/* - This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. - - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, - int level, - int strategy)); -/* - Dynamically update the compression level and compression strategy. The - interpretation of level and strategy is as in deflateInit2. This can be - used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). - - Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. - - deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. -*/ - -ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, - int good_length, - int max_lazy, - int nice_length, - int max_chain)); -/* - Fine tune deflate's internal compression parameters. This should only be - used by someone who understands the algorithm used by zlib's deflate for - searching for the best matching string, and even then only by the most - fanatic optimizer trying to squeeze out the last compressed bit for their - specific input data. Read the deflate.c source code for the meaning of the - max_lazy, good_length, nice_length, and max_chain parameters. - - deflateTune() can be called after deflateInit() or deflateInit2(), and - returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. - */ - -ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, - uLong sourceLen)); -/* - deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() - or deflateInit2(). This would be used to allocate an output buffer - for deflation in a single pass, and so would be called before deflate(). -*/ - -ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the - bits leftover from a previous deflate stream when appending to it. As such, - this function can only be used for raw deflate, and must be used before the - first deflate() call after a deflateInit2() or deflateReset(). bits must be - less than or equal to 16, and that many of the least significant bits of - value will be inserted in the output. - - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, - gz_headerp head)); -/* - deflateSetHeader() provides gzip header information for when a gzip - stream is requested by deflateInit2(). deflateSetHeader() may be called - after deflateInit2() or deflateReset() and before the first call of - deflate(). The text, time, os, extra field, name, and comment information - in the provided gz_header structure are written to the gzip header (xflag is - ignored -- the extra flags are set according to the compression level). The - caller must assure that, if not Z_NULL, name and comment are terminated with - a zero byte, and that if extra is not Z_NULL, that extra_len bytes are - available there. If hcrc is true, a gzip header crc is included. Note that - the current versions of the command-line version of gzip (up through version - 1.3.x) do not support header crc's, and will report that it is a "multi-part - gzip file" and give up. - - If deflateSetHeader is not used, the default gzip header has text false, - the time set to zero, and os set to 255, with no extra, name, or comment - fields. The gzip header is returned to the default state by deflateReset(). - - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, - int windowBits)); - - This is another version of inflateInit with an extra parameter. The - fields next_in, avail_in, zalloc, zfree and opaque must be initialized - before by the caller. - - The windowBits parameter is the base two logarithm of the maximum window - size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value - provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window - size is given as input, inflate() will return with the error code - Z_DATA_ERROR instead of trying to allocate a larger window. - - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, - not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This - is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom - format is developed using the raw deflate format for compressed data, it is - recommended that a check value such as an adler32 or a crc32 be applied to - the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments - above on the use in deflateInit2() applies to the magnitude of windowBits. - - windowBits can also be greater than 15 for optional gzip decoding. Add - 32 to windowBits to enable zlib and gzip decoding with automatic header - detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is - a crc32 instead of an adler32. - - inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg - is set to null if there is no error message. inflateInit2 does not perform - any decompression apart from reading the zlib header if present: this will - be done by inflate(). (So next_in and avail_in may be modified, but next_out - and avail_out are unchanged.) -*/ - -ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, - const Bytef *dictionary, - uInt dictLength)); -/* - Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor - can be determined from the adler32 value returned by that call of inflate. - The compressor and decompressor must use exactly the same dictionary (see - deflateSetDictionary). For raw inflate, this function can be called - immediately after inflateInit2() or inflateReset() and before any call of - inflate() to set the dictionary. The application must insure that the - dictionary that was used for compression is provided. - - inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is - inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not - perform any decompression: this will be done by subsequent calls of - inflate(). -*/ - -ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); -/* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. - - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. -*/ - -ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, - z_streamp source)); -/* - Sets the destination stream as a complete copy of the source stream. - - This function can be useful when randomly accessing a large stream. The - first pass through the stream can periodically record the inflate state, - allowing restarting inflate at those points when randomly accessing the - stream. - - inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and - destination. -*/ - -ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); -/* - This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. - - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). -*/ - -ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, - int bits, - int value)); -/* - This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. - - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, - gz_headerp head)); -/* - inflateGetHeader() requests that gzip header information be stored in the - provided gz_header structure. inflateGetHeader() may be called after - inflateInit2() or inflateReset(), and before the first call of inflate(). - As inflate() processes the gzip stream, head->done is zero until the header - is completed, at which time head->done is set to one. If a zlib stream is - being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK can be used to - force inflate() to return immediately after header processing is complete - and before any actual data is decompressed. - - The text, time, xflags, and os fields are filled in with the gzip header - contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max - contains the maximum number of bytes to write to extra. Once done is true, - extra_len contains the actual extra field length, and extra contains the - extra field, or that field truncated if extra_max is less than extra_len. - If name is not Z_NULL, then up to name_max characters are written there, - terminated with a zero unless the length is greater than name_max. If - comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When - any of extra, name, or comment are not Z_NULL and the respective field is - not present in the header, then that field is set to Z_NULL to signal its - absence. This allows the use of deflateSetHeader() with the returned - structure to duplicate the header. However if those fields are set to - allocated memory, then the application will need to save those pointers - elsewhere so that they can be eventually freed. - - If inflateGetHeader is not used, then the header information is simply - discarded. The header is always checked for validity, including the header - CRC if present. inflateReset() will reset the process to discard the header - information. The application would need to call inflateGetHeader() again to - retrieve the header from the next gzip stream. - - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent. -*/ - -/* -ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, - unsigned char FAR *window)); - - Initialize the internal stream state for decompression using inflateBack() - calls. The fields zalloc, zfree and opaque in strm must be initialized - before the call. If zalloc and zfree are Z_NULL, then the default library- - derived memory allocation routines are used. windowBits is the base two - logarithm of the window size, in the range 8..15. window is a caller - supplied buffer of that size. Except for special applications where it is - assured that deflate was used with small window sizes, windowBits must be 15 - and a 32K byte window must be supplied to be able to decompress general - deflate streams. - - See inflateBack() for the usage of these routines. - - inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not - be allocated, or Z_VERSION_ERROR if the version of the library does not - match the version of the header file. -*/ - -typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); -typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); - -ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, - in_func in, void FAR *in_desc, - out_func out, void FAR *out_desc)); -/* - inflateBack() does a raw inflate with a single call using a call-back - interface for input and output. This is more efficient than inflate() for - file i/o applications in that it avoids copying between the output and the - sliding window by simply making the window itself the output buffer. This - function trusts the application to not change the output buffer passed by - the output function, at least until inflateBack() returns. - - inflateBackInit() must be called first to allocate the internal state - and to initialize the state with the user-provided window buffer. - inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free - the allocated state. - - A raw deflate stream is one with no zlib or gzip header or trailer. - This routine would normally be used in a utility that reads zip or gzip - files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects - only the raw deflate stream to decompress. This is different from the - normal behavior of inflate(), which expects either a zlib or gzip header and - trailer around the deflate stream. - - inflateBack() uses two subroutines supplied by the caller that are then - called by inflateBack() for input and output. inflateBack() calls those - routines until it reads a complete deflate stream and writes out all of the - uncompressed data, or until it encounters an error. The function's - parameters and return types are defined above in the in_func and out_func - typedefs. inflateBack() will call in(in_desc, &buf) which should return the - number of bytes of provided input, and a pointer to that input in buf. If - there is no input available, in() must return zero--buf is ignored in that - case--and inflateBack() will return a buffer error. inflateBack() will call - out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() - should return zero on success, or non-zero on failure. If out() returns - non-zero, inflateBack() will return with an error. Neither in() nor out() - are permitted to change the contents of the window provided to - inflateBackInit(), which is also the buffer that out() uses to write from. - The length written by out() will be at most the window size. Any non-zero - amount of input may be provided by in(). - - For convenience, inflateBack() can be provided input on the first call by - setting strm->next_in and strm->avail_in. If that input is exhausted, then - in() will be called. Therefore strm->next_in must be initialized before - calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called - immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in - must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. - - The in_desc and out_desc parameters of inflateBack() is passed as the - first parameter of in() and out() respectively when they are called. These - descriptors can be optionally used to pass any information that the caller- - supplied in() and out() functions need to do their job. - - On return, inflateBack() will set strm->next_in and strm->avail_in to - pass back any unused input that was provided by the last in() call. The - return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format - error in the deflate stream (in which case strm->msg is set to indicate the - nature of the error), or Z_STREAM_ERROR if the stream was not properly - initialized. In the case of Z_BUF_ERROR, an input or output error can be - distinguished using strm->next_in which will be Z_NULL only if in() returned - an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to - out() returning non-zero. (in() will always be called before out(), so - strm->next_in is assured to be defined if out() returns non-zero.) Note - that inflateBack() cannot return Z_OK. -*/ - -ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); -/* - All memory allocated by inflateBackInit() is freed. - - inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream - state was inconsistent. -*/ - -//ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); -/* Return flags indicating compile-time options. - - Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: - 1.0: size of uInt - 3.2: size of uLong - 5.4: size of voidpf (pointer) - 7.6: size of z_off_t - - Compiler, assembler, and debug options: - 8: DEBUG - 9: ASMV or ASMINF -- use ASM code - 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention - 11: 0 (reserved) - - One-time table building (smaller code, but not thread-safe if true): - 12: BUILDFIXED -- build static block decoding tables when needed - 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed - 14,15: 0 (reserved) - - Library content (indicates missing functionality): - 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking - deflate code when not needed) - 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect - and decode gzip streams (to avoid linking crc code) - 18-19: 0 (reserved) - - Operation variations (changes in library functionality): - 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate - 21: FASTEST -- deflate algorithm with only one, lowest compression level - 22,23: 0 (reserved) - - The sprintf variant used by gzprintf (zero is best): - 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format - 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! - 26: 0 = returns value, 1 = void -- 1 means inferred string length returned - - Remainder: - 27-31: 0 (reserved) - */ - - - /* utility functions */ - -/* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. -*/ - -ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least the value returned - by compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. - compress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer. -*/ - -ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen, - int level)); -/* - Compresses the source buffer into the destination buffer. The level - parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the - destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the - compressed buffer. - - compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_BUF_ERROR if there was not enough room in the output buffer, - Z_STREAM_ERROR if the level parameter is invalid. -*/ - -ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); -/* - compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before - a compress() or compress2() call to allocate the destination buffer. -*/ - -ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, - const Bytef *source, uLong sourceLen)); -/* - Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. - - uncompress returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_BUF_ERROR if there was not enough room in the output - buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. -*/ - - -typedef voidp gzFile; - -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); -/* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h", or 'R' for run-length encoding - as in "wb1R". (See the description of deflateInit2 for more information - about the strategy parameter.) - - gzopen can be used to read a file which is not in gzip format; in this - case gzread will directly read from the file without decompression. - - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ - -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); -/* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. -*/ - -ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); -/* - Dynamically update the compression level or strategy. See the description - of deflateInit2 for the meaning of these parameters. - gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not - opened for writing. -*/ - -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); -/* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ - -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). -*/ - -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); -/* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). The number of - uncompressed bytes written is limited to 4095. The caller should assure that - this limit is not exceeded. If it is exceeded, then gzprintf() will return - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. -*/ - -ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); -/* - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ - -ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); -/* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. -*/ - -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); -/* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ - -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); -/* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ - -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); -/* - Push one character back onto the stream to be read again later. - Only one character of push-back is allowed. gzungetc() returns the - character pushed, or -1 on failure. gzungetc() will fail if a - character has been pushed but not read yet, or if c is -1. The pushed - character will be discarded if the stream is repositioned with gzseek() - or gzrewind(). -*/ - -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); -/* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. -*/ - -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); -/* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); - the value SEEK_END is not supported. - If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are - supported; gzseek then compresses a sequence of zeroes up to the new - starting position. - - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error, in - particular if the file is opened for writing and the new starting position - would be before the current position. -*/ - -ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); -/* - Rewinds the given file. This function is supported only for reading. - - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) -*/ - -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); -/* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. - - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) -*/ - -ZEXTERN int ZEXPORT gzeof OF((gzFile file)); -/* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ - -ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); -/* - Returns 1 if file is being read directly without decompression, otherwise - zero. -*/ - -ZEXTERN int ZEXPORT gzclose OF((gzFile file)); -/* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). -*/ - -ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); -/* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ - -ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); -/* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip - file that is being written concurrently. -*/ - - /* checksum functions */ - -/* - These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. -*/ - -ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); -/* - Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: - - uLong adler = adler32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - adler = adler32(adler, buffer, length); - } - if (adler != original_adler) error(); -*/ - -ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, - z_off_t len2)); -/* - Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 - and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for - each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of - seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. -*/ - -ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); -/* - Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is NULL, this function returns the required initial - value for the for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. - Usage example: - - uLong crc = crc32(0L, Z_NULL, 0); - - while (read_buffer(buffer, length) != EOF) { - crc = crc32(crc, buffer, length); - } - if (crc != original_crc) error(); -*/ - -ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); - -/* - Combine two CRC-32 check values into one. For two sequences of bytes, - seq1 and seq2 with lengths len1 and len2, CRC-32 check values were - calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 - check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and - len2. -*/ - - - /* various hacks, don't look :) */ - -/* deflateInit and inflateInit are macros to allow checking the zlib version - * and the compiler's view of z_stream: - */ -ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, - int windowBits, int memLevel, - int strategy, const char *version, - int stream_size)); -ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, - const char *version, int stream_size)); -ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, - unsigned char FAR *window, - const char *version, - int stream_size)); -#define deflateInit(strm, level) \ - deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit(strm) \ - inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream)) -#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ - deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ - (strategy), ZLIB_VERSION, sizeof(z_stream)) -#define inflateInit2(strm, windowBits) \ - inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) -#define inflateBackInit(strm, windowBits, window) \ - inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) - - -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ -#endif - -ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); -ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); - -#ifdef __cplusplus -//} -#endif - -#endif /* ZLIB_H */ diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.c b/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.c deleted file mode 100755 index 630305c..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.c +++ /dev/null @@ -1,311 +0,0 @@ -/* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id: zutil.c,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#include "zutil.h" - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -const char * const z_errmsg[10] = { -"need dictionary", /* Z_NEED_DICT 2 */ -"stream end", /* Z_STREAM_END 1 */ -"", /* Z_OK 0 */ -"file error", /* Z_ERRNO (-1) */ -"stream error", /* Z_STREAM_ERROR (-2) */ -"data error", /* Z_DATA_ERROR (-3) */ -"insufficient memory", /* Z_MEM_ERROR (-4) */ -"buffer error", /* Z_BUF_ERROR (-5) */ -"incompatible version",/* Z_VERSION_ERROR (-6) */ -""}; - - -/*const char * ZEXPORT zlibVersion() -{ - return ZLIB_VERSION; -} - -uLong ZEXPORT zlibCompileFlags() -{ - uLong flags; - - flags = 0; - switch (sizeof(uInt)) { - case 2: break; - case 4: flags += 1; break; - case 8: flags += 2; break; - default: flags += 3; - } - switch (sizeof(uLong)) { - case 2: break; - case 4: flags += 1 << 2; break; - case 8: flags += 2 << 2; break; - default: flags += 3 << 2; - } - switch (sizeof(voidpf)) { - case 2: break; - case 4: flags += 1 << 4; break; - case 8: flags += 2 << 4; break; - default: flags += 3 << 4; - } - switch (sizeof(z_off_t)) { - case 2: break; - case 4: flags += 1 << 6; break; - case 8: flags += 2 << 6; break; - default: flags += 3 << 6; - } -#ifdef DEBUG - flags += 1 << 8; -#endif -#if defined(ASMV) || defined(ASMINF) - flags += 1 << 9; -#endif -#ifdef ZLIB_WINAPI - flags += 1 << 10; -#endif -#ifdef BUILDFIXED - flags += 1 << 12; -#endif -#ifdef DYNAMIC_CRC_TABLE - flags += 1 << 13; -#endif -#ifdef NO_GZCOMPRESS - flags += 1L << 16; -#endif -#ifdef NO_GZIP - flags += 1L << 17; -#endif -#ifdef PKZIP_BUG_WORKAROUND - flags += 1L << 20; -#endif -#ifdef FASTEST - flags += 1L << 21; -#endif -#ifdef STDC -# ifdef NO_vsnprintf - flags += 1L << 25; -# ifdef HAS_vsprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_vsnprintf_void - flags += 1L << 26; -# endif -# endif -#else - flags += 1L << 24; -# ifdef NO_snprintf - flags += 1L << 25; -# ifdef HAS_sprintf_void - flags += 1L << 26; -# endif -# else -# ifdef HAS_snprintf_void - flags += 1L << 26; -# endif -# endif -#endif - return flags; -}*/ - -#if 0 - -# ifndef verbose -# define verbose 0 -# endif -int z_verbose = verbose; - -void z_error (const char *m) -{ - fprintf(stderr, "%s\n", m); - exit(1); -} -#endif - -/* exported to allow conversion of error code to string for compress() and - * uncompress() - */ -const char * ZEXPORT zError(int err) -{ - return ERR_MSG(err); -} - -#if defined(_WIN32_WCE) - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. - */ - int errno = 0; -#endif - -#ifndef HAVE_MEMCPY - -void zmemcpy(dest, source, len) - Bytef* dest; - const Bytef* source; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = *source++; /* ??? to be unrolled */ - } while (--len != 0); -} - -int zmemcmp(s1, s2, len) - const Bytef* s1; - const Bytef* s2; - uInt len; -{ - uInt j; - - for (j = 0; j < len; j++) { - if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1; - } - return 0; -} - -void zmemzero(dest, len) - Bytef* dest; - uInt len; -{ - if (len == 0) return; - do { - *dest++ = 0; /* ??? to be unrolled */ - } while (--len != 0); -} -#endif - - -#ifdef SYS16BIT - -#ifdef __TURBOC__ -/* Turbo C in 16-bit mode */ - -# define MY_ZCALLOC - -/* Turbo C malloc() does not allow dynamic allocation of 64K bytes - * and farmalloc(64K) returns a pointer with an offset of 8, so we - * must fix the pointer. Warning: the pointer must be put back to its - * original form in order to free it, use zcfree(). - */ - -#define MAX_PTR 10 -/* 10*64K = 640K */ - -local int next_ptr = 0; - -typedef struct ptr_table_s { - voidpf org_ptr; - voidpf new_ptr; -} ptr_table; - -local ptr_table table[MAX_PTR]; -/* This table is used to remember the original form of pointers - * to large buffers (64K). Such pointers are normalized with a zero offset. - * Since MSDOS is not a preemptive multitasking OS, this table is not - * protected from concurrent access. This hack doesn't work anyway on - * a protected system like OS/2. Use Microsoft C instead. - */ - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - voidpf buf = opaque; /* just to make some compilers happy */ - ulg bsize = (ulg)items*size; - - /* If we allocate less than 65520 bytes, we assume that farmalloc - * will return a usable pointer which doesn't have to be normalized. - */ - if (bsize < 65520L) { - buf = farmalloc(bsize); - if (*(ush*)&buf != 0) return buf; - } else { - buf = farmalloc(bsize + 16L); - } - if (buf == NULL || next_ptr >= MAX_PTR) return NULL; - table[next_ptr].org_ptr = buf; - - /* Normalize the pointer to seg:0 */ - *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4; - *(ush*)&buf = 0; - table[next_ptr++].new_ptr = buf; - return buf; -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - int n; - if (*(ush*)&ptr != 0) { /* object < 64K */ - farfree(ptr); - return; - } - /* Find the original pointer */ - for (n = 0; n < next_ptr; n++) { - if (ptr != table[n].new_ptr) continue; - - farfree(table[n].org_ptr); - while (++n < next_ptr) { - table[n-1] = table[n]; - } - next_ptr--; - return; - } - ptr = opaque; /* just to make some compilers happy */ - Assert(0, "zcfree: ptr not found"); -} - -#endif /* __TURBOC__ */ - - -#ifdef M_I86 -/* Microsoft C in 16-bit mode */ - -# define MY_ZCALLOC - -#if (!defined(_MSC_VER) || (_MSC_VER <= 600)) -# define _halloc halloc -# define _hfree hfree -#endif - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - return _halloc((long)items, size); -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - if (opaque) opaque = 0; /* to make compiler happy */ - _hfree(ptr); -} - -#endif /* M_I86 */ - -#endif /* SYS16BIT */ - - -#ifndef MY_ZCALLOC /* Any system without a special alloc function */ - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern voidp calloc OF((uInt items, uInt size)); -extern void free OF((voidpf ptr)); -#endif - -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) -{ - if (opaque) items += size - size; /* make compiler happy */ - return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) : - (voidpf)calloc(items, size); -} - -void zcfree (voidpf opaque, voidpf ptr) -{ - free(ptr); - if (opaque) return; /* make compiler happy */ -} - -#endif /* MY_ZCALLOC */ diff --git a/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.h b/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.h deleted file mode 100755 index 3939858..0000000 --- a/JuceLibraryCode/modules/juce_core/zip/zlib/zutil.h +++ /dev/null @@ -1,271 +0,0 @@ -/* zutil.h -- internal interface and configuration of the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* WARNING: this file should *not* be used by applications. It is - part of the implementation of the compression library and is - subject to change. Applications should only use zlib.h. - */ - -/* @(#) $Id: zutil.h,v 1.1 2007/06/07 17:54:37 jules_rms Exp $ */ - -#ifndef ZUTIL_H -#define ZUTIL_H - -#define ZLIB_INTERNAL -#include "zlib.h" - -#ifdef STDC -# ifndef _WIN32_WCE -# include -# endif -# include -# include -#endif -#ifdef NO_ERRNO_H -# ifdef _WIN32_WCE - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. We rename it to - * avoid conflict with other libraries that use the same workaround. - */ -# define errno z_errno -# endif - extern int errno; -#else -# ifndef _WIN32_WCE -# include -# endif -#endif - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - -typedef unsigned char uch; -typedef uch FAR uchf; -typedef unsigned short ush; -typedef ush FAR ushf; -typedef unsigned long ulg; - -extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ -/* (size given to avoid silly warnings with Visual C++) */ - -#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)] - -#define ERR_RETURN(strm,err) \ - return (strm->msg = (char*)ERR_MSG(err), (err)) -/* To be used only when the state is known to be valid */ - - /* common constants */ - -#ifndef DEF_WBITS -# define DEF_WBITS MAX_WBITS -#endif -/* default windowBits for decompression. MAX_WBITS is for compression only */ - -#if MAX_MEM_LEVEL >= 8 -# define DEF_MEM_LEVEL 8 -#else -# define DEF_MEM_LEVEL MAX_MEM_LEVEL -#endif -/* default memLevel */ - -#define STORED_BLOCK 0 -#define STATIC_TREES 1 -#define DYN_TREES 2 -/* The three kinds of block type */ - -#define MIN_MATCH 3 -#define MAX_MATCH 258 -/* The minimum and maximum match lengths */ - -#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */ - - /* target dependencies */ - -#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) -# define OS_CODE 0x00 -# if defined(__TURBOC__) || defined(__BORLANDC__) -# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) - /* Allow compilation with ANSI keywords only enabled */ - void _Cdecl farfree( void *block ); - void *_Cdecl farmalloc( unsigned long nbytes ); -# else -# include -# endif -# else /* MSC or DJGPP */ -# include -# endif -#endif - -#ifdef AMIGA -# define OS_CODE 0x01 -#endif - -#if defined(VAXC) || defined(VMS) -# define OS_CODE 0x02 -# define F_OPEN(name, mode) \ - fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512") -#endif - -#if defined(ATARI) || defined(atarist) -# define OS_CODE 0x05 -#endif - -#ifdef OS2 -# define OS_CODE 0x06 -# ifdef M_I86 - #include -# endif -#endif - -#if defined(MACOS) || TARGET_OS_MAC -# define OS_CODE 0x07 -# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os -# include /* for fdopen */ -# else -# ifndef fdopen -# define fdopen(fd,mode) NULL /* No fdopen() */ -# endif -# endif -#endif - -#ifdef TOPS20 -# define OS_CODE 0x0a -#endif - -#ifdef WIN32 -# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */ -# define OS_CODE 0x0b -# endif -#endif - -#ifdef __50SERIES /* Prime/PRIMOS */ -# define OS_CODE 0x0f -#endif - -#if defined(_BEOS_) || defined(RISCOS) -# define fdopen(fd,mode) NULL /* No fdopen() */ -#endif - -#if (defined(_MSC_VER) && (_MSC_VER > 600)) -# if defined(_WIN32_WCE) -# define fdopen(fd,mode) NULL /* No fdopen() */ -# ifndef _PTRDIFF_T_DEFINED - typedef int ptrdiff_t; -# define _PTRDIFF_T_DEFINED -# endif -# else -# define fdopen(fd,type) _fdopen(fd,type) -# endif -#endif - - /* common defaults */ - -#ifndef OS_CODE -# define OS_CODE 0x03 /* assume Unix */ -#endif - -#ifndef F_OPEN -# define F_OPEN(name, mode) fopen((name), (mode)) -#endif - - /* functions */ - -#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#if defined(__CYGWIN__) -# ifndef HAVE_VSNPRINTF -# define HAVE_VSNPRINTF -# endif -#endif -#ifndef HAVE_VSNPRINTF -# ifdef MSDOS - /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), - but for now we just assume it doesn't. */ -# define NO_vsnprintf -# endif -# ifdef __TURBOC__ -# define NO_vsnprintf -# endif -# ifdef WIN32 - /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ -# if !defined(vsnprintf) && !defined(NO_vsnprintf) -# define vsnprintf _vsnprintf -# endif -# endif -# ifdef __SASC -# define NO_vsnprintf -# endif -#endif -#ifdef VMS -# define NO_vsnprintf -#endif - -#if defined(pyr) -# define NO_MEMCPY -#endif -#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__) - /* Use our own functions for small and medium model with MSC <= 5.0. - * You may have to use the same strategy for Borland C (untested). - * The __SC__ check is for Symantec. - */ -# define NO_MEMCPY -#endif -#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY) -# define HAVE_MEMCPY -#endif -#ifdef HAVE_MEMCPY -# ifdef SMALL_MEDIUM /* MSDOS small or medium model */ -# define zmemcpy _fmemcpy -# define zmemcmp _fmemcmp -# define zmemzero(dest, len) _fmemset(dest, 0, len) -# else -# define zmemcpy memcpy -# define zmemcmp memcmp -# define zmemzero(dest, len) memset(dest, 0, len) -# endif -#else - extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - extern void zmemzero OF((Bytef* dest, uInt len)); -#endif - -/* Diagnostic functions */ -#if 0 -# include - extern int z_verbose; - extern void z_error OF((const char *m)); -# define Assert(cond,msg) {if(!(cond)) z_error(msg);} -# define Trace(x) {if (z_verbose>=0) fprintf x ;} -# define Tracev(x) {if (z_verbose>0) fprintf x ;} -# define Tracevv(x) {if (z_verbose>1) fprintf x ;} -# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;} -# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;} -#else -# define Assert(cond,msg) -# define Trace(x) -# define Tracev(x) -# define Tracevv(x) -# define Tracec(c,x) -# define Tracecv(c,x) -# define z_error(x) -# define z_verbose 0 -#endif - - -voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); -void zcfree OF((voidpf opaque, voidpf ptr)); - -#define ZALLOC(strm, items, size) \ - (*((strm)->zalloc))((strm)->opaque, (items), (size)) -#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr)) -#define TRY_FREE(s, p) {if (p) ZFREE(s, p);} - -#endif /* ZUTIL_H */ diff --git a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.cpp b/JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.cpp deleted file mode 100755 index 3ff839b..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.cpp +++ /dev/null @@ -1,271 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -BlowFish::BlowFish (const void* const keyData, const int keyBytes) -{ - jassert (keyData != nullptr); - jassert (keyBytes > 0); - - static const uint32 initialPValues [18] = - { - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, - 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, - 0x9216d5d9, 0x8979fb1b - }; - - static const uint32 initialSValues [4 * 256] = - { - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, - 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, - 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, - 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, - 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, - 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, - 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, - 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, - 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, - 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, - 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, - 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, - 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, - 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, - 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, - 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, - 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, - 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, - 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, - 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, - 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, - 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, - 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, - 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, - 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, - 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, - 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, - 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, - 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, - 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, - 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, - 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, - 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, - 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, - 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, - 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, - 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, - 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, - 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, - 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, - 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, - 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, - 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, - 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, - 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, - 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, - 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, - 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, - 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, - 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, - 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, - 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, - 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, - 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, - 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, - 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, - 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, - 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, - 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, - 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, - 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, - 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, - 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, - 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, - 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, - 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, - 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, - 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, - 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, - 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, - 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, - 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, - 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, - 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, - 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, - 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, - 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, - 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, - 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, - 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, - 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, - 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, - 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, - 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, - 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, - 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, - 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, - 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, - 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, - 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, - 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, - 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, - 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, - 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, - 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, - 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, - 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, - 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, - 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, - 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, - 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, - 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, - 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 - }; - - memcpy (p, initialPValues, sizeof (p)); - - int i, j = 0; - for (i = 4; --i >= 0;) - { - s[i].malloc (256); - memcpy (s[i], initialSValues + i * 256, 256 * sizeof (uint32)); - } - - for (i = 0; i < 18; ++i) - { - uint32 d = 0; - - for (int k = 0; k < 4; ++k) - { - d = (d << 8) | static_cast (keyData)[j]; - - if (++j >= keyBytes) - j = 0; - } - - p[i] = initialPValues[i] ^ d; - } - - uint32 l = 0, r = 0; - - for (i = 0; i < 18; i += 2) - { - encrypt (l, r); - - p[i] = l; - p[i + 1] = r; - } - - for (i = 0; i < 4; ++i) - { - for (j = 0; j < 256; j += 2) - { - encrypt (l, r); - - s[i][j] = l; - s[i][j + 1] = r; - } - } -} - -BlowFish::BlowFish (const BlowFish& other) -{ - for (int i = 4; --i >= 0;) - s[i].malloc (256); - - operator= (other); -} - -BlowFish& BlowFish::operator= (const BlowFish& other) noexcept -{ - memcpy (p, other.p, sizeof (p)); - - for (int i = 4; --i >= 0;) - memcpy (s[i], other.s[i], 256 * sizeof (uint32)); - - return *this; -} - -BlowFish::~BlowFish() noexcept {} - -uint32 BlowFish::F (const uint32 x) const noexcept -{ - return ((s[0][(x >> 24) & 0xff] + s[1][(x >> 16) & 0xff]) - ^ s[2][(x >> 8) & 0xff]) + s[3][x & 0xff]; -} - -void BlowFish::encrypt (uint32& data1, uint32& data2) const noexcept -{ - uint32 l = data1; - uint32 r = data2; - - for (int i = 0; i < 16; ++i) - { - l ^= p[i]; - r ^= F(l); - std::swap (l, r); - } - - data1 = r ^ p[17]; - data2 = l ^ p[16]; -} - -void BlowFish::decrypt (uint32& data1, uint32& data2) const noexcept -{ - uint32 l = data1; - uint32 r = data2; - - for (int i = 17; i > 1; --i) - { - l ^= p[i]; - r ^= F(l); - std::swap (l, r); - } - - data1 = r ^ p[0]; - data2 = l ^ p[1]; -} diff --git a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.h b/JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.h deleted file mode 100755 index 1b28091..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_BlowFish.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_BLOWFISH_H_INCLUDED -#define JUCE_BLOWFISH_H_INCLUDED - - -//============================================================================== -/** - BlowFish encryption class. - -*/ -class JUCE_API BlowFish -{ -public: - //============================================================================== - /** Creates an object that can encode/decode based on the specified key. - - The key data can be up to 72 bytes long. - */ - BlowFish (const void* keyData, int keyBytes); - - /** Creates a copy of another blowfish object. */ - BlowFish (const BlowFish&); - - /** Copies another blowfish object. */ - BlowFish& operator= (const BlowFish&) noexcept; - - /** Destructor. */ - ~BlowFish() noexcept; - - //============================================================================== - /** Encrypts a pair of 32-bit integers. */ - void encrypt (uint32& data1, uint32& data2) const noexcept; - - /** Decrypts a pair of 32-bit integers. */ - void decrypt (uint32& data1, uint32& data2) const noexcept; - - -private: - //============================================================================== - uint32 p[18]; - HeapBlock s[4]; - - uint32 F (uint32) const noexcept; - - JUCE_LEAK_DETECTOR (BlowFish) -}; - - -#endif // JUCE_BLOWFISH_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.cpp b/JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.cpp deleted file mode 100755 index 058635b..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.cpp +++ /dev/null @@ -1,238 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace PrimesHelpers -{ - static void createSmallSieve (const int numBits, BigInteger& result) - { - result.setBit (numBits); - result.clearBit (numBits); // to enlarge the array - - result.setBit (0); - int n = 2; - - do - { - for (int i = n + n; i < numBits; i += n) - result.setBit (i); - - n = result.findNextClearBit (n + 1); - } - while (n <= (numBits >> 1)); - } - - static void bigSieve (const BigInteger& base, const int numBits, BigInteger& result, - const BigInteger& smallSieve, const int smallSieveSize) - { - jassert (! base[0]); // must be even! - - result.setBit (numBits); - result.clearBit (numBits); // to enlarge the array - - int index = smallSieve.findNextClearBit (0); - - do - { - const unsigned int prime = ((unsigned int) index << 1) + 1; - - BigInteger r (base), remainder; - r.divideBy (prime, remainder); - - unsigned int i = prime - remainder.getBitRangeAsInt (0, 32); - - if (r.isZero()) - i += prime; - - if ((i & 1) == 0) - i += prime; - - i = (i - 1) >> 1; - - while (i < (unsigned int) numBits) - { - result.setBit ((int) i); - i += prime; - } - - index = smallSieve.findNextClearBit (index + 1); - } - while (index < smallSieveSize); - } - - static bool findCandidate (const BigInteger& base, const BigInteger& sieve, - const int numBits, BigInteger& result, const int certainty) - { - for (int i = 0; i < numBits; ++i) - { - if (! sieve[i]) - { - result = base + (unsigned int) ((i << 1) + 1); - - if (Primes::isProbablyPrime (result, certainty)) - return true; - } - } - - return false; - } - - static bool passesMillerRabin (const BigInteger& n, int iterations) - { - const BigInteger one (1), two (2); - const BigInteger nMinusOne (n - one); - - BigInteger d (nMinusOne); - const int s = d.findNextSetBit (0); - d >>= s; - - BigInteger smallPrimes; - int numBitsInSmallPrimes = 0; - - for (;;) - { - numBitsInSmallPrimes += 256; - createSmallSieve (numBitsInSmallPrimes, smallPrimes); - - const int numPrimesFound = numBitsInSmallPrimes - smallPrimes.countNumberOfSetBits(); - - if (numPrimesFound > iterations + 1) - break; - } - - int smallPrime = 2; - - while (--iterations >= 0) - { - smallPrime = smallPrimes.findNextClearBit (smallPrime + 1); - - BigInteger r (smallPrime); - r.exponentModulo (d, n); - - if (r != one && r != nMinusOne) - { - for (int j = 0; j < s; ++j) - { - r.exponentModulo (two, n); - - if (r == nMinusOne) - break; - } - - if (r != nMinusOne) - return false; - } - } - - return true; - } -} - -//============================================================================== -BigInteger Primes::createProbablePrime (const int bitLength, - const int certainty, - const int* randomSeeds, - int numRandomSeeds) -{ - using namespace PrimesHelpers; - int defaultSeeds [16]; - - if (numRandomSeeds <= 0) - { - randomSeeds = defaultSeeds; - numRandomSeeds = numElementsInArray (defaultSeeds); - Random r1, r2; - - for (int j = 10; --j >= 0;) - { - r1.setSeedRandomly(); - - for (int i = numRandomSeeds; --i >= 0;) - defaultSeeds[i] ^= r1.nextInt() ^ r2.nextInt(); - } - } - - BigInteger smallSieve; - const int smallSieveSize = 15000; - createSmallSieve (smallSieveSize, smallSieve); - - BigInteger p; - - for (int i = numRandomSeeds; --i >= 0;) - { - BigInteger p2; - - Random r (randomSeeds[i]); - r.fillBitsRandomly (p2, 0, bitLength); - - p ^= p2; - } - - p.setBit (bitLength - 1); - p.clearBit (0); - - const int searchLen = jmax (1024, (bitLength / 20) * 64); - - while (p.getHighestBit() < bitLength) - { - p += 2 * searchLen; - - BigInteger sieve; - bigSieve (p, searchLen, sieve, - smallSieve, smallSieveSize); - - BigInteger candidate; - - if (findCandidate (p, sieve, searchLen, candidate, certainty)) - return candidate; - } - - jassertfalse; - return BigInteger(); -} - -bool Primes::isProbablyPrime (const BigInteger& number, const int certainty) -{ - using namespace PrimesHelpers; - - if (! number[0]) - return false; - - if (number.getHighestBit() <= 10) - { - const unsigned int num = number.getBitRangeAsInt (0, 10); - - for (unsigned int i = num / 2; --i > 1;) - if (num % i == 0) - return false; - - return true; - } - else - { - if (number.findGreatestCommonDivisor (2 * 3 * 5 * 7 * 11 * 13 * 17 * 19 * 23) != 1) - return false; - - return passesMillerRabin (number, certainty); - } -} diff --git a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h b/JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h deleted file mode 100755 index f8f4776..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_Primes.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_PRIMES_H_INCLUDED -#define JUCE_PRIMES_H_INCLUDED - - -//============================================================================== -/** - Prime number creation class. - - This class contains static methods for generating and testing prime numbers. - - @see BigInteger -*/ -class JUCE_API Primes -{ -public: - //============================================================================== - /** Creates a random prime number with a given bit-length. - - The certainty parameter specifies how many iterations to use when testing - for primality. A safe value might be anything over about 20-30. - - The randomSeeds parameter lets you optionally pass it a set of values with - which to seed the random number generation, improving the security of the - keys generated. - */ - static BigInteger createProbablePrime (int bitLength, - int certainty, - const int* randomSeeds = 0, - int numRandomSeeds = 0); - - /** Tests a number to see if it's prime. - - This isn't a bulletproof test, it uses a Miller-Rabin test to determine - whether the number is prime. - - The certainty parameter specifies how many iterations to use when testing - a - safe value might be anything over about 20-30. - */ - static bool isProbablyPrime (const BigInteger& number, int certainty); - - -private: - Primes(); - - JUCE_DECLARE_NON_COPYABLE (Primes) -}; - - -#endif // JUCE_PRIMES_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.cpp b/JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.cpp deleted file mode 100755 index 2c1e9d8..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -RSAKey::RSAKey() -{ -} - -RSAKey::RSAKey (const String& s) -{ - if (s.containsChar (',')) - { - part1.parseString (s.upToFirstOccurrenceOf (",", false, false), 16); - part2.parseString (s.fromFirstOccurrenceOf (",", false, false), 16); - } - else - { - // the string needs to be two hex numbers, comma-separated.. - jassertfalse; - } -} - -RSAKey::~RSAKey() -{ -} - -bool RSAKey::operator== (const RSAKey& other) const noexcept -{ - return part1 == other.part1 && part2 == other.part2; -} - -bool RSAKey::operator!= (const RSAKey& other) const noexcept -{ - return ! operator== (other); -} - -bool RSAKey::isValid() const noexcept -{ - return operator!= (RSAKey()); -} - -String RSAKey::toString() const -{ - return part1.toString (16) + "," + part2.toString (16); -} - -bool RSAKey::applyToValue (BigInteger& value) const -{ - if (part1.isZero() || part2.isZero() || value <= 0) - { - jassertfalse; // using an uninitialised key - value.clear(); - return false; - } - - BigInteger result; - - while (! value.isZero()) - { - result *= part2; - - BigInteger remainder; - value.divideBy (part2, remainder); - - remainder.exponentModulo (part1, part2); - - result += remainder; - } - - value.swapWith (result); - return true; -} - -BigInteger RSAKey::findBestCommonDivisor (const BigInteger& p, const BigInteger& q) -{ - // try 3, 5, 9, 17, etc first because these only contain 2 bits and so - // are fast to divide + multiply - for (int i = 2; i <= 65536; i *= 2) - { - const BigInteger e (1 + i); - - if (e.findGreatestCommonDivisor (p).isOne() && e.findGreatestCommonDivisor (q).isOne()) - return e; - } - - BigInteger e (4); - - while (! (e.findGreatestCommonDivisor (p).isOne() && e.findGreatestCommonDivisor (q).isOne())) - ++e; - - return e; -} - -void RSAKey::createKeyPair (RSAKey& publicKey, RSAKey& privateKey, - const int numBits, const int* randomSeeds, const int numRandomSeeds) -{ - jassert (numBits > 16); // not much point using less than this.. - jassert (numRandomSeeds == 0 || numRandomSeeds >= 2); // you need to provide plenty of seeds here! - - BigInteger p (Primes::createProbablePrime (numBits / 2, 30, randomSeeds, numRandomSeeds / 2)); - BigInteger q (Primes::createProbablePrime (numBits - numBits / 2, 30, randomSeeds == nullptr ? 0 : (randomSeeds + numRandomSeeds / 2), numRandomSeeds - numRandomSeeds / 2)); - - const BigInteger n (p * q); - const BigInteger m (--p * --q); - const BigInteger e (findBestCommonDivisor (p, q)); - - BigInteger d (e); - d.inverseModulo (m); - - publicKey.part1 = e; - publicKey.part2 = n; - - privateKey.part1 = d; - privateKey.part2 = n; -} diff --git a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.h b/JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.h deleted file mode 100755 index 8df7eec..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/encryption/juce_RSAKey.h +++ /dev/null @@ -1,174 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_RSAKEY_H_INCLUDED -#define JUCE_RSAKEY_H_INCLUDED - - -//============================================================================== -/** - RSA public/private key-pair encryption class. - - An object of this type makes up one half of a public/private RSA key pair. Use the - createKeyPair() method to create a matching pair for encoding/decoding. - - If you need to use this class in conjunction with a compatible enc/decryption - algorithm on a webserver, you can achieve the same thing in PHP like this: - - @code - include ('Math/BigInteger.php'); // get this from: phpseclib.sourceforge.net - - function applyToValue ($message, $key_part1, $key_part2) - { - $result = new Math_BigInteger(); - $zero = new Math_BigInteger(); - $value = new Math_BigInteger (strrev ($message), 256); - $part1 = new Math_BigInteger ($key_part1, 16); - $part2 = new Math_BigInteger ($key_part2, 16); - - while (! $value->equals ($zero)) - { - $result = $result->multiply ($part2); - list ($value, $remainder) = $value->divide ($part2); - $result = $result->add ($remainder->modPow ($part1, $part2)); - } - - return strrev ($result->toBytes()); - } - @endcode - - ..or in Java with something like this: - - @code - public class RSAKey - { - static BigInteger applyToValue (BigInteger value, String key_part1, String key_part2) - { - BigInteger result = BigInteger.ZERO; - BigInteger part1 = new BigInteger (key_part1, 16); - BigInteger part2 = new BigInteger (key_part2, 16); - - if (part1.equals (BigInteger.ZERO) || part2.equals (BigInteger.ZERO) - || value.compareTo (BigInteger.ZERO) <= 0) - return result; - - while (! value.equals (BigInteger.ZERO)) - { - result = result.multiply (part2); - BigInteger[] div = value.divideAndRemainder (part2); - value = div[0]; - result = result.add (div[1].modPow (part1, part2)); - } - - return result; - } - } - @endcode - - Disclaimer: neither of the code snippets above are tested! Please let me know if you have - any corrections for them! -*/ -class JUCE_API RSAKey -{ -public: - //============================================================================== - /** Creates a null key object. - - Initialise a pair of objects for use with the createKeyPair() method. - */ - RSAKey(); - - /** Loads a key from an encoded string representation. - - This reloads a key from a string created by the toString() method. - */ - explicit RSAKey (const String& stringRepresentation); - - /** Destructor. */ - ~RSAKey(); - - bool operator== (const RSAKey& other) const noexcept; - bool operator!= (const RSAKey& other) const noexcept; - - //============================================================================== - /** Turns the key into a string representation. - This can be reloaded using the constructor that takes a string. - */ - String toString() const; - - /** Returns true if the object is a valid key, or false if it was created by - the default constructor. - */ - bool isValid() const noexcept; - - //============================================================================== - /** Encodes or decodes a value. - - Call this on the public key object to encode some data, then use the matching - private key object to decode it. - - Returns false if the operation couldn't be completed, e.g. if this key hasn't been - initialised correctly. - - NOTE: This method dumbly applies this key to this data. If you encode some data - and then try to decode it with a key that doesn't match, this method will still - happily do its job and return true, but the result won't be what you were expecting. - It's your responsibility to check that the result is what you wanted. - */ - bool applyToValue (BigInteger& value) const; - - //============================================================================== - /** Creates a public/private key-pair. - - Each key will perform one-way encryption that can only be reversed by - using the other key. - - The numBits parameter specifies the size of key, e.g. 128, 256, 512 bit. Bigger - sizes are more secure, but this method will take longer to execute. - - The randomSeeds parameter lets you optionally pass it a set of values with - which to seed the random number generation, improving the security of the - keys generated. If you supply these, make sure you provide more than 2 values, - and the more your provide, the better the security. - */ - static void createKeyPair (RSAKey& publicKey, - RSAKey& privateKey, - int numBits, - const int* randomSeeds = nullptr, - int numRandomSeeds = 0); - - -protected: - //============================================================================== - BigInteger part1, part2; - -private: - //============================================================================== - static BigInteger findBestCommonDivisor (const BigInteger& p, const BigInteger& q); - - JUCE_LEAK_DETECTOR (RSAKey) -}; - - -#endif // JUCE_RSAKEY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.cpp b/JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.cpp deleted file mode 100755 index 889f6d3..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.cpp +++ /dev/null @@ -1,336 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class MD5Generator -{ -public: - MD5Generator() noexcept - { - state[0] = 0x67452301; - state[1] = 0xefcdab89; - state[2] = 0x98badcfe; - state[3] = 0x10325476; - - count[0] = 0; - count[1] = 0; - } - - void processBlock (const void* data, size_t dataSize) noexcept - { - int bufferPos = ((count[0] >> 3) & 0x3F); - - count[0] += (uint32) (dataSize << 3); - - if (count[0] < ((uint32) dataSize << 3)) - count[1]++; - - count[1] += (uint32) (dataSize >> 29); - - const size_t spaceLeft = 64 - (size_t) bufferPos; - size_t i = 0; - - if (dataSize >= spaceLeft) - { - memcpy (buffer + bufferPos, data, spaceLeft); - transform (buffer); - - for (i = spaceLeft; i + 64 <= dataSize; i += 64) - transform (static_cast (data) + i); - - bufferPos = 0; - } - - memcpy (buffer + bufferPos, static_cast (data) + i, dataSize - i); - } - - void transform (const void* bufferToTransform) noexcept - { - uint32 a = state[0]; - uint32 b = state[1]; - uint32 c = state[2]; - uint32 d = state[3]; - uint32 x[16]; - - encode (x, bufferToTransform, 64); - - enum Constants - { - S11 = 7, S12 = 12, S13 = 17, S14 = 22, S21 = 5, S22 = 9, S23 = 14, S24 = 20, - S31 = 4, S32 = 11, S33 = 16, S34 = 23, S41 = 6, S42 = 10, S43 = 15, S44 = 21 - }; - - FF (a, b, c, d, x[ 0], S11, 0xd76aa478); FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); - FF (c, d, a, b, x[ 2], S13, 0x242070db); FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); - FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); FF (d, a, b, c, x[ 5], S12, 0x4787c62a); - FF (c, d, a, b, x[ 6], S13, 0xa8304613); FF (b, c, d, a, x[ 7], S14, 0xfd469501); - FF (a, b, c, d, x[ 8], S11, 0x698098d8); FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); - FF (c, d, a, b, x[10], S13, 0xffff5bb1); FF (b, c, d, a, x[11], S14, 0x895cd7be); - FF (a, b, c, d, x[12], S11, 0x6b901122); FF (d, a, b, c, x[13], S12, 0xfd987193); - FF (c, d, a, b, x[14], S13, 0xa679438e); FF (b, c, d, a, x[15], S14, 0x49b40821); - - GG (a, b, c, d, x[ 1], S21, 0xf61e2562); GG (d, a, b, c, x[ 6], S22, 0xc040b340); - GG (c, d, a, b, x[11], S23, 0x265e5a51); GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); - GG (a, b, c, d, x[ 5], S21, 0xd62f105d); GG (d, a, b, c, x[10], S22, 0x02441453); - GG (c, d, a, b, x[15], S23, 0xd8a1e681); GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); - GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); GG (d, a, b, c, x[14], S22, 0xc33707d6); - GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); GG (b, c, d, a, x[ 8], S24, 0x455a14ed); - GG (a, b, c, d, x[13], S21, 0xa9e3e905); GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); - GG (c, d, a, b, x[ 7], S23, 0x676f02d9); GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); - - HH (a, b, c, d, x[ 5], S31, 0xfffa3942); HH (d, a, b, c, x[ 8], S32, 0x8771f681); - HH (c, d, a, b, x[11], S33, 0x6d9d6122); HH (b, c, d, a, x[14], S34, 0xfde5380c); - HH (a, b, c, d, x[ 1], S31, 0xa4beea44); HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); - HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); HH (b, c, d, a, x[10], S34, 0xbebfbc70); - HH (a, b, c, d, x[13], S31, 0x289b7ec6); HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); - HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); HH (b, c, d, a, x[ 6], S34, 0x04881d05); - HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); HH (d, a, b, c, x[12], S32, 0xe6db99e5); - HH (c, d, a, b, x[15], S33, 0x1fa27cf8); HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); - - II (a, b, c, d, x[ 0], S41, 0xf4292244); II (d, a, b, c, x[ 7], S42, 0x432aff97); - II (c, d, a, b, x[14], S43, 0xab9423a7); II (b, c, d, a, x[ 5], S44, 0xfc93a039); - II (a, b, c, d, x[12], S41, 0x655b59c3); II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); - II (c, d, a, b, x[10], S43, 0xffeff47d); II (b, c, d, a, x[ 1], S44, 0x85845dd1); - II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); II (d, a, b, c, x[15], S42, 0xfe2ce6e0); - II (c, d, a, b, x[ 6], S43, 0xa3014314); II (b, c, d, a, x[13], S44, 0x4e0811a1); - II (a, b, c, d, x[ 4], S41, 0xf7537e82); II (d, a, b, c, x[11], S42, 0xbd3af235); - II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); II (b, c, d, a, x[ 9], S44, 0xeb86d391); - - state[0] += a; - state[1] += b; - state[2] += c; - state[3] += d; - - zerostruct (x); - } - - void finish (void* result) noexcept - { - unsigned char encodedLength[8]; - encode (encodedLength, count, 8); - - // Pad out to 56 mod 64. - const int index = (count[0] >> 3) & 0x3f; - - const int paddingLength = (index < 56) ? (56 - index) - : (120 - index); - - uint8 paddingBuffer[64] = { 0x80 }; // first byte is 0x80, remaining bytes are zero. - processBlock (paddingBuffer, (size_t) paddingLength); - - processBlock (encodedLength, 8); - - encode (result, state, 16); - zerostruct (buffer); - } - -private: - uint8 buffer [64]; - uint32 state [4]; - uint32 count [2]; - - static void encode (void* const output, const void* const input, const int numBytes) noexcept - { - for (int i = 0; i < (numBytes >> 2); ++i) - static_cast (output)[i] = ByteOrder::swapIfBigEndian (static_cast (input) [i]); - } - - static inline uint32 rotateLeft (const uint32 x, const uint32 n) noexcept { return (x << n) | (x >> (32 - n)); } - - static inline uint32 F (const uint32 x, const uint32 y, const uint32 z) noexcept { return (x & y) | (~x & z); } - static inline uint32 G (const uint32 x, const uint32 y, const uint32 z) noexcept { return (x & z) | (y & ~z); } - static inline uint32 H (const uint32 x, const uint32 y, const uint32 z) noexcept { return x ^ y ^ z; } - static inline uint32 I (const uint32 x, const uint32 y, const uint32 z) noexcept { return y ^ (x | ~z); } - - static void FF (uint32& a, const uint32 b, const uint32 c, const uint32 d, const uint32 x, const uint32 s, const uint32 ac) noexcept - { - a += F (b, c, d) + x + ac; - a = rotateLeft (a, s) + b; - } - - static void GG (uint32& a, const uint32 b, const uint32 c, const uint32 d, const uint32 x, const uint32 s, const uint32 ac) noexcept - { - a += G (b, c, d) + x + ac; - a = rotateLeft (a, s) + b; - } - - static void HH (uint32& a, const uint32 b, const uint32 c, const uint32 d, const uint32 x, const uint32 s, const uint32 ac) noexcept - { - a += H (b, c, d) + x + ac; - a = rotateLeft (a, s) + b; - } - - static void II (uint32& a, const uint32 b, const uint32 c, const uint32 d, const uint32 x, const uint32 s, const uint32 ac) noexcept - { - a += I (b, c, d) + x + ac; - a = rotateLeft (a, s) + b; - } -}; - -//============================================================================== -MD5::MD5() noexcept -{ - zerostruct (result); -} - -MD5::MD5 (const MD5& other) noexcept -{ - memcpy (result, other.result, sizeof (result)); -} - -MD5& MD5::operator= (const MD5& other) noexcept -{ - memcpy (result, other.result, sizeof (result)); - return *this; -} - -//============================================================================== -MD5::MD5 (const MemoryBlock& data) noexcept -{ - processData (data.getData(), data.getSize()); -} - -MD5::MD5 (const void* data, const size_t numBytes) noexcept -{ - processData (data, numBytes); -} - -MD5::MD5 (CharPointer_UTF8 utf8) noexcept -{ - jassert (utf8.getAddress() != nullptr); - processData (utf8.getAddress(), utf8.sizeInBytes() - 1); -} - -MD5 MD5::fromUTF32 (StringRef text) -{ - MD5Generator generator; - String::CharPointerType t (text.text); - - while (! t.isEmpty()) - { - uint32 unicodeChar = ByteOrder::swapIfBigEndian ((uint32) t.getAndAdvance()); - generator.processBlock (&unicodeChar, sizeof (unicodeChar)); - } - - MD5 m; - generator.finish (m.result); - return m; -} - -MD5::MD5 (InputStream& input, int64 numBytesToRead) -{ - processStream (input, numBytesToRead); -} - -MD5::MD5 (const File& file) -{ - FileInputStream fin (file); - - if (fin.getStatus().wasOk()) - processStream (fin, -1); - else - zerostruct (result); -} - -MD5::~MD5() noexcept {} - -void MD5::processData (const void* data, size_t numBytes) noexcept -{ - MD5Generator generator; - generator.processBlock (data, numBytes); - generator.finish (result); -} - -void MD5::processStream (InputStream& input, int64 numBytesToRead) -{ - MD5Generator generator; - - if (numBytesToRead < 0) - numBytesToRead = std::numeric_limits::max(); - - while (numBytesToRead > 0) - { - uint8 tempBuffer [512]; - const int bytesRead = input.read (tempBuffer, (int) jmin (numBytesToRead, (int64) sizeof (tempBuffer))); - - if (bytesRead <= 0) - break; - - numBytesToRead -= bytesRead; - generator.processBlock (tempBuffer, (size_t) bytesRead); - } - - generator.finish (result); -} - -//============================================================================== -MemoryBlock MD5::getRawChecksumData() const -{ - return MemoryBlock (result, sizeof (result)); -} - -String MD5::toHexString() const -{ - return String::toHexString (result, sizeof (result), 0); -} - -//============================================================================== -bool MD5::operator== (const MD5& other) const noexcept { return memcmp (result, other.result, sizeof (result)) == 0; } -bool MD5::operator!= (const MD5& other) const noexcept { return ! operator== (other); } - - -//============================================================================== -#if JUCE_UNIT_TESTS - -class MD5Tests : public UnitTest -{ -public: - MD5Tests() : UnitTest ("MD5") {} - - void test (const char* input, const char* expected) - { - { - MD5 hash (input, strlen (input)); - expectEquals (hash.toHexString(), String (expected)); - } - - { - MemoryInputStream m (input, strlen (input), false); - MD5 hash (m); - expectEquals (hash.toHexString(), String (expected)); - } - } - - void runTest() - { - beginTest ("MD5"); - - test ("", "d41d8cd98f00b204e9800998ecf8427e"); - test ("The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6"); - test ("The quick brown fox jumps over the lazy dog.", "e4d909c290d0fb1ca068ffaddf22cbd0"); - } -}; - -static MD5Tests MD5UnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.h b/JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.h deleted file mode 100755 index f984cf5..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_MD5.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MD5_H_INCLUDED -#define JUCE_MD5_H_INCLUDED - - -//============================================================================== -/** - MD5 checksum class. - - Create one of these with a block of source data or a stream, and it calculates - the MD5 checksum of that data. - - You can then retrieve this checksum as a 16-byte block, or as a hex string. - @see SHA256 -*/ -class JUCE_API MD5 -{ -public: - //============================================================================== - /** Creates a null MD5 object. */ - MD5() noexcept; - - /** Creates a copy of another MD5. */ - MD5 (const MD5&) noexcept; - - /** Copies another MD5. */ - MD5& operator= (const MD5&) noexcept; - - //============================================================================== - /** Creates a checksum for a block of binary data. */ - explicit MD5 (const MemoryBlock&) noexcept; - - /** Creates a checksum for a block of binary data. */ - MD5 (const void* data, size_t numBytes) noexcept; - - /** Creates a checksum for the input from a stream. - - This will read up to the given number of bytes from the stream, and produce the - checksum of that. If the number of bytes to read is negative, it'll read - until the stream is exhausted. - */ - MD5 (InputStream& input, int64 numBytesToRead = -1); - - /** Creates a checksum for the contents of a file. */ - explicit MD5 (const File&); - - /** Creates a checksum of the characters in a UTF-8 buffer. - E.g. - @code MD5 checksum (myString.toUTF8()); - @endcode - */ - explicit MD5 (CharPointer_UTF8 utf8Text) noexcept; - - /** Destructor. */ - ~MD5() noexcept; - - //============================================================================== - /** Returns the checksum as a 16-byte block of data. */ - MemoryBlock getRawChecksumData() const; - - /** Returns a pointer to the 16-byte array of result data. */ - const uint8* getChecksumDataArray() const noexcept { return result; } - - /** Returns the checksum as a 32-digit hex string. */ - String toHexString() const; - - /** Creates an MD5 from a little-endian UTF-32 encoded string. - - Note that this method is provided for backwards-compatibility with the old - version of this class, which had a constructor that took a string and performed - this operation on it. In new code, you shouldn't use this, and are recommended to - use the constructor that takes a CharPointer_UTF8 instead. - */ - static MD5 fromUTF32 (StringRef); - - //============================================================================== - bool operator== (const MD5&) const noexcept; - bool operator!= (const MD5&) const noexcept; - - -private: - //============================================================================== - uint8 result [16]; - - void processData (const void*, size_t) noexcept; - void processStream (InputStream&, int64); - - // This private constructor is declared here to prevent you accidentally passing a - // String and having it unexpectedly call the constructor that takes a File. - explicit MD5 (const String&) JUCE_DELETED_FUNCTION; - - JUCE_LEAK_DETECTOR (MD5) -}; - - -#endif // JUCE_MD5_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.cpp b/JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.cpp deleted file mode 100755 index 15e6840..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.cpp +++ /dev/null @@ -1,275 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class SHA256Processor -{ -public: - SHA256Processor() noexcept - : length (0) - { - state[0] = 0x6a09e667; - state[1] = 0xbb67ae85; - state[2] = 0x3c6ef372; - state[3] = 0xa54ff53a; - state[4] = 0x510e527f; - state[5] = 0x9b05688c; - state[6] = 0x1f83d9ab; - state[7] = 0x5be0cd19; - } - - // expects 64 bytes of data - void processFullBlock (const void* const data) noexcept - { - const uint32 constants[] = - { - 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, - 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, - 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, - 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, - 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, - 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, - 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, - 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 - }; - - uint32 block[16], s[8]; - memcpy (s, state, sizeof (s)); - - for (int i = 0; i < 16; ++i) - block[i] = ByteOrder::bigEndianInt (addBytesToPointer (data, i * 4)); - - for (uint32 j = 0; j < 64; j += 16) - { - #define JUCE_SHA256(i) \ - s[(7 - i) & 7] += S1 (s[(4 - i) & 7]) + ch (s[(4 - i) & 7], s[(5 - i) & 7], s[(6 - i) & 7]) + constants[i + j] \ - + (j != 0 ? (block[i & 15] += s1 (block[(i - 2) & 15]) + block[(i - 7) & 15] + s0 (block[(i - 15) & 15])) \ - : block[i]); \ - s[(3 - i) & 7] += s[(7 - i) & 7]; \ - s[(7 - i) & 7] += S0 (s[(0 - i) & 7]) + maj (s[(0 - i) & 7], s[(1 - i) & 7], s[(2 - i) & 7]) - - JUCE_SHA256(0); JUCE_SHA256(1); JUCE_SHA256(2); JUCE_SHA256(3); JUCE_SHA256(4); JUCE_SHA256(5); JUCE_SHA256(6); JUCE_SHA256(7); - JUCE_SHA256(8); JUCE_SHA256(9); JUCE_SHA256(10); JUCE_SHA256(11); JUCE_SHA256(12); JUCE_SHA256(13); JUCE_SHA256(14); JUCE_SHA256(15); - #undef JUCE_SHA256 - } - - for (int i = 0; i < 8; ++i) - state[i] += s[i]; - - length += 64; - } - - void processFinalBlock (const void* const data, unsigned int numBytes) noexcept - { - jassert (numBytes < 64); - - length += numBytes; - length *= 8; // (the length is stored as a count of bits, not bytes) - - uint8 finalBlocks[128]; - - memcpy (finalBlocks, data, numBytes); - finalBlocks [numBytes++] = 128; // append a '1' bit - - while (numBytes != 56 && numBytes < 64 + 56) - finalBlocks [numBytes++] = 0; // pad with zeros.. - - for (int i = 8; --i >= 0;) - finalBlocks [numBytes++] = (uint8) (length >> (i * 8)); // append the length. - - jassert (numBytes == 64 || numBytes == 128); - - processFullBlock (finalBlocks); - - if (numBytes > 64) - processFullBlock (finalBlocks + 64); - } - - void copyResult (uint8* result) const noexcept - { - for (int i = 0; i < 8; ++i) - { - *result++ = (uint8) (state[i] >> 24); - *result++ = (uint8) (state[i] >> 16); - *result++ = (uint8) (state[i] >> 8); - *result++ = (uint8) state[i]; - } - } - - void processStream (InputStream& input, int64 numBytesToRead, uint8* const result) - { - if (numBytesToRead < 0) - numBytesToRead = std::numeric_limits::max(); - - for (;;) - { - uint8 buffer [64]; - const int bytesRead = input.read (buffer, (int) jmin (numBytesToRead, (int64) sizeof (buffer))); - - if (bytesRead < (int) sizeof (buffer)) - { - processFinalBlock (buffer, (unsigned int) bytesRead); - break; - } - - numBytesToRead -= sizeof (buffer); - processFullBlock (buffer); - } - - copyResult (result); - } - -private: - uint32 state[8]; - uint64 length; - - static inline uint32 rotate (const uint32 x, const uint32 y) noexcept { return (x >> y) | (x << (32 - y)); } - static inline uint32 ch (const uint32 x, const uint32 y, const uint32 z) noexcept { return z ^ ((y ^ z) & x); } - static inline uint32 maj (const uint32 x, const uint32 y, const uint32 z) noexcept { return y ^ ((y ^ z) & (x ^ y)); } - - static inline uint32 s0 (const uint32 x) noexcept { return rotate (x, 7) ^ rotate (x, 18) ^ (x >> 3); } - static inline uint32 s1 (const uint32 x) noexcept { return rotate (x, 17) ^ rotate (x, 19) ^ (x >> 10); } - static inline uint32 S0 (const uint32 x) noexcept { return rotate (x, 2) ^ rotate (x, 13) ^ rotate (x, 22); } - static inline uint32 S1 (const uint32 x) noexcept { return rotate (x, 6) ^ rotate (x, 11) ^ rotate (x, 25); } - - JUCE_DECLARE_NON_COPYABLE (SHA256Processor) -}; - -//============================================================================== -SHA256::SHA256() noexcept -{ - zerostruct (result); -} - -SHA256::~SHA256() noexcept {} - -SHA256::SHA256 (const SHA256& other) noexcept -{ - memcpy (result, other.result, sizeof (result)); -} - -SHA256& SHA256::operator= (const SHA256& other) noexcept -{ - memcpy (result, other.result, sizeof (result)); - return *this; -} - -SHA256::SHA256 (const MemoryBlock& data) -{ - process (data.getData(), data.getSize()); -} - -SHA256::SHA256 (const void* const data, const size_t numBytes) -{ - process (data, numBytes); -} - -SHA256::SHA256 (InputStream& input, const int64 numBytesToRead) -{ - SHA256Processor processor; - processor.processStream (input, numBytesToRead, result); -} - -SHA256::SHA256 (const File& file) -{ - FileInputStream fin (file); - - if (fin.getStatus().wasOk()) - { - SHA256Processor processor; - processor.processStream (fin, -1, result); - } - else - { - zerostruct (result); - } -} - -SHA256::SHA256 (CharPointer_UTF8 utf8) noexcept -{ - jassert (utf8.getAddress() != nullptr); - process (utf8.getAddress(), utf8.sizeInBytes() - 1); -} - -void SHA256::process (const void* const data, size_t numBytes) -{ - MemoryInputStream m (data, numBytes, false); - SHA256Processor processor; - processor.processStream (m, -1, result); -} - -MemoryBlock SHA256::getRawData() const -{ - return MemoryBlock (result, sizeof (result)); -} - -String SHA256::toHexString() const -{ - return String::toHexString (result, sizeof (result), 0); -} - -bool SHA256::operator== (const SHA256& other) const noexcept { return memcmp (result, other.result, sizeof (result)) == 0; } -bool SHA256::operator!= (const SHA256& other) const noexcept { return ! operator== (other); } - - -//============================================================================== -#if JUCE_UNIT_TESTS - -class SHA256Tests : public UnitTest -{ -public: - SHA256Tests() : UnitTest ("SHA-256") {} - - void test (const char* input, const char* expected) - { - { - SHA256 hash (input, strlen (input)); - expectEquals (hash.toHexString(), String (expected)); - } - - { - CharPointer_UTF8 utf8 (input); - SHA256 hash (utf8); - expectEquals (hash.toHexString(), String (expected)); - } - - { - MemoryInputStream m (input, strlen (input), false); - SHA256 hash (m); - expectEquals (hash.toHexString(), String (expected)); - } - } - - void runTest() - { - beginTest ("SHA256"); - - test ("", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"); - test ("The quick brown fox jumps over the lazy dog", "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592"); - test ("The quick brown fox jumps over the lazy dog.", "ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c"); - } -}; - -static SHA256Tests sha256UnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.h b/JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.h deleted file mode 100755 index d3d8e7f..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_SHA256.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_SHA256_H_INCLUDED -#define JUCE_SHA256_H_INCLUDED - - -//============================================================================== -/** - SHA-256 secure hash generator. - - Create one of these objects from a block of source data or a stream, and it - calculates the SHA-256 hash of that data. - - You can retrieve the hash as a raw 32-byte block, or as a 64-digit hex string. - @see MD5 -*/ -class JUCE_API SHA256 -{ -public: - //============================================================================== - /** Creates an empty SHA256 object. - The default constructor just creates a hash filled with zeros. (This is not - equal to the hash of an empty block of data). - */ - SHA256() noexcept; - - /** Destructor. */ - ~SHA256() noexcept; - - /** Creates a copy of another SHA256. */ - SHA256 (const SHA256& other) noexcept; - - /** Copies another SHA256. */ - SHA256& operator= (const SHA256& other) noexcept; - - //============================================================================== - /** Creates a hash from a block of raw data. */ - explicit SHA256 (const MemoryBlock& data); - - /** Creates a hash from a block of raw data. */ - SHA256 (const void* data, size_t numBytes); - - /** Creates a hash from the contents of a stream. - - This will read from the stream until the stream is exhausted, or until - maxBytesToRead bytes have been read. If maxBytesToRead is negative, the entire - stream will be read. - */ - SHA256 (InputStream& input, int64 maxBytesToRead = -1); - - /** Reads a file and generates the hash of its contents. - If the file can't be opened, the hash will be left uninitialised (i.e. full - of zeros). - */ - explicit SHA256 (const File& file); - - /** Creates a checksum from a UTF-8 buffer. - E.g. - @code SHA256 checksum (myString.toUTF8()); - @endcode - */ - explicit SHA256 (CharPointer_UTF8 utf8Text) noexcept; - - //============================================================================== - /** Returns the hash as a 32-byte block of data. */ - MemoryBlock getRawData() const; - - /** Returns the checksum as a 64-digit hex string. */ - String toHexString() const; - - //============================================================================== - bool operator== (const SHA256&) const noexcept; - bool operator!= (const SHA256&) const noexcept; - - -private: - //============================================================================== - uint8 result [32]; - void process (const void*, size_t); - - JUCE_LEAK_DETECTOR (SHA256) -}; - - -#endif // JUCE_SHA256_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_Whirlpool.cpp b/JuceLibraryCode/modules/juce_cryptography/hashing/juce_Whirlpool.cpp deleted file mode 100755 index 13bc4fb..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_Whirlpool.cpp +++ /dev/null @@ -1,661 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -struct WhirlpoolProcessor -{ - WhirlpoolProcessor() noexcept : bufferBits (0), bufferPos (0) - { - zeromem (bitLength, sizeof (bitLength)); - zeromem (buffer, sizeof (buffer)); - zeromem (hash, sizeof (hash)); - } - - void processStream (InputStream& input, int64 numBytesToRead, uint8* const result) - { - if (numBytesToRead < 0) - numBytesToRead = std::numeric_limits::max(); - - for (;;) - { - uint8 data[64]; - const int bytesRead = input.read (data, (int) jmin (numBytesToRead, (int64) sizeof (data))); - - add (data, bytesRead * 8); - - if (bytesRead < (int) sizeof (data)) - break; - - numBytesToRead -= sizeof (data); - } - - finalize (result); - } - - uint8 bitLength[32]; - uint8 buffer[64]; - int bufferBits, bufferPos; - uint64 hash[8]; - -private: - void add (const uint8* const source, int numBits) noexcept - { - int sourcePos = 0; // index of leftmost source uint8 containing data (1 to 8 bits) - int sourceGap = (8 - (numBits & 7)) & 7; // space on source[sourcePos] - int bufferRem = bufferBits & 7; // occupied bits on buffer[bufferPos] - - uint64 value = numBits, carry = 0; - - for (int i = 32; --i >= 0 && (carry != 0 || value != 0);) - { - carry += bitLength[i] + ((uint32) value & 0xff); - bitLength[i] = (uint8) carry; - carry >>= 8; - value >>= 8; - } - - uint32 b = 0; - - while (numBits > 8) - { - b = ((source[sourcePos] << sourceGap) & 0xff) - | ((source[sourcePos + 1] & 0xff) >> (8 - sourceGap)); - - buffer[bufferPos++] |= (uint8) (b >> bufferRem); - bufferBits += 8 - bufferRem; - - if (bufferBits == 64 * 8) - { - processNextBuffer(); - bufferBits = bufferPos = 0; - } - - buffer[bufferPos] = (uint8) (b << (8 - bufferRem)); - bufferBits += bufferRem; - - numBits -= 8; - ++sourcePos; - } - - if (numBits > 0) - { - b = (source[sourcePos] << sourceGap) & 0xff; - buffer[bufferPos] |= (b >> bufferRem); - } - else - { - b = 0; - } - - if (bufferRem + numBits < 8) - { - bufferBits += numBits; - } - else - { - ++bufferPos; - bufferBits += 8 - bufferRem; - numBits -= 8 - bufferRem; - - if (bufferBits == 64 * 8) - { - processNextBuffer(); - bufferBits = bufferPos = 0; - } - - buffer[bufferPos] = (uint8) (b << (8 - bufferRem)); - bufferBits += numBits; - } - } - - void finalize (uint8* const result) noexcept - { - // append a '1'-bit - buffer[bufferPos++] |= 0x80u >> (bufferBits & 7); - - // pad with zero bits to complete (N*(64*8) - (32*8)) bits - if (bufferPos > 32) - { - if (bufferPos < 64) - zeromem (buffer + bufferPos, 64 - bufferPos); - - processNextBuffer(); - bufferPos = 0; - } - - if (bufferPos < 32) - zeromem (buffer + bufferPos, 32 - bufferPos); - - bufferPos = 32; - memcpy (buffer + 32, bitLength, 32); // append bit length of hashed data - - processNextBuffer(); - - uint8* digest = result; - - for (int i = 0; i < 8; ++i) - { - digest[0] = (uint8) (hash[i] >> 56); - digest[1] = (uint8) (hash[i] >> 48); - digest[2] = (uint8) (hash[i] >> 40); - digest[3] = (uint8) (hash[i] >> 32); - digest[4] = (uint8) (hash[i] >> 24); - digest[5] = (uint8) (hash[i] >> 16); - digest[6] = (uint8) (hash[i] >> 8); - digest[7] = (uint8) hash[i]; - digest += 8; - } - } - - void processNextBuffer() noexcept - { - #undef X - #define X(value) value##ULL - - static const uint64 rc[] = - { X(0x1823c6e887b8014f), X(0x36a6d2f5796f9152), X(0x60bc9b8ea30c7b35), X(0x1de0d7c22e4bfe57), X(0x157737e59ff04ada), - X(0x58c9290ab1a06b85), X(0xbd5d10f4cb3e0567), X(0xe427418ba77d95d8), X(0xfbee7c66dd17479e), X(0xca2dbf07ad5a8333) - }; - - static const uint64 C0[] = - { X(0x18186018c07830d8), X(0x23238c2305af4626), X(0xc6c63fc67ef991b8), X(0xe8e887e8136fcdfb), X(0x878726874ca113cb), X(0xb8b8dab8a9626d11), X(0x0101040108050209), X(0x4f4f214f426e9e0d), - X(0x3636d836adee6c9b), X(0xa6a6a2a6590451ff), X(0xd2d26fd2debdb90c), X(0xf5f5f3f5fb06f70e), X(0x7979f979ef80f296), X(0x6f6fa16f5fcede30), X(0x91917e91fcef3f6d), X(0x52525552aa07a4f8), - X(0x60609d6027fdc047), X(0xbcbccabc89766535), X(0x9b9b569baccd2b37), X(0x8e8e028e048c018a), X(0xa3a3b6a371155bd2), X(0x0c0c300c603c186c), X(0x7b7bf17bff8af684), X(0x3535d435b5e16a80), - X(0x1d1d741de8693af5), X(0xe0e0a7e05347ddb3), X(0xd7d77bd7f6acb321), X(0xc2c22fc25eed999c), X(0x2e2eb82e6d965c43), X(0x4b4b314b627a9629), X(0xfefedffea321e15d), X(0x575741578216aed5), - X(0x15155415a8412abd), X(0x7777c1779fb6eee8), X(0x3737dc37a5eb6e92), X(0xe5e5b3e57b56d79e), X(0x9f9f469f8cd92313), X(0xf0f0e7f0d317fd23), X(0x4a4a354a6a7f9420), X(0xdada4fda9e95a944), - X(0x58587d58fa25b0a2), X(0xc9c903c906ca8fcf), X(0x2929a429558d527c), X(0x0a0a280a5022145a), X(0xb1b1feb1e14f7f50), X(0xa0a0baa0691a5dc9), X(0x6b6bb16b7fdad614), X(0x85852e855cab17d9), - X(0xbdbdcebd8173673c), X(0x5d5d695dd234ba8f), X(0x1010401080502090), X(0xf4f4f7f4f303f507), X(0xcbcb0bcb16c08bdd), X(0x3e3ef83eedc67cd3), X(0x0505140528110a2d), X(0x676781671fe6ce78), - X(0xe4e4b7e47353d597), X(0x27279c2725bb4e02), X(0x4141194132588273), X(0x8b8b168b2c9d0ba7), X(0xa7a7a6a7510153f6), X(0x7d7de97dcf94fab2), X(0x95956e95dcfb3749), X(0xd8d847d88e9fad56), - X(0xfbfbcbfb8b30eb70), X(0xeeee9fee2371c1cd), X(0x7c7ced7cc791f8bb), X(0x6666856617e3cc71), X(0xdddd53dda68ea77b), X(0x17175c17b84b2eaf), X(0x4747014702468e45), X(0x9e9e429e84dc211a), - X(0xcaca0fca1ec589d4), X(0x2d2db42d75995a58), X(0xbfbfc6bf9179632e), X(0x07071c07381b0e3f), X(0xadad8ead012347ac), X(0x5a5a755aea2fb4b0), X(0x838336836cb51bef), X(0x3333cc3385ff66b6), - X(0x636391633ff2c65c), X(0x02020802100a0412), X(0xaaaa92aa39384993), X(0x7171d971afa8e2de), X(0xc8c807c80ecf8dc6), X(0x19196419c87d32d1), X(0x494939497270923b), X(0xd9d943d9869aaf5f), - X(0xf2f2eff2c31df931), X(0xe3e3abe34b48dba8), X(0x5b5b715be22ab6b9), X(0x88881a8834920dbc), X(0x9a9a529aa4c8293e), X(0x262698262dbe4c0b), X(0x3232c8328dfa64bf), X(0xb0b0fab0e94a7d59), - X(0xe9e983e91b6acff2), X(0x0f0f3c0f78331e77), X(0xd5d573d5e6a6b733), X(0x80803a8074ba1df4), X(0xbebec2be997c6127), X(0xcdcd13cd26de87eb), X(0x3434d034bde46889), X(0x48483d487a759032), - X(0xffffdbffab24e354), X(0x7a7af57af78ff48d), X(0x90907a90f4ea3d64), X(0x5f5f615fc23ebe9d), X(0x202080201da0403d), X(0x6868bd6867d5d00f), X(0x1a1a681ad07234ca), X(0xaeae82ae192c41b7), - X(0xb4b4eab4c95e757d), X(0x54544d549a19a8ce), X(0x93937693ece53b7f), X(0x222288220daa442f), X(0x64648d6407e9c863), X(0xf1f1e3f1db12ff2a), X(0x7373d173bfa2e6cc), X(0x12124812905a2482), - X(0x40401d403a5d807a), X(0x0808200840281048), X(0xc3c32bc356e89b95), X(0xecec97ec337bc5df), X(0xdbdb4bdb9690ab4d), X(0xa1a1bea1611f5fc0), X(0x8d8d0e8d1c830791), X(0x3d3df43df5c97ac8), - X(0x97976697ccf1335b), X(0x0000000000000000), X(0xcfcf1bcf36d483f9), X(0x2b2bac2b4587566e), X(0x7676c57697b3ece1), X(0x8282328264b019e6), X(0xd6d67fd6fea9b128), X(0x1b1b6c1bd87736c3), - X(0xb5b5eeb5c15b7774), X(0xafaf86af112943be), X(0x6a6ab56a77dfd41d), X(0x50505d50ba0da0ea), X(0x45450945124c8a57), X(0xf3f3ebf3cb18fb38), X(0x3030c0309df060ad), X(0xefef9bef2b74c3c4), - X(0x3f3ffc3fe5c37eda), X(0x55554955921caac7), X(0xa2a2b2a2791059db), X(0xeaea8fea0365c9e9), X(0x656589650fecca6a), X(0xbabad2bab9686903), X(0x2f2fbc2f65935e4a), X(0xc0c027c04ee79d8e), - X(0xdede5fdebe81a160), X(0x1c1c701ce06c38fc), X(0xfdfdd3fdbb2ee746), X(0x4d4d294d52649a1f), X(0x92927292e4e03976), X(0x7575c9758fbceafa), X(0x06061806301e0c36), X(0x8a8a128a249809ae), - X(0xb2b2f2b2f940794b), X(0xe6e6bfe66359d185), X(0x0e0e380e70361c7e), X(0x1f1f7c1ff8633ee7), X(0x6262956237f7c455), X(0xd4d477d4eea3b53a), X(0xa8a89aa829324d81), X(0x96966296c4f43152), - X(0xf9f9c3f99b3aef62), X(0xc5c533c566f697a3), X(0x2525942535b14a10), X(0x59597959f220b2ab), X(0x84842a8454ae15d0), X(0x7272d572b7a7e4c5), X(0x3939e439d5dd72ec), X(0x4c4c2d4c5a619816), - X(0x5e5e655eca3bbc94), X(0x7878fd78e785f09f), X(0x3838e038ddd870e5), X(0x8c8c0a8c14860598), X(0xd1d163d1c6b2bf17), X(0xa5a5aea5410b57e4), X(0xe2e2afe2434dd9a1), X(0x616199612ff8c24e), - X(0xb3b3f6b3f1457b42), X(0x2121842115a54234), X(0x9c9c4a9c94d62508), X(0x1e1e781ef0663cee), X(0x4343114322528661), X(0xc7c73bc776fc93b1), X(0xfcfcd7fcb32be54f), X(0x0404100420140824), - X(0x51515951b208a2e3), X(0x99995e99bcc72f25), X(0x6d6da96d4fc4da22), X(0x0d0d340d68391a65), X(0xfafacffa8335e979), X(0xdfdf5bdfb684a369), X(0x7e7ee57ed79bfca9), X(0x242490243db44819), - X(0x3b3bec3bc5d776fe), X(0xabab96ab313d4b9a), X(0xcece1fce3ed181f0), X(0x1111441188552299), X(0x8f8f068f0c890383), X(0x4e4e254e4a6b9c04), X(0xb7b7e6b7d1517366), X(0xebeb8beb0b60cbe0), - X(0x3c3cf03cfdcc78c1), X(0x81813e817cbf1ffd), X(0x94946a94d4fe3540), X(0xf7f7fbf7eb0cf31c), X(0xb9b9deb9a1676f18), X(0x13134c13985f268b), X(0x2c2cb02c7d9c5851), X(0xd3d36bd3d6b8bb05), - X(0xe7e7bbe76b5cd38c), X(0x6e6ea56e57cbdc39), X(0xc4c437c46ef395aa), X(0x03030c03180f061b), X(0x565645568a13acdc), X(0x44440d441a49885e), X(0x7f7fe17fdf9efea0), X(0xa9a99ea921374f88), - X(0x2a2aa82a4d825467), X(0xbbbbd6bbb16d6b0a), X(0xc1c123c146e29f87), X(0x53535153a202a6f1), X(0xdcdc57dcae8ba572), X(0x0b0b2c0b58271653), X(0x9d9d4e9d9cd32701), X(0x6c6cad6c47c1d82b), - X(0x3131c43195f562a4), X(0x7474cd7487b9e8f3), X(0xf6f6fff6e309f115), X(0x464605460a438c4c), X(0xacac8aac092645a5), X(0x89891e893c970fb5), X(0x14145014a04428b4), X(0xe1e1a3e15b42dfba), - X(0x16165816b04e2ca6), X(0x3a3ae83acdd274f7), X(0x6969b9696fd0d206), X(0x09092409482d1241), X(0x7070dd70a7ade0d7), X(0xb6b6e2b6d954716f), X(0xd0d067d0ceb7bd1e), X(0xeded93ed3b7ec7d6), - X(0xcccc17cc2edb85e2), X(0x424215422a578468), X(0x98985a98b4c22d2c), X(0xa4a4aaa4490e55ed), X(0x2828a0285d885075), X(0x5c5c6d5cda31b886), X(0xf8f8c7f8933fed6b), X(0x8686228644a411c2) - }; - - static const uint64 C1[] = - { X(0xd818186018c07830), X(0x2623238c2305af46), X(0xb8c6c63fc67ef991), X(0xfbe8e887e8136fcd), X(0xcb878726874ca113), X(0x11b8b8dab8a9626d), X(0x0901010401080502), X(0x0d4f4f214f426e9e), - X(0x9b3636d836adee6c), X(0xffa6a6a2a6590451), X(0x0cd2d26fd2debdb9), X(0x0ef5f5f3f5fb06f7), X(0x967979f979ef80f2), X(0x306f6fa16f5fcede), X(0x6d91917e91fcef3f), X(0xf852525552aa07a4), - X(0x4760609d6027fdc0), X(0x35bcbccabc897665), X(0x379b9b569baccd2b), X(0x8a8e8e028e048c01), X(0xd2a3a3b6a371155b), X(0x6c0c0c300c603c18), X(0x847b7bf17bff8af6), X(0x803535d435b5e16a), - X(0xf51d1d741de8693a), X(0xb3e0e0a7e05347dd), X(0x21d7d77bd7f6acb3), X(0x9cc2c22fc25eed99), X(0x432e2eb82e6d965c), X(0x294b4b314b627a96), X(0x5dfefedffea321e1), X(0xd5575741578216ae), - X(0xbd15155415a8412a), X(0xe87777c1779fb6ee), X(0x923737dc37a5eb6e), X(0x9ee5e5b3e57b56d7), X(0x139f9f469f8cd923), X(0x23f0f0e7f0d317fd), X(0x204a4a354a6a7f94), X(0x44dada4fda9e95a9), - X(0xa258587d58fa25b0), X(0xcfc9c903c906ca8f), X(0x7c2929a429558d52), X(0x5a0a0a280a502214), X(0x50b1b1feb1e14f7f), X(0xc9a0a0baa0691a5d), X(0x146b6bb16b7fdad6), X(0xd985852e855cab17), - X(0x3cbdbdcebd817367), X(0x8f5d5d695dd234ba), X(0x9010104010805020), X(0x07f4f4f7f4f303f5), X(0xddcbcb0bcb16c08b), X(0xd33e3ef83eedc67c), X(0x2d0505140528110a), X(0x78676781671fe6ce), - X(0x97e4e4b7e47353d5), X(0x0227279c2725bb4e), X(0x7341411941325882), X(0xa78b8b168b2c9d0b), X(0xf6a7a7a6a7510153), X(0xb27d7de97dcf94fa), X(0x4995956e95dcfb37), X(0x56d8d847d88e9fad), - X(0x70fbfbcbfb8b30eb), X(0xcdeeee9fee2371c1), X(0xbb7c7ced7cc791f8), X(0x716666856617e3cc), X(0x7bdddd53dda68ea7), X(0xaf17175c17b84b2e), X(0x454747014702468e), X(0x1a9e9e429e84dc21), - X(0xd4caca0fca1ec589), X(0x582d2db42d75995a), X(0x2ebfbfc6bf917963), X(0x3f07071c07381b0e), X(0xacadad8ead012347), X(0xb05a5a755aea2fb4), X(0xef838336836cb51b), X(0xb63333cc3385ff66), - X(0x5c636391633ff2c6), X(0x1202020802100a04), X(0x93aaaa92aa393849), X(0xde7171d971afa8e2), X(0xc6c8c807c80ecf8d), X(0xd119196419c87d32), X(0x3b49493949727092), X(0x5fd9d943d9869aaf), - X(0x31f2f2eff2c31df9), X(0xa8e3e3abe34b48db), X(0xb95b5b715be22ab6), X(0xbc88881a8834920d), X(0x3e9a9a529aa4c829), X(0x0b262698262dbe4c), X(0xbf3232c8328dfa64), X(0x59b0b0fab0e94a7d), - X(0xf2e9e983e91b6acf), X(0x770f0f3c0f78331e), X(0x33d5d573d5e6a6b7), X(0xf480803a8074ba1d), X(0x27bebec2be997c61), X(0xebcdcd13cd26de87), X(0x893434d034bde468), X(0x3248483d487a7590), - X(0x54ffffdbffab24e3), X(0x8d7a7af57af78ff4), X(0x6490907a90f4ea3d), X(0x9d5f5f615fc23ebe), X(0x3d202080201da040), X(0x0f6868bd6867d5d0), X(0xca1a1a681ad07234), X(0xb7aeae82ae192c41), - X(0x7db4b4eab4c95e75), X(0xce54544d549a19a8), X(0x7f93937693ece53b), X(0x2f222288220daa44), X(0x6364648d6407e9c8), X(0x2af1f1e3f1db12ff), X(0xcc7373d173bfa2e6), X(0x8212124812905a24), - X(0x7a40401d403a5d80), X(0x4808082008402810), X(0x95c3c32bc356e89b), X(0xdfecec97ec337bc5), X(0x4ddbdb4bdb9690ab), X(0xc0a1a1bea1611f5f), X(0x918d8d0e8d1c8307), X(0xc83d3df43df5c97a), - X(0x5b97976697ccf133), X(0x0000000000000000), X(0xf9cfcf1bcf36d483), X(0x6e2b2bac2b458756), X(0xe17676c57697b3ec), X(0xe68282328264b019), X(0x28d6d67fd6fea9b1), X(0xc31b1b6c1bd87736), - X(0x74b5b5eeb5c15b77), X(0xbeafaf86af112943), X(0x1d6a6ab56a77dfd4), X(0xea50505d50ba0da0), X(0x5745450945124c8a), X(0x38f3f3ebf3cb18fb), X(0xad3030c0309df060), X(0xc4efef9bef2b74c3), - X(0xda3f3ffc3fe5c37e), X(0xc755554955921caa), X(0xdba2a2b2a2791059), X(0xe9eaea8fea0365c9), X(0x6a656589650fecca), X(0x03babad2bab96869), X(0x4a2f2fbc2f65935e), X(0x8ec0c027c04ee79d), - X(0x60dede5fdebe81a1), X(0xfc1c1c701ce06c38), X(0x46fdfdd3fdbb2ee7), X(0x1f4d4d294d52649a), X(0x7692927292e4e039), X(0xfa7575c9758fbcea), X(0x3606061806301e0c), X(0xae8a8a128a249809), - X(0x4bb2b2f2b2f94079), X(0x85e6e6bfe66359d1), X(0x7e0e0e380e70361c), X(0xe71f1f7c1ff8633e), X(0x556262956237f7c4), X(0x3ad4d477d4eea3b5), X(0x81a8a89aa829324d), X(0x5296966296c4f431), - X(0x62f9f9c3f99b3aef), X(0xa3c5c533c566f697), X(0x102525942535b14a), X(0xab59597959f220b2), X(0xd084842a8454ae15), X(0xc57272d572b7a7e4), X(0xec3939e439d5dd72), X(0x164c4c2d4c5a6198), - X(0x945e5e655eca3bbc), X(0x9f7878fd78e785f0), X(0xe53838e038ddd870), X(0x988c8c0a8c148605), X(0x17d1d163d1c6b2bf), X(0xe4a5a5aea5410b57), X(0xa1e2e2afe2434dd9), X(0x4e616199612ff8c2), - X(0x42b3b3f6b3f1457b), X(0x342121842115a542), X(0x089c9c4a9c94d625), X(0xee1e1e781ef0663c), X(0x6143431143225286), X(0xb1c7c73bc776fc93), X(0x4ffcfcd7fcb32be5), X(0x2404041004201408), - X(0xe351515951b208a2), X(0x2599995e99bcc72f), X(0x226d6da96d4fc4da), X(0x650d0d340d68391a), X(0x79fafacffa8335e9), X(0x69dfdf5bdfb684a3), X(0xa97e7ee57ed79bfc), X(0x19242490243db448), - X(0xfe3b3bec3bc5d776), X(0x9aabab96ab313d4b), X(0xf0cece1fce3ed181), X(0x9911114411885522), X(0x838f8f068f0c8903), X(0x044e4e254e4a6b9c), X(0x66b7b7e6b7d15173), X(0xe0ebeb8beb0b60cb), - X(0xc13c3cf03cfdcc78), X(0xfd81813e817cbf1f), X(0x4094946a94d4fe35), X(0x1cf7f7fbf7eb0cf3), X(0x18b9b9deb9a1676f), X(0x8b13134c13985f26), X(0x512c2cb02c7d9c58), X(0x05d3d36bd3d6b8bb), - X(0x8ce7e7bbe76b5cd3), X(0x396e6ea56e57cbdc), X(0xaac4c437c46ef395), X(0x1b03030c03180f06), X(0xdc565645568a13ac), X(0x5e44440d441a4988), X(0xa07f7fe17fdf9efe), X(0x88a9a99ea921374f), - X(0x672a2aa82a4d8254), X(0x0abbbbd6bbb16d6b), X(0x87c1c123c146e29f), X(0xf153535153a202a6), X(0x72dcdc57dcae8ba5), X(0x530b0b2c0b582716), X(0x019d9d4e9d9cd327), X(0x2b6c6cad6c47c1d8), - X(0xa43131c43195f562), X(0xf37474cd7487b9e8), X(0x15f6f6fff6e309f1), X(0x4c464605460a438c), X(0xa5acac8aac092645), X(0xb589891e893c970f), X(0xb414145014a04428), X(0xbae1e1a3e15b42df), - X(0xa616165816b04e2c), X(0xf73a3ae83acdd274), X(0x066969b9696fd0d2), X(0x4109092409482d12), X(0xd77070dd70a7ade0), X(0x6fb6b6e2b6d95471), X(0x1ed0d067d0ceb7bd), X(0xd6eded93ed3b7ec7), - X(0xe2cccc17cc2edb85), X(0x68424215422a5784), X(0x2c98985a98b4c22d), X(0xeda4a4aaa4490e55), X(0x752828a0285d8850), X(0x865c5c6d5cda31b8), X(0x6bf8f8c7f8933fed), X(0xc28686228644a411) - }; - - static const uint64 C2[] = - { X(0x30d818186018c078), X(0x462623238c2305af), X(0x91b8c6c63fc67ef9), X(0xcdfbe8e887e8136f), X(0x13cb878726874ca1), X(0x6d11b8b8dab8a962), X(0x0209010104010805), X(0x9e0d4f4f214f426e), - X(0x6c9b3636d836adee), X(0x51ffa6a6a2a65904), X(0xb90cd2d26fd2debd), X(0xf70ef5f5f3f5fb06), X(0xf2967979f979ef80), X(0xde306f6fa16f5fce), X(0x3f6d91917e91fcef), X(0xa4f852525552aa07), - X(0xc04760609d6027fd), X(0x6535bcbccabc8976), X(0x2b379b9b569baccd), X(0x018a8e8e028e048c), X(0x5bd2a3a3b6a37115), X(0x186c0c0c300c603c), X(0xf6847b7bf17bff8a), X(0x6a803535d435b5e1), - X(0x3af51d1d741de869), X(0xddb3e0e0a7e05347), X(0xb321d7d77bd7f6ac), X(0x999cc2c22fc25eed), X(0x5c432e2eb82e6d96), X(0x96294b4b314b627a), X(0xe15dfefedffea321), X(0xaed5575741578216), - X(0x2abd15155415a841), X(0xeee87777c1779fb6), X(0x6e923737dc37a5eb), X(0xd79ee5e5b3e57b56), X(0x23139f9f469f8cd9), X(0xfd23f0f0e7f0d317), X(0x94204a4a354a6a7f), X(0xa944dada4fda9e95), - X(0xb0a258587d58fa25), X(0x8fcfc9c903c906ca), X(0x527c2929a429558d), X(0x145a0a0a280a5022), X(0x7f50b1b1feb1e14f), X(0x5dc9a0a0baa0691a), X(0xd6146b6bb16b7fda), X(0x17d985852e855cab), - X(0x673cbdbdcebd8173), X(0xba8f5d5d695dd234), X(0x2090101040108050), X(0xf507f4f4f7f4f303), X(0x8bddcbcb0bcb16c0), X(0x7cd33e3ef83eedc6), X(0x0a2d050514052811), X(0xce78676781671fe6), - X(0xd597e4e4b7e47353), X(0x4e0227279c2725bb), X(0x8273414119413258), X(0x0ba78b8b168b2c9d), X(0x53f6a7a7a6a75101), X(0xfab27d7de97dcf94), X(0x374995956e95dcfb), X(0xad56d8d847d88e9f), - X(0xeb70fbfbcbfb8b30), X(0xc1cdeeee9fee2371), X(0xf8bb7c7ced7cc791), X(0xcc716666856617e3), X(0xa77bdddd53dda68e), X(0x2eaf17175c17b84b), X(0x8e45474701470246), X(0x211a9e9e429e84dc), - X(0x89d4caca0fca1ec5), X(0x5a582d2db42d7599), X(0x632ebfbfc6bf9179), X(0x0e3f07071c07381b), X(0x47acadad8ead0123), X(0xb4b05a5a755aea2f), X(0x1bef838336836cb5), X(0x66b63333cc3385ff), - X(0xc65c636391633ff2), X(0x041202020802100a), X(0x4993aaaa92aa3938), X(0xe2de7171d971afa8), X(0x8dc6c8c807c80ecf), X(0x32d119196419c87d), X(0x923b494939497270), X(0xaf5fd9d943d9869a), - X(0xf931f2f2eff2c31d), X(0xdba8e3e3abe34b48), X(0xb6b95b5b715be22a), X(0x0dbc88881a883492), X(0x293e9a9a529aa4c8), X(0x4c0b262698262dbe), X(0x64bf3232c8328dfa), X(0x7d59b0b0fab0e94a), - X(0xcff2e9e983e91b6a), X(0x1e770f0f3c0f7833), X(0xb733d5d573d5e6a6), X(0x1df480803a8074ba), X(0x6127bebec2be997c), X(0x87ebcdcd13cd26de), X(0x68893434d034bde4), X(0x903248483d487a75), - X(0xe354ffffdbffab24), X(0xf48d7a7af57af78f), X(0x3d6490907a90f4ea), X(0xbe9d5f5f615fc23e), X(0x403d202080201da0), X(0xd00f6868bd6867d5), X(0x34ca1a1a681ad072), X(0x41b7aeae82ae192c), - X(0x757db4b4eab4c95e), X(0xa8ce54544d549a19), X(0x3b7f93937693ece5), X(0x442f222288220daa), X(0xc86364648d6407e9), X(0xff2af1f1e3f1db12), X(0xe6cc7373d173bfa2), X(0x248212124812905a), - X(0x807a40401d403a5d), X(0x1048080820084028), X(0x9b95c3c32bc356e8), X(0xc5dfecec97ec337b), X(0xab4ddbdb4bdb9690), X(0x5fc0a1a1bea1611f), X(0x07918d8d0e8d1c83), X(0x7ac83d3df43df5c9), - X(0x335b97976697ccf1), X(0x0000000000000000), X(0x83f9cfcf1bcf36d4), X(0x566e2b2bac2b4587), X(0xece17676c57697b3), X(0x19e68282328264b0), X(0xb128d6d67fd6fea9), X(0x36c31b1b6c1bd877), - X(0x7774b5b5eeb5c15b), X(0x43beafaf86af1129), X(0xd41d6a6ab56a77df), X(0xa0ea50505d50ba0d), X(0x8a5745450945124c), X(0xfb38f3f3ebf3cb18), X(0x60ad3030c0309df0), X(0xc3c4efef9bef2b74), - X(0x7eda3f3ffc3fe5c3), X(0xaac755554955921c), X(0x59dba2a2b2a27910), X(0xc9e9eaea8fea0365), X(0xca6a656589650fec), X(0x6903babad2bab968), X(0x5e4a2f2fbc2f6593), X(0x9d8ec0c027c04ee7), - X(0xa160dede5fdebe81), X(0x38fc1c1c701ce06c), X(0xe746fdfdd3fdbb2e), X(0x9a1f4d4d294d5264), X(0x397692927292e4e0), X(0xeafa7575c9758fbc), X(0x0c3606061806301e), X(0x09ae8a8a128a2498), - X(0x794bb2b2f2b2f940), X(0xd185e6e6bfe66359), X(0x1c7e0e0e380e7036), X(0x3ee71f1f7c1ff863), X(0xc4556262956237f7), X(0xb53ad4d477d4eea3), X(0x4d81a8a89aa82932), X(0x315296966296c4f4), - X(0xef62f9f9c3f99b3a), X(0x97a3c5c533c566f6), X(0x4a102525942535b1), X(0xb2ab59597959f220), X(0x15d084842a8454ae), X(0xe4c57272d572b7a7), X(0x72ec3939e439d5dd), X(0x98164c4c2d4c5a61), - X(0xbc945e5e655eca3b), X(0xf09f7878fd78e785), X(0x70e53838e038ddd8), X(0x05988c8c0a8c1486), X(0xbf17d1d163d1c6b2), X(0x57e4a5a5aea5410b), X(0xd9a1e2e2afe2434d), X(0xc24e616199612ff8), - X(0x7b42b3b3f6b3f145), X(0x42342121842115a5), X(0x25089c9c4a9c94d6), X(0x3cee1e1e781ef066), X(0x8661434311432252), X(0x93b1c7c73bc776fc), X(0xe54ffcfcd7fcb32b), X(0x0824040410042014), - X(0xa2e351515951b208), X(0x2f2599995e99bcc7), X(0xda226d6da96d4fc4), X(0x1a650d0d340d6839), X(0xe979fafacffa8335), X(0xa369dfdf5bdfb684), X(0xfca97e7ee57ed79b), X(0x4819242490243db4), - X(0x76fe3b3bec3bc5d7), X(0x4b9aabab96ab313d), X(0x81f0cece1fce3ed1), X(0x2299111144118855), X(0x03838f8f068f0c89), X(0x9c044e4e254e4a6b), X(0x7366b7b7e6b7d151), X(0xcbe0ebeb8beb0b60), - X(0x78c13c3cf03cfdcc), X(0x1ffd81813e817cbf), X(0x354094946a94d4fe), X(0xf31cf7f7fbf7eb0c), X(0x6f18b9b9deb9a167), X(0x268b13134c13985f), X(0x58512c2cb02c7d9c), X(0xbb05d3d36bd3d6b8), - X(0xd38ce7e7bbe76b5c), X(0xdc396e6ea56e57cb), X(0x95aac4c437c46ef3), X(0x061b03030c03180f), X(0xacdc565645568a13), X(0x885e44440d441a49), X(0xfea07f7fe17fdf9e), X(0x4f88a9a99ea92137), - X(0x54672a2aa82a4d82), X(0x6b0abbbbd6bbb16d), X(0x9f87c1c123c146e2), X(0xa6f153535153a202), X(0xa572dcdc57dcae8b), X(0x16530b0b2c0b5827), X(0x27019d9d4e9d9cd3), X(0xd82b6c6cad6c47c1), - X(0x62a43131c43195f5), X(0xe8f37474cd7487b9), X(0xf115f6f6fff6e309), X(0x8c4c464605460a43), X(0x45a5acac8aac0926), X(0x0fb589891e893c97), X(0x28b414145014a044), X(0xdfbae1e1a3e15b42), - X(0x2ca616165816b04e), X(0x74f73a3ae83acdd2), X(0xd2066969b9696fd0), X(0x124109092409482d), X(0xe0d77070dd70a7ad), X(0x716fb6b6e2b6d954), X(0xbd1ed0d067d0ceb7), X(0xc7d6eded93ed3b7e), - X(0x85e2cccc17cc2edb), X(0x8468424215422a57), X(0x2d2c98985a98b4c2), X(0x55eda4a4aaa4490e), X(0x50752828a0285d88), X(0xb8865c5c6d5cda31), X(0xed6bf8f8c7f8933f), X(0x11c28686228644a4) - }; - - static const uint64 C3[] = - { X(0x7830d818186018c0), X(0xaf462623238c2305), X(0xf991b8c6c63fc67e), X(0x6fcdfbe8e887e813), X(0xa113cb878726874c), X(0x626d11b8b8dab8a9), X(0x0502090101040108), X(0x6e9e0d4f4f214f42), - X(0xee6c9b3636d836ad), X(0x0451ffa6a6a2a659), X(0xbdb90cd2d26fd2de), X(0x06f70ef5f5f3f5fb), X(0x80f2967979f979ef), X(0xcede306f6fa16f5f), X(0xef3f6d91917e91fc), X(0x07a4f852525552aa), - X(0xfdc04760609d6027), X(0x766535bcbccabc89), X(0xcd2b379b9b569bac), X(0x8c018a8e8e028e04), X(0x155bd2a3a3b6a371), X(0x3c186c0c0c300c60), X(0x8af6847b7bf17bff), X(0xe16a803535d435b5), - X(0x693af51d1d741de8), X(0x47ddb3e0e0a7e053), X(0xacb321d7d77bd7f6), X(0xed999cc2c22fc25e), X(0x965c432e2eb82e6d), X(0x7a96294b4b314b62), X(0x21e15dfefedffea3), X(0x16aed55757415782), - X(0x412abd15155415a8), X(0xb6eee87777c1779f), X(0xeb6e923737dc37a5), X(0x56d79ee5e5b3e57b), X(0xd923139f9f469f8c), X(0x17fd23f0f0e7f0d3), X(0x7f94204a4a354a6a), X(0x95a944dada4fda9e), - X(0x25b0a258587d58fa), X(0xca8fcfc9c903c906), X(0x8d527c2929a42955), X(0x22145a0a0a280a50), X(0x4f7f50b1b1feb1e1), X(0x1a5dc9a0a0baa069), X(0xdad6146b6bb16b7f), X(0xab17d985852e855c), - X(0x73673cbdbdcebd81), X(0x34ba8f5d5d695dd2), X(0x5020901010401080), X(0x03f507f4f4f7f4f3), X(0xc08bddcbcb0bcb16), X(0xc67cd33e3ef83eed), X(0x110a2d0505140528), X(0xe6ce78676781671f), - X(0x53d597e4e4b7e473), X(0xbb4e0227279c2725), X(0x5882734141194132), X(0x9d0ba78b8b168b2c), X(0x0153f6a7a7a6a751), X(0x94fab27d7de97dcf), X(0xfb374995956e95dc), X(0x9fad56d8d847d88e), - X(0x30eb70fbfbcbfb8b), X(0x71c1cdeeee9fee23), X(0x91f8bb7c7ced7cc7), X(0xe3cc716666856617), X(0x8ea77bdddd53dda6), X(0x4b2eaf17175c17b8), X(0x468e454747014702), X(0xdc211a9e9e429e84), - X(0xc589d4caca0fca1e), X(0x995a582d2db42d75), X(0x79632ebfbfc6bf91), X(0x1b0e3f07071c0738), X(0x2347acadad8ead01), X(0x2fb4b05a5a755aea), X(0xb51bef838336836c), X(0xff66b63333cc3385), - X(0xf2c65c636391633f), X(0x0a04120202080210), X(0x384993aaaa92aa39), X(0xa8e2de7171d971af), X(0xcf8dc6c8c807c80e), X(0x7d32d119196419c8), X(0x70923b4949394972), X(0x9aaf5fd9d943d986), - X(0x1df931f2f2eff2c3), X(0x48dba8e3e3abe34b), X(0x2ab6b95b5b715be2), X(0x920dbc88881a8834), X(0xc8293e9a9a529aa4), X(0xbe4c0b262698262d), X(0xfa64bf3232c8328d), X(0x4a7d59b0b0fab0e9), - X(0x6acff2e9e983e91b), X(0x331e770f0f3c0f78), X(0xa6b733d5d573d5e6), X(0xba1df480803a8074), X(0x7c6127bebec2be99), X(0xde87ebcdcd13cd26), X(0xe468893434d034bd), X(0x75903248483d487a), - X(0x24e354ffffdbffab), X(0x8ff48d7a7af57af7), X(0xea3d6490907a90f4), X(0x3ebe9d5f5f615fc2), X(0xa0403d202080201d), X(0xd5d00f6868bd6867), X(0x7234ca1a1a681ad0), X(0x2c41b7aeae82ae19), - X(0x5e757db4b4eab4c9), X(0x19a8ce54544d549a), X(0xe53b7f93937693ec), X(0xaa442f222288220d), X(0xe9c86364648d6407), X(0x12ff2af1f1e3f1db), X(0xa2e6cc7373d173bf), X(0x5a24821212481290), - X(0x5d807a40401d403a), X(0x2810480808200840), X(0xe89b95c3c32bc356), X(0x7bc5dfecec97ec33), X(0x90ab4ddbdb4bdb96), X(0x1f5fc0a1a1bea161), X(0x8307918d8d0e8d1c), X(0xc97ac83d3df43df5), - X(0xf1335b97976697cc), X(0x0000000000000000), X(0xd483f9cfcf1bcf36), X(0x87566e2b2bac2b45), X(0xb3ece17676c57697), X(0xb019e68282328264), X(0xa9b128d6d67fd6fe), X(0x7736c31b1b6c1bd8), - X(0x5b7774b5b5eeb5c1), X(0x2943beafaf86af11), X(0xdfd41d6a6ab56a77), X(0x0da0ea50505d50ba), X(0x4c8a574545094512), X(0x18fb38f3f3ebf3cb), X(0xf060ad3030c0309d), X(0x74c3c4efef9bef2b), - X(0xc37eda3f3ffc3fe5), X(0x1caac75555495592), X(0x1059dba2a2b2a279), X(0x65c9e9eaea8fea03), X(0xecca6a656589650f), X(0x686903babad2bab9), X(0x935e4a2f2fbc2f65), X(0xe79d8ec0c027c04e), - X(0x81a160dede5fdebe), X(0x6c38fc1c1c701ce0), X(0x2ee746fdfdd3fdbb), X(0x649a1f4d4d294d52), X(0xe0397692927292e4), X(0xbceafa7575c9758f), X(0x1e0c360606180630), X(0x9809ae8a8a128a24), - X(0x40794bb2b2f2b2f9), X(0x59d185e6e6bfe663), X(0x361c7e0e0e380e70), X(0x633ee71f1f7c1ff8), X(0xf7c4556262956237), X(0xa3b53ad4d477d4ee), X(0x324d81a8a89aa829), X(0xf4315296966296c4), - X(0x3aef62f9f9c3f99b), X(0xf697a3c5c533c566), X(0xb14a102525942535), X(0x20b2ab59597959f2), X(0xae15d084842a8454), X(0xa7e4c57272d572b7), X(0xdd72ec3939e439d5), X(0x6198164c4c2d4c5a), - X(0x3bbc945e5e655eca), X(0x85f09f7878fd78e7), X(0xd870e53838e038dd), X(0x8605988c8c0a8c14), X(0xb2bf17d1d163d1c6), X(0x0b57e4a5a5aea541), X(0x4dd9a1e2e2afe243), X(0xf8c24e616199612f), - X(0x457b42b3b3f6b3f1), X(0xa542342121842115), X(0xd625089c9c4a9c94), X(0x663cee1e1e781ef0), X(0x5286614343114322), X(0xfc93b1c7c73bc776), X(0x2be54ffcfcd7fcb3), X(0x1408240404100420), - X(0x08a2e351515951b2), X(0xc72f2599995e99bc), X(0xc4da226d6da96d4f), X(0x391a650d0d340d68), X(0x35e979fafacffa83), X(0x84a369dfdf5bdfb6), X(0x9bfca97e7ee57ed7), X(0xb44819242490243d), - X(0xd776fe3b3bec3bc5), X(0x3d4b9aabab96ab31), X(0xd181f0cece1fce3e), X(0x5522991111441188), X(0x8903838f8f068f0c), X(0x6b9c044e4e254e4a), X(0x517366b7b7e6b7d1), X(0x60cbe0ebeb8beb0b), - X(0xcc78c13c3cf03cfd), X(0xbf1ffd81813e817c), X(0xfe354094946a94d4), X(0x0cf31cf7f7fbf7eb), X(0x676f18b9b9deb9a1), X(0x5f268b13134c1398), X(0x9c58512c2cb02c7d), X(0xb8bb05d3d36bd3d6), - X(0x5cd38ce7e7bbe76b), X(0xcbdc396e6ea56e57), X(0xf395aac4c437c46e), X(0x0f061b03030c0318), X(0x13acdc565645568a), X(0x49885e44440d441a), X(0x9efea07f7fe17fdf), X(0x374f88a9a99ea921), - X(0x8254672a2aa82a4d), X(0x6d6b0abbbbd6bbb1), X(0xe29f87c1c123c146), X(0x02a6f153535153a2), X(0x8ba572dcdc57dcae), X(0x2716530b0b2c0b58), X(0xd327019d9d4e9d9c), X(0xc1d82b6c6cad6c47), - X(0xf562a43131c43195), X(0xb9e8f37474cd7487), X(0x09f115f6f6fff6e3), X(0x438c4c464605460a), X(0x2645a5acac8aac09), X(0x970fb589891e893c), X(0x4428b414145014a0), X(0x42dfbae1e1a3e15b), - X(0x4e2ca616165816b0), X(0xd274f73a3ae83acd), X(0xd0d2066969b9696f), X(0x2d12410909240948), X(0xade0d77070dd70a7), X(0x54716fb6b6e2b6d9), X(0xb7bd1ed0d067d0ce), X(0x7ec7d6eded93ed3b), - X(0xdb85e2cccc17cc2e), X(0x578468424215422a), X(0xc22d2c98985a98b4), X(0x0e55eda4a4aaa449), X(0x8850752828a0285d), X(0x31b8865c5c6d5cda), X(0x3fed6bf8f8c7f893), X(0xa411c28686228644) - }; - - static const uint64 C4[] = - { X(0xc07830d818186018), X(0x05af462623238c23), X(0x7ef991b8c6c63fc6), X(0x136fcdfbe8e887e8), X(0x4ca113cb87872687), X(0xa9626d11b8b8dab8), X(0x0805020901010401), X(0x426e9e0d4f4f214f), - X(0xadee6c9b3636d836), X(0x590451ffa6a6a2a6), X(0xdebdb90cd2d26fd2), X(0xfb06f70ef5f5f3f5), X(0xef80f2967979f979), X(0x5fcede306f6fa16f), X(0xfcef3f6d91917e91), X(0xaa07a4f852525552), - X(0x27fdc04760609d60), X(0x89766535bcbccabc), X(0xaccd2b379b9b569b), X(0x048c018a8e8e028e), X(0x71155bd2a3a3b6a3), X(0x603c186c0c0c300c), X(0xff8af6847b7bf17b), X(0xb5e16a803535d435), - X(0xe8693af51d1d741d), X(0x5347ddb3e0e0a7e0), X(0xf6acb321d7d77bd7), X(0x5eed999cc2c22fc2), X(0x6d965c432e2eb82e), X(0x627a96294b4b314b), X(0xa321e15dfefedffe), X(0x8216aed557574157), - X(0xa8412abd15155415), X(0x9fb6eee87777c177), X(0xa5eb6e923737dc37), X(0x7b56d79ee5e5b3e5), X(0x8cd923139f9f469f), X(0xd317fd23f0f0e7f0), X(0x6a7f94204a4a354a), X(0x9e95a944dada4fda), - X(0xfa25b0a258587d58), X(0x06ca8fcfc9c903c9), X(0x558d527c2929a429), X(0x5022145a0a0a280a), X(0xe14f7f50b1b1feb1), X(0x691a5dc9a0a0baa0), X(0x7fdad6146b6bb16b), X(0x5cab17d985852e85), - X(0x8173673cbdbdcebd), X(0xd234ba8f5d5d695d), X(0x8050209010104010), X(0xf303f507f4f4f7f4), X(0x16c08bddcbcb0bcb), X(0xedc67cd33e3ef83e), X(0x28110a2d05051405), X(0x1fe6ce7867678167), - X(0x7353d597e4e4b7e4), X(0x25bb4e0227279c27), X(0x3258827341411941), X(0x2c9d0ba78b8b168b), X(0x510153f6a7a7a6a7), X(0xcf94fab27d7de97d), X(0xdcfb374995956e95), X(0x8e9fad56d8d847d8), - X(0x8b30eb70fbfbcbfb), X(0x2371c1cdeeee9fee), X(0xc791f8bb7c7ced7c), X(0x17e3cc7166668566), X(0xa68ea77bdddd53dd), X(0xb84b2eaf17175c17), X(0x02468e4547470147), X(0x84dc211a9e9e429e), - X(0x1ec589d4caca0fca), X(0x75995a582d2db42d), X(0x9179632ebfbfc6bf), X(0x381b0e3f07071c07), X(0x012347acadad8ead), X(0xea2fb4b05a5a755a), X(0x6cb51bef83833683), X(0x85ff66b63333cc33), - X(0x3ff2c65c63639163), X(0x100a041202020802), X(0x39384993aaaa92aa), X(0xafa8e2de7171d971), X(0x0ecf8dc6c8c807c8), X(0xc87d32d119196419), X(0x7270923b49493949), X(0x869aaf5fd9d943d9), - X(0xc31df931f2f2eff2), X(0x4b48dba8e3e3abe3), X(0xe22ab6b95b5b715b), X(0x34920dbc88881a88), X(0xa4c8293e9a9a529a), X(0x2dbe4c0b26269826), X(0x8dfa64bf3232c832), X(0xe94a7d59b0b0fab0), - X(0x1b6acff2e9e983e9), X(0x78331e770f0f3c0f), X(0xe6a6b733d5d573d5), X(0x74ba1df480803a80), X(0x997c6127bebec2be), X(0x26de87ebcdcd13cd), X(0xbde468893434d034), X(0x7a75903248483d48), - X(0xab24e354ffffdbff), X(0xf78ff48d7a7af57a), X(0xf4ea3d6490907a90), X(0xc23ebe9d5f5f615f), X(0x1da0403d20208020), X(0x67d5d00f6868bd68), X(0xd07234ca1a1a681a), X(0x192c41b7aeae82ae), - X(0xc95e757db4b4eab4), X(0x9a19a8ce54544d54), X(0xece53b7f93937693), X(0x0daa442f22228822), X(0x07e9c86364648d64), X(0xdb12ff2af1f1e3f1), X(0xbfa2e6cc7373d173), X(0x905a248212124812), - X(0x3a5d807a40401d40), X(0x4028104808082008), X(0x56e89b95c3c32bc3), X(0x337bc5dfecec97ec), X(0x9690ab4ddbdb4bdb), X(0x611f5fc0a1a1bea1), X(0x1c8307918d8d0e8d), X(0xf5c97ac83d3df43d), - X(0xccf1335b97976697), X(0x0000000000000000), X(0x36d483f9cfcf1bcf), X(0x4587566e2b2bac2b), X(0x97b3ece17676c576), X(0x64b019e682823282), X(0xfea9b128d6d67fd6), X(0xd87736c31b1b6c1b), - X(0xc15b7774b5b5eeb5), X(0x112943beafaf86af), X(0x77dfd41d6a6ab56a), X(0xba0da0ea50505d50), X(0x124c8a5745450945), X(0xcb18fb38f3f3ebf3), X(0x9df060ad3030c030), X(0x2b74c3c4efef9bef), - X(0xe5c37eda3f3ffc3f), X(0x921caac755554955), X(0x791059dba2a2b2a2), X(0x0365c9e9eaea8fea), X(0x0fecca6a65658965), X(0xb9686903babad2ba), X(0x65935e4a2f2fbc2f), X(0x4ee79d8ec0c027c0), - X(0xbe81a160dede5fde), X(0xe06c38fc1c1c701c), X(0xbb2ee746fdfdd3fd), X(0x52649a1f4d4d294d), X(0xe4e0397692927292), X(0x8fbceafa7575c975), X(0x301e0c3606061806), X(0x249809ae8a8a128a), - X(0xf940794bb2b2f2b2), X(0x6359d185e6e6bfe6), X(0x70361c7e0e0e380e), X(0xf8633ee71f1f7c1f), X(0x37f7c45562629562), X(0xeea3b53ad4d477d4), X(0x29324d81a8a89aa8), X(0xc4f4315296966296), - X(0x9b3aef62f9f9c3f9), X(0x66f697a3c5c533c5), X(0x35b14a1025259425), X(0xf220b2ab59597959), X(0x54ae15d084842a84), X(0xb7a7e4c57272d572), X(0xd5dd72ec3939e439), X(0x5a6198164c4c2d4c), - X(0xca3bbc945e5e655e), X(0xe785f09f7878fd78), X(0xddd870e53838e038), X(0x148605988c8c0a8c), X(0xc6b2bf17d1d163d1), X(0x410b57e4a5a5aea5), X(0x434dd9a1e2e2afe2), X(0x2ff8c24e61619961), - X(0xf1457b42b3b3f6b3), X(0x15a5423421218421), X(0x94d625089c9c4a9c), X(0xf0663cee1e1e781e), X(0x2252866143431143), X(0x76fc93b1c7c73bc7), X(0xb32be54ffcfcd7fc), X(0x2014082404041004), - X(0xb208a2e351515951), X(0xbcc72f2599995e99), X(0x4fc4da226d6da96d), X(0x68391a650d0d340d), X(0x8335e979fafacffa), X(0xb684a369dfdf5bdf), X(0xd79bfca97e7ee57e), X(0x3db4481924249024), - X(0xc5d776fe3b3bec3b), X(0x313d4b9aabab96ab), X(0x3ed181f0cece1fce), X(0x8855229911114411), X(0x0c8903838f8f068f), X(0x4a6b9c044e4e254e), X(0xd1517366b7b7e6b7), X(0x0b60cbe0ebeb8beb), - X(0xfdcc78c13c3cf03c), X(0x7cbf1ffd81813e81), X(0xd4fe354094946a94), X(0xeb0cf31cf7f7fbf7), X(0xa1676f18b9b9deb9), X(0x985f268b13134c13), X(0x7d9c58512c2cb02c), X(0xd6b8bb05d3d36bd3), - X(0x6b5cd38ce7e7bbe7), X(0x57cbdc396e6ea56e), X(0x6ef395aac4c437c4), X(0x180f061b03030c03), X(0x8a13acdc56564556), X(0x1a49885e44440d44), X(0xdf9efea07f7fe17f), X(0x21374f88a9a99ea9), - X(0x4d8254672a2aa82a), X(0xb16d6b0abbbbd6bb), X(0x46e29f87c1c123c1), X(0xa202a6f153535153), X(0xae8ba572dcdc57dc), X(0x582716530b0b2c0b), X(0x9cd327019d9d4e9d), X(0x47c1d82b6c6cad6c), - X(0x95f562a43131c431), X(0x87b9e8f37474cd74), X(0xe309f115f6f6fff6), X(0x0a438c4c46460546), X(0x092645a5acac8aac), X(0x3c970fb589891e89), X(0xa04428b414145014), X(0x5b42dfbae1e1a3e1), - X(0xb04e2ca616165816), X(0xcdd274f73a3ae83a), X(0x6fd0d2066969b969), X(0x482d124109092409), X(0xa7ade0d77070dd70), X(0xd954716fb6b6e2b6), X(0xceb7bd1ed0d067d0), X(0x3b7ec7d6eded93ed), - X(0x2edb85e2cccc17cc), X(0x2a57846842421542), X(0xb4c22d2c98985a98), X(0x490e55eda4a4aaa4), X(0x5d8850752828a028), X(0xda31b8865c5c6d5c), X(0x933fed6bf8f8c7f8), X(0x44a411c286862286) - }; - - static const uint64 C5[] = - { X(0x18c07830d8181860), X(0x2305af462623238c), X(0xc67ef991b8c6c63f), X(0xe8136fcdfbe8e887), X(0x874ca113cb878726), X(0xb8a9626d11b8b8da), X(0x0108050209010104), X(0x4f426e9e0d4f4f21), - X(0x36adee6c9b3636d8), X(0xa6590451ffa6a6a2), X(0xd2debdb90cd2d26f), X(0xf5fb06f70ef5f5f3), X(0x79ef80f2967979f9), X(0x6f5fcede306f6fa1), X(0x91fcef3f6d91917e), X(0x52aa07a4f8525255), - X(0x6027fdc04760609d), X(0xbc89766535bcbcca), X(0x9baccd2b379b9b56), X(0x8e048c018a8e8e02), X(0xa371155bd2a3a3b6), X(0x0c603c186c0c0c30), X(0x7bff8af6847b7bf1), X(0x35b5e16a803535d4), - X(0x1de8693af51d1d74), X(0xe05347ddb3e0e0a7), X(0xd7f6acb321d7d77b), X(0xc25eed999cc2c22f), X(0x2e6d965c432e2eb8), X(0x4b627a96294b4b31), X(0xfea321e15dfefedf), X(0x578216aed5575741), - X(0x15a8412abd151554), X(0x779fb6eee87777c1), X(0x37a5eb6e923737dc), X(0xe57b56d79ee5e5b3), X(0x9f8cd923139f9f46), X(0xf0d317fd23f0f0e7), X(0x4a6a7f94204a4a35), X(0xda9e95a944dada4f), - X(0x58fa25b0a258587d), X(0xc906ca8fcfc9c903), X(0x29558d527c2929a4), X(0x0a5022145a0a0a28), X(0xb1e14f7f50b1b1fe), X(0xa0691a5dc9a0a0ba), X(0x6b7fdad6146b6bb1), X(0x855cab17d985852e), - X(0xbd8173673cbdbdce), X(0x5dd234ba8f5d5d69), X(0x1080502090101040), X(0xf4f303f507f4f4f7), X(0xcb16c08bddcbcb0b), X(0x3eedc67cd33e3ef8), X(0x0528110a2d050514), X(0x671fe6ce78676781), - X(0xe47353d597e4e4b7), X(0x2725bb4e0227279c), X(0x4132588273414119), X(0x8b2c9d0ba78b8b16), X(0xa7510153f6a7a7a6), X(0x7dcf94fab27d7de9), X(0x95dcfb374995956e), X(0xd88e9fad56d8d847), - X(0xfb8b30eb70fbfbcb), X(0xee2371c1cdeeee9f), X(0x7cc791f8bb7c7ced), X(0x6617e3cc71666685), X(0xdda68ea77bdddd53), X(0x17b84b2eaf17175c), X(0x4702468e45474701), X(0x9e84dc211a9e9e42), - X(0xca1ec589d4caca0f), X(0x2d75995a582d2db4), X(0xbf9179632ebfbfc6), X(0x07381b0e3f07071c), X(0xad012347acadad8e), X(0x5aea2fb4b05a5a75), X(0x836cb51bef838336), X(0x3385ff66b63333cc), - X(0x633ff2c65c636391), X(0x02100a0412020208), X(0xaa39384993aaaa92), X(0x71afa8e2de7171d9), X(0xc80ecf8dc6c8c807), X(0x19c87d32d1191964), X(0x497270923b494939), X(0xd9869aaf5fd9d943), - X(0xf2c31df931f2f2ef), X(0xe34b48dba8e3e3ab), X(0x5be22ab6b95b5b71), X(0x8834920dbc88881a), X(0x9aa4c8293e9a9a52), X(0x262dbe4c0b262698), X(0x328dfa64bf3232c8), X(0xb0e94a7d59b0b0fa), - X(0xe91b6acff2e9e983), X(0x0f78331e770f0f3c), X(0xd5e6a6b733d5d573), X(0x8074ba1df480803a), X(0xbe997c6127bebec2), X(0xcd26de87ebcdcd13), X(0x34bde468893434d0), X(0x487a75903248483d), - X(0xffab24e354ffffdb), X(0x7af78ff48d7a7af5), X(0x90f4ea3d6490907a), X(0x5fc23ebe9d5f5f61), X(0x201da0403d202080), X(0x6867d5d00f6868bd), X(0x1ad07234ca1a1a68), X(0xae192c41b7aeae82), - X(0xb4c95e757db4b4ea), X(0x549a19a8ce54544d), X(0x93ece53b7f939376), X(0x220daa442f222288), X(0x6407e9c86364648d), X(0xf1db12ff2af1f1e3), X(0x73bfa2e6cc7373d1), X(0x12905a2482121248), - X(0x403a5d807a40401d), X(0x0840281048080820), X(0xc356e89b95c3c32b), X(0xec337bc5dfecec97), X(0xdb9690ab4ddbdb4b), X(0xa1611f5fc0a1a1be), X(0x8d1c8307918d8d0e), X(0x3df5c97ac83d3df4), - X(0x97ccf1335b979766), X(0x0000000000000000), X(0xcf36d483f9cfcf1b), X(0x2b4587566e2b2bac), X(0x7697b3ece17676c5), X(0x8264b019e6828232), X(0xd6fea9b128d6d67f), X(0x1bd87736c31b1b6c), - X(0xb5c15b7774b5b5ee), X(0xaf112943beafaf86), X(0x6a77dfd41d6a6ab5), X(0x50ba0da0ea50505d), X(0x45124c8a57454509), X(0xf3cb18fb38f3f3eb), X(0x309df060ad3030c0), X(0xef2b74c3c4efef9b), - X(0x3fe5c37eda3f3ffc), X(0x55921caac7555549), X(0xa2791059dba2a2b2), X(0xea0365c9e9eaea8f), X(0x650fecca6a656589), X(0xbab9686903babad2), X(0x2f65935e4a2f2fbc), X(0xc04ee79d8ec0c027), - X(0xdebe81a160dede5f), X(0x1ce06c38fc1c1c70), X(0xfdbb2ee746fdfdd3), X(0x4d52649a1f4d4d29), X(0x92e4e03976929272), X(0x758fbceafa7575c9), X(0x06301e0c36060618), X(0x8a249809ae8a8a12), - X(0xb2f940794bb2b2f2), X(0xe66359d185e6e6bf), X(0x0e70361c7e0e0e38), X(0x1ff8633ee71f1f7c), X(0x6237f7c455626295), X(0xd4eea3b53ad4d477), X(0xa829324d81a8a89a), X(0x96c4f43152969662), - X(0xf99b3aef62f9f9c3), X(0xc566f697a3c5c533), X(0x2535b14a10252594), X(0x59f220b2ab595979), X(0x8454ae15d084842a), X(0x72b7a7e4c57272d5), X(0x39d5dd72ec3939e4), X(0x4c5a6198164c4c2d), - X(0x5eca3bbc945e5e65), X(0x78e785f09f7878fd), X(0x38ddd870e53838e0), X(0x8c148605988c8c0a), X(0xd1c6b2bf17d1d163), X(0xa5410b57e4a5a5ae), X(0xe2434dd9a1e2e2af), X(0x612ff8c24e616199), - X(0xb3f1457b42b3b3f6), X(0x2115a54234212184), X(0x9c94d625089c9c4a), X(0x1ef0663cee1e1e78), X(0x4322528661434311), X(0xc776fc93b1c7c73b), X(0xfcb32be54ffcfcd7), X(0x0420140824040410), - X(0x51b208a2e3515159), X(0x99bcc72f2599995e), X(0x6d4fc4da226d6da9), X(0x0d68391a650d0d34), X(0xfa8335e979fafacf), X(0xdfb684a369dfdf5b), X(0x7ed79bfca97e7ee5), X(0x243db44819242490), - X(0x3bc5d776fe3b3bec), X(0xab313d4b9aabab96), X(0xce3ed181f0cece1f), X(0x1188552299111144), X(0x8f0c8903838f8f06), X(0x4e4a6b9c044e4e25), X(0xb7d1517366b7b7e6), X(0xeb0b60cbe0ebeb8b), - X(0x3cfdcc78c13c3cf0), X(0x817cbf1ffd81813e), X(0x94d4fe354094946a), X(0xf7eb0cf31cf7f7fb), X(0xb9a1676f18b9b9de), X(0x13985f268b13134c), X(0x2c7d9c58512c2cb0), X(0xd3d6b8bb05d3d36b), - X(0xe76b5cd38ce7e7bb), X(0x6e57cbdc396e6ea5), X(0xc46ef395aac4c437), X(0x03180f061b03030c), X(0x568a13acdc565645), X(0x441a49885e44440d), X(0x7fdf9efea07f7fe1), X(0xa921374f88a9a99e), - X(0x2a4d8254672a2aa8), X(0xbbb16d6b0abbbbd6), X(0xc146e29f87c1c123), X(0x53a202a6f1535351), X(0xdcae8ba572dcdc57), X(0x0b582716530b0b2c), X(0x9d9cd327019d9d4e), X(0x6c47c1d82b6c6cad), - X(0x3195f562a43131c4), X(0x7487b9e8f37474cd), X(0xf6e309f115f6f6ff), X(0x460a438c4c464605), X(0xac092645a5acac8a), X(0x893c970fb589891e), X(0x14a04428b4141450), X(0xe15b42dfbae1e1a3), - X(0x16b04e2ca6161658), X(0x3acdd274f73a3ae8), X(0x696fd0d2066969b9), X(0x09482d1241090924), X(0x70a7ade0d77070dd), X(0xb6d954716fb6b6e2), X(0xd0ceb7bd1ed0d067), X(0xed3b7ec7d6eded93), - X(0xcc2edb85e2cccc17), X(0x422a578468424215), X(0x98b4c22d2c98985a), X(0xa4490e55eda4a4aa), X(0x285d8850752828a0), X(0x5cda31b8865c5c6d), X(0xf8933fed6bf8f8c7), X(0x8644a411c2868622) - }; - - static const uint64 C6[] = - { X(0x6018c07830d81818), X(0x8c2305af46262323), X(0x3fc67ef991b8c6c6), X(0x87e8136fcdfbe8e8), X(0x26874ca113cb8787), X(0xdab8a9626d11b8b8), X(0x0401080502090101), X(0x214f426e9e0d4f4f), - X(0xd836adee6c9b3636), X(0xa2a6590451ffa6a6), X(0x6fd2debdb90cd2d2), X(0xf3f5fb06f70ef5f5), X(0xf979ef80f2967979), X(0xa16f5fcede306f6f), X(0x7e91fcef3f6d9191), X(0x5552aa07a4f85252), - X(0x9d6027fdc0476060), X(0xcabc89766535bcbc), X(0x569baccd2b379b9b), X(0x028e048c018a8e8e), X(0xb6a371155bd2a3a3), X(0x300c603c186c0c0c), X(0xf17bff8af6847b7b), X(0xd435b5e16a803535), - X(0x741de8693af51d1d), X(0xa7e05347ddb3e0e0), X(0x7bd7f6acb321d7d7), X(0x2fc25eed999cc2c2), X(0xb82e6d965c432e2e), X(0x314b627a96294b4b), X(0xdffea321e15dfefe), X(0x41578216aed55757), - X(0x5415a8412abd1515), X(0xc1779fb6eee87777), X(0xdc37a5eb6e923737), X(0xb3e57b56d79ee5e5), X(0x469f8cd923139f9f), X(0xe7f0d317fd23f0f0), X(0x354a6a7f94204a4a), X(0x4fda9e95a944dada), - X(0x7d58fa25b0a25858), X(0x03c906ca8fcfc9c9), X(0xa429558d527c2929), X(0x280a5022145a0a0a), X(0xfeb1e14f7f50b1b1), X(0xbaa0691a5dc9a0a0), X(0xb16b7fdad6146b6b), X(0x2e855cab17d98585), - X(0xcebd8173673cbdbd), X(0x695dd234ba8f5d5d), X(0x4010805020901010), X(0xf7f4f303f507f4f4), X(0x0bcb16c08bddcbcb), X(0xf83eedc67cd33e3e), X(0x140528110a2d0505), X(0x81671fe6ce786767), - X(0xb7e47353d597e4e4), X(0x9c2725bb4e022727), X(0x1941325882734141), X(0x168b2c9d0ba78b8b), X(0xa6a7510153f6a7a7), X(0xe97dcf94fab27d7d), X(0x6e95dcfb37499595), X(0x47d88e9fad56d8d8), - X(0xcbfb8b30eb70fbfb), X(0x9fee2371c1cdeeee), X(0xed7cc791f8bb7c7c), X(0x856617e3cc716666), X(0x53dda68ea77bdddd), X(0x5c17b84b2eaf1717), X(0x014702468e454747), X(0x429e84dc211a9e9e), - X(0x0fca1ec589d4caca), X(0xb42d75995a582d2d), X(0xc6bf9179632ebfbf), X(0x1c07381b0e3f0707), X(0x8ead012347acadad), X(0x755aea2fb4b05a5a), X(0x36836cb51bef8383), X(0xcc3385ff66b63333), - X(0x91633ff2c65c6363), X(0x0802100a04120202), X(0x92aa39384993aaaa), X(0xd971afa8e2de7171), X(0x07c80ecf8dc6c8c8), X(0x6419c87d32d11919), X(0x39497270923b4949), X(0x43d9869aaf5fd9d9), - X(0xeff2c31df931f2f2), X(0xabe34b48dba8e3e3), X(0x715be22ab6b95b5b), X(0x1a8834920dbc8888), X(0x529aa4c8293e9a9a), X(0x98262dbe4c0b2626), X(0xc8328dfa64bf3232), X(0xfab0e94a7d59b0b0), - X(0x83e91b6acff2e9e9), X(0x3c0f78331e770f0f), X(0x73d5e6a6b733d5d5), X(0x3a8074ba1df48080), X(0xc2be997c6127bebe), X(0x13cd26de87ebcdcd), X(0xd034bde468893434), X(0x3d487a7590324848), - X(0xdbffab24e354ffff), X(0xf57af78ff48d7a7a), X(0x7a90f4ea3d649090), X(0x615fc23ebe9d5f5f), X(0x80201da0403d2020), X(0xbd6867d5d00f6868), X(0x681ad07234ca1a1a), X(0x82ae192c41b7aeae), - X(0xeab4c95e757db4b4), X(0x4d549a19a8ce5454), X(0x7693ece53b7f9393), X(0x88220daa442f2222), X(0x8d6407e9c8636464), X(0xe3f1db12ff2af1f1), X(0xd173bfa2e6cc7373), X(0x4812905a24821212), - X(0x1d403a5d807a4040), X(0x2008402810480808), X(0x2bc356e89b95c3c3), X(0x97ec337bc5dfecec), X(0x4bdb9690ab4ddbdb), X(0xbea1611f5fc0a1a1), X(0x0e8d1c8307918d8d), X(0xf43df5c97ac83d3d), - X(0x6697ccf1335b9797), X(0x0000000000000000), X(0x1bcf36d483f9cfcf), X(0xac2b4587566e2b2b), X(0xc57697b3ece17676), X(0x328264b019e68282), X(0x7fd6fea9b128d6d6), X(0x6c1bd87736c31b1b), - X(0xeeb5c15b7774b5b5), X(0x86af112943beafaf), X(0xb56a77dfd41d6a6a), X(0x5d50ba0da0ea5050), X(0x0945124c8a574545), X(0xebf3cb18fb38f3f3), X(0xc0309df060ad3030), X(0x9bef2b74c3c4efef), - X(0xfc3fe5c37eda3f3f), X(0x4955921caac75555), X(0xb2a2791059dba2a2), X(0x8fea0365c9e9eaea), X(0x89650fecca6a6565), X(0xd2bab9686903baba), X(0xbc2f65935e4a2f2f), X(0x27c04ee79d8ec0c0), - X(0x5fdebe81a160dede), X(0x701ce06c38fc1c1c), X(0xd3fdbb2ee746fdfd), X(0x294d52649a1f4d4d), X(0x7292e4e039769292), X(0xc9758fbceafa7575), X(0x1806301e0c360606), X(0x128a249809ae8a8a), - X(0xf2b2f940794bb2b2), X(0xbfe66359d185e6e6), X(0x380e70361c7e0e0e), X(0x7c1ff8633ee71f1f), X(0x956237f7c4556262), X(0x77d4eea3b53ad4d4), X(0x9aa829324d81a8a8), X(0x6296c4f431529696), - X(0xc3f99b3aef62f9f9), X(0x33c566f697a3c5c5), X(0x942535b14a102525), X(0x7959f220b2ab5959), X(0x2a8454ae15d08484), X(0xd572b7a7e4c57272), X(0xe439d5dd72ec3939), X(0x2d4c5a6198164c4c), - X(0x655eca3bbc945e5e), X(0xfd78e785f09f7878), X(0xe038ddd870e53838), X(0x0a8c148605988c8c), X(0x63d1c6b2bf17d1d1), X(0xaea5410b57e4a5a5), X(0xafe2434dd9a1e2e2), X(0x99612ff8c24e6161), - X(0xf6b3f1457b42b3b3), X(0x842115a542342121), X(0x4a9c94d625089c9c), X(0x781ef0663cee1e1e), X(0x1143225286614343), X(0x3bc776fc93b1c7c7), X(0xd7fcb32be54ffcfc), X(0x1004201408240404), - X(0x5951b208a2e35151), X(0x5e99bcc72f259999), X(0xa96d4fc4da226d6d), X(0x340d68391a650d0d), X(0xcffa8335e979fafa), X(0x5bdfb684a369dfdf), X(0xe57ed79bfca97e7e), X(0x90243db448192424), - X(0xec3bc5d776fe3b3b), X(0x96ab313d4b9aabab), X(0x1fce3ed181f0cece), X(0x4411885522991111), X(0x068f0c8903838f8f), X(0x254e4a6b9c044e4e), X(0xe6b7d1517366b7b7), X(0x8beb0b60cbe0ebeb), - X(0xf03cfdcc78c13c3c), X(0x3e817cbf1ffd8181), X(0x6a94d4fe35409494), X(0xfbf7eb0cf31cf7f7), X(0xdeb9a1676f18b9b9), X(0x4c13985f268b1313), X(0xb02c7d9c58512c2c), X(0x6bd3d6b8bb05d3d3), - X(0xbbe76b5cd38ce7e7), X(0xa56e57cbdc396e6e), X(0x37c46ef395aac4c4), X(0x0c03180f061b0303), X(0x45568a13acdc5656), X(0x0d441a49885e4444), X(0xe17fdf9efea07f7f), X(0x9ea921374f88a9a9), - X(0xa82a4d8254672a2a), X(0xd6bbb16d6b0abbbb), X(0x23c146e29f87c1c1), X(0x5153a202a6f15353), X(0x57dcae8ba572dcdc), X(0x2c0b582716530b0b), X(0x4e9d9cd327019d9d), X(0xad6c47c1d82b6c6c), - X(0xc43195f562a43131), X(0xcd7487b9e8f37474), X(0xfff6e309f115f6f6), X(0x05460a438c4c4646), X(0x8aac092645a5acac), X(0x1e893c970fb58989), X(0x5014a04428b41414), X(0xa3e15b42dfbae1e1), - X(0x5816b04e2ca61616), X(0xe83acdd274f73a3a), X(0xb9696fd0d2066969), X(0x2409482d12410909), X(0xdd70a7ade0d77070), X(0xe2b6d954716fb6b6), X(0x67d0ceb7bd1ed0d0), X(0x93ed3b7ec7d6eded), - X(0x17cc2edb85e2cccc), X(0x15422a5784684242), X(0x5a98b4c22d2c9898), X(0xaaa4490e55eda4a4), X(0xa0285d8850752828), X(0x6d5cda31b8865c5c), X(0xc7f8933fed6bf8f8), X(0x228644a411c28686) - }; - - static const uint64 C7[] = - { X(0x186018c07830d818), X(0x238c2305af462623), X(0xc63fc67ef991b8c6), X(0xe887e8136fcdfbe8), X(0x8726874ca113cb87), X(0xb8dab8a9626d11b8), X(0x0104010805020901), X(0x4f214f426e9e0d4f), - X(0x36d836adee6c9b36), X(0xa6a2a6590451ffa6), X(0xd26fd2debdb90cd2), X(0xf5f3f5fb06f70ef5), X(0x79f979ef80f29679), X(0x6fa16f5fcede306f), X(0x917e91fcef3f6d91), X(0x525552aa07a4f852), - X(0x609d6027fdc04760), X(0xbccabc89766535bc), X(0x9b569baccd2b379b), X(0x8e028e048c018a8e), X(0xa3b6a371155bd2a3), X(0x0c300c603c186c0c), X(0x7bf17bff8af6847b), X(0x35d435b5e16a8035), - X(0x1d741de8693af51d), X(0xe0a7e05347ddb3e0), X(0xd77bd7f6acb321d7), X(0xc22fc25eed999cc2), X(0x2eb82e6d965c432e), X(0x4b314b627a96294b), X(0xfedffea321e15dfe), X(0x5741578216aed557), - X(0x155415a8412abd15), X(0x77c1779fb6eee877), X(0x37dc37a5eb6e9237), X(0xe5b3e57b56d79ee5), X(0x9f469f8cd923139f), X(0xf0e7f0d317fd23f0), X(0x4a354a6a7f94204a), X(0xda4fda9e95a944da), - X(0x587d58fa25b0a258), X(0xc903c906ca8fcfc9), X(0x29a429558d527c29), X(0x0a280a5022145a0a), X(0xb1feb1e14f7f50b1), X(0xa0baa0691a5dc9a0), X(0x6bb16b7fdad6146b), X(0x852e855cab17d985), - X(0xbdcebd8173673cbd), X(0x5d695dd234ba8f5d), X(0x1040108050209010), X(0xf4f7f4f303f507f4), X(0xcb0bcb16c08bddcb), X(0x3ef83eedc67cd33e), X(0x05140528110a2d05), X(0x6781671fe6ce7867), - X(0xe4b7e47353d597e4), X(0x279c2725bb4e0227), X(0x4119413258827341), X(0x8b168b2c9d0ba78b), X(0xa7a6a7510153f6a7), X(0x7de97dcf94fab27d), X(0x956e95dcfb374995), X(0xd847d88e9fad56d8), - X(0xfbcbfb8b30eb70fb), X(0xee9fee2371c1cdee), X(0x7ced7cc791f8bb7c), X(0x66856617e3cc7166), X(0xdd53dda68ea77bdd), X(0x175c17b84b2eaf17), X(0x47014702468e4547), X(0x9e429e84dc211a9e), - X(0xca0fca1ec589d4ca), X(0x2db42d75995a582d), X(0xbfc6bf9179632ebf), X(0x071c07381b0e3f07), X(0xad8ead012347acad), X(0x5a755aea2fb4b05a), X(0x8336836cb51bef83), X(0x33cc3385ff66b633), - X(0x6391633ff2c65c63), X(0x020802100a041202), X(0xaa92aa39384993aa), X(0x71d971afa8e2de71), X(0xc807c80ecf8dc6c8), X(0x196419c87d32d119), X(0x4939497270923b49), X(0xd943d9869aaf5fd9), - X(0xf2eff2c31df931f2), X(0xe3abe34b48dba8e3), X(0x5b715be22ab6b95b), X(0x881a8834920dbc88), X(0x9a529aa4c8293e9a), X(0x2698262dbe4c0b26), X(0x32c8328dfa64bf32), X(0xb0fab0e94a7d59b0), - X(0xe983e91b6acff2e9), X(0x0f3c0f78331e770f), X(0xd573d5e6a6b733d5), X(0x803a8074ba1df480), X(0xbec2be997c6127be), X(0xcd13cd26de87ebcd), X(0x34d034bde4688934), X(0x483d487a75903248), - X(0xffdbffab24e354ff), X(0x7af57af78ff48d7a), X(0x907a90f4ea3d6490), X(0x5f615fc23ebe9d5f), X(0x2080201da0403d20), X(0x68bd6867d5d00f68), X(0x1a681ad07234ca1a), X(0xae82ae192c41b7ae), - X(0xb4eab4c95e757db4), X(0x544d549a19a8ce54), X(0x937693ece53b7f93), X(0x2288220daa442f22), X(0x648d6407e9c86364), X(0xf1e3f1db12ff2af1), X(0x73d173bfa2e6cc73), X(0x124812905a248212), - X(0x401d403a5d807a40), X(0x0820084028104808), X(0xc32bc356e89b95c3), X(0xec97ec337bc5dfec), X(0xdb4bdb9690ab4ddb), X(0xa1bea1611f5fc0a1), X(0x8d0e8d1c8307918d), X(0x3df43df5c97ac83d), - X(0x976697ccf1335b97), X(0x0000000000000000), X(0xcf1bcf36d483f9cf), X(0x2bac2b4587566e2b), X(0x76c57697b3ece176), X(0x82328264b019e682), X(0xd67fd6fea9b128d6), X(0x1b6c1bd87736c31b), - X(0xb5eeb5c15b7774b5), X(0xaf86af112943beaf), X(0x6ab56a77dfd41d6a), X(0x505d50ba0da0ea50), X(0x450945124c8a5745), X(0xf3ebf3cb18fb38f3), X(0x30c0309df060ad30), X(0xef9bef2b74c3c4ef), - X(0x3ffc3fe5c37eda3f), X(0x554955921caac755), X(0xa2b2a2791059dba2), X(0xea8fea0365c9e9ea), X(0x6589650fecca6a65), X(0xbad2bab9686903ba), X(0x2fbc2f65935e4a2f), X(0xc027c04ee79d8ec0), - X(0xde5fdebe81a160de), X(0x1c701ce06c38fc1c), X(0xfdd3fdbb2ee746fd), X(0x4d294d52649a1f4d), X(0x927292e4e0397692), X(0x75c9758fbceafa75), X(0x061806301e0c3606), X(0x8a128a249809ae8a), - X(0xb2f2b2f940794bb2), X(0xe6bfe66359d185e6), X(0x0e380e70361c7e0e), X(0x1f7c1ff8633ee71f), X(0x62956237f7c45562), X(0xd477d4eea3b53ad4), X(0xa89aa829324d81a8), X(0x966296c4f4315296), - X(0xf9c3f99b3aef62f9), X(0xc533c566f697a3c5), X(0x25942535b14a1025), X(0x597959f220b2ab59), X(0x842a8454ae15d084), X(0x72d572b7a7e4c572), X(0x39e439d5dd72ec39), X(0x4c2d4c5a6198164c), - X(0x5e655eca3bbc945e), X(0x78fd78e785f09f78), X(0x38e038ddd870e538), X(0x8c0a8c148605988c), X(0xd163d1c6b2bf17d1), X(0xa5aea5410b57e4a5), X(0xe2afe2434dd9a1e2), X(0x6199612ff8c24e61), - X(0xb3f6b3f1457b42b3), X(0x21842115a5423421), X(0x9c4a9c94d625089c), X(0x1e781ef0663cee1e), X(0x4311432252866143), X(0xc73bc776fc93b1c7), X(0xfcd7fcb32be54ffc), X(0x0410042014082404), - X(0x515951b208a2e351), X(0x995e99bcc72f2599), X(0x6da96d4fc4da226d), X(0x0d340d68391a650d), X(0xfacffa8335e979fa), X(0xdf5bdfb684a369df), X(0x7ee57ed79bfca97e), X(0x2490243db4481924), - X(0x3bec3bc5d776fe3b), X(0xab96ab313d4b9aab), X(0xce1fce3ed181f0ce), X(0x1144118855229911), X(0x8f068f0c8903838f), X(0x4e254e4a6b9c044e), X(0xb7e6b7d1517366b7), X(0xeb8beb0b60cbe0eb), - X(0x3cf03cfdcc78c13c), X(0x813e817cbf1ffd81), X(0x946a94d4fe354094), X(0xf7fbf7eb0cf31cf7), X(0xb9deb9a1676f18b9), X(0x134c13985f268b13), X(0x2cb02c7d9c58512c), X(0xd36bd3d6b8bb05d3), - X(0xe7bbe76b5cd38ce7), X(0x6ea56e57cbdc396e), X(0xc437c46ef395aac4), X(0x030c03180f061b03), X(0x5645568a13acdc56), X(0x440d441a49885e44), X(0x7fe17fdf9efea07f), X(0xa99ea921374f88a9), - X(0x2aa82a4d8254672a), X(0xbbd6bbb16d6b0abb), X(0xc123c146e29f87c1), X(0x535153a202a6f153), X(0xdc57dcae8ba572dc), X(0x0b2c0b582716530b), X(0x9d4e9d9cd327019d), X(0x6cad6c47c1d82b6c), - X(0x31c43195f562a431), X(0x74cd7487b9e8f374), X(0xf6fff6e309f115f6), X(0x4605460a438c4c46), X(0xac8aac092645a5ac), X(0x891e893c970fb589), X(0x145014a04428b414), X(0xe1a3e15b42dfbae1), - X(0x165816b04e2ca616), X(0x3ae83acdd274f73a), X(0x69b9696fd0d20669), X(0x092409482d124109), X(0x70dd70a7ade0d770), X(0xb6e2b6d954716fb6), X(0xd067d0ceb7bd1ed0), X(0xed93ed3b7ec7d6ed), - X(0xcc17cc2edb85e2cc), X(0x4215422a57846842), X(0x985a98b4c22d2c98), X(0xa4aaa4490e55eda4), X(0x28a0285d88507528), X(0x5c6d5cda31b8865c), X(0xf8c7f8933fed6bf8), X(0x86228644a411c286) - }; - - #undef X - - uint64 block[8]; - const uint8* b = buffer; - - for (int i = 0; i < 8; ++i, b += 8) - block[i] = (((uint64) b[0] ) << 56) - ^ (((uint64) b[1] & 0xff) << 48) - ^ (((uint64) b[2] & 0xff) << 40) - ^ (((uint64) b[3] & 0xff) << 32) - ^ (((uint64) b[4] & 0xff) << 24) - ^ (((uint64) b[5] & 0xff) << 16) - ^ (((uint64) b[6] & 0xff) << 8) - ^ (((uint64) b[7] & 0xff)); - - uint64 state[8], K[8]; - - state[0] = block[0] ^ (K[0] = hash[0]); - state[1] = block[1] ^ (K[1] = hash[1]); - state[2] = block[2] ^ (K[2] = hash[2]); - state[3] = block[3] ^ (K[3] = hash[3]); - state[4] = block[4] ^ (K[4] = hash[4]); - state[5] = block[5] ^ (K[5] = hash[5]); - state[6] = block[6] ^ (K[6] = hash[6]); - state[7] = block[7] ^ (K[7] = hash[7]); - - for (int i = 0; i < 10; ++i) - { - uint64 L[8]; - - L[0] = C0[(int) (K[0] >> 56)] ^ C1[(int) (K[7] >> 48) & 0xff] ^ C2[(int) (K[6] >> 40) & 0xff] ^ C3[(int) (K[5] >> 32) & 0xff] ^ C4[(int) (K[4] >> 24) & 0xff] ^ C5[(int) (K[3] >> 16) & 0xff] ^ C6[(int) (K[2] >> 8) & 0xff] ^ C7[(int) (K[1]) & 0xff] ^ rc[i]; - L[1] = C0[(int) (K[1] >> 56)] ^ C1[(int) (K[0] >> 48) & 0xff] ^ C2[(int) (K[7] >> 40) & 0xff] ^ C3[(int) (K[6] >> 32) & 0xff] ^ C4[(int) (K[5] >> 24) & 0xff] ^ C5[(int) (K[4] >> 16) & 0xff] ^ C6[(int) (K[3] >> 8) & 0xff] ^ C7[(int) (K[2]) & 0xff]; - L[2] = C0[(int) (K[2] >> 56)] ^ C1[(int) (K[1] >> 48) & 0xff] ^ C2[(int) (K[0] >> 40) & 0xff] ^ C3[(int) (K[7] >> 32) & 0xff] ^ C4[(int) (K[6] >> 24) & 0xff] ^ C5[(int) (K[5] >> 16) & 0xff] ^ C6[(int) (K[4] >> 8) & 0xff] ^ C7[(int) (K[3]) & 0xff]; - L[3] = C0[(int) (K[3] >> 56)] ^ C1[(int) (K[2] >> 48) & 0xff] ^ C2[(int) (K[1] >> 40) & 0xff] ^ C3[(int) (K[0] >> 32) & 0xff] ^ C4[(int) (K[7] >> 24) & 0xff] ^ C5[(int) (K[6] >> 16) & 0xff] ^ C6[(int) (K[5] >> 8) & 0xff] ^ C7[(int) (K[4]) & 0xff]; - L[4] = C0[(int) (K[4] >> 56)] ^ C1[(int) (K[3] >> 48) & 0xff] ^ C2[(int) (K[2] >> 40) & 0xff] ^ C3[(int) (K[1] >> 32) & 0xff] ^ C4[(int) (K[0] >> 24) & 0xff] ^ C5[(int) (K[7] >> 16) & 0xff] ^ C6[(int) (K[6] >> 8) & 0xff] ^ C7[(int) (K[5]) & 0xff]; - L[5] = C0[(int) (K[5] >> 56)] ^ C1[(int) (K[4] >> 48) & 0xff] ^ C2[(int) (K[3] >> 40) & 0xff] ^ C3[(int) (K[2] >> 32) & 0xff] ^ C4[(int) (K[1] >> 24) & 0xff] ^ C5[(int) (K[0] >> 16) & 0xff] ^ C6[(int) (K[7] >> 8) & 0xff] ^ C7[(int) (K[6]) & 0xff]; - L[6] = C0[(int) (K[6] >> 56)] ^ C1[(int) (K[5] >> 48) & 0xff] ^ C2[(int) (K[4] >> 40) & 0xff] ^ C3[(int) (K[3] >> 32) & 0xff] ^ C4[(int) (K[2] >> 24) & 0xff] ^ C5[(int) (K[1] >> 16) & 0xff] ^ C6[(int) (K[0] >> 8) & 0xff] ^ C7[(int) (K[7]) & 0xff]; - L[7] = C0[(int) (K[7] >> 56)] ^ C1[(int) (K[6] >> 48) & 0xff] ^ C2[(int) (K[5] >> 40) & 0xff] ^ C3[(int) (K[4] >> 32) & 0xff] ^ C4[(int) (K[3] >> 24) & 0xff] ^ C5[(int) (K[2] >> 16) & 0xff] ^ C6[(int) (K[1] >> 8) & 0xff] ^ C7[(int) (K[0]) & 0xff]; - - K[0] = L[0]; - K[1] = L[1]; - K[2] = L[2]; - K[3] = L[3]; - K[4] = L[4]; - K[5] = L[5]; - K[6] = L[6]; - K[7] = L[7]; - - // apply the i-th round transformation - L[0] = C0[(int) (state[0] >> 56)] ^ C1[(int) (state[7] >> 48) & 0xff] ^ C2[(int) (state[6] >> 40) & 0xff] ^ C3[(int) (state[5] >> 32) & 0xff] ^ C4[(int) (state[4] >> 24) & 0xff] ^ C5[(int) (state[3] >> 16) & 0xff] ^ C6[(int) (state[2] >> 8) & 0xff] ^ C7[(int) (state[1]) & 0xff] ^ K[0]; - L[1] = C0[(int) (state[1] >> 56)] ^ C1[(int) (state[0] >> 48) & 0xff] ^ C2[(int) (state[7] >> 40) & 0xff] ^ C3[(int) (state[6] >> 32) & 0xff] ^ C4[(int) (state[5] >> 24) & 0xff] ^ C5[(int) (state[4] >> 16) & 0xff] ^ C6[(int) (state[3] >> 8) & 0xff] ^ C7[(int) (state[2]) & 0xff] ^ K[1]; - L[2] = C0[(int) (state[2] >> 56)] ^ C1[(int) (state[1] >> 48) & 0xff] ^ C2[(int) (state[0] >> 40) & 0xff] ^ C3[(int) (state[7] >> 32) & 0xff] ^ C4[(int) (state[6] >> 24) & 0xff] ^ C5[(int) (state[5] >> 16) & 0xff] ^ C6[(int) (state[4] >> 8) & 0xff] ^ C7[(int) (state[3]) & 0xff] ^ K[2]; - L[3] = C0[(int) (state[3] >> 56)] ^ C1[(int) (state[2] >> 48) & 0xff] ^ C2[(int) (state[1] >> 40) & 0xff] ^ C3[(int) (state[0] >> 32) & 0xff] ^ C4[(int) (state[7] >> 24) & 0xff] ^ C5[(int) (state[6] >> 16) & 0xff] ^ C6[(int) (state[5] >> 8) & 0xff] ^ C7[(int) (state[4]) & 0xff] ^ K[3]; - L[4] = C0[(int) (state[4] >> 56)] ^ C1[(int) (state[3] >> 48) & 0xff] ^ C2[(int) (state[2] >> 40) & 0xff] ^ C3[(int) (state[1] >> 32) & 0xff] ^ C4[(int) (state[0] >> 24) & 0xff] ^ C5[(int) (state[7] >> 16) & 0xff] ^ C6[(int) (state[6] >> 8) & 0xff] ^ C7[(int) (state[5]) & 0xff] ^ K[4]; - L[5] = C0[(int) (state[5] >> 56)] ^ C1[(int) (state[4] >> 48) & 0xff] ^ C2[(int) (state[3] >> 40) & 0xff] ^ C3[(int) (state[2] >> 32) & 0xff] ^ C4[(int) (state[1] >> 24) & 0xff] ^ C5[(int) (state[0] >> 16) & 0xff] ^ C6[(int) (state[7] >> 8) & 0xff] ^ C7[(int) (state[6]) & 0xff] ^ K[5]; - L[6] = C0[(int) (state[6] >> 56)] ^ C1[(int) (state[5] >> 48) & 0xff] ^ C2[(int) (state[4] >> 40) & 0xff] ^ C3[(int) (state[3] >> 32) & 0xff] ^ C4[(int) (state[2] >> 24) & 0xff] ^ C5[(int) (state[1] >> 16) & 0xff] ^ C6[(int) (state[0] >> 8) & 0xff] ^ C7[(int) (state[7]) & 0xff] ^ K[6]; - L[7] = C0[(int) (state[7] >> 56)] ^ C1[(int) (state[6] >> 48) & 0xff] ^ C2[(int) (state[5] >> 40) & 0xff] ^ C3[(int) (state[4] >> 32) & 0xff] ^ C4[(int) (state[3] >> 24) & 0xff] ^ C5[(int) (state[2] >> 16) & 0xff] ^ C6[(int) (state[1] >> 8) & 0xff] ^ C7[(int) (state[0]) & 0xff] ^ K[7]; - - state[0] = L[0]; - state[1] = L[1]; - state[2] = L[2]; - state[3] = L[3]; - state[4] = L[4]; - state[5] = L[5]; - state[6] = L[6]; - state[7] = L[7]; - } - - // apply the Miyaguchi-Preneel compression function - hash[0] ^= state[0] ^ block[0]; - hash[1] ^= state[1] ^ block[1]; - hash[2] ^= state[2] ^ block[2]; - hash[3] ^= state[3] ^ block[3]; - hash[4] ^= state[4] ^ block[4]; - hash[5] ^= state[5] ^ block[5]; - hash[6] ^= state[6] ^ block[6]; - hash[7] ^= state[7] ^ block[7]; - } - -private: - JUCE_DECLARE_NON_COPYABLE (WhirlpoolProcessor) -}; - - -//============================================================================== -Whirlpool::Whirlpool() noexcept -{ - zerostruct (result); -} - -Whirlpool::~Whirlpool() noexcept {} - -Whirlpool::Whirlpool (const Whirlpool& other) noexcept -{ - memcpy (result, other.result, sizeof (result)); -} - -Whirlpool& Whirlpool::operator= (const Whirlpool& other) noexcept -{ - memcpy (result, other.result, sizeof (result)); - return *this; -} - -Whirlpool::Whirlpool (const MemoryBlock& data) -{ - process (data.getData(), data.getSize()); -} - -Whirlpool::Whirlpool (const void* const data, const size_t numBytes) -{ - process (data, numBytes); -} - -Whirlpool::Whirlpool (InputStream& input, const int64 numBytesToRead) -{ - WhirlpoolProcessor processor; - processor.processStream (input, numBytesToRead, result); -} - -Whirlpool::Whirlpool (const File& file) -{ - FileInputStream fin (file); - - if (fin.getStatus().wasOk()) - { - WhirlpoolProcessor processor; - processor.processStream (fin, -1, result); - } - else - { - zerostruct (result); - } -} - -Whirlpool::Whirlpool (CharPointer_UTF8 utf8) noexcept -{ - jassert (utf8.getAddress() != nullptr); - process (utf8.getAddress(), utf8.sizeInBytes() - 1); -} - -void Whirlpool::process (const void* const data, size_t numBytes) -{ - MemoryInputStream m (data, numBytes, false); - WhirlpoolProcessor processor; - processor.processStream (m, -1, result); -} - -MemoryBlock Whirlpool::getRawData() const -{ - return MemoryBlock (result, sizeof (result)); -} - -String Whirlpool::toHexString() const -{ - return String::toHexString (result, sizeof (result), 0); -} - -bool Whirlpool::operator== (const Whirlpool& other) const noexcept { return memcmp (result, other.result, sizeof (result)) == 0; } -bool Whirlpool::operator!= (const Whirlpool& other) const noexcept { return ! operator== (other); } - - -//============================================================================== -#if JUCE_UNIT_TESTS - -class WhirlpoolTests : public UnitTest -{ -public: - WhirlpoolTests() : UnitTest ("Whirlpool") {} - - void test (const char* input, const char* expected) - { - { - Whirlpool hash (input, strlen (input)); - expectEquals (hash.toHexString(), String (expected)); - } - - { - CharPointer_UTF8 utf8 (input); - Whirlpool hash (utf8); - expectEquals (hash.toHexString(), String (expected)); - } - - { - MemoryInputStream m (input, strlen (input), false); - Whirlpool hash (m); - expectEquals (hash.toHexString(), String (expected)); - } - } - - void runTest() - { - beginTest ("Whirlpool"); - - test ("", "19fa61d75522a4669b44e39c1d2e1726c530232130d407f89afee0964997f7a73e83be698b288febcf88e3e03c4f0757ea8964e59b63d93708b138cc42a66eb3"); - test ("The quick brown fox jumps over the lazy dog", "b97de512e91e3828b40d2b0fdce9ceb3c4a71f9bea8d88e75c4fa854df36725fd2b52eb6544edcacd6f8beddfea403cb55ae31f03ad62a5ef54e42ee82c3fb35"); - test ("The quick brown fox jumps over the lazy dog.", "87a7ff096082e3ffeb86db10feb91c5af36c2c71bc426fe310ce662e0338223e217def0eab0b02b80eecf875657802bc5965e48f5c0a05467756f0d3f396faba"); - } -}; - -static WhirlpoolTests whirlpoolUnitTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_Whirlpool.h b/JuceLibraryCode/modules/juce_cryptography/hashing/juce_Whirlpool.h deleted file mode 100755 index 5c193ed..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/hashing/juce_Whirlpool.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_WHIRLPOOL_H_INCLUDED -#define JUCE_WHIRLPOOL_H_INCLUDED - - -//============================================================================== -/** - Whirlpool hash class. - - The Whirlpool algorithm was developed by - Paulo S. L. M. Barreto and - Vincent Rijmen. - - See - P.S.L.M. Barreto, V. Rijmen, - "The Whirlpool hashing function" - NESSIE submission, 2000 (tweaked version, 2001), - https://www.cosic.esat.kuleuven.ac.be/nessie/workshop/submissions/whirlpool.zip - - @see SHA256, MD5 -*/ -class JUCE_API Whirlpool -{ -public: - //============================================================================== - /** Creates an empty Whirlpool object. - The default constructor just creates a hash filled with zeros. (This is not - equal to the hash of an empty block of data). - */ - Whirlpool() noexcept; - - /** Destructor. */ - ~Whirlpool() noexcept; - - /** Creates a copy of another Whirlpool. */ - Whirlpool (const Whirlpool& other) noexcept; - - /** Copies another Whirlpool. */ - Whirlpool& operator= (const Whirlpool& other) noexcept; - - //============================================================================== - /** Creates a hash from a block of raw data. */ - explicit Whirlpool (const MemoryBlock&); - - /** Creates a hash from a block of raw data. */ - Whirlpool (const void* data, size_t numBytes); - - /** Creates a hash from the contents of a stream. - - This will read from the stream until the stream is exhausted, or until - maxBytesToRead bytes have been read. If maxBytesToRead is negative, the entire - stream will be read. - */ - Whirlpool (InputStream& input, int64 maxBytesToRead = -1); - - /** Reads a file and generates the hash of its contents. - If the file can't be opened, the hash will be left uninitialised - (i.e. full of zeros). - */ - explicit Whirlpool (const File& file); - - /** Creates a checksum from a UTF-8 buffer. - E.g. - @code Whirlpool checksum (myString.toUTF8()); - @endcode - */ - explicit Whirlpool (CharPointer_UTF8 utf8Text) noexcept; - - //============================================================================== - /** Returns the hash as a 64-byte block of data. */ - MemoryBlock getRawData() const; - - /** Returns the checksum as a 128-digit hex string. */ - String toHexString() const; - - //============================================================================== - bool operator== (const Whirlpool&) const noexcept; - bool operator!= (const Whirlpool&) const noexcept; - - -private: - //============================================================================== - uint8 result [64]; - void process (const void*, size_t); - - JUCE_LEAK_DETECTOR (Whirlpool) -}; - - -#endif // JUCE_WHIRLPOOL_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.cpp b/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.cpp deleted file mode 100755 index 740e294..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if defined (JUCE_CRYPTOGRAPHY_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE - /* When you add this cpp file to your project, you mustn't include it in a file where you've - already included any other headers - just put it inside a file on its own, possibly with your config - flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix - header files that the compiler may be using. - */ - #error "Incorrect use of JUCE cpp file" -#endif - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "juce_cryptography.h" - -namespace juce -{ - -#include "encryption/juce_BlowFish.cpp" -#include "encryption/juce_Primes.cpp" -#include "encryption/juce_RSAKey.cpp" -#include "hashing/juce_MD5.cpp" -#include "hashing/juce_SHA256.cpp" -#include "hashing/juce_Whirlpool.cpp" - -} diff --git a/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h b/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h deleted file mode 100755 index b6726ed..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_CRYPTOGRAPHY_H_INCLUDED -#define JUCE_CRYPTOGRAPHY_H_INCLUDED - -//============================================================================= -#include "../juce_core/juce_core.h" - -namespace juce -{ - -#include "encryption/juce_BlowFish.h" -#include "encryption/juce_Primes.h" -#include "encryption/juce_RSAKey.h" -#include "hashing/juce_MD5.h" -#include "hashing/juce_SHA256.h" -#include "hashing/juce_Whirlpool.h" - -} - -#endif // JUCE_CRYPTOGRAPHY_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.mm b/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.mm deleted file mode 100755 index 7c3e4bf..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/juce_cryptography.mm +++ /dev/null @@ -1,25 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#include "juce_cryptography.cpp" diff --git a/JuceLibraryCode/modules/juce_cryptography/juce_module_info b/JuceLibraryCode/modules/juce_cryptography/juce_module_info deleted file mode 100755 index 42a588f..0000000 --- a/JuceLibraryCode/modules/juce_cryptography/juce_module_info +++ /dev/null @@ -1,18 +0,0 @@ -{ - "id": "juce_cryptography", - "name": "JUCE cryptography classes", - "version": "3.1.1", - "description": "Classes for various basic cryptography functions, including RSA, Blowfish, MD5, SHA, etc.", - "website": "http://www.juce.com/juce", - "license": "GPL/Commercial", - - "dependencies": [ { "id": "juce_core", "version": "matching" } ], - - "include": "juce_cryptography.h", - - "compile": [ { "file": "juce_cryptography.cpp", "target": "! xcode" }, - { "file": "juce_cryptography.mm", "target": "xcode" } ], - - "browse": [ "encryption/*", - "hashing/*" ] -} diff --git a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp deleted file mode 100755 index 6db825e..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ApplicationProperties::ApplicationProperties() - : commonSettingsAreReadOnly (0) -{ -} - -ApplicationProperties::~ApplicationProperties() -{ - closeFiles(); -} - -//============================================================================== -void ApplicationProperties::setStorageParameters (const PropertiesFile::Options& newOptions) -{ - options = newOptions; -} - -//============================================================================== -void ApplicationProperties::openFiles() -{ - // You need to call setStorageParameters() before trying to get hold of the properties! - jassert (options.applicationName.isNotEmpty()); - - if (options.applicationName.isNotEmpty()) - { - PropertiesFile::Options o (options); - - if (userProps == nullptr) - { - o.commonToAllUsers = false; - userProps = new PropertiesFile (o); - } - - if (commonProps == nullptr) - { - o.commonToAllUsers = true; - commonProps = new PropertiesFile (o); - } - - userProps->setFallbackPropertySet (commonProps); - } -} - -PropertiesFile* ApplicationProperties::getUserSettings() -{ - if (userProps == nullptr) - openFiles(); - - return userProps; -} - -PropertiesFile* ApplicationProperties::getCommonSettings (const bool returnUserPropsIfReadOnly) -{ - if (commonProps == nullptr) - openFiles(); - - if (returnUserPropsIfReadOnly) - { - if (commonSettingsAreReadOnly == 0) - commonSettingsAreReadOnly = commonProps->save() ? -1 : 1; - - if (commonSettingsAreReadOnly > 0) - return userProps; - } - - return commonProps; -} - -bool ApplicationProperties::saveIfNeeded() -{ - return (userProps == nullptr || userProps->saveIfNeeded()) - && (commonProps == nullptr || commonProps->saveIfNeeded()); -} - -void ApplicationProperties::closeFiles() -{ - userProps = nullptr; - commonProps = nullptr; -} diff --git a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h deleted file mode 100755 index 21edbc2..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_ApplicationProperties.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_APPLICATIONPROPERTIES_H_INCLUDED -#define JUCE_APPLICATIONPROPERTIES_H_INCLUDED - - -//============================================================================== -/** - Manages a collection of properties. - - This is a slightly higher-level wrapper for managing PropertiesFile objects. - - It holds two different PropertiesFile objects internally, one for user-specific - settings (stored in your user directory), and one for settings that are common to - all users (stored in a folder accessible to all users). - - The class manages the creation of these files on-demand, allowing access via the - getUserSettings() and getCommonSettings() methods. - - After creating an instance of an ApplicationProperties object, you should first - of all call setStorageParameters() to tell it the parameters to use to create - its files. - - @see PropertiesFile -*/ -class JUCE_API ApplicationProperties -{ -public: - //============================================================================== - /** - Creates an ApplicationProperties object. - - Before using it, you must call setStorageParameters() to give it the info - it needs to create the property files. - */ - ApplicationProperties(); - - /** Destructor. */ - ~ApplicationProperties(); - - //============================================================================== - /** Gives the object the information it needs to create the appropriate properties files. - See the PropertiesFile::Options class for details about what options you need to set. - */ - void setStorageParameters (const PropertiesFile::Options& options); - - /** Returns the current storage parameters. - @see setStorageParameters - */ - const PropertiesFile::Options& getStorageParameters() const noexcept { return options; } - - //============================================================================== - /** Returns the user settings file. - - The first time this is called, it will create and load the properties file. - - Note that when you search the user PropertiesFile for a value that it doesn't contain, - the common settings are used as a second-chance place to look. This is done via the - PropertySet::setFallbackPropertySet() method - by default the common settings are set - to the fallback for the user settings. - - @see getCommonSettings - */ - PropertiesFile* getUserSettings(); - - /** Returns the common settings file. - - The first time this is called, it will create and load the properties file. - - @param returnUserPropsIfReadOnly if this is true, and the common properties file is - read-only (e.g. because the user doesn't have permission to write - to shared files), then this will return the user settings instead, - (like getUserSettings() would do). This is handy if you'd like to - write a value to the common settings, but if that's no possible, - then you'd rather write to the user settings than none at all. - If returnUserPropsIfReadOnly is false, this method will always return - the common settings, even if any changes to them can't be saved. - @see getUserSettings - */ - PropertiesFile* getCommonSettings (bool returnUserPropsIfReadOnly); - - //============================================================================== - /** Saves both files if they need to be saved. - - @see PropertiesFile::saveIfNeeded - */ - bool saveIfNeeded(); - - /** Flushes and closes both files if they are open. - - This flushes any pending changes to disk with PropertiesFile::saveIfNeeded() - and closes both files. They will then be re-opened the next time getUserSettings() - or getCommonSettings() is called. - */ - void closeFiles(); - - -private: - //============================================================================== - PropertiesFile::Options options; - ScopedPointer userProps, commonProps; - int commonSettingsAreReadOnly; - - void openFiles(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ApplicationProperties) -}; - - -#endif // JUCE_APPLICATIONPROPERTIES_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp deleted file mode 100755 index ece2121..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.cpp +++ /dev/null @@ -1,355 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace PropertyFileConstants -{ - static const int magicNumber = (int) ByteOrder::littleEndianInt ("PROP"); - static const int magicNumberCompressed = (int) ByteOrder::littleEndianInt ("CPRP"); - - static const char* const fileTag = "PROPERTIES"; - static const char* const valueTag = "VALUE"; - static const char* const nameAttribute = "name"; - static const char* const valueAttribute = "val"; -} - -//============================================================================== -PropertiesFile::Options::Options() - : commonToAllUsers (false), - ignoreCaseOfKeyNames (false), - doNotSave (false), - millisecondsBeforeSaving (3000), - storageFormat (PropertiesFile::storeAsXML), - processLock (nullptr) -{ -} - -File PropertiesFile::Options::getDefaultFile() const -{ - // mustn't have illegal characters in this name.. - jassert (applicationName == File::createLegalFileName (applicationName)); - - #if JUCE_MAC || JUCE_IOS - File dir (commonToAllUsers ? "/Library/" - : "~/Library/"); - - if (osxLibrarySubFolder != "Preferences" && ! osxLibrarySubFolder.startsWith ("Application Support")) - { - /* The PropertiesFile class always used to put its settings files in "Library/Preferences", but Apple - have changed their advice, and now stipulate that settings should go in "Library/Application Support". - - Because older apps would be broken by a silent change in this class's behaviour, you must now - explicitly set the osxLibrarySubFolder value to indicate which path you want to use. - - In newer apps, you should always set this to "Application Support" - or "Application Support/YourSubFolderName". - - If your app needs to load settings files that were created by older versions of juce and - you want to maintain backwards-compatibility, then you can set this to "Preferences". - But.. for better Apple-compliance, the recommended approach would be to write some code that - finds your old settings files in ~/Library/Preferences, moves them to ~/Library/Application Support, - and then uses the new path. - */ - jassertfalse; - - dir = dir.getChildFile ("Application Support"); - } - else - { - dir = dir.getChildFile (osxLibrarySubFolder); - } - - if (folderName.isNotEmpty()) - dir = dir.getChildFile (folderName); - - #elif JUCE_LINUX || JUCE_ANDROID - const File dir (File (commonToAllUsers ? "/var" : "~") - .getChildFile (folderName.isNotEmpty() ? folderName - : ("." + applicationName))); - - #elif JUCE_WINDOWS - File dir (File::getSpecialLocation (commonToAllUsers ? File::commonApplicationDataDirectory - : File::userApplicationDataDirectory)); - - if (dir == File()) - return File(); - - dir = dir.getChildFile (folderName.isNotEmpty() ? folderName - : applicationName); - #endif - - return dir.getChildFile (applicationName) - .withFileExtension (filenameSuffix); -} - - -//============================================================================== -PropertiesFile::PropertiesFile (const File& f, const Options& o) - : PropertySet (o.ignoreCaseOfKeyNames), - file (f), options (o), - loadedOk (false), needsWriting (false) -{ - reload(); -} - -PropertiesFile::PropertiesFile (const Options& o) - : PropertySet (o.ignoreCaseOfKeyNames), - file (o.getDefaultFile()), options (o), - loadedOk (false), needsWriting (false) -{ - reload(); -} - -bool PropertiesFile::reload() -{ - ProcessScopedLock pl (createProcessLock()); - - if (pl != nullptr && ! pl->isLocked()) - return false; // locking failure.. - - loadedOk = (! file.exists()) || loadAsBinary() || loadAsXml(); - return loadedOk; -} - -PropertiesFile::~PropertiesFile() -{ - saveIfNeeded(); -} - -InterProcessLock::ScopedLockType* PropertiesFile::createProcessLock() const -{ - return options.processLock != nullptr ? new InterProcessLock::ScopedLockType (*options.processLock) : nullptr; -} - -bool PropertiesFile::saveIfNeeded() -{ - const ScopedLock sl (getLock()); - return (! needsWriting) || save(); -} - -bool PropertiesFile::needsToBeSaved() const -{ - const ScopedLock sl (getLock()); - return needsWriting; -} - -void PropertiesFile::setNeedsToBeSaved (const bool needsToBeSaved_) -{ - const ScopedLock sl (getLock()); - needsWriting = needsToBeSaved_; -} - -bool PropertiesFile::save() -{ - const ScopedLock sl (getLock()); - - stopTimer(); - - if (options.doNotSave - || file == File() - || file.isDirectory() - || ! file.getParentDirectory().createDirectory()) - return false; - - if (options.storageFormat == storeAsXML) - return saveAsXml(); - - return saveAsBinary(); -} - -bool PropertiesFile::loadAsXml() -{ - XmlDocument parser (file); - ScopedPointer doc (parser.getDocumentElement (true)); - - if (doc != nullptr && doc->hasTagName (PropertyFileConstants::fileTag)) - { - doc = parser.getDocumentElement(); - - if (doc != nullptr) - { - forEachXmlChildElementWithTagName (*doc, e, PropertyFileConstants::valueTag) - { - const String name (e->getStringAttribute (PropertyFileConstants::nameAttribute)); - - if (name.isNotEmpty()) - { - getAllProperties().set (name, - e->getFirstChildElement() != nullptr - ? e->getFirstChildElement()->createDocument ("", true) - : e->getStringAttribute (PropertyFileConstants::valueAttribute)); - } - } - - return true; - } - - // must be a pretty broken XML file we're trying to parse here, - // or a sign that this object needs an InterProcessLock, - // or just a failure reading the file. This last reason is why - // we don't jassertfalse here. - } - - return false; -} - -bool PropertiesFile::saveAsXml() -{ - XmlElement doc (PropertyFileConstants::fileTag); - const StringPairArray& props = getAllProperties(); - - for (int i = 0; i < props.size(); ++i) - { - XmlElement* const e = doc.createNewChildElement (PropertyFileConstants::valueTag); - e->setAttribute (PropertyFileConstants::nameAttribute, props.getAllKeys() [i]); - - // if the value seems to contain xml, store it as such.. - if (XmlElement* const childElement = XmlDocument::parse (props.getAllValues() [i])) - e->addChildElement (childElement); - else - e->setAttribute (PropertyFileConstants::valueAttribute, props.getAllValues() [i]); - } - - ProcessScopedLock pl (createProcessLock()); - - if (pl != nullptr && ! pl->isLocked()) - return false; // locking failure.. - - if (doc.writeToFile (file, String())) - { - needsWriting = false; - return true; - } - - return false; -} - -bool PropertiesFile::loadAsBinary() -{ - FileInputStream fileStream (file); - - if (fileStream.openedOk()) - { - const int magicNumber = fileStream.readInt(); - - if (magicNumber == PropertyFileConstants::magicNumberCompressed) - { - SubregionStream subStream (&fileStream, 4, -1, false); - GZIPDecompressorInputStream gzip (subStream); - return loadAsBinary (gzip); - } - - if (magicNumber == PropertyFileConstants::magicNumber) - return loadAsBinary (fileStream); - } - - return false; -} - -bool PropertiesFile::loadAsBinary (InputStream& input) -{ - BufferedInputStream in (input, 2048); - - int numValues = in.readInt(); - - while (--numValues >= 0 && ! in.isExhausted()) - { - const String key (in.readString()); - const String value (in.readString()); - - jassert (key.isNotEmpty()); - if (key.isNotEmpty()) - getAllProperties().set (key, value); - } - - return true; -} - -bool PropertiesFile::saveAsBinary() -{ - ProcessScopedLock pl (createProcessLock()); - - if (pl != nullptr && ! pl->isLocked()) - return false; // locking failure.. - - TemporaryFile tempFile (file); - ScopedPointer out (tempFile.getFile().createOutputStream()); - - if (out != nullptr) - { - if (options.storageFormat == storeAsCompressedBinary) - { - out->writeInt (PropertyFileConstants::magicNumberCompressed); - out->flush(); - - out = new GZIPCompressorOutputStream (out.release(), 9, true); - } - else - { - // have you set up the storage option flags correctly? - jassert (options.storageFormat == storeAsBinary); - - out->writeInt (PropertyFileConstants::magicNumber); - } - - const StringPairArray& props = getAllProperties(); - const int numProperties = props.size(); - const StringArray& keys = props.getAllKeys(); - const StringArray& values = props.getAllValues(); - - out->writeInt (numProperties); - - for (int i = 0; i < numProperties; ++i) - { - out->writeString (keys[i]); - out->writeString (values[i]); - } - - out = nullptr; - - if (tempFile.overwriteTargetFileWithTemporary()) - { - needsWriting = false; - return true; - } - } - - return false; -} - -void PropertiesFile::timerCallback() -{ - saveIfNeeded(); -} - -void PropertiesFile::propertyChanged() -{ - sendChangeMessage(); - - needsWriting = true; - - if (options.millisecondsBeforeSaving > 0) - startTimer (options.millisecondsBeforeSaving); - else if (options.millisecondsBeforeSaving == 0) - saveIfNeeded(); -} diff --git a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h b/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h deleted file mode 100755 index f3d9551..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/app_properties/juce_PropertiesFile.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_PROPERTIESFILE_H_INCLUDED -#define JUCE_PROPERTIESFILE_H_INCLUDED - - -//============================================================================== -/** Wrapper on a file that stores a list of key/value data pairs. - - Useful for storing application settings, etc. See the PropertySet class for - the interfaces that read and write values. - - Not designed for very large amounts of data, as it keeps all the values in - memory and writes them out to disk lazily when they are changed. - - Because this class derives from ChangeBroadcaster, ChangeListeners can be registered - with it, and these will be signalled when a value changes. - - @see PropertySet -*/ -class JUCE_API PropertiesFile : public PropertySet, - public ChangeBroadcaster, - private Timer -{ -public: - //============================================================================== - enum StorageFormat - { - storeAsBinary, - storeAsCompressedBinary, - storeAsXML - }; - - //============================================================================== - struct JUCE_API Options - { - /** Creates an empty Options structure. - You'll need to fill-in the data members appropriately before using this structure. - */ - Options(); - - /** The name of your application - this is used to help generate the path and filename - at which the properties file will be stored. */ - String applicationName; - - /** The suffix to use for your properties file. - It doesn't really matter what this is - you may want to use ".settings" or - ".properties" or something. - */ - String filenameSuffix; - - /** The name of a subfolder in which you'd like your properties file to live. - See the getDefaultFile() method for more details about how this is used. - */ - String folderName; - - /** If you're using properties files on a Mac, you must set this value - failure to - do so will cause a runtime assertion. - - The PropertiesFile class always used to put its settings files in "Library/Preferences", but Apple - have changed their advice, and now stipulate that settings should go in "Library/Application Support". - - Because older apps would be broken by a silent change in this class's behaviour, you must now - explicitly set the osxLibrarySubFolder value to indicate which path you want to use. - - In newer apps, you should always set this to "Application Support" or - "Application Support/YourSubFolderName". - - If your app needs to load settings files that were created by older versions of juce and - you want to maintain backwards-compatibility, then you can set this to "Preferences". - But.. for better Apple-compliance, the recommended approach would be to write some code that - finds your old settings files in ~/Library/Preferences, moves them to ~/Library/Application Support, - and then uses the new path. - */ - String osxLibrarySubFolder; - - /** If true, the file will be created in a location that's shared between users. - The default constructor initialises this value to false. - */ - bool commonToAllUsers; - - /** If true, this means that property names are matched in a case-insensitive manner. - See the PropertySet constructor for more info. - The default constructor initialises this value to false. - */ - bool ignoreCaseOfKeyNames; - - /** If set to true, this prevents the file from being written to disk. */ - bool doNotSave; - - /** If this is zero or greater, then after a value is changed, the object will wait - for this amount of time and then save the file. If this zero, the file will be - written to disk immediately on being changed (which might be slow, as it'll re-write - synchronously each time a value-change method is called). If it is less than zero, - the file won't be saved until save() or saveIfNeeded() are explicitly called. - The default constructor sets this to a reasonable value of a few seconds, so you - only need to change it if you need a special case. - */ - int millisecondsBeforeSaving; - - /** Specifies whether the file should be written as XML, binary, etc. - The default constructor sets this to storeAsXML, so you only need to set it explicitly - if you want to use a different format. - */ - StorageFormat storageFormat; - - /** An optional InterprocessLock object that will be used to prevent multiple threads or - processes from writing to the file at the same time. The PropertiesFile will keep a - pointer to this object but will not take ownership of it - the caller is responsible for - making sure that the lock doesn't get deleted before the PropertiesFile has been deleted. - The default constructor initialises this value to nullptr, so you don't need to touch it - unless you want to use a lock. - */ - InterProcessLock* processLock; - - /** This can be called to suggest a file that should be used, based on the values - in this structure. - - So on a Mac, this will return a file called: - ~/Library/[osxLibrarySubFolder]/[folderName]/[applicationName].[filenameSuffix] - - On Windows it'll return something like: - C:\\Documents and Settings\\username\\Application Data\\[folderName]\\[applicationName].[filenameSuffix] - - On Linux it'll return - ~/[folderName]/[applicationName].[filenameSuffix] - - If the folderName variable is empty, it'll use the app name for this (or omit the - folder name on the Mac). - - The paths will also vary depending on whether commonToAllUsers is true. - */ - File getDefaultFile() const; - }; - - //============================================================================== - /** Creates a PropertiesFile object. - The file used will be chosen by calling PropertiesFile::Options::getDefaultFile() - for the options provided. To set the file explicitly, use the other constructor. - */ - explicit PropertiesFile (const Options& options); - - /** Creates a PropertiesFile object. - Unlike the other constructor, this one allows you to explicitly set the file that you - want to be used, rather than using the default one. - */ - PropertiesFile (const File& file, - const Options& options); - - /** Destructor. - When deleted, the file will first call saveIfNeeded() to flush any changes to disk. - */ - ~PropertiesFile(); - - //============================================================================== - /** Returns true if this file was created from a valid (or non-existent) file. - If the file failed to load correctly because it was corrupt or had insufficient - access, this will be false. - */ - bool isValidFile() const noexcept { return loadedOk; } - - //============================================================================== - /** This will flush all the values to disk if they've changed since the last - time they were saved. - - Returns false if it fails to write to the file for some reason (maybe because - it's read-only or the directory doesn't exist or something). - - @see save - */ - bool saveIfNeeded(); - - /** This will force a write-to-disk of the current values, regardless of whether - anything has changed since the last save. - - Returns false if it fails to write to the file for some reason (maybe because - it's read-only or the directory doesn't exist or something). - - @see saveIfNeeded - */ - bool save(); - - /** Returns true if the properties have been altered since the last time they were saved. - The file is flagged as needing to be saved when you change a value, but you can - explicitly set this flag with setNeedsToBeSaved(). - */ - bool needsToBeSaved() const; - - /** Explicitly sets the flag to indicate whether the file needs saving or not. - @see needsToBeSaved - */ - void setNeedsToBeSaved (bool needsToBeSaved); - - /** Attempts to reload the settings from the file. */ - bool reload(); - - //============================================================================== - /** Returns the file that's being used. */ - const File& getFile() const noexcept { return file; } - - -protected: - /** @internal */ - virtual void propertyChanged(); - -private: - //============================================================================== - File file; - Options options; - bool loadedOk, needsWriting; - - typedef const ScopedPointer ProcessScopedLock; - InterProcessLock::ScopedLockType* createProcessLock() const; - - void timerCallback() override; - bool saveAsXml(); - bool saveAsBinary(); - bool loadAsXml(); - bool loadAsBinary(); - bool loadAsBinary (InputStream&); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PropertiesFile) -}; - -#endif // JUCE_PROPERTIESFILE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp b/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp deleted file mode 100755 index fd1d12a..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if defined (JUCE_DATA_STRUCTURES_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE - /* When you add this cpp file to your project, you mustn't include it in a file where you've - already included any other headers - just put it inside a file on its own, possibly with your config - flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix - header files that the compiler may be using. - */ - #error "Incorrect use of JUCE cpp file" -#endif - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "juce_data_structures.h" - -namespace juce -{ - -#include "values/juce_Value.cpp" -#include "values/juce_ValueTree.cpp" -#include "undomanager/juce_UndoManager.cpp" -#include "app_properties/juce_ApplicationProperties.cpp" -#include "app_properties/juce_PropertiesFile.cpp" - -} diff --git a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h b/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h deleted file mode 100755 index 629b88d..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DATA_STRUCTURES_H_INCLUDED -#define JUCE_DATA_STRUCTURES_H_INCLUDED - -//============================================================================= -#include "../juce_events/juce_events.h" - -namespace juce -{ - -#include "undomanager/juce_UndoableAction.h" -#include "undomanager/juce_UndoManager.h" -#include "values/juce_Value.h" -#include "values/juce_ValueTree.h" -#include "app_properties/juce_PropertiesFile.h" -#include "app_properties/juce_ApplicationProperties.h" - -} - -#endif // JUCE_DATA_STRUCTURES_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm b/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm deleted file mode 100755 index 2eb4fb4..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/juce_data_structures.mm +++ /dev/null @@ -1,25 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#include "juce_data_structures.cpp" diff --git a/JuceLibraryCode/modules/juce_data_structures/juce_module_info b/JuceLibraryCode/modules/juce_data_structures/juce_module_info deleted file mode 100755 index 51d8fdb..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/juce_module_info +++ /dev/null @@ -1,20 +0,0 @@ -{ - "id": "juce_data_structures", - "name": "JUCE data model helper classes", - "version": "3.1.1", - "description": "Classes for undo/redo management, and smart data structures.", - "website": "http://www.juce.com/juce", - "license": "GPL/Commercial", - - "dependencies": [ { "id": "juce_core", "version": "matching" }, - { "id": "juce_events", "version": "matching" } ], - - "include": "juce_data_structures.h", - - "compile": [ { "file": "juce_data_structures.cpp", "target": "! xcode" }, - { "file": "juce_data_structures.mm", "target": "xcode" } ], - - "browse": [ "values/*", - "undomanager/*", - "app_properties/*" ] -} diff --git a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp b/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp deleted file mode 100755 index 07948c6..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.cpp +++ /dev/null @@ -1,303 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -struct UndoManager::ActionSet -{ - ActionSet (const String& transactionName) - : name (transactionName), - time (Time::getCurrentTime()) - {} - - bool perform() const - { - for (int i = 0; i < actions.size(); ++i) - if (! actions.getUnchecked(i)->perform()) - return false; - - return true; - } - - bool undo() const - { - for (int i = actions.size(); --i >= 0;) - if (! actions.getUnchecked(i)->undo()) - return false; - - return true; - } - - int getTotalSize() const - { - int total = 0; - - for (int i = actions.size(); --i >= 0;) - total += actions.getUnchecked(i)->getSizeInUnits(); - - return total; - } - - OwnedArray actions; - String name; - Time time; -}; - -//============================================================================== -UndoManager::UndoManager (const int maxNumberOfUnitsToKeep, - const int minimumTransactions) - : totalUnitsStored (0), - nextIndex (0), - newTransaction (true), - reentrancyCheck (false) -{ - setMaxNumberOfStoredUnits (maxNumberOfUnitsToKeep, - minimumTransactions); -} - -UndoManager::~UndoManager() -{ -} - -//============================================================================== -void UndoManager::clearUndoHistory() -{ - transactions.clear(); - totalUnitsStored = 0; - nextIndex = 0; - sendChangeMessage(); -} - -int UndoManager::getNumberOfUnitsTakenUpByStoredCommands() const -{ - return totalUnitsStored; -} - -void UndoManager::setMaxNumberOfStoredUnits (const int maxNumberOfUnitsToKeep, - const int minimumTransactions) -{ - maxNumUnitsToKeep = jmax (1, maxNumberOfUnitsToKeep); - minimumTransactionsToKeep = jmax (1, minimumTransactions); -} - -//============================================================================== -bool UndoManager::perform (UndoableAction* const newAction, const String& actionName) -{ - if (perform (newAction)) - { - if (actionName.isNotEmpty()) - setCurrentTransactionName (actionName); - - return true; - } - - return false; -} - -bool UndoManager::perform (UndoableAction* const newAction) -{ - if (newAction != nullptr) - { - ScopedPointer action (newAction); - - if (reentrancyCheck) - { - jassertfalse; // don't call perform() recursively from the UndoableAction::perform() - // or undo() methods, or else these actions will be discarded! - return false; - } - - if (action->perform()) - { - ActionSet* actionSet = getCurrentSet(); - - if (actionSet != nullptr && ! newTransaction) - { - if (UndoableAction* const lastAction = actionSet->actions.getLast()) - { - if (UndoableAction* const coalescedAction = lastAction->createCoalescedAction (action)) - { - action = coalescedAction; - totalUnitsStored -= lastAction->getSizeInUnits(); - actionSet->actions.removeLast(); - } - } - } - else - { - actionSet = new ActionSet (newTransactionName); - transactions.insert (nextIndex, actionSet); - ++nextIndex; - } - - totalUnitsStored += action->getSizeInUnits(); - actionSet->actions.add (action.release()); - newTransaction = false; - - clearFutureTransactions(); - sendChangeMessage(); - return true; - } - } - - return false; -} - -void UndoManager::clearFutureTransactions() -{ - while (nextIndex < transactions.size()) - { - totalUnitsStored -= transactions.getLast()->getTotalSize(); - transactions.removeLast(); - } - - while (nextIndex > 0 - && totalUnitsStored > maxNumUnitsToKeep - && transactions.size() > minimumTransactionsToKeep) - { - totalUnitsStored -= transactions.getFirst()->getTotalSize(); - transactions.remove (0); - --nextIndex; - - // if this fails, then some actions may not be returning - // consistent results from their getSizeInUnits() method - jassert (totalUnitsStored >= 0); - } -} - -void UndoManager::beginNewTransaction() noexcept -{ - beginNewTransaction (String()); -} - -void UndoManager::beginNewTransaction (const String& actionName) noexcept -{ - newTransaction = true; - newTransactionName = actionName; -} - -void UndoManager::setCurrentTransactionName (const String& newName) noexcept -{ - if (newTransaction) - newTransactionName = newName; - else if (ActionSet* action = getCurrentSet()) - action->name = newName; -} - -//============================================================================== -UndoManager::ActionSet* UndoManager::getCurrentSet() const noexcept { return transactions [nextIndex - 1]; } -UndoManager::ActionSet* UndoManager::getNextSet() const noexcept { return transactions [nextIndex]; } - -bool UndoManager::canUndo() const noexcept { return getCurrentSet() != nullptr; } -bool UndoManager::canRedo() const noexcept { return getNextSet() != nullptr; } - -bool UndoManager::undo() -{ - if (const ActionSet* const s = getCurrentSet()) - { - const ScopedValueSetter setter (reentrancyCheck, true); - - if (s->undo()) - --nextIndex; - else - clearUndoHistory(); - - beginNewTransaction(); - sendChangeMessage(); - return true; - } - - return false; -} - -bool UndoManager::redo() -{ - if (const ActionSet* const s = getNextSet()) - { - const ScopedValueSetter setter (reentrancyCheck, true); - - if (s->perform()) - ++nextIndex; - else - clearUndoHistory(); - - beginNewTransaction(); - sendChangeMessage(); - return true; - } - - return false; -} - -String UndoManager::getUndoDescription() const -{ - if (const ActionSet* const s = getCurrentSet()) - return s->name; - - return String(); -} - -String UndoManager::getRedoDescription() const -{ - if (const ActionSet* const s = getNextSet()) - return s->name; - - return String(); -} - -Time UndoManager::getTimeOfUndoTransaction() const -{ - if (const ActionSet* const s = getCurrentSet()) - return s->time; - - return Time(); -} - -Time UndoManager::getTimeOfRedoTransaction() const -{ - if (const ActionSet* const s = getNextSet()) - return s->time; - - return Time::getCurrentTime(); -} - -bool UndoManager::undoCurrentTransactionOnly() -{ - return newTransaction ? false : undo(); -} - -void UndoManager::getActionsInCurrentTransaction (Array& actionsFound) const -{ - if (! newTransaction) - if (const ActionSet* const s = getCurrentSet()) - for (int i = 0; i < s->actions.size(); ++i) - actionsFound.add (s->actions.getUnchecked(i)); -} - -int UndoManager::getNumActionsInCurrentTransaction() const -{ - if (! newTransaction) - if (const ActionSet* const s = getCurrentSet()) - return s->actions.size(); - - return 0; -} diff --git a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h b/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h deleted file mode 100755 index a3b691b..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoManager.h +++ /dev/null @@ -1,239 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_UNDOMANAGER_H_INCLUDED -#define JUCE_UNDOMANAGER_H_INCLUDED - - -//============================================================================== -/** - Manages a list of undo/redo commands. - - An UndoManager object keeps a list of past actions and can use these actions - to move backwards and forwards through an undo history. - - To use it, create subclasses of UndoableAction which perform all the - actions you need, then when you need to actually perform an action, create one - and pass it to the UndoManager's perform() method. - - The manager also uses the concept of 'transactions' to group the actions - together - all actions performed between calls to beginNewTransaction() are - grouped together and are all undone/redone as a group. - - The UndoManager is a ChangeBroadcaster, so listeners can register to be told - when actions are performed or undone. - - @see UndoableAction -*/ -class JUCE_API UndoManager : public ChangeBroadcaster -{ -public: - //============================================================================== - /** Creates an UndoManager. - - @param maxNumberOfUnitsToKeep each UndoableAction object returns a value - to indicate how much storage it takes up - (UndoableAction::getSizeInUnits()), so this - lets you specify the maximum total number of - units that the undomanager is allowed to - keep in memory before letting the older actions - drop off the end of the list. - @param minimumTransactionsToKeep this specifies the minimum number of transactions - that will be kept, even if this involves exceeding - the amount of space specified in maxNumberOfUnitsToKeep - */ - UndoManager (int maxNumberOfUnitsToKeep = 30000, - int minimumTransactionsToKeep = 30); - - /** Destructor. */ - ~UndoManager(); - - //============================================================================== - /** Deletes all stored actions in the list. */ - void clearUndoHistory(); - - /** Returns the current amount of space to use for storing UndoableAction objects. - @see setMaxNumberOfStoredUnits - */ - int getNumberOfUnitsTakenUpByStoredCommands() const; - - /** Sets the amount of space that can be used for storing UndoableAction objects. - - @param maxNumberOfUnitsToKeep each UndoableAction object returns a value - to indicate how much storage it takes up - (UndoableAction::getSizeInUnits()), so this - lets you specify the maximum total number of - units that the undomanager is allowed to - keep in memory before letting the older actions - drop off the end of the list. - @param minimumTransactionsToKeep this specifies the minimum number of transactions - that will be kept, even if this involves exceeding - the amount of space specified in maxNumberOfUnitsToKeep - @see getNumberOfUnitsTakenUpByStoredCommands - */ - void setMaxNumberOfStoredUnits (int maxNumberOfUnitsToKeep, - int minimumTransactionsToKeep); - - //============================================================================== - /** Performs an action and adds it to the undo history list. - - @param action the action to perform - this object will be deleted by - the UndoManager when no longer needed - @returns true if the command succeeds - see UndoableAction::perform - @see beginNewTransaction - */ - bool perform (UndoableAction* action); - - /** Performs an action and also gives it a name. - - @param action the action to perform - this object will be deleted by - the UndoManager when no longer needed - @param actionName if this string is non-empty, the current transaction will be - given this name; if it's empty, the current transaction name will - be left unchanged. See setCurrentTransactionName() - @returns true if the command succeeds - see UndoableAction::perform - @see beginNewTransaction - */ - bool perform (UndoableAction* action, const String& actionName); - - /** Starts a new group of actions that together will be treated as a single transaction. - - All actions that are passed to the perform() method between calls to this - method are grouped together and undone/redone together by a single call to - undo() or redo(). - */ - void beginNewTransaction() noexcept; - - /** Starts a new group of actions that together will be treated as a single transaction. - - All actions that are passed to the perform() method between calls to this - method are grouped together and undone/redone together by a single call to - undo() or redo(). - - @param actionName a description of the transaction that is about to be - performed - */ - void beginNewTransaction (const String& actionName) noexcept; - - /** Changes the name stored for the current transaction. - - Each transaction is given a name when the beginNewTransaction() method is - called, but this can be used to change that name without starting a new - transaction. - */ - void setCurrentTransactionName (const String& newName) noexcept; - - //============================================================================== - /** Returns true if there's at least one action in the list to undo. - @see getUndoDescription, undo, canRedo - */ - bool canUndo() const noexcept; - - /** Returns the name of the transaction that will be rolled-back when undo() is called. - @see undo - */ - String getUndoDescription() const; - - /** Tries to roll-back the last transaction. - @returns true if the transaction can be undone, and false if it fails, or - if there aren't any transactions to undo - */ - bool undo(); - - /** Tries to roll-back any actions that were added to the current transaction. - - This will perform an undo() only if there are some actions in the undo list - that were added after the last call to beginNewTransaction(). - - This is useful because it lets you call beginNewTransaction(), then - perform an operation which may or may not actually perform some actions, and - then call this method to get rid of any actions that might have been done - without it rolling back the previous transaction if nothing was actually - done. - - @returns true if any actions were undone. - */ - bool undoCurrentTransactionOnly(); - - /** Returns a list of the UndoableAction objects that have been performed during the - transaction that is currently open. - - Effectively, this is the list of actions that would be undone if undoCurrentTransactionOnly() - were to be called now. - - The first item in the list is the earliest action performed. - */ - void getActionsInCurrentTransaction (Array& actionsFound) const; - - /** Returns the number of UndoableAction objects that have been performed during the - transaction that is currently open. - @see getActionsInCurrentTransaction - */ - int getNumActionsInCurrentTransaction() const; - - /** Returns the time to which the state would be restored if undo() was to be called. - If an undo isn't currently possible, it'll return Time(). - */ - Time getTimeOfUndoTransaction() const; - - /** Returns the time to which the state would be restored if redo() was to be called. - If a redo isn't currently possible, it'll return Time::getCurrentTime(). - */ - Time getTimeOfRedoTransaction() const; - - //============================================================================== - /** Returns true if there's at least one action in the list to redo. - @see getRedoDescription, redo, canUndo - */ - bool canRedo() const noexcept; - - /** Returns the name of the transaction that will be redone when redo() is called. - @see redo - */ - String getRedoDescription() const; - - /** Tries to redo the last transaction that was undone. - @returns true if the transaction can be redone, and false if it fails, or - if there aren't any transactions to redo - */ - bool redo(); - - -private: - //============================================================================== - struct ActionSet; - friend struct ContainerDeletePolicy; - OwnedArray transactions; - String newTransactionName; - int totalUnitsStored, maxNumUnitsToKeep, minimumTransactionsToKeep, nextIndex; - bool newTransaction, reentrancyCheck; - ActionSet* getCurrentSet() const noexcept; - ActionSet* getNextSet() const noexcept; - void clearFutureTransactions(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (UndoManager) -}; - - -#endif // JUCE_UNDOMANAGER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h b/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h deleted file mode 100755 index 866d488..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/undomanager/juce_UndoableAction.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_UNDOABLEACTION_H_INCLUDED -#define JUCE_UNDOABLEACTION_H_INCLUDED - - -//============================================================================== -/** - Used by the UndoManager class to store an action which can be done - and undone. - - @see UndoManager -*/ -class JUCE_API UndoableAction -{ -protected: - /** Creates an action. */ - UndoableAction() noexcept {} - -public: - /** Destructor. */ - virtual ~UndoableAction() {} - - //============================================================================== - /** Overridden by a subclass to perform the action. - - This method is called by the UndoManager, and shouldn't be used directly by - applications. - - Be careful not to make any calls in a perform() method that could call - recursively back into the UndoManager::perform() method - - @returns true if the action could be performed. - @see UndoManager::perform - */ - virtual bool perform() = 0; - - /** Overridden by a subclass to undo the action. - - This method is called by the UndoManager, and shouldn't be used directly by - applications. - - Be careful not to make any calls in an undo() method that could call - recursively back into the UndoManager::perform() method - - @returns true if the action could be undone without any errors. - @see UndoManager::perform - */ - virtual bool undo() = 0; - - //============================================================================== - /** Returns a value to indicate how much memory this object takes up. - - Because the UndoManager keeps a list of UndoableActions, this is used - to work out how much space each one will take up, so that the UndoManager - can work out how many to keep. - - The default value returned here is 10 - units are arbitrary and - don't have to be accurate. - - @see UndoManager::getNumberOfUnitsTakenUpByStoredCommands, - UndoManager::setMaxNumberOfStoredUnits - */ - virtual int getSizeInUnits() { return 10; } - - /** Allows multiple actions to be coalesced into a single action object, to reduce storage space. - - If possible, this method should create and return a single action that does the same job as - this one followed by the supplied action. - - If it's not possible to merge the two actions, the method should return zero. - */ - virtual UndoableAction* createCoalescedAction (UndoableAction* nextAction) { (void) nextAction; return nullptr; } -}; - - -#endif // JUCE_UNDOABLEACTION_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp b/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp deleted file mode 100755 index b0bb405..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.cpp +++ /dev/null @@ -1,237 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -Value::ValueSource::ValueSource() -{ -} - -Value::ValueSource::~ValueSource() -{ - cancelPendingUpdate(); -} - -void Value::ValueSource::handleAsyncUpdate() -{ - sendChangeMessage (true); -} - -void Value::ValueSource::sendChangeMessage (const bool synchronous) -{ - const int numListeners = valuesWithListeners.size(); - - if (numListeners > 0) - { - if (synchronous) - { - const ReferenceCountedObjectPtr localRef (this); - - cancelPendingUpdate(); - - for (int i = numListeners; --i >= 0;) - if (Value* const v = valuesWithListeners[i]) - v->callListeners(); - } - else - { - triggerAsyncUpdate(); - } - } -} - -//============================================================================== -class SimpleValueSource : public Value::ValueSource -{ -public: - SimpleValueSource() - { - } - - SimpleValueSource (const var& initialValue) - : value (initialValue) - { - } - - var getValue() const - { - return value; - } - - void setValue (const var& newValue) - { - if (! newValue.equalsWithSameType (value)) - { - value = newValue; - sendChangeMessage (false); - } - } - -private: - var value; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleValueSource) -}; - - -//============================================================================== -Value::Value() : value (new SimpleValueSource()) -{ -} - -Value::Value (ValueSource* const v) : value (v) -{ - jassert (v != nullptr); -} - -Value::Value (const var& initialValue) : value (new SimpleValueSource (initialValue)) -{ -} - -Value::Value (const Value& other) : value (other.value) -{ -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -Value::Value (Value&& other) noexcept -{ - // moving a Value with listeners will lose those listeners, which - // probably isn't what you wanted to happen! - jassert (other.listeners.size() == 0); - - other.removeFromListenerList(); - value = static_cast&&> (other.value); -} - -Value& Value::operator= (Value&& other) noexcept -{ - // moving a Value with listeners will lose those listeners, which - // probably isn't what you wanted to happen! - jassert (other.listeners.size() == 0); - - other.removeFromListenerList(); - value = static_cast&&> (other.value); - return *this; -} -#endif - -Value::~Value() -{ - removeFromListenerList(); -} - -void Value::removeFromListenerList() -{ - if (listeners.size() > 0 && value != nullptr) // may be nullptr after a move operation - value->valuesWithListeners.removeValue (this); -} - -//============================================================================== -var Value::getValue() const -{ - return value->getValue(); -} - -Value::operator var() const -{ - return value->getValue(); -} - -void Value::setValue (const var& newValue) -{ - value->setValue (newValue); -} - -String Value::toString() const -{ - return value->getValue().toString(); -} - -Value& Value::operator= (const var& newValue) -{ - value->setValue (newValue); - return *this; -} - -void Value::referTo (const Value& valueToReferTo) -{ - if (valueToReferTo.value != value) - { - if (listeners.size() > 0) - { - value->valuesWithListeners.removeValue (this); - valueToReferTo.value->valuesWithListeners.add (this); - } - - value = valueToReferTo.value; - callListeners(); - } -} - -bool Value::refersToSameSourceAs (const Value& other) const -{ - return value == other.value; -} - -bool Value::operator== (const Value& other) const -{ - return value == other.value || value->getValue() == other.getValue(); -} - -bool Value::operator!= (const Value& other) const -{ - return value != other.value && value->getValue() != other.getValue(); -} - -//============================================================================== -void Value::addListener (ValueListener* const listener) -{ - if (listener != nullptr) - { - if (listeners.size() == 0) - value->valuesWithListeners.add (this); - - listeners.add (listener); - } -} - -void Value::removeListener (ValueListener* const listener) -{ - listeners.remove (listener); - - if (listeners.size() == 0) - value->valuesWithListeners.removeValue (this); -} - -void Value::callListeners() -{ - if (listeners.size() > 0) - { - Value v (*this); // (create a copy in case this gets deleted by a callback) - listeners.call (&ValueListener::valueChanged, v); - } -} - -OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const Value& value) -{ - return stream << value.toString(); -} diff --git a/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h b/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h deleted file mode 100755 index c25d35d..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/values/juce_Value.h +++ /dev/null @@ -1,237 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_VALUE_H_INCLUDED -#define JUCE_VALUE_H_INCLUDED - - -//============================================================================== -/** - Represents a shared variant value. - - A Value object contains a reference to a var object, and can get and set its value. - Listeners can be attached to be told when the value is changed. - - The Value class is a wrapper around a shared, reference-counted underlying data - object - this means that multiple Value objects can all refer to the same piece of - data, allowing all of them to be notified when any of them changes it. - - When you create a Value with its default constructor, it acts as a wrapper around a - simple var object, but by creating a Value that refers to a custom subclass of ValueSource, - you can map the Value onto any kind of underlying data. -*/ -class JUCE_API Value -{ -public: - //============================================================================== - /** Creates an empty Value, containing a void var. */ - Value(); - - /** Creates a Value that refers to the same value as another one. - - Note that this doesn't make a copy of the other value - both this and the other - Value will share the same underlying value, so that when either one alters it, both - will see it change. - */ - Value (const Value& other); - - /** Creates a Value that is set to the specified value. */ - explicit Value (const var& initialValue); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Value (Value&&) noexcept; - Value& operator= (Value&&) noexcept; - #endif - - /** Destructor. */ - ~Value(); - - //============================================================================== - /** Returns the current value. */ - var getValue() const; - - /** Returns the current value. */ - operator var() const; - - /** Returns the value as a string. - This is a shortcut for "myValue.getValue().toString()". - */ - String toString() const; - - /** Sets the current value. - - You can also use operator= to set the value. - - If there are any listeners registered, they will be notified of the - change asynchronously. - */ - void setValue (const var& newValue); - - /** Sets the current value. - - This is the same as calling setValue(). - - If there are any listeners registered, they will be notified of the - change asynchronously. - */ - Value& operator= (const var& newValue); - - /** Makes this object refer to the same underlying ValueSource as another one. - - Once this object has been connected to another one, changing either one - will update the other. - - Existing listeners will still be registered after you call this method, and - they'll continue to receive messages when the new value changes. - */ - void referTo (const Value& valueToReferTo); - - /** Returns true if this value and the other one are references to the same value. - */ - bool refersToSameSourceAs (const Value& other) const; - - /** Compares two values. - This is a compare-by-value comparison, so is effectively the same as - saying (this->getValue() == other.getValue()). - */ - bool operator== (const Value& other) const; - - /** Compares two values. - This is a compare-by-value comparison, so is effectively the same as - saying (this->getValue() != other.getValue()). - */ - bool operator!= (const Value& other) const; - - //============================================================================== - /** Receives callbacks when a Value object changes. - @see Value::addListener - */ - class JUCE_API Listener - { - public: - Listener() {} - virtual ~Listener() {} - - /** Called when a Value object is changed. - - Note that the Value object passed as a parameter may not be exactly the same - object that you registered the listener with - it might be a copy that refers - to the same underlying ValueSource. To find out, you can call Value::refersToSameSourceAs(). - */ - virtual void valueChanged (Value& value) = 0; - }; - - /** Adds a listener to receive callbacks when the value changes. - - The listener is added to this specific Value object, and not to the shared - object that it refers to. When this object is deleted, all the listeners will - be lost, even if other references to the same Value still exist. So when you're - adding a listener, make sure that you add it to a Value instance that will last - for as long as you need the listener. In general, you'd never want to add a listener - to a local stack-based Value, but more likely to one that's a member variable. - - @see removeListener - */ - void addListener (Listener* listener); - - /** Removes a listener that was previously added with addListener(). */ - void removeListener (Listener* listener); - - - //============================================================================== - /** - Used internally by the Value class as the base class for its shared value objects. - - The Value class is essentially a reference-counted pointer to a shared instance - of a ValueSource object. If you're feeling adventurous, you can create your own custom - ValueSource classes to allow Value objects to represent your own custom data items. - */ - class JUCE_API ValueSource : public ReferenceCountedObject, - private AsyncUpdater - { - public: - ValueSource(); - virtual ~ValueSource(); - - /** Returns the current value of this object. */ - virtual var getValue() const = 0; - - /** Changes the current value. - This must also trigger a change message if the value actually changes. - */ - virtual void setValue (const var& newValue) = 0; - - /** Delivers a change message to all the listeners that are registered with - this value. - - If dispatchSynchronously is true, the method will call all the listeners - before returning; otherwise it'll dispatch a message and make the call later. - */ - void sendChangeMessage (bool dispatchSynchronously); - - protected: - //============================================================================== - friend class Value; - SortedSet valuesWithListeners; - - private: - void handleAsyncUpdate() override; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ValueSource) - }; - - - //============================================================================== - /** Creates a Value object that uses this valueSource object as its underlying data. */ - explicit Value (ValueSource* valueSource); - - /** Returns the ValueSource that this value is referring to. */ - ValueSource& getValueSource() noexcept { return *value; } - - -private: - //============================================================================== - friend class ValueSource; - ReferenceCountedObjectPtr value; - ListenerList listeners; - - void callListeners(); - void removeFromListenerList(); - - // This is disallowed to avoid confusion about whether it should - // do a by-value or by-reference copy. - Value& operator= (const Value&) JUCE_DELETED_FUNCTION; - - // This declaration prevents accidental construction from an integer of 0, - // which is possible in some compilers via an implicit cast to a pointer. - explicit Value (void*) JUCE_DELETED_FUNCTION; -}; - -/** Writes a Value to an OutputStream as a UTF8 string. */ -OutputStream& JUCE_CALLTYPE operator<< (OutputStream&, const Value&); - -/** This typedef is just for compatibility with old code - newer code should use the Value::Listener class directly. */ -typedef Value::Listener ValueListener; - -#endif // JUCE_VALUE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp b/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp deleted file mode 100755 index 7bfa919..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.cpp +++ /dev/null @@ -1,1123 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class ValueTree::SharedObject : public ReferenceCountedObject -{ -public: - typedef ReferenceCountedObjectPtr Ptr; - - explicit SharedObject (Identifier t) noexcept - : type (t), parent (nullptr) - { - } - - SharedObject (const SharedObject& other) - : ReferenceCountedObject(), - type (other.type), properties (other.properties), parent (nullptr) - { - for (int i = 0; i < other.children.size(); ++i) - { - SharedObject* const child = new SharedObject (*other.children.getObjectPointerUnchecked(i)); - child->parent = this; - children.add (child); - } - } - - ~SharedObject() - { - jassert (parent == nullptr); // this should never happen unless something isn't obeying the ref-counting! - - for (int i = children.size(); --i >= 0;) - { - const Ptr c (children.getObjectPointerUnchecked(i)); - c->parent = nullptr; - children.remove (i); - c->sendParentChangeMessage(); - } - } - - template - void callListeners (Method method, ValueTree& tree) const - { - const int numListeners = valueTreesWithListeners.size(); - - if (numListeners > 0) - { - if (numListeners == 1) - { - valueTreesWithListeners.getUnchecked(0)->listeners.call (method, tree); - } - else - { - const SortedSet listenersCopy (valueTreesWithListeners); - - for (int i = 0; i < numListeners; ++i) - { - ValueTree* const v = listenersCopy.getUnchecked(i); - - if (i == 0 || valueTreesWithListeners.contains (v)) - v->listeners.call (method, tree); - } - } - } - } - - template - void callListeners (Method method, ValueTree& tree, ParamType& param2) const - { - const int numListeners = valueTreesWithListeners.size(); - - if (numListeners > 0) - { - if (numListeners == 1) - { - valueTreesWithListeners.getUnchecked(0)->listeners.call (method, tree, param2); - } - else - { - const SortedSet listenersCopy (valueTreesWithListeners); - - for (int i = 0; i < numListeners; ++i) - { - ValueTree* const v = listenersCopy.getUnchecked(i); - - if (i == 0 || valueTreesWithListeners.contains (v)) - v->listeners.call (method, tree, param2); - } - } - } - } - - void sendPropertyChangeMessage (const Identifier property) - { - ValueTree tree (this); - - for (ValueTree::SharedObject* t = this; t != nullptr; t = t->parent) - t->callListeners (&ValueTree::Listener::valueTreePropertyChanged, tree, property); - } - - void sendChildAddedMessage (ValueTree child) - { - ValueTree tree (this); - - for (ValueTree::SharedObject* t = this; t != nullptr; t = t->parent) - t->callListeners (&ValueTree::Listener::valueTreeChildAdded, tree, child); - } - - void sendChildRemovedMessage (ValueTree child) - { - ValueTree tree (this); - - for (ValueTree::SharedObject* t = this; t != nullptr; t = t->parent) - t->callListeners (&ValueTree::Listener::valueTreeChildRemoved, tree, child); - } - - void sendChildOrderChangedMessage() - { - ValueTree tree (this); - - for (ValueTree::SharedObject* t = this; t != nullptr; t = t->parent) - t->callListeners (&ValueTree::Listener::valueTreeChildOrderChanged, tree); - } - - void sendParentChangeMessage() - { - ValueTree tree (this); - - for (int j = children.size(); --j >= 0;) - if (SharedObject* const child = children.getObjectPointer (j)) - child->sendParentChangeMessage(); - - callListeners (&ValueTree::Listener::valueTreeParentChanged, tree); - } - - void setProperty (const Identifier name, const var& newValue, UndoManager* const undoManager) - { - if (undoManager == nullptr) - { - if (properties.set (name, newValue)) - sendPropertyChangeMessage (name); - } - else - { - if (const var* const existingValue = properties.getVarPointer (name)) - { - if (*existingValue != newValue) - undoManager->perform (new SetPropertyAction (this, name, newValue, *existingValue, false, false)); - } - else - { - undoManager->perform (new SetPropertyAction (this, name, newValue, var(), true, false)); - } - } - } - - bool hasProperty (const Identifier name) const noexcept - { - return properties.contains (name); - } - - void removeProperty (const Identifier name, UndoManager* const undoManager) - { - if (undoManager == nullptr) - { - if (properties.remove (name)) - sendPropertyChangeMessage (name); - } - else - { - if (properties.contains (name)) - undoManager->perform (new SetPropertyAction (this, name, var(), properties [name], false, true)); - } - } - - void removeAllProperties (UndoManager* const undoManager) - { - if (undoManager == nullptr) - { - while (properties.size() > 0) - { - const Identifier name (properties.getName (properties.size() - 1)); - properties.remove (name); - sendPropertyChangeMessage (name); - } - } - else - { - for (int i = properties.size(); --i >= 0;) - undoManager->perform (new SetPropertyAction (this, properties.getName(i), var(), - properties.getValueAt(i), false, true)); - } - } - - void copyPropertiesFrom (const SharedObject& source, UndoManager* const undoManager) - { - for (int i = properties.size(); --i >= 0;) - if (! source.properties.contains (properties.getName (i))) - removeProperty (properties.getName (i), undoManager); - - for (int i = 0; i < source.properties.size(); ++i) - setProperty (source.properties.getName(i), source.properties.getValueAt(i), undoManager); - } - - ValueTree getChildWithName (const Identifier typeToMatch) const - { - for (int i = 0; i < children.size(); ++i) - { - SharedObject* const s = children.getObjectPointerUnchecked (i); - if (s->type == typeToMatch) - return ValueTree (s); - } - - return ValueTree(); - } - - ValueTree getOrCreateChildWithName (const Identifier typeToMatch, UndoManager* undoManager) - { - for (int i = 0; i < children.size(); ++i) - { - SharedObject* const s = children.getObjectPointerUnchecked (i); - if (s->type == typeToMatch) - return ValueTree (s); - } - - SharedObject* const newObject = new SharedObject (typeToMatch); - addChild (newObject, -1, undoManager); - return ValueTree (newObject); - - } - - ValueTree getChildWithProperty (const Identifier propertyName, const var& propertyValue) const - { - for (int i = 0; i < children.size(); ++i) - { - SharedObject* const s = children.getObjectPointerUnchecked (i); - if (s->properties[propertyName] == propertyValue) - return ValueTree (s); - } - - return ValueTree(); - } - - bool isAChildOf (const SharedObject* const possibleParent) const noexcept - { - for (const SharedObject* p = parent; p != nullptr; p = p->parent) - if (p == possibleParent) - return true; - - return false; - } - - int indexOf (const ValueTree& child) const noexcept - { - return children.indexOf (child.object); - } - - void addChild (SharedObject* child, int index, UndoManager* const undoManager) - { - if (child != nullptr && child->parent != this) - { - if (child != this && ! isAChildOf (child)) - { - // You should always make sure that a child is removed from its previous parent before - // adding it somewhere else - otherwise, it's ambiguous as to whether a different - // undomanager should be used when removing it from its current parent.. - jassert (child->parent == nullptr); - - if (child->parent != nullptr) - { - jassert (child->parent->children.indexOf (child) >= 0); - child->parent->removeChild (child->parent->children.indexOf (child), undoManager); - } - - if (undoManager == nullptr) - { - children.insert (index, child); - child->parent = this; - sendChildAddedMessage (ValueTree (child)); - child->sendParentChangeMessage(); - } - else - { - if (! isPositiveAndBelow (index, children.size())) - index = children.size(); - - undoManager->perform (new AddOrRemoveChildAction (this, index, child)); - } - } - else - { - // You're attempting to create a recursive loop! A node - // can't be a child of one of its own children! - jassertfalse; - } - } - } - - void removeChild (const int childIndex, UndoManager* const undoManager) - { - if (const Ptr child = children.getObjectPointer (childIndex)) - { - if (undoManager == nullptr) - { - children.remove (childIndex); - child->parent = nullptr; - sendChildRemovedMessage (ValueTree (child)); - child->sendParentChangeMessage(); - } - else - { - undoManager->perform (new AddOrRemoveChildAction (this, childIndex, nullptr)); - } - } - } - - void removeAllChildren (UndoManager* const undoManager) - { - while (children.size() > 0) - removeChild (children.size() - 1, undoManager); - } - - void moveChild (int currentIndex, int newIndex, UndoManager* undoManager) - { - // The source index must be a valid index! - jassert (isPositiveAndBelow (currentIndex, children.size())); - - if (currentIndex != newIndex - && isPositiveAndBelow (currentIndex, children.size())) - { - if (undoManager == nullptr) - { - children.move (currentIndex, newIndex); - sendChildOrderChangedMessage(); - } - else - { - if (! isPositiveAndBelow (newIndex, children.size())) - newIndex = children.size() - 1; - - undoManager->perform (new MoveChildAction (this, currentIndex, newIndex)); - } - } - } - - void reorderChildren (const OwnedArray& newOrder, UndoManager* undoManager) - { - jassert (newOrder.size() == children.size()); - - if (undoManager == nullptr) - { - children.clear(); - children.ensureStorageAllocated (newOrder.size()); - - for (int i = 0; i < newOrder.size(); ++i) - children.add (newOrder.getUnchecked(i)->object); - - sendChildOrderChangedMessage(); - } - else - { - for (int i = 0; i < children.size(); ++i) - { - SharedObject* const child = newOrder.getUnchecked(i)->object; - - if (children.getObjectPointerUnchecked (i) != child) - { - const int oldIndex = children.indexOf (child); - jassert (oldIndex >= 0); - moveChild (oldIndex, i, undoManager); - } - } - } - } - - bool isEquivalentTo (const SharedObject& other) const - { - if (type != other.type - || properties.size() != other.properties.size() - || children.size() != other.children.size() - || properties != other.properties) - return false; - - for (int i = 0; i < children.size(); ++i) - if (! children.getObjectPointerUnchecked(i)->isEquivalentTo (*other.children.getObjectPointerUnchecked(i))) - return false; - - return true; - } - - XmlElement* createXml() const - { - XmlElement* const xml = new XmlElement (type); - properties.copyToXmlAttributes (*xml); - - // (NB: it's faster to add nodes to XML elements in reverse order) - for (int i = children.size(); --i >= 0;) - xml->prependChildElement (children.getObjectPointerUnchecked(i)->createXml()); - - return xml; - } - - void writeToStream (OutputStream& output) const - { - output.writeString (type.toString()); - output.writeCompressedInt (properties.size()); - - for (int j = 0; j < properties.size(); ++j) - { - output.writeString (properties.getName (j).toString()); - properties.getValueAt(j).writeToStream (output); - } - - output.writeCompressedInt (children.size()); - - for (int i = 0; i < children.size(); ++i) - writeObjectToStream (output, children.getObjectPointerUnchecked(i)); - } - - static void writeObjectToStream (OutputStream& output, const SharedObject* const object) - { - if (object != nullptr) - { - object->writeToStream (output); - } - else - { - output.writeString (String()); - output.writeCompressedInt (0); - output.writeCompressedInt (0); - } - } - - //============================================================================== - class SetPropertyAction : public UndoableAction - { - public: - SetPropertyAction (SharedObject* const so, const Identifier propertyName, - const var& newVal, const var& oldVal, bool isAdding, bool isDeleting) - : target (so), name (propertyName), newValue (newVal), oldValue (oldVal), - isAddingNewProperty (isAdding), isDeletingProperty (isDeleting) - { - } - - bool perform() - { - jassert (! (isAddingNewProperty && target->hasProperty (name))); - - if (isDeletingProperty) - target->removeProperty (name, nullptr); - else - target->setProperty (name, newValue, nullptr); - - return true; - } - - bool undo() - { - if (isAddingNewProperty) - target->removeProperty (name, nullptr); - else - target->setProperty (name, oldValue, nullptr); - - return true; - } - - int getSizeInUnits() - { - return (int) sizeof (*this); //xxx should be more accurate - } - - UndoableAction* createCoalescedAction (UndoableAction* nextAction) - { - if (! (isAddingNewProperty || isDeletingProperty)) - { - if (SetPropertyAction* const next = dynamic_cast (nextAction)) - if (next->target == target && next->name == name - && ! (next->isAddingNewProperty || next->isDeletingProperty)) - return new SetPropertyAction (target, name, next->newValue, oldValue, false, false); - } - - return nullptr; - } - - private: - const Ptr target; - const Identifier name; - const var newValue; - var oldValue; - const bool isAddingNewProperty : 1, isDeletingProperty : 1; - - JUCE_DECLARE_NON_COPYABLE (SetPropertyAction) - }; - - //============================================================================== - class AddOrRemoveChildAction : public UndoableAction - { - public: - AddOrRemoveChildAction (SharedObject* parentObject, int index, SharedObject* newChild) - : target (parentObject), - child (newChild != nullptr ? newChild : parentObject->children.getObjectPointer (index)), - childIndex (index), - isDeleting (newChild == nullptr) - { - jassert (child != nullptr); - } - - bool perform() - { - if (isDeleting) - target->removeChild (childIndex, nullptr); - else - target->addChild (child, childIndex, nullptr); - - return true; - } - - bool undo() - { - if (isDeleting) - { - target->addChild (child, childIndex, nullptr); - } - else - { - // If you hit this, it seems that your object's state is getting confused - probably - // because you've interleaved some undoable and non-undoable operations? - jassert (childIndex < target->children.size()); - target->removeChild (childIndex, nullptr); - } - - return true; - } - - int getSizeInUnits() - { - return (int) sizeof (*this); //xxx should be more accurate - } - - private: - const Ptr target, child; - const int childIndex; - const bool isDeleting; - - JUCE_DECLARE_NON_COPYABLE (AddOrRemoveChildAction) - }; - - //============================================================================== - class MoveChildAction : public UndoableAction - { - public: - MoveChildAction (SharedObject* parentObject, int fromIndex, int toIndex) noexcept - : parent (parentObject), startIndex (fromIndex), endIndex (toIndex) - { - } - - bool perform() - { - parent->moveChild (startIndex, endIndex, nullptr); - return true; - } - - bool undo() - { - parent->moveChild (endIndex, startIndex, nullptr); - return true; - } - - int getSizeInUnits() - { - return (int) sizeof (*this); //xxx should be more accurate - } - - UndoableAction* createCoalescedAction (UndoableAction* nextAction) - { - if (MoveChildAction* next = dynamic_cast (nextAction)) - if (next->parent == parent && next->startIndex == endIndex) - return new MoveChildAction (parent, startIndex, next->endIndex); - - return nullptr; - } - - private: - const Ptr parent; - const int startIndex, endIndex; - - JUCE_DECLARE_NON_COPYABLE (MoveChildAction) - }; - - //============================================================================== - const Identifier type; - NamedValueSet properties; - ReferenceCountedArray children; - SortedSet valueTreesWithListeners; - SharedObject* parent; - -private: - SharedObject& operator= (const SharedObject&); - JUCE_LEAK_DETECTOR (SharedObject) -}; - -//============================================================================== -ValueTree::ValueTree() noexcept -{ -} - -const ValueTree ValueTree::invalid; - -ValueTree::ValueTree (Identifier type) : object (new ValueTree::SharedObject (type)) -{ - jassert (type.toString().isNotEmpty()); // All objects must be given a sensible type name! -} - -ValueTree::ValueTree (SharedObject* so) : object (so) -{ -} - -ValueTree::ValueTree (const ValueTree& other) : object (other.object) -{ -} - -ValueTree& ValueTree::operator= (const ValueTree& other) -{ - if (object != other.object) - { - if (listeners.isEmpty()) - { - object = other.object; - } - else - { - if (object != nullptr) - object->valueTreesWithListeners.removeValue (this); - - if (other.object != nullptr) - other.object->valueTreesWithListeners.add (this); - - object = other.object; - - listeners.call (&ValueTree::Listener::valueTreeRedirected, *this); - } - } - - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -ValueTree::ValueTree (ValueTree&& other) noexcept - : object (static_cast (other.object)) -{ -} -#endif - -ValueTree::~ValueTree() -{ - if (listeners.size() > 0 && object != nullptr) - object->valueTreesWithListeners.removeValue (this); -} - -bool ValueTree::operator== (const ValueTree& other) const noexcept -{ - return object == other.object; -} - -bool ValueTree::operator!= (const ValueTree& other) const noexcept -{ - return object != other.object; -} - -bool ValueTree::isEquivalentTo (const ValueTree& other) const -{ - return object == other.object - || (object != nullptr && other.object != nullptr - && object->isEquivalentTo (*other.object)); -} - -ValueTree ValueTree::createCopy() const -{ - return ValueTree (createCopyIfNotNull (object.get())); -} - -bool ValueTree::hasType (const Identifier typeName) const -{ - return object != nullptr && object->type == typeName; -} - -Identifier ValueTree::getType() const -{ - return object != nullptr ? object->type : Identifier(); -} - -ValueTree ValueTree::getParent() const -{ - return ValueTree (object != nullptr ? object->parent - : static_cast (nullptr)); -} - -ValueTree ValueTree::getSibling (const int delta) const -{ - if (object == nullptr || object->parent == nullptr) - return invalid; - - const int index = object->parent->indexOf (*this) + delta; - return ValueTree (object->parent->children.getObjectPointer (index)); -} - -const var& ValueTree::operator[] (const Identifier name) const -{ - return object == nullptr ? var::null : object->properties[name]; -} - -const var& ValueTree::getProperty (const Identifier name) const -{ - return object == nullptr ? var::null : object->properties[name]; -} - -var ValueTree::getProperty (const Identifier name, const var& defaultReturnValue) const -{ - return object == nullptr ? defaultReturnValue - : object->properties.getWithDefault (name, defaultReturnValue); -} - -ValueTree& ValueTree::setProperty (const Identifier name, const var& newValue, - UndoManager* const undoManager) -{ - jassert (name.toString().isNotEmpty()); // Must have a valid property name! - jassert (object != nullptr); // Trying to add a property to a null ValueTree will fail! - - if (object != nullptr) - object->setProperty (name, newValue, undoManager); - - return *this; -} - -bool ValueTree::hasProperty (const Identifier name) const -{ - return object != nullptr && object->hasProperty (name); -} - -void ValueTree::removeProperty (const Identifier name, UndoManager* const undoManager) -{ - if (object != nullptr) - object->removeProperty (name, undoManager); -} - -void ValueTree::removeAllProperties (UndoManager* const undoManager) -{ - if (object != nullptr) - object->removeAllProperties (undoManager); -} - -int ValueTree::getNumProperties() const -{ - return object == nullptr ? 0 : object->properties.size(); -} - -Identifier ValueTree::getPropertyName (const int index) const -{ - return object == nullptr ? Identifier() - : object->properties.getName (index); -} - -void ValueTree::copyPropertiesFrom (const ValueTree& source, UndoManager* const undoManager) -{ - jassert (object != nullptr || source.object == nullptr); // Trying to add properties to a null ValueTree will fail! - - if (source.object == nullptr) - removeAllProperties (undoManager); - else if (object != nullptr) - object->copyPropertiesFrom (*(source.object), undoManager); -} - -int ValueTree::getReferenceCount() const noexcept -{ - return object != nullptr ? object->getReferenceCount() : 0; -} - -//============================================================================== -class ValueTreePropertyValueSource : public Value::ValueSource, - private ValueTree::Listener -{ -public: - ValueTreePropertyValueSource (const ValueTree& vt, const Identifier prop, UndoManager* um) - : tree (vt), property (prop), undoManager (um) - { - tree.addListener (this); - } - - ~ValueTreePropertyValueSource() - { - tree.removeListener (this); - } - - var getValue() const { return tree [property]; } - void setValue (const var& newValue) { tree.setProperty (property, newValue, undoManager); } - -private: - ValueTree tree; - const Identifier property; - UndoManager* const undoManager; - - void valueTreePropertyChanged (ValueTree& changedTree, const Identifier& changedProperty) override - { - if (tree == changedTree && property == changedProperty) - sendChangeMessage (false); - } - - void valueTreeChildAdded (ValueTree&, ValueTree&) override {} - void valueTreeChildRemoved (ValueTree&, ValueTree&) override {} - void valueTreeChildOrderChanged (ValueTree&) override {} - void valueTreeParentChanged (ValueTree&) override {} - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ValueTreePropertyValueSource) -}; - -Value ValueTree::getPropertyAsValue (const Identifier name, UndoManager* const undoManager) -{ - return Value (new ValueTreePropertyValueSource (*this, name, undoManager)); -} - -//============================================================================== -int ValueTree::getNumChildren() const -{ - return object == nullptr ? 0 : object->children.size(); -} - -ValueTree ValueTree::getChild (int index) const -{ - return ValueTree (object != nullptr ? object->children.getObjectPointer (index) - : static_cast (nullptr)); -} - -ValueTree ValueTree::getChildWithName (const Identifier type) const -{ - return object != nullptr ? object->getChildWithName (type) : ValueTree(); -} - -ValueTree ValueTree::getOrCreateChildWithName (const Identifier type, UndoManager* undoManager) -{ - return object != nullptr ? object->getOrCreateChildWithName (type, undoManager) : ValueTree(); -} - -ValueTree ValueTree::getChildWithProperty (const Identifier propertyName, const var& propertyValue) const -{ - return object != nullptr ? object->getChildWithProperty (propertyName, propertyValue) : ValueTree(); -} - -bool ValueTree::isAChildOf (const ValueTree& possibleParent) const -{ - return object != nullptr && object->isAChildOf (possibleParent.object); -} - -int ValueTree::indexOf (const ValueTree& child) const -{ - return object != nullptr ? object->indexOf (child) : -1; -} - -void ValueTree::addChild (const ValueTree& child, int index, UndoManager* const undoManager) -{ - jassert (object != nullptr); // Trying to add a child to a null ValueTree! - - if (object != nullptr) - object->addChild (child.object, index, undoManager); -} - -void ValueTree::removeChild (const int childIndex, UndoManager* const undoManager) -{ - if (object != nullptr) - object->removeChild (childIndex, undoManager); -} - -void ValueTree::removeChild (const ValueTree& child, UndoManager* const undoManager) -{ - if (object != nullptr) - object->removeChild (object->children.indexOf (child.object), undoManager); -} - -void ValueTree::removeAllChildren (UndoManager* const undoManager) -{ - if (object != nullptr) - object->removeAllChildren (undoManager); -} - -void ValueTree::moveChild (int currentIndex, int newIndex, UndoManager* undoManager) -{ - if (object != nullptr) - object->moveChild (currentIndex, newIndex, undoManager); -} - -//============================================================================== -void ValueTree::createListOfChildren (OwnedArray& list) const -{ - jassert (object != nullptr); - - for (int i = 0; i < object->children.size(); ++i) - list.add (new ValueTree (object->children.getObjectPointerUnchecked(i))); -} - -void ValueTree::reorderChildren (const OwnedArray& newOrder, UndoManager* undoManager) -{ - jassert (object != nullptr); - object->reorderChildren (newOrder, undoManager); -} - -//============================================================================== -void ValueTree::addListener (Listener* listener) -{ - if (listener != nullptr) - { - if (listeners.isEmpty() && object != nullptr) - object->valueTreesWithListeners.add (this); - - listeners.add (listener); - } -} - -void ValueTree::removeListener (Listener* listener) -{ - listeners.remove (listener); - - if (listeners.isEmpty() && object != nullptr) - object->valueTreesWithListeners.removeValue (this); -} - -void ValueTree::sendPropertyChangeMessage (const Identifier property) -{ - if (object != nullptr) - object->sendPropertyChangeMessage (property); -} - -//============================================================================== -XmlElement* ValueTree::createXml() const -{ - return object != nullptr ? object->createXml() : nullptr; -} - -ValueTree ValueTree::fromXml (const XmlElement& xml) -{ - // ValueTrees don't have any equivalent to XML text elements! - jassert (! xml.isTextElement()); - - ValueTree v (xml.getTagName()); - v.object->properties.setFromXmlAttributes (xml); - - forEachXmlChildElement (xml, e) - v.addChild (fromXml (*e), -1, nullptr); - - return v; -} - -String ValueTree::toXmlString() const -{ - const ScopedPointer xml (createXml()); - return xml != nullptr ? xml->createDocument ("") : String(); -} - -//============================================================================== -void ValueTree::writeToStream (OutputStream& output) const -{ - SharedObject::writeObjectToStream (output, object); -} - -ValueTree ValueTree::readFromStream (InputStream& input) -{ - const String type (input.readString()); - - if (type.isEmpty()) - return ValueTree(); - - ValueTree v (type); - - const int numProps = input.readCompressedInt(); - - if (numProps < 0) - { - jassertfalse; // trying to read corrupted data! - return v; - } - - for (int i = 0; i < numProps; ++i) - { - const String name (input.readString()); - jassert (name.isNotEmpty()); - const var value (var::readFromStream (input)); - v.object->properties.set (name, value); - } - - const int numChildren = input.readCompressedInt(); - v.object->children.ensureStorageAllocated (numChildren); - - for (int i = 0; i < numChildren; ++i) - { - ValueTree child (readFromStream (input)); - - v.object->children.add (child.object); - child.object->parent = v.object; - } - - return v; -} - -ValueTree ValueTree::readFromData (const void* const data, const size_t numBytes) -{ - MemoryInputStream in (data, numBytes, false); - return readFromStream (in); -} - -ValueTree ValueTree::readFromGZIPData (const void* const data, const size_t numBytes) -{ - MemoryInputStream in (data, numBytes, false); - GZIPDecompressorInputStream gzipStream (in); - return readFromStream (gzipStream); -} - -void ValueTree::Listener::valueTreeRedirected (ValueTree&) {} - -//============================================================================== -#if JUCE_UNIT_TESTS - -class ValueTreeTests : public UnitTest -{ -public: - ValueTreeTests() : UnitTest ("ValueTrees") {} - - static String createRandomIdentifier (Random& r) - { - char buffer[50] = { 0 }; - const char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-:"; - - for (int i = 1 + r.nextInt (numElementsInArray (buffer) - 2); --i >= 0;) - buffer[i] = chars [r.nextInt (sizeof (chars) - 1)]; - - return CharPointer_ASCII (buffer); - } - - static String createRandomWideCharString (Random& r) - { - juce_wchar buffer[50] = { 0 }; - - for (int i = r.nextInt (numElementsInArray (buffer) - 1); --i >= 0;) - { - if (r.nextBool()) - { - do - { - buffer[i] = (juce_wchar) (1 + r.nextInt (0x10ffff - 1)); - } - while (! CharPointer_UTF16::canRepresent (buffer[i])); - } - else - buffer[i] = (juce_wchar) (1 + r.nextInt (0x7e)); - } - - return CharPointer_UTF32 (buffer); - } - - static ValueTree createRandomTree (UndoManager* undoManager, int depth, Random& r) - { - ValueTree v (createRandomIdentifier (r)); - - for (int i = r.nextInt (10); --i >= 0;) - { - switch (r.nextInt (5)) - { - case 0: v.setProperty (createRandomIdentifier (r), createRandomWideCharString (r), undoManager); break; - case 1: v.setProperty (createRandomIdentifier (r), r.nextInt(), undoManager); break; - case 2: if (depth < 5) v.addChild (createRandomTree (undoManager, depth + 1, r), r.nextInt (v.getNumChildren() + 1), undoManager); break; - case 3: v.setProperty (createRandomIdentifier (r), r.nextBool(), undoManager); break; - case 4: v.setProperty (createRandomIdentifier (r), r.nextDouble(), undoManager); break; - default: break; - } - } - - return v; - } - - void runTest() - { - beginTest ("ValueTree"); - Random r = getRandom(); - - for (int i = 10; --i >= 0;) - { - MemoryOutputStream mo; - ValueTree v1 (createRandomTree (nullptr, 0, r)); - v1.writeToStream (mo); - - MemoryInputStream mi (mo.getData(), mo.getDataSize(), false); - ValueTree v2 = ValueTree::readFromStream (mi); - expect (v1.isEquivalentTo (v2)); - - ScopedPointer xml1 (v1.createXml()); - ScopedPointer xml2 (v2.createCopy().createXml()); - expect (xml1->isEquivalentTo (xml2, false)); - - ValueTree v4 = v2.createCopy(); - expect (v1.isEquivalentTo (v4)); - } - } -}; - -static ValueTreeTests valueTreeTests; - -#endif diff --git a/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h b/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h deleted file mode 100755 index 42dd778..0000000 --- a/JuceLibraryCode/modules/juce_data_structures/values/juce_ValueTree.h +++ /dev/null @@ -1,531 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_VALUETREE_H_INCLUDED -#define JUCE_VALUETREE_H_INCLUDED - - -//============================================================================== -/** - A powerful tree structure that can be used to hold free-form data, and which can - handle its own undo and redo behaviour. - - A ValueTree contains a list of named properties as var objects, and also holds - any number of sub-trees. - - Create ValueTree objects on the stack, and don't be afraid to copy them around, as - they're simply a lightweight reference to a shared data container. Creating a copy - of another ValueTree simply creates a new reference to the same underlying object - to - make a separate, deep copy of a tree you should explicitly call createCopy(). - - Each ValueTree has a type name, in much the same way as an XmlElement has a tag name, - and much of the structure of a ValueTree is similar to an XmlElement tree. - You can convert a ValueTree to and from an XmlElement, and as long as the XML doesn't - contain text elements, the conversion works well and makes a good serialisation - format. They can also be serialised to a binary format, which is very fast and compact. - - All the methods that change data take an optional UndoManager, which will be used - to track any changes to the object. For this to work, you have to be careful to - consistently always use the same UndoManager for all operations to any node inside - the tree. - - A ValueTree can only be a child of one parent at a time, so if you're moving one from - one tree to another, be careful to always remove it first, before adding it. This - could also mess up your undo/redo chain, so be wary! In a debug build you should hit - assertions if you try to do anything dangerous, but there are still plenty of ways it - could go wrong. - - Listeners can be added to a ValueTree to be told when properies change and when - nodes are added or removed. - - @see var, XmlElement -*/ -class JUCE_API ValueTree -{ -public: - //============================================================================== - /** Creates an empty, invalid ValueTree. - - A ValueTree that is created with this constructor can't actually be used for anything, - it's just a default 'null' ValueTree that can be returned to indicate some sort of failure. - To create a real one, use the constructor that takes a string. - - @see ValueTree::invalid - */ - ValueTree() noexcept; - - /** Creates an empty ValueTree with the given type name. - Like an XmlElement, each ValueTree node has a type, which you can access with - getType() and hasType(). - */ - explicit ValueTree (Identifier type); - - /** Creates a reference to another ValueTree. */ - ValueTree (const ValueTree&); - - /** Makes this object reference another node. */ - ValueTree& operator= (const ValueTree&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - ValueTree (ValueTree&&) noexcept; - #endif - - /** Destructor. */ - ~ValueTree(); - - /** Returns true if both this and the other tree node refer to the same underlying structure. - Note that this isn't a value comparison - two independently-created trees which - contain identical data are not considered equal. - */ - bool operator== (const ValueTree&) const noexcept; - - /** Returns true if this and the other node refer to different underlying structures. - Note that this isn't a value comparison - two independently-created trees which - contain identical data are not considered equal. - */ - bool operator!= (const ValueTree&) const noexcept; - - /** Performs a deep comparison between the properties and children of two trees. - If all the properties and children of the two trees are the same (recursively), this - returns true. - The normal operator==() only checks whether two trees refer to the same shared data - structure, so use this method if you need to do a proper value comparison. - */ - bool isEquivalentTo (const ValueTree&) const; - - //============================================================================== - /** Returns true if this node refers to some valid data. - It's hard to create an invalid node, but you might get one returned, e.g. by an out-of-range - call to getChild(). - */ - bool isValid() const { return object != nullptr; } - - /** Returns a deep copy of this tree and all its sub-nodes. */ - ValueTree createCopy() const; - - //============================================================================== - /** Returns the type of this node. - The type is specified when the ValueTree is created. - @see hasType - */ - Identifier getType() const; - - /** Returns true if the node has this type. - The comparison is case-sensitive. - */ - bool hasType (const Identifier typeName) const; - - //============================================================================== - /** Returns the value of a named property. - If no such property has been set, this will return a void variant. - You can also use operator[] to get a property. - @see var, setProperty, hasProperty - */ - const var& getProperty (const Identifier name) const; - - /** Returns the value of a named property, or a user-specified default if the property doesn't exist. - If no such property has been set, this will return the value of defaultReturnValue. - You can also use operator[] and getProperty to get a property. - @see var, getProperty, setProperty, hasProperty - */ - var getProperty (const Identifier name, const var& defaultReturnValue) const; - - /** Returns the value of a named property. - If no such property has been set, this will return a void variant. This is the same as - calling getProperty(). - @see getProperty - */ - const var& operator[] (const Identifier name) const; - - /** Changes a named property of the node. - The name identifier must not be an empty string. - If the undoManager parameter is non-null, its UndoManager::perform() method will be used, - so that this change can be undone. - @see var, getProperty, removeProperty - @returns a reference to the value tree, so that you can daisy-chain calls to this method. - */ - ValueTree& setProperty (const Identifier name, const var& newValue, UndoManager* undoManager); - - /** Returns true if the node contains a named property. */ - bool hasProperty (const Identifier name) const; - - /** Removes a property from the node. - If the undoManager parameter is non-null, its UndoManager::perform() method will be used, - so that this change can be undone. - */ - void removeProperty (const Identifier name, UndoManager* undoManager); - - /** Removes all properties from the node. - If the undoManager parameter is non-null, its UndoManager::perform() method will be used, - so that this change can be undone. - */ - void removeAllProperties (UndoManager* undoManager); - - /** Returns the total number of properties that the node contains. - @see getProperty. - */ - int getNumProperties() const; - - /** Returns the identifier of the property with a given index. - @see getNumProperties - */ - Identifier getPropertyName (int index) const; - - /** Returns a Value object that can be used to control and respond to one of the tree's properties. - - The Value object will maintain a reference to this tree, and will use the undo manager when - it needs to change the value. Attaching a Value::Listener to the value object will provide - callbacks whenever the property changes. - */ - Value getPropertyAsValue (const Identifier name, UndoManager* undoManager); - - /** Overwrites all the properties in this tree with the properties of the source tree. - Any properties that already exist will be updated; and new ones will be added, and - any that are not present in the source tree will be removed. - */ - void copyPropertiesFrom (const ValueTree& source, UndoManager* undoManager); - - //============================================================================== - /** Returns the number of child nodes belonging to this one. - @see getChild - */ - int getNumChildren() const; - - /** Returns one of this node's child nodes. - If the index is out of range, it'll return an invalid node. (See isValid() to find out - whether a node is valid). - */ - ValueTree getChild (int index) const; - - /** Returns the first child node with the speficied type name. - If no such node is found, it'll return an invalid node. (See isValid() to find out - whether a node is valid). - @see getOrCreateChildWithName - */ - ValueTree getChildWithName (const Identifier type) const; - - /** Returns the first child node with the speficied type name, creating and adding - a child with this name if there wasn't already one there. - - The only time this will return an invalid object is when the object that you're calling - the method on is itself invalid. - @see getChildWithName - */ - ValueTree getOrCreateChildWithName (const Identifier type, UndoManager* undoManager); - - /** Looks for the first child node that has the speficied property value. - - This will scan the child nodes in order, until it finds one that has property that matches - the specified value. - - If no such node is found, it'll return an invalid node. (See isValid() to find out - whether a node is valid). - */ - ValueTree getChildWithProperty (const Identifier propertyName, const var& propertyValue) const; - - /** Adds a child to this node. - - Make sure that the child is removed from any former parent node before calling this, or - you'll hit an assertion. - - If the index is < 0 or greater than the current number of child nodes, the new node will - be added at the end of the list. - - If the undoManager parameter is non-null, its UndoManager::perform() method will be used, - so that this change can be undone. - */ - void addChild (const ValueTree& child, int index, UndoManager* undoManager); - - /** Removes the specified child from this node's child-list. - If the undoManager parameter is non-null, its UndoManager::perform() method will be used, - so that this change can be undone. - */ - void removeChild (const ValueTree& child, UndoManager* undoManager); - - /** Removes a child from this node's child-list. - If the undoManager parameter is non-null, its UndoManager::perform() method will be used, - so that this change can be undone. - */ - void removeChild (int childIndex, UndoManager* undoManager); - - /** Removes all child-nodes from this node. - If the undoManager parameter is non-null, its UndoManager::perform() method will be used, - so that this change can be undone. - */ - void removeAllChildren (UndoManager* undoManager); - - /** Moves one of the children to a different index. - - This will move the child to a specified index, shuffling along any intervening - items as required. So for example, if you have a list of { 0, 1, 2, 3, 4, 5 }, then - calling move (2, 4) would result in { 0, 1, 3, 4, 2, 5 }. - - @param currentIndex the index of the item to be moved. If this isn't a - valid index, then nothing will be done - @param newIndex the index at which you'd like this item to end up. If this - is less than zero, the value will be moved to the end - of the list - @param undoManager the optional UndoManager to use to store this transaction - */ - void moveChild (int currentIndex, int newIndex, UndoManager* undoManager); - - /** Returns true if this node is anywhere below the specified parent node. - This returns true if the node is a child-of-a-child, as well as a direct child. - */ - bool isAChildOf (const ValueTree& possibleParent) const; - - /** Returns the index of a child item in this parent. - If the child isn't found, this returns -1. - */ - int indexOf (const ValueTree& child) const; - - /** Returns the parent node that contains this one. - If the node has no parent, this will return an invalid node. (See isValid() to find out - whether a node is valid). - */ - ValueTree getParent() const; - - /** Returns one of this node's siblings in its parent's child list. - - The delta specifies how far to move through the list, so a value of 1 would return the node - that follows this one, -1 would return the node before it, 0 will return this node itself, etc. - If the requested position is beyond the range of available nodes, this will return ValueTree::invalid. - */ - ValueTree getSibling (int delta) const; - - //============================================================================== - /** Creates an XmlElement that holds a complete image of this node and all its children. - - If this node is invalid, this may return nullptr. Otherwise, the XML that is produced can - be used to recreate a similar node by calling fromXml(). - - The caller must delete the object that is returned. - - @see fromXml - */ - XmlElement* createXml() const; - - /** Tries to recreate a node from its XML representation. - - This isn't designed to cope with random XML data - for a sensible result, it should only - be fed XML that was created by the createXml() method. - */ - static ValueTree fromXml (const XmlElement& xml); - - /** This returns a string containing an XML representation of the tree. - This is quite handy for debugging purposes, as it provides a quick way to view a tree. - */ - String toXmlString() const; - - //============================================================================== - /** Stores this tree (and all its children) in a binary format. - - Once written, the data can be read back with readFromStream(). - - It's much faster to load/save your tree in binary form than as XML, but - obviously isn't human-readable. - */ - void writeToStream (OutputStream& output) const; - - /** Reloads a tree from a stream that was written with writeToStream(). */ - static ValueTree readFromStream (InputStream& input); - - /** Reloads a tree from a data block that was written with writeToStream(). */ - static ValueTree readFromData (const void* data, size_t numBytes); - - /** Reloads a tree from a data block that was written with writeToStream() and - then zipped using GZIPCompressorOutputStream. - */ - static ValueTree readFromGZIPData (const void* data, size_t numBytes); - - //============================================================================== - /** Listener class for events that happen to a ValueTree. - - To get events from a ValueTree, make your class implement this interface, and use - ValueTree::addListener() and ValueTree::removeListener() to register it. - */ - class JUCE_API Listener - { - public: - /** Destructor. */ - virtual ~Listener() {} - - /** This method is called when a property of this node (or of one of its sub-nodes) has - changed. - - The tree parameter indicates which tree has had its property changed, and the property - parameter indicates the property. - - Note that when you register a listener to a tree, it will receive this callback for - property changes in that tree, and also for any of its children, (recursively, at any depth). - If your tree has sub-trees but you only want to know about changes to the top level tree, - simply check the tree parameter in this callback to make sure it's the tree you're interested in. - */ - virtual void valueTreePropertyChanged (ValueTree& treeWhosePropertyHasChanged, - const Identifier& property) = 0; - - /** This method is called when a child sub-tree is added. - - Note that when you register a listener to a tree, it will receive this callback for - child changes in both that tree and any of its children, (recursively, at any depth). - If your tree has sub-trees but you only want to know about changes to the top level tree, - just check the parentTree parameter to make sure it's the one that you're interested in. - */ - virtual void valueTreeChildAdded (ValueTree& parentTree, - ValueTree& childWhichHasBeenAdded) = 0; - - /** This method is called when a child sub-tree is removed. - - Note that when you register a listener to a tree, it will receive this callback for - child changes in both that tree and any of its children, (recursively, at any depth). - If your tree has sub-trees but you only want to know about changes to the top level tree, - just check the parentTree parameter to make sure it's the one that you're interested in. - */ - virtual void valueTreeChildRemoved (ValueTree& parentTree, - ValueTree& childWhichHasBeenRemoved) = 0; - - /** This method is called when a tree's children have been re-shuffled. - - Note that when you register a listener to a tree, it will receive this callback for - child changes in both that tree and any of its children, (recursively, at any depth). - If your tree has sub-trees but you only want to know about changes to the top level tree, - just check the parameter to make sure it's the tree that you're interested in. - */ - virtual void valueTreeChildOrderChanged (ValueTree& parentTreeWhoseChildrenHaveMoved) = 0; - - /** This method is called when a tree has been added or removed from a parent node. - - This callback happens when the tree to which the listener was registered is added or - removed from a parent. Unlike the other callbacks, it applies only to the tree to which - the listener is registered, and not to any of its children. - */ - virtual void valueTreeParentChanged (ValueTree& treeWhoseParentHasChanged) = 0; - - /** This method is called when a tree is made to point to a different internal shared object. - When operator= is used to make a ValueTree refer to a different object, this callback - will be made. - */ - virtual void valueTreeRedirected (ValueTree& treeWhichHasBeenChanged); - }; - - /** Adds a listener to receive callbacks when this node is changed. - - The listener is added to this specific ValueTree object, and not to the shared - object that it refers to. When this object is deleted, all the listeners will - be lost, even if other references to the same ValueTree still exist. And if you - use the operator= to make this refer to a different ValueTree, any listeners will - begin listening to changes to the new tree instead of the old one. - - When you're adding a listener, make sure that you add it to a ValueTree instance that - will last for as long as you need the listener. In general, you'd never want to add a - listener to a local stack-based ValueTree, and would usually add one to a member variable. - - @see removeListener - */ - void addListener (Listener* listener); - - /** Removes a listener that was previously added with addListener(). */ - void removeListener (Listener* listener); - - /** Causes a property-change callback to be triggered for the specified property, - calling any listeners that are registered. - */ - void sendPropertyChangeMessage (const Identifier property); - - //============================================================================== - /** This method uses a comparator object to sort the tree's children into order. - - The object provided must have a method of the form: - @code - int compareElements (const ValueTree& first, const ValueTree& second); - @endcode - - ..and this method must return: - - a value of < 0 if the first comes before the second - - a value of 0 if the two objects are equivalent - - a value of > 0 if the second comes before the first - - To improve performance, the compareElements() method can be declared as static or const. - - @param comparator the comparator to use for comparing elements. - @param undoManager optional UndoManager for storing the changes - @param retainOrderOfEquivalentItems if this is true, then items which the comparator says are - equivalent will be kept in the order in which they currently appear in the array. - This is slower to perform, but may be important in some cases. If it's false, a - faster algorithm is used, but equivalent elements may be rearranged. - */ - template - void sort (ElementComparator& comparator, UndoManager* undoManager, bool retainOrderOfEquivalentItems) - { - if (object != nullptr) - { - OwnedArray sortedList; - createListOfChildren (sortedList); - ComparatorAdapter adapter (comparator); - sortedList.sort (adapter, retainOrderOfEquivalentItems); - reorderChildren (sortedList, undoManager); - } - } - - /** An invalid ValueTree that can be used if you need to return one as an error condition, etc. - This invalid object is equivalent to ValueTree created with its default constructor. - */ - static const ValueTree invalid; - - /** Returns the total number of references to the shared underlying data structure that this - ValueTree is using. - */ - int getReferenceCount() const noexcept; - -private: - //============================================================================== - JUCE_PUBLIC_IN_DLL_BUILD (class SharedObject) - friend class SharedObject; - - ReferenceCountedObjectPtr object; - ListenerList listeners; - - template - struct ComparatorAdapter - { - ComparatorAdapter (ElementComparator& comp) noexcept : comparator (comp) {} - - int compareElements (const ValueTree* const first, const ValueTree* const second) - { - return comparator.compareElements (*first, *second); - } - - private: - ElementComparator& comparator; - JUCE_DECLARE_NON_COPYABLE (ComparatorAdapter) - }; - - void createListOfChildren (OwnedArray&) const; - void reorderChildren (const OwnedArray&, UndoManager*); - - explicit ValueTree (SharedObject*); -}; - - -#endif // JUCE_VALUETREE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp deleted file mode 100755 index 33f232d..0000000 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class ActionBroadcaster::ActionMessage : public MessageManager::MessageBase -{ -public: - ActionMessage (const ActionBroadcaster* ab, - const String& messageText, ActionListener* l) noexcept - : broadcaster (const_cast (ab)), - message (messageText), - listener (l) - {} - - void messageCallback() override - { - if (const ActionBroadcaster* const b = broadcaster) - if (b->actionListeners.contains (listener)) - listener->actionListenerCallback (message); - } - -private: - WeakReference broadcaster; - const String message; - ActionListener* const listener; - - JUCE_DECLARE_NON_COPYABLE (ActionMessage) -}; - -//============================================================================== -ActionBroadcaster::ActionBroadcaster() -{ - // are you trying to create this object before or after juce has been intialised?? - jassert (MessageManager::getInstanceWithoutCreating() != nullptr); -} - -ActionBroadcaster::~ActionBroadcaster() -{ - // all event-based objects must be deleted BEFORE juce is shut down! - jassert (MessageManager::getInstanceWithoutCreating() != nullptr); - - masterReference.clear(); -} - -void ActionBroadcaster::addActionListener (ActionListener* const listener) -{ - const ScopedLock sl (actionListenerLock); - - if (listener != nullptr) - actionListeners.add (listener); -} - -void ActionBroadcaster::removeActionListener (ActionListener* const listener) -{ - const ScopedLock sl (actionListenerLock); - actionListeners.removeValue (listener); -} - -void ActionBroadcaster::removeAllActionListeners() -{ - const ScopedLock sl (actionListenerLock); - actionListeners.clear(); -} - -void ActionBroadcaster::sendActionMessage (const String& message) const -{ - const ScopedLock sl (actionListenerLock); - - for (int i = actionListeners.size(); --i >= 0;) - (new ActionMessage (this, message, actionListeners.getUnchecked(i)))->post(); -} diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h deleted file mode 100755 index 8052bed..0000000 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionBroadcaster.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_ACTIONBROADCASTER_H_INCLUDED -#define JUCE_ACTIONBROADCASTER_H_INCLUDED - - -//============================================================================== -/** Manages a list of ActionListeners, and can send them messages. - - To quickly add methods to your class that can add/remove action - listeners and broadcast to them, you can derive from this. - - @see ActionListener, ChangeListener -*/ -class JUCE_API ActionBroadcaster -{ -public: - //============================================================================== - /** Creates an ActionBroadcaster. */ - ActionBroadcaster(); - - /** Destructor. */ - virtual ~ActionBroadcaster(); - - //============================================================================== - /** Adds a listener to the list. - Trying to add a listener that's already on the list will have no effect. - */ - void addActionListener (ActionListener* listener); - - /** Removes a listener from the list. - If the listener isn't on the list, this won't have any effect. - */ - void removeActionListener (ActionListener* listener); - - /** Removes all listeners from the list. */ - void removeAllActionListeners(); - - //============================================================================== - /** Broadcasts a message to all the registered listeners. - @see ActionListener::actionListenerCallback - */ - void sendActionMessage (const String& message) const; - - -private: - //============================================================================== - friend class WeakReference; - WeakReference::Master masterReference; - - class ActionMessage; - friend class ActionMessage; - - SortedSet actionListeners; - CriticalSection actionListenerLock; - - JUCE_DECLARE_NON_COPYABLE (ActionBroadcaster) -}; - - -#endif // JUCE_ACTIONBROADCASTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h deleted file mode 100755 index 12257f9..0000000 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ActionListener.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_ACTIONLISTENER_H_INCLUDED -#define JUCE_ACTIONLISTENER_H_INCLUDED - - -//============================================================================== -/** - Interface class for delivery of events that are sent by an ActionBroadcaster. - - @see ActionBroadcaster, ChangeListener -*/ -class JUCE_API ActionListener -{ -public: - /** Destructor. */ - virtual ~ActionListener() {} - - /** Overridden by your subclass to receive the callback. - - @param message the string that was specified when the event was triggered - by a call to ActionBroadcaster::sendActionMessage() - */ - virtual void actionListenerCallback (const String& message) = 0; -}; - - -#endif // JUCE_ACTIONLISTENER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp b/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp deleted file mode 100755 index 980eb41..0000000 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class AsyncUpdater::AsyncUpdaterMessage : public CallbackMessage -{ -public: - AsyncUpdaterMessage (AsyncUpdater& au) : owner (au) {} - - void messageCallback() override - { - if (shouldDeliver.compareAndSetBool (0, 1)) - owner.handleAsyncUpdate(); - } - - Atomic shouldDeliver; - -private: - AsyncUpdater& owner; - - JUCE_DECLARE_NON_COPYABLE (AsyncUpdaterMessage) -}; - -//============================================================================== -AsyncUpdater::AsyncUpdater() -{ - activeMessage = new AsyncUpdaterMessage (*this); -} - -AsyncUpdater::~AsyncUpdater() -{ - // You're deleting this object with a background thread while there's an update - // pending on the main event thread - that's pretty dodgy threading, as the callback could - // happen after this destructor has finished. You should either use a MessageManagerLock while - // deleting this object, or find some other way to avoid such a race condition. - jassert ((! isUpdatePending()) || MessageManager::getInstance()->currentThreadHasLockedMessageManager()); - - activeMessage->shouldDeliver.set (0); -} - -void AsyncUpdater::triggerAsyncUpdate() -{ - if (activeMessage->shouldDeliver.compareAndSetBool (1, 0)) - if (! activeMessage->post()) - cancelPendingUpdate(); // if the message queue fails, this avoids getting - // trapped waiting for the message to arrive -} - -void AsyncUpdater::cancelPendingUpdate() noexcept -{ - activeMessage->shouldDeliver.set (0); -} - -void AsyncUpdater::handleUpdateNowIfNeeded() -{ - // This can only be called by the event thread. - jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); - - if (activeMessage->shouldDeliver.exchange (0) != 0) - handleAsyncUpdate(); -} - -bool AsyncUpdater::isUpdatePending() const noexcept -{ - return activeMessage->shouldDeliver.value != 0; -} diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h deleted file mode 100755 index 79ab6e1..0000000 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_AsyncUpdater.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_ASYNCUPDATER_H_INCLUDED -#define JUCE_ASYNCUPDATER_H_INCLUDED - - -//============================================================================== -/** - Has a callback method that is triggered asynchronously. - - This object allows an asynchronous callback function to be triggered, for - tasks such as coalescing multiple updates into a single callback later on. - - Basically, one or more calls to the triggerAsyncUpdate() will result in the - message thread calling handleAsyncUpdate() as soon as it can. -*/ -class JUCE_API AsyncUpdater -{ -public: - //============================================================================== - /** Creates an AsyncUpdater object. */ - AsyncUpdater(); - - /** Destructor. - If there are any pending callbacks when the object is deleted, these are lost. - */ - virtual ~AsyncUpdater(); - - //============================================================================== - /** Causes the callback to be triggered at a later time. - - This method returns immediately, having made sure that a callback - to the handleAsyncUpdate() method will occur as soon as possible. - - If an update callback is already pending but hasn't happened yet, calls - to this method will be ignored. - - It's thread-safe to call this method from any number of threads without - needing to worry about locking. - */ - void triggerAsyncUpdate(); - - /** This will stop any pending updates from happening. - - If called after triggerAsyncUpdate() and before the handleAsyncUpdate() - callback happens, this will cancel the handleAsyncUpdate() callback. - - Note that this method simply cancels the next callback - if a callback is already - in progress on a different thread, this won't block until the callback finishes, so - there's no guarantee that the callback isn't still running when the method returns. - */ - void cancelPendingUpdate() noexcept; - - /** If an update has been triggered and is pending, this will invoke it - synchronously. - - Use this as a kind of "flush" operation - if an update is pending, the - handleAsyncUpdate() method will be called immediately; if no update is - pending, then nothing will be done. - - Because this may invoke the callback, this method must only be called on - the main event thread. - */ - void handleUpdateNowIfNeeded(); - - /** Returns true if there's an update callback in the pipeline. */ - bool isUpdatePending() const noexcept; - - //============================================================================== - /** Called back to do whatever your class needs to do. - - This method is called by the message thread at the next convenient time - after the triggerAsyncUpdate() method has been called. - */ - virtual void handleAsyncUpdate() = 0; - -private: - //============================================================================== - class AsyncUpdaterMessage; - friend class ReferenceCountedObjectPtr; - ReferenceCountedObjectPtr activeMessage; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AsyncUpdater) -}; - - -#endif // JUCE_ASYNCUPDATER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp deleted file mode 100755 index bff1f1a..0000000 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ChangeBroadcaster::ChangeBroadcaster() noexcept -{ - callback.owner = this; -} - -ChangeBroadcaster::~ChangeBroadcaster() -{ -} - -void ChangeBroadcaster::addChangeListener (ChangeListener* const listener) -{ - // Listeners can only be safely added when the event thread is locked - // You can use a MessageManagerLock if you need to call this from another thread. - jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); - - changeListeners.add (listener); -} - -void ChangeBroadcaster::removeChangeListener (ChangeListener* const listener) -{ - // Listeners can only be safely added when the event thread is locked - // You can use a MessageManagerLock if you need to call this from another thread. - jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); - - changeListeners.remove (listener); -} - -void ChangeBroadcaster::removeAllChangeListeners() -{ - // Listeners can only be safely added when the event thread is locked - // You can use a MessageManagerLock if you need to call this from another thread. - jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); - - changeListeners.clear(); -} - -void ChangeBroadcaster::sendChangeMessage() -{ - if (changeListeners.size() > 0) - callback.triggerAsyncUpdate(); -} - -void ChangeBroadcaster::sendSynchronousChangeMessage() -{ - // This can only be called by the event thread. - jassert (MessageManager::getInstance()->isThisTheMessageThread()); - - callback.cancelPendingUpdate(); - callListeners(); -} - -void ChangeBroadcaster::dispatchPendingMessages() -{ - callback.handleUpdateNowIfNeeded(); -} - -void ChangeBroadcaster::callListeners() -{ - changeListeners.call (&ChangeListener::changeListenerCallback, this); -} - -//============================================================================== -ChangeBroadcaster::ChangeBroadcasterCallback::ChangeBroadcasterCallback() - : owner (nullptr) -{ -} - -void ChangeBroadcaster::ChangeBroadcasterCallback::handleAsyncUpdate() -{ - jassert (owner != nullptr); - owner->callListeners(); -} diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h deleted file mode 100755 index 8d9aca9..0000000 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeBroadcaster.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_CHANGEBROADCASTER_H_INCLUDED -#define JUCE_CHANGEBROADCASTER_H_INCLUDED - - -//============================================================================== -/** - Holds a list of ChangeListeners, and sends messages to them when instructed. - - @see ChangeListener -*/ -class JUCE_API ChangeBroadcaster -{ -public: - //============================================================================== - /** Creates an ChangeBroadcaster. */ - ChangeBroadcaster() noexcept; - - /** Destructor. */ - virtual ~ChangeBroadcaster(); - - //============================================================================== - /** Registers a listener to receive change callbacks from this broadcaster. - Trying to add a listener that's already on the list will have no effect. - */ - void addChangeListener (ChangeListener* listener); - - /** Unregisters a listener from the list. - If the listener isn't on the list, this won't have any effect. - */ - void removeChangeListener (ChangeListener* listener); - - /** Removes all listeners from the list. */ - void removeAllChangeListeners(); - - //============================================================================== - /** Causes an asynchronous change message to be sent to all the registered listeners. - - The message will be delivered asynchronously by the main message thread, so this - method will return immediately. To call the listeners synchronously use - sendSynchronousChangeMessage(). - */ - void sendChangeMessage(); - - /** Sends a synchronous change message to all the registered listeners. - - This will immediately call all the listeners that are registered. For thread-safety - reasons, you must only call this method on the main message thread. - - @see dispatchPendingMessages - */ - void sendSynchronousChangeMessage(); - - /** If a change message has been sent but not yet dispatched, this will call - sendSynchronousChangeMessage() to make the callback immediately. - - For thread-safety reasons, you must only call this method on the main message thread. - */ - void dispatchPendingMessages(); - -private: - //============================================================================== - class ChangeBroadcasterCallback : public AsyncUpdater - { - public: - ChangeBroadcasterCallback(); - void handleAsyncUpdate() override; - - ChangeBroadcaster* owner; - }; - - friend class ChangeBroadcasterCallback; - ChangeBroadcasterCallback callback; - ListenerList changeListeners; - - void callListeners(); - - JUCE_DECLARE_NON_COPYABLE (ChangeBroadcaster) -}; - - -#endif // JUCE_CHANGEBROADCASTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h deleted file mode 100755 index 59e3025..0000000 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ChangeListener.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_CHANGELISTENER_H_INCLUDED -#define JUCE_CHANGELISTENER_H_INCLUDED - -class ChangeBroadcaster; - -//============================================================================== -/** - Receives change event callbacks that are sent out by a ChangeBroadcaster. - - A ChangeBroadcaster keeps a set of listeners to which it broadcasts a message when - the ChangeBroadcaster::sendChangeMessage() method is called. A subclass of - ChangeListener is used to receive these callbacks. - - Note that the major difference between an ActionListener and a ChangeListener - is that for a ChangeListener, multiple changes will be coalesced into fewer - callbacks, but ActionListeners perform one callback for every event posted. - - @see ChangeBroadcaster, ActionListener -*/ -class JUCE_API ChangeListener -{ -public: - /** Destructor. */ - virtual ~ChangeListener() {} - - /** Your subclass should implement this method to receive the callback. - @param source the ChangeBroadcaster that triggered the callback. - */ - virtual void changeListenerCallback (ChangeBroadcaster* source) = 0; - - - //============================================================================== - #if JUCE_CATCH_DEPRECATED_CODE_MISUSE - // This method's signature has changed to take a ChangeBroadcaster parameter - please update your code! - private: virtual int changeListenerCallback (void*) { return 0; } - #endif -}; - - -#endif // JUCE_CHANGELISTENER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h b/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h deleted file mode 100755 index 853e252..0000000 --- a/JuceLibraryCode/modules/juce_events/broadcasters/juce_ListenerList.h +++ /dev/null @@ -1,359 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_LISTENERLIST_H_INCLUDED -#define JUCE_LISTENERLIST_H_INCLUDED - - -//============================================================================== -/** - Holds a set of objects and can invoke a member function callback on each object - in the set with a single call. - - Use a ListenerList to manage a set of objects which need a callback, and you - can invoke a member function by simply calling call() or callChecked(). - - E.g. - @code - class MyListenerType - { - public: - void myCallbackMethod (int foo, bool bar); - }; - - ListenerList listeners; - listeners.add (someCallbackObjects...); - - // This will invoke myCallbackMethod (1234, true) on each of the objects - // in the list... - listeners.call (&MyListenerType::myCallbackMethod, 1234, true); - @endcode - - If you add or remove listeners from the list during one of the callbacks - i.e. while - it's in the middle of iterating the listeners, then it's guaranteed that no listeners - will be mistakenly called after they've been removed, but it may mean that some of the - listeners could be called more than once, or not at all, depending on the list's order. - - Sometimes, there's a chance that invoking one of the callbacks might result in the - list itself being deleted while it's still iterating - to survive this situation, you can - use callChecked() instead of call(), passing it a local object to act as a "BailOutChecker". - The BailOutChecker must implement a method of the form "bool shouldBailOut()", and - the list will check this after each callback to determine whether it should abort the - operation. For an example of a bail-out checker, see the Component::BailOutChecker class, - which can be used to check when a Component has been deleted. See also - ListenerList::DummyBailOutChecker, which is a dummy checker that always returns false. -*/ -template > -class ListenerList -{ - // Horrible macros required to support VC7.. - #ifndef DOXYGEN - #if JUCE_VC8_OR_EARLIER - #define LL_TEMPLATE(a) typename P##a, typename Q##a - #define LL_PARAM(a) Q##a& param##a - #else - #define LL_TEMPLATE(a) typename P##a - #define LL_PARAM(a) PARAMETER_TYPE(P##a) param##a - #endif - #endif - -public: - //============================================================================== - /** Creates an empty list. */ - ListenerList() - { - } - - /** Destructor. */ - ~ListenerList() - { - } - - //============================================================================== - /** Adds a listener to the list. - A listener can only be added once, so if the listener is already in the list, - this method has no effect. - @see remove - */ - void add (ListenerClass* const listenerToAdd) - { - // Listeners can't be null pointers! - jassert (listenerToAdd != nullptr); - - if (listenerToAdd != nullptr) - listeners.addIfNotAlreadyThere (listenerToAdd); - } - - /** Removes a listener from the list. - If the listener wasn't in the list, this has no effect. - */ - void remove (ListenerClass* const listenerToRemove) - { - // Listeners can't be null pointers! - jassert (listenerToRemove != nullptr); - - listeners.removeFirstMatchingValue (listenerToRemove); - } - - /** Returns the number of registered listeners. */ - int size() const noexcept - { - return listeners.size(); - } - - /** Returns true if any listeners are registered. */ - bool isEmpty() const noexcept - { - return listeners.size() == 0; - } - - /** Clears the list. */ - void clear() - { - listeners.clear(); - } - - /** Returns true if the specified listener has been added to the list. */ - bool contains (ListenerClass* const listener) const noexcept - { - return listeners.contains (listener); - } - - //============================================================================== - /** Calls a member function on each listener in the list, with no parameters. */ - void call (void (ListenerClass::*callbackFunction) ()) - { - callChecked (static_cast (DummyBailOutChecker()), callbackFunction); - } - - /** Calls a member function on each listener in the list, with no parameters and a bail-out-checker. - See the class description for info about writing a bail-out checker. */ - template - void callChecked (const BailOutCheckerType& bailOutChecker, - void (ListenerClass::*callbackFunction) ()) - { - for (Iterator iter (*this); iter.next (bailOutChecker);) - (iter.getListener()->*callbackFunction) (); - } - - //============================================================================== - /** Calls a member function on each listener in the list, with 1 parameter. */ - template - void call (void (ListenerClass::*callbackFunction) (P1), LL_PARAM(1)) - { - for (Iterator iter (*this); iter.next();) - (iter.getListener()->*callbackFunction) (param1); - } - - /** Calls a member function on each listener in the list, with one parameter and a bail-out-checker. - See the class description for info about writing a bail-out checker. */ - template - void callChecked (const BailOutCheckerType& bailOutChecker, - void (ListenerClass::*callbackFunction) (P1), - LL_PARAM(1)) - { - for (Iterator iter (*this); iter.next (bailOutChecker);) - (iter.getListener()->*callbackFunction) (param1); - } - - //============================================================================== - /** Calls a member function on each listener in the list, with 2 parameters. */ - template - void call (void (ListenerClass::*callbackFunction) (P1, P2), - LL_PARAM(1), LL_PARAM(2)) - { - for (Iterator iter (*this); iter.next();) - (iter.getListener()->*callbackFunction) (param1, param2); - } - - /** Calls a member function on each listener in the list, with 2 parameters and a bail-out-checker. - See the class description for info about writing a bail-out checker. */ - template - void callChecked (const BailOutCheckerType& bailOutChecker, - void (ListenerClass::*callbackFunction) (P1, P2), - LL_PARAM(1), LL_PARAM(2)) - { - for (Iterator iter (*this); iter.next (bailOutChecker);) - (iter.getListener()->*callbackFunction) (param1, param2); - } - - //============================================================================== - /** Calls a member function on each listener in the list, with 3 parameters. */ - template - void call (void (ListenerClass::*callbackFunction) (P1, P2, P3), - LL_PARAM(1), LL_PARAM(2), LL_PARAM(3)) - { - for (Iterator iter (*this); iter.next();) - (iter.getListener()->*callbackFunction) (param1, param2, param3); - } - - /** Calls a member function on each listener in the list, with 3 parameters and a bail-out-checker. - See the class description for info about writing a bail-out checker. */ - template - void callChecked (const BailOutCheckerType& bailOutChecker, - void (ListenerClass::*callbackFunction) (P1, P2, P3), - LL_PARAM(1), LL_PARAM(2), LL_PARAM(3)) - { - for (Iterator iter (*this); iter.next (bailOutChecker);) - (iter.getListener()->*callbackFunction) (param1, param2, param3); - } - - //============================================================================== - /** Calls a member function on each listener in the list, with 4 parameters. */ - template - void call (void (ListenerClass::*callbackFunction) (P1, P2, P3, P4), - LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4)) - { - for (Iterator iter (*this); iter.next();) - (iter.getListener()->*callbackFunction) (param1, param2, param3, param4); - } - - /** Calls a member function on each listener in the list, with 4 parameters and a bail-out-checker. - See the class description for info about writing a bail-out checker. */ - template - void callChecked (const BailOutCheckerType& bailOutChecker, - void (ListenerClass::*callbackFunction) (P1, P2, P3, P4), - LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4)) - { - for (Iterator iter (*this); iter.next (bailOutChecker);) - (iter.getListener()->*callbackFunction) (param1, param2, param3, param4); - } - - //============================================================================== - /** Calls a member function on each listener in the list, with 5 parameters. */ - template - void call (void (ListenerClass::*callbackFunction) (P1, P2, P3, P4, P5), - LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5)) - { - for (Iterator iter (*this); iter.next();) - (iter.getListener()->*callbackFunction) (param1, param2, param3, param4, param5); - } - - /** Calls a member function on each listener in the list, with 5 parameters and a bail-out-checker. - See the class description for info about writing a bail-out checker. */ - template - void callChecked (const BailOutCheckerType& bailOutChecker, - void (ListenerClass::*callbackFunction) (P1, P2, P3, P4, P5), - LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5)) - { - for (Iterator iter (*this); iter.next (bailOutChecker);) - (iter.getListener()->*callbackFunction) (param1, param2, param3, param4, param5); - } - - //============================================================================== - /** Calls a member function on each listener in the list, with 5 parameters. */ - template - void call (void (ListenerClass::*callbackFunction) (P1, P2, P3, P4, P5, P6), - LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5), LL_PARAM(6)) - { - for (Iterator iter (*this); iter.next();) - (iter.getListener()->*callbackFunction) (param1, param2, param3, param4, param5, param6); - } - - /** Calls a member function on each listener in the list, with 5 parameters and a bail-out-checker. - See the class description for info about writing a bail-out checker. */ - template - void callChecked (const BailOutCheckerType& bailOutChecker, - void (ListenerClass::*callbackFunction) (P1, P2, P3, P4, P5, P6), - LL_PARAM(1), LL_PARAM(2), LL_PARAM(3), LL_PARAM(4), LL_PARAM(5), LL_PARAM(6)) - { - for (Iterator iter (*this); iter.next (bailOutChecker);) - (iter.getListener()->*callbackFunction) (param1, param2, param3, param4, param5, param6); - } - - - //============================================================================== - /** A dummy bail-out checker that always returns false. - See the ListenerList notes for more info about bail-out checkers. - */ - class DummyBailOutChecker - { - public: - inline bool shouldBailOut() const noexcept { return false; } - }; - - //============================================================================== - /** Iterates the listeners in a ListenerList. */ - template - class Iterator - { - public: - //============================================================================== - Iterator (const ListType& listToIterate) noexcept - : list (listToIterate), index (listToIterate.size()) - {} - - ~Iterator() noexcept {} - - //============================================================================== - bool next() noexcept - { - if (index <= 0) - return false; - - const int listSize = list.size(); - - if (--index < listSize) - return true; - - index = listSize - 1; - return index >= 0; - } - - bool next (const BailOutCheckerType& bailOutChecker) noexcept - { - return (! bailOutChecker.shouldBailOut()) && next(); - } - - typename ListType::ListenerType* getListener() const noexcept - { - return list.getListeners().getUnchecked (index); - } - - //============================================================================== - private: - const ListType& list; - int index; - - JUCE_DECLARE_NON_COPYABLE (Iterator) - }; - - typedef ListenerList ThisType; - typedef ListenerClass ListenerType; - - const ArrayType& getListeners() const noexcept { return listeners; } - -private: - //============================================================================== - ArrayType listeners; - - JUCE_DECLARE_NON_COPYABLE (ListenerList) - - #undef LL_TEMPLATE - #undef LL_PARAM -}; - - -#endif // JUCE_LISTENERLIST_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp b/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp deleted file mode 100755 index 2c36c2c..0000000 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.cpp +++ /dev/null @@ -1,264 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -enum { magicMastSlaveConnectionHeader = 0x712baf04 }; - -static const char* startMessage = "__ipc_st"; -static const char* killMessage = "__ipc_k_"; -static const char* pingMessage = "__ipc_p_"; -enum { specialMessageSize = 8, defaultTimeoutMs = 8000 }; - -static String getCommandLinePrefix (const String& commandLineUniqueID) -{ - return "--" + commandLineUniqueID + ":"; -} - -//============================================================================== -// This thread sends and receives ping messages every second, so that it -// can find out if the other process has stopped running. -struct ChildProcessPingThread : public Thread, - private AsyncUpdater -{ - ChildProcessPingThread (int timeout) : Thread ("IPC ping"), timeoutMs (timeout) - { - pingReceived(); - } - - static bool isPingMessage (const MemoryBlock& m) noexcept - { - return memcmp (m.getData(), pingMessage, specialMessageSize) == 0; - } - - void pingReceived() noexcept { countdown = timeoutMs / 1000 + 1; } - void triggerConnectionLostMessage() { triggerAsyncUpdate(); } - - virtual bool sendPingMessage (const MemoryBlock&) = 0; - virtual void pingFailed() = 0; - - int timeoutMs; - -private: - Atomic countdown; - - void handleAsyncUpdate() override { pingFailed(); } - - void run() override - { - while (! threadShouldExit()) - { - if (--countdown <= 0 || ! sendPingMessage (MemoryBlock (pingMessage, specialMessageSize))) - { - triggerConnectionLostMessage(); - break; - } - - wait (1000); - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessPingThread) -}; - -//============================================================================== -struct ChildProcessMaster::Connection : public InterprocessConnection, - private ChildProcessPingThread -{ - Connection (ChildProcessMaster& m, const String& pipeName, int timeout) - : InterprocessConnection (false, magicMastSlaveConnectionHeader), - ChildProcessPingThread (timeout), - owner (m) - { - if (createPipe (pipeName, timeoutMs)) - startThread (4); - } - - ~Connection() - { - stopThread (10000); - } - -private: - void connectionMade() override {} - void connectionLost() override { owner.handleConnectionLost(); } - - bool sendPingMessage (const MemoryBlock& m) override { return owner.sendMessageToSlave (m); } - void pingFailed() override { connectionLost(); } - - void messageReceived (const MemoryBlock& m) override - { - pingReceived(); - - if (m.getSize() != specialMessageSize || ! isPingMessage (m)) - owner.handleMessageFromSlave (m); - } - - ChildProcessMaster& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Connection) -}; - -//============================================================================== -ChildProcessMaster::ChildProcessMaster() {} - -ChildProcessMaster::~ChildProcessMaster() -{ - if (connection != nullptr) - { - sendMessageToSlave (MemoryBlock (killMessage, specialMessageSize)); - connection->disconnect(); - connection = nullptr; - } -} - -void ChildProcessMaster::handleConnectionLost() {} - -bool ChildProcessMaster::sendMessageToSlave (const MemoryBlock& mb) -{ - if (connection != nullptr) - return connection->sendMessage (mb); - - jassertfalse; // this can only be used when the connection is active! - return false; -} - -bool ChildProcessMaster::launchSlaveProcess (const File& executable, const String& commandLineUniqueID, int timeoutMs) -{ - connection = nullptr; - jassert (childProcess.kill()); - - const String pipeName ("p" + String::toHexString (Random().nextInt64())); - - StringArray args; - args.add (executable.getFullPathName()); - args.add (getCommandLinePrefix (commandLineUniqueID) + pipeName); - - if (childProcess.start (args)) - { - connection = new Connection (*this, pipeName, timeoutMs <= 0 ? defaultTimeoutMs : timeoutMs); - - if (connection->isConnected()) - { - sendMessageToSlave (MemoryBlock (startMessage, specialMessageSize)); - return true; - } - - connection = nullptr; - } - - return false; -} - -//============================================================================== -struct ChildProcessSlave::Connection : public InterprocessConnection, - private ChildProcessPingThread -{ - Connection (ChildProcessSlave& p, const String& pipeName, int timeout) - : InterprocessConnection (false, magicMastSlaveConnectionHeader), - ChildProcessPingThread (timeout), - owner (p) - { - connectToPipe (pipeName, timeoutMs); - startThread (4); - } - - ~Connection() - { - stopThread (10000); - } - -private: - ChildProcessSlave& owner; - - void connectionMade() override {} - void connectionLost() override { owner.handleConnectionLost(); } - - bool sendPingMessage (const MemoryBlock& m) override { return owner.sendMessageToMaster (m); } - void pingFailed() override { connectionLost(); } - - void messageReceived (const MemoryBlock& m) override - { - pingReceived(); - - if (m.getSize() == specialMessageSize) - { - if (isPingMessage (m)) - return; - - if (memcmp (m.getData(), killMessage, specialMessageSize) == 0) - { - triggerConnectionLostMessage(); - return; - } - - if (memcmp (m.getData(), startMessage, specialMessageSize) == 0) - { - owner.handleConnectionMade(); - return; - } - } - - owner.handleMessageFromMaster (m); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Connection) -}; - -//============================================================================== -ChildProcessSlave::ChildProcessSlave() {} -ChildProcessSlave::~ChildProcessSlave() {} - -void ChildProcessSlave::handleConnectionMade() {} -void ChildProcessSlave::handleConnectionLost() {} - -bool ChildProcessSlave::sendMessageToMaster (const MemoryBlock& mb) -{ - if (connection != nullptr) - return connection->sendMessage (mb); - - jassertfalse; // this can only be used when the connection is active! - return false; -} - -bool ChildProcessSlave::initialiseFromCommandLine (const String& commandLine, - const String& commandLineUniqueID, - int timeoutMs) -{ - String prefix (getCommandLinePrefix (commandLineUniqueID)); - - if (commandLine.trim().startsWith (prefix)) - { - String pipeName (commandLine.fromFirstOccurrenceOf (prefix, false, false) - .upToFirstOccurrenceOf (" ", false, false).trim()); - - if (pipeName.isNotEmpty()) - { - connection = new Connection (*this, pipeName, timeoutMs <= 0 ? defaultTimeoutMs : timeoutMs); - - if (! connection->isConnected()) - connection = nullptr; - } - } - - return connection != nullptr; -} diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h b/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h deleted file mode 100755 index 60e3b71..0000000 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_ConnectedChildProcess.h +++ /dev/null @@ -1,191 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_CONNECTEDCHILDPROCESS_H_INCLUDED -#define JUCE_CONNECTEDCHILDPROCESS_H_INCLUDED - -//============================================================================== -/** - Acts as the slave end of a master/slave pair of connected processes. - - The ChildProcessSlave and ChildProcessMaster classes make it easy for an app - to spawn a child process, and to manage a 2-way messaging connection to control it. - - To use the system, you need to create subclasses of both ChildProcessSlave and - ChildProcessMaster. To instantiate the ChildProcessSlave object, you must - add some code to your main() or JUCEApplication::initialise() function that - calls the initialiseFromCommandLine() method to check the app's command-line - parameters to see whether it's being launched as a child process. If this returns - true then the slave process can be allowed to run, and its handleMessageFromMaster() - method will be called whenever a message arrives. - - The juce demo app has a good example of this class in action. - - @see ChildProcessMaster, InterprocessConnection, ChildProcess -*/ -class JUCE_API ChildProcessSlave -{ -public: - /** Creates a non-connected slave process. - Use initialiseFromCommandLine to connect to a master process. - */ - ChildProcessSlave(); - - /** Destructor. */ - virtual ~ChildProcessSlave(); - - /** This checks some command-line parameters to see whether they were generated by - ChildProcessMaster::launchSlaveProcess(), and if so, connects to that master process. - - In an exe that can be used as a child process, you should add some code to your - main() or JUCEApplication::initialise() that calls this method. - - The commandLineUniqueID should be a short alphanumeric identifier (no spaces!) - that matches the string passed to ChildProcessMaster::launchSlaveProcess(). - - The timeoutMs parameter lets you specify how long the child process is allowed - to run without receiving a ping from the master before the master is considered to - have died, and handleConnectionLost() will be called. Passing <= 0 for this timeout - makes it use a default value. - - Returns true if the command-line matches and the connection is made successfully. - */ - bool initialiseFromCommandLine (const String& commandLine, - const String& commandLineUniqueID, - int timeoutMs = 0); - - //============================================================================== - /** This will be called to deliver messages from the master process. - The call will probably be made on a background thread, so be careful with your - thread-safety! You may want to respond by sending back a message with - sendMessageToMaster() - */ - virtual void handleMessageFromMaster (const MemoryBlock&) = 0; - - /** This will be called when the master process finishes connecting to this slave. - The call will probably be made on a background thread, so be careful with your thread-safety! - */ - virtual void handleConnectionMade(); - - /** This will be called when the connection to the master process is lost. - The call may be made from any thread (including the message thread). - Typically, if your process only exists to act as a slave, you should probably exit - when this happens. - */ - virtual void handleConnectionLost(); - - /** Tries to send a message to the master process. - This returns true if the message was sent, but doesn't check that it actually gets - delivered at the other end. If successful, the data will emerge in a call to your - ChildProcessMaster::handleMessageFromSlave(). - */ - bool sendMessageToMaster (const MemoryBlock&); - -private: - struct Connection; - friend struct Connection; - friend struct ContainerDeletePolicy; - ScopedPointer connection; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessSlave) -}; - -//============================================================================== -/** - Acts as the master in a master/slave pair of connected processes. - - The ChildProcessSlave and ChildProcessMaster classes make it easy for an app - to spawn a child process, and to manage a 2-way messaging connection to control it. - - To use the system, you need to create subclasses of both ChildProcessSlave and - ChildProcessMaster. When you want your master process to launch the slave, you - just call launchSlaveProcess(), and it'll attempt to launch the executable that - you specify (which may be the same exe), and assuming it has been set-up to - correctly parse the command-line parameters (see ChildProcessSlave) then a - two-way connection will be created. - - The juce demo app has a good example of this class in action. - - @see ChildProcessSlave, InterprocessConnection, ChildProcess -*/ -class JUCE_API ChildProcessMaster -{ -public: - /** Creates an uninitialised master process object. - Use launchSlaveProcess to launch and connect to a child process. - */ - ChildProcessMaster(); - - /** Destructor. */ - virtual ~ChildProcessMaster(); - - /** Attempts to launch and connect to a slave process. - This will start the given executable, passing it a special command-line - parameter based around the commandLineUniqueID string, which must be a - short alphanumeric string (no spaces!) that identifies your app. The exe - that gets launched must respond by calling ChildProcessSlave::initialiseFromCommandLine() - in its startup code, and must use a matching ID to commandLineUniqueID. - - The timeoutMs parameter lets you specify how long the child process is allowed - to go without sending a ping before it is considered to have died and - handleConnectionLost() will be called. Passing <= 0 for this timeout makes - it use a default value. - - If this all works, the method returns true, and you can begin sending and - receiving messages with the slave process. - */ - bool launchSlaveProcess (const File& executableToLaunch, - const String& commandLineUniqueID, - int timeoutMs = 0); - - /** This will be called to deliver a message from the slave process. - The call will probably be made on a background thread, so be careful with your thread-safety! - */ - virtual void handleMessageFromSlave (const MemoryBlock&) = 0; - - /** This will be called when the slave process dies or is somehow disconnected. - The call will probably be made on a background thread, so be careful with your thread-safety! - */ - virtual void handleConnectionLost(); - - /** Attempts to send a message to the slave process. - This returns true if the message was dispatched, but doesn't check that it actually - gets delivered at the other end. If successful, the data will emerge in a call to - your ChildProcessSlave::handleMessageFromMaster(). - */ - bool sendMessageToSlave (const MemoryBlock&); - -private: - ChildProcess childProcess; - - struct Connection; - friend struct Connection; - friend struct ContainerDeletePolicy; - ScopedPointer connection; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChildProcessMaster) -}; - - -#endif // JUCE_CONNECTEDCHILDPROCESS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp deleted file mode 100755 index f008cd1..0000000 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.cpp +++ /dev/null @@ -1,365 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -struct InterprocessConnection::ConnectionThread : public Thread -{ - ConnectionThread (InterprocessConnection& c) : Thread ("JUCE IPC"), owner (c) {} - - void run() override { owner.runThread(); } - -private: - InterprocessConnection& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConnectionThread) -}; - -//============================================================================== -InterprocessConnection::InterprocessConnection (const bool callbacksOnMessageThread, - const uint32 magicMessageHeaderNumber) - : callbackConnectionState (false), - useMessageThread (callbacksOnMessageThread), - magicMessageHeader (magicMessageHeaderNumber), - pipeReceiveMessageTimeout (-1) -{ - thread = new ConnectionThread (*this); -} - -InterprocessConnection::~InterprocessConnection() -{ - callbackConnectionState = false; - disconnect(); - masterReference.clear(); - thread = nullptr; -} - -//============================================================================== -bool InterprocessConnection::connectToSocket (const String& hostName, - const int portNumber, - const int timeOutMillisecs) -{ - disconnect(); - - const ScopedLock sl (pipeAndSocketLock); - socket = new StreamingSocket(); - - if (socket->connect (hostName, portNumber, timeOutMillisecs)) - { - connectionMadeInt(); - thread->startThread(); - return true; - } - - socket = nullptr; - return false; -} - -bool InterprocessConnection::connectToPipe (const String& pipeName, const int timeoutMs) -{ - disconnect(); - - ScopedPointer newPipe (new NamedPipe()); - - if (newPipe->openExisting (pipeName)) - { - const ScopedLock sl (pipeAndSocketLock); - pipeReceiveMessageTimeout = timeoutMs; - initialiseWithPipe (newPipe.release()); - return true; - } - - return false; -} - -bool InterprocessConnection::createPipe (const String& pipeName, const int timeoutMs) -{ - disconnect(); - - ScopedPointer newPipe (new NamedPipe()); - - if (newPipe->createNewPipe (pipeName)) - { - const ScopedLock sl (pipeAndSocketLock); - pipeReceiveMessageTimeout = timeoutMs; - initialiseWithPipe (newPipe.release()); - return true; - } - - return false; -} - -void InterprocessConnection::disconnect() -{ - thread->signalThreadShouldExit(); - - { - const ScopedLock sl (pipeAndSocketLock); - if (socket != nullptr) socket->close(); - if (pipe != nullptr) pipe->close(); - } - - thread->stopThread (4000); - deletePipeAndSocket(); - connectionLostInt(); -} - -void InterprocessConnection::deletePipeAndSocket() -{ - const ScopedLock sl (pipeAndSocketLock); - socket = nullptr; - pipe = nullptr; -} - -bool InterprocessConnection::isConnected() const -{ - const ScopedLock sl (pipeAndSocketLock); - - return ((socket != nullptr && socket->isConnected()) - || (pipe != nullptr && pipe->isOpen())) - && thread->isThreadRunning(); -} - -String InterprocessConnection::getConnectedHostName() const -{ - { - const ScopedLock sl (pipeAndSocketLock); - - if (pipe == nullptr && socket == nullptr) - return String(); - - if (socket != nullptr && ! socket->isLocal()) - return socket->getHostName(); - } - - return IPAddress::local().toString(); -} - -//============================================================================== -bool InterprocessConnection::sendMessage (const MemoryBlock& message) -{ - uint32 messageHeader[2] = { ByteOrder::swapIfBigEndian (magicMessageHeader), - ByteOrder::swapIfBigEndian ((uint32) message.getSize()) }; - - MemoryBlock messageData (sizeof (messageHeader) + message.getSize()); - messageData.copyFrom (messageHeader, 0, sizeof (messageHeader)); - messageData.copyFrom (message.getData(), sizeof (messageHeader), message.getSize()); - - return writeData (messageData.getData(), (int) messageData.getSize()) == (int) messageData.getSize(); -} - -int InterprocessConnection::writeData (void* data, int dataSize) -{ - const ScopedLock sl (pipeAndSocketLock); - - if (socket != nullptr) - return socket->write (data, dataSize); - - if (pipe != nullptr) - return pipe->write (data, dataSize, pipeReceiveMessageTimeout); - - return 0; -} - -//============================================================================== -void InterprocessConnection::initialiseWithSocket (StreamingSocket* newSocket) -{ - jassert (socket == nullptr && pipe == nullptr); - socket = newSocket; - connectionMadeInt(); - thread->startThread(); -} - -void InterprocessConnection::initialiseWithPipe (NamedPipe* newPipe) -{ - jassert (socket == nullptr && pipe == nullptr); - pipe = newPipe; - connectionMadeInt(); - thread->startThread(); -} - -//============================================================================== -struct ConnectionStateMessage : public MessageManager::MessageBase -{ - ConnectionStateMessage (InterprocessConnection* ipc, bool connected) noexcept - : owner (ipc), connectionMade (connected) - {} - - void messageCallback() override - { - if (InterprocessConnection* const ipc = owner) - { - if (connectionMade) - ipc->connectionMade(); - else - ipc->connectionLost(); - } - } - - WeakReference owner; - bool connectionMade; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ConnectionStateMessage) -}; - -void InterprocessConnection::connectionMadeInt() -{ - if (! callbackConnectionState) - { - callbackConnectionState = true; - - if (useMessageThread) - (new ConnectionStateMessage (this, true))->post(); - else - connectionMade(); - } -} - -void InterprocessConnection::connectionLostInt() -{ - if (callbackConnectionState) - { - callbackConnectionState = false; - - if (useMessageThread) - (new ConnectionStateMessage (this, false))->post(); - else - connectionLost(); - } -} - -struct DataDeliveryMessage : public Message -{ - DataDeliveryMessage (InterprocessConnection* ipc, const MemoryBlock& d) - : owner (ipc), data (d) - {} - - void messageCallback() override - { - if (InterprocessConnection* const ipc = owner) - ipc->messageReceived (data); - } - - WeakReference owner; - MemoryBlock data; -}; - -void InterprocessConnection::deliverDataInt (const MemoryBlock& data) -{ - jassert (callbackConnectionState); - - if (useMessageThread) - (new DataDeliveryMessage (this, data))->post(); - else - messageReceived (data); -} - -//============================================================================== -bool InterprocessConnection::readNextMessageInt() -{ - uint32 messageHeader[2]; - const int bytes = socket != nullptr ? socket->read (messageHeader, sizeof (messageHeader), true) - : pipe ->read (messageHeader, sizeof (messageHeader), -1); - - if (bytes == sizeof (messageHeader) - && ByteOrder::swapIfBigEndian (messageHeader[0]) == magicMessageHeader) - { - int bytesInMessage = (int) ByteOrder::swapIfBigEndian (messageHeader[1]); - - if (bytesInMessage > 0) - { - MemoryBlock messageData ((size_t) bytesInMessage, true); - int bytesRead = 0; - - while (bytesInMessage > 0) - { - if (thread->threadShouldExit()) - return false; - - const int numThisTime = jmin (bytesInMessage, 65536); - void* const data = addBytesToPointer (messageData.getData(), bytesRead); - - const int bytesIn = socket != nullptr ? socket->read (data, numThisTime, true) - : pipe ->read (data, numThisTime, -1); - - if (bytesIn <= 0) - break; - - bytesRead += bytesIn; - bytesInMessage -= bytesIn; - } - - if (bytesRead >= 0) - deliverDataInt (messageData); - } - } - else if (bytes < 0) - { - if (socket != nullptr) - deletePipeAndSocket(); - - connectionLostInt(); - return false; - } - - return true; -} - -void InterprocessConnection::runThread() -{ - while (! thread->threadShouldExit()) - { - if (socket != nullptr) - { - const int ready = socket->waitUntilReady (true, 0); - - if (ready < 0) - { - deletePipeAndSocket(); - connectionLostInt(); - break; - } - - if (ready == 0) - { - thread->wait (1); - continue; - } - } - else if (pipe != nullptr) - { - if (! pipe->isOpen()) - { - deletePipeAndSocket(); - connectionLostInt(); - break; - } - } - else - { - break; - } - - if (thread->threadShouldExit() || ! readNextMessageInt()) - break; - } -} diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h deleted file mode 100755 index a88e8fd..0000000 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnection.h +++ /dev/null @@ -1,209 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_INTERPROCESSCONNECTION_H_INCLUDED -#define JUCE_INTERPROCESSCONNECTION_H_INCLUDED - -class InterprocessConnectionServer; -class MemoryBlock; - - -//============================================================================== -/** - Manages a simple two-way messaging connection to another process, using either - a socket or a named pipe as the transport medium. - - To connect to a waiting socket or an open pipe, use the connectToSocket() or - connectToPipe() methods. If this succeeds, messages can be sent to the other end, - and incoming messages will result in a callback via the messageReceived() - method. - - To open a pipe and wait for another client to connect to it, use the createPipe() - method. - - To act as a socket server and create connections for one or more client, see the - InterprocessConnectionServer class. - - @see InterprocessConnectionServer, Socket, NamedPipe -*/ -class JUCE_API InterprocessConnection -{ -public: - //============================================================================== - /** Creates a connection. - - Connections are created manually, connecting them with the connectToSocket() - or connectToPipe() methods, or they are created automatically by a InterprocessConnectionServer - when a client wants to connect. - - @param callbacksOnMessageThread if true, callbacks to the connectionMade(), - connectionLost() and messageReceived() methods will - always be made using the message thread; if false, - these will be called immediately on the connection's - own thread. - @param magicMessageHeaderNumber a magic number to use in the header to check the - validity of the data blocks being sent and received. This - can be any number, but the sender and receiver must obviously - use matching values or they won't recognise each other. - */ - InterprocessConnection (bool callbacksOnMessageThread = true, - uint32 magicMessageHeaderNumber = 0xf2b49e2c); - - /** Destructor. */ - virtual ~InterprocessConnection(); - - //============================================================================== - /** Tries to connect this object to a socket. - - For this to work, the machine on the other end needs to have a InterprocessConnectionServer - object waiting to receive client connections on this port number. - - @param hostName the host computer, either a network address or name - @param portNumber the socket port number to try to connect to - @param timeOutMillisecs how long to keep trying before giving up - @returns true if the connection is established successfully - @see Socket - */ - bool connectToSocket (const String& hostName, - int portNumber, - int timeOutMillisecs); - - /** Tries to connect the object to an existing named pipe. - - For this to work, another process on the same computer must already have opened - an InterprocessConnection object and used createPipe() to create a pipe for this - to connect to. - - @param pipeName the name to use for the pipe - this should be unique to your app - @param pipeReceiveMessageTimeoutMs a timeout length to be used when reading or writing - to the pipe, or -1 for an infinite timeout. - @returns true if it connects successfully. - @see createPipe, NamedPipe - */ - bool connectToPipe (const String& pipeName, int pipeReceiveMessageTimeoutMs); - - /** Tries to create a new pipe for other processes to connect to. - - This creates a pipe with the given name, so that other processes can use - connectToPipe() to connect to the other end. - - @param pipeName the name to use for the pipe - this should be unique to your app - @param pipeReceiveMessageTimeoutMs a timeout length to be used when reading or writing - to the pipe, or -1 for an infinite timeout. - @returns true if the pipe was created, or false if it fails (e.g. if another process is - already using using the pipe). - */ - bool createPipe (const String& pipeName, int pipeReceiveMessageTimeoutMs); - - /** Disconnects and closes any currently-open sockets or pipes. */ - void disconnect(); - - /** True if a socket or pipe is currently active. */ - bool isConnected() const; - - /** Returns the socket that this connection is using (or nullptr if it uses a pipe). */ - StreamingSocket* getSocket() const noexcept { return socket; } - - /** Returns the pipe that this connection is using (or nullptr if it uses a socket). */ - NamedPipe* getPipe() const noexcept { return pipe; } - - /** Returns the name of the machine at the other end of this connection. - This may return an empty string if the name is unknown. - */ - String getConnectedHostName() const; - - //============================================================================== - /** Tries to send a message to the other end of this connection. - - This will fail if it's not connected, or if there's some kind of write error. If - it succeeds, the connection object at the other end will receive the message by - a callback to its messageReceived() method. - - @see messageReceived - */ - bool sendMessage (const MemoryBlock& message); - - //============================================================================== - /** Called when the connection is first connected. - - If the connection was created with the callbacksOnMessageThread flag set, then - this will be called on the message thread; otherwise it will be called on a server - thread. - */ - virtual void connectionMade() = 0; - - /** Called when the connection is broken. - - If the connection was created with the callbacksOnMessageThread flag set, then - this will be called on the message thread; otherwise it will be called on a server - thread. - */ - virtual void connectionLost() = 0; - - /** Called when a message arrives. - - When the object at the other end of this connection sends us a message with sendMessage(), - this callback is used to deliver it to us. - - If the connection was created with the callbacksOnMessageThread flag set, then - this will be called on the message thread; otherwise it will be called on a server - thread. - - @see sendMessage - */ - virtual void messageReceived (const MemoryBlock& message) = 0; - - -private: - //============================================================================== - WeakReference::Master masterReference; - friend class WeakReference; - CriticalSection pipeAndSocketLock; - ScopedPointer socket; - ScopedPointer pipe; - bool callbackConnectionState; - const bool useMessageThread; - const uint32 magicMessageHeader; - int pipeReceiveMessageTimeout; - - friend class InterprocessConnectionServer; - void initialiseWithSocket (StreamingSocket*); - void initialiseWithPipe (NamedPipe*); - void deletePipeAndSocket(); - void connectionMadeInt(); - void connectionLostInt(); - void deliverDataInt (const MemoryBlock&); - bool readNextMessageInt(); - - struct ConnectionThread; - friend struct ConnectionThread; - friend struct ContainerDeletePolicy; - ScopedPointer thread; - void runThread(); - int writeData (void*, int); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InterprocessConnection) -}; - -#endif // JUCE_INTERPROCESSCONNECTION_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp deleted file mode 100755 index e9b5426..0000000 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -InterprocessConnectionServer::InterprocessConnectionServer() - : Thread ("Juce IPC server") -{ -} - -InterprocessConnectionServer::~InterprocessConnectionServer() -{ - stop(); -} - -//============================================================================== -bool InterprocessConnectionServer::beginWaitingForSocket (const int portNumber) -{ - stop(); - - socket = new StreamingSocket(); - - if (socket->createListener (portNumber)) - { - startThread(); - return true; - } - - socket = nullptr; - return false; -} - -void InterprocessConnectionServer::stop() -{ - signalThreadShouldExit(); - - if (socket != nullptr) - socket->close(); - - stopThread (4000); - socket = nullptr; -} - -void InterprocessConnectionServer::run() -{ - while ((! threadShouldExit()) && socket != nullptr) - { - ScopedPointer clientSocket (socket->waitForNextConnection()); - - if (clientSocket != nullptr) - if (InterprocessConnection* newConnection = createConnectionObject()) - newConnection->initialiseWithSocket (clientSocket.release()); - } -} diff --git a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h b/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h deleted file mode 100755 index 8de7b8f..0000000 --- a/JuceLibraryCode/modules/juce_events/interprocess/juce_InterprocessConnectionServer.h +++ /dev/null @@ -1,93 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_INTERPROCESSCONNECTIONSERVER_H_INCLUDED -#define JUCE_INTERPROCESSCONNECTIONSERVER_H_INCLUDED - - -//============================================================================== -/** - An object that waits for client sockets to connect to a port on this host, and - creates InterprocessConnection objects for each one. - - To use this, create a class derived from it which implements the createConnectionObject() - method, so that it creates suitable connection objects for each client that tries - to connect. - - @see InterprocessConnection -*/ -class JUCE_API InterprocessConnectionServer : private Thread -{ -public: - //============================================================================== - /** Creates an uninitialised server object. - */ - InterprocessConnectionServer(); - - /** Destructor. */ - ~InterprocessConnectionServer(); - - //============================================================================== - /** Starts an internal thread which listens on the given port number. - - While this is running, in another process tries to connect with the - InterprocessConnection::connectToSocket() method, this object will call - createConnectionObject() to create a connection to that client. - - Use stop() to stop the thread running. - - @see createConnectionObject, stop - */ - bool beginWaitingForSocket (int portNumber); - - /** Terminates the listener thread, if it's active. - - @see beginWaitingForSocket - */ - void stop(); - -protected: - /** Creates a suitable connection object for a client process that wants to - connect to this one. - - This will be called by the listener thread when a client process tries - to connect, and must return a new InterprocessConnection object that will - then run as this end of the connection. - - @see InterprocessConnection - */ - virtual InterprocessConnection* createConnectionObject() = 0; - - -private: - //============================================================================== - ScopedPointer socket; - - void run() override; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (InterprocessConnectionServer) -}; - - -#endif // JUCE_INTERPROCESSCONNECTIONSERVER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/juce_events.cpp b/JuceLibraryCode/modules/juce_events/juce_events.cpp deleted file mode 100755 index 7438d6a..0000000 --- a/JuceLibraryCode/modules/juce_events/juce_events.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if defined (JUCE_EVENTS_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE - /* When you add this cpp file to your project, you mustn't include it in a file where you've - already included any other headers - just put it inside a file on its own, possibly with your config - flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix - header files that the compiler may be using. - */ - #error "Incorrect use of JUCE cpp file" -#endif - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../juce_core/native/juce_BasicNativeHeaders.h" -#include "juce_events.h" - -#if JUCE_CATCH_UNHANDLED_EXCEPTIONS && JUCE_MODULE_AVAILABLE_juce_gui_basics - #include "../juce_gui_basics/juce_gui_basics.h" -#endif - - - -//============================================================================== -#if JUCE_MAC - #import - #import - #import - #import - #import - -#elif JUCE_LINUX - #include - #include - #include - #undef KeyPress - #include -#endif -#include -//============================================================================== -namespace juce -{ - -#include "messages/juce_ApplicationBase.cpp" -#include "messages/juce_DeletedAtShutdown.cpp" -#include "messages/juce_MessageListener.cpp" -#include "messages/juce_MessageManager.cpp" -#include "broadcasters/juce_ActionBroadcaster.cpp" -#include "broadcasters/juce_AsyncUpdater.cpp" -#include "broadcasters/juce_ChangeBroadcaster.cpp" -#include "timers/juce_MultiTimer.cpp" -#include "timers/juce_Timer.cpp" -#include "interprocess/juce_InterprocessConnection.cpp" -#include "interprocess/juce_InterprocessConnectionServer.cpp" -#include "interprocess/juce_ConnectedChildProcess.cpp" - -//============================================================================== -#if JUCE_MAC - #include "../juce_core/native/juce_osx_ObjCHelpers.h" - #include "native/juce_osx_MessageQueue.h" - #include "native/juce_mac_MessageManager.mm" - -#elif JUCE_IOS - #include "../juce_core/native/juce_osx_ObjCHelpers.h" - #include "native/juce_osx_MessageQueue.h" - #include "native/juce_ios_MessageManager.mm" - -#elif JUCE_WINDOWS - #include "native/juce_win32_HiddenMessageWindow.h" - - #include "native/juce_win32_Messaging.cpp" - -#elif JUCE_LINUX - #include "native/juce_ScopedXLock.h" - #include "native/juce_linux_Messaging.cpp" - -#elif JUCE_ANDROID - #include "../juce_core/native/juce_android_JNIHelpers.h" - #include "native/juce_android_Messaging.cpp" - -#endif - -} diff --git a/JuceLibraryCode/modules/juce_events/juce_events.h b/JuceLibraryCode/modules/juce_events/juce_events.h deleted file mode 100755 index 7af9c9c..0000000 --- a/JuceLibraryCode/modules/juce_events/juce_events.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_EVENTS_H_INCLUDED -#define JUCE_EVENTS_H_INCLUDED - -//============================================================================= -#include "../juce_core/juce_core.h" - -namespace juce -{ - -#include "messages/juce_MessageManager.h" -#include "messages/juce_Message.h" -#include "messages/juce_MessageListener.h" -#include "messages/juce_CallbackMessage.h" -#include "messages/juce_DeletedAtShutdown.h" -#include "messages/juce_NotificationType.h" -#include "messages/juce_ApplicationBase.h" -#include "messages/juce_Initialisation.h" -#include "messages/juce_MountedVolumeListChangeDetector.h" -#include "broadcasters/juce_ListenerList.h" -#include "broadcasters/juce_ActionBroadcaster.h" -#include "broadcasters/juce_ActionListener.h" -#include "broadcasters/juce_AsyncUpdater.h" -#include "broadcasters/juce_ChangeListener.h" -#include "broadcasters/juce_ChangeBroadcaster.h" -#include "timers/juce_Timer.h" -#include "timers/juce_MultiTimer.h" -#include "interprocess/juce_InterprocessConnection.h" -#include "interprocess/juce_InterprocessConnectionServer.h" -#include "interprocess/juce_ConnectedChildProcess.h" -#include "native/juce_ScopedXLock.h" - -} - -#endif // JUCE_EVENTS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/juce_events.mm b/JuceLibraryCode/modules/juce_events/juce_events.mm deleted file mode 100755 index 45263f1..0000000 --- a/JuceLibraryCode/modules/juce_events/juce_events.mm +++ /dev/null @@ -1,25 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#include "juce_events.cpp" diff --git a/JuceLibraryCode/modules/juce_events/juce_module_info b/JuceLibraryCode/modules/juce_events/juce_module_info deleted file mode 100755 index 47c8ea8..0000000 --- a/JuceLibraryCode/modules/juce_events/juce_module_info +++ /dev/null @@ -1,23 +0,0 @@ -{ - "id": "juce_events", - "name": "JUCE message and event handling classes", - "version": "3.1.1", - "description": "Classes for running an application's main event loop and sending/receiving messages, timers, etc.", - "website": "http://www.juce.com/juce", - "license": "GPL/Commercial", - - "dependencies": [ { "id": "juce_core", "version": "matching" } ], - - "include": "juce_events.h", - - "compile": [ { "file": "juce_events.cpp", "target": "! xcode" }, - { "file": "juce_events.mm", "target": "xcode" } ], - - "browse": [ "messages/*", - "timers/*", - "broadcasters/*", - "interprocess/*", - "native/*" ], - - "LinuxLibs": "X11" -} diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp b/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp deleted file mode 100755 index dafc27e..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -JUCEApplicationBase::CreateInstanceFunction JUCEApplicationBase::createInstance = 0; -JUCEApplicationBase* JUCEApplicationBase::appInstance = nullptr; - -JUCEApplicationBase::JUCEApplicationBase() - : appReturnValue (0), - stillInitialising (true) -{ - jassert (isStandaloneApp() && appInstance == nullptr); - appInstance = this; -} - -JUCEApplicationBase::~JUCEApplicationBase() -{ - jassert (appInstance == this); - appInstance = nullptr; -} - -void JUCEApplicationBase::setApplicationReturnValue (const int newReturnValue) noexcept -{ - appReturnValue = newReturnValue; -} - -// This is called on the Mac and iOS where the OS doesn't allow the stack to unwind on shutdown.. -void JUCEApplicationBase::appWillTerminateByForce() -{ - JUCE_AUTORELEASEPOOL - { - { - const ScopedPointer app (appInstance); - - if (app != nullptr) - app->shutdownApp(); - } - - DeletedAtShutdown::deleteAll(); - MessageManager::deleteInstance(); - } -} - -void JUCEApplicationBase::quit() -{ - MessageManager::getInstance()->stopDispatchLoop(); -} - -void JUCEApplicationBase::sendUnhandledException (const std::exception* const e, - const char* const sourceFile, - const int lineNumber) -{ - if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) - app->unhandledException (e, sourceFile, lineNumber); -} - -//============================================================================== -#if ! (JUCE_IOS || JUCE_ANDROID) - #define JUCE_HANDLE_MULTIPLE_INSTANCES 1 -#endif - -#if JUCE_HANDLE_MULTIPLE_INSTANCES -struct JUCEApplicationBase::MultipleInstanceHandler : public ActionListener -{ -public: - MultipleInstanceHandler (const String& appName) - : appLock ("juceAppLock_" + appName) - { - } - - bool sendCommandLineToPreexistingInstance() - { - if (appLock.enter (0)) - return false; - - JUCEApplicationBase* const app = JUCEApplicationBase::getInstance(); - jassert (app != nullptr); - - MessageManager::broadcastMessage (app->getApplicationName() - + "/" + app->getCommandLineParameters()); - return true; - } - - void actionListenerCallback (const String& message) override - { - if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) - { - const String appName (app->getApplicationName()); - - if (message.startsWith (appName + "/")) - app->anotherInstanceStarted (message.substring (appName.length() + 1)); - } - } - -private: - InterProcessLock appLock; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultipleInstanceHandler) -}; - -bool JUCEApplicationBase::sendCommandLineToPreexistingInstance() -{ - jassert (multipleInstanceHandler == nullptr); // this must only be called once! - - multipleInstanceHandler = new MultipleInstanceHandler (getApplicationName()); - return multipleInstanceHandler->sendCommandLineToPreexistingInstance(); -} - -#else -struct JUCEApplicationBase::MultipleInstanceHandler {}; -#endif - -//============================================================================== -#if JUCE_ANDROID - -StringArray JUCEApplicationBase::getCommandLineParameterArray() { return StringArray(); } -String JUCEApplicationBase::getCommandLineParameters() { return String(); } - -#else - -#if JUCE_WINDOWS && ! defined (_CONSOLE) - -String JUCE_CALLTYPE JUCEApplicationBase::getCommandLineParameters() -{ - return CharacterFunctions::findEndOfToken (CharPointer_UTF16 (GetCommandLineW()), - CharPointer_UTF16 (L" "), - CharPointer_UTF16 (L"\"")).findEndOfWhitespace(); -} - -StringArray JUCE_CALLTYPE JUCEApplicationBase::getCommandLineParameterArray() -{ - StringArray s; - - int argc = 0; - if (LPWSTR* const argv = CommandLineToArgvW (GetCommandLineW(), &argc)) - { - s = StringArray (argv + 1, argc - 1); - LocalFree (argv); - } - - return s; -} - -#else - -#if JUCE_IOS - extern int juce_iOSMain (int argc, const char* argv[]); -#endif - -#if JUCE_MAC - extern void initialiseNSApplication(); -#endif - -#if JUCE_WINDOWS - const char* const* juce_argv = nullptr; - int juce_argc = 0; -#else - extern const char* const* juce_argv; // declared in juce_core - extern int juce_argc; -#endif - -String JUCEApplicationBase::getCommandLineParameters() -{ - String argString; - - for (int i = 1; i < juce_argc; ++i) - { - String arg (juce_argv[i]); - - if (arg.containsChar (' ') && ! arg.isQuotedString()) - arg = arg.quoted ('"'); - - argString << arg << ' '; - } - - return argString.trim(); -} - -StringArray JUCEApplicationBase::getCommandLineParameterArray() -{ - return StringArray (juce_argv + 1, juce_argc - 1); -} - -int JUCEApplicationBase::main (int argc, const char* argv[]) -{ - JUCE_AUTORELEASEPOOL - { - juce_argc = argc; - juce_argv = argv; - - #if JUCE_MAC - initialiseNSApplication(); - #endif - - #if JUCE_IOS - return juce_iOSMain (argc, argv); - #else - return JUCEApplicationBase::main(); - #endif - } -} - -#endif - -//============================================================================== -int JUCEApplicationBase::main() -{ - ScopedJuceInitialiser_GUI libraryInitialiser; - jassert (createInstance != nullptr); - - const ScopedPointer app (createInstance()); - jassert (app != nullptr); - - if (! app->initialiseApp()) - return app->getApplicationReturnValue(); - - JUCE_TRY - { - // loop until a quit message is received.. - MessageManager::getInstance()->runDispatchLoop(); - } - JUCE_CATCH_EXCEPTION - - return app->shutdownApp(); -} - -#endif - -//============================================================================== -bool JUCEApplicationBase::initialiseApp() -{ - #if JUCE_HANDLE_MULTIPLE_INSTANCES - if ((! moreThanOneInstanceAllowed()) && sendCommandLineToPreexistingInstance()) - { - DBG ("Another instance is running - quitting..."); - return false; - } - #endif - - // let the app do its setting-up.. - initialise (getCommandLineParameters()); - - stillInitialising = false; - - if (MessageManager::getInstance()->hasStopMessageBeenSent()) - return false; - - #if JUCE_HANDLE_MULTIPLE_INSTANCES - if (multipleInstanceHandler != nullptr) - MessageManager::getInstance()->registerBroadcastListener (multipleInstanceHandler); - #endif - - return true; -} - -int JUCEApplicationBase::shutdownApp() -{ - jassert (JUCEApplicationBase::getInstance() == this); - - #if JUCE_HANDLE_MULTIPLE_INSTANCES - if (multipleInstanceHandler != nullptr) - MessageManager::getInstance()->deregisterBroadcastListener (multipleInstanceHandler); - #endif - - JUCE_TRY - { - // give the app a chance to clean up.. - shutdown(); - } - JUCE_CATCH_EXCEPTION - - multipleInstanceHandler = nullptr; - return getApplicationReturnValue(); -} diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h b/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h deleted file mode 100755 index 073e5d6..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_ApplicationBase.h +++ /dev/null @@ -1,283 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_APPLICATIONBASE_H_INCLUDED -#define JUCE_APPLICATIONBASE_H_INCLUDED - - -//============================================================================== -/** - Abstract base class for application classes. - - Note that in the juce_gui_basics module, there's a utility class JUCEApplication - which derives from JUCEApplicationBase, and takes care of a few chores. Most - of the time you'll want to derive your class from JUCEApplication rather than - using JUCEApplicationBase directly, but if you're not using the juce_gui_basics - module then you might need to go straight to this base class. - - Any application that wants to run an event loop must declare a subclass of - JUCEApplicationBase, and implement its various pure virtual methods. - - It then needs to use the START_JUCE_APPLICATION macro somewhere in a CPP file - to declare an instance of this class and generate suitable platform-specific - boilerplate code to launch the app. - - e.g. @code - class MyJUCEApp : public JUCEApplication - { - public: - MyJUCEApp() {} - ~MyJUCEApp() {} - - void initialise (const String& commandLine) override - { - myMainWindow = new MyApplicationWindow(); - myMainWindow->setBounds (100, 100, 400, 500); - myMainWindow->setVisible (true); - } - - void shutdown() override - { - myMainWindow = nullptr; - } - - const String getApplicationName() override - { - return "Super JUCE-o-matic"; - } - - const String getApplicationVersion() override - { - return "1.0"; - } - - private: - ScopedPointer myMainWindow; - }; - - // this generates boilerplate code to launch our app class: - START_JUCE_APPLICATION (MyJUCEApp) - @endcode - - @see JUCEApplication, START_JUCE_APPLICATION -*/ -class JUCE_API JUCEApplicationBase -{ -protected: - //============================================================================== - JUCEApplicationBase(); - -public: - /** Destructor. */ - virtual ~JUCEApplicationBase(); - - //============================================================================== - /** Returns the global instance of the application object that's running. */ - static JUCEApplicationBase* getInstance() noexcept { return appInstance; } - - //============================================================================== - /** Returns the application's name. */ - virtual const String getApplicationName() = 0; - - /** Returns the application's version number. */ - virtual const String getApplicationVersion() = 0; - - /** Checks whether multiple instances of the app are allowed. - - If you application class returns true for this, more than one instance is - permitted to run (except on the Mac where this isn't possible). - - If it's false, the second instance won't start, but it you will still get a - callback to anotherInstanceStarted() to tell you about this - which - gives you a chance to react to what the user was trying to do. - */ - virtual bool moreThanOneInstanceAllowed() = 0; - - /** Called when the application starts. - - This will be called once to let the application do whatever initialisation - it needs, create its windows, etc. - - After the method returns, the normal event-dispatch loop will be run, - until the quit() method is called, at which point the shutdown() - method will be called to let the application clear up anything it needs - to delete. - - If during the initialise() method, the application decides not to start-up - after all, it can just call the quit() method and the event loop won't be run. - - @param commandLineParameters the line passed in does not include the name of - the executable, just the parameter list. To get the - parameters as an array, you can call - JUCEApplication::getCommandLineParameters() - @see shutdown, quit - */ - virtual void initialise (const String& commandLineParameters) = 0; - - /* Called to allow the application to clear up before exiting. - - After JUCEApplication::quit() has been called, the event-dispatch loop will - terminate, and this method will get called to allow the app to sort itself - out. - - Be careful that nothing happens in this method that might rely on messages - being sent, or any kind of window activity, because the message loop is no - longer running at this point. - - @see DeletedAtShutdown - */ - virtual void shutdown() = 0; - - /** Indicates that the user has tried to start up another instance of the app. - - This will get called even if moreThanOneInstanceAllowed() is false. - */ - virtual void anotherInstanceStarted (const String& commandLine) = 0; - - /** Called when the operating system is trying to close the application. - - The default implementation of this method is to call quit(), but it may - be overloaded to ignore the request or do some other special behaviour - instead. For example, you might want to offer the user the chance to save - their changes before quitting, and give them the chance to cancel. - - If you want to send a quit signal to your app, this is the correct method - to call, because it means that requests that come from the system get handled - in the same way as those from your own application code. So e.g. you'd - call this method from a "quit" item on a menu bar. - */ - virtual void systemRequestedQuit() = 0; - - /** This method is called when the application is being put into background mode - by the operating system. - */ - virtual void suspended() = 0; - - /** This method is called when the application is being woken from background mode - by the operating system. - */ - virtual void resumed() = 0; - - /** If any unhandled exceptions make it through to the message dispatch loop, this - callback will be triggered, in case you want to log them or do some other - type of error-handling. - - If the type of exception is derived from the std::exception class, the pointer - passed-in will be valid. If the exception is of unknown type, this pointer - will be null. - */ - virtual void unhandledException (const std::exception*, - const String& sourceFilename, - int lineNumber) = 0; - - //============================================================================== - /** Signals that the main message loop should stop and the application should terminate. - - This isn't synchronous, it just posts a quit message to the main queue, and - when this message arrives, the message loop will stop, the shutdown() method - will be called, and the app will exit. - - Note that this will cause an unconditional quit to happen, so if you need an - extra level before this, e.g. to give the user the chance to save their work - and maybe cancel the quit, you'll need to handle this in the systemRequestedQuit() - method - see that method's help for more info. - - @see MessageManager - */ - static void quit(); - - //============================================================================== - /** Returns the application's command line parameters as a set of strings. - @see getCommandLineParameters - */ - static StringArray JUCE_CALLTYPE getCommandLineParameterArray(); - - /** Returns the application's command line parameters as a single string. - @see getCommandLineParameterArray - */ - static String JUCE_CALLTYPE getCommandLineParameters(); - - //============================================================================== - /** Sets the value that should be returned as the application's exit code when the - app quits. - - This is the value that's returned by the main() function. Normally you'd leave this - as 0 unless you want to indicate an error code. - - @see getApplicationReturnValue - */ - void setApplicationReturnValue (int newReturnValue) noexcept; - - /** Returns the value that has been set as the application's exit code. - @see setApplicationReturnValue - */ - int getApplicationReturnValue() const noexcept { return appReturnValue; } - - //============================================================================== - /** Returns true if this executable is running as an app (as opposed to being a plugin - or other kind of shared library. */ - static bool isStandaloneApp() noexcept { return createInstance != nullptr; } - - /** Returns true if the application hasn't yet completed its initialise() method - and entered the main event loop. - - This is handy for things like splash screens to know when the app's up-and-running - properly. - */ - bool isInitialising() const noexcept { return stillInitialising; } - - - //============================================================================== - #ifndef DOXYGEN - // The following methods are for internal use only... - static int main(); - static int main (int argc, const char* argv[]); - - static void appWillTerminateByForce(); - typedef JUCEApplicationBase* (*CreateInstanceFunction)(); - static CreateInstanceFunction createInstance; - - virtual bool initialiseApp(); - static void JUCE_CALLTYPE sendUnhandledException (const std::exception*, const char* sourceFile, int lineNumber); - bool sendCommandLineToPreexistingInstance(); - #endif - -private: - //============================================================================== - static JUCEApplicationBase* appInstance; - int appReturnValue; - bool stillInitialising; - - struct MultipleInstanceHandler; - friend struct MultipleInstanceHandler; - friend struct ContainerDeletePolicy; - ScopedPointer multipleInstanceHandler; - - int shutdownApp(); - - JUCE_DECLARE_NON_COPYABLE (JUCEApplicationBase) -}; - - -#endif // JUCE_APPLICATIONBASE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h b/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h deleted file mode 100755 index 799defd..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_CallbackMessage.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_CALLBACKMESSAGE_H_INCLUDED -#define JUCE_CALLBACKMESSAGE_H_INCLUDED - - -//============================================================================== -/** - A message that invokes a callback method when it gets delivered. - - You can use this class to fire off actions that you want to be performed later - on the message thread. - - To use it, create a subclass of CallbackMessage which implements the messageCallback() - method, then call post() to dispatch it. The event thread will then invoke your - messageCallback() method later on, and will automatically delete the message object - afterwards. - - Always create a new instance of a CallbackMessage on the heap, as it will be - deleted automatically after the message has been delivered. - - @see MessageManager, MessageListener, ActionListener, ChangeListener -*/ -class JUCE_API CallbackMessage : public MessageManager::MessageBase -{ -public: - //============================================================================== - CallbackMessage() noexcept {} - - /** Destructor. */ - ~CallbackMessage() {} - - //============================================================================== - /** Called when the message is delivered. - - You should implement this method and make it do whatever action you want - to perform. - - Note that like all other messages, this object will be deleted immediately - after this method has been invoked. - */ - virtual void messageCallback() = 0; - -private: - // Avoid the leak-detector because for plugins, the host can unload our DLL with undelivered - // messages still in the system event queue. These aren't harmful, but can cause annoying assertions. - JUCE_DECLARE_NON_COPYABLE (CallbackMessage) -}; - - -#endif // JUCE_CALLBACKMESSAGE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp b/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp deleted file mode 100755 index d3c6e97..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -static SpinLock deletedAtShutdownLock; - -DeletedAtShutdown::DeletedAtShutdown() -{ - const SpinLock::ScopedLockType sl (deletedAtShutdownLock); - getObjects().add (this); -} - -DeletedAtShutdown::~DeletedAtShutdown() -{ - const SpinLock::ScopedLockType sl (deletedAtShutdownLock); - getObjects().removeFirstMatchingValue (this); -} - -void DeletedAtShutdown::deleteAll() -{ - // make a local copy of the array, so it can't get into a loop if something - // creates another DeletedAtShutdown object during its destructor. - Array localCopy; - - { - const SpinLock::ScopedLockType sl (deletedAtShutdownLock); - localCopy = getObjects(); - } - - for (int i = localCopy.size(); --i >= 0;) - { - JUCE_TRY - { - DeletedAtShutdown* deletee = localCopy.getUnchecked(i); - - // double-check that it's not already been deleted during another object's destructor. - { - const SpinLock::ScopedLockType sl (deletedAtShutdownLock); - if (! getObjects().contains (deletee)) - deletee = nullptr; - } - - delete deletee; - } - JUCE_CATCH_EXCEPTION - } - - // if no objects got re-created during shutdown, this should have been emptied by their - // destructors - jassert (getObjects().size() == 0); - - getObjects().clear(); // just to make sure the array doesn't have any memory still allocated -} - -Array & DeletedAtShutdown::getObjects() -{ - static Array objects; - return objects; -} diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h b/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h deleted file mode 100755 index ce1f10e..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_DeletedAtShutdown.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DELETEDATSHUTDOWN_H_INCLUDED -#define JUCE_DELETEDATSHUTDOWN_H_INCLUDED - - -//============================================================================== -/** - Classes derived from this will be automatically deleted when the application exits. - - After JUCEApplicationBase::shutdown() has been called, any objects derived from - DeletedAtShutdown which are still in existence will be deleted in the reverse - order to that in which they were created. - - So if you've got a singleton and don't want to have to explicitly delete it, just - inherit from this and it'll be taken care of. -*/ -class JUCE_API DeletedAtShutdown -{ -protected: - /** Creates a DeletedAtShutdown object. */ - DeletedAtShutdown(); - - /** Destructor. - - It's ok to delete these objects explicitly - it's only the ones left - dangling at the end that will be deleted automatically. - */ - virtual ~DeletedAtShutdown(); - - -public: - /** Deletes all extant objects. - - This shouldn't be used by applications, as it's called automatically - in the shutdown code of the JUCEApplicationBase class. - */ - static void deleteAll(); - -private: - static Array & getObjects(); - - JUCE_DECLARE_NON_COPYABLE (DeletedAtShutdown) -}; - -#endif // JUCE_DELETEDATSHUTDOWN_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h b/JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h deleted file mode 100755 index d3302dd..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_Initialisation.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_INITIALISATION_H_INCLUDED -#define JUCE_INITIALISATION_H_INCLUDED - - -//============================================================================== -/** Initialises Juce's GUI classes. - - If you're embedding Juce into an application that uses its own event-loop rather - than using the START_JUCE_APPLICATION macro, call this function before making any - Juce calls, to make sure things are initialised correctly. - - Note that if you're creating a Juce DLL for Windows, you may also need to call the - Process::setCurrentModuleInstanceHandle() method. - - @see shutdownJuce_GUI() -*/ -JUCE_API void JUCE_CALLTYPE initialiseJuce_GUI(); - -/** Clears up any static data being used by Juce's GUI classes. - - If you're embedding Juce into an application that uses its own event-loop rather - than using the START_JUCE_APPLICATION macro, call this function in your shutdown - code to clean up any juce objects that might be lying around. - - @see initialiseJuce_GUI() -*/ -JUCE_API void JUCE_CALLTYPE shutdownJuce_GUI(); - - -//============================================================================== -/** A utility object that helps you initialise and shutdown Juce correctly - using an RAII pattern. - - When the first instance of this class is created, it calls initialiseJuce_GUI(), - and when the last instance is deleted, it calls shutdownJuce_GUI(), so that you - can easily be sure that as long as at least one instance of the class exists, the - library will be initialised. - - This class is particularly handy to use at the beginning of a console app's - main() function, because it'll take care of shutting down whenever you return - from the main() call. - - Be careful with your threading though - to be safe, you should always make sure - that these objects are created and deleted on the message thread. -*/ -class JUCE_API ScopedJuceInitialiser_GUI -{ -public: - /** The constructor simply calls initialiseJuce_GUI(). */ - ScopedJuceInitialiser_GUI(); - - /** The destructor simply calls shutdownJuce_GUI(). */ - ~ScopedJuceInitialiser_GUI(); -}; - - -//============================================================================== -/** - To start a JUCE app, use this macro: START_JUCE_APPLICATION (AppSubClass) where - AppSubClass is the name of a class derived from JUCEApplication or JUCEApplicationBase. - - See the JUCEApplication and JUCEApplicationBase class documentation for more details. -*/ -#ifdef DOXYGEN - #define START_JUCE_APPLICATION(AppClass) -#elif JUCE_ANDROID - #define START_JUCE_APPLICATION(AppClass) \ - juce::JUCEApplicationBase* juce_CreateApplication() { return new AppClass(); } - -#else - #if JUCE_WINDOWS && ! defined (_CONSOLE) - #define JUCE_MAIN_FUNCTION int __stdcall WinMain (struct HINSTANCE__*, struct HINSTANCE__*, char*, int) - #define JUCE_MAIN_FUNCTION_ARGS - #else - #define JUCE_MAIN_FUNCTION int main (int argc, char* argv[]) - #define JUCE_MAIN_FUNCTION_ARGS argc, (const char**) argv - #endif - - #define START_JUCE_APPLICATION(AppClass) \ - static juce::JUCEApplicationBase* juce_CreateApplication() { return new AppClass(); } \ - extern "C" JUCE_MAIN_FUNCTION \ - { \ - juce::JUCEApplicationBase::createInstance = &juce_CreateApplication; \ - return juce::JUCEApplicationBase::main (JUCE_MAIN_FUNCTION_ARGS); \ - } -#endif - -#endif // JUCE_INITIALISATION_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_Message.h b/JuceLibraryCode/modules/juce_events/messages/juce_Message.h deleted file mode 100755 index 4ae55f6..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_Message.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MESSAGE_H_INCLUDED -#define JUCE_MESSAGE_H_INCLUDED - -class MessageListener; - - -//============================================================================== -/** The base class for objects that can be sent to a MessageListener. - - If you want to send a message that carries some kind of custom data, just - create a subclass of Message with some appropriate member variables to hold - your data. - - Always create a new instance of a Message object on the heap, as it will be - deleted automatically after the message has been delivered. - - @see MessageListener, MessageManager, ActionListener, ChangeListener -*/ -class JUCE_API Message : public MessageManager::MessageBase -{ -public: - //============================================================================== - /** Creates an uninitialised message. */ - Message() noexcept; - ~Message(); - - typedef ReferenceCountedObjectPtr Ptr; - - //============================================================================== -private: - friend class MessageListener; - WeakReference recipient; - void messageCallback() override; - - // Avoid the leak-detector because for plugins, the host can unload our DLL with undelivered - // messages still in the system event queue. These aren't harmful, but can cause annoying assertions. - JUCE_DECLARE_NON_COPYABLE (Message) -}; - - -#endif // JUCE_MESSAGE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp b/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp deleted file mode 100755 index b398ffa..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.cpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -Message::Message() noexcept {} -Message::~Message() {} - -void Message::messageCallback() -{ - if (MessageListener* const r = recipient) - r->handleMessage (*this); -} - -MessageListener::MessageListener() noexcept -{ - // Are you trying to create a messagelistener before or after juce has been intialised?? - jassert (MessageManager::getInstanceWithoutCreating() != nullptr); -} - -MessageListener::~MessageListener() -{ - masterReference.clear(); -} - -void MessageListener::postMessage (Message* const message) const -{ - message->recipient = const_cast (this); - message->post(); -} diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h b/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h deleted file mode 100755 index ddd51e2..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_MessageListener.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MESSAGELISTENER_H_INCLUDED -#define JUCE_MESSAGELISTENER_H_INCLUDED - - -//============================================================================== -/** - MessageListener subclasses can post and receive Message objects. - - @see Message, MessageManager, ActionListener, ChangeListener -*/ -class JUCE_API MessageListener -{ -public: - //============================================================================== - MessageListener() noexcept; - - /** Destructor. */ - virtual ~MessageListener(); - - //============================================================================== - /** This is the callback method that receives incoming messages. - - This is called by the MessageManager from its dispatch loop. - - @see postMessage - */ - virtual void handleMessage (const Message& message) = 0; - - //============================================================================== - /** Sends a message to the message queue, for asynchronous delivery to this listener - later on. - - This method can be called safely by any thread. - - @param message the message object to send - this will be deleted - automatically by the message queue, so make sure it's - allocated on the heap, not the stack! - @see handleMessage - */ - void postMessage (Message* message) const; - -private: - WeakReference::Master masterReference; - friend class WeakReference; -}; - - -#endif // JUCE_MESSAGELISTENER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp b/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp deleted file mode 100755 index 44c2adc..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.cpp +++ /dev/null @@ -1,375 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -MessageManager::MessageManager() noexcept - : quitMessagePosted (false), - quitMessageReceived (false), - messageThreadId (Thread::getCurrentThreadId()), - threadWithLock (0) -{ - if (JUCEApplicationBase::isStandaloneApp()) - Thread::setCurrentThreadName ("Juce Message Thread"); -} - -MessageManager::~MessageManager() noexcept -{ - broadcaster = nullptr; - - doPlatformSpecificShutdown(); - - jassert (instance == this); - instance = nullptr; // do this last in case this instance is still needed by doPlatformSpecificShutdown() -} - -MessageManager* MessageManager::instance = nullptr; - -MessageManager* MessageManager::getInstance() -{ - if (instance == nullptr) - { - instance = new MessageManager(); - doPlatformSpecificInitialisation(); - } - - return instance; -} - -MessageManager* MessageManager::getInstanceWithoutCreating() noexcept -{ - return instance; -} - -void MessageManager::deleteInstance() -{ - deleteAndZero (instance); -} - -//============================================================================== -bool MessageManager::MessageBase::post() -{ - MessageManager* const mm = MessageManager::instance; - - if (mm == nullptr || mm->quitMessagePosted || ! postMessageToSystemQueue (this)) - { - Ptr deleter (this); // (this will delete messages that were just created with a 0 ref count) - return false; - } - - return true; -} - -//============================================================================== -#if JUCE_MODAL_LOOPS_PERMITTED && ! (JUCE_MAC || JUCE_IOS) -void MessageManager::runDispatchLoop() -{ - runDispatchLoopUntil (-1); -} - -bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) -{ - jassert (isThisTheMessageThread()); // must only be called by the message thread - - const int64 endTime = Time::currentTimeMillis() + millisecondsToRunFor; - - while (! quitMessageReceived) - { - JUCE_TRY - { - if (! dispatchNextMessageOnSystemQueue (millisecondsToRunFor >= 0)) - Thread::sleep (1); - } - JUCE_CATCH_EXCEPTION - - if (millisecondsToRunFor >= 0 && Time::currentTimeMillis() >= endTime) - break; - } - - return ! quitMessageReceived; -} - -class MessageManager::QuitMessage : public MessageManager::MessageBase -{ -public: - QuitMessage() {} - - void messageCallback() override - { - if (MessageManager* const mm = MessageManager::instance) - mm->quitMessageReceived = true; - } - - JUCE_DECLARE_NON_COPYABLE (QuitMessage) -}; - -void MessageManager::stopDispatchLoop() -{ - (new QuitMessage())->post(); - quitMessagePosted = true; -} - -#endif - -//============================================================================== -#if JUCE_COMPILER_SUPPORTS_LAMBDAS -struct AsyncFunction : private MessageManager::MessageBase -{ - AsyncFunction (std::function f) : fn (f) { post(); } - -private: - std::function fn; - void messageCallback() override { fn(); } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AsyncFunction) -}; - -void MessageManager::callAsync (std::function f) -{ - new AsyncFunction (f); -} -#endif - -//============================================================================== -class AsyncFunctionCallback : public MessageManager::MessageBase -{ -public: - AsyncFunctionCallback (MessageCallbackFunction* const f, void* const param) - : result (nullptr), func (f), parameter (param) - {} - - void messageCallback() override - { - result = (*func) (parameter); - finished.signal(); - } - - WaitableEvent finished; - void* volatile result; - -private: - MessageCallbackFunction* const func; - void* const parameter; - - JUCE_DECLARE_NON_COPYABLE (AsyncFunctionCallback) -}; - -void* MessageManager::callFunctionOnMessageThread (MessageCallbackFunction* const func, void* const parameter) -{ - if (isThisTheMessageThread()) - return func (parameter); - - // If this thread has the message manager locked, then this will deadlock! - jassert (! currentThreadHasLockedMessageManager()); - - const ReferenceCountedObjectPtr message (new AsyncFunctionCallback (func, parameter)); - - if (message->post()) - { - message->finished.wait(); - return message->result; - } - - jassertfalse; // the OS message queue failed to send the message! - return nullptr; -} - -//============================================================================== -void MessageManager::deliverBroadcastMessage (const String& value) -{ - if (broadcaster != nullptr) - broadcaster->sendActionMessage (value); -} - -void MessageManager::registerBroadcastListener (ActionListener* const listener) -{ - if (broadcaster == nullptr) - broadcaster = new ActionBroadcaster(); - - broadcaster->addActionListener (listener); -} - -void MessageManager::deregisterBroadcastListener (ActionListener* const listener) -{ - if (broadcaster != nullptr) - broadcaster->removeActionListener (listener); -} - -//============================================================================== -bool MessageManager::isThisTheMessageThread() const noexcept -{ - return Thread::getCurrentThreadId() == messageThreadId; -} - -void MessageManager::setCurrentThreadAsMessageThread() -{ - const Thread::ThreadID thisThread = Thread::getCurrentThreadId(); - - if (messageThreadId != thisThread) - { - messageThreadId = thisThread; - - // This is needed on windows to make sure the message window is created by this thread - doPlatformSpecificShutdown(); - doPlatformSpecificInitialisation(); - } -} - -bool MessageManager::currentThreadHasLockedMessageManager() const noexcept -{ - const Thread::ThreadID thisThread = Thread::getCurrentThreadId(); - return thisThread == messageThreadId || thisThread == threadWithLock; -} - -//============================================================================== -//============================================================================== -/* The only safe way to lock the message thread while another thread does - some work is by posting a special message, whose purpose is to tie up the event - loop until the other thread has finished its business. - - Any other approach can get horribly deadlocked if the OS uses its own hidden locks which - get locked before making an event callback, because if the same OS lock gets indirectly - accessed from another thread inside a MM lock, you're screwed. (this is exactly what happens - in Cocoa). -*/ -class MessageManagerLock::BlockingMessage : public MessageManager::MessageBase -{ -public: - BlockingMessage() noexcept {} - - void messageCallback() override - { - lockedEvent.signal(); - releaseEvent.wait(); - } - - WaitableEvent lockedEvent, releaseEvent; - - JUCE_DECLARE_NON_COPYABLE (BlockingMessage) -}; - -//============================================================================== -MessageManagerLock::MessageManagerLock (Thread* const threadToCheck) - : blockingMessage(), locked (attemptLock (threadToCheck, nullptr)) -{ -} - -MessageManagerLock::MessageManagerLock (ThreadPoolJob* const jobToCheckForExitSignal) - : blockingMessage(), locked (attemptLock (nullptr, jobToCheckForExitSignal)) -{ -} - -bool MessageManagerLock::attemptLock (Thread* const threadToCheck, ThreadPoolJob* const job) -{ - MessageManager* const mm = MessageManager::instance; - - if (mm == nullptr) - return false; - - if (mm->currentThreadHasLockedMessageManager()) - return true; - - if (threadToCheck == nullptr && job == nullptr) - { - mm->lockingLock.enter(); - } - else - { - while (! mm->lockingLock.tryEnter()) - { - if ((threadToCheck != nullptr && threadToCheck->threadShouldExit()) - || (job != nullptr && job->shouldExit())) - return false; - - Thread::yield(); - } - } - - blockingMessage = new BlockingMessage(); - - if (! blockingMessage->post()) - { - blockingMessage = nullptr; - return false; - } - - while (! blockingMessage->lockedEvent.wait (20)) - { - if ((threadToCheck != nullptr && threadToCheck->threadShouldExit()) - || (job != nullptr && job->shouldExit())) - { - blockingMessage->releaseEvent.signal(); - blockingMessage = nullptr; - mm->lockingLock.exit(); - return false; - } - } - - jassert (mm->threadWithLock == 0); - - mm->threadWithLock = Thread::getCurrentThreadId(); - return true; -} - -MessageManagerLock::~MessageManagerLock() noexcept -{ - if (blockingMessage != nullptr) - { - MessageManager* const mm = MessageManager::instance; - - jassert (mm == nullptr || mm->currentThreadHasLockedMessageManager()); - - blockingMessage->releaseEvent.signal(); - blockingMessage = nullptr; - - if (mm != nullptr) - { - mm->threadWithLock = 0; - mm->lockingLock.exit(); - } - } -} - -//============================================================================== -JUCE_API void JUCE_CALLTYPE initialiseJuce_GUI(); -JUCE_API void JUCE_CALLTYPE initialiseJuce_GUI() -{ - JUCE_AUTORELEASEPOOL - { - MessageManager::getInstance(); - } -} - -JUCE_API void JUCE_CALLTYPE shutdownJuce_GUI(); -JUCE_API void JUCE_CALLTYPE shutdownJuce_GUI() -{ - JUCE_AUTORELEASEPOOL - { - DeletedAtShutdown::deleteAll(); - MessageManager::deleteInstance(); - } -} - -static int numScopedInitInstances = 0; - -ScopedJuceInitialiser_GUI::ScopedJuceInitialiser_GUI() { if (numScopedInitInstances++ == 0) initialiseJuce_GUI(); } -ScopedJuceInitialiser_GUI::~ScopedJuceInitialiser_GUI() { if (--numScopedInitInstances == 0) shutdownJuce_GUI(); } diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h b/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h deleted file mode 100755 index 0901b29..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_MessageManager.h +++ /dev/null @@ -1,335 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MESSAGEMANAGER_H_INCLUDED -#define JUCE_MESSAGEMANAGER_H_INCLUDED - -class MessageManagerLock; -class ThreadPoolJob; -class ActionListener; -class ActionBroadcaster; - - -//============================================================================== -/** See MessageManager::callFunctionOnMessageThread() for use of this function type -*/ -typedef void* (MessageCallbackFunction) (void* userData); - - -//============================================================================== -/** - This class is in charge of the application's event-dispatch loop. - - @see Message, CallbackMessage, MessageManagerLock, JUCEApplication, JUCEApplicationBase -*/ -class JUCE_API MessageManager -{ -public: - //============================================================================== - /** Returns the global instance of the MessageManager. */ - static MessageManager* getInstance(); - - /** Returns the global instance of the MessageManager, or nullptr if it doesn't exist. */ - static MessageManager* getInstanceWithoutCreating() noexcept; - - /** Deletes the global MessageManager instance. - Does nothing if no instance had been created. - */ - static void deleteInstance(); - - //============================================================================== - /** Runs the event dispatch loop until a stop message is posted. - - This method is only intended to be run by the application's startup routine, - as it blocks, and will only return after the stopDispatchLoop() method has been used. - - @see stopDispatchLoop - */ - void runDispatchLoop(); - - /** Sends a signal that the dispatch loop should terminate. - - After this is called, the runDispatchLoop() or runDispatchLoopUntil() methods - will be interrupted and will return. - - @see runDispatchLoop - */ - void stopDispatchLoop(); - - /** Returns true if the stopDispatchLoop() method has been called. - */ - bool hasStopMessageBeenSent() const noexcept { return quitMessagePosted; } - - #if JUCE_MODAL_LOOPS_PERMITTED || DOXYGEN - /** Synchronously dispatches messages until a given time has elapsed. - - Returns false if a quit message has been posted by a call to stopDispatchLoop(), - otherwise returns true. - */ - bool runDispatchLoopUntil (int millisecondsToRunFor); - #endif - - //============================================================================== - #if JUCE_COMPILER_SUPPORTS_LAMBDAS - /** Asynchronously invokes a function or C++11 lambda on the message thread. - Internally this uses the CallbackMessage class to invoke the callback. - */ - static void callAsync (std::function); - #endif - - /** Calls a function using the message-thread. - - This can be used by any thread to cause this function to be called-back - by the message thread. If it's the message-thread that's calling this method, - then the function will just be called; if another thread is calling, a message - will be posted to the queue, and this method will block until that message - is delivered, the function is called, and the result is returned. - - Be careful not to cause any deadlocks with this! It's easy to do - e.g. if the caller - thread has a critical section locked, which an unrelated message callback then tries to lock - before the message thread gets round to processing this callback. - - @param callback the function to call - its signature must be @code - void* myCallbackFunction (void*) @endcode - @param userData a user-defined pointer that will be passed to the function that gets called - @returns the value that the callback function returns. - @see MessageManagerLock - */ - void* callFunctionOnMessageThread (MessageCallbackFunction* callback, void* userData); - - /** Returns true if the caller-thread is the message thread. */ - bool isThisTheMessageThread() const noexcept; - - /** Called to tell the manager that the current thread is the one that's running the dispatch loop. - - (Best to ignore this method unless you really know what you're doing..) - @see getCurrentMessageThread - */ - void setCurrentThreadAsMessageThread(); - - /** Returns the ID of the current message thread, as set by setCurrentThreadAsMessageThread(). - - (Best to ignore this method unless you really know what you're doing..) - @see setCurrentThreadAsMessageThread - */ - Thread::ThreadID getCurrentMessageThread() const noexcept { return messageThreadId; } - - /** Returns true if the caller thread has currently got the message manager locked. - - see the MessageManagerLock class for more info about this. - - This will be true if the caller is the message thread, because that automatically - gains a lock while a message is being dispatched. - */ - bool currentThreadHasLockedMessageManager() const noexcept; - - //============================================================================== - /** Sends a message to all other JUCE applications that are running. - - @param messageText the string that will be passed to the actionListenerCallback() - method of the broadcast listeners in the other app. - @see registerBroadcastListener, ActionListener - */ - static void broadcastMessage (const String& messageText); - - /** Registers a listener to get told about broadcast messages. - - The actionListenerCallback() callback's string parameter - is the message passed into broadcastMessage(). - - @see broadcastMessage - */ - void registerBroadcastListener (ActionListener* listener); - - /** Deregisters a broadcast listener. */ - void deregisterBroadcastListener (ActionListener* listener); - - //============================================================================== - /** Internal class used as the base class for all message objects. - You shouldn't need to use this directly - see the CallbackMessage or Message - classes instead. - */ - class JUCE_API MessageBase : public ReferenceCountedObject - { - public: - MessageBase() noexcept {} - virtual ~MessageBase() {} - - virtual void messageCallback() = 0; - bool post(); - - typedef ReferenceCountedObjectPtr Ptr; - - JUCE_DECLARE_NON_COPYABLE (MessageBase) - }; - - //============================================================================== - #ifndef DOXYGEN - // Internal methods - do not use! - void deliverBroadcastMessage (const String&); - ~MessageManager() noexcept; - #endif - -private: - //============================================================================== - MessageManager() noexcept; - - static MessageManager* instance; - - friend class MessageBase; - class QuitMessage; - friend class QuitMessage; - friend class MessageManagerLock; - - ScopedPointer broadcaster; - bool quitMessagePosted, quitMessageReceived; - Thread::ThreadID messageThreadId; - Thread::ThreadID volatile threadWithLock; - CriticalSection lockingLock; - - static bool postMessageToSystemQueue (MessageBase*); - static void* exitModalLoopCallback (void*); - static void doPlatformSpecificInitialisation(); - static void doPlatformSpecificShutdown(); - static bool dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MessageManager) -}; - - -//============================================================================== -/** Used to make sure that the calling thread has exclusive access to the message loop. - - Because it's not thread-safe to call any of the Component or other UI classes - from threads other than the message thread, one of these objects can be used to - lock the message loop and allow this to be done. The message thread will be - suspended for the lifetime of the MessageManagerLock object, so create one on - the stack like this: @code - void MyThread::run() - { - someData = 1234; - - const MessageManagerLock mmLock; - // the event loop will now be locked so it's safe to make a few calls.. - - myComponent->setBounds (newBounds); - myComponent->repaint(); - - // ..the event loop will now be unlocked as the MessageManagerLock goes out of scope - } - @endcode - - Obviously be careful not to create one of these and leave it lying around, or - your app will grind to a halt! - - Another caveat is that using this in conjunction with other CriticalSections - can create lots of interesting ways of producing a deadlock! In particular, if - your message thread calls stopThread() for a thread that uses these locks, - you'll get an (occasional) deadlock.. - - @see MessageManager, MessageManager::currentThreadHasLockedMessageManager -*/ -class JUCE_API MessageManagerLock -{ -public: - //============================================================================== - /** Tries to acquire a lock on the message manager. - - The constructor attempts to gain a lock on the message loop, and the lock will be - kept for the lifetime of this object. - - Optionally, you can pass a thread object here, and while waiting to obtain the lock, - this method will keep checking whether the thread has been given the - Thread::signalThreadShouldExit() signal. If this happens, then it will return - without gaining the lock. If you pass a thread, you must check whether the lock was - successful by calling lockWasGained(). If this is false, your thread is being told to - die, so you should take evasive action. - - If you pass nullptr for the thread object, it will wait indefinitely for the lock - be - careful when doing this, because it's very easy to deadlock if your message thread - attempts to call stopThread() on a thread just as that thread attempts to get the - message lock. - - If the calling thread already has the lock, nothing will be done, so it's safe and - quick to use these locks recursively. - - E.g. - @code - void run() - { - ... - - while (! threadShouldExit()) - { - MessageManagerLock mml (Thread::getCurrentThread()); - - if (! mml.lockWasGained()) - return; // another thread is trying to kill us! - - ..do some locked stuff here.. - } - - ..and now the MM is now unlocked.. - } - @endcode - - */ - MessageManagerLock (Thread* threadToCheckForExitSignal = nullptr); - - //============================================================================== - /** This has the same behaviour as the other constructor, but takes a ThreadPoolJob - instead of a thread. - - See the MessageManagerLock (Thread*) constructor for details on how this works. - */ - MessageManagerLock (ThreadPoolJob* jobToCheckForExitSignal); - - - //============================================================================== - /** Releases the current thread's lock on the message manager. - - Make sure this object is created and deleted by the same thread, - otherwise there are no guarantees what will happen! - */ - ~MessageManagerLock() noexcept; - - //============================================================================== - /** Returns true if the lock was successfully acquired. - (See the constructor that takes a Thread for more info). - */ - bool lockWasGained() const noexcept { return locked; } - -private: - class BlockingMessage; - friend class ReferenceCountedObjectPtr; - ReferenceCountedObjectPtr blockingMessage; - bool locked; - - bool attemptLock (Thread*, ThreadPoolJob*); - - JUCE_DECLARE_NON_COPYABLE (MessageManagerLock) -}; - - -#endif // JUCE_MESSAGEMANAGER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h b/JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h deleted file mode 100755 index fe62875..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_MountedVolumeListChangeDetector.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MOUNTEDVOLUMELISTCHANGEDETECTOR_H_INCLUDED -#define JUCE_MOUNTEDVOLUMELISTCHANGEDETECTOR_H_INCLUDED - -#if JUCE_MAC || JUCE_WINDOWS || defined (DOXYGEN) - -//============================================================================== -/** - An instance of this class will provide callbacks when drives are - mounted or unmounted on the system. - - Just inherit from this class and implement the pure virtual method - to get the callbacks, there's no need to do anything else. - - @see File::findFileSystemRoots() -*/ -class JUCE_API MountedVolumeListChangeDetector -{ -public: - MountedVolumeListChangeDetector(); - virtual ~MountedVolumeListChangeDetector(); - - /** This method is called when a volume is mounted or unmounted. */ - virtual void mountedVolumeListChanged() = 0; - -private: - JUCE_PUBLIC_IN_DLL_BUILD (struct Pimpl) - friend struct ContainerDeletePolicy; - ScopedPointer pimpl; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MountedVolumeListChangeDetector) -}; - -#endif - -#endif // JUCE_MOUNTEDVOLUMELISTCHANGEDETECTOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h b/JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h deleted file mode 100755 index c3ecccc..0000000 --- a/JuceLibraryCode/modules/juce_events/messages/juce_NotificationType.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_NOTIFICATIONTYPE_H_INCLUDED -#define JUCE_NOTIFICATIONTYPE_H_INCLUDED - -//============================================================================== -/** - These enums are used in various classes to indicate whether a notification - event should be sent out. -*/ -enum NotificationType -{ - dontSendNotification = 0, /**< No notification message should be sent. */ - sendNotification = 1, /**< Requests a notification message, either synchronous or not. */ - sendNotificationSync, /**< Requests a synchronous notification. */ - sendNotificationAsync, /**< Requests an asynchronous notification. */ -}; - - -#endif // JUCE_NOTIFICATIONTYPE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h b/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h deleted file mode 100755 index d2136c7..0000000 --- a/JuceLibraryCode/modules/juce_events/native/juce_ScopedXLock.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_SCOPEDXLOCK_H_INCLUDED -#define JUCE_SCOPEDXLOCK_H_INCLUDED - - -//============================================================================== -#if JUCE_LINUX || DOXYGEN - -/** A handy class that uses XLockDisplay and XUnlockDisplay to lock the X server - using RAII (Only available in Linux!). -*/ -class ScopedXLock -{ -public: - /** Creating a ScopedXLock object locks the X display. - This uses XLockDisplay() to grab the display that Juce is using. - */ - ScopedXLock(); - - /** Deleting a ScopedXLock object unlocks the X display. - This calls XUnlockDisplay() to release the lock. - */ - ~ScopedXLock(); -}; - -#endif -#endif // JUCE_SCOPEDXLOCK_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp b/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp deleted file mode 100755 index 144a326..0000000 --- a/JuceLibraryCode/modules/juce_events/native/juce_android_Messaging.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -void MessageManager::doPlatformSpecificInitialisation() {} -void MessageManager::doPlatformSpecificShutdown() {} - -//============================================================================== -bool MessageManager::dispatchNextMessageOnSystemQueue (const bool returnIfNoPendingMessages) -{ - Logger::outputDebugString ("*** Modal loops are not possible in Android!! Exiting..."); - exit (1); - - return true; -} - -//============================================================================== -bool MessageManager::postMessageToSystemQueue (MessageManager::MessageBase* const message) -{ - message->incReferenceCount(); - android.activity.callVoidMethod (JuceAppActivity.postMessage, (jlong) (pointer_sized_uint) message); - return true; -} - -JUCE_JNI_CALLBACK (JUCE_ANDROID_ACTIVITY_CLASSNAME, deliverMessage, void, (JNIEnv* env, jobject activity, jlong value)) -{ - JUCE_TRY - { - MessageManager::MessageBase* const message = (MessageManager::MessageBase*) (pointer_sized_uint) value; - message->messageCallback(); - message->decReferenceCount(); - } - JUCE_CATCH_EXCEPTION -} - -//============================================================================== -void MessageManager::broadcastMessage (const String&) -{ -} - -void MessageManager::runDispatchLoop() -{ -} - -void MessageManager::stopDispatchLoop() -{ - struct QuitCallback : public CallbackMessage - { - QuitCallback() {} - - void messageCallback() override - { - android.activity.callVoidMethod (JuceAppActivity.finish); - } - }; - - (new QuitCallback())->post(); - quitMessagePosted = true; -} diff --git a/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm b/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm deleted file mode 100755 index bdfed65..0000000 --- a/JuceLibraryCode/modules/juce_events/native/juce_ios_MessageManager.mm +++ /dev/null @@ -1,88 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -void MessageManager::runDispatchLoop() -{ - jassert (isThisTheMessageThread()); // must only be called by the message thread - runDispatchLoopUntil (-1); -} - -void MessageManager::stopDispatchLoop() -{ - [[[UIApplication sharedApplication] delegate] applicationWillTerminate: [UIApplication sharedApplication]]; - exit (0); // iOS apps get no mercy.. -} - -bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) -{ - JUCE_AUTORELEASEPOOL - { - jassert (isThisTheMessageThread()); // must only be called by the message thread - - uint32 startTime = Time::getMillisecondCounter(); - NSDate* endDate = [NSDate dateWithTimeIntervalSinceNow: millisecondsToRunFor * 0.001]; - - while (! quitMessagePosted) - { - JUCE_AUTORELEASEPOOL - { - [[NSRunLoop currentRunLoop] runMode: NSDefaultRunLoopMode - beforeDate: endDate]; - - if (millisecondsToRunFor >= 0 - && Time::getMillisecondCounter() >= startTime + (uint32) millisecondsToRunFor) - break; - } - } - - return ! quitMessagePosted; - } -} - -//============================================================================== -static ScopedPointer messageQueue; - -void MessageManager::doPlatformSpecificInitialisation() -{ - if (messageQueue == nullptr) - messageQueue = new MessageQueue(); -} - -void MessageManager::doPlatformSpecificShutdown() -{ - messageQueue = nullptr; -} - -bool MessageManager::postMessageToSystemQueue (MessageManager::MessageBase* const message) -{ - if (messageQueue != nullptr) - messageQueue->post (message); - - return true; -} - -void MessageManager::broadcastMessage (const String&) -{ - // N/A on current iOS -} diff --git a/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp b/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp deleted file mode 100755 index 67711d9..0000000 --- a/JuceLibraryCode/modules/juce_events/native/juce_linux_Messaging.cpp +++ /dev/null @@ -1,398 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_DEBUG && ! defined (JUCE_DEBUG_XERRORS) - #define JUCE_DEBUG_XERRORS 1 -#endif - -Display* display = nullptr; -Window juce_messageWindowHandle = None; -XContext windowHandleXContext; // This is referenced from Windowing.cpp - -typedef bool (*WindowMessageReceiveCallback) (XEvent&); -WindowMessageReceiveCallback dispatchWindowMessage = nullptr; - -typedef void (*SelectionRequestCallback) (XSelectionRequestEvent&); -SelectionRequestCallback handleSelectionRequest = nullptr; - -//============================================================================== -ScopedXLock::ScopedXLock() { if (display != nullptr) XLockDisplay (display); } -ScopedXLock::~ScopedXLock() { if (display != nullptr) XUnlockDisplay (display); } - -//============================================================================== -class InternalMessageQueue -{ -public: - InternalMessageQueue() - : bytesInSocket (0), - totalEventCount (0) - { - int ret = ::socketpair (AF_LOCAL, SOCK_STREAM, 0, fd); - (void) ret; jassert (ret == 0); - } - - ~InternalMessageQueue() - { - close (fd[0]); - close (fd[1]); - - clearSingletonInstance(); - } - - //============================================================================== - void postMessage (MessageManager::MessageBase* const msg) - { - const int maxBytesInSocketQueue = 128; - - ScopedLock sl (lock); - queue.add (msg); - - if (bytesInSocket < maxBytesInSocketQueue) - { - ++bytesInSocket; - - ScopedUnlock ul (lock); - const unsigned char x = 0xff; - size_t bytesWritten = write (fd[0], &x, 1); - (void) bytesWritten; - } - } - - bool isEmpty() const - { - ScopedLock sl (lock); - return queue.size() == 0; - } - - bool dispatchNextEvent() - { - // This alternates between giving priority to XEvents or internal messages, - // to keep everything running smoothly.. - if ((++totalEventCount & 1) != 0) - return dispatchNextXEvent() || dispatchNextInternalMessage(); - - return dispatchNextInternalMessage() || dispatchNextXEvent(); - } - - // Wait for an event (either XEvent, or an internal Message) - bool sleepUntilEvent (const int timeoutMs) - { - if (! isEmpty()) - return true; - - if (display != nullptr) - { - ScopedXLock xlock; - if (XPending (display)) - return true; - } - - struct timeval tv; - tv.tv_sec = 0; - tv.tv_usec = timeoutMs * 1000; - int fd0 = getWaitHandle(); - int fdmax = fd0; - - fd_set readset; - FD_ZERO (&readset); - FD_SET (fd0, &readset); - - if (display != nullptr) - { - ScopedXLock xlock; - int fd1 = XConnectionNumber (display); - FD_SET (fd1, &readset); - fdmax = jmax (fd0, fd1); - } - - const int ret = select (fdmax + 1, &readset, 0, 0, &tv); - return (ret > 0); // ret <= 0 if error or timeout - } - - //============================================================================== - juce_DeclareSingleton_SingleThreaded_Minimal (InternalMessageQueue) - -private: - CriticalSection lock; - ReferenceCountedArray queue; - int fd[2]; - int bytesInSocket; - int totalEventCount; - - int getWaitHandle() const noexcept { return fd[1]; } - - static bool setNonBlocking (int handle) - { - int socketFlags = fcntl (handle, F_GETFL, 0); - if (socketFlags == -1) - return false; - - socketFlags |= O_NONBLOCK; - return fcntl (handle, F_SETFL, socketFlags) == 0; - } - - static bool dispatchNextXEvent() - { - if (display == nullptr) - return false; - - XEvent evt; - - { - ScopedXLock xlock; - if (! XPending (display)) - return false; - - XNextEvent (display, &evt); - } - - if (evt.type == SelectionRequest && evt.xany.window == juce_messageWindowHandle - && handleSelectionRequest != nullptr) - handleSelectionRequest (evt.xselectionrequest); - else if (evt.xany.window != juce_messageWindowHandle && dispatchWindowMessage != nullptr) - dispatchWindowMessage (evt); - - return true; - } - - MessageManager::MessageBase::Ptr popNextMessage() - { - const ScopedLock sl (lock); - - if (bytesInSocket > 0) - { - --bytesInSocket; - - const ScopedUnlock ul (lock); - unsigned char x; - size_t numBytes = read (fd[1], &x, 1); - (void) numBytes; - } - - return queue.removeAndReturn (0); - } - - bool dispatchNextInternalMessage() - { - if (const MessageManager::MessageBase::Ptr msg = popNextMessage()) - { - JUCE_TRY - { - msg->messageCallback(); - return true; - } - JUCE_CATCH_EXCEPTION - } - - return false; - } -}; - -juce_ImplementSingleton_SingleThreaded (InternalMessageQueue) - - -//============================================================================== -namespace LinuxErrorHandling -{ - static bool errorOccurred = false; - static bool keyboardBreakOccurred = false; - static XErrorHandler oldErrorHandler = (XErrorHandler) 0; - static XIOErrorHandler oldIOErrorHandler = (XIOErrorHandler) 0; - - //============================================================================== - // Usually happens when client-server connection is broken - int ioErrorHandler (Display*) - { - DBG ("ERROR: connection to X server broken.. terminating."); - - if (JUCEApplicationBase::isStandaloneApp()) - MessageManager::getInstance()->stopDispatchLoop(); - - errorOccurred = true; - return 0; - } - - int errorHandler (Display* display, XErrorEvent* event) - { - #if JUCE_DEBUG_XERRORS - char errorStr[64] = { 0 }; - char requestStr[64] = { 0 }; - - XGetErrorText (display, event->error_code, errorStr, 64); - XGetErrorDatabaseText (display, "XRequest", String (event->request_code).toUTF8(), "Unknown", requestStr, 64); - DBG ("ERROR: X returned " << errorStr << " for operation " << requestStr); - #endif - - return 0; - } - - void installXErrorHandlers() - { - oldIOErrorHandler = XSetIOErrorHandler (ioErrorHandler); - oldErrorHandler = XSetErrorHandler (errorHandler); - } - - void removeXErrorHandlers() - { - if (JUCEApplicationBase::isStandaloneApp()) - { - XSetIOErrorHandler (oldIOErrorHandler); - oldIOErrorHandler = 0; - - XSetErrorHandler (oldErrorHandler); - oldErrorHandler = 0; - } - } - - //============================================================================== - void keyboardBreakSignalHandler (int sig) - { - if (sig == SIGINT) - keyboardBreakOccurred = true; - } - - void installKeyboardBreakHandler() - { - struct sigaction saction; - sigset_t maskSet; - sigemptyset (&maskSet); - saction.sa_handler = keyboardBreakSignalHandler; - saction.sa_mask = maskSet; - saction.sa_flags = 0; - sigaction (SIGINT, &saction, 0); - } -} - -//============================================================================== -void MessageManager::doPlatformSpecificInitialisation() -{ - if (JUCEApplicationBase::isStandaloneApp()) - { - // Initialise xlib for multiple thread support - static bool initThreadCalled = false; - - if (! initThreadCalled) - { - if (! XInitThreads()) - { - // This is fatal! Print error and closedown - Logger::outputDebugString ("Failed to initialise xlib thread support."); - Process::terminate(); - return; - } - - initThreadCalled = true; - } - - LinuxErrorHandling::installXErrorHandlers(); - LinuxErrorHandling::installKeyboardBreakHandler(); - } - - // Create the internal message queue - InternalMessageQueue::getInstance(); - - // Try to connect to a display - String displayName (getenv ("DISPLAY")); - if (displayName.isEmpty()) - displayName = ":0.0"; - - display = XOpenDisplay (displayName.toUTF8()); - - if (display != nullptr) // This is not fatal! we can run headless. - { - // Create a context to store user data associated with Windows we create - windowHandleXContext = XUniqueContext(); - - // We're only interested in client messages for this window, which are always sent - XSetWindowAttributes swa; - swa.event_mask = NoEventMask; - - // Create our message window (this will never be mapped) - const int screen = DefaultScreen (display); - juce_messageWindowHandle = XCreateWindow (display, RootWindow (display, screen), - 0, 0, 1, 1, 0, 0, InputOnly, - DefaultVisual (display, screen), - CWEventMask, &swa); - } -} - -void MessageManager::doPlatformSpecificShutdown() -{ - InternalMessageQueue::deleteInstance(); - - if (display != nullptr && ! LinuxErrorHandling::errorOccurred) - { - XDestroyWindow (display, juce_messageWindowHandle); - XCloseDisplay (display); - - juce_messageWindowHandle = 0; - display = nullptr; - - LinuxErrorHandling::removeXErrorHandlers(); - } -} - -bool MessageManager::postMessageToSystemQueue (MessageManager::MessageBase* const message) -{ - if (LinuxErrorHandling::errorOccurred) - return false; - - InternalMessageQueue::getInstanceWithoutCreating()->postMessage (message); - return true; -} - -void MessageManager::broadcastMessage (const String& /* value */) -{ - /* TODO */ -} - -// this function expects that it will NEVER be called simultaneously for two concurrent threads -bool MessageManager::dispatchNextMessageOnSystemQueue (bool returnIfNoPendingMessages) -{ - while (! LinuxErrorHandling::errorOccurred) - { - if (LinuxErrorHandling::keyboardBreakOccurred) - { - LinuxErrorHandling::errorOccurred = true; - - if (JUCEApplicationBase::isStandaloneApp()) - Process::terminate(); - - break; - } - - InternalMessageQueue* const queue = InternalMessageQueue::getInstanceWithoutCreating(); - jassert (queue != nullptr); - - if (queue->dispatchNextEvent()) - return true; - - if (returnIfNoPendingMessages) - break; - - queue->sleepUntilEvent (2000); - } - - return false; -} diff --git a/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm b/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm deleted file mode 100755 index 0090d0b..0000000 --- a/JuceLibraryCode/modules/juce_events/native/juce_mac_MessageManager.mm +++ /dev/null @@ -1,433 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -typedef void (*AppFocusChangeCallback)(); -AppFocusChangeCallback appFocusChangeCallback = nullptr; - -typedef bool (*CheckEventBlockedByModalComps) (NSEvent*); -CheckEventBlockedByModalComps isEventBlockedByModalComps = nullptr; - -typedef void (*MenuTrackingChangedCallback)(bool); -MenuTrackingChangedCallback menuTrackingChangedCallback = nullptr; - -//============================================================================== -struct AppDelegate -{ -public: - AppDelegate() - { - static AppDelegateClass cls; - delegate = [cls.createInstance() init]; - - NSNotificationCenter* center = [NSNotificationCenter defaultCenter]; - - [center addObserver: delegate selector: @selector (mainMenuTrackingBegan:) - name: NSMenuDidBeginTrackingNotification object: nil]; - [center addObserver: delegate selector: @selector (mainMenuTrackingEnded:) - name: NSMenuDidEndTrackingNotification object: nil]; - - if (JUCEApplicationBase::isStandaloneApp()) - { - [NSApp setDelegate: delegate]; - - [[NSDistributedNotificationCenter defaultCenter] addObserver: delegate - selector: @selector (broadcastMessageCallback:) - name: getBroadcastEventName() - object: nil]; - } - else - { - [center addObserver: delegate selector: @selector (applicationDidResignActive:) - name: NSApplicationDidResignActiveNotification object: NSApp]; - - [center addObserver: delegate selector: @selector (applicationDidBecomeActive:) - name: NSApplicationDidBecomeActiveNotification object: NSApp]; - - [center addObserver: delegate selector: @selector (applicationWillUnhide:) - name: NSApplicationWillUnhideNotification object: NSApp]; - } - } - - ~AppDelegate() - { - [[NSRunLoop currentRunLoop] cancelPerformSelectorsWithTarget: delegate]; - [[NSNotificationCenter defaultCenter] removeObserver: delegate]; - - if (JUCEApplicationBase::isStandaloneApp()) - { - [NSApp setDelegate: nil]; - - [[NSDistributedNotificationCenter defaultCenter] removeObserver: delegate - name: getBroadcastEventName() - object: nil]; - } - - [delegate release]; - } - - static NSString* getBroadcastEventName() - { - return juceStringToNS ("juce_" + String::toHexString (File::getSpecialLocation (File::currentExecutableFile).hashCode64())); - } - - MessageQueue messageQueue; - id delegate; - -private: - //============================================================================== - struct AppDelegateClass : public ObjCClass - { - AppDelegateClass() : ObjCClass ("JUCEAppDelegate_") - { - addMethod (@selector (applicationWillFinishLaunching:), applicationWillFinishLaunching, "v@:@@"); - addMethod (@selector (getUrl:withReplyEvent:), getUrl_withReplyEvent, "v@:@@"); - addMethod (@selector (applicationShouldTerminate:), applicationShouldTerminate, "I@:@"); - addMethod (@selector (applicationWillTerminate:), applicationWillTerminate, "v@:@"); - addMethod (@selector (application:openFile:), application_openFile, "c@:@@"); - addMethod (@selector (application:openFiles:), application_openFiles, "v@:@@"); - addMethod (@selector (applicationDidBecomeActive:), applicationDidBecomeActive, "v@:@"); - addMethod (@selector (applicationDidResignActive:), applicationDidResignActive, "v@:@"); - addMethod (@selector (applicationWillUnhide:), applicationWillUnhide, "v@:@"); - addMethod (@selector (broadcastMessageCallback:), broadcastMessageCallback, "v@:@"); - addMethod (@selector (mainMenuTrackingBegan:), mainMenuTrackingBegan, "v@:@"); - addMethod (@selector (mainMenuTrackingEnded:), mainMenuTrackingEnded, "v@:@"); - addMethod (@selector (dummyMethod), dummyMethod, "v@:"); - - registerClass(); - } - - private: - static void applicationWillFinishLaunching (id self, SEL, NSApplication*, NSNotification*) - { - [[NSAppleEventManager sharedAppleEventManager] setEventHandler: self - andSelector: @selector (getUrl:withReplyEvent:) - forEventClass: kInternetEventClass - andEventID: kAEGetURL]; - } - - static NSApplicationTerminateReply applicationShouldTerminate (id /*self*/, SEL, NSApplication*) - { - if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) - { - app->systemRequestedQuit(); - - if (! MessageManager::getInstance()->hasStopMessageBeenSent()) - return NSTerminateCancel; - } - - return NSTerminateNow; - } - - static void applicationWillTerminate (id /*self*/, SEL, NSNotification*) - { - JUCEApplicationBase::appWillTerminateByForce(); - } - - static BOOL application_openFile (id /*self*/, SEL, NSApplication*, NSString* filename) - { - if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) - { - app->anotherInstanceStarted (quotedIfContainsSpaces (filename)); - return YES; - } - - return NO; - } - - static void application_openFiles (id /*self*/, SEL, NSApplication*, NSArray* filenames) - { - if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) - { - StringArray files; - - for (NSString* f in filenames) - files.add (quotedIfContainsSpaces (f)); - - if (files.size() > 0) - app->anotherInstanceStarted (files.joinIntoString (" ")); - } - } - - static void applicationDidBecomeActive (id /*self*/, SEL, NSNotification*) { focusChanged(); } - static void applicationDidResignActive (id /*self*/, SEL, NSNotification*) { focusChanged(); } - static void applicationWillUnhide (id /*self*/, SEL, NSNotification*) { focusChanged(); } - - static void broadcastMessageCallback (id /*self*/, SEL, NSNotification* n) - { - NSDictionary* dict = (NSDictionary*) [n userInfo]; - const String messageString (nsStringToJuce ((NSString*) [dict valueForKey: nsStringLiteral ("message")])); - MessageManager::getInstance()->deliverBroadcastMessage (messageString); - } - - static void mainMenuTrackingBegan (id /*self*/, SEL, NSNotification*) - { - if (menuTrackingChangedCallback != nullptr) - (*menuTrackingChangedCallback) (true); - } - - static void mainMenuTrackingEnded (id /*self*/, SEL, NSNotification*) - { - if (menuTrackingChangedCallback != nullptr) - (*menuTrackingChangedCallback) (false); - } - - static void dummyMethod (id /*self*/, SEL) {} // (used as a way of running a dummy thread) - - static void focusChanged() - { - if (appFocusChangeCallback != nullptr) - (*appFocusChangeCallback)(); - } - - static void getUrl_withReplyEvent (id /*self*/, SEL, NSAppleEventDescriptor* event, NSAppleEventDescriptor*) - { - if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) - app->anotherInstanceStarted (quotedIfContainsSpaces ([[event paramDescriptorForKeyword: keyDirectObject] stringValue])); - } - - static String quotedIfContainsSpaces (NSString* file) - { - String s (nsStringToJuce (file)); - if (s.containsChar (' ')) - s = s.quoted ('"'); - - return s; - } - }; -}; - -//============================================================================== -void MessageManager::runDispatchLoop() -{ - if (! quitMessagePosted) // check that the quit message wasn't already posted.. - { - JUCE_AUTORELEASEPOOL - { - // must only be called by the message thread! - jassert (isThisTheMessageThread()); - - #if JUCE_PROJUCER_LIVE_BUILD - runDispatchLoopUntil (std::numeric_limits::max()); - #else - #if JUCE_CATCH_UNHANDLED_EXCEPTIONS - @try - { - [NSApp run]; - } - @catch (NSException* e) - { - // An AppKit exception will kill the app, but at least this provides a chance to log it., - std::runtime_error ex (std::string ("NSException: ") + [[e name] UTF8String] + ", Reason:" + [[e reason] UTF8String]); - JUCEApplication::sendUnhandledException (&ex, __FILE__, __LINE__); - } - @finally - { - } - #else - [NSApp run]; - #endif - #endif - } - } -} - -static void shutdownNSApp() -{ - [NSApp stop: nil]; - [NSApp activateIgnoringOtherApps: YES]; // (if the app is inactive, it sits there and ignores the quit request until the next time it gets activated) - [NSEvent startPeriodicEventsAfterDelay: 0 withPeriod: 0.1]; -} - -void MessageManager::stopDispatchLoop() -{ - quitMessagePosted = true; - - #if ! JUCE_PROJUCER_LIVE_BUILD - if (isThisTheMessageThread()) - { - shutdownNSApp(); - } - else - { - struct QuitCallback : public CallbackMessage - { - QuitCallback() {} - void messageCallback() override { shutdownNSApp(); } - }; - - (new QuitCallback())->post(); - } - #endif -} - -#if JUCE_MODAL_LOOPS_PERMITTED -bool MessageManager::runDispatchLoopUntil (int millisecondsToRunFor) -{ - jassert (millisecondsToRunFor >= 0); - jassert (isThisTheMessageThread()); // must only be called by the message thread - - uint32 endTime = Time::getMillisecondCounter() + (uint32) millisecondsToRunFor; - - while (! quitMessagePosted) - { - JUCE_AUTORELEASEPOOL - { - CFRunLoopRunInMode (kCFRunLoopDefaultMode, 0.001, true); - - NSEvent* e = [NSApp nextEventMatchingMask: NSAnyEventMask - untilDate: [NSDate dateWithTimeIntervalSinceNow: 0.001] - inMode: NSDefaultRunLoopMode - dequeue: YES]; - - if (e != nil && (isEventBlockedByModalComps == nullptr || ! (*isEventBlockedByModalComps) (e))) - [NSApp sendEvent: e]; - - if (Time::getMillisecondCounter() >= endTime) - break; - } - } - - return ! quitMessagePosted; -} -#endif - -//============================================================================== -void initialiseNSApplication(); -void initialiseNSApplication() -{ - JUCE_AUTORELEASEPOOL - { - [NSApplication sharedApplication]; - } -} - -static AppDelegate* appDelegate = nullptr; - -void MessageManager::doPlatformSpecificInitialisation() -{ - if (appDelegate == nil) - appDelegate = new AppDelegate(); - - #if ! (defined (MAC_OS_X_VERSION_10_5) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5) - // This launches a dummy thread, which forces Cocoa to initialise NSThreads correctly (needed prior to 10.5) - if (! [NSThread isMultiThreaded]) - [NSThread detachNewThreadSelector: @selector (dummyMethod) - toTarget: appDelegate->delegate - withObject: nil]; - #endif -} - -void MessageManager::doPlatformSpecificShutdown() -{ - delete appDelegate; - appDelegate = nullptr; -} - -bool MessageManager::postMessageToSystemQueue (MessageBase* message) -{ - jassert (appDelegate != nil); - appDelegate->messageQueue.post (message); - return true; -} - -void MessageManager::broadcastMessage (const String& message) -{ - NSDictionary* info = [NSDictionary dictionaryWithObject: juceStringToNS (message) - forKey: nsStringLiteral ("message")]; - - [[NSDistributedNotificationCenter defaultCenter] postNotificationName: AppDelegate::getBroadcastEventName() - object: nil - userInfo: info]; -} - -// Special function used by some plugin classes to re-post carbon events -void repostCurrentNSEvent(); -void repostCurrentNSEvent() -{ - struct EventReposter : public CallbackMessage - { - EventReposter() : e ([[NSApp currentEvent] retain]) {} - ~EventReposter() { [e release]; } - - void messageCallback() override - { - [NSApp postEvent: e atStart: YES]; - } - - NSEvent* e; - }; - - (new EventReposter())->post(); -} - - -//============================================================================== -#if JUCE_MAC -struct MountedVolumeListChangeDetector::Pimpl -{ - Pimpl (MountedVolumeListChangeDetector& d) : owner (d) - { - static ObserverClass cls; - delegate = [cls.createInstance() init]; - ObserverClass::setOwner (delegate, this); - - NSNotificationCenter* nc = [[NSWorkspace sharedWorkspace] notificationCenter]; - - [nc addObserver: delegate selector: @selector (changed:) name: NSWorkspaceDidMountNotification object: nil]; - [nc addObserver: delegate selector: @selector (changed:) name: NSWorkspaceDidUnmountNotification object: nil]; - } - - ~Pimpl() - { - [[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver: delegate]; - [delegate release]; - } - -private: - MountedVolumeListChangeDetector& owner; - id delegate; - - struct ObserverClass : public ObjCClass - { - ObserverClass() : ObjCClass ("JUCEDriveObserver_") - { - addIvar ("owner"); - addMethod (@selector (changed:), changed, "v@:@"); - addProtocol (@protocol (NSTextInput)); - registerClass(); - } - - static Pimpl* getOwner (id self) { return getIvar (self, "owner"); } - static void setOwner (id self, Pimpl* owner) { object_setInstanceVariable (self, "owner", owner); } - - static void changed (id self, SEL, NSNotification*) - { - getOwner (self)->owner.mountedVolumeListChanged(); - } - }; -}; - -MountedVolumeListChangeDetector::MountedVolumeListChangeDetector() { pimpl = new Pimpl (*this); } -MountedVolumeListChangeDetector::~MountedVolumeListChangeDetector() {} -#endif diff --git a/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h b/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h deleted file mode 100755 index 6ffbefe..0000000 --- a/JuceLibraryCode/modules/juce_events/native/juce_osx_MessageQueue.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_OSX_MESSAGEQUEUE_H_INCLUDED -#define JUCE_OSX_MESSAGEQUEUE_H_INCLUDED - -//============================================================================== -/* An internal message pump class used in OSX and iOS. */ -class MessageQueue -{ -public: - MessageQueue() - { - #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4 && ! JUCE_IOS - runLoop = CFRunLoopGetMain(); - #else - runLoop = CFRunLoopGetCurrent(); - #endif - - CFRunLoopSourceContext sourceContext; - zerostruct (sourceContext); // (can't use "= { 0 }" on this object because it's typedef'ed as a C struct) - sourceContext.info = this; - sourceContext.perform = runLoopSourceCallback; - runLoopSource = CFRunLoopSourceCreate (kCFAllocatorDefault, 1, &sourceContext); - CFRunLoopAddSource (runLoop, runLoopSource, kCFRunLoopCommonModes); - } - - ~MessageQueue() - { - CFRunLoopRemoveSource (runLoop, runLoopSource, kCFRunLoopCommonModes); - CFRunLoopSourceInvalidate (runLoopSource); - CFRelease (runLoopSource); - } - - void post (MessageManager::MessageBase* const message) - { - messages.add (message); - CFRunLoopSourceSignal (runLoopSource); - CFRunLoopWakeUp (runLoop); - } - -private: - ReferenceCountedArray messages; - CFRunLoopRef runLoop; - CFRunLoopSourceRef runLoopSource; - - bool deliverNextMessage() - { - const MessageManager::MessageBase::Ptr nextMessage (messages.removeAndReturn (0)); - - if (nextMessage == nullptr) - return false; - - JUCE_AUTORELEASEPOOL - { - JUCE_TRY - { - nextMessage->messageCallback(); - } - JUCE_CATCH_EXCEPTION - } - - return true; - } - - void runLoopCallback() - { - for (int i = 4; --i >= 0;) - if (! deliverNextMessage()) - return; - - CFRunLoopSourceSignal (runLoopSource); - CFRunLoopWakeUp (runLoop); - } - - static void runLoopSourceCallback (void* info) - { - static_cast (info)->runLoopCallback(); - } -}; - -#endif // JUCE_OSX_MESSAGEQUEUE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h b/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h deleted file mode 100755 index b494e6c..0000000 --- a/JuceLibraryCode/modules/juce_events/native/juce_win32_HiddenMessageWindow.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_WIN32_HIDDENMESSAGEWINDOW_H_INCLUDED -#define JUCE_WIN32_HIDDENMESSAGEWINDOW_H_INCLUDED - -//============================================================================== -class HiddenMessageWindow -{ -public: - HiddenMessageWindow (const TCHAR* const messageWindowName, WNDPROC wndProc) - { - String className ("JUCE_"); - className << String::toHexString (Time::getHighResolutionTicks()); - - HMODULE moduleHandle = (HMODULE) Process::getCurrentModuleInstanceHandle(); - - WNDCLASSEX wc = { 0 }; - wc.cbSize = sizeof (wc); - wc.lpfnWndProc = wndProc; - wc.cbWndExtra = 4; - wc.hInstance = moduleHandle; - wc.lpszClassName = className.toWideCharPointer(); - - atom = RegisterClassEx (&wc); - jassert (atom != 0); - - hwnd = CreateWindow (getClassNameFromAtom(), messageWindowName, - 0, 0, 0, 0, 0, 0, 0, moduleHandle, 0); - jassert (hwnd != 0); - } - - ~HiddenMessageWindow() - { - DestroyWindow (hwnd); - UnregisterClass (getClassNameFromAtom(), 0); - } - - inline HWND getHWND() const noexcept { return hwnd; } - -private: - ATOM atom; - HWND hwnd; - - LPCTSTR getClassNameFromAtom() noexcept { return (LPCTSTR) (std::uintptr_t) MAKELONG (atom, 0); } -}; - -//============================================================================== -class JuceWindowIdentifier -{ -public: - static bool isJUCEWindow (HWND hwnd) noexcept - { - return GetWindowLongPtr (hwnd, GWLP_USERDATA) == getImprobableWindowNumber(); - } - - static void setAsJUCEWindow (HWND hwnd, bool isJuceWindow) noexcept - { - SetWindowLongPtr (hwnd, GWLP_USERDATA, isJuceWindow ? getImprobableWindowNumber() : 0); - } - -private: - static LONG_PTR getImprobableWindowNumber() noexcept - { - static LONG_PTR number = (LONG_PTR) Random::getSystemRandom().nextInt64(); - return number; - } -}; - -//============================================================================== -class DeviceChangeDetector : private Timer -{ -public: - DeviceChangeDetector (const wchar_t* const name) - : messageWindow (name, (WNDPROC) deviceChangeEventCallback) - { - SetWindowLongPtr (messageWindow.getHWND(), GWLP_USERDATA, (LONG_PTR) this); - } - - virtual ~DeviceChangeDetector() {} - - virtual void systemDeviceChanged() = 0; - - void triggerAsyncDeviceChangeCallback() - { - // We'll pause before sending a message, because on device removal, the OS hasn't always updated - // its device lists correctly at this point. This also helps avoid repeated callbacks. - startTimer (500); - } - -private: - HiddenMessageWindow messageWindow; - - static LRESULT CALLBACK deviceChangeEventCallback (HWND h, const UINT message, - const WPARAM wParam, const LPARAM lParam) - { - if (message == WM_DEVICECHANGE - && (wParam == 0x8000 /*DBT_DEVICEARRIVAL*/ - || wParam == 0x8004 /*DBT_DEVICEREMOVECOMPLETE*/ - || wParam == 0x0007 /*DBT_DEVNODES_CHANGED*/)) - { - ((DeviceChangeDetector*) GetWindowLongPtr (h, GWLP_USERDATA)) - ->triggerAsyncDeviceChangeCallback(); - } - - return DefWindowProc (h, message, wParam, lParam); - } - - void timerCallback() override - { - stopTimer(); - systemDeviceChanged(); - } -}; - -#endif // JUCE_WIN32_HIDDENMESSAGEWINDOW_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp b/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp deleted file mode 100755 index c83f962..0000000 --- a/JuceLibraryCode/modules/juce_events/native/juce_win32_Messaging.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -extern HWND juce_messageWindowHandle; - -typedef bool (*CheckEventBlockedByModalComps) (const MSG&); -CheckEventBlockedByModalComps isEventBlockedByModalComps = nullptr; - -//============================================================================== -namespace WindowsMessageHelpers -{ - const unsigned int specialId = WM_APP + 0x4400; - const unsigned int broadcastId = WM_APP + 0x4403; - - const TCHAR messageWindowName[] = _T("JUCEWindow"); - ScopedPointer messageWindow; - - void dispatchMessageFromLParam (LPARAM lParam) - { - MessageManager::MessageBase* const message = reinterpret_cast (lParam); - - JUCE_TRY - { - message->messageCallback(); - } - JUCE_CATCH_EXCEPTION - - message->decReferenceCount(); - } - - //============================================================================== - LRESULT CALLBACK messageWndProc (HWND h, const UINT message, const WPARAM wParam, const LPARAM lParam) noexcept - { -#ifdef CPL_TRACEGUARD_ENTRYPOINTS - return CPL_TRACEGUARD_START -#endif - if (h == juce_messageWindowHandle) - { - if (message == specialId) - { - // (These are trapped early in our dispatch loop, but must also be checked - // here in case some 3rd-party code is running the dispatch loop). - dispatchMessageFromLParam (lParam); - return (LRESULT)0; - } - - if (message == broadcastId) - { - const ScopedPointer messageString ((String*) lParam); - MessageManager::getInstance()->deliverBroadcastMessage (*messageString); - return (LRESULT)0; - } - - if (message == WM_COPYDATA) - { - const COPYDATASTRUCT* const data = reinterpret_cast (lParam); - - if (data->dwData == broadcastId) - { - const String messageString (CharPointer_UTF32 ((const CharPointer_UTF32::CharType*) data->lpData), - data->cbData / sizeof (CharPointer_UTF32::CharType)); - - PostMessage (juce_messageWindowHandle, broadcastId, 0, (LPARAM) new String (messageString)); - return (LRESULT)0; - } - } - } - - return DefWindowProc (h, message, wParam, lParam); - #ifdef CPL_TRACEGUARD_ENTRYPOINTS - CPL_TRACEGUARD_STOP("JUCE Message window procedure"); - #endif - } - - BOOL CALLBACK broadcastEnumWindowProc (HWND hwnd, LPARAM lParam) - { - if (hwnd != juce_messageWindowHandle) - reinterpret_cast*> (lParam)->add (hwnd); - - return TRUE; - } -} - -//============================================================================== -bool MessageManager::dispatchNextMessageOnSystemQueue (const bool returnIfNoPendingMessages) -{ - using namespace WindowsMessageHelpers; - MSG m; - - if (returnIfNoPendingMessages && ! PeekMessage (&m, (HWND) 0, 0, 0, PM_NOREMOVE)) - return false; - - if (GetMessage (&m, (HWND) 0, 0, 0) >= 0) - { - if (m.message == specialId && m.hwnd == juce_messageWindowHandle) - { - dispatchMessageFromLParam (m.lParam); - } - else if (m.message == WM_QUIT) - { - if (JUCEApplicationBase* const app = JUCEApplicationBase::getInstance()) - app->systemRequestedQuit(); - } - else if (isEventBlockedByModalComps == nullptr || ! isEventBlockedByModalComps (m)) - { - if ((m.message == WM_LBUTTONDOWN || m.message == WM_RBUTTONDOWN) - && ! JuceWindowIdentifier::isJUCEWindow (m.hwnd)) - { - // if it's someone else's window being clicked on, and the focus is - // currently on a juce window, pass the kb focus over.. - HWND currentFocus = GetFocus(); - - if (currentFocus == 0 || JuceWindowIdentifier::isJUCEWindow (currentFocus)) - SetFocus (m.hwnd); - } - - TranslateMessage (&m); - DispatchMessage (&m); - } - } - - return true; -} - -bool MessageManager::postMessageToSystemQueue (MessageManager::MessageBase* const message) -{ - message->incReferenceCount(); - return PostMessage (juce_messageWindowHandle, WindowsMessageHelpers::specialId, 0, (LPARAM) message) != 0; -} - -void MessageManager::broadcastMessage (const String& value) -{ - Array windows; - EnumWindows (&WindowsMessageHelpers::broadcastEnumWindowProc, (LPARAM) &windows); - - const String localCopy (value); - - COPYDATASTRUCT data; - data.dwData = WindowsMessageHelpers::broadcastId; - data.cbData = (localCopy.length() + 1) * sizeof (CharPointer_UTF32::CharType); - data.lpData = (void*) localCopy.toUTF32().getAddress(); - - for (int i = windows.size(); --i >= 0;) - { - HWND hwnd = windows.getUnchecked(i); - - TCHAR windowName[64] = { 0 }; // no need to read longer strings than this - GetWindowText (hwnd, windowName, 63); - - if (String (windowName) == WindowsMessageHelpers::messageWindowName) - { - DWORD_PTR result; - SendMessageTimeout (hwnd, WM_COPYDATA, - (WPARAM) juce_messageWindowHandle, - (LPARAM) &data, - SMTO_BLOCK | SMTO_ABORTIFHUNG, 8000, &result); - } - } -} - -//============================================================================== -void MessageManager::doPlatformSpecificInitialisation() -{ - OleInitialize (0); - - using namespace WindowsMessageHelpers; - messageWindow = new HiddenMessageWindow (messageWindowName, (WNDPROC) messageWndProc); - juce_messageWindowHandle = messageWindow->getHWND(); -} - -void MessageManager::doPlatformSpecificShutdown() -{ - WindowsMessageHelpers::messageWindow = nullptr; - - OleUninitialize(); -} - -//============================================================================== -struct MountedVolumeListChangeDetector::Pimpl : private DeviceChangeDetector -{ - Pimpl (MountedVolumeListChangeDetector& d) : DeviceChangeDetector (L"MountedVolumeList"), owner (d) - { - File::findFileSystemRoots (lastVolumeList); - } - - void systemDeviceChanged() override - { - Array newList; - File::findFileSystemRoots (newList); - - if (lastVolumeList != newList) - { - lastVolumeList = newList; - owner.mountedVolumeListChanged(); - } - } - - MountedVolumeListChangeDetector& owner; - Array lastVolumeList; -}; - -MountedVolumeListChangeDetector::MountedVolumeListChangeDetector() { pimpl = new Pimpl (*this); } -MountedVolumeListChangeDetector::~MountedVolumeListChangeDetector() {} diff --git a/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp b/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp deleted file mode 100755 index 4885e7b..0000000 --- a/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -struct MultiTimerCallback : public Timer -{ - MultiTimerCallback (const int tid, MultiTimer& mt) noexcept - : owner (mt), timerID (tid) - { - } - - void timerCallback() override - { - owner.timerCallback (timerID); - } - - MultiTimer& owner; - const int timerID; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiTimerCallback) -}; - -//============================================================================== -MultiTimer::MultiTimer() noexcept {} -MultiTimer::MultiTimer (const MultiTimer&) noexcept {} - -MultiTimer::~MultiTimer() -{ - const SpinLock::ScopedLockType sl (timerListLock); - timers.clear(); -} - -//============================================================================== -Timer* MultiTimer::getCallback (int timerID) const noexcept -{ - for (int i = timers.size(); --i >= 0;) - { - MultiTimerCallback* const t = static_cast (timers.getUnchecked(i)); - - if (t->timerID == timerID) - return t; - } - - return nullptr; -} - -void MultiTimer::startTimer (const int timerID, const int intervalInMilliseconds) noexcept -{ - const SpinLock::ScopedLockType sl (timerListLock); - - Timer* timer = getCallback (timerID); - - if (timer == nullptr) - timers.add (timer = new MultiTimerCallback (timerID, *this)); - - timer->startTimer (intervalInMilliseconds); -} - -void MultiTimer::stopTimer (const int timerID) noexcept -{ - const SpinLock::ScopedLockType sl (timerListLock); - - if (Timer* const t = getCallback (timerID)) - t->stopTimer(); -} - -bool MultiTimer::isTimerRunning (const int timerID) const noexcept -{ - const SpinLock::ScopedLockType sl (timerListLock); - - if (Timer* const t = getCallback (timerID)) - return t->isTimerRunning(); - - return false; -} - -int MultiTimer::getTimerInterval (const int timerID) const noexcept -{ - const SpinLock::ScopedLockType sl (timerListLock); - - if (Timer* const t = getCallback (timerID)) - return t->getTimerInterval(); - - return 0; -} diff --git a/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h b/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h deleted file mode 100755 index c7fe0e4..0000000 --- a/JuceLibraryCode/modules/juce_events/timers/juce_MultiTimer.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MULTITIMER_H_INCLUDED -#define JUCE_MULTITIMER_H_INCLUDED - - -//============================================================================== -/** - A type of timer class that can run multiple timers with different frequencies, - all of which share a single callback. - - This class is very similar to the Timer class, but allows you run multiple - separate timers, where each one has a unique ID number. The methods in this - class are exactly equivalent to those in Timer, but with the addition of - this ID number. - - To use it, you need to create a subclass of MultiTimer, implementing the - timerCallback() method. Then you can start timers with startTimer(), and - each time the callback is triggered, it passes in the ID of the timer that - caused it. - - @see Timer -*/ -class JUCE_API MultiTimer -{ -protected: - //============================================================================== - /** Creates a MultiTimer. - - When created, no timers are running, so use startTimer() to start things off. - */ - MultiTimer() noexcept; - - /** Creates a copy of another timer. - - Note that this timer will not contain any running timers, even if the one you're - copying from was running. - */ - MultiTimer (const MultiTimer&) noexcept; - -public: - //============================================================================== - /** Destructor. */ - virtual ~MultiTimer(); - - //============================================================================== - /** The user-defined callback routine that actually gets called by each of the - timers that are running. - - It's perfectly ok to call startTimer() or stopTimer() from within this - callback to change the subsequent intervals. - */ - virtual void timerCallback (int timerID) = 0; - - //============================================================================== - /** Starts a timer and sets the length of interval required. - - If the timer is already started, this will reset it, so the - time between calling this method and the next timer callback - will not be less than the interval length passed in. - - @param timerID a unique Id number that identifies the timer to - start. This is the id that will be passed back - to the timerCallback() method when this timer is - triggered - @param intervalInMilliseconds the interval to use (any values less than 1 will be - rounded up to 1) - */ - void startTimer (int timerID, int intervalInMilliseconds) noexcept; - - /** Stops a timer. - - If a timer has been started with the given ID number, it will be cancelled. - No more callbacks will be made for the specified timer after this method returns. - - If this is called from a different thread, any callbacks that may - be currently executing may be allowed to finish before the method - returns. - */ - void stopTimer (int timerID) noexcept; - - //============================================================================== - /** Checks whether a timer has been started for a specified ID. - @returns true if a timer with the given ID is running. - */ - bool isTimerRunning (int timerID) const noexcept; - - /** Returns the interval for a specified timer ID. - @returns the timer's interval in milliseconds if it's running, or 0 if no - timer was running for the ID number specified. - */ - int getTimerInterval (int timerID) const noexcept; - - - //============================================================================== -private: - SpinLock timerListLock; - OwnedArray timers; - - Timer* getCallback (int) const noexcept; - MultiTimer& operator= (const MultiTimer&); -}; - -#endif // JUCE_MULTITIMER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp b/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp deleted file mode 100755 index dfde957..0000000 --- a/JuceLibraryCode/modules/juce_events/timers/juce_Timer.cpp +++ /dev/null @@ -1,358 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class Timer::TimerThread : private Thread, - private DeletedAtShutdown, - private AsyncUpdater -{ -public: - typedef CriticalSection LockType; // (mysteriously, using a SpinLock here causes problems on some XP machines..) - - TimerThread() - : Thread ("Juce Timer"), - firstTimer (nullptr), - callbackNeeded (0) - { - triggerAsyncUpdate(); - } - - ~TimerThread() noexcept - { - stopThread (4000); - - jassert (instance == this || instance == nullptr); - if (instance == this) - instance = nullptr; - } - - void run() override - { - uint32 lastTime = Time::getMillisecondCounter(); - MessageManager::MessageBase::Ptr messageToSend (new CallTimersMessage()); - - while (! threadShouldExit()) - { - const uint32 now = Time::getMillisecondCounter(); - - if (now == lastTime) - { - wait (1); - continue; - } - - const int elapsed = (int) (now >= lastTime ? (now - lastTime) - : (std::numeric_limits::max() - (lastTime - now))); - lastTime = now; - - const int timeUntilFirstTimer = getTimeUntilFirstTimer (elapsed); - - if (timeUntilFirstTimer <= 0) - { - /* If we managed to set the atomic boolean to true then send a message, this is needed - as a memory barrier so the message won't be sent before callbackNeeded is set to true, - but if it fails it means the message-thread changed the value from under us so at least - some processing is happenening and we can just loop around and try again - */ - if (callbackNeeded.compareAndSetBool (1, 0)) - { - messageToSend->post(); - - /* Sometimes our message can get discarded by the OS (e.g. when running as an RTAS - when the app has a modal loop), so this is how long to wait before assuming the - message has been lost and trying again. - */ - const uint32 messageDeliveryTimeout = now + 300; - - while (callbackNeeded.get() != 0) - { - wait (4); - - if (threadShouldExit()) - return; - - if (Time::getMillisecondCounter() > messageDeliveryTimeout) - { - messageToSend->post(); - break; - } - } - } - } - else - { - // don't wait for too long because running this loop also helps keep the - // Time::getApproximateMillisecondTimer value stay up-to-date - wait (jlimit (1, 50, timeUntilFirstTimer)); - } - } - } - - void callTimers() - { - const LockType::ScopedLockType sl (lock); - - while (firstTimer != nullptr && firstTimer->countdownMs <= 0) - { - Timer* const t = firstTimer; - t->countdownMs = t->periodMs; - - removeTimer (t); - addTimer (t); - - const LockType::ScopedUnlockType ul (lock); - - JUCE_TRY - { - t->timerCallback(); - } - JUCE_CATCH_EXCEPTION - } - - /* This is needed as a memory barrier to make sure all processing of current timers is done - before the boolean is set. This set should never fail since if it was false in the first place, - we wouldn't get a message (so it can't be changed from false to true from under us), and if we - get a message then the value is true and the other thread can only set it to true again and - we will get another callback to set it to false. - */ - callbackNeeded.set (0); - } - - void callTimersSynchronously() - { - if (! isThreadRunning()) - { - // (This is relied on by some plugins in cases where the MM has - // had to restart and the async callback never started) - cancelPendingUpdate(); - triggerAsyncUpdate(); - } - - callTimers(); - } - - static inline void add (Timer* const tim) noexcept - { - if (instance == nullptr) - instance = new TimerThread(); - - instance->addTimer (tim); - } - - static inline void remove (Timer* const tim) noexcept - { - if (instance != nullptr) - instance->removeTimer (tim); - } - - static inline void resetCounter (Timer* const tim, const int newCounter) noexcept - { - if (instance != nullptr) - { - tim->countdownMs = newCounter; - tim->periodMs = newCounter; - - if ((tim->next != nullptr && tim->next->countdownMs < tim->countdownMs) - || (tim->previous != nullptr && tim->previous->countdownMs > tim->countdownMs)) - { - instance->removeTimer (tim); - instance->addTimer (tim); - } - } - } - - static TimerThread* instance; - static LockType lock; - -private: - Timer* volatile firstTimer; - Atomic callbackNeeded; - - struct CallTimersMessage : public MessageManager::MessageBase - { - CallTimersMessage() {} - - void messageCallback() override - { - if (instance != nullptr) - instance->callTimers(); - } - }; - - //============================================================================== - void addTimer (Timer* const t) noexcept - { - #if JUCE_DEBUG - // trying to add a timer that's already here - shouldn't get to this point, - // so if you get this assertion, let me know! - jassert (! timerExists (t)); - #endif - - Timer* i = firstTimer; - - if (i == nullptr || i->countdownMs > t->countdownMs) - { - t->next = firstTimer; - firstTimer = t; - } - else - { - while (i->next != nullptr && i->next->countdownMs <= t->countdownMs) - i = i->next; - - jassert (i != nullptr); - - t->next = i->next; - t->previous = i; - i->next = t; - } - - if (t->next != nullptr) - t->next->previous = t; - - jassert ((t->next == nullptr || t->next->countdownMs >= t->countdownMs) - && (t->previous == nullptr || t->previous->countdownMs <= t->countdownMs)); - - notify(); - } - - void removeTimer (Timer* const t) noexcept - { - #if JUCE_DEBUG - // trying to remove a timer that's not here - shouldn't get to this point, - // so if you get this assertion, let me know! - jassert (timerExists (t)); - #endif - - if (t->previous != nullptr) - { - jassert (firstTimer != t); - t->previous->next = t->next; - } - else - { - jassert (firstTimer == t); - firstTimer = t->next; - } - - if (t->next != nullptr) - t->next->previous = t->previous; - - t->next = nullptr; - t->previous = nullptr; - } - - int getTimeUntilFirstTimer (const int numMillisecsElapsed) const - { - const LockType::ScopedLockType sl (lock); - - for (Timer* t = firstTimer; t != nullptr; t = t->next) - t->countdownMs -= numMillisecsElapsed; - - return firstTimer != nullptr ? firstTimer->countdownMs : 1000; - } - - void handleAsyncUpdate() override - { - startThread (7); - } - - #if JUCE_DEBUG - bool timerExists (Timer* const t) const noexcept - { - for (Timer* tt = firstTimer; tt != nullptr; tt = tt->next) - if (tt == t) - return true; - - return false; - } - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TimerThread) -}; - -Timer::TimerThread* Timer::TimerThread::instance = nullptr; -Timer::TimerThread::LockType Timer::TimerThread::lock; - -//============================================================================== -Timer::Timer() noexcept - : countdownMs (0), - periodMs (0), - previous (nullptr), - next (nullptr) -{ -} - -Timer::Timer (const Timer&) noexcept - : countdownMs (0), - periodMs (0), - previous (nullptr), - next (nullptr) -{ -} - -Timer::~Timer() -{ - stopTimer(); -} - -void Timer::startTimer (const int interval) noexcept -{ - const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); - - if (periodMs == 0) - { - countdownMs = interval; - periodMs = jmax (1, interval); - TimerThread::add (this); - } - else - { - TimerThread::resetCounter (this, interval); - } -} - -void Timer::startTimerHz (int timerFrequencyHz) noexcept -{ - if (timerFrequencyHz > 0) - startTimer (1000 / timerFrequencyHz); - else - stopTimer(); -} - -void Timer::stopTimer() noexcept -{ - const TimerThread::LockType::ScopedLockType sl (TimerThread::lock); - - if (periodMs > 0) - { - TimerThread::remove (this); - periodMs = 0; - } -} - -void JUCE_CALLTYPE Timer::callPendingTimersSynchronously() -{ - if (TimerThread::instance != nullptr) - TimerThread::instance->callTimersSynchronously(); -} diff --git a/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h b/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h deleted file mode 100755 index 57b0ce8..0000000 --- a/JuceLibraryCode/modules/juce_events/timers/juce_Timer.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_TIMER_H_INCLUDED -#define JUCE_TIMER_H_INCLUDED - - -//============================================================================== -/** - Makes repeated callbacks to a virtual method at a specified time interval. - - A Timer's timerCallback() method will be repeatedly called at a given - interval. When you create a Timer object, it will do nothing until the - startTimer() method is called, which will cause the message thread to - start making callbacks at the specified interval, until stopTimer() is called - or the object is deleted. - - The time interval isn't guaranteed to be precise to any more than maybe - 10-20ms, and the intervals may end up being much longer than requested if the - system is busy. Because the callbacks are made by the main message thread, - anything that blocks the message queue for a period of time will also prevent - any timers from running until it can carry on. - - If you need to have a single callback that is shared by multiple timers with - different frequencies, then the MultiTimer class allows you to do that - its - structure is very similar to the Timer class, but contains multiple timers - internally, each one identified by an ID number. - - @see HighResolutionTimer, MultiTimer -*/ -class JUCE_API Timer -{ -protected: - //============================================================================== - /** Creates a Timer. - - When created, the timer is stopped, so use startTimer() to get it going. - */ - Timer() noexcept; - - /** Creates a copy of another timer. - - Note that this timer won't be started, even if the one you're copying - is running. - */ - Timer (const Timer& other) noexcept; - -public: - //============================================================================== - /** Destructor. */ - virtual ~Timer(); - - //============================================================================== - /** The user-defined callback routine that actually gets called periodically. - - It's perfectly ok to call startTimer() or stopTimer() from within this - callback to change the subsequent intervals. - */ - virtual void timerCallback() = 0; - - //============================================================================== - /** Starts the timer and sets the length of interval required. - - If the timer is already started, this will reset it, so the - time between calling this method and the next timer callback - will not be less than the interval length passed in. - - @param intervalInMilliseconds the interval to use (any values less than 1 will be - rounded up to 1) - */ - void startTimer (int intervalInMilliseconds) noexcept; - - /** Starts the timer with an interval specified in Hertz. - This is effectively the same as calling startTimer (1000 / timerFrequencyHz). - */ - void startTimerHz (int timerFrequencyHz) noexcept; - - /** Stops the timer. - - No more callbacks will be made after this method returns. - - If this is called from a different thread, any callbacks that may - be currently executing may be allowed to finish before the method - returns. - */ - void stopTimer() noexcept; - - //============================================================================== - /** Returns true if the timer is currently running. */ - bool isTimerRunning() const noexcept { return periodMs > 0; } - - /** Returns the timer's interval. - @returns the timer's interval in milliseconds if it's running, or 0 if it's not. - */ - int getTimerInterval() const noexcept { return periodMs; } - - - //============================================================================== - /** For internal use only: invokes any timers that need callbacks. - Don't call this unless you really know what you're doing! - */ - static void JUCE_CALLTYPE callPendingTimersSynchronously(); - -private: - class TimerThread; - friend class TimerThread; - int countdownMs, periodMs; - Timer* previous; - Timer* next; - - Timer& operator= (const Timer&); -}; - -#endif // JUCE_TIMER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp deleted file mode 100755 index aaf9468..0000000 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.cpp +++ /dev/null @@ -1,444 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace ColourHelpers -{ - static uint8 floatToUInt8 (const float n) noexcept - { - return n <= 0.0f ? 0 : (n >= 1.0f ? 255 : static_cast (n * 255.996f)); - } - - //============================================================================== - struct HSB - { - HSB (Colour col) noexcept - { - const int r = col.getRed(); - const int g = col.getGreen(); - const int b = col.getBlue(); - - const int hi = jmax (r, g, b); - const int lo = jmin (r, g, b); - - if (hi != 0) - { - saturation = (hi - lo) / (float) hi; - - if (saturation > 0) - { - const float invDiff = 1.0f / (hi - lo); - - const float red = (hi - r) * invDiff; - const float green = (hi - g) * invDiff; - const float blue = (hi - b) * invDiff; - - if (r == hi) - hue = blue - green; - else if (g == hi) - hue = 2.0f + red - blue; - else - hue = 4.0f + green - red; - - hue *= 1.0f / 6.0f; - - if (hue < 0) - ++hue; - } - else - { - hue = 0; - } - } - else - { - saturation = hue = 0; - } - - brightness = hi / 255.0f; - } - - Colour toColour (Colour original) const noexcept - { - return Colour (hue, saturation, brightness, original.getAlpha()); - } - - static PixelARGB toRGB (float h, float s, float v, const uint8 alpha) noexcept - { - v = jlimit (0.0f, 255.0f, v * 255.0f); - const uint8 intV = (uint8) roundToInt (v); - - if (s <= 0) - return PixelARGB (alpha, intV, intV, intV); - - s = jmin (1.0f, s); - h = (h - std::floor (h)) * 6.0f + 0.00001f; // need a small adjustment to compensate for rounding errors - const float f = h - std::floor (h); - const uint8 x = (uint8) roundToInt (v * (1.0f - s)); - - if (h < 1.0f) return PixelARGB (alpha, intV, (uint8) roundToInt (v * (1.0f - (s * (1.0f - f)))), x); - if (h < 2.0f) return PixelARGB (alpha, (uint8) roundToInt (v * (1.0f - s * f)), intV, x); - if (h < 3.0f) return PixelARGB (alpha, x, intV, (uint8) roundToInt (v * (1.0f - (s * (1.0f - f))))); - if (h < 4.0f) return PixelARGB (alpha, x, (uint8) roundToInt (v * (1.0f - s * f)), intV); - if (h < 5.0f) return PixelARGB (alpha, (uint8) roundToInt (v * (1.0f - (s * (1.0f - f)))), x, intV); - return PixelARGB (alpha, intV, x, (uint8) roundToInt (v * (1.0f - s * f))); - } - - float hue, saturation, brightness; - }; - - //============================================================================== - struct YIQ - { - YIQ (Colour c) noexcept - { - const float r = c.getFloatRed(); - const float g = c.getFloatGreen(); - const float b = c.getFloatBlue(); - - y = 0.2999f * r + 0.5870f * g + 0.1140f * b; - i = 0.5957f * r - 0.2744f * g - 0.3212f * b; - q = 0.2114f * r - 0.5225f * g - 0.3113f * b; - alpha = c.getFloatAlpha(); - } - - Colour toColour() const noexcept - { - return Colour::fromFloatRGBA (y + 0.9563f * i + 0.6210f * q, - y - 0.2721f * i - 0.6474f * q, - y - 1.1070f * i + 1.7046f * q, - alpha); - } - - float y, i, q, alpha; - }; -} - -//============================================================================== -Colour::Colour() noexcept - : argb (0) -{ -} - -Colour::Colour (const Colour& other) noexcept - : argb (other.argb) -{ -} - -Colour& Colour::operator= (const Colour& other) noexcept -{ - argb = other.argb; - return *this; -} - -bool Colour::operator== (const Colour& other) const noexcept { return argb.getARGB() == other.argb.getARGB(); } -bool Colour::operator!= (const Colour& other) const noexcept { return argb.getARGB() != other.argb.getARGB(); } - -//============================================================================== -Colour::Colour (const uint32 col) noexcept : argb (col) -{ -} - -Colour::Colour (const uint8 red, const uint8 green, const uint8 blue) noexcept -{ - argb.setARGB (0xff, red, green, blue); -} - -Colour Colour::fromRGB (const uint8 red, const uint8 green, const uint8 blue) noexcept -{ - return Colour (red, green, blue); -} - -Colour::Colour (const uint8 red, const uint8 green, const uint8 blue, const uint8 alpha) noexcept -{ - argb.setARGB (alpha, red, green, blue); -} - -Colour Colour::fromRGBA (const uint8 red, const uint8 green, const uint8 blue, const uint8 alpha) noexcept -{ - return Colour (red, green, blue, alpha); -} - -Colour::Colour (const uint8 red, const uint8 green, const uint8 blue, const float alpha) noexcept -{ - argb.setARGB (ColourHelpers::floatToUInt8 (alpha), red, green, blue); -} - -Colour Colour::fromFloatRGBA (const float red, const float green, const float blue, const float alpha) noexcept -{ - return Colour (ColourHelpers::floatToUInt8 (red), - ColourHelpers::floatToUInt8 (green), - ColourHelpers::floatToUInt8 (blue), alpha); -} - -Colour::Colour (const float hue, const float saturation, const float brightness, const float alpha) noexcept - : argb (ColourHelpers::HSB::toRGB (hue, saturation, brightness, ColourHelpers::floatToUInt8 (alpha))) -{ -} - -Colour Colour::fromHSV (const float hue, const float saturation, const float brightness, const float alpha) noexcept -{ - return Colour (hue, saturation, brightness, alpha); -} - -Colour::Colour (const float hue, const float saturation, const float brightness, const uint8 alpha) noexcept - : argb (ColourHelpers::HSB::toRGB (hue, saturation, brightness, alpha)) -{ -} - -Colour::~Colour() noexcept -{ -} - -//============================================================================== -const PixelARGB Colour::getPixelARGB() const noexcept -{ - PixelARGB p (argb); - p.premultiply(); - return p; -} - -uint32 Colour::getARGB() const noexcept -{ - return argb.getARGB(); -} - -//============================================================================== -bool Colour::isTransparent() const noexcept -{ - return getAlpha() == 0; -} - -bool Colour::isOpaque() const noexcept -{ - return getAlpha() == 0xff; -} - -Colour Colour::withAlpha (const uint8 newAlpha) const noexcept -{ - PixelARGB newCol (argb); - newCol.setAlpha (newAlpha); - return Colour (newCol.getARGB()); -} - -Colour Colour::withAlpha (const float newAlpha) const noexcept -{ - jassert (newAlpha >= 0 && newAlpha <= 1.0f); - - PixelARGB newCol (argb); - newCol.setAlpha (ColourHelpers::floatToUInt8 (newAlpha)); - return Colour (newCol.getARGB()); -} - -Colour Colour::withMultipliedAlpha (const float alphaMultiplier) const noexcept -{ - jassert (alphaMultiplier >= 0); - - PixelARGB newCol (argb); - newCol.setAlpha ((uint8) jmin (0xff, roundToInt (alphaMultiplier * newCol.getAlpha()))); - return Colour (newCol.getARGB()); -} - -//============================================================================== -Colour Colour::overlaidWith (Colour src) const noexcept -{ - const int destAlpha = getAlpha(); - - if (destAlpha <= 0) - return src; - - const int invA = 0xff - (int) src.getAlpha(); - const int resA = 0xff - (((0xff - destAlpha) * invA) >> 8); - - if (resA <= 0) - return *this; - - const int da = (invA * destAlpha) / resA; - - return Colour ((uint8) (src.getRed() + ((((int) getRed() - src.getRed()) * da) >> 8)), - (uint8) (src.getGreen() + ((((int) getGreen() - src.getGreen()) * da) >> 8)), - (uint8) (src.getBlue() + ((((int) getBlue() - src.getBlue()) * da) >> 8)), - (uint8) resA); -} - -Colour Colour::interpolatedWith (Colour other, float proportionOfOther) const noexcept -{ - if (proportionOfOther <= 0) - return *this; - - if (proportionOfOther >= 1.0f) - return other; - - PixelARGB c1 (getPixelARGB()); - const PixelARGB c2 (other.getPixelARGB()); - c1.tween (c2, (uint32) roundToInt (proportionOfOther * 255.0f)); - c1.unpremultiply(); - - return Colour (c1.getARGB()); -} - -//============================================================================== -float Colour::getFloatRed() const noexcept { return getRed() / 255.0f; } -float Colour::getFloatGreen() const noexcept { return getGreen() / 255.0f; } -float Colour::getFloatBlue() const noexcept { return getBlue() / 255.0f; } -float Colour::getFloatAlpha() const noexcept { return getAlpha() / 255.0f; } - -//============================================================================== -void Colour::getHSB (float& h, float& s, float& v) const noexcept -{ - const ColourHelpers::HSB hsb (*this); - h = hsb.hue; - s = hsb.saturation; - v = hsb.brightness; -} - -float Colour::getHue() const noexcept { return ColourHelpers::HSB (*this).hue; } -float Colour::getSaturation() const noexcept { return ColourHelpers::HSB (*this).saturation; } -float Colour::getBrightness() const noexcept { return ColourHelpers::HSB (*this).brightness; } - -Colour Colour::withHue (float h) const noexcept { ColourHelpers::HSB hsb (*this); hsb.hue = h; return hsb.toColour (*this); } -Colour Colour::withSaturation (float s) const noexcept { ColourHelpers::HSB hsb (*this); hsb.saturation = s; return hsb.toColour (*this); } -Colour Colour::withBrightness (float v) const noexcept { ColourHelpers::HSB hsb (*this); hsb.brightness = v; return hsb.toColour (*this); } - -float Colour::getPerceivedBrightness() const noexcept -{ - return std::sqrt (0.241f * square (getFloatRed()) - + 0.691f * square (getFloatGreen()) - + 0.068f * square (getFloatBlue())); -} - -//============================================================================== -Colour Colour::withRotatedHue (const float amountToRotate) const noexcept -{ - ColourHelpers::HSB hsb (*this); - hsb.hue += amountToRotate; - return hsb.toColour (*this); -} - -Colour Colour::withMultipliedSaturation (const float amount) const noexcept -{ - ColourHelpers::HSB hsb (*this); - hsb.saturation = jmin (1.0f, hsb.saturation * amount); - return hsb.toColour (*this); -} - -Colour Colour::withMultipliedBrightness (const float amount) const noexcept -{ - ColourHelpers::HSB hsb (*this); - hsb.brightness = jmin (1.0f, hsb.brightness * amount); - return hsb.toColour (*this); -} - -//============================================================================== -Colour Colour::brighter (float amount) const noexcept -{ - amount = 1.0f / (1.0f + amount); - - return Colour ((uint8) (255 - (amount * (255 - getRed()))), - (uint8) (255 - (amount * (255 - getGreen()))), - (uint8) (255 - (amount * (255 - getBlue()))), - getAlpha()); -} - -Colour Colour::darker (float amount) const noexcept -{ - amount = 1.0f / (1.0f + amount); - - return Colour ((uint8) (amount * getRed()), - (uint8) (amount * getGreen()), - (uint8) (amount * getBlue()), - getAlpha()); -} - -//============================================================================== -Colour Colour::greyLevel (const float brightness) noexcept -{ - const uint8 level = ColourHelpers::floatToUInt8 (brightness); - return Colour (level, level, level); -} - -//============================================================================== -Colour Colour::contrasting (const float amount) const noexcept -{ - return overlaidWith ((getPerceivedBrightness() >= 0.5f - ? Colours::black - : Colours::white).withAlpha (amount)); -} - -Colour Colour::contrasting (Colour target, float minContrast) const noexcept -{ - const ColourHelpers::YIQ bg (*this); - ColourHelpers::YIQ fg (target); - - if (std::abs (bg.y - fg.y) >= minContrast) - return target; - - const float y1 = jmax (0.0f, bg.y - minContrast); - const float y2 = jmin (1.0f, bg.y + minContrast); - fg.y = (std::abs (y1 - bg.y) > std::abs (y2 - bg.y)) ? y1 : y2; - - return fg.toColour(); -} - -Colour Colour::contrasting (Colour colour1, - Colour colour2) noexcept -{ - const float b1 = colour1.getPerceivedBrightness(); - const float b2 = colour2.getPerceivedBrightness(); - float best = 0.0f; - float bestDist = 0.0f; - - for (float i = 0.0f; i < 1.0f; i += 0.02f) - { - const float d1 = std::abs (i - b1); - const float d2 = std::abs (i - b2); - const float dist = jmin (d1, d2, 1.0f - d1, 1.0f - d2); - - if (dist > bestDist) - { - best = i; - bestDist = dist; - } - } - - return colour1.overlaidWith (colour2.withMultipliedAlpha (0.5f)) - .withBrightness (best); -} - -//============================================================================== -String Colour::toString() const -{ - return String::toHexString ((int) argb.getARGB()); -} - -Colour Colour::fromString (StringRef encodedColourString) -{ - return Colour ((uint32) CharacterFunctions::HexParser::parse (encodedColourString.text)); -} - -String Colour::toDisplayString (const bool includeAlphaValue) const -{ - return String::toHexString ((int) (argb.getARGB() & (includeAlphaValue ? 0xffffffff : 0xffffff))) - .paddedLeft ('0', includeAlphaValue ? 8 : 6) - .toUpperCase(); -} diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h deleted file mode 100755 index 4d84504..0000000 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colour.h +++ /dev/null @@ -1,360 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_COLOUR_H_INCLUDED -#define JUCE_COLOUR_H_INCLUDED - - -//============================================================================== -/** - Represents a colour, also including a transparency value. - - The colour is stored internally as unsigned 8-bit red, green, blue and alpha values. -*/ -class JUCE_API Colour -{ -public: - //============================================================================== - /** Creates a transparent black colour. */ - Colour() noexcept; - - /** Creates a copy of another Colour object. */ - Colour (const Colour& other) noexcept; - - /** Creates a colour from a 32-bit ARGB value. - - The format of this number is: - ((alpha << 24) | (red << 16) | (green << 8) | blue). - - All components in the range 0x00 to 0xff. - An alpha of 0x00 is completely transparent, alpha of 0xff is opaque. - - @see getPixelARGB - */ - explicit Colour (uint32 argb) noexcept; - - /** Creates an opaque colour using 8-bit red, green and blue values */ - Colour (uint8 red, - uint8 green, - uint8 blue) noexcept; - - /** Creates an opaque colour using 8-bit red, green and blue values */ - static Colour fromRGB (uint8 red, - uint8 green, - uint8 blue) noexcept; - - /** Creates a colour using 8-bit red, green, blue and alpha values. */ - Colour (uint8 red, - uint8 green, - uint8 blue, - uint8 alpha) noexcept; - - /** Creates a colour using 8-bit red, green, blue and alpha values. */ - static Colour fromRGBA (uint8 red, - uint8 green, - uint8 blue, - uint8 alpha) noexcept; - - /** Creates a colour from 8-bit red, green, and blue values, and a floating-point alpha. - - Alpha of 0.0 is transparent, alpha of 1.0f is opaque. - Values outside the valid range will be clipped. - */ - Colour (uint8 red, - uint8 green, - uint8 blue, - float alpha) noexcept; - - /** Creates a colour using floating point red, green, blue and alpha values. - Numbers outside the range 0..1 will be clipped. - */ - static Colour fromFloatRGBA (float red, - float green, - float blue, - float alpha) noexcept; - - /** Creates a colour using floating point hue, saturation and brightness values, and an 8-bit alpha. - - The floating point values must be between 0.0 and 1.0. - An alpha of 0x00 is completely transparent, alpha of 0xff is opaque. - Values outside the valid range will be clipped. - */ - Colour (float hue, - float saturation, - float brightness, - uint8 alpha) noexcept; - - /** Creates a colour using floating point hue, saturation, brightness and alpha values. - - All values must be between 0.0 and 1.0. - Numbers outside the valid range will be clipped. - */ - Colour (float hue, - float saturation, - float brightness, - float alpha) noexcept; - - /** Creates a colour using floating point hue, saturation and brightness values, and an 8-bit alpha. - - The floating point values must be between 0.0 and 1.0. - An alpha of 0x00 is completely transparent, alpha of 0xff is opaque. - Values outside the valid range will be clipped. - */ - static Colour fromHSV (float hue, - float saturation, - float brightness, - float alpha) noexcept; - - /** Destructor. */ - ~Colour() noexcept; - - /** Copies another Colour object. */ - Colour& operator= (const Colour& other) noexcept; - - /** Compares two colours. */ - bool operator== (const Colour& other) const noexcept; - /** Compares two colours. */ - bool operator!= (const Colour& other) const noexcept; - - //============================================================================== - /** Returns the red component of this colour. - @returns a value between 0x00 and 0xff. - */ - uint8 getRed() const noexcept { return argb.getRed(); } - - /** Returns the green component of this colour. - @returns a value between 0x00 and 0xff. - */ - uint8 getGreen() const noexcept { return argb.getGreen(); } - - /** Returns the blue component of this colour. - @returns a value between 0x00 and 0xff. - */ - uint8 getBlue() const noexcept { return argb.getBlue(); } - - /** Returns the red component of this colour as a floating point value. - @returns a value between 0.0 and 1.0 - */ - float getFloatRed() const noexcept; - - /** Returns the green component of this colour as a floating point value. - @returns a value between 0.0 and 1.0 - */ - float getFloatGreen() const noexcept; - - /** Returns the blue component of this colour as a floating point value. - @returns a value between 0.0 and 1.0 - */ - float getFloatBlue() const noexcept; - - /** Returns a premultiplied ARGB pixel object that represents this colour. - */ - const PixelARGB getPixelARGB() const noexcept; - - /** Returns a 32-bit integer that represents this colour. - - The format of this number is: - ((alpha << 24) | (red << 16) | (green << 16) | blue). - */ - uint32 getARGB() const noexcept; - - //============================================================================== - /** Returns the colour's alpha (opacity). - - Alpha of 0x00 is completely transparent, 0xff is completely opaque. - */ - uint8 getAlpha() const noexcept { return argb.getAlpha(); } - - /** Returns the colour's alpha (opacity) as a floating point value. - - Alpha of 0.0 is completely transparent, 1.0 is completely opaque. - */ - float getFloatAlpha() const noexcept; - - /** Returns true if this colour is completely opaque. - - Equivalent to (getAlpha() == 0xff). - */ - bool isOpaque() const noexcept; - - /** Returns true if this colour is completely transparent. - - Equivalent to (getAlpha() == 0x00). - */ - bool isTransparent() const noexcept; - - /** Returns a colour that's the same colour as this one, but with a new alpha value. */ - Colour withAlpha (uint8 newAlpha) const noexcept; - - /** Returns a colour that's the same colour as this one, but with a new alpha value. */ - Colour withAlpha (float newAlpha) const noexcept; - - /** Returns a colour that's the same colour as this one, but with a modified alpha value. - The new colour's alpha will be this object's alpha multiplied by the value passed-in. - */ - Colour withMultipliedAlpha (float alphaMultiplier) const noexcept; - - //============================================================================== - /** Returns a colour that is the result of alpha-compositing a new colour over this one. - If the foreground colour is semi-transparent, it is blended onto this colour accordingly. - */ - Colour overlaidWith (Colour foregroundColour) const noexcept; - - /** Returns a colour that lies somewhere between this one and another. - If amountOfOther is zero, the result is 100% this colour, if amountOfOther - is 1.0, the result is 100% of the other colour. - */ - Colour interpolatedWith (Colour other, float proportionOfOther) const noexcept; - - //============================================================================== - /** Returns the colour's hue component. - The value returned is in the range 0.0 to 1.0 - */ - float getHue() const noexcept; - - /** Returns the colour's saturation component. - The value returned is in the range 0.0 to 1.0 - */ - float getSaturation() const noexcept; - - /** Returns the colour's brightness component. - The value returned is in the range 0.0 to 1.0 - */ - float getBrightness() const noexcept; - - /** Returns a skewed brightness value, adjusted to better reflect the way the human - eye responds to different colour channels. This makes it better than getBrightness() - for comparing differences in brightness. - */ - float getPerceivedBrightness() const noexcept; - - /** Returns the colour's hue, saturation and brightness components all at once. - The values returned are in the range 0.0 to 1.0 - */ - void getHSB (float& hue, - float& saturation, - float& brightness) const noexcept; - - //============================================================================== - /** Returns a copy of this colour with a different hue. */ - Colour withHue (float newHue) const noexcept; - - /** Returns a copy of this colour with a different saturation. */ - Colour withSaturation (float newSaturation) const noexcept; - - /** Returns a copy of this colour with a different brightness. - @see brighter, darker, withMultipliedBrightness - */ - Colour withBrightness (float newBrightness) const noexcept; - - /** Returns a copy of this colour with it hue rotated. - - The new colour's hue is ((this->getHue() + amountToRotate) % 1.0) - - @see brighter, darker, withMultipliedBrightness - */ - Colour withRotatedHue (float amountToRotate) const noexcept; - - /** Returns a copy of this colour with its saturation multiplied by the given value. - - The new colour's saturation is (this->getSaturation() * multiplier) - (the result is clipped to legal limits). - */ - Colour withMultipliedSaturation (float multiplier) const noexcept; - - /** Returns a copy of this colour with its brightness multiplied by the given value. - - The new colour's saturation is (this->getBrightness() * multiplier) - (the result is clipped to legal limits). - */ - Colour withMultipliedBrightness (float amount) const noexcept; - - //============================================================================== - /** Returns a brighter version of this colour. - - @param amountBrighter how much brighter to make it - a value from 0 to 1.0 where 0 is - unchanged, and higher values make it brighter - @see withMultipliedBrightness - */ - Colour brighter (float amountBrighter = 0.4f) const noexcept; - - /** Returns a darker version of this colour. - - @param amountDarker how much darker to make it - a value from 0 to 1.0 where 0 is - unchanged, and higher values make it darker - @see withMultipliedBrightness - */ - Colour darker (float amountDarker = 0.4f) const noexcept; - - //============================================================================== - /** Returns a colour that will be clearly visible against this colour. - - The amount parameter indicates how contrasting the new colour should - be, so e.g. Colours::black.contrasting (0.1f) will return a colour - that's just a little bit lighter; Colours::black.contrasting (1.0f) will - return white; Colours::white.contrasting (1.0f) will return black, etc. - */ - Colour contrasting (float amount = 1.0f) const noexcept; - - /** Returns a colour that is as close as possible to a target colour whilst - still being in contrast to this one. - - The colour that is returned will be the targetColour, but with its luminosity - nudged up or down so that it differs from the luminosity of this colour - by at least the amount specified by minLuminosityDiff. - */ - Colour contrasting (Colour targetColour, float minLuminosityDiff) const noexcept; - - /** Returns a colour that contrasts against two colours. - Looks for a colour that contrasts with both of the colours passed-in. - Handy for things like choosing a highlight colour in text editors, etc. - */ - static Colour contrasting (Colour colour1, - Colour colour2) noexcept; - - //============================================================================== - /** Returns an opaque shade of grey. - @param brightness the level of grey to return - 0 is black, 1.0 is white - */ - static Colour greyLevel (float brightness) noexcept; - - //============================================================================== - /** Returns a stringified version of this colour. - The string can be turned back into a colour using the fromString() method. - */ - String toString() const; - - /** Reads the colour from a string that was created with toString(). */ - static Colour fromString (StringRef encodedColourString); - - /** Returns the colour as a hex string in the form RRGGBB or AARRGGBB. */ - String toDisplayString (bool includeAlphaValue) const; - -private: - //============================================================================== - PixelARGB argb; -}; - - -#endif // JUCE_COLOUR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp b/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp deleted file mode 100755 index 75d1712..0000000 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ColourGradient::ColourGradient() noexcept -{ - #if JUCE_DEBUG - point1.setX (987654.0f); - #define JUCE_COLOURGRADIENT_CHECK_COORDS_INITIALISED jassert (point1.x != 987654.0f); - #else - #define JUCE_COLOURGRADIENT_CHECK_COORDS_INITIALISED - #endif -} - -ColourGradient::ColourGradient (Colour colour1, const float x1_, const float y1_, - Colour colour2, const float x2_, const float y2_, - const bool isRadial_) - : point1 (x1_, y1_), - point2 (x2_, y2_), - isRadial (isRadial_) -{ - colours.add (ColourPoint (0.0, colour1)); - colours.add (ColourPoint (1.0, colour2)); -} - -ColourGradient::~ColourGradient() -{ -} - -bool ColourGradient::operator== (const ColourGradient& other) const noexcept -{ - return point1 == other.point1 && point2 == other.point2 - && isRadial == other.isRadial - && colours == other.colours; -} - -bool ColourGradient::operator!= (const ColourGradient& other) const noexcept -{ - return ! operator== (other); -} - -//============================================================================== -void ColourGradient::clearColours() -{ - colours.clear(); -} - -int ColourGradient::addColour (const double proportionAlongGradient, Colour colour) -{ - // must be within the two end-points - jassert (proportionAlongGradient >= 0 && proportionAlongGradient <= 1.0); - - const double pos = jlimit (0.0, 1.0, proportionAlongGradient); - - int i; - for (i = 0; i < colours.size(); ++i) - if (colours.getReference(i).position > pos) - break; - - colours.insert (i, ColourPoint (pos, colour)); - return i; -} - -void ColourGradient::removeColour (int index) -{ - jassert (index > 0 && index < colours.size() - 1); - colours.remove (index); -} - -void ColourGradient::multiplyOpacity (const float multiplier) noexcept -{ - for (int i = 0; i < colours.size(); ++i) - { - Colour& c = colours.getReference(i).colour; - c = c.withMultipliedAlpha (multiplier); - } -} - -//============================================================================== -int ColourGradient::getNumColours() const noexcept -{ - return colours.size(); -} - -double ColourGradient::getColourPosition (const int index) const noexcept -{ - if (isPositiveAndBelow (index, colours.size())) - return colours.getReference (index).position; - - return 0; - } - -Colour ColourGradient::getColour (const int index) const noexcept -{ - if (isPositiveAndBelow (index, colours.size())) - return colours.getReference (index).colour; - - return Colour(); -} - -void ColourGradient::setColour (int index, Colour newColour) noexcept -{ - if (isPositiveAndBelow (index, colours.size())) - colours.getReference (index).colour = newColour; -} - -Colour ColourGradient::getColourAtPosition (const double position) const noexcept -{ - jassert (colours.getReference(0).position == 0); // the first colour specified has to go at position 0 - - if (position <= 0 || colours.size() <= 1) - return colours.getReference(0).colour; - - int i = colours.size() - 1; - while (position < colours.getReference(i).position) - --i; - - const ColourPoint& p1 = colours.getReference (i); - - if (i >= colours.size() - 1) - return p1.colour; - - const ColourPoint& p2 = colours.getReference (i + 1); - - return p1.colour.interpolatedWith (p2.colour, (float) ((position - p1.position) / (p2.position - p1.position))); -} - -//============================================================================== -void ColourGradient::createLookupTable (PixelARGB* const lookupTable, const int numEntries) const noexcept -{ - JUCE_COLOURGRADIENT_CHECK_COORDS_INITIALISED // Trying to use this object without setting its coordinates? - jassert (colours.size() >= 2); - jassert (numEntries > 0); - jassert (colours.getReference(0).position == 0); // The first colour specified has to go at position 0 - - PixelARGB pix1 (colours.getReference (0).colour.getPixelARGB()); - int index = 0; - - for (int j = 1; j < colours.size(); ++j) - { - const ColourPoint& p = colours.getReference (j); - const int numToDo = roundToInt (p.position * (numEntries - 1)) - index; - const PixelARGB pix2 (p.colour.getPixelARGB()); - - for (int i = 0; i < numToDo; ++i) - { - jassert (index >= 0 && index < numEntries); - - lookupTable[index] = pix1; - lookupTable[index].tween (pix2, (uint32) ((i << 8) / numToDo)); - ++index; - } - - pix1 = pix2; - } - - while (index < numEntries) - lookupTable [index++] = pix1; -} - -int ColourGradient::createLookupTable (const AffineTransform& transform, HeapBlock & lookupTable) const -{ - JUCE_COLOURGRADIENT_CHECK_COORDS_INITIALISED // Trying to use this object without setting its coordinates? - jassert (colours.size() >= 2); - - const int numEntries = jlimit (1, jmax (1, (colours.size() - 1) << 8), - 3 * (int) point1.transformedBy (transform) - .getDistanceFrom (point2.transformedBy (transform))); - lookupTable.malloc ((size_t) numEntries); - createLookupTable (lookupTable, numEntries); - return numEntries; -} - -bool ColourGradient::isOpaque() const noexcept -{ - for (int i = 0; i < colours.size(); ++i) - if (! colours.getReference(i).colour.isOpaque()) - return false; - - return true; -} - -bool ColourGradient::isInvisible() const noexcept -{ - for (int i = 0; i < colours.size(); ++i) - if (! colours.getReference(i).colour.isTransparent()) - return false; - - return true; -} - -bool ColourGradient::ColourPoint::operator== (const ColourPoint& other) const noexcept -{ - return position == other.position && colour == other.colour; -} - -bool ColourGradient::ColourPoint::operator!= (const ColourPoint& other) const noexcept -{ - return position != other.position || colour != other.colour; -} diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h b/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h deleted file mode 100755 index 73e6631..0000000 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_ColourGradient.h +++ /dev/null @@ -1,181 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_COLOURGRADIENT_H_INCLUDED -#define JUCE_COLOURGRADIENT_H_INCLUDED - - -//============================================================================== -/** - Describes the layout and colours that should be used to paint a colour gradient. - - @see Graphics::setGradientFill -*/ -class JUCE_API ColourGradient -{ -public: - //============================================================================== - /** Creates a gradient object. - - (x1, y1) is the location to draw with colour1. Likewise (x2, y2) is where - colour2 should be. In between them there's a gradient. - - If isRadial is true, the colours form a circular gradient with (x1, y1) at - its centre. - - The alpha transparencies of the colours are used, so note that - if you blend from transparent to a solid colour, the RGB of the transparent - colour will become visible in parts of the gradient. e.g. blending - from Colour::transparentBlack to Colours::white will produce a - muddy grey colour midway, but Colour::transparentWhite to Colours::white - will be white all the way across. - - @see ColourGradient - */ - ColourGradient (Colour colour1, float x1, float y1, - Colour colour2, float x2, float y2, - bool isRadial); - - /** Creates an uninitialised gradient. - - If you use this constructor instead of the other one, be sure to set all the - object's public member variables before using it! - */ - ColourGradient() noexcept; - - /** Destructor */ - ~ColourGradient(); - - //============================================================================== - /** Removes any colours that have been added. - - This will also remove any start and end colours, so the gradient won't work. You'll - need to add more colours with addColour(). - */ - void clearColours(); - - /** Adds a colour at a point along the length of the gradient. - - This allows the gradient to go through a spectrum of colours, instead of just a - start and end colour. - - @param proportionAlongGradient a value between 0 and 1.0, which is the proportion - of the distance along the line between the two points - at which the colour should occur. - @param colour the colour that should be used at this point - @returns the index at which the new point was added - */ - int addColour (double proportionAlongGradient, - Colour colour); - - /** Removes one of the colours from the gradient. */ - void removeColour (int index); - - /** Multiplies the alpha value of all the colours by the given scale factor */ - void multiplyOpacity (float multiplier) noexcept; - - //============================================================================== - /** Returns the number of colour-stops that have been added. */ - int getNumColours() const noexcept; - - /** Returns the position along the length of the gradient of the colour with this index. - - The index is from 0 to getNumColours() - 1. The return value will be between 0.0 and 1.0 - */ - double getColourPosition (int index) const noexcept; - - /** Returns the colour that was added with a given index. - The index is from 0 to getNumColours() - 1. - */ - Colour getColour (int index) const noexcept; - - /** Changes the colour at a given index. - The index is from 0 to getNumColours() - 1. - */ - void setColour (int index, Colour newColour) noexcept; - - /** Returns the an interpolated colour at any position along the gradient. - @param position the position along the gradient, between 0 and 1 - */ - Colour getColourAtPosition (double position) const noexcept; - - //============================================================================== - /** Creates a set of interpolated premultiplied ARGB values. - This will resize the HeapBlock, fill it with the colours, and will return the number of - colours that it added. - When calling this, the ColourGradient must have at least 2 colour stops specified. - */ - int createLookupTable (const AffineTransform& transform, HeapBlock & resultLookupTable) const; - - /** Creates a set of interpolated premultiplied ARGB values. - This will fill an array of a user-specified size with the gradient, interpolating to fit. - The numEntries argument specifies the size of the array, and this size must be greater than zero. - When calling this, the ColourGradient must have at least 2 colour stops specified. - */ - void createLookupTable (PixelARGB* resultLookupTable, int numEntries) const noexcept; - - /** Returns true if all colours are opaque. */ - bool isOpaque() const noexcept; - - /** Returns true if all colours are completely transparent. */ - bool isInvisible() const noexcept; - - //============================================================================== - Point point1, point2; - - /** If true, the gradient should be filled circularly, centred around - point1, with point2 defining a point on the circumference. - - If false, the gradient is linear between the two points. - */ - bool isRadial; - - bool operator== (const ColourGradient&) const noexcept; - bool operator!= (const ColourGradient&) const noexcept; - - -private: - //============================================================================== - struct ColourPoint - { - ColourPoint() noexcept {} - - ColourPoint (const double pos, Colour col) noexcept - : position (pos), colour (col) - {} - - bool operator== (const ColourPoint&) const noexcept; - bool operator!= (const ColourPoint&) const noexcept; - - double position; - Colour colour; - }; - - Array colours; - - JUCE_LEAK_DETECTOR (ColourGradient) -}; - - -#endif // JUCE_COLOURGRADIENT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp deleted file mode 100755 index fbde0ba..0000000 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.cpp +++ /dev/null @@ -1,320 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -const Colour Colours::transparentBlack (0); -const Colour Colours::transparentWhite (0x00ffffff); - -const Colour Colours::aliceblue (0xfff0f8ff); -const Colour Colours::antiquewhite (0xfffaebd7); -const Colour Colours::aqua (0xff00ffff); -const Colour Colours::aquamarine (0xff7fffd4); -const Colour Colours::azure (0xfff0ffff); -const Colour Colours::beige (0xfff5f5dc); -const Colour Colours::bisque (0xffffe4c4); -const Colour Colours::black (0xff000000); -const Colour Colours::blanchedalmond (0xffffebcd); -const Colour Colours::blue (0xff0000ff); -const Colour Colours::blueviolet (0xff8a2be2); -const Colour Colours::brown (0xffa52a2a); -const Colour Colours::burlywood (0xffdeb887); -const Colour Colours::cadetblue (0xff5f9ea0); -const Colour Colours::chartreuse (0xff7fff00); -const Colour Colours::chocolate (0xffd2691e); -const Colour Colours::coral (0xffff7f50); -const Colour Colours::cornflowerblue (0xff6495ed); -const Colour Colours::cornsilk (0xfffff8dc); -const Colour Colours::crimson (0xffdc143c); -const Colour Colours::cyan (0xff00ffff); -const Colour Colours::darkblue (0xff00008b); -const Colour Colours::darkcyan (0xff008b8b); -const Colour Colours::darkgoldenrod (0xffb8860b); -const Colour Colours::darkgrey (0xff555555); -const Colour Colours::darkgreen (0xff006400); -const Colour Colours::darkkhaki (0xffbdb76b); -const Colour Colours::darkmagenta (0xff8b008b); -const Colour Colours::darkolivegreen (0xff556b2f); -const Colour Colours::darkorange (0xffff8c00); -const Colour Colours::darkorchid (0xff9932cc); -const Colour Colours::darkred (0xff8b0000); -const Colour Colours::darksalmon (0xffe9967a); -const Colour Colours::darkseagreen (0xff8fbc8f); -const Colour Colours::darkslateblue (0xff483d8b); -const Colour Colours::darkslategrey (0xff2f4f4f); -const Colour Colours::darkturquoise (0xff00ced1); -const Colour Colours::darkviolet (0xff9400d3); -const Colour Colours::deeppink (0xffff1493); -const Colour Colours::deepskyblue (0xff00bfff); -const Colour Colours::dimgrey (0xff696969); -const Colour Colours::dodgerblue (0xff1e90ff); -const Colour Colours::firebrick (0xffb22222); -const Colour Colours::floralwhite (0xfffffaf0); -const Colour Colours::forestgreen (0xff228b22); -const Colour Colours::fuchsia (0xffff00ff); -const Colour Colours::gainsboro (0xffdcdcdc); -const Colour Colours::gold (0xffffd700); -const Colour Colours::goldenrod (0xffdaa520); -const Colour Colours::grey (0xff808080); -const Colour Colours::green (0xff008000); -const Colour Colours::greenyellow (0xffadff2f); -const Colour Colours::honeydew (0xfff0fff0); -const Colour Colours::hotpink (0xffff69b4); -const Colour Colours::indianred (0xffcd5c5c); -const Colour Colours::indigo (0xff4b0082); -const Colour Colours::ivory (0xfffffff0); -const Colour Colours::khaki (0xfff0e68c); -const Colour Colours::lavender (0xffe6e6fa); -const Colour Colours::lavenderblush (0xfffff0f5); -const Colour Colours::lemonchiffon (0xfffffacd); -const Colour Colours::lightblue (0xffadd8e6); -const Colour Colours::lightcoral (0xfff08080); -const Colour Colours::lightcyan (0xffe0ffff); -const Colour Colours::lightgoldenrodyellow (0xfffafad2); -const Colour Colours::lightgreen (0xff90ee90); -const Colour Colours::lightgrey (0xffd3d3d3); -const Colour Colours::lightpink (0xffffb6c1); -const Colour Colours::lightsalmon (0xffffa07a); -const Colour Colours::lightseagreen (0xff20b2aa); -const Colour Colours::lightskyblue (0xff87cefa); -const Colour Colours::lightslategrey (0xff778899); -const Colour Colours::lightsteelblue (0xffb0c4de); -const Colour Colours::lightyellow (0xffffffe0); -const Colour Colours::lime (0xff00ff00); -const Colour Colours::limegreen (0xff32cd32); -const Colour Colours::linen (0xfffaf0e6); -const Colour Colours::magenta (0xffff00ff); -const Colour Colours::maroon (0xff800000); -const Colour Colours::mediumaquamarine (0xff66cdaa); -const Colour Colours::mediumblue (0xff0000cd); -const Colour Colours::mediumorchid (0xffba55d3); -const Colour Colours::mediumpurple (0xff9370db); -const Colour Colours::mediumseagreen (0xff3cb371); -const Colour Colours::mediumslateblue (0xff7b68ee); -const Colour Colours::mediumspringgreen (0xff00fa9a); -const Colour Colours::mediumturquoise (0xff48d1cc); -const Colour Colours::mediumvioletred (0xffc71585); -const Colour Colours::midnightblue (0xff191970); -const Colour Colours::mintcream (0xfff5fffa); -const Colour Colours::mistyrose (0xffffe4e1); -const Colour Colours::navajowhite (0xffffdead); -const Colour Colours::navy (0xff000080); -const Colour Colours::oldlace (0xfffdf5e6); -const Colour Colours::olive (0xff808000); -const Colour Colours::olivedrab (0xff6b8e23); -const Colour Colours::orange (0xffffa500); -const Colour Colours::orangered (0xffff4500); -const Colour Colours::orchid (0xffda70d6); -const Colour Colours::palegoldenrod (0xffeee8aa); -const Colour Colours::palegreen (0xff98fb98); -const Colour Colours::paleturquoise (0xffafeeee); -const Colour Colours::palevioletred (0xffdb7093); -const Colour Colours::papayawhip (0xffffefd5); -const Colour Colours::peachpuff (0xffffdab9); -const Colour Colours::peru (0xffcd853f); -const Colour Colours::pink (0xffffc0cb); -const Colour Colours::plum (0xffdda0dd); -const Colour Colours::powderblue (0xffb0e0e6); -const Colour Colours::purple (0xff800080); -const Colour Colours::red (0xffff0000); -const Colour Colours::rosybrown (0xffbc8f8f); -const Colour Colours::royalblue (0xff4169e1); -const Colour Colours::saddlebrown (0xff8b4513); -const Colour Colours::salmon (0xfffa8072); -const Colour Colours::sandybrown (0xfff4a460); -const Colour Colours::seagreen (0xff2e8b57); -const Colour Colours::seashell (0xfffff5ee); -const Colour Colours::sienna (0xffa0522d); -const Colour Colours::silver (0xffc0c0c0); -const Colour Colours::skyblue (0xff87ceeb); -const Colour Colours::slateblue (0xff6a5acd); -const Colour Colours::slategrey (0xff708090); -const Colour Colours::snow (0xfffffafa); -const Colour Colours::springgreen (0xff00ff7f); -const Colour Colours::steelblue (0xff4682b4); -const Colour Colours::tan (0xffd2b48c); -const Colour Colours::teal (0xff008080); -const Colour Colours::thistle (0xffd8bfd8); -const Colour Colours::tomato (0xffff6347); -const Colour Colours::turquoise (0xff40e0d0); -const Colour Colours::violet (0xffee82ee); -const Colour Colours::wheat (0xfff5deb3); -const Colour Colours::white (0xffffffff); -const Colour Colours::whitesmoke (0xfff5f5f5); -const Colour Colours::yellow (0xffffff00); -const Colour Colours::yellowgreen (0xff9acd32); - -//============================================================================== -Colour Colours::findColourForName (const String& colourName, - Colour defaultColour) -{ - static const uint32 presets[] = - { - // (first value is the string's hashcode, second is ARGB) - - 0x05978fff, 0xff000000, /* black */ - 0x06bdcc29, 0xffffffff, /* white */ - 0x002e305a, 0xff0000ff, /* blue */ - 0x00308adf, 0xff808080, /* grey */ - 0x05e0cf03, 0xff008000, /* green */ - 0x0001b891, 0xffff0000, /* red */ - 0xd43c6474, 0xffffff00, /* yellow */ - 0x620886da, 0xfff0f8ff, /* aliceblue */ - 0x20a2676a, 0xfffaebd7, /* antiquewhite */ - 0x002dcebc, 0xff00ffff, /* aqua */ - 0x46bb5f7e, 0xff7fffd4, /* aquamarine */ - 0x0590228f, 0xfff0ffff, /* azure */ - 0x05947fe4, 0xfff5f5dc, /* beige */ - 0xad388e35, 0xffffe4c4, /* bisque */ - 0x00674f7e, 0xffffebcd, /* blanchedalmond */ - 0x39129959, 0xff8a2be2, /* blueviolet */ - 0x059a8136, 0xffa52a2a, /* brown */ - 0x89cea8f9, 0xffdeb887, /* burlywood */ - 0x0fa260cf, 0xff5f9ea0, /* cadetblue */ - 0x6b748956, 0xff7fff00, /* chartreuse */ - 0x2903623c, 0xffd2691e, /* chocolate */ - 0x05a74431, 0xffff7f50, /* coral */ - 0x618d42dd, 0xff6495ed, /* cornflowerblue */ - 0xe4b479fd, 0xfffff8dc, /* cornsilk */ - 0x3d8c4edf, 0xffdc143c, /* crimson */ - 0x002ed323, 0xff00ffff, /* cyan */ - 0x67cc74d0, 0xff00008b, /* darkblue */ - 0x67cd1799, 0xff008b8b, /* darkcyan */ - 0x31bbd168, 0xffb8860b, /* darkgoldenrod */ - 0x67cecf55, 0xff555555, /* darkgrey */ - 0x920b194d, 0xff006400, /* darkgreen */ - 0x923edd4c, 0xffbdb76b, /* darkkhaki */ - 0x5c293873, 0xff8b008b, /* darkmagenta */ - 0x6b6671fe, 0xff556b2f, /* darkolivegreen */ - 0xbcfd2524, 0xffff8c00, /* darkorange */ - 0xbcfdf799, 0xff9932cc, /* darkorchid */ - 0x55ee0d5b, 0xff8b0000, /* darkred */ - 0xc2e5f564, 0xffe9967a, /* darksalmon */ - 0x61be858a, 0xff8fbc8f, /* darkseagreen */ - 0xc2b0f2bd, 0xff483d8b, /* darkslateblue */ - 0xc2b34d42, 0xff2f4f4f, /* darkslategrey */ - 0x7cf2b06b, 0xff00ced1, /* darkturquoise */ - 0xc8769375, 0xff9400d3, /* darkviolet */ - 0x25832862, 0xffff1493, /* deeppink */ - 0xfcad568f, 0xff00bfff, /* deepskyblue */ - 0x634c8b67, 0xff696969, /* dimgrey */ - 0x45c1ce55, 0xff1e90ff, /* dodgerblue */ - 0xef19e3cb, 0xffb22222, /* firebrick */ - 0xb852b195, 0xfffffaf0, /* floralwhite */ - 0xd086fd06, 0xff228b22, /* forestgreen */ - 0xe106b6d7, 0xffff00ff, /* fuchsia */ - 0x7880d61e, 0xffdcdcdc, /* gainsboro */ - 0x00308060, 0xffffd700, /* gold */ - 0xb3b3bc1e, 0xffdaa520, /* goldenrod */ - 0xbab8a537, 0xffadff2f, /* greenyellow */ - 0xe4cacafb, 0xfff0fff0, /* honeydew */ - 0x41892743, 0xffff69b4, /* hotpink */ - 0xd5796f1a, 0xffcd5c5c, /* indianred */ - 0xb969fed2, 0xff4b0082, /* indigo */ - 0x05fef6a9, 0xfffffff0, /* ivory */ - 0x06149302, 0xfff0e68c, /* khaki */ - 0xad5a05c7, 0xffe6e6fa, /* lavender */ - 0x7c4d5b99, 0xfffff0f5, /* lavenderblush */ - 0x195756f0, 0xfffffacd, /* lemonchiffon */ - 0x28e4ea70, 0xffadd8e6, /* lightblue */ - 0xf3c7ccdb, 0xfff08080, /* lightcoral */ - 0x28e58d39, 0xffe0ffff, /* lightcyan */ - 0x21234e3c, 0xfffafad2, /* lightgoldenrodyellow */ - 0xf40157ad, 0xff90ee90, /* lightgreen */ - 0x28e744f5, 0xffd3d3d3, /* lightgrey */ - 0x28eb3b8c, 0xffffb6c1, /* lightpink */ - 0x9fb78304, 0xffffa07a, /* lightsalmon */ - 0x50632b2a, 0xff20b2aa, /* lightseagreen */ - 0x68fb7b25, 0xff87cefa, /* lightskyblue */ - 0xa8a35ba2, 0xff778899, /* lightslategrey */ - 0xa20d484f, 0xffb0c4de, /* lightsteelblue */ - 0xaa2cf10a, 0xffffffe0, /* lightyellow */ - 0x0032afd5, 0xff00ff00, /* lime */ - 0x607bbc4e, 0xff32cd32, /* limegreen */ - 0x06234efa, 0xfffaf0e6, /* linen */ - 0x316858a9, 0xffff00ff, /* magenta */ - 0xbf8ca470, 0xff800000, /* maroon */ - 0xbd58e0b3, 0xff66cdaa, /* mediumaquamarine */ - 0x967dfd4f, 0xff0000cd, /* mediumblue */ - 0x056f5c58, 0xffba55d3, /* mediumorchid */ - 0x07556b71, 0xff9370db, /* mediumpurple */ - 0x5369b689, 0xff3cb371, /* mediumseagreen */ - 0x066be19e, 0xff7b68ee, /* mediumslateblue */ - 0x3256b281, 0xff00fa9a, /* mediumspringgreen */ - 0xc0ad9f4c, 0xff48d1cc, /* mediumturquoise */ - 0x628e63dd, 0xffc71585, /* mediumvioletred */ - 0x168eb32a, 0xff191970, /* midnightblue */ - 0x4306b960, 0xfff5fffa, /* mintcream */ - 0x4cbc0e6b, 0xffffe4e1, /* mistyrose */ - 0xe97218a6, 0xffffdead, /* navajowhite */ - 0x00337bb6, 0xff000080, /* navy */ - 0xadd2d33e, 0xfffdf5e6, /* oldlace */ - 0x064ee1db, 0xff808000, /* olive */ - 0x9e33a98a, 0xff6b8e23, /* olivedrab */ - 0xc3de262e, 0xffffa500, /* orange */ - 0x58bebba3, 0xffff4500, /* orangered */ - 0xc3def8a3, 0xffda70d6, /* orchid */ - 0x28cb4834, 0xffeee8aa, /* palegoldenrod */ - 0x3d9dd619, 0xff98fb98, /* palegreen */ - 0x74022737, 0xffafeeee, /* paleturquoise */ - 0x15e2ebc8, 0xffdb7093, /* palevioletred */ - 0x5fd898e2, 0xffffefd5, /* papayawhip */ - 0x93e1b776, 0xffffdab9, /* peachpuff */ - 0x003472f8, 0xffcd853f, /* peru */ - 0x00348176, 0xffffc0cb, /* pink */ - 0x00348d94, 0xffdda0dd, /* plum */ - 0xd036be93, 0xffb0e0e6, /* powderblue */ - 0xc5c507bc, 0xff800080, /* purple */ - 0xa89d65b3, 0xffbc8f8f, /* rosybrown */ - 0xbd9413e1, 0xff4169e1, /* royalblue */ - 0xf456044f, 0xff8b4513, /* saddlebrown */ - 0xc9c6f66e, 0xfffa8072, /* salmon */ - 0x0bb131e1, 0xfff4a460, /* sandybrown */ - 0x34636c14, 0xff2e8b57, /* seagreen */ - 0x3507fb41, 0xfffff5ee, /* seashell */ - 0xca348772, 0xffa0522d, /* sienna */ - 0xca37d30d, 0xffc0c0c0, /* silver */ - 0x80da74fb, 0xff87ceeb, /* skyblue */ - 0x44a8dd73, 0xff6a5acd, /* slateblue */ - 0x44ab37f8, 0xff708090, /* slategrey */ - 0x0035f183, 0xfffffafa, /* snow */ - 0xd5440d16, 0xff00ff7f, /* springgreen */ - 0x3e1524a5, 0xff4682b4, /* steelblue */ - 0x0001bfa1, 0xffd2b48c, /* tan */ - 0x0036425c, 0xff008080, /* teal */ - 0xafc8858f, 0xffd8bfd8, /* thistle */ - 0xcc41600a, 0xffff6347, /* tomato */ - 0xfeea9b21, 0xff40e0d0, /* turquoise */ - 0xcf57947f, 0xffee82ee, /* violet */ - 0x06bdbae7, 0xfff5deb3, /* wheat */ - 0x10802ee6, 0xfff5f5f5, /* whitesmoke */ - 0xe1b5130f, 0xff9acd32 /* yellowgreen */ - }; - - const uint32 hash = (uint32) colourName.trim().toLowerCase().hashCode(); - - for (int i = 0; i < numElementsInArray (presets); i += 2) - if (presets [i] == hash) - return Colour (presets [i + 1]); - - return defaultColour; -} diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h b/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h deleted file mode 100755 index 90e4aa5..0000000 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_Colours.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_COLOURS_H_INCLUDED -#define JUCE_COLOURS_H_INCLUDED - - -//============================================================================== -/** - Contains a set of predefined named colours (mostly standard HTML colours) - - @see Colour, Colours::greyLevel -*/ -class Colours -{ -public: - static JUCE_API const Colour - - //============================================================================== - transparentBlack, /**< ARGB = 0x00000000 */ - transparentWhite, /**< ARGB = 0x00ffffff */ - - //============================================================================== - black, /**< ARGB = 0xff000000 */ - white, /**< ARGB = 0xffffffff */ - blue, /**< ARGB = 0xff0000ff */ - grey, /**< ARGB = 0xff808080 */ - green, /**< ARGB = 0xff008000 */ - red, /**< ARGB = 0xffff0000 */ - yellow, /**< ARGB = 0xffffff00 */ - - //============================================================================== - aliceblue, antiquewhite, aqua, aquamarine, - azure, beige, bisque, blanchedalmond, - blueviolet, brown, burlywood, cadetblue, - chartreuse, chocolate, coral, cornflowerblue, - cornsilk, crimson, cyan, darkblue, - darkcyan, darkgoldenrod, darkgrey, darkgreen, - darkkhaki, darkmagenta, darkolivegreen, darkorange, - darkorchid, darkred, darksalmon, darkseagreen, - darkslateblue, darkslategrey, darkturquoise, darkviolet, - deeppink, deepskyblue, dimgrey, dodgerblue, - firebrick, floralwhite, forestgreen, fuchsia, - gainsboro, gold, goldenrod, greenyellow, - honeydew, hotpink, indianred, indigo, - ivory, khaki, lavender, lavenderblush, - lemonchiffon, lightblue, lightcoral, lightcyan, - lightgoldenrodyellow, lightgreen, lightgrey, lightpink, - lightsalmon, lightseagreen, lightskyblue, lightslategrey, - lightsteelblue, lightyellow, lime, limegreen, - linen, magenta, maroon, mediumaquamarine, - mediumblue, mediumorchid, mediumpurple, mediumseagreen, - mediumslateblue, mediumspringgreen, mediumturquoise, mediumvioletred, - midnightblue, mintcream, mistyrose, navajowhite, - navy, oldlace, olive, olivedrab, - orange, orangered, orchid, palegoldenrod, - palegreen, paleturquoise, palevioletred, papayawhip, - peachpuff, peru, pink, plum, - powderblue, purple, rosybrown, royalblue, - saddlebrown, salmon, sandybrown, seagreen, - seashell, sienna, silver, skyblue, - slateblue, slategrey, snow, springgreen, - steelblue, tan, teal, thistle, - tomato, turquoise, violet, wheat, - whitesmoke, yellowgreen; - - /** Attempts to look up a string in the list of known colour names, and return - the appropriate colour. - - A non-case-sensitive search is made of the list of predefined colours, and - if a match is found, that colour is returned. If no match is found, the - colour passed in as the defaultColour parameter is returned. - */ - static JUCE_API Colour findColourForName (const String& colourName, - Colour defaultColour); - -private: - //============================================================================== - // this isn't a class you should ever instantiate - it's just here for the - // static values in it. - Colours(); - - JUCE_DECLARE_NON_COPYABLE (Colours) -}; - -#endif // JUCE_COLOURS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp b/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp deleted file mode 100755 index 5e5db56..0000000 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -FillType::FillType() noexcept - : colour (0xff000000) -{ -} - -FillType::FillType (Colour c) noexcept - : colour (c) -{ -} - -FillType::FillType (const ColourGradient& gradient_) - : colour (0xff000000), gradient (new ColourGradient (gradient_)) -{ -} - -FillType::FillType (const Image& image_, const AffineTransform& transform_) noexcept - : colour (0xff000000), image (image_), transform (transform_) -{ -} - -FillType::FillType (const FillType& other) - : colour (other.colour), - gradient (other.gradient.createCopy()), - image (other.image), - transform (other.transform) -{ -} - -FillType& FillType::operator= (const FillType& other) -{ - if (this != &other) - { - colour = other.colour; - gradient = other.gradient.createCopy(); - image = other.image; - transform = other.transform; - } - - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -FillType::FillType (FillType&& other) noexcept - : colour (other.colour), - gradient (other.gradient.release()), - image (static_cast (other.image)), - transform (other.transform) -{ -} - -FillType& FillType::operator= (FillType&& other) noexcept -{ - jassert (this != &other); // hopefully the compiler should make this situation impossible! - - colour = other.colour; - gradient = other.gradient.release(); - image = static_cast (other.image); - transform = other.transform; - return *this; -} -#endif - -FillType::~FillType() noexcept -{ -} - -bool FillType::operator== (const FillType& other) const -{ - return colour == other.colour && image == other.image - && transform == other.transform - && (gradient == other.gradient - || (gradient != nullptr && other.gradient != nullptr && *gradient == *other.gradient)); -} - -bool FillType::operator!= (const FillType& other) const -{ - return ! operator== (other); -} - -void FillType::setColour (Colour newColour) noexcept -{ - gradient = nullptr; - image = Image::null; - colour = newColour; -} - -void FillType::setGradient (const ColourGradient& newGradient) -{ - if (gradient != nullptr) - { - *gradient = newGradient; - } - else - { - image = Image::null; - gradient = new ColourGradient (newGradient); - colour = Colours::black; - } -} - -void FillType::setTiledImage (const Image& image_, const AffineTransform& transform_) noexcept -{ - gradient = nullptr; - image = image_; - transform = transform_; - colour = Colours::black; -} - -void FillType::setOpacity (const float newOpacity) noexcept -{ - colour = colour.withAlpha (newOpacity); -} - -bool FillType::isInvisible() const noexcept -{ - return colour.isTransparent() || (gradient != nullptr && gradient->isInvisible()); -} - -FillType FillType::transformed (const AffineTransform& t) const -{ - FillType f (*this); - f.transform = f.transform.followedBy (t); - return f; -} diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h b/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h deleted file mode 100755 index 19401d6..0000000 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_FillType.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_FILLTYPE_H_INCLUDED -#define JUCE_FILLTYPE_H_INCLUDED - - -//============================================================================== -/** - Represents a colour or fill pattern to use for rendering paths. - - This is used by the Graphics and DrawablePath classes as a way to encapsulate - a brush type. It can either be a solid colour, a gradient, or a tiled image. - - @see Graphics::setFillType, DrawablePath::setFill -*/ -class JUCE_API FillType -{ -public: - //============================================================================== - /** Creates a default fill type, of solid black. */ - FillType() noexcept; - - /** Creates a fill type of a solid colour. - @see setColour - */ - FillType (Colour colour) noexcept; - - /** Creates a gradient fill type. - @see setGradient - */ - FillType (const ColourGradient& gradient); - - /** Creates a tiled image fill type. The transform allows you to set the scaling, offset - and rotation of the pattern. - @see setTiledImage - */ - FillType (const Image& image, const AffineTransform& transform) noexcept; - - /** Creates a copy of another FillType. */ - FillType (const FillType&); - - /** Makes a copy of another FillType. */ - FillType& operator= (const FillType&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - FillType (FillType&&) noexcept; - FillType& operator= (FillType&&) noexcept; - #endif - - /** Destructor. */ - ~FillType() noexcept; - - //============================================================================== - /** Returns true if this is a solid colour fill, and not a gradient or image. */ - bool isColour() const noexcept { return gradient == nullptr && image.isNull(); } - - /** Returns true if this is a gradient fill. */ - bool isGradient() const noexcept { return gradient != nullptr; } - - /** Returns true if this is a tiled image pattern fill. */ - bool isTiledImage() const noexcept { return image.isValid(); } - - /** Turns this object into a solid colour fill. - If the object was an image or gradient, those fields will no longer be valid. */ - void setColour (Colour newColour) noexcept; - - /** Turns this object into a gradient fill. */ - void setGradient (const ColourGradient& newGradient); - - /** Turns this object into a tiled image fill type. The transform allows you to set - the scaling, offset and rotation of the pattern. - */ - void setTiledImage (const Image& image, const AffineTransform& transform) noexcept; - - /** Changes the opacity that should be used. - If the fill is a solid colour, this just changes the opacity of that colour. For - gradients and image tiles, it changes the opacity that will be used for them. - */ - void setOpacity (float newOpacity) noexcept; - - /** Returns the current opacity to be applied to the colour, gradient, or image. - @see setOpacity - */ - float getOpacity() const noexcept { return colour.getFloatAlpha(); } - - /** Returns true if this fill type is completely transparent. */ - bool isInvisible() const noexcept; - - /** Returns a copy of this fill, adding the specified transform applied to the - existing transform. - */ - FillType transformed (const AffineTransform& transform) const; - - //============================================================================== - /** The solid colour being used. - - If the fill type is not a solid colour, the alpha channel of this colour indicates - the opacity that should be used for the fill, and the RGB channels are ignored. - */ - Colour colour; - - /** Returns the gradient that should be used for filling. - This will be zero if the object is some other type of fill. - If a gradient is active, the overall opacity with which it should be applied - is indicated by the alpha channel of the colour variable. - */ - ScopedPointer gradient; - - /** The image that should be used for tiling. - If an image fill is active, the overall opacity with which it should be applied - is indicated by the alpha channel of the colour variable. - */ - Image image; - - /** The transform that should be applied to the image or gradient that's being drawn. */ - AffineTransform transform; - - //============================================================================== - bool operator== (const FillType&) const; - bool operator!= (const FillType&) const; - -private: - JUCE_LEAK_DETECTOR (FillType) -}; - - -#endif // JUCE_FILLTYPE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h b/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h deleted file mode 100755 index 2715cb2..0000000 --- a/JuceLibraryCode/modules/juce_graphics/colour/juce_PixelFormats.h +++ /dev/null @@ -1,604 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_PIXELFORMATS_H_INCLUDED -#define JUCE_PIXELFORMATS_H_INCLUDED - - -//============================================================================== -#if JUCE_MSVC - #pragma pack (push, 1) -#endif - -class PixelRGB; -class PixelAlpha; - -inline uint32 maskPixelComponents (uint32 x) noexcept -{ - return (x >> 8) & 0x00ff00ff; -} - -inline uint32 clampPixelComponents (uint32 x) noexcept -{ - return (x | (0x01000100 - maskPixelComponents (x))) & 0x00ff00ff; -} - -//============================================================================== -/** - Represents a 32-bit ARGB pixel with premultiplied alpha, and can perform compositing - operations with it. - - This is used internally by the imaging classes. - - @see PixelRGB -*/ -class JUCE_API PixelARGB -{ -public: - /** Creates a pixel without defining its colour. */ - PixelARGB() noexcept {} - ~PixelARGB() noexcept {} - - /** Creates a pixel from a 32-bit argb value. - */ - PixelARGB (const uint32 argbValue) noexcept - : argb (argbValue) - { - } - - PixelARGB (const uint8 a, const uint8 r, const uint8 g, const uint8 b) noexcept - { - components.b = b; - components.g = g; - components.r = r; - components.a = a; - } - - forcedinline uint32 getARGB() const noexcept { return argb; } - forcedinline uint32 getUnpremultipliedARGB() const noexcept { PixelARGB p (argb); p.unpremultiply(); return p.getARGB(); } - - forcedinline uint32 getRB() const noexcept { return 0x00ff00ff & argb; } - forcedinline uint32 getAG() const noexcept { return 0x00ff00ff & (argb >> 8); } - - forcedinline uint8 getAlpha() const noexcept { return components.a; } - forcedinline uint8 getRed() const noexcept { return components.r; } - forcedinline uint8 getGreen() const noexcept { return components.g; } - forcedinline uint8 getBlue() const noexcept { return components.b; } - - #if JUCE_GCC && ! JUCE_CLANG - // NB these are here as a workaround because GCC refuses to bind to packed values. - forcedinline uint8& getAlpha() noexcept { return comps [indexA]; } - forcedinline uint8& getRed() noexcept { return comps [indexR]; } - forcedinline uint8& getGreen() noexcept { return comps [indexG]; } - forcedinline uint8& getBlue() noexcept { return comps [indexB]; } - #else - forcedinline uint8& getAlpha() noexcept { return components.a; } - forcedinline uint8& getRed() noexcept { return components.r; } - forcedinline uint8& getGreen() noexcept { return components.g; } - forcedinline uint8& getBlue() noexcept { return components.b; } - #endif - - /** Blends another pixel onto this one. - - This takes into account the opacity of the pixel being overlaid, and blends - it accordingly. - */ - template - forcedinline void blend (const Pixel& src) noexcept - { - const uint32 alpha = 0x100 - src.getAlpha(); - uint32 rb = src.getRB() + maskPixelComponents (getRB() * alpha); - uint32 ag = src.getAG() + maskPixelComponents (getAG() * alpha); - argb = clampPixelComponents (rb) + (clampPixelComponents (ag) << 8); - } - - /** Blends another pixel onto this one. - - This takes into account the opacity of the pixel being overlaid, and blends - it accordingly. - */ - forcedinline void blend (const PixelRGB src) noexcept; - - - /** Blends another pixel onto this one, applying an extra multiplier to its opacity. - - The opacity of the pixel being overlaid is scaled by the extraAlpha factor before - being used, so this can blend semi-transparently from a PixelRGB argument. - */ - template - forcedinline void blend (const Pixel& src, uint32 extraAlpha) noexcept - { - uint32 ag = maskPixelComponents (extraAlpha * src.getAG()); - const uint32 alpha = 0x100 - (ag >> 16); - ag += maskPixelComponents (getAG() * alpha); - - uint32 rb = maskPixelComponents (extraAlpha * src.getRB()) - + maskPixelComponents (getRB() * alpha); - - argb = clampPixelComponents(rb) + (clampPixelComponents (ag) << 8); - } - - /** Blends another pixel with this one, creating a colour that is somewhere - between the two, as specified by the amount. - */ - template - forcedinline void tween (const Pixel& src, const uint32 amount) noexcept - { - uint32 drb = getRB(); - drb += (((src.getRB() - drb) * amount) >> 8); - drb &= 0x00ff00ff; - - uint32 dag = getAG(); - dag += (((src.getAG() - dag) * amount) >> 8); - dag &= 0x00ff00ff; - dag <<= 8; - - dag |= drb; - argb = dag; - } - - /** Copies another pixel colour over this one. - - This doesn't blend it - this colour is simply replaced by the other one. - */ - template - forcedinline void set (const Pixel& src) noexcept - { - argb = src.getARGB(); - } - - /** Replaces the colour's alpha value with another one. */ - forcedinline void setAlpha (const uint8 newAlpha) noexcept - { - components.a = newAlpha; - } - - /** Multiplies the colour's alpha value with another one. */ - forcedinline void multiplyAlpha (int multiplier) noexcept - { - ++multiplier; - - argb = ((((uint32) multiplier) * getAG()) & 0xff00ff00) - | (((((uint32) multiplier) * getRB()) >> 8) & 0x00ff00ff); - } - - forcedinline void multiplyAlpha (const float multiplier) noexcept - { - multiplyAlpha ((int) (multiplier * 255.0f)); - } - - /** Sets the pixel's colour from individual components. */ - void setARGB (const uint8 a, const uint8 r, const uint8 g, const uint8 b) noexcept - { - components.b = b; - components.g = g; - components.r = r; - components.a = a; - } - - /** Premultiplies the pixel's RGB values by its alpha. */ - forcedinline void premultiply() noexcept - { - const uint32 alpha = components.a; - - if (alpha < 0xff) - { - if (alpha == 0) - { - components.b = 0; - components.g = 0; - components.r = 0; - } - else - { - components.b = (uint8) ((components.b * alpha + 0x7f) >> 8); - components.g = (uint8) ((components.g * alpha + 0x7f) >> 8); - components.r = (uint8) ((components.r * alpha + 0x7f) >> 8); - } - } - } - - /** Unpremultiplies the pixel's RGB values. */ - forcedinline void unpremultiply() noexcept - { - const uint32 alpha = components.a; - - if (alpha < 0xff) - { - if (alpha == 0) - { - components.b = 0; - components.g = 0; - components.r = 0; - } - else - { - components.b = (uint8) jmin ((uint32) 0xff, (components.b * 0xff) / alpha); - components.g = (uint8) jmin ((uint32) 0xff, (components.g * 0xff) / alpha); - components.r = (uint8) jmin ((uint32) 0xff, (components.r * 0xff) / alpha); - } - } - } - - forcedinline void desaturate() noexcept - { - if (components.a < 0xff && components.a > 0) - { - const int newUnpremultipliedLevel = (0xff * ((int) components.r + (int) components.g + (int) components.b) / (3 * components.a)); - - components.r = components.g = components.b - = (uint8) ((newUnpremultipliedLevel * components.a + 0x7f) >> 8); - } - else - { - components.r = components.g = components.b - = (uint8) (((int) components.r + (int) components.g + (int) components.b) / 3); - } - } - - /** Returns a uint32 which when written to memory, will be in the order r, g, b, a. */ - inline uint32 getInRGBAMemoryOrder() const noexcept - { - #if JUCE_BIG_ENDIAN - return (((uint32) components.r) << 24) | (((uint32) components.g) << 16) | (((uint32) components.b) << 8) | components.a; - #else - return (((uint32) components.a) << 24) | (((uint32) components.b) << 16) | (((uint32) components.g) << 8) | components.r; - #endif - } - - //============================================================================== - /** The indexes of the different components in the byte layout of this type of colour. */ - #if JUCE_BIG_ENDIAN - enum { indexA = 0, indexR = 1, indexG = 2, indexB = 3 }; - #else - enum { indexA = 3, indexR = 2, indexG = 1, indexB = 0 }; - #endif - -private: - //============================================================================== - struct Components - { - #if JUCE_BIG_ENDIAN - uint8 a, r, g, b; - #else - uint8 b, g, r, a; - #endif - } JUCE_PACKED; - - union - { - uint32 argb; - Components components; - #if JUCE_GCC - uint8 comps[4]; - #endif - }; -} -#ifndef DOXYGEN - JUCE_PACKED -#endif -; - - -//============================================================================== -/** - Represents a 24-bit RGB pixel, and can perform compositing operations on it. - - This is used internally by the imaging classes. - - @see PixelARGB -*/ -class JUCE_API PixelRGB -{ -public: - /** Creates a pixel without defining its colour. */ - PixelRGB() noexcept {} - ~PixelRGB() noexcept {} - - /** Creates a pixel from a 32-bit argb value. - - (The argb format is that used by PixelARGB) - */ - PixelRGB (const uint32 argb) noexcept - { - r = (uint8) (argb >> 16); - g = (uint8) (argb >> 8); - b = (uint8) (argb); - } - - forcedinline uint32 getARGB() const noexcept { return 0xff000000 | b | (((uint32) g) << 8) | (((uint32) r) << 16); } - forcedinline uint32 getUnpremultipliedARGB() const noexcept { return getARGB(); } - - forcedinline uint32 getRB() const noexcept { return b | (uint32) (r << 16); } - forcedinline uint32 getAG() const noexcept { return (uint32) (0xff0000 | g); } - - forcedinline uint8 getAlpha() const noexcept { return 0xff; } - forcedinline uint8 getRed() const noexcept { return r; } - forcedinline uint8 getGreen() const noexcept { return g; } - forcedinline uint8 getBlue() const noexcept { return b; } - - forcedinline uint8& getRed() noexcept { return r; } - forcedinline uint8& getGreen() noexcept { return g; } - forcedinline uint8& getBlue() noexcept { return b; } - - /** Blends another pixel onto this one. - - This takes into account the opacity of the pixel being overlaid, and blends - it accordingly. - */ - template - forcedinline void blend (const Pixel& src) noexcept - { - const uint32 alpha = 0x100 - src.getAlpha(); - - uint32 rb = clampPixelComponents (src.getRB() + maskPixelComponents (getRB() * alpha)); - uint32 ag = src.getAG() + (g * alpha >> 8); - - r = (uint8) (rb >> 16); - g = (uint8) clampPixelComponents (ag); - b = (uint8) rb; - } - - forcedinline void blend (const PixelRGB src) noexcept - { - set (src); - } - - /** Blends another pixel onto this one, applying an extra multiplier to its opacity. - - The opacity of the pixel being overlaid is scaled by the extraAlpha factor before - being used, so this can blend semi-transparently from a PixelRGB argument. - */ - template - forcedinline void blend (const Pixel& src, uint32 extraAlpha) noexcept - { - uint32 ag = maskPixelComponents (extraAlpha * src.getAG()); - const uint32 alpha = 0x100 - (ag >> 16); - ag += g * alpha >> 8; - - uint32 rb = clampPixelComponents (maskPixelComponents (extraAlpha * src.getRB()) - + maskPixelComponents (getRB() * alpha)); - - b = (uint8) rb; - g = (uint8) clampPixelComponents (ag); - r = (uint8) (rb >> 16); - } - - /** Blends another pixel with this one, creating a colour that is somewhere - between the two, as specified by the amount. - */ - template - forcedinline void tween (const Pixel& src, const uint32 amount) noexcept - { - uint32 drb = getRB(); - drb += (((src.getRB() - drb) * amount) >> 8); - - uint32 dag = getAG(); - dag += (((src.getAG() - dag) * amount) >> 8); - - b = (uint8) drb; - g = (uint8) dag; - r = (uint8) (drb >> 16); - } - - /** Copies another pixel colour over this one. - - This doesn't blend it - this colour is simply replaced by the other one. - Because PixelRGB has no alpha channel, any alpha value in the source pixel - is thrown away. - */ - template - forcedinline void set (const Pixel& src) noexcept - { - b = src.getBlue(); - g = src.getGreen(); - r = src.getRed(); - } - - /** This method is included for compatibility with the PixelARGB class. */ - forcedinline void setAlpha (const uint8) noexcept {} - - /** Multiplies the colour's alpha value with another one. */ - forcedinline void multiplyAlpha (int) noexcept {} - - /** Multiplies the colour's alpha value with another one. */ - forcedinline void multiplyAlpha (float) noexcept {} - - /** Sets the pixel's colour from individual components. */ - void setARGB (const uint8, const uint8 red, const uint8 green, const uint8 blue) noexcept - { - r = red; - g = green; - b = blue; - } - - /** Premultiplies the pixel's RGB values by its alpha. */ - forcedinline void premultiply() noexcept {} - - /** Unpremultiplies the pixel's RGB values. */ - forcedinline void unpremultiply() noexcept {} - - forcedinline void desaturate() noexcept - { - r = g = b = (uint8) (((int) r + (int) g + (int) b) / 3); - } - - //============================================================================== - /** The indexes of the different components in the byte layout of this type of colour. */ - #if JUCE_MAC - enum { indexR = 0, indexG = 1, indexB = 2 }; - #else - enum { indexR = 2, indexG = 1, indexB = 0 }; - #endif - -private: - //============================================================================== - #if JUCE_MAC - uint8 r, g, b; - #else - uint8 b, g, r; - #endif - -} -#ifndef DOXYGEN - JUCE_PACKED -#endif -; - -forcedinline void PixelARGB::blend (const PixelRGB src) noexcept -{ - set (src); -} - -//============================================================================== -/** - Represents an 8-bit single-channel pixel, and can perform compositing operations on it. - - This is used internally by the imaging classes. - - @see PixelARGB, PixelRGB -*/ -class JUCE_API PixelAlpha -{ -public: - /** Creates a pixel without defining its colour. */ - PixelAlpha() noexcept {} - ~PixelAlpha() noexcept {} - - /** Creates a pixel from a 32-bit argb value. - - (The argb format is that used by PixelARGB) - */ - PixelAlpha (const uint32 argb) noexcept - { - a = (uint8) (argb >> 24); - } - - forcedinline uint32 getARGB() const noexcept { return (((uint32) a) << 24) | (((uint32) a) << 16) | (((uint32) a) << 8) | a; } - forcedinline uint32 getUnpremultipliedARGB() const noexcept { return (((uint32) a) << 24) | 0xffffff; } - - forcedinline uint32 getRB() const noexcept { return (((uint32) a) << 16) | a; } - forcedinline uint32 getAG() const noexcept { return (((uint32) a) << 16) | a; } - - forcedinline uint8 getAlpha() const noexcept { return a; } - forcedinline uint8& getAlpha() noexcept { return a; } - - forcedinline uint8 getRed() const noexcept { return 0; } - forcedinline uint8 getGreen() const noexcept { return 0; } - forcedinline uint8 getBlue() const noexcept { return 0; } - - /** Blends another pixel onto this one. - - This takes into account the opacity of the pixel being overlaid, and blends - it accordingly. - */ - template - forcedinline void blend (const Pixel& src) noexcept - { - const int srcA = src.getAlpha(); - a = (uint8) ((a * (0x100 - srcA) >> 8) + srcA); - } - - /** Blends another pixel onto this one, applying an extra multiplier to its opacity. - - The opacity of the pixel being overlaid is scaled by the extraAlpha factor before - being used, so this can blend semi-transparently from a PixelRGB argument. - */ - template - forcedinline void blend (const Pixel& src, uint32 extraAlpha) noexcept - { - ++extraAlpha; - const int srcAlpha = (int) ((extraAlpha * src.getAlpha()) >> 8); - a = (uint8) ((a * (0x100 - srcAlpha) >> 8) + srcAlpha); - } - - /** Blends another pixel with this one, creating a colour that is somewhere - between the two, as specified by the amount. - */ - template - forcedinline void tween (const Pixel& src, const uint32 amount) noexcept - { - a += ((src.getAlpha() - a) * amount) >> 8; - } - - /** Copies another pixel colour over this one. - - This doesn't blend it - this colour is simply replaced by the other one. - */ - template - forcedinline void set (const Pixel& src) noexcept - { - a = src.getAlpha(); - } - - /** Replaces the colour's alpha value with another one. */ - forcedinline void setAlpha (const uint8 newAlpha) noexcept - { - a = newAlpha; - } - - /** Multiplies the colour's alpha value with another one. */ - forcedinline void multiplyAlpha (int multiplier) noexcept - { - ++multiplier; - a = (uint8) ((a * multiplier) >> 8); - } - - forcedinline void multiplyAlpha (const float multiplier) noexcept - { - a = (uint8) (a * multiplier); - } - - /** Sets the pixel's colour from individual components. */ - forcedinline void setARGB (const uint8 a_, const uint8 /*r*/, const uint8 /*g*/, const uint8 /*b*/) noexcept - { - a = a_; - } - - /** Premultiplies the pixel's RGB values by its alpha. */ - forcedinline void premultiply() noexcept {} - - /** Unpremultiplies the pixel's RGB values. */ - forcedinline void unpremultiply() noexcept {} - - forcedinline void desaturate() noexcept {} - - //============================================================================== - /** The indexes of the different components in the byte layout of this type of colour. */ - enum { indexA = 0 }; - -private: - //============================================================================== - uint8 a; -} -#ifndef DOXYGEN - JUCE_PACKED -#endif -; - -#if JUCE_MSVC - #pragma pack (pop) -#endif - -#endif // JUCE_PIXELFORMATS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp b/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp deleted file mode 100755 index a0dcd80..0000000 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.cpp +++ /dev/null @@ -1,678 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace -{ - template - Rectangle coordsToRectangle (Type x, Type y, Type w, Type h) - { - #if JUCE_DEBUG - const int maxVal = 0x3fffffff; - - jassert ((int) x >= -maxVal && (int) x <= maxVal - && (int) y >= -maxVal && (int) y <= maxVal - && (int) w >= -maxVal && (int) w <= maxVal - && (int) h >= -maxVal && (int) h <= maxVal); - #endif - - return Rectangle (x, y, w, h); - } -} - -//============================================================================== -LowLevelGraphicsContext::LowLevelGraphicsContext() {} -LowLevelGraphicsContext::~LowLevelGraphicsContext() {} - -//============================================================================== -Graphics::Graphics (const Image& imageToDrawOnto) - : context (*imageToDrawOnto.createLowLevelContext()), - contextToDelete (&context), - saveStatePending (false) -{ - jassert (imageToDrawOnto.isValid()); // Can't draw into a null image! -} - -Graphics::Graphics (LowLevelGraphicsContext& internalContext) noexcept - : context (internalContext), - saveStatePending (false) -{ -} - -Graphics::~Graphics() -{ -} - -//============================================================================== -void Graphics::resetToDefaultState() -{ - saveStateIfPending(); - context.setFill (FillType()); - context.setFont (Font()); - context.setInterpolationQuality (Graphics::mediumResamplingQuality); -} - -bool Graphics::isVectorDevice() const -{ - return context.isVectorDevice(); -} - -bool Graphics::reduceClipRegion (const Rectangle& area) -{ - saveStateIfPending(); - return context.clipToRectangle (area); -} - -bool Graphics::reduceClipRegion (const int x, const int y, const int w, const int h) -{ - return reduceClipRegion (Rectangle (x, y, w, h)); -} - -bool Graphics::reduceClipRegion (const RectangleList& clipRegion) -{ - saveStateIfPending(); - return context.clipToRectangleList (clipRegion); -} - -bool Graphics::reduceClipRegion (const Path& path, const AffineTransform& transform) -{ - saveStateIfPending(); - context.clipToPath (path, transform); - return ! context.isClipEmpty(); -} - -bool Graphics::reduceClipRegion (const Image& image, const AffineTransform& transform) -{ - saveStateIfPending(); - context.clipToImageAlpha (image, transform); - return ! context.isClipEmpty(); -} - -void Graphics::excludeClipRegion (const Rectangle& rectangleToExclude) -{ - saveStateIfPending(); - context.excludeClipRectangle (rectangleToExclude); -} - -bool Graphics::isClipEmpty() const -{ - return context.isClipEmpty(); -} - -Rectangle Graphics::getClipBounds() const -{ - return context.getClipBounds(); -} - -void Graphics::saveState() -{ - saveStateIfPending(); - saveStatePending = true; -} - -void Graphics::restoreState() -{ - if (saveStatePending) - saveStatePending = false; - else - context.restoreState(); -} - -void Graphics::saveStateIfPending() -{ - if (saveStatePending) - { - saveStatePending = false; - context.saveState(); - } -} - -void Graphics::setOrigin (Point newOrigin) -{ - saveStateIfPending(); - context.setOrigin (newOrigin); -} - -void Graphics::setOrigin (int x, int y) -{ - setOrigin (Point (x, y)); -} - -void Graphics::addTransform (const AffineTransform& transform) -{ - saveStateIfPending(); - context.addTransform (transform); -} - -bool Graphics::clipRegionIntersects (const Rectangle& area) const -{ - return context.clipRegionIntersects (area); -} - -void Graphics::beginTransparencyLayer (float layerOpacity) -{ - saveStateIfPending(); - context.beginTransparencyLayer (layerOpacity); -} - -void Graphics::endTransparencyLayer() -{ - context.endTransparencyLayer(); -} - -//============================================================================== -void Graphics::setColour (Colour newColour) -{ - saveStateIfPending(); - context.setFill (newColour); -} - -void Graphics::setOpacity (const float newOpacity) -{ - saveStateIfPending(); - context.setOpacity (newOpacity); -} - -void Graphics::setGradientFill (const ColourGradient& gradient) -{ - setFillType (gradient); -} - -void Graphics::setTiledImageFill (const Image& imageToUse, const int anchorX, const int anchorY, const float opacity) -{ - saveStateIfPending(); - context.setFill (FillType (imageToUse, AffineTransform::translation ((float) anchorX, (float) anchorY))); - context.setOpacity (opacity); -} - -void Graphics::setFillType (const FillType& newFill) -{ - saveStateIfPending(); - context.setFill (newFill); -} - -//============================================================================== -void Graphics::setFont (const Font& newFont) -{ - saveStateIfPending(); - context.setFont (newFont); -} - -void Graphics::setFont (const float newFontHeight) -{ - setFont (context.getFont().withHeight (newFontHeight)); -} - -Font Graphics::getCurrentFont() const -{ - return context.getFont(); -} - -//============================================================================== -void Graphics::drawSingleLineText (const String& text, const int startX, const int baselineY, - Justification justification) const -{ - if (text.isNotEmpty()) - { - // Don't pass any vertical placement flags to this method - they'll be ignored. - jassert (justification.getOnlyVerticalFlags() == 0); - - const int flags = justification.getOnlyHorizontalFlags(); - - if (flags == Justification::right) - { - if (startX < context.getClipBounds().getX()) - return; - } - else if (flags == Justification::left) - if (startX > context.getClipBounds().getRight()) - return; - - GlyphArrangement arr; - arr.addLineOfText (context.getFont(), text, (float) startX, (float) baselineY); - - if (flags != Justification::left) - { - float w = arr.getBoundingBox (0, -1, true).getWidth(); - - if ((flags & (Justification::horizontallyCentred | Justification::horizontallyJustified)) != 0) - w /= 2.0f; - - arr.draw (*this, AffineTransform::translation (-w, 0)); - } - else - { - arr.draw (*this); - } - } -} - -void Graphics::drawMultiLineText (const String& text, const int startX, - const int baselineY, const int maximumLineWidth) const -{ - if (text.isNotEmpty() - && startX < context.getClipBounds().getRight()) - { - GlyphArrangement arr; - arr.addJustifiedText (context.getFont(), text, - (float) startX, (float) baselineY, (float) maximumLineWidth, - Justification::left); - arr.draw (*this); - } -} - -void Graphics::drawText (const String& text, const Rectangle& area, - Justification justificationType, bool useEllipsesIfTooBig) const -{ - if (text.isNotEmpty() && context.clipRegionIntersects (area.getSmallestIntegerContainer())) - { - GlyphArrangement arr; - arr.addCurtailedLineOfText (context.getFont(), text, 0.0f, 0.0f, - area.getWidth(), useEllipsesIfTooBig); - - arr.justifyGlyphs (0, arr.getNumGlyphs(), - area.getX(), area.getY(), area.getWidth(), area.getHeight(), - justificationType); - arr.draw (*this); - } -} - -void Graphics::drawText (const String& text, const Rectangle& area, - Justification justificationType, bool useEllipsesIfTooBig) const -{ - drawText (text, area.toFloat(), justificationType, useEllipsesIfTooBig); -} - -void Graphics::drawText (const String& text, const int x, const int y, const int width, const int height, - Justification justificationType, const bool useEllipsesIfTooBig) const -{ - drawText (text, Rectangle (x, y, width, height), justificationType, useEllipsesIfTooBig); -} - -void Graphics::drawFittedText (const String& text, const Rectangle& area, - Justification justification, - const int maximumNumberOfLines, - const float minimumHorizontalScale) const -{ - if (text.isNotEmpty() && (! area.isEmpty()) && context.clipRegionIntersects (area)) - { - GlyphArrangement arr; - arr.addFittedText (context.getFont(), text, - (float) area.getX(), (float) area.getY(), - (float) area.getWidth(), (float) area.getHeight(), - justification, - maximumNumberOfLines, - minimumHorizontalScale); - - arr.draw (*this); - } -} - -void Graphics::drawFittedText (const String& text, const int x, const int y, const int width, const int height, - Justification justification, - const int maximumNumberOfLines, - const float minimumHorizontalScale) const -{ - drawFittedText (text, coordsToRectangle (x, y, width, height), - justification, maximumNumberOfLines, minimumHorizontalScale); -} - -//============================================================================== -void Graphics::fillRect (const Rectangle& r) const -{ - context.fillRect (r, false); -} - -void Graphics::fillRect (const Rectangle& r) const -{ - context.fillRect (r); -} - -void Graphics::fillRect (int x, int y, int width, int height) const -{ - context.fillRect (coordsToRectangle (x, y, width, height), false); -} - -void Graphics::fillRect (float x, float y, float width, float height) const -{ - fillRect (coordsToRectangle (x, y, width, height)); -} - -void Graphics::fillRectList (const RectangleList& rectangles) const -{ - context.fillRectList (rectangles); -} - -void Graphics::fillRectList (const RectangleList& rects) const -{ - for (const Rectangle* r = rects.begin(), * const e = rects.end(); r != e; ++r) - context.fillRect (*r, false); -} - -void Graphics::setPixel (int x, int y) const -{ - context.fillRect (Rectangle (x, y, 1, 1), false); -} - -void Graphics::fillAll() const -{ - fillRect (context.getClipBounds()); -} - -void Graphics::fillAll (Colour colourToUse) const -{ - if (! colourToUse.isTransparent()) - { - const Rectangle clip (context.getClipBounds()); - - context.saveState(); - context.setFill (colourToUse); - context.fillRect (clip, false); - context.restoreState(); - } -} - - -//============================================================================== -void Graphics::fillPath (const Path& path, const AffineTransform& transform) const -{ - if ((! context.isClipEmpty()) && ! path.isEmpty()) - context.fillPath (path, transform); -} - -void Graphics::strokePath (const Path& path, - const PathStrokeType& strokeType, - const AffineTransform& transform) const -{ - Path stroke; - strokeType.createStrokedPath (stroke, path, transform, context.getPhysicalPixelScaleFactor()); - fillPath (stroke); -} - -//============================================================================== -void Graphics::drawRect (float x, float y, float width, float height, float lineThickness) const -{ - drawRect (coordsToRectangle (x, y, width, height), lineThickness); -} - -void Graphics::drawRect (int x, int y, int width, int height, int lineThickness) const -{ - drawRect (coordsToRectangle (x, y, width, height), lineThickness); -} - -void Graphics::drawRect (const Rectangle& r, int lineThickness) const -{ - drawRect (r.toFloat(), (float) lineThickness); -} - -void Graphics::drawRect (Rectangle r, const float lineThickness) const -{ - RectangleList rects; - rects.addWithoutMerging (r.removeFromTop (lineThickness)); - rects.addWithoutMerging (r.removeFromBottom (lineThickness)); - rects.addWithoutMerging (r.removeFromLeft (lineThickness)); - rects.addWithoutMerging (r.removeFromRight (lineThickness)); - context.fillRectList (rects); -} - -//============================================================================== -void Graphics::fillEllipse (const Rectangle& area) const -{ - Path p; - p.addEllipse (area); - fillPath (p); -} - -void Graphics::fillEllipse (float x, float y, float w, float h) const -{ - fillEllipse (Rectangle (x, y, w, h)); -} - -void Graphics::drawEllipse (float x, float y, float width, float height, float lineThickness) const -{ - Path p; - p.addEllipse (x, y, width, height); - strokePath (p, PathStrokeType (lineThickness)); -} - -void Graphics::drawEllipse (const Rectangle& area, float lineThickness) const -{ - drawEllipse (area.getX(), area.getY(), area.getWidth(), area.getHeight(), lineThickness); -} - -void Graphics::fillRoundedRectangle (float x, float y, float width, float height, float cornerSize) const -{ - fillRoundedRectangle (coordsToRectangle (x, y, width, height), cornerSize); -} - -void Graphics::fillRoundedRectangle (const Rectangle& r, const float cornerSize) const -{ - Path p; - p.addRoundedRectangle (r, cornerSize); - fillPath (p); -} - -void Graphics::drawRoundedRectangle (float x, float y, float width, float height, - float cornerSize, float lineThickness) const -{ - drawRoundedRectangle (coordsToRectangle (x, y, width, height), cornerSize, lineThickness); -} - -void Graphics::drawRoundedRectangle (const Rectangle& r, float cornerSize, float lineThickness) const -{ - Path p; - p.addRoundedRectangle (r, cornerSize); - strokePath (p, PathStrokeType (lineThickness)); -} - -void Graphics::drawArrow (const Line& line, float lineThickness, float arrowheadWidth, float arrowheadLength) const -{ - Path p; - p.addArrow (line, lineThickness, arrowheadWidth, arrowheadLength); - fillPath (p); -} - -void Graphics::fillCheckerBoard (const Rectangle& area, - const int checkWidth, const int checkHeight, - Colour colour1, Colour colour2) const -{ - jassert (checkWidth > 0 && checkHeight > 0); // can't be zero or less! - - if (checkWidth > 0 && checkHeight > 0) - { - context.saveState(); - - if (colour1 == colour2) - { - context.setFill (colour1); - context.fillRect (area, false); - } - else - { - const Rectangle clipped (context.getClipBounds().getIntersection (area)); - - if (! clipped.isEmpty()) - { - context.clipToRectangle (clipped); - - const int checkNumX = (clipped.getX() - area.getX()) / checkWidth; - const int checkNumY = (clipped.getY() - area.getY()) / checkHeight; - const int startX = area.getX() + checkNumX * checkWidth; - const int startY = area.getY() + checkNumY * checkHeight; - const int right = clipped.getRight(); - const int bottom = clipped.getBottom(); - - for (int i = 0; i < 2; ++i) - { - context.setFill (i == ((checkNumX ^ checkNumY) & 1) ? colour1 : colour2); - - int cy = i; - for (int y = startY; y < bottom; y += checkHeight) - for (int x = startX + (cy++ & 1) * checkWidth; x < right; x += checkWidth * 2) - context.fillRect (Rectangle (x, y, checkWidth, checkHeight), false); - } - } - } - - context.restoreState(); - } -} - -//============================================================================== -void Graphics::drawVerticalLine (const int x, float top, float bottom) const -{ - if (top < bottom) - context.fillRect (Rectangle ((float) x, top, 1.0f, bottom - top)); -} - -void Graphics::drawHorizontalLine (const int y, float left, float right) const -{ - if (left < right) - context.fillRect (Rectangle (left, (float) y, right - left, 1.0f)); -} - -void Graphics::drawLine (const Line& line) const -{ - context.drawLine (line); -} - -void Graphics::drawLine (float x1, float y1, float x2, float y2) const -{ - context.drawLine (Line (x1, y1, x2, y2)); -} - -void Graphics::drawLine (float x1, float y1, float x2, float y2, float lineThickness) const -{ - drawLine (Line (x1, y1, x2, y2), lineThickness); -} - -void Graphics::drawLine (const Line& line, const float lineThickness) const -{ - Path p; - p.addLineSegment (line, lineThickness); - fillPath (p); -} - -void Graphics::drawDashedLine (const Line& line, const float* const dashLengths, - const int numDashLengths, const float lineThickness, int n) const -{ - jassert (n >= 0 && n < numDashLengths); // your start index must be valid! - - const Point delta ((line.getEnd() - line.getStart()).toDouble()); - const double totalLen = delta.getDistanceFromOrigin(); - - if (totalLen >= 0.1) - { - const double onePixAlpha = 1.0 / totalLen; - - for (double alpha = 0.0; alpha < 1.0;) - { - jassert (dashLengths[n] > 0); // can't have zero-length dashes! - - const double lastAlpha = alpha; - alpha += dashLengths [n] * onePixAlpha; - n = (n + 1) % numDashLengths; - - if ((n & 1) != 0) - { - const Line segment (line.getStart() + (delta * lastAlpha).toFloat(), - line.getStart() + (delta * jmin (1.0, alpha)).toFloat()); - - if (lineThickness != 1.0f) - drawLine (segment, lineThickness); - else - context.drawLine (segment); - } - } - } -} - -//============================================================================== -void Graphics::setImageResamplingQuality (const Graphics::ResamplingQuality newQuality) -{ - saveStateIfPending(); - context.setInterpolationQuality (newQuality); -} - -//============================================================================== -void Graphics::drawImageAt (const Image& imageToDraw, int x, int y, bool fillAlphaChannel) const -{ - drawImageTransformed (imageToDraw, - AffineTransform::translation ((float) x, (float) y), - fillAlphaChannel); -} - -void Graphics::drawImageWithin (const Image& imageToDraw, - int dx, int dy, int dw, int dh, - RectanglePlacement placementWithinTarget, - const bool fillAlphaChannelWithCurrentBrush) const -{ - if (imageToDraw.isValid()) - drawImageTransformed (imageToDraw, - placementWithinTarget.getTransformToFit (imageToDraw.getBounds().toFloat(), - coordsToRectangle (dx, dy, dw, dh).toFloat()), - fillAlphaChannelWithCurrentBrush); -} - -void Graphics::drawImage (const Image& imageToDraw, - int dx, int dy, int dw, int dh, - int sx, int sy, int sw, int sh, - const bool fillAlphaChannelWithCurrentBrush) const -{ - if (imageToDraw.isValid() && context.clipRegionIntersects (coordsToRectangle (dx, dy, dw, dh))) - drawImageTransformed (imageToDraw.getClippedImage (coordsToRectangle (sx, sy, sw, sh)), - AffineTransform::scale (dw / (float) sw, dh / (float) sh) - .translated ((float) dx, (float) dy), - fillAlphaChannelWithCurrentBrush); -} - -void Graphics::drawImageTransformed (const Image& imageToDraw, - const AffineTransform& transform, - const bool fillAlphaChannelWithCurrentBrush) const -{ - if (imageToDraw.isValid() && ! context.isClipEmpty()) - { - if (fillAlphaChannelWithCurrentBrush) - { - context.saveState(); - context.clipToImageAlpha (imageToDraw, transform); - fillAll(); - context.restoreState(); - } - else - { - context.drawImage (imageToDraw, transform); - } - } -} - -//============================================================================== -Graphics::ScopedSaveState::ScopedSaveState (Graphics& g) : context (g) -{ - context.saveState(); -} - -Graphics::ScopedSaveState::~ScopedSaveState() -{ - context.restoreState(); -} diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h b/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h deleted file mode 100755 index ed0bc40..0000000 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_GraphicsContext.h +++ /dev/null @@ -1,730 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_GRAPHICSCONTEXT_H_INCLUDED -#define JUCE_GRAPHICSCONTEXT_H_INCLUDED - - -//============================================================================== -/** - A graphics context, used for drawing a component or image. - - When a Component needs painting, a Graphics context is passed to its - Component::paint() method, and this you then call methods within this - object to actually draw the component's content. - - A Graphics can also be created from an image, to allow drawing directly onto - that image. - - @see Component::paint -*/ -class JUCE_API Graphics -{ -public: - //============================================================================== - /** Creates a Graphics object to draw directly onto the given image. - - The graphics object that is created will be set up to draw onto the image, - with the context's clipping area being the entire size of the image, and its - origin being the image's origin. To draw into a subsection of an image, use the - reduceClipRegion() and setOrigin() methods. - - Obviously you shouldn't delete the image before this context is deleted. - */ - explicit Graphics (const Image& imageToDrawOnto); - - /** Destructor. */ - ~Graphics(); - - //============================================================================== - /** Changes the current drawing colour. - - This sets the colour that will now be used for drawing operations - it also - sets the opacity to that of the colour passed-in. - - If a brush is being used when this method is called, the brush will be deselected, - and any subsequent drawing will be done with a solid colour brush instead. - - @see setOpacity - */ - void setColour (Colour newColour); - - /** Changes the opacity to use with the current colour. - - If a solid colour is being used for drawing, this changes its opacity - to this new value (i.e. it doesn't multiply the colour's opacity by this amount). - - If a gradient is being used, this will have no effect on it. - - A value of 0.0 is completely transparent, 1.0 is completely opaque. - */ - void setOpacity (float newOpacity); - - /** Sets the context to use a gradient for its fill pattern. - */ - void setGradientFill (const ColourGradient& gradient); - - /** Sets the context to use a tiled image pattern for filling. - Make sure that you don't delete this image while it's still being used by - this context! - */ - void setTiledImageFill (const Image& imageToUse, - int anchorX, int anchorY, - float opacity); - - /** Changes the current fill settings. - @see setColour, setGradientFill, setTiledImageFill - */ - void setFillType (const FillType& newFill); - - //============================================================================== - /** Changes the font to use for subsequent text-drawing functions. - - Note there's also a setFont (float, int) method to quickly change the size and - style of the current font. - - @see drawSingleLineText, drawMultiLineText, drawText, drawFittedText - */ - void setFont (const Font& newFont); - - /** Changes the size of the currently-selected font. - This is a convenient shortcut that changes the context's current font to a - different size. The typeface won't be changed. - @see Font - */ - void setFont (float newFontHeight); - - /** Returns the currently selected font. */ - Font getCurrentFont() const; - - /** Draws a one-line text string. - - This will use the current colour (or brush) to fill the text. The font is the last - one specified by setFont(). - - @param text the string to draw - @param startX the position to draw the left-hand edge of the text - @param baselineY the position of the text's baseline - @param justification the horizontal flags indicate which end of the text string is - anchored at the specified point. - @see drawMultiLineText, drawText, drawFittedText, GlyphArrangement::addLineOfText - */ - void drawSingleLineText (const String& text, - int startX, int baselineY, - Justification justification = Justification::left) const; - - /** Draws text across multiple lines. - - This will break the text onto a new line where there's a new-line or - carriage-return character, or at a word-boundary when the text becomes wider - than the size specified by the maximumLineWidth parameter. - - @see setFont, drawSingleLineText, drawFittedText, GlyphArrangement::addJustifiedText - */ - void drawMultiLineText (const String& text, - int startX, int baselineY, - int maximumLineWidth) const; - - /** Draws a line of text within a specified rectangle. - - The text will be positioned within the rectangle based on the justification - flags passed-in. If the string is too long to fit inside the rectangle, it will - either be truncated or will have ellipsis added to its end (if the useEllipsesIfTooBig - flag is true). - - @see drawSingleLineText, drawFittedText, drawMultiLineText, GlyphArrangement::addJustifiedText - */ - void drawText (const String& text, - int x, int y, int width, int height, - Justification justificationType, - bool useEllipsesIfTooBig = true) const; - - /** Draws a line of text within a specified rectangle. - - The text will be positioned within the rectangle based on the justification - flags passed-in. If the string is too long to fit inside the rectangle, it will - either be truncated or will have ellipsis added to its end (if the useEllipsesIfTooBig - flag is true). - - @see drawSingleLineText, drawFittedText, drawMultiLineText, GlyphArrangement::addJustifiedText - */ - void drawText (const String& text, - const Rectangle& area, - Justification justificationType, - bool useEllipsesIfTooBig = true) const; - - /** Draws a line of text within a specified rectangle. - - The text will be positioned within the rectangle based on the justification - flags passed-in. If the string is too long to fit inside the rectangle, it will - either be truncated or will have ellipsis added to its end (if the useEllipsesIfTooBig - flag is true). - - @see drawSingleLineText, drawFittedText, drawMultiLineText, GlyphArrangement::addJustifiedText - */ - void drawText (const String& text, - const Rectangle& area, - Justification justificationType, - bool useEllipsesIfTooBig = true) const; - - /** Tries to draw a text string inside a given space. - - This does its best to make the given text readable within the specified rectangle, - so it useful for labelling things. - - If the text is too big, it'll be squashed horizontally or broken over multiple lines - if the maximumLinesToUse value allows this. If the text just won't fit into the space, - it'll cram as much as possible in there, and put some ellipsis at the end to show that - it's been truncated. - - A Justification parameter lets you specify how the text is laid out within the rectangle, - both horizontally and vertically. - - The minimumHorizontalScale parameter specifies how much the text can be squashed horizontally - to try to squeeze it into the space. If you don't want any horizontal scaling to occur, you - can set this value to 1.0f. - - @see GlyphArrangement::addFittedText - */ - void drawFittedText (const String& text, - int x, int y, int width, int height, - Justification justificationFlags, - int maximumNumberOfLines, - float minimumHorizontalScale = 0.7f) const; - - /** Tries to draw a text string inside a given space. - - This does its best to make the given text readable within the specified rectangle, - so it useful for labelling things. - - If the text is too big, it'll be squashed horizontally or broken over multiple lines - if the maximumLinesToUse value allows this. If the text just won't fit into the space, - it'll cram as much as possible in there, and put some ellipsis at the end to show that - it's been truncated. - - A Justification parameter lets you specify how the text is laid out within the rectangle, - both horizontally and vertically. - - The minimumHorizontalScale parameter specifies how much the text can be squashed horizontally - to try to squeeze it into the space. If you don't want any horizontal scaling to occur, you - can set this value to 1.0f. - - @see GlyphArrangement::addFittedText - */ - void drawFittedText (const String& text, - const Rectangle& area, - Justification justificationFlags, - int maximumNumberOfLines, - float minimumHorizontalScale = 0.7f) const; - - //============================================================================== - /** Fills the context's entire clip region with the current colour or brush. - - (See also the fillAll (Colour) method which is a quick way of filling - it with a given colour). - */ - void fillAll() const; - - /** Fills the context's entire clip region with a given colour. - - This leaves the context's current colour and brush unchanged, it just - uses the specified colour temporarily. - */ - void fillAll (Colour colourToUse) const; - - //============================================================================== - /** Fills a rectangle with the current colour or brush. - @see drawRect, fillRoundedRectangle - */ - void fillRect (const Rectangle& rectangle) const; - - /** Fills a rectangle with the current colour or brush. - @see drawRect, fillRoundedRectangle - */ - void fillRect (const Rectangle& rectangle) const; - - /** Fills a rectangle with the current colour or brush. - @see drawRect, fillRoundedRectangle - */ - void fillRect (int x, int y, int width, int height) const; - - /** Fills a rectangle with the current colour or brush. - @see drawRect, fillRoundedRectangle - */ - void fillRect (float x, float y, float width, float height) const; - - /** Fills a set of rectangles using the current colour or brush. - If you have a lot of rectangles to draw, it may be more efficient - to create a RectangleList and use this method than to call fillRect() - multiple times. - */ - void fillRectList (const RectangleList& rectangles) const; - - /** Fills a set of rectangles using the current colour or brush. - If you have a lot of rectangles to draw, it may be more efficient - to create a RectangleList and use this method than to call fillRect() - multiple times. - */ - void fillRectList (const RectangleList& rectangles) const; - - /** Uses the current colour or brush to fill a rectangle with rounded corners. - @see drawRoundedRectangle, Path::addRoundedRectangle - */ - void fillRoundedRectangle (float x, float y, float width, float height, - float cornerSize) const; - - /** Uses the current colour or brush to fill a rectangle with rounded corners. - @see drawRoundedRectangle, Path::addRoundedRectangle - */ - void fillRoundedRectangle (const Rectangle& rectangle, - float cornerSize) const; - - /** Fills a rectangle with a checkerboard pattern, alternating between two colours. */ - void fillCheckerBoard (const Rectangle& area, - int checkWidth, int checkHeight, - Colour colour1, Colour colour2) const; - - /** Draws a rectangular outline, using the current colour or brush. - The lines are drawn inside the given rectangle, and greater line thicknesses extend inwards. - @see fillRect - */ - void drawRect (int x, int y, int width, int height, int lineThickness = 1) const; - - /** Draws a rectangular outline, using the current colour or brush. - The lines are drawn inside the given rectangle, and greater line thicknesses extend inwards. - @see fillRect - */ - void drawRect (float x, float y, float width, float height, float lineThickness = 1.0f) const; - - /** Draws a rectangular outline, using the current colour or brush. - The lines are drawn inside the given rectangle, and greater line thicknesses extend inwards. - @see fillRect - */ - void drawRect (const Rectangle& rectangle, int lineThickness = 1) const; - - /** Draws a rectangular outline, using the current colour or brush. - The lines are drawn inside the given rectangle, and greater line thicknesses extend inwards. - @see fillRect - */ - void drawRect (Rectangle rectangle, float lineThickness = 1.0f) const; - - /** Uses the current colour or brush to draw the outline of a rectangle with rounded corners. - @see fillRoundedRectangle, Path::addRoundedRectangle - */ - void drawRoundedRectangle (float x, float y, float width, float height, - float cornerSize, float lineThickness) const; - - /** Uses the current colour or brush to draw the outline of a rectangle with rounded corners. - @see fillRoundedRectangle, Path::addRoundedRectangle - */ - void drawRoundedRectangle (const Rectangle& rectangle, - float cornerSize, float lineThickness) const; - - /** Fills a 1x1 pixel using the current colour or brush. - Note that because the context may be transformed, this is effectively the same as - calling fillRect (x, y, 1, 1), and the actual result may involve multiple pixels. - */ - void setPixel (int x, int y) const; - - //============================================================================== - /** Fills an ellipse with the current colour or brush. - The ellipse is drawn to fit inside the given rectangle. - @see drawEllipse, Path::addEllipse - */ - void fillEllipse (float x, float y, float width, float height) const; - - /** Fills an ellipse with the current colour or brush. - The ellipse is drawn to fit inside the given rectangle. - @see drawEllipse, Path::addEllipse - */ - void fillEllipse (const Rectangle& area) const; - - /** Draws an elliptical stroke using the current colour or brush. - @see fillEllipse, Path::addEllipse - */ - void drawEllipse (float x, float y, float width, float height, - float lineThickness) const; - - /** Draws an elliptical stroke using the current colour or brush. - @see fillEllipse, Path::addEllipse - */ - void drawEllipse (const Rectangle& area, float lineThickness) const; - - //============================================================================== - /** Draws a line between two points. - The line is 1 pixel wide and drawn with the current colour or brush. - */ - void drawLine (float startX, float startY, float endX, float endY) const; - - /** Draws a line between two points with a given thickness. - @see Path::addLineSegment - */ - void drawLine (float startX, float startY, float endX, float endY, float lineThickness) const; - - /** Draws a line between two points. - The line is 1 pixel wide and drawn with the current colour or brush. - */ - void drawLine (const Line& line) const; - - /** Draws a line between two points with a given thickness. - @see Path::addLineSegment - */ - void drawLine (const Line& line, float lineThickness) const; - - /** Draws a dashed line using a custom set of dash-lengths. - - @param line the line to draw - @param dashLengths a series of lengths to specify the on/off lengths - e.g. - { 4, 5, 6, 7 } will draw a line of 4 pixels, skip 5 pixels, - draw 6 pixels, skip 7 pixels, and then repeat. - @param numDashLengths the number of elements in the array (this must be an even number). - @param lineThickness the thickness of the line to draw - @param dashIndexToStartFrom the index in the dash-length array to use for the first segment - @see PathStrokeType::createDashedStroke - */ - void drawDashedLine (const Line& line, - const float* dashLengths, int numDashLengths, - float lineThickness = 1.0f, - int dashIndexToStartFrom = 0) const; - - /** Draws a vertical line of pixels at a given x position. - - The x position is an integer, but the top and bottom of the line can be sub-pixel - positions, and these will be anti-aliased if necessary. - - The bottom parameter must be greater than or equal to the top parameter. - */ - void drawVerticalLine (int x, float top, float bottom) const; - - /** Draws a horizontal line of pixels at a given y position. - - The y position is an integer, but the left and right ends of the line can be sub-pixel - positions, and these will be anti-aliased if necessary. - - The right parameter must be greater than or equal to the left parameter. - */ - void drawHorizontalLine (int y, float left, float right) const; - - //============================================================================== - /** Fills a path using the currently selected colour or brush. */ - void fillPath (const Path& path, - const AffineTransform& transform = AffineTransform::identity) const; - - /** Draws a path's outline using the currently selected colour or brush. */ - void strokePath (const Path& path, - const PathStrokeType& strokeType, - const AffineTransform& transform = AffineTransform::identity) const; - - /** Draws a line with an arrowhead at its end. - - @param line the line to draw - @param lineThickness the thickness of the line - @param arrowheadWidth the width of the arrow head (perpendicular to the line) - @param arrowheadLength the length of the arrow head (along the length of the line) - */ - void drawArrow (const Line& line, - float lineThickness, - float arrowheadWidth, - float arrowheadLength) const; - - - //============================================================================== - /** Types of rendering quality that can be specified when drawing images. - - @see blendImage, Graphics::setImageResamplingQuality - */ - enum ResamplingQuality - { - lowResamplingQuality = 0, /**< Just uses a nearest-neighbour algorithm for resampling. */ - mediumResamplingQuality = 1, /**< Uses bilinear interpolation for upsampling and area-averaging for downsampling. */ - highResamplingQuality = 2 /**< Uses bicubic interpolation for upsampling and area-averaging for downsampling. */ - }; - - /** Changes the quality that will be used when resampling images. - By default a Graphics object will be set to mediumRenderingQuality. - @see Graphics::drawImage, Graphics::drawImageTransformed, Graphics::drawImageWithin - */ - void setImageResamplingQuality (const ResamplingQuality newQuality); - - /** Draws an image. - - This will draw the whole of an image, positioning its top-left corner at the - given coordinates, and keeping its size the same. This is the simplest image - drawing method - the others give more control over the scaling and clipping - of the images. - - Images are composited using the context's current opacity, so if you - don't want it to be drawn semi-transparently, be sure to call setOpacity (1.0f) - (or setColour() with an opaque colour) before drawing images. - */ - void drawImageAt (const Image& imageToDraw, int topLeftX, int topLeftY, - bool fillAlphaChannelWithCurrentBrush = false) const; - - /** Draws part of an image, rescaling it to fit in a given target region. - - The specified area of the source image is rescaled and drawn to fill the - specifed destination rectangle. - - Images are composited using the context's current opacity, so if you - don't want it to be drawn semi-transparently, be sure to call setOpacity (1.0f) - (or setColour() with an opaque colour) before drawing images. - - @param imageToDraw the image to overlay - @param destX the left of the destination rectangle - @param destY the top of the destination rectangle - @param destWidth the width of the destination rectangle - @param destHeight the height of the destination rectangle - @param sourceX the left of the rectangle to copy from the source image - @param sourceY the top of the rectangle to copy from the source image - @param sourceWidth the width of the rectangle to copy from the source image - @param sourceHeight the height of the rectangle to copy from the source image - @param fillAlphaChannelWithCurrentBrush if true, then instead of drawing the source image's pixels, - the source image's alpha channel is used as a mask with - which to fill the destination using the current colour - or brush. (If the source is has no alpha channel, then - it will just fill the target with a solid rectangle) - @see setImageResamplingQuality, drawImageAt, drawImageWithin, fillAlphaMap - */ - void drawImage (const Image& imageToDraw, - int destX, int destY, int destWidth, int destHeight, - int sourceX, int sourceY, int sourceWidth, int sourceHeight, - bool fillAlphaChannelWithCurrentBrush = false) const; - - /** Draws an image, having applied an affine transform to it. - - This lets you throw the image around in some wacky ways, rotate it, shear, - scale it, etc. - - Images are composited using the context's current opacity, so if you - don't want it to be drawn semi-transparently, be sure to call setOpacity (1.0f) - (or setColour() with an opaque colour) before drawing images. - - If fillAlphaChannelWithCurrentBrush is set to true, then the image's RGB channels - are ignored and it is filled with the current brush, masked by its alpha channel. - - If you want to render only a subsection of an image, use Image::getClippedImage() to - create the section that you need. - - @see setImageResamplingQuality, drawImage - */ - void drawImageTransformed (const Image& imageToDraw, - const AffineTransform& transform, - bool fillAlphaChannelWithCurrentBrush = false) const; - - /** Draws an image to fit within a designated rectangle. - - If the image is too big or too small for the space, it will be rescaled - to fit as nicely as it can do without affecting its aspect ratio. It will - then be placed within the target rectangle according to the justification flags - specified. - - @param imageToDraw the source image to draw - @param destX top-left of the target rectangle to fit it into - @param destY top-left of the target rectangle to fit it into - @param destWidth size of the target rectangle to fit the image into - @param destHeight size of the target rectangle to fit the image into - @param placementWithinTarget this specifies how the image should be positioned - within the target rectangle - see the RectanglePlacement - class for more details about this. - @param fillAlphaChannelWithCurrentBrush if true, then instead of drawing the image, just its - alpha channel will be used as a mask with which to - draw with the current brush or colour. This is - similar to fillAlphaMap(), and see also drawImage() - @see setImageResamplingQuality, drawImage, drawImageTransformed, drawImageAt, RectanglePlacement - */ - void drawImageWithin (const Image& imageToDraw, - int destX, int destY, int destWidth, int destHeight, - RectanglePlacement placementWithinTarget, - bool fillAlphaChannelWithCurrentBrush = false) const; - - - //============================================================================== - /** Returns the position of the bounding box for the current clipping region. - @see getClipRegion, clipRegionIntersects - */ - Rectangle getClipBounds() const; - - /** Checks whether a rectangle overlaps the context's clipping region. - - If this returns false, no part of the given area can be drawn onto, so this - method can be used to optimise a component's paint() method, by letting it - avoid drawing complex objects that aren't within the region being repainted. - */ - bool clipRegionIntersects (const Rectangle& area) const; - - /** Intersects the current clipping region with another region. - - @returns true if the resulting clipping region is non-zero in size - @see setOrigin, clipRegionIntersects - */ - bool reduceClipRegion (int x, int y, int width, int height); - - /** Intersects the current clipping region with another region. - - @returns true if the resulting clipping region is non-zero in size - @see setOrigin, clipRegionIntersects - */ - bool reduceClipRegion (const Rectangle& area); - - /** Intersects the current clipping region with a rectangle list region. - - @returns true if the resulting clipping region is non-zero in size - @see setOrigin, clipRegionIntersects - */ - bool reduceClipRegion (const RectangleList& clipRegion); - - /** Intersects the current clipping region with a path. - - @returns true if the resulting clipping region is non-zero in size - @see reduceClipRegion - */ - bool reduceClipRegion (const Path& path, const AffineTransform& transform = AffineTransform::identity); - - /** Intersects the current clipping region with an image's alpha-channel. - - The current clipping path is intersected with the area covered by this image's - alpha-channel, after the image has been transformed by the specified matrix. - - @param image the image whose alpha-channel should be used. If the image doesn't - have an alpha-channel, it is treated as entirely opaque. - @param transform a matrix to apply to the image - @returns true if the resulting clipping region is non-zero in size - @see reduceClipRegion - */ - bool reduceClipRegion (const Image& image, const AffineTransform& transform); - - /** Excludes a rectangle to stop it being drawn into. */ - void excludeClipRegion (const Rectangle& rectangleToExclude); - - /** Returns true if no drawing can be done because the clip region is zero. */ - bool isClipEmpty() const; - - //============================================================================== - /** Saves the current graphics state on an internal stack. - To restore the state, use restoreState(). - @see ScopedSaveState - */ - void saveState(); - - /** Restores a graphics state that was previously saved with saveState(). - @see ScopedSaveState - */ - void restoreState(); - - /** Uses RAII to save and restore the state of a graphics context. - On construction, this calls Graphics::saveState(), and on destruction it calls - Graphics::restoreState() on the Graphics object that you supply. - */ - class ScopedSaveState - { - public: - ScopedSaveState (Graphics&); - ~ScopedSaveState(); - - private: - Graphics& context; - JUCE_DECLARE_NON_COPYABLE (ScopedSaveState) - }; - - //============================================================================== - /** Begins rendering to an off-screen bitmap which will later be flattened onto the current - context with the given opacity. - - The context uses an internal stack of temporary image layers to do this. When you've - finished drawing to the layer, call endTransparencyLayer() to complete the operation and - composite the finished layer. Every call to beginTransparencyLayer() MUST be matched - by a corresponding call to endTransparencyLayer()! - - This call also saves the current state, and endTransparencyLayer() restores it. - */ - void beginTransparencyLayer (float layerOpacity); - - /** Completes a drawing operation to a temporary semi-transparent buffer. - See beginTransparencyLayer() for more details. - */ - void endTransparencyLayer(); - - /** Moves the position of the context's origin. - - This changes the position that the context considers to be (0, 0) to - the specified position. - - So if you call setOrigin with (100, 100), then the position that was previously - referred to as (100, 100) will subsequently be considered to be (0, 0). - - @see reduceClipRegion, addTransform - */ - void setOrigin (Point newOrigin); - - /** Moves the position of the context's origin. - - This changes the position that the context considers to be (0, 0) to - the specified position. - - So if you call setOrigin (100, 100), then the position that was previously - referred to as (100, 100) will subsequently be considered to be (0, 0). - - @see reduceClipRegion, addTransform - */ - void setOrigin (int newOriginX, int newOriginY); - - /** Adds a transformation which will be performed on all the graphics operations that - the context subsequently performs. - - After calling this, all the coordinates that are passed into the context will be - transformed by this matrix. - - @see setOrigin - */ - void addTransform (const AffineTransform& transform); - - /** Resets the current colour, brush, and font to default settings. */ - void resetToDefaultState(); - - /** Returns true if this context is drawing to a vector-based device, such as a printer. */ - bool isVectorDevice() const; - - //============================================================================== - /** Create a graphics that draws with a given low-level renderer. - This method is intended for use only by people who know what they're doing. - Note that the LowLevelGraphicsContext will NOT be deleted by this object. - */ - Graphics (LowLevelGraphicsContext&) noexcept; - - /** @internal */ - LowLevelGraphicsContext& getInternalContext() const noexcept { return context; } - -private: - //============================================================================== - LowLevelGraphicsContext& context; - ScopedPointer contextToDelete; - - bool saveStatePending; - void saveStateIfPending(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Graphics) -}; - - -#endif // JUCE_GRAPHICSCONTEXT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h deleted file mode 100755 index 8a0176f..0000000 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsContext.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_LOWLEVELGRAPHICSCONTEXT_H_INCLUDED -#define JUCE_LOWLEVELGRAPHICSCONTEXT_H_INCLUDED - - -//============================================================================== -/** - Interface class for graphics context objects, used internally by the Graphics class. - - Users are not supposed to create instances of this class directly - do your drawing - via the Graphics object instead. - - It's a base class for different types of graphics context, that may perform software-based - or OS-accelerated rendering. - - E.g. the LowLevelGraphicsSoftwareRenderer renders onto an image in memory, but other - subclasses could render directly to a windows HDC, a Quartz context, or an OpenGL - context. -*/ -class JUCE_API LowLevelGraphicsContext -{ -protected: - //============================================================================== - LowLevelGraphicsContext(); - -public: - virtual ~LowLevelGraphicsContext(); - - /** Returns true if this device is vector-based, e.g. a printer. */ - virtual bool isVectorDevice() const = 0; - - //============================================================================== - /** Moves the origin to a new position. - - The coordinates are relative to the current origin, and indicate the new position - of (0, 0). - */ - virtual void setOrigin (Point) = 0; - virtual void addTransform (const AffineTransform&) = 0; - virtual float getPhysicalPixelScaleFactor() = 0; - - virtual bool clipToRectangle (const Rectangle&) = 0; - virtual bool clipToRectangleList (const RectangleList&) = 0; - virtual void excludeClipRectangle (const Rectangle&) = 0; - virtual void clipToPath (const Path&, const AffineTransform&) = 0; - virtual void clipToImageAlpha (const Image&, const AffineTransform&) = 0; - - virtual bool clipRegionIntersects (const Rectangle&) = 0; - virtual Rectangle getClipBounds() const = 0; - virtual bool isClipEmpty() const = 0; - - virtual void saveState() = 0; - virtual void restoreState() = 0; - - virtual void beginTransparencyLayer (float opacity) = 0; - virtual void endTransparencyLayer() = 0; - - //============================================================================== - virtual void setFill (const FillType&) = 0; - virtual void setOpacity (float) = 0; - virtual void setInterpolationQuality (Graphics::ResamplingQuality) = 0; - - //============================================================================== - virtual void fillRect (const Rectangle&, bool replaceExistingContents) = 0; - virtual void fillRect (const Rectangle&) = 0; - virtual void fillRectList (const RectangleList&) = 0; - virtual void fillPath (const Path&, const AffineTransform&) = 0; - virtual void drawImage (const Image&, const AffineTransform&) = 0; - virtual void drawLine (const Line&) = 0; - - virtual void setFont (const Font&) = 0; - virtual const Font& getFont() = 0; - virtual void drawGlyph (int glyphNumber, const AffineTransform&) = 0; - virtual bool drawTextLayout (const AttributedString&, const Rectangle&) { return false; } -}; - - -#endif // JUCE_LOWLEVELGRAPHICSCONTEXT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp deleted file mode 100755 index d963ed6..0000000 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp +++ /dev/null @@ -1,533 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// this will throw an assertion if you try to draw something that's not -// possible in postscript -#define WARN_ABOUT_NON_POSTSCRIPT_OPERATIONS 0 - -//============================================================================== -#if JUCE_DEBUG && WARN_ABOUT_NON_POSTSCRIPT_OPERATIONS - #define notPossibleInPostscriptAssert jassertfalse -#else - #define notPossibleInPostscriptAssert -#endif - -//============================================================================== -LowLevelGraphicsPostScriptRenderer::LowLevelGraphicsPostScriptRenderer (OutputStream& resultingPostScript, - const String& documentTitle, - const int totalWidth_, - const int totalHeight_) - : out (resultingPostScript), - totalWidth (totalWidth_), - totalHeight (totalHeight_), - needToClip (true) -{ - stateStack.add (new SavedState()); - stateStack.getLast()->clip = Rectangle (totalWidth_, totalHeight_); - - const float scale = jmin ((520.0f / totalWidth_), (750.0f / totalHeight)); - - out << "%!PS-Adobe-3.0 EPSF-3.0" - "\n%%BoundingBox: 0 0 600 824" - "\n%%Pages: 0" - "\n%%Creator: Raw Material Software JUCE" - "\n%%Title: " << documentTitle << - "\n%%CreationDate: none" - "\n%%LanguageLevel: 2" - "\n%%EndComments" - "\n%%BeginProlog" - "\n%%BeginResource: JRes" - "\n/bd {bind def} bind def" - "\n/c {setrgbcolor} bd" - "\n/m {moveto} bd" - "\n/l {lineto} bd" - "\n/rl {rlineto} bd" - "\n/ct {curveto} bd" - "\n/cp {closepath} bd" - "\n/pr {3 index 3 index moveto 1 index 0 rlineto 0 1 index rlineto pop neg 0 rlineto pop pop closepath} bd" - "\n/doclip {initclip newpath} bd" - "\n/endclip {clip newpath} bd" - "\n%%EndResource" - "\n%%EndProlog" - "\n%%BeginSetup" - "\n%%EndSetup" - "\n%%Page: 1 1" - "\n%%BeginPageSetup" - "\n%%EndPageSetup\n\n" - << "40 800 translate\n" - << scale << ' ' << scale << " scale\n\n"; -} - -LowLevelGraphicsPostScriptRenderer::~LowLevelGraphicsPostScriptRenderer() -{ -} - -//============================================================================== -bool LowLevelGraphicsPostScriptRenderer::isVectorDevice() const -{ - return true; -} - -void LowLevelGraphicsPostScriptRenderer::setOrigin (Point o) -{ - if (! o.isOrigin()) - { - stateStack.getLast()->xOffset += o.x; - stateStack.getLast()->yOffset += o.y; - needToClip = true; - } -} - -void LowLevelGraphicsPostScriptRenderer::addTransform (const AffineTransform& /*transform*/) -{ - //xxx - jassertfalse; -} - -float LowLevelGraphicsPostScriptRenderer::getPhysicalPixelScaleFactor() { return 1.0f; } - -bool LowLevelGraphicsPostScriptRenderer::clipToRectangle (const Rectangle& r) -{ - needToClip = true; - return stateStack.getLast()->clip.clipTo (r.translated (stateStack.getLast()->xOffset, stateStack.getLast()->yOffset)); -} - -bool LowLevelGraphicsPostScriptRenderer::clipToRectangleList (const RectangleList& clipRegion) -{ - needToClip = true; - return stateStack.getLast()->clip.clipTo (clipRegion); -} - -void LowLevelGraphicsPostScriptRenderer::excludeClipRectangle (const Rectangle& r) -{ - needToClip = true; - stateStack.getLast()->clip.subtract (r.translated (stateStack.getLast()->xOffset, stateStack.getLast()->yOffset)); -} - -void LowLevelGraphicsPostScriptRenderer::clipToPath (const Path& path, const AffineTransform& transform) -{ - writeClip(); - - Path p (path); - p.applyTransform (transform.translated ((float) stateStack.getLast()->xOffset, (float) stateStack.getLast()->yOffset)); - writePath (p); - out << "clip\n"; -} - -void LowLevelGraphicsPostScriptRenderer::clipToImageAlpha (const Image& /*sourceImage*/, const AffineTransform& /*transform*/) -{ - needToClip = true; - jassertfalse; // xxx -} - -bool LowLevelGraphicsPostScriptRenderer::clipRegionIntersects (const Rectangle& r) -{ - return stateStack.getLast()->clip.intersectsRectangle (r.translated (stateStack.getLast()->xOffset, stateStack.getLast()->yOffset)); -} - -Rectangle LowLevelGraphicsPostScriptRenderer::getClipBounds() const -{ - return stateStack.getLast()->clip.getBounds().translated (-stateStack.getLast()->xOffset, - -stateStack.getLast()->yOffset); -} - -bool LowLevelGraphicsPostScriptRenderer::isClipEmpty() const -{ - return stateStack.getLast()->clip.isEmpty(); -} - -//============================================================================== -LowLevelGraphicsPostScriptRenderer::SavedState::SavedState() - : xOffset (0), - yOffset (0) -{ -} - -LowLevelGraphicsPostScriptRenderer::SavedState::~SavedState() -{ -} - -void LowLevelGraphicsPostScriptRenderer::saveState() -{ - stateStack.add (new SavedState (*stateStack.getLast())); -} - -void LowLevelGraphicsPostScriptRenderer::restoreState() -{ - jassert (stateStack.size() > 0); - - if (stateStack.size() > 0) - stateStack.removeLast(); -} - -void LowLevelGraphicsPostScriptRenderer::beginTransparencyLayer (float) -{ -} - -void LowLevelGraphicsPostScriptRenderer::endTransparencyLayer() -{ -} - -//============================================================================== -void LowLevelGraphicsPostScriptRenderer::writeClip() -{ - if (needToClip) - { - needToClip = false; - - out << "doclip "; - - int itemsOnLine = 0; - - for (const Rectangle* i = stateStack.getLast()->clip.begin(), * const e = stateStack.getLast()->clip.end(); i != e; ++i) - { - if (++itemsOnLine == 6) - { - itemsOnLine = 0; - out << '\n'; - } - - out << i->getX() << ' ' << -i->getY() << ' ' - << i->getWidth() << ' ' << -i->getHeight() << " pr "; - } - - out << "endclip\n"; - } -} - -void LowLevelGraphicsPostScriptRenderer::writeColour (Colour colour) -{ - Colour c (Colours::white.overlaidWith (colour)); - - if (lastColour != c) - { - lastColour = c; - - out << String (c.getFloatRed(), 3) << ' ' - << String (c.getFloatGreen(), 3) << ' ' - << String (c.getFloatBlue(), 3) << " c\n"; - } -} - -void LowLevelGraphicsPostScriptRenderer::writeXY (const float x, const float y) const -{ - out << String (x, 2) << ' ' - << String (-y, 2) << ' '; -} - -void LowLevelGraphicsPostScriptRenderer::writePath (const Path& path) const -{ - out << "newpath "; - - float lastX = 0.0f; - float lastY = 0.0f; - int itemsOnLine = 0; - - Path::Iterator i (path); - - while (i.next()) - { - if (++itemsOnLine == 4) - { - itemsOnLine = 0; - out << '\n'; - } - - switch (i.elementType) - { - case Path::Iterator::startNewSubPath: - writeXY (i.x1, i.y1); - lastX = i.x1; - lastY = i.y1; - out << "m "; - break; - - case Path::Iterator::lineTo: - writeXY (i.x1, i.y1); - lastX = i.x1; - lastY = i.y1; - out << "l "; - break; - - case Path::Iterator::quadraticTo: - { - const float cp1x = lastX + (i.x1 - lastX) * 2.0f / 3.0f; - const float cp1y = lastY + (i.y1 - lastY) * 2.0f / 3.0f; - const float cp2x = cp1x + (i.x2 - lastX) / 3.0f; - const float cp2y = cp1y + (i.y2 - lastY) / 3.0f; - - writeXY (cp1x, cp1y); - writeXY (cp2x, cp2y); - writeXY (i.x2, i.y2); - out << "ct "; - lastX = i.x2; - lastY = i.y2; - } - break; - - case Path::Iterator::cubicTo: - writeXY (i.x1, i.y1); - writeXY (i.x2, i.y2); - writeXY (i.x3, i.y3); - out << "ct "; - lastX = i.x3; - lastY = i.y3; - break; - - case Path::Iterator::closePath: - out << "cp "; - break; - - default: - jassertfalse; - break; - } - } - - out << '\n'; -} - -void LowLevelGraphicsPostScriptRenderer::writeTransform (const AffineTransform& trans) const -{ - out << "[ " - << trans.mat00 << ' ' - << trans.mat10 << ' ' - << trans.mat01 << ' ' - << trans.mat11 << ' ' - << trans.mat02 << ' ' - << trans.mat12 << " ] concat "; -} - -//============================================================================== -void LowLevelGraphicsPostScriptRenderer::setFill (const FillType& fillType) -{ - stateStack.getLast()->fillType = fillType; -} - -void LowLevelGraphicsPostScriptRenderer::setOpacity (float /*opacity*/) -{ -} - -void LowLevelGraphicsPostScriptRenderer::setInterpolationQuality (Graphics::ResamplingQuality /*quality*/) -{ -} - -//============================================================================== -void LowLevelGraphicsPostScriptRenderer::fillRect (const Rectangle& r, const bool /*replaceExistingContents*/) -{ - fillRect (r.toFloat()); -} - -void LowLevelGraphicsPostScriptRenderer::fillRect (const Rectangle& r) -{ - if (stateStack.getLast()->fillType.isColour()) - { - writeClip(); - writeColour (stateStack.getLast()->fillType.colour); - - Rectangle r2 (r.translated ((float) stateStack.getLast()->xOffset, - (float) stateStack.getLast()->yOffset)); - - out << r2.getX() << ' ' << -r2.getBottom() << ' ' << r2.getWidth() << ' ' << r2.getHeight() << " rectfill\n"; - } - else - { - Path p; - p.addRectangle (r); - fillPath (p, AffineTransform::identity); - } -} - -void LowLevelGraphicsPostScriptRenderer::fillRectList (const RectangleList& list) -{ - fillPath (list.toPath(), AffineTransform::identity); -} - -//============================================================================== -void LowLevelGraphicsPostScriptRenderer::fillPath (const Path& path, const AffineTransform& t) -{ - if (stateStack.getLast()->fillType.isColour()) - { - writeClip(); - - Path p (path); - p.applyTransform (t.translated ((float) stateStack.getLast()->xOffset, - (float) stateStack.getLast()->yOffset)); - writePath (p); - - writeColour (stateStack.getLast()->fillType.colour); - - out << "fill\n"; - } - else if (stateStack.getLast()->fillType.isGradient()) - { - // this doesn't work correctly yet - it could be improved to handle solid gradients, but - // postscript can't do semi-transparent ones. - notPossibleInPostscriptAssert; // you can disable this warning by setting the WARN_ABOUT_NON_POSTSCRIPT_OPERATIONS flag at the top of this file - - writeClip(); - out << "gsave "; - - { - Path p (path); - p.applyTransform (t.translated ((float) stateStack.getLast()->xOffset, (float) stateStack.getLast()->yOffset)); - writePath (p); - out << "clip\n"; - } - - const Rectangle bounds (stateStack.getLast()->clip.getBounds()); - - // ideally this would draw lots of lines or ellipses to approximate the gradient, but for the - // time-being, this just fills it with the average colour.. - writeColour (stateStack.getLast()->fillType.gradient->getColourAtPosition (0.5f)); - out << bounds.getX() << ' ' << -bounds.getBottom() << ' ' << bounds.getWidth() << ' ' << bounds.getHeight() << " rectfill\n"; - - out << "grestore\n"; - } -} - -//============================================================================== -void LowLevelGraphicsPostScriptRenderer::writeImage (const Image& im, - const int sx, const int sy, - const int maxW, const int maxH) const -{ - out << "{<\n"; - - const int w = jmin (maxW, im.getWidth()); - const int h = jmin (maxH, im.getHeight()); - - int charsOnLine = 0; - const Image::BitmapData srcData (im, 0, 0, w, h); - Colour pixel; - - for (int y = h; --y >= 0;) - { - for (int x = 0; x < w; ++x) - { - const uint8* pixelData = srcData.getPixelPointer (x, y); - - if (x >= sx && y >= sy) - { - if (im.isARGB()) - { - PixelARGB p (*(const PixelARGB*) pixelData); - p.unpremultiply(); - pixel = Colours::white.overlaidWith (Colour (p.getARGB())); - } - else if (im.isRGB()) - { - pixel = Colour (((const PixelRGB*) pixelData)->getARGB()); - } - else - { - pixel = Colour ((uint8) 0, (uint8) 0, (uint8) 0, *pixelData); - } - } - else - { - pixel = Colours::transparentWhite; - } - - const uint8 pixelValues[3] = { pixel.getRed(), pixel.getGreen(), pixel.getBlue() }; - - out << String::toHexString (pixelValues, 3, 0); - charsOnLine += 3; - - if (charsOnLine > 100) - { - out << '\n'; - charsOnLine = 0; - } - } - } - - out << "\n>}\n"; -} - -void LowLevelGraphicsPostScriptRenderer::drawImage (const Image& sourceImage, const AffineTransform& transform) -{ - const int w = sourceImage.getWidth(); - const int h = sourceImage.getHeight(); - - writeClip(); - - out << "gsave "; - writeTransform (transform.translated ((float) stateStack.getLast()->xOffset, (float) stateStack.getLast()->yOffset) - .scaled (1.0f, -1.0f)); - - RectangleList imageClip; - sourceImage.createSolidAreaMask (imageClip, 0.5f); - - out << "newpath "; - int itemsOnLine = 0; - - for (const Rectangle* i = imageClip.begin(), * const e = imageClip.end(); i != e; ++i) - { - if (++itemsOnLine == 6) - { - out << '\n'; - itemsOnLine = 0; - } - - out << i->getX() << ' ' << i->getY() << ' ' << i->getWidth() << ' ' << i->getHeight() << " pr "; - } - - out << " clip newpath\n"; - - out << w << ' ' << h << " scale\n"; - out << w << ' ' << h << " 8 [" << w << " 0 0 -" << h << ' ' << (int) 0 << ' ' << h << " ]\n"; - - writeImage (sourceImage, 0, 0, w, h); - - out << "false 3 colorimage grestore\n"; - needToClip = true; -} - - -//============================================================================== -void LowLevelGraphicsPostScriptRenderer::drawLine (const Line & line) -{ - Path p; - p.addLineSegment (line, 1.0f); - fillPath (p, AffineTransform::identity); -} - -//============================================================================== -void LowLevelGraphicsPostScriptRenderer::setFont (const Font& newFont) -{ - stateStack.getLast()->font = newFont; -} - -const Font& LowLevelGraphicsPostScriptRenderer::getFont() -{ - return stateStack.getLast()->font; -} - -void LowLevelGraphicsPostScriptRenderer::drawGlyph (int glyphNumber, const AffineTransform& transform) -{ - Path p; - Font& font = stateStack.getLast()->font; - font.getTypeface()->getOutlineForGlyph (glyphNumber, p); - fillPath (p, AffineTransform::scale (font.getHeight() * font.getHorizontalScale(), font.getHeight()).followedBy (transform)); -} diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h deleted file mode 100755 index 2b893a3..0000000 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_LOWLEVELGRAPHICSPOSTSCRIPTRENDERER_H_INCLUDED -#define JUCE_LOWLEVELGRAPHICSPOSTSCRIPTRENDERER_H_INCLUDED - - -//============================================================================== -/** - An implementation of LowLevelGraphicsContext that turns the drawing operations - into a PostScript document. - -*/ -class JUCE_API LowLevelGraphicsPostScriptRenderer : public LowLevelGraphicsContext -{ -public: - //============================================================================== - LowLevelGraphicsPostScriptRenderer (OutputStream& resultingPostScript, - const String& documentTitle, - int totalWidth, - int totalHeight); - - ~LowLevelGraphicsPostScriptRenderer(); - - //============================================================================== - bool isVectorDevice() const override; - void setOrigin (Point) override; - void addTransform (const AffineTransform&) override; - float getPhysicalPixelScaleFactor() override; - - bool clipToRectangle (const Rectangle&) override; - bool clipToRectangleList (const RectangleList&) override; - void excludeClipRectangle (const Rectangle&) override; - void clipToPath (const Path&, const AffineTransform&) override; - void clipToImageAlpha (const Image&, const AffineTransform&) override; - - void saveState() override; - void restoreState() override; - - void beginTransparencyLayer (float) override; - void endTransparencyLayer() override; - - bool clipRegionIntersects (const Rectangle&) override; - Rectangle getClipBounds() const override; - bool isClipEmpty() const override; - - //============================================================================== - void setFill (const FillType&) override; - void setOpacity (float) override; - void setInterpolationQuality (Graphics::ResamplingQuality) override; - - //============================================================================== - void fillRect (const Rectangle&, bool replaceExistingContents) override; - void fillRect (const Rectangle&) override; - void fillRectList (const RectangleList&) override; - void fillPath (const Path&, const AffineTransform&) override; - void drawImage (const Image&, const AffineTransform&) override; - void drawLine (const Line &) override; - - //============================================================================== - const Font& getFont() override; - void setFont (const Font&) override; - void drawGlyph (int glyphNumber, const AffineTransform&) override; - -protected: - //============================================================================== - OutputStream& out; - int totalWidth, totalHeight; - bool needToClip; - Colour lastColour; - - struct SavedState - { - SavedState(); - ~SavedState(); - - RectangleList clip; - int xOffset, yOffset; - FillType fillType; - Font font; - - private: - SavedState& operator= (const SavedState&); - }; - - OwnedArray stateStack; - - void writeClip(); - void writeColour (Colour colour); - void writePath (const Path&) const; - void writeXY (float x, float y) const; - void writeTransform (const AffineTransform&) const; - void writeImage (const Image&, int sx, int sy, int maxW, int maxH) const; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LowLevelGraphicsPostScriptRenderer) -}; - - - -#endif // JUCE_LOWLEVELGRAPHICSPOSTSCRIPTRENDERER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp deleted file mode 100755 index a57e4d6..0000000 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (const Image& image) - : RenderingHelpers::StackBasedLowLevelGraphicsContext - (new RenderingHelpers::SoftwareRendererSavedState (image, image.getBounds())) -{ -} - -LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (const Image& image, Point origin, - const RectangleList& initialClip) - : RenderingHelpers::StackBasedLowLevelGraphicsContext - (new RenderingHelpers::SoftwareRendererSavedState (image, initialClip, origin)) -{ -} - -LowLevelGraphicsSoftwareRenderer::~LowLevelGraphicsSoftwareRenderer() {} diff --git a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h b/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h deleted file mode 100755 index 9928092..0000000 --- a/JuceLibraryCode/modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_LOWLEVELGRAPHICSSOFTWARERENDERER_H_INCLUDED -#define JUCE_LOWLEVELGRAPHICSSOFTWARERENDERER_H_INCLUDED - - -//============================================================================== -/** - A lowest-common-denominator implementation of LowLevelGraphicsContext that does all - its rendering in memory. - - User code is not supposed to create instances of this class directly - do all your - rendering via the Graphics class instead. -*/ -class JUCE_API LowLevelGraphicsSoftwareRenderer : public RenderingHelpers::StackBasedLowLevelGraphicsContext -{ -public: - //============================================================================== - /** Creates a context to render into an image. */ - LowLevelGraphicsSoftwareRenderer (const Image& imageToRenderOnto); - - /** Creates a context to render into a clipped subsection of an image. */ - LowLevelGraphicsSoftwareRenderer (const Image& imageToRenderOnto, Point origin, - const RectangleList& initialClip); - - /** Destructor. */ - ~LowLevelGraphicsSoftwareRenderer(); - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LowLevelGraphicsSoftwareRenderer) -}; - - -#endif // JUCE_LOWLEVELGRAPHICSSOFTWARERENDERER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp b/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp deleted file mode 100755 index 603d034..0000000 --- a/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -static inline void blurDataTriplets (uint8* d, int num, const int delta) noexcept -{ - uint32 last = d[0]; - d[0] = (uint8) ((d[0] + d[delta] + 1) / 3); - d += delta; - - num -= 2; - - do - { - const uint32 newLast = d[0]; - d[0] = (uint8) ((last + d[0] + d[delta] + 1) / 3); - d += delta; - last = newLast; - } - while (--num > 0); - - d[0] = (uint8) ((last + d[0] + 1) / 3); -} - -static void blurSingleChannelImage (uint8* const data, const int width, const int height, - const int lineStride, const int repetitions) noexcept -{ - jassert (width > 2 && height > 2); - - for (int y = 0; y < height; ++y) - for (int i = repetitions; --i >= 0;) - blurDataTriplets (data + lineStride * y, width, 1); - - for (int x = 0; x < width; ++x) - for (int i = repetitions; --i >= 0;) - blurDataTriplets (data + x, height, lineStride); -} - -static void blurSingleChannelImage (Image& image, int radius) -{ - const Image::BitmapData bm (image, Image::BitmapData::readWrite); - blurSingleChannelImage (bm.data, bm.width, bm.height, bm.lineStride, 2 * radius); -} - -//============================================================================== -DropShadow::DropShadow() noexcept - : colour (0x90000000), radius (4) -{ -} - -DropShadow::DropShadow (Colour shadowColour, const int r, Point o) noexcept - : colour (shadowColour), radius (r), offset (o) -{ - jassert (radius > 0); -} - -void DropShadow::drawForImage (Graphics& g, const Image& srcImage) const -{ - jassert (radius > 0); - - if (srcImage.isValid()) - { - Image shadowImage (srcImage.convertedToFormat (Image::SingleChannel)); - shadowImage.duplicateIfShared(); - - blurSingleChannelImage (shadowImage, radius); - - g.setColour (colour); - g.drawImageAt (shadowImage, offset.x, offset.y, true); - } -} - -void DropShadow::drawForPath (Graphics& g, const Path& path) const -{ - jassert (radius > 0); - - const Rectangle area ((path.getBounds().getSmallestIntegerContainer() + offset) - .expanded (radius + 1) - .getIntersection (g.getClipBounds().expanded (radius + 1))); - - if (area.getWidth() > 2 && area.getHeight() > 2) - { - Image renderedPath (Image::SingleChannel, area.getWidth(), area.getHeight(), true); - - { - Graphics g2 (renderedPath); - g2.setColour (Colours::white); - g2.fillPath (path, AffineTransform::translation ((float) (offset.x - area.getX()), - (float) (offset.y - area.getY()))); - } - - blurSingleChannelImage (renderedPath, radius); - - g.setColour (colour); - g.drawImageAt (renderedPath, area.getX(), area.getY(), true); - } -} - -static void drawShadowSection (Graphics& g, ColourGradient& cg, Rectangle area, - bool isCorner, float centreX, float centreY, float edgeX, float edgeY) -{ - cg.point1 = area.getRelativePoint (centreX, centreY); - cg.point2 = area.getRelativePoint (edgeX, edgeY); - cg.isRadial = isCorner; - - g.setGradientFill (cg); - g.fillRect (area); -} - -void DropShadow::drawForRectangle (Graphics& g, const Rectangle& targetArea) const -{ - ColourGradient cg (colour, 0, 0, colour.withAlpha (0.0f), 0, 0, false); - - for (float i = 0.05f; i < 1.0f; i += 0.1f) - cg.addColour (1.0 - i, colour.withMultipliedAlpha (i * i)); - - const float radiusInset = (radius + 1) / 2.0f; - const float expandedRadius = radius + radiusInset; - - const Rectangle area (targetArea.toFloat().reduced (radiusInset) + offset.toFloat()); - - Rectangle r (area.expanded (expandedRadius)); - Rectangle top (r.removeFromTop (expandedRadius)); - Rectangle bottom (r.removeFromBottom (expandedRadius)); - - drawShadowSection (g, cg, top.removeFromLeft (expandedRadius), true, 1.0f, 1.0f, 0, 1.0f); - drawShadowSection (g, cg, top.removeFromRight (expandedRadius), true, 0, 1.0f, 1.0f, 1.0f); - drawShadowSection (g, cg, top, false, 0, 1.0f, 0, 0); - - drawShadowSection (g, cg, bottom.removeFromLeft (expandedRadius), true, 1.0f, 0, 0, 0); - drawShadowSection (g, cg, bottom.removeFromRight (expandedRadius), true, 0, 0, 1.0f, 0); - drawShadowSection (g, cg, bottom, false, 0, 0, 0, 1.0f); - - drawShadowSection (g, cg, r.removeFromLeft (expandedRadius), false, 1.0f, 0, 0, 0); - drawShadowSection (g, cg, r.removeFromRight (expandedRadius), false, 0, 0, 1.0f, 0); - - g.setColour (colour); - g.fillRect (area); -} - -//============================================================================== -DropShadowEffect::DropShadowEffect() {} -DropShadowEffect::~DropShadowEffect() {} - -void DropShadowEffect::setShadowProperties (const DropShadow& newShadow) -{ - shadow = newShadow; -} - -void DropShadowEffect::applyEffect (Image& image, Graphics& g, float scaleFactor, float alpha) -{ - DropShadow s (shadow); - s.radius = roundToInt (s.radius * scaleFactor); - s.colour = s.colour.withMultipliedAlpha (alpha); - s.offset.x = roundToInt (s.offset.x * scaleFactor); - s.offset.y = roundToInt (s.offset.y * scaleFactor); - - s.drawForImage (g, image); - - g.setOpacity (alpha); - g.drawImageAt (image, 0, 0); -} diff --git a/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h b/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h deleted file mode 100755 index 1f9362a..0000000 --- a/JuceLibraryCode/modules/juce_graphics/effects/juce_DropShadowEffect.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DROPSHADOWEFFECT_H_INCLUDED -#define JUCE_DROPSHADOWEFFECT_H_INCLUDED - - -//============================================================================== -/** - Defines a drop-shadow effect. -*/ -struct JUCE_API DropShadow -{ - /** Creates a default drop-shadow effect. */ - DropShadow() noexcept; - - /** Creates a drop-shadow object with the given parameters. */ - DropShadow (Colour shadowColour, int radius, Point offset) noexcept; - - /** Renders a drop-shadow based on the alpha-channel of the given image. */ - void drawForImage (Graphics& g, const Image& srcImage) const; - - /** Renders a drop-shadow based on the shape of a path. */ - void drawForPath (Graphics& g, const Path& path) const; - - /** Renders a drop-shadow for a rectangle. - Note that for speed, this approximates the shadow using gradients. - */ - void drawForRectangle (Graphics& g, const Rectangle& area) const; - - /** The colour with which to render the shadow. - In most cases you'll probably want to leave this as black with an alpha - value of around 0.5 - */ - Colour colour; - - /** The approximate spread of the shadow. */ - int radius; - - /** The offset of the shadow. */ - Point offset; -}; - -//============================================================================== -/** - An effect filter that adds a drop-shadow behind the image's content. - - (This will only work on images/components that aren't opaque, of course). - - When added to a component, this effect will draw a soft-edged - shadow based on what gets drawn inside it. The shadow will also - be applied to the component's children. - - For speed, this doesn't use a proper gaussian blur, but cheats by - using a simple bilinear filter. If you need a really high-quality - shadow, check out ImageConvolutionKernel::createGaussianBlur() - - @see Component::setComponentEffect -*/ -class JUCE_API DropShadowEffect : public ImageEffectFilter -{ -public: - //============================================================================== - /** Creates a default drop-shadow effect. - To customise the shadow's appearance, use the setShadowProperties() method. - */ - DropShadowEffect(); - - /** Destructor. */ - ~DropShadowEffect(); - - //============================================================================== - /** Sets up parameters affecting the shadow's appearance. */ - void setShadowProperties (const DropShadow& newShadow); - - //============================================================================== - /** @internal */ - void applyEffect (Image& sourceImage, Graphics& destContext, float scaleFactor, float alpha); - - -private: - //============================================================================== - DropShadow shadow; - - JUCE_LEAK_DETECTOR (DropShadowEffect) -}; - - -#endif // JUCE_DROPSHADOWEFFECT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp b/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp deleted file mode 100755 index 7db7ef5..0000000 --- a/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.cpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -GlowEffect::GlowEffect() - : radius (2.0f), - colour (Colours::white) -{ -} - -GlowEffect::~GlowEffect() -{ -} - -void GlowEffect::setGlowProperties (const float newRadius, - Colour newColour) -{ - radius = newRadius; - colour = newColour; -} - -void GlowEffect::applyEffect (Image& image, Graphics& g, float scaleFactor, float alpha) -{ - Image temp (image.getFormat(), image.getWidth(), image.getHeight(), true); - - ImageConvolutionKernel blurKernel (roundToInt (radius * scaleFactor * 2.0f)); - - blurKernel.createGaussianBlur (radius); - blurKernel.rescaleAllValues (radius); - - blurKernel.applyToImage (temp, image, image.getBounds()); - - g.setColour (colour.withMultipliedAlpha (alpha)); - g.drawImageAt (temp, 0, 0, true); - - g.setOpacity (alpha); - g.drawImageAt (image, 0, 0, false); -} diff --git a/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h b/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h deleted file mode 100755 index ab9ce3b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/effects/juce_GlowEffect.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_GLOWEFFECT_H_INCLUDED -#define JUCE_GLOWEFFECT_H_INCLUDED - - -//============================================================================== -/** - A component effect that adds a coloured blur around the component's contents. - - (This will only work on non-opaque components). - - @see Component::setComponentEffect, DropShadowEffect -*/ -class JUCE_API GlowEffect : public ImageEffectFilter -{ -public: - //============================================================================== - /** Creates a default 'glow' effect. - - To customise its appearance, use the setGlowProperties() method. - */ - GlowEffect(); - - /** Destructor. */ - ~GlowEffect(); - - //============================================================================== - /** Sets the glow's radius and colour. - - The radius is how large the blur should be, and the colour is - used to render it (for a less intense glow, lower the colour's - opacity). - */ - void setGlowProperties (float newRadius, - Colour newColour); - - - //============================================================================== - /** @internal */ - void applyEffect (Image& sourceImage, Graphics& destContext, float scaleFactor, float alpha); - -private: - //============================================================================== - float radius; - Colour colour; - - JUCE_LEAK_DETECTOR (GlowEffect) -}; - - -#endif // JUCE_GLOWEFFECT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h b/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h deleted file mode 100755 index 84d6b0b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/effects/juce_ImageEffectFilter.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_IMAGEEFFECTFILTER_H_INCLUDED -#define JUCE_IMAGEEFFECTFILTER_H_INCLUDED - - -//============================================================================== -/** - A graphical effect filter that can be applied to components. - - An ImageEffectFilter can be applied to the image that a component - paints before it hits the screen. - - This is used for adding effects like shadows, blurs, etc. - - @see Component::setComponentEffect -*/ -class JUCE_API ImageEffectFilter -{ -public: - //============================================================================== - /** Overridden to render the effect. - - The implementation of this method must use the image that is passed in - as its source, and should render its output to the graphics context passed in. - - @param sourceImage the image that the source component has just rendered with - its paint() method. The image may or may not have an alpha - channel, depending on whether the component is opaque. - @param destContext the graphics context to use to draw the resultant image. - @param scaleFactor a scale factor that has been applied to the image - e.g. if - this is 2, then the image is actually scaled-up to twice the - original resolution - @param alpha the alpha with which to draw the resultant image to the - target context - */ - virtual void applyEffect (Image& sourceImage, - Graphics& destContext, - float scaleFactor, - float alpha) = 0; - - /** Destructor. */ - virtual ~ImageEffectFilter() {} - -}; - -#endif // JUCE_IMAGEEFFECTFILTER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp deleted file mode 100755 index 43b6318..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.cpp +++ /dev/null @@ -1,232 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AttributedString::Attribute::Attribute (Range range_, Colour colour_) - : range (range_), colour (new Colour (colour_)) -{ -} - -AttributedString::Attribute::Attribute (Range range_, const Font& font_) - : range (range_), font (new Font (font_)) -{ -} - -AttributedString::Attribute::Attribute (const Attribute& other) - : range (other.range), - font (other.font.createCopy()), - colour (other.colour.createCopy()) -{ -} - -AttributedString::Attribute::Attribute (const Attribute& other, const int offset) - : range (other.range + offset), - font (other.font.createCopy()), - colour (other.colour.createCopy()) -{ -} - -AttributedString::Attribute::~Attribute() {} - -//============================================================================== -AttributedString::AttributedString() - : lineSpacing (0.0f), - justification (Justification::left), - wordWrap (AttributedString::byWord), - readingDirection (AttributedString::natural) -{ -} - -AttributedString::AttributedString (const String& newString) - : text (newString), - lineSpacing (0.0f), - justification (Justification::left), - wordWrap (AttributedString::byWord), - readingDirection (AttributedString::natural) -{ -} - -AttributedString::AttributedString (const AttributedString& other) - : text (other.text), - lineSpacing (other.lineSpacing), - justification (other.justification), - wordWrap (other.wordWrap), - readingDirection (other.readingDirection) -{ - attributes.addCopiesOf (other.attributes); -} - -AttributedString& AttributedString::operator= (const AttributedString& other) -{ - if (this != &other) - { - text = other.text; - lineSpacing = other.lineSpacing; - justification = other.justification; - wordWrap = other.wordWrap; - readingDirection = other.readingDirection; - attributes.clear(); - attributes.addCopiesOf (other.attributes); - } - - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -AttributedString::AttributedString (AttributedString&& other) noexcept - : text (static_cast (other.text)), - lineSpacing (other.lineSpacing), - justification (other.justification), - wordWrap (other.wordWrap), - readingDirection (other.readingDirection), - attributes (static_cast &&> (other.attributes)) -{ -} - -AttributedString& AttributedString::operator= (AttributedString&& other) noexcept -{ - text = static_cast (other.text); - lineSpacing = other.lineSpacing; - justification = other.justification; - wordWrap = other.wordWrap; - readingDirection = other.readingDirection; - attributes = static_cast &&> (other.attributes); - return *this; -} -#endif - -AttributedString::~AttributedString() {} - -void AttributedString::setText (const String& other) -{ - text = other; -} - -void AttributedString::append (const String& textToAppend) -{ - text += textToAppend; -} - -void AttributedString::append (const String& textToAppend, const Font& font) -{ - const int oldLength = text.length(); - const int newLength = textToAppend.length(); - - text += textToAppend; - setFont (Range (oldLength, oldLength + newLength), font); -} - -void AttributedString::append (const String& textToAppend, Colour colour) -{ - const int oldLength = text.length(); - const int newLength = textToAppend.length(); - - text += textToAppend; - setColour (Range (oldLength, oldLength + newLength), colour); -} - -void AttributedString::append (const String& textToAppend, const Font& font, Colour colour) -{ - const int oldLength = text.length(); - const int newLength = textToAppend.length(); - - text += textToAppend; - setFont (Range (oldLength, oldLength + newLength), font); - setColour (Range (oldLength, oldLength + newLength), colour); -} - -void AttributedString::append (const AttributedString& other) -{ - const int originalLength = text.length(); - text += other.text; - - for (int i = 0; i < other.attributes.size(); ++i) - attributes.add (new Attribute (*other.attributes.getUnchecked(i), originalLength)); -} - -void AttributedString::clear() -{ - text.clear(); - attributes.clear(); -} - -void AttributedString::setJustification (Justification newJustification) noexcept -{ - justification = newJustification; -} - -void AttributedString::setWordWrap (WordWrap newWordWrap) noexcept -{ - wordWrap = newWordWrap; -} - -void AttributedString::setReadingDirection (ReadingDirection newReadingDirection) noexcept -{ - readingDirection = newReadingDirection; -} - -void AttributedString::setLineSpacing (const float newLineSpacing) noexcept -{ - lineSpacing = newLineSpacing; -} - -void AttributedString::setColour (Range range, Colour colour) -{ - attributes.add (new Attribute (range, colour)); -} - -void AttributedString::setColour (Colour colour) -{ - for (int i = attributes.size(); --i >= 0;) - if (attributes.getUnchecked(i)->getColour() != nullptr) - attributes.remove (i); - - setColour (Range (0, text.length()), colour); -} - -void AttributedString::setFont (Range range, const Font& font) -{ - attributes.add (new Attribute (range, font)); -} - -void AttributedString::setFont (const Font& font) -{ - for (int i = attributes.size(); --i >= 0;) - if (attributes.getUnchecked(i)->getFont() != nullptr) - attributes.remove (i); - - setFont (Range (0, text.length()), font); -} - -void AttributedString::draw (Graphics& g, const Rectangle& area) const -{ - if (text.isNotEmpty() && g.clipRegionIntersects (area.getSmallestIntegerContainer())) - { - if (! g.getInternalContext().drawTextLayout (*this, area)) - { - TextLayout layout; - layout.createLayout (*this, area.getWidth()); - layout.draw (g, area); - } - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h deleted file mode 100755 index 8c33d75..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_AttributedString.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_ATTRIBUTEDSTRING_H_INCLUDED -#define JUCE_ATTRIBUTEDSTRING_H_INCLUDED - - -//============================================================================== -/** - A text string with a set of colour/font settings that are associated with sub-ranges - of the text. - - An attributed string lets you create a string with varied fonts, colours, word-wrapping, - layout, etc., and draw it using AttributedString::draw(). - - @see TextLayout -*/ -class JUCE_API AttributedString -{ -public: - /** Creates an empty attributed string. */ - AttributedString(); - - /** Creates an attributed string with the given text. */ - explicit AttributedString (const String& text); - - AttributedString (const AttributedString&); - AttributedString& operator= (const AttributedString&); - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - AttributedString (AttributedString&&) noexcept; - AttributedString& operator= (AttributedString&&) noexcept; - #endif - - /** Destructor. */ - ~AttributedString(); - - //============================================================================== - /** Returns the complete text of this attributed string. */ - const String& getText() const noexcept { return text; } - - /** Replaces all the text. - This will change the text, but won't affect any of the colour or font attributes - that have been added. - */ - void setText (const String& newText); - - /** Appends some text (with a default font and colour). */ - void append (const String& textToAppend); - /** Appends some text, with a specified font, and the default colour (black). */ - void append (const String& textToAppend, const Font& font); - /** Appends some text, with a specified colour, and the default font. */ - void append (const String& textToAppend, Colour colour); - /** Appends some text, with a specified font and colour. */ - void append (const String& textToAppend, const Font& font, Colour colour); - - /** Appends another AttributedString to this one. - Note that this will only append the text, fonts, and colours - it won't copy any - other properties such as justification, line-spacing, etc from the other object. - */ - void append (const AttributedString& other); - - /** Resets the string, clearing all text and attributes. - Note that this won't affect global settings like the justification type, - word-wrap mode, etc. - */ - void clear(); - - //============================================================================== - /** Draws this string within the given area. - The layout of the string within the rectangle is controlled by the justification - value passed to setJustification(). - */ - void draw (Graphics& g, const Rectangle& area) const; - - //============================================================================== - /** Returns the justification that should be used for laying-out the text. - This may include both vertical and horizontal flags. - */ - Justification getJustification() const noexcept { return justification; } - - /** Sets the justification that should be used for laying-out the text. - This may include both vertical and horizontal flags. - */ - void setJustification (Justification newJustification) noexcept; - - //============================================================================== - /** Types of word-wrap behaviour. - @see getWordWrap, setWordWrap - */ - enum WordWrap - { - none, /**< No word-wrapping: lines extend indefinitely. */ - byWord, /**< Lines are wrapped on a word boundary. */ - byChar, /**< Lines are wrapped on a character boundary. */ - }; - - /** Returns the word-wrapping behaviour. */ - WordWrap getWordWrap() const noexcept { return wordWrap; } - - /** Sets the word-wrapping behaviour. */ - void setWordWrap (WordWrap newWordWrap) noexcept; - - //============================================================================== - /** Types of reading direction that can be used. - @see getReadingDirection, setReadingDirection - */ - enum ReadingDirection - { - natural, - leftToRight, - rightToLeft, - }; - - /** Returns the reading direction for the text. */ - ReadingDirection getReadingDirection() const noexcept { return readingDirection; } - - /** Sets the reading direction that should be used for the text. */ - void setReadingDirection (ReadingDirection newReadingDirection) noexcept; - - //============================================================================== - /** Returns the extra line-spacing distance. */ - float getLineSpacing() const noexcept { return lineSpacing; } - - /** Sets an extra line-spacing distance. */ - void setLineSpacing (float newLineSpacing) noexcept; - - //============================================================================== - /** An attribute that has been applied to a range of characters in an AttributedString. */ - class JUCE_API Attribute - { - public: - /** Creates an attribute that changes the colour for a range of characters. - @see AttributedString::setColour() - */ - Attribute (Range range, Colour colour); - - /** Creates an attribute that changes the font for a range of characters. - @see AttributedString::setFont() - */ - Attribute (Range range, const Font& font); - - Attribute (const Attribute&); - ~Attribute(); - - /** If this attribute specifies a font, this returns it; otherwise it returns nullptr. */ - const Font* getFont() const noexcept { return font; } - - /** If this attribute specifies a colour, this returns it; otherwise it returns nullptr. */ - const Colour* getColour() const noexcept { return colour; } - - /** The range of characters to which this attribute will be applied. */ - const Range range; - - private: - ScopedPointer font; - ScopedPointer colour; - - friend class AttributedString; - Attribute (const Attribute&, int); - Attribute& operator= (const Attribute&); - - JUCE_LEAK_DETECTOR (Attribute) - }; - - /** Returns the number of attributes that have been added to this string. */ - int getNumAttributes() const noexcept { return attributes.size(); } - - /** Returns one of the string's attributes. - The index provided must be less than getNumAttributes(), and >= 0. - */ - const Attribute* getAttribute (int index) const noexcept { return attributes.getUnchecked (index); } - - //============================================================================== - /** Adds a colour attribute for the specified range. */ - void setColour (Range range, Colour colour); - - /** Removes all existing colour attributes, and applies this colour to the whole string. */ - void setColour (Colour colour); - - /** Adds a font attribute for the specified range. */ - void setFont (Range range, const Font& font); - - /** Removes all existing font attributes, and applies this font to the whole string. */ - void setFont (const Font& font); - -private: - String text; - float lineSpacing; - Justification justification; - WordWrap wordWrap; - ReadingDirection readingDirection; - OwnedArray attributes; - - JUCE_LEAK_DETECTOR (AttributedString) -}; - -#endif // JUCE_ATTRIBUTEDSTRING_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp deleted file mode 100755 index a2adb04..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.cpp +++ /dev/null @@ -1,406 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class CustomTypeface::GlyphInfo -{ -public: - GlyphInfo (const juce_wchar c, const Path& p, const float w) noexcept - : character (c), path (p), width (w) - { - } - - struct KerningPair - { - juce_wchar character2; - float kerningAmount; - }; - - void addKerningPair (const juce_wchar subsequentCharacter, - const float extraKerningAmount) noexcept - { - KerningPair kp; - kp.character2 = subsequentCharacter; - kp.kerningAmount = extraKerningAmount; - kerningPairs.add (kp); - } - - float getHorizontalSpacing (const juce_wchar subsequentCharacter) const noexcept - { - if (subsequentCharacter != 0) - for (int i = kerningPairs.size(); --i >= 0;) - if (kerningPairs.getReference(i).character2 == subsequentCharacter) - return width + kerningPairs.getReference(i).kerningAmount; - - return width; - } - - const juce_wchar character; - const Path path; - float width; - Array kerningPairs; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GlyphInfo) -}; - -//============================================================================== -namespace CustomTypefaceHelpers -{ - static juce_wchar readChar (InputStream& in) - { - uint32 n = (uint32) (uint16) in.readShort(); - - if (n >= 0xd800 && n <= 0xdfff) - { - const uint32 nextWord = (uint32) (uint16) in.readShort(); - jassert (nextWord >= 0xdc00); // illegal unicode character! - - n = 0x10000 + (((n - 0xd800) << 10) | (nextWord - 0xdc00)); - } - - return (juce_wchar) n; - } - - static void writeChar (OutputStream& out, juce_wchar charToWrite) - { - if (charToWrite >= 0x10000) - { - charToWrite -= 0x10000; - out.writeShort ((short) (uint16) (0xd800 + (charToWrite >> 10))); - out.writeShort ((short) (uint16) (0xdc00 + (charToWrite & 0x3ff))); - } - else - { - out.writeShort ((short) (uint16) charToWrite); - } - } -} - -//============================================================================== -CustomTypeface::CustomTypeface() - : Typeface (String(), String()) -{ - clear(); -} - -CustomTypeface::CustomTypeface (InputStream& serialisedTypefaceStream) - : Typeface (String(), String()) -{ - clear(); - - GZIPDecompressorInputStream gzin (serialisedTypefaceStream); - BufferedInputStream in (gzin, 32768); - - name = in.readString(); - - const bool isBold = in.readBool(); - const bool isItalic = in.readBool(); - style = FontStyleHelpers::getStyleName (isBold, isItalic); - - ascent = in.readFloat(); - defaultCharacter = CustomTypefaceHelpers::readChar (in); - - int numChars = in.readInt(); - - for (int i = 0; i < numChars; ++i) - { - const juce_wchar c = CustomTypefaceHelpers::readChar (in); - const float width = in.readFloat(); - - Path p; - p.loadPathFromStream (in); - addGlyph (c, p, width); - } - - const int numKerningPairs = in.readInt(); - - for (int i = 0; i < numKerningPairs; ++i) - { - const juce_wchar char1 = CustomTypefaceHelpers::readChar (in); - const juce_wchar char2 = CustomTypefaceHelpers::readChar (in); - - addKerningPair (char1, char2, in.readFloat()); - } -} - -CustomTypeface::~CustomTypeface() -{ -} - -//============================================================================== -void CustomTypeface::clear() -{ - defaultCharacter = 0; - ascent = 1.0f; - style = "Regular"; - zeromem (lookupTable, sizeof (lookupTable)); - glyphs.clear(); -} - -void CustomTypeface::setCharacteristics (const String& newName, const float newAscent, const bool isBold, - const bool isItalic, const juce_wchar newDefaultCharacter) noexcept -{ - name = newName; - defaultCharacter = newDefaultCharacter; - ascent = newAscent; - style = FontStyleHelpers::getStyleName (isBold, isItalic); -} - -void CustomTypeface::setCharacteristics (const String& newName, const String& newStyle, const float newAscent, - const juce_wchar newDefaultCharacter) noexcept -{ - name = newName; - style = newStyle; - defaultCharacter = newDefaultCharacter; - ascent = newAscent; -} - -void CustomTypeface::addGlyph (const juce_wchar character, const Path& path, const float width) noexcept -{ - // Check that you're not trying to add the same character twice.. - jassert (findGlyph (character, false) == nullptr); - - if (isPositiveAndBelow ((int) character, (int) numElementsInArray (lookupTable))) - lookupTable [character] = (short) glyphs.size(); - - glyphs.add (new GlyphInfo (character, path, width)); -} - -void CustomTypeface::addKerningPair (const juce_wchar char1, const juce_wchar char2, const float extraAmount) noexcept -{ - if (extraAmount != 0) - { - if (GlyphInfo* const g = findGlyph (char1, true)) - g->addKerningPair (char2, extraAmount); - else - jassertfalse; // can only add kerning pairs for characters that exist! - } -} - -CustomTypeface::GlyphInfo* CustomTypeface::findGlyph (const juce_wchar character, const bool loadIfNeeded) noexcept -{ - if (isPositiveAndBelow ((int) character, (int) numElementsInArray (lookupTable)) && lookupTable [character] > 0) - return glyphs [(int) lookupTable [(int) character]]; - - for (int i = 0; i < glyphs.size(); ++i) - { - GlyphInfo* const g = glyphs.getUnchecked(i); - if (g->character == character) - return g; - } - - if (loadIfNeeded && loadGlyphIfPossible (character)) - return findGlyph (character, false); - - return nullptr; -} - -bool CustomTypeface::loadGlyphIfPossible (const juce_wchar /*characterNeeded*/) -{ - return false; -} - -void CustomTypeface::addGlyphsFromOtherTypeface (Typeface& typefaceToCopy, juce_wchar characterStartIndex, int numCharacters) noexcept -{ - setCharacteristics (name, style, typefaceToCopy.getAscent(), defaultCharacter); - - for (int i = 0; i < numCharacters; ++i) - { - const juce_wchar c = (juce_wchar) (characterStartIndex + i); - - Array glyphIndexes; - Array offsets; - typefaceToCopy.getGlyphPositions (String::charToString (c), glyphIndexes, offsets); - - const int glyphIndex = glyphIndexes.getFirst(); - - if (glyphIndex >= 0 && glyphIndexes.size() > 0) - { - const float glyphWidth = offsets[1]; - - Path p; - typefaceToCopy.getOutlineForGlyph (glyphIndex, p); - - addGlyph (c, p, glyphWidth); - - for (int j = glyphs.size() - 1; --j >= 0;) - { - const juce_wchar char2 = glyphs.getUnchecked (j)->character; - glyphIndexes.clearQuick(); - offsets.clearQuick(); - typefaceToCopy.getGlyphPositions (String::charToString (c) + String::charToString (char2), glyphIndexes, offsets); - - if (offsets.size() > 1) - addKerningPair (c, char2, offsets[1] - glyphWidth); - } - } - } -} - -bool CustomTypeface::writeToStream (OutputStream& outputStream) -{ - GZIPCompressorOutputStream out (&outputStream); - - out.writeString (name); - out.writeBool (FontStyleHelpers::isBold (style)); - out.writeBool (FontStyleHelpers::isItalic (style)); - out.writeFloat (ascent); - CustomTypefaceHelpers::writeChar (out, defaultCharacter); - out.writeInt (glyphs.size()); - - int numKerningPairs = 0; - - for (int i = 0; i < glyphs.size(); ++i) - { - const GlyphInfo* const g = glyphs.getUnchecked (i); - CustomTypefaceHelpers::writeChar (out, g->character); - out.writeFloat (g->width); - g->path.writePathToStream (out); - - numKerningPairs += g->kerningPairs.size(); - } - - out.writeInt (numKerningPairs); - - for (int i = 0; i < glyphs.size(); ++i) - { - const GlyphInfo* const g = glyphs.getUnchecked (i); - - for (int j = 0; j < g->kerningPairs.size(); ++j) - { - const GlyphInfo::KerningPair& p = g->kerningPairs.getReference (j); - CustomTypefaceHelpers::writeChar (out, g->character); - CustomTypefaceHelpers::writeChar (out, p.character2); - out.writeFloat (p.kerningAmount); - } - } - - return true; -} - -//============================================================================== -float CustomTypeface::getAscent() const { return ascent; } -float CustomTypeface::getDescent() const { return 1.0f - ascent; } -float CustomTypeface::getHeightToPointsFactor() const { return ascent; } - -float CustomTypeface::getStringWidth (const String& text) -{ - float x = 0; - - for (String::CharPointerType t (text.getCharPointer()); ! t.isEmpty();) - { - const juce_wchar c = t.getAndAdvance(); - - if (const GlyphInfo* const glyph = findGlyph (c, true)) - { - x += glyph->getHorizontalSpacing (*t); - } - else - { - const Typeface::Ptr fallbackTypeface (Typeface::getFallbackTypeface()); - - if (fallbackTypeface != nullptr && fallbackTypeface != this) - x += fallbackTypeface->getStringWidth (String::charToString (c)); - } - } - - return x; -} - -void CustomTypeface::getGlyphPositions (const String& text, Array & resultGlyphs, Array& xOffsets) -{ - xOffsets.add (0); - float x = 0; - - for (String::CharPointerType t (text.getCharPointer()); ! t.isEmpty();) - { - float width = 0.0f; - int glyphChar = 0; - - const juce_wchar c = t.getAndAdvance(); - - if (const GlyphInfo* const glyph = findGlyph (c, true)) - { - width = glyph->getHorizontalSpacing (*t); - glyphChar = (int) glyph->character; - } - else - { - const Typeface::Ptr fallbackTypeface (getFallbackTypeface()); - - if (fallbackTypeface != nullptr && fallbackTypeface != this) - { - Array subGlyphs; - Array subOffsets; - fallbackTypeface->getGlyphPositions (String::charToString (c), subGlyphs, subOffsets); - - if (subGlyphs.size() > 0) - { - glyphChar = subGlyphs.getFirst(); - width = subOffsets[1]; - } - } - } - - x += width; - resultGlyphs.add (glyphChar); - xOffsets.add (x); - } -} - -bool CustomTypeface::getOutlineForGlyph (int glyphNumber, Path& path) -{ - if (const GlyphInfo* const glyph = findGlyph ((juce_wchar) glyphNumber, true)) - { - path = glyph->path; - return true; - } - - const Typeface::Ptr fallbackTypeface (getFallbackTypeface()); - - if (fallbackTypeface != nullptr && fallbackTypeface != this) - return fallbackTypeface->getOutlineForGlyph (glyphNumber, path); - - return false; -} - -EdgeTable* CustomTypeface::getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform, float fontHeight) -{ - if (const GlyphInfo* const glyph = findGlyph ((juce_wchar) glyphNumber, true)) - { - if (! glyph->path.isEmpty()) - return new EdgeTable (glyph->path.getBoundsTransformed (transform) - .getSmallestIntegerContainer().expanded (1, 0), - glyph->path, transform); - } - else - { - const Typeface::Ptr fallbackTypeface (getFallbackTypeface()); - - if (fallbackTypeface != nullptr && fallbackTypeface != this) - return fallbackTypeface->getEdgeTableForGlyph (glyphNumber, transform, fontHeight); - } - - return nullptr; -} diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h deleted file mode 100755 index 25db68b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_CustomTypeface.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_CUSTOMTYPEFACE_H_INCLUDED -#define JUCE_CUSTOMTYPEFACE_H_INCLUDED - - -//============================================================================== -/** - A typeface that can be populated with custom glyphs. - - You can create a CustomTypeface if you need one that contains your own glyphs, - or if you need to load a typeface from a Juce-formatted binary stream. - - If you want to create a copy of a native face, you can use addGlyphsFromOtherTypeface() - to copy glyphs into this face. - - NOTE! For most people this class is almost certainly NOT the right tool to use! - If what you want to do is to embed a font into your exe, then your best plan is - probably to embed your TTF/OTF font file into your binary using the Introjucer, - and then call Typeface::createSystemTypefaceFor() to load it from memory. - - @see Typeface, Font -*/ -class JUCE_API CustomTypeface : public Typeface -{ -public: - //============================================================================== - /** Creates a new, empty typeface. */ - CustomTypeface(); - - /** Loads a typeface from a previously saved stream. - The stream must have been created by writeToStream(). - - NOTE! Since this class was written, support was added for loading real font files from - memory, so for most people, using Typeface::createSystemTypefaceFor() to load a real font - is more appropriate than using this class to store it in a proprietary format. - - @see writeToStream - */ - explicit CustomTypeface (InputStream& serialisedTypefaceStream); - - /** Destructor. */ - ~CustomTypeface(); - - //============================================================================== - /** Resets this typeface, deleting all its glyphs and settings. */ - void clear(); - - /** Sets the vital statistics for the typeface. - @param fontFamily the typeface's font family - @param ascent the ascent - this is normalised to a height of 1.0 and this is - the value that will be returned by Typeface::getAscent(). The - descent is assumed to be (1.0 - ascent) - @param isBold should be true if the typeface is bold - @param isItalic should be true if the typeface is italic - @param defaultCharacter the character to be used as a replacement if there's - no glyph available for the character that's being drawn - */ - void setCharacteristics (const String& fontFamily, float ascent, - bool isBold, bool isItalic, - juce_wchar defaultCharacter) noexcept; - - /** Sets the vital statistics for the typeface. - @param fontFamily the typeface's font family - @param fontStyle the typeface's font style - @param ascent the ascent - this is normalised to a height of 1.0 and this is - the value that will be returned by Typeface::getAscent(). The - descent is assumed to be (1.0 - ascent) - @param defaultCharacter the character to be used as a replacement if there's - no glyph available for the character that's being drawn - */ - void setCharacteristics (const String& fontFamily, const String& fontStyle, - float ascent, juce_wchar defaultCharacter) noexcept; - - /** Adds a glyph to the typeface. - - The path that is passed in is normalised so that the font height is 1.0, and its - origin is the anchor point of the character on its baseline. - - The width is the nominal width of the character, and any extra kerning values that - are specified will be added to this width. - */ - void addGlyph (juce_wchar character, const Path& path, float width) noexcept; - - /** Specifies an extra kerning amount to be used between a pair of characters. - The amount will be added to the nominal width of the first character when laying out a string. - */ - void addKerningPair (juce_wchar char1, juce_wchar char2, float extraAmount) noexcept; - - /** Adds a range of glyphs from another typeface. - This will attempt to pull in the paths and kerning information from another typeface and - add it to this one. - */ - void addGlyphsFromOtherTypeface (Typeface& typefaceToCopy, juce_wchar characterStartIndex, int numCharacters) noexcept; - - /** Saves this typeface as a Juce-formatted font file. - A CustomTypeface can be created to reload the data that is written - see the CustomTypeface - constructor. - - NOTE! Since this class was written, support was added for loading real font files from - memory, so for most people, using Typeface::createSystemTypefaceFor() to load a real font - is more appropriate than using this class to store it in a proprietary format. - */ - bool writeToStream (OutputStream& outputStream); - - //============================================================================== - // The following methods implement the basic Typeface behaviour. - float getAscent() const override; - float getDescent() const override; - float getHeightToPointsFactor() const override; - float getStringWidth (const String&) override; - void getGlyphPositions (const String&, Array & glyphs, Array& xOffsets) override; - bool getOutlineForGlyph (int glyphNumber, Path&) override; - EdgeTable* getEdgeTableForGlyph (int glyphNumber, const AffineTransform&, float fontHeight) override; - -protected: - //============================================================================== - juce_wchar defaultCharacter; - float ascent; - - //============================================================================== - /** If a subclass overrides this, it can load glyphs into the font on-demand. - When methods such as getGlyphPositions() or getOutlineForGlyph() are asked for a - particular character and there's no corresponding glyph, they'll call this - method so that a subclass can try to add that glyph, returning true if it - manages to do so. - */ - virtual bool loadGlyphIfPossible (juce_wchar characterNeeded); - -private: - //============================================================================== - class GlyphInfo; - friend struct ContainerDeletePolicy; - OwnedArray glyphs; - short lookupTable [128]; - - GlyphInfo* findGlyph (const juce_wchar character, bool loadIfNeeded) noexcept; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CustomTypeface) -}; - -#endif // JUCE_CUSTOMTYPEFACE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp deleted file mode 100755 index f0668d1..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.cpp +++ /dev/null @@ -1,720 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace FontValues -{ - static float limitFontHeight (const float height) noexcept - { - return jlimit (0.1f, 10000.0f, height); - } - - const float defaultFontHeight = 14.0f; - String fallbackFont; - String fallbackFontStyle; -} - -typedef Typeface::Ptr (*GetTypefaceForFont) (const Font&); -GetTypefaceForFont juce_getTypefaceForFont = nullptr; - -//============================================================================== -class TypefaceCache : private DeletedAtShutdown -{ -public: - TypefaceCache() : counter (0) - { - setSize (10); - } - - ~TypefaceCache() - { - clearSingletonInstance(); - } - - juce_DeclareSingleton (TypefaceCache, false) - - void setSize (const int numToCache) - { - const ScopedWriteLock sl (lock); - - faces.clear(); - faces.insertMultiple (-1, CachedFace(), numToCache); - } - - void clear() - { - const ScopedWriteLock sl (lock); - - setSize (faces.size()); - defaultFace = nullptr; - } - - Typeface::Ptr findTypefaceFor (const Font& font) - { - const ScopedReadLock slr (lock); - - const String faceName (font.getTypefaceName()); - const String faceStyle (font.getTypefaceStyle()); - - jassert (faceName.isNotEmpty()); - - for (int i = faces.size(); --i >= 0;) - { - CachedFace& face = faces.getReference(i); - - if (face.typefaceName == faceName - && face.typefaceStyle == faceStyle - && face.typeface != nullptr - && face.typeface->isSuitableForFont (font)) - { - face.lastUsageCount = ++counter; - return face.typeface; - } - } - - const ScopedWriteLock slw (lock); - int replaceIndex = 0; - size_t bestLastUsageCount = std::numeric_limits::max(); - - for (int i = faces.size(); --i >= 0;) - { - const size_t lu = faces.getReference(i).lastUsageCount; - - if (bestLastUsageCount > lu) - { - bestLastUsageCount = lu; - replaceIndex = i; - } - } - - CachedFace& face = faces.getReference (replaceIndex); - face.typefaceName = faceName; - face.typefaceStyle = faceStyle; - face.lastUsageCount = ++counter; - - if (juce_getTypefaceForFont == nullptr) - face.typeface = Font::getDefaultTypefaceForFont (font); - else - face.typeface = juce_getTypefaceForFont (font); - - jassert (face.typeface != nullptr); // the look and feel must return a typeface! - - if (defaultFace == nullptr && font == Font()) - defaultFace = face.typeface; - - return face.typeface; - } - - Typeface::Ptr defaultFace; - -private: - struct CachedFace - { - CachedFace() noexcept : lastUsageCount (0) {} - - // Although it seems a bit wacky to store the name here, it's because it may be a - // placeholder rather than a real one, e.g. "" vs the actual typeface name. - // Since the typeface itself doesn't know that it may have this alias, the name under - // which it was fetched needs to be stored separately. - String typefaceName, typefaceStyle; - size_t lastUsageCount; - Typeface::Ptr typeface; - }; - - ReadWriteLock lock; - Array faces; - size_t counter; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TypefaceCache) -}; - -juce_ImplementSingleton (TypefaceCache) - -void Typeface::setTypefaceCacheSize (int numFontsToCache) -{ - TypefaceCache::getInstance()->setSize (numFontsToCache); -} - -#if JUCE_MODULE_AVAILABLE_juce_opengl -extern void clearOpenGLGlyphCache(); -#endif - -void Typeface::clearTypefaceCache() -{ - TypefaceCache::getInstance()->clear(); - - RenderingHelpers::SoftwareRendererSavedState::clearGlyphCache(); - - #if JUCE_MODULE_AVAILABLE_juce_opengl - clearOpenGLGlyphCache(); - #endif -} - -//============================================================================== -class Font::SharedFontInternal : public ReferenceCountedObject -{ -public: - SharedFontInternal() noexcept - : typeface (TypefaceCache::getInstance()->defaultFace), - typefaceName (Font::getDefaultSansSerifFontName()), - typefaceStyle (Font::getDefaultStyle()), - height (FontValues::defaultFontHeight), - horizontalScale (1.0f), kerning (0), ascent (0), underline (false) - { - } - - SharedFontInternal (int styleFlags, float fontHeight) noexcept - : typefaceName (Font::getDefaultSansSerifFontName()), - typefaceStyle (FontStyleHelpers::getStyleName (styleFlags)), - height (fontHeight), - horizontalScale (1.0f), kerning (0), ascent (0), underline ((styleFlags & underlined) != 0) - { - if (styleFlags == plain) - typeface = TypefaceCache::getInstance()->defaultFace; - } - - SharedFontInternal (const String& name, int styleFlags, float fontHeight) noexcept - : typefaceName (name), - typefaceStyle (FontStyleHelpers::getStyleName (styleFlags)), - height (fontHeight), - horizontalScale (1.0f), kerning (0), ascent (0), underline ((styleFlags & underlined) != 0) - { - if (styleFlags == plain && typefaceName.isEmpty()) - typeface = TypefaceCache::getInstance()->defaultFace; - } - - SharedFontInternal (const String& name, const String& style, float fontHeight) noexcept - : typefaceName (name), typefaceStyle (style), height (fontHeight), - horizontalScale (1.0f), kerning (0), ascent (0), underline (false) - { - if (typefaceName.isEmpty()) - typefaceName = Font::getDefaultSansSerifFontName(); - } - - explicit SharedFontInternal (const Typeface::Ptr& face) noexcept - : typeface (face), - typefaceName (face->getName()), - typefaceStyle (face->getStyle()), - height (FontValues::defaultFontHeight), - horizontalScale (1.0f), kerning (0), ascent (0), underline (false) - { - jassert (typefaceName.isNotEmpty()); - } - - SharedFontInternal (const SharedFontInternal& other) noexcept - : ReferenceCountedObject(), - typeface (other.typeface), - typefaceName (other.typefaceName), - typefaceStyle (other.typefaceStyle), - height (other.height), - horizontalScale (other.horizontalScale), - kerning (other.kerning), - ascent (other.ascent), - underline (other.underline) - { - } - - bool operator== (const SharedFontInternal& other) const noexcept - { - return height == other.height - && underline == other.underline - && horizontalScale == other.horizontalScale - && kerning == other.kerning - && typefaceName == other.typefaceName - && typefaceStyle == other.typefaceStyle; - } - - Typeface::Ptr typeface; - String typefaceName, typefaceStyle; - float height, horizontalScale, kerning, ascent; - bool underline; -}; - -//============================================================================== -Font::Font() : font (new SharedFontInternal()) {} -Font::Font (const Typeface::Ptr& typeface) : font (new SharedFontInternal (typeface)) {} -Font::Font (const Font& other) noexcept : font (other.font) {} - -Font::Font (float fontHeight, int styleFlags) - : font (new SharedFontInternal (styleFlags, FontValues::limitFontHeight (fontHeight))) -{ -} - -Font::Font (const String& typefaceName, float fontHeight, int styleFlags) - : font (new SharedFontInternal (typefaceName, styleFlags, FontValues::limitFontHeight (fontHeight))) -{ -} - -Font::Font (const String& typefaceName, const String& typefaceStyle, float fontHeight) - : font (new SharedFontInternal (typefaceName, typefaceStyle, FontValues::limitFontHeight (fontHeight))) -{ -} - -Font& Font::operator= (const Font& other) noexcept -{ - font = other.font; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -Font::Font (Font&& other) noexcept - : font (static_cast&&> (other.font)) -{ -} - -Font& Font::operator= (Font&& other) noexcept -{ - font = static_cast&&> (other.font); - return *this; -} -#endif - -Font::~Font() noexcept -{ -} - -bool Font::operator== (const Font& other) const noexcept -{ - return font == other.font - || *font == *other.font; -} - -bool Font::operator!= (const Font& other) const noexcept -{ - return ! operator== (other); -} - -void Font::dupeInternalIfShared() -{ - if (font->getReferenceCount() > 1) - font = new SharedFontInternal (*font); -} - -void Font::checkTypefaceSuitability() -{ - if (font->typeface != nullptr && ! font->typeface->isSuitableForFont (*this)) - font->typeface = nullptr; -} - -//============================================================================== -struct FontPlaceholderNames -{ - FontPlaceholderNames() - : sans (""), - serif (""), - mono (""), - regular ("") - { - } - - String sans, serif, mono, regular; -}; - -const FontPlaceholderNames& getFontPlaceholderNames() -{ - static FontPlaceholderNames names; - return names; -} - -#if JUCE_MSVC -// This is a workaround for the lack of thread-safety in MSVC's handling of function-local -// statics - if multiple threads all try to create the first Font object at the same time, -// it can cause a race-condition in creating these placeholder strings. -struct FontNamePreloader { FontNamePreloader() { getFontPlaceholderNames(); } }; -static FontNamePreloader fnp; -#endif - -const String& Font::getDefaultSansSerifFontName() { return getFontPlaceholderNames().sans; } -const String& Font::getDefaultSerifFontName() { return getFontPlaceholderNames().serif; } -const String& Font::getDefaultMonospacedFontName() { return getFontPlaceholderNames().mono; } -const String& Font::getDefaultStyle() { return getFontPlaceholderNames().regular; } - -const String& Font::getTypefaceName() const noexcept { return font->typefaceName; } -const String& Font::getTypefaceStyle() const noexcept { return font->typefaceStyle; } - -void Font::setTypefaceName (const String& faceName) -{ - if (faceName != font->typefaceName) - { - jassert (faceName.isNotEmpty()); - - dupeInternalIfShared(); - font->typefaceName = faceName; - font->typeface = nullptr; - font->ascent = 0; - } -} - -void Font::setTypefaceStyle (const String& typefaceStyle) -{ - if (typefaceStyle != font->typefaceStyle) - { - dupeInternalIfShared(); - font->typefaceStyle = typefaceStyle; - font->typeface = nullptr; - font->ascent = 0; - } -} - -Font Font::withTypefaceStyle (const String& newStyle) const -{ - Font f (*this); - f.setTypefaceStyle (newStyle); - return f; -} - -StringArray Font::getAvailableStyles() const -{ - return findAllTypefaceStyles (getTypeface()->getName()); -} - -Typeface* Font::getTypeface() const -{ - if (font->typeface == nullptr) - { - font->typeface = TypefaceCache::getInstance()->findTypefaceFor (*this); - jassert (font->typeface != nullptr); - } - - return font->typeface; -} - -//============================================================================== -const String& Font::getFallbackFontName() -{ - return FontValues::fallbackFont; -} - -void Font::setFallbackFontName (const String& name) -{ - FontValues::fallbackFont = name; - - #if JUCE_MAC || JUCE_IOS - jassertfalse; // Note that use of a fallback font isn't currently implemented in OSX.. - #endif -} - -const String& Font::getFallbackFontStyle() -{ - return FontValues::fallbackFontStyle; -} - -void Font::setFallbackFontStyle (const String& style) -{ - FontValues::fallbackFontStyle = style; - - #if JUCE_MAC || JUCE_IOS - jassertfalse; // Note that use of a fallback font isn't currently implemented in OSX.. - #endif -} - -//============================================================================== -Font Font::withHeight (const float newHeight) const -{ - Font f (*this); - f.setHeight (newHeight); - return f; -} - -float Font::getHeightToPointsFactor() const -{ - return getTypeface()->getHeightToPointsFactor(); -} - -Font Font::withPointHeight (float heightInPoints) const -{ - Font f (*this); - f.setHeight (heightInPoints / getHeightToPointsFactor()); - return f; -} - -void Font::setHeight (float newHeight) -{ - newHeight = FontValues::limitFontHeight (newHeight); - - if (font->height != newHeight) - { - dupeInternalIfShared(); - font->height = newHeight; - checkTypefaceSuitability(); - } -} - -void Font::setHeightWithoutChangingWidth (float newHeight) -{ - newHeight = FontValues::limitFontHeight (newHeight); - - if (font->height != newHeight) - { - dupeInternalIfShared(); - font->horizontalScale *= (font->height / newHeight); - font->height = newHeight; - checkTypefaceSuitability(); - } -} - -int Font::getStyleFlags() const noexcept -{ - int styleFlags = font->underline ? underlined : plain; - - if (isBold()) styleFlags |= bold; - if (isItalic()) styleFlags |= italic; - - return styleFlags; -} - -Font Font::withStyle (const int newFlags) const -{ - Font f (*this); - f.setStyleFlags (newFlags); - return f; -} - -void Font::setStyleFlags (const int newFlags) -{ - if (getStyleFlags() != newFlags) - { - dupeInternalIfShared(); - font->typeface = nullptr; - font->typefaceStyle = FontStyleHelpers::getStyleName (newFlags); - font->underline = (newFlags & underlined) != 0; - font->ascent = 0; - } -} - -void Font::setSizeAndStyle (float newHeight, - const int newStyleFlags, - const float newHorizontalScale, - const float newKerningAmount) -{ - newHeight = FontValues::limitFontHeight (newHeight); - - if (font->height != newHeight - || font->horizontalScale != newHorizontalScale - || font->kerning != newKerningAmount) - { - dupeInternalIfShared(); - font->height = newHeight; - font->horizontalScale = newHorizontalScale; - font->kerning = newKerningAmount; - checkTypefaceSuitability(); - } - - setStyleFlags (newStyleFlags); -} - -void Font::setSizeAndStyle (float newHeight, - const String& newStyle, - const float newHorizontalScale, - const float newKerningAmount) -{ - newHeight = FontValues::limitFontHeight (newHeight); - - if (font->height != newHeight - || font->horizontalScale != newHorizontalScale - || font->kerning != newKerningAmount) - { - dupeInternalIfShared(); - font->height = newHeight; - font->horizontalScale = newHorizontalScale; - font->kerning = newKerningAmount; - checkTypefaceSuitability(); - } - - setTypefaceStyle (newStyle); -} - -Font Font::withHorizontalScale (const float newHorizontalScale) const -{ - Font f (*this); - f.setHorizontalScale (newHorizontalScale); - return f; -} - -void Font::setHorizontalScale (const float scaleFactor) -{ - dupeInternalIfShared(); - font->horizontalScale = scaleFactor; - checkTypefaceSuitability(); -} - -float Font::getHorizontalScale() const noexcept -{ - return font->horizontalScale; -} - -float Font::getExtraKerningFactor() const noexcept -{ - return font->kerning; -} - -Font Font::withExtraKerningFactor (const float extraKerning) const -{ - Font f (*this); - f.setExtraKerningFactor (extraKerning); - return f; -} - -void Font::setExtraKerningFactor (const float extraKerning) -{ - dupeInternalIfShared(); - font->kerning = extraKerning; - checkTypefaceSuitability(); -} - -Font Font::boldened() const { return withStyle (getStyleFlags() | bold); } -Font Font::italicised() const { return withStyle (getStyleFlags() | italic); } - -bool Font::isBold() const noexcept { return FontStyleHelpers::isBold (font->typefaceStyle); } -bool Font::isItalic() const noexcept { return FontStyleHelpers::isItalic (font->typefaceStyle); } -bool Font::isUnderlined() const noexcept { return font->underline; } - -void Font::setBold (const bool shouldBeBold) -{ - const int flags = getStyleFlags(); - setStyleFlags (shouldBeBold ? (flags | bold) - : (flags & ~bold)); -} - -void Font::setItalic (const bool shouldBeItalic) -{ - const int flags = getStyleFlags(); - setStyleFlags (shouldBeItalic ? (flags | italic) - : (flags & ~italic)); -} - -void Font::setUnderline (const bool shouldBeUnderlined) -{ - dupeInternalIfShared(); - font->underline = shouldBeUnderlined; - checkTypefaceSuitability(); -} - -float Font::getAscent() const -{ - if (font->ascent == 0) - font->ascent = getTypeface()->getAscent(); - - return font->height * font->ascent; -} - -float Font::getHeight() const noexcept { return font->height; } -float Font::getDescent() const { return font->height - getAscent(); } - -float Font::getHeightInPoints() const { return getHeight() * getHeightToPointsFactor(); } -float Font::getAscentInPoints() const { return getAscent() * getHeightToPointsFactor(); } -float Font::getDescentInPoints() const { return getDescent() * getHeightToPointsFactor(); } - -int Font::getStringWidth (const String& text) const -{ - return roundToInt (getStringWidthFloat (text)); -} - -float Font::getStringWidthFloat (const String& text) const -{ - float w = getTypeface()->getStringWidth (text); - - if (font->kerning != 0) - w += font->kerning * text.length(); - - return w * font->height * font->horizontalScale; -} - -void Font::getGlyphPositions (const String& text, Array& glyphs, Array& xOffsets) const -{ - getTypeface()->getGlyphPositions (text, glyphs, xOffsets); - - const int num = xOffsets.size(); - - if (num > 0) - { - const float scale = font->height * font->horizontalScale; - float* const x = xOffsets.getRawDataPointer(); - - if (font->kerning != 0) - { - for (int i = 0; i < num; ++i) - x[i] = (x[i] + i * font->kerning) * scale; - } - else - { - for (int i = 0; i < num; ++i) - x[i] *= scale; - } - } -} - -void Font::findFonts (Array& destArray) -{ - const StringArray names (findAllTypefaceNames()); - - for (int i = 0; i < names.size(); ++i) - { - const StringArray styles (findAllTypefaceStyles (names[i])); - - String style ("Regular"); - - if (! styles.contains (style, true)) - style = styles[0]; - - destArray.add (Font (names[i], style, FontValues::defaultFontHeight)); - } -} - -//============================================================================== -String Font::toString() const -{ - String s; - - if (getTypefaceName() != getDefaultSansSerifFontName()) - s << getTypefaceName() << "; "; - - s << String (getHeight(), 1); - - if (getTypefaceStyle() != getDefaultStyle()) - s << ' ' << getTypefaceStyle(); - - return s; -} - -Font Font::fromString (const String& fontDescription) -{ - const int separator = fontDescription.indexOfChar (';'); - String name; - - if (separator > 0) - name = fontDescription.substring (0, separator).trim(); - - if (name.isEmpty()) - name = getDefaultSansSerifFontName(); - - String sizeAndStyle (fontDescription.substring (separator + 1).trimStart()); - - float height = sizeAndStyle.getFloatValue(); - if (height <= 0) - height = 10.0f; - - const String style (sizeAndStyle.fromFirstOccurrenceOf (" ", false, false)); - - return Font (name, style, height); -} diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h deleted file mode 100755 index 9888b27..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Font.h +++ /dev/null @@ -1,460 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_FONT_H_INCLUDED -#define JUCE_FONT_H_INCLUDED - - -//============================================================================== -/** - Represents a particular font, including its size, style, etc. - - Apart from the typeface to be used, a Font object also dictates whether - the font is bold, italic, underlined, how big it is, and its kerning and - horizontal scale factor. - - @see Typeface -*/ -class JUCE_API Font -{ -public: - //============================================================================== - /** A combination of these values is used by the constructor to specify the - style of font to use. - */ - enum FontStyleFlags - { - plain = 0, /**< indicates a plain, non-bold, non-italic version of the font. @see setStyleFlags */ - bold = 1, /**< boldens the font. @see setStyleFlags */ - italic = 2, /**< finds an italic version of the font. @see setStyleFlags */ - underlined = 4 /**< underlines the font. @see setStyleFlags */ - }; - - //============================================================================== - /** Creates a sans-serif font in a given size. - - @param fontHeight the height in pixels (can be fractional) - @param styleFlags the style to use - this can be a combination of the - Font::bold, Font::italic and Font::underlined, or - just Font::plain for the normal style. - @see FontStyleFlags, getDefaultSansSerifFontName - */ - Font (float fontHeight, int styleFlags = plain); - - /** Creates a font with a given typeface and parameters. - - @param typefaceName the font family of the typeface to use - @param fontHeight the height in pixels (can be fractional) - @param styleFlags the style to use - this can be a combination of the - Font::bold, Font::italic and Font::underlined, or - just Font::plain for the normal style. - @see FontStyleFlags, getDefaultSansSerifFontName - */ - Font (const String& typefaceName, float fontHeight, int styleFlags); - - /** Creates a font with a given typeface and parameters. - - @param typefaceName the font family of the typeface to use - @param typefaceStyle the font style of the typeface to use - @param fontHeight the height in pixels (can be fractional) - */ - Font (const String& typefaceName, const String& typefaceStyle, float fontHeight); - - /** Creates a copy of another Font object. */ - Font (const Font& other) noexcept; - - /** Creates a font for a typeface. */ - Font (const Typeface::Ptr& typeface); - - /** Creates a basic sans-serif font at a default height. - - You should use one of the other constructors for creating a font that you're planning - on drawing with - this constructor is here to help initialise objects before changing - the font's settings later. - */ - Font(); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Font (Font&& other) noexcept; - Font& operator= (Font&& other) noexcept; - #endif - - /** Copies this font from another one. */ - Font& operator= (const Font& other) noexcept; - - bool operator== (const Font& other) const noexcept; - bool operator!= (const Font& other) const noexcept; - - /** Destructor. */ - ~Font() noexcept; - - //============================================================================== - /** Changes the font family of the typeface. - - e.g. "Arial", "Courier", etc. - - This may also be set to Font::getDefaultSansSerifFontName(), Font::getDefaultSerifFontName(), - or Font::getDefaultMonospacedFontName(), which are not actual platform-specific font family names, - but are generic font family names that are used to represent the various default fonts. - If you need to know the exact typeface font family being used, you can call - Font::getTypeface()->getName(), which will give you the platform-specific font family. - - If a suitable font isn't found on the machine, it'll just use a default instead. - */ - void setTypefaceName (const String& faceName); - - /** Returns the font family of the typeface that this font uses. - - e.g. "Arial", "Courier", etc. - - This may also be set to Font::getDefaultSansSerifFontName(), Font::getDefaultSerifFontName(), - or Font::getDefaultMonospacedFontName(), which are not actual platform-specific font family names, - but are generic font familiy names that are used to represent the various default fonts. - - If you need to know the exact typeface font family being used, you can call - Font::getTypeface()->getName(), which will give you the platform-specific font family. - */ - const String& getTypefaceName() const noexcept; - - //============================================================================== - /** Returns the font style of the typeface that this font uses. - @see withTypefaceStyle, getAvailableStyles() - */ - const String& getTypefaceStyle() const noexcept; - - /** Changes the font style of the typeface. - @see getAvailableStyles() - */ - void setTypefaceStyle (const String& newStyle); - - /** Returns a copy of this font with a new typeface style. - @see getAvailableStyles() - */ - Font withTypefaceStyle (const String& newStyle) const; - - /** Returns a list of the styles that this font can use. */ - StringArray getAvailableStyles() const; - - //============================================================================== - /** Returns a typeface font family that represents the default sans-serif font. - - This is also the typeface that will be used when a font is created without - specifying any typeface details. - - Note that this method just returns a generic placeholder string that means "the default - sans-serif font" - it's not the actual font family of this font. - - @see setTypefaceName, getDefaultSerifFontName, getDefaultMonospacedFontName - */ - static const String& getDefaultSansSerifFontName(); - - /** Returns a typeface font family that represents the default serif font. - - Note that this method just returns a generic placeholder string that means "the default - serif font" - it's not the actual font family of this font. - - @see setTypefaceName, getDefaultSansSerifFontName, getDefaultMonospacedFontName - */ - static const String& getDefaultSerifFontName(); - - /** Returns a typeface font family that represents the default monospaced font. - - Note that this method just returns a generic placeholder string that means "the default - monospaced font" - it's not the actual font family of this font. - - @see setTypefaceName, getDefaultSansSerifFontName, getDefaultSerifFontName - */ - static const String& getDefaultMonospacedFontName(); - - /** Returns a font style name that represents the default style. - - Note that this method just returns a generic placeholder string that means "the default - font style" - it's not the actual name of the font style of any particular font. - - @see setTypefaceStyle - */ - static const String& getDefaultStyle(); - - /** Returns the default system typeface for the given font. */ - static Typeface::Ptr getDefaultTypefaceForFont (const Font& font); - - //============================================================================== - /** Returns a copy of this font with a new height. */ - Font withHeight (float height) const; - - /** Returns a copy of this font with a new height, specified in points. */ - Font withPointHeight (float heightInPoints) const; - - /** Changes the font's height. - @see getHeight, withHeight, setHeightWithoutChangingWidth - */ - void setHeight (float newHeight); - - /** Changes the font's height without changing its width. - This alters the horizontal scale to compensate for the change in height. - */ - void setHeightWithoutChangingWidth (float newHeight); - - /** Returns the total height of this font, in pixels. - This is the maximum height, from the top of the ascent to the bottom of the - descenders. - - @see withHeight, setHeightWithoutChangingWidth, getAscent - */ - float getHeight() const noexcept; - - /** Returns the total height of this font, in points. - This is the maximum height, from the top of the ascent to the bottom of the - descenders. - - @see withPointHeight, getHeight - */ - float getHeightInPoints() const; - - /** Returns the height of the font above its baseline, in pixels. - This is the maximum height from the baseline to the top. - @see getHeight, getDescent - */ - float getAscent() const; - - /** Returns the height of the font above its baseline, in points. - This is the maximum height from the baseline to the top. - @see getHeight, getDescent - */ - float getAscentInPoints() const; - - /** Returns the amount that the font descends below its baseline, in pixels. - This is calculated as (getHeight() - getAscent()). - @see getAscent, getHeight - */ - float getDescent() const; - - /** Returns the amount that the font descends below its baseline, in points. - This is calculated as (getHeight() - getAscent()). - @see getAscent, getHeight - */ - float getDescentInPoints() const; - - //============================================================================== - /** Returns the font's style flags. - This will return a bitwise-or'ed combination of values from the FontStyleFlags - enum, to describe whether the font is bold, italic, etc. - @see FontStyleFlags, withStyle - */ - int getStyleFlags() const noexcept; - - /** Returns a copy of this font with the given set of style flags. - @param styleFlags a bitwise-or'ed combination of values from the FontStyleFlags enum. - @see FontStyleFlags, getStyleFlags - */ - Font withStyle (int styleFlags) const; - - /** Changes the font's style. - @param newFlags a bitwise-or'ed combination of values from the FontStyleFlags enum. - @see FontStyleFlags, withStyle - */ - void setStyleFlags (int newFlags); - - //============================================================================== - /** Makes the font bold or non-bold. */ - void setBold (bool shouldBeBold); - /** Returns a copy of this font with the bold attribute set. */ - Font boldened() const; - /** Returns true if the font is bold. */ - bool isBold() const noexcept; - - /** Makes the font italic or non-italic. */ - void setItalic (bool shouldBeItalic); - /** Returns a copy of this font with the italic attribute set. */ - Font italicised() const; - /** Returns true if the font is italic. */ - bool isItalic() const noexcept; - - /** Makes the font underlined or non-underlined. */ - void setUnderline (bool shouldBeUnderlined); - /** Returns true if the font is underlined. */ - bool isUnderlined() const noexcept; - - - //============================================================================== - /** Returns the font's horizontal scale. - A value of 1.0 is the normal scale, less than this will be narrower, greater - than 1.0 will be stretched out. - - @see withHorizontalScale - */ - float getHorizontalScale() const noexcept; - - /** Returns a copy of this font with a new horizontal scale. - @param scaleFactor a value of 1.0 is the normal scale, less than this will be - narrower, greater than 1.0 will be stretched out. - @see getHorizontalScale - */ - Font withHorizontalScale (float scaleFactor) const; - - /** Changes the font's horizontal scale factor. - @param scaleFactor a value of 1.0 is the normal scale, less than this will be - narrower, greater than 1.0 will be stretched out. - */ - void setHorizontalScale (float scaleFactor); - - /** Returns the font's kerning. - - This is the extra space added between adjacent characters, as a proportion - of the font's height. - - A value of zero is normal spacing, positive values will spread the letters - out more, and negative values make them closer together. - */ - float getExtraKerningFactor() const noexcept; - - /** Returns a copy of this font with a new kerning factor. - @param extraKerning a multiple of the font's height that will be added - to space between the characters. So a value of zero is - normal spacing, positive values spread the letters out, - negative values make them closer together. - */ - Font withExtraKerningFactor (float extraKerning) const; - - /** Changes the font's kerning. - @param extraKerning a multiple of the font's height that will be added - to space between the characters. So a value of zero is - normal spacing, positive values spread the letters out, - negative values make them closer together. - */ - void setExtraKerningFactor (float extraKerning); - - //============================================================================== - /** Changes all the font's characteristics with one call. */ - void setSizeAndStyle (float newHeight, - int newStyleFlags, - float newHorizontalScale, - float newKerningAmount); - - /** Changes all the font's characteristics with one call. */ - void setSizeAndStyle (float newHeight, - const String& newStyle, - float newHorizontalScale, - float newKerningAmount); - - //============================================================================== - /** Returns the total width of a string as it would be drawn using this font. - For a more accurate floating-point result, use getStringWidthFloat(). - */ - int getStringWidth (const String& text) const; - - /** Returns the total width of a string as it would be drawn using this font. - @see getStringWidth - */ - float getStringWidthFloat (const String& text) const; - - /** Returns the series of glyph numbers and their x offsets needed to represent a string. - - An extra x offset is added at the end of the run, to indicate where the right hand - edge of the last character is. - */ - void getGlyphPositions (const String& text, Array & glyphs, Array & xOffsets) const; - - //============================================================================== - /** Returns the typeface used by this font. - - Note that the object returned may go out of scope if this font is deleted - or has its style changed. - */ - Typeface* getTypeface() const; - - /** Creates an array of Font objects to represent all the fonts on the system. - - If you just need the font family names of the typefaces, you can also use - findAllTypefaceNames() instead. - - @param results the array to which new Font objects will be added. - */ - static void findFonts (Array& results); - - /** Returns a list of all the available typeface font families. - - The names returned can be passed into setTypefaceName(). - - You can use this instead of findFonts() if you only need their font family names, - and not font objects. - */ - static StringArray findAllTypefaceNames(); - - /** Returns a list of all the available typeface font styles. - - The names returned can be passed into setTypefaceStyle(). - - You can use this instead of findFonts() if you only need their styles, and not - font objects. - */ - static StringArray findAllTypefaceStyles (const String& family); - - //============================================================================== - /** Returns the font family of the typeface to be used for rendering glyphs that aren't - found in the requested typeface. - */ - static const String& getFallbackFontName(); - - /** Sets the (platform-specific) font family of the typeface to use to find glyphs that - aren't available in whatever font you're trying to use. - */ - static void setFallbackFontName (const String& name); - - /** Returns the font style of the typeface to be used for rendering glyphs that aren't - found in the requested typeface. - */ - static const String& getFallbackFontStyle(); - - /** Sets the (platform-specific) font style of the typeface to use to find glyphs that - aren't available in whatever font you're trying to use. - */ - static void setFallbackFontStyle (const String& style); - - //============================================================================== - /** Creates a string to describe this font. - The string will contain information to describe the font's typeface, size, and - style. To recreate the font from this string, use fromString(). - */ - String toString() const; - - /** Recreates a font from its stringified encoding. - This method takes a string that was created by toString(), and recreates the - original font. - */ - static Font fromString (const String& fontDescription); - - -private: - //============================================================================== - class SharedFontInternal; - ReferenceCountedObjectPtr font; - void dupeInternalIfShared(); - void checkTypefaceSuitability(); - float getHeightToPointsFactor() const; - - JUCE_LEAK_DETECTOR (Font) -}; - -#endif // JUCE_FONT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp deleted file mode 100755 index 7b0de6e..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.cpp +++ /dev/null @@ -1,812 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -PositionedGlyph::PositionedGlyph() noexcept - : character (0), glyph (0), x (0), y (0), w (0), whitespace (false) -{ -} - -PositionedGlyph::PositionedGlyph (const Font& font_, const juce_wchar character_, const int glyph_, - const float x_, const float y_, const float w_, const bool whitespace_) - : font (font_), character (character_), glyph (glyph_), - x (x_), y (y_), w (w_), whitespace (whitespace_) -{ -} - -PositionedGlyph::PositionedGlyph (const PositionedGlyph& other) - : font (other.font), character (other.character), glyph (other.glyph), - x (other.x), y (other.y), w (other.w), whitespace (other.whitespace) -{ -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -PositionedGlyph::PositionedGlyph (PositionedGlyph&& other) noexcept - : font (static_cast (other.font)), - character (other.character), glyph (other.glyph), - x (other.x), y (other.y), w (other.w), whitespace (other.whitespace) -{ -} - -PositionedGlyph& PositionedGlyph::operator= (PositionedGlyph&& other) noexcept -{ - font = static_cast (other.font); - character = other.character; - glyph = other.glyph; - x = other.x; - y = other.y; - w = other.w; - whitespace = other.whitespace; - return *this; -} -#endif - -PositionedGlyph::~PositionedGlyph() {} - -PositionedGlyph& PositionedGlyph::operator= (const PositionedGlyph& other) -{ - font = other.font; - character = other.character; - glyph = other.glyph; - x = other.x; - y = other.y; - w = other.w; - whitespace = other.whitespace; - return *this; -} - -static inline void drawGlyphWithFont (Graphics& g, int glyph, const Font& font, const AffineTransform& t) -{ - LowLevelGraphicsContext& context = g.getInternalContext(); - context.setFont (font); - context.drawGlyph (glyph, t); -} - -void PositionedGlyph::draw (Graphics& g) const -{ - if (! isWhitespace()) - drawGlyphWithFont (g, glyph, font, AffineTransform::translation (x, y)); -} - -void PositionedGlyph::draw (Graphics& g, const AffineTransform& transform) const -{ - if (! isWhitespace()) - drawGlyphWithFont (g, glyph, font, AffineTransform::translation (x, y).followedBy (transform)); -} - -void PositionedGlyph::createPath (Path& path) const -{ - if (! isWhitespace()) - { - if (Typeface* const t = font.getTypeface()) - { - Path p; - t->getOutlineForGlyph (glyph, p); - - path.addPath (p, AffineTransform::scale (font.getHeight() * font.getHorizontalScale(), font.getHeight()) - .translated (x, y)); - } - } -} - -bool PositionedGlyph::hitTest (float px, float py) const -{ - if (getBounds().contains (px, py) && ! isWhitespace()) - { - if (Typeface* const t = font.getTypeface()) - { - Path p; - t->getOutlineForGlyph (glyph, p); - - AffineTransform::translation (-x, -y) - .scaled (1.0f / (font.getHeight() * font.getHorizontalScale()), 1.0f / font.getHeight()) - .transformPoint (px, py); - - return p.contains (px, py); - } - } - - return false; -} - -void PositionedGlyph::moveBy (const float deltaX, - const float deltaY) -{ - x += deltaX; - y += deltaY; -} - - -//============================================================================== -GlyphArrangement::GlyphArrangement() -{ - glyphs.ensureStorageAllocated (128); -} - -GlyphArrangement::GlyphArrangement (const GlyphArrangement& other) - : glyphs (other.glyphs) -{ -} - -GlyphArrangement& GlyphArrangement::operator= (const GlyphArrangement& other) -{ - glyphs = other.glyphs; - return *this; -} - -GlyphArrangement::~GlyphArrangement() -{ -} - -//============================================================================== -void GlyphArrangement::clear() -{ - glyphs.clear(); -} - -PositionedGlyph& GlyphArrangement::getGlyph (const int index) const noexcept -{ - return glyphs.getReference (index); -} - -//============================================================================== -void GlyphArrangement::addGlyphArrangement (const GlyphArrangement& other) -{ - glyphs.addArray (other.glyphs); -} - -void GlyphArrangement::addGlyph (const PositionedGlyph& glyph) -{ - glyphs.add (glyph); -} - -void GlyphArrangement::removeRangeOfGlyphs (int startIndex, const int num) -{ - glyphs.removeRange (startIndex, num < 0 ? glyphs.size() : num); -} - -//============================================================================== -void GlyphArrangement::addLineOfText (const Font& font, - const String& text, - const float xOffset, - const float yOffset) -{ - addCurtailedLineOfText (font, text, xOffset, yOffset, 1.0e10f, false); -} - -void GlyphArrangement::addCurtailedLineOfText (const Font& font, - const String& text, - const float xOffset, - const float yOffset, - const float maxWidthPixels, - const bool useEllipsis) -{ - if (text.isNotEmpty()) - { - Array newGlyphs; - Array xOffsets; - font.getGlyphPositions (text, newGlyphs, xOffsets); - const int textLen = newGlyphs.size(); - glyphs.ensureStorageAllocated (glyphs.size() + textLen); - - String::CharPointerType t (text.getCharPointer()); - - for (int i = 0; i < textLen; ++i) - { - const float nextX = xOffsets.getUnchecked (i + 1); - - if (nextX > maxWidthPixels + 1.0f) - { - // curtail the string if it's too wide.. - if (useEllipsis && textLen > 3 && glyphs.size() >= 3) - insertEllipsis (font, xOffset + maxWidthPixels, 0, glyphs.size()); - - break; - } - - const float thisX = xOffsets.getUnchecked (i); - const bool isWhitespace = t.isWhitespace(); - - glyphs.add (PositionedGlyph (font, t.getAndAdvance(), - newGlyphs.getUnchecked(i), - xOffset + thisX, yOffset, - nextX - thisX, isWhitespace)); - } - } -} - -int GlyphArrangement::insertEllipsis (const Font& font, const float maxXPos, - const int startIndex, int endIndex) -{ - int numDeleted = 0; - - if (glyphs.size() > 0) - { - Array dotGlyphs; - Array dotXs; - font.getGlyphPositions ("..", dotGlyphs, dotXs); - - const float dx = dotXs[1]; - float xOffset = 0.0f, yOffset = 0.0f; - - while (endIndex > startIndex) - { - const PositionedGlyph& pg = glyphs.getReference (--endIndex); - xOffset = pg.x; - yOffset = pg.y; - - glyphs.remove (endIndex); - ++numDeleted; - - if (xOffset + dx * 3 <= maxXPos) - break; - } - - for (int i = 3; --i >= 0;) - { - glyphs.insert (endIndex++, PositionedGlyph (font, '.', dotGlyphs.getFirst(), - xOffset, yOffset, dx, false)); - --numDeleted; - xOffset += dx; - - if (xOffset > maxXPos) - break; - } - } - - return numDeleted; -} - -void GlyphArrangement::addJustifiedText (const Font& font, - const String& text, - float x, float y, - const float maxLineWidth, - Justification horizontalLayout) -{ - int lineStartIndex = glyphs.size(); - addLineOfText (font, text, x, y); - - const float originalY = y; - - while (lineStartIndex < glyphs.size()) - { - int i = lineStartIndex; - - if (glyphs.getReference(i).getCharacter() != '\n' - && glyphs.getReference(i).getCharacter() != '\r') - ++i; - - const float lineMaxX = glyphs.getReference (lineStartIndex).getLeft() + maxLineWidth; - int lastWordBreakIndex = -1; - - while (i < glyphs.size()) - { - const PositionedGlyph& pg = glyphs.getReference (i); - const juce_wchar c = pg.getCharacter(); - - if (c == '\r' || c == '\n') - { - ++i; - - if (c == '\r' && i < glyphs.size() - && glyphs.getReference(i).getCharacter() == '\n') - ++i; - - break; - } - - if (pg.isWhitespace()) - { - lastWordBreakIndex = i + 1; - } - else if (pg.getRight() - 0.0001f >= lineMaxX) - { - if (lastWordBreakIndex >= 0) - i = lastWordBreakIndex; - - break; - } - - ++i; - } - - const float currentLineStartX = glyphs.getReference (lineStartIndex).getLeft(); - float currentLineEndX = currentLineStartX; - - for (int j = i; --j >= lineStartIndex;) - { - if (! glyphs.getReference (j).isWhitespace()) - { - currentLineEndX = glyphs.getReference (j).getRight(); - break; - } - } - - float deltaX = 0.0f; - - if (horizontalLayout.testFlags (Justification::horizontallyJustified)) - spreadOutLine (lineStartIndex, i - lineStartIndex, maxLineWidth); - else if (horizontalLayout.testFlags (Justification::horizontallyCentred)) - deltaX = (maxLineWidth - (currentLineEndX - currentLineStartX)) * 0.5f; - else if (horizontalLayout.testFlags (Justification::right)) - deltaX = maxLineWidth - (currentLineEndX - currentLineStartX); - - moveRangeOfGlyphs (lineStartIndex, i - lineStartIndex, - x + deltaX - currentLineStartX, y - originalY); - - lineStartIndex = i; - - y += font.getHeight(); - } -} - -void GlyphArrangement::addFittedText (const Font& f, - const String& text, - const float x, const float y, - const float width, const float height, - Justification layout, - int maximumLines, - const float minimumHorizontalScale) -{ - // doesn't make much sense if this is outside a sensible range of 0.5 to 1.0 - jassert (minimumHorizontalScale > 0 && minimumHorizontalScale <= 1.0f); - - if (text.containsAnyOf ("\r\n")) - { - addLinesWithLineBreaks (text, f, x, y, width, height, layout); - } - else - { - const int startIndex = glyphs.size(); - const String trimmed (text.trim()); - addLineOfText (f, trimmed, x, y); - const int numGlyphs = glyphs.size() - startIndex; - - if (numGlyphs > 0) - { - const float lineWidth = glyphs.getReference (glyphs.size() - 1).getRight() - - glyphs.getReference (startIndex).getLeft(); - - if (lineWidth > 0) - { - if (lineWidth * minimumHorizontalScale < width) - { - if (lineWidth > width) - stretchRangeOfGlyphs (startIndex, numGlyphs, width / lineWidth); - - justifyGlyphs (startIndex, numGlyphs, x, y, width, height, layout); - } - else if (maximumLines <= 1) - { - fitLineIntoSpace (startIndex, numGlyphs, x, y, width, height, - f, layout, minimumHorizontalScale); - } - else - { - splitLines (trimmed, f, startIndex, x, y, width, height, - maximumLines, lineWidth, layout, minimumHorizontalScale); - } - } - } - } -} - -//============================================================================== -void GlyphArrangement::moveRangeOfGlyphs (int startIndex, int num, const float dx, const float dy) -{ - jassert (startIndex >= 0); - - if (dx != 0.0f || dy != 0.0f) - { - if (num < 0 || startIndex + num > glyphs.size()) - num = glyphs.size() - startIndex; - - while (--num >= 0) - glyphs.getReference (startIndex++).moveBy (dx, dy); - } -} - -void GlyphArrangement::addLinesWithLineBreaks (const String& text, const Font& f, - float x, float y, float width, float height, Justification layout) -{ - GlyphArrangement ga; - ga.addJustifiedText (f, text, x, y, width, layout); - - const Rectangle bb (ga.getBoundingBox (0, -1, false)); - - float dy = y - bb.getY(); - - if (layout.testFlags (Justification::verticallyCentred)) dy += (height - bb.getHeight()) * 0.5f; - else if (layout.testFlags (Justification::bottom)) dy += (height - bb.getHeight()); - - ga.moveRangeOfGlyphs (0, -1, 0.0f, dy); - - glyphs.addArray (ga.glyphs); -} - -int GlyphArrangement::fitLineIntoSpace (int start, int numGlyphs, float x, float y, float w, float h, const Font& font, - Justification justification, float minimumHorizontalScale) -{ - int numDeleted = 0; - const float lineStartX = glyphs.getReference (start).getLeft(); - float lineWidth = glyphs.getReference (start + numGlyphs - 1).getRight() - lineStartX; - - if (lineWidth > w) - { - if (minimumHorizontalScale < 1.0f) - { - stretchRangeOfGlyphs (start, numGlyphs, jmax (minimumHorizontalScale, w / lineWidth)); - lineWidth = glyphs.getReference (start + numGlyphs - 1).getRight() - lineStartX - 0.5f; - } - - if (lineWidth > w) - { - numDeleted = insertEllipsis (font, lineStartX + w, start, start + numGlyphs); - numGlyphs -= numDeleted; - } - } - - justifyGlyphs (start, numGlyphs, x, y, w, h, justification); - return numDeleted; -} - -void GlyphArrangement::stretchRangeOfGlyphs (int startIndex, int num, - const float horizontalScaleFactor) -{ - jassert (startIndex >= 0); - - if (num < 0 || startIndex + num > glyphs.size()) - num = glyphs.size() - startIndex; - - if (num > 0) - { - const float xAnchor = glyphs.getReference (startIndex).getLeft(); - - while (--num >= 0) - { - PositionedGlyph& pg = glyphs.getReference (startIndex++); - - pg.x = xAnchor + (pg.x - xAnchor) * horizontalScaleFactor; - pg.font.setHorizontalScale (pg.font.getHorizontalScale() * horizontalScaleFactor); - pg.w *= horizontalScaleFactor; - } - } -} - -Rectangle GlyphArrangement::getBoundingBox (int startIndex, int num, const bool includeWhitespace) const -{ - jassert (startIndex >= 0); - - if (num < 0 || startIndex + num > glyphs.size()) - num = glyphs.size() - startIndex; - - Rectangle result; - - while (--num >= 0) - { - const PositionedGlyph& pg = glyphs.getReference (startIndex++); - - if (includeWhitespace || ! pg.isWhitespace()) - result = result.getUnion (pg.getBounds()); - } - - return result; -} - -void GlyphArrangement::justifyGlyphs (const int startIndex, const int num, - const float x, const float y, const float width, const float height, - Justification justification) -{ - jassert (num >= 0 && startIndex >= 0); - - if (glyphs.size() > 0 && num > 0) - { - const Rectangle bb (getBoundingBox (startIndex, num, ! justification.testFlags (Justification::horizontallyJustified - | Justification::horizontallyCentred))); - float deltaX = 0.0f, deltaY = 0.0f; - - if (justification.testFlags (Justification::horizontallyJustified)) deltaX = x - bb.getX(); - else if (justification.testFlags (Justification::horizontallyCentred)) deltaX = x + (width - bb.getWidth()) * 0.5f - bb.getX(); - else if (justification.testFlags (Justification::right)) deltaX = x + width - bb.getRight(); - else deltaX = x - bb.getX(); - - if (justification.testFlags (Justification::top)) deltaY = y - bb.getY(); - else if (justification.testFlags (Justification::bottom)) deltaY = y + height - bb.getBottom(); - else deltaY = y + (height - bb.getHeight()) * 0.5f - bb.getY(); - - moveRangeOfGlyphs (startIndex, num, deltaX, deltaY); - - if (justification.testFlags (Justification::horizontallyJustified)) - { - int lineStart = 0; - float baseY = glyphs.getReference (startIndex).getBaselineY(); - - int i; - for (i = 0; i < num; ++i) - { - const float glyphY = glyphs.getReference (startIndex + i).getBaselineY(); - - if (glyphY != baseY) - { - spreadOutLine (startIndex + lineStart, i - lineStart, width); - - lineStart = i; - baseY = glyphY; - } - } - - if (i > lineStart) - spreadOutLine (startIndex + lineStart, i - lineStart, width); - } - } -} - -void GlyphArrangement::spreadOutLine (const int start, const int num, const float targetWidth) -{ - if (start + num < glyphs.size() - && glyphs.getReference (start + num - 1).getCharacter() != '\r' - && glyphs.getReference (start + num - 1).getCharacter() != '\n') - { - int numSpaces = 0; - int spacesAtEnd = 0; - - for (int i = 0; i < num; ++i) - { - if (glyphs.getReference (start + i).isWhitespace()) - { - ++spacesAtEnd; - ++numSpaces; - } - else - { - spacesAtEnd = 0; - } - } - - numSpaces -= spacesAtEnd; - - if (numSpaces > 0) - { - const float startX = glyphs.getReference (start).getLeft(); - const float endX = glyphs.getReference (start + num - 1 - spacesAtEnd).getRight(); - - const float extraPaddingBetweenWords - = (targetWidth - (endX - startX)) / (float) numSpaces; - - float deltaX = 0.0f; - - for (int i = 0; i < num; ++i) - { - glyphs.getReference (start + i).moveBy (deltaX, 0.0f); - - if (glyphs.getReference (start + i).isWhitespace()) - deltaX += extraPaddingBetweenWords; - } - } - } -} - - -void GlyphArrangement::splitLines (const String& text, Font font, int startIndex, - float x, float y, float width, float height, int maximumLines, - float lineWidth, Justification layout, float minimumHorizontalScale) -{ - const int length = text.length(); - const int originalStartIndex = startIndex; - int numLines = 1; - - if (length <= 12 && ! text.containsAnyOf (" -\t\r\n")) - maximumLines = 1; - - maximumLines = jmin (maximumLines, length); - - while (numLines < maximumLines) - { - ++numLines; - - const float newFontHeight = height / (float) numLines; - - if (newFontHeight < font.getHeight()) - { - font.setHeight (jmax (8.0f, newFontHeight)); - - removeRangeOfGlyphs (startIndex, -1); - addLineOfText (font, text, x, y); - - lineWidth = glyphs.getReference (glyphs.size() - 1).getRight() - - glyphs.getReference (startIndex).getLeft(); - } - - // Try to estimate the point at which there are enough lines to fit the text, - // allowing for unevenness in the lengths due to differently sized words. - const float lineLengthUnevennessAllowance = 80.0f; - - if (numLines > (lineWidth + lineLengthUnevennessAllowance) / width || newFontHeight < 8.0f) - break; - } - - if (numLines < 1) - numLines = 1; - - float lineY = y; - float widthPerLine = lineWidth / numLines; - - for (int line = 0; line < numLines; ++line) - { - int i = startIndex; - float lineStartX = glyphs.getReference (startIndex).getLeft(); - - if (line == numLines - 1) - { - widthPerLine = width; - i = glyphs.size(); - } - else - { - while (i < glyphs.size()) - { - lineWidth = (glyphs.getReference (i).getRight() - lineStartX); - - if (lineWidth > widthPerLine) - { - // got to a point where the line's too long, so skip forward to find a - // good place to break it.. - const int searchStartIndex = i; - - while (i < glyphs.size()) - { - if ((glyphs.getReference (i).getRight() - lineStartX) * minimumHorizontalScale < width) - { - if (glyphs.getReference (i).isWhitespace() - || glyphs.getReference (i).getCharacter() == '-') - { - ++i; - break; - } - } - else - { - // can't find a suitable break, so try looking backwards.. - i = searchStartIndex; - - for (int back = 1; back < jmin (7, i - startIndex - 1); ++back) - { - if (glyphs.getReference (i - back).isWhitespace() - || glyphs.getReference (i - back).getCharacter() == '-') - { - i -= back - 1; - break; - } - } - - break; - } - - ++i; - } - - break; - } - - ++i; - } - - int wsStart = i; - while (wsStart > 0 && glyphs.getReference (wsStart - 1).isWhitespace()) - --wsStart; - - int wsEnd = i; - while (wsEnd < glyphs.size() && glyphs.getReference (wsEnd).isWhitespace()) - ++wsEnd; - - removeRangeOfGlyphs (wsStart, wsEnd - wsStart); - i = jmax (wsStart, startIndex + 1); - } - - i -= fitLineIntoSpace (startIndex, i - startIndex, - x, lineY, width, font.getHeight(), font, - layout.getOnlyHorizontalFlags() | Justification::verticallyCentred, - minimumHorizontalScale); - - startIndex = i; - lineY += font.getHeight(); - - if (startIndex >= glyphs.size()) - break; - } - - justifyGlyphs (originalStartIndex, glyphs.size() - originalStartIndex, - x, y, width, height, layout.getFlags() & ~Justification::horizontallyJustified); -} - -//============================================================================== -void GlyphArrangement::drawGlyphUnderline (const Graphics& g, const PositionedGlyph& pg, - const int i, const AffineTransform& transform) const -{ - const float lineThickness = (pg.font.getDescent()) * 0.3f; - - float nextX = pg.x + pg.w; - - if (i < glyphs.size() - 1 && glyphs.getReference (i + 1).y == pg.y) - nextX = glyphs.getReference (i + 1).x; - - Path p; - p.addRectangle (pg.x, pg.y + lineThickness * 2.0f, nextX - pg.x, lineThickness); - g.fillPath (p, transform); -} - -void GlyphArrangement::draw (const Graphics& g) const -{ - draw (g, AffineTransform()); -} - -void GlyphArrangement::draw (const Graphics& g, const AffineTransform& transform) const -{ - LowLevelGraphicsContext& context = g.getInternalContext(); - Font lastFont (context.getFont()); - bool needToRestore = false; - - for (int i = 0; i < glyphs.size(); ++i) - { - const PositionedGlyph& pg = glyphs.getReference(i); - - if (pg.font.isUnderlined()) - drawGlyphUnderline (g, pg, i, transform); - - if (! pg.isWhitespace()) - { - if (lastFont != pg.font) - { - lastFont = pg.font; - - if (! needToRestore) - { - needToRestore = true; - context.saveState(); - } - - context.setFont (lastFont); - } - - context.drawGlyph (pg.glyph, AffineTransform::translation (pg.x, pg.y).followedBy (transform)); - } - } - - if (needToRestore) - context.restoreState(); -} - -void GlyphArrangement::createPath (Path& path) const -{ - for (int i = 0; i < glyphs.size(); ++i) - glyphs.getReference (i).createPath (path); -} - -int GlyphArrangement::findGlyphIndexAt (const float x, const float y) const -{ - for (int i = 0; i < glyphs.size(); ++i) - if (glyphs.getReference (i).hitTest (x, y)) - return i; - - return -1; -} diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h deleted file mode 100755 index c771bff..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_GlyphArrangement.h +++ /dev/null @@ -1,322 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_GLYPHARRANGEMENT_H_INCLUDED -#define JUCE_GLYPHARRANGEMENT_H_INCLUDED - - -//============================================================================== -/** - A glyph from a particular font, with a particular size, style, - typeface and position. - - You should rarely need to use this class directly - for most purposes, the - GlyphArrangement class will do what you need for text layout. - - @see GlyphArrangement, Font -*/ -class JUCE_API PositionedGlyph -{ -public: - //============================================================================== - PositionedGlyph() noexcept; - PositionedGlyph (const Font& font, juce_wchar character, int glyphNumber, - float anchorX, float baselineY, float width, bool isWhitespace); - - PositionedGlyph (const PositionedGlyph&); - PositionedGlyph& operator= (const PositionedGlyph&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - PositionedGlyph (PositionedGlyph&&) noexcept; - PositionedGlyph& operator= (PositionedGlyph&&) noexcept; - #endif - - ~PositionedGlyph(); - - /** Returns the character the glyph represents. */ - juce_wchar getCharacter() const noexcept { return character; } - /** Checks whether the glyph is actually empty. */ - bool isWhitespace() const noexcept { return whitespace; } - - /** Returns the position of the glyph's left-hand edge. */ - float getLeft() const noexcept { return x; } - /** Returns the position of the glyph's right-hand edge. */ - float getRight() const noexcept { return x + w; } - /** Returns the y position of the glyph's baseline. */ - float getBaselineY() const noexcept { return y; } - /** Returns the y position of the top of the glyph. */ - float getTop() const { return y - font.getAscent(); } - /** Returns the y position of the bottom of the glyph. */ - float getBottom() const { return y + font.getDescent(); } - /** Returns the bounds of the glyph. */ - Rectangle getBounds() const { return Rectangle (x, getTop(), w, font.getHeight()); } - - //============================================================================== - /** Shifts the glyph's position by a relative amount. */ - void moveBy (float deltaX, float deltaY); - - //============================================================================== - /** Draws the glyph into a graphics context. - (Note that this may change the context's currently selected font). - */ - void draw (Graphics& g) const; - - /** Draws the glyph into a graphics context, with an extra transform applied to it. - (Note that this may change the context's currently selected font). - */ - void draw (Graphics& g, const AffineTransform& transform) const; - - /** Returns the path for this glyph. - @param path the glyph's outline will be appended to this path - */ - void createPath (Path& path) const; - - /** Checks to see if a point lies within this glyph. */ - bool hitTest (float x, float y) const; - -private: - //============================================================================== - friend class GlyphArrangement; - Font font; - juce_wchar character; - int glyph; - float x, y, w; - bool whitespace; - - JUCE_LEAK_DETECTOR (PositionedGlyph) -}; - - -//============================================================================== -/** - A set of glyphs, each with a position. - - You can create a GlyphArrangement, text to it and then draw it onto a - graphics context. It's used internally by the text methods in the - Graphics class, but can be used directly if more control is needed. - - @see Font, PositionedGlyph -*/ -class JUCE_API GlyphArrangement -{ -public: - //============================================================================== - /** Creates an empty arrangement. */ - GlyphArrangement(); - - /** Takes a copy of another arrangement. */ - GlyphArrangement (const GlyphArrangement&); - - /** Copies another arrangement onto this one. - To add another arrangement without clearing this one, use addGlyphArrangement(). - */ - GlyphArrangement& operator= (const GlyphArrangement&); - - /** Destructor. */ - ~GlyphArrangement(); - - //============================================================================== - /** Returns the total number of glyphs in the arrangement. */ - int getNumGlyphs() const noexcept { return glyphs.size(); } - - /** Returns one of the glyphs from the arrangement. - - @param index the glyph's index, from 0 to (getNumGlyphs() - 1). Be - careful not to pass an out-of-range index here, as it - doesn't do any bounds-checking. - */ - PositionedGlyph& getGlyph (int index) const noexcept; - - //============================================================================== - /** Clears all text from the arrangement and resets it. */ - void clear(); - - /** Appends a line of text to the arrangement. - - This will add the text as a single line, where x is the left-hand edge of the - first character, and y is the position for the text's baseline. - - If the text contains new-lines or carriage-returns, this will ignore them - use - addJustifiedText() to add multi-line arrangements. - */ - void addLineOfText (const Font& font, - const String& text, - float x, float y); - - /** Adds a line of text, truncating it if it's wider than a specified size. - - This is the same as addLineOfText(), but if the line's width exceeds the value - specified in maxWidthPixels, it will be truncated using either ellipsis (i.e. dots: "..."), - if useEllipsis is true, or if this is false, it will just drop any subsequent characters. - */ - void addCurtailedLineOfText (const Font& font, - const String& text, - float x, float y, - float maxWidthPixels, - bool useEllipsis); - - /** Adds some multi-line text, breaking lines at word-boundaries if they are too wide. - - This will add text to the arrangement, breaking it into new lines either where there - is a new-line or carriage-return character in the text, or where a line's width - exceeds the value set in maxLineWidth. - - Each line that is added will be laid out using the flags set in horizontalLayout, so - the lines can be left- or right-justified, or centred horizontally in the space - between x and (x + maxLineWidth). - - The y coordinate is the position of the baseline of the first line of text - subsequent - lines will be placed below it, separated by a distance of font.getHeight(). - */ - void addJustifiedText (const Font& font, - const String& text, - float x, float y, - float maxLineWidth, - Justification horizontalLayout); - - /** Tries to fit some text withing a given space. - - This does its best to make the given text readable within the specified rectangle, - so it useful for labelling things. - - If the text is too big, it'll be squashed horizontally or broken over multiple lines - if the maximumLinesToUse value allows this. If the text just won't fit into the space, - it'll cram as much as possible in there, and put some ellipsis at the end to show that - it's been truncated. - - A Justification parameter lets you specify how the text is laid out within the rectangle, - both horizontally and vertically. - - @see Graphics::drawFittedText - */ - void addFittedText (const Font& font, - const String& text, - float x, float y, float width, float height, - Justification layout, - int maximumLinesToUse, - float minimumHorizontalScale = 0.7f); - - /** Appends another glyph arrangement to this one. */ - void addGlyphArrangement (const GlyphArrangement&); - - /** Appends a custom glyph to the arrangement. */ - void addGlyph (const PositionedGlyph&); - - //============================================================================== - /** Draws this glyph arrangement to a graphics context. - - This uses cached bitmaps so is much faster than the draw (Graphics&, const AffineTransform&) - method, which renders the glyphs as filled vectors. - */ - void draw (const Graphics&) const; - - /** Draws this glyph arrangement to a graphics context. - - This renders the paths as filled vectors, so is far slower than the draw (Graphics&) - method for non-transformed arrangements. - */ - void draw (const Graphics&, const AffineTransform&) const; - - /** Converts the set of glyphs into a path. - @param path the glyphs' outlines will be appended to this path - */ - void createPath (Path& path) const; - - /** Looks for a glyph that contains the given coordinate. - @returns the index of the glyph, or -1 if none were found. - */ - int findGlyphIndexAt (float x, float y) const; - - //============================================================================== - /** Finds the smallest rectangle that will enclose a subset of the glyphs. - - - @param startIndex the first glyph to test - @param numGlyphs the number of glyphs to include; if this is < 0, all glyphs after - startIndex will be included - @param includeWhitespace if true, the extent of any whitespace characters will also - be taken into account - */ - Rectangle getBoundingBox (int startIndex, int numGlyphs, bool includeWhitespace) const; - - /** Shifts a set of glyphs by a given amount. - - @param startIndex the first glyph to transform - @param numGlyphs the number of glyphs to move; if this is < 0, all glyphs after - startIndex will be used - @param deltaX the amount to add to their x-positions - @param deltaY the amount to add to their y-positions - */ - void moveRangeOfGlyphs (int startIndex, int numGlyphs, - float deltaX, float deltaY); - - /** Removes a set of glyphs from the arrangement. - - @param startIndex the first glyph to remove - @param numGlyphs the number of glyphs to remove; if this is < 0, all glyphs after - startIndex will be deleted - */ - void removeRangeOfGlyphs (int startIndex, int numGlyphs); - - /** Expands or compresses a set of glyphs horizontally. - - @param startIndex the first glyph to transform - @param numGlyphs the number of glyphs to stretch; if this is < 0, all glyphs after - startIndex will be used - @param horizontalScaleFactor how much to scale their horizontal width by - */ - void stretchRangeOfGlyphs (int startIndex, int numGlyphs, - float horizontalScaleFactor); - - /** Justifies a set of glyphs within a given space. - - This moves the glyphs as a block so that the whole thing is located within the - given rectangle with the specified layout. - - If the Justification::horizontallyJustified flag is specified, each line will - be stretched out to fill the specified width. - */ - void justifyGlyphs (int startIndex, int numGlyphs, - float x, float y, float width, float height, - Justification justification); - - -private: - //============================================================================== - Array glyphs; - - int insertEllipsis (const Font&, float maxXPos, int startIndex, int endIndex); - int fitLineIntoSpace (int start, int numGlyphs, float x, float y, float w, float h, const Font&, - Justification, float minimumHorizontalScale); - void spreadOutLine (int start, int numGlyphs, float targetWidth); - void splitLines (const String&, Font, int start, float x, float y, float w, float h, int maxLines, - float lineWidth, Justification, float minimumHorizontalScale); - void addLinesWithLineBreaks (const String&, const Font&, float x, float y, float width, float height, Justification); - void drawGlyphUnderline (const Graphics&, const PositionedGlyph&, int, const AffineTransform&) const; - - JUCE_LEAK_DETECTOR (GlyphArrangement) -}; - - -#endif // JUCE_GLYPHARRANGEMENT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp deleted file mode 100755 index 1989bc7..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.cpp +++ /dev/null @@ -1,638 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -TextLayout::Glyph::Glyph (const int glyph, Point anch, float w) noexcept - : glyphCode (glyph), anchor (anch), width (w) -{ -} - -TextLayout::Glyph::Glyph (const Glyph& other) noexcept - : glyphCode (other.glyphCode), anchor (other.anchor), width (other.width) -{ -} - -TextLayout::Glyph& TextLayout::Glyph::operator= (const Glyph& other) noexcept -{ - glyphCode = other.glyphCode; - anchor = other.anchor; - width = other.width; - return *this; -} - -TextLayout::Glyph::~Glyph() noexcept {} - -//============================================================================== -TextLayout::Run::Run() noexcept - : colour (0xff000000) -{ -} - -TextLayout::Run::Run (Range range, const int numGlyphsToPreallocate) - : colour (0xff000000), stringRange (range) -{ - glyphs.ensureStorageAllocated (numGlyphsToPreallocate); -} - -TextLayout::Run::Run (const Run& other) - : font (other.font), - colour (other.colour), - glyphs (other.glyphs), - stringRange (other.stringRange) -{ -} - -TextLayout::Run::~Run() noexcept {} - -//============================================================================== -TextLayout::Line::Line() noexcept - : ascent (0.0f), descent (0.0f), leading (0.0f) -{ -} - -TextLayout::Line::Line (Range range, Point o, float asc, float desc, - float lead, int numRunsToPreallocate) - : stringRange (range), lineOrigin (o), - ascent (asc), descent (desc), leading (lead) -{ - runs.ensureStorageAllocated (numRunsToPreallocate); -} - -TextLayout::Line::Line (const Line& other) - : stringRange (other.stringRange), lineOrigin (other.lineOrigin), - ascent (other.ascent), descent (other.descent), leading (other.leading) -{ - runs.addCopiesOf (other.runs); -} - -TextLayout::Line::~Line() noexcept -{ -} - -Range TextLayout::Line::getLineBoundsX() const noexcept -{ - Range range; - bool isFirst = true; - - for (int i = runs.size(); --i >= 0;) - { - const Run& run = *runs.getUnchecked(i); - - if (run.glyphs.size() > 0) - { - float minX = run.glyphs.getReference(0).anchor.x; - float maxX = minX; - - for (int j = run.glyphs.size(); --j >= 0;) - { - const Glyph& glyph = run.glyphs.getReference (j); - const float x = glyph.anchor.x; - minX = jmin (minX, x); - maxX = jmax (maxX, x + glyph.width); - } - - if (isFirst) - { - isFirst = false; - range = Range (minX, maxX); - } - else - { - range = range.getUnionWith (Range (minX, maxX)); - } - } - } - - return range + lineOrigin.x; -} - -Range TextLayout::Line::getLineBoundsY() const noexcept -{ - return Range (lineOrigin.y - ascent, - lineOrigin.y + descent); -} - -Rectangle TextLayout::Line::getLineBounds() const noexcept -{ - const Range x (getLineBoundsX()), - y (getLineBoundsY()); - - return Rectangle (x.getStart(), y.getStart(), x.getLength(), y.getLength()); -} - -//============================================================================== -TextLayout::TextLayout() - : width (0), height (0), justification (Justification::topLeft) -{ -} - -TextLayout::TextLayout (const TextLayout& other) - : width (other.width), height (other.height), - justification (other.justification) -{ - lines.addCopiesOf (other.lines); -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -TextLayout::TextLayout (TextLayout&& other) noexcept - : lines (static_cast&&> (other.lines)), - width (other.width), height (other.height), - justification (other.justification) -{ -} - -TextLayout& TextLayout::operator= (TextLayout&& other) noexcept -{ - lines = static_cast&&> (other.lines); - width = other.width; - height = other.height; - justification = other.justification; - return *this; -} -#endif - -TextLayout& TextLayout::operator= (const TextLayout& other) -{ - width = other.width; - height = other.height; - justification = other.justification; - lines.clear(); - lines.addCopiesOf (other.lines); - return *this; -} - -TextLayout::~TextLayout() -{ -} - -TextLayout::Line& TextLayout::getLine (const int index) const -{ - return *lines.getUnchecked (index); -} - -void TextLayout::ensureStorageAllocated (int numLinesNeeded) -{ - lines.ensureStorageAllocated (numLinesNeeded); -} - -void TextLayout::addLine (Line* line) -{ - lines.add (line); -} - -void TextLayout::draw (Graphics& g, const Rectangle& area) const -{ - const Point origin (justification.appliedToRectangle (Rectangle (width, getHeight()), area).getPosition()); - - LowLevelGraphicsContext& context = g.getInternalContext(); - - for (int i = 0; i < lines.size(); ++i) - { - const Line& line = getLine (i); - const Point lineOrigin (origin + line.lineOrigin); - - for (int j = 0; j < line.runs.size(); ++j) - { - const Run& run = *line.runs.getUnchecked (j); - context.setFont (run.font); - context.setFill (run.colour); - - for (int k = 0; k < run.glyphs.size(); ++k) - { - const Glyph& glyph = run.glyphs.getReference (k); - context.drawGlyph (glyph.glyphCode, AffineTransform::translation (lineOrigin.x + glyph.anchor.x, - lineOrigin.y + glyph.anchor.y)); - } - } - } -} - -void TextLayout::createLayout (const AttributedString& text, float maxWidth) -{ - createLayout (text, maxWidth, 1.0e7f); -} - -void TextLayout::createLayout (const AttributedString& text, float maxWidth, float maxHeight) -{ - lines.clear(); - width = maxWidth; - height = maxHeight; - justification = text.getJustification(); - - if (! createNativeLayout (text)) - createStandardLayout (text); - - recalculateSize (text); -} - -void TextLayout::createLayoutWithBalancedLineLengths (const AttributedString& text, float maxWidth) -{ - createLayoutWithBalancedLineLengths (text, maxWidth, 1.0e7f); -} - -void TextLayout::createLayoutWithBalancedLineLengths (const AttributedString& text, float maxWidth, float maxHeight) -{ - const float minimumWidth = maxWidth / 2.0f; - float bestWidth = maxWidth; - float bestLineProportion = 0.0f; - - while (maxWidth > minimumWidth) - { - createLayout (text, maxWidth, maxHeight); - - if (getNumLines() < 2) - return; - - const float line1 = lines.getUnchecked (lines.size() - 1)->getLineBoundsX().getLength(); - const float line2 = lines.getUnchecked (lines.size() - 2)->getLineBoundsX().getLength(); - const float shortestLine = jmin (line1, line2); - const float prop = (shortestLine > 0) ? jmax (line1, line2) / shortestLine : 1.0f; - - if (prop > 0.9f) - return; - - if (prop > bestLineProportion) - { - bestLineProportion = prop; - bestWidth = maxWidth; - } - - maxWidth -= 10.0f; - } - - if (bestWidth != maxWidth) - createLayout (text, bestWidth, maxHeight); -} - -//============================================================================== -namespace TextLayoutHelpers -{ - struct FontAndColour - { - FontAndColour (const Font* f) noexcept : font (f), colour (0xff000000) {} - - const Font* font; - Colour colour; - - bool operator!= (const FontAndColour& other) const noexcept - { - return (font != other.font && *font != *other.font) || colour != other.colour; - } - }; - - struct RunAttribute - { - RunAttribute (const FontAndColour& fc, const Range r) noexcept - : fontAndColour (fc), range (r) - {} - - FontAndColour fontAndColour; - Range range; - }; - - struct Token - { - Token (const String& t, const Font& f, Colour c, const bool whitespace) - : text (t), font (f), colour (c), - area (font.getStringWidthFloat (t), f.getHeight()), - isWhitespace (whitespace), - isNewLine (t.containsChar ('\n') || t.containsChar ('\r')) - {} - - const String text; - const Font font; - const Colour colour; - Rectangle area; - int line; - float lineHeight; - const bool isWhitespace, isNewLine; - - private: - Token& operator= (const Token&); - }; - - class TokenList - { - public: - TokenList() noexcept : totalLines (0) {} - - void createLayout (const AttributedString& text, TextLayout& layout) - { - tokens.ensureStorageAllocated (64); - layout.ensureStorageAllocated (totalLines); - - addTextRuns (text); - layoutRuns (layout.getWidth()); - - int charPosition = 0; - int lineStartPosition = 0; - int runStartPosition = 0; - - ScopedPointer currentLine; - ScopedPointer currentRun; - - bool needToSetLineOrigin = true; - - for (int i = 0; i < tokens.size(); ++i) - { - const Token& t = *tokens.getUnchecked (i); - - Array newGlyphs; - Array xOffsets; - t.font.getGlyphPositions (getTrimmedEndIfNotAllWhitespace (t.text), newGlyphs, xOffsets); - - if (currentRun == nullptr) currentRun = new TextLayout::Run(); - if (currentLine == nullptr) currentLine = new TextLayout::Line(); - - if (newGlyphs.size() > 0) - { - currentRun->glyphs.ensureStorageAllocated (currentRun->glyphs.size() + newGlyphs.size()); - const Point tokenOrigin (t.area.getPosition().translated (0, t.font.getAscent())); - - if (needToSetLineOrigin) - { - needToSetLineOrigin = false; - currentLine->lineOrigin = tokenOrigin; - } - - const Point glyphOffset (tokenOrigin - currentLine->lineOrigin); - - for (int j = 0; j < newGlyphs.size(); ++j) - { - const float x = xOffsets.getUnchecked (j); - currentRun->glyphs.add (TextLayout::Glyph (newGlyphs.getUnchecked(j), - glyphOffset.translated (x, 0), - xOffsets.getUnchecked (j + 1) - x)); - } - - charPosition += newGlyphs.size(); - } - - if (t.isWhitespace || t.isNewLine) - ++charPosition; - - const Token* const nextToken = tokens [i + 1]; - - if (nextToken == nullptr) // this is the last token - { - addRun (*currentLine, currentRun.release(), t, runStartPosition, charPosition); - currentLine->stringRange = Range (lineStartPosition, charPosition); - - if (! needToSetLineOrigin) - layout.addLine (currentLine.release()); - - needToSetLineOrigin = true; - } - else - { - if (t.font != nextToken->font || t.colour != nextToken->colour) - { - addRun (*currentLine, currentRun.release(), t, runStartPosition, charPosition); - runStartPosition = charPosition; - } - - if (t.line != nextToken->line) - { - if (currentRun == nullptr) - currentRun = new TextLayout::Run(); - - addRun (*currentLine, currentRun.release(), t, runStartPosition, charPosition); - currentLine->stringRange = Range (lineStartPosition, charPosition); - - if (! needToSetLineOrigin) - layout.addLine (currentLine.release()); - - runStartPosition = charPosition; - lineStartPosition = charPosition; - needToSetLineOrigin = true; - } - } - } - - if ((text.getJustification().getFlags() & (Justification::right | Justification::horizontallyCentred)) != 0) - { - const float totalW = layout.getWidth(); - const bool isCentred = (text.getJustification().getFlags() & Justification::horizontallyCentred) != 0; - - for (int i = 0; i < layout.getNumLines(); ++i) - { - float dx = totalW - layout.getLine(i).getLineBoundsX().getLength(); - - if (isCentred) - dx /= 2.0f; - - layout.getLine(i).lineOrigin.x += dx; - } - } - } - - private: - static void addRun (TextLayout::Line& glyphLine, TextLayout::Run* glyphRun, - const Token& t, const int start, const int end) - { - glyphRun->stringRange = Range (start, end); - glyphRun->font = t.font; - glyphRun->colour = t.colour; - glyphLine.ascent = jmax (glyphLine.ascent, t.font.getAscent()); - glyphLine.descent = jmax (glyphLine.descent, t.font.getDescent()); - glyphLine.runs.add (glyphRun); - } - - static int getCharacterType (const juce_wchar c) noexcept - { - if (c == '\r' || c == '\n') - return 0; - - return CharacterFunctions::isWhitespace (c) ? 2 : 1; - } - - void appendText (const AttributedString& text, const Range stringRange, - const Font& font, Colour colour) - { - const String stringText (text.getText().substring (stringRange.getStart(), stringRange.getEnd())); - String::CharPointerType t (stringText.getCharPointer()); - String currentString; - int lastCharType = 0; - - for (;;) - { - const juce_wchar c = t.getAndAdvance(); - if (c == 0) - break; - - const int charType = getCharacterType (c); - - if (charType == 0 || charType != lastCharType) - { - if (currentString.isNotEmpty()) - tokens.add (new Token (currentString, font, colour, - lastCharType == 2 || lastCharType == 0)); - - currentString = String::charToString (c); - - if (c == '\r' && *t == '\n') - currentString += t.getAndAdvance(); - } - else - { - currentString += c; - } - - lastCharType = charType; - } - - if (currentString.isNotEmpty()) - tokens.add (new Token (currentString, font, colour, lastCharType == 2)); - } - - void layoutRuns (const float maxWidth) - { - float x = 0, y = 0, h = 0; - int i; - - for (i = 0; i < tokens.size(); ++i) - { - Token& t = *tokens.getUnchecked(i); - t.area.setPosition (x, y); - t.line = totalLines; - x += t.area.getWidth(); - h = jmax (h, t.area.getHeight()); - - const Token* const nextTok = tokens[i + 1]; - - if (nextTok == nullptr) - break; - - if (t.isNewLine || ((! nextTok->isWhitespace) && x + nextTok->area.getWidth() > maxWidth)) - { - setLastLineHeight (i + 1, h); - x = 0; - y += h; - h = 0; - ++totalLines; - } - } - - setLastLineHeight (jmin (i + 1, tokens.size()), h); - ++totalLines; - } - - void setLastLineHeight (int i, const float height) noexcept - { - while (--i >= 0) - { - Token& tok = *tokens.getUnchecked (i); - - if (tok.line == totalLines) - tok.lineHeight = height; - else - break; - } - } - - void addTextRuns (const AttributedString& text) - { - Font defaultFont; - Array runAttributes; - - { - const int stringLength = text.getText().length(); - int rangeStart = 0; - FontAndColour lastFontAndColour (&defaultFont); - - // Iterate through every character in the string - for (int i = 0; i < stringLength; ++i) - { - FontAndColour newFontAndColour (&defaultFont); - const int numCharacterAttributes = text.getNumAttributes(); - - for (int j = 0; j < numCharacterAttributes; ++j) - { - const AttributedString::Attribute& attr = *text.getAttribute (j); - - if (attr.range.contains (i)) - { - if (const Font* f = attr.getFont()) newFontAndColour.font = f; - if (const Colour* c = attr.getColour()) newFontAndColour.colour = *c; - } - } - - if (i > 0 && newFontAndColour != lastFontAndColour) - { - runAttributes.add (RunAttribute (lastFontAndColour, Range (rangeStart, i))); - rangeStart = i; - } - - lastFontAndColour = newFontAndColour; - } - - if (rangeStart < stringLength) - runAttributes.add (RunAttribute (lastFontAndColour, Range (rangeStart, stringLength))); - } - - for (int i = 0; i < runAttributes.size(); ++i) - { - const RunAttribute& r = runAttributes.getReference(i); - appendText (text, r.range, *(r.fontAndColour.font), r.fontAndColour.colour); - } - } - - static String getTrimmedEndIfNotAllWhitespace (const String& s) - { - String trimmed (s.trimEnd()); - if (trimmed.isEmpty() && ! s.isEmpty()) - trimmed = s.replaceCharacters ("\r\n\t", " "); - - return trimmed; - } - - OwnedArray tokens; - int totalLines; - - JUCE_DECLARE_NON_COPYABLE (TokenList) - }; -} - -//============================================================================== -void TextLayout::createStandardLayout (const AttributedString& text) -{ - TextLayoutHelpers::TokenList l; - l.createLayout (text, *this); -} - -void TextLayout::recalculateSize (const AttributedString& text) -{ - if (lines.size() > 0 && text.getReadingDirection() != AttributedString::rightToLeft) - { - Rectangle bounds (lines.getFirst()->getLineBounds()); - - for (int i = lines.size(); --i > 0;) - bounds = bounds.getUnion (lines.getUnchecked(i)->getLineBounds()); - - for (int i = lines.size(); --i >= 0;) - lines.getUnchecked(i)->lineOrigin.x -= bounds.getX(); - - width = bounds.getWidth(); - height = bounds.getHeight(); - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h deleted file mode 100755 index 0ae8237..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_TextLayout.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_TEXTLAYOUT_H_INCLUDED -#define JUCE_TEXTLAYOUT_H_INCLUDED - - -//============================================================================== -/** - A Pre-formatted piece of text, which may contain multiple fonts and colours. - - A TextLayout is created from an AttributedString, and once created can be - quickly drawn into a Graphics context. - - @see AttributedString -*/ -class JUCE_API TextLayout -{ -public: - /** Creates an empty layout. - Having created a TextLayout, you can populate it using createLayout() or - createLayoutWithBalancedLineLengths(). - */ - TextLayout(); - TextLayout (const TextLayout&); - TextLayout& operator= (const TextLayout&); - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - TextLayout (TextLayout&&) noexcept; - TextLayout& operator= (TextLayout&&) noexcept; - #endif - - /** Destructor. */ - ~TextLayout(); - - //============================================================================== - /** Creates a layout from the given attributed string. - This will replace any data that is currently stored in the layout. - */ - void createLayout (const AttributedString&, float maxWidth); - - /** Creates a layout from the given attributed string, given some size constraints. - This will replace any data that is currently stored in the layout. - */ - void createLayout (const AttributedString&, float maxWidth, float maxHeight); - - /** Creates a layout, attempting to choose a width which results in lines - of a similar length. - - This will be slower than the normal createLayout method, but produces a - tidier result. - */ - void createLayoutWithBalancedLineLengths (const AttributedString&, float maxWidth); - - /** Creates a layout, attempting to choose a width which results in lines - of a similar length. - - This will be slower than the normal createLayout method, but produces a - tidier result. - */ - void createLayoutWithBalancedLineLengths (const AttributedString&, float maxWidth, float maxHeight); - - /** Draws the layout within the specified area. - The position of the text within the rectangle is controlled by the justification - flags set in the original AttributedString that was used to create this layout. - */ - void draw (Graphics&, const Rectangle& area) const; - - //============================================================================== - /** A positioned glyph. */ - class JUCE_API Glyph - { - public: - Glyph (int glyphCode, Point anchor, float width) noexcept; - Glyph (const Glyph&) noexcept; - Glyph& operator= (const Glyph&) noexcept; - ~Glyph() noexcept; - - /** The code number of this glyph. */ - int glyphCode; - - /** The glyph's anchor point - this is relative to the line's origin. - @see TextLayout::Line::lineOrigin - */ - Point anchor; - - float width; - - private: - JUCE_LEAK_DETECTOR (Glyph) - }; - - //============================================================================== - /** A sequence of glyphs with a common font and colour. */ - class JUCE_API Run - { - public: - Run() noexcept; - Run (const Run&); - Run (Range stringRange, int numGlyphsToPreallocate); - ~Run() noexcept; - - Font font; /**< The run's font. */ - Colour colour; /**< The run's colour. */ - Array glyphs; /**< The glyphs in this run. */ - Range stringRange; /**< The character range that this run represents in the - original string that was used to create it. */ - private: - Run& operator= (const Run&); - JUCE_LEAK_DETECTOR (Run) - }; - - //============================================================================== - /** A line containing a sequence of glyph-runs. */ - class JUCE_API Line - { - public: - Line() noexcept; - Line (const Line&); - Line (Range stringRange, Point lineOrigin, - float ascent, float descent, float leading, int numRunsToPreallocate); - ~Line() noexcept; - - /** Returns the X position range which contains all the glyphs in this line. */ - Range getLineBoundsX() const noexcept; - - /** Returns the Y position range which contains all the glyphs in this line. */ - Range getLineBoundsY() const noexcept; - - /** Returns the smallest rectangle which contains all the glyphs in this line. */ - Rectangle getLineBounds() const noexcept; - - OwnedArray runs; /**< The glyph-runs in this line. */ - Range stringRange; /**< The character range that this line represents in the - original string that was used to create it. */ - Point lineOrigin; /**< The line's baseline origin. */ - float ascent, descent, leading; - - private: - Line& operator= (const Line&); - JUCE_LEAK_DETECTOR (Line) - }; - - //============================================================================== - /** Returns the maximum width of the content. */ - float getWidth() const noexcept { return width; } - - /** Returns the maximum height of the content. */ - float getHeight() const noexcept { return height; } - - /** Returns the number of lines in the layout. */ - int getNumLines() const noexcept { return lines.size(); } - - /** Returns one of the lines. */ - Line& getLine (int index) const; - - /** Adds a line to the layout. The layout will take ownership of this line object - and will delete it when it is no longer needed. */ - void addLine (Line*); - - /** Pre-allocates space for the specified number of lines. */ - void ensureStorageAllocated (int numLinesNeeded); - -private: - OwnedArray lines; - float width, height; - Justification justification; - - void createStandardLayout (const AttributedString&); - bool createNativeLayout (const AttributedString&); - void recalculateSize (const AttributedString&); - - JUCE_LEAK_DETECTOR (TextLayout) -}; - -#endif // JUCE_TEXTLAYOUT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp deleted file mode 100755 index 4eda6b0..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -struct FontStyleHelpers -{ - static const char* getStyleName (const bool bold, - const bool italic) noexcept - { - if (bold && italic) return "Bold Italic"; - if (bold) return "Bold"; - if (italic) return "Italic"; - return "Regular"; - } - - static const char* getStyleName (const int styleFlags) noexcept - { - return getStyleName ((styleFlags & Font::bold) != 0, - (styleFlags & Font::italic) != 0); - } - - static bool isBold (const String& style) noexcept - { - return style.containsWholeWordIgnoreCase ("Bold"); - } - - static bool isItalic (const String& style) noexcept - { - return style.containsWholeWordIgnoreCase ("Italic") - || style.containsWholeWordIgnoreCase ("Oblique"); - } - - static bool isPlaceholderFamilyName (const String& family) - { - return family == Font::getDefaultSansSerifFontName() - || family == Font::getDefaultSerifFontName() - || family == Font::getDefaultMonospacedFontName(); - } - - struct ConcreteFamilyNames - { - ConcreteFamilyNames() - : sans (findName (Font::getDefaultSansSerifFontName())), - serif (findName (Font::getDefaultSerifFontName())), - mono (findName (Font::getDefaultMonospacedFontName())) - { - } - - String lookUp (const String& placeholder) - { - if (placeholder == Font::getDefaultSansSerifFontName()) return sans; - if (placeholder == Font::getDefaultSerifFontName()) return serif; - if (placeholder == Font::getDefaultMonospacedFontName()) return mono; - - return findName (placeholder); - } - - private: - static String findName (const String& placeholder) - { - const Font f (placeholder, Font::getDefaultStyle(), 15.0f); - return Font::getDefaultTypefaceForFont (f)->getName(); - } - - String sans, serif, mono; - }; - - static String getConcreteFamilyNameFromPlaceholder (const String& placeholder) - { - static ConcreteFamilyNames names; - return names.lookUp (placeholder); - } - - static String getConcreteFamilyName (const Font& font) - { - const String& family = font.getTypefaceName(); - - return isPlaceholderFamilyName (family) ? getConcreteFamilyNameFromPlaceholder (family) - : family; - } -}; - -//============================================================================== -Typeface::Typeface (const String& faceName, const String& styleName) noexcept - : name (faceName), style (styleName) -{ -} - -Typeface::~Typeface() -{ -} - -Typeface::Ptr Typeface::getFallbackTypeface() -{ - const Font fallbackFont (Font::getFallbackFontName(), Font::getFallbackFontStyle(), 10.0f); - return fallbackFont.getTypeface(); -} - -EdgeTable* Typeface::getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform, float fontHeight) -{ - Path path; - - if (getOutlineForGlyph (glyphNumber, path) && ! path.isEmpty()) - { - applyVerticalHintingTransform (fontHeight, path); - - return new EdgeTable (path.getBoundsTransformed (transform).getSmallestIntegerContainer().expanded (1, 0), - path, transform); - } - - return nullptr; -} - -//============================================================================== -struct Typeface::HintingParams -{ - HintingParams (Typeface& t) - : cachedSize (0), top (0), middle (0), bottom (0) - { - Font font (&t); - font = font.withHeight ((float) standardHeight); - - top = getAverageY (font, "BDEFPRTZOQ", true); - middle = getAverageY (font, "acegmnopqrsuvwxy", true); - bottom = getAverageY (font, "BDELZOC", false); - } - - void applyVerticalHintingTransform (float fontSize, Path& path) - { - if (cachedSize != fontSize) - { - cachedSize = fontSize; - cachedScale = Scaling (top, middle, bottom, fontSize); - } - - if (bottom < top + 3.0f / fontSize) - return; - - Path result; - - for (Path::Iterator i (path); i.next();) - { - switch (i.elementType) - { - case Path::Iterator::startNewSubPath: result.startNewSubPath (i.x1, cachedScale.apply (i.y1)); break; - case Path::Iterator::lineTo: result.lineTo (i.x1, cachedScale.apply (i.y1)); break; - case Path::Iterator::quadraticTo: result.quadraticTo (i.x1, cachedScale.apply (i.y1), - i.x2, cachedScale.apply (i.y2)); break; - case Path::Iterator::cubicTo: result.cubicTo (i.x1, cachedScale.apply (i.y1), - i.x2, cachedScale.apply (i.y2), - i.x3, cachedScale.apply (i.y3)); break; - case Path::Iterator::closePath: result.closeSubPath(); break; - default: jassertfalse; break; - } - } - - result.swapWithPath (path); - } - -private: - struct Scaling - { - Scaling() noexcept : middle(), upperScale(), upperOffset(), lowerScale(), lowerOffset() {} - - Scaling (float t, float m, float b, float fontSize) noexcept : middle (m) - { - const float newT = std::floor (fontSize * t + 0.5f) / fontSize; - const float newB = std::floor (fontSize * b + 0.5f) / fontSize; - const float newM = std::floor (fontSize * m + 0.3f) / fontSize; // this is slightly biased so that lower-case letters - // are more likely to become taller than shorter. - upperScale = jlimit (0.9f, 1.1f, (newM - newT) / (m - t)); - lowerScale = jlimit (0.9f, 1.1f, (newB - newM) / (b - m)); - - upperOffset = newM - m * upperScale; - lowerOffset = newB - b * lowerScale; - } - - float apply (float y) const noexcept - { - return y < middle ? (y * upperScale + upperOffset) - : (y * lowerScale + lowerOffset); - } - - float middle, upperScale, upperOffset, lowerScale, lowerOffset; - }; - - float cachedSize; - Scaling cachedScale; - - static float getAverageY (const Font& font, const char* chars, bool getTop) - { - GlyphArrangement ga; - ga.addLineOfText (font, chars, 0, 0); - - Array y; - DefaultElementComparator sorter; - - for (int i = 0; i < ga.getNumGlyphs(); ++i) - { - Path p; - ga.getGlyph (i).createPath (p); - Rectangle bounds (p.getBounds()); - - if (! p.isEmpty()) - y.addSorted (sorter, getTop ? bounds.getY() : bounds.getBottom()); - } - - float median = y[y.size() / 2]; - - float total = 0; - int num = 0; - - for (int i = 0; i < y.size(); ++i) - { - if (std::abs (median - y.getUnchecked(i)) < 0.05f * (float) standardHeight) - { - total += y.getUnchecked(i); - ++num; - } - } - - return num < 4 ? 0.0f : total / (num * (float) standardHeight); - } - - enum { standardHeight = 100 }; - float top, middle, bottom; -}; - -void Typeface::applyVerticalHintingTransform (float fontSize, Path& path) -{ - if (fontSize > 3.0f && fontSize < 25.0f) - { - ScopedLock sl (hintingLock); - - if (hintingParams == nullptr) - hintingParams = new HintingParams (*this); - - return hintingParams->applyVerticalHintingTransform (fontSize, path); - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h b/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h deleted file mode 100755 index a392fb7..0000000 --- a/JuceLibraryCode/modules/juce_graphics/fonts/juce_Typeface.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_TYPEFACE_H_INCLUDED -#define JUCE_TYPEFACE_H_INCLUDED - - -//============================================================================== -/** - A typeface represents a size-independent font. - - This base class is abstract, but calling createSystemTypefaceFor() will return - a platform-specific subclass that can be used. - - The CustomTypeface subclass allow you to build your own typeface, and to - load and save it in the Juce typeface format. - - Normally you should never need to deal directly with Typeface objects - the Font - class does everything you typically need for rendering text. - - @see CustomTypeface, Font -*/ -class JUCE_API Typeface : public ReferenceCountedObject -{ -public: - //============================================================================== - /** A handy typedef for a pointer to a typeface. */ - typedef ReferenceCountedObjectPtr Ptr; - - //============================================================================== - /** Returns the font family of the typeface. - @see Font::getTypefaceName - */ - const String& getName() const noexcept { return name; } - - //============================================================================== - /** Returns the font style of the typeface. - @see Font::getTypefaceStyle - */ - const String& getStyle() const noexcept { return style; } - - //============================================================================== - /** Creates a new system typeface. */ - static Ptr createSystemTypefaceFor (const Font& font); - - /** Attempts to create a font from some raw font file data (e.g. a TTF or OTF file image). - The system will take its own internal copy of the data, so you can free the block once - this method has returned. - */ - static Ptr createSystemTypefaceFor (const void* fontFileData, size_t fontFileDataSize); - - //============================================================================== - /** Destructor. */ - virtual ~Typeface(); - - /** Returns true if this typeface can be used to render the specified font. - When called, the font will already have been checked to make sure that its name and - style flags match the typeface. - */ - virtual bool isSuitableForFont (const Font&) const { return true; } - - /** Returns the ascent of the font, as a proportion of its height. - The height is considered to always be normalised as 1.0, so this will be a - value less that 1.0, indicating the proportion of the font that lies above - its baseline. - */ - virtual float getAscent() const = 0; - - /** Returns the descent of the font, as a proportion of its height. - The height is considered to always be normalised as 1.0, so this will be a - value less that 1.0, indicating the proportion of the font that lies below - its baseline. - */ - virtual float getDescent() const = 0; - - /** Returns the value by which you should multiply a juce font-height value to - convert it to the equivalent point-size. - */ - virtual float getHeightToPointsFactor() const = 0; - - /** Measures the width of a line of text. - The distance returned is based on the font having an normalised height of 1.0. - You should never need to call this directly! Use Font::getStringWidth() instead! - */ - virtual float getStringWidth (const String& text) = 0; - - /** Converts a line of text into its glyph numbers and their positions. - The distances returned are based on the font having an normalised height of 1.0. - You should never need to call this directly! Use Font::getGlyphPositions() instead! - */ - virtual void getGlyphPositions (const String& text, Array & glyphs, Array& xOffsets) = 0; - - /** Returns the outline for a glyph. - The path returned will be normalised to a font height of 1.0. - */ - virtual bool getOutlineForGlyph (int glyphNumber, Path& path) = 0; - - /** Returns a new EdgeTable that contains the path for the givem glyph, with the specified transform applied. */ - virtual EdgeTable* getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform, float fontHeight); - - /** Returns true if the typeface uses hinting. */ - virtual bool isHinted() const { return false; } - - //============================================================================== - /** Changes the number of fonts that are cached in memory. */ - static void setTypefaceCacheSize (int numFontsToCache); - - /** Clears any fonts that are currently cached in memory. */ - static void clearTypefaceCache(); - - /** On some platforms, this allows a specific path to be scanned. - Currently only available when using FreeType. - */ - static void scanFolderForFonts (const File& folder); - - /** Makes an attempt at performing a good overall distortion that will scale a font of - the given size to align vertically with the pixel grid. The path should be an unscaled - (i.e. normalised to height of 1.0) path for a glyph. - */ - void applyVerticalHintingTransform (float fontHeight, Path& path); - -protected: - //============================================================================== - String name, style; - - Typeface (const String& name, const String& style) noexcept; - - static Ptr getFallbackTypeface(); - -private: - struct HintingParams; - friend struct ContainerDeletePolicy; - ScopedPointer hintingParams; - CriticalSection hintingLock; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Typeface) -}; - - -#endif // JUCE_TYPEFACE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp b/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp deleted file mode 100755 index 85d6f4e..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.cpp +++ /dev/null @@ -1,262 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -AffineTransform::AffineTransform() noexcept - : mat00 (1.0f), mat01 (0), mat02 (0), - mat10 (0), mat11 (1.0f), mat12 (0) -{ -} - -AffineTransform::AffineTransform (const AffineTransform& other) noexcept - : mat00 (other.mat00), mat01 (other.mat01), mat02 (other.mat02), - mat10 (other.mat10), mat11 (other.mat11), mat12 (other.mat12) -{ -} - -AffineTransform::AffineTransform (const float m00, const float m01, const float m02, - const float m10, const float m11, const float m12) noexcept - : mat00 (m00), mat01 (m01), mat02 (m02), - mat10 (m10), mat11 (m11), mat12 (m12) -{ -} - -AffineTransform& AffineTransform::operator= (const AffineTransform& other) noexcept -{ - mat00 = other.mat00; - mat01 = other.mat01; - mat02 = other.mat02; - mat10 = other.mat10; - mat11 = other.mat11; - mat12 = other.mat12; - - return *this; -} - -bool AffineTransform::operator== (const AffineTransform& other) const noexcept -{ - return mat00 == other.mat00 - && mat01 == other.mat01 - && mat02 == other.mat02 - && mat10 == other.mat10 - && mat11 == other.mat11 - && mat12 == other.mat12; -} - -bool AffineTransform::operator!= (const AffineTransform& other) const noexcept -{ - return ! operator== (other); -} - -//============================================================================== -bool AffineTransform::isIdentity() const noexcept -{ - return (mat01 == 0) - && (mat02 == 0) - && (mat10 == 0) - && (mat12 == 0) - && (mat00 == 1.0f) - && (mat11 == 1.0f); -} - -const AffineTransform AffineTransform::identity; - -//============================================================================== -AffineTransform AffineTransform::followedBy (const AffineTransform& other) const noexcept -{ - return AffineTransform (other.mat00 * mat00 + other.mat01 * mat10, - other.mat00 * mat01 + other.mat01 * mat11, - other.mat00 * mat02 + other.mat01 * mat12 + other.mat02, - other.mat10 * mat00 + other.mat11 * mat10, - other.mat10 * mat01 + other.mat11 * mat11, - other.mat10 * mat02 + other.mat11 * mat12 + other.mat12); -} - -AffineTransform AffineTransform::translated (const float dx, const float dy) const noexcept -{ - return AffineTransform (mat00, mat01, mat02 + dx, - mat10, mat11, mat12 + dy); -} - -AffineTransform AffineTransform::translation (const float dx, const float dy) noexcept -{ - return AffineTransform (1.0f, 0, dx, - 0, 1.0f, dy); -} - -AffineTransform AffineTransform::withAbsoluteTranslation (const float tx, const float ty) const noexcept -{ - return AffineTransform (mat00, mat01, tx, - mat10, mat11, ty); -} - -AffineTransform AffineTransform::rotated (const float rad) const noexcept -{ - const float cosRad = std::cos (rad); - const float sinRad = std::sin (rad); - - return AffineTransform (cosRad * mat00 + -sinRad * mat10, - cosRad * mat01 + -sinRad * mat11, - cosRad * mat02 + -sinRad * mat12, - sinRad * mat00 + cosRad * mat10, - sinRad * mat01 + cosRad * mat11, - sinRad * mat02 + cosRad * mat12); -} - -AffineTransform AffineTransform::rotation (const float rad) noexcept -{ - const float cosRad = std::cos (rad); - const float sinRad = std::sin (rad); - - return AffineTransform (cosRad, -sinRad, 0, - sinRad, cosRad, 0); -} - -AffineTransform AffineTransform::rotation (const float rad, const float pivotX, const float pivotY) noexcept -{ - const float cosRad = std::cos (rad); - const float sinRad = std::sin (rad); - - return AffineTransform (cosRad, -sinRad, -cosRad * pivotX + sinRad * pivotY + pivotX, - sinRad, cosRad, -sinRad * pivotX + -cosRad * pivotY + pivotY); -} - -AffineTransform AffineTransform::rotated (const float angle, const float pivotX, const float pivotY) const noexcept -{ - return followedBy (rotation (angle, pivotX, pivotY)); -} - -AffineTransform AffineTransform::scaled (const float factorX, const float factorY) const noexcept -{ - return AffineTransform (factorX * mat00, factorX * mat01, factorX * mat02, - factorY * mat10, factorY * mat11, factorY * mat12); -} - -AffineTransform AffineTransform::scaled (const float factor) const noexcept -{ - return AffineTransform (factor * mat00, factor * mat01, factor * mat02, - factor * mat10, factor * mat11, factor * mat12); -} - -AffineTransform AffineTransform::scale (const float factorX, const float factorY) noexcept -{ - return AffineTransform (factorX, 0, 0, 0, factorY, 0); -} - -AffineTransform AffineTransform::scale (const float factor) noexcept -{ - return AffineTransform (factor, 0, 0, 0, factor, 0); -} - -AffineTransform AffineTransform::scaled (const float factorX, const float factorY, - const float pivotX, const float pivotY) const noexcept -{ - return AffineTransform (factorX * mat00, factorX * mat01, factorX * mat02 + pivotX * (1.0f - factorX), - factorY * mat10, factorY * mat11, factorY * mat12 + pivotY * (1.0f - factorY)); -} - -AffineTransform AffineTransform::scale (const float factorX, const float factorY, - const float pivotX, const float pivotY) noexcept -{ - return AffineTransform (factorX, 0, pivotX * (1.0f - factorX), - 0, factorY, pivotY * (1.0f - factorY)); -} - -AffineTransform AffineTransform::shear (float shearX, float shearY) noexcept -{ - return AffineTransform (1.0f, shearX, 0, - shearY, 1.0f, 0); -} - -AffineTransform AffineTransform::sheared (const float shearX, const float shearY) const noexcept -{ - return AffineTransform (mat00 + shearX * mat10, - mat01 + shearX * mat11, - mat02 + shearX * mat12, - mat10 + shearY * mat00, - mat11 + shearY * mat01, - mat12 + shearY * mat02); -} - -AffineTransform AffineTransform::verticalFlip (const float height) noexcept -{ - return AffineTransform (1.0f, 0, 0, 0, -1.0f, height); -} - -AffineTransform AffineTransform::inverted() const noexcept -{ - double determinant = (mat00 * mat11 - mat10 * mat01); - - if (determinant != 0.0) - { - determinant = 1.0 / determinant; - - const float dst00 = (float) ( mat11 * determinant); - const float dst10 = (float) (-mat10 * determinant); - const float dst01 = (float) (-mat01 * determinant); - const float dst11 = (float) ( mat00 * determinant); - - return AffineTransform (dst00, dst01, -mat02 * dst00 - mat12 * dst01, - dst10, dst11, -mat02 * dst10 - mat12 * dst11); - } - else - { - // singularity.. - return *this; - } -} - -bool AffineTransform::isSingularity() const noexcept -{ - return (mat00 * mat11 - mat10 * mat01) == 0; -} - -AffineTransform AffineTransform::fromTargetPoints (const float x00, const float y00, - const float x10, const float y10, - const float x01, const float y01) noexcept -{ - return AffineTransform (x10 - x00, x01 - x00, x00, - y10 - y00, y01 - y00, y00); -} - -AffineTransform AffineTransform::fromTargetPoints (const float sx1, const float sy1, const float tx1, const float ty1, - const float sx2, const float sy2, const float tx2, const float ty2, - const float sx3, const float sy3, const float tx3, const float ty3) noexcept -{ - return fromTargetPoints (sx1, sy1, sx2, sy2, sx3, sy3) - .inverted() - .followedBy (fromTargetPoints (tx1, ty1, tx2, ty2, tx3, ty3)); -} - -bool AffineTransform::isOnlyTranslation() const noexcept -{ - return (mat01 == 0) - && (mat10 == 0) - && (mat00 == 1.0f) - && (mat11 == 1.0f); -} - -float AffineTransform::getScaleFactor() const noexcept -{ - return (std::abs (mat00) + std::abs (mat11)) / 2.0f; -} diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h deleted file mode 100755 index f30fdb8..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_AffineTransform.h +++ /dev/null @@ -1,285 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_AFFINETRANSFORM_H_INCLUDED -#define JUCE_AFFINETRANSFORM_H_INCLUDED - - -//============================================================================== -/** - Represents a 2D affine-transformation matrix. - - An affine transformation is a transformation such as a rotation, scale, shear, - resize or translation. - - These are used for various 2D transformation tasks, e.g. with Path objects. - - @see Path, Point, Line -*/ -class JUCE_API AffineTransform -{ -public: - //============================================================================== - /** Creates an identity transform. */ - AffineTransform() noexcept; - - /** Creates a copy of another transform. */ - AffineTransform (const AffineTransform& other) noexcept; - - /** Creates a transform from a set of raw matrix values. - - The resulting matrix is: - - (mat00 mat01 mat02) - (mat10 mat11 mat12) - ( 0 0 1 ) - */ - AffineTransform (float mat00, float mat01, float mat02, - float mat10, float mat11, float mat12) noexcept; - - /** Copies from another AffineTransform object */ - AffineTransform& operator= (const AffineTransform& other) noexcept; - - /** Compares two transforms. */ - bool operator== (const AffineTransform& other) const noexcept; - - /** Compares two transforms. */ - bool operator!= (const AffineTransform& other) const noexcept; - - /** A ready-to-use identity transform, which you can use to append other - transformations to. - - e.g. @code - AffineTransform myTransform = AffineTransform::identity.rotated (.5f) - .scaled (2.0f); - @endcode - */ - static const AffineTransform identity; - - //============================================================================== - /** Transforms a 2D coordinate using this matrix. */ - template - void transformPoint (ValueType& x, ValueType& y) const noexcept - { - const ValueType oldX = x; - x = static_cast (mat00 * oldX + mat01 * y + mat02); - y = static_cast (mat10 * oldX + mat11 * y + mat12); - } - - /** Transforms two 2D coordinates using this matrix. - This is just a shortcut for calling transformPoint() on each of these pairs of - coordinates in turn. (And putting all the calculations into one function hopefully - also gives the compiler a bit more scope for pipelining it). - */ - template - void transformPoints (ValueType& x1, ValueType& y1, - ValueType& x2, ValueType& y2) const noexcept - { - const ValueType oldX1 = x1, oldX2 = x2; - x1 = static_cast (mat00 * oldX1 + mat01 * y1 + mat02); - y1 = static_cast (mat10 * oldX1 + mat11 * y1 + mat12); - x2 = static_cast (mat00 * oldX2 + mat01 * y2 + mat02); - y2 = static_cast (mat10 * oldX2 + mat11 * y2 + mat12); - } - - /** Transforms three 2D coordinates using this matrix. - This is just a shortcut for calling transformPoint() on each of these pairs of - coordinates in turn. (And putting all the calculations into one function hopefully - also gives the compiler a bit more scope for pipelining it). - */ - template - void transformPoints (ValueType& x1, ValueType& y1, - ValueType& x2, ValueType& y2, - ValueType& x3, ValueType& y3) const noexcept - { - const ValueType oldX1 = x1, oldX2 = x2, oldX3 = x3; - x1 = static_cast (mat00 * oldX1 + mat01 * y1 + mat02); - y1 = static_cast (mat10 * oldX1 + mat11 * y1 + mat12); - x2 = static_cast (mat00 * oldX2 + mat01 * y2 + mat02); - y2 = static_cast (mat10 * oldX2 + mat11 * y2 + mat12); - x3 = static_cast (mat00 * oldX3 + mat01 * y3 + mat02); - y3 = static_cast (mat10 * oldX3 + mat11 * y3 + mat12); - } - - //============================================================================== - /** Returns a new transform which is the same as this one followed by a translation. */ - AffineTransform translated (float deltaX, - float deltaY) const noexcept; - - /** Returns a new transform which is the same as this one followed by a translation. */ - template - AffineTransform translated (PointType delta) const noexcept - { - return translated ((float) delta.x, (float) delta.y); - } - - /** Returns a new transform which is a translation. */ - static AffineTransform translation (float deltaX, - float deltaY) noexcept; - - /** Returns a new transform which is a translation. */ - template - static AffineTransform translation (PointType delta) noexcept - { - return translation ((float) delta.x, (float) delta.y); - } - - /** Returns a copy of this transform with the specified translation matrix values. */ - AffineTransform withAbsoluteTranslation (float translationX, - float translationY) const noexcept; - - /** Returns a transform which is the same as this one followed by a rotation. - - The rotation is specified by a number of radians to rotate clockwise, centred around - the origin (0, 0). - */ - AffineTransform rotated (float angleInRadians) const noexcept; - - /** Returns a transform which is the same as this one followed by a rotation about a given point. - - The rotation is specified by a number of radians to rotate clockwise, centred around - the coordinates passed in. - */ - AffineTransform rotated (float angleInRadians, - float pivotX, - float pivotY) const noexcept; - - /** Returns a new transform which is a rotation about (0, 0). */ - static AffineTransform rotation (float angleInRadians) noexcept; - - /** Returns a new transform which is a rotation about a given point. */ - static AffineTransform rotation (float angleInRadians, - float pivotX, - float pivotY) noexcept; - - /** Returns a transform which is the same as this one followed by a re-scaling. - The scaling is centred around the origin (0, 0). - */ - AffineTransform scaled (float factorX, - float factorY) const noexcept; - - /** Returns a transform which is the same as this one followed by a re-scaling. - The scaling is centred around the origin (0, 0). - */ - AffineTransform scaled (float factor) const noexcept; - - /** Returns a transform which is the same as this one followed by a re-scaling. - The scaling is centred around the origin provided. - */ - AffineTransform scaled (float factorX, float factorY, - float pivotX, float pivotY) const noexcept; - - /** Returns a new transform which is a re-scale about the origin. */ - static AffineTransform scale (float factorX, - float factorY) noexcept; - - /** Returns a new transform which is a re-scale about the origin. */ - static AffineTransform scale (float factor) noexcept; - - /** Returns a new transform which is a re-scale centred around the point provided. */ - static AffineTransform scale (float factorX, float factorY, - float pivotX, float pivotY) noexcept; - - /** Returns a transform which is the same as this one followed by a shear. - The shear is centred around the origin (0, 0). - */ - AffineTransform sheared (float shearX, float shearY) const noexcept; - - /** Returns a shear transform, centred around the origin (0, 0). */ - static AffineTransform shear (float shearX, float shearY) noexcept; - - /** Returns a transform that will flip coordinates vertically within a window of the given height. - This is handy for converting between upside-down coordinate systems such as OpenGL or CoreGraphics. - */ - static AffineTransform verticalFlip (float height) noexcept; - - /** Returns a matrix which is the inverse operation of this one. - - Some matrices don't have an inverse - in this case, the method will just return - an identity transform. - */ - AffineTransform inverted() const noexcept; - - /** Returns the transform that will map three known points onto three coordinates - that are supplied. - - This returns the transform that will transform (0, 0) into (x00, y00), - (1, 0) to (x10, y10), and (0, 1) to (x01, y01). - */ - static AffineTransform fromTargetPoints (float x00, float y00, - float x10, float y10, - float x01, float y01) noexcept; - - /** Returns the transform that will map three specified points onto three target points. */ - static AffineTransform fromTargetPoints (float sourceX1, float sourceY1, float targetX1, float targetY1, - float sourceX2, float sourceY2, float targetX2, float targetY2, - float sourceX3, float sourceY3, float targetX3, float targetY3) noexcept; - - //============================================================================== - /** Returns the result of concatenating another transformation after this one. */ - AffineTransform followedBy (const AffineTransform& other) const noexcept; - - /** Returns true if this transform has no effect on points. */ - bool isIdentity() const noexcept; - - /** Returns true if this transform maps to a singularity - i.e. if it has no inverse. */ - bool isSingularity() const noexcept; - - /** Returns true if the transform only translates, and doesn't scale or rotate the - points. */ - bool isOnlyTranslation() const noexcept; - - /** If this transform is only a translation, this returns the X offset. - @see isOnlyTranslation - */ - float getTranslationX() const noexcept { return mat02; } - - /** If this transform is only a translation, this returns the X offset. - @see isOnlyTranslation - */ - float getTranslationY() const noexcept { return mat12; } - - /** Returns the approximate scale factor by which lengths will be transformed. - Obviously a length may be scaled by entirely different amounts depending on its - direction, so this is only appropriate as a rough guide. - */ - float getScaleFactor() const noexcept; - - //============================================================================== - /* The transform matrix is: - - (mat00 mat01 mat02) - (mat10 mat11 mat12) - ( 0 0 1 ) - */ - float mat00, mat01, mat02; - float mat10, mat11, mat12; - - -private: - //============================================================================== - JUCE_LEAK_DETECTOR (AffineTransform) -}; - -#endif // JUCE_AFFINETRANSFORM_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h deleted file mode 100755 index b6a6686..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_BorderSize.h +++ /dev/null @@ -1,153 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_BORDERSIZE_H_INCLUDED -#define JUCE_BORDERSIZE_H_INCLUDED - - -//============================================================================== -/** - Specifies a set of gaps to be left around the sides of a rectangle. - - This is basically the size of the spaces at the top, bottom, left and right of - a rectangle. It's used by various component classes to specify borders. - - @see Rectangle -*/ -template -class BorderSize -{ -public: - //============================================================================== - /** Creates a null border. - All sizes are left as 0. - */ - BorderSize() noexcept - : top(), left(), bottom(), right() - { - } - - /** Creates a copy of another border. */ - BorderSize (const BorderSize& other) noexcept - : top (other.top), left (other.left), bottom (other.bottom), right (other.right) - { - } - - /** Creates a border with the given gaps. */ - BorderSize (ValueType topGap, ValueType leftGap, ValueType bottomGap, ValueType rightGap) noexcept - : top (topGap), left (leftGap), bottom (bottomGap), right (rightGap) - { - } - - /** Creates a border with the given gap on all sides. */ - explicit BorderSize (ValueType allGaps) noexcept - : top (allGaps), left (allGaps), bottom (allGaps), right (allGaps) - { - } - - //============================================================================== - /** Returns the gap that should be left at the top of the region. */ - ValueType getTop() const noexcept { return top; } - - /** Returns the gap that should be left at the top of the region. */ - ValueType getLeft() const noexcept { return left; } - - /** Returns the gap that should be left at the top of the region. */ - ValueType getBottom() const noexcept { return bottom; } - - /** Returns the gap that should be left at the top of the region. */ - ValueType getRight() const noexcept { return right; } - - /** Returns the sum of the top and bottom gaps. */ - ValueType getTopAndBottom() const noexcept { return top + bottom; } - - /** Returns the sum of the left and right gaps. */ - ValueType getLeftAndRight() const noexcept { return left + right; } - - /** Returns true if this border has no thickness along any edge. */ - bool isEmpty() const noexcept { return left + right + top + bottom == ValueType(); } - - //============================================================================== - /** Changes the top gap. */ - void setTop (ValueType newTopGap) noexcept { top = newTopGap; } - - /** Changes the left gap. */ - void setLeft (ValueType newLeftGap) noexcept { left = newLeftGap; } - - /** Changes the bottom gap. */ - void setBottom (ValueType newBottomGap) noexcept { bottom = newBottomGap; } - - /** Changes the right gap. */ - void setRight (ValueType newRightGap) noexcept { right = newRightGap; } - - //============================================================================== - /** Returns a rectangle with these borders removed from it. */ - Rectangle subtractedFrom (const Rectangle& original) const noexcept - { - return Rectangle (original.getX() + left, - original.getY() + top, - original.getWidth() - (left + right), - original.getHeight() - (top + bottom)); - } - - /** Removes this border from a given rectangle. */ - void subtractFrom (Rectangle& rectangle) const noexcept - { - rectangle = subtractedFrom (rectangle); - } - - /** Returns a rectangle with these borders added around it. */ - Rectangle addedTo (const Rectangle& original) const noexcept - { - return Rectangle (original.getX() - left, - original.getY() - top, - original.getWidth() + (left + right), - original.getHeight() + (top + bottom)); - } - - - /** Adds this border around a given rectangle. */ - void addTo (Rectangle& rectangle) const noexcept - { - rectangle = addedTo (rectangle); - } - - //============================================================================== - bool operator== (const BorderSize& other) const noexcept - { - return top == other.top && left == other.left && bottom == other.bottom && right == other.right; - } - - bool operator!= (const BorderSize& other) const noexcept - { - return ! operator== (other); - } - -private: - //============================================================================== - ValueType top, left, bottom, right; -}; - - -#endif // JUCE_BORDERSIZE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp b/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp deleted file mode 100755 index 73ee1c3..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.cpp +++ /dev/null @@ -1,831 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -const int juce_edgeTableDefaultEdgesPerLine = 32; - -//============================================================================== -EdgeTable::EdgeTable (const Rectangle& area, - const Path& path, const AffineTransform& transform) - : bounds (area), - maxEdgesPerLine (juce_edgeTableDefaultEdgesPerLine), - lineStrideElements (juce_edgeTableDefaultEdgesPerLine * 2 + 1), - needToCheckEmptiness (true) -{ - allocate(); - int* t = table; - - for (int i = bounds.getHeight(); --i >= 0;) - { - *t = 0; - t += lineStrideElements; - } - - const int leftLimit = bounds.getX() << 8; - const int topLimit = bounds.getY() << 8; - const int rightLimit = bounds.getRight() << 8; - const int heightLimit = bounds.getHeight() << 8; - - PathFlatteningIterator iter (path, transform); - - while (iter.next()) - { - int y1 = roundToInt (iter.y1 * 256.0f); - int y2 = roundToInt (iter.y2 * 256.0f); - - if (y1 != y2) - { - y1 -= topLimit; - y2 -= topLimit; - - const int startY = y1; - int direction = -1; - - if (y1 > y2) - { - std::swap (y1, y2); - direction = 1; - } - - if (y1 < 0) - y1 = 0; - - if (y2 > heightLimit) - y2 = heightLimit; - - if (y1 < y2) - { - const double startX = 256.0f * iter.x1; - const double multiplier = (iter.x2 - iter.x1) / (iter.y2 - iter.y1); - const int stepSize = jlimit (1, 256, 256 / (1 + (int) std::abs (multiplier))); - - do - { - const int step = jmin (stepSize, y2 - y1, 256 - (y1 & 255)); - int x = roundToInt (startX + multiplier * ((y1 + (step >> 1)) - startY)); - - if (x < leftLimit) - x = leftLimit; - else if (x >= rightLimit) - x = rightLimit - 1; - - addEdgePoint (x, y1 >> 8, direction * step); - y1 += step; - } - while (y1 < y2); - } - } - } - - sanitiseLevels (path.isUsingNonZeroWinding()); -} - -EdgeTable::EdgeTable (const Rectangle& rectangleToAdd) - : bounds (rectangleToAdd), - maxEdgesPerLine (juce_edgeTableDefaultEdgesPerLine), - lineStrideElements (juce_edgeTableDefaultEdgesPerLine * 2 + 1), - needToCheckEmptiness (true) -{ - allocate(); - table[0] = 0; - - const int x1 = rectangleToAdd.getX() << 8; - const int x2 = rectangleToAdd.getRight() << 8; - - int* t = table; - for (int i = rectangleToAdd.getHeight(); --i >= 0;) - { - t[0] = 2; - t[1] = x1; - t[2] = 255; - t[3] = x2; - t[4] = 0; - t += lineStrideElements; - } -} - -EdgeTable::EdgeTable (const RectangleList& rectanglesToAdd) - : bounds (rectanglesToAdd.getBounds()), - maxEdgesPerLine (juce_edgeTableDefaultEdgesPerLine), - lineStrideElements (juce_edgeTableDefaultEdgesPerLine * 2 + 1), - needToCheckEmptiness (true) -{ - allocate(); - clearLineSizes(); - - for (const Rectangle* r = rectanglesToAdd.begin(), * const e = rectanglesToAdd.end(); r != e; ++r) - { - const int x1 = r->getX() << 8; - const int x2 = r->getRight() << 8; - int y = r->getY() - bounds.getY(); - - for (int j = r->getHeight(); --j >= 0;) - addEdgePointPair (x1, x2, y++, 255); - } - - sanitiseLevels (true); -} - -EdgeTable::EdgeTable (const RectangleList& rectanglesToAdd) - : bounds (rectanglesToAdd.getBounds().getSmallestIntegerContainer()), - maxEdgesPerLine (rectanglesToAdd.getNumRectangles() * 2), - lineStrideElements (rectanglesToAdd.getNumRectangles() * 4 + 1), - needToCheckEmptiness (true) -{ - bounds.setHeight (bounds.getHeight() + 1); - allocate(); - clearLineSizes(); - - for (const Rectangle* r = rectanglesToAdd.begin(), * const e = rectanglesToAdd.end(); r != e; ++r) - { - const int x1 = roundToInt (r->getX() * 256.0f); - const int x2 = roundToInt (r->getRight() * 256.0f); - - const int y1 = roundToInt (r->getY() * 256.0f) - (bounds.getY() << 8); - const int y2 = roundToInt (r->getBottom() * 256.0f) - (bounds.getY() << 8); - - if (x2 <= x1 || y2 <= y1) - continue; - - int y = y1 >> 8; - const int lastLine = y2 >> 8; - - if (y == lastLine) - { - addEdgePointPair (x1, x2, y, y2 - y1); - } - else - { - addEdgePointPair (x1, x2, y++, 255 - (y1 & 255)); - - while (y < lastLine) - addEdgePointPair (x1, x2, y++, 255); - - jassert (y < bounds.getHeight()); - addEdgePointPair (x1, x2, y, y2 & 255); - } - } - - sanitiseLevels (true); -} - -EdgeTable::EdgeTable (const Rectangle& rectangleToAdd) - : bounds (Rectangle ((int) std::floor (rectangleToAdd.getX()), - roundToInt (rectangleToAdd.getY() * 256.0f) >> 8, - 2 + (int) rectangleToAdd.getWidth(), - 2 + (int) rectangleToAdd.getHeight())), - maxEdgesPerLine (juce_edgeTableDefaultEdgesPerLine), - lineStrideElements ((juce_edgeTableDefaultEdgesPerLine << 1) + 1), - needToCheckEmptiness (true) -{ - jassert (! rectangleToAdd.isEmpty()); - allocate(); - table[0] = 0; - - const int x1 = roundToInt (rectangleToAdd.getX() * 256.0f); - const int x2 = roundToInt (rectangleToAdd.getRight() * 256.0f); - - int y1 = roundToInt (rectangleToAdd.getY() * 256.0f) - (bounds.getY() << 8); - jassert (y1 < 256); - int y2 = roundToInt (rectangleToAdd.getBottom() * 256.0f) - (bounds.getY() << 8); - - if (x2 <= x1 || y2 <= y1) - { - bounds.setHeight (0); - return; - } - - int lineY = 0; - int* t = table; - - if ((y1 >> 8) == (y2 >> 8)) - { - t[0] = 2; - t[1] = x1; - t[2] = y2 - y1; - t[3] = x2; - t[4] = 0; - ++lineY; - t += lineStrideElements; - } - else - { - t[0] = 2; - t[1] = x1; - t[2] = 255 - (y1 & 255); - t[3] = x2; - t[4] = 0; - ++lineY; - t += lineStrideElements; - - while (lineY < (y2 >> 8)) - { - t[0] = 2; - t[1] = x1; - t[2] = 255; - t[3] = x2; - t[4] = 0; - ++lineY; - t += lineStrideElements; - } - - jassert (lineY < bounds.getHeight()); - t[0] = 2; - t[1] = x1; - t[2] = y2 & 255; - t[3] = x2; - t[4] = 0; - ++lineY; - t += lineStrideElements; - } - - while (lineY < bounds.getHeight()) - { - t[0] = 0; - t += lineStrideElements; - ++lineY; - } -} - -EdgeTable::EdgeTable (const EdgeTable& other) -{ - operator= (other); -} - -EdgeTable& EdgeTable::operator= (const EdgeTable& other) -{ - bounds = other.bounds; - maxEdgesPerLine = other.maxEdgesPerLine; - lineStrideElements = other.lineStrideElements; - needToCheckEmptiness = other.needToCheckEmptiness; - - allocate(); - copyEdgeTableData (table, lineStrideElements, other.table, lineStrideElements, bounds.getHeight()); - return *this; -} - -EdgeTable::~EdgeTable() -{ -} - -//============================================================================== -static size_t getEdgeTableAllocationSize (int lineStride, int height) noexcept -{ - // (leave an extra line at the end for use as scratch space) - return (size_t) (lineStride * (2 + jmax (0, height))); -} - -void EdgeTable::allocate() -{ - table.malloc (getEdgeTableAllocationSize (lineStrideElements, bounds.getHeight())); -} - -void EdgeTable::clearLineSizes() noexcept -{ - int* t = table; - for (int i = bounds.getHeight(); --i >= 0;) - { - *t = 0; - t += lineStrideElements; - } -} - -void EdgeTable::copyEdgeTableData (int* dest, const int destLineStride, const int* src, const int srcLineStride, int numLines) noexcept -{ - while (--numLines >= 0) - { - memcpy (dest, src, (size_t) (src[0] * 2 + 1) * sizeof (int)); - src += srcLineStride; - dest += destLineStride; - } -} - -void EdgeTable::sanitiseLevels (const bool useNonZeroWinding) noexcept -{ - // Convert the table from relative windings to absolute levels.. - int* lineStart = table; - - for (int y = bounds.getHeight(); --y >= 0;) - { - int num = lineStart[0]; - - if (num > 0) - { - LineItem* items = reinterpret_cast (lineStart + 1); - LineItem* const itemsEnd = items + num; - - // sort the X coords - std::sort (items, itemsEnd); - - const LineItem* src = items; - int correctedNum = num; - int level = 0; - - while (src < itemsEnd) - { - level += src->level; - const int x = src->x; - ++src; - - while (src < itemsEnd && src->x == x) - { - level += src->level; - ++src; - --correctedNum; - } - - int corrected = std::abs (level); - - if (corrected >> 8) - { - if (useNonZeroWinding) - { - corrected = 255; - } - else - { - corrected &= 511; - if (corrected >> 8) - corrected = 511 - corrected; - } - } - - items->x = x; - items->level = corrected; - ++items; - } - - lineStart[0] = correctedNum; - (items - 1)->level = 0; // force the last level to 0, just in case something went wrong in creating the table - } - - lineStart += lineStrideElements; - } -} - -void EdgeTable::remapTableForNumEdges (const int newNumEdgesPerLine) -{ - if (newNumEdgesPerLine != maxEdgesPerLine) - { - maxEdgesPerLine = newNumEdgesPerLine; - - jassert (bounds.getHeight() > 0); - const int newLineStrideElements = maxEdgesPerLine * 2 + 1; - - HeapBlock newTable (getEdgeTableAllocationSize (newLineStrideElements, bounds.getHeight())); - - copyEdgeTableData (newTable, newLineStrideElements, table, lineStrideElements, bounds.getHeight()); - - table.swapWith (newTable); - lineStrideElements = newLineStrideElements; - } -} - -void EdgeTable::optimiseTable() -{ - int maxLineElements = 0; - - for (int i = bounds.getHeight(); --i >= 0;) - maxLineElements = jmax (maxLineElements, table [i * lineStrideElements]); - - remapTableForNumEdges (maxLineElements); -} - -void EdgeTable::addEdgePoint (const int x, const int y, const int winding) -{ - jassert (y >= 0 && y < bounds.getHeight()); - - int* line = table + lineStrideElements * y; - const int numPoints = line[0]; - - if (numPoints >= maxEdgesPerLine) - { - remapTableForNumEdges (maxEdgesPerLine + juce_edgeTableDefaultEdgesPerLine); - jassert (numPoints < maxEdgesPerLine); - line = table + lineStrideElements * y; - } - - line[0]++; - int n = numPoints << 1; - line [n + 1] = x; - line [n + 2] = winding; -} - -void EdgeTable::addEdgePointPair (int x1, int x2, int y, int winding) -{ - jassert (y >= 0 && y < bounds.getHeight()); - - int* line = table + lineStrideElements * y; - const int numPoints = line[0]; - - if (numPoints + 1 >= maxEdgesPerLine) - { - remapTableForNumEdges (maxEdgesPerLine + juce_edgeTableDefaultEdgesPerLine); - jassert (numPoints < maxEdgesPerLine); - line = table + lineStrideElements * y; - } - - line[0] = numPoints + 2; - line += numPoints << 1; - line[1] = x1; - line[2] = winding; - line[3] = x2; - line[4] = -winding; -} - -void EdgeTable::translate (float dx, const int dy) noexcept -{ - bounds.translate ((int) std::floor (dx), dy); - - int* lineStart = table; - const int intDx = (int) (dx * 256.0f); - - for (int i = bounds.getHeight(); --i >= 0;) - { - int* line = lineStart; - lineStart += lineStrideElements; - int num = *line++; - - while (--num >= 0) - { - *line += intDx; - line += 2; - } - } -} - -void EdgeTable::multiplyLevels (float amount) -{ - int* lineStart = table; - const int multiplier = (int) (amount * 256.0f); - - for (int y = 0; y < bounds.getHeight(); ++y) - { - int numPoints = lineStart[0]; - LineItem* item = reinterpret_cast (lineStart + 1); - lineStart += lineStrideElements; - - while (--numPoints > 0) - { - item->level = jmin (255, (item->level * multiplier) >> 8); - ++item; - } - } -} - -void EdgeTable::intersectWithEdgeTableLine (const int y, const int* const otherLine) -{ - jassert (y >= 0 && y < bounds.getHeight()); - - int* srcLine = table + lineStrideElements * y; - int srcNum1 = *srcLine; - - if (srcNum1 == 0) - return; - - int srcNum2 = *otherLine; - - if (srcNum2 == 0) - { - *srcLine = 0; - return; - } - - const int right = bounds.getRight() << 8; - - // optimise for the common case where our line lies entirely within a - // single pair of points, as happens when clipping to a simple rect. - if (srcNum2 == 2 && otherLine[2] >= 255) - { - clipEdgeTableLineToRange (srcLine, otherLine[1], jmin (right, otherLine[3])); - return; - } - - bool isUsingTempSpace = false; - - const int* src1 = srcLine + 1; - int x1 = *src1++; - - const int* src2 = otherLine + 1; - int x2 = *src2++; - - int destIndex = 0, destTotal = 0; - int level1 = 0, level2 = 0; - int lastX = std::numeric_limits::min(), lastLevel = 0; - - while (srcNum1 > 0 && srcNum2 > 0) - { - int nextX; - - if (x1 <= x2) - { - if (x1 == x2) - { - level2 = *src2++; - x2 = *src2++; - --srcNum2; - } - - nextX = x1; - level1 = *src1++; - x1 = *src1++; - --srcNum1; - } - else - { - nextX = x2; - level2 = *src2++; - x2 = *src2++; - --srcNum2; - } - - if (nextX > lastX) - { - if (nextX >= right) - break; - - lastX = nextX; - - const int nextLevel = (level1 * (level2 + 1)) >> 8; - jassert (isPositiveAndBelow (nextLevel, (int) 256)); - - if (nextLevel != lastLevel) - { - if (destTotal >= maxEdgesPerLine) - { - srcLine[0] = destTotal; - - if (isUsingTempSpace) - { - const size_t tempSize = (size_t) srcNum1 * 2 * sizeof (int); - int* const oldTemp = static_cast (alloca (tempSize)); - memcpy (oldTemp, src1, tempSize); - - remapTableForNumEdges (jmax (256, destTotal * 2)); - srcLine = table + lineStrideElements * y; - - int* const newTemp = table + lineStrideElements * bounds.getHeight(); - memcpy (newTemp, oldTemp, tempSize); - src1 = newTemp; - } - else - { - remapTableForNumEdges (jmax (256, destTotal * 2)); - srcLine = table + lineStrideElements * y; - } - } - - ++destTotal; - lastLevel = nextLevel; - - if (! isUsingTempSpace) - { - isUsingTempSpace = true; - int* const temp = table + lineStrideElements * bounds.getHeight(); - memcpy (temp, src1, (size_t) srcNum1 * 2 * sizeof (int)); - src1 = temp; - } - - srcLine[++destIndex] = nextX; - srcLine[++destIndex] = nextLevel; - } - } - } - - if (lastLevel > 0) - { - if (destTotal >= maxEdgesPerLine) - { - srcLine[0] = destTotal; - remapTableForNumEdges (jmax (256, destTotal * 2)); - srcLine = table + lineStrideElements * y; - } - - ++destTotal; - srcLine[++destIndex] = right; - srcLine[++destIndex] = 0; - } - - srcLine[0] = destTotal; -} - -void EdgeTable::clipEdgeTableLineToRange (int* dest, const int x1, const int x2) noexcept -{ - int* lastItem = dest + (dest[0] * 2 - 1); - - if (x2 < lastItem[0]) - { - if (x2 <= dest[1]) - { - dest[0] = 0; - return; - } - - while (x2 < lastItem[-2]) - { - --(dest[0]); - lastItem -= 2; - } - - lastItem[0] = x2; - lastItem[1] = 0; - } - - if (x1 > dest[1]) - { - while (lastItem[0] > x1) - lastItem -= 2; - - const int itemsRemoved = (int) (lastItem - (dest + 1)) / 2; - - if (itemsRemoved > 0) - { - dest[0] -= itemsRemoved; - memmove (dest + 1, lastItem, (size_t) dest[0] * (sizeof (int) * 2)); - } - - dest[1] = x1; - } -} - - -//============================================================================== -void EdgeTable::clipToRectangle (const Rectangle& r) -{ - const Rectangle clipped (r.getIntersection (bounds)); - - if (clipped.isEmpty()) - { - needToCheckEmptiness = false; - bounds.setHeight (0); - } - else - { - const int top = clipped.getY() - bounds.getY(); - const int bottom = clipped.getBottom() - bounds.getY(); - - if (bottom < bounds.getHeight()) - bounds.setHeight (bottom); - - for (int i = top; --i >= 0;) - table [lineStrideElements * i] = 0; - - if (clipped.getX() > bounds.getX() || clipped.getRight() < bounds.getRight()) - { - const int x1 = clipped.getX() << 8; - const int x2 = jmin (bounds.getRight(), clipped.getRight()) << 8; - int* line = table + lineStrideElements * top; - - for (int i = bottom - top; --i >= 0;) - { - if (line[0] != 0) - clipEdgeTableLineToRange (line, x1, x2); - - line += lineStrideElements; - } - } - - needToCheckEmptiness = true; - } -} - -void EdgeTable::excludeRectangle (const Rectangle& r) -{ - const Rectangle clipped (r.getIntersection (bounds)); - - if (! clipped.isEmpty()) - { - const int top = clipped.getY() - bounds.getY(); - const int bottom = clipped.getBottom() - bounds.getY(); - - const int rectLine[] = { 4, std::numeric_limits::min(), 255, - clipped.getX() << 8, 0, - clipped.getRight() << 8, 255, - std::numeric_limits::max(), 0 }; - - for (int i = top; i < bottom; ++i) - intersectWithEdgeTableLine (i, rectLine); - - needToCheckEmptiness = true; - } -} - -void EdgeTable::clipToEdgeTable (const EdgeTable& other) -{ - const Rectangle clipped (other.bounds.getIntersection (bounds)); - - if (clipped.isEmpty()) - { - needToCheckEmptiness = false; - bounds.setHeight (0); - } - else - { - const int top = clipped.getY() - bounds.getY(); - const int bottom = clipped.getBottom() - bounds.getY(); - - if (bottom < bounds.getHeight()) - bounds.setHeight (bottom); - - if (clipped.getRight() < bounds.getRight()) - bounds.setRight (clipped.getRight()); - - for (int i = 0; i < top; ++i) - table [lineStrideElements * i] = 0; - - const int* otherLine = other.table + other.lineStrideElements * (clipped.getY() - other.bounds.getY()); - - for (int i = top; i < bottom; ++i) - { - intersectWithEdgeTableLine (i, otherLine); - otherLine += other.lineStrideElements; - } - - needToCheckEmptiness = true; - } -} - -void EdgeTable::clipLineToMask (int x, int y, const uint8* mask, int maskStride, int numPixels) -{ - y -= bounds.getY(); - - if (y < 0 || y >= bounds.getHeight()) - return; - - needToCheckEmptiness = true; - - if (numPixels <= 0) - { - table [lineStrideElements * y] = 0; - return; - } - - int* tempLine = static_cast (alloca ((size_t) (numPixels * 2 + 4) * sizeof (int))); - int destIndex = 0, lastLevel = 0; - - while (--numPixels >= 0) - { - const int alpha = *mask; - mask += maskStride; - - if (alpha != lastLevel) - { - tempLine[++destIndex] = (x << 8); - tempLine[++destIndex] = alpha; - lastLevel = alpha; - } - - ++x; - } - - if (lastLevel > 0) - { - tempLine[++destIndex] = (x << 8); - tempLine[++destIndex] = 0; - } - - tempLine[0] = destIndex >> 1; - - intersectWithEdgeTableLine (y, tempLine); -} - -bool EdgeTable::isEmpty() noexcept -{ - if (needToCheckEmptiness) - { - needToCheckEmptiness = false; - int* t = table; - - for (int i = bounds.getHeight(); --i >= 0;) - { - if (t[0] > 1) - return false; - - t += lineStrideElements; - } - - bounds.setHeight (0); - } - - return bounds.getHeight() == 0; -} diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h deleted file mode 100755 index d8b6d66..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_EdgeTable.h +++ /dev/null @@ -1,220 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_EDGETABLE_H_INCLUDED -#define JUCE_EDGETABLE_H_INCLUDED - - -//============================================================================== -/** - A table of horizontal scan-line segments - used for rasterising Paths. - - @see Path, Graphics -*/ -class JUCE_API EdgeTable -{ -public: - //============================================================================== - /** Creates an edge table containing a path. - - A table is created with a fixed vertical range, and only sections of the path - which lie within this range will be added to the table. - - @param clipLimits only the region of the path that lies within this area will be added - @param pathToAdd the path to add to the table - @param transform a transform to apply to the path being added - */ - EdgeTable (const Rectangle& clipLimits, - const Path& pathToAdd, - const AffineTransform& transform); - - /** Creates an edge table containing a rectangle. */ - explicit EdgeTable (const Rectangle& rectangleToAdd); - - /** Creates an edge table containing a rectangle list. */ - explicit EdgeTable (const RectangleList& rectanglesToAdd); - - /** Creates an edge table containing a rectangle list. */ - explicit EdgeTable (const RectangleList& rectanglesToAdd); - - /** Creates an edge table containing a rectangle. */ - explicit EdgeTable (const Rectangle& rectangleToAdd); - - /** Creates a copy of another edge table. */ - EdgeTable (const EdgeTable&); - - /** Copies from another edge table. */ - EdgeTable& operator= (const EdgeTable&); - - /** Destructor. */ - ~EdgeTable(); - - //============================================================================== - void clipToRectangle (const Rectangle& r); - void excludeRectangle (const Rectangle& r); - void clipToEdgeTable (const EdgeTable&); - void clipLineToMask (int x, int y, const uint8* mask, int maskStride, int numPixels); - bool isEmpty() noexcept; - const Rectangle& getMaximumBounds() const noexcept { return bounds; } - void translate (float dx, int dy) noexcept; - - /** Scales all the alpha-levels in the table by the given multiplier. */ - void multiplyLevels (float factor); - - /** Reduces the amount of space the table has allocated. - - This will shrink the table down to use as little memory as possible - useful for - read-only tables that get stored and re-used for rendering. - */ - void optimiseTable(); - - - //============================================================================== - /** Iterates the lines in the table, for rendering. - - This function will iterate each line in the table, and call a user-defined class - to render each pixel or continuous line of pixels that the table contains. - - @param iterationCallback this templated class must contain the following methods: - @code - inline void setEdgeTableYPos (int y); - inline void handleEdgeTablePixel (int x, int alphaLevel) const; - inline void handleEdgeTablePixelFull (int x) const; - inline void handleEdgeTableLine (int x, int width, int alphaLevel) const; - inline void handleEdgeTableLineFull (int x, int width) const; - @endcode - (these don't necessarily have to be 'const', but it might help it go faster) - */ - template - void iterate (EdgeTableIterationCallback& iterationCallback) const noexcept - { - const int* lineStart = table; - - for (int y = 0; y < bounds.getHeight(); ++y) - { - const int* line = lineStart; - lineStart += lineStrideElements; - int numPoints = line[0]; - - if (--numPoints > 0) - { - int x = *++line; - jassert ((x >> 8) >= bounds.getX() && (x >> 8) < bounds.getRight()); - int levelAccumulator = 0; - - iterationCallback.setEdgeTableYPos (bounds.getY() + y); - - while (--numPoints >= 0) - { - const int level = *++line; - jassert (isPositiveAndBelow (level, (int) 256)); - const int endX = *++line; - jassert (endX >= x); - const int endOfRun = (endX >> 8); - - if (endOfRun == (x >> 8)) - { - // small segment within the same pixel, so just save it for the next - // time round.. - levelAccumulator += (endX - x) * level; - } - else - { - // plot the fist pixel of this segment, including any accumulated - // levels from smaller segments that haven't been drawn yet - levelAccumulator += (0x100 - (x & 0xff)) * level; - levelAccumulator >>= 8; - x >>= 8; - - if (levelAccumulator > 0) - { - if (levelAccumulator >= 255) - iterationCallback.handleEdgeTablePixelFull (x); - else - iterationCallback.handleEdgeTablePixel (x, levelAccumulator); - } - - // if there's a run of similar pixels, do it all in one go.. - if (level > 0) - { - jassert (endOfRun <= bounds.getRight()); - const int numPix = endOfRun - ++x; - - if (numPix > 0) - iterationCallback.handleEdgeTableLine (x, numPix, level); - } - - // save the bit at the end to be drawn next time round the loop. - levelAccumulator = (endX & 0xff) * level; - } - - x = endX; - } - - levelAccumulator >>= 8; - - if (levelAccumulator > 0) - { - x >>= 8; - jassert (x >= bounds.getX() && x < bounds.getRight()); - - if (levelAccumulator >= 255) - iterationCallback.handleEdgeTablePixelFull (x); - else - iterationCallback.handleEdgeTablePixel (x, levelAccumulator); - } - } - } - } - -private: - //============================================================================== - // table line format: number of points; point0 x, point0 levelDelta, point1 x, point1 levelDelta, etc - struct LineItem - { - int x, level; - - bool operator< (const LineItem& other) const noexcept { return x < other.x; } - }; - - HeapBlock table; - Rectangle bounds; - int maxEdgesPerLine, lineStrideElements; - bool needToCheckEmptiness; - - void allocate(); - void clearLineSizes() noexcept; - void addEdgePoint (int x, int y, int winding); - void addEdgePointPair (int x1, int x2, int y, int winding); - void remapTableForNumEdges (int newNumEdgesPerLine); - void intersectWithEdgeTableLine (int y, const int* otherLine); - void clipEdgeTableLineToRange (int* line, int x1, int x2) noexcept; - void sanitiseLevels (bool useNonZeroWinding) noexcept; - static void copyEdgeTableData (int* dest, int destLineStride, const int* src, int srcLineStride, int numLines) noexcept; - - JUCE_LEAK_DETECTOR (EdgeTable) -}; - - -#endif // JUCE_EDGETABLE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h deleted file mode 100755 index 95665c5..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Line.h +++ /dev/null @@ -1,416 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_LINE_H_INCLUDED -#define JUCE_LINE_H_INCLUDED - - -//============================================================================== -/** - Represents a line. - - This class contains a bunch of useful methods for various geometric - tasks. - - The ValueType template parameter should be a primitive type - float or double - are what it's designed for. Integer types will work in a basic way, but some methods - that perform mathematical operations may not compile, or they may not produce - sensible results. - - @see Point, Rectangle, Path, Graphics::drawLine -*/ -template -class Line -{ -public: - //============================================================================== - /** Creates a line, using (0, 0) as its start and end points. */ - Line() noexcept {} - - /** Creates a copy of another line. */ - Line (const Line& other) noexcept - : start (other.start), - end (other.end) - { - } - - /** Creates a line based on the coordinates of its start and end points. */ - Line (ValueType startX, ValueType startY, ValueType endX, ValueType endY) noexcept - : start (startX, startY), - end (endX, endY) - { - } - - /** Creates a line from its start and end points. */ - Line (const Point startPoint, - const Point endPoint) noexcept - : start (startPoint), - end (endPoint) - { - } - - /** Copies a line from another one. */ - Line& operator= (const Line& other) noexcept - { - start = other.start; - end = other.end; - return *this; - } - - /** Destructor. */ - ~Line() noexcept {} - - //============================================================================== - /** Returns the x coordinate of the line's start point. */ - inline ValueType getStartX() const noexcept { return start.x; } - - /** Returns the y coordinate of the line's start point. */ - inline ValueType getStartY() const noexcept { return start.y; } - - /** Returns the x coordinate of the line's end point. */ - inline ValueType getEndX() const noexcept { return end.x; } - - /** Returns the y coordinate of the line's end point. */ - inline ValueType getEndY() const noexcept { return end.y; } - - /** Returns the line's start point. */ - inline Point getStart() const noexcept { return start; } - - /** Returns the line's end point. */ - inline Point getEnd() const noexcept { return end; } - - /** Changes this line's start point */ - void setStart (ValueType newStartX, ValueType newStartY) noexcept { start.setXY (newStartX, newStartY); } - - /** Changes this line's end point */ - void setEnd (ValueType newEndX, ValueType newEndY) noexcept { end.setXY (newEndX, newEndY); } - - /** Changes this line's start point */ - void setStart (const Point newStart) noexcept { start = newStart; } - - /** Changes this line's end point */ - void setEnd (const Point newEnd) noexcept { end = newEnd; } - - /** Returns a line that is the same as this one, but with the start and end reversed, */ - const Line reversed() const noexcept { return Line (end, start); } - - /** Applies an affine transform to the line's start and end points. */ - void applyTransform (const AffineTransform& transform) noexcept - { - start.applyTransform (transform); - end.applyTransform (transform); - } - - //============================================================================== - /** Returns the length of the line. */ - ValueType getLength() const noexcept { return start.getDistanceFrom (end); } - - /** Returns true if the line's start and end x coordinates are the same. */ - bool isVertical() const noexcept { return start.x == end.x; } - - /** Returns true if the line's start and end y coordinates are the same. */ - bool isHorizontal() const noexcept { return start.y == end.y; } - - /** Returns the line's angle. - - This value is the number of radians clockwise from the 12 o'clock direction, - where the line's start point is considered to be at the centre. - */ - typename Point::FloatType getAngle() const noexcept { return start.getAngleToPoint (end); } - - /** Casts this line to float coordinates. */ - Line toFloat() const noexcept { return Line (start.toFloat(), end.toFloat()); } - - /** Casts this line to double coordinates. */ - Line toDouble() const noexcept { return Line (start.toDouble(), end.toDouble()); } - - //============================================================================== - /** Compares two lines. */ - bool operator== (const Line& other) const noexcept { return start == other.start && end == other.end; } - - /** Compares two lines. */ - bool operator!= (const Line& other) const noexcept { return start != other.start || end != other.end; } - - //============================================================================== - /** Finds the intersection between two lines. - - @param line the line to intersect with - @returns the point at which the lines intersect, even if this lies beyond the end of the lines - */ - Point getIntersection (const Line& line) const noexcept - { - Point p; - findIntersection (start, end, line.start, line.end, p); - return p; - } - - /** Finds the intersection between two lines. - - @param line the other line - @param intersection the position of the point where the lines meet (or - where they would meet if they were infinitely long) - the intersection (if the lines intersect). If the lines - are parallel, this will just be set to the position - of one of the line's endpoints. - @returns true if the line segments intersect; false if they dont. Even if they - don't intersect, the intersection coordinates returned will still - be valid - */ - bool intersects (const Line& line, Point& intersection) const noexcept - { - return findIntersection (start, end, line.start, line.end, intersection); - } - - /** Returns true if this line intersects another. */ - bool intersects (const Line& other) const noexcept - { - Point ignored; - return findIntersection (start, end, other.start, other.end, ignored); - } - - //============================================================================== - /** Returns the location of the point which is a given distance along this line. - - @param distanceFromStart the distance to move along the line from its - start point. This value can be negative or longer - than the line itself - @see getPointAlongLineProportionally - */ - Point getPointAlongLine (ValueType distanceFromStart) const noexcept - { - return start + (end - start) * (distanceFromStart / getLength()); - } - - /** Returns a point which is a certain distance along and to the side of this line. - - This effectively moves a given distance along the line, then another distance - perpendicularly to this, and returns the resulting position. - - @param distanceFromStart the distance to move along the line from its - start point. This value can be negative or longer - than the line itself - @param perpendicularDistance how far to move sideways from the line. If you're - looking along the line from its start towards its - end, then a positive value here will move to the - right, negative value move to the left. - */ - Point getPointAlongLine (ValueType distanceFromStart, - ValueType perpendicularDistance) const noexcept - { - const Point delta (end - start); - const double length = juce_hypot ((double) delta.x, - (double) delta.y); - if (length <= 0) - return start; - - return Point (start.x + static_cast ((delta.x * distanceFromStart - delta.y * perpendicularDistance) / length), - start.y + static_cast ((delta.y * distanceFromStart + delta.x * perpendicularDistance) / length)); - } - - /** Returns the location of the point which is a given distance along this line - proportional to the line's length. - - @param proportionOfLength the distance to move along the line from its - start point, in multiples of the line's length. - So a value of 0.0 will return the line's start point - and a value of 1.0 will return its end point. (This value - can be negative or greater than 1.0). - @see getPointAlongLine - */ - Point getPointAlongLineProportionally (ValueType proportionOfLength) const noexcept - { - return start + (end - start) * proportionOfLength; - } - - /** Returns the smallest distance between this line segment and a given point. - - So if the point is close to the line, this will return the perpendicular - distance from the line; if the point is a long way beyond one of the line's - end-point's, it'll return the straight-line distance to the nearest end-point. - - pointOnLine receives the position of the point that is found. - - @returns the point's distance from the line - @see getPositionAlongLineOfNearestPoint - */ - ValueType getDistanceFromPoint (const Point targetPoint, - Point& pointOnLine) const noexcept - { - const Point delta (end - start); - const double length = delta.x * delta.x + delta.y * delta.y; - - if (length > 0) - { - const double prop = ((targetPoint.x - start.x) * delta.x - + (targetPoint.y - start.y) * delta.y) / length; - - if (prop >= 0 && prop <= 1.0) - { - pointOnLine = start + delta * static_cast (prop); - return targetPoint.getDistanceFrom (pointOnLine); - } - } - - const float fromStart = targetPoint.getDistanceFrom (start); - const float fromEnd = targetPoint.getDistanceFrom (end); - - if (fromStart < fromEnd) - { - pointOnLine = start; - return fromStart; - } - else - { - pointOnLine = end; - return fromEnd; - } - } - - /** Finds the point on this line which is nearest to a given point, and - returns its position as a proportional position along the line. - - @returns a value 0 to 1.0 which is the distance along this line from the - line's start to the point which is nearest to the point passed-in. To - turn this number into a position, use getPointAlongLineProportionally(). - @see getDistanceFromPoint, getPointAlongLineProportionally - */ - ValueType findNearestProportionalPositionTo (const Point point) const noexcept - { - const Point delta (end - start); - const double length = delta.x * delta.x + delta.y * delta.y; - - return length <= 0 ? 0 - : jlimit (ValueType(), static_cast (1), - static_cast ((((point.x - start.x) * delta.x - + (point.y - start.y) * delta.y) / length))); - } - - /** Finds the point on this line which is nearest to a given point. - @see getDistanceFromPoint, findNearestProportionalPositionTo - */ - Point findNearestPointTo (const Point point) const noexcept - { - return getPointAlongLineProportionally (findNearestProportionalPositionTo (point)); - } - - /** Returns true if the given point lies above this line. - - The return value is true if the point's y coordinate is less than the y - coordinate of this line at the given x (assuming the line extends infinitely - in both directions). - */ - bool isPointAbove (const Point point) const noexcept - { - return start.x != end.x - && point.y < ((end.y - start.y) - * (point.x - start.x)) / (end.x - start.x) + start.y; - } - - //============================================================================== - /** Returns a shortened copy of this line. - - This will chop off part of the start of this line by a certain amount, (leaving the - end-point the same), and return the new line. - */ - Line withShortenedStart (ValueType distanceToShortenBy) const noexcept - { - return Line (getPointAlongLine (jmin (distanceToShortenBy, getLength())), end); - } - - /** Returns a shortened copy of this line. - - This will chop off part of the end of this line by a certain amount, (leaving the - start-point the same), and return the new line. - */ - Line withShortenedEnd (ValueType distanceToShortenBy) const noexcept - { - const ValueType length = getLength(); - return Line (start, getPointAlongLine (length - jmin (distanceToShortenBy, length))); - } - -private: - //============================================================================== - Point start, end; - - static bool findIntersection (const Point p1, const Point p2, - const Point p3, const Point p4, - Point& intersection) noexcept - { - if (p2 == p3) - { - intersection = p2; - return true; - } - - const Point d1 (p2 - p1); - const Point d2 (p4 - p3); - const ValueType divisor = d1.x * d2.y - d2.x * d1.y; - - if (divisor == 0) - { - if (! (d1.isOrigin() || d2.isOrigin())) - { - if (d1.y == 0 && d2.y != 0) - { - const ValueType along = (p1.y - p3.y) / d2.y; - intersection = p1.withX (p3.x + along * d2.x); - return along >= 0 && along <= static_cast (1); - } - else if (d2.y == 0 && d1.y != 0) - { - const ValueType along = (p3.y - p1.y) / d1.y; - intersection = p3.withX (p1.x + along * d1.x); - return along >= 0 && along <= static_cast (1); - } - else if (d1.x == 0 && d2.x != 0) - { - const ValueType along = (p1.x - p3.x) / d2.x; - intersection = p1.withY (p3.y + along * d2.y); - return along >= 0 && along <= static_cast (1); - } - else if (d2.x == 0 && d1.x != 0) - { - const ValueType along = (p3.x - p1.x) / d1.x; - intersection = p3.withY (p1.y + along * d1.y); - return along >= 0 && along <= static_cast (1); - } - } - - intersection = (p2 + p3) / static_cast (2); - return false; - } - - const ValueType along1 = ((p1.y - p3.y) * d2.x - (p1.x - p3.x) * d2.y) / divisor; - intersection = p1 + d1 * along1; - - if (along1 < 0 || along1 > static_cast (1)) - return false; - - const ValueType along2 = ((p1.y - p3.y) * d1.x - (p1.x - p3.x) * d1.y) / divisor; - return along2 >= 0 && along2 <= static_cast (1); - } -}; - - -#endif // JUCE_LINE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp deleted file mode 100755 index 65c211f..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.cpp +++ /dev/null @@ -1,1615 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -// tests that some coordinates aren't NaNs -#define JUCE_CHECK_COORDS_ARE_VALID(x, y) \ - jassert (x == x && y == y); - -//============================================================================== -namespace PathHelpers -{ - const float ellipseAngularIncrement = 0.05f; - - static String nextToken (String::CharPointerType& t) - { - t = t.findEndOfWhitespace(); - - String::CharPointerType start (t); - size_t numChars = 0; - - while (! (t.isEmpty() || t.isWhitespace())) - { - ++t; - ++numChars; - } - - return String (start, numChars); - } - - inline double lengthOf (float x1, float y1, float x2, float y2) noexcept - { - return juce_hypot ((double) (x1 - x2), (double) (y1 - y2)); - } -} - -//============================================================================== -const float Path::lineMarker = 100001.0f; -const float Path::moveMarker = 100002.0f; -const float Path::quadMarker = 100003.0f; -const float Path::cubicMarker = 100004.0f; -const float Path::closeSubPathMarker = 100005.0f; - -//============================================================================== -Path::PathBounds::PathBounds() noexcept - : pathXMin (0), pathXMax (0), pathYMin (0), pathYMax (0) -{ -} - -Rectangle Path::PathBounds::getRectangle() const noexcept -{ - return Rectangle (pathXMin, pathYMin, pathXMax - pathXMin, pathYMax - pathYMin); -} - -void Path::PathBounds::reset() noexcept -{ - pathXMin = pathYMin = pathYMax = pathXMax = 0; -} - -void Path::PathBounds::reset (const float x, const float y) noexcept -{ - pathXMin = pathXMax = x; - pathYMin = pathYMax = y; -} - -void Path::PathBounds::extend (const float x, const float y) noexcept -{ - pathXMin = jmin (pathXMin, x); - pathXMax = jmax (pathXMax, x); - pathYMin = jmin (pathYMin, y); - pathYMax = jmax (pathYMax, y); -} - -void Path::PathBounds::extend (const float x1, const float y1, const float x2, const float y2) noexcept -{ - if (x1 < x2) - { - pathXMin = jmin (pathXMin, x1); - pathXMax = jmax (pathXMax, x2); - } - else - { - pathXMin = jmin (pathXMin, x2); - pathXMax = jmax (pathXMax, x1); - } - - if (y1 < y2) - { - pathYMin = jmin (pathYMin, y1); - pathYMax = jmax (pathYMax, y2); - } - else - { - pathYMin = jmin (pathYMin, y2); - pathYMax = jmax (pathYMax, y1); - } -} - -//============================================================================== -Path::Path() - : numElements (0), useNonZeroWinding (true) -{ -} - -Path::~Path() -{ -} - -Path::Path (const Path& other) - : numElements (other.numElements), - bounds (other.bounds), - useNonZeroWinding (other.useNonZeroWinding) -{ - if (numElements > 0) - { - data.setAllocatedSize ((int) numElements); - memcpy (data.elements, other.data.elements, numElements * sizeof (float)); - } -} - -Path& Path::operator= (const Path& other) -{ - if (this != &other) - { - data.ensureAllocatedSize ((int) other.numElements); - - numElements = other.numElements; - bounds = other.bounds; - useNonZeroWinding = other.useNonZeroWinding; - - if (numElements > 0) - memcpy (data.elements, other.data.elements, numElements * sizeof (float)); - } - - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -Path::Path (Path&& other) noexcept - : data (static_cast &&> (other.data)), - numElements (other.numElements), - bounds (other.bounds), - useNonZeroWinding (other.useNonZeroWinding) -{ -} - -Path& Path::operator= (Path&& other) noexcept -{ - data = static_cast &&> (other.data); - numElements = other.numElements; - bounds = other.bounds; - useNonZeroWinding = other.useNonZeroWinding; - return *this; -} -#endif - -bool Path::operator== (const Path& other) const noexcept -{ - return ! operator!= (other); -} - -bool Path::operator!= (const Path& other) const noexcept -{ - if (numElements != other.numElements || useNonZeroWinding != other.useNonZeroWinding) - return true; - - for (size_t i = 0; i < numElements; ++i) - if (data.elements[i] != other.data.elements[i]) - return true; - - return false; -} - -void Path::clear() noexcept -{ - numElements = 0; - bounds.reset(); -} - -void Path::swapWithPath (Path& other) noexcept -{ - data.swapWith (other.data); - std::swap (numElements, other.numElements); - std::swap (bounds.pathXMin, other.bounds.pathXMin); - std::swap (bounds.pathXMax, other.bounds.pathXMax); - std::swap (bounds.pathYMin, other.bounds.pathYMin); - std::swap (bounds.pathYMax, other.bounds.pathYMax); - std::swap (useNonZeroWinding, other.useNonZeroWinding); -} - -//============================================================================== -void Path::setUsingNonZeroWinding (const bool isNonZero) noexcept -{ - useNonZeroWinding = isNonZero; -} - -void Path::scaleToFit (const float x, const float y, const float w, const float h, - const bool preserveProportions) noexcept -{ - applyTransform (getTransformToScaleToFit (x, y, w, h, preserveProportions)); -} - -//============================================================================== -bool Path::isEmpty() const noexcept -{ - size_t i = 0; - - while (i < numElements) - { - const float type = data.elements [i++]; - - if (type == moveMarker) - { - i += 2; - } - else if (type == lineMarker - || type == quadMarker - || type == cubicMarker) - { - return false; - } - } - - return true; -} - -Rectangle Path::getBounds() const noexcept -{ - return bounds.getRectangle(); -} - -Rectangle Path::getBoundsTransformed (const AffineTransform& transform) const noexcept -{ - return getBounds().transformedBy (transform); -} - -//============================================================================== -void Path::preallocateSpace (int numExtraCoordsToMakeSpaceFor) -{ - data.ensureAllocatedSize ((int) numElements + numExtraCoordsToMakeSpaceFor); -} - -void Path::startNewSubPath (const float x, const float y) -{ - JUCE_CHECK_COORDS_ARE_VALID (x, y); - - if (numElements == 0) - bounds.reset (x, y); - else - bounds.extend (x, y); - - preallocateSpace (3); - - data.elements [numElements++] = moveMarker; - data.elements [numElements++] = x; - data.elements [numElements++] = y; -} - -void Path::startNewSubPath (const Point start) -{ - startNewSubPath (start.x, start.y); -} - -void Path::lineTo (const float x, const float y) -{ - JUCE_CHECK_COORDS_ARE_VALID (x, y); - - if (numElements == 0) - startNewSubPath (0, 0); - - preallocateSpace (3); - - data.elements [numElements++] = lineMarker; - data.elements [numElements++] = x; - data.elements [numElements++] = y; - - bounds.extend (x, y); -} - -void Path::lineTo (const Point end) -{ - lineTo (end.x, end.y); -} - -void Path::quadraticTo (const float x1, const float y1, - const float x2, const float y2) -{ - JUCE_CHECK_COORDS_ARE_VALID (x1, y1); - JUCE_CHECK_COORDS_ARE_VALID (x2, y2); - - if (numElements == 0) - startNewSubPath (0, 0); - - preallocateSpace (5); - - data.elements [numElements++] = quadMarker; - data.elements [numElements++] = x1; - data.elements [numElements++] = y1; - data.elements [numElements++] = x2; - data.elements [numElements++] = y2; - - bounds.extend (x1, y1, x2, y2); -} - -void Path::quadraticTo (const Point controlPoint, - const Point endPoint) -{ - quadraticTo (controlPoint.x, controlPoint.y, - endPoint.x, endPoint.y); -} - -void Path::cubicTo (const float x1, const float y1, - const float x2, const float y2, - const float x3, const float y3) -{ - JUCE_CHECK_COORDS_ARE_VALID (x1, y1); - JUCE_CHECK_COORDS_ARE_VALID (x2, y2); - JUCE_CHECK_COORDS_ARE_VALID (x3, y3); - - if (numElements == 0) - startNewSubPath (0, 0); - - preallocateSpace (7); - - data.elements [numElements++] = cubicMarker; - data.elements [numElements++] = x1; - data.elements [numElements++] = y1; - data.elements [numElements++] = x2; - data.elements [numElements++] = y2; - data.elements [numElements++] = x3; - data.elements [numElements++] = y3; - - bounds.extend (x1, y1, x2, y2); - bounds.extend (x3, y3); -} - -void Path::cubicTo (const Point controlPoint1, - const Point controlPoint2, - const Point endPoint) -{ - cubicTo (controlPoint1.x, controlPoint1.y, - controlPoint2.x, controlPoint2.y, - endPoint.x, endPoint.y); -} - -void Path::closeSubPath() -{ - if (numElements > 0 - && data.elements [numElements - 1] != closeSubPathMarker) - { - preallocateSpace (1); - data.elements [numElements++] = closeSubPathMarker; - } -} - -Point Path::getCurrentPosition() const -{ - int i = (int) numElements - 1; - - if (i > 0 && data.elements[i] == closeSubPathMarker) - { - while (i >= 0) - { - if (data.elements[i] == moveMarker) - { - i += 2; - break; - } - - --i; - } - } - - if (i > 0) - return Point (data.elements [i - 1], data.elements [i]); - - return Point(); -} - -void Path::addRectangle (const float x, const float y, - const float w, const float h) -{ - float x1 = x, y1 = y, x2 = x + w, y2 = y + h; - - if (w < 0) std::swap (x1, x2); - if (h < 0) std::swap (y1, y2); - - preallocateSpace (13); - - if (numElements == 0) - { - bounds.pathXMin = x1; - bounds.pathXMax = x2; - bounds.pathYMin = y1; - bounds.pathYMax = y2; - } - else - { - bounds.pathXMin = jmin (bounds.pathXMin, x1); - bounds.pathXMax = jmax (bounds.pathXMax, x2); - bounds.pathYMin = jmin (bounds.pathYMin, y1); - bounds.pathYMax = jmax (bounds.pathYMax, y2); - } - - data.elements [numElements++] = moveMarker; - data.elements [numElements++] = x1; - data.elements [numElements++] = y2; - data.elements [numElements++] = lineMarker; - data.elements [numElements++] = x1; - data.elements [numElements++] = y1; - data.elements [numElements++] = lineMarker; - data.elements [numElements++] = x2; - data.elements [numElements++] = y1; - data.elements [numElements++] = lineMarker; - data.elements [numElements++] = x2; - data.elements [numElements++] = y2; - data.elements [numElements++] = closeSubPathMarker; -} - -void Path::addRoundedRectangle (float x, float y, float w, float h, float csx, float csy) -{ - addRoundedRectangle (x, y, w, h, csx, csy, true, true, true, true); -} - -void Path::addRoundedRectangle (const float x, const float y, const float w, const float h, - float csx, float csy, - const bool curveTopLeft, const bool curveTopRight, - const bool curveBottomLeft, const bool curveBottomRight) -{ - csx = jmin (csx, w * 0.5f); - csy = jmin (csy, h * 0.5f); - const float cs45x = csx * 0.45f; - const float cs45y = csy * 0.45f; - const float x2 = x + w; - const float y2 = y + h; - - if (curveTopLeft) - { - startNewSubPath (x, y + csy); - cubicTo (x, y + cs45y, x + cs45x, y, x + csx, y); - } - else - { - startNewSubPath (x, y); - } - - if (curveTopRight) - { - lineTo (x2 - csx, y); - cubicTo (x2 - cs45x, y, x2, y + cs45y, x2, y + csy); - } - else - { - lineTo (x2, y); - } - - if (curveBottomRight) - { - lineTo (x2, y2 - csy); - cubicTo (x2, y2 - cs45y, x2 - cs45x, y2, x2 - csx, y2); - } - else - { - lineTo (x2, y2); - } - - if (curveBottomLeft) - { - lineTo (x + csx, y2); - cubicTo (x + cs45x, y2, x, y2 - cs45y, x, y2 - csy); - } - else - { - lineTo (x, y2); - } - - closeSubPath(); -} - -void Path::addRoundedRectangle (float x, float y, float w, float h, float cs) -{ - addRoundedRectangle (x, y, w, h, cs, cs); -} - -void Path::addTriangle (float x1, float y1, - float x2, float y2, - float x3, float y3) -{ - addTriangle (Point (x1, y1), - Point (x2, y2), - Point (x3, y3)); -} - -void Path::addTriangle (Point p1, Point p2, Point p3) -{ - startNewSubPath (p1); - lineTo (p2); - lineTo (p3); - closeSubPath(); -} - -void Path::addQuadrilateral (const float x1, const float y1, - const float x2, const float y2, - const float x3, const float y3, - const float x4, const float y4) -{ - startNewSubPath (x1, y1); - lineTo (x2, y2); - lineTo (x3, y3); - lineTo (x4, y4); - closeSubPath(); -} - -void Path::addEllipse (float x, float y, float w, float h) -{ - addEllipse (Rectangle (x, y, w, h)); -} - -void Path::addEllipse (Rectangle area) -{ - const float hw = area.getWidth() * 0.5f; - const float hw55 = hw * 0.55f; - const float hh = area.getHeight() * 0.5f; - const float hh55 = hh * 0.55f; - const float cx = area.getX() + hw; - const float cy = area.getY() + hh; - - startNewSubPath (cx, cy - hh); - cubicTo (cx + hw55, cy - hh, cx + hw, cy - hh55, cx + hw, cy); - cubicTo (cx + hw, cy + hh55, cx + hw55, cy + hh, cx, cy + hh); - cubicTo (cx - hw55, cy + hh, cx - hw, cy + hh55, cx - hw, cy); - cubicTo (cx - hw, cy - hh55, cx - hw55, cy - hh, cx, cy - hh); - closeSubPath(); -} - -void Path::addArc (const float x, const float y, - const float w, const float h, - const float fromRadians, - const float toRadians, - const bool startAsNewSubPath) -{ - const float radiusX = w / 2.0f; - const float radiusY = h / 2.0f; - - addCentredArc (x + radiusX, - y + radiusY, - radiusX, radiusY, - 0.0f, - fromRadians, toRadians, - startAsNewSubPath); -} - -void Path::addCentredArc (const float centreX, const float centreY, - const float radiusX, const float radiusY, - const float rotationOfEllipse, - const float fromRadians, - float toRadians, - const bool startAsNewSubPath) -{ - if (radiusX > 0.0f && radiusY > 0.0f) - { - const Point centre (centreX, centreY); - const AffineTransform rotation (AffineTransform::rotation (rotationOfEllipse, centreX, centreY)); - float angle = fromRadians; - - if (startAsNewSubPath) - startNewSubPath (centre.getPointOnCircumference (radiusX, radiusY, angle).transformedBy (rotation)); - - if (fromRadians < toRadians) - { - if (startAsNewSubPath) - angle += PathHelpers::ellipseAngularIncrement; - - while (angle < toRadians) - { - lineTo (centre.getPointOnCircumference (radiusX, radiusY, angle).transformedBy (rotation)); - angle += PathHelpers::ellipseAngularIncrement; - } - } - else - { - if (startAsNewSubPath) - angle -= PathHelpers::ellipseAngularIncrement; - - while (angle > toRadians) - { - lineTo (centre.getPointOnCircumference (radiusX, radiusY, angle).transformedBy (rotation)); - angle -= PathHelpers::ellipseAngularIncrement; - } - } - - lineTo (centre.getPointOnCircumference (radiusX, radiusY, toRadians).transformedBy (rotation)); - } -} - -void Path::addPieSegment (const float x, const float y, - const float width, const float height, - const float fromRadians, - const float toRadians, - const float innerCircleProportionalSize) -{ - float radiusX = width * 0.5f; - float radiusY = height * 0.5f; - const Point centre (x + radiusX, y + radiusY); - - startNewSubPath (centre.getPointOnCircumference (radiusX, radiusY, fromRadians)); - addArc (x, y, width, height, fromRadians, toRadians); - - if (std::abs (fromRadians - toRadians) > float_Pi * 1.999f) - { - closeSubPath(); - - if (innerCircleProportionalSize > 0) - { - radiusX *= innerCircleProportionalSize; - radiusY *= innerCircleProportionalSize; - - startNewSubPath (centre.getPointOnCircumference (radiusX, radiusY, toRadians)); - addArc (centre.x - radiusX, centre.y - radiusY, radiusX * 2.0f, radiusY * 2.0f, toRadians, fromRadians); - } - } - else - { - if (innerCircleProportionalSize > 0) - { - radiusX *= innerCircleProportionalSize; - radiusY *= innerCircleProportionalSize; - - addArc (centre.x - radiusX, centre.y - radiusY, radiusX * 2.0f, radiusY * 2.0f, toRadians, fromRadians); - } - else - { - lineTo (centre); - } - } - - closeSubPath(); -} - -//============================================================================== -void Path::addLineSegment (const Line& line, float lineThickness) -{ - const Line reversed (line.reversed()); - lineThickness *= 0.5f; - - startNewSubPath (line.getPointAlongLine (0, lineThickness)); - lineTo (line.getPointAlongLine (0, -lineThickness)); - lineTo (reversed.getPointAlongLine (0, lineThickness)); - lineTo (reversed.getPointAlongLine (0, -lineThickness)); - closeSubPath(); -} - -void Path::addArrow (const Line& line, float lineThickness, - float arrowheadWidth, float arrowheadLength) -{ - const Line reversed (line.reversed()); - lineThickness *= 0.5f; - arrowheadWidth *= 0.5f; - arrowheadLength = jmin (arrowheadLength, 0.8f * line.getLength()); - - startNewSubPath (line.getPointAlongLine (0, lineThickness)); - lineTo (line.getPointAlongLine (0, -lineThickness)); - lineTo (reversed.getPointAlongLine (arrowheadLength, lineThickness)); - lineTo (reversed.getPointAlongLine (arrowheadLength, arrowheadWidth)); - lineTo (line.getEnd()); - lineTo (reversed.getPointAlongLine (arrowheadLength, -arrowheadWidth)); - lineTo (reversed.getPointAlongLine (arrowheadLength, -lineThickness)); - closeSubPath(); -} - -void Path::addPolygon (const Point centre, const int numberOfSides, - const float radius, const float startAngle) -{ - jassert (numberOfSides > 1); // this would be silly. - - if (numberOfSides > 1) - { - const float angleBetweenPoints = float_Pi * 2.0f / numberOfSides; - - for (int i = 0; i < numberOfSides; ++i) - { - const float angle = startAngle + i * angleBetweenPoints; - const Point p (centre.getPointOnCircumference (radius, angle)); - - if (i == 0) - startNewSubPath (p); - else - lineTo (p); - } - - closeSubPath(); - } -} - -void Path::addStar (const Point centre, const int numberOfPoints, - const float innerRadius, const float outerRadius, const float startAngle) -{ - jassert (numberOfPoints > 1); // this would be silly. - - if (numberOfPoints > 1) - { - const float angleBetweenPoints = float_Pi * 2.0f / numberOfPoints; - - for (int i = 0; i < numberOfPoints; ++i) - { - const float angle = startAngle + i * angleBetweenPoints; - const Point p (centre.getPointOnCircumference (outerRadius, angle)); - - if (i == 0) - startNewSubPath (p); - else - lineTo (p); - - lineTo (centre.getPointOnCircumference (innerRadius, angle + angleBetweenPoints * 0.5f)); - } - - closeSubPath(); - } -} - -void Path::addBubble (const Rectangle& bodyArea, - const Rectangle& maximumArea, - const Point arrowTip, - const float cornerSize, - const float arrowBaseWidth) -{ - const float halfW = bodyArea.getWidth() / 2.0f; - const float halfH = bodyArea.getHeight() / 2.0f; - const float cornerSizeW = jmin (cornerSize, halfW); - const float cornerSizeH = jmin (cornerSize, halfH); - const float cornerSizeW2 = 2.0f * cornerSizeW; - const float cornerSizeH2 = 2.0f * cornerSizeH; - - startNewSubPath (bodyArea.getX() + cornerSizeW, bodyArea.getY()); - - const Rectangle targetLimit (bodyArea.reduced (jmin (halfW - 1.0f, cornerSizeW + arrowBaseWidth), - jmin (halfH - 1.0f, cornerSizeH + arrowBaseWidth))); - - if (Rectangle (targetLimit.getX(), maximumArea.getY(), - targetLimit.getWidth(), bodyArea.getY() - maximumArea.getY()).contains (arrowTip)) - { - lineTo (arrowTip.x - arrowBaseWidth, bodyArea.getY()); - lineTo (arrowTip.x, arrowTip.y); - lineTo (arrowTip.x + arrowBaseWidth, bodyArea.getY()); - } - - lineTo (bodyArea.getRight() - cornerSizeW, bodyArea.getY()); - addArc (bodyArea.getRight() - cornerSizeW2, bodyArea.getY(), cornerSizeW2, cornerSizeH2, 0, float_Pi * 0.5f); - - if (Rectangle (bodyArea.getRight(), targetLimit.getY(), - maximumArea.getRight() - bodyArea.getRight(), targetLimit.getHeight()).contains (arrowTip)) - { - lineTo (bodyArea.getRight(), arrowTip.y - arrowBaseWidth); - lineTo (arrowTip.x, arrowTip.y); - lineTo (bodyArea.getRight(), arrowTip.y + arrowBaseWidth); - } - - lineTo (bodyArea.getRight(), bodyArea.getBottom() - cornerSizeH); - addArc (bodyArea.getRight() - cornerSizeW2, bodyArea.getBottom() - cornerSizeH2, cornerSizeW2, cornerSizeH2, float_Pi * 0.5f, float_Pi); - - if (Rectangle (targetLimit.getX(), bodyArea.getBottom(), - targetLimit.getWidth(), maximumArea.getBottom() - bodyArea.getBottom()).contains (arrowTip)) - { - lineTo (arrowTip.x + arrowBaseWidth, bodyArea.getBottom()); - lineTo (arrowTip.x, arrowTip.y); - lineTo (arrowTip.x - arrowBaseWidth, bodyArea.getBottom()); - } - - lineTo (bodyArea.getX() + cornerSizeW, bodyArea.getBottom()); - addArc (bodyArea.getX(), bodyArea.getBottom() - cornerSizeH2, cornerSizeW2, cornerSizeH2, float_Pi, float_Pi * 1.5f); - - if (Rectangle (maximumArea.getX(), targetLimit.getY(), - bodyArea.getX() - maximumArea.getX(), targetLimit.getHeight()).contains (arrowTip)) - { - lineTo (bodyArea.getX(), arrowTip.y + arrowBaseWidth); - lineTo (arrowTip.x, arrowTip.y); - lineTo (bodyArea.getX(), arrowTip.y - arrowBaseWidth); - } - - lineTo (bodyArea.getX(), bodyArea.getY() + cornerSizeH); - addArc (bodyArea.getX(), bodyArea.getY(), cornerSizeW2, cornerSizeH2, float_Pi * 1.5f, float_Pi * 2.0f - 0.05f); - - closeSubPath(); -} - -void Path::addPath (const Path& other) -{ - size_t i = 0; - const float* const d = other.data.elements; - - while (i < other.numElements) - { - const float type = d[i++]; - - if (type == moveMarker) - { - startNewSubPath (d[i], d[i + 1]); - i += 2; - } - else if (type == lineMarker) - { - lineTo (d[i], d[i + 1]); - i += 2; - } - else if (type == quadMarker) - { - quadraticTo (d[i], d[i + 1], d[i + 2], d[i + 3]); - i += 4; - } - else if (type == cubicMarker) - { - cubicTo (d[i], d[i + 1], d[i + 2], d[i + 3], d[i + 4], d[i + 5]); - i += 6; - } - else if (type == closeSubPathMarker) - { - closeSubPath(); - } - else - { - // something's gone wrong with the element list! - jassertfalse; - } - } -} - -void Path::addPath (const Path& other, - const AffineTransform& transformToApply) -{ - size_t i = 0; - const float* const d = other.data.elements; - - while (i < other.numElements) - { - const float type = d [i++]; - - if (type == closeSubPathMarker) - { - closeSubPath(); - } - else - { - float x = d[i++]; - float y = d[i++]; - transformToApply.transformPoint (x, y); - - if (type == moveMarker) - { - startNewSubPath (x, y); - } - else if (type == lineMarker) - { - lineTo (x, y); - } - else if (type == quadMarker) - { - float x2 = d [i++]; - float y2 = d [i++]; - transformToApply.transformPoint (x2, y2); - - quadraticTo (x, y, x2, y2); - } - else if (type == cubicMarker) - { - float x2 = d [i++]; - float y2 = d [i++]; - float x3 = d [i++]; - float y3 = d [i++]; - transformToApply.transformPoints (x2, y2, x3, y3); - - cubicTo (x, y, x2, y2, x3, y3); - } - else - { - // something's gone wrong with the element list! - jassertfalse; - } - } - } -} - -//============================================================================== -void Path::applyTransform (const AffineTransform& transform) noexcept -{ - bounds.reset(); - bool firstPoint = true; - float* d = data.elements; - float* const end = d + numElements; - - while (d < end) - { - const float type = *d++; - - if (type == moveMarker) - { - transform.transformPoint (d[0], d[1]); - - if (firstPoint) - { - firstPoint = false; - bounds.reset (d[0], d[1]); - } - else - { - bounds.extend (d[0], d[1]); - } - - d += 2; - } - else if (type == lineMarker) - { - transform.transformPoint (d[0], d[1]); - bounds.extend (d[0], d[1]); - d += 2; - } - else if (type == quadMarker) - { - transform.transformPoints (d[0], d[1], d[2], d[3]); - bounds.extend (d[0], d[1], d[2], d[3]); - d += 4; - } - else if (type == cubicMarker) - { - transform.transformPoints (d[0], d[1], d[2], d[3], d[4], d[5]); - bounds.extend (d[0], d[1], d[2], d[3]); - bounds.extend (d[4], d[5]); - d += 6; - } - } -} - - -//============================================================================== -AffineTransform Path::getTransformToScaleToFit (const Rectangle& area, - bool preserveProportions, Justification justification) const -{ - return getTransformToScaleToFit (area.getX(), area.getY(), area.getWidth(), area.getHeight(), - preserveProportions, justification); -} - -AffineTransform Path::getTransformToScaleToFit (const float x, const float y, - const float w, const float h, - const bool preserveProportions, - Justification justification) const -{ - Rectangle boundsRect (getBounds()); - - if (preserveProportions) - { - if (w <= 0 || h <= 0 || boundsRect.isEmpty()) - return AffineTransform::identity; - - float newW, newH; - const float srcRatio = boundsRect.getHeight() / boundsRect.getWidth(); - - if (srcRatio > h / w) - { - newW = h / srcRatio; - newH = h; - } - else - { - newW = w; - newH = w * srcRatio; - } - - float newXCentre = x; - float newYCentre = y; - - if (justification.testFlags (Justification::left)) newXCentre += newW * 0.5f; - else if (justification.testFlags (Justification::right)) newXCentre += w - newW * 0.5f; - else newXCentre += w * 0.5f; - - if (justification.testFlags (Justification::top)) newYCentre += newH * 0.5f; - else if (justification.testFlags (Justification::bottom)) newYCentre += h - newH * 0.5f; - else newYCentre += h * 0.5f; - - return AffineTransform::translation (boundsRect.getWidth() * -0.5f - boundsRect.getX(), - boundsRect.getHeight() * -0.5f - boundsRect.getY()) - .scaled (newW / boundsRect.getWidth(), - newH / boundsRect.getHeight()) - .translated (newXCentre, newYCentre); - } - else - { - return AffineTransform::translation (-boundsRect.getX(), -boundsRect.getY()) - .scaled (w / boundsRect.getWidth(), - h / boundsRect.getHeight()) - .translated (x, y); - } -} - -//============================================================================== -bool Path::contains (const float x, const float y, const float tolerance) const -{ - if (x <= bounds.pathXMin || x >= bounds.pathXMax - || y <= bounds.pathYMin || y >= bounds.pathYMax) - return false; - - PathFlatteningIterator i (*this, AffineTransform::identity, tolerance); - - int positiveCrossings = 0; - int negativeCrossings = 0; - - while (i.next()) - { - if ((i.y1 <= y && i.y2 > y) || (i.y2 <= y && i.y1 > y)) - { - const float intersectX = i.x1 + (i.x2 - i.x1) * (y - i.y1) / (i.y2 - i.y1); - - if (intersectX <= x) - { - if (i.y1 < i.y2) - ++positiveCrossings; - else - ++negativeCrossings; - } - } - } - - return useNonZeroWinding ? (negativeCrossings != positiveCrossings) - : ((negativeCrossings + positiveCrossings) & 1) != 0; -} - -bool Path::contains (const Point point, const float tolerance) const -{ - return contains (point.x, point.y, tolerance); -} - -bool Path::intersectsLine (const Line& line, const float tolerance) -{ - PathFlatteningIterator i (*this, AffineTransform::identity, tolerance); - Point intersection; - - while (i.next()) - if (line.intersects (Line (i.x1, i.y1, i.x2, i.y2), intersection)) - return true; - - return false; -} - -Line Path::getClippedLine (const Line& line, const bool keepSectionOutsidePath) const -{ - Line result (line); - const bool startInside = contains (line.getStart()); - const bool endInside = contains (line.getEnd()); - - if (startInside == endInside) - { - if (keepSectionOutsidePath == startInside) - result = Line(); - } - else - { - PathFlatteningIterator i (*this, AffineTransform::identity); - Point intersection; - - while (i.next()) - { - if (line.intersects (Line (i.x1, i.y1, i.x2, i.y2), intersection)) - { - if ((startInside && keepSectionOutsidePath) || (endInside && ! keepSectionOutsidePath)) - result.setStart (intersection); - else - result.setEnd (intersection); - } - } - } - - return result; -} - -float Path::getLength (const AffineTransform& transform) const -{ - float length = 0; - PathFlatteningIterator i (*this, transform); - - while (i.next()) - length += Line (i.x1, i.y1, i.x2, i.y2).getLength(); - - return length; -} - -Point Path::getPointAlongPath (float distanceFromStart, const AffineTransform& transform) const -{ - PathFlatteningIterator i (*this, transform); - - while (i.next()) - { - const Line line (i.x1, i.y1, i.x2, i.y2); - const float lineLength = line.getLength(); - - if (distanceFromStart <= lineLength) - return line.getPointAlongLine (distanceFromStart); - - distanceFromStart -= lineLength; - } - - return Point (i.x2, i.y2); -} - -float Path::getNearestPoint (const Point targetPoint, Point& pointOnPath, - const AffineTransform& transform) const -{ - PathFlatteningIterator i (*this, transform); - float bestPosition = 0, bestDistance = std::numeric_limits::max(); - float length = 0; - Point pointOnLine; - - while (i.next()) - { - const Line line (i.x1, i.y1, i.x2, i.y2); - const float distance = line.getDistanceFromPoint (targetPoint, pointOnLine); - - if (distance < bestDistance) - { - bestDistance = distance; - bestPosition = length + pointOnLine.getDistanceFrom (line.getStart()); - pointOnPath = pointOnLine; - } - - length += line.getLength(); - } - - return bestPosition; -} - -//============================================================================== -Path Path::createPathWithRoundedCorners (const float cornerRadius) const -{ - if (cornerRadius <= 0.01f) - return *this; - - size_t indexOfPathStart = 0, indexOfPathStartThis = 0; - size_t n = 0; - bool lastWasLine = false, firstWasLine = false; - Path p; - - while (n < numElements) - { - const float type = data.elements [n++]; - - if (type == moveMarker) - { - indexOfPathStart = p.numElements; - indexOfPathStartThis = n - 1; - const float x = data.elements [n++]; - const float y = data.elements [n++]; - p.startNewSubPath (x, y); - lastWasLine = false; - firstWasLine = (data.elements [n] == lineMarker); - } - else if (type == lineMarker || type == closeSubPathMarker) - { - float startX = 0, startY = 0, joinX = 0, joinY = 0, endX, endY; - - if (type == lineMarker) - { - endX = data.elements [n++]; - endY = data.elements [n++]; - - if (n > 8) - { - startX = data.elements [n - 8]; - startY = data.elements [n - 7]; - joinX = data.elements [n - 5]; - joinY = data.elements [n - 4]; - } - } - else - { - endX = data.elements [indexOfPathStartThis + 1]; - endY = data.elements [indexOfPathStartThis + 2]; - - if (n > 6) - { - startX = data.elements [n - 6]; - startY = data.elements [n - 5]; - joinX = data.elements [n - 3]; - joinY = data.elements [n - 2]; - } - } - - if (lastWasLine) - { - const double len1 = PathHelpers::lengthOf (startX, startY, joinX, joinY); - - if (len1 > 0) - { - const double propNeeded = jmin (0.5, cornerRadius / len1); - - p.data.elements [p.numElements - 2] = (float) (joinX - (joinX - startX) * propNeeded); - p.data.elements [p.numElements - 1] = (float) (joinY - (joinY - startY) * propNeeded); - } - - const double len2 = PathHelpers::lengthOf (endX, endY, joinX, joinY); - - if (len2 > 0) - { - const double propNeeded = jmin (0.5, cornerRadius / len2); - - p.quadraticTo (joinX, joinY, - (float) (joinX + (endX - joinX) * propNeeded), - (float) (joinY + (endY - joinY) * propNeeded)); - } - - p.lineTo (endX, endY); - } - else if (type == lineMarker) - { - p.lineTo (endX, endY); - lastWasLine = true; - } - - if (type == closeSubPathMarker) - { - if (firstWasLine) - { - startX = data.elements [n - 3]; - startY = data.elements [n - 2]; - joinX = endX; - joinY = endY; - endX = data.elements [indexOfPathStartThis + 4]; - endY = data.elements [indexOfPathStartThis + 5]; - - const double len1 = PathHelpers::lengthOf (startX, startY, joinX, joinY); - - if (len1 > 0) - { - const double propNeeded = jmin (0.5, cornerRadius / len1); - - p.data.elements [p.numElements - 2] = (float) (joinX - (joinX - startX) * propNeeded); - p.data.elements [p.numElements - 1] = (float) (joinY - (joinY - startY) * propNeeded); - } - - const double len2 = PathHelpers::lengthOf (endX, endY, joinX, joinY); - - if (len2 > 0) - { - const double propNeeded = jmin (0.5, cornerRadius / len2); - - endX = (float) (joinX + (endX - joinX) * propNeeded); - endY = (float) (joinY + (endY - joinY) * propNeeded); - - p.quadraticTo (joinX, joinY, endX, endY); - - p.data.elements [indexOfPathStart + 1] = endX; - p.data.elements [indexOfPathStart + 2] = endY; - } - } - - p.closeSubPath(); - } - } - else if (type == quadMarker) - { - lastWasLine = false; - const float x1 = data.elements [n++]; - const float y1 = data.elements [n++]; - const float x2 = data.elements [n++]; - const float y2 = data.elements [n++]; - p.quadraticTo (x1, y1, x2, y2); - } - else if (type == cubicMarker) - { - lastWasLine = false; - const float x1 = data.elements [n++]; - const float y1 = data.elements [n++]; - const float x2 = data.elements [n++]; - const float y2 = data.elements [n++]; - const float x3 = data.elements [n++]; - const float y3 = data.elements [n++]; - p.cubicTo (x1, y1, x2, y2, x3, y3); - } - } - - return p; -} - -//============================================================================== -void Path::loadPathFromStream (InputStream& source) -{ - while (! source.isExhausted()) - { - switch (source.readByte()) - { - case 'm': - { - const float x = source.readFloat(); - const float y = source.readFloat(); - startNewSubPath (x, y); - break; - } - - case 'l': - { - const float x = source.readFloat(); - const float y = source.readFloat(); - lineTo (x, y); - break; - } - - case 'q': - { - const float x1 = source.readFloat(); - const float y1 = source.readFloat(); - const float x2 = source.readFloat(); - const float y2 = source.readFloat(); - quadraticTo (x1, y1, x2, y2); - break; - } - - case 'b': - { - const float x1 = source.readFloat(); - const float y1 = source.readFloat(); - const float x2 = source.readFloat(); - const float y2 = source.readFloat(); - const float x3 = source.readFloat(); - const float y3 = source.readFloat(); - cubicTo (x1, y1, x2, y2, x3, y3); - break; - } - - case 'c': - closeSubPath(); - break; - - case 'n': - useNonZeroWinding = true; - break; - - case 'z': - useNonZeroWinding = false; - break; - - case 'e': - return; // end of path marker - - default: - jassertfalse; // illegal char in the stream - break; - } - } -} - -void Path::loadPathFromData (const void* const pathData, const size_t numberOfBytes) -{ - MemoryInputStream in (pathData, numberOfBytes, false); - loadPathFromStream (in); -} - -void Path::writePathToStream (OutputStream& dest) const -{ - dest.writeByte (useNonZeroWinding ? 'n' : 'z'); - - size_t i = 0; - while (i < numElements) - { - const float type = data.elements [i++]; - - if (type == moveMarker) - { - dest.writeByte ('m'); - dest.writeFloat (data.elements [i++]); - dest.writeFloat (data.elements [i++]); - } - else if (type == lineMarker) - { - dest.writeByte ('l'); - dest.writeFloat (data.elements [i++]); - dest.writeFloat (data.elements [i++]); - } - else if (type == quadMarker) - { - dest.writeByte ('q'); - dest.writeFloat (data.elements [i++]); - dest.writeFloat (data.elements [i++]); - dest.writeFloat (data.elements [i++]); - dest.writeFloat (data.elements [i++]); - } - else if (type == cubicMarker) - { - dest.writeByte ('b'); - dest.writeFloat (data.elements [i++]); - dest.writeFloat (data.elements [i++]); - dest.writeFloat (data.elements [i++]); - dest.writeFloat (data.elements [i++]); - dest.writeFloat (data.elements [i++]); - dest.writeFloat (data.elements [i++]); - } - else if (type == closeSubPathMarker) - { - dest.writeByte ('c'); - } - } - - dest.writeByte ('e'); // marks the end-of-path -} - -String Path::toString() const -{ - MemoryOutputStream s (2048); - if (! useNonZeroWinding) - s << 'a'; - - size_t i = 0; - float lastMarker = 0.0f; - - while (i < numElements) - { - const float marker = data.elements [i++]; - char markerChar = 0; - int numCoords = 0; - - if (marker == moveMarker) - { - markerChar = 'm'; - numCoords = 2; - } - else if (marker == lineMarker) - { - markerChar = 'l'; - numCoords = 2; - } - else if (marker == quadMarker) - { - markerChar = 'q'; - numCoords = 4; - } - else if (marker == cubicMarker) - { - markerChar = 'c'; - numCoords = 6; - } - else - { - jassert (marker == closeSubPathMarker); - markerChar = 'z'; - } - - if (marker != lastMarker) - { - if (s.getDataSize() != 0) - s << ' '; - - s << markerChar; - lastMarker = marker; - } - - while (--numCoords >= 0 && i < numElements) - { - String coord (data.elements [i++], 3); - - while (coord.endsWithChar ('0') && coord != "0") - coord = coord.dropLastCharacters (1); - - if (coord.endsWithChar ('.')) - coord = coord.dropLastCharacters (1); - - if (s.getDataSize() != 0) - s << ' '; - - s << coord; - } - } - - return s.toUTF8(); -} - -void Path::restoreFromString (StringRef stringVersion) -{ - clear(); - setUsingNonZeroWinding (true); - - String::CharPointerType t (stringVersion.text); - juce_wchar marker = 'm'; - int numValues = 2; - float values [6]; - - for (;;) - { - const String token (PathHelpers::nextToken (t)); - const juce_wchar firstChar = token[0]; - int startNum = 0; - - if (firstChar == 0) - break; - - if (firstChar == 'm' || firstChar == 'l') - { - marker = firstChar; - numValues = 2; - } - else if (firstChar == 'q') - { - marker = firstChar; - numValues = 4; - } - else if (firstChar == 'c') - { - marker = firstChar; - numValues = 6; - } - else if (firstChar == 'z') - { - marker = firstChar; - numValues = 0; - } - else if (firstChar == 'a') - { - setUsingNonZeroWinding (false); - continue; - } - else - { - ++startNum; - values [0] = token.getFloatValue(); - } - - for (int i = startNum; i < numValues; ++i) - values [i] = PathHelpers::nextToken (t).getFloatValue(); - - switch (marker) - { - case 'm': startNewSubPath (values[0], values[1]); break; - case 'l': lineTo (values[0], values[1]); break; - case 'q': quadraticTo (values[0], values[1], values[2], values[3]); break; - case 'c': cubicTo (values[0], values[1], values[2], values[3], values[4], values[5]); break; - case 'z': closeSubPath(); break; - default: jassertfalse; break; // illegal string format? - } - } -} - -//============================================================================== -Path::Iterator::Iterator (const Path& path_) - : path (path_), - index (0) -{ -} - -Path::Iterator::~Iterator() -{ -} - -bool Path::Iterator::next() -{ - const float* const elements = path.data.elements; - - if (index < path.numElements) - { - const float type = elements [index++]; - - if (type == moveMarker) - { - elementType = startNewSubPath; - x1 = elements [index++]; - y1 = elements [index++]; - } - else if (type == lineMarker) - { - elementType = lineTo; - x1 = elements [index++]; - y1 = elements [index++]; - } - else if (type == quadMarker) - { - elementType = quadraticTo; - x1 = elements [index++]; - y1 = elements [index++]; - x2 = elements [index++]; - y2 = elements [index++]; - } - else if (type == cubicMarker) - { - elementType = cubicTo; - x1 = elements [index++]; - y1 = elements [index++]; - x2 = elements [index++]; - y2 = elements [index++]; - x3 = elements [index++]; - y3 = elements [index++]; - } - else if (type == closeSubPathMarker) - { - elementType = closePath; - } - - return true; - } - - return false; -} - -#undef JUCE_CHECK_COORDS_ARE_VALID diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h deleted file mode 100755 index c680089..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Path.h +++ /dev/null @@ -1,804 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_PATH_H_INCLUDED -#define JUCE_PATH_H_INCLUDED - - -//============================================================================== -/** - A path is a sequence of lines and curves that may either form a closed shape - or be open-ended. - - To use a path, you can create an empty one, then add lines and curves to it - to create shapes, then it can be rendered by a Graphics context or used - for geometric operations. - - e.g. @code - Path myPath; - - myPath.startNewSubPath (10.0f, 10.0f); // move the current position to (10, 10) - myPath.lineTo (100.0f, 200.0f); // draw a line from here to (100, 200) - myPath.quadraticTo (0.0f, 150.0f, 5.0f, 50.0f); // draw a curve that ends at (5, 50) - myPath.closeSubPath(); // close the subpath with a line back to (10, 10) - - // add an ellipse as well, which will form a second sub-path within the path.. - myPath.addEllipse (50.0f, 50.0f, 40.0f, 30.0f); - - // double the width of the whole thing.. - myPath.applyTransform (AffineTransform::scale (2.0f, 1.0f)); - - // and draw it to a graphics context with a 5-pixel thick outline. - g.strokePath (myPath, PathStrokeType (5.0f)); - - @endcode - - A path object can actually contain multiple sub-paths, which may themselves - be open or closed. - - @see PathFlatteningIterator, PathStrokeType, Graphics -*/ -class JUCE_API Path -{ -public: - //============================================================================== - /** Creates an empty path. */ - Path(); - - /** Creates a copy of another path. */ - Path (const Path&); - - /** Destructor. */ - ~Path(); - - /** Copies this path from another one. */ - Path& operator= (const Path&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Path (Path&&) noexcept; - Path& operator= (Path&&) noexcept; - #endif - - bool operator== (const Path&) const noexcept; - bool operator!= (const Path&) const noexcept; - - //============================================================================== - /** Returns true if the path doesn't contain any lines or curves. */ - bool isEmpty() const noexcept; - - /** Returns the smallest rectangle that contains all points within the path. - */ - Rectangle getBounds() const noexcept; - - /** Returns the smallest rectangle that contains all points within the path - after it's been transformed with the given tranasform matrix. - */ - Rectangle getBoundsTransformed (const AffineTransform& transform) const noexcept; - - /** Checks whether a point lies within the path. - - This is only relevent for closed paths (see closeSubPath()), and - may produce false results if used on a path which has open sub-paths. - - The path's winding rule is taken into account by this method. - - The tolerance parameter is the maximum error allowed when flattening the path, - so this method could return a false positive when your point is up to this distance - outside the path's boundary. - - @see closeSubPath, setUsingNonZeroWinding - */ - bool contains (float x, float y, - float tolerance = 1.0f) const; - - /** Checks whether a point lies within the path. - - This is only relevent for closed paths (see closeSubPath()), and - may produce false results if used on a path which has open sub-paths. - - The path's winding rule is taken into account by this method. - - The tolerance parameter is the maximum error allowed when flattening the path, - so this method could return a false positive when your point is up to this distance - outside the path's boundary. - - @see closeSubPath, setUsingNonZeroWinding - */ - bool contains (const Point point, - float tolerance = 1.0f) const; - - /** Checks whether a line crosses the path. - - This will return positive if the line crosses any of the paths constituent - lines or curves. It doesn't take into account whether the line is inside - or outside the path, or whether the path is open or closed. - - The tolerance parameter is the maximum error allowed when flattening the path, - so this method could return a false positive when your point is up to this distance - outside the path's boundary. - */ - bool intersectsLine (const Line& line, - float tolerance = 1.0f); - - /** Cuts off parts of a line to keep the parts that are either inside or - outside this path. - - Note that this isn't smart enough to cope with situations where the - line would need to be cut into multiple pieces to correctly clip against - a re-entrant shape. - - @param line the line to clip - @param keepSectionOutsidePath if true, it's the section outside the path - that will be kept; if false its the section inside - the path - */ - Line getClippedLine (const Line& line, bool keepSectionOutsidePath) const; - - /** Returns the length of the path. - @see getPointAlongPath - */ - float getLength (const AffineTransform& transform = AffineTransform::identity) const; - - /** Returns a point that is the specified distance along the path. - If the distance is greater than the total length of the path, this will return the - end point. - @see getLength - */ - Point getPointAlongPath (float distanceFromStart, - const AffineTransform& transform = AffineTransform::identity) const; - - /** Finds the point along the path which is nearest to a given position. - This sets pointOnPath to the nearest point, and returns the distance of this point from the start - of the path. - */ - float getNearestPoint (const Point targetPoint, - Point& pointOnPath, - const AffineTransform& transform = AffineTransform::identity) const; - - //============================================================================== - /** Removes all lines and curves, resetting the path completely. */ - void clear() noexcept; - - /** Begins a new subpath with a given starting position. - - This will move the path's current position to the coordinates passed in and - make it ready to draw lines or curves starting from this position. - - After adding whatever lines and curves are needed, you can either - close the current sub-path using closeSubPath() or call startNewSubPath() - to move to a new sub-path, leaving the old one open-ended. - - @see lineTo, quadraticTo, cubicTo, closeSubPath - */ - void startNewSubPath (float startX, float startY); - - /** Begins a new subpath with a given starting position. - - This will move the path's current position to the coordinates passed in and - make it ready to draw lines or curves starting from this position. - - After adding whatever lines and curves are needed, you can either - close the current sub-path using closeSubPath() or call startNewSubPath() - to move to a new sub-path, leaving the old one open-ended. - - @see lineTo, quadraticTo, cubicTo, closeSubPath - */ - void startNewSubPath (const Point start); - - /** Closes a the current sub-path with a line back to its start-point. - - When creating a closed shape such as a triangle, don't use 3 lineTo() - calls - instead use two lineTo() calls, followed by a closeSubPath() - to join the final point back to the start. - - This ensures that closes shapes are recognised as such, and this is - important for tasks like drawing strokes, which needs to know whether to - draw end-caps or not. - - @see startNewSubPath, lineTo, quadraticTo, cubicTo, closeSubPath - */ - void closeSubPath(); - - /** Adds a line from the shape's last position to a new end-point. - - This will connect the end-point of the last line or curve that was added - to a new point, using a straight line. - - See the class description for an example of how to add lines and curves to a path. - - @see startNewSubPath, quadraticTo, cubicTo, closeSubPath - */ - void lineTo (float endX, float endY); - - /** Adds a line from the shape's last position to a new end-point. - - This will connect the end-point of the last line or curve that was added - to a new point, using a straight line. - - See the class description for an example of how to add lines and curves to a path. - - @see startNewSubPath, quadraticTo, cubicTo, closeSubPath - */ - void lineTo (const Point end); - - /** Adds a quadratic bezier curve from the shape's last position to a new position. - - This will connect the end-point of the last line or curve that was added - to a new point, using a quadratic spline with one control-point. - - See the class description for an example of how to add lines and curves to a path. - - @see startNewSubPath, lineTo, cubicTo, closeSubPath - */ - void quadraticTo (float controlPointX, - float controlPointY, - float endPointX, - float endPointY); - - /** Adds a quadratic bezier curve from the shape's last position to a new position. - - This will connect the end-point of the last line or curve that was added - to a new point, using a quadratic spline with one control-point. - - See the class description for an example of how to add lines and curves to a path. - - @see startNewSubPath, lineTo, cubicTo, closeSubPath - */ - void quadraticTo (const Point controlPoint, - const Point endPoint); - - /** Adds a cubic bezier curve from the shape's last position to a new position. - - This will connect the end-point of the last line or curve that was added - to a new point, using a cubic spline with two control-points. - - See the class description for an example of how to add lines and curves to a path. - - @see startNewSubPath, lineTo, quadraticTo, closeSubPath - */ - void cubicTo (float controlPoint1X, - float controlPoint1Y, - float controlPoint2X, - float controlPoint2Y, - float endPointX, - float endPointY); - - /** Adds a cubic bezier curve from the shape's last position to a new position. - - This will connect the end-point of the last line or curve that was added - to a new point, using a cubic spline with two control-points. - - See the class description for an example of how to add lines and curves to a path. - - @see startNewSubPath, lineTo, quadraticTo, closeSubPath - */ - void cubicTo (const Point controlPoint1, - const Point controlPoint2, - const Point endPoint); - - /** Returns the last point that was added to the path by one of the drawing methods. - */ - Point getCurrentPosition() const; - - //============================================================================== - /** Adds a rectangle to the path. - The rectangle is added as a new sub-path. (Any currently open paths will be left open). - @see addRoundedRectangle, addTriangle - */ - void addRectangle (float x, float y, float width, float height); - - /** Adds a rectangle to the path. - The rectangle is added as a new sub-path. (Any currently open paths will be left open). - @see addRoundedRectangle, addTriangle - */ - template - void addRectangle (const Rectangle& rectangle) - { - addRectangle (static_cast (rectangle.getX()), static_cast (rectangle.getY()), - static_cast (rectangle.getWidth()), static_cast (rectangle.getHeight())); - } - - /** Adds a rectangle with rounded corners to the path. - The rectangle is added as a new sub-path. (Any currently open paths will be left open). - @see addRectangle, addTriangle - */ - void addRoundedRectangle (float x, float y, float width, float height, - float cornerSize); - - /** Adds a rectangle with rounded corners to the path. - The rectangle is added as a new sub-path. (Any currently open paths will be left open). - @see addRectangle, addTriangle - */ - void addRoundedRectangle (float x, float y, float width, float height, - float cornerSizeX, - float cornerSizeY); - - /** Adds a rectangle with rounded corners to the path. - The rectangle is added as a new sub-path. (Any currently open paths will be left open). - @see addRectangle, addTriangle - */ - void addRoundedRectangle (float x, float y, float width, float height, - float cornerSizeX, float cornerSizeY, - bool curveTopLeft, bool curveTopRight, - bool curveBottomLeft, bool curveBottomRight); - - /** Adds a rectangle with rounded corners to the path. - The rectangle is added as a new sub-path. (Any currently open paths will be left open). - @see addRectangle, addTriangle - */ - template - void addRoundedRectangle (const Rectangle& rectangle, float cornerSizeX, float cornerSizeY) - { - addRoundedRectangle (static_cast (rectangle.getX()), static_cast (rectangle.getY()), - static_cast (rectangle.getWidth()), static_cast (rectangle.getHeight()), - cornerSizeX, cornerSizeY); - } - - /** Adds a rectangle with rounded corners to the path. - The rectangle is added as a new sub-path. (Any currently open paths will be left open). - @see addRectangle, addTriangle - */ - template - void addRoundedRectangle (const Rectangle& rectangle, float cornerSize) - { - addRoundedRectangle (rectangle, cornerSize, cornerSize); - } - - /** Adds a triangle to the path. - - The triangle is added as a new closed sub-path. (Any currently open paths will be left open). - - Note that whether the vertices are specified in clockwise or anticlockwise - order will affect how the triangle is filled when it overlaps other - shapes (the winding order setting will affect this of course). - */ - void addTriangle (float x1, float y1, - float x2, float y2, - float x3, float y3); - - /** Adds a triangle to the path. - - The triangle is added as a new closed sub-path. (Any currently open paths will be left open). - - Note that whether the vertices are specified in clockwise or anticlockwise - order will affect how the triangle is filled when it overlaps other - shapes (the winding order setting will affect this of course). - */ - void addTriangle (Point point1, - Point point2, - Point point3); - - /** Adds a quadrilateral to the path. - - The quad is added as a new closed sub-path. (Any currently open paths will be left open). - - Note that whether the vertices are specified in clockwise or anticlockwise - order will affect how the quad is filled when it overlaps other - shapes (the winding order setting will affect this of course). - */ - void addQuadrilateral (float x1, float y1, - float x2, float y2, - float x3, float y3, - float x4, float y4); - - /** Adds an ellipse to the path. - The shape is added as a new sub-path. (Any currently open paths will be left open). - @see addArc - */ - void addEllipse (float x, float y, float width, float height); - - /** Adds an ellipse to the path. - The shape is added as a new sub-path. (Any currently open paths will be left open). - @see addArc - */ - void addEllipse (Rectangle area); - - /** Adds an elliptical arc to the current path. - - Note that when specifying the start and end angles, the curve will be drawn either clockwise - or anti-clockwise according to whether the end angle is greater than the start. This means - that sometimes you may need to use values greater than 2*Pi for the end angle. - - @param x the left-hand edge of the rectangle in which the elliptical outline fits - @param y the top edge of the rectangle in which the elliptical outline fits - @param width the width of the rectangle in which the elliptical outline fits - @param height the height of the rectangle in which the elliptical outline fits - @param fromRadians the angle (clockwise) in radians at which to start the arc segment (where 0 is the - top-centre of the ellipse) - @param toRadians the angle (clockwise) in radians at which to end the arc segment (where 0 is the - top-centre of the ellipse). This angle can be greater than 2*Pi, so for example to - draw a curve clockwise from the 9 o'clock position to the 3 o'clock position via - 12 o'clock, you'd use 1.5*Pi and 2.5*Pi as the start and finish points. - @param startAsNewSubPath if true, the arc will begin a new subpath from its starting point; if false, - it will be added to the current sub-path, continuing from the current postition - - @see addCentredArc, arcTo, addPieSegment, addEllipse - */ - void addArc (float x, float y, float width, float height, - float fromRadians, - float toRadians, - bool startAsNewSubPath = false); - - /** Adds an arc which is centred at a given point, and can have a rotation specified. - - Note that when specifying the start and end angles, the curve will be drawn either clockwise - or anti-clockwise according to whether the end angle is greater than the start. This means - that sometimes you may need to use values greater than 2*Pi for the end angle. - - @param centreX the centre x of the ellipse - @param centreY the centre y of the ellipse - @param radiusX the horizontal radius of the ellipse - @param radiusY the vertical radius of the ellipse - @param rotationOfEllipse an angle by which the whole ellipse should be rotated about its centre, in radians (clockwise) - @param fromRadians the angle (clockwise) in radians at which to start the arc segment (where 0 is the - top-centre of the ellipse) - @param toRadians the angle (clockwise) in radians at which to end the arc segment (where 0 is the - top-centre of the ellipse). This angle can be greater than 2*Pi, so for example to - draw a curve clockwise from the 9 o'clock position to the 3 o'clock position via - 12 o'clock, you'd use 1.5*Pi and 2.5*Pi as the start and finish points. - @param startAsNewSubPath if true, the arc will begin a new subpath from its starting point; if false, - it will be added to the current sub-path, continuing from the current postition - - @see addArc, arcTo - */ - void addCentredArc (float centreX, float centreY, - float radiusX, float radiusY, - float rotationOfEllipse, - float fromRadians, - float toRadians, - bool startAsNewSubPath = false); - - /** Adds a "pie-chart" shape to the path. - - The shape is added as a new sub-path. (Any currently open paths will be - left open). - - Note that when specifying the start and end angles, the curve will be drawn either clockwise - or anti-clockwise according to whether the end angle is greater than the start. This means - that sometimes you may need to use values greater than 2*Pi for the end angle. - - @param x the left-hand edge of the rectangle in which the elliptical outline fits - @param y the top edge of the rectangle in which the elliptical outline fits - @param width the width of the rectangle in which the elliptical outline fits - @param height the height of the rectangle in which the elliptical outline fits - @param fromRadians the angle (clockwise) in radians at which to start the arc segment (where 0 is the - top-centre of the ellipse) - @param toRadians the angle (clockwise) in radians at which to end the arc segment (where 0 is the - top-centre of the ellipse) - @param innerCircleProportionalSize if this is > 0, then the pie will be drawn as a curved band around a hollow - ellipse at its centre, where this value indicates the inner ellipse's size with - respect to the outer one. - - @see addArc - */ - void addPieSegment (float x, float y, - float width, float height, - float fromRadians, - float toRadians, - float innerCircleProportionalSize); - - /** Adds a line with a specified thickness. - - The line is added as a new closed sub-path. (Any currently open paths will be - left open). - - @see addArrow - */ - void addLineSegment (const Line& line, float lineThickness); - - /** Adds a line with an arrowhead on the end. - The arrow is added as a new closed sub-path. (Any currently open paths will be left open). - @see PathStrokeType::createStrokeWithArrowheads - */ - void addArrow (const Line& line, - float lineThickness, - float arrowheadWidth, - float arrowheadLength); - - /** Adds a polygon shape to the path. - @see addStar - */ - void addPolygon (const Point centre, - int numberOfSides, - float radius, - float startAngle = 0.0f); - - /** Adds a star shape to the path. - @see addPolygon - */ - void addStar (const Point centre, - int numberOfPoints, - float innerRadius, - float outerRadius, - float startAngle = 0.0f); - - /** Adds a speech-bubble shape to the path. - - @param bodyArea the area of the body of the bubble shape - @param maximumArea an area which encloses the body area and defines the limits within which - the arrow tip can be drawn - if the tip lies outside this area, the bubble - will be drawn without an arrow - @param arrowTipPosition the location of the tip of the arrow - @param cornerSize the size of the rounded corners - @param arrowBaseWidth the width of the base of the arrow where it joins the main rectangle - */ - void addBubble (const Rectangle& bodyArea, - const Rectangle& maximumArea, - const Point arrowTipPosition, - const float cornerSize, - const float arrowBaseWidth); - - /** Adds another path to this one. - - The new path is added as a new sub-path. (Any currently open paths in this - path will be left open). - - @param pathToAppend the path to add - */ - void addPath (const Path& pathToAppend); - - /** Adds another path to this one, transforming it on the way in. - - The new path is added as a new sub-path, its points being transformed by the given - matrix before being added. - - @param pathToAppend the path to add - @param transformToApply an optional transform to apply to the incoming vertices - */ - void addPath (const Path& pathToAppend, - const AffineTransform& transformToApply); - - /** Swaps the contents of this path with another one. - - The internal data of the two paths is swapped over, so this is much faster than - copying it to a temp variable and back. - */ - void swapWithPath (Path&) noexcept; - - //============================================================================== - /** Preallocates enough space for adding the given number of coordinates to the path. - If you're about to add a large number of lines or curves to the path, it can make - the task much more efficient to call this first and avoid costly reallocations - as the structure grows. - The actual value to pass is a bit tricky to calculate because the space required - depends on what you're adding - e.g. each lineTo() or startNewSubPath() will - require 3 coords (x, y and a type marker). Each quadraticTo() will need 5, and - a cubicTo() will require 7. Closing a sub-path will require 1. - */ - void preallocateSpace (int numExtraCoordsToMakeSpaceFor); - - //============================================================================== - /** Applies a 2D transform to all the vertices in the path. - - @see AffineTransform, scaleToFit, getTransformToScaleToFit - */ - void applyTransform (const AffineTransform& transform) noexcept; - - /** Rescales this path to make it fit neatly into a given space. - - This is effectively a quick way of calling - applyTransform (getTransformToScaleToFit (x, y, w, h, preserveProportions)) - - @param x the x position of the rectangle to fit the path inside - @param y the y position of the rectangle to fit the path inside - @param width the width of the rectangle to fit the path inside - @param height the height of the rectangle to fit the path inside - @param preserveProportions if true, it will fit the path into the space without altering its - horizontal/vertical scale ratio; if false, it will distort the - path to fill the specified ratio both horizontally and vertically - - @see applyTransform, getTransformToScaleToFit - */ - void scaleToFit (float x, float y, float width, float height, - bool preserveProportions) noexcept; - - /** Returns a transform that can be used to rescale the path to fit into a given space. - - @param x the x position of the rectangle to fit the path inside - @param y the y position of the rectangle to fit the path inside - @param width the width of the rectangle to fit the path inside - @param height the height of the rectangle to fit the path inside - @param preserveProportions if true, it will fit the path into the space without altering its - horizontal/vertical scale ratio; if false, it will distort the - path to fill the specified ratio both horizontally and vertically - @param justificationType if the proportions are preseved, the resultant path may be smaller - than the available rectangle, so this describes how it should be - positioned within the space. - @returns an appropriate transformation - - @see applyTransform, scaleToFit - - */ - AffineTransform getTransformToScaleToFit (float x, float y, float width, float height, - bool preserveProportions, - Justification justificationType = Justification::centred) const; - - /** Returns a transform that can be used to rescale the path to fit into a given space. - - @param area the rectangle to fit the path inside - @param preserveProportions if true, it will fit the path into the space without altering its - horizontal/vertical scale ratio; if false, it will distort the - path to fill the specified ratio both horizontally and vertically - @param justificationType if the proportions are preseved, the resultant path may be smaller - than the available rectangle, so this describes how it should be - positioned within the space. - @returns an appropriate transformation - - @see applyTransform, scaleToFit - - */ - AffineTransform getTransformToScaleToFit (const Rectangle& area, - bool preserveProportions, - Justification justificationType = Justification::centred) const; - - /** Creates a version of this path where all sharp corners have been replaced by curves. - - Wherever two lines meet at an angle, this will replace the corner with a curve - of the given radius. - */ - Path createPathWithRoundedCorners (float cornerRadius) const; - - //============================================================================== - /** Changes the winding-rule to be used when filling the path. - - If set to true (which is the default), then the path uses a non-zero-winding rule - to determine which points are inside the path. If set to false, it uses an - alternate-winding rule. - - The winding-rule comes into play when areas of the shape overlap other - areas, and determines whether the overlapping regions are considered to be - inside or outside. - - Changing this value just sets a flag - it doesn't affect the contents of the - path. - - @see isUsingNonZeroWinding - */ - void setUsingNonZeroWinding (bool isNonZeroWinding) noexcept; - - /** Returns the flag that indicates whether the path should use a non-zero winding rule. - - The default for a new path is true. - - @see setUsingNonZeroWinding - */ - bool isUsingNonZeroWinding() const { return useNonZeroWinding; } - - - //============================================================================== - /** Iterates the lines and curves that a path contains. - - @see Path, PathFlatteningIterator - */ - class JUCE_API Iterator - { - public: - //============================================================================== - Iterator (const Path& path); - ~Iterator(); - - //============================================================================== - /** Moves onto the next element in the path. - - If this returns false, there are no more elements. If it returns true, - the elementType variable will be set to the type of the current element, - and some of the x and y variables will be filled in with values. - */ - bool next(); - - //============================================================================== - enum PathElementType - { - startNewSubPath, /**< For this type, x1 and y1 will be set to indicate the first point in the subpath. */ - lineTo, /**< For this type, x1 and y1 indicate the end point of the line. */ - quadraticTo, /**< For this type, x1, y1, x2, y2 indicate the control point and endpoint of a quadratic curve. */ - cubicTo, /**< For this type, x1, y1, x2, y2, x3, y3 indicate the two control points and the endpoint of a cubic curve. */ - closePath /**< Indicates that the sub-path is being closed. None of the x or y values are valid in this case. */ - }; - - PathElementType elementType; - - float x1, y1, x2, y2, x3, y3; - - //============================================================================== - private: - const Path& path; - size_t index; - - JUCE_DECLARE_NON_COPYABLE (Iterator) - }; - - //============================================================================== - /** Loads a stored path from a data stream. - - The data in the stream must have been written using writePathToStream(). - - Note that this will append the stored path to whatever is currently in - this path, so you might need to call clear() beforehand. - - @see loadPathFromData, writePathToStream - */ - void loadPathFromStream (InputStream& source); - - /** Loads a stored path from a block of data. - - This is similar to loadPathFromStream(), but just reads from a block - of data. Useful if you're including stored shapes in your code as a - block of static data. - - @see loadPathFromStream, writePathToStream - */ - void loadPathFromData (const void* data, size_t numberOfBytes); - - /** Stores the path by writing it out to a stream. - - After writing out a path, you can reload it using loadPathFromStream(). - - @see loadPathFromStream, loadPathFromData - */ - void writePathToStream (OutputStream& destination) const; - - //============================================================================== - /** Creates a string containing a textual representation of this path. - @see restoreFromString - */ - String toString() const; - - /** Restores this path from a string that was created with the toString() method. - @see toString() - */ - void restoreFromString (StringRef stringVersion); - -private: - //============================================================================== - friend class PathFlatteningIterator; - friend class Path::Iterator; - ArrayAllocationBase data; - size_t numElements; - - struct PathBounds - { - PathBounds() noexcept; - Rectangle getRectangle() const noexcept; - void reset() noexcept; - void reset (float, float) noexcept; - void extend (float, float) noexcept; - void extend (float, float, float, float) noexcept; - - float pathXMin, pathXMax, pathYMin, pathYMax; - }; - - PathBounds bounds; - bool useNonZeroWinding; - - static const float lineMarker; - static const float moveMarker; - static const float quadMarker; - static const float cubicMarker; - static const float closeSubPathMarker; - - JUCE_LEAK_DETECTOR (Path) -}; - -#endif // JUCE_PATH_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp deleted file mode 100755 index 0a15581..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.cpp +++ /dev/null @@ -1,286 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_MSVC && JUCE_DEBUG - #pragma optimize ("t", on) -#endif - -const float PathFlatteningIterator::defaultTolerance = 0.6f; - -//============================================================================== -PathFlatteningIterator::PathFlatteningIterator (const Path& path_, - const AffineTransform& transform_, - const float tolerance) - : x2 (0), - y2 (0), - closesSubPath (false), - subPathIndex (-1), - path (path_), - transform (transform_), - points (path_.data.elements), - toleranceSquared (tolerance * tolerance), - subPathCloseX (0), - subPathCloseY (0), - isIdentityTransform (transform_.isIdentity()), - stackBase (32), - index (0), - stackSize (32) -{ - stackPos = stackBase; -} - -PathFlatteningIterator::~PathFlatteningIterator() -{ -} - -bool PathFlatteningIterator::isLastInSubpath() const noexcept -{ - return stackPos == stackBase.getData() - && (index >= path.numElements || points [index] == Path::moveMarker); -} - -bool PathFlatteningIterator::next() -{ - x1 = x2; - y1 = y2; - - float x3 = 0; - float y3 = 0; - float x4 = 0; - float y4 = 0; - - for (;;) - { - float type; - - if (stackPos == stackBase) - { - if (index >= path.numElements) - return false; - - type = points [index++]; - - if (type != Path::closeSubPathMarker) - { - x2 = points [index++]; - y2 = points [index++]; - - if (type == Path::quadMarker) - { - x3 = points [index++]; - y3 = points [index++]; - - if (! isIdentityTransform) - transform.transformPoints (x2, y2, x3, y3); - } - else if (type == Path::cubicMarker) - { - x3 = points [index++]; - y3 = points [index++]; - x4 = points [index++]; - y4 = points [index++]; - - if (! isIdentityTransform) - transform.transformPoints (x2, y2, x3, y3, x4, y4); - } - else - { - if (! isIdentityTransform) - transform.transformPoint (x2, y2); - } - } - } - else - { - type = *--stackPos; - - if (type != Path::closeSubPathMarker) - { - x2 = *--stackPos; - y2 = *--stackPos; - - if (type == Path::quadMarker) - { - x3 = *--stackPos; - y3 = *--stackPos; - } - else if (type == Path::cubicMarker) - { - x3 = *--stackPos; - y3 = *--stackPos; - x4 = *--stackPos; - y4 = *--stackPos; - } - } - } - - if (type == Path::lineMarker) - { - ++subPathIndex; - - closesSubPath = (stackPos == stackBase) - && (index < path.numElements) - && (points [index] == Path::closeSubPathMarker) - && x2 == subPathCloseX - && y2 == subPathCloseY; - - return true; - } - - if (type == Path::quadMarker) - { - const size_t offset = (size_t) (stackPos - stackBase); - - if (offset >= stackSize - 10) - { - stackSize <<= 1; - stackBase.realloc (stackSize); - stackPos = stackBase + offset; - } - - const float m1x = (x1 + x2) * 0.5f; - const float m1y = (y1 + y2) * 0.5f; - const float m2x = (x2 + x3) * 0.5f; - const float m2y = (y2 + y3) * 0.5f; - const float m3x = (m1x + m2x) * 0.5f; - const float m3y = (m1y + m2y) * 0.5f; - - const float errorX = m3x - x2; - const float errorY = m3y - y2; - - if (errorX * errorX + errorY * errorY > toleranceSquared) - { - *stackPos++ = y3; - *stackPos++ = x3; - *stackPos++ = m2y; - *stackPos++ = m2x; - *stackPos++ = Path::quadMarker; - - *stackPos++ = m3y; - *stackPos++ = m3x; - *stackPos++ = m1y; - *stackPos++ = m1x; - *stackPos++ = Path::quadMarker; - } - else - { - *stackPos++ = y3; - *stackPos++ = x3; - *stackPos++ = Path::lineMarker; - - *stackPos++ = m3y; - *stackPos++ = m3x; - *stackPos++ = Path::lineMarker; - } - - jassert (stackPos < stackBase + stackSize); - } - else if (type == Path::cubicMarker) - { - const size_t offset = (size_t) (stackPos - stackBase); - - if (offset >= stackSize - 16) - { - stackSize <<= 1; - stackBase.realloc (stackSize); - stackPos = stackBase + offset; - } - - const float m1x = (x1 + x2) * 0.5f; - const float m1y = (y1 + y2) * 0.5f; - const float m2x = (x3 + x2) * 0.5f; - const float m2y = (y3 + y2) * 0.5f; - const float m3x = (x3 + x4) * 0.5f; - const float m3y = (y3 + y4) * 0.5f; - const float m4x = (m1x + m2x) * 0.5f; - const float m4y = (m1y + m2y) * 0.5f; - const float m5x = (m3x + m2x) * 0.5f; - const float m5y = (m3y + m2y) * 0.5f; - - const float error1X = m4x - x2; - const float error1Y = m4y - y2; - const float error2X = m5x - x3; - const float error2Y = m5y - y3; - - if (error1X * error1X + error1Y * error1Y > toleranceSquared - || error2X * error2X + error2Y * error2Y > toleranceSquared) - { - *stackPos++ = y4; - *stackPos++ = x4; - *stackPos++ = m3y; - *stackPos++ = m3x; - *stackPos++ = m5y; - *stackPos++ = m5x; - *stackPos++ = Path::cubicMarker; - - *stackPos++ = (m4y + m5y) * 0.5f; - *stackPos++ = (m4x + m5x) * 0.5f; - *stackPos++ = m4y; - *stackPos++ = m4x; - *stackPos++ = m1y; - *stackPos++ = m1x; - *stackPos++ = Path::cubicMarker; - } - else - { - *stackPos++ = y4; - *stackPos++ = x4; - *stackPos++ = Path::lineMarker; - - *stackPos++ = m5y; - *stackPos++ = m5x; - *stackPos++ = Path::lineMarker; - - *stackPos++ = m4y; - *stackPos++ = m4x; - *stackPos++ = Path::lineMarker; - } - } - else if (type == Path::closeSubPathMarker) - { - if (x2 != subPathCloseX || y2 != subPathCloseY) - { - x1 = x2; - y1 = y2; - x2 = subPathCloseX; - y2 = subPathCloseY; - closesSubPath = true; - - return true; - } - } - else - { - jassert (type == Path::moveMarker); - - subPathIndex = -1; - subPathCloseX = x1 = x2; - subPathCloseY = y1 = y2; - } - } -} - -#if JUCE_MSVC && JUCE_DEBUG - #pragma optimize ("", on) // resets optimisations to the project defaults -#endif diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h deleted file mode 100755 index dcb8b90..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathIterator.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_PATHITERATOR_H_INCLUDED -#define JUCE_PATHITERATOR_H_INCLUDED - - -//============================================================================== -/** - Flattens a Path object into a series of straight-line sections. - - Use one of these to iterate through a Path object, and it will convert - all the curves into line sections so it's easy to render or perform - geometric operations on. - - @see Path -*/ -class JUCE_API PathFlatteningIterator -{ -public: - //============================================================================== - /** Creates a PathFlatteningIterator. - - After creation, use the next() method to initialise the fields in the - object with the first line's position. - - @param path the path to iterate along - @param transform a transform to apply to each point in the path being iterated - @param tolerance the amount by which the curves are allowed to deviate from the lines - into which they are being broken down - a higher tolerance contains - less lines, so can be generated faster, but will be less smooth. - */ - PathFlatteningIterator (const Path& path, - const AffineTransform& transform = AffineTransform::identity, - float tolerance = defaultTolerance); - - /** Destructor. */ - ~PathFlatteningIterator(); - - //============================================================================== - /** Fetches the next line segment from the path. - - This will update the member variables x1, y1, x2, y2, subPathIndex and closesSubPath - so that they describe the new line segment. - - @returns false when there are no more lines to fetch. - */ - bool next(); - - float x1; /**< The x position of the start of the current line segment. */ - float y1; /**< The y position of the start of the current line segment. */ - float x2; /**< The x position of the end of the current line segment. */ - float y2; /**< The y position of the end of the current line segment. */ - - /** Indicates whether the current line segment is closing a sub-path. - - If the current line is the one that connects the end of a sub-path - back to the start again, this will be true. - */ - bool closesSubPath; - - /** The index of the current line within the current sub-path. - - E.g. you can use this to see whether the line is the first one in the - subpath by seeing if it's 0. - */ - int subPathIndex; - - /** Returns true if the current segment is the last in the current sub-path. */ - bool isLastInSubpath() const noexcept; - - /** This is the default value that should be used for the tolerance value (see the constructor parameters). */ - static const float defaultTolerance; - -private: - //============================================================================== - const Path& path; - const AffineTransform transform; - float* points; - const float toleranceSquared; - float subPathCloseX, subPathCloseY; - const bool isIdentityTransform; - - HeapBlock stackBase; - float* stackPos; - size_t index, stackSize; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PathFlatteningIterator) -}; - - -#endif // JUCE_PATHITERATOR_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp deleted file mode 100755 index bdac333..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.cpp +++ /dev/null @@ -1,740 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -PathStrokeType::PathStrokeType (float strokeThickness) noexcept - : thickness (strokeThickness), jointStyle (mitered), endStyle (butt) -{ -} - -PathStrokeType::PathStrokeType (float strokeThickness, JointStyle joint, EndCapStyle end) noexcept - : thickness (strokeThickness), jointStyle (joint), endStyle (end) -{ -} - -PathStrokeType::PathStrokeType (const PathStrokeType& other) noexcept - : thickness (other.thickness), - jointStyle (other.jointStyle), - endStyle (other.endStyle) -{ -} - -PathStrokeType& PathStrokeType::operator= (const PathStrokeType& other) noexcept -{ - thickness = other.thickness; - jointStyle = other.jointStyle; - endStyle = other.endStyle; - return *this; -} - -PathStrokeType::~PathStrokeType() noexcept -{ -} - -bool PathStrokeType::operator== (const PathStrokeType& other) const noexcept -{ - return thickness == other.thickness - && jointStyle == other.jointStyle - && endStyle == other.endStyle; -} - -bool PathStrokeType::operator!= (const PathStrokeType& other) const noexcept -{ - return ! operator== (other); -} - -//============================================================================== -namespace PathStrokeHelpers -{ - static bool lineIntersection (const float x1, const float y1, - const float x2, const float y2, - const float x3, const float y3, - const float x4, const float y4, - float& intersectionX, - float& intersectionY, - float& distanceBeyondLine1EndSquared) noexcept - { - if (x2 != x3 || y2 != y3) - { - const float dx1 = x2 - x1; - const float dy1 = y2 - y1; - const float dx2 = x4 - x3; - const float dy2 = y4 - y3; - const float divisor = dx1 * dy2 - dx2 * dy1; - - if (divisor == 0) - { - if (! ((dx1 == 0 && dy1 == 0) || (dx2 == 0 && dy2 == 0))) - { - if (dy1 == 0 && dy2 != 0) - { - const float along = (y1 - y3) / dy2; - intersectionX = x3 + along * dx2; - intersectionY = y1; - - distanceBeyondLine1EndSquared = intersectionX - x2; - distanceBeyondLine1EndSquared *= distanceBeyondLine1EndSquared; - if ((x2 > x1) == (intersectionX < x2)) - distanceBeyondLine1EndSquared = -distanceBeyondLine1EndSquared; - - return along >= 0 && along <= 1.0f; - } - else if (dy2 == 0 && dy1 != 0) - { - const float along = (y3 - y1) / dy1; - intersectionX = x1 + along * dx1; - intersectionY = y3; - - distanceBeyondLine1EndSquared = (along - 1.0f) * dx1; - distanceBeyondLine1EndSquared *= distanceBeyondLine1EndSquared; - if (along < 1.0f) - distanceBeyondLine1EndSquared = -distanceBeyondLine1EndSquared; - - return along >= 0 && along <= 1.0f; - } - else if (dx1 == 0 && dx2 != 0) - { - const float along = (x1 - x3) / dx2; - intersectionX = x1; - intersectionY = y3 + along * dy2; - - distanceBeyondLine1EndSquared = intersectionY - y2; - distanceBeyondLine1EndSquared *= distanceBeyondLine1EndSquared; - - if ((y2 > y1) == (intersectionY < y2)) - distanceBeyondLine1EndSquared = -distanceBeyondLine1EndSquared; - - return along >= 0 && along <= 1.0f; - } - else if (dx2 == 0 && dx1 != 0) - { - const float along = (x3 - x1) / dx1; - intersectionX = x3; - intersectionY = y1 + along * dy1; - - distanceBeyondLine1EndSquared = (along - 1.0f) * dy1; - distanceBeyondLine1EndSquared *= distanceBeyondLine1EndSquared; - if (along < 1.0f) - distanceBeyondLine1EndSquared = -distanceBeyondLine1EndSquared; - - return along >= 0 && along <= 1.0f; - } - } - - intersectionX = 0.5f * (x2 + x3); - intersectionY = 0.5f * (y2 + y3); - - distanceBeyondLine1EndSquared = 0.0f; - return false; - } - else - { - const float along1 = ((y1 - y3) * dx2 - (x1 - x3) * dy2) / divisor; - - intersectionX = x1 + along1 * dx1; - intersectionY = y1 + along1 * dy1; - - if (along1 >= 0 && along1 <= 1.0f) - { - const float along2 = ((y1 - y3) * dx1 - (x1 - x3) * dy1); - - if (along2 >= 0 && along2 <= divisor) - { - distanceBeyondLine1EndSquared = 0.0f; - return true; - } - } - - distanceBeyondLine1EndSquared = along1 - 1.0f; - distanceBeyondLine1EndSquared *= distanceBeyondLine1EndSquared; - distanceBeyondLine1EndSquared *= (dx1 * dx1 + dy1 * dy1); - - if (along1 < 1.0f) - distanceBeyondLine1EndSquared = -distanceBeyondLine1EndSquared; - - return false; - } - } - - intersectionX = x2; - intersectionY = y2; - - distanceBeyondLine1EndSquared = 0.0f; - return true; - } - - static void addEdgeAndJoint (Path& destPath, - const PathStrokeType::JointStyle style, - const float maxMiterExtensionSquared, const float width, - const float x1, const float y1, - const float x2, const float y2, - const float x3, const float y3, - const float x4, const float y4, - const float midX, const float midY) - { - if (style == PathStrokeType::beveled - || (x3 == x4 && y3 == y4) - || (x1 == x2 && y1 == y2)) - { - destPath.lineTo (x2, y2); - destPath.lineTo (x3, y3); - } - else - { - float jx, jy, distanceBeyondLine1EndSquared; - - // if they intersect, use this point.. - if (lineIntersection (x1, y1, x2, y2, - x3, y3, x4, y4, - jx, jy, distanceBeyondLine1EndSquared)) - { - destPath.lineTo (jx, jy); - } - else - { - if (style == PathStrokeType::mitered) - { - if (distanceBeyondLine1EndSquared < maxMiterExtensionSquared - && distanceBeyondLine1EndSquared > 0.0f) - { - destPath.lineTo (jx, jy); - } - else - { - // the end sticks out too far, so just use a blunt joint - destPath.lineTo (x2, y2); - destPath.lineTo (x3, y3); - } - } - else - { - // curved joints - float angle1 = std::atan2 (x2 - midX, y2 - midY); - float angle2 = std::atan2 (x3 - midX, y3 - midY); - const float angleIncrement = 0.1f; - - destPath.lineTo (x2, y2); - - if (std::abs (angle1 - angle2) > angleIncrement) - { - if (angle2 > angle1 + float_Pi - || (angle2 < angle1 && angle2 >= angle1 - float_Pi)) - { - if (angle2 > angle1) - angle2 -= float_Pi * 2.0f; - - jassert (angle1 <= angle2 + float_Pi); - - angle1 -= angleIncrement; - while (angle1 > angle2) - { - destPath.lineTo (midX + width * std::sin (angle1), - midY + width * std::cos (angle1)); - - angle1 -= angleIncrement; - } - } - else - { - if (angle1 > angle2) - angle1 -= float_Pi * 2.0f; - - jassert (angle1 >= angle2 - float_Pi); - - angle1 += angleIncrement; - while (angle1 < angle2) - { - destPath.lineTo (midX + width * std::sin (angle1), - midY + width * std::cos (angle1)); - - angle1 += angleIncrement; - } - } - } - - destPath.lineTo (x3, y3); - } - } - } - } - - static void addLineEnd (Path& destPath, - const PathStrokeType::EndCapStyle style, - const float x1, const float y1, - const float x2, const float y2, - const float width) - { - if (style == PathStrokeType::butt) - { - destPath.lineTo (x2, y2); - } - else - { - float offx1, offy1, offx2, offy2; - - float dx = x2 - x1; - float dy = y2 - y1; - const float len = juce_hypot (dx, dy); - - if (len == 0) - { - offx1 = offx2 = x1; - offy1 = offy2 = y1; - } - else - { - const float offset = width / len; - dx *= offset; - dy *= offset; - - offx1 = x1 + dy; - offy1 = y1 - dx; - offx2 = x2 + dy; - offy2 = y2 - dx; - } - - if (style == PathStrokeType::square) - { - // sqaure ends - destPath.lineTo (offx1, offy1); - destPath.lineTo (offx2, offy2); - destPath.lineTo (x2, y2); - } - else - { - // rounded ends - const float midx = (offx1 + offx2) * 0.5f; - const float midy = (offy1 + offy2) * 0.5f; - - destPath.cubicTo (x1 + (offx1 - x1) * 0.55f, y1 + (offy1 - y1) * 0.55f, - offx1 + (midx - offx1) * 0.45f, offy1 + (midy - offy1) * 0.45f, - midx, midy); - - destPath.cubicTo (midx + (offx2 - midx) * 0.55f, midy + (offy2 - midy) * 0.55f, - offx2 + (x2 - offx2) * 0.45f, offy2 + (y2 - offy2) * 0.45f, - x2, y2); - } - } - } - - struct Arrowhead - { - float startWidth, startLength; - float endWidth, endLength; - }; - - static void addArrowhead (Path& destPath, - const float x1, const float y1, - const float x2, const float y2, - const float tipX, const float tipY, - const float width, - const float arrowheadWidth) - { - Line line (x1, y1, x2, y2); - destPath.lineTo (line.getPointAlongLine (-(arrowheadWidth / 2.0f - width), 0)); - destPath.lineTo (tipX, tipY); - destPath.lineTo (line.getPointAlongLine (arrowheadWidth - (arrowheadWidth / 2.0f - width), 0)); - destPath.lineTo (x2, y2); - } - - struct LineSection - { - float x1, y1, x2, y2; // original line - float lx1, ly1, lx2, ly2; // the left-hand stroke - float rx1, ry1, rx2, ry2; // the right-hand stroke - }; - - static void shortenSubPath (Array& subPath, float amountAtStart, float amountAtEnd) - { - while (amountAtEnd > 0 && subPath.size() > 0) - { - LineSection& l = subPath.getReference (subPath.size() - 1); - float dx = l.rx2 - l.rx1; - float dy = l.ry2 - l.ry1; - const float len = juce_hypot (dx, dy); - - if (len <= amountAtEnd && subPath.size() > 1) - { - LineSection& prev = subPath.getReference (subPath.size() - 2); - prev.x2 = l.x2; - prev.y2 = l.y2; - subPath.removeLast(); - amountAtEnd -= len; - } - else - { - const float prop = jmin (0.9999f, amountAtEnd / len); - dx *= prop; - dy *= prop; - l.rx1 += dx; - l.ry1 += dy; - l.lx2 += dx; - l.ly2 += dy; - break; - } - } - - while (amountAtStart > 0 && subPath.size() > 0) - { - LineSection& l = subPath.getReference (0); - float dx = l.rx2 - l.rx1; - float dy = l.ry2 - l.ry1; - const float len = juce_hypot (dx, dy); - - if (len <= amountAtStart && subPath.size() > 1) - { - LineSection& next = subPath.getReference (1); - next.x1 = l.x1; - next.y1 = l.y1; - subPath.remove (0); - amountAtStart -= len; - } - else - { - const float prop = jmin (0.9999f, amountAtStart / len); - dx *= prop; - dy *= prop; - l.rx2 -= dx; - l.ry2 -= dy; - l.lx1 -= dx; - l.ly1 -= dy; - break; - } - } - } - - static void addSubPath (Path& destPath, Array& subPath, - const bool isClosed, const float width, const float maxMiterExtensionSquared, - const PathStrokeType::JointStyle jointStyle, const PathStrokeType::EndCapStyle endStyle, - const Arrowhead* const arrowhead) - { - jassert (subPath.size() > 0); - - if (arrowhead != nullptr) - shortenSubPath (subPath, arrowhead->startLength, arrowhead->endLength); - - const LineSection& firstLine = subPath.getReference (0); - - float lastX1 = firstLine.lx1; - float lastY1 = firstLine.ly1; - float lastX2 = firstLine.lx2; - float lastY2 = firstLine.ly2; - - if (isClosed) - { - destPath.startNewSubPath (lastX1, lastY1); - } - else - { - destPath.startNewSubPath (firstLine.rx2, firstLine.ry2); - - if (arrowhead != nullptr) - addArrowhead (destPath, firstLine.rx2, firstLine.ry2, lastX1, lastY1, firstLine.x1, firstLine.y1, - width, arrowhead->startWidth); - else - addLineEnd (destPath, endStyle, firstLine.rx2, firstLine.ry2, lastX1, lastY1, width); - } - - for (int i = 1; i < subPath.size(); ++i) - { - const LineSection& l = subPath.getReference (i); - - addEdgeAndJoint (destPath, jointStyle, - maxMiterExtensionSquared, width, - lastX1, lastY1, lastX2, lastY2, - l.lx1, l.ly1, l.lx2, l.ly2, - l.x1, l.y1); - - lastX1 = l.lx1; - lastY1 = l.ly1; - lastX2 = l.lx2; - lastY2 = l.ly2; - } - - const LineSection& lastLine = subPath.getReference (subPath.size() - 1); - - if (isClosed) - { - const LineSection& l = subPath.getReference (0); - - addEdgeAndJoint (destPath, jointStyle, - maxMiterExtensionSquared, width, - lastX1, lastY1, lastX2, lastY2, - l.lx1, l.ly1, l.lx2, l.ly2, - l.x1, l.y1); - - destPath.closeSubPath(); - destPath.startNewSubPath (lastLine.rx1, lastLine.ry1); - } - else - { - destPath.lineTo (lastX2, lastY2); - - if (arrowhead != nullptr) - addArrowhead (destPath, lastX2, lastY2, lastLine.rx1, lastLine.ry1, lastLine.x2, lastLine.y2, - width, arrowhead->endWidth); - else - addLineEnd (destPath, endStyle, lastX2, lastY2, lastLine.rx1, lastLine.ry1, width); - } - - lastX1 = lastLine.rx1; - lastY1 = lastLine.ry1; - lastX2 = lastLine.rx2; - lastY2 = lastLine.ry2; - - for (int i = subPath.size() - 1; --i >= 0;) - { - const LineSection& l = subPath.getReference (i); - - addEdgeAndJoint (destPath, jointStyle, - maxMiterExtensionSquared, width, - lastX1, lastY1, lastX2, lastY2, - l.rx1, l.ry1, l.rx2, l.ry2, - l.x2, l.y2); - - lastX1 = l.rx1; - lastY1 = l.ry1; - lastX2 = l.rx2; - lastY2 = l.ry2; - } - - if (isClosed) - { - addEdgeAndJoint (destPath, jointStyle, - maxMiterExtensionSquared, width, - lastX1, lastY1, lastX2, lastY2, - lastLine.rx1, lastLine.ry1, lastLine.rx2, lastLine.ry2, - lastLine.x2, lastLine.y2); - } - else - { - // do the last line - destPath.lineTo (lastX2, lastY2); - } - - destPath.closeSubPath(); - } - - static void createStroke (const float thickness, const PathStrokeType::JointStyle jointStyle, - const PathStrokeType::EndCapStyle endStyle, - Path& destPath, const Path& source, - const AffineTransform& transform, - const float extraAccuracy, const Arrowhead* const arrowhead) - { - jassert (extraAccuracy > 0); - - if (thickness <= 0) - { - destPath.clear(); - return; - } - - const Path* sourcePath = &source; - Path temp; - - if (sourcePath == &destPath) - { - destPath.swapWithPath (temp); - sourcePath = &temp; - } - else - { - destPath.clear(); - } - - destPath.setUsingNonZeroWinding (true); - - const float maxMiterExtensionSquared = 9.0f * thickness * thickness; - const float width = 0.5f * thickness; - - // Iterate the path, creating a list of the - // left/right-hand lines along either side of it... - PathFlatteningIterator it (*sourcePath, transform, PathFlatteningIterator::defaultTolerance / extraAccuracy); - - Array subPath; - subPath.ensureStorageAllocated (512); - LineSection l; - l.x1 = 0; - l.y1 = 0; - - const float minSegmentLength = 0.0001f; - - while (it.next()) - { - if (it.subPathIndex == 0) - { - if (subPath.size() > 0) - { - addSubPath (destPath, subPath, false, width, maxMiterExtensionSquared, jointStyle, endStyle, arrowhead); - subPath.clearQuick(); - } - - l.x1 = it.x1; - l.y1 = it.y1; - } - - l.x2 = it.x2; - l.y2 = it.y2; - - float dx = l.x2 - l.x1; - float dy = l.y2 - l.y1; - - const float hypotSquared = dx*dx + dy*dy; - - if (it.closesSubPath || hypotSquared > minSegmentLength || it.isLastInSubpath()) - { - const float len = std::sqrt (hypotSquared); - - if (len == 0) - { - l.rx1 = l.rx2 = l.lx1 = l.lx2 = l.x1; - l.ry1 = l.ry2 = l.ly1 = l.ly2 = l.y1; - } - else - { - const float offset = width / len; - dx *= offset; - dy *= offset; - - l.rx2 = l.x1 - dy; - l.ry2 = l.y1 + dx; - l.lx1 = l.x1 + dy; - l.ly1 = l.y1 - dx; - - l.lx2 = l.x2 + dy; - l.ly2 = l.y2 - dx; - l.rx1 = l.x2 - dy; - l.ry1 = l.y2 + dx; - } - - subPath.add (l); - - if (it.closesSubPath) - { - addSubPath (destPath, subPath, true, width, maxMiterExtensionSquared, jointStyle, endStyle, arrowhead); - subPath.clearQuick(); - } - else - { - l.x1 = it.x2; - l.y1 = it.y2; - } - } - } - - if (subPath.size() > 0) - addSubPath (destPath, subPath, false, width, maxMiterExtensionSquared, jointStyle, endStyle, arrowhead); - } -} - -void PathStrokeType::createStrokedPath (Path& destPath, const Path& sourcePath, - const AffineTransform& transform, const float extraAccuracy) const -{ - PathStrokeHelpers::createStroke (thickness, jointStyle, endStyle, destPath, sourcePath, - transform, extraAccuracy, 0); -} - -void PathStrokeType::createDashedStroke (Path& destPath, - const Path& sourcePath, - const float* dashLengths, - int numDashLengths, - const AffineTransform& transform, - const float extraAccuracy) const -{ - jassert (extraAccuracy > 0); - - if (thickness <= 0) - return; - - // this should really be an even number.. - jassert ((numDashLengths & 1) == 0); - - Path newDestPath; - PathFlatteningIterator it (sourcePath, transform, PathFlatteningIterator::defaultTolerance / extraAccuracy); - - bool first = true; - int dashNum = 0; - float pos = 0.0f, lineLen = 0.0f, lineEndPos = 0.0f; - float dx = 0.0f, dy = 0.0f; - - for (;;) - { - const bool isSolid = ((dashNum & 1) == 0); - const float dashLen = dashLengths [dashNum++ % numDashLengths]; - - jassert (dashLen > 0); // must be a positive increment! - if (dashLen <= 0) - break; - - pos += dashLen; - - while (pos > lineEndPos) - { - if (! it.next()) - { - if (isSolid && ! first) - newDestPath.lineTo (it.x2, it.y2); - - createStrokedPath (destPath, newDestPath, AffineTransform::identity, extraAccuracy); - return; - } - - if (isSolid && ! first) - newDestPath.lineTo (it.x1, it.y1); - else - newDestPath.startNewSubPath (it.x1, it.y1); - - dx = it.x2 - it.x1; - dy = it.y2 - it.y1; - lineLen = juce_hypot (dx, dy); - lineEndPos += lineLen; - first = it.closesSubPath; - } - - const float alpha = (pos - (lineEndPos - lineLen)) / lineLen; - - if (isSolid) - newDestPath.lineTo (it.x1 + dx * alpha, - it.y1 + dy * alpha); - else - newDestPath.startNewSubPath (it.x1 + dx * alpha, - it.y1 + dy * alpha); - } -} - -void PathStrokeType::createStrokeWithArrowheads (Path& destPath, - const Path& sourcePath, - const float arrowheadStartWidth, const float arrowheadStartLength, - const float arrowheadEndWidth, const float arrowheadEndLength, - const AffineTransform& transform, - const float extraAccuracy) const -{ - PathStrokeHelpers::Arrowhead head; - head.startWidth = arrowheadStartWidth; - head.startLength = arrowheadStartLength; - head.endWidth = arrowheadEndWidth; - head.endLength = arrowheadEndLength; - - PathStrokeHelpers::createStroke (thickness, jointStyle, endStyle, - destPath, sourcePath, transform, extraAccuracy, &head); -} diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h deleted file mode 100755 index 6374741..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_PathStrokeType.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_PATHSTROKETYPE_H_INCLUDED -#define JUCE_PATHSTROKETYPE_H_INCLUDED - - -//============================================================================== -/** - Describes a type of stroke used to render a solid outline along a path. - - A PathStrokeType object can be used directly to create the shape of an outline - around a path, and is used by Graphics::strokePath to specify the type of - stroke to draw. - - @see Path, Graphics::strokePath -*/ -class JUCE_API PathStrokeType -{ -public: - //============================================================================== - /** The type of shape to use for the corners between two adjacent line segments. */ - enum JointStyle - { - mitered, /**< Indicates that corners should be drawn with sharp joints. - Note that for angles that curve back on themselves, drawing a - mitre could require extending the point too far away from the - path, so a mitre limit is imposed and any corners that exceed it - are drawn as bevelled instead. */ - curved, /**< Indicates that corners should be drawn as rounded-off. */ - beveled /**< Indicates that corners should be drawn with a line flattening their - outside edge. */ - }; - - /** The type shape to use for the ends of lines. */ - enum EndCapStyle - { - butt, /**< Ends of lines are flat and don't extend beyond the end point. */ - square, /**< Ends of lines are flat, but stick out beyond the end point for half - the thickness of the stroke. */ - rounded /**< Ends of lines are rounded-off with a circular shape. */ - }; - - //============================================================================== - /** Creates a stroke type with a given line-width, and default joint/end styles. */ - explicit PathStrokeType (float strokeThickness) noexcept; - - /** Creates a stroke type. - - @param strokeThickness the width of the line to use - @param jointStyle the type of joints to use for corners - @param endStyle the type of end-caps to use for the ends of open paths. - */ - PathStrokeType (float strokeThickness, - JointStyle jointStyle, - EndCapStyle endStyle = butt) noexcept; - - /** Creates a copy of another stroke type. */ - PathStrokeType (const PathStrokeType&) noexcept; - - /** Copies another stroke onto this one. */ - PathStrokeType& operator= (const PathStrokeType&) noexcept; - - /** Destructor. */ - ~PathStrokeType() noexcept; - - //============================================================================== - /** Applies this stroke type to a path and returns the resultant stroke as another Path. - - @param destPath the resultant stroked outline shape will be copied into this path. - Note that it's ok for the source and destination Paths to be - the same object, so you can easily turn a path into a stroked version - of itself. - @param sourcePath the path to use as the source - @param transform an optional transform to apply to the points from the source path - as they are being used - @param extraAccuracy if this is greater than 1.0, it will subdivide the path to - a higher resolution, which improves the quality if you'll later want - to enlarge the stroked path. So for example, if you're planning on drawing - the stroke at 3x the size that you're creating it, you should set this to 3. - - @see createDashedStroke - */ - void createStrokedPath (Path& destPath, - const Path& sourcePath, - const AffineTransform& transform = AffineTransform::identity, - float extraAccuracy = 1.0f) const; - - - //============================================================================== - /** Applies this stroke type to a path, creating a dashed line. - - This is similar to createStrokedPath, but uses the array passed in to - break the stroke up into a series of dashes. - - @param destPath the resultant stroked outline shape will be copied into this path. - Note that it's ok for the source and destination Paths to be - the same object, so you can easily turn a path into a stroked version - of itself. - @param sourcePath the path to use as the source - @param dashLengths An array of alternating on/off lengths. E.g. { 2, 3, 4, 5 } will create - a line of length 2, then skip a length of 3, then add a line of length 4, - skip 5, and keep repeating this pattern. - @param numDashLengths The number of lengths in the dashLengths array. This should really be - an even number, otherwise the pattern will get out of step as it - repeats. - @param transform an optional transform to apply to the points from the source path - as they are being used - @param extraAccuracy if this is greater than 1.0, it will subdivide the path to - a higher resolution, which improves the quality if you'll later want - to enlarge the stroked path. So for example, if you're planning on drawing - the stroke at 3x the size that you're creating it, you should set this to 3. - */ - void createDashedStroke (Path& destPath, - const Path& sourcePath, - const float* dashLengths, - int numDashLengths, - const AffineTransform& transform = AffineTransform::identity, - float extraAccuracy = 1.0f) const; - - //============================================================================== - /** Applies this stroke type to a path and returns the resultant stroke as another Path. - - @param destPath the resultant stroked outline shape will be copied into this path. - Note that it's ok for the source and destination Paths to be - the same object, so you can easily turn a path into a stroked version - of itself. - @param sourcePath the path to use as the source - @param arrowheadStartWidth the width of the arrowhead at the start of the path - @param arrowheadStartLength the length of the arrowhead at the start of the path - @param arrowheadEndWidth the width of the arrowhead at the end of the path - @param arrowheadEndLength the length of the arrowhead at the end of the path - @param transform an optional transform to apply to the points from the source path - as they are being used - @param extraAccuracy if this is greater than 1.0, it will subdivide the path to - a higher resolution, which improves the quality if you'll later want - to enlarge the stroked path. So for example, if you're planning on drawing - the stroke at 3x the size that you're creating it, you should set this to 3. - @see createDashedStroke - */ - void createStrokeWithArrowheads (Path& destPath, - const Path& sourcePath, - float arrowheadStartWidth, float arrowheadStartLength, - float arrowheadEndWidth, float arrowheadEndLength, - const AffineTransform& transform = AffineTransform::identity, - float extraAccuracy = 1.0f) const; - - //============================================================================== - /** Returns the stroke thickness. */ - float getStrokeThickness() const noexcept { return thickness; } - - /** Sets the stroke thickness. */ - void setStrokeThickness (float newThickness) noexcept { thickness = newThickness; } - - /** Returns the joint style. */ - JointStyle getJointStyle() const noexcept { return jointStyle; } - - /** Sets the joint style. */ - void setJointStyle (JointStyle newStyle) noexcept { jointStyle = newStyle; } - - /** Returns the end-cap style. */ - EndCapStyle getEndStyle() const noexcept { return endStyle; } - - /** Sets the end-cap style. */ - void setEndStyle (EndCapStyle newStyle) noexcept { endStyle = newStyle; } - - //============================================================================== - /** Compares the stroke thickness, joint and end styles of two stroke types. */ - bool operator== (const PathStrokeType&) const noexcept; - - /** Compares the stroke thickness, joint and end styles of two stroke types. */ - bool operator!= (const PathStrokeType&) const noexcept; - -private: - //============================================================================== - float thickness; - JointStyle jointStyle; - EndCapStyle endStyle; - - JUCE_LEAK_DETECTOR (PathStrokeType) -}; - -#endif // JUCE_PATHSTROKETYPE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h deleted file mode 100755 index 7cc5d49..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Point.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_POINT_H_INCLUDED -#define JUCE_POINT_H_INCLUDED - - -//============================================================================== -/** - A pair of (x, y) coordinates. - - The ValueType template should be a primitive type such as int, float, double, - rather than a class. - - @see Line, Path, AffineTransform -*/ -template -class Point -{ -public: - /** Creates a point at the origin */ - Point() noexcept : x(), y() {} - - /** Creates a copy of another point. */ - Point (const Point& other) noexcept : x (other.x), y (other.y) {} - - /** Creates a point from an (x, y) position. */ - Point (ValueType initialX, ValueType initialY) noexcept : x (initialX), y (initialY) {} - - //============================================================================== - /** Copies this point from another one. */ - Point& operator= (const Point& other) noexcept { x = other.x; y = other.y; return *this; } - - inline bool operator== (Point other) const noexcept { return x == other.x && y == other.y; } - inline bool operator!= (Point other) const noexcept { return x != other.x || y != other.y; } - - /** Returns true if the point is (0, 0). */ - bool isOrigin() const noexcept { return x == ValueType() && y == ValueType(); } - - /** Returns the point's x coordinate. */ - inline ValueType getX() const noexcept { return x; } - - /** Returns the point's y coordinate. */ - inline ValueType getY() const noexcept { return y; } - - /** Sets the point's x coordinate. */ - inline void setX (ValueType newX) noexcept { x = newX; } - - /** Sets the point's y coordinate. */ - inline void setY (ValueType newY) noexcept { y = newY; } - - /** Returns a point which has the same Y position as this one, but a new X. */ - Point withX (ValueType newX) const noexcept { return Point (newX, y); } - - /** Returns a point which has the same X position as this one, but a new Y. */ - Point withY (ValueType newY) const noexcept { return Point (x, newY); } - - /** Changes the point's x and y coordinates. */ - void setXY (ValueType newX, ValueType newY) noexcept { x = newX; y = newY; } - - /** Adds a pair of coordinates to this value. */ - void addXY (ValueType xToAdd, ValueType yToAdd) noexcept { x += xToAdd; y += yToAdd; } - - //============================================================================== - /** Returns a point with a given offset from this one. */ - Point translated (ValueType deltaX, ValueType deltaY) const noexcept { return Point (x + deltaX, y + deltaY); } - - /** Adds two points together */ - Point operator+ (Point other) const noexcept { return Point (x + other.x, y + other.y); } - - /** Adds another point's coordinates to this one */ - Point& operator+= (Point other) noexcept { x += other.x; y += other.y; return *this; } - - /** Subtracts one points from another */ - Point operator- (Point other) const noexcept { return Point (x - other.x, y - other.y); } - - /** Subtracts another point's coordinates to this one */ - Point& operator-= (Point other) noexcept { x -= other.x; y -= other.y; return *this; } - - /** Multiplies two points together */ - template - Point operator* (Point other) const noexcept { return Point ((ValueType) (x * other.x), (ValueType) (y * other.y)); } - - /** Multiplies another point's coordinates to this one */ - template - Point& operator*= (Point other) noexcept { *this = *this * other; return *this; } - - /** Divides one point by another */ - template - Point operator/ (Point other) const noexcept { return Point ((ValueType) (x / other.x), (ValueType) (y / other.y)); } - - /** Divides this point's coordinates by another */ - template - Point& operator/= (Point other) noexcept { *this = *this / other; return *this; } - - /** Returns a point whose coordinates are multiplied by a given scalar value. */ - template - Point operator* (FloatType multiplier) const noexcept { return Point ((ValueType) (x * multiplier), (ValueType) (y * multiplier)); } - - /** Returns a point whose coordinates are divided by a given scalar value. */ - template - Point operator/ (FloatType divisor) const noexcept { return Point ((ValueType) (x / divisor), (ValueType) (y / divisor)); } - - /** Multiplies the point's coordinates by a scalar value. */ - template - Point& operator*= (FloatType multiplier) noexcept { x = (ValueType) (x * multiplier); y = (ValueType) (y * multiplier); return *this; } - - /** Divides the point's coordinates by a scalar value. */ - template - Point& operator/= (FloatType divisor) noexcept { x = (ValueType) (x / divisor); y = (ValueType) (y / divisor); return *this; } - - /** Returns the inverse of this point. */ - Point operator-() const noexcept { return Point (-x, -y); } - - //============================================================================== - /** This type will be double if the Point's type is double, otherwise it will be float. */ - typedef typename TypeHelpers::SmallestFloatType::type FloatType; - - //============================================================================== - /** Returns the straight-line distance between this point and the origin. */ - ValueType getDistanceFromOrigin() const noexcept { return juce_hypot (x, y); } - - /** Returns the straight-line distance between this point and another one. */ - ValueType getDistanceFrom (Point other) const noexcept { return juce_hypot (x - other.x, y - other.y); } - - /** Returns the angle from this point to another one. - - The return value is the number of radians clockwise from the 12 o'clock direction, - where this point is the centre and the other point is on the circumference. - */ - FloatType getAngleToPoint (Point other) const noexcept - { - return static_cast (std::atan2 (static_cast (other.x - x), - static_cast (y - other.y))); - } - - /** Returns the point that would be reached by rotating this point clockwise - about the origin by the specified angle. - */ - Point rotatedAboutOrigin (ValueType angleRadians) const noexcept - { - return Point (x * std::cos (angleRadians) - y * std::sin (angleRadians), - x * std::sin (angleRadians) + y * std::cos (angleRadians)); - } - - /** Taking this point to be the centre of a circle, this returns a point on its circumference. - @param radius the radius of the circle. - @param angle the angle of the point, in radians clockwise from the 12 o'clock position. - */ - Point getPointOnCircumference (float radius, float angle) const noexcept - { - return Point (static_cast (x + radius * std::sin (angle)), - static_cast (y - radius * std::cos (angle))); - } - - /** Taking this point to be the centre of an ellipse, this returns a point on its circumference. - @param radiusX the horizontal radius of the circle. - @param radiusY the vertical radius of the circle. - @param angle the angle of the point, in radians clockwise from the 12 o'clock position. - */ - Point getPointOnCircumference (float radiusX, float radiusY, float angle) const noexcept - { - return Point (static_cast (x + radiusX * std::sin (angle)), - static_cast (y - radiusY * std::cos (angle))); - } - - /** Returns the dot-product of two points (x1 * x2 + y1 * y2). */ - FloatType getDotProduct (Point other) const noexcept { return x * other.x + y * other.y; } - - //============================================================================== - /** Uses a transform to change the point's coordinates. - This will only compile if ValueType = float! - - @see AffineTransform::transformPoint - */ - void applyTransform (const AffineTransform& transform) noexcept { transform.transformPoint (x, y); } - - /** Returns the position of this point, if it is transformed by a given AffineTransform. */ - Point transformedBy (const AffineTransform& transform) const noexcept - { - return Point (static_cast (transform.mat00 * x + transform.mat01 * y + transform.mat02), - static_cast (transform.mat10 * x + transform.mat11 * y + transform.mat12)); - } - - //============================================================================== - /** Casts this point to a Point object. */ - Point toInt() const noexcept { return Point (static_cast (x), static_cast (y)); } - - /** Casts this point to a Point object. */ - Point toFloat() const noexcept { return Point (static_cast (x), static_cast (y)); } - - /** Casts this point to a Point object. */ - Point toDouble() const noexcept { return Point (static_cast (x), static_cast (y)); } - - /** Casts this point to a Point object using roundToInt() to convert the values. */ - Point roundToInt() const noexcept { return Point (juce::roundToInt (x), juce::roundToInt (y)); } - - /** Returns the point as a string in the form "x, y". */ - String toString() const { return String (x) + ", " + String (y); } - - //============================================================================== - ValueType x; /**< The point's X coordinate. */ - ValueType y; /**< The point's Y coordinate. */ -}; - - -#endif // JUCE_POINT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h deleted file mode 100755 index 6191d1a..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_Rectangle.h +++ /dev/null @@ -1,917 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_RECTANGLE_H_INCLUDED -#define JUCE_RECTANGLE_H_INCLUDED - - -//============================================================================== -/** - Manages a rectangle and allows geometric operations to be performed on it. - - @see RectangleList, Path, Line, Point -*/ -template -class Rectangle -{ -public: - //============================================================================== - /** Creates a rectangle of zero size. - The default coordinates will be (0, 0, 0, 0). - */ - Rectangle() noexcept - : w(), h() - { - } - - /** Creates a copy of another rectangle. */ - Rectangle (const Rectangle& other) noexcept - : pos (other.pos), w (other.w), h (other.h) - { - } - - /** Creates a rectangle with a given position and size. */ - Rectangle (const ValueType initialX, const ValueType initialY, - const ValueType width, const ValueType height) noexcept - : pos (initialX, initialY), - w (width), h (height) - { - } - - /** Creates a rectangle with a given size, and a position of (0, 0). */ - Rectangle (const ValueType width, const ValueType height) noexcept - : w (width), h (height) - { - } - - /** Creates a Rectangle from the positions of two opposite corners. */ - Rectangle (const Point corner1, const Point corner2) noexcept - : pos (jmin (corner1.x, corner2.x), - jmin (corner1.y, corner2.y)), - w (corner1.x - corner2.x), - h (corner1.y - corner2.y) - { - if (w < ValueType()) w = -w; - if (h < ValueType()) h = -h; - } - - /** Creates a Rectangle from a set of left, right, top, bottom coordinates. - The right and bottom values must be larger than the left and top ones, or the resulting - rectangle will have a negative size. - */ - static Rectangle leftTopRightBottom (const ValueType left, const ValueType top, - const ValueType right, const ValueType bottom) noexcept - { - return Rectangle (left, top, right - left, bottom - top); - } - - Rectangle& operator= (const Rectangle& other) noexcept - { - pos = other.pos; - w = other.w; h = other.h; - return *this; - } - - /** Destructor. */ - ~Rectangle() noexcept {} - - //============================================================================== - /** Returns true if the rectangle's width or height are zero or less */ - bool isEmpty() const noexcept { return w <= ValueType() || h <= ValueType(); } - - /** Returns the x coordinate of the rectangle's left-hand-side. */ - inline ValueType getX() const noexcept { return pos.x; } - - /** Returns the y coordinate of the rectangle's top edge. */ - inline ValueType getY() const noexcept { return pos.y; } - - /** Returns the width of the rectangle. */ - inline ValueType getWidth() const noexcept { return w; } - - /** Returns the height of the rectangle. */ - inline ValueType getHeight() const noexcept { return h; } - - /** Returns the x coordinate of the rectangle's right-hand-side. */ - inline ValueType getRight() const noexcept { return pos.x + w; } - - /** Returns the y coordinate of the rectangle's bottom edge. */ - inline ValueType getBottom() const noexcept { return pos.y + h; } - - /** Returns the x coordinate of the rectangle's centre. */ - ValueType getCentreX() const noexcept { return pos.x + w / (ValueType) 2; } - - /** Returns the y coordinate of the rectangle's centre. */ - ValueType getCentreY() const noexcept { return pos.y + h / (ValueType) 2; } - - /** Returns the centre point of the rectangle. */ - Point getCentre() const noexcept { return Point (pos.x + w / (ValueType) 2, - pos.y + h / (ValueType) 2); } - - /** Returns the aspect ratio of the rectangle's width / height. - If widthOverHeight is true, it returns width / height; if widthOverHeight is false, - it returns height / width. */ - ValueType getAspectRatio (const bool widthOverHeight = true) const noexcept { return widthOverHeight ? w / h : h / w; } - - //============================================================================== - /** Returns the rectangle's top-left position as a Point. */ - inline Point getPosition() const noexcept { return pos; } - - /** Changes the position of the rectangle's top-left corner (leaving its size unchanged). */ - inline void setPosition (const Point newPos) noexcept { pos = newPos; } - - /** Changes the position of the rectangle's top-left corner (leaving its size unchanged). */ - inline void setPosition (const ValueType newX, const ValueType newY) noexcept { pos.setXY (newX, newY); } - - /** Returns the rectangle's top-left position as a Point. */ - Point getTopLeft() const noexcept { return pos; } - - /** Returns the rectangle's top-right position as a Point. */ - Point getTopRight() const noexcept { return Point (pos.x + w, pos.y); } - - /** Returns the rectangle's bottom-left position as a Point. */ - Point getBottomLeft() const noexcept { return Point (pos.x, pos.y + h); } - - /** Returns the rectangle's bottom-right position as a Point. */ - Point getBottomRight() const noexcept { return Point (pos.x + w, pos.y + h); } - - /** Changes the rectangle's size, leaving the position of its top-left corner unchanged. */ - void setSize (const ValueType newWidth, const ValueType newHeight) noexcept { w = newWidth; h = newHeight; } - - /** Changes all the rectangle's coordinates. */ - void setBounds (const ValueType newX, const ValueType newY, - const ValueType newWidth, const ValueType newHeight) noexcept { pos.x = newX; pos.y = newY; w = newWidth; h = newHeight; } - - /** Changes the rectangle's X coordinate */ - inline void setX (const ValueType newX) noexcept { pos.x = newX; } - - /** Changes the rectangle's Y coordinate */ - inline void setY (const ValueType newY) noexcept { pos.y = newY; } - - /** Changes the rectangle's width */ - inline void setWidth (const ValueType newWidth) noexcept { w = newWidth; } - - /** Changes the rectangle's height */ - inline void setHeight (const ValueType newHeight) noexcept { h = newHeight; } - - /** Changes the position of the rectangle's centre (leaving its size unchanged). */ - inline void setCentre (const ValueType newCentreX, const ValueType newCentreY) noexcept { pos.x = newCentreX - w / (ValueType) 2; pos.y = newCentreY - h / (ValueType) 2; } - - /** Changes the position of the rectangle's centre (leaving its size unchanged). */ - inline void setCentre (const Point newCentre) noexcept { setCentre (newCentre.x, newCentre.y); } - - /** Returns a rectangle which has the same size and y-position as this one, but with a different x-position. */ - Rectangle withX (const ValueType newX) const noexcept { return Rectangle (newX, pos.y, w, h); } - - /** Returns a rectangle which has the same size and x-position as this one, but with a different y-position. */ - Rectangle withY (const ValueType newY) const noexcept { return Rectangle (pos.x, newY, w, h); } - - /** Returns a rectangle with the same size as this one, but a new position. */ - Rectangle withPosition (const ValueType newX, const ValueType newY) const noexcept { return Rectangle (newX, newY, w, h); } - - /** Returns a rectangle with the same size as this one, but a new position. */ - Rectangle withPosition (const Point newPos) const noexcept { return Rectangle (newPos.x, newPos.y, w, h); } - - /** Returns a rectangle whose size is the same as this one, but whose top-left position is (0, 0). */ - Rectangle withZeroOrigin() const noexcept { return Rectangle (w, h); } - - /** Returns a rectangle with the same size as this one, but a new centre position. */ - Rectangle withCentre (const Point newCentre) const noexcept { return Rectangle (newCentre.x - w / (ValueType) 2, - newCentre.y - h / (ValueType) 2, w, h); } - - /** Returns a rectangle which has the same position and height as this one, but with a different width. */ - Rectangle withWidth (ValueType newWidth) const noexcept { return Rectangle (pos.x, pos.y, newWidth, h); } - - /** Returns a rectangle which has the same position and width as this one, but with a different height. */ - Rectangle withHeight (ValueType newHeight) const noexcept { return Rectangle (pos.x, pos.y, w, newHeight); } - - /** Returns a rectangle with the same top-left position as this one, but a new size. */ - Rectangle withSize (ValueType newWidth, ValueType newHeight) const noexcept { return Rectangle (pos.x, pos.y, newWidth, newHeight); } - - /** Returns a rectangle with the same centre position as this one, but a new size. */ - Rectangle withSizeKeepingCentre (ValueType newWidth, ValueType newHeight) const noexcept { return Rectangle (pos.x + (w - newWidth) / (ValueType) 2, - pos.y + (h - newHeight) / (ValueType) 2, newWidth, newHeight); } - - /** Moves the x position, adjusting the width so that the right-hand edge remains in the same place. - If the x is moved to be on the right of the current right-hand edge, the width will be set to zero. - @see withLeft - */ - void setLeft (ValueType newLeft) noexcept { w = jmax (ValueType(), pos.x + w - newLeft); pos.x = newLeft; } - - /** Returns a new rectangle with a different x position, but the same right-hand edge as this one. - If the new x is beyond the right of the current right-hand edge, the width will be set to zero. - @see setLeft - */ - Rectangle withLeft (ValueType newLeft) const noexcept { return Rectangle (newLeft, pos.y, jmax (ValueType(), pos.x + w - newLeft), h); } - - /** Moves the y position, adjusting the height so that the bottom edge remains in the same place. - If the y is moved to be below the current bottom edge, the height will be set to zero. - @see withTop - */ - void setTop (ValueType newTop) noexcept { h = jmax (ValueType(), pos.y + h - newTop); pos.y = newTop; } - - /** Returns a new rectangle with a different y position, but the same bottom edge as this one. - If the new y is beyond the bottom of the current rectangle, the height will be set to zero. - @see setTop - */ - Rectangle withTop (ValueType newTop) const noexcept { return Rectangle (pos.x, newTop, w, jmax (ValueType(), pos.y + h - newTop)); } - - /** Adjusts the width so that the right-hand edge of the rectangle has this new value. - If the new right is below the current X value, the X will be pushed down to match it. - @see getRight, withRight - */ - void setRight (ValueType newRight) noexcept { pos.x = jmin (pos.x, newRight); w = newRight - pos.x; } - - /** Returns a new rectangle with a different right-hand edge position, but the same left-hand edge as this one. - If the new right edge is below the current left-hand edge, the width will be set to zero. - @see setRight - */ - Rectangle withRight (ValueType newRight) const noexcept { return Rectangle (jmin (pos.x, newRight), pos.y, jmax (ValueType(), newRight - pos.x), h); } - - /** Adjusts the height so that the bottom edge of the rectangle has this new value. - If the new bottom is lower than the current Y value, the Y will be pushed down to match it. - @see getBottom, withBottom - */ - void setBottom (ValueType newBottom) noexcept { pos.y = jmin (pos.y, newBottom); h = newBottom - pos.y; } - - /** Returns a new rectangle with a different bottom edge position, but the same top edge as this one. - If the new y is beyond the bottom of the current rectangle, the height will be set to zero. - @see setBottom - */ - Rectangle withBottom (ValueType newBottom) const noexcept { return Rectangle (pos.x, jmin (pos.y, newBottom), w, jmax (ValueType(), newBottom - pos.y)); } - - /** Returns a version of this rectangle with the given amount removed from its left-hand edge. */ - Rectangle withTrimmedLeft (ValueType amountToRemove) const noexcept { return withLeft (pos.x + amountToRemove); } - - /** Returns a version of this rectangle with the given amount removed from its right-hand edge. */ - Rectangle withTrimmedRight (ValueType amountToRemove) const noexcept { return withWidth (w - amountToRemove); } - - /** Returns a version of this rectangle with the given amount removed from its top edge. */ - Rectangle withTrimmedTop (ValueType amountToRemove) const noexcept { return withTop (pos.y + amountToRemove); } - - /** Returns a version of this rectangle with the given amount removed from its bottom edge. */ - Rectangle withTrimmedBottom (ValueType amountToRemove) const noexcept { return withHeight (h - amountToRemove); } - - //============================================================================== - /** Moves the rectangle's position by adding amount to its x and y coordinates. */ - void translate (const ValueType deltaX, - const ValueType deltaY) noexcept - { - pos.x += deltaX; - pos.y += deltaY; - } - - /** Returns a rectangle which is the same as this one moved by a given amount. */ - Rectangle translated (const ValueType deltaX, - const ValueType deltaY) const noexcept - { - return Rectangle (pos.x + deltaX, pos.y + deltaY, w, h); - } - - /** Returns a rectangle which is the same as this one moved by a given amount. */ - Rectangle operator+ (const Point deltaPosition) const noexcept - { - return Rectangle (pos.x + deltaPosition.x, pos.y + deltaPosition.y, w, h); - } - - /** Moves this rectangle by a given amount. */ - Rectangle& operator+= (const Point deltaPosition) noexcept - { - pos += deltaPosition; - return *this; - } - - /** Returns a rectangle which is the same as this one moved by a given amount. */ - Rectangle operator- (const Point deltaPosition) const noexcept - { - return Rectangle (pos.x - deltaPosition.x, pos.y - deltaPosition.y, w, h); - } - - /** Moves this rectangle by a given amount. */ - Rectangle& operator-= (const Point deltaPosition) noexcept - { - pos -= deltaPosition; - return *this; - } - - /** Returns a rectangle that has been scaled by the given amount, centred around the origin. - Note that if the rectangle has int coordinates and it's scaled by a - floating-point amount, then the result will be converted back to integer - coordinates using getSmallestIntegerContainer(). - */ - template - Rectangle operator* (FloatType scaleFactor) const noexcept - { - Rectangle r (*this); - r *= scaleFactor; - return r; - } - - /** Scales this rectangle by the given amount, centred around the origin. - Note that if the rectangle has int coordinates and it's scaled by a - floating-point amount, then the result will be converted back to integer - coordinates using getSmallestIntegerContainer(). - */ - template - Rectangle operator*= (FloatType scaleFactor) noexcept - { - Rectangle (pos.x * scaleFactor, - pos.y * scaleFactor, - w * scaleFactor, - h * scaleFactor).copyWithRounding (*this); - return *this; - } - - /** Scales this rectangle by the given X and Y factors, centred around the origin. - Note that if the rectangle has int coordinates and it's scaled by a - floating-point amount, then the result will be converted back to integer - coordinates using getSmallestIntegerContainer(). - */ - template - Rectangle operator*= (Point scaleFactor) noexcept - { - Rectangle (pos.x * scaleFactor.x, - pos.y * scaleFactor.y, - w * scaleFactor.x, - h * scaleFactor.y).copyWithRounding (*this); - return *this; - } - - /** Scales this rectangle by the given amount, centred around the origin. */ - template - Rectangle operator/ (FloatType scaleFactor) const noexcept - { - Rectangle r (*this); - r /= scaleFactor; - return r; - } - - /** Scales this rectangle by the given amount, centred around the origin. */ - template - Rectangle operator/= (FloatType scaleFactor) noexcept - { - Rectangle (pos.x / scaleFactor, - pos.y / scaleFactor, - w / scaleFactor, - h / scaleFactor).copyWithRounding (*this); - return *this; - } - - /** Scales this rectangle by the given X and Y factors, centred around the origin. */ - template - Rectangle operator/= (Point scaleFactor) noexcept - { - Rectangle (pos.x / scaleFactor.x, - pos.y / scaleFactor.y, - w / scaleFactor.x, - h / scaleFactor.y).copyWithRounding (*this); - return *this; - } - - /** Expands the rectangle by a given amount. - - Effectively, its new size is (x - deltaX, y - deltaY, w + deltaX * 2, h + deltaY * 2). - @see expanded, reduce, reduced - */ - void expand (const ValueType deltaX, - const ValueType deltaY) noexcept - { - const ValueType nw = jmax (ValueType(), w + deltaX * 2); - const ValueType nh = jmax (ValueType(), h + deltaY * 2); - setBounds (pos.x - deltaX, pos.y - deltaY, nw, nh); - } - - /** Returns a rectangle that is larger than this one by a given amount. - - Effectively, the rectangle returned is (x - deltaX, y - deltaY, w + deltaX * 2, h + deltaY * 2). - @see expand, reduce, reduced - */ - Rectangle expanded (const ValueType deltaX, - const ValueType deltaY) const noexcept - { - const ValueType nw = jmax (ValueType(), w + deltaX * 2); - const ValueType nh = jmax (ValueType(), h + deltaY * 2); - return Rectangle (pos.x - deltaX, pos.y - deltaY, nw, nh); - } - - /** Returns a rectangle that is larger than this one by a given amount. - - Effectively, the rectangle returned is (x - delta, y - delta, w + delta * 2, h + delta * 2). - @see expand, reduce, reduced - */ - Rectangle expanded (const ValueType delta) const noexcept - { - return expanded (delta, delta); - } - - /** Shrinks the rectangle by a given amount. - - Effectively, its new size is (x + deltaX, y + deltaY, w - deltaX * 2, h - deltaY * 2). - @see reduced, expand, expanded - */ - void reduce (const ValueType deltaX, - const ValueType deltaY) noexcept - { - expand (-deltaX, -deltaY); - } - - /** Returns a rectangle that is smaller than this one by a given amount. - - Effectively, the rectangle returned is (x + deltaX, y + deltaY, w - deltaX * 2, h - deltaY * 2). - @see reduce, expand, expanded - */ - Rectangle reduced (const ValueType deltaX, - const ValueType deltaY) const noexcept - { - return expanded (-deltaX, -deltaY); - } - - /** Returns a rectangle that is smaller than this one by a given amount. - - Effectively, the rectangle returned is (x + delta, y + delta, w - delta * 2, h - delta * 2). - @see reduce, expand, expanded - */ - Rectangle reduced (const ValueType delta) const noexcept - { - return reduced (delta, delta); - } - - /** Removes a strip from the top of this rectangle, reducing this rectangle - by the specified amount and returning the section that was removed. - - E.g. if this rectangle is (100, 100, 300, 300) and amountToRemove is 50, this will - return (100, 100, 300, 50) and leave this rectangle as (100, 150, 300, 250). - - If amountToRemove is greater than the height of this rectangle, it'll be clipped to - that value. - */ - Rectangle removeFromTop (const ValueType amountToRemove) noexcept - { - const Rectangle r (pos.x, pos.y, w, jmin (amountToRemove, h)); - pos.y += r.h; h -= r.h; - return r; - } - - /** Removes a strip from the left-hand edge of this rectangle, reducing this rectangle - by the specified amount and returning the section that was removed. - - E.g. if this rectangle is (100, 100, 300, 300) and amountToRemove is 50, this will - return (100, 100, 50, 300) and leave this rectangle as (150, 100, 250, 300). - - If amountToRemove is greater than the width of this rectangle, it'll be clipped to - that value. - */ - Rectangle removeFromLeft (const ValueType amountToRemove) noexcept - { - const Rectangle r (pos.x, pos.y, jmin (amountToRemove, w), h); - pos.x += r.w; w -= r.w; - return r; - } - - /** Removes a strip from the right-hand edge of this rectangle, reducing this rectangle - by the specified amount and returning the section that was removed. - - E.g. if this rectangle is (100, 100, 300, 300) and amountToRemove is 50, this will - return (250, 100, 50, 300) and leave this rectangle as (100, 100, 250, 300). - - If amountToRemove is greater than the width of this rectangle, it'll be clipped to - that value. - */ - Rectangle removeFromRight (ValueType amountToRemove) noexcept - { - amountToRemove = jmin (amountToRemove, w); - const Rectangle r (pos.x + w - amountToRemove, pos.y, amountToRemove, h); - w -= amountToRemove; - return r; - } - - /** Removes a strip from the bottom of this rectangle, reducing this rectangle - by the specified amount and returning the section that was removed. - - E.g. if this rectangle is (100, 100, 300, 300) and amountToRemove is 50, this will - return (100, 250, 300, 50) and leave this rectangle as (100, 100, 300, 250). - - If amountToRemove is greater than the height of this rectangle, it'll be clipped to - that value. - */ - Rectangle removeFromBottom (ValueType amountToRemove) noexcept - { - amountToRemove = jmin (amountToRemove, h); - const Rectangle r (pos.x, pos.y + h - amountToRemove, w, amountToRemove); - h -= amountToRemove; - return r; - } - - //============================================================================== - /** Returns true if the two rectangles are identical. */ - bool operator== (const Rectangle& other) const noexcept { return pos == other.pos && w == other.w && h == other.h; } - - /** Returns true if the two rectangles are not identical. */ - bool operator!= (const Rectangle& other) const noexcept { return pos != other.pos || w != other.w || h != other.h; } - - /** Returns true if this coordinate is inside the rectangle. */ - bool contains (const ValueType xCoord, const ValueType yCoord) const noexcept - { - return xCoord >= pos.x && yCoord >= pos.y && xCoord < pos.x + w && yCoord < pos.y + h; - } - - /** Returns true if this coordinate is inside the rectangle. */ - bool contains (const Point point) const noexcept - { - return point.x >= pos.x && point.y >= pos.y && point.x < pos.x + w && point.y < pos.y + h; - } - - /** Returns true if this other rectangle is completely inside this one. */ - bool contains (const Rectangle& other) const noexcept - { - return pos.x <= other.pos.x && pos.y <= other.pos.y - && pos.x + w >= other.pos.x + other.w && pos.y + h >= other.pos.y + other.h; - } - - /** Returns the nearest point to the specified point that lies within this rectangle. */ - Point getConstrainedPoint (const Point point) const noexcept - { - return Point (jlimit (pos.x, pos.x + w, point.x), - jlimit (pos.y, pos.y + h, point.y)); - } - - /** Returns a point within this rectangle, specified as proportional coordinates. - The relative X and Y values should be between 0 and 1, where 0 is the left or - top of this rectangle, and 1 is the right or bottom. (Out-of-bounds values - will return a point outside the rectangle). - */ - Point getRelativePoint (double relativeX, double relativeY) const noexcept - { - return Point (pos.x + static_cast (w * relativeX), - pos.y + static_cast (h * relativeY)); - } - - /** Returns true if any part of another rectangle overlaps this one. */ - bool intersects (const Rectangle& other) const noexcept - { - return pos.x + w > other.pos.x - && pos.y + h > other.pos.y - && pos.x < other.pos.x + other.w - && pos.y < other.pos.y + other.h - && w > ValueType() && h > ValueType() - && other.w > ValueType() && other.h > ValueType(); - } - - /** Returns true if any part of the given line lies inside this rectangle. */ - bool intersects (const Line& line) const noexcept - { - return contains (line.getStart()) || contains (line.getEnd()) - || line.intersects (Line (getTopLeft(), getTopRight())) - || line.intersects (Line (getTopRight(), getBottomRight())) - || line.intersects (Line (getBottomRight(), getBottomLeft())) - || line.intersects (Line (getBottomLeft(), getTopLeft())); - } - - /** Returns the region that is the overlap between this and another rectangle. - If the two rectangles don't overlap, the rectangle returned will be empty. - */ - Rectangle getIntersection (const Rectangle& other) const noexcept - { - const ValueType nx = jmax (pos.x, other.pos.x); - const ValueType ny = jmax (pos.y, other.pos.y); - const ValueType nw = jmin (pos.x + w, other.pos.x + other.w) - nx; - const ValueType nh = jmin (pos.y + h, other.pos.y + other.h) - ny; - - if (nw >= ValueType() && nh >= ValueType()) - return Rectangle (nx, ny, nw, nh); - - return Rectangle(); - } - - /** Clips a set of rectangle coordinates so that they lie only within this one. - This is a non-static version of intersectRectangles(). - Returns false if the two rectangles didn't overlap. - */ - bool intersectRectangle (ValueType& otherX, ValueType& otherY, ValueType& otherW, ValueType& otherH) const noexcept - { - const ValueType maxX (jmax (otherX, pos.x)); - otherW = jmin (otherX + otherW, pos.x + w) - maxX; - - if (otherW > ValueType()) - { - const ValueType maxY (jmax (otherY, pos.y)); - otherH = jmin (otherY + otherH, pos.y + h) - maxY; - - if (otherH > ValueType()) - { - otherX = maxX; otherY = maxY; - return true; - } - } - - return false; - } - - /** Clips a rectangle so that it lies only within this one. - Returns false if the two rectangles didn't overlap. - */ - bool intersectRectangle (Rectangle& rectangleToClip) const noexcept - { - return intersectRectangle (rectangleToClip.pos.x, rectangleToClip.pos.y, - rectangleToClip.w, rectangleToClip.h); - } - - /** Returns the smallest rectangle that contains both this one and the one passed-in. - - If either this or the other rectangle are empty, they will not be counted as - part of the resulting region. - */ - Rectangle getUnion (const Rectangle& other) const noexcept - { - if (other.isEmpty()) return *this; - if (isEmpty()) return other; - - const ValueType newX = jmin (pos.x, other.pos.x); - const ValueType newY = jmin (pos.y, other.pos.y); - - return Rectangle (newX, newY, - jmax (pos.x + w, other.pos.x + other.w) - newX, - jmax (pos.y + h, other.pos.y + other.h) - newY); - } - - /** If this rectangle merged with another one results in a simple rectangle, this - will set this rectangle to the result, and return true. - - Returns false and does nothing to this rectangle if the two rectangles don't overlap, - or if they form a complex region. - */ - bool enlargeIfAdjacent (const Rectangle& other) noexcept - { - if (pos.x == other.pos.x && getRight() == other.getRight() - && (other.getBottom() >= pos.y && other.pos.y <= getBottom())) - { - const ValueType newY = jmin (pos.y, other.pos.y); - h = jmax (getBottom(), other.getBottom()) - newY; - pos.y = newY; - return true; - } - - if (pos.y == other.pos.y && getBottom() == other.getBottom() - && (other.getRight() >= pos.x && other.pos.x <= getRight())) - { - const ValueType newX = jmin (pos.x, other.pos.x); - w = jmax (getRight(), other.getRight()) - newX; - pos.x = newX; - return true; - } - - return false; - } - - /** If after removing another rectangle from this one the result is a simple rectangle, - this will set this object's bounds to be the result, and return true. - - Returns false and does nothing to this rectangle if the two rectangles don't overlap, - or if removing the other one would form a complex region. - */ - bool reduceIfPartlyContainedIn (const Rectangle& other) noexcept - { - int inside = 0; - const ValueType otherR (other.getRight()); - if (pos.x >= other.pos.x && pos.x < otherR) inside = 1; - const ValueType otherB (other.getBottom()); - if (pos.y >= other.pos.y && pos.y < otherB) inside |= 2; - const ValueType r (pos.x + w); - if (r >= other.pos.x && r < otherR) inside |= 4; - const ValueType b (pos.y + h); - if (b >= other.pos.y && b < otherB) inside |= 8; - - switch (inside) - { - case 1 + 2 + 8: w = r - otherR; pos.x = otherR; return true; - case 1 + 2 + 4: h = b - otherB; pos.y = otherB; return true; - case 2 + 4 + 8: w = other.pos.x - pos.x; return true; - case 1 + 4 + 8: h = other.pos.y - pos.y; return true; - } - - return false; - } - - /** Tries to fit this rectangle within a target area, returning the result. - - If this rectangle is not completely inside the target area, then it'll be - shifted (without changing its size) so that it lies within the target. If it - is larger than the target rectangle in either dimension, then that dimension - will be reduced to fit within the target. - */ - Rectangle constrainedWithin (const Rectangle& areaToFitWithin) const noexcept - { - const ValueType newW (jmin (w, areaToFitWithin.getWidth())); - const ValueType newH (jmin (h, areaToFitWithin.getHeight())); - - return Rectangle (jlimit (areaToFitWithin.getX(), areaToFitWithin.getRight() - newW, pos.x), - jlimit (areaToFitWithin.getY(), areaToFitWithin.getBottom() - newH, pos.y), - newW, newH); - } - - /** Returns the smallest rectangle that can contain the shape created by applying - a transform to this rectangle. - - This should only be used on floating point rectangles. - */ - Rectangle transformedBy (const AffineTransform& transform) const noexcept - { - typedef typename TypeHelpers::SmallestFloatType::type FloatType; - - FloatType x1 = static_cast (pos.x), y1 = static_cast (pos.y); - FloatType x2 = static_cast (pos.x + w), y2 = static_cast (pos.y); - FloatType x3 = static_cast (pos.x), y3 = static_cast (pos.y + h); - FloatType x4 = static_cast (x2), y4 = static_cast (y3); - - transform.transformPoints (x1, y1, x2, y2); - transform.transformPoints (x3, y3, x4, y4); - - const FloatType rx1 = jmin (x1, x2, x3, x4); - const FloatType rx2 = jmax (x1, x2, x3, x4); - const FloatType ry1 = jmin (y1, y2, y3, y4); - const FloatType ry2 = jmax (y1, y2, y3, y4); - - Rectangle r; - Rectangle (rx1, ry1, rx2 - rx1, ry2 - ry1).copyWithRounding (r); - return r; - } - - /** Returns the smallest integer-aligned rectangle that completely contains this one. - This is only relevent for floating-point rectangles, of course. - @see toFloat() - */ - Rectangle getSmallestIntegerContainer() const noexcept - { - const int x1 = floorAsInt (pos.x); - const int y1 = floorAsInt (pos.y); - const int x2 = ceilAsInt (pos.x + w); - const int y2 = ceilAsInt (pos.y + h); - - return Rectangle (x1, y1, x2 - x1, y2 - y1); - } - - /** Casts this rectangle to a Rectangle. - @see getSmallestIntegerContainer - */ - Rectangle toFloat() const noexcept - { - return Rectangle (static_cast (pos.x), static_cast (pos.y), - static_cast (w), static_cast (h)); - } - - /** Casts this rectangle to a Rectangle. - @see getSmallestIntegerContainer - */ - Rectangle toDouble() const noexcept - { - return Rectangle (static_cast (pos.x), static_cast (pos.y), - static_cast (w), static_cast (h)); - } - - /** Casts this rectangle to a Rectangle with the given type. - If the target type is a conversion from float to int, then the conversion - will be done using getSmallestIntegerContainer(). - */ - template - Rectangle toType() const noexcept - { - Rectangle r; - copyWithRounding (r); - return r; - } - - /** Returns the smallest Rectangle that can contain a set of points. */ - static Rectangle findAreaContainingPoints (const Point* const points, const int numPoints) noexcept - { - if (numPoints == 0) - return Rectangle(); - - ValueType minX (points[0].x); - ValueType maxX (minX); - ValueType minY (points[0].y); - ValueType maxY (minY); - - for (int i = 1; i < numPoints; ++i) - { - minX = jmin (minX, points[i].x); - maxX = jmax (maxX, points[i].x); - minY = jmin (minY, points[i].y); - maxY = jmax (maxY, points[i].y); - } - - return Rectangle (minX, minY, maxX - minX, maxY - minY); - } - - //============================================================================== - /** Static utility to intersect two sets of rectangular coordinates. - Returns false if the two regions didn't overlap. - @see intersectRectangle - */ - static bool intersectRectangles (ValueType& x1, ValueType& y1, ValueType& w1, ValueType& h1, - const ValueType x2, const ValueType y2, const ValueType w2, const ValueType h2) noexcept - { - const ValueType x (jmax (x1, x2)); - w1 = jmin (x1 + w1, x2 + w2) - x; - - if (w1 > ValueType()) - { - const ValueType y (jmax (y1, y2)); - h1 = jmin (y1 + h1, y2 + h2) - y; - - if (h1 > ValueType()) - { - x1 = x; y1 = y; - return true; - } - } - - return false; - } - - //============================================================================== - /** Creates a string describing this rectangle. - - The string will be of the form "x y width height", e.g. "100 100 400 200". - - Coupled with the fromString() method, this is very handy for things like - storing rectangles (particularly component positions) in XML attributes. - - @see fromString - */ - String toString() const - { - String s; - s.preallocateBytes (32); - s << pos.x << ' ' << pos.y << ' ' << w << ' ' << h; - return s; - } - - /** Parses a string containing a rectangle's details. - - The string should contain 4 integer tokens, in the form "x y width height". They - can be comma or whitespace separated. - - This method is intended to go with the toString() method, to form an easy way - of saving/loading rectangles as strings. - - @see toString - */ - static Rectangle fromString (StringRef stringVersion) - { - StringArray toks; - toks.addTokens (stringVersion.text.findEndOfWhitespace(), ",; \t\r\n", ""); - - return Rectangle (parseIntAfterSpace (toks[0]), - parseIntAfterSpace (toks[1]), - parseIntAfterSpace (toks[2]), - parseIntAfterSpace (toks[3])); - } - - #ifndef DOXYGEN - // This has been renamed by transformedBy, in order to match the method names used in the Point class. - JUCE_DEPRECATED_WITH_BODY (Rectangle transformed (const AffineTransform& t) const noexcept, { return transformedBy (t); }) - #endif - -private: - template friend class Rectangle; - - Point pos; - ValueType w, h; - - static int parseIntAfterSpace (StringRef s) noexcept - { return s.text.findEndOfWhitespace().getIntValue32(); } - - void copyWithRounding (Rectangle& result) const noexcept { result = getSmallestIntegerContainer(); } - void copyWithRounding (Rectangle& result) const noexcept { result = toFloat(); } - void copyWithRounding (Rectangle& result) const noexcept { result = toDouble(); } - - static int floorAsInt (int n) noexcept { return n; } - static int floorAsInt (float n) noexcept { return (int) std::floor (n); } - static int floorAsInt (double n) noexcept { return (int) std::floor (n); } - static int ceilAsInt (int n) noexcept { return n; } - static int ceilAsInt (float n) noexcept { return (int) std::ceil (n); } - static int ceilAsInt (double n) noexcept { return (int) std::ceil (n); } -}; - - -#endif // JUCE_RECTANGLE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h b/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h deleted file mode 100755 index f1b81a7..0000000 --- a/JuceLibraryCode/modules/juce_graphics/geometry/juce_RectangleList.h +++ /dev/null @@ -1,648 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_RECTANGLELIST_H_INCLUDED -#define JUCE_RECTANGLELIST_H_INCLUDED - - -//============================================================================== -/** - Maintains a set of rectangles as a complex region. - - This class allows a set of rectangles to be treated as a solid shape, and can - add and remove rectangular sections of it, and simplify overlapping or - adjacent rectangles. - - @see Rectangle -*/ -template -class RectangleList -{ -public: - typedef Rectangle RectangleType; - - //============================================================================== - /** Creates an empty RectangleList */ - RectangleList() noexcept {} - - /** Creates a copy of another list */ - RectangleList (const RectangleList& other) : rects (other.rects) - { - } - - /** Creates a list containing just one rectangle. */ - RectangleList (const RectangleType& rect) - { - addWithoutMerging (rect); - } - - /** Copies this list from another one. */ - RectangleList& operator= (const RectangleList& other) - { - rects = other.rects; - return *this; - } - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - RectangleList (RectangleList&& other) noexcept - : rects (static_cast&&> (other.rects)) - { - } - - RectangleList& operator= (RectangleList&& other) noexcept - { - rects = static_cast&&> (other.rects); - return *this; - } - #endif - - //============================================================================== - /** Returns true if the region is empty. */ - bool isEmpty() const noexcept { return rects.size() == 0; } - - /** Returns the number of rectangles in the list. */ - int getNumRectangles() const noexcept { return rects.size(); } - - /** Returns one of the rectangles at a particular index. - @returns the rectangle at the index, or an empty rectangle if the index is out-of-range. - */ - RectangleType getRectangle (int index) const noexcept { return rects[index]; } - - //============================================================================== - /** Removes all rectangles to leave an empty region. */ - void clear() - { - rects.clearQuick(); - } - - /** Merges a new rectangle into the list. - - The rectangle being added will first be clipped to remove any parts of it - that overlap existing rectangles in the list, and adjacent rectangles will be - merged into it. - */ - void add (const RectangleType& rect) - { - if (! rect.isEmpty()) - { - if (rects.size() == 0) - { - rects.add (rect); - } - else - { - bool anyOverlaps = false; - - for (int j = rects.size(); --j >= 0;) - { - RectangleType& ourRect = rects.getReference (j); - - if (rect.intersects (ourRect)) - { - if (rect.contains (ourRect)) - rects.remove (j); - else if (! ourRect.reduceIfPartlyContainedIn (rect)) - anyOverlaps = true; - } - } - - if (anyOverlaps && rects.size() > 0) - { - RectangleList r (rect); - - for (int i = rects.size(); --i >= 0;) - { - const RectangleType& ourRect = rects.getReference (i); - - if (rect.intersects (ourRect)) - { - r.subtract (ourRect); - - if (r.rects.size() == 0) - return; - } - } - - rects.addArray (r.rects); - } - else - { - rects.add (rect); - } - } - } - } - - /** Merges a new rectangle into the list. - - The rectangle being added will first be clipped to remove any parts of it - that overlap existing rectangles in the list. - */ - void add (ValueType x, ValueType y, ValueType width, ValueType height) - { - add (RectangleType (x, y, width, height)); - } - - /** Dumbly adds a rectangle to the list without checking for overlaps. - - This simply adds the rectangle to the end, it doesn't merge it or remove - any overlapping bits. - */ - void addWithoutMerging (const RectangleType& rect) - { - if (! rect.isEmpty()) - rects.add (rect); - } - - /** Merges another rectangle list into this one. - - Any overlaps between the two lists will be clipped, so that the result is - the union of both lists. - */ - void add (const RectangleList& other) - { - for (const RectangleType* r = other.begin(), * const e = other.end(); r != e; ++r) - add (*r); - } - - /** Removes a rectangular region from the list. - - Any rectangles in the list which overlap this will be clipped and subdivided - if necessary. - */ - void subtract (const RectangleType& rect) - { - const int originalNumRects = rects.size(); - - if (originalNumRects > 0) - { - const ValueType x1 = rect.getX(); - const ValueType y1 = rect.getY(); - const ValueType x2 = x1 + rect.getWidth(); - const ValueType y2 = y1 + rect.getHeight(); - - for (int i = getNumRectangles(); --i >= 0;) - { - RectangleType& r = rects.getReference (i); - - const ValueType rx1 = r.getX(); - const ValueType ry1 = r.getY(); - const ValueType rx2 = rx1 + r.getWidth(); - const ValueType ry2 = ry1 + r.getHeight(); - - if (! (x2 <= rx1 || x1 >= rx2 || y2 <= ry1 || y1 >= ry2)) - { - if (x1 > rx1 && x1 < rx2) - { - if (y1 <= ry1 && y2 >= ry2 && x2 >= rx2) - { - r.setWidth (x1 - rx1); - } - else - { - r.setX (x1); - r.setWidth (rx2 - x1); - - rects.insert (++i, RectangleType (rx1, ry1, x1 - rx1, ry2 - ry1)); - ++i; - } - } - else if (x2 > rx1 && x2 < rx2) - { - r.setX (x2); - r.setWidth (rx2 - x2); - - if (y1 > ry1 || y2 < ry2 || x1 > rx1) - { - rects.insert (++i, RectangleType (rx1, ry1, x2 - rx1, ry2 - ry1)); - ++i; - } - } - else if (y1 > ry1 && y1 < ry2) - { - if (x1 <= rx1 && x2 >= rx2 && y2 >= ry2) - { - r.setHeight (y1 - ry1); - } - else - { - r.setY (y1); - r.setHeight (ry2 - y1); - - rects.insert (++i, RectangleType (rx1, ry1, rx2 - rx1, y1 - ry1)); - ++i; - } - } - else if (y2 > ry1 && y2 < ry2) - { - r.setY (y2); - r.setHeight (ry2 - y2); - - if (x1 > rx1 || x2 < rx2 || y1 > ry1) - { - rects.insert (++i, RectangleType (rx1, ry1, rx2 - rx1, y2 - ry1)); - ++i; - } - } - else - { - rects.remove (i); - } - } - } - } - } - - /** Removes all areas in another RectangleList from this one. - - Any rectangles in the list which overlap this will be clipped and subdivided - if necessary. - - @returns true if the resulting list is non-empty. - */ - bool subtract (const RectangleList& otherList) - { - for (int i = otherList.rects.size(); --i >= 0 && rects.size() > 0;) - subtract (otherList.rects.getReference (i)); - - return rects.size() > 0; - } - - /** Removes any areas of the region that lie outside a given rectangle. - - Any rectangles in the list which overlap this will be clipped and subdivided - if necessary. - - Returns true if the resulting region is not empty, false if it is empty. - - @see getIntersectionWith - */ - bool clipTo (const RectangleType& rect) - { - bool notEmpty = false; - - if (rect.isEmpty()) - { - clear(); - } - else - { - for (int i = rects.size(); --i >= 0;) - { - RectangleType& r = rects.getReference (i); - - if (! rect.intersectRectangle (r)) - rects.remove (i); - else - notEmpty = true; - } - } - - return notEmpty; - } - - /** Removes any areas of the region that lie outside a given rectangle list. - - Any rectangles in this object which overlap the specified list will be clipped - and subdivided if necessary. - - Returns true if the resulting region is not empty, false if it is empty. - - @see getIntersectionWith - */ - template - bool clipTo (const RectangleList& other) - { - if (rects.size() == 0) - return false; - - RectangleList result; - - for (int j = 0; j < rects.size(); ++j) - { - const RectangleType& rect = rects.getReference (j); - - for (const Rectangle* r = other.begin(), * const e = other.end(); r != e; ++r) - { - RectangleType clipped (r->template toType()); - - if (rect.intersectRectangle (clipped)) - result.rects.add (clipped); - } - } - - swapWith (result); - return ! isEmpty(); - } - - /** Creates a region which is the result of clipping this one to a given rectangle. - - Unlike the other clipTo method, this one doesn't affect this object - it puts the - resulting region into the list whose reference is passed-in. - - Returns true if the resulting region is not empty, false if it is empty. - - @see clipTo - */ - bool getIntersectionWith (const RectangleType& rect, RectangleList& destRegion) const - { - destRegion.clear(); - - if (! rect.isEmpty()) - { - for (int i = rects.size(); --i >= 0;) - { - RectangleType r (rects.getReference (i)); - - if (rect.intersectRectangle (r)) - destRegion.rects.add (r); - } - } - - return destRegion.rects.size() > 0; - } - - /** Swaps the contents of this and another list. - - This swaps their internal pointers, so is hugely faster than using copy-by-value - to swap them. - */ - void swapWith (RectangleList& otherList) noexcept - { - rects.swapWith (otherList.rects); - } - - //============================================================================== - /** Checks whether the region contains a given point. - @returns true if the point lies within one of the rectangles in the list - */ - bool containsPoint (Point point) const noexcept - { - for (const RectangleType* r = rects.begin(), * const e = rects.end(); r != e; ++r) - if (r->contains (point)) - return true; - - return false; - } - - /** Checks whether the region contains a given point. - @returns true if the point lies within one of the rectangles in the list - */ - bool containsPoint (ValueType x, ValueType y) const noexcept - { - return containsPoint (Point (x, y)); - } - - /** Checks whether the region contains the whole of a given rectangle. - - @returns true all parts of the rectangle passed in lie within the region - defined by this object - @see intersectsRectangle, containsPoint - */ - bool containsRectangle (const RectangleType& rectangleToCheck) const - { - if (rects.size() > 1) - { - RectangleList r (rectangleToCheck); - - for (int i = rects.size(); --i >= 0;) - { - r.subtract (rects.getReference (i)); - - if (r.rects.size() == 0) - return true; - } - } - else if (rects.size() > 0) - { - return rects.getReference (0).contains (rectangleToCheck); - } - - return false; - } - - /** Checks whether the region contains any part of a given rectangle. - - @returns true if any part of the rectangle passed in lies within the region - defined by this object - @see containsRectangle - */ - bool intersectsRectangle (const RectangleType& rectangleToCheck) const noexcept - { - for (const RectangleType* r = rects.begin(), * const e = rects.end(); r != e; ++r) - if (r->intersects (rectangleToCheck)) - return true; - - return false; - } - - /** Checks whether this region intersects any part of another one. - - @see intersectsRectangle - */ - bool intersects (const RectangleList& other) const noexcept - { - for (const RectangleType* r = rects.begin(), * const e = rects.end(); r != e; ++r) - if (other.intersectsRectangle (*r)) - return true; - - return false; - } - - //============================================================================== - /** Returns the smallest rectangle that can enclose the whole of this region. */ - RectangleType getBounds() const noexcept - { - if (rects.size() <= 1) - { - if (rects.size() == 0) - return RectangleType(); - - return rects.getReference (0); - } - - const RectangleType& r = rects.getReference (0); - - ValueType minX = r.getX(); - ValueType minY = r.getY(); - ValueType maxX = minX + r.getWidth(); - ValueType maxY = minY + r.getHeight(); - - for (int i = rects.size(); --i > 0;) - { - const RectangleType& r2 = rects.getReference (i); - - minX = jmin (minX, r2.getX()); - minY = jmin (minY, r2.getY()); - maxX = jmax (maxX, r2.getRight()); - maxY = jmax (maxY, r2.getBottom()); - } - - return RectangleType (minX, minY, maxX - minX, maxY - minY); - } - - /** Optimises the list into a minimum number of constituent rectangles. - - This will try to combine any adjacent rectangles into larger ones where - possible, to simplify lists that might have been fragmented by repeated - add/subtract calls. - */ - void consolidate() - { - for (int i = 0; i < getNumRectangles() - 1; ++i) - { - RectangleType& r = rects.getReference (i); - const ValueType rx1 = r.getX(); - const ValueType ry1 = r.getY(); - const ValueType rx2 = rx1 + r.getWidth(); - const ValueType ry2 = ry1 + r.getHeight(); - - for (int j = rects.size(); --j > i;) - { - RectangleType& r2 = rects.getReference (j); - const ValueType jrx1 = r2.getX(); - const ValueType jry1 = r2.getY(); - const ValueType jrx2 = jrx1 + r2.getWidth(); - const ValueType jry2 = jry1 + r2.getHeight(); - - // if the vertical edges of any blocks are touching and their horizontals don't - // line up, split them horizontally.. - if (jrx1 == rx2 || jrx2 == rx1) - { - if (jry1 > ry1 && jry1 < ry2) - { - r.setHeight (jry1 - ry1); - rects.add (RectangleType (rx1, jry1, rx2 - rx1, ry2 - jry1)); - i = -1; - break; - } - - if (jry2 > ry1 && jry2 < ry2) - { - r.setHeight (jry2 - ry1); - rects.add (RectangleType (rx1, jry2, rx2 - rx1, ry2 - jry2)); - i = -1; - break; - } - else if (ry1 > jry1 && ry1 < jry2) - { - r2.setHeight (ry1 - jry1); - rects.add (RectangleType (jrx1, ry1, jrx2 - jrx1, jry2 - ry1)); - i = -1; - break; - } - else if (ry2 > jry1 && ry2 < jry2) - { - r2.setHeight (ry2 - jry1); - rects.add (RectangleType (jrx1, ry2, jrx2 - jrx1, jry2 - ry2)); - i = -1; - break; - } - } - } - } - - for (int i = 0; i < rects.size() - 1; ++i) - { - RectangleType& r = rects.getReference (i); - - for (int j = rects.size(); --j > i;) - { - if (r.enlargeIfAdjacent (rects.getReference (j))) - { - rects.remove (j); - i = -1; - break; - } - } - } - } - - /** Adds an x and y value to all the coordinates. */ - void offsetAll (Point offset) noexcept - { - for (RectangleType* r = rects.begin(), * const e = rects.end(); r != e; ++r) - *r += offset; - } - - /** Adds an x and y value to all the coordinates. */ - void offsetAll (ValueType dx, ValueType dy) noexcept - { - offsetAll (Point (dx, dy)); - } - - /** Scales all the coordinates. */ - template - void scaleAll (ScaleType scaleFactor) noexcept - { - for (RectangleType* r = rects.begin(), * const e = rects.end(); r != e; ++r) - *r *= scaleFactor; - } - - /** Applies a transform to all the rectangles. - Obviously this will create a mess if the transform involves any - rotation or skewing. - */ - void transformAll (const AffineTransform& transform) noexcept - { - for (RectangleType* r = rects.begin(), * const e = rects.end(); r != e; ++r) - *r = r->transformedBy (transform); - } - - //============================================================================== - /** Creates a Path object to represent this region. */ - Path toPath() const - { - Path p; - - for (int i = 0; i < rects.size(); ++i) - p.addRectangle (rects.getReference (i)); - - return p; - } - - //============================================================================== - /** Standard method for iterating the rectangles in the list. */ - const RectangleType* begin() const noexcept { return rects.begin(); } - /** Standard method for iterating the rectangles in the list. */ - const RectangleType* end() const noexcept { return rects.end(); } - - /** Increases the internal storage to hold a minimum number of rectangles. - Calling this before adding a large number of rectangles means that - the array won't have to keep dynamically resizing itself as the elements - are added, and it'll therefore be more efficient. - @see Array::ensureStorageAllocated - */ - void ensureStorageAllocated (int minNumRectangles) - { - rects.ensureStorageAllocated (minNumRectangles); - } - -private: - //============================================================================== - Array rects; -}; - - -#endif // JUCE_RECTANGLELIST_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/README b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/README deleted file mode 100755 index 86cc206..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/README +++ /dev/null @@ -1,385 +0,0 @@ -The Independent JPEG Group's JPEG software -========================================== - -README for release 6b of 27-Mar-1998 -==================================== - -This distribution contains the sixth public release of the Independent JPEG -Group's free JPEG software. You are welcome to redistribute this software and -to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. - -Serious users of this software (particularly those incorporating it into -larger programs) should contact IJG at jpeg-info@uunet.uu.net to be added to -our electronic mailing list. Mailing list members are notified of updates -and have a chance to participate in technical discussions, etc. - -This software is the work of Tom Lane, Philip Gladstone, Jim Boucher, -Lee Crocker, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, -Guido Vollbeding, Ge' Weijers, and other members of the Independent JPEG -Group. - -IJG is not affiliated with the official ISO JPEG standards committee. - - -DOCUMENTATION ROADMAP -===================== - -This file contains the following sections: - -OVERVIEW General description of JPEG and the IJG software. -LEGAL ISSUES Copyright, lack of warranty, terms of distribution. -REFERENCES Where to learn more about JPEG. -ARCHIVE LOCATIONS Where to find newer versions of this software. -RELATED SOFTWARE Other stuff you should get. -FILE FORMAT WARS Software *not* to get. -TO DO Plans for future IJG releases. - -Other documentation files in the distribution are: - -User documentation: - install.doc How to configure and install the IJG software. - usage.doc Usage instructions for cjpeg, djpeg, jpegtran, - rdjpgcom, and wrjpgcom. - *.1 Unix-style man pages for programs (same info as usage.doc). - wizard.doc Advanced usage instructions for JPEG wizards only. - change.log Version-to-version change highlights. -Programmer and internal documentation: - libjpeg.doc How to use the JPEG library in your own programs. - example.c Sample code for calling the JPEG library. - structure.doc Overview of the JPEG library's internal structure. - filelist.doc Road map of IJG files. - coderules.doc Coding style rules --- please read if you contribute code. - -Please read at least the files install.doc and usage.doc. Useful information -can also be found in the JPEG FAQ (Frequently Asked Questions) article. See -ARCHIVE LOCATIONS below to find out where to obtain the FAQ article. - -If you want to understand how the JPEG code works, we suggest reading one or -more of the REFERENCES, then looking at the documentation files (in roughly -the order listed) before diving into the code. - - -OVERVIEW -======== - -This package contains C software to implement JPEG image compression and -decompression. JPEG (pronounced "jay-peg") is a standardized compression -method for full-color and gray-scale images. JPEG is intended for compressing -"real-world" scenes; line drawings, cartoons and other non-realistic images -are not its strong suit. JPEG is lossy, meaning that the output image is not -exactly identical to the input image. Hence you must not use JPEG if you -have to have identical output bits. However, on typical photographic images, -very good compression levels can be obtained with no visible change, and -remarkably high compression levels are possible if you can tolerate a -low-quality image. For more details, see the references, or just experiment -with various compression settings. - -This software implements JPEG baseline, extended-sequential, and progressive -compression processes. Provision is made for supporting all variants of these -processes, although some uncommon parameter settings aren't implemented yet. -For legal reasons, we are not distributing code for the arithmetic-coding -variants of JPEG; see LEGAL ISSUES. We have made no provision for supporting -the hierarchical or lossless processes defined in the standard. - -We provide a set of library routines for reading and writing JPEG image files, -plus two sample applications "cjpeg" and "djpeg", which use the library to -perform conversion between JPEG and some other popular image file formats. -The library is intended to be reused in other applications. - -In order to support file conversion and viewing software, we have included -considerable functionality beyond the bare JPEG coding/decoding capability; -for example, the color quantization modules are not strictly part of JPEG -decoding, but they are essential for output to colormapped file formats or -colormapped displays. These extra functions can be compiled out of the -library if not required for a particular application. We have also included -"jpegtran", a utility for lossless transcoding between different JPEG -processes, and "rdjpgcom" and "wrjpgcom", two simple applications for -inserting and extracting textual comments in JFIF files. - -The emphasis in designing this software has been on achieving portability and -flexibility, while also making it fast enough to be useful. In particular, -the software is not intended to be read as a tutorial on JPEG. (See the -REFERENCES section for introductory material.) Rather, it is intended to -be reliable, portable, industrial-strength code. We do not claim to have -achieved that goal in every aspect of the software, but we strive for it. - -We welcome the use of this software as a component of commercial products. -No royalty is required, but we do ask for an acknowledgement in product -documentation, as described under LEGAL ISSUES. - - -LEGAL ISSUES -============ - -In plain English: - -1. We don't promise that this software works. (But if you find any bugs, - please let us know!) -2. You can use this software for whatever you want. You don't have to pay us. -3. You may not pretend that you wrote this software. If you use it in a - program, you must acknowledge somewhere in your documentation that - you've used the IJG code. - -In legalese: - -The authors make NO WARRANTY or representation, either express or implied, -with respect to this software, its quality, accuracy, merchantability, or -fitness for a particular purpose. This software is provided "AS IS", and you, -its user, assume the entire risk as to its quality and accuracy. - -This software is copyright (C) 1991-1998, Thomas G. Lane. -All Rights Reserved except as specified below. - -Permission is hereby granted to use, copy, modify, and distribute this -software (or portions thereof) for any purpose, without fee, subject to these -conditions: -(1) If any part of the source code for this software is distributed, then this -README file must be included, with this copyright and no-warranty notice -unaltered; and any additions, deletions, or changes to the original files -must be clearly indicated in accompanying documentation. -(2) If only executable code is distributed, then the accompanying -documentation must state that "this software is based in part on the work of -the Independent JPEG Group". -(3) Permission for use of this software is granted only if the user accepts -full responsibility for any undesirable consequences; the authors accept -NO LIABILITY for damages of any kind. - -These conditions apply to any software derived from or based on the IJG code, -not just to the unmodified library. If you use our work, you ought to -acknowledge us. - -Permission is NOT granted for the use of any IJG author's name or company name -in advertising or publicity relating to this software or products derived from -it. This software may be referred to only as "the Independent JPEG Group's -software". - -We specifically permit and encourage the use of this software as the basis of -commercial products, provided that all warranty or liability claims are -assumed by the product vendor. - - -ansi2knr.c is included in this distribution by permission of L. Peter Deutsch, -sole proprietor of its copyright holder, Aladdin Enterprises of Menlo Park, CA. -ansi2knr.c is NOT covered by the above copyright and conditions, but instead -by the usual distribution terms of the Free Software Foundation; principally, -that you must include source code if you redistribute it. (See the file -ansi2knr.c for full details.) However, since ansi2knr.c is not needed as part -of any program generated from the IJG code, this does not limit you more than -the foregoing paragraphs do. - -The Unix configuration script "configure" was produced with GNU Autoconf. -It is copyright by the Free Software Foundation but is freely distributable. -The same holds for its supporting scripts (config.guess, config.sub, -ltconfig, ltmain.sh). Another support script, install-sh, is copyright -by M.I.T. but is also freely distributable. - -It appears that the arithmetic coding option of the JPEG spec is covered by -patents owned by IBM, AT&T, and Mitsubishi. Hence arithmetic coding cannot -legally be used without obtaining one or more licenses. For this reason, -support for arithmetic coding has been removed from the free JPEG software. -(Since arithmetic coding provides only a marginal gain over the unpatented -Huffman mode, it is unlikely that very many implementations will support it.) -So far as we are aware, there are no patent restrictions on the remaining -code. - -The IJG distribution formerly included code to read and write GIF files. -To avoid entanglement with the Unisys LZW patent, GIF reading support has -been removed altogether, and the GIF writer has been simplified to produce -"uncompressed GIFs". This technique does not use the LZW algorithm; the -resulting GIF files are larger than usual, but are readable by all standard -GIF decoders. - -We are required to state that - "The Graphics Interchange Format(c) is the Copyright property of - CompuServe Incorporated. GIF(sm) is a Service Mark property of - CompuServe Incorporated." - - -REFERENCES -========== - -We highly recommend reading one or more of these references before trying to -understand the innards of the JPEG software. - -The best short technical introduction to the JPEG compression algorithm is - Wallace, Gregory K. "The JPEG Still Picture Compression Standard", - Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44. -(Adjacent articles in that issue discuss MPEG motion picture compression, -applications of JPEG, and related topics.) If you don't have the CACM issue -handy, a PostScript file containing a revised version of Wallace's article is -available at ftp://ftp.uu.net/graphics/jpeg/wallace.ps.gz. The file (actually -a preprint for an article that appeared in IEEE Trans. Consumer Electronics) -omits the sample images that appeared in CACM, but it includes corrections -and some added material. Note: the Wallace article is copyright ACM and IEEE, -and it may not be used for commercial purposes. - -A somewhat less technical, more leisurely introduction to JPEG can be found in -"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by -M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides -good explanations and example C code for a multitude of compression methods -including JPEG. It is an excellent source if you are comfortable reading C -code but don't know much about data compression in general. The book's JPEG -sample code is far from industrial-strength, but when you are ready to look -at a full implementation, you've got one here... - -The best full description of JPEG is the textbook "JPEG Still Image Data -Compression Standard" by William B. Pennebaker and Joan L. Mitchell, published -by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1. Price US$59.95, 638 pp. -The book includes the complete text of the ISO JPEG standards (DIS 10918-1 -and draft DIS 10918-2). This is by far the most complete exposition of JPEG -in existence, and we highly recommend it. - -The JPEG standard itself is not available electronically; you must order a -paper copy through ISO or ITU. (Unless you feel a need to own a certified -official copy, we recommend buying the Pennebaker and Mitchell book instead; -it's much cheaper and includes a great deal of useful explanatory material.) -In the USA, copies of the standard may be ordered from ANSI Sales at (212) -642-4900, or from Global Engineering Documents at (800) 854-7179. (ANSI -doesn't take credit card orders, but Global does.) It's not cheap: as of -1992, ANSI was charging $95 for Part 1 and $47 for Part 2, plus 7% -shipping/handling. The standard is divided into two parts, Part 1 being the -actual specification, while Part 2 covers compliance testing methods. Part 1 -is titled "Digital Compression and Coding of Continuous-tone Still Images, -Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS -10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of -Continuous-tone Still Images, Part 2: Compliance testing" and has document -numbers ISO/IEC IS 10918-2, ITU-T T.83. - -Some extensions to the original JPEG standard are defined in JPEG Part 3, -a newer ISO standard numbered ISO/IEC IS 10918-3 and ITU-T T.84. IJG -currently does not support any Part 3 extensions. - -The JPEG standard does not specify all details of an interchangeable file -format. For the omitted details we follow the "JFIF" conventions, revision -1.02. A copy of the JFIF spec is available from: - Literature Department - C-Cube Microsystems, Inc. - 1778 McCarthy Blvd. - Milpitas, CA 95035 - phone (408) 944-6300, fax (408) 944-6314 -A PostScript version of this document is available by FTP at -ftp://ftp.uu.net/graphics/jpeg/jfif.ps.gz. There is also a plain text -version at ftp://ftp.uu.net/graphics/jpeg/jfif.txt.gz, but it is missing -the figures. - -The TIFF 6.0 file format specification can be obtained by FTP from -ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme -found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems. -IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6). -Instead, we recommend the JPEG design proposed by TIFF Technical Note #2 -(Compression tag 7). Copies of this Note can be obtained from ftp.sgi.com or -from ftp://ftp.uu.net/graphics/jpeg/. It is expected that the next revision -of the TIFF spec will replace the 6.0 JPEG design with the Note's design. -Although IJG's own code does not support TIFF/JPEG, the free libtiff library -uses our library to implement TIFF/JPEG per the Note. libtiff is available -from ftp://ftp.sgi.com/graphics/tiff/. - - -ARCHIVE LOCATIONS -================= - -The "official" archive site for this software is ftp.uu.net (Internet -address 192.48.96.9). The most recent released version can always be found -there in directory graphics/jpeg. This particular version will be archived -as ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz. If you don't have -direct Internet access, UUNET's archives are also available via UUCP; contact -help@uunet.uu.net for information on retrieving files that way. - -Numerous Internet sites maintain copies of the UUNET files. However, only -ftp.uu.net is guaranteed to have the latest official version. - -You can also obtain this software in DOS-compatible "zip" archive format from -the SimTel archives (ftp://ftp.simtel.net/pub/simtelnet/msdos/graphics/), or -on CompuServe in the Graphics Support forum (GO CIS:GRAPHSUP), library 12 -"JPEG Tools". Again, these versions may sometimes lag behind the ftp.uu.net -release. - -The JPEG FAQ (Frequently Asked Questions) article is a useful source of -general information about JPEG. It is updated constantly and therefore is -not included in this distribution. The FAQ is posted every two weeks to -Usenet newsgroups comp.graphics.misc, news.answers, and other groups. -It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/ -and other news.answers archive sites, including the official news.answers -archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/. -If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu -with body - send usenet/news.answers/jpeg-faq/part1 - send usenet/news.answers/jpeg-faq/part2 - - -RELATED SOFTWARE -================ - -Numerous viewing and image manipulation programs now support JPEG. (Quite a -few of them use this library to do so.) The JPEG FAQ described above lists -some of the more popular free and shareware viewers, and tells where to -obtain them on Internet. - -If you are on a Unix machine, we highly recommend Jef Poskanzer's free -PBMPLUS software, which provides many useful operations on PPM-format image -files. In particular, it can convert PPM images to and from a wide range of -other formats, thus making cjpeg/djpeg considerably more useful. The latest -version is distributed by the NetPBM group, and is available from numerous -sites, notably ftp://wuarchive.wustl.edu/graphics/graphics/packages/NetPBM/. -Unfortunately PBMPLUS/NETPBM is not nearly as portable as the IJG software is; -you are likely to have difficulty making it work on any non-Unix machine. - -A different free JPEG implementation, written by the PVRG group at Stanford, -is available from ftp://havefun.stanford.edu/pub/jpeg/. This program -is designed for research and experimentation rather than production use; -it is slower, harder to use, and less portable than the IJG code, but it -is easier to read and modify. Also, the PVRG code supports lossless JPEG, -which we do not. (On the other hand, it doesn't do progressive JPEG.) - - -FILE FORMAT WARS -================ - -Some JPEG programs produce files that are not compatible with our library. -The root of the problem is that the ISO JPEG committee failed to specify a -concrete file format. Some vendors "filled in the blanks" on their own, -creating proprietary formats that no one else could read. (For example, none -of the early commercial JPEG implementations for the Macintosh were able to -exchange compressed files.) - -The file format we have adopted is called JFIF (see REFERENCES). This format -has been agreed to by a number of major commercial JPEG vendors, and it has -become the de facto standard. JFIF is a minimal or "low end" representation. -We recommend the use of TIFF/JPEG (TIFF revision 6.0 as modified by TIFF -Technical Note #2) for "high end" applications that need to record a lot of -additional data about an image. TIFF/JPEG is fairly new and not yet widely -supported, unfortunately. - -The upcoming JPEG Part 3 standard defines a file format called SPIFF. -SPIFF is interoperable with JFIF, in the sense that most JFIF decoders should -be able to read the most common variant of SPIFF. SPIFF has some technical -advantages over JFIF, but its major claim to fame is simply that it is an -official standard rather than an informal one. At this point it is unclear -whether SPIFF will supersede JFIF or whether JFIF will remain the de-facto -standard. IJG intends to support SPIFF once the standard is frozen, but we -have not decided whether it should become our default output format or not. -(In any case, our decoder will remain capable of reading JFIF indefinitely.) - -Various proprietary file formats incorporating JPEG compression also exist. -We have little or no sympathy for the existence of these formats. Indeed, -one of the original reasons for developing this free software was to help -force convergence on common, open format standards for JPEG files. Don't -use a proprietary file format! - - -TO DO -===== - -The major thrust for v7 will probably be improvement of visual quality. -The current method for scaling the quantization tables is known not to be -very good at low Q values. We also intend to investigate block boundary -smoothing, "poor man's variable quantization", and other means of improving -quality-vs-file-size performance without sacrificing compatibility. - -In future versions, we are considering supporting some of the upcoming JPEG -Part 3 extensions --- principally, variable quantization and the SPIFF file -format. - -As always, speeding things up is of great interest. - -Please send bug reports, offers of help, etc. to jpeg-info@uunet.uu.net. diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/cderror.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/cderror.h deleted file mode 100755 index c19d38f..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/cderror.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * cderror.h - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the error and message codes for the cjpeg/djpeg - * applications. These strings are not needed as part of the JPEG library - * proper. - * Edit this file to add new codes, or to translate the message strings to - * some other language. - */ - -/* - * To define the enum list of message codes, include this file without - * defining macro JMESSAGE. To create a message string table, include it - * again with a suitable JMESSAGE definition (see jerror.c for an example). - */ -#ifndef JMESSAGE -#ifndef CDERROR_H -#define CDERROR_H -/* First time through, define the enum list */ -#define JMAKE_ENUM_LIST -#else -/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ -#define JMESSAGE(code,string) -#endif /* CDERROR_H */ -#endif /* JMESSAGE */ - -#ifdef JMAKE_ENUM_LIST - -typedef enum { - -#define JMESSAGE(code,string) code , - -#endif /* JMAKE_ENUM_LIST */ - -JMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */ - -#ifdef BMP_SUPPORTED -JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format") -JMESSAGE(JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported") -JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length") -JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1") -JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB") -JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported") -JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM") -JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image") -JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image") -JMESSAGE(JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image") -JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image") -#endif /* BMP_SUPPORTED */ - -#ifdef GIF_SUPPORTED -JMESSAGE(JERR_GIF_BUG, "GIF output got confused") -JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d") -JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB") -JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file") -JMESSAGE(JERR_GIF_NOT, "Not a GIF file") -JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image") -JMESSAGE(JTRC_GIF_BADVERSION, - "Warning: unexpected GIF version number '%c%c%c'") -JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x") -JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input") -JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file") -JMESSAGE(JWRN_GIF_CHAR, "Bogus char 0x%02x in GIF file, ignoring") -JMESSAGE(JWRN_GIF_ENDCODE, "Premature end of GIF image") -JMESSAGE(JWRN_GIF_NOMOREDATA, "Ran out of GIF bits") -#endif /* GIF_SUPPORTED */ - -#ifdef PPM_SUPPORTED -JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB") -JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file") -JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file") -JMESSAGE(JTRC_PGM, "%ux%u PGM image") -JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image") -JMESSAGE(JTRC_PPM, "%ux%u PPM image") -JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image") -#endif /* PPM_SUPPORTED */ - -#ifdef RLE_SUPPORTED -JMESSAGE(JERR_RLE_BADERROR, "Bogus error code from RLE library") -JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB") -JMESSAGE(JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE") -JMESSAGE(JERR_RLE_EMPTY, "Empty RLE file") -JMESSAGE(JERR_RLE_EOF, "Premature EOF in RLE header") -JMESSAGE(JERR_RLE_MEM, "Insufficient memory for RLE header") -JMESSAGE(JERR_RLE_NOT, "Not an RLE file") -JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE") -JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup") -JMESSAGE(JTRC_RLE, "%ux%u full-color RLE file") -JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d") -JMESSAGE(JTRC_RLE_GRAY, "%ux%u grayscale RLE file") -JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d") -JMESSAGE(JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d") -#endif /* RLE_SUPPORTED */ - -#ifdef TARGA_SUPPORTED -JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format") -JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file") -JMESSAGE(JERR_TGA_COLORSPACE, "Targa output must be grayscale or RGB") -JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image") -JMESSAGE(JTRC_TGA_GRAY, "%ux%u grayscale Targa image") -JMESSAGE(JTRC_TGA_MAPPED, "%ux%u colormapped Targa image") -#else -JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled") -#endif /* TARGA_SUPPORTED */ - -JMESSAGE(JERR_BAD_CMAP_FILE, - "Color map file is invalid or of unsupported format") -JMESSAGE(JERR_TOO_MANY_COLORS, - "Output file format cannot handle %d colormap entries") -JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed") -#ifdef TARGA_SUPPORTED -JMESSAGE(JERR_UNKNOWN_FORMAT, - "Unrecognized input file format --- perhaps you need -targa") -#else -JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format") -#endif -JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format") - -#ifdef JMAKE_ENUM_LIST - - JMSG_LASTADDONCODE -} ADDON_MESSAGE_CODE; - -#undef JMAKE_ENUM_LIST -#endif /* JMAKE_ENUM_LIST */ - -/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ -#undef JMESSAGE diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt deleted file mode 100755 index d4924fe..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/changes to libjpeg for JUCE.txt +++ /dev/null @@ -1,16 +0,0 @@ - -I've included libjpeg in the JUCE tree because loading jpegs is a pretty useful thing to -be able to do, but I've left out as many files as possible to keep it lean-and-mean. - -If you want to get hold of the full version of libjpeg, it's freely available at: - -http://www.ijg.org/ - - -Please note that part of the IJG's license for libjpeg states that: - - "If you use it in a program, you must acknowledge somewhere in - your documentation that you've used the IJG code". - -..so if you release a JUCE program that reads JPEGs, you should probably give them a mention. - diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapimin.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapimin.c deleted file mode 100755 index 55e2c9b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapimin.c +++ /dev/null @@ -1,280 +0,0 @@ -/* - * jcapimin.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains application interface code for the compression half - * of the JPEG library. These are the "minimum" API routines that may be - * needed in either the normal full-compression case or the transcoding-only - * case. - * - * Most of the routines intended to be called directly by an application - * are in this file or in jcapistd.c. But also see jcparam.c for - * parameter-setup helper routines, jcomapi.c for routines shared by - * compression and decompression, and jctrans.c for the transcoding case. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Initialization of a JPEG compression object. - * The error manager must already be set up (in case memory manager fails). - */ - -GLOBAL(void) -jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize) -{ - int i; - - /* Guard against version mismatches between library and caller. */ - cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ - if (version != JPEG_LIB_VERSION) - ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); - if (structsize != SIZEOF(struct jpeg_compress_struct)) - ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, - (int) SIZEOF(struct jpeg_compress_struct), (int) structsize); - - /* For debugging purposes, we zero the whole master structure. - * But the application has already set the err pointer, and may have set - * client_data, so we have to save and restore those fields. - * Note: if application hasn't set client_data, tools like Purify may - * complain here. - */ - { - struct jpeg_error_mgr * err = cinfo->err; - void * client_data = cinfo->client_data; /* ignore Purify complaint here */ - MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct)); - cinfo->err = err; - cinfo->client_data = client_data; - } - cinfo->is_decompressor = FALSE; - - /* Initialize a memory manager instance for this object */ - jinit_memory_mgr((j_common_ptr) cinfo); - - /* Zero out pointers to permanent structures. */ - cinfo->progress = NULL; - cinfo->dest = NULL; - - cinfo->comp_info = NULL; - - for (i = 0; i < NUM_QUANT_TBLS; i++) - cinfo->quant_tbl_ptrs[i] = NULL; - - for (i = 0; i < NUM_HUFF_TBLS; i++) { - cinfo->dc_huff_tbl_ptrs[i] = NULL; - cinfo->ac_huff_tbl_ptrs[i] = NULL; - } - - cinfo->script_space = NULL; - - cinfo->input_gamma = 1.0; /* in case application forgets */ - - /* OK, I'm ready */ - cinfo->global_state = CSTATE_START; -} - - -/* - * Destruction of a JPEG compression object - */ - -GLOBAL(void) -jpeg_destroy_compress (j_compress_ptr cinfo) -{ - jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ -} - - -/* - * Abort processing of a JPEG compression operation, - * but don't destroy the object itself. - */ - -GLOBAL(void) -jpeg_abort_compress (j_compress_ptr cinfo) -{ - jpeg_abort((j_common_ptr) cinfo); /* use common routine */ -} - - -/* - * Forcibly suppress or un-suppress all quantization and Huffman tables. - * Marks all currently defined tables as already written (if suppress) - * or not written (if !suppress). This will control whether they get emitted - * by a subsequent jpeg_start_compress call. - * - * This routine is exported for use by applications that want to produce - * abbreviated JPEG datastreams. It logically belongs in jcparam.c, but - * since it is called by jpeg_start_compress, we put it here --- otherwise - * jcparam.o would be linked whether the application used it or not. - */ - -GLOBAL(void) -jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress) -{ - int i; - JQUANT_TBL * qtbl; - JHUFF_TBL * htbl; - - for (i = 0; i < NUM_QUANT_TBLS; i++) { - if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL) - qtbl->sent_table = suppress; - } - - for (i = 0; i < NUM_HUFF_TBLS; i++) { - if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL) - htbl->sent_table = suppress; - if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL) - htbl->sent_table = suppress; - } -} - - -/* - * Finish JPEG compression. - * - * If a multipass operating mode was selected, this may do a great deal of - * work including most of the actual output. - */ - -GLOBAL(void) -jpeg_finish_compress (j_compress_ptr cinfo) -{ - JDIMENSION iMCU_row; - - if (cinfo->global_state == CSTATE_SCANNING || - cinfo->global_state == CSTATE_RAW_OK) { - /* Terminate first pass */ - if (cinfo->next_scanline < cinfo->image_height) - ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); - (*cinfo->master->finish_pass) (cinfo); - } else if (cinfo->global_state != CSTATE_WRCOEFS) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - /* Perform any remaining passes */ - while (! cinfo->master->is_last_pass) { - (*cinfo->master->prepare_for_pass) (cinfo); - for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) { - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) iMCU_row; - cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - /* We bypass the main controller and invoke coef controller directly; - * all work is being done from the coefficient buffer. - */ - if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL)) - ERREXIT(cinfo, JERR_CANT_SUSPEND); - } - (*cinfo->master->finish_pass) (cinfo); - } - /* Write EOI, do final cleanup */ - (*cinfo->marker->write_file_trailer) (cinfo); - (*cinfo->dest->term_destination) (cinfo); - /* We can use jpeg_abort to release memory and reset global_state */ - jpeg_abort((j_common_ptr) cinfo); -} - - -/* - * Write a special marker. - * This is only recommended for writing COM or APPn markers. - * Must be called after jpeg_start_compress() and before - * first call to jpeg_write_scanlines() or jpeg_write_raw_data(). - */ - -GLOBAL(void) -jpeg_write_marker (j_compress_ptr cinfo, int marker, - const JOCTET *dataptr, unsigned int datalen) -{ - JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val)); - - if (cinfo->next_scanline != 0 || - (cinfo->global_state != CSTATE_SCANNING && - cinfo->global_state != CSTATE_RAW_OK && - cinfo->global_state != CSTATE_WRCOEFS)) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); - write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */ - while (datalen--) { - (*write_marker_byte) (cinfo, *dataptr); - dataptr++; - } -} - -/* Same, but piecemeal. */ - -GLOBAL(void) -jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen) -{ - if (cinfo->next_scanline != 0 || - (cinfo->global_state != CSTATE_SCANNING && - cinfo->global_state != CSTATE_RAW_OK && - cinfo->global_state != CSTATE_WRCOEFS)) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - (*cinfo->marker->write_marker_header) (cinfo, marker, datalen); -} - -GLOBAL(void) -jpeg_write_m_byte (j_compress_ptr cinfo, int val) -{ - (*cinfo->marker->write_marker_byte) (cinfo, val); -} - - -/* - * Alternate compression function: just write an abbreviated table file. - * Before calling this, all parameters and a data destination must be set up. - * - * To produce a pair of files containing abbreviated tables and abbreviated - * image data, one would proceed as follows: - * - * initialize JPEG object - * set JPEG parameters - * set destination to table file - * jpeg_write_tables(cinfo); - * set destination to image file - * jpeg_start_compress(cinfo, FALSE); - * write data... - * jpeg_finish_compress(cinfo); - * - * jpeg_write_tables has the side effect of marking all tables written - * (same as jpeg_suppress_tables(..., TRUE)). Thus a subsequent start_compress - * will not re-emit the tables unless it is passed write_all_tables=TRUE. - */ - -GLOBAL(void) -jpeg_write_tables (j_compress_ptr cinfo) -{ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - /* (Re)initialize error mgr and destination modules */ - (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); - (*cinfo->dest->init_destination) (cinfo); - /* Initialize the marker writer ... bit of a crock to do it here. */ - jinit_marker_writer(cinfo); - /* Write them tables! */ - (*cinfo->marker->write_tables_only) (cinfo); - /* And clean up. */ - (*cinfo->dest->term_destination) (cinfo); - /* - * In library releases up through v6a, we called jpeg_abort() here to free - * any working memory allocated by the destination manager and marker - * writer. Some applications had a problem with that: they allocated space - * of their own from the library memory manager, and didn't want it to go - * away during write_tables. So now we do nothing. This will cause a - * memory leak if an app calls write_tables repeatedly without doing a full - * compression cycle or otherwise resetting the JPEG object. However, that - * seems less bad than unexpectedly freeing memory in the normal case. - * An app that prefers the old behavior can call jpeg_abort for itself after - * each call to jpeg_write_tables(). - */ -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapistd.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapistd.c deleted file mode 100755 index fed66ca..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcapistd.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * jcapistd.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains application interface code for the compression half - * of the JPEG library. These are the "standard" API routines that are - * used in the normal full-compression case. They are not used by a - * transcoding-only application. Note that if an application links in - * jpeg_start_compress, it will end up linking in the entire compressor. - * We thus must separate this file from jcapimin.c to avoid linking the - * whole compression library into a transcoder. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Compression initialization. - * Before calling this, all parameters and a data destination must be set up. - * - * We require a write_all_tables parameter as a failsafe check when writing - * multiple datastreams from the same compression object. Since prior runs - * will have left all the tables marked sent_table=TRUE, a subsequent run - * would emit an abbreviated stream (no tables) by default. This may be what - * is wanted, but for safety's sake it should not be the default behavior: - * programmers should have to make a deliberate choice to emit abbreviated - * images. Therefore the documentation and examples should encourage people - * to pass write_all_tables=TRUE; then it will take active thought to do the - * wrong thing. - */ - -GLOBAL(void) -jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables) -{ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - if (write_all_tables) - jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */ - - /* (Re)initialize error mgr and destination modules */ - (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); - (*cinfo->dest->init_destination) (cinfo); - /* Perform master selection of active modules */ - jinit_compress_master(cinfo); - /* Set up for the first pass */ - (*cinfo->master->prepare_for_pass) (cinfo); - /* Ready for application to drive first pass through jpeg_write_scanlines - * or jpeg_write_raw_data. - */ - cinfo->next_scanline = 0; - cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING); -} - - -/* - * Write some scanlines of data to the JPEG compressor. - * - * The return value will be the number of lines actually written. - * This should be less than the supplied num_lines only in case that - * the data destination module has requested suspension of the compressor, - * or if more than image_height scanlines are passed in. - * - * Note: we warn about excess calls to jpeg_write_scanlines() since - * this likely signals an application programmer error. However, - * excess scanlines passed in the last valid call are *silently* ignored, - * so that the application need not adjust num_lines for end-of-image - * when using a multiple-scanline buffer. - */ - -GLOBAL(JDIMENSION) -jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines, - JDIMENSION num_lines) -{ - JDIMENSION row_ctr, rows_left; - - if (cinfo->global_state != CSTATE_SCANNING) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - if (cinfo->next_scanline >= cinfo->image_height) - WARNMS(cinfo, JWRN_TOO_MUCH_DATA); - - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) cinfo->next_scanline; - cinfo->progress->pass_limit = (long) cinfo->image_height; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - - /* Give master control module another chance if this is first call to - * jpeg_write_scanlines. This lets output of the frame/scan headers be - * delayed so that application can write COM, etc, markers between - * jpeg_start_compress and jpeg_write_scanlines. - */ - if (cinfo->master->call_pass_startup) - (*cinfo->master->pass_startup) (cinfo); - - /* Ignore any extra scanlines at bottom of image. */ - rows_left = cinfo->image_height - cinfo->next_scanline; - if (num_lines > rows_left) - num_lines = rows_left; - - row_ctr = 0; - (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines); - cinfo->next_scanline += row_ctr; - return row_ctr; -} - - -/* - * Alternate entry point to write raw data. - * Processes exactly one iMCU row per call, unless suspended. - */ - -GLOBAL(JDIMENSION) -jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data, - JDIMENSION num_lines) -{ - JDIMENSION lines_per_iMCU_row; - - if (cinfo->global_state != CSTATE_RAW_OK) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - if (cinfo->next_scanline >= cinfo->image_height) { - WARNMS(cinfo, JWRN_TOO_MUCH_DATA); - return 0; - } - - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) cinfo->next_scanline; - cinfo->progress->pass_limit = (long) cinfo->image_height; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - - /* Give master control module another chance if this is first call to - * jpeg_write_raw_data. This lets output of the frame/scan headers be - * delayed so that application can write COM, etc, markers between - * jpeg_start_compress and jpeg_write_raw_data. - */ - if (cinfo->master->call_pass_startup) - (*cinfo->master->pass_startup) (cinfo); - - /* Verify that at least one iMCU row has been passed. */ - lines_per_iMCU_row = cinfo->max_v_samp_factor * DCTSIZE; - if (num_lines < lines_per_iMCU_row) - ERREXIT(cinfo, JERR_BUFFER_SIZE); - - /* Directly compress the row. */ - if (! (*cinfo->coef->compress_data) (cinfo, data)) { - /* If compressor did not consume the whole row, suspend processing. */ - return 0; - } - - /* OK, we processed one iMCU row. */ - cinfo->next_scanline += lines_per_iMCU_row; - return lines_per_iMCU_row; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccoefct.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccoefct.c deleted file mode 100755 index 554a21e..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccoefct.c +++ /dev/null @@ -1,449 +0,0 @@ -/* - * jccoefct.c - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the coefficient buffer controller for compression. - * This controller is the top level of the JPEG compressor proper. - * The coefficient buffer lies between forward-DCT and entropy encoding steps. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* We use a full-image coefficient buffer when doing Huffman optimization, - * and also for writing multiple-scan JPEG files. In all cases, the DCT - * step is run during the first pass, and subsequent passes need only read - * the buffered coefficients. - */ -#ifdef ENTROPY_OPT_SUPPORTED -#define FULL_COEF_BUFFER_SUPPORTED -#else -#ifdef C_MULTISCAN_FILES_SUPPORTED -#define FULL_COEF_BUFFER_SUPPORTED -#endif -#endif - - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_c_coef_controller pub; /* public fields */ - - JDIMENSION iMCU_row_num; /* iMCU row # within image */ - JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ - int MCU_vert_offset; /* counts MCU rows within iMCU row */ - int MCU_rows_per_iMCU_row; /* number of such rows needed */ - - /* For single-pass compression, it's sufficient to buffer just one MCU - * (although this may prove a bit slow in practice). We allocate a - * workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each - * MCU constructed and sent. (On 80x86, the workspace is FAR even though - * it's not really very big; this is to keep the module interfaces unchanged - * when a large coefficient buffer is necessary.) - * In multi-pass modes, this array points to the current MCU's blocks - * within the virtual arrays. - */ - JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU]; - - /* In multi-pass modes, we need a virtual block array for each component. */ - jvirt_barray_ptr whole_image[MAX_COMPONENTS]; -} my_coef_controller; - -typedef my_coef_controller * my_coef_ptr; - - -/* Forward declarations */ -METHODDEF(boolean) compress_data - JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); -#ifdef FULL_COEF_BUFFER_SUPPORTED -METHODDEF(boolean) compress_first_pass - JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); -METHODDEF(boolean) compress_output - JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf)); -#endif - - -LOCAL(void) -start_iMCU_row (j_compress_ptr cinfo) -/* Reset within-iMCU-row counters for a new row */ -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - - /* In an interleaved scan, an MCU row is the same as an iMCU row. - * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. - * But at the bottom of the image, process only what's left. - */ - if (cinfo->comps_in_scan > 1) { - coef->MCU_rows_per_iMCU_row = 1; - } else { - if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1)) - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; - else - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; - } - - coef->mcu_ctr = 0; - coef->MCU_vert_offset = 0; -} - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - - coef->iMCU_row_num = 0; - start_iMCU_row(cinfo); - - switch (pass_mode) { - case JBUF_PASS_THRU: - if (coef->whole_image[0] != NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - coef->pub.compress_data = compress_data; - break; -#ifdef FULL_COEF_BUFFER_SUPPORTED - case JBUF_SAVE_AND_PASS: - if (coef->whole_image[0] == NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - coef->pub.compress_data = compress_first_pass; - break; - case JBUF_CRANK_DEST: - if (coef->whole_image[0] == NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - coef->pub.compress_data = compress_output; - break; -#endif - default: - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - break; - } -} - - -/* - * Process some data in the single-pass case. - * We process the equivalent of one fully interleaved MCU row ("iMCU" row) - * per call, ie, v_samp_factor block rows for each component in the image. - * Returns TRUE if the iMCU row is completed, FALSE if suspended. - * - * NB: input_buf contains a plane for each component in image, - * which we index according to the component's SOF position. - */ - -METHODDEF(boolean) -compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION MCU_col_num; /* index of current MCU within row */ - JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - int blkn, bi, ci, yindex, yoffset, blockcnt; - JDIMENSION ypos, xpos; - jpeg_component_info *compptr; - - /* Loop to write as much as one whole iMCU row */ - for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; - yoffset++) { - for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col; - MCU_col_num++) { - /* Determine where data comes from in input_buf and do the DCT thing. - * Each call on forward_DCT processes a horizontal row of DCT blocks - * as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks - * sequentially. Dummy blocks at the right or bottom edge are filled in - * specially. The data in them does not matter for image reconstruction, - * so we fill them with values that will encode to the smallest amount of - * data, viz: all zeroes in the AC entries, DC entries equal to previous - * block's DC value. (Thanks to Thomas Kinsman for this idea.) - */ - blkn = 0; - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width - : compptr->last_col_width; - xpos = MCU_col_num * compptr->MCU_sample_width; - ypos = yoffset * DCTSIZE; /* ypos == (yoffset+yindex) * DCTSIZE */ - for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - if (coef->iMCU_row_num < last_iMCU_row || - yoffset+yindex < compptr->last_row_height) { - (*cinfo->fdct->forward_DCT) (cinfo, compptr, - input_buf[compptr->component_index], - coef->MCU_buffer[blkn], - ypos, xpos, (JDIMENSION) blockcnt); - if (blockcnt < compptr->MCU_width) { - /* Create some dummy blocks at the right edge of the image. */ - jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt], - (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK)); - for (bi = blockcnt; bi < compptr->MCU_width; bi++) { - coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0]; - } - } - } else { - /* Create a row of dummy blocks at the bottom of the image. */ - jzero_far((void FAR *) coef->MCU_buffer[blkn], - compptr->MCU_width * SIZEOF(JBLOCK)); - for (bi = 0; bi < compptr->MCU_width; bi++) { - coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0]; - } - } - blkn += compptr->MCU_width; - ypos += DCTSIZE; - } - } - /* Try to write the MCU. In event of a suspension failure, we will - * re-DCT the MCU on restart (a bit inefficient, could be fixed...) - */ - if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { - /* Suspension forced; update state counters and exit */ - coef->MCU_vert_offset = yoffset; - coef->mcu_ctr = MCU_col_num; - return FALSE; - } - } - /* Completed an MCU row, but perhaps not an iMCU row */ - coef->mcu_ctr = 0; - } - /* Completed the iMCU row, advance counters for next one */ - coef->iMCU_row_num++; - start_iMCU_row(cinfo); - return TRUE; -} - - -#ifdef FULL_COEF_BUFFER_SUPPORTED - -/* - * Process some data in the first pass of a multi-pass case. - * We process the equivalent of one fully interleaved MCU row ("iMCU" row) - * per call, ie, v_samp_factor block rows for each component in the image. - * This amount of data is read from the source buffer, DCT'd and quantized, - * and saved into the virtual arrays. We also generate suitable dummy blocks - * as needed at the right and lower edges. (The dummy blocks are constructed - * in the virtual arrays, which have been padded appropriately.) This makes - * it possible for subsequent passes not to worry about real vs. dummy blocks. - * - * We must also emit the data to the entropy encoder. This is conveniently - * done by calling compress_output() after we've loaded the current strip - * of the virtual arrays. - * - * NB: input_buf contains a plane for each component in image. All - * components are DCT'd and loaded into the virtual arrays in this pass. - * However, it may be that only a subset of the components are emitted to - * the entropy encoder during this first pass; be careful about looking - * at the scan-dependent variables (MCU dimensions, etc). - */ - -METHODDEF(boolean) -compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - JDIMENSION blocks_across, MCUs_across, MCUindex; - int bi, ci, h_samp_factor, block_row, block_rows, ndummy; - JCOEF lastDC; - jpeg_component_info *compptr; - JBLOCKARRAY buffer; - JBLOCKROW thisblockrow, lastblockrow; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Align the virtual buffer for this component. */ - buffer = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[ci], - coef->iMCU_row_num * compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, TRUE); - /* Count non-dummy DCT block rows in this iMCU row. */ - if (coef->iMCU_row_num < last_iMCU_row) - block_rows = compptr->v_samp_factor; - else { - /* NB: can't use last_row_height here, since may not be set! */ - block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); - if (block_rows == 0) block_rows = compptr->v_samp_factor; - } - blocks_across = compptr->width_in_blocks; - h_samp_factor = compptr->h_samp_factor; - /* Count number of dummy blocks to be added at the right margin. */ - ndummy = (int) (blocks_across % h_samp_factor); - if (ndummy > 0) - ndummy = h_samp_factor - ndummy; - /* Perform DCT for all non-dummy blocks in this iMCU row. Each call - * on forward_DCT processes a complete horizontal row of DCT blocks. - */ - for (block_row = 0; block_row < block_rows; block_row++) { - thisblockrow = buffer[block_row]; - (*cinfo->fdct->forward_DCT) (cinfo, compptr, - input_buf[ci], thisblockrow, - (JDIMENSION) (block_row * DCTSIZE), - (JDIMENSION) 0, blocks_across); - if (ndummy > 0) { - /* Create dummy blocks at the right edge of the image. */ - thisblockrow += blocks_across; /* => first dummy block */ - jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK)); - lastDC = thisblockrow[-1][0]; - for (bi = 0; bi < ndummy; bi++) { - thisblockrow[bi][0] = lastDC; - } - } - } - /* If at end of image, create dummy block rows as needed. - * The tricky part here is that within each MCU, we want the DC values - * of the dummy blocks to match the last real block's DC value. - * This squeezes a few more bytes out of the resulting file... - */ - if (coef->iMCU_row_num == last_iMCU_row) { - blocks_across += ndummy; /* include lower right corner */ - MCUs_across = blocks_across / h_samp_factor; - for (block_row = block_rows; block_row < compptr->v_samp_factor; - block_row++) { - thisblockrow = buffer[block_row]; - lastblockrow = buffer[block_row-1]; - jzero_far((void FAR *) thisblockrow, - (size_t) (blocks_across * SIZEOF(JBLOCK))); - for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) { - lastDC = lastblockrow[h_samp_factor-1][0]; - for (bi = 0; bi < h_samp_factor; bi++) { - thisblockrow[bi][0] = lastDC; - } - thisblockrow += h_samp_factor; /* advance to next MCU in row */ - lastblockrow += h_samp_factor; - } - } - } - } - /* NB: compress_output will increment iMCU_row_num if successful. - * A suspension return will result in redoing all the work above next time. - */ - - /* Emit data to the entropy encoder, sharing code with subsequent passes */ - return compress_output(cinfo, input_buf); -} - - -/* - * Process some data in subsequent passes of a multi-pass case. - * We process the equivalent of one fully interleaved MCU row ("iMCU" row) - * per call, ie, v_samp_factor block rows for each component in the scan. - * The data is obtained from the virtual arrays and fed to the entropy coder. - * Returns TRUE if the iMCU row is completed, FALSE if suspended. - * - * NB: input_buf is ignored; it is likely to be a NULL pointer. - */ - -METHODDEF(boolean) -compress_output (j_compress_ptr cinfo, JSAMPIMAGE) -{ - my_coef_ptr coef = (my_coef_ptr) cinfo->coef; - JDIMENSION MCU_col_num; /* index of current MCU within row */ - int blkn, ci, xindex, yindex, yoffset; - JDIMENSION start_col; - JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; - JBLOCKROW buffer_ptr; - jpeg_component_info *compptr; - - /* Align the virtual buffers for the components used in this scan. - * NB: during first pass, this is safe only because the buffers will - * already be aligned properly, so jmemmgr.c won't need to do any I/O. - */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - buffer[ci] = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], - coef->iMCU_row_num * compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - - /* Loop to process one whole iMCU row */ - for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; - yoffset++) { - for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; - MCU_col_num++) { - /* Construct list of pointers to DCT blocks belonging to this MCU */ - blkn = 0; /* index of current DCT block within MCU */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - start_col = MCU_col_num * compptr->MCU_width; - for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - buffer_ptr = buffer[ci][yindex+yoffset] + start_col; - for (xindex = 0; xindex < compptr->MCU_width; xindex++) { - coef->MCU_buffer[blkn++] = buffer_ptr++; - } - } - } - /* Try to write the MCU. */ - if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) { - /* Suspension forced; update state counters and exit */ - coef->MCU_vert_offset = yoffset; - coef->mcu_ctr = MCU_col_num; - return FALSE; - } - } - /* Completed an MCU row, but perhaps not an iMCU row */ - coef->mcu_ctr = 0; - } - /* Completed the iMCU row, advance counters for next one */ - coef->iMCU_row_num++; - start_iMCU_row(cinfo); - return TRUE; -} - -#endif /* FULL_COEF_BUFFER_SUPPORTED */ - - -/* - * Initialize coefficient buffer controller. - */ - -GLOBAL(void) -jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer) -{ - my_coef_ptr coef; - - coef = (my_coef_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_coef_controller)); - cinfo->coef = (struct jpeg_c_coef_controller *) coef; - coef->pub.start_pass = start_pass_coef; - - /* Create the coefficient buffer. */ - if (need_full_buffer) { -#ifdef FULL_COEF_BUFFER_SUPPORTED - /* Allocate a full-image virtual array for each component, */ - /* padded to a multiple of samp_factor DCT blocks in each direction. */ - int ci; - jpeg_component_info *compptr; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - (JDIMENSION) jround_up((long) compptr->width_in_blocks, - (long) compptr->h_samp_factor), - (JDIMENSION) jround_up((long) compptr->height_in_blocks, - (long) compptr->v_samp_factor), - (JDIMENSION) compptr->v_samp_factor); - } -#else - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); -#endif - } else { - /* We only need a single-MCU buffer. */ - JBLOCKROW buffer; - int i; - - buffer = (JBLOCKROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { - coef->MCU_buffer[i] = buffer + i; - } - coef->whole_image[0] = NULL; /* flag for no virtual arrays */ - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccolor.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccolor.c deleted file mode 100755 index a9d6824..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jccolor.c +++ /dev/null @@ -1,459 +0,0 @@ -/* - * jccolor.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains input colorspace conversion routines. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private subobject */ - -typedef struct { - struct jpeg_color_converter pub; /* public fields */ - - /* Private state for RGB->YCC conversion */ - INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */ -} my_color_converter; - -typedef my_color_converter * my_cconvert_ptr; - - -/**************** RGB -> YCbCr conversion: most common case **************/ - -/* - * YCbCr is defined per CCIR 601-1, except that Cb and Cr are - * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. - * The conversion equations to be implemented are therefore - * Y = 0.29900 * R + 0.58700 * G + 0.11400 * B - * Cb = -0.16874 * R - 0.33126 * G + 0.50000 * B + CENTERJSAMPLE - * Cr = 0.50000 * R - 0.41869 * G - 0.08131 * B + CENTERJSAMPLE - * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) - * Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2, - * rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and - * negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0) - * were not represented exactly. Now we sacrifice exact representation of - * maximum red and maximum blue in order to get exact grayscales. - * - * To avoid floating-point arithmetic, we represent the fractional constants - * as integers scaled up by 2^16 (about 4 digits precision); we have to divide - * the products by 2^16, with appropriate rounding, to get the correct answer. - * - * For even more speed, we avoid doing any multiplications in the inner loop - * by precalculating the constants times R,G,B for all possible values. - * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); - * for 12-bit samples it is still acceptable. It's not very reasonable for - * 16-bit samples, but if you want lossless storage you shouldn't be changing - * colorspace anyway. - * The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included - * in the tables to save adding them separately in the inner loop. - */ - -#define SCALEBITS 16 /* speediest right-shift on some machines */ -#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS) -#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) -#define FIX(x) ((INT32) ((x) * (1L< Y section */ -#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */ -#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */ -#define R_CB_OFF (3*(MAXJSAMPLE+1)) -#define G_CB_OFF (4*(MAXJSAMPLE+1)) -#define B_CB_OFF (5*(MAXJSAMPLE+1)) -#define R_CR_OFF B_CB_OFF /* B=>Cb, R=>Cr are the same */ -#define G_CR_OFF (6*(MAXJSAMPLE+1)) -#define B_CR_OFF (7*(MAXJSAMPLE+1)) -#define TABLE_SIZE (8*(MAXJSAMPLE+1)) - - -/* - * Initialize for RGB->YCC colorspace conversion. - */ - -METHODDEF(void) -rgb_ycc_start (j_compress_ptr cinfo) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - INT32 * rgb_ycc_tab; - INT32 i; - - /* Allocate and fill in the conversion tables. */ - cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (TABLE_SIZE * SIZEOF(INT32))); - - for (i = 0; i <= MAXJSAMPLE; i++) { - rgb_ycc_tab[i+R_Y_OFF] = FIX(0.29900) * i; - rgb_ycc_tab[i+G_Y_OFF] = FIX(0.58700) * i; - rgb_ycc_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF; - rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.16874)) * i; - rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.33126)) * i; - /* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr. - * This ensures that the maximum output will round to MAXJSAMPLE - * not MAXJSAMPLE+1, and thus that we don't have to range-limit. - */ - rgb_ycc_tab[i+B_CB_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1; -/* B=>Cb and R=>Cr tables are the same - rgb_ycc_tab[i+R_CR_OFF] = FIX(0.50000) * i + CBCR_OFFSET + ONE_HALF-1; -*/ - rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.41869)) * i; - rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.08131)) * i; - } -} - - -/* - * Convert some rows of samples to the JPEG colorspace. - * - * Note that we change from the application's interleaved-pixel format - * to our internal noninterleaved, one-plane-per-component format. - * The input buffer is therefore three times as wide as the output buffer. - * - * A starting row offset is provided only for the output buffer. The caller - * can easily adjust the passed input_buf value to accommodate any row - * offset required on that side. - */ - -METHODDEF(void) -rgb_ycc_convert (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - int r, g, b; - INT32 * ctab = cconvert->rgb_ycc_tab; - JSAMPROW inptr; - JSAMPROW outptr0, outptr1, outptr2; - JDIMENSION col; - JDIMENSION num_cols = cinfo->image_width; - - while (--num_rows >= 0) { - inptr = *input_buf++; - outptr0 = output_buf[0][output_row]; - outptr1 = output_buf[1][output_row]; - outptr2 = output_buf[2][output_row]; - output_row++; - for (col = 0; col < num_cols; col++) { - r = GETJSAMPLE(inptr[RGB_RED]); - g = GETJSAMPLE(inptr[RGB_GREEN]); - b = GETJSAMPLE(inptr[RGB_BLUE]); - inptr += RGB_PIXELSIZE; - /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations - * must be too; we do not need an explicit range-limiting operation. - * Hence the value being shifted is never negative, and we don't - * need the general RIGHT_SHIFT macro. - */ - /* Y */ - outptr0[col] = (JSAMPLE) - ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) - >> SCALEBITS); - /* Cb */ - outptr1[col] = (JSAMPLE) - ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF]) - >> SCALEBITS); - /* Cr */ - outptr2[col] = (JSAMPLE) - ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF]) - >> SCALEBITS); - } - } -} - - -/**************** Cases other than RGB -> YCbCr **************/ - - -/* - * Convert some rows of samples to the JPEG colorspace. - * This version handles RGB->grayscale conversion, which is the same - * as the RGB->Y portion of RGB->YCbCr. - * We assume rgb_ycc_start has been called (we only use the Y tables). - */ - -METHODDEF(void) -rgb_gray_convert (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - int r, g, b; - INT32 * ctab = cconvert->rgb_ycc_tab; - JSAMPROW inptr; - JSAMPROW outptr; - JDIMENSION col; - JDIMENSION num_cols = cinfo->image_width; - - while (--num_rows >= 0) { - inptr = *input_buf++; - outptr = output_buf[0][output_row]; - output_row++; - for (col = 0; col < num_cols; col++) { - r = GETJSAMPLE(inptr[RGB_RED]); - g = GETJSAMPLE(inptr[RGB_GREEN]); - b = GETJSAMPLE(inptr[RGB_BLUE]); - inptr += RGB_PIXELSIZE; - /* Y */ - outptr[col] = (JSAMPLE) - ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) - >> SCALEBITS); - } - } -} - - -/* - * Convert some rows of samples to the JPEG colorspace. - * This version handles Adobe-style CMYK->YCCK conversion, - * where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same - * conversion as above, while passing K (black) unchanged. - * We assume rgb_ycc_start has been called. - */ - -METHODDEF(void) -cmyk_ycck_convert (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows) -{ - my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert; - int r, g, b; - INT32 * ctab = cconvert->rgb_ycc_tab; - JSAMPROW inptr; - JSAMPROW outptr0, outptr1, outptr2, outptr3; - JDIMENSION col; - JDIMENSION num_cols = cinfo->image_width; - - while (--num_rows >= 0) { - inptr = *input_buf++; - outptr0 = output_buf[0][output_row]; - outptr1 = output_buf[1][output_row]; - outptr2 = output_buf[2][output_row]; - outptr3 = output_buf[3][output_row]; - output_row++; - for (col = 0; col < num_cols; col++) { - r = MAXJSAMPLE - GETJSAMPLE(inptr[0]); - g = MAXJSAMPLE - GETJSAMPLE(inptr[1]); - b = MAXJSAMPLE - GETJSAMPLE(inptr[2]); - /* K passes through as-is */ - outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */ - inptr += 4; - /* If the inputs are 0..MAXJSAMPLE, the outputs of these equations - * must be too; we do not need an explicit range-limiting operation. - * Hence the value being shifted is never negative, and we don't - * need the general RIGHT_SHIFT macro. - */ - /* Y */ - outptr0[col] = (JSAMPLE) - ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF]) - >> SCALEBITS); - /* Cb */ - outptr1[col] = (JSAMPLE) - ((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF]) - >> SCALEBITS); - /* Cr */ - outptr2[col] = (JSAMPLE) - ((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF]) - >> SCALEBITS); - } - } -} - - -/* - * Convert some rows of samples to the JPEG colorspace. - * This version handles grayscale output with no conversion. - * The source can be either plain grayscale or YCbCr (since Y == gray). - */ - -METHODDEF(void) -grayscale_convert (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows) -{ - JSAMPROW inptr; - JSAMPROW outptr; - JDIMENSION col; - JDIMENSION num_cols = cinfo->image_width; - int instride = cinfo->input_components; - - while (--num_rows >= 0) { - inptr = *input_buf++; - outptr = output_buf[0][output_row]; - output_row++; - for (col = 0; col < num_cols; col++) { - outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */ - inptr += instride; - } - } -} - - -/* - * Convert some rows of samples to the JPEG colorspace. - * This version handles multi-component colorspaces without conversion. - * We assume input_components == num_components. - */ - -METHODDEF(void) -null_convert (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows) -{ - JSAMPROW inptr; - JSAMPROW outptr; - JDIMENSION col; - int ci; - int nc = cinfo->num_components; - JDIMENSION num_cols = cinfo->image_width; - - while (--num_rows >= 0) { - /* It seems fastest to make a separate pass for each component. */ - for (ci = 0; ci < nc; ci++) { - inptr = *input_buf; - outptr = output_buf[ci][output_row]; - for (col = 0; col < num_cols; col++) { - outptr[col] = inptr[ci]; /* don't need GETJSAMPLE() here */ - inptr += nc; - } - } - input_buf++; - output_row++; - } -} - - -/* - * Empty method for start_pass. - */ - -METHODDEF(void) -null_method (j_compress_ptr) -{ - /* no work needed */ -} - - -/* - * Module initialization routine for input colorspace conversion. - */ - -GLOBAL(void) -jinit_color_converter (j_compress_ptr cinfo) -{ - my_cconvert_ptr cconvert; - - cconvert = (my_cconvert_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_color_converter)); - cinfo->cconvert = (struct jpeg_color_converter *) cconvert; - /* set start_pass to null method until we find out differently */ - cconvert->pub.start_pass = null_method; - - /* Make sure input_components agrees with in_color_space */ - switch (cinfo->in_color_space) { - case JCS_GRAYSCALE: - if (cinfo->input_components != 1) - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - break; - - case JCS_RGB: -#if RGB_PIXELSIZE != 3 - if (cinfo->input_components != RGB_PIXELSIZE) - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - break; -#endif /* else share code with YCbCr */ - - case JCS_YCbCr: - if (cinfo->input_components != 3) - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - break; - - case JCS_CMYK: - case JCS_YCCK: - if (cinfo->input_components != 4) - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - break; - - default: /* JCS_UNKNOWN can be anything */ - if (cinfo->input_components < 1) - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - break; - } - - /* Check num_components, set conversion method based on requested space */ - switch (cinfo->jpeg_color_space) { - case JCS_GRAYSCALE: - if (cinfo->num_components != 1) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_GRAYSCALE) - cconvert->pub.color_convert = grayscale_convert; - else if (cinfo->in_color_space == JCS_RGB) { - cconvert->pub.start_pass = rgb_ycc_start; - cconvert->pub.color_convert = rgb_gray_convert; - } else if (cinfo->in_color_space == JCS_YCbCr) - cconvert->pub.color_convert = grayscale_convert; - else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_RGB: - if (cinfo->num_components != 3) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3) - cconvert->pub.color_convert = null_convert; - else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_YCbCr: - if (cinfo->num_components != 3) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_RGB) { - cconvert->pub.start_pass = rgb_ycc_start; - cconvert->pub.color_convert = rgb_ycc_convert; - } else if (cinfo->in_color_space == JCS_YCbCr) - cconvert->pub.color_convert = null_convert; - else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_CMYK: - if (cinfo->num_components != 4) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_CMYK) - cconvert->pub.color_convert = null_convert; - else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_YCCK: - if (cinfo->num_components != 4) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - if (cinfo->in_color_space == JCS_CMYK) { - cconvert->pub.start_pass = rgb_ycc_start; - cconvert->pub.color_convert = cmyk_ycck_convert; - } else if (cinfo->in_color_space == JCS_YCCK) - cconvert->pub.color_convert = null_convert; - else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - default: /* allow null conversion of JCS_UNKNOWN */ - if (cinfo->jpeg_color_space != cinfo->in_color_space || - cinfo->num_components != cinfo->input_components) - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - cconvert->pub.color_convert = null_convert; - break; - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcdctmgr.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcdctmgr.c deleted file mode 100755 index 0589ccd..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcdctmgr.c +++ /dev/null @@ -1,387 +0,0 @@ -/* - * jcdctmgr.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the forward-DCT management logic. - * This code selects a particular DCT implementation to be used, - * and it performs related housekeeping chores including coefficient - * quantization. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - - -/* Private subobject for this module */ - -typedef struct { - struct jpeg_forward_dct pub; /* public fields */ - - /* Pointer to the DCT routine actually in use */ - forward_DCT_method_ptr do_dct; - - /* The actual post-DCT divisors --- not identical to the quant table - * entries, because of scaling (especially for an unnormalized DCT). - * Each table is given in normal array order. - */ - DCTELEM * divisors[NUM_QUANT_TBLS]; - -#ifdef DCT_FLOAT_SUPPORTED - /* Same as above for the floating-point case. */ - float_DCT_method_ptr do_float_dct; - FAST_FLOAT * float_divisors[NUM_QUANT_TBLS]; -#endif -} my_fdct_controller; - -typedef my_fdct_controller * my_fdct_ptr; - - -/* - * Initialize for a processing pass. - * Verify that all referenced Q-tables are present, and set up - * the divisor table for each one. - * In the current implementation, DCT of all components is done during - * the first pass, even if only some components will be output in the - * first scan. Hence all components should be examined here. - */ - -METHODDEF(void) -start_pass_fdctmgr (j_compress_ptr cinfo) -{ - my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; - int ci, qtblno, i; - jpeg_component_info *compptr; - JQUANT_TBL * qtbl; - DCTELEM * dtbl; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - qtblno = compptr->quant_tbl_no; - /* Make sure specified quantization table is present */ - if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || - cinfo->quant_tbl_ptrs[qtblno] == NULL) - ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); - qtbl = cinfo->quant_tbl_ptrs[qtblno]; - /* Compute divisors for this quant table */ - /* We may do this more than once for same table, but it's not a big deal */ - switch (cinfo->dct_method) { -#ifdef DCT_ISLOW_SUPPORTED - case JDCT_ISLOW: - /* For LL&M IDCT method, divisors are equal to raw quantization - * coefficients multiplied by 8 (to counteract scaling). - */ - if (fdct->divisors[qtblno] == NULL) { - fdct->divisors[qtblno] = (DCTELEM *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - DCTSIZE2 * SIZEOF(DCTELEM)); - } - dtbl = fdct->divisors[qtblno]; - for (i = 0; i < DCTSIZE2; i++) { - dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3; - } - break; -#endif -#ifdef DCT_IFAST_SUPPORTED - case JDCT_IFAST: - { - /* For AA&N IDCT method, divisors are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * We apply a further scale factor of 8. - */ -#define CONST_BITS 14 - static const INT16 aanscales[DCTSIZE2] = { - /* precomputed values scaled up by 14 bits */ - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, - 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, - 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, - 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, - 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 - }; - SHIFT_TEMPS - - if (fdct->divisors[qtblno] == NULL) { - fdct->divisors[qtblno] = (DCTELEM *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - DCTSIZE2 * SIZEOF(DCTELEM)); - } - dtbl = fdct->divisors[qtblno]; - for (i = 0; i < DCTSIZE2; i++) { - dtbl[i] = (DCTELEM) - DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], - (INT32) aanscales[i]), - CONST_BITS-3); - } - } - break; -#endif -#ifdef DCT_FLOAT_SUPPORTED - case JDCT_FLOAT: - { - /* For float AA&N IDCT method, divisors are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * We apply a further scale factor of 8. - * What's actually stored is 1/divisor so that the inner loop can - * use a multiplication rather than a division. - */ - FAST_FLOAT * fdtbl; - int row, col; - static const double aanscalefactor[DCTSIZE] = { - 1.0, 1.387039845, 1.306562965, 1.175875602, - 1.0, 0.785694958, 0.541196100, 0.275899379 - }; - - if (fdct->float_divisors[qtblno] == NULL) { - fdct->float_divisors[qtblno] = (FAST_FLOAT *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - DCTSIZE2 * SIZEOF(FAST_FLOAT)); - } - fdtbl = fdct->float_divisors[qtblno]; - i = 0; - for (row = 0; row < DCTSIZE; row++) { - for (col = 0; col < DCTSIZE; col++) { - fdtbl[i] = (FAST_FLOAT) - (1.0 / (((double) qtbl->quantval[i] * - aanscalefactor[row] * aanscalefactor[col] * 8.0))); - i++; - } - } - } - break; -#endif - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } - } -} - - -/* - * Perform forward DCT on one or more blocks of a component. - * - * The input samples are taken from the sample_data[] array starting at - * position start_row/start_col, and moving to the right for any additional - * blocks. The quantized coefficients are returned in coef_blocks[]. - */ - -METHODDEF(void) -forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks) -/* This version is used for integer DCT implementations. */ -{ - /* This routine is heavily used, so it's worth coding it tightly. */ - my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; - forward_DCT_method_ptr do_dct = fdct->do_dct; - DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no]; - DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */ - JDIMENSION bi; - - sample_data += start_row; /* fold in the vertical offset once */ - - for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) { - /* Load data into workspace, applying unsigned->signed conversion */ - { DCTELEM *workspaceptr; - JSAMPROW elemptr; - int elemr; - - workspaceptr = workspace; - for (elemr = 0; elemr < DCTSIZE; elemr++) { - elemptr = sample_data[elemr] + start_col; -#if DCTSIZE == 8 /* unroll the inner loop */ - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; -#else - { int elemc; - for (elemc = DCTSIZE; elemc > 0; elemc--) { - *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE; - } - } -#endif - } - } - - /* Perform the DCT */ - (*do_dct) (workspace); - - /* Quantize/descale the coefficients, and store into coef_blocks[] */ - { DCTELEM temp, qval; - int i; - JCOEFPTR output_ptr = coef_blocks[bi]; - - for (i = 0; i < DCTSIZE2; i++) { - qval = divisors[i]; - temp = workspace[i]; - /* Divide the coefficient value by qval, ensuring proper rounding. - * Since C does not specify the direction of rounding for negative - * quotients, we have to force the dividend positive for portability. - * - * In most files, at least half of the output values will be zero - * (at default quantization settings, more like three-quarters...) - * so we should ensure that this case is fast. On many machines, - * a comparison is enough cheaper than a divide to make a special test - * a win. Since both inputs will be nonnegative, we need only test - * for a < b to discover whether a/b is 0. - * If your machine's division is fast enough, define FAST_DIVIDE. - */ -#ifdef FAST_DIVIDE -#define DIVIDE_BY(a,b) a /= b -#else -#define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0 -#endif - if (temp < 0) { - temp = -temp; - temp += qval>>1; /* for rounding */ - DIVIDE_BY(temp, qval); - temp = -temp; - } else { - temp += qval>>1; /* for rounding */ - DIVIDE_BY(temp, qval); - } - output_ptr[i] = (JCOEF) temp; - } - } - } -} - - -#ifdef DCT_FLOAT_SUPPORTED - -METHODDEF(void) -forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks) -/* This version is used for floating-point DCT implementations. */ -{ - /* This routine is heavily used, so it's worth coding it tightly. */ - my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct; - float_DCT_method_ptr do_dct = fdct->do_float_dct; - FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no]; - FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */ - JDIMENSION bi; - - sample_data += start_row; /* fold in the vertical offset once */ - - for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) { - /* Load data into workspace, applying unsigned->signed conversion */ - { FAST_FLOAT *workspaceptr; - JSAMPROW elemptr; - int elemr; - - workspaceptr = workspace; - for (elemr = 0; elemr < DCTSIZE; elemr++) { - elemptr = sample_data[elemr] + start_col; -#if DCTSIZE == 8 /* unroll the inner loop */ - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); -#else - { int elemc; - for (elemc = DCTSIZE; elemc > 0; elemc--) { - *workspaceptr++ = (FAST_FLOAT) - (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE); - } - } -#endif - } - } - - /* Perform the DCT */ - (*do_dct) (workspace); - - /* Quantize/descale the coefficients, and store into coef_blocks[] */ - { FAST_FLOAT temp; - int i; - JCOEFPTR output_ptr = coef_blocks[bi]; - - for (i = 0; i < DCTSIZE2; i++) { - /* Apply the quantization and scaling factor */ - temp = workspace[i] * divisors[i]; - /* Round to nearest integer. - * Since C does not specify the direction of rounding for negative - * quotients, we have to force the dividend positive for portability. - * The maximum coefficient size is +-16K (for 12-bit data), so this - * code should work for either 16-bit or 32-bit ints. - */ - output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384); - } - } - } -} - -#endif /* DCT_FLOAT_SUPPORTED */ - - -/* - * Initialize FDCT manager. - */ - -GLOBAL(void) -jinit_forward_dct (j_compress_ptr cinfo) -{ - my_fdct_ptr fdct; - int i; - - fdct = (my_fdct_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_fdct_controller)); - cinfo->fdct = (struct jpeg_forward_dct *) fdct; - fdct->pub.start_pass = start_pass_fdctmgr; - - switch (cinfo->dct_method) { -#ifdef DCT_ISLOW_SUPPORTED - case JDCT_ISLOW: - fdct->pub.forward_DCT = forward_DCT; - fdct->do_dct = jpeg_fdct_islow; - break; -#endif -#ifdef DCT_IFAST_SUPPORTED - case JDCT_IFAST: - fdct->pub.forward_DCT = forward_DCT; - fdct->do_dct = jpeg_fdct_ifast; - break; -#endif -#ifdef DCT_FLOAT_SUPPORTED - case JDCT_FLOAT: - fdct->pub.forward_DCT = forward_DCT_float; - fdct->do_float_dct = jpeg_fdct_float; - break; -#endif - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } - - /* Mark divisor tables unallocated */ - for (i = 0; i < NUM_QUANT_TBLS; i++) { - fdct->divisors[i] = NULL; -#ifdef DCT_FLOAT_SUPPORTED - fdct->float_divisors[i] = NULL; -#endif - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.c deleted file mode 100755 index e718cf5..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.c +++ /dev/null @@ -1,909 +0,0 @@ -/* - * jchuff.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains Huffman entropy encoding routines. - * - * Much of the complexity here has to do with supporting output suspension. - * If the data destination module demands suspension, we want to be able to - * back up to the start of the current MCU. To do this, we copy state - * variables into local working storage, and update them back to the - * permanent JPEG objects only upon successful completion of an MCU. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jchuff.h" /* Declarations shared with jcphuff.c */ - - -/* Expanded entropy encoder object for Huffman encoding. - * - * The savable_state subrecord contains fields that change within an MCU, - * but must not be updated permanently until we complete the MCU. - */ - -typedef struct { - INT32 put_buffer; /* current bit-accumulation buffer */ - int put_bits; /* # of bits now in it */ - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ -} savable_state; - -/* This macro is to work around compilers with missing or broken - * structure assignment. You'll need to fix this code if you have - * such a compiler and you change MAX_COMPS_IN_SCAN. - */ - -#ifndef NO_STRUCT_ASSIGN -#define ASSIGN_STATE(dest,src) ((dest) = (src)) -#else -#if MAX_COMPS_IN_SCAN == 4 -#define ASSIGN_STATE(dest,src) \ - ((dest).put_buffer = (src).put_buffer, \ - (dest).put_bits = (src).put_bits, \ - (dest).last_dc_val[0] = (src).last_dc_val[0], \ - (dest).last_dc_val[1] = (src).last_dc_val[1], \ - (dest).last_dc_val[2] = (src).last_dc_val[2], \ - (dest).last_dc_val[3] = (src).last_dc_val[3]) -#endif -#endif - - -typedef struct { - struct jpeg_entropy_encoder pub; /* public fields */ - - savable_state saved; /* Bit buffer & DC state at start of MCU */ - - /* These fields are NOT loaded into local working state. */ - unsigned int restarts_to_go; /* MCUs left in this restart interval */ - int next_restart_num; /* next restart number to write (0-7) */ - - /* Pointers to derived tables (these workspaces have image lifespan) */ - c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; - c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; - -#ifdef ENTROPY_OPT_SUPPORTED /* Statistics tables for optimization */ - long * dc_count_ptrs[NUM_HUFF_TBLS]; - long * ac_count_ptrs[NUM_HUFF_TBLS]; -#endif -} huff_entropy_encoder; - -typedef huff_entropy_encoder * huff_entropy_ptr; - -/* Working state while writing an MCU. - * This struct contains all the fields that are needed by subroutines. - */ - -typedef struct { - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - savable_state cur; /* Current bit buffer & DC state */ - j_compress_ptr cinfo; /* dump_buffer needs access to this */ -} working_state; - - -/* Forward declarations */ -METHODDEF(boolean) encode_mcu_huff JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(void) finish_pass_huff JPP((j_compress_ptr cinfo)); -#ifdef ENTROPY_OPT_SUPPORTED -METHODDEF(boolean) encode_mcu_gather JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(void) finish_pass_gather JPP((j_compress_ptr cinfo)); -#endif - - -/* - * Initialize for a Huffman-compressed scan. - * If gather_statistics is TRUE, we do not output anything during the scan, - * just count the Huffman symbols used and generate Huffman code tables. - */ - -METHODDEF(void) -start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int ci, dctbl, actbl; - jpeg_component_info * compptr; - - if (gather_statistics) { -#ifdef ENTROPY_OPT_SUPPORTED - entropy->pub.encode_mcu = encode_mcu_gather; - entropy->pub.finish_pass = finish_pass_gather; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - entropy->pub.encode_mcu = encode_mcu_huff; - entropy->pub.finish_pass = finish_pass_huff; - } - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - dctbl = compptr->dc_tbl_no; - actbl = compptr->ac_tbl_no; - if (gather_statistics) { -#ifdef ENTROPY_OPT_SUPPORTED - /* Check for invalid table indexes */ - /* (make_c_derived_tbl does this in the other path) */ - if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl); - if (actbl < 0 || actbl >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl); - /* Allocate and zero the statistics tables */ - /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ - if (entropy->dc_count_ptrs[dctbl] == NULL) - entropy->dc_count_ptrs[dctbl] = (long *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 257 * SIZEOF(long)); - MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long)); - if (entropy->ac_count_ptrs[actbl] == NULL) - entropy->ac_count_ptrs[actbl] = (long *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 257 * SIZEOF(long)); - MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long)); -#endif - } else { - /* Compute derived values for Huffman tables */ - /* We may do this more than once for a table, but it's not expensive */ - jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl, - & entropy->dc_derived_tbls[dctbl]); - jpeg_make_c_derived_tbl(cinfo, FALSE, actbl, - & entropy->ac_derived_tbls[actbl]); - } - /* Initialize DC predictions to 0 */ - entropy->saved.last_dc_val[ci] = 0; - } - - /* Initialize bit buffer to empty */ - entropy->saved.put_buffer = 0; - entropy->saved.put_bits = 0; - - /* Initialize restart stuff */ - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num = 0; -} - - -/* - * Compute the derived values for a Huffman table. - * This routine also performs some validation checks on the table. - * - * Note this is also used by jcphuff.c. - */ - -GLOBAL(void) -jpeg_make_c_derived_tbl (j_compress_ptr cinfo, boolean isDC, int tblno, - c_derived_tbl ** pdtbl) -{ - JHUFF_TBL *htbl; - c_derived_tbl *dtbl; - int p, i, l, lastp, si, maxsymbol; - char huffsize[257]; - unsigned int huffcode[257]; - unsigned int code; - - /* Note that huffsize[] and huffcode[] are filled in code-length order, - * paralleling the order of the symbols themselves in htbl->huffval[]. - */ - - /* Find the input Huffman table */ - if (tblno < 0 || tblno >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); - htbl = - isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; - if (htbl == NULL) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); - - /* Allocate a workspace if we haven't already done so. */ - if (*pdtbl == NULL) - *pdtbl = (c_derived_tbl *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(c_derived_tbl)); - dtbl = *pdtbl; - - /* Figure C.1: make table of Huffman code length for each symbol */ - - p = 0; - for (l = 1; l <= 16; l++) { - i = (int) htbl->bits[l]; - if (i < 0 || p + i > 256) /* protect against table overrun */ - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - while (i--) - huffsize[p++] = (char) l; - } - huffsize[p] = 0; - lastp = p; - - /* Figure C.2: generate the codes themselves */ - /* We also validate that the counts represent a legal Huffman code tree. */ - - code = 0; - si = huffsize[0]; - p = 0; - while (huffsize[p]) { - while (((int) huffsize[p]) == si) { - huffcode[p++] = code; - code++; - } - /* code is now 1 more than the last code used for codelength si; but - * it must still fit in si bits, since no code is allowed to be all ones. - */ - if (((INT32) code) >= (((INT32) 1) << si)) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - code <<= 1; - si++; - } - - /* Figure C.3: generate encoding tables */ - /* These are code and size indexed by symbol value */ - - /* Set all codeless symbols to have code length 0; - * this lets us detect duplicate VAL entries here, and later - * allows emit_bits to detect any attempt to emit such symbols. - */ - MEMZERO(dtbl->ehufsi, SIZEOF(dtbl->ehufsi)); - - /* This is also a convenient place to check for out-of-range - * and duplicated VAL entries. We allow 0..255 for AC symbols - * but only 0..15 for DC. (We could constrain them further - * based on data depth and mode, but this seems enough.) - */ - maxsymbol = isDC ? 15 : 255; - - for (p = 0; p < lastp; p++) { - i = htbl->huffval[p]; - if (i < 0 || i > maxsymbol || dtbl->ehufsi[i]) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - dtbl->ehufco[i] = huffcode[p]; - dtbl->ehufsi[i] = huffsize[p]; - } -} - - -/* Outputting bytes to the file */ - -/* Emit a byte, taking 'action' if must suspend. */ -#define emit_byte(state,val,action) \ - { *(state)->next_output_byte++ = (JOCTET) (val); \ - if (--(state)->free_in_buffer == 0) \ - if (! dump_buffer(state)) \ - { action; } } - - -LOCAL(boolean) -dump_buffer (working_state * state) -/* Empty the output buffer; return TRUE if successful, FALSE if must suspend */ -{ - struct jpeg_destination_mgr * dest = state->cinfo->dest; - - if (! (*dest->empty_output_buffer) (state->cinfo)) - return FALSE; - /* After a successful buffer dump, must reset buffer pointers */ - state->next_output_byte = dest->next_output_byte; - state->free_in_buffer = dest->free_in_buffer; - return TRUE; -} - - -/* Outputting bits to the file */ - -/* Only the right 24 bits of put_buffer are used; the valid bits are - * left-justified in this part. At most 16 bits can be passed to emit_bits - * in one call, and we never retain more than 7 bits in put_buffer - * between calls, so 24 bits are sufficient. - */ - -INLINE -LOCAL(boolean) -emit_bits (working_state * state, unsigned int code, int size) -/* Emit some bits; return TRUE if successful, FALSE if must suspend */ -{ - /* This routine is heavily used, so it's worth coding tightly. */ - INT32 put_buffer = (INT32) code; - int put_bits = state->cur.put_bits; - - /* if size is 0, caller used an invalid Huffman table entry */ - if (size == 0) - ERREXIT(state->cinfo, JERR_HUFF_MISSING_CODE); - - put_buffer &= (((INT32) 1)<cur.put_buffer; /* and merge with old buffer contents */ - - while (put_bits >= 8) { - int c = (int) ((put_buffer >> 16) & 0xFF); - - emit_byte(state, c, return FALSE); - if (c == 0xFF) { /* need to stuff a zero byte? */ - emit_byte(state, 0, return FALSE); - } - put_buffer <<= 8; - put_bits -= 8; - } - - state->cur.put_buffer = put_buffer; /* update state variables */ - state->cur.put_bits = put_bits; - - return TRUE; -} - - -LOCAL(boolean) -flush_bits (working_state * state) -{ - if (! emit_bits(state, 0x7F, 7)) /* fill any partial byte with ones */ - return FALSE; - state->cur.put_buffer = 0; /* and reset bit-buffer to empty */ - state->cur.put_bits = 0; - return TRUE; -} - - -/* Encode a single block's worth of coefficients */ - -LOCAL(boolean) -encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val, - c_derived_tbl *dctbl, c_derived_tbl *actbl) -{ - int temp, temp2; - int nbits; - int k, r, i; - - /* Encode the DC coefficient difference per section F.1.2.1 */ - - temp = temp2 = block[0] - last_dc_val; - - if (temp < 0) { - temp = -temp; /* temp is abs value of input */ - /* For a negative input, want temp2 = bitwise complement of abs(input) */ - /* This code assumes we are on a two's complement machine */ - temp2--; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 0; - while (temp) { - nbits++; - temp >>= 1; - } - /* Check for out-of-range coefficient values. - * Since we're encoding a difference, the range limit is twice as much. - */ - if (nbits > MAX_COEF_BITS+1) - ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); - - /* Emit the Huffman-coded symbol for the number of bits */ - if (! emit_bits(state, dctbl->ehufco[nbits], dctbl->ehufsi[nbits])) - return FALSE; - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - if (nbits) /* emit_bits rejects calls with size 0 */ - if (! emit_bits(state, (unsigned int) temp2, nbits)) - return FALSE; - - /* Encode the AC coefficients per section F.1.2.2 */ - - r = 0; /* r = run length of zeros */ - - for (k = 1; k < DCTSIZE2; k++) { - if ((temp = block[jpeg_natural_order[k]]) == 0) { - r++; - } else { - /* if run length > 15, must emit special run-length-16 codes (0xF0) */ - while (r > 15) { - if (! emit_bits(state, actbl->ehufco[0xF0], actbl->ehufsi[0xF0])) - return FALSE; - r -= 16; - } - - temp2 = temp; - if (temp < 0) { - temp = -temp; /* temp is abs value of input */ - /* This code assumes we are on a two's complement machine */ - temp2--; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 1; /* there must be at least one 1 bit */ - while ((temp >>= 1)) - nbits++; - /* Check for out-of-range coefficient values */ - if (nbits > MAX_COEF_BITS) - ERREXIT(state->cinfo, JERR_BAD_DCT_COEF); - - /* Emit Huffman symbol for run length / number of bits */ - i = (r << 4) + nbits; - if (! emit_bits(state, actbl->ehufco[i], actbl->ehufsi[i])) - return FALSE; - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - if (! emit_bits(state, (unsigned int) temp2, nbits)) - return FALSE; - - r = 0; - } - } - - /* If the last coef(s) were zero, emit an end-of-block code */ - if (r > 0) - if (! emit_bits(state, actbl->ehufco[0], actbl->ehufsi[0])) - return FALSE; - - return TRUE; -} - - -/* - * Emit a restart marker & resynchronize predictions. - */ - -LOCAL(boolean) -emit_restart (working_state * state, int restart_num) -{ - int ci; - - if (! flush_bits(state)) - return FALSE; - - emit_byte(state, 0xFF, return FALSE); - emit_byte(state, JPEG_RST0 + restart_num, return FALSE); - - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < state->cinfo->comps_in_scan; ci++) - state->cur.last_dc_val[ci] = 0; - - /* The restart counter is not updated until we successfully write the MCU. */ - - return TRUE; -} - - -/* - * Encode and output one MCU's worth of Huffman-compressed coefficients. - */ - -METHODDEF(boolean) -encode_mcu_huff (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - working_state state; - int blkn, ci; - jpeg_component_info * compptr; - - /* Load up working state */ - state.next_output_byte = cinfo->dest->next_output_byte; - state.free_in_buffer = cinfo->dest->free_in_buffer; - ASSIGN_STATE(state.cur, entropy->saved); - state.cinfo = cinfo; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! emit_restart(&state, entropy->next_restart_num)) - return FALSE; - } - - /* Encode the MCU data blocks */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - if (! encode_one_block(&state, - MCU_data[blkn][0], state.cur.last_dc_val[ci], - entropy->dc_derived_tbls[compptr->dc_tbl_no], - entropy->ac_derived_tbls[compptr->ac_tbl_no])) - return FALSE; - /* Update last_dc_val */ - state.cur.last_dc_val[ci] = MCU_data[blkn][0][0]; - } - - /* Completed MCU, so update state */ - cinfo->dest->next_output_byte = state.next_output_byte; - cinfo->dest->free_in_buffer = state.free_in_buffer; - ASSIGN_STATE(entropy->saved, state.cur); - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * Finish up at the end of a Huffman-compressed scan. - */ - -METHODDEF(void) -finish_pass_huff (j_compress_ptr cinfo) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - working_state state; - - /* Load up working state ... flush_bits needs it */ - state.next_output_byte = cinfo->dest->next_output_byte; - state.free_in_buffer = cinfo->dest->free_in_buffer; - ASSIGN_STATE(state.cur, entropy->saved); - state.cinfo = cinfo; - - /* Flush out the last data */ - if (! flush_bits(&state)) - ERREXIT(cinfo, JERR_CANT_SUSPEND); - - /* Update state */ - cinfo->dest->next_output_byte = state.next_output_byte; - cinfo->dest->free_in_buffer = state.free_in_buffer; - ASSIGN_STATE(entropy->saved, state.cur); -} - - -/* - * Huffman coding optimization. - * - * We first scan the supplied data and count the number of uses of each symbol - * that is to be Huffman-coded. (This process MUST agree with the code above.) - * Then we build a Huffman coding tree for the observed counts. - * Symbols which are not needed at all for the particular image are not - * assigned any code, which saves space in the DHT marker as well as in - * the compressed data. - */ - -#ifdef ENTROPY_OPT_SUPPORTED - - -/* Process a single block's worth of coefficients */ - -LOCAL(void) -htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val, - long dc_counts[], long ac_counts[]) -{ - int temp; - int nbits; - int k, r; - - /* Encode the DC coefficient difference per section F.1.2.1 */ - - temp = block[0] - last_dc_val; - if (temp < 0) - temp = -temp; - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 0; - while (temp) { - nbits++; - temp >>= 1; - } - /* Check for out-of-range coefficient values. - * Since we're encoding a difference, the range limit is twice as much. - */ - if (nbits > MAX_COEF_BITS+1) - ERREXIT(cinfo, JERR_BAD_DCT_COEF); - - /* Count the Huffman symbol for the number of bits */ - dc_counts[nbits]++; - - /* Encode the AC coefficients per section F.1.2.2 */ - - r = 0; /* r = run length of zeros */ - - for (k = 1; k < DCTSIZE2; k++) { - if ((temp = block[jpeg_natural_order[k]]) == 0) { - r++; - } else { - /* if run length > 15, must emit special run-length-16 codes (0xF0) */ - while (r > 15) { - ac_counts[0xF0]++; - r -= 16; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - if (temp < 0) - temp = -temp; - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 1; /* there must be at least one 1 bit */ - while ((temp >>= 1)) - nbits++; - /* Check for out-of-range coefficient values */ - if (nbits > MAX_COEF_BITS) - ERREXIT(cinfo, JERR_BAD_DCT_COEF); - - /* Count Huffman symbol for run length / number of bits */ - ac_counts[(r << 4) + nbits]++; - - r = 0; - } - } - - /* If the last coef(s) were zero, emit an end-of-block code */ - if (r > 0) - ac_counts[0]++; -} - - -/* - * Trial-encode one MCU's worth of Huffman-compressed coefficients. - * No data is actually output, so no suspension return is possible. - */ - -METHODDEF(boolean) -encode_mcu_gather (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int blkn, ci; - jpeg_component_info * compptr; - - /* Take care of restart intervals if needed */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) - entropy->saved.last_dc_val[ci] = 0; - /* Update restart state */ - entropy->restarts_to_go = cinfo->restart_interval; - } - entropy->restarts_to_go--; - } - - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - htest_one_block(cinfo, MCU_data[blkn][0], entropy->saved.last_dc_val[ci], - entropy->dc_count_ptrs[compptr->dc_tbl_no], - entropy->ac_count_ptrs[compptr->ac_tbl_no]); - entropy->saved.last_dc_val[ci] = MCU_data[blkn][0][0]; - } - - return TRUE; -} - - -/* - * Generate the best Huffman code table for the given counts, fill htbl. - * Note this is also used by jcphuff.c. - * - * The JPEG standard requires that no symbol be assigned a codeword of all - * one bits (so that padding bits added at the end of a compressed segment - * can't look like a valid code). Because of the canonical ordering of - * codewords, this just means that there must be an unused slot in the - * longest codeword length category. Section K.2 of the JPEG spec suggests - * reserving such a slot by pretending that symbol 256 is a valid symbol - * with count 1. In theory that's not optimal; giving it count zero but - * including it in the symbol set anyway should give a better Huffman code. - * But the theoretically better code actually seems to come out worse in - * practice, because it produces more all-ones bytes (which incur stuffed - * zero bytes in the final file). In any case the difference is tiny. - * - * The JPEG standard requires Huffman codes to be no more than 16 bits long. - * If some symbols have a very small but nonzero probability, the Huffman tree - * must be adjusted to meet the code length restriction. We currently use - * the adjustment method suggested in JPEG section K.2. This method is *not* - * optimal; it may not choose the best possible limited-length code. But - * typically only very-low-frequency symbols will be given less-than-optimal - * lengths, so the code is almost optimal. Experimental comparisons against - * an optimal limited-length-code algorithm indicate that the difference is - * microscopic --- usually less than a hundredth of a percent of total size. - * So the extra complexity of an optimal algorithm doesn't seem worthwhile. - */ - -GLOBAL(void) -jpeg_gen_optimal_table (j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[]) -{ -#define MAX_CLEN 32 /* assumed maximum initial code length */ - UINT8 bits[MAX_CLEN+1]; /* bits[k] = # of symbols with code length k */ - int codesize[257]; /* codesize[k] = code length of symbol k */ - int others[257]; /* next symbol in current branch of tree */ - int c1, c2; - int p, i, j; - long v; - - /* This algorithm is explained in section K.2 of the JPEG standard */ - - MEMZERO(bits, SIZEOF(bits)); - MEMZERO(codesize, SIZEOF(codesize)); - for (i = 0; i < 257; i++) - others[i] = -1; /* init links to empty */ - - freq[256] = 1; /* make sure 256 has a nonzero count */ - /* Including the pseudo-symbol 256 in the Huffman procedure guarantees - * that no real symbol is given code-value of all ones, because 256 - * will be placed last in the largest codeword category. - */ - - /* Huffman's basic algorithm to assign optimal code lengths to symbols */ - - for (;;) { - /* Find the smallest nonzero frequency, set c1 = its symbol */ - /* In case of ties, take the larger symbol number */ - c1 = -1; - v = 1000000000L; - for (i = 0; i <= 256; i++) { - if (freq[i] && freq[i] <= v) { - v = freq[i]; - c1 = i; - } - } - - /* Find the next smallest nonzero frequency, set c2 = its symbol */ - /* In case of ties, take the larger symbol number */ - c2 = -1; - v = 1000000000L; - for (i = 0; i <= 256; i++) { - if (freq[i] && freq[i] <= v && i != c1) { - v = freq[i]; - c2 = i; - } - } - - /* Done if we've merged everything into one frequency */ - if (c2 < 0) - break; - - /* Else merge the two counts/trees */ - freq[c1] += freq[c2]; - freq[c2] = 0; - - /* Increment the codesize of everything in c1's tree branch */ - codesize[c1]++; - while (others[c1] >= 0) { - c1 = others[c1]; - codesize[c1]++; - } - - others[c1] = c2; /* chain c2 onto c1's tree branch */ - - /* Increment the codesize of everything in c2's tree branch */ - codesize[c2]++; - while (others[c2] >= 0) { - c2 = others[c2]; - codesize[c2]++; - } - } - - /* Now count the number of symbols of each code length */ - for (i = 0; i <= 256; i++) { - if (codesize[i]) { - /* The JPEG standard seems to think that this can't happen, */ - /* but I'm paranoid... */ - if (codesize[i] > MAX_CLEN) - ERREXIT(cinfo, JERR_HUFF_CLEN_OVERFLOW); - - bits[codesize[i]]++; - } - } - - /* JPEG doesn't allow symbols with code lengths over 16 bits, so if the pure - * Huffman procedure assigned any such lengths, we must adjust the coding. - * Here is what the JPEG spec says about how this next bit works: - * Since symbols are paired for the longest Huffman code, the symbols are - * removed from this length category two at a time. The prefix for the pair - * (which is one bit shorter) is allocated to one of the pair; then, - * skipping the BITS entry for that prefix length, a code word from the next - * shortest nonzero BITS entry is converted into a prefix for two code words - * one bit longer. - */ - - for (i = MAX_CLEN; i > 16; i--) { - while (bits[i] > 0) { - j = i - 2; /* find length of new prefix to be used */ - while (bits[j] == 0) - j--; - - bits[i] -= 2; /* remove two symbols */ - bits[i-1]++; /* one goes in this length */ - bits[j+1] += 2; /* two new symbols in this length */ - bits[j]--; /* symbol of this length is now a prefix */ - } - } - - /* Remove the count for the pseudo-symbol 256 from the largest codelength */ - while (bits[i] == 0) /* find largest codelength still in use */ - i--; - bits[i]--; - - /* Return final symbol counts (only for lengths 0..16) */ - MEMCOPY(htbl->bits, bits, SIZEOF(htbl->bits)); - - /* Return a list of the symbols sorted by code length */ - /* It's not real clear to me why we don't need to consider the codelength - * changes made above, but the JPEG spec seems to think this works. - */ - p = 0; - for (i = 1; i <= MAX_CLEN; i++) { - for (j = 0; j <= 255; j++) { - if (codesize[j] == i) { - htbl->huffval[p] = (UINT8) j; - p++; - } - } - } - - /* Set sent_table FALSE so updated table will be written to JPEG file. */ - htbl->sent_table = FALSE; -} - - -/* - * Finish up a statistics-gathering pass and create the new Huffman tables. - */ - -METHODDEF(void) -finish_pass_gather (j_compress_ptr cinfo) -{ - huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; - int ci, dctbl, actbl; - jpeg_component_info * compptr; - JHUFF_TBL **htblptr; - boolean did_dc[NUM_HUFF_TBLS]; - boolean did_ac[NUM_HUFF_TBLS]; - - /* It's important not to apply jpeg_gen_optimal_table more than once - * per table, because it clobbers the input frequency counts! - */ - MEMZERO(did_dc, SIZEOF(did_dc)); - MEMZERO(did_ac, SIZEOF(did_ac)); - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - dctbl = compptr->dc_tbl_no; - actbl = compptr->ac_tbl_no; - if (! did_dc[dctbl]) { - htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl]; - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]); - did_dc[dctbl] = TRUE; - } - if (! did_ac[actbl]) { - htblptr = & cinfo->ac_huff_tbl_ptrs[actbl]; - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]); - did_ac[actbl] = TRUE; - } - } -} - - -#endif /* ENTROPY_OPT_SUPPORTED */ - - -/* - * Module initialization routine for Huffman entropy encoding. - */ - -GLOBAL(void) -jinit_huff_encoder (j_compress_ptr cinfo) -{ - huff_entropy_ptr entropy; - int i; - - entropy = (huff_entropy_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(huff_entropy_encoder)); - cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; - entropy->pub.start_pass = start_pass_huff; - - /* Mark tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; -#ifdef ENTROPY_OPT_SUPPORTED - entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL; -#endif - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.h deleted file mode 100755 index 783b32b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jchuff.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * jchuff.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains declarations for Huffman entropy encoding routines - * that are shared between the sequential encoder (jchuff.c) and the - * progressive encoder (jcphuff.c). No other modules need to see these. - */ - -/* The legal range of a DCT coefficient is - * -1024 .. +1023 for 8-bit data; - * -16384 .. +16383 for 12-bit data. - * Hence the magnitude should always fit in 10 or 14 bits respectively. - */ - -#ifndef _jchuff_h_ -#define _jchuff_h_ - -#if BITS_IN_JSAMPLE == 8 -#define MAX_COEF_BITS 10 -#else -#define MAX_COEF_BITS 14 -#endif - -/* Derived data constructed for each Huffman table */ - -typedef struct { - unsigned int ehufco[256]; /* code for each symbol */ - char ehufsi[256]; /* length of code for each symbol */ - /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */ -} c_derived_tbl; - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_make_c_derived_tbl jMkCDerived -#define jpeg_gen_optimal_table jGenOptTbl -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - -/* Expand a Huffman table definition into the derived format */ -EXTERN(void) jpeg_make_c_derived_tbl - JPP((j_compress_ptr cinfo, boolean isDC, int tblno, - c_derived_tbl ** pdtbl)); - -/* Generate an optimal table definition given the specified counts */ -EXTERN(void) jpeg_gen_optimal_table - JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])); - -#endif diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcinit.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcinit.c deleted file mode 100755 index 19de8d0..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcinit.c +++ /dev/null @@ -1,72 +0,0 @@ -/* - * jcinit.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains initialization logic for the JPEG compressor. - * This routine is in charge of selecting the modules to be executed and - * making an initialization call to each one. - * - * Logically, this code belongs in jcmaster.c. It's split out because - * linking this routine implies linking the entire compression library. - * For a transcoding-only application, we want to be able to use jcmaster.c - * without linking in the whole library. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Master selection of compression modules. - * This is done once at the start of processing an image. We determine - * which modules will be used and give them appropriate initialization calls. - */ - -GLOBAL(void) -jinit_compress_master (j_compress_ptr cinfo) -{ - /* Initialize master control (includes parameter checking/processing) */ - jinit_c_master_control(cinfo, FALSE /* full compression */); - - /* Preprocessing */ - if (! cinfo->raw_data_in) { - jinit_color_converter(cinfo); - jinit_downsampler(cinfo); - jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */); - } - /* Forward DCT */ - jinit_forward_dct(cinfo); - /* Entropy encoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef C_PROGRESSIVE_SUPPORTED - jinit_phuff_encoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_encoder(cinfo); - } - - /* Need a full-image coefficient buffer in any multi-pass mode. */ - jinit_c_coef_controller(cinfo, - (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding)); - jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */); - - jinit_marker_writer(cinfo); - - /* We can now tell the memory manager to allocate virtual arrays. */ - (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); - - /* Write the datastream header (SOI) immediately. - * Frame and scan headers are postponed till later. - * This lets application insert special markers after the SOI. - */ - (*cinfo->marker->write_file_header) (cinfo); -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmainct.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmainct.c deleted file mode 100755 index 261b284..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmainct.c +++ /dev/null @@ -1,293 +0,0 @@ -/* - * jcmainct.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the main buffer controller for compression. - * The main buffer lies between the pre-processor and the JPEG - * compressor proper; it holds downsampled data in the JPEG colorspace. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Note: currently, there is no operating mode in which a full-image buffer - * is needed at this step. If there were, that mode could not be used with - * "raw data" input, since this module is bypassed in that case. However, - * we've left the code here for possible use in special applications. - */ -#undef FULL_MAIN_BUFFER_SUPPORTED - - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_c_main_controller pub; /* public fields */ - - JDIMENSION cur_iMCU_row; /* number of current iMCU row */ - JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */ - boolean suspended; /* remember if we suspended output */ - J_BUF_MODE pass_mode; /* current operating mode */ - - /* If using just a strip buffer, this points to the entire set of buffers - * (we allocate one for each component). In the full-image case, this - * points to the currently accessible strips of the virtual arrays. - */ - JSAMPARRAY buffer[MAX_COMPONENTS]; - -#ifdef FULL_MAIN_BUFFER_SUPPORTED - /* If using full-image storage, this array holds pointers to virtual-array - * control blocks for each component. Unused if not full-image storage. - */ - jvirt_sarray_ptr whole_image[MAX_COMPONENTS]; -#endif -} my_main_controller; - -typedef my_main_controller * my_main_ptr; - - -/* Forward declarations */ -METHODDEF(void) process_data_simple_main - JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, - JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); -#ifdef FULL_MAIN_BUFFER_SUPPORTED -METHODDEF(void) process_data_buffer_main - JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf, - JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail)); -#endif - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_main_ptr main_ = (my_main_ptr) cinfo->main; - - /* Do nothing in raw-data mode. */ - if (cinfo->raw_data_in) - return; - - main_->cur_iMCU_row = 0; /* initialize counters */ - main_->rowgroup_ctr = 0; - main_->suspended = FALSE; - main_->pass_mode = pass_mode; /* save mode for use by process_data */ - - switch (pass_mode) { - case JBUF_PASS_THRU: -#ifdef FULL_MAIN_BUFFER_SUPPORTED - if (main_->whole_image[0] != NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); -#endif - main_->pub.process_data = process_data_simple_main; - break; -#ifdef FULL_MAIN_BUFFER_SUPPORTED - case JBUF_SAVE_SOURCE: - case JBUF_CRANK_DEST: - case JBUF_SAVE_AND_PASS: - if (main_->whole_image[0] == NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - main_->pub.process_data = process_data_buffer_main; - break; -#endif - default: - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - break; - } -} - - -/* - * Process some data. - * This routine handles the simple pass-through mode, - * where we have only a strip buffer. - */ - -METHODDEF(void) -process_data_simple_main (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail) -{ - my_main_ptr main_ = (my_main_ptr) cinfo->main; - - while (main_->cur_iMCU_row < cinfo->total_iMCU_rows) { - /* Read input data if we haven't filled the main buffer yet */ - if (main_->rowgroup_ctr < DCTSIZE) - (*cinfo->prep->pre_process_data) (cinfo, - input_buf, in_row_ctr, in_rows_avail, - main_->buffer, &main_->rowgroup_ctr, - (JDIMENSION) DCTSIZE); - - /* If we don't have a full iMCU row buffered, return to application for - * more data. Note that preprocessor will always pad to fill the iMCU row - * at the bottom of the image. - */ - if (main_->rowgroup_ctr != DCTSIZE) - return; - - /* Send the completed row to the compressor */ - if (! (*cinfo->coef->compress_data) (cinfo, main_->buffer)) { - /* If compressor did not consume the whole row, then we must need to - * suspend processing and return to the application. In this situation - * we pretend we didn't yet consume the last input row; otherwise, if - * it happened to be the last row of the image, the application would - * think we were done. - */ - if (! main_->suspended) { - (*in_row_ctr)--; - main_->suspended = TRUE; - } - return; - } - /* We did finish the row. Undo our little suspension hack if a previous - * call suspended; then mark the main buffer empty. - */ - if (main_->suspended) { - (*in_row_ctr)++; - main_->suspended = FALSE; - } - main_->rowgroup_ctr = 0; - main_->cur_iMCU_row++; - } -} - - -#ifdef FULL_MAIN_BUFFER_SUPPORTED - -/* - * Process some data. - * This routine handles all of the modes that use a full-size buffer. - */ - -METHODDEF(void) -process_data_buffer_main (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail) -{ - my_main_ptr main = (my_main_ptr) cinfo->main; - int ci; - jpeg_component_info *compptr; - boolean writing = (main->pass_mode != JBUF_CRANK_DEST); - - while (main->cur_iMCU_row < cinfo->total_iMCU_rows) { - /* Realign the virtual buffers if at the start of an iMCU row. */ - if (main->rowgroup_ctr == 0) { - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - main->buffer[ci] = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, main->whole_image[ci], - main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE), - (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing); - } - /* In a read pass, pretend we just read some source data. */ - if (! writing) { - *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE; - main->rowgroup_ctr = DCTSIZE; - } - } - - /* If a write pass, read input data until the current iMCU row is full. */ - /* Note: preprocessor will pad if necessary to fill the last iMCU row. */ - if (writing) { - (*cinfo->prep->pre_process_data) (cinfo, - input_buf, in_row_ctr, in_rows_avail, - main->buffer, &main->rowgroup_ctr, - (JDIMENSION) DCTSIZE); - /* Return to application if we need more data to fill the iMCU row. */ - if (main->rowgroup_ctr < DCTSIZE) - return; - } - - /* Emit data, unless this is a sink-only pass. */ - if (main->pass_mode != JBUF_SAVE_SOURCE) { - if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) { - /* If compressor did not consume the whole row, then we must need to - * suspend processing and return to the application. In this situation - * we pretend we didn't yet consume the last input row; otherwise, if - * it happened to be the last row of the image, the application would - * think we were done. - */ - if (! main->suspended) { - (*in_row_ctr)--; - main->suspended = TRUE; - } - return; - } - /* We did finish the row. Undo our little suspension hack if a previous - * call suspended; then mark the main buffer empty. - */ - if (main->suspended) { - (*in_row_ctr)++; - main->suspended = FALSE; - } - } - - /* If get here, we are done with this iMCU row. Mark buffer empty. */ - main->rowgroup_ctr = 0; - main->cur_iMCU_row++; - } -} - -#endif /* FULL_MAIN_BUFFER_SUPPORTED */ - - -/* - * Initialize main buffer controller. - */ - -GLOBAL(void) -jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer) -{ - my_main_ptr main_; - int ci; - jpeg_component_info *compptr; - - main_ = (my_main_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_main_controller)); - cinfo->main = (struct jpeg_c_main_controller *) main_; - main_->pub.start_pass = start_pass_main; - - /* We don't need to create a buffer in raw-data mode. */ - if (cinfo->raw_data_in) - return; - - /* Create the buffer. It holds downsampled data, so each component - * may be of a different size. - */ - if (need_full_buffer) { -#ifdef FULL_MAIN_BUFFER_SUPPORTED - /* Allocate a full-image virtual array for each component */ - /* Note we pad the bottom to a multiple of the iMCU height */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - main->whole_image[ci] = (*cinfo->mem->request_virt_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - compptr->width_in_blocks * DCTSIZE, - (JDIMENSION) jround_up((long) compptr->height_in_blocks, - (long) compptr->v_samp_factor) * DCTSIZE, - (JDIMENSION) (compptr->v_samp_factor * DCTSIZE)); - } -#else - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); -#endif - } else { -#ifdef FULL_MAIN_BUFFER_SUPPORTED - main_->whole_image[0] = NULL; /* flag for no virtual arrays */ -#endif - /* Allocate a strip buffer for each component */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - main_->buffer[ci] = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - compptr->width_in_blocks * DCTSIZE, - (JDIMENSION) (compptr->v_samp_factor * DCTSIZE)); - } - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmarker.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmarker.c deleted file mode 100755 index be90314..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmarker.c +++ /dev/null @@ -1,597 +0,0 @@ -/* - * jcmarker.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to write JPEG datastream markers. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - - -/* Private state */ - -typedef struct { - struct jpeg_marker_writer pub; /* public fields */ - - unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */ -} my_marker_writer; - -typedef my_marker_writer * my_marker_ptr; - - -/* - * Basic output routines. - * - * Note that we do not support suspension while writing a marker. - * Therefore, an application using suspension must ensure that there is - * enough buffer space for the initial markers (typ. 600-700 bytes) before - * calling jpeg_start_compress, and enough space to write the trailing EOI - * (a few bytes) before calling jpeg_finish_compress. Multipass compression - * modes are not supported at all with suspension, so those two are the only - * points where markers will be written. - */ - -LOCAL(void) -emit_byte (j_compress_ptr cinfo, int val) -/* Emit a byte */ -{ - struct jpeg_destination_mgr * dest = cinfo->dest; - - *(dest->next_output_byte)++ = (JOCTET) val; - if (--dest->free_in_buffer == 0) { - if (! (*dest->empty_output_buffer) (cinfo)) - ERREXIT(cinfo, JERR_CANT_SUSPEND); - } -} - - -LOCAL(void) -emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark) -/* Emit a marker code */ -{ - emit_byte(cinfo, 0xFF); - emit_byte(cinfo, (int) mark); -} - - -LOCAL(void) -emit_2bytes (j_compress_ptr cinfo, int value) -/* Emit a 2-byte integer; these are always MSB first in JPEG files */ -{ - emit_byte(cinfo, (value >> 8) & 0xFF); - emit_byte(cinfo, value & 0xFF); -} - - -/* - * Routines to write specific marker types. - */ - -LOCAL(int) -emit_dqt (j_compress_ptr cinfo, int index) -/* Emit a DQT marker */ -/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */ -{ - JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index]; - int prec; - int i; - - if (qtbl == NULL) - ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index); - - prec = 0; - for (i = 0; i < DCTSIZE2; i++) { - if (qtbl->quantval[i] > 255) - prec = 1; - } - - if (! qtbl->sent_table) { - emit_marker(cinfo, M_DQT); - - emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2); - - emit_byte(cinfo, index + (prec<<4)); - - for (i = 0; i < DCTSIZE2; i++) { - /* The table entries must be emitted in zigzag order. */ - unsigned int qval = qtbl->quantval[jpeg_natural_order[i]]; - if (prec) - emit_byte(cinfo, (int) (qval >> 8)); - emit_byte(cinfo, (int) (qval & 0xFF)); - } - - qtbl->sent_table = TRUE; - } - - return prec; -} - - -LOCAL(void) -emit_dht (j_compress_ptr cinfo, int index, boolean is_ac) -/* Emit a DHT marker */ -{ - JHUFF_TBL * htbl; - int length, i; - - if (is_ac) { - htbl = cinfo->ac_huff_tbl_ptrs[index]; - index += 0x10; /* output index has AC bit set */ - } else { - htbl = cinfo->dc_huff_tbl_ptrs[index]; - } - - if (htbl == NULL) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index); - - if (! htbl->sent_table) { - emit_marker(cinfo, M_DHT); - - length = 0; - for (i = 1; i <= 16; i++) - length += htbl->bits[i]; - - emit_2bytes(cinfo, length + 2 + 1 + 16); - emit_byte(cinfo, index); - - for (i = 1; i <= 16; i++) - emit_byte(cinfo, htbl->bits[i]); - - for (i = 0; i < length; i++) - emit_byte(cinfo, htbl->huffval[i]); - - htbl->sent_table = TRUE; - } -} - - -LOCAL(void) -emit_dac (j_compress_ptr) -/* Emit a DAC marker */ -/* Since the useful info is so small, we want to emit all the tables in */ -/* one DAC marker. Therefore this routine does its own scan of the table. */ -{ -#ifdef C_ARITH_CODING_SUPPORTED - char dc_in_use[NUM_ARITH_TBLS]; - char ac_in_use[NUM_ARITH_TBLS]; - int length, i; - jpeg_component_info *compptr; - - for (i = 0; i < NUM_ARITH_TBLS; i++) - dc_in_use[i] = ac_in_use[i] = 0; - - for (i = 0; i < cinfo->comps_in_scan; i++) { - compptr = cinfo->cur_comp_info[i]; - dc_in_use[compptr->dc_tbl_no] = 1; - ac_in_use[compptr->ac_tbl_no] = 1; - } - - length = 0; - for (i = 0; i < NUM_ARITH_TBLS; i++) - length += dc_in_use[i] + ac_in_use[i]; - - emit_marker(cinfo, M_DAC); - - emit_2bytes(cinfo, length*2 + 2); - - for (i = 0; i < NUM_ARITH_TBLS; i++) { - if (dc_in_use[i]) { - emit_byte(cinfo, i); - emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4)); - } - if (ac_in_use[i]) { - emit_byte(cinfo, i + 0x10); - emit_byte(cinfo, cinfo->arith_ac_K[i]); - } - } -#endif /* C_ARITH_CODING_SUPPORTED */ -} - - -LOCAL(void) -emit_dri (j_compress_ptr cinfo) -/* Emit a DRI marker */ -{ - emit_marker(cinfo, M_DRI); - - emit_2bytes(cinfo, 4); /* fixed length */ - - emit_2bytes(cinfo, (int) cinfo->restart_interval); -} - - -LOCAL(void) -emit_sof (j_compress_ptr cinfo, JPEG_MARKER code) -/* Emit a SOF marker */ -{ - int ci; - jpeg_component_info *compptr; - - emit_marker(cinfo, code); - - emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */ - - /* Make sure image isn't bigger than SOF field can handle */ - if ((long) cinfo->image_height > 65535L || - (long) cinfo->image_width > 65535L) - ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535); - - emit_byte(cinfo, cinfo->data_precision); - emit_2bytes(cinfo, (int) cinfo->image_height); - emit_2bytes(cinfo, (int) cinfo->image_width); - - emit_byte(cinfo, cinfo->num_components); - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - emit_byte(cinfo, compptr->component_id); - emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor); - emit_byte(cinfo, compptr->quant_tbl_no); - } -} - - -LOCAL(void) -emit_sos (j_compress_ptr cinfo) -/* Emit a SOS marker */ -{ - int i, td, ta; - jpeg_component_info *compptr; - - emit_marker(cinfo, M_SOS); - - emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */ - - emit_byte(cinfo, cinfo->comps_in_scan); - - for (i = 0; i < cinfo->comps_in_scan; i++) { - compptr = cinfo->cur_comp_info[i]; - emit_byte(cinfo, compptr->component_id); - td = compptr->dc_tbl_no; - ta = compptr->ac_tbl_no; - if (cinfo->progressive_mode) { - /* Progressive mode: only DC or only AC tables are used in one scan; - * furthermore, Huffman coding of DC refinement uses no table at all. - * We emit 0 for unused field(s); this is recommended by the P&M text - * but does not seem to be specified in the standard. - */ - if (cinfo->Ss == 0) { - ta = 0; /* DC scan */ - if (cinfo->Ah != 0 && !cinfo->arith_code) - td = 0; /* no DC table either */ - } else { - td = 0; /* AC scan */ - } - } - emit_byte(cinfo, (td << 4) + ta); - } - - emit_byte(cinfo, cinfo->Ss); - emit_byte(cinfo, cinfo->Se); - emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al); -} - - -LOCAL(void) -emit_jfif_app0 (j_compress_ptr cinfo) -/* Emit a JFIF-compliant APP0 marker */ -{ - /* - * Length of APP0 block (2 bytes) - * Block ID (4 bytes - ASCII "JFIF") - * Zero byte (1 byte to terminate the ID string) - * Version Major, Minor (2 bytes - major first) - * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm) - * Xdpu (2 bytes - dots per unit horizontal) - * Ydpu (2 bytes - dots per unit vertical) - * Thumbnail X size (1 byte) - * Thumbnail Y size (1 byte) - */ - - emit_marker(cinfo, M_APP0); - - emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */ - - emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */ - emit_byte(cinfo, 0x46); - emit_byte(cinfo, 0x49); - emit_byte(cinfo, 0x46); - emit_byte(cinfo, 0); - emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */ - emit_byte(cinfo, cinfo->JFIF_minor_version); - emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */ - emit_2bytes(cinfo, (int) cinfo->X_density); - emit_2bytes(cinfo, (int) cinfo->Y_density); - emit_byte(cinfo, 0); /* No thumbnail image */ - emit_byte(cinfo, 0); -} - - -LOCAL(void) -emit_adobe_app14 (j_compress_ptr cinfo) -/* Emit an Adobe APP14 marker */ -{ - /* - * Length of APP14 block (2 bytes) - * Block ID (5 bytes - ASCII "Adobe") - * Version Number (2 bytes - currently 100) - * Flags0 (2 bytes - currently 0) - * Flags1 (2 bytes - currently 0) - * Color transform (1 byte) - * - * Although Adobe TN 5116 mentions Version = 101, all the Adobe files - * now in circulation seem to use Version = 100, so that's what we write. - * - * We write the color transform byte as 1 if the JPEG color space is - * YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with - * whether the encoder performed a transformation, which is pretty useless. - */ - - emit_marker(cinfo, M_APP14); - - emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */ - - emit_byte(cinfo, 0x41); /* Identifier: ASCII "Adobe" */ - emit_byte(cinfo, 0x64); - emit_byte(cinfo, 0x6F); - emit_byte(cinfo, 0x62); - emit_byte(cinfo, 0x65); - emit_2bytes(cinfo, 100); /* Version */ - emit_2bytes(cinfo, 0); /* Flags0 */ - emit_2bytes(cinfo, 0); /* Flags1 */ - switch (cinfo->jpeg_color_space) { - case JCS_YCbCr: - emit_byte(cinfo, 1); /* Color transform = 1 */ - break; - case JCS_YCCK: - emit_byte(cinfo, 2); /* Color transform = 2 */ - break; - default: - emit_byte(cinfo, 0); /* Color transform = 0 */ - break; - } -} - - -/* - * These routines allow writing an arbitrary marker with parameters. - * The only intended use is to emit COM or APPn markers after calling - * write_file_header and before calling write_frame_header. - * Other uses are not guaranteed to produce desirable results. - * Counting the parameter bytes properly is the caller's responsibility. - */ - -METHODDEF(void) -write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen) -/* Emit an arbitrary marker header */ -{ - if (datalen > (unsigned int) 65533) /* safety check */ - ERREXIT(cinfo, JERR_BAD_LENGTH); - - emit_marker(cinfo, (JPEG_MARKER) marker); - - emit_2bytes(cinfo, (int) (datalen + 2)); /* total length */ -} - -METHODDEF(void) -write_marker_byte (j_compress_ptr cinfo, int val) -/* Emit one byte of marker parameters following write_marker_header */ -{ - emit_byte(cinfo, val); -} - - -/* - * Write datastream header. - * This consists of an SOI and optional APPn markers. - * We recommend use of the JFIF marker, but not the Adobe marker, - * when using YCbCr or grayscale data. The JFIF marker should NOT - * be used for any other JPEG colorspace. The Adobe marker is helpful - * to distinguish RGB, CMYK, and YCCK colorspaces. - * Note that an application can write additional header markers after - * jpeg_start_compress returns. - */ - -METHODDEF(void) -write_file_header (j_compress_ptr cinfo) -{ - my_marker_ptr marker = (my_marker_ptr) cinfo->marker; - - emit_marker(cinfo, M_SOI); /* first the SOI */ - - /* SOI is defined to reset restart interval to 0 */ - marker->last_restart_interval = 0; - - if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */ - emit_jfif_app0(cinfo); - if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */ - emit_adobe_app14(cinfo); -} - - -/* - * Write frame header. - * This consists of DQT and SOFn markers. - * Note that we do not emit the SOF until we have emitted the DQT(s). - * This avoids compatibility problems with incorrect implementations that - * try to error-check the quant table numbers as soon as they see the SOF. - */ - -METHODDEF(void) -write_frame_header (j_compress_ptr cinfo) -{ - int ci, prec; - boolean is_baseline; - jpeg_component_info *compptr; - - /* Emit DQT for each quantization table. - * Note that emit_dqt() suppresses any duplicate tables. - */ - prec = 0; - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - prec += emit_dqt(cinfo, compptr->quant_tbl_no); - } - /* now prec is nonzero iff there are any 16-bit quant tables. */ - - /* Check for a non-baseline specification. - * Note we assume that Huffman table numbers won't be changed later. - */ - if (cinfo->arith_code || cinfo->progressive_mode || - cinfo->data_precision != 8) { - is_baseline = FALSE; - } else { - is_baseline = TRUE; - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1) - is_baseline = FALSE; - } - if (prec && is_baseline) { - is_baseline = FALSE; - /* If it's baseline except for quantizer size, warn the user */ - TRACEMS(cinfo, 0, JTRC_16BIT_TABLES); - } - } - - /* Emit the proper SOF marker */ - if (cinfo->arith_code) { - emit_sof(cinfo, M_SOF9); /* SOF code for arithmetic coding */ - } else { - if (cinfo->progressive_mode) - emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */ - else if (is_baseline) - emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */ - else - emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */ - } -} - - -/* - * Write scan header. - * This consists of DHT or DAC markers, optional DRI, and SOS. - * Compressed data will be written following the SOS. - */ - -METHODDEF(void) -write_scan_header (j_compress_ptr cinfo) -{ - my_marker_ptr marker = (my_marker_ptr) cinfo->marker; - int i; - jpeg_component_info *compptr; - - if (cinfo->arith_code) { - /* Emit arith conditioning info. We may have some duplication - * if the file has multiple scans, but it's so small it's hardly - * worth worrying about. - */ - emit_dac(cinfo); - } else { - /* Emit Huffman tables. - * Note that emit_dht() suppresses any duplicate tables. - */ - for (i = 0; i < cinfo->comps_in_scan; i++) { - compptr = cinfo->cur_comp_info[i]; - if (cinfo->progressive_mode) { - /* Progressive mode: only DC or only AC tables are used in one scan */ - if (cinfo->Ss == 0) { - if (cinfo->Ah == 0) /* DC needs no table for refinement scan */ - emit_dht(cinfo, compptr->dc_tbl_no, FALSE); - } else { - emit_dht(cinfo, compptr->ac_tbl_no, TRUE); - } - } else { - /* Sequential mode: need both DC and AC tables */ - emit_dht(cinfo, compptr->dc_tbl_no, FALSE); - emit_dht(cinfo, compptr->ac_tbl_no, TRUE); - } - } - } - - /* Emit DRI if required --- note that DRI value could change for each scan. - * We avoid wasting space with unnecessary DRIs, however. - */ - if (cinfo->restart_interval != marker->last_restart_interval) { - emit_dri(cinfo); - marker->last_restart_interval = cinfo->restart_interval; - } - - emit_sos(cinfo); -} - - -/* - * Write datastream trailer. - */ - -METHODDEF(void) -write_file_trailer (j_compress_ptr cinfo) -{ - emit_marker(cinfo, M_EOI); -} - - -/* - * Write an abbreviated table-specification datastream. - * This consists of SOI, DQT and DHT tables, and EOI. - * Any table that is defined and not marked sent_table = TRUE will be - * emitted. Note that all tables will be marked sent_table = TRUE at exit. - */ - -METHODDEF(void) -write_tables_only (j_compress_ptr cinfo) -{ - int i; - - emit_marker(cinfo, M_SOI); - - for (i = 0; i < NUM_QUANT_TBLS; i++) { - if (cinfo->quant_tbl_ptrs[i] != NULL) - (void) emit_dqt(cinfo, i); - } - - if (! cinfo->arith_code) { - for (i = 0; i < NUM_HUFF_TBLS; i++) { - if (cinfo->dc_huff_tbl_ptrs[i] != NULL) - emit_dht(cinfo, i, FALSE); - if (cinfo->ac_huff_tbl_ptrs[i] != NULL) - emit_dht(cinfo, i, TRUE); - } - } - - emit_marker(cinfo, M_EOI); -} - - -/* - * Initialize the marker writer module. - */ - -GLOBAL(void) -jinit_marker_writer (j_compress_ptr cinfo) -{ - my_marker_ptr marker; - - /* Create the subobject */ - marker = (my_marker_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_marker_writer)); - cinfo->marker = (struct jpeg_marker_writer *) marker; - /* Initialize method pointers */ - marker->pub.write_file_header = write_file_header; - marker->pub.write_frame_header = write_frame_header; - marker->pub.write_scan_header = write_scan_header; - marker->pub.write_file_trailer = write_file_trailer; - marker->pub.write_tables_only = write_tables_only; - marker->pub.write_marker_header = write_marker_header; - marker->pub.write_marker_byte = write_marker_byte; - /* Initialize private state */ - marker->last_restart_interval = 0; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmaster.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmaster.c deleted file mode 100755 index a45b03b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcmaster.c +++ /dev/null @@ -1,590 +0,0 @@ -/* - * jcmaster.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains master control logic for the JPEG compressor. - * These routines are concerned with parameter validation, initial setup, - * and inter-pass control (determining the number of passes and the work - * to be done in each pass). - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private state */ - -typedef enum { - main_pass, /* input data, also do first output step */ - huff_opt_pass, /* Huffman code optimization pass */ - output_pass /* data output pass */ -} c_pass_type; - -typedef struct { - struct jpeg_comp_master pub; /* public fields */ - - c_pass_type pass_type; /* the type of the current pass */ - - int pass_number; /* # of passes completed */ - int total_passes; /* total # of passes needed */ - - int scan_number; /* current index in scan_info[] */ -} my_comp_master; - -typedef my_comp_master * my_master_ptr; - - -/* - * Support routines that do various essential calculations. - */ - -LOCAL(void) -initial_setup (j_compress_ptr cinfo) -/* Do computations that are needed before master selection phase */ -{ - int ci; - jpeg_component_info *compptr; - long samplesperrow; - JDIMENSION jd_samplesperrow; - - /* Sanity check on image dimensions */ - if (cinfo->image_height <= 0 || cinfo->image_width <= 0 - || cinfo->num_components <= 0 || cinfo->input_components <= 0) - ERREXIT(cinfo, JERR_EMPTY_IMAGE); - - /* Make sure image isn't bigger than I can handle */ - if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || - (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) - ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); - - /* Width of an input scanline must be representable as JDIMENSION. */ - samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components; - jd_samplesperrow = (JDIMENSION) samplesperrow; - if ((long) jd_samplesperrow != samplesperrow) - ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); - - /* For now, precision must match compiled-in value... */ - if (cinfo->data_precision != BITS_IN_JSAMPLE) - ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); - - /* Check that number of components won't exceed internal array sizes */ - if (cinfo->num_components > MAX_COMPONENTS) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, - MAX_COMPONENTS); - - /* Compute maximum sampling factors; check factor validity */ - cinfo->max_h_samp_factor = 1; - cinfo->max_v_samp_factor = 1; - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || - compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) - ERREXIT(cinfo, JERR_BAD_SAMPLING); - cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, - compptr->h_samp_factor); - cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, - compptr->v_samp_factor); - } - - /* Compute dimensions of components */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Fill in the correct component_index value; don't rely on application */ - compptr->component_index = ci; - /* For compression, we never do DCT scaling. */ - compptr->DCT_scaled_size = DCTSIZE; - /* Size in DCT blocks */ - compptr->width_in_blocks = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) (cinfo->max_h_samp_factor * DCTSIZE)); - compptr->height_in_blocks = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) (cinfo->max_v_samp_factor * DCTSIZE)); - /* Size in samples */ - compptr->downsampled_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) cinfo->max_h_samp_factor); - compptr->downsampled_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) cinfo->max_v_samp_factor); - /* Mark component needed (this flag isn't actually used for compression) */ - compptr->component_needed = TRUE; - } - - /* Compute number of fully interleaved MCU rows (number of times that - * main controller will call coefficient controller). - */ - cinfo->total_iMCU_rows = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); -} - - -#ifdef C_MULTISCAN_FILES_SUPPORTED - -LOCAL(void) -validate_script (j_compress_ptr cinfo) -/* Verify that the scan script in cinfo->scan_info[] is valid; also - * determine whether it uses progressive JPEG, and set cinfo->progressive_mode. - */ -{ - const jpeg_scan_info * scanptr; - int scanno, ncomps, ci, coefi, thisi; - int Ss, Se, Ah, Al; - boolean component_sent[MAX_COMPONENTS]; -#ifdef C_PROGRESSIVE_SUPPORTED - int * last_bitpos_ptr; - int last_bitpos[MAX_COMPONENTS][DCTSIZE2]; - /* -1 until that coefficient has been seen; then last Al for it */ -#endif - - if (cinfo->num_scans <= 0) - ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0); - - /* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1; - * for progressive JPEG, no scan can have this. - */ - scanptr = cinfo->scan_info; - if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) { -#ifdef C_PROGRESSIVE_SUPPORTED - cinfo->progressive_mode = TRUE; - last_bitpos_ptr = & last_bitpos[0][0]; - for (ci = 0; ci < cinfo->num_components; ci++) - for (coefi = 0; coefi < DCTSIZE2; coefi++) - *last_bitpos_ptr++ = -1; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - cinfo->progressive_mode = FALSE; - for (ci = 0; ci < cinfo->num_components; ci++) - component_sent[ci] = FALSE; - } - - for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) { - /* Validate component indexes */ - ncomps = scanptr->comps_in_scan; - if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN); - for (ci = 0; ci < ncomps; ci++) { - thisi = scanptr->component_index[ci]; - if (thisi < 0 || thisi >= cinfo->num_components) - ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); - /* Components must appear in SOF order within each scan */ - if (ci > 0 && thisi <= scanptr->component_index[ci-1]) - ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); - } - /* Validate progression parameters */ - Ss = scanptr->Ss; - Se = scanptr->Se; - Ah = scanptr->Ah; - Al = scanptr->Al; - if (cinfo->progressive_mode) { -#ifdef C_PROGRESSIVE_SUPPORTED - /* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that - * seems wrong: the upper bound ought to depend on data precision. - * Perhaps they really meant 0..N+1 for N-bit precision. - * Here we allow 0..10 for 8-bit data; Al larger than 10 results in - * out-of-range reconstructed DC values during the first DC scan, - * which might cause problems for some decoders. - */ -#if BITS_IN_JSAMPLE == 8 -#define MAX_AH_AL 10 -#else -#define MAX_AH_AL 13 -#endif - if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 || - Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL) - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - if (Ss == 0) { - if (Se != 0) /* DC and AC together not OK */ - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - } else { - if (ncomps != 1) /* AC scans must be for only one component */ - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - } - for (ci = 0; ci < ncomps; ci++) { - last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0]; - if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */ - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - for (coefi = Ss; coefi <= Se; coefi++) { - if (last_bitpos_ptr[coefi] < 0) { - /* first scan of this coefficient */ - if (Ah != 0) - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - } else { - /* not first scan */ - if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1) - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - } - last_bitpos_ptr[coefi] = Al; - } - } -#endif - } else { - /* For sequential JPEG, all progression parameters must be these: */ - if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0) - ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno); - /* Make sure components are not sent twice */ - for (ci = 0; ci < ncomps; ci++) { - thisi = scanptr->component_index[ci]; - if (component_sent[thisi]) - ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno); - component_sent[thisi] = TRUE; - } - } - } - - /* Now verify that everything got sent. */ - if (cinfo->progressive_mode) { -#ifdef C_PROGRESSIVE_SUPPORTED - /* For progressive mode, we only check that at least some DC data - * got sent for each component; the spec does not require that all bits - * of all coefficients be transmitted. Would it be wiser to enforce - * transmission of all coefficient bits?? - */ - for (ci = 0; ci < cinfo->num_components; ci++) { - if (last_bitpos[ci][0] < 0) - ERREXIT(cinfo, JERR_MISSING_DATA); - } -#endif - } else { - for (ci = 0; ci < cinfo->num_components; ci++) { - if (! component_sent[ci]) - ERREXIT(cinfo, JERR_MISSING_DATA); - } - } -} - -#endif /* C_MULTISCAN_FILES_SUPPORTED */ - - -LOCAL(void) -select_scan_parameters (j_compress_ptr cinfo) -/* Set up the scan parameters for the current scan */ -{ - int ci; - -#ifdef C_MULTISCAN_FILES_SUPPORTED - if (cinfo->scan_info != NULL) { - /* Prepare for current scan --- the script is already validated */ - my_master_ptr master = (my_master_ptr) cinfo->master; - const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number; - - cinfo->comps_in_scan = scanptr->comps_in_scan; - for (ci = 0; ci < scanptr->comps_in_scan; ci++) { - cinfo->cur_comp_info[ci] = - &cinfo->comp_info[scanptr->component_index[ci]]; - } - cinfo->Ss = scanptr->Ss; - cinfo->Se = scanptr->Se; - cinfo->Ah = scanptr->Ah; - cinfo->Al = scanptr->Al; - } - else -#endif - { - /* Prepare for single sequential-JPEG scan containing all components */ - if (cinfo->num_components > MAX_COMPS_IN_SCAN) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, - MAX_COMPS_IN_SCAN); - cinfo->comps_in_scan = cinfo->num_components; - for (ci = 0; ci < cinfo->num_components; ci++) { - cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci]; - } - cinfo->Ss = 0; - cinfo->Se = DCTSIZE2-1; - cinfo->Ah = 0; - cinfo->Al = 0; - } -} - - -LOCAL(void) -per_scan_setup (j_compress_ptr cinfo) -/* Do computations that are needed before processing a JPEG scan */ -/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */ -{ - int ci, mcublks, tmp; - jpeg_component_info *compptr; - - if (cinfo->comps_in_scan == 1) { - - /* Noninterleaved (single-component) scan */ - compptr = cinfo->cur_comp_info[0]; - - /* Overall image size in MCUs */ - cinfo->MCUs_per_row = compptr->width_in_blocks; - cinfo->MCU_rows_in_scan = compptr->height_in_blocks; - - /* For noninterleaved scan, always one block per MCU */ - compptr->MCU_width = 1; - compptr->MCU_height = 1; - compptr->MCU_blocks = 1; - compptr->MCU_sample_width = DCTSIZE; - compptr->last_col_width = 1; - /* For noninterleaved scans, it is convenient to define last_row_height - * as the number of block rows present in the last iMCU row. - */ - tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); - if (tmp == 0) tmp = compptr->v_samp_factor; - compptr->last_row_height = tmp; - - /* Prepare array describing MCU composition */ - cinfo->blocks_in_MCU = 1; - cinfo->MCU_membership[0] = 0; - - } else { - - /* Interleaved (multi-component) scan */ - if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, - MAX_COMPS_IN_SCAN); - - /* Overall image size in MCUs */ - cinfo->MCUs_per_row = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, - (long) (cinfo->max_h_samp_factor*DCTSIZE)); - cinfo->MCU_rows_in_scan = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); - - cinfo->blocks_in_MCU = 0; - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Sampling factors give # of blocks of component in each MCU */ - compptr->MCU_width = compptr->h_samp_factor; - compptr->MCU_height = compptr->v_samp_factor; - compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; - compptr->MCU_sample_width = compptr->MCU_width * DCTSIZE; - /* Figure number of non-dummy blocks in last MCU column & row */ - tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); - if (tmp == 0) tmp = compptr->MCU_width; - compptr->last_col_width = tmp; - tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); - if (tmp == 0) tmp = compptr->MCU_height; - compptr->last_row_height = tmp; - /* Prepare array describing MCU composition */ - mcublks = compptr->MCU_blocks; - if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU) - ERREXIT(cinfo, JERR_BAD_MCU_SIZE); - while (mcublks-- > 0) { - cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; - } - } - - } - - /* Convert restart specified in rows to actual MCU count. */ - /* Note that count must fit in 16 bits, so we provide limiting. */ - if (cinfo->restart_in_rows > 0) { - long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row; - cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L); - } -} - - -/* - * Per-pass setup. - * This is called at the beginning of each pass. We determine which modules - * will be active during this pass and give them appropriate start_pass calls. - * We also set is_last_pass to indicate whether any more passes will be - * required. - */ - -METHODDEF(void) -prepare_for_pass (j_compress_ptr cinfo) -{ - my_master_ptr master = (my_master_ptr) cinfo->master; - - switch (master->pass_type) { - case main_pass: - /* Initial pass: will collect input data, and do either Huffman - * optimization or data output for the first scan. - */ - select_scan_parameters(cinfo); - per_scan_setup(cinfo); - if (! cinfo->raw_data_in) { - (*cinfo->cconvert->start_pass) (cinfo); - (*cinfo->downsample->start_pass) (cinfo); - (*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU); - } - (*cinfo->fdct->start_pass) (cinfo); - (*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding); - (*cinfo->coef->start_pass) (cinfo, - (master->total_passes > 1 ? - JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); - (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); - if (cinfo->optimize_coding) { - /* No immediate data output; postpone writing frame/scan headers */ - master->pub.call_pass_startup = FALSE; - } else { - /* Will write frame/scan headers at first jpeg_write_scanlines call */ - master->pub.call_pass_startup = TRUE; - } - break; -#ifdef ENTROPY_OPT_SUPPORTED - case huff_opt_pass: - /* Do Huffman optimization for a scan after the first one. */ - select_scan_parameters(cinfo); - per_scan_setup(cinfo); - if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) { - (*cinfo->entropy->start_pass) (cinfo, TRUE); - (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); - master->pub.call_pass_startup = FALSE; - break; - } - /* Special case: Huffman DC refinement scans need no Huffman table - * and therefore we can skip the optimization pass for them. - */ - master->pass_type = output_pass; - master->pass_number++; - /*FALLTHROUGH*/ -#endif - case output_pass: - /* Do a data-output pass. */ - /* We need not repeat per-scan setup if prior optimization pass did it. */ - if (! cinfo->optimize_coding) { - select_scan_parameters(cinfo); - per_scan_setup(cinfo); - } - (*cinfo->entropy->start_pass) (cinfo, FALSE); - (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST); - /* We emit frame/scan headers now */ - if (master->scan_number == 0) - (*cinfo->marker->write_frame_header) (cinfo); - (*cinfo->marker->write_scan_header) (cinfo); - master->pub.call_pass_startup = FALSE; - break; - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - } - - master->pub.is_last_pass = (master->pass_number == master->total_passes-1); - - /* Set up progress monitor's pass info if present */ - if (cinfo->progress != NULL) { - cinfo->progress->completed_passes = master->pass_number; - cinfo->progress->total_passes = master->total_passes; - } -} - - -/* - * Special start-of-pass hook. - * This is called by jpeg_write_scanlines if call_pass_startup is TRUE. - * In single-pass processing, we need this hook because we don't want to - * write frame/scan headers during jpeg_start_compress; we want to let the - * application write COM markers etc. between jpeg_start_compress and the - * jpeg_write_scanlines loop. - * In multi-pass processing, this routine is not used. - */ - -METHODDEF(void) -pass_startup (j_compress_ptr cinfo) -{ - cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */ - - (*cinfo->marker->write_frame_header) (cinfo); - (*cinfo->marker->write_scan_header) (cinfo); -} - - -/* - * Finish up at end of pass. - */ - -METHODDEF(void) -finish_pass_master (j_compress_ptr cinfo) -{ - my_master_ptr master = (my_master_ptr) cinfo->master; - - /* The entropy coder always needs an end-of-pass call, - * either to analyze statistics or to flush its output buffer. - */ - (*cinfo->entropy->finish_pass) (cinfo); - - /* Update state for next pass */ - switch (master->pass_type) { - case main_pass: - /* next pass is either output of scan 0 (after optimization) - * or output of scan 1 (if no optimization). - */ - master->pass_type = output_pass; - if (! cinfo->optimize_coding) - master->scan_number++; - break; - case huff_opt_pass: - /* next pass is always output of current scan */ - master->pass_type = output_pass; - break; - case output_pass: - /* next pass is either optimization or output of next scan */ - if (cinfo->optimize_coding) - master->pass_type = huff_opt_pass; - master->scan_number++; - break; - } - - master->pass_number++; -} - - -/* - * Initialize master compression control. - */ - -GLOBAL(void) -jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only) -{ - my_master_ptr master; - - master = (my_master_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_comp_master)); - cinfo->master = (struct jpeg_comp_master *) master; - master->pub.prepare_for_pass = prepare_for_pass; - master->pub.pass_startup = pass_startup; - master->pub.finish_pass = finish_pass_master; - master->pub.is_last_pass = FALSE; - - /* Validate parameters, determine derived values */ - initial_setup(cinfo); - - if (cinfo->scan_info != NULL) { -#ifdef C_MULTISCAN_FILES_SUPPORTED - validate_script(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - cinfo->progressive_mode = FALSE; - cinfo->num_scans = 1; - } - - if (cinfo->progressive_mode) /* TEMPORARY HACK ??? */ - cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */ - - /* Initialize my private state */ - if (transcode_only) { - /* no main pass in transcoding */ - if (cinfo->optimize_coding) - master->pass_type = huff_opt_pass; - else - master->pass_type = output_pass; - } else { - /* for normal compression, first pass is always this type: */ - master->pass_type = main_pass; - } - master->scan_number = 0; - master->pass_number = 0; - if (cinfo->optimize_coding) - master->total_passes = cinfo->num_scans * 2; - else - master->total_passes = cinfo->num_scans; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcomapi.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcomapi.c deleted file mode 100755 index 1b1a340..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcomapi.c +++ /dev/null @@ -1,106 +0,0 @@ -/* - * jcomapi.c - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains application interface routines that are used for both - * compression and decompression. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Abort processing of a JPEG compression or decompression operation, - * but don't destroy the object itself. - * - * For this, we merely clean up all the nonpermanent memory pools. - * Note that temp files (virtual arrays) are not allowed to belong to - * the permanent pool, so we will be able to close all temp files here. - * Closing a data source or destination, if necessary, is the application's - * responsibility. - */ - -GLOBAL(void) -jpeg_abort (j_common_ptr cinfo) -{ - int pool; - - /* Do nothing if called on a not-initialized or destroyed JPEG object. */ - if (cinfo->mem == NULL) - return; - - /* Releasing pools in reverse order might help avoid fragmentation - * with some (brain-damaged) malloc libraries. - */ - for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) { - (*cinfo->mem->free_pool) (cinfo, pool); - } - - /* Reset overall state for possible reuse of object */ - if (cinfo->is_decompressor) { - cinfo->global_state = DSTATE_START; - /* Try to keep application from accessing now-deleted marker list. - * A bit kludgy to do it here, but this is the most central place. - */ - ((j_decompress_ptr) cinfo)->marker_list = NULL; - } else { - cinfo->global_state = CSTATE_START; - } -} - - -/* - * Destruction of a JPEG object. - * - * Everything gets deallocated except the master jpeg_compress_struct itself - * and the error manager struct. Both of these are supplied by the application - * and must be freed, if necessary, by the application. (Often they are on - * the stack and so don't need to be freed anyway.) - * Closing a data source or destination, if necessary, is the application's - * responsibility. - */ - -GLOBAL(void) -jpeg_destroy (j_common_ptr cinfo) -{ - /* We need only tell the memory manager to release everything. */ - /* NB: mem pointer is NULL if memory mgr failed to initialize. */ - if (cinfo->mem != NULL) - (*cinfo->mem->self_destruct) (cinfo); - cinfo->mem = NULL; /* be safe if jpeg_destroy is called twice */ - cinfo->global_state = 0; /* mark it destroyed */ -} - - -/* - * Convenience routines for allocating quantization and Huffman tables. - * (Would jutils.c be a more reasonable place to put these?) - */ - -GLOBAL(JQUANT_TBL *) -jpeg_alloc_quant_table (j_common_ptr cinfo) -{ - JQUANT_TBL *tbl; - - tbl = (JQUANT_TBL *) - (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL)); - tbl->sent_table = FALSE; /* make sure this is false in any new table */ - return tbl; -} - - -GLOBAL(JHUFF_TBL *) -jpeg_alloc_huff_table (j_common_ptr cinfo) -{ - JHUFF_TBL *tbl; - - tbl = (JHUFF_TBL *) - (*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL)); - tbl->sent_table = FALSE; /* make sure this is false in any new table */ - return tbl; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jconfig.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jconfig.h deleted file mode 100755 index 22f6140..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jconfig.h +++ /dev/null @@ -1,57 +0,0 @@ -/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */ -/* see jconfig.doc for explanations */ - -// disable all the warnings under MSVC -#ifdef _MSC_VER -#pragma warning (disable: 4996 4267 4100 4127 4702 4244) -#endif - -#ifdef __BORLANDC__ -#pragma warn -8057 -#pragma warn -8019 -#pragma warn -8004 -#pragma warn -8008 -#endif - -#define HAVE_PROTOTYPES -#define HAVE_UNSIGNED_CHAR -#define HAVE_UNSIGNED_SHORT -/* #define void char */ -/* #define const */ -#undef CHAR_IS_UNSIGNED -#define HAVE_STDDEF_H -#define HAVE_STDLIB_H -#undef NEED_BSD_STRINGS -#undef NEED_SYS_TYPES_H -#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */ -#undef NEED_SHORT_EXTERNAL_NAMES -#undef INCOMPLETE_TYPES_BROKEN - -/* Define "boolean" as unsigned char, not int, per Windows custom */ -#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ -typedef unsigned char boolean; -#endif -#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ - - -#ifdef JPEG_INTERNALS - -#undef RIGHT_SHIFT_IS_UNSIGNED - -#endif /* JPEG_INTERNALS */ - -#ifdef JPEG_CJPEG_DJPEG - -#define BMP_SUPPORTED /* BMP image file format */ -#define GIF_SUPPORTED /* GIF image file format */ -#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ -#undef RLE_SUPPORTED /* Utah RLE image file format */ -#define TARGA_SUPPORTED /* Targa image file format */ - -#define TWO_FILE_COMMANDLINE /* optional */ -#define USE_SETMODE /* Microsoft has setmode() */ -#undef NEED_SIGNAL_CATCHER -#undef DONT_USE_B_MODE -#undef PROGRESS_REPORT /* optional */ - -#endif /* JPEG_CJPEG_DJPEG */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcparam.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcparam.c deleted file mode 100755 index 739dcdf..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcparam.c +++ /dev/null @@ -1,610 +0,0 @@ -/* - * jcparam.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains optional default-setting code for the JPEG compressor. - * Applications do not have to use this file, but those that don't use it - * must know a lot more about the innards of the JPEG code. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Quantization table setup routines - */ - -GLOBAL(void) -jpeg_add_quant_table (j_compress_ptr cinfo, int which_tbl, - const unsigned int *basic_table, - int scale_factor, boolean force_baseline) -/* Define a quantization table equal to the basic_table times - * a scale factor (given as a percentage). - * If force_baseline is TRUE, the computed quantization table entries - * are limited to 1..255 for JPEG baseline compatibility. - */ -{ - JQUANT_TBL ** qtblptr; - int i; - long temp; - - /* Safety check to ensure start_compress not called yet. */ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - if (which_tbl < 0 || which_tbl >= NUM_QUANT_TBLS) - ERREXIT1(cinfo, JERR_DQT_INDEX, which_tbl); - - qtblptr = & cinfo->quant_tbl_ptrs[which_tbl]; - - if (*qtblptr == NULL) - *qtblptr = jpeg_alloc_quant_table((j_common_ptr) cinfo); - - for (i = 0; i < DCTSIZE2; i++) { - temp = ((long) basic_table[i] * scale_factor + 50L) / 100L; - /* limit the values to the valid range */ - if (temp <= 0L) temp = 1L; - if (temp > 32767L) temp = 32767L; /* max quantizer needed for 12 bits */ - if (force_baseline && temp > 255L) - temp = 255L; /* limit to baseline range if requested */ - (*qtblptr)->quantval[i] = (UINT16) temp; - } - - /* Initialize sent_table FALSE so table will be written to JPEG file. */ - (*qtblptr)->sent_table = FALSE; -} - - -GLOBAL(void) -jpeg_set_linear_quality (j_compress_ptr cinfo, int scale_factor, - boolean force_baseline) -/* Set or change the 'quality' (quantization) setting, using default tables - * and a straight percentage-scaling quality scale. In most cases it's better - * to use jpeg_set_quality (below); this entry point is provided for - * applications that insist on a linear percentage scaling. - */ -{ - /* These are the sample quantization tables given in JPEG spec section K.1. - * The spec says that the values given produce "good" quality, and - * when divided by 2, "very good" quality. - */ - static const unsigned int std_luminance_quant_tbl[DCTSIZE2] = { - 16, 11, 10, 16, 24, 40, 51, 61, - 12, 12, 14, 19, 26, 58, 60, 55, - 14, 13, 16, 24, 40, 57, 69, 56, - 14, 17, 22, 29, 51, 87, 80, 62, - 18, 22, 37, 56, 68, 109, 103, 77, - 24, 35, 55, 64, 81, 104, 113, 92, - 49, 64, 78, 87, 103, 121, 120, 101, - 72, 92, 95, 98, 112, 100, 103, 99 - }; - static const unsigned int std_chrominance_quant_tbl[DCTSIZE2] = { - 17, 18, 24, 47, 99, 99, 99, 99, - 18, 21, 26, 66, 99, 99, 99, 99, - 24, 26, 56, 99, 99, 99, 99, 99, - 47, 66, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99 - }; - - /* Set up two quantization tables using the specified scaling */ - jpeg_add_quant_table(cinfo, 0, std_luminance_quant_tbl, - scale_factor, force_baseline); - jpeg_add_quant_table(cinfo, 1, std_chrominance_quant_tbl, - scale_factor, force_baseline); -} - - -GLOBAL(int) -jpeg_quality_scaling (int quality) -/* Convert a user-specified quality rating to a percentage scaling factor - * for an underlying quantization table, using our recommended scaling curve. - * The input 'quality' factor should be 0 (terrible) to 100 (very good). - */ -{ - /* Safety limit on quality factor. Convert 0 to 1 to avoid zero divide. */ - if (quality <= 0) quality = 1; - if (quality > 100) quality = 100; - - /* The basic table is used as-is (scaling 100) for a quality of 50. - * Qualities 50..100 are converted to scaling percentage 200 - 2*Q; - * note that at Q=100 the scaling is 0, which will cause jpeg_add_quant_table - * to make all the table entries 1 (hence, minimum quantization loss). - * Qualities 1..50 are converted to scaling percentage 5000/Q. - */ - if (quality < 50) - quality = 5000 / quality; - else - quality = 200 - quality*2; - - return quality; -} - - -GLOBAL(void) -jpeg_set_quality (j_compress_ptr cinfo, int quality, boolean force_baseline) -/* Set or change the 'quality' (quantization) setting, using default tables. - * This is the standard quality-adjusting entry point for typical user - * interfaces; only those who want detailed control over quantization tables - * would use the preceding three routines directly. - */ -{ - /* Convert user 0-100 rating to percentage scaling */ - quality = jpeg_quality_scaling(quality); - - /* Set up standard quality tables */ - jpeg_set_linear_quality(cinfo, quality, force_baseline); -} - - -/* - * Huffman table setup routines - */ - -LOCAL(void) -add_huff_table (j_compress_ptr cinfo, - JHUFF_TBL **htblptr, const UINT8 *bits, const UINT8 *val) -/* Define a Huffman table */ -{ - int nsymbols, len; - - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - - /* Copy the number-of-symbols-of-each-code-length counts */ - MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); - - /* Validate the counts. We do this here mainly so we can copy the right - * number of symbols from the val[] array, without risking marching off - * the end of memory. jchuff.c will do a more thorough test later. - */ - nsymbols = 0; - for (len = 1; len <= 16; len++) - nsymbols += bits[len]; - if (nsymbols < 1 || nsymbols > 256) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - - MEMCOPY((*htblptr)->huffval, val, nsymbols * SIZEOF(UINT8)); - - /* Initialize sent_table FALSE so table will be written to JPEG file. */ - (*htblptr)->sent_table = FALSE; -} - - -LOCAL(void) -std_huff_tables (j_compress_ptr cinfo) -/* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ -/* IMPORTANT: these are only valid for 8-bit data precision! */ -{ - static const UINT8 bits_dc_luminance[17] = - { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; - static const UINT8 val_dc_luminance[] = - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - - static const UINT8 bits_dc_chrominance[17] = - { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; - static const UINT8 val_dc_chrominance[] = - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; - - static const UINT8 bits_ac_luminance[17] = - { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; - static const UINT8 val_ac_luminance[] = - { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, - 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, - 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, - 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, - 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, - 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, - 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, - 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, - 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, - 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, - 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, - 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, - 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, - 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, - 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, - 0xf9, 0xfa }; - - static const UINT8 bits_ac_chrominance[17] = - { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; - static const UINT8 val_ac_chrominance[] = - { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, - 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, - 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, - 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, - 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, - 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, - 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, - 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, - 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, - 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, - 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, - 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, - 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, - 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, - 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, - 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, - 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, - 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, - 0xf9, 0xfa }; - - add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[0], - bits_dc_luminance, val_dc_luminance); - add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[0], - bits_ac_luminance, val_ac_luminance); - add_huff_table(cinfo, &cinfo->dc_huff_tbl_ptrs[1], - bits_dc_chrominance, val_dc_chrominance); - add_huff_table(cinfo, &cinfo->ac_huff_tbl_ptrs[1], - bits_ac_chrominance, val_ac_chrominance); -} - - -/* - * Default parameter setup for compression. - * - * Applications that don't choose to use this routine must do their - * own setup of all these parameters. Alternately, you can call this - * to establish defaults and then alter parameters selectively. This - * is the recommended approach since, if we add any new parameters, - * your code will still work (they'll be set to reasonable defaults). - */ - -GLOBAL(void) -jpeg_set_defaults (j_compress_ptr cinfo) -{ - int i; - - /* Safety check to ensure start_compress not called yet. */ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - /* Allocate comp_info array large enough for maximum component count. - * Array is made permanent in case application wants to compress - * multiple images at same param settings. - */ - if (cinfo->comp_info == NULL) - cinfo->comp_info = (jpeg_component_info *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - MAX_COMPONENTS * SIZEOF(jpeg_component_info)); - - /* Initialize everything not dependent on the color space */ - - cinfo->data_precision = BITS_IN_JSAMPLE; - /* Set up two quantization tables using default quality of 75 */ - jpeg_set_quality(cinfo, 75, TRUE); - /* Set up two Huffman tables */ - std_huff_tables(cinfo); - - /* Initialize default arithmetic coding conditioning */ - for (i = 0; i < NUM_ARITH_TBLS; i++) { - cinfo->arith_dc_L[i] = 0; - cinfo->arith_dc_U[i] = 1; - cinfo->arith_ac_K[i] = 5; - } - - /* Default is no multiple-scan output */ - cinfo->scan_info = NULL; - cinfo->num_scans = 0; - - /* Expect normal source image, not raw downsampled data */ - cinfo->raw_data_in = FALSE; - - /* Use Huffman coding, not arithmetic coding, by default */ - cinfo->arith_code = FALSE; - - /* By default, don't do extra passes to optimize entropy coding */ - cinfo->optimize_coding = FALSE; - /* The standard Huffman tables are only valid for 8-bit data precision. - * If the precision is higher, force optimization on so that usable - * tables will be computed. This test can be removed if default tables - * are supplied that are valid for the desired precision. - */ - if (cinfo->data_precision > 8) - cinfo->optimize_coding = TRUE; - - /* By default, use the simpler non-cosited sampling alignment */ - cinfo->CCIR601_sampling = FALSE; - - /* No input smoothing */ - cinfo->smoothing_factor = 0; - - /* DCT algorithm preference */ - cinfo->dct_method = JDCT_DEFAULT; - - /* No restart markers */ - cinfo->restart_interval = 0; - cinfo->restart_in_rows = 0; - - /* Fill in default JFIF marker parameters. Note that whether the marker - * will actually be written is determined by jpeg_set_colorspace. - * - * By default, the library emits JFIF version code 1.01. - * An application that wants to emit JFIF 1.02 extension markers should set - * JFIF_minor_version to 2. We could probably get away with just defaulting - * to 1.02, but there may still be some decoders in use that will complain - * about that; saying 1.01 should minimize compatibility problems. - */ - cinfo->JFIF_major_version = 1; /* Default JFIF version = 1.01 */ - cinfo->JFIF_minor_version = 1; - cinfo->density_unit = 0; /* Pixel size is unknown by default */ - cinfo->X_density = 1; /* Pixel aspect ratio is square by default */ - cinfo->Y_density = 1; - - /* Choose JPEG colorspace based on input space, set defaults accordingly */ - - jpeg_default_colorspace(cinfo); -} - - -/* - * Select an appropriate JPEG colorspace for in_color_space. - */ - -GLOBAL(void) -jpeg_default_colorspace (j_compress_ptr cinfo) -{ - switch (cinfo->in_color_space) { - case JCS_GRAYSCALE: - jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); - break; - case JCS_RGB: - jpeg_set_colorspace(cinfo, JCS_YCbCr); - break; - case JCS_YCbCr: - jpeg_set_colorspace(cinfo, JCS_YCbCr); - break; - case JCS_CMYK: - jpeg_set_colorspace(cinfo, JCS_CMYK); /* By default, no translation */ - break; - case JCS_YCCK: - jpeg_set_colorspace(cinfo, JCS_YCCK); - break; - case JCS_UNKNOWN: - jpeg_set_colorspace(cinfo, JCS_UNKNOWN); - break; - default: - ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); - } -} - - -/* - * Set the JPEG colorspace, and choose colorspace-dependent default values. - */ - -GLOBAL(void) -jpeg_set_colorspace (j_compress_ptr cinfo, J_COLOR_SPACE colorspace) -{ - jpeg_component_info * compptr; - int ci; - -#define SET_COMP(index,id,hsamp,vsamp,quant,dctbl,actbl) \ - (compptr = &cinfo->comp_info[index], \ - compptr->component_id = (id), \ - compptr->h_samp_factor = (hsamp), \ - compptr->v_samp_factor = (vsamp), \ - compptr->quant_tbl_no = (quant), \ - compptr->dc_tbl_no = (dctbl), \ - compptr->ac_tbl_no = (actbl) ) - - /* Safety check to ensure start_compress not called yet. */ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - /* For all colorspaces, we use Q and Huff tables 0 for luminance components, - * tables 1 for chrominance components. - */ - - cinfo->jpeg_color_space = colorspace; - - cinfo->write_JFIF_header = FALSE; /* No marker for non-JFIF colorspaces */ - cinfo->write_Adobe_marker = FALSE; /* write no Adobe marker by default */ - - switch (colorspace) { - case JCS_GRAYSCALE: - cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ - cinfo->num_components = 1; - /* JFIF specifies component ID 1 */ - SET_COMP(0, 1, 1,1, 0, 0,0); - break; - case JCS_RGB: - cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag RGB */ - cinfo->num_components = 3; - SET_COMP(0, 0x52 /* 'R' */, 1,1, 0, 0,0); - SET_COMP(1, 0x47 /* 'G' */, 1,1, 0, 0,0); - SET_COMP(2, 0x42 /* 'B' */, 1,1, 0, 0,0); - break; - case JCS_YCbCr: - cinfo->write_JFIF_header = TRUE; /* Write a JFIF marker */ - cinfo->num_components = 3; - /* JFIF specifies component IDs 1,2,3 */ - /* We default to 2x2 subsamples of chrominance */ - SET_COMP(0, 1, 2,2, 0, 0,0); - SET_COMP(1, 2, 1,1, 1, 1,1); - SET_COMP(2, 3, 1,1, 1, 1,1); - break; - case JCS_CMYK: - cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag CMYK */ - cinfo->num_components = 4; - SET_COMP(0, 0x43 /* 'C' */, 1,1, 0, 0,0); - SET_COMP(1, 0x4D /* 'M' */, 1,1, 0, 0,0); - SET_COMP(2, 0x59 /* 'Y' */, 1,1, 0, 0,0); - SET_COMP(3, 0x4B /* 'K' */, 1,1, 0, 0,0); - break; - case JCS_YCCK: - cinfo->write_Adobe_marker = TRUE; /* write Adobe marker to flag YCCK */ - cinfo->num_components = 4; - SET_COMP(0, 1, 2,2, 0, 0,0); - SET_COMP(1, 2, 1,1, 1, 1,1); - SET_COMP(2, 3, 1,1, 1, 1,1); - SET_COMP(3, 4, 2,2, 0, 0,0); - break; - case JCS_UNKNOWN: - cinfo->num_components = cinfo->input_components; - if (cinfo->num_components < 1 || cinfo->num_components > MAX_COMPONENTS) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, - MAX_COMPONENTS); - for (ci = 0; ci < cinfo->num_components; ci++) { - SET_COMP(ci, ci, 1,1, 0, 0,0); - } - break; - default: - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - } -} - - -#ifdef C_PROGRESSIVE_SUPPORTED - -LOCAL(jpeg_scan_info *) -fill_a_scan (jpeg_scan_info * scanptr, int ci, - int Ss, int Se, int Ah, int Al) -/* Support routine: generate one scan for specified component */ -{ - scanptr->comps_in_scan = 1; - scanptr->component_index[0] = ci; - scanptr->Ss = Ss; - scanptr->Se = Se; - scanptr->Ah = Ah; - scanptr->Al = Al; - scanptr++; - return scanptr; -} - -LOCAL(jpeg_scan_info *) -fill_scans (jpeg_scan_info * scanptr, int ncomps, - int Ss, int Se, int Ah, int Al) -/* Support routine: generate one scan for each component */ -{ - int ci; - - for (ci = 0; ci < ncomps; ci++) { - scanptr->comps_in_scan = 1; - scanptr->component_index[0] = ci; - scanptr->Ss = Ss; - scanptr->Se = Se; - scanptr->Ah = Ah; - scanptr->Al = Al; - scanptr++; - } - return scanptr; -} - -LOCAL(jpeg_scan_info *) -fill_dc_scans (jpeg_scan_info * scanptr, int ncomps, int Ah, int Al) -/* Support routine: generate interleaved DC scan if possible, else N scans */ -{ - int ci; - - if (ncomps <= MAX_COMPS_IN_SCAN) { - /* Single interleaved DC scan */ - scanptr->comps_in_scan = ncomps; - for (ci = 0; ci < ncomps; ci++) - scanptr->component_index[ci] = ci; - scanptr->Ss = scanptr->Se = 0; - scanptr->Ah = Ah; - scanptr->Al = Al; - scanptr++; - } else { - /* Noninterleaved DC scan for each component */ - scanptr = fill_scans(scanptr, ncomps, 0, 0, Ah, Al); - } - return scanptr; -} - - -/* - * Create a recommended progressive-JPEG script. - * cinfo->num_components and cinfo->jpeg_color_space must be correct. - */ - -GLOBAL(void) -jpeg_simple_progression (j_compress_ptr cinfo) -{ - int ncomps = cinfo->num_components; - int nscans; - jpeg_scan_info * scanptr; - - /* Safety check to ensure start_compress not called yet. */ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - /* Figure space needed for script. Calculation must match code below! */ - if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { - /* Custom script for YCbCr color images. */ - nscans = 10; - } else { - /* All-purpose script for other color spaces. */ - if (ncomps > MAX_COMPS_IN_SCAN) - nscans = 6 * ncomps; /* 2 DC + 4 AC scans per component */ - else - nscans = 2 + 4 * ncomps; /* 2 DC scans; 4 AC scans per component */ - } - - /* Allocate space for script. - * We need to put it in the permanent pool in case the application performs - * multiple compressions without changing the settings. To avoid a memory - * leak if jpeg_simple_progression is called repeatedly for the same JPEG - * object, we try to re-use previously allocated space, and we allocate - * enough space to handle YCbCr even if initially asked for grayscale. - */ - if (cinfo->script_space == NULL || cinfo->script_space_size < nscans) { - cinfo->script_space_size = MAX(nscans, 10); - cinfo->script_space = (jpeg_scan_info *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - cinfo->script_space_size * SIZEOF(jpeg_scan_info)); - } - scanptr = cinfo->script_space; - cinfo->scan_info = scanptr; - cinfo->num_scans = nscans; - - if (ncomps == 3 && cinfo->jpeg_color_space == JCS_YCbCr) { - /* Custom script for YCbCr color images. */ - /* Initial DC scan */ - scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); - /* Initial AC scan: get some luma data out in a hurry */ - scanptr = fill_a_scan(scanptr, 0, 1, 5, 0, 2); - /* Chroma data is too small to be worth expending many scans on */ - scanptr = fill_a_scan(scanptr, 2, 1, 63, 0, 1); - scanptr = fill_a_scan(scanptr, 1, 1, 63, 0, 1); - /* Complete spectral selection for luma AC */ - scanptr = fill_a_scan(scanptr, 0, 6, 63, 0, 2); - /* Refine next bit of luma AC */ - scanptr = fill_a_scan(scanptr, 0, 1, 63, 2, 1); - /* Finish DC successive approximation */ - scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); - /* Finish AC successive approximation */ - scanptr = fill_a_scan(scanptr, 2, 1, 63, 1, 0); - scanptr = fill_a_scan(scanptr, 1, 1, 63, 1, 0); - /* Luma bottom bit comes last since it's usually largest scan */ - fill_a_scan(scanptr, 0, 1, 63, 1, 0); - } else { - /* All-purpose script for other color spaces. */ - /* Successive approximation first pass */ - scanptr = fill_dc_scans(scanptr, ncomps, 0, 1); - scanptr = fill_scans(scanptr, ncomps, 1, 5, 0, 2); - scanptr = fill_scans(scanptr, ncomps, 6, 63, 0, 2); - /* Successive approximation second pass */ - scanptr = fill_scans(scanptr, ncomps, 1, 63, 2, 1); - /* Successive approximation final pass */ - scanptr = fill_dc_scans(scanptr, ncomps, 1, 0); - fill_scans(scanptr, ncomps, 1, 63, 1, 0); - } -} - -#endif /* C_PROGRESSIVE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcphuff.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcphuff.c deleted file mode 100755 index f35e75a..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcphuff.c +++ /dev/null @@ -1,833 +0,0 @@ -/* - * jcphuff.c - * - * Copyright (C) 1995-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains Huffman entropy encoding routines for progressive JPEG. - * - * We do not support output suspension in this module, since the library - * currently does not allow multiple-scan files to be written with output - * suspension. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jchuff.h" /* Declarations shared with jchuff.c */ - -#ifdef C_PROGRESSIVE_SUPPORTED - -/* Expanded entropy encoder object for progressive Huffman encoding. */ - -typedef struct { - struct jpeg_entropy_encoder pub; /* public fields */ - - /* Mode flag: TRUE for optimization, FALSE for actual data output */ - boolean gather_statistics; - - /* Bit-level coding status. - * next_output_byte/free_in_buffer are local copies of cinfo->dest fields. - */ - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - INT32 put_buffer; /* current bit-accumulation buffer */ - int put_bits; /* # of bits now in it */ - j_compress_ptr cinfo; /* link to cinfo (needed for dump_buffer) */ - - /* Coding status for DC components */ - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ - - /* Coding status for AC components */ - int ac_tbl_no; /* the table number of the single component */ - unsigned int EOBRUN; /* run length of EOBs */ - unsigned int BE; /* # of buffered correction bits before MCU */ - char * bit_buffer; /* buffer for correction bits (1 per char) */ - /* packing correction bits tightly would save some space but cost time... */ - - unsigned int restarts_to_go; /* MCUs left in this restart interval */ - int next_restart_num; /* next restart number to write (0-7) */ - - /* Pointers to derived tables (these workspaces have image lifespan). - * Since any one scan codes only DC or only AC, we only need one set - * of tables, not one for DC and one for AC. - */ - c_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; - - /* Statistics tables for optimization; again, one set is enough */ - long * count_ptrs[NUM_HUFF_TBLS]; -} phuff_entropy_encoder; - -typedef phuff_entropy_encoder * phuff_entropy_ptr; - -/* MAX_CORR_BITS is the number of bits the AC refinement correction-bit - * buffer can hold. Larger sizes may slightly improve compression, but - * 1000 is already well into the realm of overkill. - * The minimum safe size is 64 bits. - */ - -#define MAX_CORR_BITS 1000 /* Max # of correction bits I can buffer */ - -/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32. - * We assume that int right shift is unsigned if INT32 right shift is, - * which should be safe. - */ - -#ifdef RIGHT_SHIFT_IS_UNSIGNED -#define ISHIFT_TEMPS int ishift_temp; -#define IRIGHT_SHIFT(x,shft) \ - ((ishift_temp = (x)) < 0 ? \ - (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \ - (ishift_temp >> (shft))) -#else -#define ISHIFT_TEMPS -#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) -#endif - -/* Forward declarations */ -METHODDEF(boolean) encode_mcu_DC_first JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) encode_mcu_AC_first JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) encode_mcu_DC_refine JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) encode_mcu_AC_refine JPP((j_compress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(void) finish_pass_phuff JPP((j_compress_ptr cinfo)); -METHODDEF(void) finish_pass_gather_phuff JPP((j_compress_ptr cinfo)); - - -/* - * Initialize for a Huffman-compressed scan using progressive JPEG. - */ - -METHODDEF(void) -start_pass_phuff (j_compress_ptr cinfo, boolean gather_statistics) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - boolean is_DC_band; - int ci, tbl; - jpeg_component_info * compptr; - - entropy->cinfo = cinfo; - entropy->gather_statistics = gather_statistics; - - is_DC_band = (cinfo->Ss == 0); - - /* We assume jcmaster.c already validated the scan parameters. */ - - /* Select execution routines */ - if (cinfo->Ah == 0) { - if (is_DC_band) - entropy->pub.encode_mcu = encode_mcu_DC_first; - else - entropy->pub.encode_mcu = encode_mcu_AC_first; - } else { - if (is_DC_band) - entropy->pub.encode_mcu = encode_mcu_DC_refine; - else { - entropy->pub.encode_mcu = encode_mcu_AC_refine; - /* AC refinement needs a correction bit buffer */ - if (entropy->bit_buffer == NULL) - entropy->bit_buffer = (char *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - MAX_CORR_BITS * SIZEOF(char)); - } - } - if (gather_statistics) - entropy->pub.finish_pass = finish_pass_gather_phuff; - else - entropy->pub.finish_pass = finish_pass_phuff; - - /* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1 - * for AC coefficients. - */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Initialize DC predictions to 0 */ - entropy->last_dc_val[ci] = 0; - /* Get table index */ - if (is_DC_band) { - if (cinfo->Ah != 0) /* DC refinement needs no table */ - continue; - tbl = compptr->dc_tbl_no; - } else { - entropy->ac_tbl_no = tbl = compptr->ac_tbl_no; - } - if (gather_statistics) { - /* Check for invalid table index */ - /* (make_c_derived_tbl does this in the other path) */ - if (tbl < 0 || tbl >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl); - /* Allocate and zero the statistics tables */ - /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ - if (entropy->count_ptrs[tbl] == NULL) - entropy->count_ptrs[tbl] = (long *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 257 * SIZEOF(long)); - MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long)); - } else { - /* Compute derived values for Huffman table */ - /* We may do this more than once for a table, but it's not expensive */ - jpeg_make_c_derived_tbl(cinfo, is_DC_band, tbl, - & entropy->derived_tbls[tbl]); - } - } - - /* Initialize AC stuff */ - entropy->EOBRUN = 0; - entropy->BE = 0; - - /* Initialize bit buffer to empty */ - entropy->put_buffer = 0; - entropy->put_bits = 0; - - /* Initialize restart stuff */ - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num = 0; -} - - -/* Outputting bytes to the file. - * NB: these must be called only when actually outputting, - * that is, entropy->gather_statistics == FALSE. - */ - -/* Emit a byte */ -#define emit_byte(entropy,val) \ - { *(entropy)->next_output_byte++ = (JOCTET) (val); \ - if (--(entropy)->free_in_buffer == 0) \ - dump_buffer_p(entropy); } - - -LOCAL(void) -dump_buffer_p (phuff_entropy_ptr entropy) -/* Empty the output buffer; we do not support suspension in this module. */ -{ - struct jpeg_destination_mgr * dest = entropy->cinfo->dest; - - if (! (*dest->empty_output_buffer) (entropy->cinfo)) - ERREXIT(entropy->cinfo, JERR_CANT_SUSPEND); - /* After a successful buffer dump, must reset buffer pointers */ - entropy->next_output_byte = dest->next_output_byte; - entropy->free_in_buffer = dest->free_in_buffer; -} - - -/* Outputting bits to the file */ - -/* Only the right 24 bits of put_buffer are used; the valid bits are - * left-justified in this part. At most 16 bits can be passed to emit_bits - * in one call, and we never retain more than 7 bits in put_buffer - * between calls, so 24 bits are sufficient. - */ - -INLINE -LOCAL(void) -emit_bits_p (phuff_entropy_ptr entropy, unsigned int code, int size) -/* Emit some bits, unless we are in gather mode */ -{ - /* This routine is heavily used, so it's worth coding tightly. */ - INT32 put_buffer = (INT32) code; - int put_bits = entropy->put_bits; - - /* if size is 0, caller used an invalid Huffman table entry */ - if (size == 0) - ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); - - if (entropy->gather_statistics) - return; /* do nothing if we're only getting stats */ - - put_buffer &= (((INT32) 1)<put_buffer; /* and merge with old buffer contents */ - - while (put_bits >= 8) { - int c = (int) ((put_buffer >> 16) & 0xFF); - - emit_byte(entropy, c); - if (c == 0xFF) { /* need to stuff a zero byte? */ - emit_byte(entropy, 0); - } - put_buffer <<= 8; - put_bits -= 8; - } - - entropy->put_buffer = put_buffer; /* update variables */ - entropy->put_bits = put_bits; -} - - -LOCAL(void) -flush_bits_p (phuff_entropy_ptr entropy) -{ - emit_bits_p(entropy, 0x7F, 7); /* fill any partial byte with ones */ - entropy->put_buffer = 0; /* and reset bit-buffer to empty */ - entropy->put_bits = 0; -} - - -/* - * Emit (or just count) a Huffman symbol. - */ - -INLINE -LOCAL(void) -emit_symbol (phuff_entropy_ptr entropy, int tbl_no, int symbol) -{ - if (entropy->gather_statistics) - entropy->count_ptrs[tbl_no][symbol]++; - else { - c_derived_tbl * tbl = entropy->derived_tbls[tbl_no]; - emit_bits_p(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); - } -} - - -/* - * Emit bits from a correction bit buffer. - */ - -LOCAL(void) -emit_buffered_bits (phuff_entropy_ptr entropy, char * bufstart, - unsigned int nbits) -{ - if (entropy->gather_statistics) - return; /* no real work */ - - while (nbits > 0) { - emit_bits_p(entropy, (unsigned int) (*bufstart), 1); - bufstart++; - nbits--; - } -} - - -/* - * Emit any pending EOBRUN symbol. - */ - -LOCAL(void) -emit_eobrun (phuff_entropy_ptr entropy) -{ - int temp, nbits; - - if (entropy->EOBRUN > 0) { /* if there is any pending EOBRUN */ - temp = entropy->EOBRUN; - nbits = 0; - while ((temp >>= 1)) - nbits++; - /* safety check: shouldn't happen given limited correction-bit buffer */ - if (nbits > 14) - ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); - - emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4); - if (nbits) - emit_bits_p(entropy, entropy->EOBRUN, nbits); - - entropy->EOBRUN = 0; - - /* Emit any buffered correction bits */ - emit_buffered_bits(entropy, entropy->bit_buffer, entropy->BE); - entropy->BE = 0; - } -} - - -/* - * Emit a restart marker & resynchronize predictions. - */ - -LOCAL(void) -emit_restart_p (phuff_entropy_ptr entropy, int restart_num) -{ - int ci; - - emit_eobrun(entropy); - - if (! entropy->gather_statistics) { - flush_bits_p(entropy); - emit_byte(entropy, 0xFF); - emit_byte(entropy, JPEG_RST0 + restart_num); - } - - if (entropy->cinfo->Ss == 0) { - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < entropy->cinfo->comps_in_scan; ci++) - entropy->last_dc_val[ci] = 0; - } else { - /* Re-initialize all AC-related fields to 0 */ - entropy->EOBRUN = 0; - entropy->BE = 0; - } -} - - -/* - * MCU encoding for DC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int temp, temp2; - int nbits; - int blkn, ci; - int Al = cinfo->Al; - JBLOCKROW block; - jpeg_component_info * compptr; - ISHIFT_TEMPS - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart_p(entropy, entropy->next_restart_num); - - /* Encode the MCU data blocks */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - - /* Compute the DC value after the required point transform by Al. - * This is simply an arithmetic right shift. - */ - temp2 = IRIGHT_SHIFT((int) ((*block)[0]), Al); - - /* DC differences are figured on the point-transformed values. */ - temp = temp2 - entropy->last_dc_val[ci]; - entropy->last_dc_val[ci] = temp2; - - /* Encode the DC coefficient difference per section G.1.2.1 */ - temp2 = temp; - if (temp < 0) { - temp = -temp; /* temp is abs value of input */ - /* For a negative input, want temp2 = bitwise complement of abs(input) */ - /* This code assumes we are on a two's complement machine */ - temp2--; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 0; - while (temp) { - nbits++; - temp >>= 1; - } - /* Check for out-of-range coefficient values. - * Since we're encoding a difference, the range limit is twice as much. - */ - if (nbits > MAX_COEF_BITS+1) - ERREXIT(cinfo, JERR_BAD_DCT_COEF); - - /* Count/emit the Huffman-coded symbol for the number of bits */ - emit_symbol(entropy, compptr->dc_tbl_no, nbits); - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - if (nbits) /* emit_bits rejects calls with size 0 */ - emit_bits_p(entropy, (unsigned int) temp2, nbits); - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * MCU encoding for AC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int temp, temp2; - int nbits; - int r, k; - int Se = cinfo->Se; - int Al = cinfo->Al; - JBLOCKROW block; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart_p(entropy, entropy->next_restart_num); - - /* Encode the MCU data block */ - block = MCU_data[0]; - - /* Encode the AC coefficients per section G.1.2.2, fig. G.3 */ - - r = 0; /* r = run length of zeros */ - - for (k = cinfo->Ss; k <= Se; k++) { - if ((temp = (*block)[jpeg_natural_order[k]]) == 0) { - r++; - continue; - } - /* We must apply the point transform by Al. For AC coefficients this - * is an integer division with rounding towards 0. To do this portably - * in C, we shift after obtaining the absolute value; so the code is - * interwoven with finding the abs value (temp) and output bits (temp2). - */ - if (temp < 0) { - temp = -temp; /* temp is abs value of input */ - temp >>= Al; /* apply the point transform */ - /* For a negative coef, want temp2 = bitwise complement of abs(coef) */ - temp2 = ~temp; - } else { - temp >>= Al; /* apply the point transform */ - temp2 = temp; - } - /* Watch out for case that nonzero coef is zero after point transform */ - if (temp == 0) { - r++; - continue; - } - - /* Emit any pending EOBRUN */ - if (entropy->EOBRUN > 0) - emit_eobrun(entropy); - /* if run length > 15, must emit special run-length-16 codes (0xF0) */ - while (r > 15) { - emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); - r -= 16; - } - - /* Find the number of bits needed for the magnitude of the coefficient */ - nbits = 1; /* there must be at least one 1 bit */ - while ((temp >>= 1)) - nbits++; - /* Check for out-of-range coefficient values */ - if (nbits > MAX_COEF_BITS) - ERREXIT(cinfo, JERR_BAD_DCT_COEF); - - /* Count/emit Huffman symbol for run length / number of bits */ - emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits); - - /* Emit that number of bits of the value, if positive, */ - /* or the complement of its magnitude, if negative. */ - emit_bits_p(entropy, (unsigned int) temp2, nbits); - - r = 0; /* reset zero run length */ - } - - if (r > 0) { /* If there are trailing zeroes, */ - entropy->EOBRUN++; /* count an EOB */ - if (entropy->EOBRUN == 0x7FFF) - emit_eobrun(entropy); /* force it out to avoid overflow */ - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * MCU encoding for DC successive approximation refinement scan. - * Note: we assume such scans can be multi-component, although the spec - * is not very clear on the point. - */ - -METHODDEF(boolean) -encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int temp; - int blkn; - int Al = cinfo->Al; - JBLOCKROW block; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart_p(entropy, entropy->next_restart_num); - - /* Encode the MCU data blocks */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - - /* We simply emit the Al'th bit of the DC coefficient value. */ - temp = (*block)[0]; - emit_bits_p(entropy, (unsigned int) (temp >> Al), 1); - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * MCU encoding for AC successive approximation refinement scan. - */ - -METHODDEF(boolean) -encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - int temp; - int r, k; - int EOB; - char *BR_buffer; - unsigned int BR; - int Se = cinfo->Se; - int Al = cinfo->Al; - JBLOCKROW block; - int absvalues[DCTSIZE2]; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Emit restart marker if needed */ - if (cinfo->restart_interval) - if (entropy->restarts_to_go == 0) - emit_restart_p(entropy, entropy->next_restart_num); - - /* Encode the MCU data block */ - block = MCU_data[0]; - - /* It is convenient to make a pre-pass to determine the transformed - * coefficients' absolute values and the EOB position. - */ - EOB = 0; - for (k = cinfo->Ss; k <= Se; k++) { - temp = (*block)[jpeg_natural_order[k]]; - /* We must apply the point transform by Al. For AC coefficients this - * is an integer division with rounding towards 0. To do this portably - * in C, we shift after obtaining the absolute value. - */ - if (temp < 0) - temp = -temp; /* temp is abs value of input */ - temp >>= Al; /* apply the point transform */ - absvalues[k] = temp; /* save abs value for main pass */ - if (temp == 1) - EOB = k; /* EOB = index of last newly-nonzero coef */ - } - - /* Encode the AC coefficients per section G.1.2.3, fig. G.7 */ - - r = 0; /* r = run length of zeros */ - BR = 0; /* BR = count of buffered bits added now */ - BR_buffer = entropy->bit_buffer + entropy->BE; /* Append bits to buffer */ - - for (k = cinfo->Ss; k <= Se; k++) { - if ((temp = absvalues[k]) == 0) { - r++; - continue; - } - - /* Emit any required ZRLs, but not if they can be folded into EOB */ - while (r > 15 && k <= EOB) { - /* emit any pending EOBRUN and the BE correction bits */ - emit_eobrun(entropy); - /* Emit ZRL */ - emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); - r -= 16; - /* Emit buffered correction bits that must be associated with ZRL */ - emit_buffered_bits(entropy, BR_buffer, BR); - BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ - BR = 0; - } - - /* If the coef was previously nonzero, it only needs a correction bit. - * NOTE: a straight translation of the spec's figure G.7 would suggest - * that we also need to test r > 15. But if r > 15, we can only get here - * if k > EOB, which implies that this coefficient is not 1. - */ - if (temp > 1) { - /* The correction bit is the next bit of the absolute value. */ - BR_buffer[BR++] = (char) (temp & 1); - continue; - } - - /* Emit any pending EOBRUN and the BE correction bits */ - emit_eobrun(entropy); - - /* Count/emit Huffman symbol for run length / number of bits */ - emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1); - - /* Emit output bit for newly-nonzero coef */ - temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1; - emit_bits_p(entropy, (unsigned int) temp, 1); - - /* Emit buffered correction bits that must be associated with this code */ - emit_buffered_bits(entropy, BR_buffer, BR); - BR_buffer = entropy->bit_buffer; /* BE bits are gone now */ - BR = 0; - r = 0; /* reset zero run length */ - } - - if (r > 0 || BR > 0) { /* If there are trailing zeroes, */ - entropy->EOBRUN++; /* count an EOB */ - entropy->BE += BR; /* concat my correction bits to older ones */ - /* We force out the EOB if we risk either: - * 1. overflow of the EOB counter; - * 2. overflow of the correction bit buffer during the next MCU. - */ - if (entropy->EOBRUN == 0x7FFF || entropy->BE > (MAX_CORR_BITS-DCTSIZE2+1)) - emit_eobrun(entropy); - } - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; - - /* Update restart-interval state too */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) { - entropy->restarts_to_go = cinfo->restart_interval; - entropy->next_restart_num++; - entropy->next_restart_num &= 7; - } - entropy->restarts_to_go--; - } - - return TRUE; -} - - -/* - * Finish up at the end of a Huffman-compressed progressive scan. - */ - -METHODDEF(void) -finish_pass_phuff (j_compress_ptr cinfo) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - - entropy->next_output_byte = cinfo->dest->next_output_byte; - entropy->free_in_buffer = cinfo->dest->free_in_buffer; - - /* Flush out any buffered data */ - emit_eobrun(entropy); - flush_bits_p(entropy); - - cinfo->dest->next_output_byte = entropy->next_output_byte; - cinfo->dest->free_in_buffer = entropy->free_in_buffer; -} - - -/* - * Finish up a statistics-gathering pass and create the new Huffman tables. - */ - -METHODDEF(void) -finish_pass_gather_phuff (j_compress_ptr cinfo) -{ - phuff_entropy_ptr entropy = (phuff_entropy_ptr) cinfo->entropy; - boolean is_DC_band; - int ci, tbl; - jpeg_component_info * compptr; - JHUFF_TBL **htblptr; - boolean did[NUM_HUFF_TBLS]; - - /* Flush out buffered data (all we care about is counting the EOB symbol) */ - emit_eobrun(entropy); - - is_DC_band = (cinfo->Ss == 0); - - /* It's important not to apply jpeg_gen_optimal_table more than once - * per table, because it clobbers the input frequency counts! - */ - MEMZERO(did, SIZEOF(did)); - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - if (is_DC_band) { - if (cinfo->Ah != 0) /* DC refinement needs no table */ - continue; - tbl = compptr->dc_tbl_no; - } else { - tbl = compptr->ac_tbl_no; - } - if (! did[tbl]) { - if (is_DC_band) - htblptr = & cinfo->dc_huff_tbl_ptrs[tbl]; - else - htblptr = & cinfo->ac_huff_tbl_ptrs[tbl]; - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]); - did[tbl] = TRUE; - } - } -} - - -/* - * Module initialization routine for progressive Huffman entropy encoding. - */ - -GLOBAL(void) -jinit_phuff_encoder (j_compress_ptr cinfo) -{ - phuff_entropy_ptr entropy; - int i; - - entropy = (phuff_entropy_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(phuff_entropy_encoder)); - cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; - entropy->pub.start_pass = start_pass_phuff; - - /* Mark tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->derived_tbls[i] = NULL; - entropy->count_ptrs[i] = NULL; - } - entropy->bit_buffer = NULL; /* needed only in AC refinement scan */ -} - -#endif /* C_PROGRESSIVE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcprepct.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcprepct.c deleted file mode 100755 index 463d613..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcprepct.c +++ /dev/null @@ -1,354 +0,0 @@ -/* - * jcprepct.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the compression preprocessing controller. - * This controller manages the color conversion, downsampling, - * and edge expansion steps. - * - * Most of the complexity here is associated with buffering input rows - * as required by the downsampler. See the comments at the head of - * jcsample.c for the downsampler's needs. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* At present, jcsample.c can request context rows only for smoothing. - * In the future, we might also need context rows for CCIR601 sampling - * or other more-complex downsampling procedures. The code to support - * context rows should be compiled only if needed. - */ -#ifdef INPUT_SMOOTHING_SUPPORTED -#define CONTEXT_ROWS_SUPPORTED -#endif - - -/* - * For the simple (no-context-row) case, we just need to buffer one - * row group's worth of pixels for the downsampling step. At the bottom of - * the image, we pad to a full row group by replicating the last pixel row. - * The downsampler's last output row is then replicated if needed to pad - * out to a full iMCU row. - * - * When providing context rows, we must buffer three row groups' worth of - * pixels. Three row groups are physically allocated, but the row pointer - * arrays are made five row groups high, with the extra pointers above and - * below "wrapping around" to point to the last and first real row groups. - * This allows the downsampler to access the proper context rows. - * At the top and bottom of the image, we create dummy context rows by - * copying the first or last real pixel row. This copying could be avoided - * by pointer hacking as is done in jdmainct.c, but it doesn't seem worth the - * trouble on the compression side. - */ - - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_c_prep_controller pub; /* public fields */ - - /* Downsampling input buffer. This buffer holds color-converted data - * until we have enough to do a downsample step. - */ - JSAMPARRAY color_buf[MAX_COMPONENTS]; - - JDIMENSION rows_to_go; /* counts rows remaining in source image */ - int next_buf_row; /* index of next row to store in color_buf */ - -#ifdef CONTEXT_ROWS_SUPPORTED /* only needed for context case */ - int this_row_group; /* starting row index of group to process */ - int next_buf_stop; /* downsample when we reach this index */ -#endif -} my_prep_controller; - -typedef my_prep_controller * my_prep_ptr; - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_prep (j_compress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_prep_ptr prep = (my_prep_ptr) cinfo->prep; - - if (pass_mode != JBUF_PASS_THRU) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - - /* Initialize total-height counter for detecting bottom of image */ - prep->rows_to_go = cinfo->image_height; - /* Mark the conversion buffer empty */ - prep->next_buf_row = 0; -#ifdef CONTEXT_ROWS_SUPPORTED - /* Preset additional state variables for context mode. - * These aren't used in non-context mode, so we needn't test which mode. - */ - prep->this_row_group = 0; - /* Set next_buf_stop to stop after two row groups have been read in. */ - prep->next_buf_stop = 2 * cinfo->max_v_samp_factor; -#endif -} - - -/* - * Expand an image vertically from height input_rows to height output_rows, - * by duplicating the bottom row. - */ - -LOCAL(void) -expand_bottom_edge (JSAMPARRAY image_data, JDIMENSION num_cols, - int input_rows, int output_rows) -{ - int row; - - for (row = input_rows; row < output_rows; row++) { - jcopy_sample_rows(image_data, input_rows-1, image_data, row, - 1, num_cols); - } -} - - -/* - * Process some data in the simple no-context case. - * - * Preprocessor output data is counted in "row groups". A row group - * is defined to be v_samp_factor sample rows of each component. - * Downsampling will produce this much data from each max_v_samp_factor - * input rows. - */ - -METHODDEF(void) -pre_process_data (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail, - JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr, - JDIMENSION out_row_groups_avail) -{ - my_prep_ptr prep = (my_prep_ptr) cinfo->prep; - int numrows, ci; - JDIMENSION inrows; - jpeg_component_info * compptr; - - while (*in_row_ctr < in_rows_avail && - *out_row_group_ctr < out_row_groups_avail) { - /* Do color conversion to fill the conversion buffer. */ - inrows = in_rows_avail - *in_row_ctr; - numrows = cinfo->max_v_samp_factor - prep->next_buf_row; - numrows = (int) MIN((JDIMENSION) numrows, inrows); - (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr, - prep->color_buf, - (JDIMENSION) prep->next_buf_row, - numrows); - *in_row_ctr += numrows; - prep->next_buf_row += numrows; - prep->rows_to_go -= numrows; - /* If at bottom of image, pad to fill the conversion buffer. */ - if (prep->rows_to_go == 0 && - prep->next_buf_row < cinfo->max_v_samp_factor) { - for (ci = 0; ci < cinfo->num_components; ci++) { - expand_bottom_edge(prep->color_buf[ci], cinfo->image_width, - prep->next_buf_row, cinfo->max_v_samp_factor); - } - prep->next_buf_row = cinfo->max_v_samp_factor; - } - /* If we've filled the conversion buffer, empty it. */ - if (prep->next_buf_row == cinfo->max_v_samp_factor) { - (*cinfo->downsample->downsample) (cinfo, - prep->color_buf, (JDIMENSION) 0, - output_buf, *out_row_group_ctr); - prep->next_buf_row = 0; - (*out_row_group_ctr)++; - } - /* If at bottom of image, pad the output to a full iMCU height. - * Note we assume the caller is providing a one-iMCU-height output buffer! - */ - if (prep->rows_to_go == 0 && - *out_row_group_ctr < out_row_groups_avail) { - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - expand_bottom_edge(output_buf[ci], - compptr->width_in_blocks * DCTSIZE, - (int) (*out_row_group_ctr * compptr->v_samp_factor), - (int) (out_row_groups_avail * compptr->v_samp_factor)); - } - *out_row_group_ctr = out_row_groups_avail; - break; /* can exit outer loop without test */ - } - } -} - - -#ifdef CONTEXT_ROWS_SUPPORTED - -/* - * Process some data in the context case. - */ - -METHODDEF(void) -pre_process_context (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail, - JSAMPIMAGE output_buf, JDIMENSION *out_row_group_ctr, - JDIMENSION out_row_groups_avail) -{ - my_prep_ptr prep = (my_prep_ptr) cinfo->prep; - int numrows, ci; - int buf_height = cinfo->max_v_samp_factor * 3; - JDIMENSION inrows; - - while (*out_row_group_ctr < out_row_groups_avail) { - if (*in_row_ctr < in_rows_avail) { - /* Do color conversion to fill the conversion buffer. */ - inrows = in_rows_avail - *in_row_ctr; - numrows = prep->next_buf_stop - prep->next_buf_row; - numrows = (int) MIN((JDIMENSION) numrows, inrows); - (*cinfo->cconvert->color_convert) (cinfo, input_buf + *in_row_ctr, - prep->color_buf, - (JDIMENSION) prep->next_buf_row, - numrows); - /* Pad at top of image, if first time through */ - if (prep->rows_to_go == cinfo->image_height) { - for (ci = 0; ci < cinfo->num_components; ci++) { - int row; - for (row = 1; row <= cinfo->max_v_samp_factor; row++) { - jcopy_sample_rows(prep->color_buf[ci], 0, - prep->color_buf[ci], -row, - 1, cinfo->image_width); - } - } - } - *in_row_ctr += numrows; - prep->next_buf_row += numrows; - prep->rows_to_go -= numrows; - } else { - /* Return for more data, unless we are at the bottom of the image. */ - if (prep->rows_to_go != 0) - break; - /* When at bottom of image, pad to fill the conversion buffer. */ - if (prep->next_buf_row < prep->next_buf_stop) { - for (ci = 0; ci < cinfo->num_components; ci++) { - expand_bottom_edge(prep->color_buf[ci], cinfo->image_width, - prep->next_buf_row, prep->next_buf_stop); - } - prep->next_buf_row = prep->next_buf_stop; - } - } - /* If we've gotten enough data, downsample a row group. */ - if (prep->next_buf_row == prep->next_buf_stop) { - (*cinfo->downsample->downsample) (cinfo, - prep->color_buf, - (JDIMENSION) prep->this_row_group, - output_buf, *out_row_group_ctr); - (*out_row_group_ctr)++; - /* Advance pointers with wraparound as necessary. */ - prep->this_row_group += cinfo->max_v_samp_factor; - if (prep->this_row_group >= buf_height) - prep->this_row_group = 0; - if (prep->next_buf_row >= buf_height) - prep->next_buf_row = 0; - prep->next_buf_stop = prep->next_buf_row + cinfo->max_v_samp_factor; - } - } -} - - -/* - * Create the wrapped-around downsampling input buffer needed for context mode. - */ - -LOCAL(void) -create_context_buffer (j_compress_ptr cinfo) -{ - my_prep_ptr prep = (my_prep_ptr) cinfo->prep; - int rgroup_height = cinfo->max_v_samp_factor; - int ci, i; - jpeg_component_info * compptr; - JSAMPARRAY true_buffer, fake_buffer; - - /* Grab enough space for fake row pointers for all the components; - * we need five row groups' worth of pointers for each component. - */ - fake_buffer = (JSAMPARRAY) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (cinfo->num_components * 5 * rgroup_height) * - SIZEOF(JSAMPROW)); - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Allocate the actual buffer space (3 row groups) for this component. - * We make the buffer wide enough to allow the downsampler to edge-expand - * horizontally within the buffer, if it so chooses. - */ - true_buffer = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE * - cinfo->max_h_samp_factor) / compptr->h_samp_factor), - (JDIMENSION) (3 * rgroup_height)); - /* Copy true buffer row pointers into the middle of the fake row array */ - MEMCOPY(fake_buffer + rgroup_height, true_buffer, - 3 * rgroup_height * SIZEOF(JSAMPROW)); - /* Fill in the above and below wraparound pointers */ - for (i = 0; i < rgroup_height; i++) { - fake_buffer[i] = true_buffer[2 * rgroup_height + i]; - fake_buffer[4 * rgroup_height + i] = true_buffer[i]; - } - prep->color_buf[ci] = fake_buffer + rgroup_height; - fake_buffer += 5 * rgroup_height; /* point to space for next component */ - } -} - -#endif /* CONTEXT_ROWS_SUPPORTED */ - - -/* - * Initialize preprocessing controller. - */ - -GLOBAL(void) -jinit_c_prep_controller (j_compress_ptr cinfo, boolean need_full_buffer) -{ - my_prep_ptr prep; - int ci; - jpeg_component_info * compptr; - - if (need_full_buffer) /* safety check */ - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - - prep = (my_prep_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_prep_controller)); - cinfo->prep = (struct jpeg_c_prep_controller *) prep; - prep->pub.start_pass = start_pass_prep; - - /* Allocate the color conversion buffer. - * We make the buffer wide enough to allow the downsampler to edge-expand - * horizontally within the buffer, if it so chooses. - */ - if (cinfo->downsample->need_context_rows) { - /* Set up to provide context rows */ -#ifdef CONTEXT_ROWS_SUPPORTED - prep->pub.pre_process_data = pre_process_context; - create_context_buffer(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - /* No context, just make it tall enough for one row group */ - prep->pub.pre_process_data = pre_process_data; - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - prep->color_buf[ci] = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) (((long) compptr->width_in_blocks * DCTSIZE * - cinfo->max_h_samp_factor) / compptr->h_samp_factor), - (JDIMENSION) cinfo->max_v_samp_factor); - } - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcsample.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcsample.c deleted file mode 100755 index 13f3cbc..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jcsample.c +++ /dev/null @@ -1,519 +0,0 @@ -/* - * jcsample.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains downsampling routines. - * - * Downsampling input data is counted in "row groups". A row group - * is defined to be max_v_samp_factor pixel rows of each component, - * from which the downsampler produces v_samp_factor sample rows. - * A single row group is processed in each call to the downsampler module. - * - * The downsampler is responsible for edge-expansion of its output data - * to fill an integral number of DCT blocks horizontally. The source buffer - * may be modified if it is helpful for this purpose (the source buffer is - * allocated wide enough to correspond to the desired output width). - * The caller (the prep controller) is responsible for vertical padding. - * - * The downsampler may request "context rows" by setting need_context_rows - * during startup. In this case, the input arrays will contain at least - * one row group's worth of pixels above and below the passed-in data; - * the caller will create dummy rows at image top and bottom by replicating - * the first or last real pixel row. - * - * An excellent reference for image resampling is - * Digital Image Warping, George Wolberg, 1990. - * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. - * - * The downsampling algorithm used here is a simple average of the source - * pixels covered by the output pixel. The hi-falutin sampling literature - * refers to this as a "box filter". In general the characteristics of a box - * filter are not very good, but for the specific cases we normally use (1:1 - * and 2:1 ratios) the box is equivalent to a "triangle filter" which is not - * nearly so bad. If you intend to use other sampling ratios, you'd be well - * advised to improve this code. - * - * A simple input-smoothing capability is provided. This is mainly intended - * for cleaning up color-dithered GIF input files (if you find it inadequate, - * we suggest using an external filtering program such as pnmconvol). When - * enabled, each input pixel P is replaced by a weighted sum of itself and its - * eight neighbors. P's weight is 1-8*SF and each neighbor's weight is SF, - * where SF = (smoothing_factor / 1024). - * Currently, smoothing is only supported for 2h2v sampling factors. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Pointer to routine to downsample a single component */ -typedef JMETHOD(void, downsample1_ptr, - (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data)); - -/* Private subobject */ - -typedef struct { - struct jpeg_downsampler pub; /* public fields */ - - /* Downsampling method pointers, one per component */ - downsample1_ptr methods[MAX_COMPONENTS]; -} my_downsampler; - -typedef my_downsampler * my_downsample_ptr; - - -/* - * Initialize for a downsampling pass. - */ - -METHODDEF(void) -start_pass_downsample (j_compress_ptr) -{ - /* no work for now */ -} - - -/* - * Expand a component horizontally from width input_cols to width output_cols, - * by duplicating the rightmost samples. - */ - -LOCAL(void) -expand_right_edge (JSAMPARRAY image_data, int num_rows, - JDIMENSION input_cols, JDIMENSION output_cols) -{ - JSAMPROW ptr; - JSAMPLE pixval; - int count; - int row; - int numcols = (int) (output_cols - input_cols); - - if (numcols > 0) { - for (row = 0; row < num_rows; row++) { - ptr = image_data[row] + input_cols; - pixval = ptr[-1]; /* don't need GETJSAMPLE() here */ - for (count = numcols; count > 0; count--) - *ptr++ = pixval; - } - } -} - - -/* - * Do downsampling for a whole row group (all components). - * - * In this version we simply downsample each component independently. - */ - -METHODDEF(void) -sep_downsample (j_compress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_index, - JSAMPIMAGE output_buf, JDIMENSION out_row_group_index) -{ - my_downsample_ptr downsample = (my_downsample_ptr) cinfo->downsample; - int ci; - jpeg_component_info * compptr; - JSAMPARRAY in_ptr, out_ptr; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - in_ptr = input_buf[ci] + in_row_index; - out_ptr = output_buf[ci] + (out_row_group_index * compptr->v_samp_factor); - (*downsample->methods[ci]) (cinfo, compptr, in_ptr, out_ptr); - } -} - - -/* - * Downsample pixel values of a single component. - * One row group is processed per call. - * This version handles arbitrary integral sampling ratios, without smoothing. - * Note that this version is not actually used for customary sampling ratios. - */ - -METHODDEF(void) -int_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - int inrow, outrow, h_expand, v_expand, numpix, numpix2, h, v; - JDIMENSION outcol, outcol_h; /* outcol_h == outcol*h_expand */ - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; - JSAMPROW inptr, outptr; - INT32 outvalue; - - h_expand = cinfo->max_h_samp_factor / compptr->h_samp_factor; - v_expand = cinfo->max_v_samp_factor / compptr->v_samp_factor; - numpix = h_expand * v_expand; - numpix2 = numpix/2; - - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - expand_right_edge(input_data, cinfo->max_v_samp_factor, - cinfo->image_width, output_cols * h_expand); - - inrow = 0; - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - for (outcol = 0, outcol_h = 0; outcol < output_cols; - outcol++, outcol_h += h_expand) { - outvalue = 0; - for (v = 0; v < v_expand; v++) { - inptr = input_data[inrow+v] + outcol_h; - for (h = 0; h < h_expand; h++) { - outvalue += (INT32) GETJSAMPLE(*inptr++); - } - } - *outptr++ = (JSAMPLE) ((outvalue + numpix2) / numpix); - } - inrow += v_expand; - } -} - - -/* - * Downsample pixel values of a single component. - * This version handles the special case of a full-size component, - * without smoothing. - */ - -METHODDEF(void) -fullsize_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - /* Copy the data */ - jcopy_sample_rows(input_data, 0, output_data, 0, - cinfo->max_v_samp_factor, cinfo->image_width); - /* Edge-expand */ - expand_right_edge(output_data, cinfo->max_v_samp_factor, - cinfo->image_width, compptr->width_in_blocks * DCTSIZE); -} - - -/* - * Downsample pixel values of a single component. - * This version handles the common case of 2:1 horizontal and 1:1 vertical, - * without smoothing. - * - * A note about the "bias" calculations: when rounding fractional values to - * integer, we do not want to always round 0.5 up to the next integer. - * If we did that, we'd introduce a noticeable bias towards larger values. - * Instead, this code is arranged so that 0.5 will be rounded up or down at - * alternate pixel locations (a simple ordered dither pattern). - */ - -METHODDEF(void) -h2v1_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - int outrow; - JDIMENSION outcol; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; - JSAMPROW inptr, outptr; - int bias; - - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - expand_right_edge(input_data, cinfo->max_v_samp_factor, - cinfo->image_width, output_cols * 2); - - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - inptr = input_data[outrow]; - bias = 0; /* bias = 0,1,0,1,... for successive samples */ - for (outcol = 0; outcol < output_cols; outcol++) { - *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr) + GETJSAMPLE(inptr[1]) - + bias) >> 1); - bias ^= 1; /* 0=>1, 1=>0 */ - inptr += 2; - } - } -} - - -/* - * Downsample pixel values of a single component. - * This version handles the standard case of 2:1 horizontal and 2:1 vertical, - * without smoothing. - */ - -METHODDEF(void) -h2v2_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - int inrow, outrow; - JDIMENSION outcol; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; - JSAMPROW inptr0, inptr1, outptr; - int bias; - - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - expand_right_edge(input_data, cinfo->max_v_samp_factor, - cinfo->image_width, output_cols * 2); - - inrow = 0; - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - inptr0 = input_data[inrow]; - inptr1 = input_data[inrow+1]; - bias = 1; /* bias = 1,2,1,2,... for successive samples */ - for (outcol = 0; outcol < output_cols; outcol++) { - *outptr++ = (JSAMPLE) ((GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]) - + bias) >> 2); - bias ^= 3; /* 1=>2, 2=>1 */ - inptr0 += 2; inptr1 += 2; - } - inrow += 2; - } -} - - -#ifdef INPUT_SMOOTHING_SUPPORTED - -/* - * Downsample pixel values of a single component. - * This version handles the standard case of 2:1 horizontal and 2:1 vertical, - * with smoothing. One row of context is required. - */ - -METHODDEF(void) -h2v2_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - int inrow, outrow; - JDIMENSION colctr; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; - JSAMPROW inptr0, inptr1, above_ptr, below_ptr, outptr; - INT32 membersum, neighsum, memberscale, neighscale; - - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2, - cinfo->image_width, output_cols * 2); - - /* We don't bother to form the individual "smoothed" input pixel values; - * we can directly compute the output which is the average of the four - * smoothed values. Each of the four member pixels contributes a fraction - * (1-8*SF) to its own smoothed image and a fraction SF to each of the three - * other smoothed pixels, therefore a total fraction (1-5*SF)/4 to the final - * output. The four corner-adjacent neighbor pixels contribute a fraction - * SF to just one smoothed pixel, or SF/4 to the final output; while the - * eight edge-adjacent neighbors contribute SF to each of two smoothed - * pixels, or SF/2 overall. In order to use integer arithmetic, these - * factors are scaled by 2^16 = 65536. - * Also recall that SF = smoothing_factor / 1024. - */ - - memberscale = 16384 - cinfo->smoothing_factor * 80; /* scaled (1-5*SF)/4 */ - neighscale = cinfo->smoothing_factor * 16; /* scaled SF/4 */ - - inrow = 0; - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - inptr0 = input_data[inrow]; - inptr1 = input_data[inrow+1]; - above_ptr = input_data[inrow-1]; - below_ptr = input_data[inrow+2]; - - /* Special case for first column: pretend column -1 is same as column 0 */ - membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); - neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + - GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[2]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[2]); - neighsum += neighsum; - neighsum += GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[2]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[2]); - membersum = membersum * memberscale + neighsum * neighscale; - *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); - inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; - - for (colctr = output_cols - 2; colctr > 0; colctr--) { - /* sum of pixels directly mapped to this output element */ - membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); - /* sum of edge-neighbor pixels */ - neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + - GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[2]) + - GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[2]); - /* The edge-neighbors count twice as much as corner-neighbors */ - neighsum += neighsum; - /* Add in the corner-neighbors */ - neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[2]) + - GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[2]); - /* form final output scaled up by 2^16 */ - membersum = membersum * memberscale + neighsum * neighscale; - /* round, descale and output it */ - *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); - inptr0 += 2; inptr1 += 2; above_ptr += 2; below_ptr += 2; - } - - /* Special case for last column */ - membersum = GETJSAMPLE(*inptr0) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(*inptr1) + GETJSAMPLE(inptr1[1]); - neighsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(*below_ptr) + GETJSAMPLE(below_ptr[1]) + - GETJSAMPLE(inptr0[-1]) + GETJSAMPLE(inptr0[1]) + - GETJSAMPLE(inptr1[-1]) + GETJSAMPLE(inptr1[1]); - neighsum += neighsum; - neighsum += GETJSAMPLE(above_ptr[-1]) + GETJSAMPLE(above_ptr[1]) + - GETJSAMPLE(below_ptr[-1]) + GETJSAMPLE(below_ptr[1]); - membersum = membersum * memberscale + neighsum * neighscale; - *outptr = (JSAMPLE) ((membersum + 32768) >> 16); - - inrow += 2; - } -} - - -/* - * Downsample pixel values of a single component. - * This version handles the special case of a full-size component, - * with smoothing. One row of context is required. - */ - -METHODDEF(void) -fullsize_smooth_downsample (j_compress_ptr cinfo, jpeg_component_info *compptr, - JSAMPARRAY input_data, JSAMPARRAY output_data) -{ - int outrow; - JDIMENSION colctr; - JDIMENSION output_cols = compptr->width_in_blocks * DCTSIZE; - JSAMPROW inptr, above_ptr, below_ptr, outptr; - INT32 membersum, neighsum, memberscale, neighscale; - int colsum, lastcolsum, nextcolsum; - - /* Expand input data enough to let all the output samples be generated - * by the standard loop. Special-casing padded output would be more - * efficient. - */ - expand_right_edge(input_data - 1, cinfo->max_v_samp_factor + 2, - cinfo->image_width, output_cols); - - /* Each of the eight neighbor pixels contributes a fraction SF to the - * smoothed pixel, while the main pixel contributes (1-8*SF). In order - * to use integer arithmetic, these factors are multiplied by 2^16 = 65536. - * Also recall that SF = smoothing_factor / 1024. - */ - - memberscale = 65536L - cinfo->smoothing_factor * 512L; /* scaled 1-8*SF */ - neighscale = cinfo->smoothing_factor * 64; /* scaled SF */ - - for (outrow = 0; outrow < compptr->v_samp_factor; outrow++) { - outptr = output_data[outrow]; - inptr = input_data[outrow]; - above_ptr = input_data[outrow-1]; - below_ptr = input_data[outrow+1]; - - /* Special case for first column */ - colsum = GETJSAMPLE(*above_ptr++) + GETJSAMPLE(*below_ptr++) + - GETJSAMPLE(*inptr); - membersum = GETJSAMPLE(*inptr++); - nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + - GETJSAMPLE(*inptr); - neighsum = colsum + (colsum - membersum) + nextcolsum; - membersum = membersum * memberscale + neighsum * neighscale; - *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); - lastcolsum = colsum; colsum = nextcolsum; - - for (colctr = output_cols - 2; colctr > 0; colctr--) { - membersum = GETJSAMPLE(*inptr++); - above_ptr++; below_ptr++; - nextcolsum = GETJSAMPLE(*above_ptr) + GETJSAMPLE(*below_ptr) + - GETJSAMPLE(*inptr); - neighsum = lastcolsum + (colsum - membersum) + nextcolsum; - membersum = membersum * memberscale + neighsum * neighscale; - *outptr++ = (JSAMPLE) ((membersum + 32768) >> 16); - lastcolsum = colsum; colsum = nextcolsum; - } - - /* Special case for last column */ - membersum = GETJSAMPLE(*inptr); - neighsum = lastcolsum + (colsum - membersum) + colsum; - membersum = membersum * memberscale + neighsum * neighscale; - *outptr = (JSAMPLE) ((membersum + 32768) >> 16); - - } -} - -#endif /* INPUT_SMOOTHING_SUPPORTED */ - - -/* - * Module initialization routine for downsampling. - * Note that we must select a routine for each component. - */ - -GLOBAL(void) -jinit_downsampler (j_compress_ptr cinfo) -{ - my_downsample_ptr downsample; - int ci; - jpeg_component_info * compptr; - boolean smoothok = TRUE; - - downsample = (my_downsample_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_downsampler)); - cinfo->downsample = (struct jpeg_downsampler *) downsample; - downsample->pub.start_pass = start_pass_downsample; - downsample->pub.downsample = sep_downsample; - downsample->pub.need_context_rows = FALSE; - - if (cinfo->CCIR601_sampling) - ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); - - /* Verify we can handle the sampling factors, and set up method pointers */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - if (compptr->h_samp_factor == cinfo->max_h_samp_factor && - compptr->v_samp_factor == cinfo->max_v_samp_factor) { -#ifdef INPUT_SMOOTHING_SUPPORTED - if (cinfo->smoothing_factor) { - downsample->methods[ci] = fullsize_smooth_downsample; - downsample->pub.need_context_rows = TRUE; - } else -#endif - downsample->methods[ci] = fullsize_downsample; - } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && - compptr->v_samp_factor == cinfo->max_v_samp_factor) { - smoothok = FALSE; - downsample->methods[ci] = h2v1_downsample; - } else if (compptr->h_samp_factor * 2 == cinfo->max_h_samp_factor && - compptr->v_samp_factor * 2 == cinfo->max_v_samp_factor) { -#ifdef INPUT_SMOOTHING_SUPPORTED - if (cinfo->smoothing_factor) { - downsample->methods[ci] = h2v2_smooth_downsample; - downsample->pub.need_context_rows = TRUE; - } else -#endif - downsample->methods[ci] = h2v2_downsample; - } else if ((cinfo->max_h_samp_factor % compptr->h_samp_factor) == 0 && - (cinfo->max_v_samp_factor % compptr->v_samp_factor) == 0) { - smoothok = FALSE; - downsample->methods[ci] = int_downsample; - } else - ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); - } - -#ifdef INPUT_SMOOTHING_SUPPORTED - if (cinfo->smoothing_factor && !smoothok) - TRACEMS(cinfo, 0, JTRC_SMOOTH_NOTIMPL); -#endif -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jctrans.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jctrans.c deleted file mode 100755 index 7e209f9..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jctrans.c +++ /dev/null @@ -1,388 +0,0 @@ -/* - * jctrans.c - * - * Copyright (C) 1995-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains library routines for transcoding compression, - * that is, writing raw DCT coefficient arrays to an output JPEG file. - * The routines in jcapimin.c will also be needed by a transcoder. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Forward declarations */ -LOCAL(void) transencode_master_selection - JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)); -LOCAL(void) transencode_coef_controller - JPP((j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays)); - - -/* - * Compression initialization for writing raw-coefficient data. - * Before calling this, all parameters and a data destination must be set up. - * Call jpeg_finish_compress() to actually write the data. - * - * The number of passed virtual arrays must match cinfo->num_components. - * Note that the virtual arrays need not be filled or even realized at - * the time write_coefficients is called; indeed, if the virtual arrays - * were requested from this compression object's memory manager, they - * typically will be realized during this routine and filled afterwards. - */ - -GLOBAL(void) -jpeg_write_coefficients (j_compress_ptr cinfo, jvirt_barray_ptr * coef_arrays) -{ - if (cinfo->global_state != CSTATE_START) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - /* Mark all tables to be written */ - jpeg_suppress_tables(cinfo, FALSE); - /* (Re)initialize error mgr and destination modules */ - (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); - (*cinfo->dest->init_destination) (cinfo); - /* Perform master selection of active modules */ - transencode_master_selection(cinfo, coef_arrays); - /* Wait for jpeg_finish_compress() call */ - cinfo->next_scanline = 0; /* so jpeg_write_marker works */ - cinfo->global_state = CSTATE_WRCOEFS; -} - - -/* - * Initialize the compression object with default parameters, - * then copy from the source object all parameters needed for lossless - * transcoding. Parameters that can be varied without loss (such as - * scan script and Huffman optimization) are left in their default states. - */ - -GLOBAL(void) -jpeg_copy_critical_parameters (j_decompress_ptr srcinfo, - j_compress_ptr dstinfo) -{ - JQUANT_TBL ** qtblptr; - jpeg_component_info *incomp, *outcomp; - JQUANT_TBL *c_quant, *slot_quant; - int tblno, ci, coefi; - - /* Safety check to ensure start_compress not called yet. */ - if (dstinfo->global_state != CSTATE_START) - ERREXIT1(dstinfo, JERR_BAD_STATE, dstinfo->global_state); - /* Copy fundamental image dimensions */ - dstinfo->image_width = srcinfo->image_width; - dstinfo->image_height = srcinfo->image_height; - dstinfo->input_components = srcinfo->num_components; - dstinfo->in_color_space = srcinfo->jpeg_color_space; - /* Initialize all parameters to default values */ - jpeg_set_defaults(dstinfo); - /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB. - * Fix it to get the right header markers for the image colorspace. - */ - jpeg_set_colorspace(dstinfo, srcinfo->jpeg_color_space); - dstinfo->data_precision = srcinfo->data_precision; - dstinfo->CCIR601_sampling = srcinfo->CCIR601_sampling; - /* Copy the source's quantization tables. */ - for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { - if (srcinfo->quant_tbl_ptrs[tblno] != NULL) { - qtblptr = & dstinfo->quant_tbl_ptrs[tblno]; - if (*qtblptr == NULL) - *qtblptr = jpeg_alloc_quant_table((j_common_ptr) dstinfo); - MEMCOPY((*qtblptr)->quantval, - srcinfo->quant_tbl_ptrs[tblno]->quantval, - SIZEOF((*qtblptr)->quantval)); - (*qtblptr)->sent_table = FALSE; - } - } - /* Copy the source's per-component info. - * Note we assume jpeg_set_defaults has allocated the dest comp_info array. - */ - dstinfo->num_components = srcinfo->num_components; - if (dstinfo->num_components < 1 || dstinfo->num_components > MAX_COMPONENTS) - ERREXIT2(dstinfo, JERR_COMPONENT_COUNT, dstinfo->num_components, - MAX_COMPONENTS); - for (ci = 0, incomp = srcinfo->comp_info, outcomp = dstinfo->comp_info; - ci < dstinfo->num_components; ci++, incomp++, outcomp++) { - outcomp->component_id = incomp->component_id; - outcomp->h_samp_factor = incomp->h_samp_factor; - outcomp->v_samp_factor = incomp->v_samp_factor; - outcomp->quant_tbl_no = incomp->quant_tbl_no; - /* Make sure saved quantization table for component matches the qtable - * slot. If not, the input file re-used this qtable slot. - * IJG encoder currently cannot duplicate this. - */ - tblno = outcomp->quant_tbl_no; - if (tblno < 0 || tblno >= NUM_QUANT_TBLS || - srcinfo->quant_tbl_ptrs[tblno] == NULL) - ERREXIT1(dstinfo, JERR_NO_QUANT_TABLE, tblno); - slot_quant = srcinfo->quant_tbl_ptrs[tblno]; - c_quant = incomp->quant_table; - if (c_quant != NULL) { - for (coefi = 0; coefi < DCTSIZE2; coefi++) { - if (c_quant->quantval[coefi] != slot_quant->quantval[coefi]) - ERREXIT1(dstinfo, JERR_MISMATCHED_QUANT_TABLE, tblno); - } - } - /* Note: we do not copy the source's Huffman table assignments; - * instead we rely on jpeg_set_colorspace to have made a suitable choice. - */ - } - /* Also copy JFIF version and resolution information, if available. - * Strictly speaking this isn't "critical" info, but it's nearly - * always appropriate to copy it if available. In particular, - * if the application chooses to copy JFIF 1.02 extension markers from - * the source file, we need to copy the version to make sure we don't - * emit a file that has 1.02 extensions but a claimed version of 1.01. - * We will *not*, however, copy version info from mislabeled "2.01" files. - */ - if (srcinfo->saw_JFIF_marker) { - if (srcinfo->JFIF_major_version == 1) { - dstinfo->JFIF_major_version = srcinfo->JFIF_major_version; - dstinfo->JFIF_minor_version = srcinfo->JFIF_minor_version; - } - dstinfo->density_unit = srcinfo->density_unit; - dstinfo->X_density = srcinfo->X_density; - dstinfo->Y_density = srcinfo->Y_density; - } -} - - -/* - * Master selection of compression modules for transcoding. - * This substitutes for jcinit.c's initialization of the full compressor. - */ - -LOCAL(void) -transencode_master_selection (j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays) -{ - /* Although we don't actually use input_components for transcoding, - * jcmaster.c's initial_setup will complain if input_components is 0. - */ - cinfo->input_components = 1; - /* Initialize master control (includes parameter checking/processing) */ - jinit_c_master_control(cinfo, TRUE /* transcode only */); - - /* Entropy encoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef C_PROGRESSIVE_SUPPORTED - jinit_phuff_encoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_encoder(cinfo); - } - - /* We need a special coefficient buffer controller. */ - transencode_coef_controller(cinfo, coef_arrays); - - jinit_marker_writer(cinfo); - - /* We can now tell the memory manager to allocate virtual arrays. */ - (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); - - /* Write the datastream header (SOI, JFIF) immediately. - * Frame and scan headers are postponed till later. - * This lets application insert special markers after the SOI. - */ - (*cinfo->marker->write_file_header) (cinfo); -} - - -/* - * The rest of this file is a special implementation of the coefficient - * buffer controller. This is similar to jccoefct.c, but it handles only - * output from presupplied virtual arrays. Furthermore, we generate any - * dummy padding blocks on-the-fly rather than expecting them to be present - * in the arrays. - */ - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_c_coef_controller pub; /* public fields */ - - JDIMENSION iMCU_row_num; /* iMCU row # within image */ - JDIMENSION mcu_ctr; /* counts MCUs processed in current row */ - int MCU_vert_offset; /* counts MCU rows within iMCU row */ - int MCU_rows_per_iMCU_row; /* number of such rows needed */ - - /* Virtual block array for each component. */ - jvirt_barray_ptr * whole_image; - - /* Workspace for constructing dummy blocks at right/bottom edges. */ - JBLOCKROW dummy_buffer[C_MAX_BLOCKS_IN_MCU]; -} my_coef_controller2; - -typedef my_coef_controller2 * my_coef_ptr2; - - -LOCAL(void) -start_iMCU_row2 (j_compress_ptr cinfo) -/* Reset within-iMCU-row counters for a new row */ -{ - my_coef_ptr2 coef = (my_coef_ptr2) cinfo->coef; - - /* In an interleaved scan, an MCU row is the same as an iMCU row. - * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. - * But at the bottom of the image, process only what's left. - */ - if (cinfo->comps_in_scan > 1) { - coef->MCU_rows_per_iMCU_row = 1; - } else { - if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1)) - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; - else - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; - } - - coef->mcu_ctr = 0; - coef->MCU_vert_offset = 0; -} - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_coef2 (j_compress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_coef_ptr2 coef = (my_coef_ptr2) cinfo->coef; - - if (pass_mode != JBUF_CRANK_DEST) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - - coef->iMCU_row_num = 0; - start_iMCU_row2(cinfo); -} - - -/* - * Process some data. - * We process the equivalent of one fully interleaved MCU row ("iMCU" row) - * per call, ie, v_samp_factor block rows for each component in the scan. - * The data is obtained from the virtual arrays and fed to the entropy coder. - * Returns TRUE if the iMCU row is completed, FALSE if suspended. - * - * NB: input_buf is ignored; it is likely to be a NULL pointer. - */ - -METHODDEF(boolean) -compress_output2 (j_compress_ptr cinfo, JSAMPIMAGE) -{ - my_coef_ptr2 coef = (my_coef_ptr2) cinfo->coef; - JDIMENSION MCU_col_num; /* index of current MCU within row */ - JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - int blkn, ci, xindex, yindex, yoffset, blockcnt; - JDIMENSION start_col; - JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; - JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU]; - JBLOCKROW buffer_ptr; - jpeg_component_info *compptr; - - /* Align the virtual buffers for the components used in this scan. */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - buffer[ci] = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], - coef->iMCU_row_num * compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - - /* Loop to process one whole iMCU row */ - for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; - yoffset++) { - for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row; - MCU_col_num++) { - /* Construct list of pointers to DCT blocks belonging to this MCU */ - blkn = 0; /* index of current DCT block within MCU */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - start_col = MCU_col_num * compptr->MCU_width; - blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width - : compptr->last_col_width; - for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - if (coef->iMCU_row_num < last_iMCU_row || - yindex+yoffset < compptr->last_row_height) { - /* Fill in pointers to real blocks in this row */ - buffer_ptr = buffer[ci][yindex+yoffset] + start_col; - for (xindex = 0; xindex < blockcnt; xindex++) - MCU_buffer[blkn++] = buffer_ptr++; - } else { - /* At bottom of image, need a whole row of dummy blocks */ - xindex = 0; - } - /* Fill in any dummy blocks needed in this row. - * Dummy blocks are filled in the same way as in jccoefct.c: - * all zeroes in the AC entries, DC entries equal to previous - * block's DC value. The init routine has already zeroed the - * AC entries, so we need only set the DC entries correctly. - */ - for (; xindex < compptr->MCU_width; xindex++) { - MCU_buffer[blkn] = coef->dummy_buffer[blkn]; - MCU_buffer[blkn][0][0] = MCU_buffer[blkn-1][0][0]; - blkn++; - } - } - } - /* Try to write the MCU. */ - if (! (*cinfo->entropy->encode_mcu) (cinfo, MCU_buffer)) { - /* Suspension forced; update state counters and exit */ - coef->MCU_vert_offset = yoffset; - coef->mcu_ctr = MCU_col_num; - return FALSE; - } - } - /* Completed an MCU row, but perhaps not an iMCU row */ - coef->mcu_ctr = 0; - } - /* Completed the iMCU row, advance counters for next one */ - coef->iMCU_row_num++; - start_iMCU_row2(cinfo); - return TRUE; -} - - -/* - * Initialize coefficient buffer controller. - * - * Each passed coefficient array must be the right size for that - * coefficient: width_in_blocks wide and height_in_blocks high, - * with unitheight at least v_samp_factor. - */ - -LOCAL(void) -transencode_coef_controller (j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays) -{ - my_coef_ptr2 coef; - JBLOCKROW buffer; - int i; - - coef = (my_coef_ptr2) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_coef_controller2)); - cinfo->coef = (struct jpeg_c_coef_controller *) coef; - coef->pub.start_pass = start_pass_coef2; - coef->pub.compress_data = compress_output2; - - /* Save pointer to virtual arrays */ - coef->whole_image = coef_arrays; - - /* Allocate and pre-zero space for dummy DCT blocks. */ - buffer = (JBLOCKROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { - coef->dummy_buffer[i] = buffer + i; - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapimin.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapimin.c deleted file mode 100755 index bdff21b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapimin.c +++ /dev/null @@ -1,395 +0,0 @@ -/* - * jdapimin.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains application interface code for the decompression half - * of the JPEG library. These are the "minimum" API routines that may be - * needed in either the normal full-decompression case or the - * transcoding-only case. - * - * Most of the routines intended to be called directly by an application - * are in this file or in jdapistd.c. But also see jcomapi.c for routines - * shared by compression and decompression, and jdtrans.c for the transcoding - * case. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * Initialization of a JPEG decompression object. - * The error manager must already be set up (in case memory manager fails). - */ - -GLOBAL(void) -jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize) -{ - int i; - - /* Guard against version mismatches between library and caller. */ - cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */ - if (version != JPEG_LIB_VERSION) - ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version); - if (structsize != SIZEOF(struct jpeg_decompress_struct)) - ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE, - (int) SIZEOF(struct jpeg_decompress_struct), (int) structsize); - - /* For debugging purposes, we zero the whole master structure. - * But the application has already set the err pointer, and may have set - * client_data, so we have to save and restore those fields. - * Note: if application hasn't set client_data, tools like Purify may - * complain here. - */ - { - struct jpeg_error_mgr * err = cinfo->err; - void * client_data = cinfo->client_data; /* ignore Purify complaint here */ - MEMZERO(cinfo, SIZEOF(struct jpeg_decompress_struct)); - cinfo->err = err; - cinfo->client_data = client_data; - } - cinfo->is_decompressor = TRUE; - - /* Initialize a memory manager instance for this object */ - jinit_memory_mgr((j_common_ptr) cinfo); - - /* Zero out pointers to permanent structures. */ - cinfo->progress = NULL; - cinfo->src = NULL; - - for (i = 0; i < NUM_QUANT_TBLS; i++) - cinfo->quant_tbl_ptrs[i] = NULL; - - for (i = 0; i < NUM_HUFF_TBLS; i++) { - cinfo->dc_huff_tbl_ptrs[i] = NULL; - cinfo->ac_huff_tbl_ptrs[i] = NULL; - } - - /* Initialize marker processor so application can override methods - * for COM, APPn markers before calling jpeg_read_header. - */ - cinfo->marker_list = NULL; - jinit_marker_reader(cinfo); - - /* And initialize the overall input controller. */ - jinit_input_controller(cinfo); - - /* OK, I'm ready */ - cinfo->global_state = DSTATE_START; -} - - -/* - * Destruction of a JPEG decompression object - */ - -GLOBAL(void) -jpeg_destroy_decompress (j_decompress_ptr cinfo) -{ - jpeg_destroy((j_common_ptr) cinfo); /* use common routine */ -} - - -/* - * Abort processing of a JPEG decompression operation, - * but don't destroy the object itself. - */ - -GLOBAL(void) -jpeg_abort_decompress (j_decompress_ptr cinfo) -{ - jpeg_abort((j_common_ptr) cinfo); /* use common routine */ -} - - -/* - * Set default decompression parameters. - */ - -LOCAL(void) -default_decompress_parms (j_decompress_ptr cinfo) -{ - /* Guess the input colorspace, and set output colorspace accordingly. */ - /* (Wish JPEG committee had provided a real way to specify this...) */ - /* Note application may override our guesses. */ - switch (cinfo->num_components) { - case 1: - cinfo->jpeg_color_space = JCS_GRAYSCALE; - cinfo->out_color_space = JCS_GRAYSCALE; - break; - - case 3: - if (cinfo->saw_JFIF_marker) { - cinfo->jpeg_color_space = JCS_YCbCr; /* JFIF implies YCbCr */ - } else if (cinfo->saw_Adobe_marker) { - switch (cinfo->Adobe_transform) { - case 0: - cinfo->jpeg_color_space = JCS_RGB; - break; - case 1: - cinfo->jpeg_color_space = JCS_YCbCr; - break; - default: - WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); - cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ - break; - } - } else { - /* Saw no special markers, try to guess from the component IDs */ - int cid0 = cinfo->comp_info[0].component_id; - int cid1 = cinfo->comp_info[1].component_id; - int cid2 = cinfo->comp_info[2].component_id; - - if (cid0 == 1 && cid1 == 2 && cid2 == 3) - cinfo->jpeg_color_space = JCS_YCbCr; /* assume JFIF w/out marker */ - else if (cid0 == 82 && cid1 == 71 && cid2 == 66) - cinfo->jpeg_color_space = JCS_RGB; /* ASCII 'R', 'G', 'B' */ - else { - TRACEMS3(cinfo, 1, JTRC_UNKNOWN_IDS, cid0, cid1, cid2); - cinfo->jpeg_color_space = JCS_YCbCr; /* assume it's YCbCr */ - } - } - /* Always guess RGB is proper output colorspace. */ - cinfo->out_color_space = JCS_RGB; - break; - - case 4: - if (cinfo->saw_Adobe_marker) { - switch (cinfo->Adobe_transform) { - case 0: - cinfo->jpeg_color_space = JCS_CMYK; - break; - case 2: - cinfo->jpeg_color_space = JCS_YCCK; - break; - default: - WARNMS1(cinfo, JWRN_ADOBE_XFORM, cinfo->Adobe_transform); - cinfo->jpeg_color_space = JCS_YCCK; /* assume it's YCCK */ - break; - } - } else { - /* No special markers, assume straight CMYK. */ - cinfo->jpeg_color_space = JCS_CMYK; - } - cinfo->out_color_space = JCS_CMYK; - break; - - default: - cinfo->jpeg_color_space = JCS_UNKNOWN; - cinfo->out_color_space = JCS_UNKNOWN; - break; - } - - /* Set defaults for other decompression parameters. */ - cinfo->scale_num = 1; /* 1:1 scaling */ - cinfo->scale_denom = 1; - cinfo->output_gamma = 1.0; - cinfo->buffered_image = FALSE; - cinfo->raw_data_out = FALSE; - cinfo->dct_method = JDCT_DEFAULT; - cinfo->do_fancy_upsampling = TRUE; - cinfo->do_block_smoothing = TRUE; - cinfo->quantize_colors = FALSE; - /* We set these in case application only sets quantize_colors. */ - cinfo->dither_mode = JDITHER_FS; -#ifdef QUANT_2PASS_SUPPORTED - cinfo->two_pass_quantize = TRUE; -#else - cinfo->two_pass_quantize = FALSE; -#endif - cinfo->desired_number_of_colors = 256; - cinfo->colormap = NULL; - /* Initialize for no mode change in buffered-image mode. */ - cinfo->enable_1pass_quant = FALSE; - cinfo->enable_external_quant = FALSE; - cinfo->enable_2pass_quant = FALSE; -} - - -/* - * Decompression startup: read start of JPEG datastream to see what's there. - * Need only initialize JPEG object and supply a data source before calling. - * - * This routine will read as far as the first SOS marker (ie, actual start of - * compressed data), and will save all tables and parameters in the JPEG - * object. It will also initialize the decompression parameters to default - * values, and finally return JPEG_HEADER_OK. On return, the application may - * adjust the decompression parameters and then call jpeg_start_decompress. - * (Or, if the application only wanted to determine the image parameters, - * the data need not be decompressed. In that case, call jpeg_abort or - * jpeg_destroy to release any temporary space.) - * If an abbreviated (tables only) datastream is presented, the routine will - * return JPEG_HEADER_TABLES_ONLY upon reaching EOI. The application may then - * re-use the JPEG object to read the abbreviated image datastream(s). - * It is unnecessary (but OK) to call jpeg_abort in this case. - * The JPEG_SUSPENDED return code only occurs if the data source module - * requests suspension of the decompressor. In this case the application - * should load more source data and then re-call jpeg_read_header to resume - * processing. - * If a non-suspending data source is used and require_image is TRUE, then the - * return code need not be inspected since only JPEG_HEADER_OK is possible. - * - * This routine is now just a front end to jpeg_consume_input, with some - * extra error checking. - */ - -GLOBAL(int) -jpeg_read_header (j_decompress_ptr cinfo, boolean require_image) -{ - int retcode; - - if (cinfo->global_state != DSTATE_START && - cinfo->global_state != DSTATE_INHEADER) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - retcode = jpeg_consume_input(cinfo); - - switch (retcode) { - case JPEG_REACHED_SOS: - retcode = JPEG_HEADER_OK; - break; - case JPEG_REACHED_EOI: - if (require_image) /* Complain if application wanted an image */ - ERREXIT(cinfo, JERR_NO_IMAGE); - /* Reset to start state; it would be safer to require the application to - * call jpeg_abort, but we can't change it now for compatibility reasons. - * A side effect is to free any temporary memory (there shouldn't be any). - */ - jpeg_abort((j_common_ptr) cinfo); /* sets state = DSTATE_START */ - retcode = JPEG_HEADER_TABLES_ONLY; - break; - case JPEG_SUSPENDED: - /* no work */ - break; - } - - return retcode; -} - - -/* - * Consume data in advance of what the decompressor requires. - * This can be called at any time once the decompressor object has - * been created and a data source has been set up. - * - * This routine is essentially a state machine that handles a couple - * of critical state-transition actions, namely initial setup and - * transition from header scanning to ready-for-start_decompress. - * All the actual input is done via the input controller's consume_input - * method. - */ - -GLOBAL(int) -jpeg_consume_input (j_decompress_ptr cinfo) -{ - int retcode = JPEG_SUSPENDED; - - /* NB: every possible DSTATE value should be listed in this switch */ - switch (cinfo->global_state) { - case DSTATE_START: - /* Start-of-datastream actions: reset appropriate modules */ - (*cinfo->inputctl->reset_input_controller) (cinfo); - /* Initialize application's data source module */ - (*cinfo->src->init_source) (cinfo); - cinfo->global_state = DSTATE_INHEADER; - /*FALLTHROUGH*/ - case DSTATE_INHEADER: - retcode = (*cinfo->inputctl->consume_input) (cinfo); - if (retcode == JPEG_REACHED_SOS) { /* Found SOS, prepare to decompress */ - /* Set up default parameters based on header data */ - default_decompress_parms(cinfo); - /* Set global state: ready for start_decompress */ - cinfo->global_state = DSTATE_READY; - } - break; - case DSTATE_READY: - /* Can't advance past first SOS until start_decompress is called */ - retcode = JPEG_REACHED_SOS; - break; - case DSTATE_PRELOAD: - case DSTATE_PRESCAN: - case DSTATE_SCANNING: - case DSTATE_RAW_OK: - case DSTATE_BUFIMAGE: - case DSTATE_BUFPOST: - case DSTATE_STOPPING: - retcode = (*cinfo->inputctl->consume_input) (cinfo); - break; - default: - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - } - return retcode; -} - - -/* - * Have we finished reading the input file? - */ - -GLOBAL(boolean) -jpeg_input_complete (j_decompress_ptr cinfo) -{ - /* Check for valid jpeg object */ - if (cinfo->global_state < DSTATE_START || - cinfo->global_state > DSTATE_STOPPING) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - return cinfo->inputctl->eoi_reached; -} - - -/* - * Is there more than one scan? - */ - -GLOBAL(boolean) -jpeg_has_multiple_scans (j_decompress_ptr cinfo) -{ - /* Only valid after jpeg_read_header completes */ - if (cinfo->global_state < DSTATE_READY || - cinfo->global_state > DSTATE_STOPPING) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - return cinfo->inputctl->has_multiple_scans; -} - - -/* - * Finish JPEG decompression. - * - * This will normally just verify the file trailer and release temp storage. - * - * Returns FALSE if suspended. The return value need be inspected only if - * a suspending data source is used. - */ - -GLOBAL(boolean) -jpeg_finish_decompress (j_decompress_ptr cinfo) -{ - if ((cinfo->global_state == DSTATE_SCANNING || - cinfo->global_state == DSTATE_RAW_OK) && ! cinfo->buffered_image) { - /* Terminate final pass of non-buffered mode */ - if (cinfo->output_scanline < cinfo->output_height) - ERREXIT(cinfo, JERR_TOO_LITTLE_DATA); - (*cinfo->master->finish_output_pass) (cinfo); - cinfo->global_state = DSTATE_STOPPING; - } else if (cinfo->global_state == DSTATE_BUFIMAGE) { - /* Finishing after a buffered-image operation */ - cinfo->global_state = DSTATE_STOPPING; - } else if (cinfo->global_state != DSTATE_STOPPING) { - /* STOPPING = repeat call after a suspension, anything else is error */ - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - } - /* Read until EOI */ - while (! cinfo->inputctl->eoi_reached) { - if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) - return FALSE; /* Suspend, come back later */ - } - /* Do final cleanup */ - (*cinfo->src->term_source) (cinfo); - /* We can use jpeg_abort to release memory and reset global_state */ - jpeg_abort((j_common_ptr) cinfo); - return TRUE; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapistd.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapistd.c deleted file mode 100755 index f6c7fff..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdapistd.c +++ /dev/null @@ -1,275 +0,0 @@ -/* - * jdapistd.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains application interface code for the decompression half - * of the JPEG library. These are the "standard" API routines that are - * used in the normal full-decompression case. They are not used by a - * transcoding-only application. Note that if an application links in - * jpeg_start_decompress, it will end up linking in the entire decompressor. - * We thus must separate this file from jdapimin.c to avoid linking the - * whole decompression library into a transcoder. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Forward declarations */ -LOCAL(boolean) output_pass_setup JPP((j_decompress_ptr cinfo)); - - -/* - * Decompression initialization. - * jpeg_read_header must be completed before calling this. - * - * If a multipass operating mode was selected, this will do all but the - * last pass, and thus may take a great deal of time. - * - * Returns FALSE if suspended. The return value need be inspected only if - * a suspending data source is used. - */ - -GLOBAL(boolean) -jpeg_start_decompress (j_decompress_ptr cinfo) -{ - if (cinfo->global_state == DSTATE_READY) { - /* First call: initialize master control, select active modules */ - jinit_master_decompress(cinfo); - if (cinfo->buffered_image) { - /* No more work here; expecting jpeg_start_output next */ - cinfo->global_state = DSTATE_BUFIMAGE; - return TRUE; - } - cinfo->global_state = DSTATE_PRELOAD; - } - if (cinfo->global_state == DSTATE_PRELOAD) { - /* If file has multiple scans, absorb them all into the coef buffer */ - if (cinfo->inputctl->has_multiple_scans) { -#ifdef D_MULTISCAN_FILES_SUPPORTED - for (;;) { - int retcode; - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - /* Absorb some more input */ - retcode = (*cinfo->inputctl->consume_input) (cinfo); - if (retcode == JPEG_SUSPENDED) - return FALSE; - if (retcode == JPEG_REACHED_EOI) - break; - /* Advance progress counter if appropriate */ - if (cinfo->progress != NULL && - (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { - if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { - /* jdmaster underestimated number of scans; ratchet up one scan */ - cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; - } - } - } -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif /* D_MULTISCAN_FILES_SUPPORTED */ - } - cinfo->output_scan_number = cinfo->input_scan_number; - } else if (cinfo->global_state != DSTATE_PRESCAN) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - /* Perform any dummy output passes, and set up for the final pass */ - return output_pass_setup(cinfo); -} - - -/* - * Set up for an output pass, and perform any dummy pass(es) needed. - * Common subroutine for jpeg_start_decompress and jpeg_start_output. - * Entry: global_state = DSTATE_PRESCAN only if previously suspended. - * Exit: If done, returns TRUE and sets global_state for proper output mode. - * If suspended, returns FALSE and sets global_state = DSTATE_PRESCAN. - */ - -LOCAL(boolean) -output_pass_setup (j_decompress_ptr cinfo) -{ - if (cinfo->global_state != DSTATE_PRESCAN) { - /* First call: do pass setup */ - (*cinfo->master->prepare_for_output_pass) (cinfo); - cinfo->output_scanline = 0; - cinfo->global_state = DSTATE_PRESCAN; - } - /* Loop over any required dummy passes */ - while (cinfo->master->is_dummy_pass) { -#ifdef QUANT_2PASS_SUPPORTED - /* Crank through the dummy pass */ - while (cinfo->output_scanline < cinfo->output_height) { - JDIMENSION last_scanline; - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) cinfo->output_scanline; - cinfo->progress->pass_limit = (long) cinfo->output_height; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - /* Process some data */ - last_scanline = cinfo->output_scanline; - (*cinfo->main->process_data) (cinfo, (JSAMPARRAY) NULL, - &cinfo->output_scanline, (JDIMENSION) 0); - if (cinfo->output_scanline == last_scanline) - return FALSE; /* No progress made, must suspend */ - } - /* Finish up dummy pass, and set up for another one */ - (*cinfo->master->finish_output_pass) (cinfo); - (*cinfo->master->prepare_for_output_pass) (cinfo); - cinfo->output_scanline = 0; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif /* QUANT_2PASS_SUPPORTED */ - } - /* Ready for application to drive output pass through - * jpeg_read_scanlines or jpeg_read_raw_data. - */ - cinfo->global_state = cinfo->raw_data_out ? DSTATE_RAW_OK : DSTATE_SCANNING; - return TRUE; -} - - -/* - * Read some scanlines of data from the JPEG decompressor. - * - * The return value will be the number of lines actually read. - * This may be less than the number requested in several cases, - * including bottom of image, data source suspension, and operating - * modes that emit multiple scanlines at a time. - * - * Note: we warn about excess calls to jpeg_read_scanlines() since - * this likely signals an application programmer error. However, - * an oversize buffer (max_lines > scanlines remaining) is not an error. - */ - -GLOBAL(JDIMENSION) -jpeg_read_scanlines (j_decompress_ptr cinfo, JSAMPARRAY scanlines, - JDIMENSION max_lines) -{ - JDIMENSION row_ctr; - - if (cinfo->global_state != DSTATE_SCANNING) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - if (cinfo->output_scanline >= cinfo->output_height) { - WARNMS(cinfo, JWRN_TOO_MUCH_DATA); - return 0; - } - - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) cinfo->output_scanline; - cinfo->progress->pass_limit = (long) cinfo->output_height; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - - /* Process some data */ - row_ctr = 0; - (*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, max_lines); - cinfo->output_scanline += row_ctr; - return row_ctr; -} - - -/* - * Alternate entry point to read raw data. - * Processes exactly one iMCU row per call, unless suspended. - */ - -GLOBAL(JDIMENSION) -jpeg_read_raw_data (j_decompress_ptr cinfo, JSAMPIMAGE data, - JDIMENSION max_lines) -{ - JDIMENSION lines_per_iMCU_row; - - if (cinfo->global_state != DSTATE_RAW_OK) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - if (cinfo->output_scanline >= cinfo->output_height) { - WARNMS(cinfo, JWRN_TOO_MUCH_DATA); - return 0; - } - - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) { - cinfo->progress->pass_counter = (long) cinfo->output_scanline; - cinfo->progress->pass_limit = (long) cinfo->output_height; - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - } - - /* Verify that at least one iMCU row can be returned. */ - lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size; - if (max_lines < lines_per_iMCU_row) - ERREXIT(cinfo, JERR_BUFFER_SIZE); - - /* Decompress directly into user's buffer. */ - if (! (*cinfo->coef->decompress_data) (cinfo, data)) - return 0; /* suspension forced, can do nothing more */ - - /* OK, we processed one iMCU row. */ - cinfo->output_scanline += lines_per_iMCU_row; - return lines_per_iMCU_row; -} - - -/* Additional entry points for buffered-image mode. */ - -#ifdef D_MULTISCAN_FILES_SUPPORTED - -/* - * Initialize for an output pass in buffered-image mode. - */ - -GLOBAL(boolean) -jpeg_start_output (j_decompress_ptr cinfo, int scan_number) -{ - if (cinfo->global_state != DSTATE_BUFIMAGE && - cinfo->global_state != DSTATE_PRESCAN) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - /* Limit scan number to valid range */ - if (scan_number <= 0) - scan_number = 1; - if (cinfo->inputctl->eoi_reached && - scan_number > cinfo->input_scan_number) - scan_number = cinfo->input_scan_number; - cinfo->output_scan_number = scan_number; - /* Perform any dummy output passes, and set up for the real pass */ - return output_pass_setup(cinfo); -} - - -/* - * Finish up after an output pass in buffered-image mode. - * - * Returns FALSE if suspended. The return value need be inspected only if - * a suspending data source is used. - */ - -GLOBAL(boolean) -jpeg_finish_output (j_decompress_ptr cinfo) -{ - if ((cinfo->global_state == DSTATE_SCANNING || - cinfo->global_state == DSTATE_RAW_OK) && cinfo->buffered_image) { - /* Terminate this pass. */ - /* We do not require the whole pass to have been completed. */ - (*cinfo->master->finish_output_pass) (cinfo); - cinfo->global_state = DSTATE_BUFPOST; - } else if (cinfo->global_state != DSTATE_BUFPOST) { - /* BUFPOST = repeat call after a suspension, anything else is error */ - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - } - /* Read markers looking for SOS or EOI */ - while (cinfo->input_scan_number <= cinfo->output_scan_number && - ! cinfo->inputctl->eoi_reached) { - if ((*cinfo->inputctl->consume_input) (cinfo) == JPEG_SUSPENDED) - return FALSE; /* Suspend, come back later */ - } - cinfo->global_state = DSTATE_BUFIMAGE; - return TRUE; -} - -#endif /* D_MULTISCAN_FILES_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdatasrc.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdatasrc.c deleted file mode 100755 index bd4770e..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdatasrc.c +++ /dev/null @@ -1,212 +0,0 @@ -/* - * jdatasrc.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains decompression data source routines for the case of - * reading JPEG data from a file (or any stdio stream). While these routines - * are sufficient for most applications, some will want to use a different - * source manager. - * IMPORTANT: we assume that fread() will correctly transcribe an array of - * JOCTETs from 8-bit-wide elements on external storage. If char is wider - * than 8 bits on your machine, you may need to do some tweaking. - */ - -/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ -#include "jinclude.h" -#include "jpeglib.h" -#include "jerror.h" - - -/* Expanded data source object for stdio input */ - -typedef struct { - struct jpeg_source_mgr pub; /* public fields */ - - FILE * infile; /* source stream */ - JOCTET * buffer; /* start of buffer */ - boolean start_of_file; /* have we gotten any data yet? */ -} my_source_mgr; - -typedef my_source_mgr * my_src_ptr; - -#define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ - - -/* - * Initialize source --- called by jpeg_read_header - * before any data is actually read. - */ - -METHODDEF(void) -init_source (j_decompress_ptr cinfo) -{ - my_src_ptr src = (my_src_ptr) cinfo->src; - - /* We reset the empty-input-file flag for each image, - * but we don't clear the input buffer. - * This is correct behavior for reading a series of images from one source. - */ - src->start_of_file = TRUE; -} - - -/* - * Fill the input buffer --- called whenever buffer is emptied. - * - * In typical applications, this should read fresh data into the buffer - * (ignoring the current state of next_input_byte & bytes_in_buffer), - * reset the pointer & count to the start of the buffer, and return TRUE - * indicating that the buffer has been reloaded. It is not necessary to - * fill the buffer entirely, only to obtain at least one more byte. - * - * There is no such thing as an EOF return. If the end of the file has been - * reached, the routine has a choice of ERREXIT() or inserting fake data into - * the buffer. In most cases, generating a warning message and inserting a - * fake EOI marker is the best course of action --- this will allow the - * decompressor to output however much of the image is there. However, - * the resulting error message is misleading if the real problem is an empty - * input file, so we handle that case specially. - * - * In applications that need to be able to suspend compression due to input - * not being available yet, a FALSE return indicates that no more data can be - * obtained right now, but more may be forthcoming later. In this situation, - * the decompressor will return to its caller (with an indication of the - * number of scanlines it has read, if any). The application should resume - * decompression after it has loaded more data into the input buffer. Note - * that there are substantial restrictions on the use of suspension --- see - * the documentation. - * - * When suspending, the decompressor will back up to a convenient restart point - * (typically the start of the current MCU). next_input_byte & bytes_in_buffer - * indicate where the restart point will be if the current call returns FALSE. - * Data beyond this point must be rescanned after resumption, so move it to - * the front of the buffer rather than discarding it. - */ - -METHODDEF(boolean) -fill_input_buffer (j_decompress_ptr cinfo) -{ - my_src_ptr src = (my_src_ptr) cinfo->src; - size_t nbytes; - - nbytes = JFREAD(src->infile, src->buffer, INPUT_BUF_SIZE); - - if (nbytes <= 0) { - if (src->start_of_file) /* Treat empty input file as fatal error */ - ERREXIT(cinfo, JERR_INPUT_EMPTY); - WARNMS(cinfo, JWRN_JPEG_EOF); - /* Insert a fake EOI marker */ - src->buffer[0] = (JOCTET) 0xFF; - src->buffer[1] = (JOCTET) JPEG_EOI; - nbytes = 2; - } - - src->pub.next_input_byte = src->buffer; - src->pub.bytes_in_buffer = nbytes; - src->start_of_file = FALSE; - - return TRUE; -} - - -/* - * Skip data --- used to skip over a potentially large amount of - * uninteresting data (such as an APPn marker). - * - * Writers of suspendable-input applications must note that skip_input_data - * is not granted the right to give a suspension return. If the skip extends - * beyond the data currently in the buffer, the buffer can be marked empty so - * that the next read will cause a fill_input_buffer call that can suspend. - * Arranging for additional bytes to be discarded before reloading the input - * buffer is the application writer's problem. - */ - -METHODDEF(void) -skip_input_data (j_decompress_ptr cinfo, long num_bytes) -{ - my_src_ptr src = (my_src_ptr) cinfo->src; - - /* Just a dumb implementation for now. Could use fseek() except - * it doesn't work on pipes. Not clear that being smart is worth - * any trouble anyway --- large skips are infrequent. - */ - if (num_bytes > 0) { - while (num_bytes > (long) src->pub.bytes_in_buffer) { - num_bytes -= (long) src->pub.bytes_in_buffer; - (void) fill_input_buffer(cinfo); - /* note we assume that fill_input_buffer will never return FALSE, - * so suspension need not be handled. - */ - } - src->pub.next_input_byte += (size_t) num_bytes; - src->pub.bytes_in_buffer -= (size_t) num_bytes; - } -} - - -/* - * An additional method that can be provided by data source modules is the - * resync_to_restart method for error recovery in the presence of RST markers. - * For the moment, this source module just uses the default resync method - * provided by the JPEG library. That method assumes that no backtracking - * is possible. - */ - - -/* - * Terminate source --- called by jpeg_finish_decompress - * after all data has been read. Often a no-op. - * - * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding - * application must deal with any cleanup that should happen even - * for error exit. - */ - -METHODDEF(void) -term_source (j_decompress_ptr) -{ - /* no work necessary here */ -} - - -/* - * Prepare for input from a stdio stream. - * The caller must have already opened the stream, and is responsible - * for closing it after finishing decompression. - */ - -GLOBAL(void) -jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile) -{ - my_src_ptr src; - - /* The source object and input buffer are made permanent so that a series - * of JPEG images can be read from the same file by calling jpeg_stdio_src - * only before the first one. (If we discarded the buffer at the end of - * one image, we'd likely lose the start of the next one.) - * This makes it unsafe to use this manager and a different source - * manager serially with the same JPEG object. Caveat programmer. - */ - if (cinfo->src == NULL) { /* first time for this JPEG object? */ - cinfo->src = (struct jpeg_source_mgr *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - SIZEOF(my_source_mgr)); - src = (my_src_ptr) cinfo->src; - src->buffer = (JOCTET *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - INPUT_BUF_SIZE * SIZEOF(JOCTET)); - } - - src = (my_src_ptr) cinfo->src; - src->pub.init_source = init_source; - src->pub.fill_input_buffer = fill_input_buffer; - src->pub.skip_input_data = skip_input_data; - src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ - src->pub.term_source = term_source; - src->infile = infile; - src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ - src->pub.next_input_byte = NULL; /* until buffer loaded */ -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcoefct.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcoefct.c deleted file mode 100755 index d86db6d..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcoefct.c +++ /dev/null @@ -1,736 +0,0 @@ -/* - * jdcoefct.c - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the coefficient buffer controller for decompression. - * This controller is the top level of the JPEG decompressor proper. - * The coefficient buffer lies between entropy decoding and inverse-DCT steps. - * - * In buffered-image mode, this controller is the interface between - * input-oriented processing and output-oriented processing. - * Also, the input side (only) is used when reading a file for transcoding. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - -/* Block smoothing is only applicable for progressive JPEG, so: */ -#ifndef D_PROGRESSIVE_SUPPORTED -#undef BLOCK_SMOOTHING_SUPPORTED -#endif - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_d_coef_controller pub; /* public fields */ - - /* These variables keep track of the current location of the input side. */ - /* cinfo->input_iMCU_row is also used for this. */ - JDIMENSION MCU_ctr; /* counts MCUs processed in current row */ - int MCU_vert_offset; /* counts MCU rows within iMCU row */ - int MCU_rows_per_iMCU_row; /* number of such rows needed */ - - /* The output side's location is represented by cinfo->output_iMCU_row. */ - - /* In single-pass modes, it's sufficient to buffer just one MCU. - * We allocate a workspace of D_MAX_BLOCKS_IN_MCU coefficient blocks, - * and let the entropy decoder write into that workspace each time. - * (On 80x86, the workspace is FAR even though it's not really very big; - * this is to keep the module interfaces unchanged when a large coefficient - * buffer is necessary.) - * In multi-pass modes, this array points to the current MCU's blocks - * within the virtual arrays; it is used only by the input side. - */ - JBLOCKROW MCU_buffer[D_MAX_BLOCKS_IN_MCU]; - -#ifdef D_MULTISCAN_FILES_SUPPORTED - /* In multi-pass modes, we need a virtual block array for each component. */ - jvirt_barray_ptr whole_image[MAX_COMPONENTS]; -#endif - -#ifdef BLOCK_SMOOTHING_SUPPORTED - /* When doing block smoothing, we latch coefficient Al values here */ - int * coef_bits_latch; -#define SAVED_COEFS 6 /* we save coef_bits[0..5] */ -#endif -} my_coef_controller3; - -typedef my_coef_controller3 * my_coef_ptr3; - -/* Forward declarations */ -METHODDEF(int) decompress_onepass - JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); -#ifdef D_MULTISCAN_FILES_SUPPORTED -METHODDEF(int) decompress_data - JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); -#endif -#ifdef BLOCK_SMOOTHING_SUPPORTED -LOCAL(boolean) smoothing_ok JPP((j_decompress_ptr cinfo)); -METHODDEF(int) decompress_smooth_data - JPP((j_decompress_ptr cinfo, JSAMPIMAGE output_buf)); -#endif - - -LOCAL(void) -start_iMCU_row3 (j_decompress_ptr cinfo) -/* Reset within-iMCU-row counters for a new row (input side) */ -{ - my_coef_ptr3 coef = (my_coef_ptr3) cinfo->coef; - - /* In an interleaved scan, an MCU row is the same as an iMCU row. - * In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows. - * But at the bottom of the image, process only what's left. - */ - if (cinfo->comps_in_scan > 1) { - coef->MCU_rows_per_iMCU_row = 1; - } else { - if (cinfo->input_iMCU_row < (cinfo->total_iMCU_rows-1)) - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor; - else - coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height; - } - - coef->MCU_ctr = 0; - coef->MCU_vert_offset = 0; -} - - -/* - * Initialize for an input processing pass. - */ - -METHODDEF(void) -start_input_pass (j_decompress_ptr cinfo) -{ - cinfo->input_iMCU_row = 0; - start_iMCU_row3(cinfo); -} - - -/* - * Initialize for an output processing pass. - */ - -METHODDEF(void) -start_output_pass (j_decompress_ptr cinfo) -{ -#ifdef BLOCK_SMOOTHING_SUPPORTED - my_coef_ptr3 coef = (my_coef_ptr3) cinfo->coef; - - /* If multipass, check to see whether to use block smoothing on this pass */ - if (coef->pub.coef_arrays != NULL) { - if (cinfo->do_block_smoothing && smoothing_ok(cinfo)) - coef->pub.decompress_data = decompress_smooth_data; - else - coef->pub.decompress_data = decompress_data; - } -#endif - cinfo->output_iMCU_row = 0; -} - - -/* - * Decompress and return some data in the single-pass case. - * Always attempts to emit one fully interleaved MCU row ("iMCU" row). - * Input and output must run in lockstep since we have only a one-MCU buffer. - * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. - * - * NB: output_buf contains a plane for each component in image, - * which we index according to the component's SOF position. - */ - -METHODDEF(int) -decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) -{ - my_coef_ptr3 coef = (my_coef_ptr3) cinfo->coef; - JDIMENSION MCU_col_num; /* index of current MCU within row */ - JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - int blkn, ci, xindex, yindex, yoffset, useful_width; - JSAMPARRAY output_ptr; - JDIMENSION start_col, output_col; - jpeg_component_info *compptr; - inverse_DCT_method_ptr inverse_DCT; - - /* Loop to process as much as one whole iMCU row */ - for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; - yoffset++) { - for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; - MCU_col_num++) { - /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ - jzero_far((void FAR *) coef->MCU_buffer[0], - (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); - if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { - /* Suspension forced; update state counters and exit */ - coef->MCU_vert_offset = yoffset; - coef->MCU_ctr = MCU_col_num; - return JPEG_SUSPENDED; - } - /* Determine where data should go in output_buf and do the IDCT thing. - * We skip dummy blocks at the right and bottom edges (but blkn gets - * incremented past them!). Note the inner loop relies on having - * allocated the MCU_buffer[] blocks sequentially. - */ - blkn = 0; /* index of current DCT block within MCU */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Don't bother to IDCT an uninteresting component. */ - if (! compptr->component_needed) { - blkn += compptr->MCU_blocks; - continue; - } - inverse_DCT = cinfo->idct->inverse_DCT[compptr->component_index]; - useful_width = (MCU_col_num < last_MCU_col) ? compptr->MCU_width - : compptr->last_col_width; - output_ptr = output_buf[compptr->component_index] + - yoffset * compptr->DCT_scaled_size; - start_col = MCU_col_num * compptr->MCU_sample_width; - for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - if (cinfo->input_iMCU_row < last_iMCU_row || - yoffset+yindex < compptr->last_row_height) { - output_col = start_col; - for (xindex = 0; xindex < useful_width; xindex++) { - (*inverse_DCT) (cinfo, compptr, - (JCOEFPTR) coef->MCU_buffer[blkn+xindex], - output_ptr, output_col); - output_col += compptr->DCT_scaled_size; - } - } - blkn += compptr->MCU_width; - output_ptr += compptr->DCT_scaled_size; - } - } - } - /* Completed an MCU row, but perhaps not an iMCU row */ - coef->MCU_ctr = 0; - } - /* Completed the iMCU row, advance counters for next one */ - cinfo->output_iMCU_row++; - if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { - start_iMCU_row3(cinfo); - return JPEG_ROW_COMPLETED; - } - /* Completed the scan */ - (*cinfo->inputctl->finish_input_pass) (cinfo); - return JPEG_SCAN_COMPLETED; -} - - -/* - * Dummy consume-input routine for single-pass operation. - */ - -METHODDEF(int) -dummy_consume_data (j_decompress_ptr) -{ - return JPEG_SUSPENDED; /* Always indicate nothing was done */ -} - - -#ifdef D_MULTISCAN_FILES_SUPPORTED - -/* - * Consume input data and store it in the full-image coefficient buffer. - * We read as much as one fully interleaved MCU row ("iMCU" row) per call, - * ie, v_samp_factor block rows for each component in the scan. - * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. - */ - -METHODDEF(int) -consume_data (j_decompress_ptr cinfo) -{ - my_coef_ptr3 coef = (my_coef_ptr3) cinfo->coef; - JDIMENSION MCU_col_num; /* index of current MCU within row */ - int blkn, ci, xindex, yindex, yoffset; - JDIMENSION start_col; - JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN]; - JBLOCKROW buffer_ptr; - jpeg_component_info *compptr; - - /* Align the virtual buffers for the components used in this scan. */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - buffer[ci] = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[compptr->component_index], - cinfo->input_iMCU_row * compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, TRUE); - /* Note: entropy decoder expects buffer to be zeroed, - * but this is handled automatically by the memory manager - * because we requested a pre-zeroed array. - */ - } - - /* Loop to process one whole iMCU row */ - for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row; - yoffset++) { - for (MCU_col_num = coef->MCU_ctr; MCU_col_num < cinfo->MCUs_per_row; - MCU_col_num++) { - /* Construct list of pointers to DCT blocks belonging to this MCU */ - blkn = 0; /* index of current DCT block within MCU */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - start_col = MCU_col_num * compptr->MCU_width; - for (yindex = 0; yindex < compptr->MCU_height; yindex++) { - buffer_ptr = buffer[ci][yindex+yoffset] + start_col; - for (xindex = 0; xindex < compptr->MCU_width; xindex++) { - coef->MCU_buffer[blkn++] = buffer_ptr++; - } - } - } - /* Try to fetch the MCU. */ - if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { - /* Suspension forced; update state counters and exit */ - coef->MCU_vert_offset = yoffset; - coef->MCU_ctr = MCU_col_num; - return JPEG_SUSPENDED; - } - } - /* Completed an MCU row, but perhaps not an iMCU row */ - coef->MCU_ctr = 0; - } - /* Completed the iMCU row, advance counters for next one */ - if (++(cinfo->input_iMCU_row) < cinfo->total_iMCU_rows) { - start_iMCU_row3(cinfo); - return JPEG_ROW_COMPLETED; - } - /* Completed the scan */ - (*cinfo->inputctl->finish_input_pass) (cinfo); - return JPEG_SCAN_COMPLETED; -} - - -/* - * Decompress and return some data in the multi-pass case. - * Always attempts to emit one fully interleaved MCU row ("iMCU" row). - * Return value is JPEG_ROW_COMPLETED, JPEG_SCAN_COMPLETED, or JPEG_SUSPENDED. - * - * NB: output_buf contains a plane for each component in image. - */ - -METHODDEF(int) -decompress_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) -{ - my_coef_ptr3 coef = (my_coef_ptr3) cinfo->coef; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - JDIMENSION block_num; - int ci, block_row, block_rows; - JBLOCKARRAY buffer; - JBLOCKROW buffer_ptr; - JSAMPARRAY output_ptr; - JDIMENSION output_col; - jpeg_component_info *compptr; - inverse_DCT_method_ptr inverse_DCT; - - /* Force some input to be done if we are getting ahead of the input. */ - while (cinfo->input_scan_number < cinfo->output_scan_number || - (cinfo->input_scan_number == cinfo->output_scan_number && - cinfo->input_iMCU_row <= cinfo->output_iMCU_row)) { - if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) - return JPEG_SUSPENDED; - } - - /* OK, output from the virtual arrays. */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Don't bother to IDCT an uninteresting component. */ - if (! compptr->component_needed) - continue; - /* Align the virtual buffer for this component. */ - buffer = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[ci], - cinfo->output_iMCU_row * compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - /* Count non-dummy DCT block rows in this iMCU row. */ - if (cinfo->output_iMCU_row < last_iMCU_row) - block_rows = compptr->v_samp_factor; - else { - /* NB: can't use last_row_height here; it is input-side-dependent! */ - block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); - if (block_rows == 0) block_rows = compptr->v_samp_factor; - } - inverse_DCT = cinfo->idct->inverse_DCT[ci]; - output_ptr = output_buf[ci]; - /* Loop over all DCT blocks to be processed. */ - for (block_row = 0; block_row < block_rows; block_row++) { - buffer_ptr = buffer[block_row]; - output_col = 0; - for (block_num = 0; block_num < compptr->width_in_blocks; block_num++) { - (*inverse_DCT) (cinfo, compptr, (JCOEFPTR) buffer_ptr, - output_ptr, output_col); - buffer_ptr++; - output_col += compptr->DCT_scaled_size; - } - output_ptr += compptr->DCT_scaled_size; - } - } - - if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) - return JPEG_ROW_COMPLETED; - return JPEG_SCAN_COMPLETED; -} - -#endif /* D_MULTISCAN_FILES_SUPPORTED */ - - -#ifdef BLOCK_SMOOTHING_SUPPORTED - -/* - * This code applies interblock smoothing as described by section K.8 - * of the JPEG standard: the first 5 AC coefficients are estimated from - * the DC values of a DCT block and its 8 neighboring blocks. - * We apply smoothing only for progressive JPEG decoding, and only if - * the coefficients it can estimate are not yet known to full precision. - */ - -/* Natural-order array positions of the first 5 zigzag-order coefficients */ -#define Q01_POS 1 -#define Q10_POS 8 -#define Q20_POS 16 -#define Q11_POS 9 -#define Q02_POS 2 - -/* - * Determine whether block smoothing is applicable and safe. - * We also latch the current states of the coef_bits[] entries for the - * AC coefficients; otherwise, if the input side of the decompressor - * advances into a new scan, we might think the coefficients are known - * more accurately than they really are. - */ - -LOCAL(boolean) -smoothing_ok (j_decompress_ptr cinfo) -{ - my_coef_ptr3 coef = (my_coef_ptr3) cinfo->coef; - boolean smoothing_useful = FALSE; - int ci, coefi; - jpeg_component_info *compptr; - JQUANT_TBL * qtable; - int * coef_bits; - int * coef_bits_latch; - - if (! cinfo->progressive_mode || cinfo->coef_bits == NULL) - return FALSE; - - /* Allocate latch area if not already done */ - if (coef->coef_bits_latch == NULL) - coef->coef_bits_latch = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components * - (SAVED_COEFS * SIZEOF(int))); - coef_bits_latch = coef->coef_bits_latch; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* All components' quantization values must already be latched. */ - if ((qtable = compptr->quant_table) == NULL) - return FALSE; - /* Verify DC & first 5 AC quantizers are nonzero to avoid zero-divide. */ - if (qtable->quantval[0] == 0 || - qtable->quantval[Q01_POS] == 0 || - qtable->quantval[Q10_POS] == 0 || - qtable->quantval[Q20_POS] == 0 || - qtable->quantval[Q11_POS] == 0 || - qtable->quantval[Q02_POS] == 0) - return FALSE; - /* DC values must be at least partly known for all components. */ - coef_bits = cinfo->coef_bits[ci]; - if (coef_bits[0] < 0) - return FALSE; - /* Block smoothing is helpful if some AC coefficients remain inaccurate. */ - for (coefi = 1; coefi <= 5; coefi++) { - coef_bits_latch[coefi] = coef_bits[coefi]; - if (coef_bits[coefi] != 0) - smoothing_useful = TRUE; - } - coef_bits_latch += SAVED_COEFS; - } - - return smoothing_useful; -} - - -/* - * Variant of decompress_data for use when doing block smoothing. - */ - -METHODDEF(int) -decompress_smooth_data (j_decompress_ptr cinfo, JSAMPIMAGE output_buf) -{ - my_coef_ptr3 coef = (my_coef_ptr3) cinfo->coef; - JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1; - JDIMENSION block_num, last_block_column; - int ci, block_row, block_rows, access_rows; - JBLOCKARRAY buffer; - JBLOCKROW buffer_ptr, prev_block_row, next_block_row; - JSAMPARRAY output_ptr; - JDIMENSION output_col; - jpeg_component_info *compptr; - inverse_DCT_method_ptr inverse_DCT; - boolean first_row, last_row; - JBLOCK workspace; - int *coef_bits; - JQUANT_TBL *quanttbl; - INT32 Q00,Q01,Q02,Q10,Q11,Q20, num; - int DC1,DC2,DC3,DC4,DC5,DC6,DC7,DC8,DC9; - int Al, pred; - - /* Force some input to be done if we are getting ahead of the input. */ - while (cinfo->input_scan_number <= cinfo->output_scan_number && - ! cinfo->inputctl->eoi_reached) { - if (cinfo->input_scan_number == cinfo->output_scan_number) { - /* If input is working on current scan, we ordinarily want it to - * have completed the current row. But if input scan is DC, - * we want it to keep one row ahead so that next block row's DC - * values are up to date. - */ - JDIMENSION delta = (cinfo->Ss == 0) ? 1 : 0; - if (cinfo->input_iMCU_row > cinfo->output_iMCU_row+delta) - break; - } - if ((*cinfo->inputctl->consume_input)(cinfo) == JPEG_SUSPENDED) - return JPEG_SUSPENDED; - } - - /* OK, output from the virtual arrays. */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Don't bother to IDCT an uninteresting component. */ - if (! compptr->component_needed) - continue; - /* Count non-dummy DCT block rows in this iMCU row. */ - if (cinfo->output_iMCU_row < last_iMCU_row) { - block_rows = compptr->v_samp_factor; - access_rows = block_rows * 2; /* this and next iMCU row */ - last_row = FALSE; - } else { - /* NB: can't use last_row_height here; it is input-side-dependent! */ - block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor); - if (block_rows == 0) block_rows = compptr->v_samp_factor; - access_rows = block_rows; /* this iMCU row only */ - last_row = TRUE; - } - /* Align the virtual buffer for this component. */ - if (cinfo->output_iMCU_row > 0) { - access_rows += compptr->v_samp_factor; /* prior iMCU row too */ - buffer = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[ci], - (cinfo->output_iMCU_row - 1) * compptr->v_samp_factor, - (JDIMENSION) access_rows, FALSE); - buffer += compptr->v_samp_factor; /* point to current iMCU row */ - first_row = FALSE; - } else { - buffer = (*cinfo->mem->access_virt_barray) - ((j_common_ptr) cinfo, coef->whole_image[ci], - (JDIMENSION) 0, (JDIMENSION) access_rows, FALSE); - first_row = TRUE; - } - /* Fetch component-dependent info */ - coef_bits = coef->coef_bits_latch + (ci * SAVED_COEFS); - quanttbl = compptr->quant_table; - Q00 = quanttbl->quantval[0]; - Q01 = quanttbl->quantval[Q01_POS]; - Q10 = quanttbl->quantval[Q10_POS]; - Q20 = quanttbl->quantval[Q20_POS]; - Q11 = quanttbl->quantval[Q11_POS]; - Q02 = quanttbl->quantval[Q02_POS]; - inverse_DCT = cinfo->idct->inverse_DCT[ci]; - output_ptr = output_buf[ci]; - /* Loop over all DCT blocks to be processed. */ - for (block_row = 0; block_row < block_rows; block_row++) { - buffer_ptr = buffer[block_row]; - if (first_row && block_row == 0) - prev_block_row = buffer_ptr; - else - prev_block_row = buffer[block_row-1]; - if (last_row && block_row == block_rows-1) - next_block_row = buffer_ptr; - else - next_block_row = buffer[block_row+1]; - /* We fetch the surrounding DC values using a sliding-approach. - * Initialize all nine here so as to do the right thing on narrow pics. - */ - DC1 = DC2 = DC3 = (int) prev_block_row[0][0]; - DC4 = DC5 = DC6 = (int) buffer_ptr[0][0]; - DC7 = DC8 = DC9 = (int) next_block_row[0][0]; - output_col = 0; - last_block_column = compptr->width_in_blocks - 1; - for (block_num = 0; block_num <= last_block_column; block_num++) { - /* Fetch current DCT block into workspace so we can modify it. */ - jcopy_block_row(buffer_ptr, (JBLOCKROW) workspace, (JDIMENSION) 1); - /* Update DC values */ - if (block_num < last_block_column) { - DC3 = (int) prev_block_row[1][0]; - DC6 = (int) buffer_ptr[1][0]; - DC9 = (int) next_block_row[1][0]; - } - /* Compute coefficient estimates per K.8. - * An estimate is applied only if coefficient is still zero, - * and is not known to be fully accurate. - */ - /* AC01 */ - if ((Al=coef_bits[1]) != 0 && workspace[1] == 0) { - num = 36 * Q00 * (DC4 - DC6); - if (num >= 0) { - pred = (int) (((Q01<<7) + num) / (Q01<<8)); - if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { - pred = (int) (((Q10<<7) + num) / (Q10<<8)); - if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { - pred = (int) (((Q20<<7) + num) / (Q20<<8)); - if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { - pred = (int) (((Q11<<7) + num) / (Q11<<8)); - if (Al > 0 && pred >= (1< 0 && pred >= (1<= 0) { - pred = (int) (((Q02<<7) + num) / (Q02<<8)); - if (Al > 0 && pred >= (1< 0 && pred >= (1<DCT_scaled_size; - } - output_ptr += compptr->DCT_scaled_size; - } - } - - if (++(cinfo->output_iMCU_row) < cinfo->total_iMCU_rows) - return JPEG_ROW_COMPLETED; - return JPEG_SCAN_COMPLETED; -} - -#endif /* BLOCK_SMOOTHING_SUPPORTED */ - - -/* - * Initialize coefficient buffer controller. - */ - -GLOBAL(void) -jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer) -{ - my_coef_ptr3 coef; - - coef = (my_coef_ptr3) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_coef_controller3)); - cinfo->coef = (struct jpeg_d_coef_controller *) coef; - coef->pub.start_input_pass = start_input_pass; - coef->pub.start_output_pass = start_output_pass; -#ifdef BLOCK_SMOOTHING_SUPPORTED - coef->coef_bits_latch = NULL; -#endif - - /* Create the coefficient buffer. */ - if (need_full_buffer) { -#ifdef D_MULTISCAN_FILES_SUPPORTED - /* Allocate a full-image virtual array for each component, */ - /* padded to a multiple of samp_factor DCT blocks in each direction. */ - /* Note we ask for a pre-zeroed array. */ - int ci, access_rows; - jpeg_component_info *compptr; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - access_rows = compptr->v_samp_factor; -#ifdef BLOCK_SMOOTHING_SUPPORTED - /* If block smoothing could be used, need a bigger window */ - if (cinfo->progressive_mode) - access_rows *= 3; -#endif - coef->whole_image[ci] = (*cinfo->mem->request_virt_barray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, TRUE, - (JDIMENSION) jround_up((long) compptr->width_in_blocks, - (long) compptr->h_samp_factor), - (JDIMENSION) jround_up((long) compptr->height_in_blocks, - (long) compptr->v_samp_factor), - (JDIMENSION) access_rows); - } - coef->pub.consume_data = consume_data; - coef->pub.decompress_data = decompress_data; - coef->pub.coef_arrays = coef->whole_image; /* link to virtual arrays */ -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - /* We only need a single-MCU buffer. */ - JBLOCKROW buffer; - int i; - - buffer = (JBLOCKROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); - for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { - coef->MCU_buffer[i] = buffer + i; - } - coef->pub.consume_data = dummy_consume_data; - coef->pub.decompress_data = decompress_onepass; - coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcolor.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcolor.c deleted file mode 100755 index 30763e9..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdcolor.c +++ /dev/null @@ -1,396 +0,0 @@ -/* - * jdcolor.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains output colorspace conversion routines. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private subobject */ - -typedef struct { - struct jpeg_color_deconverter pub; /* public fields */ - - /* Private state for YCC->RGB conversion */ - int * Cr_r_tab; /* => table for Cr to R conversion */ - int * Cb_b_tab; /* => table for Cb to B conversion */ - INT32 * Cr_g_tab; /* => table for Cr to G conversion */ - INT32 * Cb_g_tab; /* => table for Cb to G conversion */ -} my_color_deconverter2; - -typedef my_color_deconverter2 * my_cconvert_ptr2; - - -/**************** YCbCr -> RGB conversion: most common case **************/ - -/* - * YCbCr is defined per CCIR 601-1, except that Cb and Cr are - * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. - * The conversion equations to be implemented are therefore - * R = Y + 1.40200 * Cr - * G = Y - 0.34414 * Cb - 0.71414 * Cr - * B = Y + 1.77200 * Cb - * where Cb and Cr represent the incoming values less CENTERJSAMPLE. - * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) - * - * To avoid floating-point arithmetic, we represent the fractional constants - * as integers scaled up by 2^16 (about 4 digits precision); we have to divide - * the products by 2^16, with appropriate rounding, to get the correct answer. - * Notice that Y, being an integral input, does not contribute any fraction - * so it need not participate in the rounding. - * - * For even more speed, we avoid doing any multiplications in the inner loop - * by precalculating the constants times Cb and Cr for all possible values. - * For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table); - * for 12-bit samples it is still acceptable. It's not very reasonable for - * 16-bit samples, but if you want lossless storage you shouldn't be changing - * colorspace anyway. - * The Cr=>R and Cb=>B values can be rounded to integers in advance; the - * values for the G calculation are left scaled up, since we must add them - * together before rounding. - */ - -#define SCALEBITS 16 /* speediest right-shift on some machines */ -#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) -#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. - */ - -LOCAL(void) -build_ycc_rgb_table (j_decompress_ptr cinfo) -{ - my_cconvert_ptr2 cconvert = (my_cconvert_ptr2) cinfo->cconvert; - int i; - INT32 x; - SHIFT_TEMPS - - cconvert->Cr_r_tab = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(int)); - cconvert->Cb_b_tab = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(int)); - cconvert->Cr_g_tab = (INT32 *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(INT32)); - cconvert->Cb_g_tab = (INT32 *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(INT32)); - - for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { - /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ - /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ - /* Cr=>R value is nearest int to 1.40200 * x */ - cconvert->Cr_r_tab[i] = (int) - RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); - /* Cb=>B value is nearest int to 1.77200 * x */ - cconvert->Cb_b_tab[i] = (int) - RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); - /* Cr=>G value is scaled-up -0.71414 * x */ - cconvert->Cr_g_tab[i] = (- FIX(0.71414)) * x; - /* Cb=>G value is scaled-up -0.34414 * x */ - /* We also add in ONE_HALF so that need not do it in inner loop */ - cconvert->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; - } -} - - -/* - * Convert some rows of samples to the output colorspace. - * - * Note that we change from noninterleaved, one-plane-per-component format - * to interleaved-pixel format. The output buffer is therefore three times - * as wide as the input buffer. - * A starting row offset is provided only for the input buffer. The caller - * can easily adjust the passed output_buf value to accommodate any row - * offset required on that side. - */ - -METHODDEF(void) -ycc_rgb_convert (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) -{ - my_cconvert_ptr2 cconvert = (my_cconvert_ptr2) cinfo->cconvert; - int y, cb, cr; - JSAMPROW outptr; - JSAMPROW inptr0, inptr1, inptr2; - JDIMENSION col; - JDIMENSION num_cols = cinfo->output_width; - /* copy these pointers into registers if possible */ - JSAMPLE * range_limit = cinfo->sample_range_limit; - int * Crrtab = cconvert->Cr_r_tab; - int * Cbbtab = cconvert->Cb_b_tab; - INT32 * Crgtab = cconvert->Cr_g_tab; - INT32 * Cbgtab = cconvert->Cb_g_tab; - SHIFT_TEMPS - - while (--num_rows >= 0) { - inptr0 = input_buf[0][input_row]; - inptr1 = input_buf[1][input_row]; - inptr2 = input_buf[2][input_row]; - input_row++; - outptr = *output_buf++; - for (col = 0; col < num_cols; col++) { - y = GETJSAMPLE(inptr0[col]); - cb = GETJSAMPLE(inptr1[col]); - cr = GETJSAMPLE(inptr2[col]); - /* Range-limiting is essential due to noise introduced by DCT losses. */ - outptr[RGB_RED] = range_limit[y + Crrtab[cr]]; - outptr[RGB_GREEN] = range_limit[y + - ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], - SCALEBITS))]; - outptr[RGB_BLUE] = range_limit[y + Cbbtab[cb]]; - outptr += RGB_PIXELSIZE; - } - } -} - - -/**************** Cases other than YCbCr -> RGB **************/ - - -/* - * Color conversion for no colorspace change: just copy the data, - * converting from separate-planes to interleaved representation. - */ - -METHODDEF(void) -null_convert2 (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) -{ - JSAMPROW inptr, outptr; - JDIMENSION count; - int num_components = cinfo->num_components; - JDIMENSION num_cols = cinfo->output_width; - int ci; - - while (--num_rows >= 0) { - for (ci = 0; ci < num_components; ci++) { - inptr = input_buf[ci][input_row]; - outptr = output_buf[0] + ci; - for (count = num_cols; count > 0; count--) { - *outptr = *inptr++; /* needn't bother with GETJSAMPLE() here */ - outptr += num_components; - } - } - input_row++; - output_buf++; - } -} - - -/* - * Color conversion for grayscale: just copy the data. - * This also works for YCbCr -> grayscale conversion, in which - * we just copy the Y (luminance) component and ignore chrominance. - */ - -METHODDEF(void) -grayscale_convert2 (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) -{ - jcopy_sample_rows(input_buf[0], (int) input_row, output_buf, 0, - num_rows, cinfo->output_width); -} - - -/* - * Convert grayscale to RGB: just duplicate the graylevel three times. - * This is provided to support applications that don't want to cope - * with grayscale as a separate case. - */ - -METHODDEF(void) -gray_rgb_convert (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) -{ - JSAMPROW inptr, outptr; - JDIMENSION col; - JDIMENSION num_cols = cinfo->output_width; - - while (--num_rows >= 0) { - inptr = input_buf[0][input_row++]; - outptr = *output_buf++; - for (col = 0; col < num_cols; col++) { - /* We can dispense with GETJSAMPLE() here */ - outptr[RGB_RED] = outptr[RGB_GREEN] = outptr[RGB_BLUE] = inptr[col]; - outptr += RGB_PIXELSIZE; - } - } -} - - -/* - * Adobe-style YCCK->CMYK conversion. - * We convert YCbCr to R=1-C, G=1-M, and B=1-Y using the same - * conversion as above, while passing K (black) unchanged. - * We assume build_ycc_rgb_table has been called. - */ - -METHODDEF(void) -ycck_cmyk_convert (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows) -{ - my_cconvert_ptr2 cconvert = (my_cconvert_ptr2) cinfo->cconvert; - int y, cb, cr; - JSAMPROW outptr; - JSAMPROW inptr0, inptr1, inptr2, inptr3; - JDIMENSION col; - JDIMENSION num_cols = cinfo->output_width; - /* copy these pointers into registers if possible */ - JSAMPLE * range_limit = cinfo->sample_range_limit; - int * Crrtab = cconvert->Cr_r_tab; - int * Cbbtab = cconvert->Cb_b_tab; - INT32 * Crgtab = cconvert->Cr_g_tab; - INT32 * Cbgtab = cconvert->Cb_g_tab; - SHIFT_TEMPS - - while (--num_rows >= 0) { - inptr0 = input_buf[0][input_row]; - inptr1 = input_buf[1][input_row]; - inptr2 = input_buf[2][input_row]; - inptr3 = input_buf[3][input_row]; - input_row++; - outptr = *output_buf++; - for (col = 0; col < num_cols; col++) { - y = GETJSAMPLE(inptr0[col]); - cb = GETJSAMPLE(inptr1[col]); - cr = GETJSAMPLE(inptr2[col]); - /* Range-limiting is essential due to noise introduced by DCT losses. */ - outptr[0] = range_limit[MAXJSAMPLE - (y + Crrtab[cr])]; /* red */ - outptr[1] = range_limit[MAXJSAMPLE - (y + /* green */ - ((int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], - SCALEBITS)))]; - outptr[2] = range_limit[MAXJSAMPLE - (y + Cbbtab[cb])]; /* blue */ - /* K passes through unchanged */ - outptr[3] = inptr3[col]; /* don't need GETJSAMPLE here */ - outptr += 4; - } - } -} - - -/* - * Empty method for start_pass. - */ - -METHODDEF(void) -start_pass_dcolor (j_decompress_ptr) -{ - /* no work needed */ -} - - -/* - * Module initialization routine for output colorspace conversion. - */ - -GLOBAL(void) -jinit_color_deconverter (j_decompress_ptr cinfo) -{ - my_cconvert_ptr2 cconvert; - int ci; - - cconvert = (my_cconvert_ptr2) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_color_deconverter2)); - cinfo->cconvert = (struct jpeg_color_deconverter *) cconvert; - cconvert->pub.start_pass = start_pass_dcolor; - - /* Make sure num_components agrees with jpeg_color_space */ - switch (cinfo->jpeg_color_space) { - case JCS_GRAYSCALE: - if (cinfo->num_components != 1) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - break; - - case JCS_RGB: - case JCS_YCbCr: - if (cinfo->num_components != 3) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - break; - - case JCS_CMYK: - case JCS_YCCK: - if (cinfo->num_components != 4) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - break; - - default: /* JCS_UNKNOWN can be anything */ - if (cinfo->num_components < 1) - ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); - break; - } - - /* Set out_color_components and conversion method based on requested space. - * Also clear the component_needed flags for any unused components, - * so that earlier pipeline stages can avoid useless computation. - */ - - switch (cinfo->out_color_space) { - case JCS_GRAYSCALE: - cinfo->out_color_components = 1; - if (cinfo->jpeg_color_space == JCS_GRAYSCALE || - cinfo->jpeg_color_space == JCS_YCbCr) { - cconvert->pub.color_convert = grayscale_convert2; - /* For color->grayscale conversion, only the Y (0) component is needed */ - for (ci = 1; ci < cinfo->num_components; ci++) - cinfo->comp_info[ci].component_needed = FALSE; - } else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_RGB: - cinfo->out_color_components = RGB_PIXELSIZE; - if (cinfo->jpeg_color_space == JCS_YCbCr) { - cconvert->pub.color_convert = ycc_rgb_convert; - build_ycc_rgb_table(cinfo); - } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) { - cconvert->pub.color_convert = gray_rgb_convert; - } else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) { - cconvert->pub.color_convert = null_convert2; - } else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - case JCS_CMYK: - cinfo->out_color_components = 4; - if (cinfo->jpeg_color_space == JCS_YCCK) { - cconvert->pub.color_convert = ycck_cmyk_convert; - build_ycc_rgb_table(cinfo); - } else if (cinfo->jpeg_color_space == JCS_CMYK) { - cconvert->pub.color_convert = null_convert2; - } else - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - - default: - /* Permit null conversion to same output space */ - if (cinfo->out_color_space == cinfo->jpeg_color_space) { - cinfo->out_color_components = cinfo->num_components; - cconvert->pub.color_convert = null_convert2; - } else /* unsupported non-null conversion */ - ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); - break; - } - - if (cinfo->quantize_colors) - cinfo->output_components = 1; /* single colormapped output component */ - else - cinfo->output_components = cinfo->out_color_components; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdct.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdct.h deleted file mode 100755 index d8df1b4..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdct.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * jdct.h - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This include file contains common declarations for the forward and - * inverse DCT modules. These declarations are private to the DCT managers - * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms. - * The individual DCT algorithms are kept in separate files to ease - * machine-dependent tuning (e.g., assembly coding). - */ - - -/* - * A forward DCT routine is given a pointer to a work area of type DCTELEM[]; - * the DCT is to be performed in-place in that buffer. Type DCTELEM is int - * for 8-bit samples, INT32 for 12-bit samples. (NOTE: Floating-point DCT - * implementations use an array of type FAST_FLOAT, instead.) - * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE). - * The DCT outputs are returned scaled up by a factor of 8; they therefore - * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This - * convention improves accuracy in integer implementations and saves some - * work in floating-point ones. - * Quantization of the output coefficients is done by jcdctmgr.c. - */ - -#ifndef __jdct_h__ -#define __jdct_h__ - -#if BITS_IN_JSAMPLE == 8 -typedef int DCTELEM; /* 16 or 32 bits is fine */ -#else -typedef INT32 DCTELEM; /* must have 32 bits */ -#endif - -typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data)); -typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data)); - - -/* - * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer - * to an output sample array. The routine must dequantize the input data as - * well as perform the IDCT; for dequantization, it uses the multiplier table - * pointed to by compptr->dct_table. The output data is to be placed into the - * sample array starting at a specified column. (Any row offset needed will - * be applied to the array pointer before it is passed to the IDCT code.) - * Note that the number of samples emitted by the IDCT routine is - * DCT_scaled_size * DCT_scaled_size. - */ - -/* typedef inverse_DCT_method_ptr is declared in jpegint.h */ - -/* - * Each IDCT routine has its own ideas about the best dct_table element type. - */ - -typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */ -#if BITS_IN_JSAMPLE == 8 -typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */ -#define IFAST_SCALE_BITS 2 /* fractional bits in scale factors */ -#else -typedef INT32 IFAST_MULT_TYPE; /* need 32 bits for scaled quantizers */ -#define IFAST_SCALE_BITS 13 /* fractional bits in scale factors */ -#endif -typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */ - - -/* - * Each IDCT routine is responsible for range-limiting its results and - * converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could - * be quite far out of range if the input data is corrupt, so a bulletproof - * range-limiting step is required. We use a mask-and-table-lookup method - * to do the combined operations quickly. See the comments with - * prepare_range_limit_table (in jdmaster.c) for more info. - */ - -#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE) - -#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */ - - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_fdct_islow jFDislow -#define jpeg_fdct_ifast jFDifast -#define jpeg_fdct_float jFDfloat -#define jpeg_idct_islow jRDislow -#define jpeg_idct_ifast jRDifast -#define jpeg_idct_float jRDfloat -#define jpeg_idct_4x4 jRD4x4 -#define jpeg_idct_2x2 jRD2x2 -#define jpeg_idct_1x1 jRD1x1 -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - -/* Extern declarations for the forward and inverse DCT routines. */ - -EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data)); -EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data)); -EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data)); - -EXTERN(void) jpeg_idct_islow - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_ifast - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_float - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_4x4 - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_2x2 - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_1x1 - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); - - -/* - * Macros for handling fixed-point arithmetic; these are used by many - * but not all of the DCT/IDCT modules. - * - * All values are expected to be of type INT32. - * Fractional constants are scaled left by CONST_BITS bits. - * CONST_BITS is defined within each module using these macros, - * and may differ from one module to the next. - */ - -#define ONE ((INT32) 1) -#define CONST_SCALE (ONE << CONST_BITS) - -/* Convert a positive real constant to an integer scaled by CONST_SCALE. - * Caution: some C compilers fail to reduce "FIX(constant)" at compile time, - * thus causing a lot of useless floating-point operations at run time. - */ - -#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) - -/* Descale and correctly round an INT32 value that's scaled by N bits. - * We assume RIGHT_SHIFT rounds towards minus infinity, so adding - * the fudge factor is correct for either sign of X. - */ - -#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * This macro is used only when the two inputs will actually be no more than - * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a - * full 32x32 multiply. This provides a useful speedup on many machines. - * Unfortunately there is no way to specify a 16x16->32 multiply portably - * in C, but some C compilers will do the right thing if you provide the - * correct combination of casts. - */ - -#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ -#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT16) (const))) -#endif -#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */ -#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT32) (const))) -#endif - -#ifndef MULTIPLY16C16 /* default definition */ -#define MULTIPLY16C16(var,const) ((var) * (const)) -#endif - -/* Same except both inputs are variables. */ - -#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ -#define MULTIPLY16V16(var1,var2) (((INT16) (var1)) * ((INT16) (var2))) -#endif - -#ifndef MULTIPLY16V16 /* default definition */ -#define MULTIPLY16V16(var1,var2) ((var1) * (var2)) -#endif - - -#endif diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jddctmgr.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jddctmgr.c deleted file mode 100755 index 0e44eb1..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jddctmgr.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * jddctmgr.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the inverse-DCT management logic. - * This code selects a particular IDCT implementation to be used, - * and it performs related housekeeping chores. No code in this file - * is executed per IDCT step, only during output pass setup. - * - * Note that the IDCT routines are responsible for performing coefficient - * dequantization as well as the IDCT proper. This module sets up the - * dequantization multiplier table needed by the IDCT routine. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - - -/* - * The decompressor input side (jdinput.c) saves away the appropriate - * quantization table for each component at the start of the first scan - * involving that component. (This is necessary in order to correctly - * decode files that reuse Q-table slots.) - * When we are ready to make an output pass, the saved Q-table is converted - * to a multiplier table that will actually be used by the IDCT routine. - * The multiplier table contents are IDCT-method-dependent. To support - * application changes in IDCT method between scans, we can remake the - * multiplier tables if necessary. - * In buffered-image mode, the first output pass may occur before any data - * has been seen for some components, and thus before their Q-tables have - * been saved away. To handle this case, multiplier tables are preset - * to zeroes; the result of the IDCT will be a neutral gray level. - */ - - -/* Private subobject for this module */ - -typedef struct { - struct jpeg_inverse_dct pub; /* public fields */ - - /* This array contains the IDCT method code that each multiplier table - * is currently set up for, or -1 if it's not yet set up. - * The actual multiplier tables are pointed to by dct_table in the - * per-component comp_info structures. - */ - int cur_method[MAX_COMPONENTS]; -} my_idct_controller; - -typedef my_idct_controller * my_idct_ptr; - - -/* Allocated multiplier tables: big enough for any supported variant */ - -typedef union { - ISLOW_MULT_TYPE islow_array[DCTSIZE2]; -#ifdef DCT_IFAST_SUPPORTED - IFAST_MULT_TYPE ifast_array[DCTSIZE2]; -#endif -#ifdef DCT_FLOAT_SUPPORTED - FLOAT_MULT_TYPE float_array[DCTSIZE2]; -#endif -} multiplier_table; - - -/* The current scaled-IDCT routines require ISLOW-style multiplier tables, - * so be sure to compile that code if either ISLOW or SCALING is requested. - */ -#ifdef DCT_ISLOW_SUPPORTED -#define PROVIDE_ISLOW_TABLES -#else -#ifdef IDCT_SCALING_SUPPORTED -#define PROVIDE_ISLOW_TABLES -#endif -#endif - - -/* - * Prepare for an output pass. - * Here we select the proper IDCT routine for each component and build - * a matching multiplier table. - */ - -METHODDEF(void) -start_pass (j_decompress_ptr cinfo) -{ - my_idct_ptr idct = (my_idct_ptr) cinfo->idct; - int ci, i; - jpeg_component_info *compptr; - int method = 0; - inverse_DCT_method_ptr method_ptr = NULL; - JQUANT_TBL * qtbl; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Select the proper IDCT routine for this component's scaling */ - switch (compptr->DCT_scaled_size) { -#ifdef IDCT_SCALING_SUPPORTED - case 1: - method_ptr = jpeg_idct_1x1; - method = JDCT_ISLOW; /* jidctred uses islow-style table */ - break; - case 2: - method_ptr = jpeg_idct_2x2; - method = JDCT_ISLOW; /* jidctred uses islow-style table */ - break; - case 4: - method_ptr = jpeg_idct_4x4; - method = JDCT_ISLOW; /* jidctred uses islow-style table */ - break; -#endif - case DCTSIZE: - switch (cinfo->dct_method) { -#ifdef DCT_ISLOW_SUPPORTED - case JDCT_ISLOW: - method_ptr = jpeg_idct_islow; - method = JDCT_ISLOW; - break; -#endif -#ifdef DCT_IFAST_SUPPORTED - case JDCT_IFAST: - method_ptr = jpeg_idct_ifast; - method = JDCT_IFAST; - break; -#endif -#ifdef DCT_FLOAT_SUPPORTED - case JDCT_FLOAT: - method_ptr = jpeg_idct_float; - method = JDCT_FLOAT; - break; -#endif - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } - break; - default: - ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size); - break; - } - idct->pub.inverse_DCT[ci] = method_ptr; - /* Create multiplier table from quant table. - * However, we can skip this if the component is uninteresting - * or if we already built the table. Also, if no quant table - * has yet been saved for the component, we leave the - * multiplier table all-zero; we'll be reading zeroes from the - * coefficient controller's buffer anyway. - */ - if (! compptr->component_needed || idct->cur_method[ci] == method) - continue; - qtbl = compptr->quant_table; - if (qtbl == NULL) /* happens if no data yet for component */ - continue; - idct->cur_method[ci] = method; - switch (method) { -#ifdef PROVIDE_ISLOW_TABLES - case JDCT_ISLOW: - { - /* For LL&M IDCT method, multipliers are equal to raw quantization - * coefficients, but are stored as ints to ensure access efficiency. - */ - ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table; - for (i = 0; i < DCTSIZE2; i++) { - ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i]; - } - } - break; -#endif -#ifdef DCT_IFAST_SUPPORTED - case JDCT_IFAST: - { - /* For AA&N IDCT method, multipliers are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - * For integer operation, the multiplier table is to be scaled by - * IFAST_SCALE_BITS. - */ - IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table; -#define CONST_BITS 14 - static const INT16 aanscales[DCTSIZE2] = { - /* precomputed values scaled up by 14 bits */ - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270, - 21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906, - 19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315, - 16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520, - 12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552, - 8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446, - 4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247 - }; - SHIFT_TEMPS - - for (i = 0; i < DCTSIZE2; i++) { - ifmtbl[i] = (IFAST_MULT_TYPE) - DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i], - (INT32) aanscales[i]), - CONST_BITS-IFAST_SCALE_BITS); - } - } - break; -#endif -#ifdef DCT_FLOAT_SUPPORTED - case JDCT_FLOAT: - { - /* For float AA&N IDCT method, multipliers are equal to quantization - * coefficients scaled by scalefactor[row]*scalefactor[col], where - * scalefactor[0] = 1 - * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 - */ - FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table; - int row, col; - static const double aanscalefactor[DCTSIZE] = { - 1.0, 1.387039845, 1.306562965, 1.175875602, - 1.0, 0.785694958, 0.541196100, 0.275899379 - }; - - i = 0; - for (row = 0; row < DCTSIZE; row++) { - for (col = 0; col < DCTSIZE; col++) { - fmtbl[i] = (FLOAT_MULT_TYPE) - ((double) qtbl->quantval[i] * - aanscalefactor[row] * aanscalefactor[col]); - i++; - } - } - } - break; -#endif - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } - } -} - - -/* - * Initialize IDCT manager. - */ - -GLOBAL(void) -jinit_inverse_dct (j_decompress_ptr cinfo) -{ - my_idct_ptr idct; - int ci; - jpeg_component_info *compptr; - - idct = (my_idct_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_idct_controller)); - cinfo->idct = (struct jpeg_inverse_dct *) idct; - idct->pub.start_pass = start_pass; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Allocate and pre-zero a multiplier table for each component */ - compptr->dct_table = - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(multiplier_table)); - MEMZERO(compptr->dct_table, SIZEOF(multiplier_table)); - /* Mark multiplier table not yet set up for any method */ - idct->cur_method[ci] = -1; - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.c deleted file mode 100755 index e7e0ab7..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.c +++ /dev/null @@ -1,625 +0,0 @@ -/* - * jdhuff.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains Huffman entropy decoding routines. - * - * Much of the complexity here has to do with supporting input suspension. - * If the data source module demands suspension, we want to be able to back - * up to the start of the current MCU. To do this, we copy state variables - * into local working storage, and update them back to the permanent - * storage only upon successful completion of an MCU. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdhuff.h" /* Declarations shared with jdphuff.c */ - - -/* - * Expanded entropy decoder object for Huffman decoding. - * - * The savable_state subrecord contains fields that change within an MCU, - * but must not be updated permanently until we complete the MCU. - */ - -typedef struct { - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ -} savable_state2; - -/* This macro is to work around compilers with missing or broken - * structure assignment. You'll need to fix this code if you have - * such a compiler and you change MAX_COMPS_IN_SCAN. - */ - -#ifndef NO_STRUCT_ASSIGN -#define ASSIGN_STATE(dest,src) ((dest) = (src)) -#else -#if MAX_COMPS_IN_SCAN == 4 -#define ASSIGN_STATE(dest,src) \ - ((dest).last_dc_val[0] = (src).last_dc_val[0], \ - (dest).last_dc_val[1] = (src).last_dc_val[1], \ - (dest).last_dc_val[2] = (src).last_dc_val[2], \ - (dest).last_dc_val[3] = (src).last_dc_val[3]) -#endif -#endif - - -typedef struct { - struct jpeg_entropy_decoder pub; /* public fields */ - - /* These fields are loaded into local variables at start of each MCU. - * In case of suspension, we exit WITHOUT updating them. - */ - bitread_perm_state bitstate; /* Bit buffer at start of MCU */ - savable_state2 saved; /* Other state at start of MCU */ - - /* These fields are NOT loaded into local working state. */ - unsigned int restarts_to_go; /* MCUs left in this restart interval */ - - /* Pointers to derived tables (these workspaces have image lifespan) */ - d_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; - d_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; - - /* Precalculated info set up by start_pass for use in decode_mcu: */ - - /* Pointers to derived tables to be used for each block within an MCU */ - d_derived_tbl * dc_cur_tbls[D_MAX_BLOCKS_IN_MCU]; - d_derived_tbl * ac_cur_tbls[D_MAX_BLOCKS_IN_MCU]; - /* Whether we care about the DC and AC coefficient values for each block */ - boolean dc_needed[D_MAX_BLOCKS_IN_MCU]; - boolean ac_needed[D_MAX_BLOCKS_IN_MCU]; -} huff_entropy_decoder2; - -typedef huff_entropy_decoder2 * huff_entropy_ptr2; - - -/* - * Initialize for a Huffman-compressed scan. - */ - -METHODDEF(void) -start_pass_huff_decoder (j_decompress_ptr cinfo) -{ - huff_entropy_ptr2 entropy = (huff_entropy_ptr2) cinfo->entropy; - int ci, blkn, dctbl, actbl; - jpeg_component_info * compptr; - - /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. - * This ought to be an error condition, but we make it a warning because - * there are some baseline files out there with all zeroes in these bytes. - */ - if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 || - cinfo->Ah != 0 || cinfo->Al != 0) - WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - dctbl = compptr->dc_tbl_no; - actbl = compptr->ac_tbl_no; - /* Compute derived values for Huffman tables */ - /* We may do this more than once for a table, but it's not expensive */ - jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl, - & entropy->dc_derived_tbls[dctbl]); - jpeg_make_d_derived_tbl(cinfo, FALSE, actbl, - & entropy->ac_derived_tbls[actbl]); - /* Initialize DC predictions to 0 */ - entropy->saved.last_dc_val[ci] = 0; - } - - /* Precalculate decoding info for each block in an MCU of this scan */ - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - /* Precalculate which table to use for each block */ - entropy->dc_cur_tbls[blkn] = entropy->dc_derived_tbls[compptr->dc_tbl_no]; - entropy->ac_cur_tbls[blkn] = entropy->ac_derived_tbls[compptr->ac_tbl_no]; - /* Decide whether we really care about the coefficient values */ - if (compptr->component_needed) { - entropy->dc_needed[blkn] = TRUE; - /* we don't need the ACs if producing a 1/8th-size image */ - entropy->ac_needed[blkn] = (compptr->DCT_scaled_size > 1); - } else { - entropy->dc_needed[blkn] = entropy->ac_needed[blkn] = FALSE; - } - } - - /* Initialize bitread state variables */ - entropy->bitstate.bits_left = 0; - entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ - entropy->pub.insufficient_data = FALSE; - - /* Initialize restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; -} - - -/* - * Compute the derived values for a Huffman table. - * This routine also performs some validation checks on the table. - * - * Note this is also used by jdphuff.c. - */ - -GLOBAL(void) -jpeg_make_d_derived_tbl (j_decompress_ptr cinfo, boolean isDC, int tblno, - d_derived_tbl ** pdtbl) -{ - JHUFF_TBL *htbl; - d_derived_tbl *dtbl; - int p, i, l, si, numsymbols; - int lookbits, ctr; - char huffsize[257]; - unsigned int huffcode[257]; - unsigned int code; - - /* Note that huffsize[] and huffcode[] are filled in code-length order, - * paralleling the order of the symbols themselves in htbl->huffval[]. - */ - - /* Find the input Huffman table */ - if (tblno < 0 || tblno >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); - htbl = - isDC ? cinfo->dc_huff_tbl_ptrs[tblno] : cinfo->ac_huff_tbl_ptrs[tblno]; - if (htbl == NULL) - ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tblno); - - /* Allocate a workspace if we haven't already done so. */ - if (*pdtbl == NULL) - *pdtbl = (d_derived_tbl *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(d_derived_tbl)); - dtbl = *pdtbl; - dtbl->pub = htbl; /* fill in back link */ - - /* Figure C.1: make table of Huffman code length for each symbol */ - - p = 0; - for (l = 1; l <= 16; l++) { - i = (int) htbl->bits[l]; - if (i < 0 || p + i > 256) /* protect against table overrun */ - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - while (i--) - huffsize[p++] = (char) l; - } - huffsize[p] = 0; - numsymbols = p; - - /* Figure C.2: generate the codes themselves */ - /* We also validate that the counts represent a legal Huffman code tree. */ - - code = 0; - si = huffsize[0]; - p = 0; - while (huffsize[p]) { - while (((int) huffsize[p]) == si) { - huffcode[p++] = code; - code++; - } - /* code is now 1 more than the last code used for codelength si; but - * it must still fit in si bits, since no code is allowed to be all ones. - */ - if (((INT32) code) >= (((INT32) 1) << si)) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - code <<= 1; - si++; - } - - /* Figure F.15: generate decoding tables for bit-sequential decoding */ - - p = 0; - for (l = 1; l <= 16; l++) { - if (htbl->bits[l]) { - /* valoffset[l] = huffval[] index of 1st symbol of code length l, - * minus the minimum code of length l - */ - dtbl->valoffset[l] = (INT32) p - (INT32) huffcode[p]; - p += htbl->bits[l]; - dtbl->maxcode[l] = huffcode[p-1]; /* maximum code of length l */ - } else { - dtbl->maxcode[l] = -1; /* -1 if no codes of this length */ - } - } - dtbl->maxcode[17] = 0xFFFFFL; /* ensures jpeg_huff_decode terminates */ - - /* Compute lookahead tables to speed up decoding. - * First we set all the table entries to 0, indicating "too long"; - * then we iterate through the Huffman codes that are short enough and - * fill in all the entries that correspond to bit sequences starting - * with that code. - */ - - MEMZERO(dtbl->look_nbits, SIZEOF(dtbl->look_nbits)); - - p = 0; - for (l = 1; l <= HUFF_LOOKAHEAD; l++) { - for (i = 1; i <= (int) htbl->bits[l]; i++, p++) { - /* l = current code's length, p = its index in huffcode[] & huffval[]. */ - /* Generate left-justified code followed by all possible bit sequences */ - lookbits = huffcode[p] << (HUFF_LOOKAHEAD-l); - for (ctr = 1 << (HUFF_LOOKAHEAD-l); ctr > 0; ctr--) { - dtbl->look_nbits[lookbits] = l; - dtbl->look_sym[lookbits] = htbl->huffval[p]; - lookbits++; - } - } - } - - /* Validate symbols as being reasonable. - * For AC tables, we make no check, but accept all byte values 0..255. - * For DC tables, we require the symbols to be in range 0..15. - * (Tighter bounds could be applied depending on the data depth and mode, - * but this is sufficient to ensure safe decoding.) - */ - if (isDC) { - for (i = 0; i < numsymbols; i++) { - int sym = htbl->huffval[i]; - if (sym < 0 || sym > 15) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - } - } -} - - -/* - * Out-of-line code for bit fetching (shared with jdphuff.c). - * See jdhuff.h for info about usage. - * Note: current values of get_buffer and bits_left are passed as parameters, - * but are returned in the corresponding fields of the state struct. - * - * On most machines MIN_GET_BITS should be 25 to allow the full 32-bit width - * of get_buffer to be used. (On machines with wider words, an even larger - * buffer could be used.) However, on some machines 32-bit shifts are - * quite slow and take time proportional to the number of places shifted. - * (This is true with most PC compilers, for instance.) In this case it may - * be a win to set MIN_GET_BITS to the minimum value of 15. This reduces the - * average shift distance at the cost of more calls to jpeg_fill_bit_buffer. - */ - -#ifdef SLOW_SHIFT_32 -#define MIN_GET_BITS 15 /* minimum allowable value */ -#else -#define MIN_GET_BITS (BIT_BUF_SIZE-7) -#endif - - -GLOBAL(boolean) -jpeg_fill_bit_buffer (bitread_working_state * state, - bit_buf_type get_buffer, int bits_left, - int nbits) -/* Load up the bit buffer to a depth of at least nbits */ -{ - /* Copy heavily used state fields into locals (hopefully registers) */ - const JOCTET * next_input_byte = state->next_input_byte; - size_t bytes_in_buffer = state->bytes_in_buffer; - j_decompress_ptr cinfo = state->cinfo; - - /* Attempt to load at least MIN_GET_BITS bits into get_buffer. */ - /* (It is assumed that no request will be for more than that many bits.) */ - /* We fail to do so only if we hit a marker or are forced to suspend. */ - - if (cinfo->unread_marker == 0) { /* cannot advance past a marker */ - while (bits_left < MIN_GET_BITS) { - int c; - - /* Attempt to read a byte */ - if (bytes_in_buffer == 0) { - if (! (*cinfo->src->fill_input_buffer) (cinfo)) - return FALSE; - next_input_byte = cinfo->src->next_input_byte; - bytes_in_buffer = cinfo->src->bytes_in_buffer; - } - bytes_in_buffer--; - c = GETJOCTET(*next_input_byte++); - - /* If it's 0xFF, check and discard stuffed zero byte */ - if (c == 0xFF) { - /* Loop here to discard any padding FF's on terminating marker, - * so that we can save a valid unread_marker value. NOTE: we will - * accept multiple FF's followed by a 0 as meaning a single FF data - * byte. This data pattern is not valid according to the standard. - */ - do { - if (bytes_in_buffer == 0) { - if (! (*cinfo->src->fill_input_buffer) (cinfo)) - return FALSE; - next_input_byte = cinfo->src->next_input_byte; - bytes_in_buffer = cinfo->src->bytes_in_buffer; - } - bytes_in_buffer--; - c = GETJOCTET(*next_input_byte++); - } while (c == 0xFF); - - if (c == 0) { - /* Found FF/00, which represents an FF data byte */ - c = 0xFF; - } else { - /* Oops, it's actually a marker indicating end of compressed data. - * Save the marker code for later use. - * Fine point: it might appear that we should save the marker into - * bitread working state, not straight into permanent state. But - * once we have hit a marker, we cannot need to suspend within the - * current MCU, because we will read no more bytes from the data - * source. So it is OK to update permanent state right away. - */ - cinfo->unread_marker = c; - /* See if we need to insert some fake zero bits. */ - goto no_more_bytes; - } - } - - /* OK, load c into get_buffer */ - get_buffer = (get_buffer << 8) | c; - bits_left += 8; - } /* end while */ - } else { - no_more_bytes: - /* We get here if we've read the marker that terminates the compressed - * data segment. There should be enough bits in the buffer register - * to satisfy the request; if so, no problem. - */ - if (nbits > bits_left) { - /* Uh-oh. Report corrupted data to user and stuff zeroes into - * the data stream, so that we can produce some kind of image. - * We use a nonvolatile flag to ensure that only one warning message - * appears per data segment. - */ - if (! cinfo->entropy->insufficient_data) { - WARNMS(cinfo, JWRN_HIT_MARKER); - cinfo->entropy->insufficient_data = TRUE; - } - /* Fill the buffer with zero bits */ - get_buffer <<= MIN_GET_BITS - bits_left; - bits_left = MIN_GET_BITS; - } - } - - /* Unload the local registers */ - state->next_input_byte = next_input_byte; - state->bytes_in_buffer = bytes_in_buffer; - state->get_buffer = get_buffer; - state->bits_left = bits_left; - - return TRUE; -} - - -/* - * Out-of-line code for Huffman code decoding. - * See jdhuff.h for info about usage. - */ - -GLOBAL(int) -jpeg_huff_decode (bitread_working_state * state, - bit_buf_type get_buffer, int bits_left, - d_derived_tbl * htbl, int min_bits) -{ - int l = min_bits; - INT32 code; - - /* HUFF_DECODE has determined that the code is at least min_bits */ - /* bits long, so fetch that many bits in one swoop. */ - - CHECK_BIT_BUFFER(*state, l, return -1); - code = GET_BITS(l); - - /* Collect the rest of the Huffman code one bit at a time. */ - /* This is per Figure F.16 in the JPEG spec. */ - - while (code > htbl->maxcode[l]) { - code <<= 1; - CHECK_BIT_BUFFER(*state, 1, return -1); - code |= GET_BITS(1); - l++; - } - - /* Unload the local registers */ - state->get_buffer = get_buffer; - state->bits_left = bits_left; - - /* With garbage input we may reach the sentinel value l = 17. */ - - if (l > 16) { - WARNMS(state->cinfo, JWRN_HUFF_BAD_CODE); - return 0; /* fake a zero as the safest result */ - } - - return htbl->pub->huffval[ (int) (code + htbl->valoffset[l]) ]; -} - - -/* - * Check for a restart marker & resynchronize decoder. - * Returns FALSE if must suspend. - */ - -LOCAL(boolean) -process_restart (j_decompress_ptr cinfo) -{ - huff_entropy_ptr2 entropy = (huff_entropy_ptr2) cinfo->entropy; - int ci; - - /* Throw away any unused bits remaining in bit buffer; */ - /* include any full bytes in next_marker's count of discarded bytes */ - cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; - entropy->bitstate.bits_left = 0; - - /* Advance past the RSTn marker */ - if (! (*cinfo->marker->read_restart_marker) (cinfo)) - return FALSE; - - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) - entropy->saved.last_dc_val[ci] = 0; - - /* Reset restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; - - /* Reset out-of-data flag, unless read_restart_marker left us smack up - * against a marker. In that case we will end up treating the next data - * segment as empty, and we can avoid producing bogus output pixels by - * leaving the flag set. - */ - if (cinfo->unread_marker == 0) - entropy->pub.insufficient_data = FALSE; - - return TRUE; -} - - -/* - * Decode and return one MCU's worth of Huffman-compressed coefficients. - * The coefficients are reordered from zigzag order into natural array order, - * but are not dequantized. - * - * The i'th block of the MCU is stored into the block pointed to by - * MCU_data[i]. WE ASSUME THIS AREA HAS BEEN ZEROED BY THE CALLER. - * (Wholesale zeroing is usually a little faster than retail...) - * - * Returns FALSE if data source requested suspension. In that case no - * changes have been made to permanent state. (Exception: some output - * coefficients may already have been assigned. This is harmless for - * this module, since we'll just re-assign them on the next call.) - */ - -METHODDEF(boolean) -decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - huff_entropy_ptr2 entropy = (huff_entropy_ptr2) cinfo->entropy; - int blkn; - BITREAD_STATE_VARS; - savable_state2 state; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restart(cinfo)) - return FALSE; - } - - /* If we've run out of data, just leave the MCU set to zeroes. - * This way, we return uniform gray for the remainder of the segment. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - ASSIGN_STATE(state, entropy->saved); - - /* Outer loop handles each block in the MCU */ - - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - JBLOCKROW block = MCU_data[blkn]; - d_derived_tbl * dctbl = entropy->dc_cur_tbls[blkn]; - d_derived_tbl * actbl = entropy->ac_cur_tbls[blkn]; - int s, k, r; - - /* Decode a single block's worth of coefficients */ - - /* Section F.2.2.1: decode the DC coefficient difference */ - HUFF_DECODE(s, br_state, dctbl, return FALSE, label1); - if (s) { - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - } - - if (entropy->dc_needed[blkn]) { - /* Convert DC difference to actual value, update last_dc_val */ - int ci = cinfo->MCU_membership[blkn]; - s += state.last_dc_val[ci]; - state.last_dc_val[ci] = s; - /* Output the DC coefficient (assumes jpeg_natural_order[0] = 0) */ - (*block)[0] = (JCOEF) s; - } - - if (entropy->ac_needed[blkn]) { - - /* Section F.2.2.2: decode the AC coefficients */ - /* Since zeroes are skipped, output area must be cleared beforehand */ - for (k = 1; k < DCTSIZE2; k++) { - HUFF_DECODE(s, br_state, actbl, return FALSE, label2); - - r = s >> 4; - s &= 15; - - if (s) { - k += r; - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - /* Output coefficient in natural (dezigzagged) order. - * Note: the extra entries in jpeg_natural_order[] will save us - * if k >= DCTSIZE2, which could happen if the data is corrupted. - */ - (*block)[jpeg_natural_order[k]] = (JCOEF) s; - } else { - if (r != 15) - break; - k += 15; - } - } - - } else { - - /* Section F.2.2.2: decode the AC coefficients */ - /* In this path we just discard the values */ - for (k = 1; k < DCTSIZE2; k++) { - HUFF_DECODE(s, br_state, actbl, return FALSE, label3); - - r = s >> 4; - s &= 15; - - if (s) { - k += r; - CHECK_BIT_BUFFER(br_state, s, return FALSE); - DROP_BITS(s); - } else { - if (r != 15) - break; - k += 15; - } - } - - } - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - ASSIGN_STATE(entropy->saved, state); - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * Module initialization routine for Huffman entropy decoding. - */ - -GLOBAL(void) -jinit_huff_decoder (j_decompress_ptr cinfo) -{ - huff_entropy_ptr2 entropy; - int i; - - entropy = (huff_entropy_ptr2) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(huff_entropy_decoder2)); - cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; - entropy->pub.start_pass = start_pass_huff_decoder; - entropy->pub.decode_mcu = decode_mcu; - - /* Mark tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.h deleted file mode 100755 index 56b50b6..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdhuff.h +++ /dev/null @@ -1,206 +0,0 @@ -/* - * jdhuff.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains declarations for Huffman entropy decoding routines - * that are shared between the sequential decoder (jdhuff.c) and the - * progressive decoder (jdphuff.c). No other modules need to see these. - */ - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifndef __jdhuff_h__ -#define __jdhuff_h__ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_make_d_derived_tbl jMkDDerived -#define jpeg_fill_bit_buffer jFilBitBuf -#define jpeg_huff_decode jHufDecode -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Derived data constructed for each Huffman table */ - -#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */ - -typedef struct { - /* Basic tables: (element [0] of each array is unused) */ - INT32 maxcode[18]; /* largest code of length k (-1 if none) */ - /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */ - INT32 valoffset[17]; /* huffval[] offset for codes of length k */ - /* valoffset[k] = huffval[] index of 1st symbol of code length k, less - * the smallest code of length k; so given a code of length k, the - * corresponding symbol is huffval[code + valoffset[k]] - */ - - /* Link to public Huffman table (needed only in jpeg_huff_decode) */ - JHUFF_TBL *pub; - - /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of - * the input data stream. If the next Huffman code is no more - * than HUFF_LOOKAHEAD bits long, we can obtain its length and - * the corresponding symbol directly from these tables. - */ - int look_nbits[1< 32 bits on your machine, and shifting/masking longs is - * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE - * appropriately should be a win. Unfortunately we can't define the size - * with something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8) - * because not all machines measure sizeof in 8-bit bytes. - */ - -typedef struct { /* Bitreading state saved across MCUs */ - bit_buf_type get_buffer; /* current bit-extraction buffer */ - int bits_left; /* # of unused bits in it */ -} bitread_perm_state; - -typedef struct { /* Bitreading working state within an MCU */ - /* Current data source location */ - /* We need a copy, rather than munging the original, in case of suspension */ - const JOCTET * next_input_byte; /* => next byte to read from source */ - size_t bytes_in_buffer; /* # of bytes remaining in source buffer */ - /* Bit input buffer --- note these values are kept in variables, - * not in this struct, inside the inner loops. - */ - bit_buf_type get_buffer; /* current bit-extraction buffer */ - int bits_left; /* # of unused bits in it */ - /* Pointer needed by jpeg_fill_bit_buffer. */ - j_decompress_ptr cinfo; /* back link to decompress master record */ -} bitread_working_state; - -/* Macros to declare and load/save bitread local variables. */ -#define BITREAD_STATE_VARS \ - bit_buf_type get_buffer; \ - int bits_left; \ - bitread_working_state br_state - -#define BITREAD_LOAD_STATE(cinfop,permstate) \ - br_state.cinfo = cinfop; \ - br_state.next_input_byte = cinfop->src->next_input_byte; \ - br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \ - get_buffer = permstate.get_buffer; \ - bits_left = permstate.bits_left; - -#define BITREAD_SAVE_STATE(cinfop,permstate) \ - cinfop->src->next_input_byte = br_state.next_input_byte; \ - cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \ - permstate.get_buffer = get_buffer; \ - permstate.bits_left = bits_left - -/* - * These macros provide the in-line portion of bit fetching. - * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer - * before using GET_BITS, PEEK_BITS, or DROP_BITS. - * The variables get_buffer and bits_left are assumed to be locals, - * but the state struct might not be (jpeg_huff_decode needs this). - * CHECK_BIT_BUFFER(state,n,action); - * Ensure there are N bits in get_buffer; if suspend, take action. - * val = GET_BITS(n); - * Fetch next N bits. - * val = PEEK_BITS(n); - * Fetch next N bits without removing them from the buffer. - * DROP_BITS(n); - * Discard next N bits. - * The value N should be a simple variable, not an expression, because it - * is evaluated multiple times. - */ - -#define CHECK_BIT_BUFFER(state,nbits,action) \ - { if (bits_left < (nbits)) { \ - if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \ - { action; } \ - get_buffer = (state).get_buffer; bits_left = (state).bits_left; } } - -#define GET_BITS(nbits) \ - (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1)) - -#define PEEK_BITS(nbits) \ - (((int) (get_buffer >> (bits_left - (nbits)))) & ((1<<(nbits))-1)) - -#define DROP_BITS(nbits) \ - (bits_left -= (nbits)) - -/* Load up the bit buffer to a depth of at least nbits */ -EXTERN(boolean) jpeg_fill_bit_buffer - JPP((bitread_working_state * state, bit_buf_type get_buffer, - int bits_left, int nbits)); - - -/* - * Code for extracting next Huffman-coded symbol from input bit stream. - * Again, this is time-critical and we make the main paths be macros. - * - * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits - * without looping. Usually, more than 95% of the Huffman codes will be 8 - * or fewer bits long. The few overlength codes are handled with a loop, - * which need not be inline code. - * - * Notes about the HUFF_DECODE macro: - * 1. Near the end of the data segment, we may fail to get enough bits - * for a lookahead. In that case, we do it the hard way. - * 2. If the lookahead table contains no entry, the next code must be - * more than HUFF_LOOKAHEAD bits long. - * 3. jpeg_huff_decode returns -1 if forced to suspend. - */ - -#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \ -{ int nb, look; \ - if (bits_left < HUFF_LOOKAHEAD) { \ - if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \ - get_buffer = state.get_buffer; bits_left = state.bits_left; \ - if (bits_left < HUFF_LOOKAHEAD) { \ - nb = 1; goto slowlabel; \ - } \ - } \ - look = PEEK_BITS(HUFF_LOOKAHEAD); \ - if ((nb = htbl->look_nbits[look]) != 0) { \ - DROP_BITS(nb); \ - result = htbl->look_sym[look]; \ - } else { \ - nb = HUFF_LOOKAHEAD+1; \ -slowlabel: \ - if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \ - { failaction; } \ - get_buffer = state.get_buffer; bits_left = state.bits_left; \ - } \ -} - -/* Out-of-line case for Huffman code fetching */ -EXTERN(int) jpeg_huff_decode - JPP((bitread_working_state * state, bit_buf_type get_buffer, - int bits_left, d_derived_tbl * htbl, int min_bits)); - -#endif diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdinput.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdinput.c deleted file mode 100755 index 621b714..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdinput.c +++ /dev/null @@ -1,381 +0,0 @@ -/* - * jdinput.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains input control logic for the JPEG decompressor. - * These routines are concerned with controlling the decompressor's input - * processing (marker reading and coefficient decoding). The actual input - * reading is done in jdmarker.c, jdhuff.c, and jdphuff.c. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private state */ - -typedef struct { - struct jpeg_input_controller pub; /* public fields */ - - boolean inheaders; /* TRUE until first SOS is reached */ -} my_input_controller; - -typedef my_input_controller * my_inputctl_ptr; - - -/* Forward declarations */ -METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo)); - - -/* - * Routines to calculate various quantities related to the size of the image. - */ - -LOCAL(void) -initial_setup2 (j_decompress_ptr cinfo) -/* Called once, when first SOS marker is reached */ -{ - int ci; - jpeg_component_info *compptr; - - /* Make sure image isn't bigger than I can handle */ - if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION || - (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION) - ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION); - - /* For now, precision must match compiled-in value... */ - if (cinfo->data_precision != BITS_IN_JSAMPLE) - ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision); - - /* Check that number of components won't exceed internal array sizes */ - if (cinfo->num_components > MAX_COMPONENTS) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components, - MAX_COMPONENTS); - - /* Compute maximum sampling factors; check factor validity */ - cinfo->max_h_samp_factor = 1; - cinfo->max_v_samp_factor = 1; - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR || - compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR) - ERREXIT(cinfo, JERR_BAD_SAMPLING); - cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor, - compptr->h_samp_factor); - cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor, - compptr->v_samp_factor); - } - - /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE. - * In the full decompressor, this will be overridden by jdmaster.c; - * but in the transcoder, jdmaster.c is not used, so we must do it here. - */ - cinfo->min_DCT_scaled_size = DCTSIZE; - - /* Compute dimensions of components */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - compptr->DCT_scaled_size = DCTSIZE; - /* Size in DCT blocks */ - compptr->width_in_blocks = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) (cinfo->max_h_samp_factor * DCTSIZE)); - compptr->height_in_blocks = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) (cinfo->max_v_samp_factor * DCTSIZE)); - /* downsampled_width and downsampled_height will also be overridden by - * jdmaster.c if we are doing full decompression. The transcoder library - * doesn't use these values, but the calling application might. - */ - /* Size in samples */ - compptr->downsampled_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, - (long) cinfo->max_h_samp_factor); - compptr->downsampled_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, - (long) cinfo->max_v_samp_factor); - /* Mark component needed, until color conversion says otherwise */ - compptr->component_needed = TRUE; - /* Mark no quantization table yet saved for component */ - compptr->quant_table = NULL; - } - - /* Compute number of fully interleaved MCU rows. */ - cinfo->total_iMCU_rows = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); - - /* Decide whether file contains multiple scans */ - if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode) - cinfo->inputctl->has_multiple_scans = TRUE; - else - cinfo->inputctl->has_multiple_scans = FALSE; -} - - -LOCAL(void) -per_scan_setup2 (j_decompress_ptr cinfo) -/* Do computations that are needed before processing a JPEG scan */ -/* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */ -{ - int ci, mcublks, tmp; - jpeg_component_info *compptr; - - if (cinfo->comps_in_scan == 1) { - - /* Noninterleaved (single-component) scan */ - compptr = cinfo->cur_comp_info[0]; - - /* Overall image size in MCUs */ - cinfo->MCUs_per_row = compptr->width_in_blocks; - cinfo->MCU_rows_in_scan = compptr->height_in_blocks; - - /* For noninterleaved scan, always one block per MCU */ - compptr->MCU_width = 1; - compptr->MCU_height = 1; - compptr->MCU_blocks = 1; - compptr->MCU_sample_width = compptr->DCT_scaled_size; - compptr->last_col_width = 1; - /* For noninterleaved scans, it is convenient to define last_row_height - * as the number of block rows present in the last iMCU row. - */ - tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor); - if (tmp == 0) tmp = compptr->v_samp_factor; - compptr->last_row_height = tmp; - - /* Prepare array describing MCU composition */ - cinfo->blocks_in_MCU = 1; - cinfo->MCU_membership[0] = 0; - - } else { - - /* Interleaved (multi-component) scan */ - if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN) - ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan, - MAX_COMPS_IN_SCAN); - - /* Overall image size in MCUs */ - cinfo->MCUs_per_row = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, - (long) (cinfo->max_h_samp_factor*DCTSIZE)); - cinfo->MCU_rows_in_scan = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, - (long) (cinfo->max_v_samp_factor*DCTSIZE)); - - cinfo->blocks_in_MCU = 0; - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Sampling factors give # of blocks of component in each MCU */ - compptr->MCU_width = compptr->h_samp_factor; - compptr->MCU_height = compptr->v_samp_factor; - compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height; - compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_scaled_size; - /* Figure number of non-dummy blocks in last MCU column & row */ - tmp = (int) (compptr->width_in_blocks % compptr->MCU_width); - if (tmp == 0) tmp = compptr->MCU_width; - compptr->last_col_width = tmp; - tmp = (int) (compptr->height_in_blocks % compptr->MCU_height); - if (tmp == 0) tmp = compptr->MCU_height; - compptr->last_row_height = tmp; - /* Prepare array describing MCU composition */ - mcublks = compptr->MCU_blocks; - if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU) - ERREXIT(cinfo, JERR_BAD_MCU_SIZE); - while (mcublks-- > 0) { - cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci; - } - } - - } -} - - -/* - * Save away a copy of the Q-table referenced by each component present - * in the current scan, unless already saved during a prior scan. - * - * In a multiple-scan JPEG file, the encoder could assign different components - * the same Q-table slot number, but change table definitions between scans - * so that each component uses a different Q-table. (The IJG encoder is not - * currently capable of doing this, but other encoders might.) Since we want - * to be able to dequantize all the components at the end of the file, this - * means that we have to save away the table actually used for each component. - * We do this by copying the table at the start of the first scan containing - * the component. - * The JPEG spec prohibits the encoder from changing the contents of a Q-table - * slot between scans of a component using that slot. If the encoder does so - * anyway, this decoder will simply use the Q-table values that were current - * at the start of the first scan for the component. - * - * The decompressor output side looks only at the saved quant tables, - * not at the current Q-table slots. - */ - -LOCAL(void) -latch_quant_tables (j_decompress_ptr cinfo) -{ - int ci, qtblno; - jpeg_component_info *compptr; - JQUANT_TBL * qtbl; - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* No work if we already saved Q-table for this component */ - if (compptr->quant_table != NULL) - continue; - /* Make sure specified quantization table is present */ - qtblno = compptr->quant_tbl_no; - if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS || - cinfo->quant_tbl_ptrs[qtblno] == NULL) - ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno); - /* OK, save away the quantization table */ - qtbl = (JQUANT_TBL *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(JQUANT_TBL)); - MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL)); - compptr->quant_table = qtbl; - } -} - - -/* - * Initialize the input modules to read a scan of compressed data. - * The first call to this is done by jdmaster.c after initializing - * the entire decompressor (during jpeg_start_decompress). - * Subsequent calls come from consume_markers, below. - */ - -METHODDEF(void) -start_input_pass2 (j_decompress_ptr cinfo) -{ - per_scan_setup2(cinfo); - latch_quant_tables(cinfo); - (*cinfo->entropy->start_pass) (cinfo); - (*cinfo->coef->start_input_pass) (cinfo); - cinfo->inputctl->consume_input = cinfo->coef->consume_data; -} - - -/* - * Finish up after inputting a compressed-data scan. - * This is called by the coefficient controller after it's read all - * the expected data of the scan. - */ - -METHODDEF(void) -finish_input_pass (j_decompress_ptr cinfo) -{ - cinfo->inputctl->consume_input = consume_markers; -} - - -/* - * Read JPEG markers before, between, or after compressed-data scans. - * Change state as necessary when a new scan is reached. - * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. - * - * The consume_input method pointer points either here or to the - * coefficient controller's consume_data routine, depending on whether - * we are reading a compressed data segment or inter-segment markers. - */ - -METHODDEF(int) -consume_markers (j_decompress_ptr cinfo) -{ - my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; - int val; - - if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */ - return JPEG_REACHED_EOI; - - val = (*cinfo->marker->read_markers) (cinfo); - - switch (val) { - case JPEG_REACHED_SOS: /* Found SOS */ - if (inputctl->inheaders) { /* 1st SOS */ - initial_setup2(cinfo); - inputctl->inheaders = FALSE; - /* Note: start_input_pass must be called by jdmaster.c - * before any more input can be consumed. jdapimin.c is - * responsible for enforcing this sequencing. - */ - } else { /* 2nd or later SOS marker */ - if (! inputctl->pub.has_multiple_scans) - ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ - start_input_pass2(cinfo); - } - break; - case JPEG_REACHED_EOI: /* Found EOI */ - inputctl->pub.eoi_reached = TRUE; - if (inputctl->inheaders) { /* Tables-only datastream, apparently */ - if (cinfo->marker->saw_SOF) - ERREXIT(cinfo, JERR_SOF_NO_SOS); - } else { - /* Prevent infinite loop in coef ctlr's decompress_data routine - * if user set output_scan_number larger than number of scans. - */ - if (cinfo->output_scan_number > cinfo->input_scan_number) - cinfo->output_scan_number = cinfo->input_scan_number; - } - break; - case JPEG_SUSPENDED: - break; - } - - return val; -} - - -/* - * Reset state to begin a fresh datastream. - */ - -METHODDEF(void) -reset_input_controller (j_decompress_ptr cinfo) -{ - my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl; - - inputctl->pub.consume_input = consume_markers; - inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ - inputctl->pub.eoi_reached = FALSE; - inputctl->inheaders = TRUE; - /* Reset other modules */ - (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); - (*cinfo->marker->reset_marker_reader) (cinfo); - /* Reset progression state -- would be cleaner if entropy decoder did this */ - cinfo->coef_bits = NULL; -} - - -/* - * Initialize the input controller module. - * This is called only once, when the decompression object is created. - */ - -GLOBAL(void) -jinit_input_controller (j_decompress_ptr cinfo) -{ - my_inputctl_ptr inputctl; - - /* Create subobject in permanent pool */ - inputctl = (my_inputctl_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - SIZEOF(my_input_controller)); - cinfo->inputctl = (struct jpeg_input_controller *) inputctl; - /* Initialize method pointers */ - inputctl->pub.consume_input = consume_markers; - inputctl->pub.reset_input_controller = reset_input_controller; - inputctl->pub.start_input_pass = start_input_pass2; - inputctl->pub.finish_input_pass = finish_input_pass; - /* Initialize state: can't use reset_input_controller since we don't - * want to try to reset other modules yet. - */ - inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ - inputctl->pub.eoi_reached = FALSE; - inputctl->inheaders = TRUE; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmainct.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmainct.c deleted file mode 100755 index ee23fa8..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmainct.c +++ /dev/null @@ -1,512 +0,0 @@ -/* - * jdmainct.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the main buffer controller for decompression. - * The main buffer lies between the JPEG decompressor proper and the - * post-processor; it holds downsampled data in the JPEG colorspace. - * - * Note that this code is bypassed in raw-data mode, since the application - * supplies the equivalent of the main buffer in that case. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * In the current system design, the main buffer need never be a full-image - * buffer; any full-height buffers will be found inside the coefficient or - * postprocessing controllers. Nonetheless, the main controller is not - * trivial. Its responsibility is to provide context rows for upsampling/ - * rescaling, and doing this in an efficient fashion is a bit tricky. - * - * Postprocessor input data is counted in "row groups". A row group - * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) - * sample rows of each component. (We require DCT_scaled_size values to be - * chosen such that these numbers are integers. In practice DCT_scaled_size - * values will likely be powers of two, so we actually have the stronger - * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.) - * Upsampling will typically produce max_v_samp_factor pixel rows from each - * row group (times any additional scale factor that the upsampler is - * applying). - * - * The coefficient controller will deliver data to us one iMCU row at a time; - * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or - * exactly min_DCT_scaled_size row groups. (This amount of data corresponds - * to one row of MCUs when the image is fully interleaved.) Note that the - * number of sample rows varies across components, but the number of row - * groups does not. Some garbage sample rows may be included in the last iMCU - * row at the bottom of the image. - * - * Depending on the vertical scaling algorithm used, the upsampler may need - * access to the sample row(s) above and below its current input row group. - * The upsampler is required to set need_context_rows TRUE at global selection - * time if so. When need_context_rows is FALSE, this controller can simply - * obtain one iMCU row at a time from the coefficient controller and dole it - * out as row groups to the postprocessor. - * - * When need_context_rows is TRUE, this controller guarantees that the buffer - * passed to postprocessing contains at least one row group's worth of samples - * above and below the row group(s) being processed. Note that the context - * rows "above" the first passed row group appear at negative row offsets in - * the passed buffer. At the top and bottom of the image, the required - * context rows are manufactured by duplicating the first or last real sample - * row; this avoids having special cases in the upsampling inner loops. - * - * The amount of context is fixed at one row group just because that's a - * convenient number for this controller to work with. The existing - * upsamplers really only need one sample row of context. An upsampler - * supporting arbitrary output rescaling might wish for more than one row - * group of context when shrinking the image; tough, we don't handle that. - * (This is justified by the assumption that downsizing will be handled mostly - * by adjusting the DCT_scaled_size values, so that the actual scale factor at - * the upsample step needn't be much less than one.) - * - * To provide the desired context, we have to retain the last two row groups - * of one iMCU row while reading in the next iMCU row. (The last row group - * can't be processed until we have another row group for its below-context, - * and so we have to save the next-to-last group too for its above-context.) - * We could do this most simply by copying data around in our buffer, but - * that'd be very slow. We can avoid copying any data by creating a rather - * strange pointer structure. Here's how it works. We allocate a workspace - * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number - * of row groups per iMCU row). We create two sets of redundant pointers to - * the workspace. Labeling the physical row groups 0 to M+1, the synthesized - * pointer lists look like this: - * M+1 M-1 - * master pointer --> 0 master pointer --> 0 - * 1 1 - * ... ... - * M-3 M-3 - * M-2 M - * M-1 M+1 - * M M-2 - * M+1 M-1 - * 0 0 - * We read alternate iMCU rows using each master pointer; thus the last two - * row groups of the previous iMCU row remain un-overwritten in the workspace. - * The pointer lists are set up so that the required context rows appear to - * be adjacent to the proper places when we pass the pointer lists to the - * upsampler. - * - * The above pictures describe the normal state of the pointer lists. - * At top and bottom of the image, we diddle the pointer lists to duplicate - * the first or last sample row as necessary (this is cheaper than copying - * sample rows around). - * - * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1. In that - * situation each iMCU row provides only one row group so the buffering logic - * must be different (eg, we must read two iMCU rows before we can emit the - * first row group). For now, we simply do not support providing context - * rows when min_DCT_scaled_size is 1. That combination seems unlikely to - * be worth providing --- if someone wants a 1/8th-size preview, they probably - * want it quick and dirty, so a context-free upsampler is sufficient. - */ - - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_d_main_controller pub; /* public fields */ - - /* Pointer to allocated workspace (M or M+2 row groups). */ - JSAMPARRAY buffer[MAX_COMPONENTS]; - - boolean buffer_full; /* Have we gotten an iMCU row from decoder? */ - JDIMENSION rowgroup_ctr; /* counts row groups output to postprocessor */ - - /* Remaining fields are only used in the context case. */ - - /* These are the master pointers to the funny-order pointer lists. */ - JSAMPIMAGE xbuffer[2]; /* pointers to weird pointer lists */ - - int whichptr; /* indicates which pointer set is now in use */ - int context_state; /* process_data state machine status */ - JDIMENSION rowgroups_avail; /* row groups available to postprocessor */ - JDIMENSION iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */ -} my_main_controller4; - -typedef my_main_controller4 * my_main_ptr4; - -/* context_state values: */ -#define CTX_PREPARE_FOR_IMCU 0 /* need to prepare for MCU row */ -#define CTX_PROCESS_IMCU 1 /* feeding iMCU to postprocessor */ -#define CTX_POSTPONED_ROW 2 /* feeding postponed row group */ - - -/* Forward declarations */ -METHODDEF(void) process_data_simple_main2 - JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); -METHODDEF(void) process_data_context_main - JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); -#ifdef QUANT_2PASS_SUPPORTED -METHODDEF(void) process_data_crank_post - JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail)); -#endif - - -LOCAL(void) -alloc_funny_pointers (j_decompress_ptr cinfo) -/* Allocate space for the funny pointer lists. - * This is done only once, not once per pass. - */ -{ - my_main_ptr4 main_ = (my_main_ptr4) cinfo->main; - int ci, rgroup; - int M = cinfo->min_DCT_scaled_size; - jpeg_component_info *compptr; - JSAMPARRAY xbuf; - - /* Get top-level space for component array pointers. - * We alloc both arrays with one call to save a few cycles. - */ - main_->xbuffer[0] = (JSAMPIMAGE) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components * 2 * SIZEOF(JSAMPARRAY)); - main_->xbuffer[1] = main_->xbuffer[0] + cinfo->num_components; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - /* Get space for pointer lists --- M+4 row groups in each list. - * We alloc both pointer lists with one call to save a few cycles. - */ - xbuf = (JSAMPARRAY) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW)); - xbuf += rgroup; /* want one row group at negative offsets */ - main_->xbuffer[0][ci] = xbuf; - xbuf += rgroup * (M + 4); - main_->xbuffer[1][ci] = xbuf; - } -} - - -LOCAL(void) -make_funny_pointers (j_decompress_ptr cinfo) -/* Create the funny pointer lists discussed in the comments above. - * The actual workspace is already allocated (in main->buffer), - * and the space for the pointer lists is allocated too. - * This routine just fills in the curiously ordered lists. - * This will be repeated at the beginning of each pass. - */ -{ - my_main_ptr4 main_ = (my_main_ptr4) cinfo->main; - int ci, i, rgroup; - int M = cinfo->min_DCT_scaled_size; - jpeg_component_info *compptr; - JSAMPARRAY buf, xbuf0, xbuf1; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - xbuf0 = main_->xbuffer[0][ci]; - xbuf1 = main_->xbuffer[1][ci]; - /* First copy the workspace pointers as-is */ - buf = main_->buffer[ci]; - for (i = 0; i < rgroup * (M + 2); i++) { - xbuf0[i] = xbuf1[i] = buf[i]; - } - /* In the second list, put the last four row groups in swapped order */ - for (i = 0; i < rgroup * 2; i++) { - xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i]; - xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i]; - } - /* The wraparound pointers at top and bottom will be filled later - * (see set_wraparound_pointers, below). Initially we want the "above" - * pointers to duplicate the first actual data line. This only needs - * to happen in xbuffer[0]. - */ - for (i = 0; i < rgroup; i++) { - xbuf0[i - rgroup] = xbuf0[0]; - } - } -} - - -LOCAL(void) -set_wraparound_pointers (j_decompress_ptr cinfo) -/* Set up the "wraparound" pointers at top and bottom of the pointer lists. - * This changes the pointer list state from top-of-image to the normal state. - */ -{ - my_main_ptr4 main_ = (my_main_ptr4) cinfo->main; - int ci, i, rgroup; - int M = cinfo->min_DCT_scaled_size; - jpeg_component_info *compptr; - JSAMPARRAY xbuf0, xbuf1; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - xbuf0 = main_->xbuffer[0][ci]; - xbuf1 = main_->xbuffer[1][ci]; - for (i = 0; i < rgroup; i++) { - xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i]; - xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i]; - xbuf0[rgroup*(M+2) + i] = xbuf0[i]; - xbuf1[rgroup*(M+2) + i] = xbuf1[i]; - } - } -} - - -LOCAL(void) -set_bottom_pointers (j_decompress_ptr cinfo) -/* Change the pointer lists to duplicate the last sample row at the bottom - * of the image. whichptr indicates which xbuffer holds the final iMCU row. - * Also sets rowgroups_avail to indicate number of nondummy row groups in row. - */ -{ - my_main_ptr4 main_ = (my_main_ptr4) cinfo->main; - int ci, i, rgroup, iMCUheight, rows_left; - jpeg_component_info *compptr; - JSAMPARRAY xbuf; - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Count sample rows in one iMCU row and in one row group */ - iMCUheight = compptr->v_samp_factor * compptr->DCT_scaled_size; - rgroup = iMCUheight / cinfo->min_DCT_scaled_size; - /* Count nondummy sample rows remaining for this component */ - rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight); - if (rows_left == 0) rows_left = iMCUheight; - /* Count nondummy row groups. Should get same answer for each component, - * so we need only do it once. - */ - if (ci == 0) { - main_->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1); - } - /* Duplicate the last real sample row rgroup*2 times; this pads out the - * last partial rowgroup and ensures at least one full rowgroup of context. - */ - xbuf = main_->xbuffer[main_->whichptr][ci]; - for (i = 0; i < rgroup * 2; i++) { - xbuf[rows_left + i] = xbuf[rows_left-1]; - } - } -} - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_main2 (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_main_ptr4 main_ = (my_main_ptr4) cinfo->main; - - switch (pass_mode) { - case JBUF_PASS_THRU: - if (cinfo->upsample->need_context_rows) { - main_->pub.process_data = process_data_context_main; - make_funny_pointers(cinfo); /* Create the xbuffer[] lists */ - main_->whichptr = 0; /* Read first iMCU row into xbuffer[0] */ - main_->context_state = CTX_PREPARE_FOR_IMCU; - main_->iMCU_row_ctr = 0; - } else { - /* Simple case with no context needed */ - main_->pub.process_data = process_data_simple_main2; - } - main_->buffer_full = FALSE; /* Mark buffer empty */ - main_->rowgroup_ctr = 0; - break; -#ifdef QUANT_2PASS_SUPPORTED - case JBUF_CRANK_DEST: - /* For last pass of 2-pass quantization, just crank the postprocessor */ - main_->pub.process_data = process_data_crank_post; - break; -#endif - default: - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - break; - } -} - - -/* - * Process some data. - * This handles the simple case where no context is required. - */ - -METHODDEF(void) -process_data_simple_main2 (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_main_ptr4 main_ = (my_main_ptr4) cinfo->main; - JDIMENSION rowgroups_avail; - - /* Read input data if we haven't filled the main buffer yet */ - if (! main_->buffer_full) { - if (! (*cinfo->coef->decompress_data) (cinfo, main_->buffer)) - return; /* suspension forced, can do nothing more */ - main_->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ - } - - /* There are always min_DCT_scaled_size row groups in an iMCU row. */ - rowgroups_avail = (JDIMENSION) cinfo->min_DCT_scaled_size; - /* Note: at the bottom of the image, we may pass extra garbage row groups - * to the postprocessor. The postprocessor has to check for bottom - * of image anyway (at row resolution), so no point in us doing it too. - */ - - /* Feed the postprocessor */ - (*cinfo->post->post_process_data) (cinfo, main_->buffer, - &main_->rowgroup_ctr, rowgroups_avail, - output_buf, out_row_ctr, out_rows_avail); - - /* Has postprocessor consumed all the data yet? If so, mark buffer empty */ - if (main_->rowgroup_ctr >= rowgroups_avail) { - main_->buffer_full = FALSE; - main_->rowgroup_ctr = 0; - } -} - - -/* - * Process some data. - * This handles the case where context rows must be provided. - */ - -METHODDEF(void) -process_data_context_main (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_main_ptr4 main_ = (my_main_ptr4) cinfo->main; - - /* Read input data if we haven't filled the main buffer yet */ - if (! main_->buffer_full) { - if (! (*cinfo->coef->decompress_data) (cinfo, - main_->xbuffer[main_->whichptr])) - return; /* suspension forced, can do nothing more */ - main_->buffer_full = TRUE; /* OK, we have an iMCU row to work with */ - main_->iMCU_row_ctr++; /* count rows received */ - } - - /* Postprocessor typically will not swallow all the input data it is handed - * in one call (due to filling the output buffer first). Must be prepared - * to exit and restart. This switch lets us keep track of how far we got. - * Note that each case falls through to the next on successful completion. - */ - switch (main_->context_state) { - case CTX_POSTPONED_ROW: - /* Call postprocessor using previously set pointers for postponed row */ - (*cinfo->post->post_process_data) (cinfo, main_->xbuffer[main_->whichptr], - &main_->rowgroup_ctr, main_->rowgroups_avail, - output_buf, out_row_ctr, out_rows_avail); - if (main_->rowgroup_ctr < main_->rowgroups_avail) - return; /* Need to suspend */ - main_->context_state = CTX_PREPARE_FOR_IMCU; - if (*out_row_ctr >= out_rows_avail) - return; /* Postprocessor exactly filled output buf */ - /*FALLTHROUGH*/ - case CTX_PREPARE_FOR_IMCU: - /* Prepare to process first M-1 row groups of this iMCU row */ - main_->rowgroup_ctr = 0; - main_->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size - 1); - /* Check for bottom of image: if so, tweak pointers to "duplicate" - * the last sample row, and adjust rowgroups_avail to ignore padding rows. - */ - if (main_->iMCU_row_ctr == cinfo->total_iMCU_rows) - set_bottom_pointers(cinfo); - main_->context_state = CTX_PROCESS_IMCU; - /*FALLTHROUGH*/ - case CTX_PROCESS_IMCU: - /* Call postprocessor using previously set pointers */ - (*cinfo->post->post_process_data) (cinfo, main_->xbuffer[main_->whichptr], - &main_->rowgroup_ctr, main_->rowgroups_avail, - output_buf, out_row_ctr, out_rows_avail); - if (main_->rowgroup_ctr < main_->rowgroups_avail) - return; /* Need to suspend */ - /* After the first iMCU, change wraparound pointers to normal state */ - if (main_->iMCU_row_ctr == 1) - set_wraparound_pointers(cinfo); - /* Prepare to load new iMCU row using other xbuffer list */ - main_->whichptr ^= 1; /* 0=>1 or 1=>0 */ - main_->buffer_full = FALSE; - /* Still need to process last row group of this iMCU row, */ - /* which is saved at index M+1 of the other xbuffer */ - main_->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_scaled_size + 1); - main_->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_scaled_size + 2); - main_->context_state = CTX_POSTPONED_ROW; - } -} - - -/* - * Process some data. - * Final pass of two-pass quantization: just call the postprocessor. - * Source data will be the postprocessor controller's internal buffer. - */ - -#ifdef QUANT_2PASS_SUPPORTED - -METHODDEF(void) -process_data_crank_post (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL, - (JDIMENSION *) NULL, (JDIMENSION) 0, - output_buf, out_row_ctr, out_rows_avail); -} - -#endif /* QUANT_2PASS_SUPPORTED */ - - -/* - * Initialize main buffer controller. - */ - -GLOBAL(void) -jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer) -{ - my_main_ptr4 main_; - int ci, rgroup, ngroups; - jpeg_component_info *compptr; - - main_ = (my_main_ptr4) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_main_controller4)); - cinfo->main = (struct jpeg_d_main_controller *) main_; - main_->pub.start_pass = start_pass_main2; - - if (need_full_buffer) /* shouldn't happen */ - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - - /* Allocate the workspace. - * ngroups is the number of row groups we need. - */ - if (cinfo->upsample->need_context_rows) { - if (cinfo->min_DCT_scaled_size < 2) /* unsupported, see comments above */ - ERREXIT(cinfo, JERR_NOTIMPL); - alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */ - ngroups = cinfo->min_DCT_scaled_size + 2; - } else { - ngroups = cinfo->min_DCT_scaled_size; - } - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - rgroup = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; /* height of a row group of component */ - main_->buffer[ci] = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - compptr->width_in_blocks * compptr->DCT_scaled_size, - (JDIMENSION) (rgroup * ngroups)); - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmarker.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmarker.c deleted file mode 100755 index 0a57cca..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmarker.c +++ /dev/null @@ -1,1292 +0,0 @@ -/* - * jdmarker.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains routines to decode JPEG datastream markers. - * Most of the complexity arises from our desire to support input - * suspension: if not all of the data for a marker is available, - * we must exit back to the application. On resumption, we reprocess - * the marker. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private state */ - -typedef struct { - struct jpeg_marker_reader pub; /* public fields */ - - /* Application-overridable marker processing methods */ - jpeg_marker_parser_method process_COM; - jpeg_marker_parser_method process_APPn[16]; - - /* Limit on marker data length to save for each marker type */ - unsigned int length_limit_COM; - unsigned int length_limit_APPn[16]; - - /* Status of COM/APPn marker saving */ - jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */ - unsigned int bytes_read; /* data bytes read so far in marker */ - /* Note: cur_marker is not linked into marker_list until it's all read. */ -} my_marker_reader; - -typedef my_marker_reader * my_marker_ptr2; - - -/* - * Macros for fetching data from the data source module. - * - * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect - * the current restart point; we update them only when we have reached a - * suitable place to restart if a suspension occurs. - */ - -/* Declare and initialize local copies of input pointer/count */ -#define INPUT_VARS(cinfo) \ - struct jpeg_source_mgr * datasrc = (cinfo)->src; \ - const JOCTET * next_input_byte = datasrc->next_input_byte; \ - size_t bytes_in_buffer = datasrc->bytes_in_buffer - -/* Unload the local copies --- do this only at a restart boundary */ -#define INPUT_SYNC(cinfo) \ - ( datasrc->next_input_byte = next_input_byte, \ - datasrc->bytes_in_buffer = bytes_in_buffer ) - -/* Reload the local copies --- used only in MAKE_BYTE_AVAIL */ -#define INPUT_RELOAD(cinfo) \ - ( next_input_byte = datasrc->next_input_byte, \ - bytes_in_buffer = datasrc->bytes_in_buffer ) - -/* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available. - * Note we do *not* do INPUT_SYNC before calling fill_input_buffer, - * but we must reload the local copies after a successful fill. - */ -#define MAKE_BYTE_AVAIL(cinfo,action) \ - if (bytes_in_buffer == 0) { \ - if (! (*datasrc->fill_input_buffer) (cinfo)) \ - { action; } \ - INPUT_RELOAD(cinfo); \ - } - -/* Read a byte into variable V. - * If must suspend, take the specified action (typically "return FALSE"). - */ -#define INPUT_BYTE(cinfo,V,action) \ - MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ - bytes_in_buffer--; \ - V = GETJOCTET(*next_input_byte++); ) - -/* As above, but read two bytes interpreted as an unsigned 16-bit integer. - * V should be declared unsigned int or perhaps INT32. - */ -#define INPUT_2BYTES(cinfo,V,action) \ - MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \ - bytes_in_buffer--; \ - V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \ - MAKE_BYTE_AVAIL(cinfo,action); \ - bytes_in_buffer--; \ - V += GETJOCTET(*next_input_byte++); ) - - -/* - * Routines to process JPEG markers. - * - * Entry condition: JPEG marker itself has been read and its code saved - * in cinfo->unread_marker; input restart point is just after the marker. - * - * Exit: if return TRUE, have read and processed any parameters, and have - * updated the restart point to point after the parameters. - * If return FALSE, was forced to suspend before reaching end of - * marker parameters; restart point has not been moved. Same routine - * will be called again after application supplies more input data. - * - * This approach to suspension assumes that all of a marker's parameters - * can fit into a single input bufferload. This should hold for "normal" - * markers. Some COM/APPn markers might have large parameter segments - * that might not fit. If we are simply dropping such a marker, we use - * skip_input_data to get past it, and thereby put the problem on the - * source manager's shoulders. If we are saving the marker's contents - * into memory, we use a slightly different convention: when forced to - * suspend, the marker processor updates the restart point to the end of - * what it's consumed (ie, the end of the buffer) before returning FALSE. - * On resumption, cinfo->unread_marker still contains the marker code, - * but the data source will point to the next chunk of marker data. - * The marker processor must retain internal state to deal with this. - * - * Note that we don't bother to avoid duplicate trace messages if a - * suspension occurs within marker parameters. Other side effects - * require more care. - */ - - -LOCAL(boolean) -get_soi (j_decompress_ptr cinfo) -/* Process an SOI marker */ -{ - int i; - - TRACEMS(cinfo, 1, JTRC_SOI); - - if (cinfo->marker->saw_SOI) - ERREXIT(cinfo, JERR_SOI_DUPLICATE); - - /* Reset all parameters that are defined to be reset by SOI */ - - for (i = 0; i < NUM_ARITH_TBLS; i++) { - cinfo->arith_dc_L[i] = 0; - cinfo->arith_dc_U[i] = 1; - cinfo->arith_ac_K[i] = 5; - } - cinfo->restart_interval = 0; - - /* Set initial assumptions for colorspace etc */ - - cinfo->jpeg_color_space = JCS_UNKNOWN; - cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */ - - cinfo->saw_JFIF_marker = FALSE; - cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */ - cinfo->JFIF_minor_version = 1; - cinfo->density_unit = 0; - cinfo->X_density = 1; - cinfo->Y_density = 1; - cinfo->saw_Adobe_marker = FALSE; - cinfo->Adobe_transform = 0; - - cinfo->marker->saw_SOI = TRUE; - - return TRUE; -} - - -LOCAL(boolean) -get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith) -/* Process a SOFn marker */ -{ - INT32 length; - int c, ci; - jpeg_component_info * compptr; - INPUT_VARS(cinfo); - - cinfo->progressive_mode = is_prog; - cinfo->arith_code = is_arith; - - INPUT_2BYTES(cinfo, length, return FALSE); - - INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE); - INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE); - INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE); - INPUT_BYTE(cinfo, cinfo->num_components, return FALSE); - - length -= 8; - - TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker, - (int) cinfo->image_width, (int) cinfo->image_height, - cinfo->num_components); - - if (cinfo->marker->saw_SOF) - ERREXIT(cinfo, JERR_SOF_DUPLICATE); - - /* We don't support files in which the image height is initially specified */ - /* as 0 and is later redefined by DNL. As long as we have to check that, */ - /* might as well have a general sanity check. */ - if (cinfo->image_height <= 0 || cinfo->image_width <= 0 - || cinfo->num_components <= 0) - ERREXIT(cinfo, JERR_EMPTY_IMAGE); - - if (length != (cinfo->num_components * 3)) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - if (cinfo->comp_info == NULL) /* do only once, even if suspend */ - cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components * SIZEOF(jpeg_component_info)); - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - compptr->component_index = ci; - INPUT_BYTE(cinfo, compptr->component_id, return FALSE); - INPUT_BYTE(cinfo, c, return FALSE); - compptr->h_samp_factor = (c >> 4) & 15; - compptr->v_samp_factor = (c ) & 15; - INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE); - - TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT, - compptr->component_id, compptr->h_samp_factor, - compptr->v_samp_factor, compptr->quant_tbl_no); - } - - cinfo->marker->saw_SOF = TRUE; - - INPUT_SYNC(cinfo); - return TRUE; -} - - -LOCAL(boolean) -get_sos (j_decompress_ptr cinfo) -/* Process a SOS marker */ -{ - INT32 length; - int i, ci, n, c, cc; - jpeg_component_info * compptr; - INPUT_VARS(cinfo); - - if (! cinfo->marker->saw_SOF) - ERREXIT(cinfo, JERR_SOS_NO_SOF); - - INPUT_2BYTES(cinfo, length, return FALSE); - - INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */ - - TRACEMS1(cinfo, 1, JTRC_SOS, n); - - if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - cinfo->comps_in_scan = n; - - /* Collect the component-spec parameters */ - - for (i = 0; i < n; i++) { - INPUT_BYTE(cinfo, cc, return FALSE); - INPUT_BYTE(cinfo, c, return FALSE); - - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - if (cc == compptr->component_id) - goto id_found; - } - - ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc); - - id_found: - - cinfo->cur_comp_info[i] = compptr; - compptr->dc_tbl_no = (c >> 4) & 15; - compptr->ac_tbl_no = (c ) & 15; - - TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc, - compptr->dc_tbl_no, compptr->ac_tbl_no); - } - - /* Collect the additional scan parameters Ss, Se, Ah/Al. */ - INPUT_BYTE(cinfo, c, return FALSE); - cinfo->Ss = c; - INPUT_BYTE(cinfo, c, return FALSE); - cinfo->Se = c; - INPUT_BYTE(cinfo, c, return FALSE); - cinfo->Ah = (c >> 4) & 15; - cinfo->Al = (c ) & 15; - - TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se, - cinfo->Ah, cinfo->Al); - - /* Prepare to scan data & restart markers */ - cinfo->marker->next_restart_num = 0; - - /* Count another SOS marker */ - cinfo->input_scan_number++; - - INPUT_SYNC(cinfo); - return TRUE; -} - - -#ifdef D_ARITH_CODING_SUPPORTED - -LOCAL(boolean) -get_dac (j_decompress_ptr cinfo) -/* Process a DAC marker */ -{ - INT32 length; - int index, val; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - - while (length > 0) { - INPUT_BYTE(cinfo, index, return FALSE); - INPUT_BYTE(cinfo, val, return FALSE); - - length -= 2; - - TRACEMS2(cinfo, 1, JTRC_DAC, index, val); - - if (index < 0 || index >= (2*NUM_ARITH_TBLS)) - ERREXIT1(cinfo, JERR_DAC_INDEX, index); - - if (index >= NUM_ARITH_TBLS) { /* define AC table */ - cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val; - } else { /* define DC table */ - cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F); - cinfo->arith_dc_U[index] = (UINT8) (val >> 4); - if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index]) - ERREXIT1(cinfo, JERR_DAC_VALUE, val); - } - } - - if (length != 0) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - INPUT_SYNC(cinfo); - return TRUE; -} - -#else /* ! D_ARITH_CODING_SUPPORTED */ - -#define get_dac(cinfo) skip_variable(cinfo) - -#endif /* D_ARITH_CODING_SUPPORTED */ - - -LOCAL(boolean) -get_dht (j_decompress_ptr cinfo) -/* Process a DHT marker */ -{ - INT32 length; - UINT8 bits[17]; - UINT8 huffval[256]; - int i, index, count; - JHUFF_TBL **htblptr; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - - while (length > 16) { - INPUT_BYTE(cinfo, index, return FALSE); - - TRACEMS1(cinfo, 1, JTRC_DHT, index); - - bits[0] = 0; - count = 0; - for (i = 1; i <= 16; i++) { - INPUT_BYTE(cinfo, bits[i], return FALSE); - count += bits[i]; - } - - length -= 1 + 16; - - TRACEMS8(cinfo, 2, JTRC_HUFFBITS, - bits[1], bits[2], bits[3], bits[4], - bits[5], bits[6], bits[7], bits[8]); - TRACEMS8(cinfo, 2, JTRC_HUFFBITS, - bits[9], bits[10], bits[11], bits[12], - bits[13], bits[14], bits[15], bits[16]); - - /* Here we just do minimal validation of the counts to avoid walking - * off the end of our table space. jdhuff.c will check more carefully. - */ - if (count > 256 || ((INT32) count) > length) - ERREXIT(cinfo, JERR_BAD_HUFF_TABLE); - - for (i = 0; i < count; i++) - INPUT_BYTE(cinfo, huffval[i], return FALSE); - - length -= count; - - if (index & 0x10) { /* AC table definition */ - index -= 0x10; - htblptr = &cinfo->ac_huff_tbl_ptrs[index]; - } else { /* DC table definition */ - htblptr = &cinfo->dc_huff_tbl_ptrs[index]; - } - - if (index < 0 || index >= NUM_HUFF_TBLS) - ERREXIT1(cinfo, JERR_DHT_INDEX, index); - - if (*htblptr == NULL) - *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); - - MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits)); - MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval)); - } - - if (length != 0) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - INPUT_SYNC(cinfo); - return TRUE; -} - - -LOCAL(boolean) -get_dqt (j_decompress_ptr cinfo) -/* Process a DQT marker */ -{ - INT32 length; - int n, i, prec; - unsigned int tmp; - JQUANT_TBL *quant_ptr; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - - while (length > 0) { - INPUT_BYTE(cinfo, n, return FALSE); - prec = n >> 4; - n &= 0x0F; - - TRACEMS2(cinfo, 1, JTRC_DQT, n, prec); - - if (n >= NUM_QUANT_TBLS) - ERREXIT1(cinfo, JERR_DQT_INDEX, n); - - if (cinfo->quant_tbl_ptrs[n] == NULL) - cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo); - quant_ptr = cinfo->quant_tbl_ptrs[n]; - - for (i = 0; i < DCTSIZE2; i++) { - if (prec) - INPUT_2BYTES(cinfo, tmp, return FALSE); - else - INPUT_BYTE(cinfo, tmp, return FALSE); - /* We convert the zigzag-order table to natural array order. */ - quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp; - } - - if (cinfo->err->trace_level >= 2) { - for (i = 0; i < DCTSIZE2; i += 8) { - TRACEMS8(cinfo, 2, JTRC_QUANTVALS, - quant_ptr->quantval[i], quant_ptr->quantval[i+1], - quant_ptr->quantval[i+2], quant_ptr->quantval[i+3], - quant_ptr->quantval[i+4], quant_ptr->quantval[i+5], - quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]); - } - } - - length -= DCTSIZE2+1; - if (prec) length -= DCTSIZE2; - } - - if (length != 0) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - INPUT_SYNC(cinfo); - return TRUE; -} - - -LOCAL(boolean) -get_dri (j_decompress_ptr cinfo) -/* Process a DRI marker */ -{ - INT32 length; - unsigned int tmp; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - - if (length != 4) - ERREXIT(cinfo, JERR_BAD_LENGTH); - - INPUT_2BYTES(cinfo, tmp, return FALSE); - - TRACEMS1(cinfo, 1, JTRC_DRI, tmp); - - cinfo->restart_interval = tmp; - - INPUT_SYNC(cinfo); - return TRUE; -} - - -/* - * Routines for processing APPn and COM markers. - * These are either saved in memory or discarded, per application request. - * APP0 and APP14 are specially checked to see if they are - * JFIF and Adobe markers, respectively. - */ - -#define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */ -#define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */ -#define APPN_DATA_LEN 14 /* Must be the largest of the above!! */ - - -LOCAL(void) -examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data, - unsigned int datalen, INT32 remaining) -/* Examine first few bytes from an APP0. - * Take appropriate action if it is a JFIF marker. - * datalen is # of bytes at data[], remaining is length of rest of marker data. - */ -{ - INT32 totallen = (INT32) datalen + remaining; - - if (datalen >= APP0_DATA_LEN && - GETJOCTET(data[0]) == 0x4A && - GETJOCTET(data[1]) == 0x46 && - GETJOCTET(data[2]) == 0x49 && - GETJOCTET(data[3]) == 0x46 && - GETJOCTET(data[4]) == 0) { - /* Found JFIF APP0 marker: save info */ - cinfo->saw_JFIF_marker = TRUE; - cinfo->JFIF_major_version = GETJOCTET(data[5]); - cinfo->JFIF_minor_version = GETJOCTET(data[6]); - cinfo->density_unit = GETJOCTET(data[7]); - cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]); - cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]); - /* Check version. - * Major version must be 1, anything else signals an incompatible change. - * (We used to treat this as an error, but now it's a nonfatal warning, - * because some bozo at Hijaak couldn't read the spec.) - * Minor version should be 0..2, but process anyway if newer. - */ - if (cinfo->JFIF_major_version != 1) - WARNMS2(cinfo, JWRN_JFIF_MAJOR, - cinfo->JFIF_major_version, cinfo->JFIF_minor_version); - /* Generate trace messages */ - TRACEMS5(cinfo, 1, JTRC_JFIF, - cinfo->JFIF_major_version, cinfo->JFIF_minor_version, - cinfo->X_density, cinfo->Y_density, cinfo->density_unit); - /* Validate thumbnail dimensions and issue appropriate messages */ - if (GETJOCTET(data[12]) | GETJOCTET(data[13])) - TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL, - GETJOCTET(data[12]), GETJOCTET(data[13])); - totallen -= APP0_DATA_LEN; - if (totallen != - ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3)) - TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen); - } else if (datalen >= 6 && - GETJOCTET(data[0]) == 0x4A && - GETJOCTET(data[1]) == 0x46 && - GETJOCTET(data[2]) == 0x58 && - GETJOCTET(data[3]) == 0x58 && - GETJOCTET(data[4]) == 0) { - /* Found JFIF "JFXX" extension APP0 marker */ - /* The library doesn't actually do anything with these, - * but we try to produce a helpful trace message. - */ - switch (GETJOCTET(data[5])) { - case 0x10: - TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen); - break; - case 0x11: - TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen); - break; - case 0x13: - TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen); - break; - default: - TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION, - GETJOCTET(data[5]), (int) totallen); - break; - } - } else { - /* Start of APP0 does not match "JFIF" or "JFXX", or too short */ - TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen); - } -} - - -LOCAL(void) -examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data, - unsigned int datalen, INT32 remaining) -/* Examine first few bytes from an APP14. - * Take appropriate action if it is an Adobe marker. - * datalen is # of bytes at data[], remaining is length of rest of marker data. - */ -{ - unsigned int version, flags0, flags1, transform; - - if (datalen >= APP14_DATA_LEN && - GETJOCTET(data[0]) == 0x41 && - GETJOCTET(data[1]) == 0x64 && - GETJOCTET(data[2]) == 0x6F && - GETJOCTET(data[3]) == 0x62 && - GETJOCTET(data[4]) == 0x65) { - /* Found Adobe APP14 marker */ - version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]); - flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]); - flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]); - transform = GETJOCTET(data[11]); - TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform); - cinfo->saw_Adobe_marker = TRUE; - cinfo->Adobe_transform = (UINT8) transform; - } else { - /* Start of APP14 does not match "Adobe", or too short */ - TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining)); - } -} - - -METHODDEF(boolean) -get_interesting_appn (j_decompress_ptr cinfo) -/* Process an APP0 or APP14 marker without saving it */ -{ - INT32 length; - JOCTET b[APPN_DATA_LEN]; - unsigned int i, numtoread; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - - /* get the interesting part of the marker data */ - if (length >= APPN_DATA_LEN) - numtoread = APPN_DATA_LEN; - else if (length > 0) - numtoread = (unsigned int) length; - else - numtoread = 0; - for (i = 0; i < numtoread; i++) - INPUT_BYTE(cinfo, b[i], return FALSE); - length -= numtoread; - - /* process it */ - switch (cinfo->unread_marker) { - case M_APP0: - examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length); - break; - case M_APP14: - examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length); - break; - default: - /* can't get here unless jpeg_save_markers chooses wrong processor */ - ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); - break; - } - - /* skip any remaining data -- could be lots */ - INPUT_SYNC(cinfo); - if (length > 0) - (*cinfo->src->skip_input_data) (cinfo, (long) length); - - return TRUE; -} - - -#ifdef SAVE_MARKERS_SUPPORTED - -METHODDEF(boolean) -save_marker (j_decompress_ptr cinfo) -/* Save an APPn or COM marker into the marker list */ -{ - my_marker_ptr2 marker = (my_marker_ptr2) cinfo->marker; - jpeg_saved_marker_ptr cur_marker = marker->cur_marker; - unsigned int bytes_read, data_length; - JOCTET FAR * data; - INT32 length = 0; - INPUT_VARS(cinfo); - - if (cur_marker == NULL) { - /* begin reading a marker */ - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - if (length >= 0) { /* watch out for bogus length word */ - /* figure out how much we want to save */ - unsigned int limit; - if (cinfo->unread_marker == (int) M_COM) - limit = marker->length_limit_COM; - else - limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0]; - if ((unsigned int) length < limit) - limit = (unsigned int) length; - /* allocate and initialize the marker item */ - cur_marker = (jpeg_saved_marker_ptr) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(struct jpeg_marker_struct) + limit); - cur_marker->next = NULL; - cur_marker->marker = (UINT8) cinfo->unread_marker; - cur_marker->original_length = (unsigned int) length; - cur_marker->data_length = limit; - /* data area is just beyond the jpeg_marker_struct */ - data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1); - marker->cur_marker = cur_marker; - marker->bytes_read = 0; - bytes_read = 0; - data_length = limit; - } else { - /* deal with bogus length word */ - bytes_read = data_length = 0; - data = NULL; - } - } else { - /* resume reading a marker */ - bytes_read = marker->bytes_read; - data_length = cur_marker->data_length; - data = cur_marker->data + bytes_read; - } - - while (bytes_read < data_length) { - INPUT_SYNC(cinfo); /* move the restart point to here */ - marker->bytes_read = bytes_read; - /* If there's not at least one byte in buffer, suspend */ - MAKE_BYTE_AVAIL(cinfo, return FALSE); - /* Copy bytes with reasonable rapidity */ - while (bytes_read < data_length && bytes_in_buffer > 0) { - *data++ = *next_input_byte++; - bytes_in_buffer--; - bytes_read++; - } - } - - /* Done reading what we want to read */ - if (cur_marker != NULL) { /* will be NULL if bogus length word */ - /* Add new marker to end of list */ - if (cinfo->marker_list == NULL) { - cinfo->marker_list = cur_marker; - } else { - jpeg_saved_marker_ptr prev = cinfo->marker_list; - while (prev->next != NULL) - prev = prev->next; - prev->next = cur_marker; - } - /* Reset pointer & calc remaining data length */ - data = cur_marker->data; - length = cur_marker->original_length - data_length; - } - /* Reset to initial state for next marker */ - marker->cur_marker = NULL; - - /* Process the marker if interesting; else just make a generic trace msg */ - switch (cinfo->unread_marker) { - case M_APP0: - examine_app0(cinfo, data, data_length, length); - break; - case M_APP14: - examine_app14(cinfo, data, data_length, length); - break; - default: - TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, - (int) (data_length + length)); - break; - } - - /* skip any remaining data -- could be lots */ - INPUT_SYNC(cinfo); /* do before skip_input_data */ - if (length > 0) - (*cinfo->src->skip_input_data) (cinfo, (long) length); - - return TRUE; -} - -#endif /* SAVE_MARKERS_SUPPORTED */ - - -METHODDEF(boolean) -skip_variable (j_decompress_ptr cinfo) -/* Skip over an unknown or uninteresting variable-length marker */ -{ - INT32 length; - INPUT_VARS(cinfo); - - INPUT_2BYTES(cinfo, length, return FALSE); - length -= 2; - - TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length); - - INPUT_SYNC(cinfo); /* do before skip_input_data */ - if (length > 0) - (*cinfo->src->skip_input_data) (cinfo, (long) length); - - return TRUE; -} - - -/* - * Find the next JPEG marker, save it in cinfo->unread_marker. - * Returns FALSE if had to suspend before reaching a marker; - * in that case cinfo->unread_marker is unchanged. - * - * Note that the result might not be a valid marker code, - * but it will never be 0 or FF. - */ - -LOCAL(boolean) -next_marker (j_decompress_ptr cinfo) -{ - int c; - INPUT_VARS(cinfo); - - for (;;) { - INPUT_BYTE(cinfo, c, return FALSE); - /* Skip any non-FF bytes. - * This may look a bit inefficient, but it will not occur in a valid file. - * We sync after each discarded byte so that a suspending data source - * can discard the byte from its buffer. - */ - while (c != 0xFF) { - cinfo->marker->discarded_bytes++; - INPUT_SYNC(cinfo); - INPUT_BYTE(cinfo, c, return FALSE); - } - /* This loop swallows any duplicate FF bytes. Extra FFs are legal as - * pad bytes, so don't count them in discarded_bytes. We assume there - * will not be so many consecutive FF bytes as to overflow a suspending - * data source's input buffer. - */ - do { - INPUT_BYTE(cinfo, c, return FALSE); - } while (c == 0xFF); - if (c != 0) - break; /* found a valid marker, exit loop */ - /* Reach here if we found a stuffed-zero data sequence (FF/00). - * Discard it and loop back to try again. - */ - cinfo->marker->discarded_bytes += 2; - INPUT_SYNC(cinfo); - } - - if (cinfo->marker->discarded_bytes != 0) { - WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c); - cinfo->marker->discarded_bytes = 0; - } - - cinfo->unread_marker = c; - - INPUT_SYNC(cinfo); - return TRUE; -} - - -LOCAL(boolean) -first_marker (j_decompress_ptr cinfo) -/* Like next_marker, but used to obtain the initial SOI marker. */ -/* For this marker, we do not allow preceding garbage or fill; otherwise, - * we might well scan an entire input file before realizing it ain't JPEG. - * If an application wants to process non-JFIF files, it must seek to the - * SOI before calling the JPEG library. - */ -{ - int c, c2; - INPUT_VARS(cinfo); - - INPUT_BYTE(cinfo, c, return FALSE); - INPUT_BYTE(cinfo, c2, return FALSE); - if (c != 0xFF || c2 != (int) M_SOI) - ERREXIT2(cinfo, JERR_NO_SOI, c, c2); - - cinfo->unread_marker = c2; - - INPUT_SYNC(cinfo); - return TRUE; -} - - -/* - * Read markers until SOS or EOI. - * - * Returns same codes as are defined for jpeg_consume_input: - * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. - */ - -METHODDEF(int) -read_markers (j_decompress_ptr cinfo) -{ - /* Outer loop repeats once for each marker. */ - for (;;) { - /* Collect the marker proper, unless we already did. */ - /* NB: first_marker() enforces the requirement that SOI appear first. */ - if (cinfo->unread_marker == 0) { - if (! cinfo->marker->saw_SOI) { - if (! first_marker(cinfo)) - return JPEG_SUSPENDED; - } else { - if (! next_marker(cinfo)) - return JPEG_SUSPENDED; - } - } - /* At this point cinfo->unread_marker contains the marker code and the - * input point is just past the marker proper, but before any parameters. - * A suspension will cause us to return with this state still true. - */ - switch (cinfo->unread_marker) { - case M_SOI: - if (! get_soi(cinfo)) - return JPEG_SUSPENDED; - break; - - case M_SOF0: /* Baseline */ - case M_SOF1: /* Extended sequential, Huffman */ - if (! get_sof(cinfo, FALSE, FALSE)) - return JPEG_SUSPENDED; - break; - - case M_SOF2: /* Progressive, Huffman */ - if (! get_sof(cinfo, TRUE, FALSE)) - return JPEG_SUSPENDED; - break; - - case M_SOF9: /* Extended sequential, arithmetic */ - if (! get_sof(cinfo, FALSE, TRUE)) - return JPEG_SUSPENDED; - break; - - case M_SOF10: /* Progressive, arithmetic */ - if (! get_sof(cinfo, TRUE, TRUE)) - return JPEG_SUSPENDED; - break; - - /* Currently unsupported SOFn types */ - case M_SOF3: /* Lossless, Huffman */ - case M_SOF5: /* Differential sequential, Huffman */ - case M_SOF6: /* Differential progressive, Huffman */ - case M_SOF7: /* Differential lossless, Huffman */ - case M_JPG: /* Reserved for JPEG extensions */ - case M_SOF11: /* Lossless, arithmetic */ - case M_SOF13: /* Differential sequential, arithmetic */ - case M_SOF14: /* Differential progressive, arithmetic */ - case M_SOF15: /* Differential lossless, arithmetic */ - ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker); - break; - - case M_SOS: - if (! get_sos(cinfo)) - return JPEG_SUSPENDED; - cinfo->unread_marker = 0; /* processed the marker */ - return JPEG_REACHED_SOS; - - case M_EOI: - TRACEMS(cinfo, 1, JTRC_EOI); - cinfo->unread_marker = 0; /* processed the marker */ - return JPEG_REACHED_EOI; - - case M_DAC: - if (! get_dac(cinfo)) - return JPEG_SUSPENDED; - break; - - case M_DHT: - if (! get_dht(cinfo)) - return JPEG_SUSPENDED; - break; - - case M_DQT: - if (! get_dqt(cinfo)) - return JPEG_SUSPENDED; - break; - - case M_DRI: - if (! get_dri(cinfo)) - return JPEG_SUSPENDED; - break; - - case M_APP0: - case M_APP1: - case M_APP2: - case M_APP3: - case M_APP4: - case M_APP5: - case M_APP6: - case M_APP7: - case M_APP8: - case M_APP9: - case M_APP10: - case M_APP11: - case M_APP12: - case M_APP13: - case M_APP14: - case M_APP15: - if (! (*((my_marker_ptr2) cinfo->marker)->process_APPn[ - cinfo->unread_marker - (int) M_APP0]) (cinfo)) - return JPEG_SUSPENDED; - break; - - case M_COM: - if (! (*((my_marker_ptr2) cinfo->marker)->process_COM) (cinfo)) - return JPEG_SUSPENDED; - break; - - case M_RST0: /* these are all parameterless */ - case M_RST1: - case M_RST2: - case M_RST3: - case M_RST4: - case M_RST5: - case M_RST6: - case M_RST7: - case M_TEM: - TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker); - break; - - case M_DNL: /* Ignore DNL ... perhaps the wrong thing */ - if (! skip_variable(cinfo)) - return JPEG_SUSPENDED; - break; - - default: /* must be DHP, EXP, JPGn, or RESn */ - /* For now, we treat the reserved markers as fatal errors since they are - * likely to be used to signal incompatible JPEG Part 3 extensions. - * Once the JPEG 3 version-number marker is well defined, this code - * ought to change! - */ - ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker); - break; - } - /* Successfully processed marker, so reset state variable */ - cinfo->unread_marker = 0; - } /* end loop */ -} - - -/* - * Read a restart marker, which is expected to appear next in the datastream; - * if the marker is not there, take appropriate recovery action. - * Returns FALSE if suspension is required. - * - * This is called by the entropy decoder after it has read an appropriate - * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder - * has already read a marker from the data source. Under normal conditions - * cinfo->unread_marker will be reset to 0 before returning; if not reset, - * it holds a marker which the decoder will be unable to read past. - */ - -METHODDEF(boolean) -read_restart_marker (j_decompress_ptr cinfo) -{ - /* Obtain a marker unless we already did. */ - /* Note that next_marker will complain if it skips any data. */ - if (cinfo->unread_marker == 0) { - if (! next_marker(cinfo)) - return FALSE; - } - - if (cinfo->unread_marker == - ((int) M_RST0 + cinfo->marker->next_restart_num)) { - /* Normal case --- swallow the marker and let entropy decoder continue */ - TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num); - cinfo->unread_marker = 0; - } else { - /* Uh-oh, the restart markers have been messed up. */ - /* Let the data source manager determine how to resync. */ - if (! (*cinfo->src->resync_to_restart) (cinfo, - cinfo->marker->next_restart_num)) - return FALSE; - } - - /* Update next-restart state */ - cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7; - - return TRUE; -} - - -/* - * This is the default resync_to_restart method for data source managers - * to use if they don't have any better approach. Some data source managers - * may be able to back up, or may have additional knowledge about the data - * which permits a more intelligent recovery strategy; such managers would - * presumably supply their own resync method. - * - * read_restart_marker calls resync_to_restart if it finds a marker other than - * the restart marker it was expecting. (This code is *not* used unless - * a nonzero restart interval has been declared.) cinfo->unread_marker is - * the marker code actually found (might be anything, except 0 or FF). - * The desired restart marker number (0..7) is passed as a parameter. - * This routine is supposed to apply whatever error recovery strategy seems - * appropriate in order to position the input stream to the next data segment. - * Note that cinfo->unread_marker is treated as a marker appearing before - * the current data-source input point; usually it should be reset to zero - * before returning. - * Returns FALSE if suspension is required. - * - * This implementation is substantially constrained by wanting to treat the - * input as a data stream; this means we can't back up. Therefore, we have - * only the following actions to work with: - * 1. Simply discard the marker and let the entropy decoder resume at next - * byte of file. - * 2. Read forward until we find another marker, discarding intervening - * data. (In theory we could look ahead within the current bufferload, - * without having to discard data if we don't find the desired marker. - * This idea is not implemented here, in part because it makes behavior - * dependent on buffer size and chance buffer-boundary positions.) - * 3. Leave the marker unread (by failing to zero cinfo->unread_marker). - * This will cause the entropy decoder to process an empty data segment, - * inserting dummy zeroes, and then we will reprocess the marker. - * - * #2 is appropriate if we think the desired marker lies ahead, while #3 is - * appropriate if the found marker is a future restart marker (indicating - * that we have missed the desired restart marker, probably because it got - * corrupted). - * We apply #2 or #3 if the found marker is a restart marker no more than - * two counts behind or ahead of the expected one. We also apply #2 if the - * found marker is not a legal JPEG marker code (it's certainly bogus data). - * If the found marker is a restart marker more than 2 counts away, we do #1 - * (too much risk that the marker is erroneous; with luck we will be able to - * resync at some future point). - * For any valid non-restart JPEG marker, we apply #3. This keeps us from - * overrunning the end of a scan. An implementation limited to single-scan - * files might find it better to apply #2 for markers other than EOI, since - * any other marker would have to be bogus data in that case. - */ - -GLOBAL(boolean) -jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired) -{ - int marker = cinfo->unread_marker; - int action = 1; - - /* Always put up a warning. */ - WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired); - - /* Outer loop handles repeated decision after scanning forward. */ - for (;;) { - if (marker < (int) M_SOF0) - action = 2; /* invalid marker */ - else if (marker < (int) M_RST0 || marker > (int) M_RST7) - action = 3; /* valid non-restart marker */ - else { - if (marker == ((int) M_RST0 + ((desired+1) & 7)) || - marker == ((int) M_RST0 + ((desired+2) & 7))) - action = 3; /* one of the next two expected restarts */ - else if (marker == ((int) M_RST0 + ((desired-1) & 7)) || - marker == ((int) M_RST0 + ((desired-2) & 7))) - action = 2; /* a prior restart, so advance */ - else - action = 1; /* desired restart or too far away */ - } - TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action); - switch (action) { - case 1: - /* Discard marker and let entropy decoder resume processing. */ - cinfo->unread_marker = 0; - return TRUE; - case 2: - /* Scan to the next marker, and repeat the decision loop. */ - if (! next_marker(cinfo)) - return FALSE; - marker = cinfo->unread_marker; - break; - case 3: - /* Return without advancing past this marker. */ - /* Entropy decoder will be forced to process an empty segment. */ - return TRUE; - } - } /* end loop */ -} - - -/* - * Reset marker processing state to begin a fresh datastream. - */ - -METHODDEF(void) -reset_marker_reader (j_decompress_ptr cinfo) -{ - my_marker_ptr2 marker = (my_marker_ptr2) cinfo->marker; - - cinfo->comp_info = NULL; /* until allocated by get_sof */ - cinfo->input_scan_number = 0; /* no SOS seen yet */ - cinfo->unread_marker = 0; /* no pending marker */ - marker->pub.saw_SOI = FALSE; /* set internal state too */ - marker->pub.saw_SOF = FALSE; - marker->pub.discarded_bytes = 0; - marker->cur_marker = NULL; -} - - -/* - * Initialize the marker reader module. - * This is called only once, when the decompression object is created. - */ - -GLOBAL(void) -jinit_marker_reader (j_decompress_ptr cinfo) -{ - my_marker_ptr2 marker; - int i; - - /* Create subobject in permanent pool */ - marker = (my_marker_ptr2) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, - SIZEOF(my_marker_reader)); - cinfo->marker = (struct jpeg_marker_reader *) marker; - /* Initialize public method pointers */ - marker->pub.reset_marker_reader = reset_marker_reader; - marker->pub.read_markers = read_markers; - marker->pub.read_restart_marker = read_restart_marker; - /* Initialize COM/APPn processing. - * By default, we examine and then discard APP0 and APP14, - * but simply discard COM and all other APPn. - */ - marker->process_COM = skip_variable; - marker->length_limit_COM = 0; - for (i = 0; i < 16; i++) { - marker->process_APPn[i] = skip_variable; - marker->length_limit_APPn[i] = 0; - } - marker->process_APPn[0] = get_interesting_appn; - marker->process_APPn[14] = get_interesting_appn; - /* Reset marker processing state */ - reset_marker_reader(cinfo); -} - - -/* - * Control saving of COM and APPn markers into marker_list. - */ - -#ifdef SAVE_MARKERS_SUPPORTED - -GLOBAL(void) -jpeg_save_markers (j_decompress_ptr cinfo, int marker_code, - unsigned int length_limit) -{ - my_marker_ptr2 marker = (my_marker_ptr2) cinfo->marker; - long maxlength; - jpeg_marker_parser_method processor; - - /* Length limit mustn't be larger than what we can allocate - * (should only be a concern in a 16-bit environment). - */ - maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct); - if (((long) length_limit) > maxlength) - length_limit = (unsigned int) maxlength; - - /* Choose processor routine to use. - * APP0/APP14 have special requirements. - */ - if (length_limit) { - processor = save_marker; - /* If saving APP0/APP14, save at least enough for our internal use. */ - if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN) - length_limit = APP0_DATA_LEN; - else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN) - length_limit = APP14_DATA_LEN; - } else { - processor = skip_variable; - /* If discarding APP0/APP14, use our regular on-the-fly processor. */ - if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14) - processor = get_interesting_appn; - } - - if (marker_code == (int) M_COM) { - marker->process_COM = processor; - marker->length_limit_COM = length_limit; - } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) { - marker->process_APPn[marker_code - (int) M_APP0] = processor; - marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit; - } else - ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); -} - -#endif /* SAVE_MARKERS_SUPPORTED */ - - -/* - * Install a special processing method for COM or APPn markers. - */ - -GLOBAL(void) -jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code, - jpeg_marker_parser_method routine) -{ - my_marker_ptr2 marker = (my_marker_ptr2) cinfo->marker; - - if (marker_code == (int) M_COM) - marker->process_COM = routine; - else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) - marker->process_APPn[marker_code - (int) M_APP0] = routine; - else - ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code); -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmaster.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmaster.c deleted file mode 100755 index 8c7ec43..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmaster.c +++ /dev/null @@ -1,557 +0,0 @@ -/* - * jdmaster.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains master control logic for the JPEG decompressor. - * These routines are concerned with selecting the modules to be executed - * and with determining the number of passes and the work to be done in each - * pass. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private state */ - -typedef struct { - struct jpeg_decomp_master pub; /* public fields */ - - int pass_number; /* # of passes completed */ - - boolean using_merged_upsample; /* TRUE if using merged upsample/cconvert */ - - /* Saved references to initialized quantizer modules, - * in case we need to switch modes. - */ - struct jpeg_color_quantizer * quantizer_1pass; - struct jpeg_color_quantizer * quantizer_2pass; -} my_decomp_master; - -typedef my_decomp_master * my_master_ptr6; - - -/* - * Determine whether merged upsample/color conversion should be used. - * CRUCIAL: this must match the actual capabilities of jdmerge.c! - */ - -LOCAL(boolean) -use_merged_upsample (j_decompress_ptr cinfo) -{ -#ifdef UPSAMPLE_MERGING_SUPPORTED - /* Merging is the equivalent of plain box-filter upsampling */ - if (cinfo->do_fancy_upsampling || cinfo->CCIR601_sampling) - return FALSE; - /* jdmerge.c only supports YCC=>RGB color conversion */ - if (cinfo->jpeg_color_space != JCS_YCbCr || cinfo->num_components != 3 || - cinfo->out_color_space != JCS_RGB || - cinfo->out_color_components != RGB_PIXELSIZE) - return FALSE; - /* and it only handles 2h1v or 2h2v sampling ratios */ - if (cinfo->comp_info[0].h_samp_factor != 2 || - cinfo->comp_info[1].h_samp_factor != 1 || - cinfo->comp_info[2].h_samp_factor != 1 || - cinfo->comp_info[0].v_samp_factor > 2 || - cinfo->comp_info[1].v_samp_factor != 1 || - cinfo->comp_info[2].v_samp_factor != 1) - return FALSE; - /* furthermore, it doesn't work if we've scaled the IDCTs differently */ - if (cinfo->comp_info[0].DCT_scaled_size != cinfo->min_DCT_scaled_size || - cinfo->comp_info[1].DCT_scaled_size != cinfo->min_DCT_scaled_size || - cinfo->comp_info[2].DCT_scaled_size != cinfo->min_DCT_scaled_size) - return FALSE; - /* ??? also need to test for upsample-time rescaling, when & if supported */ - return TRUE; /* by golly, it'll work... */ -#else - return FALSE; -#endif -} - - -/* - * Compute output image dimensions and related values. - * NOTE: this is exported for possible use by application. - * Hence it mustn't do anything that can't be done twice. - * Also note that it may be called before the master module is initialized! - */ - -GLOBAL(void) -jpeg_calc_output_dimensions (j_decompress_ptr cinfo) -/* Do computations that are needed before master selection phase */ -{ -#ifdef IDCT_SCALING_SUPPORTED - int ci; - jpeg_component_info *compptr; -#endif - - /* Prevent application from calling me at wrong times */ - if (cinfo->global_state != DSTATE_READY) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - -#ifdef IDCT_SCALING_SUPPORTED - - /* Compute actual output image dimensions and DCT scaling choices. */ - if (cinfo->scale_num * 8 <= cinfo->scale_denom) { - /* Provide 1/8 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 8L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 8L); - cinfo->min_DCT_scaled_size = 1; - } else if (cinfo->scale_num * 4 <= cinfo->scale_denom) { - /* Provide 1/4 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 4L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 4L); - cinfo->min_DCT_scaled_size = 2; - } else if (cinfo->scale_num * 2 <= cinfo->scale_denom) { - /* Provide 1/2 scaling */ - cinfo->output_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width, 2L); - cinfo->output_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height, 2L); - cinfo->min_DCT_scaled_size = 4; - } else { - /* Provide 1/1 scaling */ - cinfo->output_width = cinfo->image_width; - cinfo->output_height = cinfo->image_height; - cinfo->min_DCT_scaled_size = DCTSIZE; - } - /* In selecting the actual DCT scaling for each component, we try to - * scale up the chroma components via IDCT scaling rather than upsampling. - * This saves time if the upsampler gets to use 1:1 scaling. - * Note this code assumes that the supported DCT scalings are powers of 2. - */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - int ssize = cinfo->min_DCT_scaled_size; - while (ssize < DCTSIZE && - (compptr->h_samp_factor * ssize * 2 <= - cinfo->max_h_samp_factor * cinfo->min_DCT_scaled_size) && - (compptr->v_samp_factor * ssize * 2 <= - cinfo->max_v_samp_factor * cinfo->min_DCT_scaled_size)) { - ssize = ssize * 2; - } - compptr->DCT_scaled_size = ssize; - } - - /* Recompute downsampled dimensions of components; - * application needs to know these if using raw downsampled data. - */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Size in samples, after IDCT scaling */ - compptr->downsampled_width = (JDIMENSION) - jdiv_round_up((long) cinfo->image_width * - (long) (compptr->h_samp_factor * compptr->DCT_scaled_size), - (long) (cinfo->max_h_samp_factor * DCTSIZE)); - compptr->downsampled_height = (JDIMENSION) - jdiv_round_up((long) cinfo->image_height * - (long) (compptr->v_samp_factor * compptr->DCT_scaled_size), - (long) (cinfo->max_v_samp_factor * DCTSIZE)); - } - -#else /* !IDCT_SCALING_SUPPORTED */ - - /* Hardwire it to "no scaling" */ - cinfo->output_width = cinfo->image_width; - cinfo->output_height = cinfo->image_height; - /* jdinput.c has already initialized DCT_scaled_size to DCTSIZE, - * and has computed unscaled downsampled_width and downsampled_height. - */ - -#endif /* IDCT_SCALING_SUPPORTED */ - - /* Report number of components in selected colorspace. */ - /* Probably this should be in the color conversion module... */ - switch (cinfo->out_color_space) { - case JCS_GRAYSCALE: - cinfo->out_color_components = 1; - break; - case JCS_RGB: -#if RGB_PIXELSIZE != 3 - cinfo->out_color_components = RGB_PIXELSIZE; - break; -#endif /* else share code with YCbCr */ - case JCS_YCbCr: - cinfo->out_color_components = 3; - break; - case JCS_CMYK: - case JCS_YCCK: - cinfo->out_color_components = 4; - break; - default: /* else must be same colorspace as in file */ - cinfo->out_color_components = cinfo->num_components; - break; - } - cinfo->output_components = (cinfo->quantize_colors ? 1 : - cinfo->out_color_components); - - /* See if upsampler will want to emit more than one row at a time */ - if (use_merged_upsample(cinfo)) - cinfo->rec_outbuf_height = cinfo->max_v_samp_factor; - else - cinfo->rec_outbuf_height = 1; -} - - -/* - * Several decompression processes need to range-limit values to the range - * 0..MAXJSAMPLE; the input value may fall somewhat outside this range - * due to noise introduced by quantization, roundoff error, etc. These - * processes are inner loops and need to be as fast as possible. On most - * machines, particularly CPUs with pipelines or instruction prefetch, - * a (subscript-check-less) C table lookup - * x = sample_range_limit[x]; - * is faster than explicit tests - * if (x < 0) x = 0; - * else if (x > MAXJSAMPLE) x = MAXJSAMPLE; - * These processes all use a common table prepared by the routine below. - * - * For most steps we can mathematically guarantee that the initial value - * of x is within MAXJSAMPLE+1 of the legal range, so a table running from - * -(MAXJSAMPLE+1) to 2*MAXJSAMPLE+1 is sufficient. But for the initial - * limiting step (just after the IDCT), a wildly out-of-range value is - * possible if the input data is corrupt. To avoid any chance of indexing - * off the end of memory and getting a bad-pointer trap, we perform the - * post-IDCT limiting thus: - * x = range_limit[x & MASK]; - * where MASK is 2 bits wider than legal sample data, ie 10 bits for 8-bit - * samples. Under normal circumstances this is more than enough range and - * a correct output will be generated; with bogus input data the mask will - * cause wraparound, and we will safely generate a bogus-but-in-range output. - * For the post-IDCT step, we want to convert the data from signed to unsigned - * representation by adding CENTERJSAMPLE at the same time that we limit it. - * So the post-IDCT limiting table ends up looking like this: - * CENTERJSAMPLE,CENTERJSAMPLE+1,...,MAXJSAMPLE, - * MAXJSAMPLE (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), - * 0 (repeat 2*(MAXJSAMPLE+1)-CENTERJSAMPLE times), - * 0,1,...,CENTERJSAMPLE-1 - * Negative inputs select values from the upper half of the table after - * masking. - * - * We can save some space by overlapping the start of the post-IDCT table - * with the simpler range limiting table. The post-IDCT table begins at - * sample_range_limit + CENTERJSAMPLE. - * - * Note that the table is allocated in near data space on PCs; it's small - * enough and used often enough to justify this. - */ - -LOCAL(void) -prepare_range_limit_table (j_decompress_ptr cinfo) -/* Allocate and fill in the sample_range_limit table */ -{ - JSAMPLE * table; - int i; - - table = (JSAMPLE *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (5 * (MAXJSAMPLE+1) + CENTERJSAMPLE) * SIZEOF(JSAMPLE)); - table += (MAXJSAMPLE+1); /* allow negative subscripts of simple table */ - cinfo->sample_range_limit = table; - /* First segment of "simple" table: limit[x] = 0 for x < 0 */ - MEMZERO(table - (MAXJSAMPLE+1), (MAXJSAMPLE+1) * SIZEOF(JSAMPLE)); - /* Main part of "simple" table: limit[x] = x */ - for (i = 0; i <= MAXJSAMPLE; i++) - table[i] = (JSAMPLE) i; - table += CENTERJSAMPLE; /* Point to where post-IDCT table starts */ - /* End of simple table, rest of first half of post-IDCT table */ - for (i = CENTERJSAMPLE; i < 2*(MAXJSAMPLE+1); i++) - table[i] = MAXJSAMPLE; - /* Second half of post-IDCT table */ - MEMZERO(table + (2 * (MAXJSAMPLE+1)), - (2 * (MAXJSAMPLE+1) - CENTERJSAMPLE) * SIZEOF(JSAMPLE)); - MEMCOPY(table + (4 * (MAXJSAMPLE+1) - CENTERJSAMPLE), - cinfo->sample_range_limit, CENTERJSAMPLE * SIZEOF(JSAMPLE)); -} - - -/* - * Master selection of decompression modules. - * This is done once at jpeg_start_decompress time. We determine - * which modules will be used and give them appropriate initialization calls. - * We also initialize the decompressor input side to begin consuming data. - * - * Since jpeg_read_header has finished, we know what is in the SOF - * and (first) SOS markers. We also have all the application parameter - * settings. - */ - -LOCAL(void) -master_selection (j_decompress_ptr cinfo) -{ - my_master_ptr6 master = (my_master_ptr6) cinfo->master; - boolean use_c_buffer; - long samplesperrow; - JDIMENSION jd_samplesperrow; - - /* Initialize dimensions and other stuff */ - jpeg_calc_output_dimensions(cinfo); - prepare_range_limit_table(cinfo); - - /* Width of an output scanline must be representable as JDIMENSION. */ - samplesperrow = (long) cinfo->output_width * (long) cinfo->out_color_components; - jd_samplesperrow = (JDIMENSION) samplesperrow; - if ((long) jd_samplesperrow != samplesperrow) - ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); - - /* Initialize my private state */ - master->pass_number = 0; - master->using_merged_upsample = use_merged_upsample(cinfo); - - /* Color quantizer selection */ - master->quantizer_1pass = NULL; - master->quantizer_2pass = NULL; - /* No mode changes if not using buffered-image mode. */ - if (! cinfo->quantize_colors || ! cinfo->buffered_image) { - cinfo->enable_1pass_quant = FALSE; - cinfo->enable_external_quant = FALSE; - cinfo->enable_2pass_quant = FALSE; - } - if (cinfo->quantize_colors) { - if (cinfo->raw_data_out) - ERREXIT(cinfo, JERR_NOTIMPL); - /* 2-pass quantizer only works in 3-component color space. */ - if (cinfo->out_color_components != 3) { - cinfo->enable_1pass_quant = TRUE; - cinfo->enable_external_quant = FALSE; - cinfo->enable_2pass_quant = FALSE; - cinfo->colormap = NULL; - } else if (cinfo->colormap != NULL) { - cinfo->enable_external_quant = TRUE; - } else if (cinfo->two_pass_quantize) { - cinfo->enable_2pass_quant = TRUE; - } else { - cinfo->enable_1pass_quant = TRUE; - } - - if (cinfo->enable_1pass_quant) { -#ifdef QUANT_1PASS_SUPPORTED - jinit_1pass_quantizer(cinfo); - master->quantizer_1pass = cinfo->cquantize; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } - - /* We use the 2-pass code to map to external colormaps. */ - if (cinfo->enable_2pass_quant || cinfo->enable_external_quant) { -#ifdef QUANT_2PASS_SUPPORTED - jinit_2pass_quantizer(cinfo); - master->quantizer_2pass = cinfo->cquantize; -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } - /* If both quantizers are initialized, the 2-pass one is left active; - * this is necessary for starting with quantization to an external map. - */ - } - - /* Post-processing: in particular, color conversion first */ - if (! cinfo->raw_data_out) { - if (master->using_merged_upsample) { -#ifdef UPSAMPLE_MERGING_SUPPORTED - jinit_merged_upsampler(cinfo); /* does color conversion too */ -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else { - jinit_color_deconverter(cinfo); - jinit_upsampler(cinfo); - } - jinit_d_post_controller(cinfo, cinfo->enable_2pass_quant); - } - /* Inverse DCT */ - jinit_inverse_dct(cinfo); - /* Entropy decoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef D_PROGRESSIVE_SUPPORTED - jinit_phuff_decoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_decoder(cinfo); - } - - /* Initialize principal buffer controllers. */ - use_c_buffer = cinfo->inputctl->has_multiple_scans || cinfo->buffered_image; - jinit_d_coef_controller(cinfo, use_c_buffer); - - if (! cinfo->raw_data_out) - jinit_d_main_controller(cinfo, FALSE /* never need full buffer here */); - - /* We can now tell the memory manager to allocate virtual arrays. */ - (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); - - /* Initialize input side of decompressor to consume first scan. */ - (*cinfo->inputctl->start_input_pass) (cinfo); - -#ifdef D_MULTISCAN_FILES_SUPPORTED - /* If jpeg_start_decompress will read the whole file, initialize - * progress monitoring appropriately. The input step is counted - * as one pass. - */ - if (cinfo->progress != NULL && ! cinfo->buffered_image && - cinfo->inputctl->has_multiple_scans) { - int nscans; - /* Estimate number of scans to set pass_limit. */ - if (cinfo->progressive_mode) { - /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ - nscans = 2 + 3 * cinfo->num_components; - } else { - /* For a nonprogressive multiscan file, estimate 1 scan per component. */ - nscans = cinfo->num_components; - } - cinfo->progress->pass_counter = 0L; - cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; - cinfo->progress->completed_passes = 0; - cinfo->progress->total_passes = (cinfo->enable_2pass_quant ? 3 : 2); - /* Count the input pass as done */ - master->pass_number++; - } -#endif /* D_MULTISCAN_FILES_SUPPORTED */ -} - - -/* - * Per-pass setup. - * This is called at the beginning of each output pass. We determine which - * modules will be active during this pass and give them appropriate - * start_pass calls. We also set is_dummy_pass to indicate whether this - * is a "real" output pass or a dummy pass for color quantization. - * (In the latter case, jdapistd.c will crank the pass to completion.) - */ - -METHODDEF(void) -prepare_for_output_pass (j_decompress_ptr cinfo) -{ - my_master_ptr6 master = (my_master_ptr6) cinfo->master; - - if (master->pub.is_dummy_pass) { -#ifdef QUANT_2PASS_SUPPORTED - /* Final pass of 2-pass quantization */ - master->pub.is_dummy_pass = FALSE; - (*cinfo->cquantize->start_pass) (cinfo, FALSE); - (*cinfo->post->start_pass) (cinfo, JBUF_CRANK_DEST); - (*cinfo->main->start_pass) (cinfo, JBUF_CRANK_DEST); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif /* QUANT_2PASS_SUPPORTED */ - } else { - if (cinfo->quantize_colors && cinfo->colormap == NULL) { - /* Select new quantization method */ - if (cinfo->two_pass_quantize && cinfo->enable_2pass_quant) { - cinfo->cquantize = master->quantizer_2pass; - master->pub.is_dummy_pass = TRUE; - } else if (cinfo->enable_1pass_quant) { - cinfo->cquantize = master->quantizer_1pass; - } else { - ERREXIT(cinfo, JERR_MODE_CHANGE); - } - } - (*cinfo->idct->start_pass) (cinfo); - (*cinfo->coef->start_output_pass) (cinfo); - if (! cinfo->raw_data_out) { - if (! master->using_merged_upsample) - (*cinfo->cconvert->start_pass) (cinfo); - (*cinfo->upsample->start_pass) (cinfo); - if (cinfo->quantize_colors) - (*cinfo->cquantize->start_pass) (cinfo, master->pub.is_dummy_pass); - (*cinfo->post->start_pass) (cinfo, - (master->pub.is_dummy_pass ? JBUF_SAVE_AND_PASS : JBUF_PASS_THRU)); - (*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU); - } - } - - /* Set up progress monitor's pass info if present */ - if (cinfo->progress != NULL) { - cinfo->progress->completed_passes = master->pass_number; - cinfo->progress->total_passes = master->pass_number + - (master->pub.is_dummy_pass ? 2 : 1); - /* In buffered-image mode, we assume one more output pass if EOI not - * yet reached, but no more passes if EOI has been reached. - */ - if (cinfo->buffered_image && ! cinfo->inputctl->eoi_reached) { - cinfo->progress->total_passes += (cinfo->enable_2pass_quant ? 2 : 1); - } - } -} - - -/* - * Finish up at end of an output pass. - */ - -METHODDEF(void) -finish_output_pass (j_decompress_ptr cinfo) -{ - my_master_ptr6 master = (my_master_ptr6) cinfo->master; - - if (cinfo->quantize_colors) - (*cinfo->cquantize->finish_pass) (cinfo); - master->pass_number++; -} - - -#ifdef D_MULTISCAN_FILES_SUPPORTED - -/* - * Switch to a new external colormap between output passes. - */ - -GLOBAL(void) -jpeg_new_colormap (j_decompress_ptr cinfo) -{ - my_master_ptr6 master = (my_master_ptr6) cinfo->master; - - /* Prevent application from calling me at wrong times */ - if (cinfo->global_state != DSTATE_BUFIMAGE) - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - - if (cinfo->quantize_colors && cinfo->enable_external_quant && - cinfo->colormap != NULL) { - /* Select 2-pass quantizer for external colormap use */ - cinfo->cquantize = master->quantizer_2pass; - /* Notify quantizer of colormap change */ - (*cinfo->cquantize->new_color_map) (cinfo); - master->pub.is_dummy_pass = FALSE; /* just in case */ - } else - ERREXIT(cinfo, JERR_MODE_CHANGE); -} - -#endif /* D_MULTISCAN_FILES_SUPPORTED */ - - -/* - * Initialize master decompression control and select active modules. - * This is performed at the start of jpeg_start_decompress. - */ - -GLOBAL(void) -jinit_master_decompress (j_decompress_ptr cinfo) -{ - my_master_ptr6 master; - - master = (my_master_ptr6) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_decomp_master)); - cinfo->master = (struct jpeg_decomp_master *) master; - master->pub.prepare_for_output_pass = prepare_for_output_pass; - master->pub.finish_output_pass = finish_output_pass; - - master->pub.is_dummy_pass = FALSE; - - master_selection(cinfo); -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmerge.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmerge.c deleted file mode 100755 index 1f483f6..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdmerge.c +++ /dev/null @@ -1,400 +0,0 @@ -/* - * jdmerge.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains code for merged upsampling/color conversion. - * - * This file combines functions from jdsample.c and jdcolor.c; - * read those files first to understand what's going on. - * - * When the chroma components are to be upsampled by simple replication - * (ie, box filtering), we can save some work in color conversion by - * calculating all the output pixels corresponding to a pair of chroma - * samples at one time. In the conversion equations - * R = Y + K1 * Cr - * G = Y + K2 * Cb + K3 * Cr - * B = Y + K4 * Cb - * only the Y term varies among the group of pixels corresponding to a pair - * of chroma samples, so the rest of the terms can be calculated just once. - * At typical sampling ratios, this eliminates half or three-quarters of the - * multiplications needed for color conversion. - * - * This file currently provides implementations for the following cases: - * YCbCr => RGB color conversion only. - * Sampling ratios of 2h1v or 2h2v. - * No scaling needed at upsample time. - * Corner-aligned (non-CCIR601) sampling alignment. - * Other special cases could be added, but in most applications these are - * the only common cases. (For uncommon cases we fall back on the more - * general code in jdsample.c and jdcolor.c.) - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - -#ifdef UPSAMPLE_MERGING_SUPPORTED - - -/* Private subobject */ - -typedef struct { - struct jpeg_upsampler pub; /* public fields */ - - /* Pointer to routine to do actual upsampling/conversion of one row group */ - JMETHOD(void, upmethod, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, - JSAMPARRAY output_buf)); - - /* Private state for YCC->RGB conversion */ - int * Cr_r_tab; /* => table for Cr to R conversion */ - int * Cb_b_tab; /* => table for Cb to B conversion */ - INT32 * Cr_g_tab; /* => table for Cr to G conversion */ - INT32 * Cb_g_tab; /* => table for Cb to G conversion */ - - /* For 2:1 vertical sampling, we produce two output rows at a time. - * We need a "spare" row buffer to hold the second output row if the - * application provides just a one-row buffer; we also use the spare - * to discard the dummy last row if the image height is odd. - */ - JSAMPROW spare_row; - boolean spare_full; /* T if spare buffer is occupied */ - - JDIMENSION out_row_width; /* samples per output row */ - JDIMENSION rows_to_go; /* counts rows remaining in image */ -} my_upsampler; - -typedef my_upsampler * my_upsample_ptr; - -#define SCALEBITS 16 /* speediest right-shift on some machines */ -#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) -#define FIX(x) ((INT32) ((x) * (1L<RGB colorspace conversion. - * This is taken directly from jdcolor.c; see that file for more info. - */ - -LOCAL(void) -build_ycc_rgb_table2 (j_decompress_ptr cinfo) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - int i; - INT32 x; - SHIFT_TEMPS - - upsample->Cr_r_tab = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(int)); - upsample->Cb_b_tab = (int *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(int)); - upsample->Cr_g_tab = (INT32 *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(INT32)); - upsample->Cb_g_tab = (INT32 *) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (MAXJSAMPLE+1) * SIZEOF(INT32)); - - for (i = 0, x = -CENTERJSAMPLE; i <= MAXJSAMPLE; i++, x++) { - /* i is the actual input pixel value, in the range 0..MAXJSAMPLE */ - /* The Cb or Cr value we are thinking of is x = i - CENTERJSAMPLE */ - /* Cr=>R value is nearest int to 1.40200 * x */ - upsample->Cr_r_tab[i] = (int) - RIGHT_SHIFT(FIX(1.40200) * x + ONE_HALF, SCALEBITS); - /* Cb=>B value is nearest int to 1.77200 * x */ - upsample->Cb_b_tab[i] = (int) - RIGHT_SHIFT(FIX(1.77200) * x + ONE_HALF, SCALEBITS); - /* Cr=>G value is scaled-up -0.71414 * x */ - upsample->Cr_g_tab[i] = (- FIX(0.71414)) * x; - /* Cb=>G value is scaled-up -0.34414 * x */ - /* We also add in ONE_HALF so that need not do it in inner loop */ - upsample->Cb_g_tab[i] = (- FIX(0.34414)) * x + ONE_HALF; - } -} - - -/* - * Initialize for an upsampling pass. - */ - -METHODDEF(void) -start_pass_merged_upsample (j_decompress_ptr cinfo) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - - /* Mark the spare buffer empty */ - upsample->spare_full = FALSE; - /* Initialize total-height counter for detecting bottom of image */ - upsample->rows_to_go = cinfo->output_height; -} - - -/* - * Control routine to do upsampling (and color conversion). - * - * The control routine just handles the row buffering considerations. - */ - -METHODDEF(void) -merged_2v_upsample (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -/* 2:1 vertical sampling case: may need a spare row. */ -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - JSAMPROW work_ptrs[2]; - JDIMENSION num_rows; /* number of rows returned to caller */ - - if (upsample->spare_full) { - /* If we have a spare row saved from a previous cycle, just return it. */ - jcopy_sample_rows(& upsample->spare_row, 0, output_buf + *out_row_ctr, 0, - 1, upsample->out_row_width); - num_rows = 1; - upsample->spare_full = FALSE; - } else { - /* Figure number of rows to return to caller. */ - num_rows = 2; - /* Not more than the distance to the end of the image. */ - if (num_rows > upsample->rows_to_go) - num_rows = upsample->rows_to_go; - /* And not more than what the client can accept: */ - out_rows_avail -= *out_row_ctr; - if (num_rows > out_rows_avail) - num_rows = out_rows_avail; - /* Create output pointer array for upsampler. */ - work_ptrs[0] = output_buf[*out_row_ctr]; - if (num_rows > 1) { - work_ptrs[1] = output_buf[*out_row_ctr + 1]; - } else { - work_ptrs[1] = upsample->spare_row; - upsample->spare_full = TRUE; - } - /* Now do the upsampling. */ - (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, work_ptrs); - } - - /* Adjust counts */ - *out_row_ctr += num_rows; - upsample->rows_to_go -= num_rows; - /* When the buffer is emptied, declare this input row group consumed */ - if (! upsample->spare_full) - (*in_row_group_ctr)++; -} - - -METHODDEF(void) -merged_1v_upsample (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION) -/* 1:1 vertical sampling case: much easier, never need a spare row. */ -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - - /* Just do the upsampling. */ - (*upsample->upmethod) (cinfo, input_buf, *in_row_group_ctr, - output_buf + *out_row_ctr); - /* Adjust counts */ - (*out_row_ctr)++; - (*in_row_group_ctr)++; -} - - -/* - * These are the routines invoked by the control routines to do - * the actual upsampling/conversion. One row group is processed per call. - * - * Note: since we may be writing directly into application-supplied buffers, - * we have to be honest about the output width; we can't assume the buffer - * has been rounded up to an even width. - */ - - -/* - * Upsample and color convert for the case of 2:1 horizontal and 1:1 vertical. - */ - -METHODDEF(void) -h2v1_merged_upsample (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, - JSAMPARRAY output_buf) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - int y, cred, cgreen, cblue; - int cb, cr; - JSAMPROW outptr; - JSAMPROW inptr0, inptr1, inptr2; - JDIMENSION col; - /* copy these pointers into registers if possible */ - JSAMPLE * range_limit = cinfo->sample_range_limit; - int * Crrtab = upsample->Cr_r_tab; - int * Cbbtab = upsample->Cb_b_tab; - INT32 * Crgtab = upsample->Cr_g_tab; - INT32 * Cbgtab = upsample->Cb_g_tab; - SHIFT_TEMPS - - inptr0 = input_buf[0][in_row_group_ctr]; - inptr1 = input_buf[1][in_row_group_ctr]; - inptr2 = input_buf[2][in_row_group_ctr]; - outptr = output_buf[0]; - /* Loop for each pair of output pixels */ - for (col = cinfo->output_width >> 1; col > 0; col--) { - /* Do the chroma part of the calculation */ - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); - cred = Crrtab[cr]; - cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); - cblue = Cbbtab[cb]; - /* Fetch 2 Y values and emit 2 pixels */ - y = GETJSAMPLE(*inptr0++); - outptr[RGB_RED] = range_limit[y + cred]; - outptr[RGB_GREEN] = range_limit[y + cgreen]; - outptr[RGB_BLUE] = range_limit[y + cblue]; - outptr += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr0++); - outptr[RGB_RED] = range_limit[y + cred]; - outptr[RGB_GREEN] = range_limit[y + cgreen]; - outptr[RGB_BLUE] = range_limit[y + cblue]; - outptr += RGB_PIXELSIZE; - } - /* If image width is odd, do the last output column separately */ - if (cinfo->output_width & 1) { - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); - cred = Crrtab[cr]; - cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); - cblue = Cbbtab[cb]; - y = GETJSAMPLE(*inptr0); - outptr[RGB_RED] = range_limit[y + cred]; - outptr[RGB_GREEN] = range_limit[y + cgreen]; - outptr[RGB_BLUE] = range_limit[y + cblue]; - } -} - - -/* - * Upsample and color convert for the case of 2:1 horizontal and 2:1 vertical. - */ - -METHODDEF(void) -h2v2_merged_upsample (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_group_ctr, - JSAMPARRAY output_buf) -{ - my_upsample_ptr upsample = (my_upsample_ptr) cinfo->upsample; - int y, cred, cgreen, cblue; - int cb, cr; - JSAMPROW outptr0, outptr1; - JSAMPROW inptr00, inptr01, inptr1, inptr2; - JDIMENSION col; - /* copy these pointers into registers if possible */ - JSAMPLE * range_limit = cinfo->sample_range_limit; - int * Crrtab = upsample->Cr_r_tab; - int * Cbbtab = upsample->Cb_b_tab; - INT32 * Crgtab = upsample->Cr_g_tab; - INT32 * Cbgtab = upsample->Cb_g_tab; - SHIFT_TEMPS - - inptr00 = input_buf[0][in_row_group_ctr*2]; - inptr01 = input_buf[0][in_row_group_ctr*2 + 1]; - inptr1 = input_buf[1][in_row_group_ctr]; - inptr2 = input_buf[2][in_row_group_ctr]; - outptr0 = output_buf[0]; - outptr1 = output_buf[1]; - /* Loop for each group of output pixels */ - for (col = cinfo->output_width >> 1; col > 0; col--) { - /* Do the chroma part of the calculation */ - cb = GETJSAMPLE(*inptr1++); - cr = GETJSAMPLE(*inptr2++); - cred = Crrtab[cr]; - cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); - cblue = Cbbtab[cb]; - /* Fetch 4 Y values and emit 4 pixels */ - y = GETJSAMPLE(*inptr00++); - outptr0[RGB_RED] = range_limit[y + cred]; - outptr0[RGB_GREEN] = range_limit[y + cgreen]; - outptr0[RGB_BLUE] = range_limit[y + cblue]; - outptr0 += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr00++); - outptr0[RGB_RED] = range_limit[y + cred]; - outptr0[RGB_GREEN] = range_limit[y + cgreen]; - outptr0[RGB_BLUE] = range_limit[y + cblue]; - outptr0 += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr01++); - outptr1[RGB_RED] = range_limit[y + cred]; - outptr1[RGB_GREEN] = range_limit[y + cgreen]; - outptr1[RGB_BLUE] = range_limit[y + cblue]; - outptr1 += RGB_PIXELSIZE; - y = GETJSAMPLE(*inptr01++); - outptr1[RGB_RED] = range_limit[y + cred]; - outptr1[RGB_GREEN] = range_limit[y + cgreen]; - outptr1[RGB_BLUE] = range_limit[y + cblue]; - outptr1 += RGB_PIXELSIZE; - } - /* If image width is odd, do the last output column separately */ - if (cinfo->output_width & 1) { - cb = GETJSAMPLE(*inptr1); - cr = GETJSAMPLE(*inptr2); - cred = Crrtab[cr]; - cgreen = (int) RIGHT_SHIFT(Cbgtab[cb] + Crgtab[cr], SCALEBITS); - cblue = Cbbtab[cb]; - y = GETJSAMPLE(*inptr00); - outptr0[RGB_RED] = range_limit[y + cred]; - outptr0[RGB_GREEN] = range_limit[y + cgreen]; - outptr0[RGB_BLUE] = range_limit[y + cblue]; - y = GETJSAMPLE(*inptr01); - outptr1[RGB_RED] = range_limit[y + cred]; - outptr1[RGB_GREEN] = range_limit[y + cgreen]; - outptr1[RGB_BLUE] = range_limit[y + cblue]; - } -} - - -/* - * Module initialization routine for merged upsampling/color conversion. - * - * NB: this is called under the conditions determined by use_merged_upsample() - * in jdmaster.c. That routine MUST correspond to the actual capabilities - * of this module; no safety checks are made here. - */ - -GLOBAL(void) -jinit_merged_upsampler (j_decompress_ptr cinfo) -{ - my_upsample_ptr upsample; - - upsample = (my_upsample_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_upsampler)); - cinfo->upsample = (struct jpeg_upsampler *) upsample; - upsample->pub.start_pass = start_pass_merged_upsample; - upsample->pub.need_context_rows = FALSE; - - upsample->out_row_width = cinfo->output_width * cinfo->out_color_components; - - if (cinfo->max_v_samp_factor == 2) { - upsample->pub.upsample = merged_2v_upsample; - upsample->upmethod = h2v2_merged_upsample; - /* Allocate a spare row buffer */ - upsample->spare_row = (JSAMPROW) - (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, - (size_t) (upsample->out_row_width * SIZEOF(JSAMPLE))); - } else { - upsample->pub.upsample = merged_1v_upsample; - upsample->upmethod = h2v1_merged_upsample; - /* No spare row needed */ - upsample->spare_row = NULL; - } - - build_ycc_rgb_table2(cinfo); -} - -#endif /* UPSAMPLE_MERGING_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdphuff.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdphuff.c deleted file mode 100755 index 10e0a46..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdphuff.c +++ /dev/null @@ -1,642 +0,0 @@ -/* - * jdphuff.c - * - * Copyright (C) 1995-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains Huffman entropy decoding routines for progressive JPEG. - * - * Much of the complexity here has to do with supporting input suspension. - * If the data source module demands suspension, we want to be able to back - * up to the start of the current MCU. To do this, we copy state variables - * into local working storage, and update them back to the permanent - * storage only upon successful completion of an MCU. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdhuff.h" /* Declarations shared with jdhuff.c */ - - -#ifdef D_PROGRESSIVE_SUPPORTED - -/* - * Expanded entropy decoder object for progressive Huffman decoding. - * - * The savable_state subrecord contains fields that change within an MCU, - * but must not be updated permanently until we complete the MCU. - */ - -typedef struct { - unsigned int EOBRUN; /* remaining EOBs in EOBRUN */ - int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */ -} savable_state3; - -/* This macro is to work around compilers with missing or broken - * structure assignment. You'll need to fix this code if you have - * such a compiler and you change MAX_COMPS_IN_SCAN. - */ - -#ifndef NO_STRUCT_ASSIGN -#define ASSIGN_STATE(dest,src) ((dest) = (src)) -#else -#if MAX_COMPS_IN_SCAN == 4 -#define ASSIGN_STATE(dest,src) \ - ((dest).EOBRUN = (src).EOBRUN, \ - (dest).last_dc_val[0] = (src).last_dc_val[0], \ - (dest).last_dc_val[1] = (src).last_dc_val[1], \ - (dest).last_dc_val[2] = (src).last_dc_val[2], \ - (dest).last_dc_val[3] = (src).last_dc_val[3]) -#endif -#endif - - -typedef struct { - struct jpeg_entropy_decoder pub; /* public fields */ - - /* These fields are loaded into local variables at start of each MCU. - * In case of suspension, we exit WITHOUT updating them. - */ - bitread_perm_state bitstate; /* Bit buffer at start of MCU */ - savable_state3 saved; /* Other state at start of MCU */ - - /* These fields are NOT loaded into local working state. */ - unsigned int restarts_to_go; /* MCUs left in this restart interval */ - - /* Pointers to derived tables (these workspaces have image lifespan) */ - d_derived_tbl * derived_tbls[NUM_HUFF_TBLS]; - - d_derived_tbl * ac_derived_tbl; /* active table during an AC scan */ -} phuff_entropy_decoder; - -typedef phuff_entropy_decoder * phuff_entropy_ptr2; - -/* Forward declarations */ -METHODDEF(boolean) decode_mcu_DC_first JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) decode_mcu_AC_first JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) decode_mcu_DC_refine JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); -METHODDEF(boolean) decode_mcu_AC_refine JPP((j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); - - -/* - * Initialize for a Huffman-compressed scan. - */ - -METHODDEF(void) -start_pass_phuff_decoder (j_decompress_ptr cinfo) -{ - phuff_entropy_ptr2 entropy = (phuff_entropy_ptr2) cinfo->entropy; - boolean is_DC_band, bad; - int ci, coefi, tbl; - int *coef_bit_ptr; - jpeg_component_info * compptr; - - is_DC_band = (cinfo->Ss == 0); - - /* Validate scan parameters */ - bad = FALSE; - if (is_DC_band) { - if (cinfo->Se != 0) - bad = TRUE; - } else { - /* need not check Ss/Se < 0 since they came from unsigned bytes */ - if (cinfo->Ss > cinfo->Se || cinfo->Se >= DCTSIZE2) - bad = TRUE; - /* AC scans may have only one component */ - if (cinfo->comps_in_scan != 1) - bad = TRUE; - } - if (cinfo->Ah != 0) { - /* Successive approximation refinement scan: must have Al = Ah-1. */ - if (cinfo->Al != cinfo->Ah-1) - bad = TRUE; - } - if (cinfo->Al > 13) /* need not check for < 0 */ - bad = TRUE; - /* Arguably the maximum Al value should be less than 13 for 8-bit precision, - * but the spec doesn't say so, and we try to be liberal about what we - * accept. Note: large Al values could result in out-of-range DC - * coefficients during early scans, leading to bizarre displays due to - * overflows in the IDCT math. But we won't crash. - */ - if (bad) - ERREXIT4(cinfo, JERR_BAD_PROGRESSION, - cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al); - /* Update progression status, and verify that scan order is legal. - * Note that inter-scan inconsistencies are treated as warnings - * not fatal errors ... not clear if this is right way to behave. - */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - int cindex = cinfo->cur_comp_info[ci]->component_index; - coef_bit_ptr = & cinfo->coef_bits[cindex][0]; - if (!is_DC_band && coef_bit_ptr[0] < 0) /* AC without prior DC scan */ - WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0); - for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) { - int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi]; - if (cinfo->Ah != expected) - WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi); - coef_bit_ptr[coefi] = cinfo->Al; - } - } - - /* Select MCU decoding routine */ - if (cinfo->Ah == 0) { - if (is_DC_band) - entropy->pub.decode_mcu = decode_mcu_DC_first; - else - entropy->pub.decode_mcu = decode_mcu_AC_first; - } else { - if (is_DC_band) - entropy->pub.decode_mcu = decode_mcu_DC_refine; - else - entropy->pub.decode_mcu = decode_mcu_AC_refine; - } - - for (ci = 0; ci < cinfo->comps_in_scan; ci++) { - compptr = cinfo->cur_comp_info[ci]; - /* Make sure requested tables are present, and compute derived tables. - * We may build same derived table more than once, but it's not expensive. - */ - if (is_DC_band) { - if (cinfo->Ah == 0) { /* DC refinement needs no table */ - tbl = compptr->dc_tbl_no; - jpeg_make_d_derived_tbl(cinfo, TRUE, tbl, - & entropy->derived_tbls[tbl]); - } - } else { - tbl = compptr->ac_tbl_no; - jpeg_make_d_derived_tbl(cinfo, FALSE, tbl, - & entropy->derived_tbls[tbl]); - /* remember the single active table */ - entropy->ac_derived_tbl = entropy->derived_tbls[tbl]; - } - /* Initialize DC predictions to 0 */ - entropy->saved.last_dc_val[ci] = 0; - } - - /* Initialize bitread state variables */ - entropy->bitstate.bits_left = 0; - entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ - entropy->pub.insufficient_data = FALSE; - - /* Initialize private state variables */ - entropy->saved.EOBRUN = 0; - - /* Initialize restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; -} - - -/* - * Check for a restart marker & resynchronize decoder. - * Returns FALSE if must suspend. - */ - -LOCAL(boolean) -process_restartp (j_decompress_ptr cinfo) -{ - phuff_entropy_ptr2 entropy = (phuff_entropy_ptr2) cinfo->entropy; - int ci; - - /* Throw away any unused bits remaining in bit buffer; */ - /* include any full bytes in next_marker's count of discarded bytes */ - cinfo->marker->discarded_bytes += entropy->bitstate.bits_left / 8; - entropy->bitstate.bits_left = 0; - - /* Advance past the RSTn marker */ - if (! (*cinfo->marker->read_restart_marker) (cinfo)) - return FALSE; - - /* Re-initialize DC predictions to 0 */ - for (ci = 0; ci < cinfo->comps_in_scan; ci++) - entropy->saved.last_dc_val[ci] = 0; - /* Re-init EOB run count, too */ - entropy->saved.EOBRUN = 0; - - /* Reset restart counter */ - entropy->restarts_to_go = cinfo->restart_interval; - - /* Reset out-of-data flag, unless read_restart_marker left us smack up - * against a marker. In that case we will end up treating the next data - * segment as empty, and we can avoid producing bogus output pixels by - * leaving the flag set. - */ - if (cinfo->unread_marker == 0) - entropy->pub.insufficient_data = FALSE; - - return TRUE; -} - - -/* - * Huffman MCU decoding. - * Each of these routines decodes and returns one MCU's worth of - * Huffman-compressed coefficients. - * The coefficients are reordered from zigzag order into natural array order, - * but are not dequantized. - * - * The i'th block of the MCU is stored into the block pointed to by - * MCU_data[i]. WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER. - * - * We return FALSE if data source requested suspension. In that case no - * changes have been made to permanent state. (Exception: some output - * coefficients may already have been assigned. This is harmless for - * spectral selection, since we'll just re-assign them on the next call. - * Successive approximation AC refinement has to be more careful, however.) - */ - -/* - * MCU decoding for DC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr2 entropy = (phuff_entropy_ptr2) cinfo->entropy; - int Al = cinfo->Al; - int s, r; - int blkn, ci; - JBLOCKROW block; - BITREAD_STATE_VARS; - savable_state3 state; - d_derived_tbl * tbl; - jpeg_component_info * compptr; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restartp(cinfo)) - return FALSE; - } - - /* If we've run out of data, just leave the MCU set to zeroes. - * This way, we return uniform gray for the remainder of the segment. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - ASSIGN_STATE(state, entropy->saved); - - /* Outer loop handles each block in the MCU */ - - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - ci = cinfo->MCU_membership[blkn]; - compptr = cinfo->cur_comp_info[ci]; - tbl = entropy->derived_tbls[compptr->dc_tbl_no]; - - /* Decode a single block's worth of coefficients */ - - /* Section F.2.2.1: decode the DC coefficient difference */ - HUFF_DECODE(s, br_state, tbl, return FALSE, label1); - if (s) { - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - } - - /* Convert DC difference to actual value, update last_dc_val */ - s += state.last_dc_val[ci]; - state.last_dc_val[ci] = s; - /* Scale and output the coefficient (assumes jpeg_natural_order[0]=0) */ - (*block)[0] = (JCOEF) (s << Al); - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - ASSIGN_STATE(entropy->saved, state); - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * MCU decoding for AC initial scan (either spectral selection, - * or first pass of successive approximation). - */ - -METHODDEF(boolean) -decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr2 entropy = (phuff_entropy_ptr2) cinfo->entropy; - int Se = cinfo->Se; - int Al = cinfo->Al; - int s, k, r; - unsigned int EOBRUN; - JBLOCKROW block; - BITREAD_STATE_VARS; - d_derived_tbl * tbl; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restartp(cinfo)) - return FALSE; - } - - /* If we've run out of data, just leave the MCU set to zeroes. - * This way, we return uniform gray for the remainder of the segment. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state. - * We can avoid loading/saving bitread state if in an EOB run. - */ - EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ - - /* There is always only one block per MCU */ - - if (EOBRUN > 0) /* if it's a band of zeroes... */ - EOBRUN--; /* ...process it now (we do nothing) */ - else { - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - block = MCU_data[0]; - tbl = entropy->ac_derived_tbl; - - for (k = cinfo->Ss; k <= Se; k++) { - HUFF_DECODE(s, br_state, tbl, return FALSE, label2); - r = s >> 4; - s &= 15; - if (s) { - k += r; - CHECK_BIT_BUFFER(br_state, s, return FALSE); - r = GET_BITS(s); - s = HUFF_EXTEND(r, s); - /* Scale and output coefficient in natural (dezigzagged) order */ - (*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al); - } else { - if (r == 15) { /* ZRL */ - k += 15; /* skip 15 zeroes in band */ - } else { /* EOBr, run length is 2^r + appended bits */ - EOBRUN = 1 << r; - if (r) { /* EOBr, r > 0 */ - CHECK_BIT_BUFFER(br_state, r, return FALSE); - r = GET_BITS(r); - EOBRUN += r; - } - EOBRUN--; /* this band is processed at this moment */ - break; /* force end-of-band */ - } - } - } - - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - } - - /* Completed MCU, so update state */ - entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * MCU decoding for DC successive approximation refinement scan. - * Note: we assume such scans can be multi-component, although the spec - * is not very clear on the point. - */ - -METHODDEF(boolean) -decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr2 entropy = (phuff_entropy_ptr2) cinfo->entropy; - int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ - int blkn; - JBLOCKROW block; - BITREAD_STATE_VARS; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restartp(cinfo)) - return FALSE; - } - - /* Not worth the cycles to check insufficient_data here, - * since we will not change the data anyway if we read zeroes. - */ - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - - /* Outer loop handles each block in the MCU */ - - for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { - block = MCU_data[blkn]; - - /* Encoded data is simply the next bit of the two's-complement DC value */ - CHECK_BIT_BUFFER(br_state, 1, return FALSE); - if (GET_BITS(1)) - (*block)[0] |= p1; - /* Note: since we use |=, repeating the assignment later is safe */ - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; -} - - -/* - * MCU decoding for AC successive approximation refinement scan. - */ - -METHODDEF(boolean) -decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) -{ - phuff_entropy_ptr2 entropy = (phuff_entropy_ptr2) cinfo->entropy; - int Se = cinfo->Se; - int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ - int m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */ - int s, k, r; - unsigned int EOBRUN; - JBLOCKROW block; - JCOEFPTR thiscoef; - BITREAD_STATE_VARS; - d_derived_tbl * tbl; - int num_newnz; - int newnz_pos[DCTSIZE2]; - - /* Process restart marker if needed; may have to suspend */ - if (cinfo->restart_interval) { - if (entropy->restarts_to_go == 0) - if (! process_restartp(cinfo)) - return FALSE; - } - - /* If we've run out of data, don't modify the MCU. - */ - if (! entropy->pub.insufficient_data) { - - /* Load up working state */ - BITREAD_LOAD_STATE(cinfo,entropy->bitstate); - EOBRUN = entropy->saved.EOBRUN; /* only part of saved state we need */ - - /* There is always only one block per MCU */ - block = MCU_data[0]; - tbl = entropy->ac_derived_tbl; - - /* If we are forced to suspend, we must undo the assignments to any newly - * nonzero coefficients in the block, because otherwise we'd get confused - * next time about which coefficients were already nonzero. - * But we need not undo addition of bits to already-nonzero coefficients; - * instead, we can test the current bit to see if we already did it. - */ - num_newnz = 0; - - /* initialize coefficient loop counter to start of band */ - k = cinfo->Ss; - - if (EOBRUN == 0) { - for (; k <= Se; k++) { - HUFF_DECODE(s, br_state, tbl, goto undoit, label3); - r = s >> 4; - s &= 15; - if (s) { - if (s != 1) /* size of new coef should always be 1 */ - WARNMS(cinfo, JWRN_HUFF_BAD_CODE); - CHECK_BIT_BUFFER(br_state, 1, goto undoit); - if (GET_BITS(1)) - s = p1; /* newly nonzero coef is positive */ - else - s = m1; /* newly nonzero coef is negative */ - } else { - if (r != 15) { - EOBRUN = 1 << r; /* EOBr, run length is 2^r + appended bits */ - if (r) { - CHECK_BIT_BUFFER(br_state, r, goto undoit); - r = GET_BITS(r); - EOBRUN += r; - } - break; /* rest of block is handled by EOB logic */ - } - /* note s = 0 for processing ZRL */ - } - /* Advance over already-nonzero coefs and r still-zero coefs, - * appending correction bits to the nonzeroes. A correction bit is 1 - * if the absolute value of the coefficient must be increased. - */ - do { - thiscoef = *block + jpeg_natural_order[k]; - if (*thiscoef != 0) { - CHECK_BIT_BUFFER(br_state, 1, goto undoit); - if (GET_BITS(1)) { - if ((*thiscoef & p1) == 0) { /* do nothing if already set it */ - if (*thiscoef >= 0) - *thiscoef += p1; - else - *thiscoef += m1; - } - } - } else { - if (--r < 0) - break; /* reached target zero coefficient */ - } - k++; - } while (k <= Se); - if (s) { - int pos = jpeg_natural_order[k]; - /* Output newly nonzero coefficient */ - (*block)[pos] = (JCOEF) s; - /* Remember its position in case we have to suspend */ - newnz_pos[num_newnz++] = pos; - } - } - } - - if (EOBRUN > 0) { - /* Scan any remaining coefficient positions after the end-of-band - * (the last newly nonzero coefficient, if any). Append a correction - * bit to each already-nonzero coefficient. A correction bit is 1 - * if the absolute value of the coefficient must be increased. - */ - for (; k <= Se; k++) { - thiscoef = *block + jpeg_natural_order[k]; - if (*thiscoef != 0) { - CHECK_BIT_BUFFER(br_state, 1, goto undoit); - if (GET_BITS(1)) { - if ((*thiscoef & p1) == 0) { /* do nothing if already changed it */ - if (*thiscoef >= 0) - *thiscoef += p1; - else - *thiscoef += m1; - } - } - } - } - /* Count one block completed in EOB run */ - EOBRUN--; - } - - /* Completed MCU, so update state */ - BITREAD_SAVE_STATE(cinfo,entropy->bitstate); - entropy->saved.EOBRUN = EOBRUN; /* only part of saved state we need */ - } - - /* Account for restart interval (no-op if not using restarts) */ - entropy->restarts_to_go--; - - return TRUE; - -undoit: - /* Re-zero any output coefficients that we made newly nonzero */ - while (num_newnz > 0) - (*block)[newnz_pos[--num_newnz]] = 0; - - return FALSE; -} - - -/* - * Module initialization routine for progressive Huffman entropy decoding. - */ - -GLOBAL(void) -jinit_phuff_decoder (j_decompress_ptr cinfo) -{ - phuff_entropy_ptr2 entropy; - int *coef_bit_ptr; - int ci, i; - - entropy = (phuff_entropy_ptr2) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(phuff_entropy_decoder)); - cinfo->entropy = (struct jpeg_entropy_decoder *) entropy; - entropy->pub.start_pass = start_pass_phuff_decoder; - - /* Mark derived tables unallocated */ - for (i = 0; i < NUM_HUFF_TBLS; i++) { - entropy->derived_tbls[i] = NULL; - } - - /* Create progression status table */ - cinfo->coef_bits = (int (*)[DCTSIZE2]) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->num_components*DCTSIZE2*SIZEOF(int)); - coef_bit_ptr = & cinfo->coef_bits[0][0]; - for (ci = 0; ci < cinfo->num_components; ci++) - for (i = 0; i < DCTSIZE2; i++) - *coef_bit_ptr++ = -1; -} - -#endif /* D_PROGRESSIVE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdpostct.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdpostct.c deleted file mode 100755 index 2d93839..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdpostct.c +++ /dev/null @@ -1,290 +0,0 @@ -/* - * jdpostct.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the decompression postprocessing controller. - * This controller manages the upsampling, color conversion, and color - * quantization/reduction steps; specifically, it controls the buffering - * between upsample/color conversion and color quantization/reduction. - * - * If no color quantization/reduction is required, then this module has no - * work to do, and it just hands off to the upsample/color conversion code. - * An integrated upsample/convert/quantize process would replace this module - * entirely. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Private buffer controller object */ - -typedef struct { - struct jpeg_d_post_controller pub; /* public fields */ - - /* Color quantization source buffer: this holds output data from - * the upsample/color conversion step to be passed to the quantizer. - * For two-pass color quantization, we need a full-image buffer; - * for one-pass operation, a strip buffer is sufficient. - */ - jvirt_sarray_ptr whole_image; /* virtual array, or NULL if one-pass */ - JSAMPARRAY buffer; /* strip buffer, or current strip of virtual */ - JDIMENSION strip_height; /* buffer size in rows */ - /* for two-pass mode only: */ - JDIMENSION starting_row; /* row # of first row in current strip */ - JDIMENSION next_row; /* index of next row to fill/empty in strip */ -} my_post_controller; - -typedef my_post_controller * my_post_ptr; - - -/* Forward declarations */ -METHODDEF(void) post_process_1pass - JPP((j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -#ifdef QUANT_2PASS_SUPPORTED -METHODDEF(void) post_process_prepass - JPP((j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -METHODDEF(void) post_process_2pass - JPP((j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -#endif - - -/* - * Initialize for a processing pass. - */ - -METHODDEF(void) -start_pass_dpost (j_decompress_ptr cinfo, J_BUF_MODE pass_mode) -{ - my_post_ptr post = (my_post_ptr) cinfo->post; - - switch (pass_mode) { - case JBUF_PASS_THRU: - if (cinfo->quantize_colors) { - /* Single-pass processing with color quantization. */ - post->pub.post_process_data = post_process_1pass; - /* We could be doing buffered-image output before starting a 2-pass - * color quantization; in that case, jinit_d_post_controller did not - * allocate a strip buffer. Use the virtual-array buffer as workspace. - */ - if (post->buffer == NULL) { - post->buffer = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, post->whole_image, - (JDIMENSION) 0, post->strip_height, TRUE); - } - } else { - /* For single-pass processing without color quantization, - * I have no work to do; just call the upsampler directly. - */ - post->pub.post_process_data = cinfo->upsample->upsample; - } - break; -#ifdef QUANT_2PASS_SUPPORTED - case JBUF_SAVE_AND_PASS: - /* First pass of 2-pass quantization */ - if (post->whole_image == NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - post->pub.post_process_data = post_process_prepass; - break; - case JBUF_CRANK_DEST: - /* Second pass of 2-pass quantization */ - if (post->whole_image == NULL) - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - post->pub.post_process_data = post_process_2pass; - break; -#endif /* QUANT_2PASS_SUPPORTED */ - default: - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); - break; - } - post->starting_row = post->next_row = 0; -} - - -/* - * Process some data in the one-pass (strip buffer) case. - * This is used for color precision reduction as well as one-pass quantization. - */ - -METHODDEF(void) -post_process_1pass (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_post_ptr post = (my_post_ptr) cinfo->post; - JDIMENSION num_rows, max_rows; - - /* Fill the buffer, but not more than what we can dump out in one go. */ - /* Note we rely on the upsampler to detect bottom of image. */ - max_rows = out_rows_avail - *out_row_ctr; - if (max_rows > post->strip_height) - max_rows = post->strip_height; - num_rows = 0; - (*cinfo->upsample->upsample) (cinfo, - input_buf, in_row_group_ctr, in_row_groups_avail, - post->buffer, &num_rows, max_rows); - /* Quantize and emit data. */ - (*cinfo->cquantize->color_quantize) (cinfo, - post->buffer, output_buf + *out_row_ctr, (int) num_rows); - *out_row_ctr += num_rows; -} - - -#ifdef QUANT_2PASS_SUPPORTED - -/* - * Process some data in the first pass of 2-pass quantization. - */ - -METHODDEF(void) -post_process_prepass (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY, JDIMENSION *out_row_ctr, - JDIMENSION) -{ - my_post_ptr post = (my_post_ptr) cinfo->post; - JDIMENSION old_next_row, num_rows; - - /* Reposition virtual buffer if at start of strip. */ - if (post->next_row == 0) { - post->buffer = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, post->whole_image, - post->starting_row, post->strip_height, TRUE); - } - - /* Upsample some data (up to a strip height's worth). */ - old_next_row = post->next_row; - (*cinfo->upsample->upsample) (cinfo, - input_buf, in_row_group_ctr, in_row_groups_avail, - post->buffer, &post->next_row, post->strip_height); - - /* Allow quantizer to scan new data. No data is emitted, */ - /* but we advance out_row_ctr so outer loop can tell when we're done. */ - if (post->next_row > old_next_row) { - num_rows = post->next_row - old_next_row; - (*cinfo->cquantize->color_quantize) (cinfo, post->buffer + old_next_row, - (JSAMPARRAY) NULL, (int) num_rows); - *out_row_ctr += num_rows; - } - - /* Advance if we filled the strip. */ - if (post->next_row >= post->strip_height) { - post->starting_row += post->strip_height; - post->next_row = 0; - } -} - - -/* - * Process some data in the second pass of 2-pass quantization. - */ - -METHODDEF(void) -post_process_2pass (j_decompress_ptr cinfo, - JSAMPIMAGE, JDIMENSION *, - JDIMENSION, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_post_ptr post = (my_post_ptr) cinfo->post; - JDIMENSION num_rows, max_rows; - - /* Reposition virtual buffer if at start of strip. */ - if (post->next_row == 0) { - post->buffer = (*cinfo->mem->access_virt_sarray) - ((j_common_ptr) cinfo, post->whole_image, - post->starting_row, post->strip_height, FALSE); - } - - /* Determine number of rows to emit. */ - num_rows = post->strip_height - post->next_row; /* available in strip */ - max_rows = out_rows_avail - *out_row_ctr; /* available in output area */ - if (num_rows > max_rows) - num_rows = max_rows; - /* We have to check bottom of image here, can't depend on upsampler. */ - max_rows = cinfo->output_height - post->starting_row; - if (num_rows > max_rows) - num_rows = max_rows; - - /* Quantize and emit data. */ - (*cinfo->cquantize->color_quantize) (cinfo, - post->buffer + post->next_row, output_buf + *out_row_ctr, - (int) num_rows); - *out_row_ctr += num_rows; - - /* Advance if we filled the strip. */ - post->next_row += num_rows; - if (post->next_row >= post->strip_height) { - post->starting_row += post->strip_height; - post->next_row = 0; - } -} - -#endif /* QUANT_2PASS_SUPPORTED */ - - -/* - * Initialize postprocessing controller. - */ - -GLOBAL(void) -jinit_d_post_controller (j_decompress_ptr cinfo, boolean need_full_buffer) -{ - my_post_ptr post; - - post = (my_post_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_post_controller)); - cinfo->post = (struct jpeg_d_post_controller *) post; - post->pub.start_pass = start_pass_dpost; - post->whole_image = NULL; /* flag for no virtual arrays */ - post->buffer = NULL; /* flag for no strip buffer */ - - /* Create the quantization buffer, if needed */ - if (cinfo->quantize_colors) { - /* The buffer strip height is max_v_samp_factor, which is typically - * an efficient number of rows for upsampling to return. - * (In the presence of output rescaling, we might want to be smarter?) - */ - post->strip_height = (JDIMENSION) cinfo->max_v_samp_factor; - if (need_full_buffer) { - /* Two-pass color quantization: need full-image storage. */ - /* We round up the number of rows to a multiple of the strip height. */ -#ifdef QUANT_2PASS_SUPPORTED - post->whole_image = (*cinfo->mem->request_virt_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE, - cinfo->output_width * cinfo->out_color_components, - (JDIMENSION) jround_up((long) cinfo->output_height, - (long) post->strip_height), - post->strip_height); -#else - ERREXIT(cinfo, JERR_BAD_BUFFER_MODE); -#endif /* QUANT_2PASS_SUPPORTED */ - } else { - /* One-pass color quantization: just make a strip buffer. */ - post->buffer = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - cinfo->output_width * cinfo->out_color_components, - post->strip_height); - } - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdsample.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdsample.c deleted file mode 100755 index ab2c012..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdsample.c +++ /dev/null @@ -1,478 +0,0 @@ -/* - * jdsample.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains upsampling routines. - * - * Upsampling input data is counted in "row groups". A row group - * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size) - * sample rows of each component. Upsampling will normally produce - * max_v_samp_factor pixel rows from each row group (but this could vary - * if the upsampler is applying a scale factor of its own). - * - * An excellent reference for image resampling is - * Digital Image Warping, George Wolberg, 1990. - * Pub. by IEEE Computer Society Press, Los Alamitos, CA. ISBN 0-8186-8944-7. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Pointer to routine to upsample a single component */ -typedef JMETHOD(void, upsample1_ptr, - (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr)); - -/* Private subobject */ - -typedef struct { - struct jpeg_upsampler pub; /* public fields */ - - /* Color conversion buffer. When using separate upsampling and color - * conversion steps, this buffer holds one upsampled row group until it - * has been color converted and output. - * Note: we do not allocate any storage for component(s) which are full-size, - * ie do not need rescaling. The corresponding entry of color_buf[] is - * simply set to point to the input data array, thereby avoiding copying. - */ - JSAMPARRAY color_buf[MAX_COMPONENTS]; - - /* Per-component upsampling method pointers */ - upsample1_ptr methods[MAX_COMPONENTS]; - - int next_row_out; /* counts rows emitted from color_buf */ - JDIMENSION rows_to_go; /* counts rows remaining in image */ - - /* Height of an input row group for each component. */ - int rowgroup_height[MAX_COMPONENTS]; - - /* These arrays save pixel expansion factors so that int_expand need not - * recompute them each time. They are unused for other upsampling methods. - */ - UINT8 h_expand[MAX_COMPONENTS]; - UINT8 v_expand[MAX_COMPONENTS]; -} my_upsampler2; - -typedef my_upsampler2 * my_upsample_ptr2; - - -/* - * Initialize for an upsampling pass. - */ - -METHODDEF(void) -start_pass_upsample (j_decompress_ptr cinfo) -{ - my_upsample_ptr2 upsample = (my_upsample_ptr2) cinfo->upsample; - - /* Mark the conversion buffer empty */ - upsample->next_row_out = cinfo->max_v_samp_factor; - /* Initialize total-height counter for detecting bottom of image */ - upsample->rows_to_go = cinfo->output_height; -} - - -/* - * Control routine to do upsampling (and color conversion). - * - * In this version we upsample each component independently. - * We upsample one row group into the conversion buffer, then apply - * color conversion a row at a time. - */ - -METHODDEF(void) -sep_upsample (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION *in_row_group_ctr, - JDIMENSION, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail) -{ - my_upsample_ptr2 upsample = (my_upsample_ptr2) cinfo->upsample; - int ci; - jpeg_component_info * compptr; - JDIMENSION num_rows; - - /* Fill the conversion buffer, if it's empty */ - if (upsample->next_row_out >= cinfo->max_v_samp_factor) { - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Invoke per-component upsample method. Notice we pass a POINTER - * to color_buf[ci], so that fullsize_upsample can change it. - */ - (*upsample->methods[ci]) (cinfo, compptr, - input_buf[ci] + (*in_row_group_ctr * upsample->rowgroup_height[ci]), - upsample->color_buf + ci); - } - upsample->next_row_out = 0; - } - - /* Color-convert and emit rows */ - - /* How many we have in the buffer: */ - num_rows = (JDIMENSION) (cinfo->max_v_samp_factor - upsample->next_row_out); - /* Not more than the distance to the end of the image. Need this test - * in case the image height is not a multiple of max_v_samp_factor: - */ - if (num_rows > upsample->rows_to_go) - num_rows = upsample->rows_to_go; - /* And not more than what the client can accept: */ - out_rows_avail -= *out_row_ctr; - if (num_rows > out_rows_avail) - num_rows = out_rows_avail; - - (*cinfo->cconvert->color_convert) (cinfo, upsample->color_buf, - (JDIMENSION) upsample->next_row_out, - output_buf + *out_row_ctr, - (int) num_rows); - - /* Adjust counts */ - *out_row_ctr += num_rows; - upsample->rows_to_go -= num_rows; - upsample->next_row_out += num_rows; - /* When the buffer is emptied, declare this input row group consumed */ - if (upsample->next_row_out >= cinfo->max_v_samp_factor) - (*in_row_group_ctr)++; -} - - -/* - * These are the routines invoked by sep_upsample to upsample pixel values - * of a single component. One row group is processed per call. - */ - - -/* - * For full-size components, we just make color_buf[ci] point at the - * input buffer, and thus avoid copying any data. Note that this is - * safe only because sep_upsample doesn't declare the input row group - * "consumed" until we are done color converting and emitting it. - */ - -METHODDEF(void) -fullsize_upsample (j_decompress_ptr, jpeg_component_info *, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - *output_data_ptr = input_data; -} - - -/* - * This is a no-op version used for "uninteresting" components. - * These components will not be referenced by color conversion. - */ - -METHODDEF(void) -noop_upsample (j_decompress_ptr, jpeg_component_info *, - JSAMPARRAY, JSAMPARRAY * output_data_ptr) -{ - *output_data_ptr = NULL; /* safety check */ -} - - -/* - * This version handles any integral sampling ratios. - * This is not used for typical JPEG files, so it need not be fast. - * Nor, for that matter, is it particularly accurate: the algorithm is - * simple replication of the input pixel onto the corresponding output - * pixels. The hi-falutin sampling literature refers to this as a - * "box filter". A box filter tends to introduce visible artifacts, - * so if you are actually going to use 3:1 or 4:1 sampling ratios - * you would be well advised to improve this code. - */ - -METHODDEF(void) -int_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - my_upsample_ptr2 upsample = (my_upsample_ptr2) cinfo->upsample; - JSAMPARRAY output_data = *output_data_ptr; - JSAMPROW inptr, outptr; - JSAMPLE invalue; - int h; - JSAMPROW outend; - int h_expand, v_expand; - int inrow, outrow; - - h_expand = upsample->h_expand[compptr->component_index]; - v_expand = upsample->v_expand[compptr->component_index]; - - inrow = outrow = 0; - while (outrow < cinfo->max_v_samp_factor) { - /* Generate one output row with proper horizontal expansion */ - inptr = input_data[inrow]; - outptr = output_data[outrow]; - outend = outptr + cinfo->output_width; - while (outptr < outend) { - invalue = *inptr++; /* don't need GETJSAMPLE() here */ - for (h = h_expand; h > 0; h--) { - *outptr++ = invalue; - } - } - /* Generate any additional output rows by duplicating the first one */ - if (v_expand > 1) { - jcopy_sample_rows(output_data, outrow, output_data, outrow+1, - v_expand-1, cinfo->output_width); - } - inrow++; - outrow += v_expand; - } -} - - -/* - * Fast processing for the common case of 2:1 horizontal and 1:1 vertical. - * It's still a box filter. - */ - -METHODDEF(void) -h2v1_upsample (j_decompress_ptr cinfo, jpeg_component_info *, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - JSAMPARRAY output_data = *output_data_ptr; - JSAMPROW inptr, outptr; - JSAMPLE invalue; - JSAMPROW outend; - int inrow; - - for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { - inptr = input_data[inrow]; - outptr = output_data[inrow]; - outend = outptr + cinfo->output_width; - while (outptr < outend) { - invalue = *inptr++; /* don't need GETJSAMPLE() here */ - *outptr++ = invalue; - *outptr++ = invalue; - } - } -} - - -/* - * Fast processing for the common case of 2:1 horizontal and 2:1 vertical. - * It's still a box filter. - */ - -METHODDEF(void) -h2v2_upsample (j_decompress_ptr cinfo, jpeg_component_info *, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - JSAMPARRAY output_data = *output_data_ptr; - JSAMPROW inptr, outptr; - JSAMPLE invalue; - JSAMPROW outend; - int inrow, outrow; - - inrow = outrow = 0; - while (outrow < cinfo->max_v_samp_factor) { - inptr = input_data[inrow]; - outptr = output_data[outrow]; - outend = outptr + cinfo->output_width; - while (outptr < outend) { - invalue = *inptr++; /* don't need GETJSAMPLE() here */ - *outptr++ = invalue; - *outptr++ = invalue; - } - jcopy_sample_rows(output_data, outrow, output_data, outrow+1, - 1, cinfo->output_width); - inrow++; - outrow += 2; - } -} - - -/* - * Fancy processing for the common case of 2:1 horizontal and 1:1 vertical. - * - * The upsampling algorithm is linear interpolation between pixel centers, - * also known as a "triangle filter". This is a good compromise between - * speed and visual quality. The centers of the output pixels are 1/4 and 3/4 - * of the way between input pixel centers. - * - * A note about the "bias" calculations: when rounding fractional values to - * integer, we do not want to always round 0.5 up to the next integer. - * If we did that, we'd introduce a noticeable bias towards larger values. - * Instead, this code is arranged so that 0.5 will be rounded up or down at - * alternate pixel locations (a simple ordered dither pattern). - */ - -METHODDEF(void) -h2v1_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - JSAMPARRAY output_data = *output_data_ptr; - JSAMPROW inptr, outptr; - int invalue; - JDIMENSION colctr; - int inrow; - - for (inrow = 0; inrow < cinfo->max_v_samp_factor; inrow++) { - inptr = input_data[inrow]; - outptr = output_data[inrow]; - /* Special case for first column */ - invalue = GETJSAMPLE(*inptr++); - *outptr++ = (JSAMPLE) invalue; - *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(*inptr) + 2) >> 2); - - for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { - /* General case: 3/4 * nearer pixel + 1/4 * further pixel */ - invalue = GETJSAMPLE(*inptr++) * 3; - *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(inptr[-2]) + 1) >> 2); - *outptr++ = (JSAMPLE) ((invalue + GETJSAMPLE(*inptr) + 2) >> 2); - } - - /* Special case for last column */ - invalue = GETJSAMPLE(*inptr); - *outptr++ = (JSAMPLE) ((invalue * 3 + GETJSAMPLE(inptr[-1]) + 1) >> 2); - *outptr++ = (JSAMPLE) invalue; - } -} - - -/* - * Fancy processing for the common case of 2:1 horizontal and 2:1 vertical. - * Again a triangle filter; see comments for h2v1 case, above. - * - * It is OK for us to reference the adjacent input rows because we demanded - * context from the main buffer controller (see initialization code). - */ - -METHODDEF(void) -h2v2_fancy_upsample (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JSAMPARRAY input_data, JSAMPARRAY * output_data_ptr) -{ - JSAMPARRAY output_data = *output_data_ptr; - JSAMPROW inptr0, inptr1, outptr; -#if BITS_IN_JSAMPLE == 8 - int thiscolsum, lastcolsum, nextcolsum; -#else - INT32 thiscolsum, lastcolsum, nextcolsum; -#endif - JDIMENSION colctr; - int inrow, outrow, v; - - inrow = outrow = 0; - while (outrow < cinfo->max_v_samp_factor) { - for (v = 0; v < 2; v++) { - /* inptr0 points to nearest input row, inptr1 points to next nearest */ - inptr0 = input_data[inrow]; - if (v == 0) /* next nearest is row above */ - inptr1 = input_data[inrow-1]; - else /* next nearest is row below */ - inptr1 = input_data[inrow+1]; - outptr = output_data[outrow++]; - - /* Special case for first column */ - thiscolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); - nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); - *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 8) >> 4); - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4); - lastcolsum = thiscolsum; thiscolsum = nextcolsum; - - for (colctr = compptr->downsampled_width - 2; colctr > 0; colctr--) { - /* General case: 3/4 * nearer pixel + 1/4 * further pixel in each */ - /* dimension, thus 9/16, 3/16, 3/16, 1/16 overall */ - nextcolsum = GETJSAMPLE(*inptr0++) * 3 + GETJSAMPLE(*inptr1++); - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + nextcolsum + 7) >> 4); - lastcolsum = thiscolsum; thiscolsum = nextcolsum; - } - - /* Special case for last column */ - *outptr++ = (JSAMPLE) ((thiscolsum * 3 + lastcolsum + 8) >> 4); - *outptr++ = (JSAMPLE) ((thiscolsum * 4 + 7) >> 4); - } - inrow++; - } -} - - -/* - * Module initialization routine for upsampling. - */ - -GLOBAL(void) -jinit_upsampler (j_decompress_ptr cinfo) -{ - my_upsample_ptr2 upsample; - int ci; - jpeg_component_info * compptr; - boolean need_buffer, do_fancy; - int h_in_group, v_in_group, h_out_group, v_out_group; - - upsample = (my_upsample_ptr2) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_upsampler2)); - cinfo->upsample = (struct jpeg_upsampler *) upsample; - upsample->pub.start_pass = start_pass_upsample; - upsample->pub.upsample = sep_upsample; - upsample->pub.need_context_rows = FALSE; /* until we find out differently */ - - if (cinfo->CCIR601_sampling) /* this isn't supported */ - ERREXIT(cinfo, JERR_CCIR601_NOTIMPL); - - /* jdmainct.c doesn't support context rows when min_DCT_scaled_size = 1, - * so don't ask for it. - */ - do_fancy = cinfo->do_fancy_upsampling && cinfo->min_DCT_scaled_size > 1; - - /* Verify we can handle the sampling factors, select per-component methods, - * and create storage as needed. - */ - for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; - ci++, compptr++) { - /* Compute size of an "input group" after IDCT scaling. This many samples - * are to be converted to max_h_samp_factor * max_v_samp_factor pixels. - */ - h_in_group = (compptr->h_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; - v_in_group = (compptr->v_samp_factor * compptr->DCT_scaled_size) / - cinfo->min_DCT_scaled_size; - h_out_group = cinfo->max_h_samp_factor; - v_out_group = cinfo->max_v_samp_factor; - upsample->rowgroup_height[ci] = v_in_group; /* save for use later */ - need_buffer = TRUE; - if (! compptr->component_needed) { - /* Don't bother to upsample an uninteresting component. */ - upsample->methods[ci] = noop_upsample; - need_buffer = FALSE; - } else if (h_in_group == h_out_group && v_in_group == v_out_group) { - /* Fullsize components can be processed without any work. */ - upsample->methods[ci] = fullsize_upsample; - need_buffer = FALSE; - } else if (h_in_group * 2 == h_out_group && - v_in_group == v_out_group) { - /* Special cases for 2h1v upsampling */ - if (do_fancy && compptr->downsampled_width > 2) - upsample->methods[ci] = h2v1_fancy_upsample; - else - upsample->methods[ci] = h2v1_upsample; - } else if (h_in_group * 2 == h_out_group && - v_in_group * 2 == v_out_group) { - /* Special cases for 2h2v upsampling */ - if (do_fancy && compptr->downsampled_width > 2) { - upsample->methods[ci] = h2v2_fancy_upsample; - upsample->pub.need_context_rows = TRUE; - } else - upsample->methods[ci] = h2v2_upsample; - } else if ((h_out_group % h_in_group) == 0 && - (v_out_group % v_in_group) == 0) { - /* Generic integral-factors upsampling method */ - upsample->methods[ci] = int_upsample; - upsample->h_expand[ci] = (UINT8) (h_out_group / h_in_group); - upsample->v_expand[ci] = (UINT8) (v_out_group / v_in_group); - } else - ERREXIT(cinfo, JERR_FRACT_SAMPLE_NOTIMPL); - if (need_buffer) { - upsample->color_buf[ci] = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) jround_up((long) cinfo->output_width, - (long) cinfo->max_h_samp_factor), - (JDIMENSION) cinfo->max_v_samp_factor); - } - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdtrans.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdtrans.c deleted file mode 100755 index 12c193c..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jdtrans.c +++ /dev/null @@ -1,143 +0,0 @@ -/* - * jdtrans.c - * - * Copyright (C) 1995-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains library routines for transcoding decompression, - * that is, reading raw DCT coefficient arrays from an input JPEG file. - * The routines in jdapimin.c will also be needed by a transcoder. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* Forward declarations */ -LOCAL(void) transdecode_master_selection JPP((j_decompress_ptr cinfo)); - - -/* - * Read the coefficient arrays from a JPEG file. - * jpeg_read_header must be completed before calling this. - * - * The entire image is read into a set of virtual coefficient-block arrays, - * one per component. The return value is a pointer to the array of - * virtual-array descriptors. These can be manipulated directly via the - * JPEG memory manager, or handed off to jpeg_write_coefficients(). - * To release the memory occupied by the virtual arrays, call - * jpeg_finish_decompress() when done with the data. - * - * An alternative usage is to simply obtain access to the coefficient arrays - * during a buffered-image-mode decompression operation. This is allowed - * after any jpeg_finish_output() call. The arrays can be accessed until - * jpeg_finish_decompress() is called. (Note that any call to the library - * may reposition the arrays, so don't rely on access_virt_barray() results - * to stay valid across library calls.) - * - * Returns NULL if suspended. This case need be checked only if - * a suspending data source is used. - */ - -GLOBAL(jvirt_barray_ptr *) -jpeg_read_coefficients (j_decompress_ptr cinfo) -{ - if (cinfo->global_state == DSTATE_READY) { - /* First call: initialize active modules */ - transdecode_master_selection(cinfo); - cinfo->global_state = DSTATE_RDCOEFS; - } - if (cinfo->global_state == DSTATE_RDCOEFS) { - /* Absorb whole file into the coef buffer */ - for (;;) { - int retcode; - /* Call progress monitor hook if present */ - if (cinfo->progress != NULL) - (*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo); - /* Absorb some more input */ - retcode = (*cinfo->inputctl->consume_input) (cinfo); - if (retcode == JPEG_SUSPENDED) - return NULL; - if (retcode == JPEG_REACHED_EOI) - break; - /* Advance progress counter if appropriate */ - if (cinfo->progress != NULL && - (retcode == JPEG_ROW_COMPLETED || retcode == JPEG_REACHED_SOS)) { - if (++cinfo->progress->pass_counter >= cinfo->progress->pass_limit) { - /* startup underestimated number of scans; ratchet up one scan */ - cinfo->progress->pass_limit += (long) cinfo->total_iMCU_rows; - } - } - } - /* Set state so that jpeg_finish_decompress does the right thing */ - cinfo->global_state = DSTATE_STOPPING; - } - /* At this point we should be in state DSTATE_STOPPING if being used - * standalone, or in state DSTATE_BUFIMAGE if being invoked to get access - * to the coefficients during a full buffered-image-mode decompression. - */ - if ((cinfo->global_state == DSTATE_STOPPING || - cinfo->global_state == DSTATE_BUFIMAGE) && cinfo->buffered_image) { - return cinfo->coef->coef_arrays; - } - /* Oops, improper usage */ - ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); - return NULL; /* keep compiler happy */ -} - - -/* - * Master selection of decompression modules for transcoding. - * This substitutes for jdmaster.c's initialization of the full decompressor. - */ - -LOCAL(void) -transdecode_master_selection (j_decompress_ptr cinfo) -{ - /* This is effectively a buffered-image operation. */ - cinfo->buffered_image = TRUE; - - /* Entropy decoding: either Huffman or arithmetic coding. */ - if (cinfo->arith_code) { - ERREXIT(cinfo, JERR_ARITH_NOTIMPL); - } else { - if (cinfo->progressive_mode) { -#ifdef D_PROGRESSIVE_SUPPORTED - jinit_phuff_decoder(cinfo); -#else - ERREXIT(cinfo, JERR_NOT_COMPILED); -#endif - } else - jinit_huff_decoder(cinfo); - } - - /* Always get a full-image coefficient buffer. */ - jinit_d_coef_controller(cinfo, TRUE); - - /* We can now tell the memory manager to allocate virtual arrays. */ - (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo); - - /* Initialize input side of decompressor to consume first scan. */ - (*cinfo->inputctl->start_input_pass) (cinfo); - - /* Initialize progress monitoring. */ - if (cinfo->progress != NULL) { - int nscans; - /* Estimate number of scans to set pass_limit. */ - if (cinfo->progressive_mode) { - /* Arbitrarily estimate 2 interleaved DC scans + 3 AC scans/component. */ - nscans = 2 + 3 * cinfo->num_components; - } else if (cinfo->inputctl->has_multiple_scans) { - /* For a nonprogressive multiscan file, estimate 1 scan per component. */ - nscans = cinfo->num_components; - } else { - nscans = 1; - } - cinfo->progress->pass_counter = 0L; - cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows * nscans; - cinfo->progress->completed_passes = 0; - cinfo->progress->total_passes = 1; - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.c deleted file mode 100755 index c98aed7..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * jerror.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains simple error-reporting and trace-message routines. - * These are suitable for Unix-like systems and others where writing to - * stderr is the right thing to do. Many applications will want to replace - * some or all of these routines. - * - * If you define USE_WINDOWS_MESSAGEBOX in jconfig.h or in the makefile, - * you get a Windows-specific hack to display error messages in a dialog box. - * It ain't much, but it beats dropping error messages into the bit bucket, - * which is what happens to output to stderr under most Windows C compilers. - * - * These routines are used by both the compression and decompression code. - */ - -/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ -#include "jinclude.h" -#include "jpeglib.h" -#include "jversion.h" -#include "jerror.h" - -#ifdef USE_WINDOWS_MESSAGEBOX -#include -#endif - -#ifndef EXIT_FAILURE /* define exit() codes if not provided */ -#define EXIT_FAILURE 1 -#endif - - -/* - * Create the message string table. - * We do this from the master message list in jerror.h by re-reading - * jerror.h with a suitable definition for macro JMESSAGE. - * The message table is made an external symbol just in case any applications - * want to refer to it directly. - */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_std_message_table jMsgTable -#endif - -#define JMESSAGE(code,string) string , - -const char * const jpeg_std_message_table[] = { -#include "jerror.h" - NULL -}; - - -/* - * Error exit handler: must not return to caller. - * - * Applications may override this if they want to get control back after - * an error. Typically one would longjmp somewhere instead of exiting. - * The setjmp buffer can be made a private field within an expanded error - * handler object. Note that the info needed to generate an error message - * is stored in the error object, so you can generate the message now or - * later, at your convenience. - * You should make sure that the JPEG object is cleaned up (with jpeg_abort - * or jpeg_destroy) at some point. - */ - -METHODDEF(void) -error_exit (j_common_ptr cinfo) -{ - /* Always display the message */ - (*cinfo->err->output_message) (cinfo); - - /* Let the memory manager delete any temp files before we die */ - jpeg_destroy(cinfo); - - exit(EXIT_FAILURE); -} - - -/* - * Actual output of an error or trace message. - * Applications may override this method to send JPEG messages somewhere - * other than stderr. - * - * On Windows, printing to stderr is generally completely useless, - * so we provide optional code to produce an error-dialog popup. - * Most Windows applications will still prefer to override this routine, - * but if they don't, it'll do something at least marginally useful. - * - * NOTE: to use the library in an environment that doesn't support the - * C stdio library, you may have to delete the call to fprintf() entirely, - * not just not use this routine. - */ - -METHODDEF(void) -output_message (j_common_ptr cinfo) -{ - char buffer[JMSG_LENGTH_MAX]; - - /* Create the message */ - (*cinfo->err->format_message) (cinfo, buffer); - -#ifdef USE_WINDOWS_MESSAGEBOX - /* Display it in a message dialog box */ - MessageBox(GetActiveWindow(), buffer, "JPEG Library Error", - MB_OK | MB_ICONERROR); -#else - /* Send it to stderr, adding a newline */ - fprintf(stderr, "%s\n", buffer); -#endif -} - - -/* - * Decide whether to emit a trace or warning message. - * msg_level is one of: - * -1: recoverable corrupt-data warning, may want to abort. - * 0: important advisory messages (always display to user). - * 1: first level of tracing detail. - * 2,3,...: successively more detailed tracing messages. - * An application might override this method if it wanted to abort on warnings - * or change the policy about which messages to display. - */ - -METHODDEF(void) -emit_message (j_common_ptr cinfo, int msg_level) -{ - struct jpeg_error_mgr * err = cinfo->err; - - if (msg_level < 0) { - /* It's a warning message. Since corrupt files may generate many warnings, - * the policy implemented here is to show only the first warning, - * unless trace_level >= 3. - */ - if (err->num_warnings == 0 || err->trace_level >= 3) - (*err->output_message) (cinfo); - /* Always count warnings in num_warnings. */ - err->num_warnings++; - } else { - /* It's a trace message. Show it if trace_level >= msg_level. */ - if (err->trace_level >= msg_level) - (*err->output_message) (cinfo); - } -} - - -/* - * Format a message string for the most recent JPEG error or message. - * The message is stored into buffer, which should be at least JMSG_LENGTH_MAX - * characters. Note that no '\n' character is added to the string. - * Few applications should need to override this method. - */ - -METHODDEF(void) -format_message (j_common_ptr cinfo, char * buffer) -{ - struct jpeg_error_mgr * err = cinfo->err; - int msg_code = err->msg_code; - const char * msgtext = NULL; - const char * msgptr; - char ch; - boolean isstring; - - /* Look up message string in proper table */ - if (msg_code > 0 && msg_code <= err->last_jpeg_message) { - msgtext = err->jpeg_message_table[msg_code]; - } else if (err->addon_message_table != NULL && - msg_code >= err->first_addon_message && - msg_code <= err->last_addon_message) { - msgtext = err->addon_message_table[msg_code - err->first_addon_message]; - } - - /* Defend against bogus message number */ - if (msgtext == NULL) { - err->msg_parm.i[0] = msg_code; - msgtext = err->jpeg_message_table[0]; - } - - /* Check for string parameter, as indicated by %s in the message text */ - isstring = FALSE; - msgptr = msgtext; - while ((ch = *msgptr++) != '\0') { - if (ch == '%') { - if (*msgptr == 's') isstring = TRUE; - break; - } - } - - /* Format the message into the passed buffer */ - if (isstring) - sprintf(buffer, msgtext, err->msg_parm.s); - else - sprintf(buffer, msgtext, - err->msg_parm.i[0], err->msg_parm.i[1], - err->msg_parm.i[2], err->msg_parm.i[3], - err->msg_parm.i[4], err->msg_parm.i[5], - err->msg_parm.i[6], err->msg_parm.i[7]); -} - - -/* - * Reset error state variables at start of a new image. - * This is called during compression startup to reset trace/error - * processing to default state, without losing any application-specific - * method pointers. An application might possibly want to override - * this method if it has additional error processing state. - */ - -METHODDEF(void) -reset_error_mgr (j_common_ptr cinfo) -{ - cinfo->err->num_warnings = 0; - /* trace_level is not reset since it is an application-supplied parameter */ - cinfo->err->msg_code = 0; /* may be useful as a flag for "no error" */ -} - - -/* - * Fill in the standard error-handling methods in a jpeg_error_mgr object. - * Typical call is: - * struct jpeg_compress_struct cinfo; - * struct jpeg_error_mgr err; - * - * cinfo.err = jpeg_std_error(&err); - * after which the application may override some of the methods. - */ - -GLOBAL(struct jpeg_error_mgr *) -jpeg_std_error (struct jpeg_error_mgr * err) -{ - err->error_exit = error_exit; - err->emit_message = emit_message; - err->output_message = output_message; - err->format_message = format_message; - err->reset_error_mgr = reset_error_mgr; - - err->trace_level = 0; /* default = no tracing */ - err->num_warnings = 0; /* no warnings emitted yet */ - err->msg_code = 0; /* may be useful as a flag for "no error" */ - - /* Initialize message table pointers */ - err->jpeg_message_table = jpeg_std_message_table; - err->last_jpeg_message = (int) JMSG_LASTMSGCODE - 1; - - err->addon_message_table = NULL; - err->first_addon_message = 0; /* for safety */ - err->last_addon_message = 0; - - return err; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.h deleted file mode 100755 index 79084f2..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jerror.h +++ /dev/null @@ -1,291 +0,0 @@ -/* - * jerror.h - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the error and message codes for the JPEG library. - * Edit this file to add new codes, or to translate the message strings to - * some other language. - * A set of error-reporting macros are defined too. Some applications using - * the JPEG library may wish to include this file to get the error codes - * and/or the macros. - */ - -/* - * To define the enum list of message codes, include this file without - * defining macro JMESSAGE. To create a message string table, include it - * again with a suitable JMESSAGE definition (see jerror.c for an example). - */ -#ifndef JMESSAGE -#ifndef JERROR_H -/* First time through, define the enum list */ -#define JMAKE_ENUM_LIST -#else -/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ -#define JMESSAGE(code,string) -#endif /* JERROR_H */ -#endif /* JMESSAGE */ - -#ifdef JMAKE_ENUM_LIST - -typedef enum { - -#define JMESSAGE(code,string) code , - -#endif /* JMAKE_ENUM_LIST */ - -JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ - -/* For maintenance convenience, list is alphabetical by message code name */ -JMESSAGE(JERR_ARITH_NOTIMPL, - "Sorry, there are legal restrictions on arithmetic coding") -JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") -JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") -JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") -JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") -JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") -JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported") -JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") -JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") -JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") -JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") -JMESSAGE(JERR_BAD_LIB_VERSION, - "Wrong JPEG library version: library is %d, caller expects %d") -JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") -JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") -JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") -JMESSAGE(JERR_BAD_PROGRESSION, - "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") -JMESSAGE(JERR_BAD_PROG_SCRIPT, - "Invalid progressive parameters at scan script entry %d") -JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") -JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") -JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") -JMESSAGE(JERR_BAD_STRUCT_SIZE, - "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") -JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") -JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") -JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") -JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") -JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") -JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") -JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") -JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") -JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") -JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") -JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") -JMESSAGE(JERR_EMS_READ, "Read from EMS failed") -JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") -JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") -JMESSAGE(JERR_FILE_READ, "Input file read error") -JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") -JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") -JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") -JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") -JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") -JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") -JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") -JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, - "Cannot transcode due to multiple use of quantization table %d") -JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") -JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") -JMESSAGE(JERR_NOTIMPL, "Not implemented yet") -JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") -JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") -JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") -JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") -JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") -JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") -JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") -JMESSAGE(JERR_QUANT_COMPONENTS, - "Cannot quantize more than %d color components") -JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") -JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") -JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") -JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") -JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") -JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") -JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") -JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") -JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") -JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") -JMESSAGE(JERR_TFILE_WRITE, - "Write failed on temporary file --- out of disk space?") -JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") -JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") -JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") -JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") -JMESSAGE(JERR_XMS_READ, "Read from XMS failed") -JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") -JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) -JMESSAGE(JMSG_VERSION, JVERSION) -JMESSAGE(JTRC_16BIT_TABLES, - "Caution: quantization tables are too coarse for baseline JPEG") -JMESSAGE(JTRC_ADOBE, - "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") -JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") -JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") -JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") -JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") -JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") -JMESSAGE(JTRC_DRI, "Define Restart Interval %u") -JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") -JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") -JMESSAGE(JTRC_EOI, "End Of Image") -JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") -JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") -JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, - "Warning: thumbnail image size does not match data length %u") -JMESSAGE(JTRC_JFIF_EXTENSION, - "JFIF extension marker: type 0x%02x, length %u") -JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") -JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") -JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") -JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") -JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") -JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") -JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") -JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") -JMESSAGE(JTRC_RST, "RST%d") -JMESSAGE(JTRC_SMOOTH_NOTIMPL, - "Smoothing not supported with nonstandard sampling ratios") -JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") -JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") -JMESSAGE(JTRC_SOI, "Start of Image") -JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") -JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") -JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") -JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") -JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") -JMESSAGE(JTRC_THUMB_JPEG, - "JFIF extension marker: JPEG-compressed thumbnail image, length %u") -JMESSAGE(JTRC_THUMB_PALETTE, - "JFIF extension marker: palette thumbnail image, length %u") -JMESSAGE(JTRC_THUMB_RGB, - "JFIF extension marker: RGB thumbnail image, length %u") -JMESSAGE(JTRC_UNKNOWN_IDS, - "Unrecognized component IDs %d %d %d, assuming YCbCr") -JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") -JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") -JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") -JMESSAGE(JWRN_BOGUS_PROGRESSION, - "Inconsistent progression sequence for component %d coefficient %d") -JMESSAGE(JWRN_EXTRANEOUS_DATA, - "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") -JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") -JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") -JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") -JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") -JMESSAGE(JWRN_MUST_RESYNC, - "Corrupt JPEG data: found marker 0x%02x instead of RST%d") -JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") -JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") - -#ifdef JMAKE_ENUM_LIST - - JMSG_LASTMSGCODE -} J_MESSAGE_CODE; - -#undef JMAKE_ENUM_LIST -#endif /* JMAKE_ENUM_LIST */ - -/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ -#undef JMESSAGE - - -#ifndef JERROR_H -#define JERROR_H - -/* Macros to simplify using the error and trace message stuff */ -/* The first parameter is either type of cinfo pointer */ - -/* Fatal errors (print message and exit) */ -#define ERREXIT(cinfo,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT1(cinfo,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT2(cinfo,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT3(cinfo,code,p1,p2,p3) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (cinfo)->err->msg_parm.i[3] = (p4), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXITS(cinfo,code,str) \ - ((cinfo)->err->msg_code = (code), \ - strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) - -#define MAKESTMT(stuff) do { stuff } while (0) - -/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ -#define WARNMS(cinfo,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) -#define WARNMS1(cinfo,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) -#define WARNMS2(cinfo,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) - -/* Informational/debugging messages */ -#define TRACEMS(cinfo,lvl,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS1(cinfo,lvl,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS2(cinfo,lvl,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - _mp[4] = (p5); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMSS(cinfo,lvl,code,str) \ - ((cinfo)->err->msg_code = (code), \ - strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) - -#endif /* JERROR_H */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctflt.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctflt.c deleted file mode 100755 index 102f7d5..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctflt.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * jfdctflt.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a floating-point implementation of the - * forward DCT (Discrete Cosine Transform). - * - * This implementation should be more accurate than either of the integer - * DCT implementations. However, it may not give the same results on all - * machines because of differences in roundoff behavior. Speed will depend - * on the hardware's floating point capacity. - * - * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT - * on each column. Direct algorithms are also available, but they are - * much more complex and seem not to be any faster when reduced to code. - * - * This implementation is based on Arai, Agui, and Nakajima's algorithm for - * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - * Japanese, but the algorithm is described in the Pennebaker & Mitchell - * JPEG textbook (see REFERENCES section in file README). The following code - * is based directly on figure 4-8 in P&M. - * While an 8-point DCT cannot be done in less than 11 multiplies, it is - * possible to arrange the computation so that many of the multiplies are - * simple scalings of the final outputs. These multiplies can then be - * folded into the multiplications or divisions by the JPEG quantization - * table entries. The AA&N method leaves only 5 multiplies and 29 adds - * to be done in the DCT itself. - * The primary disadvantage of this method is that with a fixed-point - * implementation, accuracy is lost due to imprecise representation of the - * scaled quantization values. However, that problem does not arise if - * we use floating point arithmetic. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_FLOAT_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* - * Perform the forward DCT on one block of samples. - */ - -GLOBAL(void) -jpeg_fdct_float (FAST_FLOAT * data) -{ - FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - FAST_FLOAT tmp10, tmp11, tmp12, tmp13; - FAST_FLOAT z1, z2, z3, z4, z5, z11, z13; - FAST_FLOAT *dataptr; - int ctr; - - /* Pass 1: process rows. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[0] + dataptr[7]; - tmp7 = dataptr[0] - dataptr[7]; - tmp1 = dataptr[1] + dataptr[6]; - tmp6 = dataptr[1] - dataptr[6]; - tmp2 = dataptr[2] + dataptr[5]; - tmp5 = dataptr[2] - dataptr[5]; - tmp3 = dataptr[3] + dataptr[4]; - tmp4 = dataptr[3] - dataptr[4]; - - /* Even part */ - - tmp10 = tmp0 + tmp3; /* phase 2 */ - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[0] = tmp10 + tmp11; /* phase 3 */ - dataptr[4] = tmp10 - tmp11; - - z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ - dataptr[2] = tmp13 + z1; /* phase 5 */ - dataptr[6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ - z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ - z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ - z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ - - z11 = tmp7 + z3; /* phase 5 */ - z13 = tmp7 - z3; - - dataptr[5] = z13 + z2; /* phase 6 */ - dataptr[3] = z13 - z2; - dataptr[1] = z11 + z4; - dataptr[7] = z11 - z4; - - dataptr += DCTSIZE; /* advance pointer to next row */ - } - - /* Pass 2: process columns. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; - tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; - tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; - tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; - tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; - tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; - tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; - tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - - /* Even part */ - - tmp10 = tmp0 + tmp3; /* phase 2 */ - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ - dataptr[DCTSIZE*4] = tmp10 - tmp11; - - z1 = (tmp12 + tmp13) * ((FAST_FLOAT) 0.707106781); /* c4 */ - dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ - dataptr[DCTSIZE*6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - z5 = (tmp10 - tmp12) * ((FAST_FLOAT) 0.382683433); /* c6 */ - z2 = ((FAST_FLOAT) 0.541196100) * tmp10 + z5; /* c2-c6 */ - z4 = ((FAST_FLOAT) 1.306562965) * tmp12 + z5; /* c2+c6 */ - z3 = tmp11 * ((FAST_FLOAT) 0.707106781); /* c4 */ - - z11 = tmp7 + z3; /* phase 5 */ - z13 = tmp7 - z3; - - dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ - dataptr[DCTSIZE*3] = z13 - z2; - dataptr[DCTSIZE*1] = z11 + z4; - dataptr[DCTSIZE*7] = z11 - z4; - - dataptr++; /* advance pointer to next column */ - } -} - -#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctfst.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctfst.c deleted file mode 100755 index f26221d..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctfst.c +++ /dev/null @@ -1,224 +0,0 @@ -/* - * jfdctfst.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a fast, not so accurate integer implementation of the - * forward DCT (Discrete Cosine Transform). - * - * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT - * on each column. Direct algorithms are also available, but they are - * much more complex and seem not to be any faster when reduced to code. - * - * This implementation is based on Arai, Agui, and Nakajima's algorithm for - * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - * Japanese, but the algorithm is described in the Pennebaker & Mitchell - * JPEG textbook (see REFERENCES section in file README). The following code - * is based directly on figure 4-8 in P&M. - * While an 8-point DCT cannot be done in less than 11 multiplies, it is - * possible to arrange the computation so that many of the multiplies are - * simple scalings of the final outputs. These multiplies can then be - * folded into the multiplications or divisions by the JPEG quantization - * table entries. The AA&N method leaves only 5 multiplies and 29 adds - * to be done in the DCT itself. - * The primary disadvantage of this method is that with fixed-point math, - * accuracy is lost due to imprecise representation of the scaled - * quantization values. The smaller the quantization table entry, the less - * precise the scaled value, so this implementation does worse with high- - * quality-setting files than with low-quality ones. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_IFAST_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* Scaling decisions are generally the same as in the LL&M algorithm; - * see jfdctint.c for more details. However, we choose to descale - * (right shift) multiplication products as soon as they are formed, - * rather than carrying additional fractional bits into subsequent additions. - * This compromises accuracy slightly, but it lets us save a few shifts. - * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) - * everywhere except in the multiplications proper; this saves a good deal - * of work on 16-bit-int machines. - * - * Again to save a few shifts, the intermediate results between pass 1 and - * pass 2 are not upscaled, but are represented only to integral precision. - * - * A final compromise is to represent the multiplicative constants to only - * 8 fractional bits, rather than 13. This saves some shifting work on some - * machines, and may also reduce the cost of multiplication (since there - * are fewer one-bits in the constants). - */ - -#define CONST_BITS 8 - - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 8 -#define FIX_0_382683433 ((INT32) 98) /* FIX(0.382683433) */ -#define FIX_0_541196100 ((INT32) 139) /* FIX(0.541196100) */ -#define FIX_0_707106781 ((INT32) 181) /* FIX(0.707106781) */ -#define FIX_1_306562965 ((INT32) 334) /* FIX(1.306562965) */ -#else -#define FIX_0_382683433 FIX(0.382683433) -#define FIX_0_541196100 FIX(0.541196100) -#define FIX_0_707106781 FIX(0.707106781) -#define FIX_1_306562965 FIX(1.306562965) -#endif - - -/* We can gain a little more speed, with a further compromise in accuracy, - * by omitting the addition in a descaling shift. This yields an incorrectly - * rounded result half the time... - */ - -#ifndef USE_ACCURATE_ROUNDING -#undef DESCALE -#define DESCALE(x,n) RIGHT_SHIFT(x, n) -#endif - - -/* Multiply a DCTELEM variable by an INT32 constant, and immediately - * descale to yield a DCTELEM result. - */ - -#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) - - -/* - * Perform the forward DCT on one block of samples. - */ - -GLOBAL(void) -jpeg_fdct_ifast (DCTELEM * data) -{ - DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - DCTELEM tmp10, tmp11, tmp12, tmp13; - DCTELEM z1, z2, z3, z4, z5, z11, z13; - DCTELEM *dataptr; - int ctr; - SHIFT_TEMPS - - /* Pass 1: process rows. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[0] + dataptr[7]; - tmp7 = dataptr[0] - dataptr[7]; - tmp1 = dataptr[1] + dataptr[6]; - tmp6 = dataptr[1] - dataptr[6]; - tmp2 = dataptr[2] + dataptr[5]; - tmp5 = dataptr[2] - dataptr[5]; - tmp3 = dataptr[3] + dataptr[4]; - tmp4 = dataptr[3] - dataptr[4]; - - /* Even part */ - - tmp10 = tmp0 + tmp3; /* phase 2 */ - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[0] = tmp10 + tmp11; /* phase 3 */ - dataptr[4] = tmp10 - tmp11; - - z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ - dataptr[2] = tmp13 + z1; /* phase 5 */ - dataptr[6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ - z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ - z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ - z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ - - z11 = tmp7 + z3; /* phase 5 */ - z13 = tmp7 - z3; - - dataptr[5] = z13 + z2; /* phase 6 */ - dataptr[3] = z13 - z2; - dataptr[1] = z11 + z4; - dataptr[7] = z11 - z4; - - dataptr += DCTSIZE; /* advance pointer to next row */ - } - - /* Pass 2: process columns. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; - tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; - tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; - tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; - tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; - tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; - tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; - tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - - /* Even part */ - - tmp10 = tmp0 + tmp3; /* phase 2 */ - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[DCTSIZE*0] = tmp10 + tmp11; /* phase 3 */ - dataptr[DCTSIZE*4] = tmp10 - tmp11; - - z1 = MULTIPLY(tmp12 + tmp13, FIX_0_707106781); /* c4 */ - dataptr[DCTSIZE*2] = tmp13 + z1; /* phase 5 */ - dataptr[DCTSIZE*6] = tmp13 - z1; - - /* Odd part */ - - tmp10 = tmp4 + tmp5; /* phase 2 */ - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - /* The rotator is modified from fig 4-8 to avoid extra negations. */ - z5 = MULTIPLY(tmp10 - tmp12, FIX_0_382683433); /* c6 */ - z2 = MULTIPLY(tmp10, FIX_0_541196100) + z5; /* c2-c6 */ - z4 = MULTIPLY(tmp12, FIX_1_306562965) + z5; /* c2+c6 */ - z3 = MULTIPLY(tmp11, FIX_0_707106781); /* c4 */ - - z11 = tmp7 + z3; /* phase 5 */ - z13 = tmp7 - z3; - - dataptr[DCTSIZE*5] = z13 + z2; /* phase 6 */ - dataptr[DCTSIZE*3] = z13 - z2; - dataptr[DCTSIZE*1] = z11 + z4; - dataptr[DCTSIZE*7] = z11 - z4; - - dataptr++; /* advance pointer to next column */ - } -} - -#endif /* DCT_IFAST_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctint.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctint.c deleted file mode 100755 index a905849..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jfdctint.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * jfdctint.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a slow-but-accurate integer implementation of the - * forward DCT (Discrete Cosine Transform). - * - * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT - * on each column. Direct algorithms are also available, but they are - * much more complex and seem not to be any faster when reduced to code. - * - * This implementation is based on an algorithm described in - * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT - * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, - * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. - * The primary algorithm described there uses 11 multiplies and 29 adds. - * We use their alternate method with 12 multiplies and 32 adds. - * The advantage of this method is that no data path contains more than one - * multiplication; this allows a very simple and accurate implementation in - * scaled fixed-point arithmetic, with a minimal number of shifts. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_ISLOW_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* - * The poop on this scaling stuff is as follows: - * - * Each 1-D DCT step produces outputs which are a factor of sqrt(N) - * larger than the true DCT outputs. The final outputs are therefore - * a factor of N larger than desired; since N=8 this can be cured by - * a simple right shift at the end of the algorithm. The advantage of - * this arrangement is that we save two multiplications per 1-D DCT, - * because the y0 and y4 outputs need not be divided by sqrt(N). - * In the IJG code, this factor of 8 is removed by the quantization step - * (in jcdctmgr.c), NOT in this module. - * - * We have to do addition and subtraction of the integer inputs, which - * is no problem, and multiplication by fractional constants, which is - * a problem to do in integer arithmetic. We multiply all the constants - * by CONST_SCALE and convert them to integer constants (thus retaining - * CONST_BITS bits of precision in the constants). After doing a - * multiplication we have to divide the product by CONST_SCALE, with proper - * rounding, to produce the correct output. This division can be done - * cheaply as a right shift of CONST_BITS bits. We postpone shifting - * as long as possible so that partial sums can be added together with - * full fractional precision. - * - * The outputs of the first pass are scaled up by PASS1_BITS bits so that - * they are represented to better-than-integral precision. These outputs - * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word - * with the recommended scaling. (For 12-bit sample data, the intermediate - * array is INT32 anyway.) - * - * To avoid overflow of the 32-bit intermediate results in pass 2, we must - * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis - * shows that the values given below are the most effective. - */ - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 13 -#define PASS1_BITS 2 -#else -#define CONST_BITS 13 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 13 -#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ -#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ -#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ -#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ -#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ -#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ -#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ -#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ -#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ -#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ -#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ -#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ -#else -#define FIX_0_298631336 FIX(0.298631336) -#define FIX_0_390180644 FIX(0.390180644) -#define FIX_0_541196100 FIX(0.541196100) -#define FIX_0_765366865 FIX(0.765366865) -#define FIX_0_899976223 FIX(0.899976223) -#define FIX_1_175875602 FIX(1.175875602) -#define FIX_1_501321110 FIX(1.501321110) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_1_961570560 FIX(1.961570560) -#define FIX_2_053119869 FIX(2.053119869) -#define FIX_2_562915447 FIX(2.562915447) -#define FIX_3_072711026 FIX(3.072711026) -#endif - - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * For 8-bit samples with the recommended scaling, all the variable - * and constant values involved are no more than 16 bits wide, so a - * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. - * For 12-bit samples, a full 32-bit multiplication will be needed. - */ - -#if BITS_IN_JSAMPLE == 8 -#define MULTIPLY(var,const) MULTIPLY16C16(var,const) -#else -#define MULTIPLY(var,const) ((var) * (const)) -#endif - - -/* - * Perform the forward DCT on one block of samples. - */ - -GLOBAL(void) -jpeg_fdct_islow (DCTELEM * data) -{ - INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - INT32 tmp10, tmp11, tmp12, tmp13; - INT32 z1, z2, z3, z4, z5; - DCTELEM *dataptr; - int ctr; - SHIFT_TEMPS - - /* Pass 1: process rows. */ - /* Note results are scaled up by sqrt(8) compared to a true DCT; */ - /* furthermore, we scale the results by 2**PASS1_BITS. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[0] + dataptr[7]; - tmp7 = dataptr[0] - dataptr[7]; - tmp1 = dataptr[1] + dataptr[6]; - tmp6 = dataptr[1] - dataptr[6]; - tmp2 = dataptr[2] + dataptr[5]; - tmp5 = dataptr[2] - dataptr[5]; - tmp3 = dataptr[3] + dataptr[4]; - tmp4 = dataptr[3] - dataptr[4]; - - /* Even part per LL&M figure 1 --- note that published figure is faulty; - * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". - */ - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS); - dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); - - z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); - dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), - CONST_BITS-PASS1_BITS); - dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), - CONST_BITS-PASS1_BITS); - - /* Odd part per figure 8 --- note paper omits factor of sqrt(2). - * cK represents cos(K*pi/16). - * i0..i3 in the paper are tmp4..tmp7 here. - */ - - z1 = tmp4 + tmp7; - z2 = tmp5 + tmp6; - z3 = tmp4 + tmp6; - z4 = tmp5 + tmp7; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS); - dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS); - dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS); - dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS); - - dataptr += DCTSIZE; /* advance pointer to next row */ - } - - /* Pass 2: process columns. - * We remove the PASS1_BITS scaling, but leave the results scaled up - * by an overall factor of 8. - */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; - tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; - tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; - tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; - tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; - tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; - tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; - tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - - /* Even part per LL&M figure 1 --- note that published figure is faulty; - * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". - */ - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS); - dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS); - - z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); - dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), - CONST_BITS+PASS1_BITS); - - /* Odd part per figure 8 --- note paper omits factor of sqrt(2). - * cK represents cos(K*pi/16). - * i0..i3 in the paper are tmp4..tmp7 here. - */ - - z1 = tmp4 + tmp7; - z2 = tmp5 + tmp6; - z3 = tmp4 + tmp6; - z4 = tmp5 + tmp7; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, - CONST_BITS+PASS1_BITS); - - dataptr++; /* advance pointer to next column */ - } -} - -#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctflt.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctflt.c deleted file mode 100755 index 4a89578..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctflt.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * jidctflt.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a floating-point implementation of the - * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine - * must also perform dequantization of the input coefficients. - * - * This implementation should be more accurate than either of the integer - * IDCT implementations. However, it may not give the same results on all - * machines because of differences in roundoff behavior. Speed will depend - * on the hardware's floating point capacity. - * - * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT - * on each row (or vice versa, but it's more convenient to emit a row at - * a time). Direct algorithms are also available, but they are much more - * complex and seem not to be any faster when reduced to code. - * - * This implementation is based on Arai, Agui, and Nakajima's algorithm for - * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - * Japanese, but the algorithm is described in the Pennebaker & Mitchell - * JPEG textbook (see REFERENCES section in file README). The following code - * is based directly on figure 4-8 in P&M. - * While an 8-point DCT cannot be done in less than 11 multiplies, it is - * possible to arrange the computation so that many of the multiplies are - * simple scalings of the final outputs. These multiplies can then be - * folded into the multiplications or divisions by the JPEG quantization - * table entries. The AA&N method leaves only 5 multiplies and 29 adds - * to be done in the DCT itself. - * The primary disadvantage of this method is that with a fixed-point - * implementation, accuracy is lost due to imprecise representation of the - * scaled quantization values. However, that problem does not arise if - * we use floating point arithmetic. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_FLOAT_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* Dequantize a coefficient by multiplying it by the multiplier-table - * entry; produce a float result. - */ - -#define DEQUANTIZE(coef,quantval) (((FAST_FLOAT) (coef)) * (quantval)) - - -/* - * Perform dequantization and inverse DCT on one block of coefficients. - */ - -GLOBAL(void) -jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - FAST_FLOAT tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - FAST_FLOAT tmp10, tmp11, tmp12, tmp13; - FAST_FLOAT z5, z10, z11, z12, z13; - JCOEFPTR inptr; - FLOAT_MULT_TYPE * quantptr; - FAST_FLOAT * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */ - SHIFT_TEMPS - - /* Pass 1: process columns from input, store into work array. */ - - inptr = coef_block; - quantptr = (FLOAT_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; ctr--) { - /* Due to quantization, we will usually find that many of the input - * coefficients are zero, especially the AC terms. We can exploit this - * by short-circuiting the IDCT calculation for any column in which all - * the AC terms are zero. In that case each output is equal to the - * DC coefficient (with scale factor as needed). - * With typical images and quantization tables, half or more of the - * column DCT calculations can be simplified this way. - */ - - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && - inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && - inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && - inptr[DCTSIZE*7] == 0) { - /* AC terms all zero */ - FAST_FLOAT dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - wsptr[DCTSIZE*2] = dcval; - wsptr[DCTSIZE*3] = dcval; - wsptr[DCTSIZE*4] = dcval; - wsptr[DCTSIZE*5] = dcval; - wsptr[DCTSIZE*6] = dcval; - wsptr[DCTSIZE*7] = dcval; - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - continue; - } - - /* Even part */ - - tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); - tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); - tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); - - tmp10 = tmp0 + tmp2; /* phase 3 */ - tmp11 = tmp0 - tmp2; - - tmp13 = tmp1 + tmp3; /* phases 5-3 */ - tmp12 = (tmp1 - tmp3) * ((FAST_FLOAT) 1.414213562) - tmp13; /* 2*c4 */ - - tmp0 = tmp10 + tmp13; /* phase 2 */ - tmp3 = tmp10 - tmp13; - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - /* Odd part */ - - tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - - z13 = tmp6 + tmp5; /* phase 6 */ - z10 = tmp6 - tmp5; - z11 = tmp4 + tmp7; - z12 = tmp4 - tmp7; - - tmp7 = z11 + z13; /* phase 5 */ - tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */ - - z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ - tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ - tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ - - tmp6 = tmp12 - tmp7; /* phase 2 */ - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - wsptr[DCTSIZE*0] = tmp0 + tmp7; - wsptr[DCTSIZE*7] = tmp0 - tmp7; - wsptr[DCTSIZE*1] = tmp1 + tmp6; - wsptr[DCTSIZE*6] = tmp1 - tmp6; - wsptr[DCTSIZE*2] = tmp2 + tmp5; - wsptr[DCTSIZE*5] = tmp2 - tmp5; - wsptr[DCTSIZE*4] = tmp3 + tmp4; - wsptr[DCTSIZE*3] = tmp3 - tmp4; - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - } - - /* Pass 2: process rows from work array, store into output array. */ - /* Note that we must descale the results by a factor of 8 == 2**3. */ - - wsptr = workspace; - for (ctr = 0; ctr < DCTSIZE; ctr++) { - outptr = output_buf[ctr] + output_col; - /* Rows of zeroes can be exploited in the same way as we did with columns. - * However, the column calculation has created many nonzero AC terms, so - * the simplification applies less often (typically 5% to 10% of the time). - * And testing floats for zero is relatively expensive, so we don't bother. - */ - - /* Even part */ - - tmp10 = wsptr[0] + wsptr[4]; - tmp11 = wsptr[0] - wsptr[4]; - - tmp13 = wsptr[2] + wsptr[6]; - tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13; - - tmp0 = tmp10 + tmp13; - tmp3 = tmp10 - tmp13; - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - /* Odd part */ - - z13 = wsptr[5] + wsptr[3]; - z10 = wsptr[5] - wsptr[3]; - z11 = wsptr[1] + wsptr[7]; - z12 = wsptr[1] - wsptr[7]; - - tmp7 = z11 + z13; - tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); - - z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ - tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ - tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ - - tmp6 = tmp12 - tmp7; - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - /* Final output stage: scale down by a factor of 8 and range-limit */ - - outptr[0] = range_limit[(int) DESCALE((INT32) (tmp0 + tmp7), 3) - & RANGE_MASK]; - outptr[7] = range_limit[(int) DESCALE((INT32) (tmp0 - tmp7), 3) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE((INT32) (tmp1 + tmp6), 3) - & RANGE_MASK]; - outptr[6] = range_limit[(int) DESCALE((INT32) (tmp1 - tmp6), 3) - & RANGE_MASK]; - outptr[2] = range_limit[(int) DESCALE((INT32) (tmp2 + tmp5), 3) - & RANGE_MASK]; - outptr[5] = range_limit[(int) DESCALE((INT32) (tmp2 - tmp5), 3) - & RANGE_MASK]; - outptr[4] = range_limit[(int) DESCALE((INT32) (tmp3 + tmp4), 3) - & RANGE_MASK]; - outptr[3] = range_limit[(int) DESCALE((INT32) (tmp3 - tmp4), 3) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - -#endif /* DCT_FLOAT_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctfst.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctfst.c deleted file mode 100755 index 41790ea..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctfst.c +++ /dev/null @@ -1,368 +0,0 @@ -/* - * jidctfst.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a fast, not so accurate integer implementation of the - * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine - * must also perform dequantization of the input coefficients. - * - * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT - * on each row (or vice versa, but it's more convenient to emit a row at - * a time). Direct algorithms are also available, but they are much more - * complex and seem not to be any faster when reduced to code. - * - * This implementation is based on Arai, Agui, and Nakajima's algorithm for - * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - * Japanese, but the algorithm is described in the Pennebaker & Mitchell - * JPEG textbook (see REFERENCES section in file README). The following code - * is based directly on figure 4-8 in P&M. - * While an 8-point DCT cannot be done in less than 11 multiplies, it is - * possible to arrange the computation so that many of the multiplies are - * simple scalings of the final outputs. These multiplies can then be - * folded into the multiplications or divisions by the JPEG quantization - * table entries. The AA&N method leaves only 5 multiplies and 29 adds - * to be done in the DCT itself. - * The primary disadvantage of this method is that with fixed-point math, - * accuracy is lost due to imprecise representation of the scaled - * quantization values. The smaller the quantization table entry, the less - * precise the scaled value, so this implementation does worse with high- - * quality-setting files than with low-quality ones. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_IFAST_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* Scaling decisions are generally the same as in the LL&M algorithm; - * see jidctint.c for more details. However, we choose to descale - * (right shift) multiplication products as soon as they are formed, - * rather than carrying additional fractional bits into subsequent additions. - * This compromises accuracy slightly, but it lets us save a few shifts. - * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) - * everywhere except in the multiplications proper; this saves a good deal - * of work on 16-bit-int machines. - * - * The dequantized coefficients are not integers because the AA&N scaling - * factors have been incorporated. We represent them scaled up by PASS1_BITS, - * so that the first and second IDCT rounds have the same input scaling. - * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to - * avoid a descaling shift; this compromises accuracy rather drastically - * for small quantization table entries, but it saves a lot of shifts. - * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway, - * so we use a much larger scaling factor to preserve accuracy. - * - * A final compromise is to represent the multiplicative constants to only - * 8 fractional bits, rather than 13. This saves some shifting work on some - * machines, and may also reduce the cost of multiplication (since there - * are fewer one-bits in the constants). - */ - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 8 -#define PASS1_BITS 2 -#else -#define CONST_BITS 8 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 8 -#define FIX_1_082392200 ((INT32) 277) /* FIX(1.082392200) */ -#define FIX_1_414213562 ((INT32) 362) /* FIX(1.414213562) */ -#define FIX_1_847759065 ((INT32) 473) /* FIX(1.847759065) */ -#define FIX_2_613125930 ((INT32) 669) /* FIX(2.613125930) */ -#else -#define FIX_1_082392200 FIX(1.082392200) -#define FIX_1_414213562 FIX(1.414213562) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_2_613125930 FIX(2.613125930) -#endif - - -/* We can gain a little more speed, with a further compromise in accuracy, - * by omitting the addition in a descaling shift. This yields an incorrectly - * rounded result half the time... - */ - -#ifndef USE_ACCURATE_ROUNDING -#undef DESCALE -#define DESCALE(x,n) RIGHT_SHIFT(x, n) -#endif - - -/* Multiply a DCTELEM variable by an INT32 constant, and immediately - * descale to yield a DCTELEM result. - */ - -#define MULTIPLY(var,const) ((DCTELEM) DESCALE((var) * (const), CONST_BITS)) - - -/* Dequantize a coefficient by multiplying it by the multiplier-table - * entry; produce a DCTELEM result. For 8-bit data a 16x16->16 - * multiplication will do. For 12-bit data, the multiplier table is - * declared INT32, so a 32-bit multiply will be used. - */ - -#if BITS_IN_JSAMPLE == 8 -#define DEQUANTIZE(coef,quantval) (((IFAST_MULT_TYPE) (coef)) * (quantval)) -#else -#define DEQUANTIZE(coef,quantval) \ - DESCALE((coef)*(quantval), IFAST_SCALE_BITS-PASS1_BITS) -#endif - - -/* Like DESCALE, but applies to a DCTELEM and produces an int. - * We assume that int right shift is unsigned if INT32 right shift is. - */ - -#ifdef RIGHT_SHIFT_IS_UNSIGNED -#define ISHIFT_TEMPS DCTELEM ishift_temp; -#if BITS_IN_JSAMPLE == 8 -#define DCTELEMBITS 16 /* DCTELEM may be 16 or 32 bits */ -#else -#define DCTELEMBITS 32 /* DCTELEM must be 32 bits */ -#endif -#define IRIGHT_SHIFT(x,shft) \ - ((ishift_temp = (x)) < 0 ? \ - (ishift_temp >> (shft)) | ((~((DCTELEM) 0)) << (DCTELEMBITS-(shft))) : \ - (ishift_temp >> (shft))) -#else -#define ISHIFT_TEMPS -#define IRIGHT_SHIFT(x,shft) ((x) >> (shft)) -#endif - -#ifdef USE_ACCURATE_ROUNDING -#define IDESCALE(x,n) ((int) IRIGHT_SHIFT((x) + (1 << ((n)-1)), n)) -#else -#define IDESCALE(x,n) ((int) IRIGHT_SHIFT(x, n)) -#endif - - -/* - * Perform dequantization and inverse DCT on one block of coefficients. - */ - -GLOBAL(void) -jpeg_idct_ifast (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - DCTELEM tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - DCTELEM tmp10, tmp11, tmp12, tmp13; - DCTELEM z5, z10, z11, z12, z13; - JCOEFPTR inptr; - IFAST_MULT_TYPE * quantptr; - int * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - int workspace[DCTSIZE2]; /* buffers data between passes */ - SHIFT_TEMPS /* for DESCALE */ - ISHIFT_TEMPS /* for IDESCALE */ - - /* Pass 1: process columns from input, store into work array. */ - - inptr = coef_block; - quantptr = (IFAST_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; ctr--) { - /* Due to quantization, we will usually find that many of the input - * coefficients are zero, especially the AC terms. We can exploit this - * by short-circuiting the IDCT calculation for any column in which all - * the AC terms are zero. In that case each output is equal to the - * DC coefficient (with scale factor as needed). - * With typical images and quantization tables, half or more of the - * column DCT calculations can be simplified this way. - */ - - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && - inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && - inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && - inptr[DCTSIZE*7] == 0) { - /* AC terms all zero */ - int dcval = (int) DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - wsptr[DCTSIZE*2] = dcval; - wsptr[DCTSIZE*3] = dcval; - wsptr[DCTSIZE*4] = dcval; - wsptr[DCTSIZE*5] = dcval; - wsptr[DCTSIZE*6] = dcval; - wsptr[DCTSIZE*7] = dcval; - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - continue; - } - - /* Even part */ - - tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - tmp1 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); - tmp2 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); - tmp3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); - - tmp10 = tmp0 + tmp2; /* phase 3 */ - tmp11 = tmp0 - tmp2; - - tmp13 = tmp1 + tmp3; /* phases 5-3 */ - tmp12 = MULTIPLY(tmp1 - tmp3, FIX_1_414213562) - tmp13; /* 2*c4 */ - - tmp0 = tmp10 + tmp13; /* phase 2 */ - tmp3 = tmp10 - tmp13; - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - /* Odd part */ - - tmp4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - tmp5 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - tmp6 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - tmp7 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - - z13 = tmp6 + tmp5; /* phase 6 */ - z10 = tmp6 - tmp5; - z11 = tmp4 + tmp7; - z12 = tmp4 - tmp7; - - tmp7 = z11 + z13; /* phase 5 */ - tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ - - z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ - tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ - tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ - - tmp6 = tmp12 - tmp7; /* phase 2 */ - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - wsptr[DCTSIZE*0] = (int) (tmp0 + tmp7); - wsptr[DCTSIZE*7] = (int) (tmp0 - tmp7); - wsptr[DCTSIZE*1] = (int) (tmp1 + tmp6); - wsptr[DCTSIZE*6] = (int) (tmp1 - tmp6); - wsptr[DCTSIZE*2] = (int) (tmp2 + tmp5); - wsptr[DCTSIZE*5] = (int) (tmp2 - tmp5); - wsptr[DCTSIZE*4] = (int) (tmp3 + tmp4); - wsptr[DCTSIZE*3] = (int) (tmp3 - tmp4); - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - } - - /* Pass 2: process rows from work array, store into output array. */ - /* Note that we must descale the results by a factor of 8 == 2**3, */ - /* and also undo the PASS1_BITS scaling. */ - - wsptr = workspace; - for (ctr = 0; ctr < DCTSIZE; ctr++) { - outptr = output_buf[ctr] + output_col; - /* Rows of zeroes can be exploited in the same way as we did with columns. - * However, the column calculation has created many nonzero AC terms, so - * the simplification applies less often (typically 5% to 10% of the time). - * On machines with very fast multiplication, it's possible that the - * test takes more time than it's worth. In that case this section - * may be commented out. - */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && - wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[IDESCALE(wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - outptr[2] = dcval; - outptr[3] = dcval; - outptr[4] = dcval; - outptr[5] = dcval; - outptr[6] = dcval; - outptr[7] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif - - /* Even part */ - - tmp10 = ((DCTELEM) wsptr[0] + (DCTELEM) wsptr[4]); - tmp11 = ((DCTELEM) wsptr[0] - (DCTELEM) wsptr[4]); - - tmp13 = ((DCTELEM) wsptr[2] + (DCTELEM) wsptr[6]); - tmp12 = MULTIPLY((DCTELEM) wsptr[2] - (DCTELEM) wsptr[6], FIX_1_414213562) - - tmp13; - - tmp0 = tmp10 + tmp13; - tmp3 = tmp10 - tmp13; - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - /* Odd part */ - - z13 = (DCTELEM) wsptr[5] + (DCTELEM) wsptr[3]; - z10 = (DCTELEM) wsptr[5] - (DCTELEM) wsptr[3]; - z11 = (DCTELEM) wsptr[1] + (DCTELEM) wsptr[7]; - z12 = (DCTELEM) wsptr[1] - (DCTELEM) wsptr[7]; - - tmp7 = z11 + z13; /* phase 5 */ - tmp11 = MULTIPLY(z11 - z13, FIX_1_414213562); /* 2*c4 */ - - z5 = MULTIPLY(z10 + z12, FIX_1_847759065); /* 2*c2 */ - tmp10 = MULTIPLY(z12, FIX_1_082392200) - z5; /* 2*(c2-c6) */ - tmp12 = MULTIPLY(z10, - FIX_2_613125930) + z5; /* -2*(c2+c6) */ - - tmp6 = tmp12 - tmp7; /* phase 2 */ - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - /* Final output stage: scale down by a factor of 8 and range-limit */ - - outptr[0] = range_limit[IDESCALE(tmp0 + tmp7, PASS1_BITS+3) - & RANGE_MASK]; - outptr[7] = range_limit[IDESCALE(tmp0 - tmp7, PASS1_BITS+3) - & RANGE_MASK]; - outptr[1] = range_limit[IDESCALE(tmp1 + tmp6, PASS1_BITS+3) - & RANGE_MASK]; - outptr[6] = range_limit[IDESCALE(tmp1 - tmp6, PASS1_BITS+3) - & RANGE_MASK]; - outptr[2] = range_limit[IDESCALE(tmp2 + tmp5, PASS1_BITS+3) - & RANGE_MASK]; - outptr[5] = range_limit[IDESCALE(tmp2 - tmp5, PASS1_BITS+3) - & RANGE_MASK]; - outptr[4] = range_limit[IDESCALE(tmp3 + tmp4, PASS1_BITS+3) - & RANGE_MASK]; - outptr[3] = range_limit[IDESCALE(tmp3 - tmp4, PASS1_BITS+3) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - -#endif /* DCT_IFAST_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctint.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctint.c deleted file mode 100755 index 63ad6d3..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctint.c +++ /dev/null @@ -1,389 +0,0 @@ -/* - * jidctint.c - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a slow-but-accurate integer implementation of the - * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine - * must also perform dequantization of the input coefficients. - * - * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT - * on each row (or vice versa, but it's more convenient to emit a row at - * a time). Direct algorithms are also available, but they are much more - * complex and seem not to be any faster when reduced to code. - * - * This implementation is based on an algorithm described in - * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT - * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, - * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. - * The primary algorithm described there uses 11 multiplies and 29 adds. - * We use their alternate method with 12 multiplies and 32 adds. - * The advantage of this method is that no data path contains more than one - * multiplication; this allows a very simple and accurate implementation in - * scaled fixed-point arithmetic, with a minimal number of shifts. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef DCT_ISLOW_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* - * The poop on this scaling stuff is as follows: - * - * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) - * larger than the true IDCT outputs. The final outputs are therefore - * a factor of N larger than desired; since N=8 this can be cured by - * a simple right shift at the end of the algorithm. The advantage of - * this arrangement is that we save two multiplications per 1-D IDCT, - * because the y0 and y4 inputs need not be divided by sqrt(N). - * - * We have to do addition and subtraction of the integer inputs, which - * is no problem, and multiplication by fractional constants, which is - * a problem to do in integer arithmetic. We multiply all the constants - * by CONST_SCALE and convert them to integer constants (thus retaining - * CONST_BITS bits of precision in the constants). After doing a - * multiplication we have to divide the product by CONST_SCALE, with proper - * rounding, to produce the correct output. This division can be done - * cheaply as a right shift of CONST_BITS bits. We postpone shifting - * as long as possible so that partial sums can be added together with - * full fractional precision. - * - * The outputs of the first pass are scaled up by PASS1_BITS bits so that - * they are represented to better-than-integral precision. These outputs - * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word - * with the recommended scaling. (To scale up 12-bit sample data further, an - * intermediate INT32 array would be needed.) - * - * To avoid overflow of the 32-bit intermediate results in pass 2, we must - * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis - * shows that the values given below are the most effective. - */ - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 13 -#define PASS1_BITS 2 -#else -#define CONST_BITS 13 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 13 -#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ -#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ -#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ -#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ -#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ -#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ -#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ -#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ -#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ -#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ -#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ -#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ -#else -#define FIX_0_298631336 FIX(0.298631336) -#define FIX_0_390180644 FIX(0.390180644) -#define FIX_0_541196100 FIX(0.541196100) -#define FIX_0_765366865 FIX(0.765366865) -#define FIX_0_899976223 FIX(0.899976223) -#define FIX_1_175875602 FIX(1.175875602) -#define FIX_1_501321110 FIX(1.501321110) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_1_961570560 FIX(1.961570560) -#define FIX_2_053119869 FIX(2.053119869) -#define FIX_2_562915447 FIX(2.562915447) -#define FIX_3_072711026 FIX(3.072711026) -#endif - - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * For 8-bit samples with the recommended scaling, all the variable - * and constant values involved are no more than 16 bits wide, so a - * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. - * For 12-bit samples, a full 32-bit multiplication will be needed. - */ - -#if BITS_IN_JSAMPLE == 8 -#define MULTIPLY(var,const) MULTIPLY16C16(var,const) -#else -#define MULTIPLY(var,const) ((var) * (const)) -#endif - - -/* Dequantize a coefficient by multiplying it by the multiplier-table - * entry; produce an int result. In this module, both inputs and result - * are 16 bits or less, so either int or short multiply will work. - */ - -#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) - - -/* - * Perform dequantization and inverse DCT on one block of coefficients. - */ - -GLOBAL(void) -jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - INT32 tmp0, tmp1, tmp2, tmp3; - INT32 tmp10, tmp11, tmp12, tmp13; - INT32 z1, z2, z3, z4, z5; - JCOEFPTR inptr; - ISLOW_MULT_TYPE * quantptr; - int * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - int workspace[DCTSIZE2]; /* buffers data between passes */ - SHIFT_TEMPS - - /* Pass 1: process columns from input, store into work array. */ - /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ - /* furthermore, we scale the results by 2**PASS1_BITS. */ - - inptr = coef_block; - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; ctr--) { - /* Due to quantization, we will usually find that many of the input - * coefficients are zero, especially the AC terms. We can exploit this - * by short-circuiting the IDCT calculation for any column in which all - * the AC terms are zero. In that case each output is equal to the - * DC coefficient (with scale factor as needed). - * With typical images and quantization tables, half or more of the - * column DCT calculations can be simplified this way. - */ - - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && - inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 && - inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 && - inptr[DCTSIZE*7] == 0) { - /* AC terms all zero */ - int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - wsptr[DCTSIZE*2] = dcval; - wsptr[DCTSIZE*3] = dcval; - wsptr[DCTSIZE*4] = dcval; - wsptr[DCTSIZE*5] = dcval; - wsptr[DCTSIZE*6] = dcval; - wsptr[DCTSIZE*7] = dcval; - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - continue; - } - - /* Even part: reverse the even part of the forward DCT. */ - /* The rotator is sqrt(2)*c(-6). */ - - z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); - z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); - - z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); - - z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]); - - tmp0 = (z2 + z3) << CONST_BITS; - tmp1 = (z2 - z3) << CONST_BITS; - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - /* Odd part per figure 8; the matrix is unitary and hence its - * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. - */ - - tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - - z1 = tmp0 + tmp3; - z2 = tmp1 + tmp2; - z3 = tmp0 + tmp2; - z4 = tmp1 + tmp3; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - tmp0 += z1 + z3; - tmp1 += z2 + z4; - tmp2 += z2 + z3; - tmp3 += z1 + z4; - - /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ - - wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS); - wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS); - - inptr++; /* advance pointers to next column */ - quantptr++; - wsptr++; - } - - /* Pass 2: process rows from work array, store into output array. */ - /* Note that we must descale the results by a factor of 8 == 2**3, */ - /* and also undo the PASS1_BITS scaling. */ - - wsptr = workspace; - for (ctr = 0; ctr < DCTSIZE; ctr++) { - outptr = output_buf[ctr] + output_col; - /* Rows of zeroes can be exploited in the same way as we did with columns. - * However, the column calculation has created many nonzero AC terms, so - * the simplification applies less often (typically 5% to 10% of the time). - * On machines with very fast multiplication, it's possible that the - * test takes more time than it's worth. In that case this section - * may be commented out. - */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 && - wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - outptr[2] = dcval; - outptr[3] = dcval; - outptr[4] = dcval; - outptr[5] = dcval; - outptr[6] = dcval; - outptr[7] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif - - /* Even part: reverse the even part of the forward DCT. */ - /* The rotator is sqrt(2)*c(-6). */ - - z2 = (INT32) wsptr[2]; - z3 = (INT32) wsptr[6]; - - z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); - - tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS; - tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS; - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - /* Odd part per figure 8; the matrix is unitary and hence its - * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. - */ - - tmp0 = (INT32) wsptr[7]; - tmp1 = (INT32) wsptr[5]; - tmp2 = (INT32) wsptr[3]; - tmp3 = (INT32) wsptr[1]; - - z1 = tmp0 + tmp3; - z2 = tmp1 + tmp2; - z3 = tmp0 + tmp2; - z4 = tmp1 + tmp3; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - tmp0 += z1 + z3; - tmp1 += z2 + z4; - tmp2 += z2 + z3; - tmp3 += z1 + z4; - - /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ - - outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0, - CONST_BITS+PASS1_BITS+3) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - -#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctred.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctred.c deleted file mode 100755 index 6a923f4..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jidctred.c +++ /dev/null @@ -1,398 +0,0 @@ -/* - * jidctred.c - * - * Copyright (C) 1994-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains inverse-DCT routines that produce reduced-size output: - * either 4x4, 2x2, or 1x1 pixels from an 8x8 DCT block. - * - * The implementation is based on the Loeffler, Ligtenberg and Moschytz (LL&M) - * algorithm used in jidctint.c. We simply replace each 8-to-8 1-D IDCT step - * with an 8-to-4 step that produces the four averages of two adjacent outputs - * (or an 8-to-2 step producing two averages of four outputs, for 2x2 output). - * These steps were derived by computing the corresponding values at the end - * of the normal LL&M code, then simplifying as much as possible. - * - * 1x1 is trivial: just take the DC coefficient divided by 8. - * - * See jidctint.c for additional comments. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jdct.h" /* Private declarations for DCT subsystem */ - -#ifdef IDCT_SCALING_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 - Sorry, this code only copes with 8x8 DCTs. /* deliberate syntax err */ -#endif - - -/* Scaling is the same as in jidctint.c. */ - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 13 -#define PASS1_BITS 2 -#else -#define CONST_BITS 13 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 13 -#define FIX_0_211164243 ((INT32) 1730) /* FIX(0.211164243) */ -#define FIX_0_509795579 ((INT32) 4176) /* FIX(0.509795579) */ -#define FIX_0_601344887 ((INT32) 4926) /* FIX(0.601344887) */ -#define FIX_0_720959822 ((INT32) 5906) /* FIX(0.720959822) */ -#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ -#define FIX_0_850430095 ((INT32) 6967) /* FIX(0.850430095) */ -#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ -#define FIX_1_061594337 ((INT32) 8697) /* FIX(1.061594337) */ -#define FIX_1_272758580 ((INT32) 10426) /* FIX(1.272758580) */ -#define FIX_1_451774981 ((INT32) 11893) /* FIX(1.451774981) */ -#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ -#define FIX_2_172734803 ((INT32) 17799) /* FIX(2.172734803) */ -#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ -#define FIX_3_624509785 ((INT32) 29692) /* FIX(3.624509785) */ -#else -#define FIX_0_211164243 FIX(0.211164243) -#define FIX_0_509795579 FIX(0.509795579) -#define FIX_0_601344887 FIX(0.601344887) -#define FIX_0_720959822 FIX(0.720959822) -#define FIX_0_765366865 FIX(0.765366865) -#define FIX_0_850430095 FIX(0.850430095) -#define FIX_0_899976223 FIX(0.899976223) -#define FIX_1_061594337 FIX(1.061594337) -#define FIX_1_272758580 FIX(1.272758580) -#define FIX_1_451774981 FIX(1.451774981) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_2_172734803 FIX(2.172734803) -#define FIX_2_562915447 FIX(2.562915447) -#define FIX_3_624509785 FIX(3.624509785) -#endif - - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * For 8-bit samples with the recommended scaling, all the variable - * and constant values involved are no more than 16 bits wide, so a - * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. - * For 12-bit samples, a full 32-bit multiplication will be needed. - */ - -#if BITS_IN_JSAMPLE == 8 -#define MULTIPLY(var,const) MULTIPLY16C16(var,const) -#else -#define MULTIPLY(var,const) ((var) * (const)) -#endif - - -/* Dequantize a coefficient by multiplying it by the multiplier-table - * entry; produce an int result. In this module, both inputs and result - * are 16 bits or less, so either int or short multiply will work. - */ - -#define DEQUANTIZE(coef,quantval) (((ISLOW_MULT_TYPE) (coef)) * (quantval)) - - -/* - * Perform dequantization and inverse DCT on one block of coefficients, - * producing a reduced-size 4x4 output block. - */ - -GLOBAL(void) -jpeg_idct_4x4 (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - INT32 tmp0, tmp2, tmp10, tmp12; - INT32 z1, z2, z3, z4; - JCOEFPTR inptr; - ISLOW_MULT_TYPE * quantptr; - int * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - int workspace[DCTSIZE*4]; /* buffers data between passes */ - SHIFT_TEMPS - - /* Pass 1: process columns from input, store into work array. */ - - inptr = coef_block; - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) { - /* Don't bother to process column 4, because second pass won't use it */ - if (ctr == DCTSIZE-4) - continue; - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 && - inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*5] == 0 && - inptr[DCTSIZE*6] == 0 && inptr[DCTSIZE*7] == 0) { - /* AC terms all zero; we need not examine term 4 for 4x4 output */ - int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - wsptr[DCTSIZE*2] = dcval; - wsptr[DCTSIZE*3] = dcval; - - continue; - } - - /* Even part */ - - tmp0 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - tmp0 <<= (CONST_BITS+1); - - z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]); - z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]); - - tmp2 = MULTIPLY(z2, FIX_1_847759065) + MULTIPLY(z3, - FIX_0_765366865); - - tmp10 = tmp0 + tmp2; - tmp12 = tmp0 - tmp2; - - /* Odd part */ - - z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - z2 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - z3 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - z4 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - - tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */ - + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */ - + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ - + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */ - - tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */ - + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */ - + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */ - + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */ - - /* Final output stage */ - - wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp2, CONST_BITS-PASS1_BITS+1); - wsptr[DCTSIZE*3] = (int) DESCALE(tmp10 - tmp2, CONST_BITS-PASS1_BITS+1); - wsptr[DCTSIZE*1] = (int) DESCALE(tmp12 + tmp0, CONST_BITS-PASS1_BITS+1); - wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 - tmp0, CONST_BITS-PASS1_BITS+1); - } - - /* Pass 2: process 4 rows from work array, store into output array. */ - - wsptr = workspace; - for (ctr = 0; ctr < 4; ctr++) { - outptr = output_buf[ctr] + output_col; - /* It's not clear whether a zero row test is worthwhile here ... */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && - wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - outptr[2] = dcval; - outptr[3] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif - - /* Even part */ - - tmp0 = ((INT32) wsptr[0]) << (CONST_BITS+1); - - tmp2 = MULTIPLY((INT32) wsptr[2], FIX_1_847759065) - + MULTIPLY((INT32) wsptr[6], - FIX_0_765366865); - - tmp10 = tmp0 + tmp2; - tmp12 = tmp0 - tmp2; - - /* Odd part */ - - z1 = (INT32) wsptr[7]; - z2 = (INT32) wsptr[5]; - z3 = (INT32) wsptr[3]; - z4 = (INT32) wsptr[1]; - - tmp0 = MULTIPLY(z1, - FIX_0_211164243) /* sqrt(2) * (c3-c1) */ - + MULTIPLY(z2, FIX_1_451774981) /* sqrt(2) * (c3+c7) */ - + MULTIPLY(z3, - FIX_2_172734803) /* sqrt(2) * (-c1-c5) */ - + MULTIPLY(z4, FIX_1_061594337); /* sqrt(2) * (c5+c7) */ - - tmp2 = MULTIPLY(z1, - FIX_0_509795579) /* sqrt(2) * (c7-c5) */ - + MULTIPLY(z2, - FIX_0_601344887) /* sqrt(2) * (c5-c1) */ - + MULTIPLY(z3, FIX_0_899976223) /* sqrt(2) * (c3-c7) */ - + MULTIPLY(z4, FIX_2_562915447); /* sqrt(2) * (c1+c3) */ - - /* Final output stage */ - - outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp2, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - outptr[3] = range_limit[(int) DESCALE(tmp10 - tmp2, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE(tmp12 + tmp0, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - outptr[2] = range_limit[(int) DESCALE(tmp12 - tmp0, - CONST_BITS+PASS1_BITS+3+1) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - - -/* - * Perform dequantization and inverse DCT on one block of coefficients, - * producing a reduced-size 2x2 output block. - */ - -GLOBAL(void) -jpeg_idct_2x2 (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - INT32 tmp0, tmp10, z1; - JCOEFPTR inptr; - ISLOW_MULT_TYPE * quantptr; - int * wsptr; - JSAMPROW outptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - int ctr; - int workspace[DCTSIZE*2]; /* buffers data between passes */ - SHIFT_TEMPS - - /* Pass 1: process columns from input, store into work array. */ - - inptr = coef_block; - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - wsptr = workspace; - for (ctr = DCTSIZE; ctr > 0; inptr++, quantptr++, wsptr++, ctr--) { - /* Don't bother to process columns 2,4,6 */ - if (ctr == DCTSIZE-2 || ctr == DCTSIZE-4 || ctr == DCTSIZE-6) - continue; - if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*3] == 0 && - inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*7] == 0) { - /* AC terms all zero; we need not examine terms 2,4,6 for 2x2 output */ - int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS; - - wsptr[DCTSIZE*0] = dcval; - wsptr[DCTSIZE*1] = dcval; - - continue; - } - - /* Even part */ - - z1 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]); - tmp10 = z1 << (CONST_BITS+2); - - /* Odd part */ - - z1 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]); - tmp0 = MULTIPLY(z1, - FIX_0_720959822); /* sqrt(2) * (c7-c5+c3-c1) */ - z1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]); - tmp0 += MULTIPLY(z1, FIX_0_850430095); /* sqrt(2) * (-c1+c3+c5+c7) */ - z1 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]); - tmp0 += MULTIPLY(z1, - FIX_1_272758580); /* sqrt(2) * (-c1+c3-c5-c7) */ - z1 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]); - tmp0 += MULTIPLY(z1, FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */ - - /* Final output stage */ - - wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp0, CONST_BITS-PASS1_BITS+2); - wsptr[DCTSIZE*1] = (int) DESCALE(tmp10 - tmp0, CONST_BITS-PASS1_BITS+2); - } - - /* Pass 2: process 2 rows from work array, store into output array. */ - - wsptr = workspace; - for (ctr = 0; ctr < 2; ctr++) { - outptr = output_buf[ctr] + output_col; - /* It's not clear whether a zero row test is worthwhile here ... */ - -#ifndef NO_ZERO_ROW_TEST - if (wsptr[1] == 0 && wsptr[3] == 0 && wsptr[5] == 0 && wsptr[7] == 0) { - /* AC terms all zero */ - JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3) - & RANGE_MASK]; - - outptr[0] = dcval; - outptr[1] = dcval; - - wsptr += DCTSIZE; /* advance pointer to next row */ - continue; - } -#endif - - /* Even part */ - - tmp10 = ((INT32) wsptr[0]) << (CONST_BITS+2); - - /* Odd part */ - - tmp0 = MULTIPLY((INT32) wsptr[7], - FIX_0_720959822) /* sqrt(2) * (c7-c5+c3-c1) */ - + MULTIPLY((INT32) wsptr[5], FIX_0_850430095) /* sqrt(2) * (-c1+c3+c5+c7) */ - + MULTIPLY((INT32) wsptr[3], - FIX_1_272758580) /* sqrt(2) * (-c1+c3-c5-c7) */ - + MULTIPLY((INT32) wsptr[1], FIX_3_624509785); /* sqrt(2) * (c1+c3+c5+c7) */ - - /* Final output stage */ - - outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp0, - CONST_BITS+PASS1_BITS+3+2) - & RANGE_MASK]; - outptr[1] = range_limit[(int) DESCALE(tmp10 - tmp0, - CONST_BITS+PASS1_BITS+3+2) - & RANGE_MASK]; - - wsptr += DCTSIZE; /* advance pointer to next row */ - } -} - - -/* - * Perform dequantization and inverse DCT on one block of coefficients, - * producing a reduced-size 1x1 output block. - */ - -GLOBAL(void) -jpeg_idct_1x1 (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col) -{ - int dcval; - ISLOW_MULT_TYPE * quantptr; - JSAMPLE *range_limit = IDCT_range_limit(cinfo); - SHIFT_TEMPS - - /* We hardly need an inverse DCT routine for this: just take the - * average pixel value, which is one-eighth of the DC coefficient. - */ - quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table; - dcval = DEQUANTIZE(coef_block[0], quantptr[0]); - dcval = (int) DESCALE((INT32) dcval, 3); - - output_buf[0][output_col] = range_limit[dcval & RANGE_MASK]; -} - -#endif /* IDCT_SCALING_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h deleted file mode 100755 index ab66008..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jinclude.h +++ /dev/null @@ -1,192 +0,0 @@ -/* - * jinclude.h - * - * Copyright (C) 1991-1994, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file exists to provide a single place to fix any problems with - * including the wrong system include files. (Common problems are taken - * care of by the standard jconfig symbols, but on really weird systems - * you may have to edit this file.) - * - * NOTE: this file is NOT intended to be included by applications using the - * JPEG library. Most applications need only include jpeglib.h. - */ - - -/* Include auto-config file to find out which system include files we need. */ - -#ifndef __jinclude_h__ -#define __jinclude_h__ - -#include "jconfig.h" /* auto configuration options */ -#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */ - -/* - * We need the NULL macro and size_t typedef. - * On an ANSI-conforming system it is sufficient to include . - * Otherwise, we get them from or ; we may have to - * pull in as well. - * Note that the core JPEG library does not require ; - * only the default error handler and data source/destination modules do. - * But we must pull it in because of the references to FILE in jpeglib.h. - * You can remove those references if you want to compile without . - */ - -#ifdef HAVE_STDDEF_H -#include -#endif - -#ifdef HAVE_STDLIB_H -#include -#endif - -#ifdef NEED_SYS_TYPES_H -#include -#endif - -#include - -/* - * We need memory copying and zeroing functions, plus strncpy(). - * ANSI and System V implementations declare these in . - * BSD doesn't have the mem() functions, but it does have bcopy()/bzero(). - * Some systems may declare memset and memcpy in . - * - * NOTE: we assume the size parameters to these functions are of type size_t. - * Change the casts in these macros if not! - */ - -#ifdef NEED_BSD_STRINGS - -#include -#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size)) -#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size)) - -#else /* not BSD, assume ANSI/SysV string lib */ - -#include -#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size)) -#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size)) - -#endif - -/* - * In ANSI C, and indeed any rational implementation, size_t is also the - * type returned by sizeof(). However, it seems there are some irrational - * implementations out there, in which sizeof() returns an int even though - * size_t is defined as long or unsigned long. To ensure consistent results - * we always use this SIZEOF() macro in place of using sizeof() directly. - */ - -#define SIZEOF(object) ((size_t) sizeof(object)) - -/* - * The modules that use fread() and fwrite() always invoke them through - * these macros. On some systems you may need to twiddle the argument casts. - * CAUTION: argument order is different from underlying functions! - */ - -#define JFREAD(file,buf,sizeofbuf) \ - ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) -#define JFWRITE(file,buf,sizeofbuf) \ - ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) - - - -typedef enum { /* JPEG marker codes */ - M_SOF0 = 0xc0, - M_SOF1 = 0xc1, - M_SOF2 = 0xc2, - M_SOF3 = 0xc3, - - M_SOF5 = 0xc5, - M_SOF6 = 0xc6, - M_SOF7 = 0xc7, - - M_JPG = 0xc8, - M_SOF9 = 0xc9, - M_SOF10 = 0xca, - M_SOF11 = 0xcb, - - M_SOF13 = 0xcd, - M_SOF14 = 0xce, - M_SOF15 = 0xcf, - - M_DHT = 0xc4, - - M_DAC = 0xcc, - - M_RST0 = 0xd0, - M_RST1 = 0xd1, - M_RST2 = 0xd2, - M_RST3 = 0xd3, - M_RST4 = 0xd4, - M_RST5 = 0xd5, - M_RST6 = 0xd6, - M_RST7 = 0xd7, - - M_SOI = 0xd8, - M_EOI = 0xd9, - M_SOS = 0xda, - M_DQT = 0xdb, - M_DNL = 0xdc, - M_DRI = 0xdd, - M_DHP = 0xde, - M_EXP = 0xdf, - - M_APP0 = 0xe0, - M_APP1 = 0xe1, - M_APP2 = 0xe2, - M_APP3 = 0xe3, - M_APP4 = 0xe4, - M_APP5 = 0xe5, - M_APP6 = 0xe6, - M_APP7 = 0xe7, - M_APP8 = 0xe8, - M_APP9 = 0xe9, - M_APP10 = 0xea, - M_APP11 = 0xeb, - M_APP12 = 0xec, - M_APP13 = 0xed, - M_APP14 = 0xee, - M_APP15 = 0xef, - - M_JPG0 = 0xf0, - M_JPG13 = 0xfd, - M_COM = 0xfe, - - M_TEM = 0x01, - - M_ERROR = 0x100 -} JPEG_MARKER; - - -/* - * Figure F.12: extend sign bit. - * On some machines, a shift and add will be faster than a table lookup. - */ - -#ifdef AVOID_TABLES - -#define HUFF_EXTEND(x,s) ((x) < (1<<((s)-1)) ? (x) + (((-1)<<(s)) + 1) : (x)) - -#else - -#define HUFF_EXTEND(x,s) ((x) < extend_test[s] ? (x) + extend_offset[s] : (x)) - -static const int extend_test[16] = /* entry n is 2**(n-1) */ - { 0, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, - 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000 }; - -static const int extend_offset[16] = /* entry n is (-1 << n) + 1 */ - { 0, ((-1)<<1) + 1, ((-1)<<2) + 1, ((-1)<<3) + 1, ((-1)<<4) + 1, - ((-1)<<5) + 1, ((-1)<<6) + 1, ((-1)<<7) + 1, ((-1)<<8) + 1, - ((-1)<<9) + 1, ((-1)<<10) + 1, ((-1)<<11) + 1, ((-1)<<12) + 1, - ((-1)<<13) + 1, ((-1)<<14) + 1, ((-1)<<15) + 1 }; - -#endif /* AVOID_TABLES */ - - -#endif diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemmgr.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemmgr.c deleted file mode 100755 index c11609b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemmgr.c +++ /dev/null @@ -1,1118 +0,0 @@ -/* - * jmemmgr.c - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the JPEG system-independent memory management - * routines. This code is usable across a wide variety of machines; most - * of the system dependencies have been isolated in a separate file. - * The major functions provided here are: - * * pool-based allocation and freeing of memory; - * * policy decisions about how to divide available memory among the - * virtual arrays; - * * control logic for swapping virtual arrays between main memory and - * backing storage. - * The separate system-dependent file provides the actual backing-storage - * access code, and it contains the policy decision about how much total - * main memory to use. - * This file is system-dependent in the sense that some of its functions - * are unnecessary in some systems. For example, if there is enough virtual - * memory so that backing storage will never be used, much of the virtual - * array control logic could be removed. (Of course, if you have that much - * memory then you shouldn't care about a little bit of unused code...) - */ - -#define JPEG_INTERNALS -#define AM_MEMORY_MANAGER /* we define jvirt_Xarray_control structs */ -#include "jinclude.h" -#include "jpeglib.h" -#include "jmemsys.h" /* import the system-dependent declarations */ - -#ifndef NO_GETENV -#ifndef HAVE_STDLIB_H /* should declare getenv() */ -extern char * getenv JPP((const char * name)); -#endif -#endif - - -/* - * Some important notes: - * The allocation routines provided here must never return NULL. - * They should exit to error_exit if unsuccessful. - * - * It's not a good idea to try to merge the sarray and barray routines, - * even though they are textually almost the same, because samples are - * usually stored as bytes while coefficients are shorts or ints. Thus, - * in machines where byte pointers have a different representation from - * word pointers, the resulting machine code could not be the same. - */ - - -/* - * Many machines require storage alignment: longs must start on 4-byte - * boundaries, doubles on 8-byte boundaries, etc. On such machines, malloc() - * always returns pointers that are multiples of the worst-case alignment - * requirement, and we had better do so too. - * There isn't any really portable way to determine the worst-case alignment - * requirement. This module assumes that the alignment requirement is - * multiples of sizeof(ALIGN_TYPE). - * By default, we define ALIGN_TYPE as double. This is necessary on some - * workstations (where doubles really do need 8-byte alignment) and will work - * fine on nearly everything. If your machine has lesser alignment needs, - * you can save a few bytes by making ALIGN_TYPE smaller. - * The only place I know of where this will NOT work is certain Macintosh - * 680x0 compilers that define double as a 10-byte IEEE extended float. - * Doing 10-byte alignment is counterproductive because longwords won't be - * aligned well. Put "#define ALIGN_TYPE long" in jconfig.h if you have - * such a compiler. - */ - -#ifndef ALIGN_TYPE /* so can override from jconfig.h */ -#define ALIGN_TYPE double -#endif - - -/* - * We allocate objects from "pools", where each pool is gotten with a single - * request to jpeg_get_small() or jpeg_get_large(). There is no per-object - * overhead within a pool, except for alignment padding. Each pool has a - * header with a link to the next pool of the same class. - * Small and large pool headers are identical except that the latter's - * link pointer must be FAR on 80x86 machines. - * Notice that the "real" header fields are union'ed with a dummy ALIGN_TYPE - * field. This forces the compiler to make SIZEOF(small_pool_hdr) a multiple - * of the alignment requirement of ALIGN_TYPE. - */ - -typedef union small_pool_struct * small_pool_ptr; - -typedef union small_pool_struct { - struct { - small_pool_ptr next; /* next in list of pools */ - size_t bytes_used; /* how many bytes already used within pool */ - size_t bytes_left; /* bytes still available in this pool */ - } hdr; - ALIGN_TYPE dummy; /* included in union to ensure alignment */ -} small_pool_hdr; - -typedef union large_pool_struct FAR * large_pool_ptr; - -typedef union large_pool_struct { - struct { - large_pool_ptr next; /* next in list of pools */ - size_t bytes_used; /* how many bytes already used within pool */ - size_t bytes_left; /* bytes still available in this pool */ - } hdr; - ALIGN_TYPE dummy; /* included in union to ensure alignment */ -} large_pool_hdr; - - -/* - * Here is the full definition of a memory manager object. - */ - -typedef struct { - struct jpeg_memory_mgr pub; /* public fields */ - - /* Each pool identifier (lifetime class) names a linked list of pools. */ - small_pool_ptr small_list[JPOOL_NUMPOOLS]; - large_pool_ptr large_list[JPOOL_NUMPOOLS]; - - /* Since we only have one lifetime class of virtual arrays, only one - * linked list is necessary (for each datatype). Note that the virtual - * array control blocks being linked together are actually stored somewhere - * in the small-pool list. - */ - jvirt_sarray_ptr virt_sarray_list; - jvirt_barray_ptr virt_barray_list; - - /* This counts total space obtained from jpeg_get_small/large */ - long total_space_allocated; - - /* alloc_sarray and alloc_barray set this value for use by virtual - * array routines. - */ - JDIMENSION last_rowsperchunk; /* from most recent alloc_sarray/barray */ -} my_memory_mgr; - -typedef my_memory_mgr * my_mem_ptr; - - -/* - * The control blocks for virtual arrays. - * Note that these blocks are allocated in the "small" pool area. - * System-dependent info for the associated backing store (if any) is hidden - * inside the backing_store_info struct. - */ - -struct jvirt_sarray_control { - JSAMPARRAY mem_buffer; /* => the in-memory buffer */ - JDIMENSION rows_in_array; /* total virtual array height */ - JDIMENSION samplesperrow; /* width of array (and of memory buffer) */ - JDIMENSION maxaccess; /* max rows accessed by access_virt_sarray */ - JDIMENSION rows_in_mem; /* height of memory buffer */ - JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ - JDIMENSION cur_start_row; /* first logical row # in the buffer */ - JDIMENSION first_undef_row; /* row # of first uninitialized row */ - boolean pre_zero; /* pre-zero mode requested? */ - boolean dirty; /* do current buffer contents need written? */ - boolean b_s_open; /* is backing-store data valid? */ - jvirt_sarray_ptr next; /* link to next virtual sarray control block */ - backing_store_info b_s_info; /* System-dependent control info */ -}; - -struct jvirt_barray_control { - JBLOCKARRAY mem_buffer; /* => the in-memory buffer */ - JDIMENSION rows_in_array; /* total virtual array height */ - JDIMENSION blocksperrow; /* width of array (and of memory buffer) */ - JDIMENSION maxaccess; /* max rows accessed by access_virt_barray */ - JDIMENSION rows_in_mem; /* height of memory buffer */ - JDIMENSION rowsperchunk; /* allocation chunk size in mem_buffer */ - JDIMENSION cur_start_row; /* first logical row # in the buffer */ - JDIMENSION first_undef_row; /* row # of first uninitialized row */ - boolean pre_zero; /* pre-zero mode requested? */ - boolean dirty; /* do current buffer contents need written? */ - boolean b_s_open; /* is backing-store data valid? */ - jvirt_barray_ptr next; /* link to next virtual barray control block */ - backing_store_info b_s_info; /* System-dependent control info */ -}; - - -#ifdef MEM_STATS /* optional extra stuff for statistics */ - -LOCAL(void) -print_mem_stats (j_common_ptr cinfo, int pool_id) -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - small_pool_ptr shdr_ptr; - large_pool_ptr lhdr_ptr; - - /* Since this is only a debugging stub, we can cheat a little by using - * fprintf directly rather than going through the trace message code. - * This is helpful because message parm array can't handle longs. - */ - fprintf(stderr, "Freeing pool %d, total space = %ld\n", - pool_id, mem->total_space_allocated); - - for (lhdr_ptr = mem->large_list[pool_id]; lhdr_ptr != NULL; - lhdr_ptr = lhdr_ptr->hdr.next) { - fprintf(stderr, " Large chunk used %ld\n", - (long) lhdr_ptr->hdr.bytes_used); - } - - for (shdr_ptr = mem->small_list[pool_id]; shdr_ptr != NULL; - shdr_ptr = shdr_ptr->hdr.next) { - fprintf(stderr, " Small chunk used %ld free %ld\n", - (long) shdr_ptr->hdr.bytes_used, - (long) shdr_ptr->hdr.bytes_left); - } -} - -#endif /* MEM_STATS */ - - -LOCAL(void) -out_of_memory (j_common_ptr cinfo, int which) -/* Report an out-of-memory error and stop execution */ -/* If we compiled MEM_STATS support, report alloc requests before dying */ -{ -#ifdef MEM_STATS - cinfo->err->trace_level = 2; /* force self_destruct to report stats */ -#endif - ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, which); -} - - -/* - * Allocation of "small" objects. - * - * For these, we use pooled storage. When a new pool must be created, - * we try to get enough space for the current request plus a "slop" factor, - * where the slop will be the amount of leftover space in the new pool. - * The speed vs. space tradeoff is largely determined by the slop values. - * A different slop value is provided for each pool class (lifetime), - * and we also distinguish the first pool of a class from later ones. - * NOTE: the values given work fairly well on both 16- and 32-bit-int - * machines, but may be too small if longs are 64 bits or more. - */ - -static const size_t first_pool_slop[JPOOL_NUMPOOLS] = -{ - 1600, /* first PERMANENT pool */ - 16000 /* first IMAGE pool */ -}; - -static const size_t extra_pool_slop[JPOOL_NUMPOOLS] = -{ - 0, /* additional PERMANENT pools */ - 5000 /* additional IMAGE pools */ -}; - -#define MIN_SLOP 50 /* greater than 0 to avoid futile looping */ - - -METHODDEF(void *) -alloc_small (j_common_ptr cinfo, int pool_id, size_t sizeofobject) -/* Allocate a "small" object */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - small_pool_ptr hdr_ptr, prev_hdr_ptr; - char * data_ptr; - size_t odd_bytes, min_request, slop; - - /* Check for unsatisfiable request (do now to ensure no overflow below) */ - if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(small_pool_hdr))) - out_of_memory(cinfo, 1); /* request exceeds malloc's ability */ - - /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ - odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); - if (odd_bytes > 0) - sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; - - /* See if space is available in any existing pool */ - if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) - ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ - prev_hdr_ptr = NULL; - hdr_ptr = mem->small_list[pool_id]; - while (hdr_ptr != NULL) { - if (hdr_ptr->hdr.bytes_left >= sizeofobject) - break; /* found pool with enough space */ - prev_hdr_ptr = hdr_ptr; - hdr_ptr = hdr_ptr->hdr.next; - } - - /* Time to make a new pool? */ - if (hdr_ptr == NULL) { - /* min_request is what we need now, slop is what will be leftover */ - min_request = sizeofobject + SIZEOF(small_pool_hdr); - if (prev_hdr_ptr == NULL) /* first pool in class? */ - slop = first_pool_slop[pool_id]; - else - slop = extra_pool_slop[pool_id]; - /* Don't ask for more than MAX_ALLOC_CHUNK */ - if (slop > (size_t) (MAX_ALLOC_CHUNK-min_request)) - slop = (size_t) (MAX_ALLOC_CHUNK-min_request); - /* Try to get space, if fail reduce slop and try again */ - for (;;) { - hdr_ptr = (small_pool_ptr) jpeg_get_small(cinfo, min_request + slop); - if (hdr_ptr != NULL) - break; - slop /= 2; - if (slop < MIN_SLOP) /* give up when it gets real small */ - out_of_memory(cinfo, 2); /* jpeg_get_small failed */ - } - mem->total_space_allocated += min_request + slop; - /* Success, initialize the new pool header and add to end of list */ - hdr_ptr->hdr.next = NULL; - hdr_ptr->hdr.bytes_used = 0; - hdr_ptr->hdr.bytes_left = sizeofobject + slop; - if (prev_hdr_ptr == NULL) /* first pool in class? */ - mem->small_list[pool_id] = hdr_ptr; - else - prev_hdr_ptr->hdr.next = hdr_ptr; - } - - /* OK, allocate the object from the current pool */ - data_ptr = (char *) (hdr_ptr + 1); /* point to first data byte in pool */ - data_ptr += hdr_ptr->hdr.bytes_used; /* point to place for object */ - hdr_ptr->hdr.bytes_used += sizeofobject; - hdr_ptr->hdr.bytes_left -= sizeofobject; - - return (void *) data_ptr; -} - - -/* - * Allocation of "large" objects. - * - * The external semantics of these are the same as "small" objects, - * except that FAR pointers are used on 80x86. However the pool - * management heuristics are quite different. We assume that each - * request is large enough that it may as well be passed directly to - * jpeg_get_large; the pool management just links everything together - * so that we can free it all on demand. - * Note: the major use of "large" objects is in JSAMPARRAY and JBLOCKARRAY - * structures. The routines that create these structures (see below) - * deliberately bunch rows together to ensure a large request size. - */ - -METHODDEF(void FAR *) -alloc_large (j_common_ptr cinfo, int pool_id, size_t sizeofobject) -/* Allocate a "large" object */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - large_pool_ptr hdr_ptr; - size_t odd_bytes; - - /* Check for unsatisfiable request (do now to ensure no overflow below) */ - if (sizeofobject > (size_t) (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr))) - out_of_memory(cinfo, 3); /* request exceeds malloc's ability */ - - /* Round up the requested size to a multiple of SIZEOF(ALIGN_TYPE) */ - odd_bytes = sizeofobject % SIZEOF(ALIGN_TYPE); - if (odd_bytes > 0) - sizeofobject += SIZEOF(ALIGN_TYPE) - odd_bytes; - - /* Always make a new pool */ - if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) - ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ - - hdr_ptr = (large_pool_ptr) jpeg_get_large(cinfo, sizeofobject + - SIZEOF(large_pool_hdr)); - if (hdr_ptr == NULL) - out_of_memory(cinfo, 4); /* jpeg_get_large failed */ - mem->total_space_allocated += sizeofobject + SIZEOF(large_pool_hdr); - - /* Success, initialize the new pool header and add to list */ - hdr_ptr->hdr.next = mem->large_list[pool_id]; - /* We maintain space counts in each pool header for statistical purposes, - * even though they are not needed for allocation. - */ - hdr_ptr->hdr.bytes_used = sizeofobject; - hdr_ptr->hdr.bytes_left = 0; - mem->large_list[pool_id] = hdr_ptr; - - return (void FAR *) (hdr_ptr + 1); /* point to first data byte in pool */ -} - - -/* - * Creation of 2-D sample arrays. - * The pointers are in near heap, the samples themselves in FAR heap. - * - * To minimize allocation overhead and to allow I/O of large contiguous - * blocks, we allocate the sample rows in groups of as many rows as possible - * without exceeding MAX_ALLOC_CHUNK total bytes per allocation request. - * NB: the virtual array control routines, later in this file, know about - * this chunking of rows. The rowsperchunk value is left in the mem manager - * object so that it can be saved away if this sarray is the workspace for - * a virtual array. - */ - -METHODDEF(JSAMPARRAY) -alloc_sarray (j_common_ptr cinfo, int pool_id, - JDIMENSION samplesperrow, JDIMENSION numrows) -/* Allocate a 2-D sample array */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - JSAMPARRAY result; - JSAMPROW workspace; - JDIMENSION rowsperchunk, currow, i; - long ltemp; - - /* Calculate max # of rows allowed in one allocation chunk */ - ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / - ((long) samplesperrow * SIZEOF(JSAMPLE)); - if (ltemp <= 0) - ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); - if (ltemp < (long) numrows) - rowsperchunk = (JDIMENSION) ltemp; - else - rowsperchunk = numrows; - mem->last_rowsperchunk = rowsperchunk; - - /* Get space for row pointers (small object) */ - result = (JSAMPARRAY) alloc_small(cinfo, pool_id, - (size_t) (numrows * SIZEOF(JSAMPROW))); - - /* Get the rows themselves (large objects) */ - currow = 0; - while (currow < numrows) { - rowsperchunk = MIN(rowsperchunk, numrows - currow); - workspace = (JSAMPROW) alloc_large(cinfo, pool_id, - (size_t) ((size_t) rowsperchunk * (size_t) samplesperrow - * SIZEOF(JSAMPLE))); - for (i = rowsperchunk; i > 0; i--) { - result[currow++] = workspace; - workspace += samplesperrow; - } - } - - return result; -} - - -/* - * Creation of 2-D coefficient-block arrays. - * This is essentially the same as the code for sample arrays, above. - */ - -METHODDEF(JBLOCKARRAY) -alloc_barray (j_common_ptr cinfo, int pool_id, - JDIMENSION blocksperrow, JDIMENSION numrows) -/* Allocate a 2-D coefficient-block array */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - JBLOCKARRAY result; - JBLOCKROW workspace; - JDIMENSION rowsperchunk, currow, i; - long ltemp; - - /* Calculate max # of rows allowed in one allocation chunk */ - ltemp = (MAX_ALLOC_CHUNK-SIZEOF(large_pool_hdr)) / - ((long) blocksperrow * SIZEOF(JBLOCK)); - if (ltemp <= 0) - ERREXIT(cinfo, JERR_WIDTH_OVERFLOW); - if (ltemp < (long) numrows) - rowsperchunk = (JDIMENSION) ltemp; - else - rowsperchunk = numrows; - mem->last_rowsperchunk = rowsperchunk; - - /* Get space for row pointers (small object) */ - result = (JBLOCKARRAY) alloc_small(cinfo, pool_id, - (size_t) (numrows * SIZEOF(JBLOCKROW))); - - /* Get the rows themselves (large objects) */ - currow = 0; - while (currow < numrows) { - rowsperchunk = MIN(rowsperchunk, numrows - currow); - workspace = (JBLOCKROW) alloc_large(cinfo, pool_id, - (size_t) ((size_t) rowsperchunk * (size_t) blocksperrow - * SIZEOF(JBLOCK))); - for (i = rowsperchunk; i > 0; i--) { - result[currow++] = workspace; - workspace += blocksperrow; - } - } - - return result; -} - - -/* - * About virtual array management: - * - * The above "normal" array routines are only used to allocate strip buffers - * (as wide as the image, but just a few rows high). Full-image-sized buffers - * are handled as "virtual" arrays. The array is still accessed a strip at a - * time, but the memory manager must save the whole array for repeated - * accesses. The intended implementation is that there is a strip buffer in - * memory (as high as is possible given the desired memory limit), plus a - * backing file that holds the rest of the array. - * - * The request_virt_array routines are told the total size of the image and - * the maximum number of rows that will be accessed at once. The in-memory - * buffer must be at least as large as the maxaccess value. - * - * The request routines create control blocks but not the in-memory buffers. - * That is postponed until realize_virt_arrays is called. At that time the - * total amount of space needed is known (approximately, anyway), so free - * memory can be divided up fairly. - * - * The access_virt_array routines are responsible for making a specific strip - * area accessible (after reading or writing the backing file, if necessary). - * Note that the access routines are told whether the caller intends to modify - * the accessed strip; during a read-only pass this saves having to rewrite - * data to disk. The access routines are also responsible for pre-zeroing - * any newly accessed rows, if pre-zeroing was requested. - * - * In current usage, the access requests are usually for nonoverlapping - * strips; that is, successive access start_row numbers differ by exactly - * num_rows = maxaccess. This means we can get good performance with simple - * buffer dump/reload logic, by making the in-memory buffer be a multiple - * of the access height; then there will never be accesses across bufferload - * boundaries. The code will still work with overlapping access requests, - * but it doesn't handle bufferload overlaps very efficiently. - */ - - -METHODDEF(jvirt_sarray_ptr) -request_virt_sarray (j_common_ptr cinfo, int pool_id, boolean pre_zero, - JDIMENSION samplesperrow, JDIMENSION numrows, - JDIMENSION maxaccess) -/* Request a virtual 2-D sample array */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - jvirt_sarray_ptr result; - - /* Only IMAGE-lifetime virtual arrays are currently supported */ - if (pool_id != JPOOL_IMAGE) - ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ - - /* get control block */ - result = (jvirt_sarray_ptr) alloc_small(cinfo, pool_id, - SIZEOF(struct jvirt_sarray_control)); - - result->mem_buffer = NULL; /* marks array not yet realized */ - result->rows_in_array = numrows; - result->samplesperrow = samplesperrow; - result->maxaccess = maxaccess; - result->pre_zero = pre_zero; - result->b_s_open = FALSE; /* no associated backing-store object */ - result->next = mem->virt_sarray_list; /* add to list of virtual arrays */ - mem->virt_sarray_list = result; - - return result; -} - - -METHODDEF(jvirt_barray_ptr) -request_virt_barray (j_common_ptr cinfo, int pool_id, boolean pre_zero, - JDIMENSION blocksperrow, JDIMENSION numrows, - JDIMENSION maxaccess) -/* Request a virtual 2-D coefficient-block array */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - jvirt_barray_ptr result; - - /* Only IMAGE-lifetime virtual arrays are currently supported */ - if (pool_id != JPOOL_IMAGE) - ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ - - /* get control block */ - result = (jvirt_barray_ptr) alloc_small(cinfo, pool_id, - SIZEOF(struct jvirt_barray_control)); - - result->mem_buffer = NULL; /* marks array not yet realized */ - result->rows_in_array = numrows; - result->blocksperrow = blocksperrow; - result->maxaccess = maxaccess; - result->pre_zero = pre_zero; - result->b_s_open = FALSE; /* no associated backing-store object */ - result->next = mem->virt_barray_list; /* add to list of virtual arrays */ - mem->virt_barray_list = result; - - return result; -} - - -METHODDEF(void) -realize_virt_arrays (j_common_ptr cinfo) -/* Allocate the in-memory buffers for any unrealized virtual arrays */ -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - long space_per_minheight, maximum_space, avail_mem; - long minheights, max_minheights; - jvirt_sarray_ptr sptr; - jvirt_barray_ptr bptr; - - /* Compute the minimum space needed (maxaccess rows in each buffer) - * and the maximum space needed (full image height in each buffer). - * These may be of use to the system-dependent jpeg_mem_available routine. - */ - space_per_minheight = 0; - maximum_space = 0; - for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { - if (sptr->mem_buffer == NULL) { /* if not realized yet */ - space_per_minheight += (long) sptr->maxaccess * - (long) sptr->samplesperrow * SIZEOF(JSAMPLE); - maximum_space += (long) sptr->rows_in_array * - (long) sptr->samplesperrow * SIZEOF(JSAMPLE); - } - } - for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { - if (bptr->mem_buffer == NULL) { /* if not realized yet */ - space_per_minheight += (long) bptr->maxaccess * - (long) bptr->blocksperrow * SIZEOF(JBLOCK); - maximum_space += (long) bptr->rows_in_array * - (long) bptr->blocksperrow * SIZEOF(JBLOCK); - } - } - - if (space_per_minheight <= 0) - return; /* no unrealized arrays, no work */ - - /* Determine amount of memory to actually use; this is system-dependent. */ - avail_mem = jpeg_mem_available(cinfo, space_per_minheight, maximum_space, - mem->total_space_allocated); - - /* If the maximum space needed is available, make all the buffers full - * height; otherwise parcel it out with the same number of minheights - * in each buffer. - */ - if (avail_mem >= maximum_space) - max_minheights = 1000000000L; - else { - max_minheights = avail_mem / space_per_minheight; - /* If there doesn't seem to be enough space, try to get the minimum - * anyway. This allows a "stub" implementation of jpeg_mem_available(). - */ - if (max_minheights <= 0) - max_minheights = 1; - } - - /* Allocate the in-memory buffers and initialize backing store as needed. */ - - for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { - if (sptr->mem_buffer == NULL) { /* if not realized yet */ - minheights = ((long) sptr->rows_in_array - 1L) / sptr->maxaccess + 1L; - if (minheights <= max_minheights) { - /* This buffer fits in memory */ - sptr->rows_in_mem = sptr->rows_in_array; - } else { - /* It doesn't fit in memory, create backing store. */ - sptr->rows_in_mem = (JDIMENSION) (max_minheights * sptr->maxaccess); - jpeg_open_backing_store(cinfo, & sptr->b_s_info, - (long) sptr->rows_in_array * - (long) sptr->samplesperrow * - (long) SIZEOF(JSAMPLE)); - sptr->b_s_open = TRUE; - } - sptr->mem_buffer = alloc_sarray(cinfo, JPOOL_IMAGE, - sptr->samplesperrow, sptr->rows_in_mem); - sptr->rowsperchunk = mem->last_rowsperchunk; - sptr->cur_start_row = 0; - sptr->first_undef_row = 0; - sptr->dirty = FALSE; - } - } - - for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { - if (bptr->mem_buffer == NULL) { /* if not realized yet */ - minheights = ((long) bptr->rows_in_array - 1L) / bptr->maxaccess + 1L; - if (minheights <= max_minheights) { - /* This buffer fits in memory */ - bptr->rows_in_mem = bptr->rows_in_array; - } else { - /* It doesn't fit in memory, create backing store. */ - bptr->rows_in_mem = (JDIMENSION) (max_minheights * bptr->maxaccess); - jpeg_open_backing_store(cinfo, & bptr->b_s_info, - (long) bptr->rows_in_array * - (long) bptr->blocksperrow * - (long) SIZEOF(JBLOCK)); - bptr->b_s_open = TRUE; - } - bptr->mem_buffer = alloc_barray(cinfo, JPOOL_IMAGE, - bptr->blocksperrow, bptr->rows_in_mem); - bptr->rowsperchunk = mem->last_rowsperchunk; - bptr->cur_start_row = 0; - bptr->first_undef_row = 0; - bptr->dirty = FALSE; - } - } -} - - -LOCAL(void) -do_sarray_io (j_common_ptr cinfo, jvirt_sarray_ptr ptr, boolean writing) -/* Do backing store read or write of a virtual sample array */ -{ - long bytesperrow, file_offset, byte_count, rows, thisrow, i; - - bytesperrow = (long) ptr->samplesperrow * SIZEOF(JSAMPLE); - file_offset = ptr->cur_start_row * bytesperrow; - /* Loop to read or write each allocation chunk in mem_buffer */ - for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { - /* One chunk, but check for short chunk at end of buffer */ - rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); - /* Transfer no more than is currently defined */ - thisrow = (long) ptr->cur_start_row + i; - rows = MIN(rows, (long) ptr->first_undef_row - thisrow); - /* Transfer no more than fits in file */ - rows = MIN(rows, (long) ptr->rows_in_array - thisrow); - if (rows <= 0) /* this chunk might be past end of file! */ - break; - byte_count = rows * bytesperrow; - if (writing) - (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, - (void FAR *) ptr->mem_buffer[i], - file_offset, byte_count); - else - (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, - (void FAR *) ptr->mem_buffer[i], - file_offset, byte_count); - file_offset += byte_count; - } -} - - -LOCAL(void) -do_barray_io (j_common_ptr cinfo, jvirt_barray_ptr ptr, boolean writing) -/* Do backing store read or write of a virtual coefficient-block array */ -{ - long bytesperrow, file_offset, byte_count, rows, thisrow, i; - - bytesperrow = (long) ptr->blocksperrow * SIZEOF(JBLOCK); - file_offset = ptr->cur_start_row * bytesperrow; - /* Loop to read or write each allocation chunk in mem_buffer */ - for (i = 0; i < (long) ptr->rows_in_mem; i += ptr->rowsperchunk) { - /* One chunk, but check for short chunk at end of buffer */ - rows = MIN((long) ptr->rowsperchunk, (long) ptr->rows_in_mem - i); - /* Transfer no more than is currently defined */ - thisrow = (long) ptr->cur_start_row + i; - rows = MIN(rows, (long) ptr->first_undef_row - thisrow); - /* Transfer no more than fits in file */ - rows = MIN(rows, (long) ptr->rows_in_array - thisrow); - if (rows <= 0) /* this chunk might be past end of file! */ - break; - byte_count = rows * bytesperrow; - if (writing) - (*ptr->b_s_info.write_backing_store) (cinfo, & ptr->b_s_info, - (void FAR *) ptr->mem_buffer[i], - file_offset, byte_count); - else - (*ptr->b_s_info.read_backing_store) (cinfo, & ptr->b_s_info, - (void FAR *) ptr->mem_buffer[i], - file_offset, byte_count); - file_offset += byte_count; - } -} - - -METHODDEF(JSAMPARRAY) -access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr, - JDIMENSION start_row, JDIMENSION num_rows, - boolean writable) -/* Access the part of a virtual sample array starting at start_row */ -/* and extending for num_rows rows. writable is true if */ -/* caller intends to modify the accessed area. */ -{ - JDIMENSION end_row = start_row + num_rows; - JDIMENSION undef_row; - - /* debugging check */ - if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || - ptr->mem_buffer == NULL) - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - - /* Make the desired part of the virtual array accessible */ - if (start_row < ptr->cur_start_row || - end_row > ptr->cur_start_row+ptr->rows_in_mem) { - if (! ptr->b_s_open) - ERREXIT(cinfo, JERR_VIRTUAL_BUG); - /* Flush old buffer contents if necessary */ - if (ptr->dirty) { - do_sarray_io(cinfo, ptr, TRUE); - ptr->dirty = FALSE; - } - /* Decide what part of virtual array to access. - * Algorithm: if target address > current window, assume forward scan, - * load starting at target address. If target address < current window, - * assume backward scan, load so that target area is top of window. - * Note that when switching from forward write to forward read, will have - * start_row = 0, so the limiting case applies and we load from 0 anyway. - */ - if (start_row > ptr->cur_start_row) { - ptr->cur_start_row = start_row; - } else { - /* use long arithmetic here to avoid overflow & unsigned problems */ - long ltemp; - - ltemp = (long) end_row - (long) ptr->rows_in_mem; - if (ltemp < 0) - ltemp = 0; /* don't fall off front end of file */ - ptr->cur_start_row = (JDIMENSION) ltemp; - } - /* Read in the selected part of the array. - * During the initial write pass, we will do no actual read - * because the selected part is all undefined. - */ - do_sarray_io(cinfo, ptr, FALSE); - } - /* Ensure the accessed part of the array is defined; prezero if needed. - * To improve locality of access, we only prezero the part of the array - * that the caller is about to access, not the entire in-memory array. - */ - if (ptr->first_undef_row < end_row) { - if (ptr->first_undef_row < start_row) { - if (writable) /* writer skipped over a section of array */ - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - undef_row = start_row; /* but reader is allowed to read ahead */ - } else { - undef_row = ptr->first_undef_row; - } - if (writable) - ptr->first_undef_row = end_row; - if (ptr->pre_zero) { - size_t bytesperrow = (size_t) ptr->samplesperrow * SIZEOF(JSAMPLE); - undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ - end_row -= ptr->cur_start_row; - while (undef_row < end_row) { - jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); - undef_row++; - } - } else { - if (! writable) /* reader looking at undefined data */ - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - } - } - /* Flag the buffer dirty if caller will write in it */ - if (writable) - ptr->dirty = TRUE; - /* Return address of proper part of the buffer */ - return ptr->mem_buffer + (start_row - ptr->cur_start_row); -} - - -METHODDEF(JBLOCKARRAY) -access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr, - JDIMENSION start_row, JDIMENSION num_rows, - boolean writable) -/* Access the part of a virtual block array starting at start_row */ -/* and extending for num_rows rows. writable is true if */ -/* caller intends to modify the accessed area. */ -{ - JDIMENSION end_row = start_row + num_rows; - JDIMENSION undef_row; - - /* debugging check */ - if (end_row > ptr->rows_in_array || num_rows > ptr->maxaccess || - ptr->mem_buffer == NULL) - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - - /* Make the desired part of the virtual array accessible */ - if (start_row < ptr->cur_start_row || - end_row > ptr->cur_start_row+ptr->rows_in_mem) { - if (! ptr->b_s_open) - ERREXIT(cinfo, JERR_VIRTUAL_BUG); - /* Flush old buffer contents if necessary */ - if (ptr->dirty) { - do_barray_io(cinfo, ptr, TRUE); - ptr->dirty = FALSE; - } - /* Decide what part of virtual array to access. - * Algorithm: if target address > current window, assume forward scan, - * load starting at target address. If target address < current window, - * assume backward scan, load so that target area is top of window. - * Note that when switching from forward write to forward read, will have - * start_row = 0, so the limiting case applies and we load from 0 anyway. - */ - if (start_row > ptr->cur_start_row) { - ptr->cur_start_row = start_row; - } else { - /* use long arithmetic here to avoid overflow & unsigned problems */ - long ltemp; - - ltemp = (long) end_row - (long) ptr->rows_in_mem; - if (ltemp < 0) - ltemp = 0; /* don't fall off front end of file */ - ptr->cur_start_row = (JDIMENSION) ltemp; - } - /* Read in the selected part of the array. - * During the initial write pass, we will do no actual read - * because the selected part is all undefined. - */ - do_barray_io(cinfo, ptr, FALSE); - } - /* Ensure the accessed part of the array is defined; prezero if needed. - * To improve locality of access, we only prezero the part of the array - * that the caller is about to access, not the entire in-memory array. - */ - if (ptr->first_undef_row < end_row) { - if (ptr->first_undef_row < start_row) { - if (writable) /* writer skipped over a section of array */ - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - undef_row = start_row; /* but reader is allowed to read ahead */ - } else { - undef_row = ptr->first_undef_row; - } - if (writable) - ptr->first_undef_row = end_row; - if (ptr->pre_zero) { - size_t bytesperrow = (size_t) ptr->blocksperrow * SIZEOF(JBLOCK); - undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ - end_row -= ptr->cur_start_row; - while (undef_row < end_row) { - jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); - undef_row++; - } - } else { - if (! writable) /* reader looking at undefined data */ - ERREXIT(cinfo, JERR_BAD_VIRTUAL_ACCESS); - } - } - /* Flag the buffer dirty if caller will write in it */ - if (writable) - ptr->dirty = TRUE; - /* Return address of proper part of the buffer */ - return ptr->mem_buffer + (start_row - ptr->cur_start_row); -} - - -/* - * Release all objects belonging to a specified pool. - */ - -METHODDEF(void) -free_pool (j_common_ptr cinfo, int pool_id) -{ - my_mem_ptr mem = (my_mem_ptr) cinfo->mem; - small_pool_ptr shdr_ptr; - large_pool_ptr lhdr_ptr; - size_t space_freed; - - if (pool_id < 0 || pool_id >= JPOOL_NUMPOOLS) - ERREXIT1(cinfo, JERR_BAD_POOL_ID, pool_id); /* safety check */ - -#ifdef MEM_STATS - if (cinfo->err->trace_level > 1) - print_mem_stats(cinfo, pool_id); /* print pool's memory usage statistics */ -#endif - - /* If freeing IMAGE pool, close any virtual arrays first */ - if (pool_id == JPOOL_IMAGE) { - jvirt_sarray_ptr sptr; - jvirt_barray_ptr bptr; - - for (sptr = mem->virt_sarray_list; sptr != NULL; sptr = sptr->next) { - if (sptr->b_s_open) { /* there may be no backing store */ - sptr->b_s_open = FALSE; /* prevent recursive close if error */ - (*sptr->b_s_info.close_backing_store) (cinfo, & sptr->b_s_info); - } - } - mem->virt_sarray_list = NULL; - for (bptr = mem->virt_barray_list; bptr != NULL; bptr = bptr->next) { - if (bptr->b_s_open) { /* there may be no backing store */ - bptr->b_s_open = FALSE; /* prevent recursive close if error */ - (*bptr->b_s_info.close_backing_store) (cinfo, & bptr->b_s_info); - } - } - mem->virt_barray_list = NULL; - } - - /* Release large objects */ - lhdr_ptr = mem->large_list[pool_id]; - mem->large_list[pool_id] = NULL; - - while (lhdr_ptr != NULL) { - large_pool_ptr next_lhdr_ptr = lhdr_ptr->hdr.next; - space_freed = lhdr_ptr->hdr.bytes_used + - lhdr_ptr->hdr.bytes_left + - SIZEOF(large_pool_hdr); - jpeg_free_large(cinfo, (void FAR *) lhdr_ptr, space_freed); - mem->total_space_allocated -= space_freed; - lhdr_ptr = next_lhdr_ptr; - } - - /* Release small objects */ - shdr_ptr = mem->small_list[pool_id]; - mem->small_list[pool_id] = NULL; - - while (shdr_ptr != NULL) { - small_pool_ptr next_shdr_ptr = shdr_ptr->hdr.next; - space_freed = shdr_ptr->hdr.bytes_used + - shdr_ptr->hdr.bytes_left + - SIZEOF(small_pool_hdr); - jpeg_free_small(cinfo, (void *) shdr_ptr, space_freed); - mem->total_space_allocated -= space_freed; - shdr_ptr = next_shdr_ptr; - } -} - - -/* - * Close up shop entirely. - * Note that this cannot be called unless cinfo->mem is non-NULL. - */ - -METHODDEF(void) -self_destruct (j_common_ptr cinfo) -{ - int pool; - - /* Close all backing store, release all memory. - * Releasing pools in reverse order might help avoid fragmentation - * with some (brain-damaged) malloc libraries. - */ - for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { - free_pool(cinfo, pool); - } - - /* Release the memory manager control block too. */ - jpeg_free_small(cinfo, (void *) cinfo->mem, SIZEOF(my_memory_mgr)); - cinfo->mem = NULL; /* ensures I will be called only once */ - - jpeg_mem_term(cinfo); /* system-dependent cleanup */ -} - - -/* - * Memory manager initialization. - * When this is called, only the error manager pointer is valid in cinfo! - */ - -GLOBAL(void) -jinit_memory_mgr (j_common_ptr cinfo) -{ - my_mem_ptr mem; - long max_to_use; - int pool; - size_t test_mac; - - cinfo->mem = NULL; /* for safety if init fails */ - - /* Check for configuration errors. - * SIZEOF(ALIGN_TYPE) should be a power of 2; otherwise, it probably - * doesn't reflect any real hardware alignment requirement. - * The test is a little tricky: for X>0, X and X-1 have no one-bits - * in common if and only if X is a power of 2, ie has only one one-bit. - * Some compilers may give an "unreachable code" warning here; ignore it. - */ - if ((SIZEOF(ALIGN_TYPE) & (SIZEOF(ALIGN_TYPE)-1)) != 0) - ERREXIT(cinfo, JERR_BAD_ALIGN_TYPE); - /* MAX_ALLOC_CHUNK must be representable as type size_t, and must be - * a multiple of SIZEOF(ALIGN_TYPE). - * Again, an "unreachable code" warning may be ignored here. - * But a "constant too large" warning means you need to fix MAX_ALLOC_CHUNK. - */ - test_mac = (size_t) MAX_ALLOC_CHUNK; - if ((long) test_mac != MAX_ALLOC_CHUNK || - (MAX_ALLOC_CHUNK % SIZEOF(ALIGN_TYPE)) != 0) - ERREXIT(cinfo, JERR_BAD_ALLOC_CHUNK); - - max_to_use = jpeg_mem_init(cinfo); /* system-dependent initialization */ - - /* Attempt to allocate memory manager's control block */ - mem = (my_mem_ptr) jpeg_get_small(cinfo, SIZEOF(my_memory_mgr)); - - if (mem == NULL) { - jpeg_mem_term(cinfo); /* system-dependent cleanup */ - ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 0); - } - - /* OK, fill in the method pointers */ - mem->pub.alloc_small = alloc_small; - mem->pub.alloc_large = alloc_large; - mem->pub.alloc_sarray = alloc_sarray; - mem->pub.alloc_barray = alloc_barray; - mem->pub.request_virt_sarray = request_virt_sarray; - mem->pub.request_virt_barray = request_virt_barray; - mem->pub.realize_virt_arrays = realize_virt_arrays; - mem->pub.access_virt_sarray = access_virt_sarray; - mem->pub.access_virt_barray = access_virt_barray; - mem->pub.free_pool = free_pool; - mem->pub.self_destruct = self_destruct; - - /* Make MAX_ALLOC_CHUNK accessible to other modules */ - mem->pub.max_alloc_chunk = MAX_ALLOC_CHUNK; - - /* Initialize working state */ - mem->pub.max_memory_to_use = max_to_use; - - for (pool = JPOOL_NUMPOOLS-1; pool >= JPOOL_PERMANENT; pool--) { - mem->small_list[pool] = NULL; - mem->large_list[pool] = NULL; - } - mem->virt_sarray_list = NULL; - mem->virt_barray_list = NULL; - - mem->total_space_allocated = SIZEOF(my_memory_mgr); - - /* Declare ourselves open for business */ - cinfo->mem = & mem->pub; - - /* Check for an environment variable JPEGMEM; if found, override the - * default max_memory setting from jpeg_mem_init. Note that the - * surrounding application may again override this value. - * If your system doesn't support getenv(), define NO_GETENV to disable - * this feature. - */ -#ifndef NO_GETENV - { char * memenv; - - if ((memenv = getenv("JPEGMEM")) != NULL) { - char ch = 'x'; - - if (sscanf(memenv, "%ld%c", &max_to_use, &ch) > 0) { - if (ch == 'm' || ch == 'M') - max_to_use *= 1000L; - mem->pub.max_memory_to_use = max_to_use * 1000L; - } - } - } -#endif - -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemnobs.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemnobs.c deleted file mode 100755 index e74edbc..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemnobs.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * jmemnobs.c - * - * Copyright (C) 1992-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file provides a really simple implementation of the system- - * dependent portion of the JPEG memory manager. This implementation - * assumes that no backing-store files are needed: all required space - * can be obtained from malloc(). - * This is very portable in the sense that it'll compile on almost anything, - * but you'd better have lots of main memory (or virtual memory) if you want - * to process big images. - * Note that the max_memory_to_use option is ignored by this implementation. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" -#include "jmemsys.h" /* import the system-dependent declarations */ - -#ifndef HAVE_STDLIB_H /* should declare malloc(),free() */ -extern void * malloc JPP((size_t size)); -extern void free JPP((void *ptr)); -#endif - - -/* - * Memory allocation and freeing are controlled by the regular library - * routines malloc() and free(). - */ - -GLOBAL(void *) -jpeg_get_small (j_common_ptr , size_t sizeofobject) -{ - return (void *) malloc(sizeofobject); -} - -GLOBAL(void) -jpeg_free_small (j_common_ptr , void * object, size_t) -{ - free(object); -} - - -/* - * "Large" objects are treated the same as "small" ones. - * NB: although we include FAR keywords in the routine declarations, - * this file won't actually work in 80x86 small/medium model; at least, - * you probably won't be able to process useful-size images in only 64KB. - */ - -GLOBAL(void FAR *) -jpeg_get_large (j_common_ptr, size_t sizeofobject) -{ - return (void FAR *) malloc(sizeofobject); -} - -GLOBAL(void) -jpeg_free_large (j_common_ptr, void FAR * object, size_t) -{ - free(object); -} - - -/* - * This routine computes the total memory space available for allocation. - * Here we always say, "we got all you want bud!" - */ - -GLOBAL(long) -jpeg_mem_available (j_common_ptr, long, - long max_bytes_needed, long) -{ - return max_bytes_needed; -} - - -/* - * Backing store (temporary file) management. - * Since jpeg_mem_available always promised the moon, - * this should never be called and we can just error out. - */ - -GLOBAL(void) -jpeg_open_backing_store (j_common_ptr cinfo, struct backing_store_struct *, - long ) -{ - ERREXIT(cinfo, JERR_NO_BACKING_STORE); -} - - -/* - * These routines take care of any system-dependent initialization and - * cleanup required. Here, there isn't any. - */ - -GLOBAL(long) -jpeg_mem_init (j_common_ptr) -{ - return 0; /* just set max_memory_to_use to 0 */ -} - -GLOBAL(void) -jpeg_mem_term (j_common_ptr) -{ - /* no work */ -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemsys.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemsys.h deleted file mode 100755 index d834ea4..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmemsys.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - * jmemsys.h - * - * Copyright (C) 1992-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This include file defines the interface between the system-independent - * and system-dependent portions of the JPEG memory manager. No other - * modules need include it. (The system-independent portion is jmemmgr.c; - * there are several different versions of the system-dependent portion.) - * - * This file works as-is for the system-dependent memory managers supplied - * in the IJG distribution. You may need to modify it if you write a - * custom memory manager. If system-dependent changes are needed in - * this file, the best method is to #ifdef them based on a configuration - * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR - * and USE_MAC_MEMMGR. - */ - -#ifndef __jmemsys_h__ -#define __jmemsys_h__ - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_get_small jGetSmall -#define jpeg_free_small jFreeSmall -#define jpeg_get_large jGetLarge -#define jpeg_free_large jFreeLarge -#define jpeg_mem_available jMemAvail -#define jpeg_open_backing_store jOpenBackStore -#define jpeg_mem_init jMemInit -#define jpeg_mem_term jMemTerm -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* - * These two functions are used to allocate and release small chunks of - * memory. (Typically the total amount requested through jpeg_get_small is - * no more than 20K or so; this will be requested in chunks of a few K each.) - * Behavior should be the same as for the standard library functions malloc - * and free; in particular, jpeg_get_small must return NULL on failure. - * On most systems, these ARE malloc and free. jpeg_free_small is passed the - * size of the object being freed, just in case it's needed. - * On an 80x86 machine using small-data memory model, these manage near heap. - */ - -EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject)); -EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object, - size_t sizeofobject)); - -/* - * These two functions are used to allocate and release large chunks of - * memory (up to the total free space designated by jpeg_mem_available). - * The interface is the same as above, except that on an 80x86 machine, - * far pointers are used. On most other machines these are identical to - * the jpeg_get/free_small routines; but we keep them separate anyway, - * in case a different allocation strategy is desirable for large chunks. - */ - -EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo, - size_t sizeofobject)); -EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object, - size_t sizeofobject)); - -/* - * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may - * be requested in a single call to jpeg_get_large (and jpeg_get_small for that - * matter, but that case should never come into play). This macro is needed - * to model the 64Kb-segment-size limit of far addressing on 80x86 machines. - * On those machines, we expect that jconfig.h will provide a proper value. - * On machines with 32-bit flat address spaces, any large constant may be used. - * - * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type - * size_t and will be a multiple of sizeof(align_type). - */ - -#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */ -#define MAX_ALLOC_CHUNK 1000000000L -#endif - -/* - * This routine computes the total space still available for allocation by - * jpeg_get_large. If more space than this is needed, backing store will be - * used. NOTE: any memory already allocated must not be counted. - * - * There is a minimum space requirement, corresponding to the minimum - * feasible buffer sizes; jmemmgr.c will request that much space even if - * jpeg_mem_available returns zero. The maximum space needed, enough to hold - * all working storage in memory, is also passed in case it is useful. - * Finally, the total space already allocated is passed. If no better - * method is available, cinfo->mem->max_memory_to_use - already_allocated - * is often a suitable calculation. - * - * It is OK for jpeg_mem_available to underestimate the space available - * (that'll just lead to more backing-store access than is really necessary). - * However, an overestimate will lead to failure. Hence it's wise to subtract - * a slop factor from the true available space. 5% should be enough. - * - * On machines with lots of virtual memory, any large constant may be returned. - * Conversely, zero may be returned to always use the minimum amount of memory. - */ - -EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo, - long min_bytes_needed, - long max_bytes_needed, - long already_allocated)); - - -/* - * This structure holds whatever state is needed to access a single - * backing-store object. The read/write/close method pointers are called - * by jmemmgr.c to manipulate the backing-store object; all other fields - * are private to the system-dependent backing store routines. - */ - -#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */ - - -#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */ - -typedef unsigned short XMSH; /* type of extended-memory handles */ -typedef unsigned short EMSH; /* type of expanded-memory handles */ - -typedef union { - short file_handle; /* DOS file handle if it's a temp file */ - XMSH xms_handle; /* handle if it's a chunk of XMS */ - EMSH ems_handle; /* handle if it's a chunk of EMS */ -} handle_union; - -#endif /* USE_MSDOS_MEMMGR */ - -#ifdef USE_MAC_MEMMGR /* Mac-specific junk */ -#include -#endif /* USE_MAC_MEMMGR */ - - -//typedef struct backing_store_struct * backing_store_ptr; - -typedef struct backing_store_struct { - /* Methods for reading/writing/closing this backing-store object */ - JMETHOD(void, read_backing_store, (j_common_ptr cinfo, - struct backing_store_struct *info, - void FAR * buffer_address, - long file_offset, long byte_count)); - JMETHOD(void, write_backing_store, (j_common_ptr cinfo, - struct backing_store_struct *info, - void FAR * buffer_address, - long file_offset, long byte_count)); - JMETHOD(void, close_backing_store, (j_common_ptr cinfo, - struct backing_store_struct *info)); - - /* Private fields for system-dependent backing-store management */ -#ifdef USE_MSDOS_MEMMGR - /* For the MS-DOS manager (jmemdos.c), we need: */ - handle_union handle; /* reference to backing-store storage object */ - char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ -#else -#ifdef USE_MAC_MEMMGR - /* For the Mac manager (jmemmac.c), we need: */ - short temp_file; /* file reference number to temp file */ - FSSpec tempSpec; /* the FSSpec for the temp file */ - char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ -#else - /* For a typical implementation with temp files, we need: */ - FILE * temp_file; /* stdio reference to temp file */ - char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */ -#endif -#endif -} backing_store_info; - - -/* - * Initial opening of a backing-store object. This must fill in the - * read/write/close pointers in the object. The read/write routines - * may take an error exit if the specified maximum file size is exceeded. - * (If jpeg_mem_available always returns a large value, this routine can - * just take an error exit.) - */ - -EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo, - struct backing_store_struct *info, - long total_bytes_needed)); - - -/* - * These routines take care of any system-dependent initialization and - * cleanup required. jpeg_mem_init will be called before anything is - * allocated (and, therefore, nothing in cinfo is of use except the error - * manager pointer). It should return a suitable default value for - * max_memory_to_use; this may subsequently be overridden by the surrounding - * application. (Note that max_memory_to_use is only important if - * jpeg_mem_available chooses to consult it ... no one else will.) - * jpeg_mem_term may assume that all requested memory has been freed and that - * all opened backing-store objects have been closed. - */ - -EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo)); -EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo)); - - -#endif diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmorecfg.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmorecfg.h deleted file mode 100755 index c856e22..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jmorecfg.h +++ /dev/null @@ -1,363 +0,0 @@ -/* - * jmorecfg.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains additional configuration options that customize the - * JPEG software for special applications or support machine-dependent - * optimizations. Most users will not need to touch this file. - */ - - -/* - * Define BITS_IN_JSAMPLE as either - * 8 for 8-bit sample values (the usual setting) - * 12 for 12-bit sample values - * Only 8 and 12 are legal data precisions for lossy JPEG according to the - * JPEG standard, and the IJG code does not support anything else! - * We do not support run-time selection of data precision, sorry. - */ - -#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ - - -/* - * Maximum number of components (color channels) allowed in JPEG image. - * To meet the letter of the JPEG spec, set this to 255. However, darn - * few applications need more than 4 channels (maybe 5 for CMYK + alpha - * mask). We recommend 10 as a reasonable compromise; use 4 if you are - * really short on memory. (Each allowed component costs a hundred or so - * bytes of storage, whether actually used in an image or not.) - */ - -#define MAX_COMPONENTS 10 /* maximum number of image components */ - - -/* - * Basic data types. - * You may need to change these if you have a machine with unusual data - * type sizes; for example, "char" not 8 bits, "short" not 16 bits, - * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, - * but it had better be at least 16. - */ - -/* Representation of a single sample (pixel element value). - * We frequently allocate large arrays of these, so it's important to keep - * them small. But if you have memory to burn and access to char or short - * arrays is very slow on your hardware, you might want to change these. - */ - -#if BITS_IN_JSAMPLE == 8 -/* JSAMPLE should be the smallest type that will hold the values 0..255. - * You can use a signed char by having GETJSAMPLE mask it with 0xFF. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JSAMPLE; -#ifdef CHAR_IS_UNSIGNED -#define GETJSAMPLE(value) ((int) (value)) -#else -#define GETJSAMPLE(value) ((int) (value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - -#define MAXJSAMPLE 255 -#define CENTERJSAMPLE 128 - -#endif /* BITS_IN_JSAMPLE == 8 */ - - -#if BITS_IN_JSAMPLE == 12 -/* JSAMPLE should be the smallest type that will hold the values 0..4095. - * On nearly all machines "short" will do nicely. - */ - -typedef short JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#define MAXJSAMPLE 4095 -#define CENTERJSAMPLE 2048 - -#endif /* BITS_IN_JSAMPLE == 12 */ - - -/* Representation of a DCT frequency coefficient. - * This should be a signed value of at least 16 bits; "short" is usually OK. - * Again, we allocate large arrays of these, but you can change to int - * if you have memory to burn and "short" is really slow. - */ - -typedef short JCOEF; - - -/* Compressed datastreams are represented as arrays of JOCTET. - * These must be EXACTLY 8 bits wide, at least once they are written to - * external storage. Note that when using the stdio data source/destination - * managers, this is also the data type passed to fread/fwrite. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JOCTET; -#define GETJOCTET(value) (value) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JOCTET; -#ifdef CHAR_IS_UNSIGNED -#define GETJOCTET(value) (value) -#else -#define GETJOCTET(value) ((value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - - -/* These typedefs are used for various table entries and so forth. - * They must be at least as wide as specified; but making them too big - * won't cost a huge amount of memory, so we don't provide special - * extraction code like we did for JSAMPLE. (In other words, these - * typedefs live at a different point on the speed/space tradeoff curve.) - */ - -/* UINT8 must hold at least the values 0..255. */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char UINT8; -#else /* not HAVE_UNSIGNED_CHAR */ -#ifdef CHAR_IS_UNSIGNED -typedef char UINT8; -#else /* not CHAR_IS_UNSIGNED */ -typedef short UINT8; -#endif /* CHAR_IS_UNSIGNED */ -#endif /* HAVE_UNSIGNED_CHAR */ - -/* UINT16 must hold at least the values 0..65535. */ - -#ifdef HAVE_UNSIGNED_SHORT -typedef unsigned short UINT16; -#else /* not HAVE_UNSIGNED_SHORT */ -typedef unsigned int UINT16; -#endif /* HAVE_UNSIGNED_SHORT */ - -/* INT16 must hold at least the values -32768..32767. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ -typedef short INT16; -#endif - -/* INT32 must hold at least signed 32-bit values. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ -typedef long INT32; -#endif - -/* Datatype used for image dimensions. The JPEG standard only supports - * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore - * "unsigned int" is sufficient on all machines. However, if you need to - * handle larger images and you don't mind deviating from the spec, you - * can change this datatype. - */ - -typedef unsigned int JDIMENSION; - -#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ - - -/* These macros are used in all function definitions and extern declarations. - * You could modify them if you need to change function linkage conventions; - * in particular, you'll need to do that to make the library a Windows DLL. - * Another application is to make all functions global for use with debuggers - * or code profilers that require it. - */ - -/* a function called through method pointers: */ -#define METHODDEF(type) static type -/* a function used only in its module: */ -#define LOCAL(type) static type -/* a function referenced thru EXTERNs: */ -#define GLOBAL(type) type -/* a reference to a GLOBAL function: */ -#define EXTERN(type) extern type - - -/* This macro is used to declare a "method", that is, a function pointer. - * We want to supply prototype parameters if the compiler can cope. - * Note that the arglist parameter must be parenthesized! - * Again, you can customize this if you need special linkage keywords. - */ - -#ifdef HAVE_PROTOTYPES -#define JMETHOD(type,methodname,arglist) type (*methodname) arglist -#else -#define JMETHOD(type,methodname,arglist) type (*methodname) () -#endif - - -/* Here is the pseudo-keyword for declaring pointers that must be "far" - * on 80x86 machines. Most of the specialized coding for 80x86 is handled - * by just saying "FAR *" where such a pointer is needed. In a few places - * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. - */ - -#ifdef NEED_FAR_POINTERS -#define FAR far -#else -#define FAR -#endif - - -/* - * On a few systems, type boolean and/or its values FALSE, TRUE may appear - * in standard header files. Or you may have conflicts with application- - * specific header files that you want to include together with these files. - * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. - */ - -#ifndef HAVE_BOOLEAN -typedef int boolean; -#endif -#ifndef FALSE /* in case these macros already exist */ -#define FALSE 0 /* values of boolean */ -#endif -#ifndef TRUE -#define TRUE 1 -#endif - - -/* - * The remaining options affect code selection within the JPEG library, - * but they don't need to be visible to most applications using the library. - * To minimize application namespace pollution, the symbols won't be - * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. - */ - -#ifdef JPEG_INTERNALS -#define JPEG_INTERNAL_OPTIONS -#endif - -#ifdef JPEG_INTERNAL_OPTIONS - - -/* - * These defines indicate whether to include various optional functions. - * Undefining some of these symbols will produce a smaller but less capable - * library. Note that you can leave certain source files out of the - * compilation/linking process if you've #undef'd the corresponding symbols. - * (You may HAVE to do that if your compiler doesn't like null source files.) - */ - -/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ - -/* Capability options common to encoder and decoder: */ - -#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ -#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ -#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ - -/* Encoder capability options: */ - -#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ -/* Note: if you selected 12-bit data precision, it is dangerous to turn off - * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit - * precision, so jchuff.c normally uses entropy optimization to compute - * usable tables for higher precision. If you don't want to do optimization, - * you'll have to supply different default Huffman tables. - * The exact same statements apply for progressive JPEG: the default tables - * don't work for progressive mode. (This may get fixed, however.) - */ -#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ - -/* Decoder capability options: */ - -#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ -#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ -#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ -#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ -#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ -#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ -#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ - -/* more capability options later, no doubt */ - - -/* - * Ordering of RGB data in scanlines passed to or from the application. - * If your application wants to deal with data in the order B,G,R, just - * change these macros. You can also deal with formats such as R,G,B,X - * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing - * the offsets will also change the order in which colormap data is organized. - * RESTRICTIONS: - * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. - * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not - * useful if you are using JPEG color spaces other than YCbCr or grayscale. - * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE - * is not 3 (they don't understand about dummy color components!). So you - * can't use color quantization if you change that value. - */ - -#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ -#define RGB_GREEN 1 /* Offset of Green */ -#define RGB_BLUE 2 /* Offset of Blue */ -#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ - - -/* Definitions for speed-related optimizations. */ - - -/* If your compiler supports inline functions, define INLINE - * as the inline keyword; otherwise define it as empty. - */ - -#ifndef INLINE -#ifdef __GNUC__ /* for instance, GNU C knows about inline */ -#define INLINE __inline__ -#endif -#ifndef INLINE -#define INLINE /* default is to define it as empty */ -#endif -#endif - - -/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying - * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER - * as short on such a machine. MULTIPLIER must be at least 16 bits wide. - */ - -#ifndef MULTIPLIER -#define MULTIPLIER int /* type for fastest integer multiply */ -#endif - - -/* FAST_FLOAT should be either float or double, whichever is done faster - * by your compiler. (Note that this type is only used in the floating point - * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) - * Typically, float is faster in ANSI C compilers, while double is faster in - * pre-ANSI compilers (because they insist on converting to double anyway). - * The code below therefore chooses float if we have ANSI-style prototypes. - */ - -#ifndef FAST_FLOAT -#ifdef HAVE_PROTOTYPES -#define FAST_FLOAT float -#else -#define FAST_FLOAT double -#endif -#endif - -#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpegint.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpegint.h deleted file mode 100755 index 685a361..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpegint.h +++ /dev/null @@ -1,392 +0,0 @@ -/* - * jpegint.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file provides common declarations for the various JPEG modules. - * These declarations are considered internal to the JPEG library; most - * applications using the library shouldn't need to include this file. - */ - - -/* Declarations for both compression & decompression */ - -typedef enum { /* Operating modes for buffer controllers */ - JBUF_PASS_THRU, /* Plain stripwise operation */ - /* Remaining modes require a full-image buffer to have been created */ - JBUF_SAVE_SOURCE, /* Run source subobject only, save output */ - JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */ - JBUF_SAVE_AND_PASS /* Run both subobjects, save output */ -} J_BUF_MODE; - -/* Values of global_state field (jdapi.c has some dependencies on ordering!) */ -#define CSTATE_START 100 /* after create_compress */ -#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */ -#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */ -#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */ -#define DSTATE_START 200 /* after create_decompress */ -#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */ -#define DSTATE_READY 202 /* found SOS, ready for start_decompress */ -#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/ -#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */ -#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */ -#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */ -#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */ -#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */ -#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */ -#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */ - - -/* Declarations for compression modules */ - -/* Master control module */ -struct jpeg_comp_master { - JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo)); - JMETHOD(void, pass_startup, (j_compress_ptr cinfo)); - JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); - - /* State variables made visible to other modules */ - boolean call_pass_startup; /* True if pass_startup must be called */ - boolean is_last_pass; /* True during last pass */ -}; - -/* Main buffer control (downsampled-data buffer) */ -struct jpeg_c_main_controller { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, process_data, (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail)); -}; - -/* Compression preprocessing (downsampling input buffer control) */ -struct jpeg_c_prep_controller { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, pre_process_data, (j_compress_ptr cinfo, - JSAMPARRAY input_buf, - JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail, - JSAMPIMAGE output_buf, - JDIMENSION *out_row_group_ctr, - JDIMENSION out_row_groups_avail)); -}; - -/* Coefficient buffer control */ -struct jpeg_c_coef_controller { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(boolean, compress_data, (j_compress_ptr cinfo, - JSAMPIMAGE input_buf)); -}; - -/* Colorspace conversion */ -struct jpeg_color_converter { - JMETHOD(void, start_pass, (j_compress_ptr cinfo)); - JMETHOD(void, color_convert, (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows)); -}; - -/* Downsampling */ -struct jpeg_downsampler { - JMETHOD(void, start_pass, (j_compress_ptr cinfo)); - JMETHOD(void, downsample, (j_compress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_index, - JSAMPIMAGE output_buf, - JDIMENSION out_row_group_index)); - - boolean need_context_rows; /* TRUE if need rows above & below */ -}; - -/* Forward DCT (also controls coefficient quantization) */ -struct jpeg_forward_dct { - JMETHOD(void, start_pass, (j_compress_ptr cinfo)); - /* perhaps this should be an array??? */ - JMETHOD(void, forward_DCT, (j_compress_ptr cinfo, - jpeg_component_info * compptr, - JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks)); -}; - -/* Entropy encoding */ -struct jpeg_entropy_encoder { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics)); - JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data)); - JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); -}; - -/* Marker writing */ -struct jpeg_marker_writer { - JMETHOD(void, write_file_header, (j_compress_ptr cinfo)); - JMETHOD(void, write_frame_header, (j_compress_ptr cinfo)); - JMETHOD(void, write_scan_header, (j_compress_ptr cinfo)); - JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo)); - JMETHOD(void, write_tables_only, (j_compress_ptr cinfo)); - /* These routines are exported to allow insertion of extra markers */ - /* Probably only COM and APPn markers should be written this way */ - JMETHOD(void, write_marker_header, (j_compress_ptr cinfo, int marker, - unsigned int datalen)); - JMETHOD(void, write_marker_byte, (j_compress_ptr cinfo, int val)); -}; - - -/* Declarations for decompression modules */ - -/* Master control module */ -struct jpeg_decomp_master { - JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo)); - - /* State variables made visible to other modules */ - boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */ -}; - -/* Input control module */ -struct jpeg_input_controller { - JMETHOD(int, consume_input, (j_decompress_ptr cinfo)); - JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo)); - JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo)); - - /* State variables made visible to other modules */ - boolean has_multiple_scans; /* True if file has multiple scans */ - boolean eoi_reached; /* True when EOI has been consumed */ -}; - -/* Main buffer control (downsampled-data buffer) */ -struct jpeg_d_main_controller { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, process_data, (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -}; - -/* Coefficient buffer control */ -struct jpeg_d_coef_controller { - JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); - JMETHOD(int, consume_data, (j_decompress_ptr cinfo)); - JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo)); - JMETHOD(int, decompress_data, (j_decompress_ptr cinfo, - JSAMPIMAGE output_buf)); - /* Pointer to array of coefficient virtual arrays, or NULL if none */ - jvirt_barray_ptr *coef_arrays; -}; - -/* Decompression postprocessing (color quantization buffer control) */ -struct jpeg_d_post_controller { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, post_process_data, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, - JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -}; - -/* Marker reading & parsing */ -struct jpeg_marker_reader { - JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo)); - /* Read markers until SOS or EOI. - * Returns same codes as are defined for jpeg_consume_input: - * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. - */ - JMETHOD(int, read_markers, (j_decompress_ptr cinfo)); - /* Read a restart marker --- exported for use by entropy decoder only */ - jpeg_marker_parser_method read_restart_marker; - - /* State of marker reader --- nominally internal, but applications - * supplying COM or APPn handlers might like to know the state. - */ - boolean saw_SOI; /* found SOI? */ - boolean saw_SOF; /* found SOF? */ - int next_restart_num; /* next restart number expected (0-7) */ - unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */ -}; - -/* Entropy decoding */ -struct jpeg_entropy_decoder { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); - - /* This is here to share code between baseline and progressive decoders; */ - /* other modules probably should not use it */ - boolean insufficient_data; /* set TRUE after emitting warning */ -}; - -/* Inverse DCT (also performs dequantization) */ -typedef JMETHOD(void, inverse_DCT_method_ptr, - (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col)); - -struct jpeg_inverse_dct { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - /* It is useful to allow each component to have a separate IDCT method. */ - inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS]; -}; - -/* Upsampling (note that upsampler must also call color converter) */ -struct jpeg_upsampler { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, upsample, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, - JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); - - boolean need_context_rows; /* TRUE if need rows above & below */ -}; - -/* Colorspace conversion */ -struct jpeg_color_deconverter { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, color_convert, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows)); -}; - -/* Color quantization or color precision reduction */ -struct jpeg_color_quantizer { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan)); - JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPARRAY output_buf, - int num_rows)); - JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); -}; - - -/* Miscellaneous useful macros */ - -#undef MAX -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#undef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) - - -/* We assume that right shift corresponds to signed division by 2 with - * rounding towards minus infinity. This is correct for typical "arithmetic - * shift" instructions that shift in copies of the sign bit. But some - * C compilers implement >> with an unsigned shift. For these machines you - * must define RIGHT_SHIFT_IS_UNSIGNED. - * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. - * It is only applied with constant shift counts. SHIFT_TEMPS must be - * included in the variables of any routine using RIGHT_SHIFT. - */ - -#ifdef RIGHT_SHIFT_IS_UNSIGNED -#define SHIFT_TEMPS INT32 shift_temp; -#define RIGHT_SHIFT(x,shft) \ - ((shift_temp = (x)) < 0 ? \ - (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ - (shift_temp >> (shft))) -#else -#define SHIFT_TEMPS -#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) -#endif - - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jinit_compress_master jICompress -#define jinit_c_master_control jICMaster -#define jinit_c_main_controller jICMainC -#define jinit_c_prep_controller jICPrepC -#define jinit_c_coef_controller jICCoefC -#define jinit_color_converter jICColor -#define jinit_downsampler jIDownsampler -#define jinit_forward_dct jIFDCT -#define jinit_huff_encoder jIHEncoder -#define jinit_phuff_encoder jIPHEncoder -#define jinit_marker_writer jIMWriter -#define jinit_master_decompress jIDMaster -#define jinit_d_main_controller jIDMainC -#define jinit_d_coef_controller jIDCoefC -#define jinit_d_post_controller jIDPostC -#define jinit_input_controller jIInCtlr -#define jinit_marker_reader jIMReader -#define jinit_huff_decoder jIHDecoder -#define jinit_phuff_decoder jIPHDecoder -#define jinit_inverse_dct jIIDCT -#define jinit_upsampler jIUpsampler -#define jinit_color_deconverter jIDColor -#define jinit_1pass_quantizer jI1Quant -#define jinit_2pass_quantizer jI2Quant -#define jinit_merged_upsampler jIMUpsampler -#define jinit_memory_mgr jIMemMgr -#define jdiv_round_up jDivRound -#define jround_up jRound -#define jcopy_sample_rows jCopySamples -#define jcopy_block_row jCopyBlocks -#define jzero_far jZeroFar -#define jpeg_zigzag_order jZIGTable -#define jpeg_natural_order jZAGTable -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Compression module initialization routines */ -EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, - boolean transcode_only)); -EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); -/* Decompression module initialization routines */ -EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo)); -/* Memory manager initialization */ -EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); - -/* Utility routines in jutils.c */ -EXTERN(long) jdiv_round_up JPP((long a, long b)); -EXTERN(long) jround_up JPP((long a, long b)); -EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, - JSAMPARRAY output_array, int dest_row, - int num_rows, JDIMENSION num_cols)); -EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, - JDIMENSION num_blocks)); -EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); -/* Constant tables in jutils.c */ -#if 0 /* This table is not actually needed in v6a */ -extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ -#endif -extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ - -/* Suppress undefined-structure complaints if necessary. */ - -#ifdef INCOMPLETE_TYPES_BROKEN -#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */ -struct jvirt_sarray_control { long dummy; }; -struct jvirt_barray_control { long dummy; }; -#endif -#endif /* INCOMPLETE_TYPES_BROKEN */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpeglib.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpeglib.h deleted file mode 100755 index bf6ce08..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jpeglib.h +++ /dev/null @@ -1,1096 +0,0 @@ -/* - * jpeglib.h - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the application interface for the JPEG library. - * Most applications using the library need only include this file, - * and perhaps jerror.h if they want to know the exact error codes. - */ - -#ifndef JPEGLIB_H -#define JPEGLIB_H - -/* - * First we include the configuration files that record how this - * installation of the JPEG library is set up. jconfig.h can be - * generated automatically for many systems. jmorecfg.h contains - * manual configuration options that most people need not worry about. - */ - -#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ -#include "jconfig.h" /* widely used configuration options */ -#endif -#include "jmorecfg.h" /* seldom changed options */ - - -/* Version ID for the JPEG library. - * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60". - */ - -#define JPEG_LIB_VERSION 62 /* Version 6b */ - - -/* Various constants determining the sizes of things. - * All of these are specified by the JPEG standard, so don't change them - * if you want to be compatible. - */ - -#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ -#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ -#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ -#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ -#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ -#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ -#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ -/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; - * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. - * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU - * to handle it. We even let you do this from the jconfig.h file. However, - * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe - * sometimes emits noncompliant files doesn't mean you should too. - */ -#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ -#ifndef D_MAX_BLOCKS_IN_MCU -#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ -#endif - - -/* Data structures for images (arrays of samples and of DCT coefficients). - * On 80x86 machines, the image arrays are too big for near pointers, - * but the pointer arrays can fit in near memory. - */ - -typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ -typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ -typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ - -typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ -typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ -typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ -typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ - -typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ - - -/* Types for JPEG compression parameters and working tables. */ - - -/* DCT coefficient quantization tables. */ - -typedef struct { - /* This array gives the coefficient quantizers in natural array order - * (not the zigzag order in which they are stored in a JPEG DQT marker). - * CAUTION: IJG versions prior to v6a kept this array in zigzag order. - */ - UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JQUANT_TBL; - - -/* Huffman coding tables. */ - -typedef struct { - /* These two fields directly represent the contents of a JPEG DHT marker */ - UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ - /* length k bits; bits[0] is unused */ - UINT8 huffval[256]; /* The symbols, in order of incr code length */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JHUFF_TBL; - - -/* Basic info about one component (color channel). */ - -typedef struct { - /* These values are fixed over the whole image. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOF marker. */ - int component_id; /* identifier for this component (0..255) */ - int component_index; /* its index in SOF or cinfo->comp_info[] */ - int h_samp_factor; /* horizontal sampling factor (1..4) */ - int v_samp_factor; /* vertical sampling factor (1..4) */ - int quant_tbl_no; /* quantization table selector (0..3) */ - /* These values may vary between scans. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOS marker. */ - /* The decompressor output side may not use these variables. */ - int dc_tbl_no; /* DC entropy table selector (0..3) */ - int ac_tbl_no; /* AC entropy table selector (0..3) */ - - /* Remaining fields should be treated as private by applications. */ - - /* These values are computed during compression or decompression startup: */ - /* Component's size in DCT blocks. - * Any dummy blocks added to complete an MCU are not counted; therefore - * these values do not depend on whether a scan is interleaved or not. - */ - JDIMENSION width_in_blocks; - JDIMENSION height_in_blocks; - /* Size of a DCT block in samples. Always DCTSIZE for compression. - * For decompression this is the size of the output from one DCT block, - * reflecting any scaling we choose to apply during the IDCT step. - * Values of 1,2,4,8 are likely to be supported. Note that different - * components may receive different IDCT scalings. - */ - int DCT_scaled_size; - /* The downsampled dimensions are the component's actual, unpadded number - * of samples at the main buffer (preprocessing/compression interface), thus - * downsampled_width = ceil(image_width * Hi/Hmax) - * and similarly for height. For decompression, IDCT scaling is included, so - * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) - */ - JDIMENSION downsampled_width; /* actual width in samples */ - JDIMENSION downsampled_height; /* actual height in samples */ - /* This flag is used only for decompression. In cases where some of the - * components will be ignored (eg grayscale output from YCbCr image), - * we can skip most computations for the unused components. - */ - boolean component_needed; /* do we need the value of this component? */ - - /* These values are computed before starting a scan of the component. */ - /* The decompressor output side may not use these variables. */ - int MCU_width; /* number of blocks per MCU, horizontally */ - int MCU_height; /* number of blocks per MCU, vertically */ - int MCU_blocks; /* MCU_width * MCU_height */ - int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ - int last_col_width; /* # of non-dummy blocks across in last MCU */ - int last_row_height; /* # of non-dummy blocks down in last MCU */ - - /* Saved quantization table for component; NULL if none yet saved. - * See jdinput.c comments about the need for this information. - * This field is currently used only for decompression. - */ - JQUANT_TBL * quant_table; - - /* Private per-component storage for DCT or IDCT subsystem. */ - void * dct_table; -} jpeg_component_info; - - -/* The script for encoding a multiple-scan file is an array of these: */ - -typedef struct { - int comps_in_scan; /* number of components encoded in this scan */ - int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ - int Ss, Se; /* progressive JPEG spectral selection parms */ - int Ah, Al; /* progressive JPEG successive approx. parms */ -} jpeg_scan_info; - -/* The decompressor can save APPn and COM markers in a list of these: */ - -typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; - -struct jpeg_marker_struct { - jpeg_saved_marker_ptr next; /* next in list, or NULL */ - UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ - unsigned int original_length; /* # bytes of data in the file */ - unsigned int data_length; /* # bytes of data saved at data[] */ - JOCTET FAR * data; /* the data contained in the marker */ - /* the marker length word is not counted in data_length or original_length */ -}; - -/* Known color spaces. */ - -typedef enum { - JCS_UNKNOWN, /* error/unspecified */ - JCS_GRAYSCALE, /* monochrome */ - JCS_RGB, /* red/green/blue */ - JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ - JCS_CMYK, /* C/M/Y/K */ - JCS_YCCK /* Y/Cb/Cr/K */ -} J_COLOR_SPACE; - -/* DCT/IDCT algorithm options. */ - -typedef enum { - JDCT_ISLOW, /* slow but accurate integer algorithm */ - JDCT_IFAST, /* faster, less accurate integer method */ - JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ -} J_DCT_METHOD; - -#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ -#define JDCT_DEFAULT JDCT_ISLOW -#endif -#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ -#define JDCT_FASTEST JDCT_IFAST -#endif - -/* Dithering options for decompression. */ - -typedef enum { - JDITHER_NONE, /* no dithering */ - JDITHER_ORDERED, /* simple ordered dither */ - JDITHER_FS /* Floyd-Steinberg error diffusion dither */ -} J_DITHER_MODE; - - -/* Common fields between JPEG compression and decompression master structs. */ - -#define jpeg_common_fields \ - struct jpeg_error_mgr * err; /* Error handler module */\ - struct jpeg_memory_mgr * mem; /* Memory manager module */\ - struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ - void * client_data; /* Available for use by application */\ - boolean is_decompressor; /* So common code can tell which is which */\ - int global_state /* For checking call sequence validity */ - -/* Routines that are to be used by both halves of the library are declared - * to receive a pointer to this structure. There are no actual instances of - * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. - */ -struct jpeg_common_struct { - jpeg_common_fields; /* Fields common to both master struct types */ - /* Additional fields follow in an actual jpeg_compress_struct or - * jpeg_decompress_struct. All three structs must agree on these - * initial fields! (This would be a lot cleaner in C++.) - */ -}; - -typedef struct jpeg_common_struct * j_common_ptr; -typedef struct jpeg_compress_struct * j_compress_ptr; -typedef struct jpeg_decompress_struct * j_decompress_ptr; - - -/* Master record for a compression instance */ - -struct jpeg_compress_struct { - jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ - - /* Destination for compressed data */ - struct jpeg_destination_mgr * dest; - - /* Description of source image --- these fields must be filled in by - * outer application before starting compression. in_color_space must - * be correct before you can even call jpeg_set_defaults(). - */ - - JDIMENSION image_width; /* input image width */ - JDIMENSION image_height; /* input image height */ - int input_components; /* # of color components in input image */ - J_COLOR_SPACE in_color_space; /* colorspace of input image */ - - double input_gamma; /* image gamma of input image */ - - /* Compression parameters --- these fields must be set before calling - * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to - * initialize everything to reasonable defaults, then changing anything - * the application specifically wants to change. That way you won't get - * burnt when new parameters are added. Also note that there are several - * helper routines to simplify changing parameters. - */ - - int data_precision; /* bits of precision in image data */ - - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - int num_scans; /* # of entries in scan_info array */ - const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ - /* The default value of scan_info is NULL, which causes a single-scan - * sequential JPEG file to be emitted. To create a multi-scan file, - * set num_scans and scan_info to point to an array of scan definitions. - */ - - boolean raw_data_in; /* TRUE=caller supplies downsampled data */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - int smoothing_factor; /* 1..100, or 0 for no input smoothing */ - J_DCT_METHOD dct_method; /* DCT algorithm selector */ - - /* The restart interval can be specified in absolute MCUs by setting - * restart_interval, or in MCU rows by setting restart_in_rows - * (in which case the correct restart_interval will be figured - * for each scan). - */ - unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ - int restart_in_rows; /* if > 0, MCU rows per restart interval */ - - /* Parameters controlling emission of special markers. */ - - boolean write_JFIF_header; /* should a JFIF marker be written? */ - UINT8 JFIF_major_version; /* What to write for the JFIF version number */ - UINT8 JFIF_minor_version; - /* These three values are not used by the JPEG code, merely copied */ - /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ - /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ - /* ratio is defined by X_density/Y_density even when density_unit=0. */ - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean write_Adobe_marker; /* should an Adobe marker be written? */ - - /* State variable: index of next scanline to be written to - * jpeg_write_scanlines(). Application may use this to control its - * processing loop, e.g., "while (next_scanline < image_height)". - */ - - JDIMENSION next_scanline; /* 0 .. image_height-1 */ - - /* Remaining fields are known throughout compressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during compression startup - */ - boolean progressive_mode; /* TRUE if scan script uses progressive mode */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ - /* The coefficient controller receives data in units of MCU rows as defined - * for fully interleaved scans (whether the JPEG file is interleaved or not). - * There are v_samp_factor * DCTSIZE sample rows of each component in an - * "iMCU" (interleaved MCU) row. - */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[C_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - /* - * Links to compression subobjects (methods and private variables of modules) - */ - struct jpeg_comp_master * master; - struct jpeg_c_main_controller * main; - struct jpeg_c_prep_controller * prep; - struct jpeg_c_coef_controller * coef; - struct jpeg_marker_writer * marker; - struct jpeg_color_converter * cconvert; - struct jpeg_downsampler * downsample; - struct jpeg_forward_dct * fdct; - struct jpeg_entropy_encoder * entropy; - jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ - int script_space_size; -}; - - -/* Master record for a decompression instance */ - -struct jpeg_decompress_struct { - jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ - - /* Source of compressed data */ - struct jpeg_source_mgr * src; - - /* Basic description of image --- filled in by jpeg_read_header(). */ - /* Application may inspect these values to decide how to process image. */ - - JDIMENSION image_width; /* nominal image width (from SOF marker) */ - JDIMENSION image_height; /* nominal image height */ - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - /* Decompression processing parameters --- these fields must be set before - * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes - * them to default values. - */ - - J_COLOR_SPACE out_color_space; /* colorspace for output */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - double output_gamma; /* image gamma wanted in output */ - - boolean buffered_image; /* TRUE=multiple output passes */ - boolean raw_data_out; /* TRUE=downsampled data wanted */ - - J_DCT_METHOD dct_method; /* IDCT algorithm selector */ - boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ - boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ - - boolean quantize_colors; /* TRUE=colormapped output wanted */ - /* the following are ignored if not quantize_colors: */ - J_DITHER_MODE dither_mode; /* type of color dithering to use */ - boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ - int desired_number_of_colors; /* max # colors to use in created colormap */ - /* these are significant only in buffered-image mode: */ - boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ - boolean enable_external_quant;/* enable future use of external colormap */ - boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ - - /* Description of actual output image that will be returned to application. - * These fields are computed by jpeg_start_decompress(). - * You can also use jpeg_calc_output_dimensions() to determine these values - * in advance of calling jpeg_start_decompress(). - */ - - JDIMENSION output_width; /* scaled image width */ - JDIMENSION output_height; /* scaled image height */ - int out_color_components; /* # of color components in out_color_space */ - int output_components; /* # of color components returned */ - /* output_components is 1 (a colormap index) when quantizing colors; - * otherwise it equals out_color_components. - */ - int rec_outbuf_height; /* min recommended height of scanline buffer */ - /* If the buffer passed to jpeg_read_scanlines() is less than this many rows - * high, space and time will be wasted due to unnecessary data copying. - * Usually rec_outbuf_height will be 1 or 2, at most 4. - */ - - /* When quantizing colors, the output colormap is described by these fields. - * The application can supply a colormap by setting colormap non-NULL before - * calling jpeg_start_decompress; otherwise a colormap is created during - * jpeg_start_decompress or jpeg_start_output. - * The map has out_color_components rows and actual_number_of_colors columns. - */ - int actual_number_of_colors; /* number of entries in use */ - JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ - - /* State variables: these variables indicate the progress of decompression. - * The application may examine these but must not modify them. - */ - - /* Row index of next scanline to be read from jpeg_read_scanlines(). - * Application may use this to control its processing loop, e.g., - * "while (output_scanline < output_height)". - */ - JDIMENSION output_scanline; /* 0 .. output_height-1 */ - - /* Current input scan number and number of iMCU rows completed in scan. - * These indicate the progress of the decompressor input side. - */ - int input_scan_number; /* Number of SOS markers seen so far */ - JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ - - /* The "output scan number" is the notional scan being displayed by the - * output side. The decompressor will not allow output scan/row number - * to get ahead of input scan/row, but it can fall arbitrarily far behind. - */ - int output_scan_number; /* Nominal scan number being displayed */ - JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ - - /* Current progression status. coef_bits[c][i] indicates the precision - * with which component c's DCT coefficient i (in zigzag order) is known. - * It is -1 when no data has yet been received, otherwise it is the point - * transform (shift) value for the most recent scan of the coefficient - * (thus, 0 at completion of the progression). - * This pointer is NULL when reading a non-progressive file. - */ - int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ - - /* Internal JPEG parameters --- the application usually need not look at - * these fields. Note that the decompressor output side may not use - * any parameters that can change between scans. - */ - - /* Quantization and Huffman tables are carried forward across input - * datastreams when processing abbreviated JPEG datastreams. - */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - /* These parameters are never carried across datastreams, since they - * are given in SOF/SOS markers or defined to be reset by SOI. - */ - - int data_precision; /* bits of precision in image data */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ - - /* These fields record data obtained from optional markers recognized by - * the JPEG library. - */ - boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ - /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ - UINT8 JFIF_major_version; /* JFIF version number */ - UINT8 JFIF_minor_version; - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ - UINT8 Adobe_transform; /* Color transform code from Adobe marker */ - - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - - /* Aside from the specific data retained from APPn markers known to the - * library, the uninterpreted contents of any or all APPn and COM markers - * can be saved in a list for examination by the application. - */ - jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ - - /* Remaining fields are known throughout decompressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during decompression startup - */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ - /* The coefficient controller's input and output progress is measured in - * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows - * in fully interleaved JPEG scans, but are used whether the scan is - * interleaved or not. We define an iMCU row as v_samp_factor DCT block - * rows of each component. Therefore, the IDCT output contains - * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. - */ - - JSAMPLE * sample_range_limit; /* table for fast range-limiting */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - * Note that the decompressor output side must not use these fields. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[D_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - /* This field is shared between entropy decoder and marker parser. - * It is either zero or the code of a JPEG marker that has been - * read from the data source, but has not yet been processed. - */ - int unread_marker; - - /* - * Links to decompression subobjects (methods, private variables of modules) - */ - struct jpeg_decomp_master * master; - struct jpeg_d_main_controller * main; - struct jpeg_d_coef_controller * coef; - struct jpeg_d_post_controller * post; - struct jpeg_input_controller * inputctl; - struct jpeg_marker_reader * marker; - struct jpeg_entropy_decoder * entropy; - struct jpeg_inverse_dct * idct; - struct jpeg_upsampler * upsample; - struct jpeg_color_deconverter * cconvert; - struct jpeg_color_quantizer * cquantize; -}; - - -/* "Object" declarations for JPEG modules that may be supplied or called - * directly by the surrounding application. - * As with all objects in the JPEG library, these structs only define the - * publicly visible methods and state variables of a module. Additional - * private fields may exist after the public ones. - */ - - -/* Error handler object */ - -struct jpeg_error_mgr { - /* Error exit handler: does not return to caller */ - JMETHOD(void, error_exit, (j_common_ptr cinfo)); - /* Conditionally emit a trace or warning message */ - JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); - /* Routine that actually outputs a trace or error message */ - JMETHOD(void, output_message, (j_common_ptr cinfo)); - /* Format a message string for the most recent JPEG error or message */ - JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); -#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ - /* Reset error state variables at start of a new image */ - JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); - - /* The message ID code and any parameters are saved here. - * A message can have one string parameter or up to 8 int parameters. - */ - int msg_code; -#define JMSG_STR_PARM_MAX 80 - union { - int i[8]; - char s[JMSG_STR_PARM_MAX]; - } msg_parm; - - /* Standard state variables for error facility */ - - int trace_level; /* max msg_level that will be displayed */ - - /* For recoverable corrupt-data errors, we emit a warning message, - * but keep going unless emit_message chooses to abort. emit_message - * should count warnings in num_warnings. The surrounding application - * can check for bad data by seeing if num_warnings is nonzero at the - * end of processing. - */ - long num_warnings; /* number of corrupt-data warnings */ - - /* These fields point to the table(s) of error message strings. - * An application can change the table pointer to switch to a different - * message list (typically, to change the language in which errors are - * reported). Some applications may wish to add additional error codes - * that will be handled by the JPEG library error mechanism; the second - * table pointer is used for this purpose. - * - * First table includes all errors generated by JPEG library itself. - * Error code 0 is reserved for a "no such error string" message. - */ - const char * const * jpeg_message_table; /* Library errors */ - int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ - /* Second table can be added by application (see cjpeg/djpeg for example). - * It contains strings numbered first_addon_message..last_addon_message. - */ - const char * const * addon_message_table; /* Non-library errors */ - int first_addon_message; /* code for first string in addon table */ - int last_addon_message; /* code for last string in addon table */ -}; - - -/* Progress monitor object */ - -struct jpeg_progress_mgr { - JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); - - long pass_counter; /* work units completed in this pass */ - long pass_limit; /* total number of work units in this pass */ - int completed_passes; /* passes completed so far */ - int total_passes; /* total number of passes expected */ -}; - - -/* Data destination object for compression */ - -struct jpeg_destination_mgr { - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - - JMETHOD(void, init_destination, (j_compress_ptr cinfo)); - JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); - JMETHOD(void, term_destination, (j_compress_ptr cinfo)); -}; - - -/* Data source object for decompression */ - -struct jpeg_source_mgr { - const JOCTET * next_input_byte; /* => next byte to read from buffer */ - size_t bytes_in_buffer; /* # of bytes remaining in buffer */ - - JMETHOD(void, init_source, (j_decompress_ptr cinfo)); - JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); - JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); - JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); - JMETHOD(void, term_source, (j_decompress_ptr cinfo)); -}; - - -/* Memory manager object. - * Allocates "small" objects (a few K total), "large" objects (tens of K), - * and "really big" objects (virtual arrays with backing store if needed). - * The memory manager does not allow individual objects to be freed; rather, - * each created object is assigned to a pool, and whole pools can be freed - * at once. This is faster and more convenient than remembering exactly what - * to free, especially where malloc()/free() are not too speedy. - * NB: alloc routines never return NULL. They exit to error_exit if not - * successful. - */ - -#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ -#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ -#define JPOOL_NUMPOOLS 2 - -typedef struct jvirt_sarray_control * jvirt_sarray_ptr; -typedef struct jvirt_barray_control * jvirt_barray_ptr; - - -struct jpeg_memory_mgr { - /* Method pointers */ - JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, - JDIMENSION samplesperrow, - JDIMENSION numrows)); - JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, - JDIMENSION blocksperrow, - JDIMENSION numrows)); - JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION samplesperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION blocksperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); - JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, - jvirt_sarray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, - jvirt_barray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); - JMETHOD(void, self_destruct, (j_common_ptr cinfo)); - - /* Limit on memory allocation for this JPEG object. (Note that this is - * merely advisory, not a guaranteed maximum; it only affects the space - * used for virtual-array buffers.) May be changed by outer application - * after creating the JPEG object. - */ - long max_memory_to_use; - - /* Maximum allocation request accepted by alloc_large. */ - long max_alloc_chunk; -}; - - -/* Routine signature for application-supplied marker processing methods. - * Need not pass marker code since it is stored in cinfo->unread_marker. - */ -typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); - - -/* Declarations for routines called by application. - * The JPP macro hides prototype parameters from compilers that can't cope. - * Note JPP requires double parentheses. - */ - -#ifdef HAVE_PROTOTYPES -#define JPP(arglist) arglist -#else -#define JPP(arglist) () -#endif - - -/* Short forms of external names for systems with brain-damaged linkers. - * We shorten external names to be unique in the first six letters, which - * is good enough for all known systems. - * (If your compiler itself needs names to be unique in less than 15 - * characters, you are out of luck. Get a better compiler.) - */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_std_error jStdError -#define jpeg_CreateCompress jCreaCompress -#define jpeg_CreateDecompress jCreaDecompress -#define jpeg_destroy_compress jDestCompress -#define jpeg_destroy_decompress jDestDecompress -#define jpeg_stdio_dest jStdDest -#define jpeg_stdio_src jStdSrc -#define jpeg_set_defaults jSetDefaults -#define jpeg_set_colorspace jSetColorspace -#define jpeg_default_colorspace jDefColorspace -#define jpeg_set_quality jSetQuality -#define jpeg_set_linear_quality jSetLQuality -#define jpeg_add_quant_table jAddQuantTable -#define jpeg_quality_scaling jQualityScaling -#define jpeg_simple_progression jSimProgress -#define jpeg_suppress_tables jSuppressTables -#define jpeg_alloc_quant_table jAlcQTable -#define jpeg_alloc_huff_table jAlcHTable -#define jpeg_start_compress jStrtCompress -#define jpeg_write_scanlines jWrtScanlines -#define jpeg_finish_compress jFinCompress -#define jpeg_write_raw_data jWrtRawData -#define jpeg_write_marker jWrtMarker -#define jpeg_write_m_header jWrtMHeader -#define jpeg_write_m_byte jWrtMByte -#define jpeg_write_tables jWrtTables -#define jpeg_read_header jReadHeader -#define jpeg_start_decompress jStrtDecompress -#define jpeg_read_scanlines jReadScanlines -#define jpeg_finish_decompress jFinDecompress -#define jpeg_read_raw_data jReadRawData -#define jpeg_has_multiple_scans jHasMultScn -#define jpeg_start_output jStrtOutput -#define jpeg_finish_output jFinOutput -#define jpeg_input_complete jInComplete -#define jpeg_new_colormap jNewCMap -#define jpeg_consume_input jConsumeInput -#define jpeg_calc_output_dimensions jCalcDimensions -#define jpeg_save_markers jSaveMarkers -#define jpeg_set_marker_processor jSetMarker -#define jpeg_read_coefficients jReadCoefs -#define jpeg_write_coefficients jWrtCoefs -#define jpeg_copy_critical_parameters jCopyCrit -#define jpeg_abort_compress jAbrtCompress -#define jpeg_abort_decompress jAbrtDecompress -#define jpeg_abort jAbort -#define jpeg_destroy jDestroy -#define jpeg_resync_to_restart jResyncRestart -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Default error-management setup */ -EXTERN(struct jpeg_error_mgr *) jpeg_std_error - JPP((struct jpeg_error_mgr * err)); - -/* Initialization of JPEG compression objects. - * jpeg_create_compress() and jpeg_create_decompress() are the exported - * names that applications should call. These expand to calls on - * jpeg_CreateCompress and jpeg_CreateDecompress with additional information - * passed for version mismatch checking. - * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. - */ -#define jpeg_create_compress(cinfo) \ - jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_compress_struct)) -#define jpeg_create_decompress(cinfo) \ - jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_decompress_struct)) -EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, - int version, size_t structsize)); -EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, - int version, size_t structsize)); -/* Destruction of JPEG compression objects */ -EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); - -/* Standard data source and destination managers: stdio streams. */ -/* Caller is responsible for opening the file before and closing after. */ -EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); -EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); - -/* Default parameter setup for compression */ -EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); -/* Compression parameter setup aids */ -EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, - J_COLOR_SPACE colorspace)); -EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, - boolean force_baseline)); -EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, - int scale_factor, - boolean force_baseline)); -EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, - const unsigned int *basic_table, - int scale_factor, - boolean force_baseline)); -EXTERN(int) jpeg_quality_scaling JPP((int quality)); -EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, - boolean suppress)); -EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); -EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); - -/* Main entry points for compression */ -EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, - boolean write_all_tables)); -EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION num_lines)); -EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); - -/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION num_lines)); - -/* Write a special marker. See libjpeg.doc concerning safe usage. */ -EXTERN(void) jpeg_write_marker - JPP((j_compress_ptr cinfo, int marker, - const JOCTET * dataptr, unsigned int datalen)); -/* Same, but piecemeal. */ -EXTERN(void) jpeg_write_m_header - JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); -EXTERN(void) jpeg_write_m_byte - JPP((j_compress_ptr cinfo, int val)); - -/* Alternate compression function: just write an abbreviated table file */ -EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); - -/* Decompression startup: read start of JPEG datastream to see what's there */ -EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, - boolean require_image)); -/* Return value is one of: */ -#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ -#define JPEG_HEADER_OK 1 /* Found valid image datastream */ -#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ -/* If you pass require_image = TRUE (normal case), you need not check for - * a TABLES_ONLY return code; an abbreviated file will cause an error exit. - * JPEG_SUSPENDED is only possible if you use a data source module that can - * give a suspension return (the stdio source module doesn't). - */ - -/* Main entry points for decompression */ -EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); -EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION max_lines)); -EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); - -/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION max_lines)); - -/* Additional entry points for buffered-image mode. */ -EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, - int scan_number)); -EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); -EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); -/* Return value is one of: */ -/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ -#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ -#define JPEG_REACHED_EOI 2 /* Reached end of image */ -#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ -#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ - -/* Precalculate output dimensions for current decompression parameters. */ -EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); - -/* Control saving of COM and APPn markers into marker_list. */ -EXTERN(void) jpeg_save_markers - JPP((j_decompress_ptr cinfo, int marker_code, - unsigned int length_limit)); - -/* Install a special processing method for COM or APPn markers. */ -EXTERN(void) jpeg_set_marker_processor - JPP((j_decompress_ptr cinfo, int marker_code, - jpeg_marker_parser_method routine)); - -/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ -EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays)); -EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, - j_compress_ptr dstinfo)); - -/* If you choose to abort compression or decompression before completing - * jpeg_finish_(de)compress, then you need to clean up to release memory, - * temporary files, etc. You can just call jpeg_destroy_(de)compress - * if you're done with the JPEG object, but if you want to clean it up and - * reuse it, call this: - */ -EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); - -/* Generic versions of jpeg_abort and jpeg_destroy that work on either - * flavor of JPEG object. These may be more convenient in some places. - */ -EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); -EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); - -/* Default restart-marker-resync procedure for use by data source modules */ -EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, - int desired)); - - -/* These marker codes are exported since applications and data source modules - * are likely to want to use them. - */ - -#define JPEG_RST0 0xD0 /* RST0 marker code */ -#define JPEG_EOI 0xD9 /* EOI marker code */ -#define JPEG_APP0 0xE0 /* APP0 marker code */ -#define JPEG_COM 0xFE /* COM marker code */ - - -/* If we have a brain-damaged compiler that emits warnings (or worse, errors) - * for structure definitions that are never filled in, keep it quiet by - * supplying dummy definitions for the various substructures. - */ - -#ifdef INCOMPLETE_TYPES_BROKEN -#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ -struct jvirt_sarray_control { long dummy; }; -struct jvirt_barray_control { long dummy; }; -struct jpeg_comp_master { long dummy; }; -struct jpeg_c_main_controller { long dummy; }; -struct jpeg_c_prep_controller { long dummy; }; -struct jpeg_c_coef_controller { long dummy; }; -struct jpeg_marker_writer { long dummy; }; -struct jpeg_color_converter { long dummy; }; -struct jpeg_downsampler { long dummy; }; -struct jpeg_forward_dct { long dummy; }; -struct jpeg_entropy_encoder { long dummy; }; -struct jpeg_decomp_master { long dummy; }; -struct jpeg_d_main_controller { long dummy; }; -struct jpeg_d_coef_controller { long dummy; }; -struct jpeg_d_post_controller { long dummy; }; -struct jpeg_input_controller { long dummy; }; -struct jpeg_marker_reader { long dummy; }; -struct jpeg_entropy_decoder { long dummy; }; -struct jpeg_inverse_dct { long dummy; }; -struct jpeg_upsampler { long dummy; }; -struct jpeg_color_deconverter { long dummy; }; -struct jpeg_color_quantizer { long dummy; }; -#endif /* JPEG_INTERNALS */ -#endif /* INCOMPLETE_TYPES_BROKEN */ - - -/* - * The JPEG library modules define JPEG_INTERNALS before including this file. - * The internal structure declarations are read only when that is true. - * Applications using the library should not include jpegint.h, but may wish - * to include jerror.h. - */ - -#ifdef JPEG_INTERNALS -#include "jpegint.h" /* fetch private declarations */ -#include "jerror.h" /* fetch error codes too */ -#endif - -#endif /* JPEGLIB_H */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant1.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant1.c deleted file mode 100755 index 65f4882..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant1.c +++ /dev/null @@ -1,856 +0,0 @@ -/* - * jquant1.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains 1-pass color quantization (color mapping) routines. - * These routines provide mapping to a fixed color map using equally spaced - * color values. Optional Floyd-Steinberg or ordered dithering is available. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - -#ifdef QUANT_1PASS_SUPPORTED - - -/* - * The main purpose of 1-pass quantization is to provide a fast, if not very - * high quality, colormapped output capability. A 2-pass quantizer usually - * gives better visual quality; however, for quantized grayscale output this - * quantizer is perfectly adequate. Dithering is highly recommended with this - * quantizer, though you can turn it off if you really want to. - * - * In 1-pass quantization the colormap must be chosen in advance of seeing the - * image. We use a map consisting of all combinations of Ncolors[i] color - * values for the i'th component. The Ncolors[] values are chosen so that - * their product, the total number of colors, is no more than that requested. - * (In most cases, the product will be somewhat less.) - * - * Since the colormap is orthogonal, the representative value for each color - * component can be determined without considering the other components; - * then these indexes can be combined into a colormap index by a standard - * N-dimensional-array-subscript calculation. Most of the arithmetic involved - * can be precalculated and stored in the lookup table colorindex[]. - * colorindex[i][j] maps pixel value j in component i to the nearest - * representative value (grid plane) for that component; this index is - * multiplied by the array stride for component i, so that the - * index of the colormap entry closest to a given pixel value is just - * sum( colorindex[component-number][pixel-component-value] ) - * Aside from being fast, this scheme allows for variable spacing between - * representative values with no additional lookup cost. - * - * If gamma correction has been applied in color conversion, it might be wise - * to adjust the color grid spacing so that the representative colors are - * equidistant in linear space. At this writing, gamma correction is not - * implemented by jdcolor, so nothing is done here. - */ - - -/* Declarations for ordered dithering. - * - * We use a standard 16x16 ordered dither array. The basic concept of ordered - * dithering is described in many references, for instance Dale Schumacher's - * chapter II.2 of Graphics Gems II (James Arvo, ed. Academic Press, 1991). - * In place of Schumacher's comparisons against a "threshold" value, we add a - * "dither" value to the input pixel and then round the result to the nearest - * output value. The dither value is equivalent to (0.5 - threshold) times - * the distance between output values. For ordered dithering, we assume that - * the output colors are equally spaced; if not, results will probably be - * worse, since the dither may be too much or too little at a given point. - * - * The normal calculation would be to form pixel value + dither, range-limit - * this to 0..MAXJSAMPLE, and then index into the colorindex table as usual. - * We can skip the separate range-limiting step by extending the colorindex - * table in both directions. - */ - -#define ODITHER_SIZE 16 /* dimension of dither matrix */ -/* NB: if ODITHER_SIZE is not a power of 2, ODITHER_MASK uses will break */ -#define ODITHER_CELLS (ODITHER_SIZE*ODITHER_SIZE) /* # cells in matrix */ -#define ODITHER_MASK (ODITHER_SIZE-1) /* mask for wrapping around counters */ - -typedef int ODITHER_MATRIX[ODITHER_SIZE][ODITHER_SIZE]; -typedef int (*ODITHER_MATRIX_PTR)[ODITHER_SIZE]; - -static const UINT8 base_dither_matrix[ODITHER_SIZE][ODITHER_SIZE] = { - /* Bayer's order-4 dither array. Generated by the code given in - * Stephen Hawley's article "Ordered Dithering" in Graphics Gems I. - * The values in this array must range from 0 to ODITHER_CELLS-1. - */ - { 0,192, 48,240, 12,204, 60,252, 3,195, 51,243, 15,207, 63,255 }, - { 128, 64,176,112,140, 76,188,124,131, 67,179,115,143, 79,191,127 }, - { 32,224, 16,208, 44,236, 28,220, 35,227, 19,211, 47,239, 31,223 }, - { 160, 96,144, 80,172,108,156, 92,163, 99,147, 83,175,111,159, 95 }, - { 8,200, 56,248, 4,196, 52,244, 11,203, 59,251, 7,199, 55,247 }, - { 136, 72,184,120,132, 68,180,116,139, 75,187,123,135, 71,183,119 }, - { 40,232, 24,216, 36,228, 20,212, 43,235, 27,219, 39,231, 23,215 }, - { 168,104,152, 88,164,100,148, 84,171,107,155, 91,167,103,151, 87 }, - { 2,194, 50,242, 14,206, 62,254, 1,193, 49,241, 13,205, 61,253 }, - { 130, 66,178,114,142, 78,190,126,129, 65,177,113,141, 77,189,125 }, - { 34,226, 18,210, 46,238, 30,222, 33,225, 17,209, 45,237, 29,221 }, - { 162, 98,146, 82,174,110,158, 94,161, 97,145, 81,173,109,157, 93 }, - { 10,202, 58,250, 6,198, 54,246, 9,201, 57,249, 5,197, 53,245 }, - { 138, 74,186,122,134, 70,182,118,137, 73,185,121,133, 69,181,117 }, - { 42,234, 26,218, 38,230, 22,214, 41,233, 25,217, 37,229, 21,213 }, - { 170,106,154, 90,166,102,150, 86,169,105,153, 89,165,101,149, 85 } -}; - - -/* Declarations for Floyd-Steinberg dithering. - * - * Errors are accumulated into the array fserrors[], at a resolution of - * 1/16th of a pixel count. The error at a given pixel is propagated - * to its not-yet-processed neighbors using the standard F-S fractions, - * ... (here) 7/16 - * 3/16 5/16 1/16 - * We work left-to-right on even rows, right-to-left on odd rows. - * - * We can get away with a single array (holding one row's worth of errors) - * by using it to store the current row's errors at pixel columns not yet - * processed, but the next row's errors at columns already processed. We - * need only a few extra variables to hold the errors immediately around the - * current column. (If we are lucky, those variables are in registers, but - * even if not, they're probably cheaper to access than array elements are.) - * - * The fserrors[] array is indexed [component#][position]. - * We provide (#columns + 2) entries per component; the extra entry at each - * end saves us from special-casing the first and last pixels. - * - * Note: on a wide image, we might not have enough room in a PC's near data - * segment to hold the error array; so it is allocated with alloc_large. - */ - -#if BITS_IN_JSAMPLE == 8 -typedef INT16 FSERROR; /* 16 bits should be enough */ -typedef int LOCFSERROR; /* use 'int' for calculation temps */ -#else -typedef INT32 FSERROR; /* may need more than 16 bits */ -typedef INT32 LOCFSERROR; /* be sure calculation temps are big enough */ -#endif - -typedef FSERROR FAR *FSERRPTR; /* pointer to error array (in FAR storage!) */ - - -/* Private subobject */ - -#define MAX_Q_COMPS 4 /* max components I can handle */ - -typedef struct { - struct jpeg_color_quantizer pub; /* public fields */ - - /* Initially allocated colormap is saved here */ - JSAMPARRAY sv_colormap; /* The color map as a 2-D pixel array */ - int sv_actual; /* number of entries in use */ - - JSAMPARRAY colorindex; /* Precomputed mapping for speed */ - /* colorindex[i][j] = index of color closest to pixel value j in component i, - * premultiplied as described above. Since colormap indexes must fit into - * JSAMPLEs, the entries of this array will too. - */ - boolean is_padded; /* is the colorindex padded for odither? */ - - int Ncolors[MAX_Q_COMPS]; /* # of values alloced to each component */ - - /* Variables for ordered dithering */ - int row_index; /* cur row's vertical index in dither matrix */ - ODITHER_MATRIX_PTR odither[MAX_Q_COMPS]; /* one dither array per component */ - - /* Variables for Floyd-Steinberg dithering */ - FSERRPTR fserrors[MAX_Q_COMPS]; /* accumulated errors */ - boolean on_odd_row; /* flag to remember which row we are on */ -} my_cquantizer; - -typedef my_cquantizer * my_cquantize_ptr; - - -/* - * Policy-making subroutines for create_colormap and create_colorindex. - * These routines determine the colormap to be used. The rest of the module - * only assumes that the colormap is orthogonal. - * - * * select_ncolors decides how to divvy up the available colors - * among the components. - * * output_value defines the set of representative values for a component. - * * largest_input_value defines the mapping from input values to - * representative values for a component. - * Note that the latter two routines may impose different policies for - * different components, though this is not currently done. - */ - - -LOCAL(int) -select_ncolors (j_decompress_ptr cinfo, int Ncolors[]) -/* Determine allocation of desired colors to components, */ -/* and fill in Ncolors[] array to indicate choice. */ -/* Return value is total number of colors (product of Ncolors[] values). */ -{ - int nc = cinfo->out_color_components; /* number of color components */ - int max_colors = cinfo->desired_number_of_colors; - int total_colors, iroot, i, j; - boolean changed; - long temp; - static const int RGB_order[3] = { RGB_GREEN, RGB_RED, RGB_BLUE }; - - /* We can allocate at least the nc'th root of max_colors per component. */ - /* Compute floor(nc'th root of max_colors). */ - iroot = 1; - do { - iroot++; - temp = iroot; /* set temp = iroot ** nc */ - for (i = 1; i < nc; i++) - temp *= iroot; - } while (temp <= (long) max_colors); /* repeat till iroot exceeds root */ - iroot--; /* now iroot = floor(root) */ - - /* Must have at least 2 color values per component */ - if (iroot < 2) - ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, (int) temp); - - /* Initialize to iroot color values for each component */ - total_colors = 1; - for (i = 0; i < nc; i++) { - Ncolors[i] = iroot; - total_colors *= iroot; - } - /* We may be able to increment the count for one or more components without - * exceeding max_colors, though we know not all can be incremented. - * Sometimes, the first component can be incremented more than once! - * (Example: for 16 colors, we start at 2*2*2, go to 3*2*2, then 4*2*2.) - * In RGB colorspace, try to increment G first, then R, then B. - */ - do { - changed = FALSE; - for (i = 0; i < nc; i++) { - j = (cinfo->out_color_space == JCS_RGB ? RGB_order[i] : i); - /* calculate new total_colors if Ncolors[j] is incremented */ - temp = total_colors / Ncolors[j]; - temp *= Ncolors[j]+1; /* done in long arith to avoid oflo */ - if (temp > (long) max_colors) - break; /* won't fit, done with this pass */ - Ncolors[j]++; /* OK, apply the increment */ - total_colors = (int) temp; - changed = TRUE; - } - } while (changed); - - return total_colors; -} - - -LOCAL(int) -output_value (j_decompress_ptr, int, int j, int maxj) -/* Return j'th output value, where j will range from 0 to maxj */ -/* The output values must fall in 0..MAXJSAMPLE in increasing order */ -{ - /* We always provide values 0 and MAXJSAMPLE for each component; - * any additional values are equally spaced between these limits. - * (Forcing the upper and lower values to the limits ensures that - * dithering can't produce a color outside the selected gamut.) - */ - return (int) (((INT32) j * MAXJSAMPLE + maxj/2) / maxj); -} - - -LOCAL(int) -largest_input_value (j_decompress_ptr, int, int j, int maxj) -/* Return largest input value that should map to j'th output value */ -/* Must have largest(j=0) >= 0, and largest(j=maxj) >= MAXJSAMPLE */ -{ - /* Breakpoints are halfway between values returned by output_value */ - return (int) (((INT32) (2*j + 1) * MAXJSAMPLE + maxj) / (2*maxj)); -} - - -/* - * Create the colormap. - */ - -LOCAL(void) -create_colormap (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - JSAMPARRAY colormap; /* Created colormap */ - int total_colors; /* Number of distinct output colors */ - int i,j,k, nci, blksize, blkdist, ptr, val; - - /* Select number of colors for each component */ - total_colors = select_ncolors(cinfo, cquantize->Ncolors); - - /* Report selected color counts */ - if (cinfo->out_color_components == 3) - TRACEMS4(cinfo, 1, JTRC_QUANT_3_NCOLORS, - total_colors, cquantize->Ncolors[0], - cquantize->Ncolors[1], cquantize->Ncolors[2]); - else - TRACEMS1(cinfo, 1, JTRC_QUANT_NCOLORS, total_colors); - - /* Allocate and fill in the colormap. */ - /* The colors are ordered in the map in standard row-major order, */ - /* i.e. rightmost (highest-indexed) color changes most rapidly. */ - - colormap = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) total_colors, (JDIMENSION) cinfo->out_color_components); - - /* blksize is number of adjacent repeated entries for a component */ - /* blkdist is distance between groups of identical entries for a component */ - blkdist = total_colors; - - for (i = 0; i < cinfo->out_color_components; i++) { - /* fill in colormap entries for i'th color component */ - nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ - blksize = blkdist / nci; - for (j = 0; j < nci; j++) { - /* Compute j'th output value (out of nci) for component */ - val = output_value(cinfo, i, j, nci-1); - /* Fill in all colormap entries that have this value of this component */ - for (ptr = j * blksize; ptr < total_colors; ptr += blkdist) { - /* fill in blksize entries beginning at ptr */ - for (k = 0; k < blksize; k++) - colormap[i][ptr+k] = (JSAMPLE) val; - } - } - blkdist = blksize; /* blksize of this color is blkdist of next */ - } - - /* Save the colormap in private storage, - * where it will survive color quantization mode changes. - */ - cquantize->sv_colormap = colormap; - cquantize->sv_actual = total_colors; -} - - -/* - * Create the color index table. - */ - -LOCAL(void) -create_colorindex (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - JSAMPROW indexptr; - int i,j,k, nci, blksize, val, pad; - - /* For ordered dither, we pad the color index tables by MAXJSAMPLE in - * each direction (input index values can be -MAXJSAMPLE .. 2*MAXJSAMPLE). - * This is not necessary in the other dithering modes. However, we - * flag whether it was done in case user changes dithering mode. - */ - if (cinfo->dither_mode == JDITHER_ORDERED) { - pad = MAXJSAMPLE*2; - cquantize->is_padded = TRUE; - } else { - pad = 0; - cquantize->is_padded = FALSE; - } - - cquantize->colorindex = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (JDIMENSION) (MAXJSAMPLE+1 + pad), - (JDIMENSION) cinfo->out_color_components); - - /* blksize is number of adjacent repeated entries for a component */ - blksize = cquantize->sv_actual; - - for (i = 0; i < cinfo->out_color_components; i++) { - /* fill in colorindex entries for i'th color component */ - nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ - blksize = blksize / nci; - - /* adjust colorindex pointers to provide padding at negative indexes. */ - if (pad) - cquantize->colorindex[i] += MAXJSAMPLE; - - /* in loop, val = index of current output value, */ - /* and k = largest j that maps to current val */ - indexptr = cquantize->colorindex[i]; - val = 0; - k = largest_input_value(cinfo, i, 0, nci-1); - for (j = 0; j <= MAXJSAMPLE; j++) { - while (j > k) /* advance val if past boundary */ - k = largest_input_value(cinfo, i, ++val, nci-1); - /* premultiply so that no multiplication needed in main processing */ - indexptr[j] = (JSAMPLE) (val * blksize); - } - /* Pad at both ends if necessary */ - if (pad) - for (j = 1; j <= MAXJSAMPLE; j++) { - indexptr[-j] = indexptr[0]; - indexptr[MAXJSAMPLE+j] = indexptr[MAXJSAMPLE]; - } - } -} - - -/* - * Create an ordered-dither array for a component having ncolors - * distinct output values. - */ - -LOCAL(ODITHER_MATRIX_PTR) -make_odither_array (j_decompress_ptr cinfo, int ncolors) -{ - ODITHER_MATRIX_PTR odither; - int j,k; - INT32 num,den; - - odither = (ODITHER_MATRIX_PTR) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(ODITHER_MATRIX)); - /* The inter-value distance for this color is MAXJSAMPLE/(ncolors-1). - * Hence the dither value for the matrix cell with fill order f - * (f=0..N-1) should be (N-1-2*f)/(2*N) * MAXJSAMPLE/(ncolors-1). - * On 16-bit-int machine, be careful to avoid overflow. - */ - den = 2 * ODITHER_CELLS * ((INT32) (ncolors - 1)); - for (j = 0; j < ODITHER_SIZE; j++) { - for (k = 0; k < ODITHER_SIZE; k++) { - num = ((INT32) (ODITHER_CELLS-1 - 2*((int)base_dither_matrix[j][k]))) - * MAXJSAMPLE; - /* Ensure round towards zero despite C's lack of consistency - * about rounding negative values in integer division... - */ - odither[j][k] = (int) (num<0 ? -((-num)/den) : num/den); - } - } - return odither; -} - - -/* - * Create the ordered-dither tables. - * Components having the same number of representative colors may - * share a dither table. - */ - -LOCAL(void) -create_odither_tables (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - ODITHER_MATRIX_PTR odither; - int i, j, nci; - - for (i = 0; i < cinfo->out_color_components; i++) { - nci = cquantize->Ncolors[i]; /* # of distinct values for this color */ - odither = NULL; /* search for matching prior component */ - for (j = 0; j < i; j++) { - if (nci == cquantize->Ncolors[j]) { - odither = cquantize->odither[j]; - break; - } - } - if (odither == NULL) /* need a new table? */ - odither = make_odither_array(cinfo, nci); - cquantize->odither[i] = odither; - } -} - - -/* - * Map some rows of pixels to the output colormapped representation. - */ - -METHODDEF(void) -color_quantize (j_decompress_ptr cinfo, JSAMPARRAY input_buf, - JSAMPARRAY output_buf, int num_rows) -/* General case, no dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - JSAMPARRAY colorindex = cquantize->colorindex; - int pixcode, ci; - JSAMPROW ptrin, ptrout; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - int nc = cinfo->out_color_components; - - for (row = 0; row < num_rows; row++) { - ptrin = input_buf[row]; - ptrout = output_buf[row]; - for (col = width; col > 0; col--) { - pixcode = 0; - for (ci = 0; ci < nc; ci++) { - pixcode += GETJSAMPLE(colorindex[ci][GETJSAMPLE(*ptrin++)]); - } - *ptrout++ = (JSAMPLE) pixcode; - } - } -} - - -METHODDEF(void) -color_quantize3 (j_decompress_ptr cinfo, JSAMPARRAY input_buf, - JSAMPARRAY output_buf, int num_rows) -/* Fast path for out_color_components==3, no dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - int pixcode; - JSAMPROW ptrin, ptrout; - JSAMPROW colorindex0 = cquantize->colorindex[0]; - JSAMPROW colorindex1 = cquantize->colorindex[1]; - JSAMPROW colorindex2 = cquantize->colorindex[2]; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - - for (row = 0; row < num_rows; row++) { - ptrin = input_buf[row]; - ptrout = output_buf[row]; - for (col = width; col > 0; col--) { - pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*ptrin++)]); - pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*ptrin++)]); - pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*ptrin++)]); - *ptrout++ = (JSAMPLE) pixcode; - } - } -} - - -METHODDEF(void) -quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, - JSAMPARRAY output_buf, int num_rows) -/* General case, with ordered dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - JSAMPROW input_ptr; - JSAMPROW output_ptr; - JSAMPROW colorindex_ci; - int * dither; /* points to active row of dither matrix */ - int row_index, col_index; /* current indexes into dither matrix */ - int nc = cinfo->out_color_components; - int ci; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - - for (row = 0; row < num_rows; row++) { - /* Initialize output values to 0 so can process components separately */ - jzero_far((void FAR *) output_buf[row], - (size_t) (width * SIZEOF(JSAMPLE))); - row_index = cquantize->row_index; - for (ci = 0; ci < nc; ci++) { - input_ptr = input_buf[row] + ci; - output_ptr = output_buf[row]; - colorindex_ci = cquantize->colorindex[ci]; - dither = cquantize->odither[ci][row_index]; - col_index = 0; - - for (col = width; col > 0; col--) { - /* Form pixel value + dither, range-limit to 0..MAXJSAMPLE, - * select output value, accumulate into output code for this pixel. - * Range-limiting need not be done explicitly, as we have extended - * the colorindex table to produce the right answers for out-of-range - * inputs. The maximum dither is +- MAXJSAMPLE; this sets the - * required amount of padding. - */ - *output_ptr += colorindex_ci[GETJSAMPLE(*input_ptr)+dither[col_index]]; - input_ptr += nc; - output_ptr++; - col_index = (col_index + 1) & ODITHER_MASK; - } - } - /* Advance row index for next row */ - row_index = (row_index + 1) & ODITHER_MASK; - cquantize->row_index = row_index; - } -} - - -METHODDEF(void) -quantize3_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, - JSAMPARRAY output_buf, int num_rows) -/* Fast path for out_color_components==3, with ordered dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - int pixcode; - JSAMPROW input_ptr; - JSAMPROW output_ptr; - JSAMPROW colorindex0 = cquantize->colorindex[0]; - JSAMPROW colorindex1 = cquantize->colorindex[1]; - JSAMPROW colorindex2 = cquantize->colorindex[2]; - int * dither0; /* points to active row of dither matrix */ - int * dither1; - int * dither2; - int row_index, col_index; /* current indexes into dither matrix */ - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - - for (row = 0; row < num_rows; row++) { - row_index = cquantize->row_index; - input_ptr = input_buf[row]; - output_ptr = output_buf[row]; - dither0 = cquantize->odither[0][row_index]; - dither1 = cquantize->odither[1][row_index]; - dither2 = cquantize->odither[2][row_index]; - col_index = 0; - - for (col = width; col > 0; col--) { - pixcode = GETJSAMPLE(colorindex0[GETJSAMPLE(*input_ptr++) + - dither0[col_index]]); - pixcode += GETJSAMPLE(colorindex1[GETJSAMPLE(*input_ptr++) + - dither1[col_index]]); - pixcode += GETJSAMPLE(colorindex2[GETJSAMPLE(*input_ptr++) + - dither2[col_index]]); - *output_ptr++ = (JSAMPLE) pixcode; - col_index = (col_index + 1) & ODITHER_MASK; - } - row_index = (row_index + 1) & ODITHER_MASK; - cquantize->row_index = row_index; - } -} - - -METHODDEF(void) -quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf, - JSAMPARRAY output_buf, int num_rows) -/* General case, with Floyd-Steinberg dithering */ -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - LOCFSERROR cur; /* current error or pixel value */ - LOCFSERROR belowerr; /* error for pixel below cur */ - LOCFSERROR bpreverr; /* error for below/prev col */ - LOCFSERROR bnexterr; /* error for below/next col */ - LOCFSERROR delta; - FSERRPTR errorptr; /* => fserrors[] at column before current */ - JSAMPROW input_ptr; - JSAMPROW output_ptr; - JSAMPROW colorindex_ci; - JSAMPROW colormap_ci; - int pixcode; - int nc = cinfo->out_color_components; - int dir; /* 1 for left-to-right, -1 for right-to-left */ - int dirnc; /* dir * nc */ - int ci; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - JSAMPLE *range_limit = cinfo->sample_range_limit; - SHIFT_TEMPS - - for (row = 0; row < num_rows; row++) { - /* Initialize output values to 0 so can process components separately */ - jzero_far((void FAR *) output_buf[row], - (size_t) (width * SIZEOF(JSAMPLE))); - for (ci = 0; ci < nc; ci++) { - input_ptr = input_buf[row] + ci; - output_ptr = output_buf[row]; - if (cquantize->on_odd_row) { - /* work right to left in this row */ - input_ptr += (width-1) * nc; /* so point to rightmost pixel */ - output_ptr += width-1; - dir = -1; - dirnc = -nc; - errorptr = cquantize->fserrors[ci] + (width+1); /* => entry after last column */ - } else { - /* work left to right in this row */ - dir = 1; - dirnc = nc; - errorptr = cquantize->fserrors[ci]; /* => entry before first column */ - } - colorindex_ci = cquantize->colorindex[ci]; - colormap_ci = cquantize->sv_colormap[ci]; - /* Preset error values: no error propagated to first pixel from left */ - cur = 0; - /* and no error propagated to row below yet */ - belowerr = bpreverr = 0; - - for (col = width; col > 0; col--) { - /* cur holds the error propagated from the previous pixel on the - * current line. Add the error propagated from the previous line - * to form the complete error correction term for this pixel, and - * round the error term (which is expressed * 16) to an integer. - * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct - * for either sign of the error value. - * Note: errorptr points to *previous* column's array entry. - */ - cur = RIGHT_SHIFT(cur + errorptr[dir] + 8, 4); - /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. - * The maximum error is +- MAXJSAMPLE; this sets the required size - * of the range_limit array. - */ - cur += GETJSAMPLE(*input_ptr); - cur = GETJSAMPLE(range_limit[cur]); - /* Select output value, accumulate into output code for this pixel */ - pixcode = GETJSAMPLE(colorindex_ci[cur]); - *output_ptr += (JSAMPLE) pixcode; - /* Compute actual representation error at this pixel */ - /* Note: we can do this even though we don't have the final */ - /* pixel code, because the colormap is orthogonal. */ - cur -= GETJSAMPLE(colormap_ci[pixcode]); - /* Compute error fractions to be propagated to adjacent pixels. - * Add these into the running sums, and simultaneously shift the - * next-line error sums left by 1 column. - */ - bnexterr = cur; - delta = cur * 2; - cur += delta; /* form error * 3 */ - errorptr[0] = (FSERROR) (bpreverr + cur); - cur += delta; /* form error * 5 */ - bpreverr = belowerr + cur; - belowerr = bnexterr; - cur += delta; /* form error * 7 */ - /* At this point cur contains the 7/16 error value to be propagated - * to the next pixel on the current line, and all the errors for the - * next line have been shifted over. We are therefore ready to move on. - */ - input_ptr += dirnc; /* advance input ptr to next column */ - output_ptr += dir; /* advance output ptr to next column */ - errorptr += dir; /* advance errorptr to current column */ - } - /* Post-loop cleanup: we must unload the final error value into the - * final fserrors[] entry. Note we need not unload belowerr because - * it is for the dummy column before or after the actual array. - */ - errorptr[0] = (FSERROR) bpreverr; /* unload prev err into array */ - } - cquantize->on_odd_row = (cquantize->on_odd_row ? FALSE : TRUE); - } -} - - -/* - * Allocate workspace for Floyd-Steinberg errors. - */ - -LOCAL(void) -alloc_fs_workspace (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - size_t arraysize; - int i; - - arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); - for (i = 0; i < cinfo->out_color_components; i++) { - cquantize->fserrors[i] = (FSERRPTR) - (*cinfo->mem->alloc_large)((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); - } -} - - -/* - * Initialize for one-pass color quantization. - */ - -METHODDEF(void) -start_pass_1_quant (j_decompress_ptr cinfo, boolean) -{ - my_cquantize_ptr cquantize = (my_cquantize_ptr) cinfo->cquantize; - size_t arraysize; - int i; - - /* Install my colormap. */ - cinfo->colormap = cquantize->sv_colormap; - cinfo->actual_number_of_colors = cquantize->sv_actual; - - /* Initialize for desired dithering mode. */ - switch (cinfo->dither_mode) { - case JDITHER_NONE: - if (cinfo->out_color_components == 3) - cquantize->pub.color_quantize = color_quantize3; - else - cquantize->pub.color_quantize = color_quantize; - break; - case JDITHER_ORDERED: - if (cinfo->out_color_components == 3) - cquantize->pub.color_quantize = quantize3_ord_dither; - else - cquantize->pub.color_quantize = quantize_ord_dither; - cquantize->row_index = 0; /* initialize state for ordered dither */ - /* If user changed to ordered dither from another mode, - * we must recreate the color index table with padding. - * This will cost extra space, but probably isn't very likely. - */ - if (! cquantize->is_padded) - create_colorindex(cinfo); - /* Create ordered-dither tables if we didn't already. */ - if (cquantize->odither[0] == NULL) - create_odither_tables(cinfo); - break; - case JDITHER_FS: - cquantize->pub.color_quantize = quantize_fs_dither; - cquantize->on_odd_row = FALSE; /* initialize state for F-S dither */ - /* Allocate Floyd-Steinberg workspace if didn't already. */ - if (cquantize->fserrors[0] == NULL) - alloc_fs_workspace(cinfo); - /* Initialize the propagated errors to zero. */ - arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); - for (i = 0; i < cinfo->out_color_components; i++) - jzero_far((void FAR *) cquantize->fserrors[i], arraysize); - break; - default: - ERREXIT(cinfo, JERR_NOT_COMPILED); - break; - } -} - - -/* - * Finish up at the end of the pass. - */ - -METHODDEF(void) -finish_pass_1_quant (j_decompress_ptr) -{ - /* no work in 1-pass case */ -} - - -/* - * Switch to a new external colormap between output passes. - * Shouldn't get to this module! - */ - -METHODDEF(void) -new_color_map_1_quant (j_decompress_ptr cinfo) -{ - ERREXIT(cinfo, JERR_MODE_CHANGE); -} - - -/* - * Module initialization routine for 1-pass color quantization. - */ - -GLOBAL(void) -jinit_1pass_quantizer (j_decompress_ptr cinfo) -{ - my_cquantize_ptr cquantize; - - cquantize = (my_cquantize_ptr) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_cquantizer)); - cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; - cquantize->pub.start_pass = start_pass_1_quant; - cquantize->pub.finish_pass = finish_pass_1_quant; - cquantize->pub.new_color_map = new_color_map_1_quant; - cquantize->fserrors[0] = NULL; /* Flag FS workspace not allocated */ - cquantize->odither[0] = NULL; /* Also flag odither arrays not allocated */ - - /* Make sure my internal arrays won't overflow */ - if (cinfo->out_color_components > MAX_Q_COMPS) - ERREXIT1(cinfo, JERR_QUANT_COMPONENTS, MAX_Q_COMPS); - /* Make sure colormap indexes can be represented by JSAMPLEs */ - if (cinfo->desired_number_of_colors > (MAXJSAMPLE+1)) - ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXJSAMPLE+1); - - /* Create the colormap and color index table. */ - create_colormap(cinfo); - create_colorindex(cinfo); - - /* Allocate Floyd-Steinberg workspace now if requested. - * We do this now since it is FAR storage and may affect the memory - * manager's space calculations. If the user changes to FS dither - * mode in a later pass, we will allocate the space then, and will - * possibly overrun the max_memory_to_use setting. - */ - if (cinfo->dither_mode == JDITHER_FS) - alloc_fs_workspace(cinfo); -} - -#endif /* QUANT_1PASS_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant2.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant2.c deleted file mode 100755 index 8f50d53..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jquant2.c +++ /dev/null @@ -1,1310 +0,0 @@ -/* - * jquant2.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains 2-pass color quantization (color mapping) routines. - * These routines provide selection of a custom color map for an image, - * followed by mapping of the image to that color map, with optional - * Floyd-Steinberg dithering. - * It is also possible to use just the second pass to map to an arbitrary - * externally-given color map. - * - * Note: ordered dithering is not supported, since there isn't any fast - * way to compute intercolor distances; it's unclear that ordered dither's - * fundamental assumptions even hold with an irregularly spaced color map. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - -#ifdef QUANT_2PASS_SUPPORTED - - -/* - * This module implements the well-known Heckbert paradigm for color - * quantization. Most of the ideas used here can be traced back to - * Heckbert's seminal paper - * Heckbert, Paul. "Color Image Quantization for Frame Buffer Display", - * Proc. SIGGRAPH '82, Computer Graphics v.16 #3 (July 1982), pp 297-304. - * - * In the first pass over the image, we accumulate a histogram showing the - * usage count of each possible color. To keep the histogram to a reasonable - * size, we reduce the precision of the input; typical practice is to retain - * 5 or 6 bits per color, so that 8 or 4 different input values are counted - * in the same histogram cell. - * - * Next, the color-selection step begins with a box representing the whole - * color space, and repeatedly splits the "largest" remaining box until we - * have as many boxes as desired colors. Then the mean color in each - * remaining box becomes one of the possible output colors. - * - * The second pass over the image maps each input pixel to the closest output - * color (optionally after applying a Floyd-Steinberg dithering correction). - * This mapping is logically trivial, but making it go fast enough requires - * considerable care. - * - * Heckbert-style quantizers vary a good deal in their policies for choosing - * the "largest" box and deciding where to cut it. The particular policies - * used here have proved out well in experimental comparisons, but better ones - * may yet be found. - * - * In earlier versions of the IJG code, this module quantized in YCbCr color - * space, processing the raw upsampled data without a color conversion step. - * This allowed the color conversion math to be done only once per colormap - * entry, not once per pixel. However, that optimization precluded other - * useful optimizations (such as merging color conversion with upsampling) - * and it also interfered with desired capabilities such as quantizing to an - * externally-supplied colormap. We have therefore abandoned that approach. - * The present code works in the post-conversion color space, typically RGB. - * - * To improve the visual quality of the results, we actually work in scaled - * RGB space, giving G distances more weight than R, and R in turn more than - * B. To do everything in integer math, we must use integer scale factors. - * The 2/3/1 scale factors used here correspond loosely to the relative - * weights of the colors in the NTSC grayscale equation. - * If you want to use this code to quantize a non-RGB color space, you'll - * probably need to change these scale factors. - */ - -#define R_SCALE 2 /* scale R distances by this much */ -#define G_SCALE 3 /* scale G distances by this much */ -#define B_SCALE 1 /* and B by this much */ - -/* Relabel R/G/B as components 0/1/2, respecting the RGB ordering defined - * in jmorecfg.h. As the code stands, it will do the right thing for R,G,B - * and B,G,R orders. If you define some other weird order in jmorecfg.h, - * you'll get compile errors until you extend this logic. In that case - * you'll probably want to tweak the histogram sizes too. - */ - -#if RGB_RED == 0 -#define C0_SCALE R_SCALE -#endif -#if RGB_BLUE == 0 -#define C0_SCALE B_SCALE -#endif -#if RGB_GREEN == 1 -#define C1_SCALE G_SCALE -#endif -#if RGB_RED == 2 -#define C2_SCALE R_SCALE -#endif -#if RGB_BLUE == 2 -#define C2_SCALE B_SCALE -#endif - - -/* - * First we have the histogram data structure and routines for creating it. - * - * The number of bits of precision can be adjusted by changing these symbols. - * We recommend keeping 6 bits for G and 5 each for R and B. - * If you have plenty of memory and cycles, 6 bits all around gives marginally - * better results; if you are short of memory, 5 bits all around will save - * some space but degrade the results. - * To maintain a fully accurate histogram, we'd need to allocate a "long" - * (preferably unsigned long) for each cell. In practice this is overkill; - * we can get by with 16 bits per cell. Few of the cell counts will overflow, - * and clamping those that do overflow to the maximum value will give close- - * enough results. This reduces the recommended histogram size from 256Kb - * to 128Kb, which is a useful savings on PC-class machines. - * (In the second pass the histogram space is re-used for pixel mapping data; - * in that capacity, each cell must be able to store zero to the number of - * desired colors. 16 bits/cell is plenty for that too.) - * Since the JPEG code is intended to run in small memory model on 80x86 - * machines, we can't just allocate the histogram in one chunk. Instead - * of a true 3-D array, we use a row of pointers to 2-D arrays. Each - * pointer corresponds to a C0 value (typically 2^5 = 32 pointers) and - * each 2-D array has 2^6*2^5 = 2048 or 2^6*2^6 = 4096 entries. Note that - * on 80x86 machines, the pointer row is in near memory but the actual - * arrays are in far memory (same arrangement as we use for image arrays). - */ - -#define MAXNUMCOLORS (MAXJSAMPLE+1) /* maximum size of colormap */ - -/* These will do the right thing for either R,G,B or B,G,R color order, - * but you may not like the results for other color orders. - */ -#define HIST_C0_BITS 5 /* bits of precision in R/B histogram */ -#define HIST_C1_BITS 6 /* bits of precision in G histogram */ -#define HIST_C2_BITS 5 /* bits of precision in B/R histogram */ - -/* Number of elements along histogram axes. */ -#define HIST_C0_ELEMS (1<cquantize; - JSAMPROW ptr; - histptr histp; - hist3d histogram = cquantize->histogram; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - - for (row = 0; row < num_rows; row++) { - ptr = input_buf[row]; - for (col = width; col > 0; col--) { - /* get pixel value and index into the histogram */ - histp = & histogram[GETJSAMPLE(ptr[0]) >> C0_SHIFT] - [GETJSAMPLE(ptr[1]) >> C1_SHIFT] - [GETJSAMPLE(ptr[2]) >> C2_SHIFT]; - /* increment, check for overflow and undo increment if so. */ - if (++(*histp) <= 0) - (*histp)--; - ptr += 3; - } - } -} - - -/* - * Next we have the really interesting routines: selection of a colormap - * given the completed histogram. - * These routines work with a list of "boxes", each representing a rectangular - * subset of the input color space (to histogram precision). - */ - -typedef struct { - /* The bounds of the box (inclusive); expressed as histogram indexes */ - int c0min, c0max; - int c1min, c1max; - int c2min, c2max; - /* The volume (actually 2-norm) of the box */ - INT32 volume; - /* The number of nonzero histogram cells within this box */ - long colorcount; -} box; - -typedef box * boxptr; - - -LOCAL(boxptr) -find_biggest_color_pop (boxptr boxlist, int numboxes) -/* Find the splittable box with the largest color population */ -/* Returns NULL if no splittable boxes remain */ -{ - boxptr boxp; - int i; - long maxc = 0; - boxptr which = NULL; - - for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { - if (boxp->colorcount > maxc && boxp->volume > 0) { - which = boxp; - maxc = boxp->colorcount; - } - } - return which; -} - - -LOCAL(boxptr) -find_biggest_volume (boxptr boxlist, int numboxes) -/* Find the splittable box with the largest (scaled) volume */ -/* Returns NULL if no splittable boxes remain */ -{ - boxptr boxp; - int i; - INT32 maxv = 0; - boxptr which = NULL; - - for (i = 0, boxp = boxlist; i < numboxes; i++, boxp++) { - if (boxp->volume > maxv) { - which = boxp; - maxv = boxp->volume; - } - } - return which; -} - - -LOCAL(void) -update_box (j_decompress_ptr cinfo, boxptr boxp) -/* Shrink the min/max bounds of a box to enclose only nonzero elements, */ -/* and recompute its volume and population */ -{ - my_cquantize_ptr2 cquantize = (my_cquantize_ptr2) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - histptr histp; - int c0,c1,c2; - int c0min,c0max,c1min,c1max,c2min,c2max; - INT32 dist0,dist1,dist2; - long ccount; - - c0min = boxp->c0min; c0max = boxp->c0max; - c1min = boxp->c1min; c1max = boxp->c1max; - c2min = boxp->c2min; c2max = boxp->c2max; - - if (c0max > c0min) - for (c0 = c0min; c0 <= c0max; c0++) - for (c1 = c1min; c1 <= c1max; c1++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++) - if (*histp++ != 0) { - boxp->c0min = c0min = c0; - goto have_c0min; - } - } - have_c0min: - if (c0max > c0min) - for (c0 = c0max; c0 >= c0min; c0--) - for (c1 = c1min; c1 <= c1max; c1++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++) - if (*histp++ != 0) { - boxp->c0max = c0max = c0; - goto have_c0max; - } - } - have_c0max: - if (c1max > c1min) - for (c1 = c1min; c1 <= c1max; c1++) - for (c0 = c0min; c0 <= c0max; c0++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++) - if (*histp++ != 0) { - boxp->c1min = c1min = c1; - goto have_c1min; - } - } - have_c1min: - if (c1max > c1min) - for (c1 = c1max; c1 >= c1min; c1--) - for (c0 = c0min; c0 <= c0max; c0++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++) - if (*histp++ != 0) { - boxp->c1max = c1max = c1; - goto have_c1max; - } - } - have_c1max: - if (c2max > c2min) - for (c2 = c2min; c2 <= c2max; c2++) - for (c0 = c0min; c0 <= c0max; c0++) { - histp = & histogram[c0][c1min][c2]; - for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) - if (*histp != 0) { - boxp->c2min = c2min = c2; - goto have_c2min; - } - } - have_c2min: - if (c2max > c2min) - for (c2 = c2max; c2 >= c2min; c2--) - for (c0 = c0min; c0 <= c0max; c0++) { - histp = & histogram[c0][c1min][c2]; - for (c1 = c1min; c1 <= c1max; c1++, histp += HIST_C2_ELEMS) - if (*histp != 0) { - boxp->c2max = c2max = c2; - goto have_c2max; - } - } - have_c2max: - - /* Update box volume. - * We use 2-norm rather than real volume here; this biases the method - * against making long narrow boxes, and it has the side benefit that - * a box is splittable iff norm > 0. - * Since the differences are expressed in histogram-cell units, - * we have to shift back to JSAMPLE units to get consistent distances; - * after which, we scale according to the selected distance scale factors. - */ - dist0 = ((c0max - c0min) << C0_SHIFT) * C0_SCALE; - dist1 = ((c1max - c1min) << C1_SHIFT) * C1_SCALE; - dist2 = ((c2max - c2min) << C2_SHIFT) * C2_SCALE; - boxp->volume = dist0*dist0 + dist1*dist1 + dist2*dist2; - - /* Now scan remaining volume of box and compute population */ - ccount = 0; - for (c0 = c0min; c0 <= c0max; c0++) - for (c1 = c1min; c1 <= c1max; c1++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++, histp++) - if (*histp != 0) { - ccount++; - } - } - boxp->colorcount = ccount; -} - - -LOCAL(int) -median_cut (j_decompress_ptr cinfo, boxptr boxlist, int numboxes, - int desired_colors) -/* Repeatedly select and split the largest box until we have enough boxes */ -{ - int n,lb; - int c0,c1,c2,cmax; - boxptr b1,b2; - - while (numboxes < desired_colors) { - /* Select box to split. - * Current algorithm: by population for first half, then by volume. - */ - if (numboxes*2 <= desired_colors) { - b1 = find_biggest_color_pop(boxlist, numboxes); - } else { - b1 = find_biggest_volume(boxlist, numboxes); - } - if (b1 == NULL) /* no splittable boxes left! */ - break; - b2 = &boxlist[numboxes]; /* where new box will go */ - /* Copy the color bounds to the new box. */ - b2->c0max = b1->c0max; b2->c1max = b1->c1max; b2->c2max = b1->c2max; - b2->c0min = b1->c0min; b2->c1min = b1->c1min; b2->c2min = b1->c2min; - /* Choose which axis to split the box on. - * Current algorithm: longest scaled axis. - * See notes in update_box about scaling distances. - */ - c0 = ((b1->c0max - b1->c0min) << C0_SHIFT) * C0_SCALE; - c1 = ((b1->c1max - b1->c1min) << C1_SHIFT) * C1_SCALE; - c2 = ((b1->c2max - b1->c2min) << C2_SHIFT) * C2_SCALE; - /* We want to break any ties in favor of green, then red, blue last. - * This code does the right thing for R,G,B or B,G,R color orders only. - */ -#if RGB_RED == 0 - cmax = c1; n = 1; - if (c0 > cmax) { cmax = c0; n = 0; } - if (c2 > cmax) { n = 2; } -#else - cmax = c1; n = 1; - if (c2 > cmax) { cmax = c2; n = 2; } - if (c0 > cmax) { n = 0; } -#endif - /* Choose split point along selected axis, and update box bounds. - * Current algorithm: split at halfway point. - * (Since the box has been shrunk to minimum volume, - * any split will produce two nonempty subboxes.) - * Note that lb value is max for lower box, so must be < old max. - */ - switch (n) { - case 0: - lb = (b1->c0max + b1->c0min) / 2; - b1->c0max = lb; - b2->c0min = lb+1; - break; - case 1: - lb = (b1->c1max + b1->c1min) / 2; - b1->c1max = lb; - b2->c1min = lb+1; - break; - case 2: - lb = (b1->c2max + b1->c2min) / 2; - b1->c2max = lb; - b2->c2min = lb+1; - break; - } - /* Update stats for boxes */ - update_box(cinfo, b1); - update_box(cinfo, b2); - numboxes++; - } - return numboxes; -} - - -LOCAL(void) -compute_color (j_decompress_ptr cinfo, boxptr boxp, int icolor) -/* Compute representative color for a box, put it in colormap[icolor] */ -{ - /* Current algorithm: mean weighted by pixels (not colors) */ - /* Note it is important to get the rounding correct! */ - my_cquantize_ptr2 cquantize = (my_cquantize_ptr2) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - histptr histp; - int c0,c1,c2; - int c0min,c0max,c1min,c1max,c2min,c2max; - long count; - long total = 0; - long c0total = 0; - long c1total = 0; - long c2total = 0; - - c0min = boxp->c0min; c0max = boxp->c0max; - c1min = boxp->c1min; c1max = boxp->c1max; - c2min = boxp->c2min; c2max = boxp->c2max; - - for (c0 = c0min; c0 <= c0max; c0++) - for (c1 = c1min; c1 <= c1max; c1++) { - histp = & histogram[c0][c1][c2min]; - for (c2 = c2min; c2 <= c2max; c2++) { - if ((count = *histp++) != 0) { - total += count; - c0total += ((c0 << C0_SHIFT) + ((1<>1)) * count; - c1total += ((c1 << C1_SHIFT) + ((1<>1)) * count; - c2total += ((c2 << C2_SHIFT) + ((1<>1)) * count; - } - } - } - - cinfo->colormap[0][icolor] = (JSAMPLE) ((c0total + (total>>1)) / total); - cinfo->colormap[1][icolor] = (JSAMPLE) ((c1total + (total>>1)) / total); - cinfo->colormap[2][icolor] = (JSAMPLE) ((c2total + (total>>1)) / total); -} - - -LOCAL(void) -select_colors (j_decompress_ptr cinfo, int desired_colors) -/* Master routine for color selection */ -{ - boxptr boxlist; - int numboxes; - int i; - - /* Allocate workspace for box list */ - boxlist = (boxptr) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, desired_colors * SIZEOF(box)); - /* Initialize one box containing whole space */ - numboxes = 1; - boxlist[0].c0min = 0; - boxlist[0].c0max = MAXJSAMPLE >> C0_SHIFT; - boxlist[0].c1min = 0; - boxlist[0].c1max = MAXJSAMPLE >> C1_SHIFT; - boxlist[0].c2min = 0; - boxlist[0].c2max = MAXJSAMPLE >> C2_SHIFT; - /* Shrink it to actually-used volume and set its statistics */ - update_box(cinfo, & boxlist[0]); - /* Perform median-cut to produce final box list */ - numboxes = median_cut(cinfo, boxlist, numboxes, desired_colors); - /* Compute the representative color for each box, fill colormap */ - for (i = 0; i < numboxes; i++) - compute_color(cinfo, & boxlist[i], i); - cinfo->actual_number_of_colors = numboxes; - TRACEMS1(cinfo, 1, JTRC_QUANT_SELECTED, numboxes); -} - - -/* - * These routines are concerned with the time-critical task of mapping input - * colors to the nearest color in the selected colormap. - * - * We re-use the histogram space as an "inverse color map", essentially a - * cache for the results of nearest-color searches. All colors within a - * histogram cell will be mapped to the same colormap entry, namely the one - * closest to the cell's center. This may not be quite the closest entry to - * the actual input color, but it's almost as good. A zero in the cache - * indicates we haven't found the nearest color for that cell yet; the array - * is cleared to zeroes before starting the mapping pass. When we find the - * nearest color for a cell, its colormap index plus one is recorded in the - * cache for future use. The pass2 scanning routines call fill_inverse_cmap - * when they need to use an unfilled entry in the cache. - * - * Our method of efficiently finding nearest colors is based on the "locally - * sorted search" idea described by Heckbert and on the incremental distance - * calculation described by Spencer W. Thomas in chapter III.1 of Graphics - * Gems II (James Arvo, ed. Academic Press, 1991). Thomas points out that - * the distances from a given colormap entry to each cell of the histogram can - * be computed quickly using an incremental method: the differences between - * distances to adjacent cells themselves differ by a constant. This allows a - * fairly fast implementation of the "brute force" approach of computing the - * distance from every colormap entry to every histogram cell. Unfortunately, - * it needs a work array to hold the best-distance-so-far for each histogram - * cell (because the inner loop has to be over cells, not colormap entries). - * The work array elements have to be INT32s, so the work array would need - * 256Kb at our recommended precision. This is not feasible in DOS machines. - * - * To get around these problems, we apply Thomas' method to compute the - * nearest colors for only the cells within a small subbox of the histogram. - * The work array need be only as big as the subbox, so the memory usage - * problem is solved. Furthermore, we need not fill subboxes that are never - * referenced in pass2; many images use only part of the color gamut, so a - * fair amount of work is saved. An additional advantage of this - * approach is that we can apply Heckbert's locality criterion to quickly - * eliminate colormap entries that are far away from the subbox; typically - * three-fourths of the colormap entries are rejected by Heckbert's criterion, - * and we need not compute their distances to individual cells in the subbox. - * The speed of this approach is heavily influenced by the subbox size: too - * small means too much overhead, too big loses because Heckbert's criterion - * can't eliminate as many colormap entries. Empirically the best subbox - * size seems to be about 1/512th of the histogram (1/8th in each direction). - * - * Thomas' article also describes a refined method which is asymptotically - * faster than the brute-force method, but it is also far more complex and - * cannot efficiently be applied to small subboxes. It is therefore not - * useful for programs intended to be portable to DOS machines. On machines - * with plenty of memory, filling the whole histogram in one shot with Thomas' - * refined method might be faster than the present code --- but then again, - * it might not be any faster, and it's certainly more complicated. - */ - - -/* log2(histogram cells in update box) for each axis; this can be adjusted */ -#define BOX_C0_LOG (HIST_C0_BITS-3) -#define BOX_C1_LOG (HIST_C1_BITS-3) -#define BOX_C2_LOG (HIST_C2_BITS-3) - -#define BOX_C0_ELEMS (1<actual_number_of_colors; - int maxc0, maxc1, maxc2; - int centerc0, centerc1, centerc2; - int i, x, ncolors; - INT32 minmaxdist, min_dist, max_dist, tdist; - INT32 mindist[MAXNUMCOLORS]; /* min distance to colormap entry i */ - - /* Compute true coordinates of update box's upper corner and center. - * Actually we compute the coordinates of the center of the upper-corner - * histogram cell, which are the upper bounds of the volume we care about. - * Note that since ">>" rounds down, the "center" values may be closer to - * min than to max; hence comparisons to them must be "<=", not "<". - */ - maxc0 = minc0 + ((1 << BOX_C0_SHIFT) - (1 << C0_SHIFT)); - centerc0 = (minc0 + maxc0) >> 1; - maxc1 = minc1 + ((1 << BOX_C1_SHIFT) - (1 << C1_SHIFT)); - centerc1 = (minc1 + maxc1) >> 1; - maxc2 = minc2 + ((1 << BOX_C2_SHIFT) - (1 << C2_SHIFT)); - centerc2 = (minc2 + maxc2) >> 1; - - /* For each color in colormap, find: - * 1. its minimum squared-distance to any point in the update box - * (zero if color is within update box); - * 2. its maximum squared-distance to any point in the update box. - * Both of these can be found by considering only the corners of the box. - * We save the minimum distance for each color in mindist[]; - * only the smallest maximum distance is of interest. - */ - minmaxdist = 0x7FFFFFFFL; - - for (i = 0; i < numcolors; i++) { - /* We compute the squared-c0-distance term, then add in the other two. */ - x = GETJSAMPLE(cinfo->colormap[0][i]); - if (x < minc0) { - tdist = (x - minc0) * C0_SCALE; - min_dist = tdist*tdist; - tdist = (x - maxc0) * C0_SCALE; - max_dist = tdist*tdist; - } else if (x > maxc0) { - tdist = (x - maxc0) * C0_SCALE; - min_dist = tdist*tdist; - tdist = (x - minc0) * C0_SCALE; - max_dist = tdist*tdist; - } else { - /* within cell range so no contribution to min_dist */ - min_dist = 0; - if (x <= centerc0) { - tdist = (x - maxc0) * C0_SCALE; - max_dist = tdist*tdist; - } else { - tdist = (x - minc0) * C0_SCALE; - max_dist = tdist*tdist; - } - } - - x = GETJSAMPLE(cinfo->colormap[1][i]); - if (x < minc1) { - tdist = (x - minc1) * C1_SCALE; - min_dist += tdist*tdist; - tdist = (x - maxc1) * C1_SCALE; - max_dist += tdist*tdist; - } else if (x > maxc1) { - tdist = (x - maxc1) * C1_SCALE; - min_dist += tdist*tdist; - tdist = (x - minc1) * C1_SCALE; - max_dist += tdist*tdist; - } else { - /* within cell range so no contribution to min_dist */ - if (x <= centerc1) { - tdist = (x - maxc1) * C1_SCALE; - max_dist += tdist*tdist; - } else { - tdist = (x - minc1) * C1_SCALE; - max_dist += tdist*tdist; - } - } - - x = GETJSAMPLE(cinfo->colormap[2][i]); - if (x < minc2) { - tdist = (x - minc2) * C2_SCALE; - min_dist += tdist*tdist; - tdist = (x - maxc2) * C2_SCALE; - max_dist += tdist*tdist; - } else if (x > maxc2) { - tdist = (x - maxc2) * C2_SCALE; - min_dist += tdist*tdist; - tdist = (x - minc2) * C2_SCALE; - max_dist += tdist*tdist; - } else { - /* within cell range so no contribution to min_dist */ - if (x <= centerc2) { - tdist = (x - maxc2) * C2_SCALE; - max_dist += tdist*tdist; - } else { - tdist = (x - minc2) * C2_SCALE; - max_dist += tdist*tdist; - } - } - - mindist[i] = min_dist; /* save away the results */ - if (max_dist < minmaxdist) - minmaxdist = max_dist; - } - - /* Now we know that no cell in the update box is more than minmaxdist - * away from some colormap entry. Therefore, only colors that are - * within minmaxdist of some part of the box need be considered. - */ - ncolors = 0; - for (i = 0; i < numcolors; i++) { - if (mindist[i] <= minmaxdist) - colorlist[ncolors++] = (JSAMPLE) i; - } - return ncolors; -} - - -LOCAL(void) -find_best_colors (j_decompress_ptr cinfo, int minc0, int minc1, int minc2, - int numcolors, JSAMPLE colorlist[], JSAMPLE bestcolor[]) -/* Find the closest colormap entry for each cell in the update box, - * given the list of candidate colors prepared by find_nearby_colors. - * Return the indexes of the closest entries in the bestcolor[] array. - * This routine uses Thomas' incremental distance calculation method to - * find the distance from a colormap entry to successive cells in the box. - */ -{ - int ic0, ic1, ic2; - int i, icolor; - INT32 * bptr; /* pointer into bestdist[] array */ - JSAMPLE * cptr; /* pointer into bestcolor[] array */ - INT32 dist0, dist1; /* initial distance values */ - INT32 dist2; /* current distance in inner loop */ - INT32 xx0, xx1; /* distance increments */ - INT32 xx2; - INT32 inc0, inc1, inc2; /* initial values for increments */ - /* This array holds the distance to the nearest-so-far color for each cell */ - INT32 bestdist[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; - - /* Initialize best-distance for each cell of the update box */ - bptr = bestdist; - for (i = BOX_C0_ELEMS*BOX_C1_ELEMS*BOX_C2_ELEMS-1; i >= 0; i--) - *bptr++ = 0x7FFFFFFFL; - - /* For each color selected by find_nearby_colors, - * compute its distance to the center of each cell in the box. - * If that's less than best-so-far, update best distance and color number. - */ - - /* Nominal steps between cell centers ("x" in Thomas article) */ -#define STEP_C0 ((1 << C0_SHIFT) * C0_SCALE) -#define STEP_C1 ((1 << C1_SHIFT) * C1_SCALE) -#define STEP_C2 ((1 << C2_SHIFT) * C2_SCALE) - - for (i = 0; i < numcolors; i++) { - icolor = GETJSAMPLE(colorlist[i]); - /* Compute (square of) distance from minc0/c1/c2 to this color */ - inc0 = (minc0 - GETJSAMPLE(cinfo->colormap[0][icolor])) * C0_SCALE; - dist0 = inc0*inc0; - inc1 = (minc1 - GETJSAMPLE(cinfo->colormap[1][icolor])) * C1_SCALE; - dist0 += inc1*inc1; - inc2 = (minc2 - GETJSAMPLE(cinfo->colormap[2][icolor])) * C2_SCALE; - dist0 += inc2*inc2; - /* Form the initial difference increments */ - inc0 = inc0 * (2 * STEP_C0) + STEP_C0 * STEP_C0; - inc1 = inc1 * (2 * STEP_C1) + STEP_C1 * STEP_C1; - inc2 = inc2 * (2 * STEP_C2) + STEP_C2 * STEP_C2; - /* Now loop over all cells in box, updating distance per Thomas method */ - bptr = bestdist; - cptr = bestcolor; - xx0 = inc0; - for (ic0 = BOX_C0_ELEMS-1; ic0 >= 0; ic0--) { - dist1 = dist0; - xx1 = inc1; - for (ic1 = BOX_C1_ELEMS-1; ic1 >= 0; ic1--) { - dist2 = dist1; - xx2 = inc2; - for (ic2 = BOX_C2_ELEMS-1; ic2 >= 0; ic2--) { - if (dist2 < *bptr) { - *bptr = dist2; - *cptr = (JSAMPLE) icolor; - } - dist2 += xx2; - xx2 += 2 * STEP_C2 * STEP_C2; - bptr++; - cptr++; - } - dist1 += xx1; - xx1 += 2 * STEP_C1 * STEP_C1; - } - dist0 += xx0; - xx0 += 2 * STEP_C0 * STEP_C0; - } - } -} - - -LOCAL(void) -fill_inverse_cmap (j_decompress_ptr cinfo, int c0, int c1, int c2) -/* Fill the inverse-colormap entries in the update box that contains */ -/* histogram cell c0/c1/c2. (Only that one cell MUST be filled, but */ -/* we can fill as many others as we wish.) */ -{ - my_cquantize_ptr2 cquantize = (my_cquantize_ptr2) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - int minc0, minc1, minc2; /* lower left corner of update box */ - int ic0, ic1, ic2; - JSAMPLE * cptr; /* pointer into bestcolor[] array */ - histptr cachep; /* pointer into main cache array */ - /* This array lists the candidate colormap indexes. */ - JSAMPLE colorlist[MAXNUMCOLORS]; - int numcolors; /* number of candidate colors */ - /* This array holds the actually closest colormap index for each cell. */ - JSAMPLE bestcolor[BOX_C0_ELEMS * BOX_C1_ELEMS * BOX_C2_ELEMS]; - - /* Convert cell coordinates to update box ID */ - c0 >>= BOX_C0_LOG; - c1 >>= BOX_C1_LOG; - c2 >>= BOX_C2_LOG; - - /* Compute true coordinates of update box's origin corner. - * Actually we compute the coordinates of the center of the corner - * histogram cell, which are the lower bounds of the volume we care about. - */ - minc0 = (c0 << BOX_C0_SHIFT) + ((1 << C0_SHIFT) >> 1); - minc1 = (c1 << BOX_C1_SHIFT) + ((1 << C1_SHIFT) >> 1); - minc2 = (c2 << BOX_C2_SHIFT) + ((1 << C2_SHIFT) >> 1); - - /* Determine which colormap entries are close enough to be candidates - * for the nearest entry to some cell in the update box. - */ - numcolors = find_nearby_colors(cinfo, minc0, minc1, minc2, colorlist); - - /* Determine the actually nearest colors. */ - find_best_colors(cinfo, minc0, minc1, minc2, numcolors, colorlist, - bestcolor); - - /* Save the best color numbers (plus 1) in the main cache array */ - c0 <<= BOX_C0_LOG; /* convert ID back to base cell indexes */ - c1 <<= BOX_C1_LOG; - c2 <<= BOX_C2_LOG; - cptr = bestcolor; - for (ic0 = 0; ic0 < BOX_C0_ELEMS; ic0++) { - for (ic1 = 0; ic1 < BOX_C1_ELEMS; ic1++) { - cachep = & histogram[c0+ic0][c1+ic1][c2]; - for (ic2 = 0; ic2 < BOX_C2_ELEMS; ic2++) { - *cachep++ = (histcell) (GETJSAMPLE(*cptr++) + 1); - } - } - } -} - - -/* - * Map some rows of pixels to the output colormapped representation. - */ - -METHODDEF(void) -pass2_no_dither (j_decompress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) -/* This version performs no dithering */ -{ - my_cquantize_ptr2 cquantize = (my_cquantize_ptr2) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - JSAMPROW inptr, outptr; - histptr cachep; - int c0, c1, c2; - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - - for (row = 0; row < num_rows; row++) { - inptr = input_buf[row]; - outptr = output_buf[row]; - for (col = width; col > 0; col--) { - /* get pixel value and index into the cache */ - c0 = GETJSAMPLE(*inptr++) >> C0_SHIFT; - c1 = GETJSAMPLE(*inptr++) >> C1_SHIFT; - c2 = GETJSAMPLE(*inptr++) >> C2_SHIFT; - cachep = & histogram[c0][c1][c2]; - /* If we have not seen this color before, find nearest colormap entry */ - /* and update the cache */ - if (*cachep == 0) - fill_inverse_cmap(cinfo, c0,c1,c2); - /* Now emit the colormap index for this cell */ - *outptr++ = (JSAMPLE) (*cachep - 1); - } - } -} - - -METHODDEF(void) -pass2_fs_dither (j_decompress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPARRAY output_buf, int num_rows) -/* This version performs Floyd-Steinberg dithering */ -{ - my_cquantize_ptr2 cquantize = (my_cquantize_ptr2) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - LOCFSERROR cur0, cur1, cur2; /* current error or pixel value */ - LOCFSERROR belowerr0, belowerr1, belowerr2; /* error for pixel below cur */ - LOCFSERROR bpreverr0, bpreverr1, bpreverr2; /* error for below/prev col */ - FSERRPTR errorptr; /* => fserrors[] at column before current */ - JSAMPROW inptr; /* => current input pixel */ - JSAMPROW outptr; /* => current output pixel */ - histptr cachep; - int dir; /* +1 or -1 depending on direction */ - int dir3; /* 3*dir, for advancing inptr & errorptr */ - int row; - JDIMENSION col; - JDIMENSION width = cinfo->output_width; - JSAMPLE *range_limit = cinfo->sample_range_limit; - int *error_limit = cquantize->error_limiter; - JSAMPROW colormap0 = cinfo->colormap[0]; - JSAMPROW colormap1 = cinfo->colormap[1]; - JSAMPROW colormap2 = cinfo->colormap[2]; - SHIFT_TEMPS - - for (row = 0; row < num_rows; row++) { - inptr = input_buf[row]; - outptr = output_buf[row]; - if (cquantize->on_odd_row) { - /* work right to left in this row */ - inptr += (width-1) * 3; /* so point to rightmost pixel */ - outptr += width-1; - dir = -1; - dir3 = -3; - errorptr = cquantize->fserrors + (width+1)*3; /* => entry after last column */ - cquantize->on_odd_row = FALSE; /* flip for next time */ - } else { - /* work left to right in this row */ - dir = 1; - dir3 = 3; - errorptr = cquantize->fserrors; /* => entry before first real column */ - cquantize->on_odd_row = TRUE; /* flip for next time */ - } - /* Preset error values: no error propagated to first pixel from left */ - cur0 = cur1 = cur2 = 0; - /* and no error propagated to row below yet */ - belowerr0 = belowerr1 = belowerr2 = 0; - bpreverr0 = bpreverr1 = bpreverr2 = 0; - - for (col = width; col > 0; col--) { - /* curN holds the error propagated from the previous pixel on the - * current line. Add the error propagated from the previous line - * to form the complete error correction term for this pixel, and - * round the error term (which is expressed * 16) to an integer. - * RIGHT_SHIFT rounds towards minus infinity, so adding 8 is correct - * for either sign of the error value. - * Note: errorptr points to *previous* column's array entry. - */ - cur0 = RIGHT_SHIFT(cur0 + errorptr[dir3+0] + 8, 4); - cur1 = RIGHT_SHIFT(cur1 + errorptr[dir3+1] + 8, 4); - cur2 = RIGHT_SHIFT(cur2 + errorptr[dir3+2] + 8, 4); - /* Limit the error using transfer function set by init_error_limit. - * See comments with init_error_limit for rationale. - */ - cur0 = error_limit[cur0]; - cur1 = error_limit[cur1]; - cur2 = error_limit[cur2]; - /* Form pixel value + error, and range-limit to 0..MAXJSAMPLE. - * The maximum error is +- MAXJSAMPLE (or less with error limiting); - * this sets the required size of the range_limit array. - */ - cur0 += GETJSAMPLE(inptr[0]); - cur1 += GETJSAMPLE(inptr[1]); - cur2 += GETJSAMPLE(inptr[2]); - cur0 = GETJSAMPLE(range_limit[cur0]); - cur1 = GETJSAMPLE(range_limit[cur1]); - cur2 = GETJSAMPLE(range_limit[cur2]); - /* Index into the cache with adjusted pixel value */ - cachep = & histogram[cur0>>C0_SHIFT][cur1>>C1_SHIFT][cur2>>C2_SHIFT]; - /* If we have not seen this color before, find nearest colormap */ - /* entry and update the cache */ - if (*cachep == 0) - fill_inverse_cmap(cinfo, cur0>>C0_SHIFT,cur1>>C1_SHIFT,cur2>>C2_SHIFT); - /* Now emit the colormap index for this cell */ - { int pixcode = *cachep - 1; - *outptr = (JSAMPLE) pixcode; - /* Compute representation error for this pixel */ - cur0 -= GETJSAMPLE(colormap0[pixcode]); - cur1 -= GETJSAMPLE(colormap1[pixcode]); - cur2 -= GETJSAMPLE(colormap2[pixcode]); - } - /* Compute error fractions to be propagated to adjacent pixels. - * Add these into the running sums, and simultaneously shift the - * next-line error sums left by 1 column. - */ - { LOCFSERROR bnexterr, delta; - - bnexterr = cur0; /* Process component 0 */ - delta = cur0 * 2; - cur0 += delta; /* form error * 3 */ - errorptr[0] = (FSERROR) (bpreverr0 + cur0); - cur0 += delta; /* form error * 5 */ - bpreverr0 = belowerr0 + cur0; - belowerr0 = bnexterr; - cur0 += delta; /* form error * 7 */ - bnexterr = cur1; /* Process component 1 */ - delta = cur1 * 2; - cur1 += delta; /* form error * 3 */ - errorptr[1] = (FSERROR) (bpreverr1 + cur1); - cur1 += delta; /* form error * 5 */ - bpreverr1 = belowerr1 + cur1; - belowerr1 = bnexterr; - cur1 += delta; /* form error * 7 */ - bnexterr = cur2; /* Process component 2 */ - delta = cur2 * 2; - cur2 += delta; /* form error * 3 */ - errorptr[2] = (FSERROR) (bpreverr2 + cur2); - cur2 += delta; /* form error * 5 */ - bpreverr2 = belowerr2 + cur2; - belowerr2 = bnexterr; - cur2 += delta; /* form error * 7 */ - } - /* At this point curN contains the 7/16 error value to be propagated - * to the next pixel on the current line, and all the errors for the - * next line have been shifted over. We are therefore ready to move on. - */ - inptr += dir3; /* Advance pixel pointers to next column */ - outptr += dir; - errorptr += dir3; /* advance errorptr to current column */ - } - /* Post-loop cleanup: we must unload the final error values into the - * final fserrors[] entry. Note we need not unload belowerrN because - * it is for the dummy column before or after the actual array. - */ - errorptr[0] = (FSERROR) bpreverr0; /* unload prev errs into array */ - errorptr[1] = (FSERROR) bpreverr1; - errorptr[2] = (FSERROR) bpreverr2; - } -} - - -/* - * Initialize the error-limiting transfer function (lookup table). - * The raw F-S error computation can potentially compute error values of up to - * +- MAXJSAMPLE. But we want the maximum correction applied to a pixel to be - * much less, otherwise obviously wrong pixels will be created. (Typical - * effects include weird fringes at color-area boundaries, isolated bright - * pixels in a dark area, etc.) The standard advice for avoiding this problem - * is to ensure that the "corners" of the color cube are allocated as output - * colors; then repeated errors in the same direction cannot cause cascading - * error buildup. However, that only prevents the error from getting - * completely out of hand; Aaron Giles reports that error limiting improves - * the results even with corner colors allocated. - * A simple clamping of the error values to about +- MAXJSAMPLE/8 works pretty - * well, but the smoother transfer function used below is even better. Thanks - * to Aaron Giles for this idea. - */ - -LOCAL(void) -init_error_limit (j_decompress_ptr cinfo) -/* Allocate and fill in the error_limiter table */ -{ - my_cquantize_ptr2 cquantize = (my_cquantize_ptr2) cinfo->cquantize; - int * table; - int in, out; - - table = (int *) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, (MAXJSAMPLE*2+1) * SIZEOF(int)); - table += MAXJSAMPLE; /* so can index -MAXJSAMPLE .. +MAXJSAMPLE */ - cquantize->error_limiter = table; - -#define STEPSIZE ((MAXJSAMPLE+1)/16) - /* Map errors 1:1 up to +- MAXJSAMPLE/16 */ - out = 0; - for (in = 0; in < STEPSIZE; in++, out++) { - table[in] = out; table[-in] = -out; - } - /* Map errors 1:2 up to +- 3*MAXJSAMPLE/16 */ - for (; in < STEPSIZE*3; in++, out += (in&1) ? 0 : 1) { - table[in] = out; table[-in] = -out; - } - /* Clamp the rest to final out value (which is (MAXJSAMPLE+1)/8) */ - for (; in <= MAXJSAMPLE; in++) { - table[in] = out; table[-in] = -out; - } -#undef STEPSIZE -} - - -/* - * Finish up at the end of each pass. - */ - -METHODDEF(void) -finish_pass1 (j_decompress_ptr cinfo) -{ - my_cquantize_ptr2 cquantize = (my_cquantize_ptr2) cinfo->cquantize; - - /* Select the representative colors and fill in cinfo->colormap */ - cinfo->colormap = cquantize->sv_colormap; - select_colors(cinfo, cquantize->desired); - /* Force next pass to zero the color index table */ - cquantize->needs_zeroed = TRUE; -} - - -METHODDEF(void) -finish_pass2 (j_decompress_ptr) -{ - /* no work */ -} - - -/* - * Initialize for each processing pass. - */ - -METHODDEF(void) -start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan) -{ - my_cquantize_ptr2 cquantize = (my_cquantize_ptr2) cinfo->cquantize; - hist3d histogram = cquantize->histogram; - int i; - - /* Only F-S dithering or no dithering is supported. */ - /* If user asks for ordered dither, give him F-S. */ - if (cinfo->dither_mode != JDITHER_NONE) - cinfo->dither_mode = JDITHER_FS; - - if (is_pre_scan) { - /* Set up method pointers */ - cquantize->pub.color_quantize = prescan_quantize; - cquantize->pub.finish_pass = finish_pass1; - cquantize->needs_zeroed = TRUE; /* Always zero histogram */ - } else { - /* Set up method pointers */ - if (cinfo->dither_mode == JDITHER_FS) - cquantize->pub.color_quantize = pass2_fs_dither; - else - cquantize->pub.color_quantize = pass2_no_dither; - cquantize->pub.finish_pass = finish_pass2; - - /* Make sure color count is acceptable */ - i = cinfo->actual_number_of_colors; - if (i < 1) - ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 1); - if (i > MAXNUMCOLORS) - ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); - - if (cinfo->dither_mode == JDITHER_FS) { - size_t arraysize = (size_t) ((cinfo->output_width + 2) * - (3 * SIZEOF(FSERROR))); - /* Allocate Floyd-Steinberg workspace if we didn't already. */ - if (cquantize->fserrors == NULL) - cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); - /* Initialize the propagated errors to zero. */ - jzero_far((void FAR *) cquantize->fserrors, arraysize); - /* Make the error-limit table if we didn't already. */ - if (cquantize->error_limiter == NULL) - init_error_limit(cinfo); - cquantize->on_odd_row = FALSE; - } - - } - /* Zero the histogram or inverse color map, if necessary */ - if (cquantize->needs_zeroed) { - for (i = 0; i < HIST_C0_ELEMS; i++) { - jzero_far((void FAR *) histogram[i], - HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); - } - cquantize->needs_zeroed = FALSE; - } -} - - -/* - * Switch to a new external colormap between output passes. - */ - -METHODDEF(void) -new_color_map_2_quant (j_decompress_ptr cinfo) -{ - my_cquantize_ptr2 cquantize = (my_cquantize_ptr2) cinfo->cquantize; - - /* Reset the inverse color map */ - cquantize->needs_zeroed = TRUE; -} - - -/* - * Module initialization routine for 2-pass color quantization. - */ - -GLOBAL(void) -jinit_2pass_quantizer (j_decompress_ptr cinfo) -{ - my_cquantize_ptr2 cquantize; - int i; - - cquantize = (my_cquantize_ptr2) - (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, - SIZEOF(my_cquantizer2)); - cinfo->cquantize = (struct jpeg_color_quantizer *) cquantize; - cquantize->pub.start_pass = start_pass_2_quant; - cquantize->pub.new_color_map = new_color_map_2_quant; - cquantize->fserrors = NULL; /* flag optional arrays not allocated */ - cquantize->error_limiter = NULL; - - /* Make sure jdmaster didn't give me a case I can't handle */ - if (cinfo->out_color_components != 3) - ERREXIT(cinfo, JERR_NOTIMPL); - - /* Allocate the histogram/inverse colormap storage */ - cquantize->histogram = (hist3d) (*cinfo->mem->alloc_small) - ((j_common_ptr) cinfo, JPOOL_IMAGE, HIST_C0_ELEMS * SIZEOF(hist2d)); - for (i = 0; i < HIST_C0_ELEMS; i++) { - cquantize->histogram[i] = (hist2d) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); - } - cquantize->needs_zeroed = TRUE; /* histogram is garbage now */ - - /* Allocate storage for the completed colormap, if required. - * We do this now since it is FAR storage and may affect - * the memory manager's space calculations. - */ - if (cinfo->enable_2pass_quant) { - /* Make sure color count is acceptable */ - int desired = cinfo->desired_number_of_colors; - /* Lower bound on # of colors ... somewhat arbitrary as long as > 0 */ - if (desired < 8) - ERREXIT1(cinfo, JERR_QUANT_FEW_COLORS, 8); - /* Make sure colormap indexes can be represented by JSAMPLEs */ - if (desired > MAXNUMCOLORS) - ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, MAXNUMCOLORS); - cquantize->sv_colormap = (*cinfo->mem->alloc_sarray) - ((j_common_ptr) cinfo,JPOOL_IMAGE, (JDIMENSION) desired, (JDIMENSION) 3); - cquantize->desired = desired; - } else - cquantize->sv_colormap = NULL; - - /* Only F-S dithering or no dithering is supported. */ - /* If user asks for ordered dither, give him F-S. */ - if (cinfo->dither_mode != JDITHER_NONE) - cinfo->dither_mode = JDITHER_FS; - - /* Allocate Floyd-Steinberg workspace if necessary. - * This isn't really needed until pass 2, but again it is FAR storage. - * Although we will cope with a later change in dither_mode, - * we do not promise to honor max_memory_to_use if dither_mode changes. - */ - if (cinfo->dither_mode == JDITHER_FS) { - cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) - ((j_common_ptr) cinfo, JPOOL_IMAGE, - (size_t) ((cinfo->output_width + 2) * (3 * SIZEOF(FSERROR)))); - /* Might as well create the error-limiting table too. */ - init_error_limit(cinfo); - } -} - -#endif /* QUANT_2PASS_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jutils.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jutils.c deleted file mode 100755 index 68a8083..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jutils.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * jutils.c - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains tables and miscellaneous utility routines needed - * for both compression and decompression. - * Note we prefix all global names with "j" to minimize conflicts with - * a surrounding application. - */ - -#define JPEG_INTERNALS -#include "jinclude.h" -#include "jpeglib.h" - - -/* - * jpeg_zigzag_order[i] is the zigzag-order position of the i'th element - * of a DCT block read in natural order (left to right, top to bottom). - */ - -#if 0 /* This table is not actually needed in v6a */ - -const int jpeg_zigzag_order[DCTSIZE2] = { - 0, 1, 5, 6, 14, 15, 27, 28, - 2, 4, 7, 13, 16, 26, 29, 42, - 3, 8, 12, 17, 25, 30, 41, 43, - 9, 11, 18, 24, 31, 40, 44, 53, - 10, 19, 23, 32, 39, 45, 52, 54, - 20, 22, 33, 38, 46, 51, 55, 60, - 21, 34, 37, 47, 50, 56, 59, 61, - 35, 36, 48, 49, 57, 58, 62, 63 -}; - -#endif - -/* - * jpeg_natural_order[i] is the natural-order position of the i'th element - * of zigzag order. - * - * When reading corrupted data, the Huffman decoders could attempt - * to reference an entry beyond the end of this array (if the decoded - * zero run length reaches past the end of the block). To prevent - * wild stores without adding an inner-loop test, we put some extra - * "63"s after the real entries. This will cause the extra coefficient - * to be stored in location 63 of the block, not somewhere random. - * The worst case would be a run-length of 15, which means we need 16 - * fake entries. - */ - -const int jpeg_natural_order[DCTSIZE2+16] = { - 0, 1, 8, 16, 9, 2, 3, 10, - 17, 24, 32, 25, 18, 11, 4, 5, - 12, 19, 26, 33, 40, 48, 41, 34, - 27, 20, 13, 6, 7, 14, 21, 28, - 35, 42, 49, 56, 57, 50, 43, 36, - 29, 22, 15, 23, 30, 37, 44, 51, - 58, 59, 52, 45, 38, 31, 39, 46, - 53, 60, 61, 54, 47, 55, 62, 63, - 63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */ - 63, 63, 63, 63, 63, 63, 63, 63 -}; - - -/* - * Arithmetic utilities - */ - -GLOBAL(long) -jdiv_round_up (long a, long b) -/* Compute a/b rounded up to next integer, ie, ceil(a/b) */ -/* Assumes a >= 0, b > 0 */ -{ - return (a + b - 1L) / b; -} - - -GLOBAL(long) -jround_up (long a, long b) -/* Compute a rounded up to next multiple of b, ie, ceil(a/b)*b */ -/* Assumes a >= 0, b > 0 */ -{ - a += b - 1L; - return a - (a % b); -} - - -/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays - * and coefficient-block arrays. This won't work on 80x86 because the arrays - * are FAR and we're assuming a small-pointer memory model. However, some - * DOS compilers provide far-pointer versions of memcpy() and memset() even - * in the small-model libraries. These will be used if USE_FMEM is defined. - * Otherwise, the routines below do it the hard way. (The performance cost - * is not all that great, because these routines aren't very heavily used.) - */ - -#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ -#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) -#define FMEMZERO(target,size) MEMZERO(target,size) -#else /* 80x86 case, define if we can */ -#ifdef USE_FMEM -#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size)) -#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size)) -#endif -#endif - - -GLOBAL(void) -jcopy_sample_rows (JSAMPARRAY input_array, int source_row, - JSAMPARRAY output_array, int dest_row, - int num_rows, JDIMENSION num_cols) -/* Copy some rows of samples from one place to another. - * num_rows rows are copied from input_array[source_row++] - * to output_array[dest_row++]; these areas may overlap for duplication. - * The source and destination arrays must be at least as wide as num_cols. - */ -{ - JSAMPROW inptr, outptr; -#ifdef FMEMCOPY - size_t count = (size_t) (num_cols * SIZEOF(JSAMPLE)); -#else - JDIMENSION count; -#endif - int row; - - input_array += source_row; - output_array += dest_row; - - for (row = num_rows; row > 0; row--) { - inptr = *input_array++; - outptr = *output_array++; -#ifdef FMEMCOPY - FMEMCOPY(outptr, inptr, count); -#else - for (count = num_cols; count > 0; count--) - *outptr++ = *inptr++; /* needn't bother with GETJSAMPLE() here */ -#endif - } -} - - -GLOBAL(void) -jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row, - JDIMENSION num_blocks) -/* Copy a row of coefficient blocks from one place to another. */ -{ -#ifdef FMEMCOPY - FMEMCOPY(output_row, input_row, num_blocks * (DCTSIZE2 * SIZEOF(JCOEF))); -#else - JCOEFPTR inptr, outptr; - long count; - - inptr = (JCOEFPTR) input_row; - outptr = (JCOEFPTR) output_row; - for (count = (long) num_blocks * DCTSIZE2; count > 0; count--) { - *outptr++ = *inptr++; - } -#endif -} - - -GLOBAL(void) -jzero_far (void FAR * target, size_t bytestozero) -/* Zero out a chunk of FAR memory. */ -/* This might be sample-array data, block-array data, or alloc_large data. */ -{ -#ifdef FMEMZERO - FMEMZERO(target, bytestozero); -#else - char FAR * ptr = (char FAR *) target; - size_t count; - - for (count = bytestozero; count > 0; count--) { - *ptr++ = 0; - } -#endif -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jversion.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jversion.h deleted file mode 100755 index dadd453..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/jversion.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * jversion.h - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains software version identification. - */ - - -#define JVERSION "6b 27-Mar-1998" - -#define JCOPYRIGHT "Copyright (C) 1998, Thomas G. Lane" diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.c b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.c deleted file mode 100755 index 35e293e..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.c +++ /dev/null @@ -1,928 +0,0 @@ -/* - * transupp.c - * - * Copyright (C) 1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains image transformation routines and other utility code - * used by the jpegtran sample application. These are NOT part of the core - * JPEG library. But we keep these routines separate from jpegtran.c to - * ease the task of maintaining jpegtran-like programs that have other user - * interfaces. - */ - -/* Although this file really shouldn't have access to the library internals, - * it's helpful to let it call jround_up() and jcopy_block_row(). - */ -#define JPEG_INTERNALS - -#include "jinclude.h" -#include "jpeglib.h" -#include "transupp.h" /* My own external interface */ - - -#if TRANSFORMS_SUPPORTED - -/* - * Lossless image transformation routines. These routines work on DCT - * coefficient arrays and thus do not require any lossy decompression - * or recompression of the image. - * Thanks to Guido Vollbeding for the initial design and code of this feature. - * - * Horizontal flipping is done in-place, using a single top-to-bottom - * pass through the virtual source array. It will thus be much the - * fastest option for images larger than main memory. - * - * The other routines require a set of destination virtual arrays, so they - * need twice as much memory as jpegtran normally does. The destination - * arrays are always written in normal scan order (top to bottom) because - * the virtual array manager expects this. The source arrays will be scanned - * in the corresponding order, which means multiple passes through the source - * arrays for most of the transforms. That could result in much thrashing - * if the image is larger than main memory. - * - * Some notes about the operating environment of the individual transform - * routines: - * 1. Both the source and destination virtual arrays are allocated from the - * source JPEG object, and therefore should be manipulated by calling the - * source's memory manager. - * 2. The destination's component count should be used. It may be smaller - * than the source's when forcing to grayscale. - * 3. Likewise the destination's sampling factors should be used. When - * forcing to grayscale the destination's sampling factors will be all 1, - * and we may as well take that as the effective iMCU size. - * 4. When "trim" is in effect, the destination's dimensions will be the - * trimmed values but the source's will be untrimmed. - * 5. All the routines assume that the source and destination buffers are - * padded out to a full iMCU boundary. This is true, although for the - * source buffer it is an undocumented property of jdcoefct.c. - * Notes 2,3,4 boil down to this: generally we should use the destination's - * dimensions and ignore the source's. - */ - - -LOCAL(void) -do_flip_h (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays) -/* Horizontal flip; done in-place, so no separate dest array is required */ -{ - JDIMENSION MCU_cols, comp_width, blk_x, blk_y; - int ci, k, offset_y; - JBLOCKARRAY buffer; - JCOEFPTR ptr1, ptr2; - JCOEF temp1, temp2; - jpeg_component_info *compptr; - - /* Horizontal mirroring of DCT blocks is accomplished by swapping - * pairs of blocks in-place. Within a DCT block, we perform horizontal - * mirroring by changing the signs of odd-numbered columns. - * Partial iMCUs at the right edge are left untouched. - */ - MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - for (blk_y = 0; blk_y < compptr->height_in_blocks; - blk_y += compptr->v_samp_factor) { - buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (blk_x = 0; blk_x * 2 < comp_width; blk_x++) { - ptr1 = buffer[offset_y][blk_x]; - ptr2 = buffer[offset_y][comp_width - blk_x - 1]; - /* this unrolled loop doesn't need to know which row it's on... */ - for (k = 0; k < DCTSIZE2; k += 2) { - temp1 = *ptr1; /* swap even column */ - temp2 = *ptr2; - *ptr1++ = temp2; - *ptr2++ = temp1; - temp1 = *ptr1; /* swap odd column with sign change */ - temp2 = *ptr2; - *ptr1++ = -temp2; - *ptr2++ = -temp1; - } - } - } - } - } -} - - -LOCAL(void) -do_flip_v (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Vertical flip */ -{ - JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y; - int ci, i, j, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JBLOCKROW src_row_ptr, dst_row_ptr; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* We output into a separate array because we can't touch different - * rows of the source virtual array simultaneously. Otherwise, this - * is a pretty straightforward analog of horizontal flip. - * Within a DCT block, vertical mirroring is done by changing the signs - * of odd-numbered rows. - * Partial iMCUs at the bottom edge are copied verbatim. - */ - MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_height = MCU_rows * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - if (dst_blk_y < comp_height) { - /* Row is within the mirrorable area. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - comp_height - dst_blk_y - (JDIMENSION) compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } else { - /* Bottom-edge blocks will be copied verbatim. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - if (dst_blk_y < comp_height) { - /* Row is within the mirrorable area. */ - dst_row_ptr = dst_buffer[offset_y]; - src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1]; - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x++) { - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[dst_blk_x]; - for (i = 0; i < DCTSIZE; i += 2) { - /* copy even row */ - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = *src_ptr++; - /* copy odd row with sign change */ - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = - *src_ptr++; - } - } - } else { - /* Just copy row verbatim. */ - jcopy_block_row(src_buffer[offset_y], dst_buffer[offset_y], - compptr->width_in_blocks); - } - } - } - } -} - - -LOCAL(void) -do_transpose (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Transpose source into destination */ -{ - JDIMENSION dst_blk_x, dst_blk_y; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Transposing pixels within a block just requires transposing the - * DCT coefficients. - * Partial iMCUs at the edges require no special treatment; we simply - * process all the available DCT blocks for every component. - */ - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x, - (JDIMENSION) compptr->h_samp_factor, FALSE); - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - src_ptr = src_buffer[offset_x][dst_blk_y + offset_y]; - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } -} - - -LOCAL(void) -do_rot_90 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* 90 degree rotation is equivalent to - * 1. Transposing the image; - * 2. Horizontal mirroring. - * These two steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Because of the horizontal mirror step, we can't process partial iMCUs - * at the (output) right edge properly. They just get transposed and - * not mirrored. - */ - MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x, - (JDIMENSION) compptr->h_samp_factor, FALSE); - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - src_ptr = src_buffer[offset_x][dst_blk_y + offset_y]; - if (dst_blk_x < comp_width) { - /* Block is within the mirrorable area. */ - dst_ptr = dst_buffer[offset_y] - [comp_width - dst_blk_x - offset_x - 1]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - i++; - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } else { - /* Edge blocks are transposed but not mirrored. */ - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } - } -} - - -LOCAL(void) -do_rot_270 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* 270 degree rotation is equivalent to - * 1. Horizontal mirroring; - * 2. Transposing the image. - * These two steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - /* Because of the horizontal mirror step, we can't process partial iMCUs - * at the (output) bottom edge properly. They just get transposed and - * not mirrored. - */ - MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_height = MCU_rows * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x, - (JDIMENSION) compptr->h_samp_factor, FALSE); - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - if (dst_blk_y < comp_height) { - /* Block is within the mirrorable area. */ - src_ptr = src_buffer[offset_x] - [comp_height - dst_blk_y - offset_y - 1]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } - } else { - /* Edge blocks are transposed but not mirrored. */ - src_ptr = src_buffer[offset_x][dst_blk_y + offset_y]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } - } -} - - -LOCAL(void) -do_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* 180 degree rotation is equivalent to - * 1. Vertical mirroring; - * 2. Horizontal mirroring. - * These two steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y; - int ci, i, j, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JBLOCKROW src_row_ptr, dst_row_ptr; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); - MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - comp_height = MCU_rows * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - if (dst_blk_y < comp_height) { - /* Row is within the vertically mirrorable area. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], - comp_height - dst_blk_y - (JDIMENSION) compptr->v_samp_factor, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } else { - /* Bottom-edge rows are only mirrored horizontally. */ - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, FALSE); - } - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - if (dst_blk_y < comp_height) { - /* Row is within the mirrorable area. */ - dst_row_ptr = dst_buffer[offset_y]; - src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1]; - /* Process the blocks that can be mirrored both ways. */ - for (dst_blk_x = 0; dst_blk_x < comp_width; dst_blk_x++) { - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[comp_width - dst_blk_x - 1]; - for (i = 0; i < DCTSIZE; i += 2) { - /* For even row, negate every odd column. */ - for (j = 0; j < DCTSIZE; j += 2) { - *dst_ptr++ = *src_ptr++; - *dst_ptr++ = - *src_ptr++; - } - /* For odd row, negate every even column. */ - for (j = 0; j < DCTSIZE; j += 2) { - *dst_ptr++ = - *src_ptr++; - *dst_ptr++ = *src_ptr++; - } - } - } - /* Any remaining right-edge blocks are only mirrored vertically. */ - for (; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[dst_blk_x]; - for (i = 0; i < DCTSIZE; i += 2) { - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = *src_ptr++; - for (j = 0; j < DCTSIZE; j++) - *dst_ptr++ = - *src_ptr++; - } - } - } else { - /* Remaining rows are just mirrored horizontally. */ - dst_row_ptr = dst_buffer[offset_y]; - src_row_ptr = src_buffer[offset_y]; - /* Process the blocks that can be mirrored. */ - for (dst_blk_x = 0; dst_blk_x < comp_width; dst_blk_x++) { - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[comp_width - dst_blk_x - 1]; - for (i = 0; i < DCTSIZE2; i += 2) { - *dst_ptr++ = *src_ptr++; - *dst_ptr++ = - *src_ptr++; - } - } - /* Any remaining right-edge blocks are only copied. */ - for (; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) { - dst_ptr = dst_row_ptr[dst_blk_x]; - src_ptr = src_row_ptr[dst_blk_x]; - for (i = 0; i < DCTSIZE2; i++) - *dst_ptr++ = *src_ptr++; - } - } - } - } - } -} - - -LOCAL(void) -do_transverse (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jvirt_barray_ptr *dst_coef_arrays) -/* Transverse transpose is equivalent to - * 1. 180 degree rotation; - * 2. Transposition; - * or - * 1. Horizontal mirroring; - * 2. Transposition; - * 3. Horizontal mirroring. - * These steps are merged into a single processing routine. - */ -{ - JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y; - int ci, i, j, offset_x, offset_y; - JBLOCKARRAY src_buffer, dst_buffer; - JCOEFPTR src_ptr, dst_ptr; - jpeg_component_info *compptr; - - MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); - MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); - - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - comp_width = MCU_cols * compptr->h_samp_factor; - comp_height = MCU_rows * compptr->v_samp_factor; - for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks; - dst_blk_y += compptr->v_samp_factor) { - dst_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y, - (JDIMENSION) compptr->v_samp_factor, TRUE); - for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) { - for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; - dst_blk_x += compptr->h_samp_factor) { - src_buffer = (*srcinfo->mem->access_virt_barray) - ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x, - (JDIMENSION) compptr->h_samp_factor, FALSE); - for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) { - if (dst_blk_y < comp_height) { - src_ptr = src_buffer[offset_x] - [comp_height - dst_blk_y - offset_y - 1]; - if (dst_blk_x < comp_width) { - /* Block is within the mirrorable area. */ - dst_ptr = dst_buffer[offset_y] - [comp_width - dst_blk_x - offset_x - 1]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - i++; - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } else { - /* Right-edge blocks are mirrored in y only */ - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) { - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - j++; - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } - } - } else { - src_ptr = src_buffer[offset_x][dst_blk_y + offset_y]; - if (dst_blk_x < comp_width) { - /* Bottom-edge blocks are mirrored in x only */ - dst_ptr = dst_buffer[offset_y] - [comp_width - dst_blk_x - offset_x - 1]; - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - i++; - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = -src_ptr[i*DCTSIZE+j]; - } - } else { - /* At lower right corner, just transpose, no mirroring */ - dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x]; - for (i = 0; i < DCTSIZE; i++) - for (j = 0; j < DCTSIZE; j++) - dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j]; - } - } - } - } - } - } - } -} - - -/* Request any required workspace. - * - * We allocate the workspace virtual arrays from the source decompression - * object, so that all the arrays (both the original data and the workspace) - * will be taken into account while making memory management decisions. - * Hence, this routine must be called after jpeg_read_header (which reads - * the image dimensions) and before jpeg_read_coefficients (which realizes - * the source's virtual arrays). - */ - -GLOBAL(void) -jtransform_request_workspace (j_decompress_ptr srcinfo, - jpeg_transform_info *info) -{ - jvirt_barray_ptr *coef_arrays = NULL; - jpeg_component_info *compptr; - int ci; - - if (info->force_grayscale && - srcinfo->jpeg_color_space == JCS_YCbCr && - srcinfo->num_components == 3) { - /* We'll only process the first component */ - info->num_components = 1; - } else { - /* Process all the components */ - info->num_components = srcinfo->num_components; - } - - switch (info->transform) { - case JXFORM_NONE: - case JXFORM_FLIP_H: - /* Don't need a workspace array */ - break; - case JXFORM_FLIP_V: - case JXFORM_ROT_180: - /* Need workspace arrays having same dimensions as source image. - * Note that we allocate arrays padded out to the next iMCU boundary, - * so that transform routines need not worry about missing edge blocks. - */ - coef_arrays = (jvirt_barray_ptr *) - (*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE, - SIZEOF(jvirt_barray_ptr) * info->num_components); - for (ci = 0; ci < info->num_components; ci++) { - compptr = srcinfo->comp_info + ci; - coef_arrays[ci] = (*srcinfo->mem->request_virt_barray) - ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE, - (JDIMENSION) jround_up((long) compptr->width_in_blocks, - (long) compptr->h_samp_factor), - (JDIMENSION) jround_up((long) compptr->height_in_blocks, - (long) compptr->v_samp_factor), - (JDIMENSION) compptr->v_samp_factor); - } - break; - case JXFORM_TRANSPOSE: - case JXFORM_TRANSVERSE: - case JXFORM_ROT_90: - case JXFORM_ROT_270: - /* Need workspace arrays having transposed dimensions. - * Note that we allocate arrays padded out to the next iMCU boundary, - * so that transform routines need not worry about missing edge blocks. - */ - coef_arrays = (jvirt_barray_ptr *) - (*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE, - SIZEOF(jvirt_barray_ptr) * info->num_components); - for (ci = 0; ci < info->num_components; ci++) { - compptr = srcinfo->comp_info + ci; - coef_arrays[ci] = (*srcinfo->mem->request_virt_barray) - ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE, - (JDIMENSION) jround_up((long) compptr->height_in_blocks, - (long) compptr->v_samp_factor), - (JDIMENSION) jround_up((long) compptr->width_in_blocks, - (long) compptr->h_samp_factor), - (JDIMENSION) compptr->h_samp_factor); - } - break; - } - info->workspace_coef_arrays = coef_arrays; -} - - -/* Transpose destination image parameters */ - -LOCAL(void) -transpose_critical_parameters (j_compress_ptr dstinfo) -{ - int tblno, i, j, ci, itemp; - jpeg_component_info *compptr; - JQUANT_TBL *qtblptr; - JDIMENSION dtemp; - UINT16 qtemp; - - /* Transpose basic image dimensions */ - dtemp = dstinfo->image_width; - dstinfo->image_width = dstinfo->image_height; - dstinfo->image_height = dtemp; - - /* Transpose sampling factors */ - for (ci = 0; ci < dstinfo->num_components; ci++) { - compptr = dstinfo->comp_info + ci; - itemp = compptr->h_samp_factor; - compptr->h_samp_factor = compptr->v_samp_factor; - compptr->v_samp_factor = itemp; - } - - /* Transpose quantization tables */ - for (tblno = 0; tblno < NUM_QUANT_TBLS; tblno++) { - qtblptr = dstinfo->quant_tbl_ptrs[tblno]; - if (qtblptr != NULL) { - for (i = 0; i < DCTSIZE; i++) { - for (j = 0; j < i; j++) { - qtemp = qtblptr->quantval[i*DCTSIZE+j]; - qtblptr->quantval[i*DCTSIZE+j] = qtblptr->quantval[j*DCTSIZE+i]; - qtblptr->quantval[j*DCTSIZE+i] = qtemp; - } - } - } - } -} - - -/* Trim off any partial iMCUs on the indicated destination edge */ - -LOCAL(void) -trim_right_edge (j_compress_ptr dstinfo) -{ - int ci, max_h_samp_factor; - JDIMENSION MCU_cols; - - /* We have to compute max_h_samp_factor ourselves, - * because it hasn't been set yet in the destination - * (and we don't want to use the source's value). - */ - max_h_samp_factor = 1; - for (ci = 0; ci < dstinfo->num_components; ci++) { - int h_samp_factor = dstinfo->comp_info[ci].h_samp_factor; - max_h_samp_factor = MAX(max_h_samp_factor, h_samp_factor); - } - MCU_cols = dstinfo->image_width / (max_h_samp_factor * DCTSIZE); - if (MCU_cols > 0) /* can't trim to 0 pixels */ - dstinfo->image_width = MCU_cols * (max_h_samp_factor * DCTSIZE); -} - -LOCAL(void) -trim_bottom_edge (j_compress_ptr dstinfo) -{ - int ci, max_v_samp_factor; - JDIMENSION MCU_rows; - - /* We have to compute max_v_samp_factor ourselves, - * because it hasn't been set yet in the destination - * (and we don't want to use the source's value). - */ - max_v_samp_factor = 1; - for (ci = 0; ci < dstinfo->num_components; ci++) { - int v_samp_factor = dstinfo->comp_info[ci].v_samp_factor; - max_v_samp_factor = MAX(max_v_samp_factor, v_samp_factor); - } - MCU_rows = dstinfo->image_height / (max_v_samp_factor * DCTSIZE); - if (MCU_rows > 0) /* can't trim to 0 pixels */ - dstinfo->image_height = MCU_rows * (max_v_samp_factor * DCTSIZE); -} - - -/* Adjust output image parameters as needed. - * - * This must be called after jpeg_copy_critical_parameters() - * and before jpeg_write_coefficients(). - * - * The return value is the set of virtual coefficient arrays to be written - * (either the ones allocated by jtransform_request_workspace, or the - * original source data arrays). The caller will need to pass this value - * to jpeg_write_coefficients(). - */ - -GLOBAL(jvirt_barray_ptr *) -jtransform_adjust_parameters (j_decompress_ptr, - j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jpeg_transform_info *info) -{ - /* If force-to-grayscale is requested, adjust destination parameters */ - if (info->force_grayscale) { - /* We use jpeg_set_colorspace to make sure subsidiary settings get fixed - * properly. Among other things, the target h_samp_factor & v_samp_factor - * will get set to 1, which typically won't match the source. - * In fact we do this even if the source is already grayscale; that - * provides an easy way of coercing a grayscale JPEG with funny sampling - * factors to the customary 1,1. (Some decoders fail on other factors.) - */ - if ((dstinfo->jpeg_color_space == JCS_YCbCr && - dstinfo->num_components == 3) || - (dstinfo->jpeg_color_space == JCS_GRAYSCALE && - dstinfo->num_components == 1)) { - /* We have to preserve the source's quantization table number. */ - int sv_quant_tbl_no = dstinfo->comp_info[0].quant_tbl_no; - jpeg_set_colorspace(dstinfo, JCS_GRAYSCALE); - dstinfo->comp_info[0].quant_tbl_no = sv_quant_tbl_no; - } else { - /* Sorry, can't do it */ - ERREXIT(dstinfo, JERR_CONVERSION_NOTIMPL); - } - } - - /* Correct the destination's image dimensions etc if necessary */ - switch (info->transform) { - case JXFORM_NONE: - /* Nothing to do */ - break; - case JXFORM_FLIP_H: - if (info->trim) - trim_right_edge(dstinfo); - break; - case JXFORM_FLIP_V: - if (info->trim) - trim_bottom_edge(dstinfo); - break; - case JXFORM_TRANSPOSE: - transpose_critical_parameters(dstinfo); - /* transpose does NOT have to trim anything */ - break; - case JXFORM_TRANSVERSE: - transpose_critical_parameters(dstinfo); - if (info->trim) { - trim_right_edge(dstinfo); - trim_bottom_edge(dstinfo); - } - break; - case JXFORM_ROT_90: - transpose_critical_parameters(dstinfo); - if (info->trim) - trim_right_edge(dstinfo); - break; - case JXFORM_ROT_180: - if (info->trim) { - trim_right_edge(dstinfo); - trim_bottom_edge(dstinfo); - } - break; - case JXFORM_ROT_270: - transpose_critical_parameters(dstinfo); - if (info->trim) - trim_bottom_edge(dstinfo); - break; - } - - /* Return the appropriate output data set */ - if (info->workspace_coef_arrays != NULL) - return info->workspace_coef_arrays; - return src_coef_arrays; -} - - -/* Execute the actual transformation, if any. - * - * This must be called *after* jpeg_write_coefficients, because it depends - * on jpeg_write_coefficients to have computed subsidiary values such as - * the per-component width and height fields in the destination object. - * - * Note that some transformations will modify the source data arrays! - */ - -GLOBAL(void) -jtransform_execute_transformation (j_decompress_ptr srcinfo, - j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jpeg_transform_info *info) -{ - jvirt_barray_ptr *dst_coef_arrays = info->workspace_coef_arrays; - - switch (info->transform) { - case JXFORM_NONE: - break; - case JXFORM_FLIP_H: - do_flip_h(srcinfo, dstinfo, src_coef_arrays); - break; - case JXFORM_FLIP_V: - do_flip_v(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_TRANSPOSE: - do_transpose(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_TRANSVERSE: - do_transverse(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_ROT_90: - do_rot_90(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_ROT_180: - do_rot_180(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); - break; - case JXFORM_ROT_270: - do_rot_270(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays); - break; - } -} - -#endif /* TRANSFORMS_SUPPORTED */ - - -/* Setup decompression object to save desired markers in memory. - * This must be called before jpeg_read_header() to have the desired effect. - */ - -GLOBAL(void) -jcopy_markers_setup (j_decompress_ptr srcinfo, JCOPY_OPTION option) -{ -#ifdef SAVE_MARKERS_SUPPORTED - int m; - - /* Save comments except under NONE option */ - if (option != JCOPYOPT_NONE) { - jpeg_save_markers(srcinfo, JPEG_COM, 0xFFFF); - } - /* Save all types of APPn markers iff ALL option */ - if (option == JCOPYOPT_ALL) { - for (m = 0; m < 16; m++) - jpeg_save_markers(srcinfo, JPEG_APP0 + m, 0xFFFF); - } -#endif /* SAVE_MARKERS_SUPPORTED */ -} - -/* Copy markers saved in the given source object to the destination object. - * This should be called just after jpeg_start_compress() or - * jpeg_write_coefficients(). - * Note that those routines will have written the SOI, and also the - * JFIF APP0 or Adobe APP14 markers if selected. - */ - -GLOBAL(void) -jcopy_markers_execute (j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JCOPY_OPTION) -{ - jpeg_saved_marker_ptr marker; - - /* In the current implementation, we don't actually need to examine the - * option flag here; we just copy everything that got saved. - * But to avoid confusion, we do not output JFIF and Adobe APP14 markers - * if the encoder library already wrote one. - */ - for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) { - if (dstinfo->write_JFIF_header && - marker->marker == JPEG_APP0 && - marker->data_length >= 5 && - GETJOCTET(marker->data[0]) == 0x4A && - GETJOCTET(marker->data[1]) == 0x46 && - GETJOCTET(marker->data[2]) == 0x49 && - GETJOCTET(marker->data[3]) == 0x46 && - GETJOCTET(marker->data[4]) == 0) - continue; /* reject duplicate JFIF */ - if (dstinfo->write_Adobe_marker && - marker->marker == JPEG_APP0+14 && - marker->data_length >= 5 && - GETJOCTET(marker->data[0]) == 0x41 && - GETJOCTET(marker->data[1]) == 0x64 && - GETJOCTET(marker->data[2]) == 0x6F && - GETJOCTET(marker->data[3]) == 0x62 && - GETJOCTET(marker->data[4]) == 0x65) - continue; /* reject duplicate Adobe */ -#ifdef NEED_FAR_POINTERS - /* We could use jpeg_write_marker if the data weren't FAR... */ - { - unsigned int i; - jpeg_write_m_header(dstinfo, marker->marker, marker->data_length); - for (i = 0; i < marker->data_length; i++) - jpeg_write_m_byte(dstinfo, marker->data[i]); - } -#else - jpeg_write_marker(dstinfo, marker->marker, - marker->data, marker->data_length); -#endif - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.h b/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.h deleted file mode 100755 index eb0b055..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/jpglib/transupp.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * transupp.h - * - * Copyright (C) 1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains declarations for image transformation routines and - * other utility code used by the jpegtran sample application. These are - * NOT part of the core JPEG library. But we keep these routines separate - * from jpegtran.c to ease the task of maintaining jpegtran-like programs - * that have other user interfaces. - * - * NOTE: all the routines declared here have very specific requirements - * about when they are to be executed during the reading and writing of the - * source and destination files. See the comments in transupp.c, or see - * jpegtran.c for an example of correct usage. - */ - -/* If you happen not to want the image transform support, disable it here */ -#ifndef TRANSFORMS_SUPPORTED -#define TRANSFORMS_SUPPORTED 1 /* 0 disables transform code */ -#endif - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jtransform_request_workspace jTrRequest -#define jtransform_adjust_parameters jTrAdjust -#define jtransform_execute_transformation jTrExec -#define jcopy_markers_setup jCMrkSetup -#define jcopy_markers_execute jCMrkExec -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* - * Codes for supported types of image transformations. - */ - -typedef enum { - JXFORM_NONE, /* no transformation */ - JXFORM_FLIP_H, /* horizontal flip */ - JXFORM_FLIP_V, /* vertical flip */ - JXFORM_TRANSPOSE, /* transpose across UL-to-LR axis */ - JXFORM_TRANSVERSE, /* transpose across UR-to-LL axis */ - JXFORM_ROT_90, /* 90-degree clockwise rotation */ - JXFORM_ROT_180, /* 180-degree rotation */ - JXFORM_ROT_270 /* 270-degree clockwise (or 90 ccw) */ -} JXFORM_CODE; - -/* - * Although rotating and flipping data expressed as DCT coefficients is not - * hard, there is an asymmetry in the JPEG format specification for images - * whose dimensions aren't multiples of the iMCU size. The right and bottom - * image edges are padded out to the next iMCU boundary with junk data; but - * no padding is possible at the top and left edges. If we were to flip - * the whole image including the pad data, then pad garbage would become - * visible at the top and/or left, and real pixels would disappear into the - * pad margins --- perhaps permanently, since encoders & decoders may not - * bother to preserve DCT blocks that appear to be completely outside the - * nominal image area. So, we have to exclude any partial iMCUs from the - * basic transformation. - * - * Transpose is the only transformation that can handle partial iMCUs at the - * right and bottom edges completely cleanly. flip_h can flip partial iMCUs - * at the bottom, but leaves any partial iMCUs at the right edge untouched. - * Similarly flip_v leaves any partial iMCUs at the bottom edge untouched. - * The other transforms are defined as combinations of these basic transforms - * and process edge blocks in a way that preserves the equivalence. - * - * The "trim" option causes untransformable partial iMCUs to be dropped; - * this is not strictly lossless, but it usually gives the best-looking - * result for odd-size images. Note that when this option is active, - * the expected mathematical equivalences between the transforms may not hold. - * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim - * followed by -rot 180 -trim trims both edges.) - * - * We also offer a "force to grayscale" option, which simply discards the - * chrominance channels of a YCbCr image. This is lossless in the sense that - * the luminance channel is preserved exactly. It's not the same kind of - * thing as the rotate/flip transformations, but it's convenient to handle it - * as part of this package, mainly because the transformation routines have to - * be aware of the option to know how many components to work on. - */ - -typedef struct { - /* Options: set by caller */ - JXFORM_CODE transform; /* image transform operator */ - boolean trim; /* if TRUE, trim partial MCUs as needed */ - boolean force_grayscale; /* if TRUE, convert color image to grayscale */ - - /* Internal workspace: caller should not touch these */ - int num_components; /* # of components in workspace */ - jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */ -} jpeg_transform_info; - - -#if TRANSFORMS_SUPPORTED - -/* Request any required workspace */ -EXTERN(void) jtransform_request_workspace - JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info)); -/* Adjust output image parameters */ -EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters - JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jpeg_transform_info *info)); -/* Execute the actual transformation, if any */ -EXTERN(void) jtransform_execute_transformation - JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - jvirt_barray_ptr *src_coef_arrays, - jpeg_transform_info *info)); - -#endif /* TRANSFORMS_SUPPORTED */ - - -/* - * Support for copying optional markers from source to destination file. - */ - -typedef enum { - JCOPYOPT_NONE, /* copy no optional markers */ - JCOPYOPT_COMMENTS, /* copy only comment (COM) markers */ - JCOPYOPT_ALL /* copy all optional markers */ -} JCOPY_OPTION; - -#define JCOPYOPT_DEFAULT JCOPYOPT_COMMENTS /* recommended default */ - -/* Setup decompression object to save desired markers in memory */ -EXTERN(void) jcopy_markers_setup - JPP((j_decompress_ptr srcinfo, JCOPY_OPTION option)); -/* Copy markers saved in the given source object to the destination object */ -EXTERN(void) jcopy_markers_execute - JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, - JCOPY_OPTION option)); diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp b/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp deleted file mode 100755 index 2c9066f..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_GIFLoader.cpp +++ /dev/null @@ -1,444 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if (JUCE_MAC || JUCE_IOS) && USE_COREGRAPHICS_RENDERING && JUCE_USE_COREIMAGE_LOADER - Image juce_loadWithCoreImage (InputStream& input); -#else - -//============================================================================== -class GIFLoader -{ -public: - GIFLoader (InputStream& in) - : input (in), - dataBlockIsZero (false), fresh (false), finished (false), - currentBit (0), lastBit (0), lastByteIndex (0), - codeSize (0), setCodeSize (0), maxCode (0), maxCodeSize (0), - firstcode (0), oldcode (0), clearCode (0), endCode (0) - { - int imageWidth, imageHeight; - if (! getSizeFromHeader (imageWidth, imageHeight)) - return; - - uint8 buf [16]; - if (in.read (buf, 3) != 3) - return; - - int numColours = 2 << (buf[0] & 7); - int transparent = -1; - - if ((buf[0] & 0x80) != 0) - readPalette (numColours); - - for (;;) - { - if (input.read (buf, 1) != 1 || buf[0] == ';') - break; - - if (buf[0] == '!') - { - if (readExtension (transparent)) - continue; - - break; - } - - if (buf[0] != ',') - continue; - - if (input.read (buf, 9) == 9) - { - imageWidth = (int) ByteOrder::littleEndianShort (buf + 4); - imageHeight = (int) ByteOrder::littleEndianShort (buf + 6); - - numColours = 2 << (buf[8] & 7); - - if ((buf[8] & 0x80) != 0) - if (! readPalette (numColours)) - break; - - image = Image (transparent >= 0 ? Image::ARGB : Image::RGB, - imageWidth, imageHeight, transparent >= 0); - - image.getProperties()->set ("originalImageHadAlpha", transparent >= 0); - - readImage ((buf[8] & 0x40) != 0, transparent); - } - - break; - } - } - - Image image; - -private: - InputStream& input; - uint8 buffer [260]; - PixelARGB palette [256]; - bool dataBlockIsZero, fresh, finished; - int currentBit, lastBit, lastByteIndex; - int codeSize, setCodeSize; - int maxCode, maxCodeSize; - int firstcode, oldcode; - int clearCode, endCode; - enum { maxGifCode = 1 << 12 }; - int table [2] [maxGifCode]; - int stack [2 * maxGifCode]; - int* sp; - - bool getSizeFromHeader (int& w, int& h) - { - char b[6]; - - if (input.read (b, 6) == 6 - && (strncmp ("GIF87a", b, 6) == 0 - || strncmp ("GIF89a", b, 6) == 0)) - { - if (input.read (b, 4) == 4) - { - w = (int) ByteOrder::littleEndianShort (b); - h = (int) ByteOrder::littleEndianShort (b + 2); - return w > 0 && h > 0; - } - } - - return false; - } - - bool readPalette (const int numCols) - { - for (int i = 0; i < numCols; ++i) - { - uint8 rgb[4]; - input.read (rgb, 3); - - palette[i].setARGB (0xff, rgb[0], rgb[1], rgb[2]); - palette[i].premultiply(); - } - - return true; - } - - int readDataBlock (uint8* const dest) - { - uint8 n; - if (input.read (&n, 1) == 1) - { - dataBlockIsZero = (n == 0); - - if (dataBlockIsZero || (input.read (dest, n) == n)) - return n; - } - - return -1; - } - - int readExtension (int& transparent) - { - uint8 type; - if (input.read (&type, 1) != 1) - return false; - - uint8 b [260]; - int n = 0; - - if (type == 0xf9) - { - n = readDataBlock (b); - if (n < 0) - return 1; - - if ((b[0] & 1) != 0) - transparent = b[3]; - } - - do - { - n = readDataBlock (b); - } - while (n > 0); - - return n >= 0; - } - - void clearTable() - { - int i; - for (i = 0; i < clearCode; ++i) - { - table[0][i] = 0; - table[1][i] = i; - } - - for (; i < maxGifCode; ++i) - { - table[0][i] = 0; - table[1][i] = 0; - } - } - - void initialise (const int inputCodeSize) - { - setCodeSize = inputCodeSize; - codeSize = setCodeSize + 1; - clearCode = 1 << setCodeSize; - endCode = clearCode + 1; - maxCodeSize = 2 * clearCode; - maxCode = clearCode + 2; - - getCode (0, true); - - fresh = true; - clearTable(); - sp = stack; - } - - int readLZWByte() - { - if (fresh) - { - fresh = false; - - for (;;) - { - firstcode = oldcode = getCode (codeSize, false); - - if (firstcode != clearCode) - return firstcode; - } - } - - if (sp > stack) - return *--sp; - - int code; - - while ((code = getCode (codeSize, false)) >= 0) - { - if (code == clearCode) - { - clearTable(); - codeSize = setCodeSize + 1; - maxCodeSize = 2 * clearCode; - maxCode = clearCode + 2; - sp = stack; - firstcode = oldcode = getCode (codeSize, false); - return firstcode; - } - else if (code == endCode) - { - if (dataBlockIsZero) - return -2; - - uint8 buf [260]; - int n; - - while ((n = readDataBlock (buf)) > 0) - {} - - if (n != 0) - return -2; - } - - const int incode = code; - - if (code >= maxCode) - { - *sp++ = firstcode; - code = oldcode; - } - - while (code >= clearCode) - { - *sp++ = table[1][code]; - if (code == table[0][code]) - return -2; - - code = table[0][code]; - } - - *sp++ = firstcode = table[1][code]; - - if ((code = maxCode) < maxGifCode) - { - table[0][code] = oldcode; - table[1][code] = firstcode; - ++maxCode; - - if (maxCode >= maxCodeSize && maxCodeSize < maxGifCode) - { - maxCodeSize <<= 1; - ++codeSize; - } - } - - oldcode = incode; - - if (sp > stack) - return *--sp; - } - - return code; - } - - int getCode (const int codeSize_, const bool shouldInitialise) - { - if (shouldInitialise) - { - currentBit = 0; - lastBit = 0; - finished = false; - return 0; - } - - if ((currentBit + codeSize_) >= lastBit) - { - if (finished) - return -1; - - buffer[0] = buffer [lastByteIndex - 2]; - buffer[1] = buffer [lastByteIndex - 1]; - - const int n = readDataBlock (buffer + 2); - - if (n == 0) - finished = true; - - lastByteIndex = 2 + n; - currentBit = (currentBit - lastBit) + 16; - lastBit = (2 + n) * 8 ; - } - - int result = 0; - int i = currentBit; - - for (int j = 0; j < codeSize_; ++j) - { - result |= ((buffer[i >> 3] & (1 << (i & 7))) != 0) << j; - ++i; - } - - currentBit += codeSize_; - return result; - } - - bool readImage (const int interlace, const int transparent) - { - uint8 c; - if (input.read (&c, 1) != 1) - return false; - - initialise (c); - - if (transparent >= 0) - palette [transparent].setARGB (0, 0, 0, 0); - - int xpos = 0, ypos = 0, yStep = 8, pass = 0; - - const Image::BitmapData destData (image, Image::BitmapData::writeOnly); - uint8* p = destData.getPixelPointer (0, 0); - const bool hasAlpha = image.hasAlphaChannel(); - - for (;;) - { - const int index = readLZWByte(); - if (index < 0) - break; - - if (hasAlpha) - ((PixelARGB*) p)->set (palette [index]); - else - ((PixelRGB*) p)->set (palette [index]); - - p += destData.pixelStride; - - if (++xpos == destData.width) - { - xpos = 0; - - if (interlace) - { - ypos += yStep; - - while (ypos >= destData.height) - { - switch (++pass) - { - case 1: ypos = 4; yStep = 8; break; - case 2: ypos = 2; yStep = 4; break; - case 3: ypos = 1; yStep = 2; break; - default: return true; - } - } - } - else - { - if (++ypos >= destData.height) - break; - } - - p = destData.getPixelPointer (xpos, ypos); - } - } - - return true; - } - - JUCE_DECLARE_NON_COPYABLE (GIFLoader) -}; - -#endif - -//============================================================================== -GIFImageFormat::GIFImageFormat() {} -GIFImageFormat::~GIFImageFormat() {} - -String GIFImageFormat::getFormatName() { return "GIF"; } -bool GIFImageFormat::usesFileExtension (const File& f) { return f.hasFileExtension ("gif"); } - -bool GIFImageFormat::canUnderstand (InputStream& in) -{ - char header [4]; - - return (in.read (header, sizeof (header)) == sizeof (header)) - && header[0] == 'G' - && header[1] == 'I' - && header[2] == 'F'; -} - -Image GIFImageFormat::decodeImage (InputStream& in) -{ - #if (JUCE_MAC || JUCE_IOS) && USE_COREGRAPHICS_RENDERING && JUCE_USE_COREIMAGE_LOADER - return juce_loadWithCoreImage (in); - #else - const ScopedPointer loader (new GIFLoader (in)); - return loader->image; - #endif -} - -bool GIFImageFormat::writeImageToStream (const Image& /*sourceImage*/, OutputStream& /*destStream*/) -{ - jassertfalse; // writing isn't implemented for GIFs! - return false; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp b/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp deleted file mode 100755 index 0f56e32..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_JPEGLoader.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4365) -#endif - -namespace jpeglibNamespace -{ -#if JUCE_INCLUDE_JPEGLIB_CODE || ! defined (JUCE_INCLUDE_JPEGLIB_CODE) - #if JUCE_MINGW - typedef unsigned char boolean; - #endif - - #if JUCE_CLANG - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wconversion" - #pragma clang diagnostic ignored "-Wdeprecated-register" - #endif - - #define JPEG_INTERNALS - #undef FAR - #include "jpglib/jpeglib.h" - - #include "jpglib/jcapimin.c" - #include "jpglib/jcapistd.c" - #include "jpglib/jccoefct.c" - #include "jpglib/jccolor.c" - #undef FIX - #include "jpglib/jcdctmgr.c" - #undef CONST_BITS - #include "jpglib/jchuff.c" - #undef emit_byte - #include "jpglib/jcinit.c" - #include "jpglib/jcmainct.c" - #include "jpglib/jcmarker.c" - #include "jpglib/jcmaster.c" - #include "jpglib/jcomapi.c" - #include "jpglib/jcparam.c" - #include "jpglib/jcphuff.c" - #include "jpglib/jcprepct.c" - #include "jpglib/jcsample.c" - #include "jpglib/jctrans.c" - #include "jpglib/jdapistd.c" - #include "jpglib/jdapimin.c" - #include "jpglib/jdatasrc.c" - #include "jpglib/jdcoefct.c" - #undef FIX - #include "jpglib/jdcolor.c" - #undef FIX - #include "jpglib/jddctmgr.c" - #undef CONST_BITS - #undef ASSIGN_STATE - #include "jpglib/jdhuff.c" - #include "jpglib/jdinput.c" - #include "jpglib/jdmainct.c" - #include "jpglib/jdmarker.c" - #include "jpglib/jdmaster.c" - #undef FIX - #include "jpglib/jdmerge.c" - #undef ASSIGN_STATE - #include "jpglib/jdphuff.c" - #include "jpglib/jdpostct.c" - #undef FIX - #include "jpglib/jdsample.c" - #include "jpglib/jdtrans.c" - #include "jpglib/jfdctflt.c" - #include "jpglib/jfdctint.c" - #undef CONST_BITS - #undef MULTIPLY - #undef FIX_0_541196100 - #include "jpglib/jfdctfst.c" - #undef FIX_0_541196100 - #include "jpglib/jidctflt.c" - #undef CONST_BITS - #undef FIX_1_847759065 - #undef MULTIPLY - #undef DEQUANTIZE - #undef DESCALE - #include "jpglib/jidctfst.c" - #undef CONST_BITS - #undef FIX_1_847759065 - #undef MULTIPLY - #undef DEQUANTIZE - #include "jpglib/jidctint.c" - #include "jpglib/jidctred.c" - #include "jpglib/jmemmgr.c" - #include "jpglib/jmemnobs.c" - #include "jpglib/jquant1.c" - #include "jpglib/jquant2.c" - #include "jpglib/jutils.c" - #include "jpglib/transupp.c" - - #if JUCE_CLANG - #pragma clang diagnostic pop - #endif -#else - #define JPEG_INTERNALS - #undef FAR - #include -#endif -} - -#undef max -#undef min - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -//============================================================================== -namespace JPEGHelpers -{ - using namespace jpeglibNamespace; - - #if ! JUCE_MSVC - using jpeglibNamespace::boolean; - #endif - - struct JPEGDecodingFailure {}; - - static void fatalErrorHandler (j_common_ptr) { throw JPEGDecodingFailure(); } - static void silentErrorCallback1 (j_common_ptr) {} - static void silentErrorCallback2 (j_common_ptr, int) {} - static void silentErrorCallback3 (j_common_ptr, char*) {} - - static void setupSilentErrorHandler (struct jpeg_error_mgr& err) - { - zerostruct (err); - - err.error_exit = fatalErrorHandler; - err.emit_message = silentErrorCallback2; - err.output_message = silentErrorCallback1; - err.format_message = silentErrorCallback3; - err.reset_error_mgr = silentErrorCallback1; - } - - //============================================================================== - #if ! JUCE_USING_COREIMAGE_LOADER - static void dummyCallback1 (j_decompress_ptr) {} - - static void jpegSkip (j_decompress_ptr decompStruct, long num) - { - decompStruct->src->next_input_byte += num; - - num = jmin (num, (long) decompStruct->src->bytes_in_buffer); - decompStruct->src->bytes_in_buffer -= (size_t) num; - } - - static boolean jpegFill (j_decompress_ptr) - { - return 0; - } - #endif - - //============================================================================== - const int jpegBufferSize = 512; - - struct JuceJpegDest : public jpeg_destination_mgr - { - OutputStream* output; - char* buffer; - }; - - static void jpegWriteInit (j_compress_ptr) {} - - static void jpegWriteTerminate (j_compress_ptr cinfo) - { - JuceJpegDest* const dest = static_cast (cinfo->dest); - - const size_t numToWrite = jpegBufferSize - dest->free_in_buffer; - dest->output->write (dest->buffer, numToWrite); - } - - static boolean jpegWriteFlush (j_compress_ptr cinfo) - { - JuceJpegDest* const dest = static_cast (cinfo->dest); - - const int numToWrite = jpegBufferSize; - - dest->next_output_byte = reinterpret_cast (dest->buffer); - dest->free_in_buffer = jpegBufferSize; - - return (boolean) dest->output->write (dest->buffer, (size_t) numToWrite); - } -} - -//============================================================================== -JPEGImageFormat::JPEGImageFormat() - : quality (-1.0f) -{ -} - -JPEGImageFormat::~JPEGImageFormat() {} - -void JPEGImageFormat::setQuality (const float newQuality) -{ - quality = newQuality; -} - -String JPEGImageFormat::getFormatName() { return "JPEG"; } -bool JPEGImageFormat::usesFileExtension (const File& f) { return f.hasFileExtension ("jpeg;jpg"); } - -bool JPEGImageFormat::canUnderstand (InputStream& in) -{ - const int bytesNeeded = 10; - uint8 header [bytesNeeded]; - - return in.read (header, bytesNeeded) == bytesNeeded - && header[0] == 0xff - && header[1] == 0xd8 - && header[2] == 0xff; -} - -#if JUCE_USING_COREIMAGE_LOADER - Image juce_loadWithCoreImage (InputStream& input); -#endif - -Image JPEGImageFormat::decodeImage (InputStream& in) -{ -#if JUCE_USING_COREIMAGE_LOADER - return juce_loadWithCoreImage (in); -#else - using namespace jpeglibNamespace; - using namespace JPEGHelpers; - - MemoryOutputStream mb; - mb << in; - - Image image; - - if (mb.getDataSize() > 16) - { - struct jpeg_decompress_struct jpegDecompStruct; - - struct jpeg_error_mgr jerr; - setupSilentErrorHandler (jerr); - jpegDecompStruct.err = &jerr; - - jpeg_create_decompress (&jpegDecompStruct); - - jpegDecompStruct.src = (jpeg_source_mgr*)(jpegDecompStruct.mem->alloc_small) - ((j_common_ptr)(&jpegDecompStruct), JPOOL_PERMANENT, sizeof (jpeg_source_mgr)); - - jpegDecompStruct.src->init_source = dummyCallback1; - jpegDecompStruct.src->fill_input_buffer = jpegFill; - jpegDecompStruct.src->skip_input_data = jpegSkip; - jpegDecompStruct.src->resync_to_restart = jpeg_resync_to_restart; - jpegDecompStruct.src->term_source = dummyCallback1; - - jpegDecompStruct.src->next_input_byte = static_cast (mb.getData()); - jpegDecompStruct.src->bytes_in_buffer = mb.getDataSize(); - - try - { - jpeg_read_header (&jpegDecompStruct, TRUE); - - jpeg_calc_output_dimensions (&jpegDecompStruct); - - const int width = (int) jpegDecompStruct.output_width; - const int height = (int) jpegDecompStruct.output_height; - - jpegDecompStruct.out_color_space = JCS_RGB; - - JSAMPARRAY buffer - = (*jpegDecompStruct.mem->alloc_sarray) ((j_common_ptr) &jpegDecompStruct, - JPOOL_IMAGE, - (JDIMENSION) width * 3, 1); - - if (jpeg_start_decompress (&jpegDecompStruct)) - { - image = Image (Image::RGB, width, height, false); - image.getProperties()->set ("originalImageHadAlpha", false); - const bool hasAlphaChan = image.hasAlphaChannel(); // (the native image creator may not give back what we expect) - - const Image::BitmapData destData (image, Image::BitmapData::writeOnly); - - for (int y = 0; y < height; ++y) - { - jpeg_read_scanlines (&jpegDecompStruct, buffer, 1); - - const uint8* src = *buffer; - uint8* dest = destData.getLinePointer (y); - - if (hasAlphaChan) - { - for (int i = width; --i >= 0;) - { - ((PixelARGB*) dest)->setARGB (0xff, src[0], src[1], src[2]); - ((PixelARGB*) dest)->premultiply(); - dest += destData.pixelStride; - src += 3; - } - } - else - { - for (int i = width; --i >= 0;) - { - ((PixelRGB*) dest)->setARGB (0xff, src[0], src[1], src[2]); - dest += destData.pixelStride; - src += 3; - } - } - } - - jpeg_finish_decompress (&jpegDecompStruct); - - in.setPosition (((char*) jpegDecompStruct.src->next_input_byte) - (char*) mb.getData()); - } - - jpeg_destroy_decompress (&jpegDecompStruct); - } - catch (...) - {} - } - - return image; -#endif -} - -bool JPEGImageFormat::writeImageToStream (const Image& image, OutputStream& out) -{ - using namespace jpeglibNamespace; - using namespace JPEGHelpers; - - jpeg_compress_struct jpegCompStruct; - zerostruct (jpegCompStruct); - jpeg_create_compress (&jpegCompStruct); - - struct jpeg_error_mgr jerr; - setupSilentErrorHandler (jerr); - jpegCompStruct.err = &jerr; - - JuceJpegDest dest; - jpegCompStruct.dest = &dest; - - dest.output = &out; - HeapBlock tempBuffer (jpegBufferSize); - dest.buffer = tempBuffer; - dest.next_output_byte = (JOCTET*) dest.buffer; - dest.free_in_buffer = jpegBufferSize; - dest.init_destination = jpegWriteInit; - dest.empty_output_buffer = jpegWriteFlush; - dest.term_destination = jpegWriteTerminate; - - jpegCompStruct.image_width = (JDIMENSION) image.getWidth(); - jpegCompStruct.image_height = (JDIMENSION) image.getHeight(); - jpegCompStruct.input_components = 3; - jpegCompStruct.in_color_space = JCS_RGB; - jpegCompStruct.write_JFIF_header = 1; - - jpegCompStruct.X_density = 72; - jpegCompStruct.Y_density = 72; - - jpeg_set_defaults (&jpegCompStruct); - - jpegCompStruct.dct_method = JDCT_FLOAT; - jpegCompStruct.optimize_coding = 1; - - if (quality < 0.0f) - quality = 0.85f; - - jpeg_set_quality (&jpegCompStruct, jlimit (0, 100, roundToInt (quality * 100.0f)), TRUE); - - jpeg_start_compress (&jpegCompStruct, TRUE); - - const int strideBytes = (int) (jpegCompStruct.image_width * (unsigned int) jpegCompStruct.input_components); - - JSAMPARRAY buffer = (*jpegCompStruct.mem->alloc_sarray) ((j_common_ptr) &jpegCompStruct, - JPOOL_IMAGE, (JDIMENSION) strideBytes, 1); - - const Image::BitmapData srcData (image, Image::BitmapData::readOnly); - - while (jpegCompStruct.next_scanline < jpegCompStruct.image_height) - { - uint8* dst = *buffer; - - if (srcData.pixelFormat == Image::RGB) - { - const uint8* src = srcData.getLinePointer ((int) jpegCompStruct.next_scanline); - - for (int i = srcData.width; --i >= 0;) - { - *dst++ = ((const PixelRGB*) src)->getRed(); - *dst++ = ((const PixelRGB*) src)->getGreen(); - *dst++ = ((const PixelRGB*) src)->getBlue(); - src += srcData.pixelStride; - } - } - else - { - for (int x = 0; x < srcData.width; ++x) - { - const Colour pixel (srcData.getPixelColour (x, (int) jpegCompStruct.next_scanline)); - *dst++ = pixel.getRed(); - *dst++ = pixel.getGreen(); - *dst++ = pixel.getBlue(); - } - } - - jpeg_write_scanlines (&jpegCompStruct, buffer, 1); - } - - jpeg_finish_compress (&jpegCompStruct); - jpeg_destroy_compress (&jpegCompStruct); - - return true; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp b/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp deleted file mode 100755 index 636b293..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/juce_PNGLoader.cpp +++ /dev/null @@ -1,546 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4390 4611 4365 4267) - #ifdef __INTEL_COMPILER - #pragma warning (disable: 2544 2545) - #endif -#endif - -namespace zlibNamespace -{ -#if JUCE_INCLUDE_ZLIB_CODE - #undef OS_CODE - #undef fdopen - #include "../../juce_core/zip/zlib/zlib.h" - #undef OS_CODE -#else - #include JUCE_ZLIB_INCLUDE_PATH -#endif -} - -namespace pnglibNamespace -{ - using namespace zlibNamespace; - -#if JUCE_INCLUDE_PNGLIB_CODE || ! defined (JUCE_INCLUDE_PNGLIB_CODE) - - #if _MSC_VER != 1310 - using std::calloc; // (causes conflict in VS.NET 2003) - using std::malloc; - using std::free; - #endif - - #if JUCE_CLANG - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wsign-conversion" - #endif - - using std::abs; - #define NO_DUMMY_DECL - #define PNGLCONF_H 1 - - #if JUCE_ANDROID - #define PNG_ARM_NEON_SUPPORTED - #endif - - #define PNG_16BIT_SUPPORTED - #define PNG_ALIGNED_MEMORY_SUPPORTED - #define PNG_BENIGN_ERRORS_SUPPORTED - #define PNG_BENIGN_READ_ERRORS_SUPPORTED - #define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED - #define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED - #define PNG_COLORSPACE_SUPPORTED - #define PNG_CONSOLE_IO_SUPPORTED - #define PNG_EASY_ACCESS_SUPPORTED - #define PNG_FIXED_POINT_SUPPORTED - #define PNG_FLOATING_ARITHMETIC_SUPPORTED - #define PNG_FLOATING_POINT_SUPPORTED - #define PNG_FORMAT_AFIRST_SUPPORTED - #define PNG_FORMAT_BGR_SUPPORTED - #define PNG_GAMMA_SUPPORTED - #define PNG_GET_PALETTE_MAX_SUPPORTED - #define PNG_HANDLE_AS_UNKNOWN_SUPPORTED - #define PNG_INCH_CONVERSIONS_SUPPORTED - #define PNG_INFO_IMAGE_SUPPORTED - #define PNG_IO_STATE_SUPPORTED - #define PNG_MNG_FEATURES_SUPPORTED - #define PNG_POINTER_INDEXING_SUPPORTED - #define PNG_PROGRESSIVE_READ_SUPPORTED - #define PNG_READ_16BIT_SUPPORTED - #define PNG_READ_ALPHA_MODE_SUPPORTED - #define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED - #define PNG_READ_BACKGROUND_SUPPORTED - #define PNG_READ_BGR_SUPPORTED - #define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED - #define PNG_READ_COMPOSITE_NODIV_SUPPORTED - #define PNG_READ_COMPRESSED_TEXT_SUPPORTED - #define PNG_READ_EXPAND_16_SUPPORTED - #define PNG_READ_EXPAND_SUPPORTED - #define PNG_READ_FILLER_SUPPORTED - #define PNG_READ_GAMMA_SUPPORTED - #define PNG_READ_GET_PALETTE_MAX_SUPPORTED - #define PNG_READ_GRAY_TO_RGB_SUPPORTED - #define PNG_READ_INTERLACING_SUPPORTED - #define PNG_READ_INT_FUNCTIONS_SUPPORTED - #define PNG_READ_INVERT_ALPHA_SUPPORTED - #define PNG_READ_INVERT_SUPPORTED - #define PNG_READ_OPT_PLTE_SUPPORTED - #define PNG_READ_PACKSWAP_SUPPORTED - #define PNG_READ_PACK_SUPPORTED - #define PNG_READ_QUANTIZE_SUPPORTED - #define PNG_READ_RGB_TO_GRAY_SUPPORTED - #define PNG_READ_SCALE_16_TO_8_SUPPORTED - #define PNG_READ_SHIFT_SUPPORTED - #define PNG_READ_STRIP_16_TO_8_SUPPORTED - #define PNG_READ_STRIP_ALPHA_SUPPORTED - #define PNG_READ_SUPPORTED - #define PNG_READ_SWAP_ALPHA_SUPPORTED - #define PNG_READ_SWAP_SUPPORTED - #define PNG_READ_TEXT_SUPPORTED - #define PNG_READ_TRANSFORMS_SUPPORTED - #define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED - #define PNG_READ_USER_CHUNKS_SUPPORTED - #define PNG_READ_USER_TRANSFORM_SUPPORTED - #define PNG_READ_bKGD_SUPPORTED - #define PNG_READ_cHRM_SUPPORTED - #define PNG_READ_gAMA_SUPPORTED - #define PNG_READ_hIST_SUPPORTED - #define PNG_READ_iCCP_SUPPORTED - #define PNG_READ_iTXt_SUPPORTED - #define PNG_READ_oFFs_SUPPORTED - #define PNG_READ_pCAL_SUPPORTED - #define PNG_READ_pHYs_SUPPORTED - #define PNG_READ_sBIT_SUPPORTED - #define PNG_READ_sCAL_SUPPORTED - #define PNG_READ_sPLT_SUPPORTED - #define PNG_READ_sRGB_SUPPORTED - #define PNG_READ_tEXt_SUPPORTED - #define PNG_READ_tIME_SUPPORTED - #define PNG_READ_tRNS_SUPPORTED - #define PNG_READ_zTXt_SUPPORTED - #define PNG_SAVE_INT_32_SUPPORTED - #define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED - #define PNG_SEQUENTIAL_READ_SUPPORTED - #define PNG_SET_CHUNK_CACHE_LIMIT_SUPPORTED - #define PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED - #define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED - #define PNG_SET_USER_LIMITS_SUPPORTED - #define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED - #define PNG_SIMPLIFIED_READ_BGR_SUPPORTED - #define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED - #define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED - #define PNG_STDIO_SUPPORTED - #define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED - #define PNG_TEXT_SUPPORTED - #define PNG_TIME_RFC1123_SUPPORTED - #define PNG_UNKNOWN_CHUNKS_SUPPORTED - #define PNG_USER_CHUNKS_SUPPORTED - #define PNG_USER_LIMITS_SUPPORTED - #define PNG_USER_TRANSFORM_INFO_SUPPORTED - #define PNG_USER_TRANSFORM_PTR_SUPPORTED - #define PNG_WARNINGS_SUPPORTED - #define PNG_WRITE_16BIT_SUPPORTED - #define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED - #define PNG_WRITE_BGR_SUPPORTED - #define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED - #define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED - #define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED - #define PNG_WRITE_FILLER_SUPPORTED - #define PNG_WRITE_FILTER_SUPPORTED - #define PNG_WRITE_FLUSH_SUPPORTED - #define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED - #define PNG_WRITE_INTERLACING_SUPPORTED - #define PNG_WRITE_INT_FUNCTIONS_SUPPORTED - #define PNG_WRITE_INVERT_ALPHA_SUPPORTED - #define PNG_WRITE_INVERT_SUPPORTED - #define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED - #define PNG_WRITE_PACKSWAP_SUPPORTED - #define PNG_WRITE_PACK_SUPPORTED - #define PNG_WRITE_SHIFT_SUPPORTED - #define PNG_WRITE_SUPPORTED - #define PNG_WRITE_SWAP_ALPHA_SUPPORTED - #define PNG_WRITE_SWAP_SUPPORTED - #define PNG_WRITE_TEXT_SUPPORTED - #define PNG_WRITE_TRANSFORMS_SUPPORTED - #define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED - #define PNG_WRITE_USER_TRANSFORM_SUPPORTED - #define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - #define PNG_WRITE_bKGD_SUPPORTED - #define PNG_WRITE_cHRM_SUPPORTED - #define PNG_WRITE_gAMA_SUPPORTED - #define PNG_WRITE_hIST_SUPPORTED - #define PNG_WRITE_iCCP_SUPPORTED - #define PNG_WRITE_iTXt_SUPPORTED - #define PNG_WRITE_oFFs_SUPPORTED - #define PNG_WRITE_pCAL_SUPPORTED - #define PNG_WRITE_pHYs_SUPPORTED - #define PNG_WRITE_sBIT_SUPPORTED - #define PNG_WRITE_sCAL_SUPPORTED - #define PNG_WRITE_sPLT_SUPPORTED - #define PNG_WRITE_sRGB_SUPPORTED - #define PNG_WRITE_tEXt_SUPPORTED - #define PNG_WRITE_tIME_SUPPORTED - #define PNG_WRITE_tRNS_SUPPORTED - #define PNG_WRITE_zTXt_SUPPORTED - #define PNG_bKGD_SUPPORTED - #define PNG_cHRM_SUPPORTED - #define PNG_gAMA_SUPPORTED - #define PNG_hIST_SUPPORTED - #define PNG_iCCP_SUPPORTED - #define PNG_iTXt_SUPPORTED - #define PNG_oFFs_SUPPORTED - #define PNG_pCAL_SUPPORTED - #define PNG_pHYs_SUPPORTED - #define PNG_sBIT_SUPPORTED - #define PNG_sCAL_SUPPORTED - #define PNG_sPLT_SUPPORTED - #define PNG_sRGB_SUPPORTED - #define PNG_tEXt_SUPPORTED - #define PNG_tIME_SUPPORTED - #define PNG_tRNS_SUPPORTED - #define PNG_zTXt_SUPPORTED - - #define PNG_STRING_COPYRIGHT ""; - #define PNG_STRING_NEWLINE "\n" - #define PNG_LITERAL_SHARP 0x23 - #define PNG_LITERAL_LEFT_SQUARE_BRACKET 0x5b - #define PNG_LITERAL_RIGHT_SQUARE_BRACKET 0x5d - - #define PNG_API_RULE 0 - #define PNG_CALLOC_SUPPORTED - #define PNG_COST_SHIFT 3 - #define PNG_DEFAULT_READ_MACROS 1 - #define PNG_GAMMA_THRESHOLD_FIXED 5000 - #define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE - #define PNG_INFLATE_BUF_SIZE 1024 - #define PNG_MAX_GAMMA_8 11 - #define PNG_QUANTIZE_BLUE_BITS 5 - #define PNG_QUANTIZE_GREEN_BITS 5 - #define PNG_QUANTIZE_RED_BITS 5 - #define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1) - #define PNG_TEXT_Z_DEFAULT_STRATEGY 0 - #define PNG_WEIGHT_SHIFT 8 - #define PNG_ZBUF_SIZE 8192 - #define PNG_Z_DEFAULT_COMPRESSION (-1) - #define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0 - #define PNG_Z_DEFAULT_STRATEGY 1 - #define PNG_sCAL_PRECISION 5 - #define PNG_sRGB_PROFILE_CHECKS 2 - - #define png_debug(a, b) - #define png_debug1(a, b, c) - #define png_debug2(a, b, c, d) - - #include "pnglib/png.h" - #include "pnglib/pngconf.h" - - #define PNG_NO_EXTERN - #include "pnglib/png.c" - #include "pnglib/pngerror.c" - #include "pnglib/pngget.c" - #include "pnglib/pngmem.c" - #include "pnglib/pngread.c" - #include "pnglib/pngpread.c" - #include "pnglib/pngrio.c" - #include "pnglib/pngrtran.c" - #include "pnglib/pngrutil.c" - #include "pnglib/pngset.c" - #include "pnglib/pngtrans.c" - #include "pnglib/pngwio.c" - #include "pnglib/pngwrite.c" - #include "pnglib/pngwtran.c" - #include "pnglib/pngwutil.c" - - #if JUCE_CLANG - #pragma clang diagnostic pop - #endif -#else - extern "C" - { - #include - #include - } -#endif -} - -#undef max -#undef min -#undef fdopen - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -//============================================================================== -namespace PNGHelpers -{ - using namespace pnglibNamespace; - - static void JUCE_CDECL writeDataCallback (png_structp png, png_bytep data, png_size_t length) - { - static_cast (png_get_io_ptr (png))->write (data, length); - } - - #if ! JUCE_USING_COREIMAGE_LOADER - static void JUCE_CDECL readCallback (png_structp png, png_bytep data, png_size_t length) - { - static_cast (png_get_io_ptr (png))->read (data, (int) length); - } - - struct PNGErrorStruct {}; - - static void JUCE_CDECL errorCallback (png_structp, png_const_charp) - { - throw PNGErrorStruct(); - } - - static void JUCE_CDECL warningCallback (png_structp, png_const_charp) {} - #endif -} - -//============================================================================== -PNGImageFormat::PNGImageFormat() {} -PNGImageFormat::~PNGImageFormat() {} - -String PNGImageFormat::getFormatName() { return "PNG"; } -bool PNGImageFormat::usesFileExtension (const File& f) { return f.hasFileExtension ("png"); } - -bool PNGImageFormat::canUnderstand (InputStream& in) -{ - const int bytesNeeded = 4; - char header [bytesNeeded]; - - return in.read (header, bytesNeeded) == bytesNeeded - && header[1] == 'P' - && header[2] == 'N' - && header[3] == 'G'; -} - -#if JUCE_USING_COREIMAGE_LOADER - Image juce_loadWithCoreImage (InputStream& input); -#endif - -Image PNGImageFormat::decodeImage (InputStream& in) -{ -#if JUCE_USING_COREIMAGE_LOADER - return juce_loadWithCoreImage (in); -#else - using namespace pnglibNamespace; - Image image; - - if (png_structp pngReadStruct = png_create_read_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0)) - { - try - { - png_infop pngInfoStruct = png_create_info_struct (pngReadStruct); - - if (pngInfoStruct == nullptr) - { - png_destroy_read_struct (&pngReadStruct, 0, 0); - return Image::null; - } - - png_set_error_fn (pngReadStruct, 0, PNGHelpers::errorCallback, PNGHelpers::warningCallback); - - // read the header.. - png_set_read_fn (pngReadStruct, &in, PNGHelpers::readCallback); - - png_uint_32 width = 0, height = 0; - int bitDepth = 0, colorType = 0, interlaceType; - - png_read_info (pngReadStruct, pngInfoStruct); - - png_get_IHDR (pngReadStruct, pngInfoStruct, - &width, &height, - &bitDepth, &colorType, - &interlaceType, 0, 0); - - if (bitDepth == 16) - png_set_strip_16 (pngReadStruct); - - if (colorType == PNG_COLOR_TYPE_PALETTE) - png_set_expand (pngReadStruct); - - if (bitDepth < 8) - png_set_expand (pngReadStruct); - - if (png_get_valid (pngReadStruct, pngInfoStruct, PNG_INFO_tRNS)) - png_set_expand (pngReadStruct); - - if (colorType == PNG_COLOR_TYPE_GRAY || colorType == PNG_COLOR_TYPE_GRAY_ALPHA) - png_set_gray_to_rgb (pngReadStruct); - - png_set_add_alpha (pngReadStruct, 0xff, PNG_FILLER_AFTER); - - bool hasAlphaChan = (colorType & PNG_COLOR_MASK_ALPHA) != 0 - || pngInfoStruct->num_trans > 0; - - // Load the image into a temp buffer in the pnglib format.. - const size_t lineStride = width * 4; - HeapBlock tempBuffer (height * lineStride); - - HeapBlock rows (height); - for (size_t y = 0; y < height; ++y) - rows[y] = (png_bytep) (tempBuffer + lineStride * y); - - try - { - png_read_image (pngReadStruct, rows); - png_read_end (pngReadStruct, pngInfoStruct); - } - catch (PNGHelpers::PNGErrorStruct&) - {} - - png_destroy_read_struct (&pngReadStruct, &pngInfoStruct, 0); - - // now convert the data to a juce image format.. - image = Image (hasAlphaChan ? Image::ARGB : Image::RGB, - (int) width, (int) height, hasAlphaChan); - - image.getProperties()->set ("originalImageHadAlpha", image.hasAlphaChannel()); - hasAlphaChan = image.hasAlphaChannel(); // (the native image creator may not give back what we expect) - - const Image::BitmapData destData (image, Image::BitmapData::writeOnly); - - for (int y = 0; y < (int) height; ++y) - { - const uint8* src = rows[y]; - uint8* dest = destData.getLinePointer (y); - - if (hasAlphaChan) - { - for (int i = (int) width; --i >= 0;) - { - ((PixelARGB*) dest)->setARGB (src[3], src[0], src[1], src[2]); - ((PixelARGB*) dest)->premultiply(); - dest += destData.pixelStride; - src += 4; - } - } - else - { - for (int i = (int) width; --i >= 0;) - { - ((PixelRGB*) dest)->setARGB (0, src[0], src[1], src[2]); - dest += destData.pixelStride; - src += 4; - } - } - } - } - catch (PNGHelpers::PNGErrorStruct&) - {} - } - - return image; -#endif -} - -bool PNGImageFormat::writeImageToStream (const Image& image, OutputStream& out) -{ - using namespace pnglibNamespace; - const int width = image.getWidth(); - const int height = image.getHeight(); - - png_structp pngWriteStruct = png_create_write_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0); - - if (pngWriteStruct == nullptr) - return false; - - png_infop pngInfoStruct = png_create_info_struct (pngWriteStruct); - - if (pngInfoStruct == nullptr) - { - png_destroy_write_struct (&pngWriteStruct, (png_infopp) nullptr); - return false; - } - - png_set_write_fn (pngWriteStruct, &out, PNGHelpers::writeDataCallback, 0); - - png_set_IHDR (pngWriteStruct, pngInfoStruct, (png_uint_32) width, (png_uint_32) height, 8, - image.hasAlphaChannel() ? PNG_COLOR_TYPE_RGB_ALPHA - : PNG_COLOR_TYPE_RGB, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, - PNG_FILTER_TYPE_BASE); - - HeapBlock rowData ((size_t) width * 4); - - png_color_8 sig_bit; - sig_bit.red = 8; - sig_bit.green = 8; - sig_bit.blue = 8; - sig_bit.gray = 0; - sig_bit.alpha = 8; - png_set_sBIT (pngWriteStruct, pngInfoStruct, &sig_bit); - - png_write_info (pngWriteStruct, pngInfoStruct); - - png_set_shift (pngWriteStruct, &sig_bit); - png_set_packing (pngWriteStruct); - - const Image::BitmapData srcData (image, Image::BitmapData::readOnly); - - for (int y = 0; y < height; ++y) - { - uint8* dst = rowData; - const uint8* src = srcData.getLinePointer (y); - - if (image.hasAlphaChannel()) - { - for (int i = width; --i >= 0;) - { - PixelARGB p (*(const PixelARGB*) src); - p.unpremultiply(); - - *dst++ = p.getRed(); - *dst++ = p.getGreen(); - *dst++ = p.getBlue(); - *dst++ = p.getAlpha(); - src += srcData.pixelStride; - } - } - else - { - for (int i = width; --i >= 0;) - { - *dst++ = ((const PixelRGB*) src)->getRed(); - *dst++ = ((const PixelRGB*) src)->getGreen(); - *dst++ = ((const PixelRGB*) src)->getBlue(); - src += srcData.pixelStride; - } - } - - png_bytep rowPtr = rowData; - png_write_rows (pngWriteStruct, &rowPtr, 1); - } - - png_write_end (pngWriteStruct, pngInfoStruct); - png_destroy_write_struct (&pngWriteStruct, &pngInfoStruct); - - return true; -} diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/LICENSE b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/LICENSE deleted file mode 100755 index 462c70d..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/LICENSE +++ /dev/null @@ -1,109 +0,0 @@ - -This copy of the libpng notices is provided for your convenience. In case of -any discrepancy between this copy and the notices in the file png.h that is -included in the libpng distribution, the latter shall prevail. - -COPYRIGHT NOTICE, DISCLAIMER, and LICENSE: - -If you modify libpng you may insert additional notices immediately following -this sentence. - -libpng versions 1.2.6, August 15, 2004, through 1.2.21, October 4, 2007, are -Copyright (c) 2004, 2006-2007 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.2.5 -with the following individual added to the list of Contributing Authors - - Cosmin Truta - -libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are -Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-1.0.6 -with the following individuals added to the list of Contributing Authors - - Simon-Pierre Cadieux - Eric S. Raymond - Gilles Vollant - -and with the following additions to the disclaimer: - - There is no warranty against interference with your enjoyment of the - library or against infringement. There is no warranty that our - efforts or the library will fulfill any of your particular purposes - or needs. This library is provided with all faults, and the entire - risk of satisfactory quality, performance, accuracy, and effort is with - the user. - -libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are -Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are -distributed according to the same disclaimer and license as libpng-0.96, -with the following individuals added to the list of Contributing Authors: - - Tom Lane - Glenn Randers-Pehrson - Willem van Schaik - -libpng versions 0.89, June 1996, through 0.96, May 1997, are -Copyright (c) 1996, 1997 Andreas Dilger -Distributed according to the same disclaimer and license as libpng-0.88, -with the following individuals added to the list of Contributing Authors: - - John Bowler - Kevin Bracey - Sam Bushell - Magnus Holmgren - Greg Roelofs - Tom Tanner - -libpng versions 0.5, May 1995, through 0.88, January 1996, are -Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc. - -For the purposes of this copyright and license, "Contributing Authors" -is defined as the following set of individuals: - - Andreas Dilger - Dave Martindale - Guy Eric Schalnat - Paul Schmidt - Tim Wegner - -The PNG Reference Library is supplied "AS IS". The Contributing Authors -and Group 42, Inc. disclaim all warranties, expressed or implied, -including, without limitation, the warranties of merchantability and of -fitness for any purpose. The Contributing Authors and Group 42, Inc. -assume no liability for direct, indirect, incidental, special, exemplary, -or consequential damages, which may result from the use of the PNG -Reference Library, even if advised of the possibility of such damage. - -Permission is hereby granted to use, copy, modify, and distribute this -source code, or portions hereof, for any purpose, without fee, subject -to the following restrictions: - -1. The origin of this source code must not be misrepresented. - -2. Altered versions must be plainly marked as such and must not - be misrepresented as being the original source. - -3. This Copyright notice may not be removed or altered from any - source or altered source distribution. - -The Contributing Authors and Group 42, Inc. specifically permit, without -fee, and encourage the use of this source code as a component to -supporting the PNG file format in commercial products. If you use this -source code in a product, acknowledgment is not required but would be -appreciated. - - -A "png_get_copyright" function is available, for convenient use in "about" -boxes and the like: - - printf("%s",png_get_copyright(NULL)); - -Also, the PNG logo (in PNG format, of course) is supplied in the -files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31). - -Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a -certification mark of the Open Source Initiative. - -Glenn Randers-Pehrson -glennrp at users.sourceforge.net -October 4, 2007 diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/libpng_readme.txt b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/libpng_readme.txt deleted file mode 100755 index 75a4595..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/libpng_readme.txt +++ /dev/null @@ -1,2 +0,0 @@ - -These files are from the libpng library - http://www.libpng.org/ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.c deleted file mode 100755 index 67e7e2e..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.c +++ /dev/null @@ -1,4295 +0,0 @@ - -/* png.c - location for general purpose libpng functions - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - */ - -#include "pngpriv.h" - -/* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_1 Your_png_h_is_not_version_1_6_1; - -/* Tells libpng that we have already handled the first "num_bytes" bytes - * of the PNG file signature. If the PNG data is embedded into another - * stream we can set num_bytes = 8 so that libpng will not attempt to read - * or write any of the magic bytes before it starts on the IHDR. - */ - -#ifdef PNG_READ_SUPPORTED -void PNGAPI -png_set_sig_bytes(png_structrp png_ptr, int num_bytes) -{ - png_debug(1, "in png_set_sig_bytes"); - - if (png_ptr == NULL) - return; - - if (num_bytes > 8) - png_error(png_ptr, "Too many bytes for PNG signature"); - - png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes); -} - -/* Checks whether the supplied bytes match the PNG signature. We allow - * checking less than the full 8-byte signature so that those apps that - * already read the first few bytes of a file to determine the file type - * can simply check the remaining bytes for extra assurance. Returns - * an integer less than, equal to, or greater than zero if sig is found, - * respectively, to be less than, to match, or be greater than the correct - * PNG signature (this is the same behavior as strcmp, memcmp, etc). - */ -int PNGAPI -png_sig_cmp(png_const_bytep sig, png_size_t start, png_size_t num_to_check) -{ - png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; - - if (num_to_check > 8) - num_to_check = 8; - - else if (num_to_check < 1) - return (-1); - - if (start > 7) - return (-1); - - if (start + num_to_check > 8) - num_to_check = 8 - start; - - return ((int)(memcmp(&sig[start], &png_signature[start], num_to_check))); -} - -#endif /* PNG_READ_SUPPORTED */ - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -/* Function to allocate memory for zlib */ -PNG_FUNCTION(voidpf /* PRIVATE */, -png_zalloc,(voidpf png_ptr, uInt items, uInt size),PNG_ALLOCATED) -{ - png_alloc_size_t num_bytes = size; - - if (png_ptr == NULL) - return NULL; - - if (items >= (~(png_alloc_size_t)0)/size) - { - png_warning (png_voidcast(png_structrp, png_ptr), - "Potential overflow in png_zalloc()"); - return NULL; - } - - num_bytes *= items; - return png_malloc_warn(png_voidcast(png_structrp, png_ptr), num_bytes); -} - -/* Function to free memory for zlib */ -void /* PRIVATE */ -png_zfree(voidpf png_ptr, voidpf ptr) -{ - png_free(png_voidcast(png_const_structrp,png_ptr), ptr); -} - -/* Reset the CRC variable to 32 bits of 1's. Care must be taken - * in case CRC is > 32 bits to leave the top bits 0. - */ -void /* PRIVATE */ -png_reset_crc(png_structrp png_ptr) -{ - /* The cast is safe because the crc is a 32 bit value. */ - png_ptr->crc = (png_uint_32)crc32(0, Z_NULL, 0); -} - -/* Calculate the CRC over a section of data. We can only pass as - * much data to this routine as the largest single buffer size. We - * also check that this data will actually be used before going to the - * trouble of calculating it. - */ -void /* PRIVATE */ -png_calculate_crc(png_structrp png_ptr, png_const_bytep ptr, png_size_t length) -{ - int need_crc = 1; - - if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name)) - { - if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == - (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) - need_crc = 0; - } - - else /* critical */ - { - if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) - need_crc = 0; - } - - /* 'uLong' is defined in zlib.h as unsigned long; this means that on some - * systems it is a 64 bit value. crc32, however, returns 32 bits so the - * following cast is safe. 'uInt' may be no more than 16 bits, so it is - * necessary to perform a loop here. - */ - if (need_crc && length > 0) - { - uLong crc = png_ptr->crc; /* Should never issue a warning */ - - do - { - uInt safe_length = (uInt)length; - if (safe_length == 0) - safe_length = (uInt)-1; /* evil, but safe */ - - crc = crc32(crc, ptr, safe_length); - - /* The following should never issue compiler warnings; if they do the - * target system has characteristics that will probably violate other - * assumptions within the libpng code. - */ - ptr += safe_length; - length -= safe_length; - } - while (length > 0); - - /* And the following is always safe because the crc is only 32 bits. */ - png_ptr->crc = (png_uint_32)crc; - } -} - -/* Check a user supplied version number, called from both read and write - * functions that create a png_struct. - */ -int -png_user_version_check(png_structrp png_ptr, png_const_charp user_png_ver) -{ - if (user_png_ver) - { - int i = 0; - - do - { - if (user_png_ver[i] != png_libpng_ver[i]) - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - } while (png_libpng_ver[i++]); - } - - else - png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH; - - if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH) - { - /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so - * we must recompile any applications that use any older library version. - * For versions after libpng 1.0, we will be compatible, so we need - * only check the first and third digits (note that when we reach version - * 1.10 we will need to check the fourth symbol, namely user_png_ver[3]). - */ - if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] || - (user_png_ver[0] == '1' && (user_png_ver[2] != png_libpng_ver[2] || - user_png_ver[3] != png_libpng_ver[3])) || - (user_png_ver[0] == '0' && user_png_ver[2] < '9')) - { -#ifdef PNG_WARNINGS_SUPPORTED - size_t pos = 0; - char m[128]; - - pos = png_safecat(m, (sizeof m), pos, - "Application built with libpng-"); - pos = png_safecat(m, (sizeof m), pos, user_png_ver); - pos = png_safecat(m, (sizeof m), pos, " but running with "); - png_safecat(m, (sizeof m), pos, png_libpng_ver); - - png_warning(png_ptr, m); -#endif - -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - png_ptr->flags = 0; -#endif - - return 0; - } - } - - /* Success return. */ - return 1; -} - -/* Generic function to create a png_struct for either read or write - this - * contains the common initialization. - */ -PNG_FUNCTION(png_structp /* PRIVATE */, -png_create_png_struct,(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp, - png_malloc_ptr, png_free_ptr),PNG_ALLOCATED) -{ - png_struct create_struct; -# ifdef PNG_SETJMP_SUPPORTED - jmp_buf create_jmp_buf; -# endif - - /* This temporary stack-allocated structure is used to provide a place to - * build enough context to allow the user provided memory allocator (if any) - * to be called. - */ - memset(&create_struct, 0, (sizeof create_struct)); - - /* Added at libpng-1.2.6 */ -# ifdef PNG_USER_LIMITS_SUPPORTED - create_struct.user_width_max = PNG_USER_WIDTH_MAX; - create_struct.user_height_max = PNG_USER_HEIGHT_MAX; - -# ifdef PNG_USER_CHUNK_CACHE_MAX - /* Added at libpng-1.2.43 and 1.4.0 */ - create_struct.user_chunk_cache_max = PNG_USER_CHUNK_CACHE_MAX; -# endif - -# ifdef PNG_USER_CHUNK_MALLOC_MAX - /* Added at libpng-1.2.43 and 1.4.1, required only for read but exists - * in png_struct regardless. - */ - create_struct.user_chunk_malloc_max = PNG_USER_CHUNK_MALLOC_MAX; -# endif -# endif - - /* The following two API calls simply set fields in png_struct, so it is safe - * to do them now even though error handling is not yet set up. - */ -# ifdef PNG_USER_MEM_SUPPORTED - png_set_mem_fn(&create_struct, mem_ptr, malloc_fn, free_fn); -# endif - - /* (*error_fn) can return control to the caller after the error_ptr is set, - * this will result in a memory leak unless the error_fn does something - * extremely sophisticated. The design lacks merit but is implicit in the - * API. - */ - png_set_error_fn(&create_struct, error_ptr, error_fn, warn_fn); - -# ifdef PNG_SETJMP_SUPPORTED - if (!setjmp(create_jmp_buf)) - { - /* Temporarily fake out the longjmp information until we have - * successfully completed this function. This only works if we have - * setjmp() support compiled in, but it is safe - this stuff should - * never happen. - */ - create_struct.jmp_buf_ptr = &create_jmp_buf; - create_struct.jmp_buf_size = 0; /*stack allocation*/ - create_struct.longjmp_fn = longjmp; -# else - { -# endif - /* Call the general version checker (shared with read and write code): - */ - if (png_user_version_check(&create_struct, user_png_ver)) - { - png_structrp png_ptr = png_voidcast(png_structrp, - png_malloc_warn(&create_struct, (sizeof *png_ptr))); - - if (png_ptr != NULL) - { - /* png_ptr->zstream holds a back-pointer to the png_struct, so - * this can only be done now: - */ - create_struct.zstream.zalloc = png_zalloc; - create_struct.zstream.zfree = png_zfree; - create_struct.zstream.opaque = png_ptr; - -# ifdef PNG_SETJMP_SUPPORTED - /* Eliminate the local error handling: */ - create_struct.jmp_buf_ptr = NULL; - create_struct.jmp_buf_size = 0; - create_struct.longjmp_fn = 0; -# endif - - *png_ptr = create_struct; - - /* This is the successful return point */ - return png_ptr; - } - } - } - - /* A longjmp because of a bug in the application storage allocator or a - * simple failure to allocate the png_struct. - */ - return NULL; -} - -/* Allocate the memory for an info_struct for the application. */ -PNG_FUNCTION(png_infop,PNGAPI -png_create_info_struct,(png_const_structrp png_ptr),PNG_ALLOCATED) -{ - png_inforp info_ptr; - - png_debug(1, "in png_create_info_struct"); - - if (png_ptr == NULL) - return NULL; - - /* Use the internal API that does not (or at least should not) error out, so - * that this call always returns ok. The application typically sets up the - * error handling *after* creating the info_struct because this is the way it - * has always been done in 'example.c'. - */ - info_ptr = png_voidcast(png_inforp, png_malloc_base(png_ptr, - (sizeof *info_ptr))); - - if (info_ptr != NULL) - memset(info_ptr, 0, (sizeof *info_ptr)); - - return info_ptr; -} - -/* This function frees the memory associated with a single info struct. - * Normally, one would use either png_destroy_read_struct() or - * png_destroy_write_struct() to free an info struct, but this may be - * useful for some applications. From libpng 1.6.0 this function is also used - * internally to implement the png_info release part of the 'struct' destroy - * APIs. This ensures that all possible approaches free the same data (all of - * it). - */ -void PNGAPI -png_destroy_info_struct(png_const_structrp png_ptr, png_infopp info_ptr_ptr) -{ - png_inforp info_ptr = NULL; - - png_debug(1, "in png_destroy_info_struct"); - - if (png_ptr == NULL) - return; - - if (info_ptr_ptr != NULL) - info_ptr = *info_ptr_ptr; - - if (info_ptr != NULL) - { - /* Do this first in case of an error below; if the app implements its own - * memory management this can lead to png_free calling png_error, which - * will abort this routine and return control to the app error handler. - * An infinite loop may result if it then tries to free the same info - * ptr. - */ - *info_ptr_ptr = NULL; - - png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1); - memset(info_ptr, 0, (sizeof *info_ptr)); - png_free(png_ptr, info_ptr); - } -} - -/* Initialize the info structure. This is now an internal function (0.89) - * and applications using it are urged to use png_create_info_struct() - * instead. Use deprecated in 1.6.0, internal use removed (used internally it - * is just a memset). - * - * NOTE: it is almost inconceivable that this API is used because it bypasses - * the user-memory mechanism and the user error handling/warning mechanisms in - * those cases where it does anything other than a memset. - */ -PNG_FUNCTION(void,PNGAPI -png_info_init_3,(png_infopp ptr_ptr, png_size_t png_info_struct_size), - PNG_DEPRECATED) -{ - png_inforp info_ptr = *ptr_ptr; - - png_debug(1, "in png_info_init_3"); - - if (info_ptr == NULL) - return; - - if ((sizeof (png_info)) > png_info_struct_size) - { - *ptr_ptr = NULL; - /* The following line is why this API should not be used: */ - free(info_ptr); - info_ptr = png_voidcast(png_inforp, png_malloc_base(NULL, - (sizeof *info_ptr))); - *ptr_ptr = info_ptr; - } - - /* Set everything to 0 */ - memset(info_ptr, 0, (sizeof *info_ptr)); -} - -/* The following API is not called internally */ -void PNGAPI -png_data_freer(png_const_structrp png_ptr, png_inforp info_ptr, - int freer, png_uint_32 mask) -{ - png_debug(1, "in png_data_freer"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (freer == PNG_DESTROY_WILL_FREE_DATA) - info_ptr->free_me |= mask; - - else if (freer == PNG_USER_WILL_FREE_DATA) - info_ptr->free_me &= ~mask; - - else - png_error(png_ptr, "Unknown freer parameter in png_data_freer"); -} - -void PNGAPI -png_free_data(png_const_structrp png_ptr, png_inforp info_ptr, png_uint_32 mask, - int num) -{ - png_debug(1, "in png_free_data"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - -#ifdef PNG_TEXT_SUPPORTED - /* Free text item num or (if num == -1) all text items */ - if ((mask & PNG_FREE_TEXT) & info_ptr->free_me) - { - if (num != -1) - { - if (info_ptr->text && info_ptr->text[num].key) - { - png_free(png_ptr, info_ptr->text[num].key); - info_ptr->text[num].key = NULL; - } - } - - else - { - int i; - for (i = 0; i < info_ptr->num_text; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i); - png_free(png_ptr, info_ptr->text); - info_ptr->text = NULL; - info_ptr->num_text=0; - } - } -#endif - -#ifdef PNG_tRNS_SUPPORTED - /* Free any tRNS entry */ - if ((mask & PNG_FREE_TRNS) & info_ptr->free_me) - { - png_free(png_ptr, info_ptr->trans_alpha); - info_ptr->trans_alpha = NULL; - info_ptr->valid &= ~PNG_INFO_tRNS; - } -#endif - -#ifdef PNG_sCAL_SUPPORTED - /* Free any sCAL entry */ - if ((mask & PNG_FREE_SCAL) & info_ptr->free_me) - { - png_free(png_ptr, info_ptr->scal_s_width); - png_free(png_ptr, info_ptr->scal_s_height); - info_ptr->scal_s_width = NULL; - info_ptr->scal_s_height = NULL; - info_ptr->valid &= ~PNG_INFO_sCAL; - } -#endif - -#ifdef PNG_pCAL_SUPPORTED - /* Free any pCAL entry */ - if ((mask & PNG_FREE_PCAL) & info_ptr->free_me) - { - png_free(png_ptr, info_ptr->pcal_purpose); - png_free(png_ptr, info_ptr->pcal_units); - info_ptr->pcal_purpose = NULL; - info_ptr->pcal_units = NULL; - if (info_ptr->pcal_params != NULL) - { - unsigned int i; - for (i = 0; i < info_ptr->pcal_nparams; i++) - { - png_free(png_ptr, info_ptr->pcal_params[i]); - info_ptr->pcal_params[i] = NULL; - } - png_free(png_ptr, info_ptr->pcal_params); - info_ptr->pcal_params = NULL; - } - info_ptr->valid &= ~PNG_INFO_pCAL; - } -#endif - -#ifdef PNG_iCCP_SUPPORTED - /* Free any profile entry */ - if ((mask & PNG_FREE_ICCP) & info_ptr->free_me) - { - png_free(png_ptr, info_ptr->iccp_name); - png_free(png_ptr, info_ptr->iccp_profile); - info_ptr->iccp_name = NULL; - info_ptr->iccp_profile = NULL; - info_ptr->valid &= ~PNG_INFO_iCCP; - } -#endif - -#ifdef PNG_sPLT_SUPPORTED - /* Free a given sPLT entry, or (if num == -1) all sPLT entries */ - if ((mask & PNG_FREE_SPLT) & info_ptr->free_me) - { - if (num != -1) - { - if (info_ptr->splt_palettes) - { - png_free(png_ptr, info_ptr->splt_palettes[num].name); - png_free(png_ptr, info_ptr->splt_palettes[num].entries); - info_ptr->splt_palettes[num].name = NULL; - info_ptr->splt_palettes[num].entries = NULL; - } - } - - else - { - if (info_ptr->splt_palettes_num) - { - int i; - for (i = 0; i < info_ptr->splt_palettes_num; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, (int)i); - - png_free(png_ptr, info_ptr->splt_palettes); - info_ptr->splt_palettes = NULL; - info_ptr->splt_palettes_num = 0; - } - info_ptr->valid &= ~PNG_INFO_sPLT; - } - } -#endif - -#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED - if ((mask & PNG_FREE_UNKN) & info_ptr->free_me) - { - if (num != -1) - { - if (info_ptr->unknown_chunks) - { - png_free(png_ptr, info_ptr->unknown_chunks[num].data); - info_ptr->unknown_chunks[num].data = NULL; - } - } - - else - { - int i; - - if (info_ptr->unknown_chunks_num) - { - for (i = 0; i < info_ptr->unknown_chunks_num; i++) - png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, (int)i); - - png_free(png_ptr, info_ptr->unknown_chunks); - info_ptr->unknown_chunks = NULL; - info_ptr->unknown_chunks_num = 0; - } - } - } -#endif - -#ifdef PNG_hIST_SUPPORTED - /* Free any hIST entry */ - if ((mask & PNG_FREE_HIST) & info_ptr->free_me) - { - png_free(png_ptr, info_ptr->hist); - info_ptr->hist = NULL; - info_ptr->valid &= ~PNG_INFO_hIST; - } -#endif - - /* Free any PLTE entry that was internally allocated */ - if ((mask & PNG_FREE_PLTE) & info_ptr->free_me) - { - png_free(png_ptr, info_ptr->palette); - info_ptr->palette = NULL; - info_ptr->valid &= ~PNG_INFO_PLTE; - info_ptr->num_palette = 0; - } - -#ifdef PNG_INFO_IMAGE_SUPPORTED - /* Free any image bits attached to the info structure */ - if ((mask & PNG_FREE_ROWS) & info_ptr->free_me) - { - if (info_ptr->row_pointers) - { - png_uint_32 row; - for (row = 0; row < info_ptr->height; row++) - { - png_free(png_ptr, info_ptr->row_pointers[row]); - info_ptr->row_pointers[row] = NULL; - } - png_free(png_ptr, info_ptr->row_pointers); - info_ptr->row_pointers = NULL; - } - info_ptr->valid &= ~PNG_INFO_IDAT; - } -#endif - - if (num != -1) - mask &= ~PNG_FREE_MUL; - - info_ptr->free_me &= ~mask; -} -#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ - -/* This function returns a pointer to the io_ptr associated with the user - * functions. The application should free any memory associated with this - * pointer before png_write_destroy() or png_read_destroy() are called. - */ -png_voidp PNGAPI -png_get_io_ptr(png_const_structrp png_ptr) -{ - if (png_ptr == NULL) - return (NULL); - - return (png_ptr->io_ptr); -} - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -# ifdef PNG_STDIO_SUPPORTED -/* Initialize the default input/output functions for the PNG file. If you - * use your own read or write routines, you can call either png_set_read_fn() - * or png_set_write_fn() instead of png_init_io(). If you have defined - * PNG_NO_STDIO or otherwise disabled PNG_STDIO_SUPPORTED, you must use a - * function of your own because "FILE *" isn't necessarily available. - */ -void PNGAPI -png_init_io(png_structrp png_ptr, png_FILE_p fp) -{ - png_debug(1, "in png_init_io"); - - if (png_ptr == NULL) - return; - - png_ptr->io_ptr = (png_voidp)fp; -} -# endif - -#ifdef PNG_SAVE_INT_32_SUPPORTED -/* The png_save_int_32 function assumes integers are stored in two's - * complement format. If this isn't the case, then this routine needs to - * be modified to write data in two's complement format. Note that, - * the following works correctly even if png_int_32 has more than 32 bits - * (compare the more complex code required on read for sign extension.) - */ -void PNGAPI -png_save_int_32(png_bytep buf, png_int_32 i) -{ - buf[0] = (png_byte)((i >> 24) & 0xff); - buf[1] = (png_byte)((i >> 16) & 0xff); - buf[2] = (png_byte)((i >> 8) & 0xff); - buf[3] = (png_byte)(i & 0xff); -} -#endif - -# ifdef PNG_TIME_RFC1123_SUPPORTED -/* Convert the supplied time into an RFC 1123 string suitable for use in - * a "Creation Time" or other text-based time string. - */ -int PNGAPI -png_convert_to_rfc1123_buffer(char out[29], png_const_timep ptime) -{ - static PNG_CONST char short_months[12][4] = - {"Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; - - if (out == NULL) - return 0; - - if (ptime->year > 9999 /* RFC1123 limitation */ || - ptime->month == 0 || ptime->month > 12 || - ptime->day == 0 || ptime->day > 31 || - ptime->hour > 23 || ptime->minute > 59 || - ptime->second > 60) - return 0; - - { - size_t pos = 0; - char number_buf[5]; /* enough for a four-digit year */ - -# define APPEND_STRING(string) pos = png_safecat(out, 29, pos, (string)) -# define APPEND_NUMBER(format, value)\ - APPEND_STRING(PNG_FORMAT_NUMBER(number_buf, format, (value))) -# define APPEND(ch) if (pos < 28) out[pos++] = (ch) - - APPEND_NUMBER(PNG_NUMBER_FORMAT_u, (unsigned)ptime->day); - APPEND(' '); - APPEND_STRING(short_months[(ptime->month - 1)]); - APPEND(' '); - APPEND_NUMBER(PNG_NUMBER_FORMAT_u, ptime->year); - APPEND(' '); - APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->hour); - APPEND(':'); - APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->minute); - APPEND(':'); - APPEND_NUMBER(PNG_NUMBER_FORMAT_02u, (unsigned)ptime->second); - APPEND_STRING(" +0000"); /* This reliably terminates the buffer */ - -# undef APPEND -# undef APPEND_NUMBER -# undef APPEND_STRING - } - - return 1; -} - -# if PNG_LIBPNG_VER < 10700 -/* To do: remove the following from libpng-1.7 */ -/* Original API that uses a private buffer in png_struct. - * Deprecated because it causes png_struct to carry a spurious temporary - * buffer (png_struct::time_buffer), better to have the caller pass this in. - */ -png_const_charp PNGAPI -png_convert_to_rfc1123(png_structrp png_ptr, png_const_timep ptime) -{ - if (png_ptr != NULL) - { - /* The only failure above if png_ptr != NULL is from an invalid ptime */ - if (!png_convert_to_rfc1123_buffer(png_ptr->time_buffer, ptime)) - png_warning(png_ptr, "Ignoring invalid time value"); - - else - return png_ptr->time_buffer; - } - - return NULL; -} -# endif -# endif /* PNG_TIME_RFC1123_SUPPORTED */ - -#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ - -png_const_charp PNGAPI -png_get_copyright(png_const_structrp png_ptr) -{ - PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */ -#ifdef PNG_STRING_COPYRIGHT - return PNG_STRING_COPYRIGHT -#else -# ifdef __STDC__ - return PNG_STRING_NEWLINE \ - "libpng version 1.6.1 - March 28, 2013" PNG_STRING_NEWLINE \ - "Copyright (c) 1998-2013 Glenn Randers-Pehrson" PNG_STRING_NEWLINE \ - "Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \ - "Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc." \ - PNG_STRING_NEWLINE; -# else - return "libpng version 1.6.1 - March 28, 2013\ - Copyright (c) 1998-2013 Glenn Randers-Pehrson\ - Copyright (c) 1996-1997 Andreas Dilger\ - Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc."; -# endif -#endif -} - -/* The following return the library version as a short string in the - * format 1.0.0 through 99.99.99zz. To get the version of *.h files - * used with your application, print out PNG_LIBPNG_VER_STRING, which - * is defined in png.h. - * Note: now there is no difference between png_get_libpng_ver() and - * png_get_header_ver(). Due to the version_nn_nn_nn typedef guard, - * it is guaranteed that png.c uses the correct version of png.h. - */ -png_const_charp PNGAPI -png_get_libpng_ver(png_const_structrp png_ptr) -{ - /* Version of *.c files used when building libpng */ - return png_get_header_ver(png_ptr); -} - -png_const_charp PNGAPI -png_get_header_ver(png_const_structrp png_ptr) -{ - /* Version of *.h files used when building libpng */ - PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */ - return PNG_LIBPNG_VER_STRING; -} - -png_const_charp PNGAPI -png_get_header_version(png_const_structrp png_ptr) -{ - /* Returns longer string containing both version and date */ - PNG_UNUSED(png_ptr) /* Silence compiler warning about unused png_ptr */ -#ifdef __STDC__ - return PNG_HEADER_VERSION_STRING -# ifndef PNG_READ_SUPPORTED - " (NO READ SUPPORT)" -# endif - PNG_STRING_NEWLINE; -#else - return PNG_HEADER_VERSION_STRING; -#endif -} - -#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED -int PNGAPI -png_handle_as_unknown(png_const_structrp png_ptr, png_const_bytep chunk_name) -{ - /* Check chunk_name and return "keep" value if it's on the list, else 0 */ - png_const_bytep p, p_end; - - if (png_ptr == NULL || chunk_name == NULL || png_ptr->num_chunk_list == 0) - return PNG_HANDLE_CHUNK_AS_DEFAULT; - - p_end = png_ptr->chunk_list; - p = p_end + png_ptr->num_chunk_list*5; /* beyond end */ - - /* The code is the fifth byte after each four byte string. Historically this - * code was always searched from the end of the list, this is no longer - * necessary because the 'set' routine handles duplicate entries correcty. - */ - do /* num_chunk_list > 0, so at least one */ - { - p -= 5; - - if (!memcmp(chunk_name, p, 4)) - return p[4]; - } - while (p > p_end); - - /* This means that known chunks should be processed and unknown chunks should - * be handled according to the value of png_ptr->unknown_default; this can be - * confusing because, as a result, there are two levels of defaulting for - * unknown chunks. - */ - return PNG_HANDLE_CHUNK_AS_DEFAULT; -} - -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED -int /* PRIVATE */ -png_chunk_unknown_handling(png_const_structrp png_ptr, png_uint_32 chunk_name) -{ - png_byte chunk_string[5]; - - PNG_CSTRING_FROM_CHUNK(chunk_string, chunk_name); - return png_handle_as_unknown(png_ptr, chunk_string); -} -#endif /* READ_UNKNOWN_CHUNKS */ -#endif /* SET_UNKNOWN_CHUNKS */ - -#ifdef PNG_READ_SUPPORTED -/* This function, added to libpng-1.0.6g, is untested. */ -int PNGAPI -png_reset_zstream(png_structrp png_ptr) -{ - if (png_ptr == NULL) - return Z_STREAM_ERROR; - - /* WARNING: this resets the window bits to the maximum! */ - return (inflateReset(&png_ptr->zstream)); -} -#endif /* PNG_READ_SUPPORTED */ - -/* This function was added to libpng-1.0.7 */ -png_uint_32 PNGAPI -png_access_version_number(void) -{ - /* Version of *.c files used when building libpng */ - return((png_uint_32)PNG_LIBPNG_VER); -} - - - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -/* Ensure that png_ptr->zstream.msg holds some appropriate error message string. - * If it doesn't 'ret' is used to set it to something appropriate, even in cases - * like Z_OK or Z_STREAM_END where the error code is apparently a success code. - */ -void /* PRIVATE */ -png_zstream_error(png_structrp png_ptr, int ret) -{ - /* Translate 'ret' into an appropriate error string, priority is given to the - * one in zstream if set. This always returns a string, even in cases like - * Z_OK or Z_STREAM_END where the error code is a success code. - */ - if (png_ptr->zstream.msg == NULL) switch (ret) - { - default: - case Z_OK: - png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected zlib return code"); - break; - - case Z_STREAM_END: - /* Normal exit */ - png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected end of LZ stream"); - break; - - case Z_NEED_DICT: - /* This means the deflate stream did not have a dictionary; this - * indicates a bogus PNG. - */ - png_ptr->zstream.msg = PNGZ_MSG_CAST("missing LZ dictionary"); - break; - - case Z_ERRNO: - /* gz APIs only: should not happen */ - png_ptr->zstream.msg = PNGZ_MSG_CAST("zlib IO error"); - break; - - case Z_STREAM_ERROR: - /* internal libpng error */ - png_ptr->zstream.msg = PNGZ_MSG_CAST("bad parameters to zlib"); - break; - - case Z_DATA_ERROR: - png_ptr->zstream.msg = PNGZ_MSG_CAST("damaged LZ stream"); - break; - - case Z_MEM_ERROR: - png_ptr->zstream.msg = PNGZ_MSG_CAST("insufficient memory"); - break; - - case Z_BUF_ERROR: - /* End of input or output; not a problem if the caller is doing - * incremental read or write. - */ - png_ptr->zstream.msg = PNGZ_MSG_CAST("truncated"); - break; - - case Z_VERSION_ERROR: - png_ptr->zstream.msg = PNGZ_MSG_CAST("unsupported zlib version"); - break; - - case PNG_UNEXPECTED_ZLIB_RETURN: - /* Compile errors here mean that zlib now uses the value co-opted in - * pngpriv.h for PNG_UNEXPECTED_ZLIB_RETURN; update the switch above - * and change pngpriv.h. Note that this message is "... return", - * whereas the default/Z_OK one is "... return code". - */ - png_ptr->zstream.msg = PNGZ_MSG_CAST("unexpected zlib return"); - break; - } -} - -/* png_convert_size: a PNGAPI but no longer in png.h, so deleted - * at libpng 1.5.5! - */ - -/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */ -#ifdef PNG_GAMMA_SUPPORTED /* always set if COLORSPACE */ -static int -png_colorspace_check_gamma(png_const_structrp png_ptr, - png_colorspacerp colorspace, png_fixed_point gAMA, int from) - /* This is called to check a new gamma value against an existing one. The - * routine returns false if the new gamma value should not be written. - * - * 'from' says where the new gamma value comes from: - * - * 0: the new gamma value is the libpng estimate for an ICC profile - * 1: the new gamma value comes from a gAMA chunk - * 2: the new gamma value comes from an sRGB chunk - */ -{ - png_fixed_point gtest; - - if ((colorspace->flags & PNG_COLORSPACE_HAVE_GAMMA) != 0 && - (!png_muldiv(>est, colorspace->gamma, PNG_FP_1, gAMA) || - png_gamma_significant(gtest))) - { - /* Either this is an sRGB image, in which case the calculated gamma - * approximation should match, or this is an image with a profile and the - * value libpng calculates for the gamma of the profile does not match the - * value recorded in the file. The former, sRGB, case is an error, the - * latter is just a warning. - */ - if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0 || from == 2) - { - png_chunk_report(png_ptr, "gamma value does not match sRGB", - PNG_CHUNK_ERROR); - /* Do not overwrite an sRGB value */ - return from == 2; - } - - else /* sRGB tag not involved */ - { - png_chunk_report(png_ptr, "gamma value does not match libpng estimate", - PNG_CHUNK_WARNING); - return from == 1; - } - } - - return 1; -} - -void /* PRIVATE */ -png_colorspace_set_gamma(png_const_structrp png_ptr, - png_colorspacerp colorspace, png_fixed_point gAMA) -{ - /* Changed in libpng-1.5.4 to limit the values to ensure overflow can't - * occur. Since the fixed point representation is assymetrical it is - * possible for 1/gamma to overflow the limit of 21474 and this means the - * gamma value must be at least 5/100000 and hence at most 20000.0. For - * safety the limits here are a little narrower. The values are 0.00016 to - * 6250.0, which are truly ridiculous gamma values (and will produce - * displays that are all black or all white.) - * - * In 1.6.0 this test replaces the ones in pngrutil.c, in the gAMA chunk - * handling code, which only required the value to be >0. - */ - png_const_charp errmsg; - - if (gAMA < 16 || gAMA > 625000000) - errmsg = "gamma value out of range"; - -# ifdef PNG_READ_gAMA_SUPPORTED - /* Allow the application to set the gamma value more than once */ - else if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && - (colorspace->flags & PNG_COLORSPACE_FROM_gAMA) != 0) - errmsg = "duplicate"; -# endif - - /* Do nothing if the colorspace is already invalid */ - else if (colorspace->flags & PNG_COLORSPACE_INVALID) - return; - - else - { - if (png_colorspace_check_gamma(png_ptr, colorspace, gAMA, 1/*from gAMA*/)) - { - /* Store this gamma value. */ - colorspace->gamma = gAMA; - colorspace->flags |= - (PNG_COLORSPACE_HAVE_GAMMA | PNG_COLORSPACE_FROM_gAMA); - } - - /* At present if the check_gamma test fails the gamma of the colorspace is - * not updated however the colorspace is not invalidated. This - * corresponds to the case where the existing gamma comes from an sRGB - * chunk or profile. An error message has already been output. - */ - return; - } - - /* Error exit - errmsg has been set. */ - colorspace->flags |= PNG_COLORSPACE_INVALID; - png_chunk_report(png_ptr, errmsg, PNG_CHUNK_WRITE_ERROR); -} - -void /* PRIVATE */ -png_colorspace_sync_info(png_const_structrp png_ptr, png_inforp info_ptr) -{ - if (info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) - { - /* Everything is invalid */ - info_ptr->valid &= ~(PNG_INFO_gAMA|PNG_INFO_cHRM|PNG_INFO_sRGB| - PNG_INFO_iCCP); - -# ifdef PNG_COLORSPACE_SUPPORTED - /* Clean up the iCCP profile now if it won't be used. */ - png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, -1/*not used*/); -# else - PNG_UNUSED(png_ptr) -# endif - } - - else - { -# ifdef PNG_COLORSPACE_SUPPORTED - /* Leave the INFO_iCCP flag set if the pngset.c code has already set - * it; this allows a PNG to contain a profile which matches sRGB and - * yet still have that profile retrievable by the application. - */ - if (info_ptr->colorspace.flags & PNG_COLORSPACE_MATCHES_sRGB) - info_ptr->valid |= PNG_INFO_sRGB; - - else - info_ptr->valid &= ~PNG_INFO_sRGB; - - if (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) - info_ptr->valid |= PNG_INFO_cHRM; - - else - info_ptr->valid &= ~PNG_INFO_cHRM; -# endif - - if (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) - info_ptr->valid |= PNG_INFO_gAMA; - - else - info_ptr->valid &= ~PNG_INFO_gAMA; - } -} - -#ifdef PNG_READ_SUPPORTED -void /* PRIVATE */ -png_colorspace_sync(png_const_structrp png_ptr, png_inforp info_ptr) -{ - if (info_ptr == NULL) /* reduce code size; check here not in the caller */ - return; - - info_ptr->colorspace = png_ptr->colorspace; - png_colorspace_sync_info(png_ptr, info_ptr); -} -#endif -#endif - -#ifdef PNG_COLORSPACE_SUPPORTED -/* Added at libpng-1.5.5 to support read and write of true CIEXYZ values for - * cHRM, as opposed to using chromaticities. These internal APIs return - * non-zero on a parameter error. The X, Y and Z values are required to be - * positive and less than 1.0. - */ -static int -png_xy_from_XYZ(png_xy *xy, const png_XYZ *XYZ) -{ - png_int_32 d, dwhite, whiteX, whiteY; - - d = XYZ->red_X + XYZ->red_Y + XYZ->red_Z; - if (!png_muldiv(&xy->redx, XYZ->red_X, PNG_FP_1, d)) return 1; - if (!png_muldiv(&xy->redy, XYZ->red_Y, PNG_FP_1, d)) return 1; - dwhite = d; - whiteX = XYZ->red_X; - whiteY = XYZ->red_Y; - - d = XYZ->green_X + XYZ->green_Y + XYZ->green_Z; - if (!png_muldiv(&xy->greenx, XYZ->green_X, PNG_FP_1, d)) return 1; - if (!png_muldiv(&xy->greeny, XYZ->green_Y, PNG_FP_1, d)) return 1; - dwhite += d; - whiteX += XYZ->green_X; - whiteY += XYZ->green_Y; - - d = XYZ->blue_X + XYZ->blue_Y + XYZ->blue_Z; - if (!png_muldiv(&xy->bluex, XYZ->blue_X, PNG_FP_1, d)) return 1; - if (!png_muldiv(&xy->bluey, XYZ->blue_Y, PNG_FP_1, d)) return 1; - dwhite += d; - whiteX += XYZ->blue_X; - whiteY += XYZ->blue_Y; - - /* The reference white is simply the sum of the end-point (X,Y,Z) vectors, - * thus: - */ - if (!png_muldiv(&xy->whitex, whiteX, PNG_FP_1, dwhite)) return 1; - if (!png_muldiv(&xy->whitey, whiteY, PNG_FP_1, dwhite)) return 1; - - return 0; -} - -static int -png_XYZ_from_xy(png_XYZ *XYZ, const png_xy *xy) -{ - png_fixed_point red_inverse, green_inverse, blue_scale; - png_fixed_point left, right, denominator; - - /* Check xy and, implicitly, z. Note that wide gamut color spaces typically - * have end points with 0 tristimulus values (these are impossible end - * points, but they are used to cover the possible colors.) - */ - if (xy->redx < 0 || xy->redx > PNG_FP_1) return 1; - if (xy->redy < 0 || xy->redy > PNG_FP_1-xy->redx) return 1; - if (xy->greenx < 0 || xy->greenx > PNG_FP_1) return 1; - if (xy->greeny < 0 || xy->greeny > PNG_FP_1-xy->greenx) return 1; - if (xy->bluex < 0 || xy->bluex > PNG_FP_1) return 1; - if (xy->bluey < 0 || xy->bluey > PNG_FP_1-xy->bluex) return 1; - if (xy->whitex < 0 || xy->whitex > PNG_FP_1) return 1; - if (xy->whitey < 0 || xy->whitey > PNG_FP_1-xy->whitex) return 1; - - /* The reverse calculation is more difficult because the original tristimulus - * value had 9 independent values (red,green,blue)x(X,Y,Z) however only 8 - * derived values were recorded in the cHRM chunk; - * (red,green,blue,white)x(x,y). This loses one degree of freedom and - * therefore an arbitrary ninth value has to be introduced to undo the - * original transformations. - * - * Think of the original end-points as points in (X,Y,Z) space. The - * chromaticity values (c) have the property: - * - * C - * c = --------- - * X + Y + Z - * - * For each c (x,y,z) from the corresponding original C (X,Y,Z). Thus the - * three chromaticity values (x,y,z) for each end-point obey the - * relationship: - * - * x + y + z = 1 - * - * This describes the plane in (X,Y,Z) space that intersects each axis at the - * value 1.0; call this the chromaticity plane. Thus the chromaticity - * calculation has scaled each end-point so that it is on the x+y+z=1 plane - * and chromaticity is the intersection of the vector from the origin to the - * (X,Y,Z) value with the chromaticity plane. - * - * To fully invert the chromaticity calculation we would need the three - * end-point scale factors, (red-scale, green-scale, blue-scale), but these - * were not recorded. Instead we calculated the reference white (X,Y,Z) and - * recorded the chromaticity of this. The reference white (X,Y,Z) would have - * given all three of the scale factors since: - * - * color-C = color-c * color-scale - * white-C = red-C + green-C + blue-C - * = red-c*red-scale + green-c*green-scale + blue-c*blue-scale - * - * But cHRM records only white-x and white-y, so we have lost the white scale - * factor: - * - * white-C = white-c*white-scale - * - * To handle this the inverse transformation makes an arbitrary assumption - * about white-scale: - * - * Assume: white-Y = 1.0 - * Hence: white-scale = 1/white-y - * Or: red-Y + green-Y + blue-Y = 1.0 - * - * Notice the last statement of the assumption gives an equation in three of - * the nine values we want to calculate. 8 more equations come from the - * above routine as summarised at the top above (the chromaticity - * calculation): - * - * Given: color-x = color-X / (color-X + color-Y + color-Z) - * Hence: (color-x - 1)*color-X + color.x*color-Y + color.x*color-Z = 0 - * - * This is 9 simultaneous equations in the 9 variables "color-C" and can be - * solved by Cramer's rule. Cramer's rule requires calculating 10 9x9 matrix - * determinants, however this is not as bad as it seems because only 28 of - * the total of 90 terms in the various matrices are non-zero. Nevertheless - * Cramer's rule is notoriously numerically unstable because the determinant - * calculation involves the difference of large, but similar, numbers. It is - * difficult to be sure that the calculation is stable for real world values - * and it is certain that it becomes unstable where the end points are close - * together. - * - * So this code uses the perhaps slightly less optimal but more - * understandable and totally obvious approach of calculating color-scale. - * - * This algorithm depends on the precision in white-scale and that is - * (1/white-y), so we can immediately see that as white-y approaches 0 the - * accuracy inherent in the cHRM chunk drops off substantially. - * - * libpng arithmetic: a simple invertion of the above equations - * ------------------------------------------------------------ - * - * white_scale = 1/white-y - * white-X = white-x * white-scale - * white-Y = 1.0 - * white-Z = (1 - white-x - white-y) * white_scale - * - * white-C = red-C + green-C + blue-C - * = red-c*red-scale + green-c*green-scale + blue-c*blue-scale - * - * This gives us three equations in (red-scale,green-scale,blue-scale) where - * all the coefficients are now known: - * - * red-x*red-scale + green-x*green-scale + blue-x*blue-scale - * = white-x/white-y - * red-y*red-scale + green-y*green-scale + blue-y*blue-scale = 1 - * red-z*red-scale + green-z*green-scale + blue-z*blue-scale - * = (1 - white-x - white-y)/white-y - * - * In the last equation color-z is (1 - color-x - color-y) so we can add all - * three equations together to get an alternative third: - * - * red-scale + green-scale + blue-scale = 1/white-y = white-scale - * - * So now we have a Cramer's rule solution where the determinants are just - * 3x3 - far more tractible. Unfortunately 3x3 determinants still involve - * multiplication of three coefficients so we can't guarantee to avoid - * overflow in the libpng fixed point representation. Using Cramer's rule in - * floating point is probably a good choice here, but it's not an option for - * fixed point. Instead proceed to simplify the first two equations by - * eliminating what is likely to be the largest value, blue-scale: - * - * blue-scale = white-scale - red-scale - green-scale - * - * Hence: - * - * (red-x - blue-x)*red-scale + (green-x - blue-x)*green-scale = - * (white-x - blue-x)*white-scale - * - * (red-y - blue-y)*red-scale + (green-y - blue-y)*green-scale = - * 1 - blue-y*white-scale - * - * And now we can trivially solve for (red-scale,green-scale): - * - * green-scale = - * (white-x - blue-x)*white-scale - (red-x - blue-x)*red-scale - * ----------------------------------------------------------- - * green-x - blue-x - * - * red-scale = - * 1 - blue-y*white-scale - (green-y - blue-y) * green-scale - * --------------------------------------------------------- - * red-y - blue-y - * - * Hence: - * - * red-scale = - * ( (green-x - blue-x) * (white-y - blue-y) - - * (green-y - blue-y) * (white-x - blue-x) ) / white-y - * ------------------------------------------------------------------------- - * (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x) - * - * green-scale = - * ( (red-y - blue-y) * (white-x - blue-x) - - * (red-x - blue-x) * (white-y - blue-y) ) / white-y - * ------------------------------------------------------------------------- - * (green-x - blue-x)*(red-y - blue-y)-(green-y - blue-y)*(red-x - blue-x) - * - * Accuracy: - * The input values have 5 decimal digits of accuracy. The values are all in - * the range 0 < value < 1, so simple products are in the same range but may - * need up to 10 decimal digits to preserve the original precision and avoid - * underflow. Because we are using a 32-bit signed representation we cannot - * match this; the best is a little over 9 decimal digits, less than 10. - * - * The approach used here is to preserve the maximum precision within the - * signed representation. Because the red-scale calculation above uses the - * difference between two products of values that must be in the range -1..+1 - * it is sufficient to divide the product by 7; ceil(100,000/32767*2). The - * factor is irrelevant in the calculation because it is applied to both - * numerator and denominator. - * - * Note that the values of the differences of the products of the - * chromaticities in the above equations tend to be small, for example for - * the sRGB chromaticities they are: - * - * red numerator: -0.04751 - * green numerator: -0.08788 - * denominator: -0.2241 (without white-y multiplication) - * - * The resultant Y coefficients from the chromaticities of some widely used - * color space definitions are (to 15 decimal places): - * - * sRGB - * 0.212639005871510 0.715168678767756 0.072192315360734 - * Kodak ProPhoto - * 0.288071128229293 0.711843217810102 0.000085653960605 - * Adobe RGB - * 0.297344975250536 0.627363566255466 0.075291458493998 - * Adobe Wide Gamut RGB - * 0.258728243040113 0.724682314948566 0.016589442011321 - */ - /* By the argument, above overflow should be impossible here. The return - * value of 2 indicates an internal error to the caller. - */ - if (!png_muldiv(&left, xy->greenx-xy->bluex, xy->redy - xy->bluey, 7)) - return 2; - if (!png_muldiv(&right, xy->greeny-xy->bluey, xy->redx - xy->bluex, 7)) - return 2; - denominator = left - right; - - /* Now find the red numerator. */ - if (!png_muldiv(&left, xy->greenx-xy->bluex, xy->whitey-xy->bluey, 7)) - return 2; - if (!png_muldiv(&right, xy->greeny-xy->bluey, xy->whitex-xy->bluex, 7)) - return 2; - - /* Overflow is possible here and it indicates an extreme set of PNG cHRM - * chunk values. This calculation actually returns the reciprocal of the - * scale value because this allows us to delay the multiplication of white-y - * into the denominator, which tends to produce a small number. - */ - if (!png_muldiv(&red_inverse, xy->whitey, denominator, left-right) || - red_inverse <= xy->whitey /* r+g+b scales = white scale */) - return 1; - - /* Similarly for green_inverse: */ - if (!png_muldiv(&left, xy->redy-xy->bluey, xy->whitex-xy->bluex, 7)) - return 2; - if (!png_muldiv(&right, xy->redx-xy->bluex, xy->whitey-xy->bluey, 7)) - return 2; - if (!png_muldiv(&green_inverse, xy->whitey, denominator, left-right) || - green_inverse <= xy->whitey) - return 1; - - /* And the blue scale, the checks above guarantee this can't overflow but it - * can still produce 0 for extreme cHRM values. - */ - blue_scale = png_reciprocal(xy->whitey) - png_reciprocal(red_inverse) - - png_reciprocal(green_inverse); - if (blue_scale <= 0) return 1; - - - /* And fill in the png_XYZ: */ - if (!png_muldiv(&XYZ->red_X, xy->redx, PNG_FP_1, red_inverse)) return 1; - if (!png_muldiv(&XYZ->red_Y, xy->redy, PNG_FP_1, red_inverse)) return 1; - if (!png_muldiv(&XYZ->red_Z, PNG_FP_1 - xy->redx - xy->redy, PNG_FP_1, - red_inverse)) - return 1; - - if (!png_muldiv(&XYZ->green_X, xy->greenx, PNG_FP_1, green_inverse)) - return 1; - if (!png_muldiv(&XYZ->green_Y, xy->greeny, PNG_FP_1, green_inverse)) - return 1; - if (!png_muldiv(&XYZ->green_Z, PNG_FP_1 - xy->greenx - xy->greeny, PNG_FP_1, - green_inverse)) - return 1; - - if (!png_muldiv(&XYZ->blue_X, xy->bluex, blue_scale, PNG_FP_1)) return 1; - if (!png_muldiv(&XYZ->blue_Y, xy->bluey, blue_scale, PNG_FP_1)) return 1; - if (!png_muldiv(&XYZ->blue_Z, PNG_FP_1 - xy->bluex - xy->bluey, blue_scale, - PNG_FP_1)) - return 1; - - return 0; /*success*/ -} - -static int -png_XYZ_normalize(png_XYZ *XYZ) -{ - png_int_32 Y; - - if (XYZ->red_Y < 0 || XYZ->green_Y < 0 || XYZ->blue_Y < 0 || - XYZ->red_X < 0 || XYZ->green_X < 0 || XYZ->blue_X < 0 || - XYZ->red_Z < 0 || XYZ->green_Z < 0 || XYZ->blue_Z < 0) - return 1; - - /* Normalize by scaling so the sum of the end-point Y values is PNG_FP_1. - * IMPLEMENTATION NOTE: ANSI requires signed overflow not to occur, therefore - * relying on addition of two positive values producing a negative one is not - * safe. - */ - Y = XYZ->red_Y; - if (0x7fffffff - Y < XYZ->green_X) return 1; - Y += XYZ->green_Y; - if (0x7fffffff - Y < XYZ->blue_X) return 1; - Y += XYZ->blue_Y; - - if (Y != PNG_FP_1) - { - if (!png_muldiv(&XYZ->red_X, XYZ->red_X, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->red_Y, XYZ->red_Y, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->red_Z, XYZ->red_Z, PNG_FP_1, Y)) return 1; - - if (!png_muldiv(&XYZ->green_X, XYZ->green_X, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->green_Y, XYZ->green_Y, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->green_Z, XYZ->green_Z, PNG_FP_1, Y)) return 1; - - if (!png_muldiv(&XYZ->blue_X, XYZ->blue_X, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->blue_Y, XYZ->blue_Y, PNG_FP_1, Y)) return 1; - if (!png_muldiv(&XYZ->blue_Z, XYZ->blue_Z, PNG_FP_1, Y)) return 1; - } - - return 0; -} - -static int -png_colorspace_endpoints_match(const png_xy *xy1, const png_xy *xy2, int delta) -{ - /* Allow an error of +/-0.01 (absolute value) on each chromaticity */ - return !(PNG_OUT_OF_RANGE(xy1->whitex, xy2->whitex,delta) || - PNG_OUT_OF_RANGE(xy1->whitey, xy2->whitey,delta) || - PNG_OUT_OF_RANGE(xy1->redx, xy2->redx, delta) || - PNG_OUT_OF_RANGE(xy1->redy, xy2->redy, delta) || - PNG_OUT_OF_RANGE(xy1->greenx, xy2->greenx,delta) || - PNG_OUT_OF_RANGE(xy1->greeny, xy2->greeny,delta) || - PNG_OUT_OF_RANGE(xy1->bluex, xy2->bluex, delta) || - PNG_OUT_OF_RANGE(xy1->bluey, xy2->bluey, delta)); -} - -/* Added in libpng-1.6.0, a different check for the validity of a set of cHRM - * chunk chromaticities. Earlier checks used to simply look for the overflow - * condition (where the determinant of the matrix to solve for XYZ ends up zero - * because the chromaticity values are not all distinct.) Despite this it is - * theoretically possible to produce chromaticities that are apparently valid - * but that rapidly degrade to invalid, potentially crashing, sets because of - * arithmetic inaccuracies when calculations are performed on them. The new - * check is to round-trip xy -> XYZ -> xy and then check that the result is - * within a small percentage of the original. - */ -static int -png_colorspace_check_xy(png_XYZ *XYZ, const png_xy *xy) -{ - int result; - png_xy xy_test; - - /* As a side-effect this routine also returns the XYZ endpoints. */ - result = png_XYZ_from_xy(XYZ, xy); - if (result) return result; - - result = png_xy_from_XYZ(&xy_test, XYZ); - if (result) return result; - - if (png_colorspace_endpoints_match(xy, &xy_test, - 5/*actually, the math is pretty accurate*/)) - return 0; - - /* Too much slip */ - return 1; -} - -/* This is the check going the other way. The XYZ is modified to normalize it - * (another side-effect) and the xy chromaticities are returned. - */ -static int -png_colorspace_check_XYZ(png_xy *xy, png_XYZ *XYZ) -{ - int result; - png_XYZ XYZtemp; - - result = png_XYZ_normalize(XYZ); - if (result) return result; - - result = png_xy_from_XYZ(xy, XYZ); - if (result) return result; - - XYZtemp = *XYZ; - return png_colorspace_check_xy(&XYZtemp, xy); -} - -/* Used to check for an endpoint match against sRGB */ -static const png_xy sRGB_xy = /* From ITU-R BT.709-3 */ -{ - /* color x y */ - /* red */ 64000, 33000, - /* green */ 30000, 60000, - /* blue */ 15000, 6000, - /* white */ 31270, 32900 -}; - -static int -png_colorspace_set_xy_and_XYZ(png_const_structrp png_ptr, - png_colorspacerp colorspace, const png_xy *xy, const png_XYZ *XYZ, - int preferred) -{ - if (colorspace->flags & PNG_COLORSPACE_INVALID) - return 0; - - /* The consistency check is performed on the chromaticities; this factors out - * variations because of the normalization (or not) of the end point Y - * values. - */ - if (preferred < 2 && (colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS)) - { - /* The end points must be reasonably close to any we already have. The - * following allows an error of up to +/-.001 - */ - if (!png_colorspace_endpoints_match(xy, &colorspace->end_points_xy, 100)) - { - colorspace->flags |= PNG_COLORSPACE_INVALID; - png_benign_error(png_ptr, "inconsistent chromaticities"); - return 0; /* failed */ - } - - /* Only overwrite with preferred values */ - if (!preferred) - return 1; /* ok, but no change */ - } - - colorspace->end_points_xy = *xy; - colorspace->end_points_XYZ = *XYZ; - colorspace->flags |= PNG_COLORSPACE_HAVE_ENDPOINTS; - - /* The end points are normally quoted to two decimal digits, so allow +/-0.01 - * on this test. - */ - if (png_colorspace_endpoints_match(xy, &sRGB_xy, 1000)) - colorspace->flags |= PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB; - - else - colorspace->flags &= PNG_COLORSPACE_CANCEL( - PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB); - - return 2; /* ok and changed */ -} - -int /* PRIVATE */ -png_colorspace_set_chromaticities(png_const_structrp png_ptr, - png_colorspacerp colorspace, const png_xy *xy, int preferred) -{ - /* We must check the end points to ensure they are reasonable - in the past - * color management systems have crashed as a result of getting bogus - * colorant values, while this isn't the fault of libpng it is the - * responsibility of libpng because PNG carries the bomb and libpng is in a - * position to protect against it. - */ - png_XYZ XYZ; - - switch (png_colorspace_check_xy(&XYZ, xy)) - { - case 0: /* success */ - return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, xy, &XYZ, - preferred); - - case 1: - /* We can't invert the chromaticities so we can't produce value XYZ - * values. Likely as not a color management system will fail too. - */ - colorspace->flags |= PNG_COLORSPACE_INVALID; - png_benign_error(png_ptr, "invalid chromaticities"); - break; - - default: - /* libpng is broken; this should be a warning but if it happens we - * want error reports so for the moment it is an error. - */ - colorspace->flags |= PNG_COLORSPACE_INVALID; - png_error(png_ptr, "internal error checking chromaticities"); - break; - } - - return 0; /* failed */ -} - -int /* PRIVATE */ -png_colorspace_set_endpoints(png_const_structrp png_ptr, - png_colorspacerp colorspace, const png_XYZ *XYZ_in, int preferred) -{ - png_XYZ XYZ = *XYZ_in; - png_xy xy; - - switch (png_colorspace_check_XYZ(&xy, &XYZ)) - { - case 0: - return png_colorspace_set_xy_and_XYZ(png_ptr, colorspace, &xy, &XYZ, - preferred); - - case 1: - /* End points are invalid. */ - colorspace->flags |= PNG_COLORSPACE_INVALID; - png_benign_error(png_ptr, "invalid end points"); - break; - - default: - colorspace->flags |= PNG_COLORSPACE_INVALID; - png_error(png_ptr, "internal error checking chromaticities"); - break; - } - - return 0; /* failed */ -} - -#if defined(PNG_sRGB_SUPPORTED) || defined(PNG_iCCP_SUPPORTED) -/* Error message generation */ -static char -png_icc_tag_char(png_uint_32 byte) -{ - byte &= 0xff; - if (byte >= 32 && byte <= 126) - return (char)byte; - else - return '?'; -} - -static void -png_icc_tag_name(char *name, png_uint_32 tag) -{ - name[0] = '\''; - name[1] = png_icc_tag_char(tag >> 24); - name[2] = png_icc_tag_char(tag >> 16); - name[3] = png_icc_tag_char(tag >> 8); - name[4] = png_icc_tag_char(tag ); - name[5] = '\''; -} - -static int -is_ICC_signature_char(png_alloc_size_t it) -{ - return it == 32 || (it >= 48 && it <= 57) || (it >= 65 && it <= 90) || - (it >= 97 && it <= 122); -} - -static int is_ICC_signature(png_alloc_size_t it) -{ - return is_ICC_signature_char(it >> 24) /* checks all the top bits */ && - is_ICC_signature_char((it >> 16) & 0xff) && - is_ICC_signature_char((it >> 8) & 0xff) && - is_ICC_signature_char(it & 0xff); -} - -static int -png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace, - png_const_charp name, png_alloc_size_t value, png_const_charp reason) -{ - size_t pos; - char message[196]; /* see below for calculation */ - - if (colorspace != NULL) - colorspace->flags |= PNG_COLORSPACE_INVALID; - - pos = png_safecat(message, (sizeof message), 0, "profile '"); /* 9 chars */ - pos = png_safecat(message, pos+79, pos, name); /* Truncate to 79 chars */ - pos = png_safecat(message, (sizeof message), pos, "': "); /* +2 = 90 */ - if (is_ICC_signature(value)) - { - /* So 'value' is at most 4 bytes and the following cast is safe */ - png_icc_tag_name(message+pos, (png_uint_32)value); - pos += 6; /* total +8; less than the else clause */ - message[pos++] = ':'; - message[pos++] = ' '; - } -# ifdef PNG_WARNINGS_SUPPORTED - else - { - char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114*/ - - pos = png_safecat(message, (sizeof message), pos, - png_format_number(number, number+(sizeof number), - PNG_NUMBER_FORMAT_x, value)); - pos = png_safecat(message, (sizeof message), pos, "h: "); /*+2 = 116*/ - } -# endif - /* The 'reason' is an arbitrary message, allow +79 maximum 195 */ - png_safecat(message, (sizeof message), pos, reason); - - /* This is recoverable, but make it unconditionally an app_error on write to - * avoid writing invalid ICC profiles into PNG files. (I.e. we handle them - * on read, with a warning, but on write unless the app turns off - * application errors the PNG won't be written.) - */ - png_chunk_report(png_ptr, message, - (colorspace != NULL) ? PNG_CHUNK_ERROR : PNG_CHUNK_WRITE_ERROR); - - return 0; -} -#endif /* sRGB || iCCP */ - -#ifdef PNG_sRGB_SUPPORTED -int /* PRIVATE */ -png_colorspace_set_sRGB(png_const_structrp png_ptr, png_colorspacerp colorspace, - int intent) -{ - /* sRGB sets known gamma, end points and (from the chunk) intent. */ - /* IMPORTANT: these are not necessarily the values found in an ICC profile - * because ICC profiles store values adapted to a D50 environment; it is - * expected that the ICC profile mediaWhitePointTag will be D50, see the - * checks and code elsewhere to understand this better. - * - * These XYZ values, which are accurate to 5dp, produce rgb to gray - * coefficients of (6968,23435,2366), which are reduced (because they add up - * to 32769 not 32768) to (6968,23434,2366). These are the values that - * libpng has traditionally used (and are the best values given the 15bit - * algorithm used by the rgb to gray code.) - */ - static const png_XYZ sRGB_XYZ = /* D65 XYZ (*not* the D50 adapted values!) */ - { - /* color X Y Z */ - /* red */ 41239, 21264, 1933, - /* green */ 35758, 71517, 11919, - /* blue */ 18048, 7219, 95053 - }; - - /* Do nothing if the colorspace is already invalidated. */ - if (colorspace->flags & PNG_COLORSPACE_INVALID) - return 0; - - /* Check the intent, then check for existing settings. It is valid for the - * PNG file to have cHRM or gAMA chunks along with sRGB, but the values must - * be consistent with the correct values. If, however, this function is - * called below because an iCCP chunk matches sRGB then it is quite - * conceivable that an older app recorded incorrect gAMA and cHRM because of - * an incorrect calculation based on the values in the profile - this does - * *not* invalidate the profile (though it still produces an error, which can - * be ignored.) - */ - if (intent < 0 || intent >= PNG_sRGB_INTENT_LAST) - return png_icc_profile_error(png_ptr, colorspace, "sRGB", - (unsigned)intent, "invalid sRGB rendering intent"); - - if ((colorspace->flags & PNG_COLORSPACE_HAVE_INTENT) != 0 && - colorspace->rendering_intent != intent) - return png_icc_profile_error(png_ptr, colorspace, "sRGB", - (unsigned)intent, "inconsistent rendering intents"); - - if ((colorspace->flags & PNG_COLORSPACE_FROM_sRGB) != 0) - { - png_benign_error(png_ptr, "duplicate sRGB information ignored"); - return 0; - } - - /* If the standard sRGB cHRM chunk does not match the one from the PNG file - * warn but overwrite the value with the correct one. - */ - if ((colorspace->flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0 && - !png_colorspace_endpoints_match(&sRGB_xy, &colorspace->end_points_xy, - 100)) - png_chunk_report(png_ptr, "cHRM chunk does not match sRGB", - PNG_CHUNK_ERROR); - - /* This check is just done for the error reporting - the routine always - * returns true when the 'from' argument corresponds to sRGB (2). - */ - (void)png_colorspace_check_gamma(png_ptr, colorspace, PNG_GAMMA_sRGB_INVERSE, - 2/*from sRGB*/); - - /* intent: bugs in GCC force 'int' to be used as the parameter type. */ - colorspace->rendering_intent = (png_uint_16)intent; - colorspace->flags |= PNG_COLORSPACE_HAVE_INTENT; - - /* endpoints */ - colorspace->end_points_xy = sRGB_xy; - colorspace->end_points_XYZ = sRGB_XYZ; - colorspace->flags |= - (PNG_COLORSPACE_HAVE_ENDPOINTS|PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB); - - /* gamma */ - colorspace->gamma = PNG_GAMMA_sRGB_INVERSE; - colorspace->flags |= PNG_COLORSPACE_HAVE_GAMMA; - - /* Finally record that we have an sRGB profile */ - colorspace->flags |= - (PNG_COLORSPACE_MATCHES_sRGB|PNG_COLORSPACE_FROM_sRGB); - - return 1; /* set */ -} -#endif /* sRGB */ - -#ifdef PNG_iCCP_SUPPORTED -/* Encoded value of D50 as an ICC XYZNumber. From the ICC 2010 spec the value - * is XYZ(0.9642,1.0,0.8249), which scales to: - * - * (63189.8112, 65536, 54060.6464) - */ -static const png_byte D50_nCIEXYZ[12] = - { 0x00, 0x00, 0xf6, 0xd6, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x2d }; - -int /* PRIVATE */ -png_icc_check_length(png_const_structrp png_ptr, png_colorspacerp colorspace, - png_const_charp name, png_uint_32 profile_length) -{ - if (profile_length < 132) - return png_icc_profile_error(png_ptr, colorspace, name, profile_length, - "too short"); - - if (profile_length & 3) - return png_icc_profile_error(png_ptr, colorspace, name, profile_length, - "invalid length"); - - return 1; -} - -int /* PRIVATE */ -png_icc_check_header(png_const_structrp png_ptr, png_colorspacerp colorspace, - png_const_charp name, png_uint_32 profile_length, - png_const_bytep profile/* first 132 bytes only */, int color_type) -{ - png_uint_32 temp; - - /* Length check; this cannot be ignored in this code because profile_length - * is used later to check the tag table, so even if the profile seems over - * long profile_length from the caller must be correct. The caller can fix - * this up on read or write by just passing in the profile header length. - */ - temp = png_get_uint_32(profile); - if (temp != profile_length) - return png_icc_profile_error(png_ptr, colorspace, name, temp, - "length does not match profile"); - - temp = png_get_uint_32(profile+128); /* tag count: 12 bytes/tag */ - if (temp > 357913930 || /* (2^32-4-132)/12: maxium possible tag count */ - profile_length < 132+12*temp) /* truncated tag table */ - return png_icc_profile_error(png_ptr, colorspace, name, temp, - "tag count too large"); - - /* The 'intent' must be valid or we can't store it, ICC limits the intent to - * 16 bits. - */ - temp = png_get_uint_32(profile+64); - if (temp >= 0xffff) /* The ICC limit */ - return png_icc_profile_error(png_ptr, colorspace, name, temp, - "invalid rendering intent"); - - /* This is just a warning because the profile may be valid in future - * versions. - */ - if (temp >= PNG_sRGB_INTENT_LAST) - (void)png_icc_profile_error(png_ptr, NULL, name, temp, - "intent outside defined range"); - - /* At this point the tag table can't be checked because it hasn't necessarily - * been loaded; however, various header fields can be checked. These checks - * are for values permitted by the PNG spec in an ICC profile; the PNG spec - * restricts the profiles that can be passed in an iCCP chunk (they must be - * appropriate to processing PNG data!) - */ - - /* Data checks (could be skipped). These checks must be independent of the - * version number; however, the version number doesn't accomodate changes in - * the header fields (just the known tags and the interpretation of the - * data.) - */ - temp = png_get_uint_32(profile+36); /* signature 'ascp' */ - if (temp != 0x61637370) - return png_icc_profile_error(png_ptr, colorspace, name, temp, - "invalid signature"); - - /* Currently the PCS illuminant/adopted white point (the computational - * white point) are required to be D50, - * however the profile contains a record of the illuminant so perhaps ICC - * expects to be able to change this in the future (despite the rationale in - * the introduction for using a fixed PCS adopted white.) Consequently the - * following is just a warning. - */ - if (memcmp(profile+68, D50_nCIEXYZ, 12) != 0) - (void)png_icc_profile_error(png_ptr, NULL, name, 0/*no tag value*/, - "PCS illuminant is not D50"); - - /* The PNG spec requires this: - * "If the iCCP chunk is present, the image samples conform to the colour - * space represented by the embedded ICC profile as defined by the - * International Color Consortium [ICC]. The colour space of the ICC profile - * shall be an RGB colour space for colour images (PNG colour types 2, 3, and - * 6), or a greyscale colour space for greyscale images (PNG colour types 0 - * and 4)." - * - * This checking code ensures the embedded profile (on either read or write) - * conforms to the specification requirements. Notice that an ICC 'gray' - * color-space profile contains the information to transform the monochrome - * data to XYZ or L*a*b (according to which PCS the profile uses) and this - * should be used in preference to the standard libpng K channel replication - * into R, G and B channels. - * - * Previously it was suggested that an RGB profile on grayscale data could be - * handled. However it it is clear that using an RGB profile in this context - * must be an error - there is no specification of what it means. Thus it is - * almost certainly more correct to ignore the profile. - */ - temp = png_get_uint_32(profile+16); /* data colour space field */ - switch (temp) - { - case 0x52474220: /* 'RGB ' */ - if (!(color_type & PNG_COLOR_MASK_COLOR)) - return png_icc_profile_error(png_ptr, colorspace, name, temp, - "RGB color space not permitted on grayscale PNG"); - break; - - case 0x47524159: /* 'GRAY' */ - if (color_type & PNG_COLOR_MASK_COLOR) - return png_icc_profile_error(png_ptr, colorspace, name, temp, - "Gray color space not permitted on RGB PNG"); - break; - - default: - return png_icc_profile_error(png_ptr, colorspace, name, temp, - "invalid ICC profile color space"); - } - - /* It is up to the application to check that the profile class matches the - * application requirements; the spec provides no guidance, but it's pretty - * weird if the profile is not scanner ('scnr'), monitor ('mntr'), printer - * ('prtr') or 'spac' (for generic color spaces). Issue a warning in these - * cases. Issue an error for device link or abstract profiles - these don't - * contain the records necessary to transform the color-space to anything - * other than the target device (and not even that for an abstract profile). - * Profiles of these classes may not be embedded in images. - */ - temp = png_get_uint_32(profile+12); /* profile/device class */ - switch (temp) - { - case 0x73636E72: /* 'scnr' */ - case 0x6D6E7472: /* 'mntr' */ - case 0x70727472: /* 'prtr' */ - case 0x73706163: /* 'spac' */ - /* All supported */ - break; - - case 0x61627374: /* 'abst' */ - /* May not be embedded in an image */ - return png_icc_profile_error(png_ptr, colorspace, name, temp, - "invalid embedded Abstract ICC profile"); - - case 0x6C696E6B: /* 'link' */ - /* DeviceLink profiles cannnot be interpreted in a non-device specific - * fashion, if an app uses the AToB0Tag in the profile the results are - * undefined unless the result is sent to the intended device, - * therefore a DeviceLink profile should not be found embedded in a - * PNG. - */ - return png_icc_profile_error(png_ptr, colorspace, name, temp, - "unexpected DeviceLink ICC profile class"); - - case 0x6E6D636C: /* 'nmcl' */ - /* A NamedColor profile is also device specific, however it doesn't - * contain an AToB0 tag that is open to misintrepretation. Almost - * certainly it will fail the tests below. - */ - (void)png_icc_profile_error(png_ptr, NULL, name, temp, - "unexpected NamedColor ICC profile class"); - break; - - default: - /* To allow for future enhancements to the profile accept unrecognized - * profile classes with a warning, these then hit the test below on the - * tag content to ensure they are backward compatible with one of the - * understood profiles. - */ - (void)png_icc_profile_error(png_ptr, NULL, name, temp, - "unrecognized ICC profile class"); - break; - } - - /* For any profile other than a device link one the PCS must be encoded - * either in XYZ or Lab. - */ - temp = png_get_uint_32(profile+20); - switch (temp) - { - case 0x58595A20: /* 'XYZ ' */ - case 0x4C616220: /* 'Lab ' */ - break; - - default: - return png_icc_profile_error(png_ptr, colorspace, name, temp, - "unexpected ICC PCS encoding"); - } - - return 1; -} - -int /* PRIVATE */ -png_icc_check_tag_table(png_const_structrp png_ptr, png_colorspacerp colorspace, - png_const_charp name, png_uint_32 profile_length, - png_const_bytep profile /* header plus whole tag table */) -{ - png_uint_32 tag_count = png_get_uint_32(profile+128); - png_uint_32 itag; - png_const_bytep tag = profile+132; /* The first tag */ - - /* First scan all the tags in the table and add bits to the icc_info value - * (temporarily in 'tags'). - */ - for (itag=0; itag < tag_count; ++itag, tag += 12) - { - png_uint_32 tag_id = png_get_uint_32(tag+0); - png_uint_32 tag_start = png_get_uint_32(tag+4); /* must be aligned */ - png_uint_32 tag_length = png_get_uint_32(tag+8);/* not padded */ - - /* The ICC specification does not exclude zero length tags, therefore the - * start might actually be anywhere if there is no data, but this would be - * a clear abuse of the intent of the standard so the start is checked for - * being in range. All defined tag types have an 8 byte header - a 4 byte - * type signature then 0. - */ - if ((tag_start & 3) != 0) - { - /* CNHP730S.icc shipped with Microsoft Windows 64 violates this, it is - * only a warning here because libpng does not care about the - * alignment. - */ - (void)png_icc_profile_error(png_ptr, NULL, name, tag_id, - "ICC profile tag start not a multiple of 4"); - } - - /* This is a hard error; potentially it can cause read outside the - * profile. - */ - if (tag_start > profile_length || tag_length > profile_length - tag_start) - return png_icc_profile_error(png_ptr, colorspace, name, tag_id, - "ICC profile tag outside profile"); - } - - return 1; /* success, maybe with warnings */ -} - -#ifdef PNG_sRGB_SUPPORTED -/* Information about the known ICC sRGB profiles */ -static const struct -{ - png_uint_32 adler, crc, length; - png_uint_32 md5[4]; - png_byte have_md5; - png_byte is_broken; - png_uint_16 intent; - -# define PNG_MD5(a,b,c,d) { a, b, c, d }, (a!=0)||(b!=0)||(c!=0)||(d!=0) -# define PNG_ICC_CHECKSUM(adler, crc, md5, intent, broke, date, length, fname)\ - { adler, crc, length, md5, broke, intent }, - -} png_sRGB_checks[] = -{ - /* This data comes from contrib/tools/checksum-icc run on downloads of - * all four ICC sRGB profiles from www.color.org. - */ - /* adler32, crc32, MD5[4], intent, date, length, file-name */ - PNG_ICC_CHECKSUM(0x0a3fd9f6, 0x3b8772b9, - PNG_MD5(0x29f83dde, 0xaff255ae, 0x7842fae4, 0xca83390d), 0, 0, - "2009/03/27 21:36:31", 3048, "sRGB_IEC61966-2-1_black_scaled.icc") - - /* ICC sRGB v2 perceptual no black-compensation: */ - PNG_ICC_CHECKSUM(0x4909e5e1, 0x427ebb21, - PNG_MD5(0xc95bd637, 0xe95d8a3b, 0x0df38f99, 0xc1320389), 1, 0, - "2009/03/27 21:37:45", 3052, "sRGB_IEC61966-2-1_no_black_scaling.icc") - - PNG_ICC_CHECKSUM(0xfd2144a1, 0x306fd8ae, - PNG_MD5(0xfc663378, 0x37e2886b, 0xfd72e983, 0x8228f1b8), 0, 0, - "2009/08/10 17:28:01", 60988, "sRGB_v4_ICC_preference_displayclass.icc") - - /* ICC sRGB v4 perceptual */ - PNG_ICC_CHECKSUM(0x209c35d2, 0xbbef7812, - PNG_MD5(0x34562abf, 0x994ccd06, 0x6d2c5721, 0xd0d68c5d), 0, 0, - "2007/07/25 00:05:37", 60960, "sRGB_v4_ICC_preference.icc") - - /* The following profiles have no known MD5 checksum. If there is a match - * on the (empty) MD5 the other fields are used to attempt a match and - * a warning is produced. The first two of these profiles have a 'cprt' tag - * which suggests that they were also made by Hewlett Packard. - */ - PNG_ICC_CHECKSUM(0xa054d762, 0x5d5129ce, - PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 0, - "2004/07/21 18:57:42", 3024, "sRGB_IEC61966-2-1_noBPC.icc") - - /* This is a 'mntr' (display) profile with a mediaWhitePointTag that does not - * match the D50 PCS illuminant in the header (it is in fact the D65 values, - * so the white point is recorded as the un-adapted value.) The profiles - * below only differ in one byte - the intent - and are basically the same as - * the previous profile except for the mediaWhitePointTag error and a missing - * chromaticAdaptationTag. - */ - PNG_ICC_CHECKSUM(0xf784f3fb, 0x182ea552, - PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 0, 1/*broken*/, - "1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 perceptual") - - PNG_ICC_CHECKSUM(0x0398f3fc, 0xf29e526d, - PNG_MD5(0x00000000, 0x00000000, 0x00000000, 0x00000000), 1, 1/*broken*/, - "1998/02/09 06:49:00", 3144, "HP-Microsoft sRGB v2 media-relative") -}; - -static int -png_compare_ICC_profile_with_sRGB(png_const_structrp png_ptr, - png_const_bytep profile, uLong adler) -{ - /* The quick check is to verify just the MD5 signature and trust the - * rest of the data. Because the profile has already been verified for - * correctness this is safe. png_colorspace_set_sRGB will check the 'intent' - * field too, so if the profile has been edited with an intent not defined - * by sRGB (but maybe defined by a later ICC specification) the read of - * the profile will fail at that point. - */ - png_uint_32 length = 0; - png_uint_32 intent = 0x10000; /* invalid */ -#if PNG_sRGB_PROFILE_CHECKS > 1 - uLong crc = 0; /* the value for 0 length data */ -#endif - unsigned int i; - - for (i=0; i < (sizeof png_sRGB_checks) / (sizeof png_sRGB_checks[0]); ++i) - { - if (png_get_uint_32(profile+84) == png_sRGB_checks[i].md5[0] && - png_get_uint_32(profile+88) == png_sRGB_checks[i].md5[1] && - png_get_uint_32(profile+92) == png_sRGB_checks[i].md5[2] && - png_get_uint_32(profile+96) == png_sRGB_checks[i].md5[3]) - { - /* This may be one of the old HP profiles without an MD5, in that - * case we can only use the length and Adler32 (note that these - * are not used by default if there is an MD5!) - */ -# if PNG_sRGB_PROFILE_CHECKS == 0 - if (png_sRGB_checks[i].have_md5) - return 1+png_sRGB_checks[i].is_broken; -# endif - - /* Profile is unsigned or more checks have been configured in. */ - if (length == 0) - { - length = png_get_uint_32(profile); - intent = png_get_uint_32(profile+64); - } - - /* Length *and* intent must match */ - if (length == png_sRGB_checks[i].length && - intent == png_sRGB_checks[i].intent) - { - /* Now calculate the adler32 if not done already. */ - if (adler == 0) - { - adler = adler32(0, NULL, 0); - adler = adler32(adler, profile, length); - } - - if (adler == png_sRGB_checks[i].adler) - { - /* These basic checks suggest that the data has not been - * modified, but if the check level is more than 1 perform - * our own crc32 checksum on the data. - */ -# if PNG_sRGB_PROFILE_CHECKS > 1 - if (crc == 0) - { - crc = crc32(0, NULL, 0); - crc = crc32(crc, profile, length); - } - - /* So this check must pass for the 'return' below to happen. - */ - if (crc == png_sRGB_checks[i].crc) -# endif - { - if (png_sRGB_checks[i].is_broken) - { - /* These profiles are known to have bad data that may cause - * problems if they are used, therefore attempt to - * discourage their use, skip the 'have_md5' warning below, - * which is made irrelevant by this error. - */ - png_chunk_report(png_ptr, "known incorrect sRGB profile", - PNG_CHUNK_ERROR); - } - - /* Warn that this being done; this isn't even an error since - * the profile is perfectly valid, but it would be nice if - * people used the up-to-date ones. - */ - else if (!png_sRGB_checks[i].have_md5) - { - png_chunk_report(png_ptr, - "out-of-date sRGB profile with no signature", - PNG_CHUNK_WARNING); - } - - return 1+png_sRGB_checks[i].is_broken; - } - } - } - -# if PNG_sRGB_PROFILE_CHECKS > 0 - /* The signature matched, but the profile had been changed in some - * way. This is an apparent violation of the ICC terms of use and, - * anyway, probably indicates a data error or uninformed hacking. - */ - if (png_sRGB_checks[i].have_md5) - png_benign_error(png_ptr, - "copyright violation: edited ICC profile ignored"); -# endif - } - } - - return 0; /* no match */ -} -#endif - -#ifdef PNG_sRGB_SUPPORTED -void /* PRIVATE */ -png_icc_set_sRGB(png_const_structrp png_ptr, - png_colorspacerp colorspace, png_const_bytep profile, uLong adler) -{ - /* Is this profile one of the known ICC sRGB profiles? If it is, just set - * the sRGB information. - */ - if (png_compare_ICC_profile_with_sRGB(png_ptr, profile, adler)) - (void)png_colorspace_set_sRGB(png_ptr, colorspace, - (int)/*already checked*/png_get_uint_32(profile+64)); -} -#endif /* PNG_READ_sRGB_SUPPORTED */ - -int /* PRIVATE */ -png_colorspace_set_ICC(png_const_structrp png_ptr, png_colorspacerp colorspace, - png_const_charp name, png_uint_32 profile_length, png_const_bytep profile, - int color_type) -{ - if (colorspace->flags & PNG_COLORSPACE_INVALID) - return 0; - - if (png_icc_check_length(png_ptr, colorspace, name, profile_length) && - png_icc_check_header(png_ptr, colorspace, name, profile_length, profile, - color_type) && - png_icc_check_tag_table(png_ptr, colorspace, name, profile_length, - profile)) - { - png_icc_set_sRGB(png_ptr, colorspace, profile, 0); - return 1; - } - - /* Failure case */ - return 0; -} -#endif /* iCCP */ - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED -void /* PRIVATE */ -png_colorspace_set_rgb_coefficients(png_structrp png_ptr) -{ - /* Set the rgb_to_gray coefficients from the colorspace. */ - if (!png_ptr->rgb_to_gray_coefficients_set && - (png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS) != 0) - { - /* png_set_background has not been called, get the coefficients from the Y - * values of the colorspace colorants. - */ - png_fixed_point r = png_ptr->colorspace.end_points_XYZ.red_Y; - png_fixed_point g = png_ptr->colorspace.end_points_XYZ.green_Y; - png_fixed_point b = png_ptr->colorspace.end_points_XYZ.blue_Y; - png_fixed_point total = r+g+b; - - if (total > 0 && - r >= 0 && png_muldiv(&r, r, 32768, total) && r >= 0 && r <= 32768 && - g >= 0 && png_muldiv(&g, g, 32768, total) && g >= 0 && g <= 32768 && - b >= 0 && png_muldiv(&b, b, 32768, total) && b >= 0 && b <= 32768 && - r+g+b <= 32769) - { - /* We allow 0 coefficients here. r+g+b may be 32769 if two or - * all of the coefficients were rounded up. Handle this by - * reducing the *largest* coefficient by 1; this matches the - * approach used for the default coefficients in pngrtran.c - */ - int add = 0; - - if (r+g+b > 32768) - add = -1; - else if (r+g+b < 32768) - add = 1; - - if (add != 0) - { - if (g >= r && g >= b) - g += add; - else if (r >= g && r >= b) - r += add; - else - b += add; - } - - /* Check for an internal error. */ - if (r+g+b != 32768) - png_error(png_ptr, - "internal error handling cHRM coefficients"); - - else - { - png_ptr->rgb_to_gray_red_coeff = (png_uint_16)r; - png_ptr->rgb_to_gray_green_coeff = (png_uint_16)g; - } - } - - /* This is a png_error at present even though it could be ignored - - * it should never happen, but it is important that if it does, the - * bug is fixed. - */ - else - png_error(png_ptr, "internal error handling cHRM->XYZ"); - } -} -#endif - -#endif /* COLORSPACE */ - -void /* PRIVATE */ -png_check_IHDR(png_const_structrp png_ptr, - png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_type, int compression_type, - int filter_type) -{ - int error = 0; - - /* Check for width and height valid values */ - if (width == 0) - { - png_warning(png_ptr, "Image width is zero in IHDR"); - error = 1; - } - - if (height == 0) - { - png_warning(png_ptr, "Image height is zero in IHDR"); - error = 1; - } - -# ifdef PNG_SET_USER_LIMITS_SUPPORTED - if (width > png_ptr->user_width_max) - -# else - if (width > PNG_USER_WIDTH_MAX) -# endif - { - png_warning(png_ptr, "Image width exceeds user limit in IHDR"); - error = 1; - } - -# ifdef PNG_SET_USER_LIMITS_SUPPORTED - if (height > png_ptr->user_height_max) -# else - if (height > PNG_USER_HEIGHT_MAX) -# endif - { - png_warning(png_ptr, "Image height exceeds user limit in IHDR"); - error = 1; - } - - if (width > PNG_UINT_31_MAX) - { - png_warning(png_ptr, "Invalid image width in IHDR"); - error = 1; - } - - if (height > PNG_UINT_31_MAX) - { - png_warning(png_ptr, "Invalid image height in IHDR"); - error = 1; - } - - if (width > (PNG_UINT_32_MAX - >> 3) /* 8-byte RGBA pixels */ - - 48 /* bigrowbuf hack */ - - 1 /* filter byte */ - - 7*8 /* rounding of width to multiple of 8 pixels */ - - 8) /* extra max_pixel_depth pad */ - png_warning(png_ptr, "Width is too large for libpng to process pixels"); - - /* Check other values */ - if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 && - bit_depth != 8 && bit_depth != 16) - { - png_warning(png_ptr, "Invalid bit depth in IHDR"); - error = 1; - } - - if (color_type < 0 || color_type == 1 || - color_type == 5 || color_type > 6) - { - png_warning(png_ptr, "Invalid color type in IHDR"); - error = 1; - } - - if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) || - ((color_type == PNG_COLOR_TYPE_RGB || - color_type == PNG_COLOR_TYPE_GRAY_ALPHA || - color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8)) - { - png_warning(png_ptr, "Invalid color type/bit depth combination in IHDR"); - error = 1; - } - - if (interlace_type >= PNG_INTERLACE_LAST) - { - png_warning(png_ptr, "Unknown interlace method in IHDR"); - error = 1; - } - - if (compression_type != PNG_COMPRESSION_TYPE_BASE) - { - png_warning(png_ptr, "Unknown compression method in IHDR"); - error = 1; - } - -# ifdef PNG_MNG_FEATURES_SUPPORTED - /* Accept filter_method 64 (intrapixel differencing) only if - * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and - * 2. Libpng did not read a PNG signature (this filter_method is only - * used in PNG datastreams that are embedded in MNG datastreams) and - * 3. The application called png_permit_mng_features with a mask that - * included PNG_FLAG_MNG_FILTER_64 and - * 4. The filter_method is 64 and - * 5. The color_type is RGB or RGBA - */ - if ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) && - png_ptr->mng_features_permitted) - png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); - - if (filter_type != PNG_FILTER_TYPE_BASE) - { - if (!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (filter_type == PNG_INTRAPIXEL_DIFFERENCING) && - ((png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) == 0) && - (color_type == PNG_COLOR_TYPE_RGB || - color_type == PNG_COLOR_TYPE_RGB_ALPHA))) - { - png_warning(png_ptr, "Unknown filter method in IHDR"); - error = 1; - } - - if (png_ptr->mode & PNG_HAVE_PNG_SIGNATURE) - { - png_warning(png_ptr, "Invalid filter method in IHDR"); - error = 1; - } - } - -# else - if (filter_type != PNG_FILTER_TYPE_BASE) - { - png_warning(png_ptr, "Unknown filter method in IHDR"); - error = 1; - } -# endif - - if (error == 1) - png_error(png_ptr, "Invalid IHDR data"); -} - -#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) -/* ASCII to fp functions */ -/* Check an ASCII formated floating point value, see the more detailed - * comments in pngpriv.h - */ -/* The following is used internally to preserve the sticky flags */ -#define png_fp_add(state, flags) ((state) |= (flags)) -#define png_fp_set(state, value) ((state) = (value) | ((state) & PNG_FP_STICKY)) - -int /* PRIVATE */ -png_check_fp_number(png_const_charp string, png_size_t size, int *statep, - png_size_tp whereami) -{ - int state = *statep; - png_size_t i = *whereami; - - while (i < size) - { - int type; - /* First find the type of the next character */ - switch (string[i]) - { - case 43: type = PNG_FP_SAW_SIGN; break; - case 45: type = PNG_FP_SAW_SIGN + PNG_FP_NEGATIVE; break; - case 46: type = PNG_FP_SAW_DOT; break; - case 48: type = PNG_FP_SAW_DIGIT; break; - case 49: case 50: case 51: case 52: - case 53: case 54: case 55: case 56: - case 57: type = PNG_FP_SAW_DIGIT + PNG_FP_NONZERO; break; - case 69: - case 101: type = PNG_FP_SAW_E; break; - default: goto PNG_FP_End; - } - - /* Now deal with this type according to the current - * state, the type is arranged to not overlap the - * bits of the PNG_FP_STATE. - */ - switch ((state & PNG_FP_STATE) + (type & PNG_FP_SAW_ANY)) - { - case PNG_FP_INTEGER + PNG_FP_SAW_SIGN: - if (state & PNG_FP_SAW_ANY) - goto PNG_FP_End; /* not a part of the number */ - - png_fp_add(state, type); - break; - - case PNG_FP_INTEGER + PNG_FP_SAW_DOT: - /* Ok as trailer, ok as lead of fraction. */ - if (state & PNG_FP_SAW_DOT) /* two dots */ - goto PNG_FP_End; - - else if (state & PNG_FP_SAW_DIGIT) /* trailing dot? */ - png_fp_add(state, type); - - else - png_fp_set(state, PNG_FP_FRACTION | type); - - break; - - case PNG_FP_INTEGER + PNG_FP_SAW_DIGIT: - if (state & PNG_FP_SAW_DOT) /* delayed fraction */ - png_fp_set(state, PNG_FP_FRACTION | PNG_FP_SAW_DOT); - - png_fp_add(state, type | PNG_FP_WAS_VALID); - - break; - - case PNG_FP_INTEGER + PNG_FP_SAW_E: - if ((state & PNG_FP_SAW_DIGIT) == 0) - goto PNG_FP_End; - - png_fp_set(state, PNG_FP_EXPONENT); - - break; - - /* case PNG_FP_FRACTION + PNG_FP_SAW_SIGN: - goto PNG_FP_End; ** no sign in fraction */ - - /* case PNG_FP_FRACTION + PNG_FP_SAW_DOT: - goto PNG_FP_End; ** Because SAW_DOT is always set */ - - case PNG_FP_FRACTION + PNG_FP_SAW_DIGIT: - png_fp_add(state, type | PNG_FP_WAS_VALID); - break; - - case PNG_FP_FRACTION + PNG_FP_SAW_E: - /* This is correct because the trailing '.' on an - * integer is handled above - so we can only get here - * with the sequence ".E" (with no preceding digits). - */ - if ((state & PNG_FP_SAW_DIGIT) == 0) - goto PNG_FP_End; - - png_fp_set(state, PNG_FP_EXPONENT); - - break; - - case PNG_FP_EXPONENT + PNG_FP_SAW_SIGN: - if (state & PNG_FP_SAW_ANY) - goto PNG_FP_End; /* not a part of the number */ - - png_fp_add(state, PNG_FP_SAW_SIGN); - - break; - - /* case PNG_FP_EXPONENT + PNG_FP_SAW_DOT: - goto PNG_FP_End; */ - - case PNG_FP_EXPONENT + PNG_FP_SAW_DIGIT: - png_fp_add(state, PNG_FP_SAW_DIGIT | PNG_FP_WAS_VALID); - - break; - - /* case PNG_FP_EXPONEXT + PNG_FP_SAW_E: - goto PNG_FP_End; */ - - default: goto PNG_FP_End; /* I.e. break 2 */ - } - - /* The character seems ok, continue. */ - ++i; - } - -PNG_FP_End: - /* Here at the end, update the state and return the correct - * return code. - */ - *statep = state; - *whereami = i; - - return (state & PNG_FP_SAW_DIGIT) != 0; -} - - -/* The same but for a complete string. */ -int -png_check_fp_string(png_const_charp string, png_size_t size) -{ - int state=0; - png_size_t char_index=0; - - if (png_check_fp_number(string, size, &state, &char_index) && - (char_index == size || string[char_index] == 0)) - return state /* must be non-zero - see above */; - - return 0; /* i.e. fail */ -} -#endif /* pCAL or sCAL */ - -#ifdef PNG_sCAL_SUPPORTED -# ifdef PNG_FLOATING_POINT_SUPPORTED -/* Utility used below - a simple accurate power of ten from an integral - * exponent. - */ -static double -png_pow10(int power) -{ - int recip = 0; - double d = 1; - - /* Handle negative exponent with a reciprocal at the end because - * 10 is exact whereas .1 is inexact in base 2 - */ - if (power < 0) - { - if (power < DBL_MIN_10_EXP) return 0; - recip = 1, power = -power; - } - - if (power > 0) - { - /* Decompose power bitwise. */ - double mult = 10; - do - { - if (power & 1) d *= mult; - mult *= mult; - power >>= 1; - } - while (power > 0); - - if (recip) d = 1/d; - } - /* else power is 0 and d is 1 */ - - return d; -} - -/* Function to format a floating point value in ASCII with a given - * precision. - */ -void /* PRIVATE */ -png_ascii_from_fp(png_const_structrp png_ptr, png_charp ascii, png_size_t size, - double fp, unsigned int precision) -{ - /* We use standard functions from math.h, but not printf because - * that would require stdio. The caller must supply a buffer of - * sufficient size or we will png_error. The tests on size and - * the space in ascii[] consumed are indicated below. - */ - if (precision < 1) - precision = DBL_DIG; - - /* Enforce the limit of the implementation precision too. */ - if (precision > DBL_DIG+1) - precision = DBL_DIG+1; - - /* Basic sanity checks */ - if (size >= precision+5) /* See the requirements below. */ - { - if (fp < 0) - { - fp = -fp; - *ascii++ = 45; /* '-' PLUS 1 TOTAL 1 */ - --size; - } - - if (fp >= DBL_MIN && fp <= DBL_MAX) - { - int exp_b10; /* A base 10 exponent */ - double base; /* 10^exp_b10 */ - - /* First extract a base 10 exponent of the number, - * the calculation below rounds down when converting - * from base 2 to base 10 (multiply by log10(2) - - * 0.3010, but 77/256 is 0.3008, so exp_b10 needs to - * be increased. Note that the arithmetic shift - * performs a floor() unlike C arithmetic - using a - * C multiply would break the following for negative - * exponents. - */ - (void)frexp(fp, &exp_b10); /* exponent to base 2 */ - - exp_b10 = (exp_b10 * 77) >> 8; /* <= exponent to base 10 */ - - /* Avoid underflow here. */ - base = png_pow10(exp_b10); /* May underflow */ - - while (base < DBL_MIN || base < fp) - { - /* And this may overflow. */ - double test = png_pow10(exp_b10+1); - - if (test <= DBL_MAX) - ++exp_b10, base = test; - - else - break; - } - - /* Normalize fp and correct exp_b10, after this fp is in the - * range [.1,1) and exp_b10 is both the exponent and the digit - * *before* which the decimal point should be inserted - * (starting with 0 for the first digit). Note that this - * works even if 10^exp_b10 is out of range because of the - * test on DBL_MAX above. - */ - fp /= base; - while (fp >= 1) fp /= 10, ++exp_b10; - - /* Because of the code above fp may, at this point, be - * less than .1, this is ok because the code below can - * handle the leading zeros this generates, so no attempt - * is made to correct that here. - */ - - { - int czero, clead, cdigits; - char exponent[10]; - - /* Allow up to two leading zeros - this will not lengthen - * the number compared to using E-n. - */ - if (exp_b10 < 0 && exp_b10 > -3) /* PLUS 3 TOTAL 4 */ - { - czero = -exp_b10; /* PLUS 2 digits: TOTAL 3 */ - exp_b10 = 0; /* Dot added below before first output. */ - } - else - czero = 0; /* No zeros to add */ - - /* Generate the digit list, stripping trailing zeros and - * inserting a '.' before a digit if the exponent is 0. - */ - clead = czero; /* Count of leading zeros */ - cdigits = 0; /* Count of digits in list. */ - - do - { - double d; - - fp *= 10; - /* Use modf here, not floor and subtract, so that - * the separation is done in one step. At the end - * of the loop don't break the number into parts so - * that the final digit is rounded. - */ - if (cdigits+czero-clead+1 < (int)precision) - fp = modf(fp, &d); - - else - { - d = floor(fp + .5); - - if (d > 9) - { - /* Rounding up to 10, handle that here. */ - if (czero > 0) - { - --czero, d = 1; - if (cdigits == 0) --clead; - } - else - { - while (cdigits > 0 && d > 9) - { - int ch = *--ascii; - - if (exp_b10 != (-1)) - ++exp_b10; - - else if (ch == 46) - { - ch = *--ascii, ++size; - /* Advance exp_b10 to '1', so that the - * decimal point happens after the - * previous digit. - */ - exp_b10 = 1; - } - - --cdigits; - d = ch - 47; /* I.e. 1+(ch-48) */ - } - - /* Did we reach the beginning? If so adjust the - * exponent but take into account the leading - * decimal point. - */ - if (d > 9) /* cdigits == 0 */ - { - if (exp_b10 == (-1)) - { - /* Leading decimal point (plus zeros?), if - * we lose the decimal point here it must - * be reentered below. - */ - int ch = *--ascii; - - if (ch == 46) - ++size, exp_b10 = 1; - - /* Else lost a leading zero, so 'exp_b10' is - * still ok at (-1) - */ - } - else - ++exp_b10; - - /* In all cases we output a '1' */ - d = 1; - } - } - } - fp = 0; /* Guarantees termination below. */ - } - - if (d == 0) - { - ++czero; - if (cdigits == 0) ++clead; - } - else - { - /* Included embedded zeros in the digit count. */ - cdigits += czero - clead; - clead = 0; - - while (czero > 0) - { - /* exp_b10 == (-1) means we just output the decimal - * place - after the DP don't adjust 'exp_b10' any - * more! - */ - if (exp_b10 != (-1)) - { - if (exp_b10 == 0) *ascii++ = 46, --size; - /* PLUS 1: TOTAL 4 */ - --exp_b10; - } - *ascii++ = 48, --czero; - } - - if (exp_b10 != (-1)) - { - if (exp_b10 == 0) *ascii++ = 46, --size; /* counted - above */ - --exp_b10; - } - *ascii++ = (char)(48 + (int)d), ++cdigits; - } - } - while (cdigits+czero-clead < (int)precision && fp > DBL_MIN); - - /* The total output count (max) is now 4+precision */ - - /* Check for an exponent, if we don't need one we are - * done and just need to terminate the string. At - * this point exp_b10==(-1) is effectively if flag - it got - * to '-1' because of the decrement after outputing - * the decimal point above (the exponent required is - * *not* -1!) - */ - if (exp_b10 >= (-1) && exp_b10 <= 2) - { - /* The following only happens if we didn't output the - * leading zeros above for negative exponent, so this - * doest add to the digit requirement. Note that the - * two zeros here can only be output if the two leading - * zeros were *not* output, so this doesn't increase - * the output count. - */ - while (--exp_b10 >= 0) *ascii++ = 48; - - *ascii = 0; - - /* Total buffer requirement (including the '\0') is - * 5+precision - see check at the start. - */ - return; - } - - /* Here if an exponent is required, adjust size for - * the digits we output but did not count. The total - * digit output here so far is at most 1+precision - no - * decimal point and no leading or trailing zeros have - * been output. - */ - size -= cdigits; - - *ascii++ = 69, --size; /* 'E': PLUS 1 TOTAL 2+precision */ - - /* The following use of an unsigned temporary avoids ambiguities in - * the signed arithmetic on exp_b10 and permits GCC at least to do - * better optimization. - */ - { - unsigned int uexp_b10; - - if (exp_b10 < 0) - { - *ascii++ = 45, --size; /* '-': PLUS 1 TOTAL 3+precision */ - uexp_b10 = -exp_b10; - } - - else - uexp_b10 = exp_b10; - - cdigits = 0; - - while (uexp_b10 > 0) - { - exponent[cdigits++] = (char)(48 + uexp_b10 % 10); - uexp_b10 /= 10; - } - } - - /* Need another size check here for the exponent digits, so - * this need not be considered above. - */ - if ((int)size > cdigits) - { - while (cdigits > 0) *ascii++ = exponent[--cdigits]; - - *ascii = 0; - - return; - } - } - } - else if (!(fp >= DBL_MIN)) - { - *ascii++ = 48; /* '0' */ - *ascii = 0; - return; - } - else - { - *ascii++ = 105; /* 'i' */ - *ascii++ = 110; /* 'n' */ - *ascii++ = 102; /* 'f' */ - *ascii = 0; - return; - } - } - - /* Here on buffer too small. */ - png_error(png_ptr, "ASCII conversion buffer too small"); -} - -# endif /* FLOATING_POINT */ - -# ifdef PNG_FIXED_POINT_SUPPORTED -/* Function to format a fixed point value in ASCII. - */ -void /* PRIVATE */ -png_ascii_from_fixed(png_const_structrp png_ptr, png_charp ascii, - png_size_t size, png_fixed_point fp) -{ - /* Require space for 10 decimal digits, a decimal point, a minus sign and a - * trailing \0, 13 characters: - */ - if (size > 12) - { - png_uint_32 num; - - /* Avoid overflow here on the minimum integer. */ - if (fp < 0) - *ascii++ = 45, --size, num = -fp; - else - num = fp; - - if (num <= 0x80000000) /* else overflowed */ - { - unsigned int ndigits = 0, first = 16 /* flag value */; - char digits[10]; - - while (num) - { - /* Split the low digit off num: */ - unsigned int tmp = num/10; - num -= tmp*10; - digits[ndigits++] = (char)(48 + num); - /* Record the first non-zero digit, note that this is a number - * starting at 1, it's not actually the array index. - */ - if (first == 16 && num > 0) - first = ndigits; - num = tmp; - } - - if (ndigits > 0) - { - while (ndigits > 5) *ascii++ = digits[--ndigits]; - /* The remaining digits are fractional digits, ndigits is '5' or - * smaller at this point. It is certainly not zero. Check for a - * non-zero fractional digit: - */ - if (first <= 5) - { - unsigned int i; - *ascii++ = 46; /* decimal point */ - /* ndigits may be <5 for small numbers, output leading zeros - * then ndigits digits to first: - */ - i = 5; - while (ndigits < i) *ascii++ = 48, --i; - while (ndigits >= first) *ascii++ = digits[--ndigits]; - /* Don't output the trailing zeros! */ - } - } - else - *ascii++ = 48; - - /* And null terminate the string: */ - *ascii = 0; - return; - } - } - - /* Here on buffer too small. */ - png_error(png_ptr, "ASCII conversion buffer too small"); -} -# endif /* FIXED_POINT */ -#endif /* READ_SCAL */ - -#if defined(PNG_FLOATING_POINT_SUPPORTED) && \ - !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \ - (defined(PNG_gAMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) || \ - defined(PNG_sCAL_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)) || \ - (defined(PNG_sCAL_SUPPORTED) && \ - defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)) -png_fixed_point -png_fixed(png_const_structrp png_ptr, double fp, png_const_charp) -{ - double r = floor(100000 * fp + .5); - - if (r > 2147483647. || r < -2147483648.) - png_fixed_error(png_ptr, text); - - return (png_fixed_point)r; -} -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) || \ - defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED) -/* muldiv functions */ -/* This API takes signed arguments and rounds the result to the nearest - * integer (or, for a fixed point number - the standard argument - to - * the nearest .00001). Overflow and divide by zero are signalled in - * the result, a boolean - true on success, false on overflow. - */ -int -png_muldiv(png_fixed_point_p res, png_fixed_point a, png_int_32 times, - png_int_32 divisor) -{ - /* Return a * times / divisor, rounded. */ - if (divisor != 0) - { - if (a == 0 || times == 0) - { - *res = 0; - return 1; - } - else - { -#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - double r = a; - r *= times; - r /= divisor; - r = floor(r+.5); - - /* A png_fixed_point is a 32-bit integer. */ - if (r <= 2147483647. && r >= -2147483648.) - { - *res = (png_fixed_point)r; - return 1; - } -#else - int negative = 0; - png_uint_32 A, T, D; - png_uint_32 s16, s32, s00; - - if (a < 0) - negative = 1, A = -a; - else - A = a; - - if (times < 0) - negative = !negative, T = -times; - else - T = times; - - if (divisor < 0) - negative = !negative, D = -divisor; - else - D = divisor; - - /* Following can't overflow because the arguments only - * have 31 bits each, however the result may be 32 bits. - */ - s16 = (A >> 16) * (T & 0xffff) + - (A & 0xffff) * (T >> 16); - /* Can't overflow because the a*times bit is only 30 - * bits at most. - */ - s32 = (A >> 16) * (T >> 16) + (s16 >> 16); - s00 = (A & 0xffff) * (T & 0xffff); - - s16 = (s16 & 0xffff) << 16; - s00 += s16; - - if (s00 < s16) - ++s32; /* carry */ - - if (s32 < D) /* else overflow */ - { - /* s32.s00 is now the 64-bit product, do a standard - * division, we know that s32 < D, so the maximum - * required shift is 31. - */ - int bitshift = 32; - png_fixed_point result = 0; /* NOTE: signed */ - - while (--bitshift >= 0) - { - png_uint_32 d32, d00; - - if (bitshift > 0) - d32 = D >> (32-bitshift), d00 = D << bitshift; - - else - d32 = 0, d00 = D; - - if (s32 > d32) - { - if (s00 < d00) --s32; /* carry */ - s32 -= d32, s00 -= d00, result += 1<= d00) - s32 = 0, s00 -= d00, result += 1<= (D >> 1)) - ++result; - - if (negative) - result = -result; - - /* Check for overflow. */ - if ((negative && result <= 0) || (!negative && result >= 0)) - { - *res = result; - return 1; - } - } -#endif - } - } - - return 0; -} -#endif /* READ_GAMMA || INCH_CONVERSIONS */ - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED) -/* The following is for when the caller doesn't much care about the - * result. - */ -png_fixed_point -png_muldiv_warn(png_const_structrp png_ptr, png_fixed_point a, png_int_32 times, - png_int_32 divisor) -{ - png_fixed_point result; - - if (png_muldiv(&result, a, times, divisor)) - return result; - - png_warning(png_ptr, "fixed point overflow ignored"); - return 0; -} -#endif - -#ifdef PNG_GAMMA_SUPPORTED /* more fixed point functions for gamma */ -/* Calculate a reciprocal, return 0 on div-by-zero or overflow. */ -png_fixed_point -png_reciprocal(png_fixed_point a) -{ -#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - double r = floor(1E10/a+.5); - - if (r <= 2147483647. && r >= -2147483648.) - return (png_fixed_point)r; -#else - png_fixed_point res; - - if (png_muldiv(&res, 100000, 100000, a)) - return res; -#endif - - return 0; /* error/overflow */ -} - -/* This is the shared test on whether a gamma value is 'significant' - whether - * it is worth doing gamma correction. - */ -int /* PRIVATE */ -png_gamma_significant(png_fixed_point gamma_val) -{ - return gamma_val < PNG_FP_1 - PNG_GAMMA_THRESHOLD_FIXED || - gamma_val > PNG_FP_1 + PNG_GAMMA_THRESHOLD_FIXED; -} -#endif - -#ifdef PNG_READ_GAMMA_SUPPORTED -/* A local convenience routine. */ -static png_fixed_point -png_product2(png_fixed_point a, png_fixed_point b) -{ - /* The required result is 1/a * 1/b; the following preserves accuracy. */ -#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - double r = a * 1E-5; - r *= b; - r = floor(r+.5); - - if (r <= 2147483647. && r >= -2147483648.) - return (png_fixed_point)r; -#else - png_fixed_point res; - - if (png_muldiv(&res, a, b, 100000)) - return res; -#endif - - return 0; /* overflow */ -} - -/* The inverse of the above. */ -png_fixed_point -png_reciprocal2(png_fixed_point a, png_fixed_point b) -{ - /* The required result is 1/a * 1/b; the following preserves accuracy. */ -#ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - double r = 1E15/a; - r /= b; - r = floor(r+.5); - - if (r <= 2147483647. && r >= -2147483648.) - return (png_fixed_point)r; -#else - /* This may overflow because the range of png_fixed_point isn't symmetric, - * but this API is only used for the product of file and screen gamma so it - * doesn't matter that the smallest number it can produce is 1/21474, not - * 1/100000 - */ - png_fixed_point res = png_product2(a, b); - - if (res != 0) - return png_reciprocal(res); -#endif - - return 0; /* overflow */ -} -#endif /* READ_GAMMA */ - -#ifdef PNG_READ_GAMMA_SUPPORTED /* gamma table code */ -#ifndef PNG_FLOATING_ARITHMETIC_SUPPORTED -/* Fixed point gamma. - * - * The code to calculate the tables used below can be found in the shell script - * contrib/tools/intgamma.sh - * - * To calculate gamma this code implements fast log() and exp() calls using only - * fixed point arithmetic. This code has sufficient precision for either 8-bit - * or 16-bit sample values. - * - * The tables used here were calculated using simple 'bc' programs, but C double - * precision floating point arithmetic would work fine. - * - * 8-bit log table - * This is a table of -log(value/255)/log(2) for 'value' in the range 128 to - * 255, so it's the base 2 logarithm of a normalized 8-bit floating point - * mantissa. The numbers are 32-bit fractions. - */ -static const png_uint_32 -png_8bit_l2[128] = -{ - 4270715492U, 4222494797U, 4174646467U, 4127164793U, 4080044201U, 4033279239U, - 3986864580U, 3940795015U, 3895065449U, 3849670902U, 3804606499U, 3759867474U, - 3715449162U, 3671346997U, 3627556511U, 3584073329U, 3540893168U, 3498011834U, - 3455425220U, 3413129301U, 3371120137U, 3329393864U, 3287946700U, 3246774933U, - 3205874930U, 3165243125U, 3124876025U, 3084770202U, 3044922296U, 3005329011U, - 2965987113U, 2926893432U, 2888044853U, 2849438323U, 2811070844U, 2772939474U, - 2735041326U, 2697373562U, 2659933400U, 2622718104U, 2585724991U, 2548951424U, - 2512394810U, 2476052606U, 2439922311U, 2404001468U, 2368287663U, 2332778523U, - 2297471715U, 2262364947U, 2227455964U, 2192742551U, 2158222529U, 2123893754U, - 2089754119U, 2055801552U, 2022034013U, 1988449497U, 1955046031U, 1921821672U, - 1888774511U, 1855902668U, 1823204291U, 1790677560U, 1758320682U, 1726131893U, - 1694109454U, 1662251657U, 1630556815U, 1599023271U, 1567649391U, 1536433567U, - 1505374214U, 1474469770U, 1443718700U, 1413119487U, 1382670639U, 1352370686U, - 1322218179U, 1292211689U, 1262349810U, 1232631153U, 1203054352U, 1173618059U, - 1144320946U, 1115161701U, 1086139034U, 1057251672U, 1028498358U, 999877854U, - 971388940U, 943030410U, 914801076U, 886699767U, 858725327U, 830876614U, - 803152505U, 775551890U, 748073672U, 720716771U, 693480120U, 666362667U, - 639363374U, 612481215U, 585715177U, 559064263U, 532527486U, 506103872U, - 479792461U, 453592303U, 427502463U, 401522014U, 375650043U, 349885648U, - 324227938U, 298676034U, 273229066U, 247886176U, 222646516U, 197509248U, - 172473545U, 147538590U, 122703574U, 97967701U, 73330182U, 48790236U, - 24347096U, 0U - -#if 0 - /* The following are the values for 16-bit tables - these work fine for the - * 8-bit conversions but produce very slightly larger errors in the 16-bit - * log (about 1.2 as opposed to 0.7 absolute error in the final value). To - * use these all the shifts below must be adjusted appropriately. - */ - 65166, 64430, 63700, 62976, 62257, 61543, 60835, 60132, 59434, 58741, 58054, - 57371, 56693, 56020, 55352, 54689, 54030, 53375, 52726, 52080, 51439, 50803, - 50170, 49542, 48918, 48298, 47682, 47070, 46462, 45858, 45257, 44661, 44068, - 43479, 42894, 42312, 41733, 41159, 40587, 40020, 39455, 38894, 38336, 37782, - 37230, 36682, 36137, 35595, 35057, 34521, 33988, 33459, 32932, 32408, 31887, - 31369, 30854, 30341, 29832, 29325, 28820, 28319, 27820, 27324, 26830, 26339, - 25850, 25364, 24880, 24399, 23920, 23444, 22970, 22499, 22029, 21562, 21098, - 20636, 20175, 19718, 19262, 18808, 18357, 17908, 17461, 17016, 16573, 16132, - 15694, 15257, 14822, 14390, 13959, 13530, 13103, 12678, 12255, 11834, 11415, - 10997, 10582, 10168, 9756, 9346, 8937, 8531, 8126, 7723, 7321, 6921, 6523, - 6127, 5732, 5339, 4947, 4557, 4169, 3782, 3397, 3014, 2632, 2251, 1872, 1495, - 1119, 744, 372 -#endif -}; - -static png_int_32 -png_log8bit(unsigned int x) -{ - unsigned int lg2 = 0; - /* Each time 'x' is multiplied by 2, 1 must be subtracted off the final log, - * because the log is actually negate that means adding 1. The final - * returned value thus has the range 0 (for 255 input) to 7.994 (for 1 - * input), return -1 for the overflow (log 0) case, - so the result is - * always at most 19 bits. - */ - if ((x &= 0xff) == 0) - return -1; - - if ((x & 0xf0) == 0) - lg2 = 4, x <<= 4; - - if ((x & 0xc0) == 0) - lg2 += 2, x <<= 2; - - if ((x & 0x80) == 0) - lg2 += 1, x <<= 1; - - /* result is at most 19 bits, so this cast is safe: */ - return (png_int_32)((lg2 << 16) + ((png_8bit_l2[x-128]+32768)>>16)); -} - -/* The above gives exact (to 16 binary places) log2 values for 8-bit images, - * for 16-bit images we use the most significant 8 bits of the 16-bit value to - * get an approximation then multiply the approximation by a correction factor - * determined by the remaining up to 8 bits. This requires an additional step - * in the 16-bit case. - * - * We want log2(value/65535), we have log2(v'/255), where: - * - * value = v' * 256 + v'' - * = v' * f - * - * So f is value/v', which is equal to (256+v''/v') since v' is in the range 128 - * to 255 and v'' is in the range 0 to 255 f will be in the range 256 to less - * than 258. The final factor also needs to correct for the fact that our 8-bit - * value is scaled by 255, whereas the 16-bit values must be scaled by 65535. - * - * This gives a final formula using a calculated value 'x' which is value/v' and - * scaling by 65536 to match the above table: - * - * log2(x/257) * 65536 - * - * Since these numbers are so close to '1' we can use simple linear - * interpolation between the two end values 256/257 (result -368.61) and 258/257 - * (result 367.179). The values used below are scaled by a further 64 to give - * 16-bit precision in the interpolation: - * - * Start (256): -23591 - * Zero (257): 0 - * End (258): 23499 - */ -static png_int_32 -png_log16bit(png_uint_32 x) -{ - unsigned int lg2 = 0; - - /* As above, but now the input has 16 bits. */ - if ((x &= 0xffff) == 0) - return -1; - - if ((x & 0xff00) == 0) - lg2 = 8, x <<= 8; - - if ((x & 0xf000) == 0) - lg2 += 4, x <<= 4; - - if ((x & 0xc000) == 0) - lg2 += 2, x <<= 2; - - if ((x & 0x8000) == 0) - lg2 += 1, x <<= 1; - - /* Calculate the base logarithm from the top 8 bits as a 28-bit fractional - * value. - */ - lg2 <<= 28; - lg2 += (png_8bit_l2[(x>>8)-128]+8) >> 4; - - /* Now we need to interpolate the factor, this requires a division by the top - * 8 bits. Do this with maximum precision. - */ - x = ((x << 16) + (x >> 9)) / (x >> 8); - - /* Since we divided by the top 8 bits of 'x' there will be a '1' at 1<<24, - * the value at 1<<16 (ignoring this) will be 0 or 1; this gives us exactly - * 16 bits to interpolate to get the low bits of the result. Round the - * answer. Note that the end point values are scaled by 64 to retain overall - * precision and that 'lg2' is current scaled by an extra 12 bits, so adjust - * the overall scaling by 6-12. Round at every step. - */ - x -= 1U << 24; - - if (x <= 65536U) /* <= '257' */ - lg2 += ((23591U * (65536U-x)) + (1U << (16+6-12-1))) >> (16+6-12); - - else - lg2 -= ((23499U * (x-65536U)) + (1U << (16+6-12-1))) >> (16+6-12); - - /* Safe, because the result can't have more than 20 bits: */ - return (png_int_32)((lg2 + 2048) >> 12); -} - -/* The 'exp()' case must invert the above, taking a 20-bit fixed point - * logarithmic value and returning a 16 or 8-bit number as appropriate. In - * each case only the low 16 bits are relevant - the fraction - since the - * integer bits (the top 4) simply determine a shift. - * - * The worst case is the 16-bit distinction between 65535 and 65534, this - * requires perhaps spurious accuracty in the decoding of the logarithm to - * distinguish log2(65535/65534.5) - 10^-5 or 17 bits. There is little chance - * of getting this accuracy in practice. - * - * To deal with this the following exp() function works out the exponent of the - * frational part of the logarithm by using an accurate 32-bit value from the - * top four fractional bits then multiplying in the remaining bits. - */ -static const png_uint_32 -png_32bit_exp[16] = -{ - /* NOTE: the first entry is deliberately set to the maximum 32-bit value. */ - 4294967295U, 4112874773U, 3938502376U, 3771522796U, 3611622603U, 3458501653U, - 3311872529U, 3171459999U, 3037000500U, 2908241642U, 2784941738U, 2666869345U, - 2553802834U, 2445529972U, 2341847524U, 2242560872U -}; - -/* Adjustment table; provided to explain the numbers in the code below. */ -#if 0 -for (i=11;i>=0;--i){ print i, " ", (1 - e(-(2^i)/65536*l(2))) * 2^(32-i), "\n"} - 11 44937.64284865548751208448 - 10 45180.98734845585101160448 - 9 45303.31936980687359311872 - 8 45364.65110595323018870784 - 7 45395.35850361789624614912 - 6 45410.72259715102037508096 - 5 45418.40724413220722311168 - 4 45422.25021786898173001728 - 3 45424.17186732298419044352 - 2 45425.13273269940811464704 - 1 45425.61317555035558641664 - 0 45425.85339951654943850496 -#endif - -static png_uint_32 -png_exp(png_fixed_point x) -{ - if (x > 0 && x <= 0xfffff) /* Else overflow or zero (underflow) */ - { - /* Obtain a 4-bit approximation */ - png_uint_32 e = png_32bit_exp[(x >> 12) & 0xf]; - - /* Incorporate the low 12 bits - these decrease the returned value by - * multiplying by a number less than 1 if the bit is set. The multiplier - * is determined by the above table and the shift. Notice that the values - * converge on 45426 and this is used to allow linear interpolation of the - * low bits. - */ - if (x & 0x800) - e -= (((e >> 16) * 44938U) + 16U) >> 5; - - if (x & 0x400) - e -= (((e >> 16) * 45181U) + 32U) >> 6; - - if (x & 0x200) - e -= (((e >> 16) * 45303U) + 64U) >> 7; - - if (x & 0x100) - e -= (((e >> 16) * 45365U) + 128U) >> 8; - - if (x & 0x080) - e -= (((e >> 16) * 45395U) + 256U) >> 9; - - if (x & 0x040) - e -= (((e >> 16) * 45410U) + 512U) >> 10; - - /* And handle the low 6 bits in a single block. */ - e -= (((e >> 16) * 355U * (x & 0x3fU)) + 256U) >> 9; - - /* Handle the upper bits of x. */ - e >>= x >> 16; - return e; - } - - /* Check for overflow */ - if (x <= 0) - return png_32bit_exp[0]; - - /* Else underflow */ - return 0; -} - -static png_byte -png_exp8bit(png_fixed_point lg2) -{ - /* Get a 32-bit value: */ - png_uint_32 x = png_exp(lg2); - - /* Convert the 32-bit value to 0..255 by multiplying by 256-1, note that the - * second, rounding, step can't overflow because of the first, subtraction, - * step. - */ - x -= x >> 8; - return (png_byte)((x + 0x7fffffU) >> 24); -} - -static png_uint_16 -png_exp16bit(png_fixed_point lg2) -{ - /* Get a 32-bit value: */ - png_uint_32 x = png_exp(lg2); - - /* Convert the 32-bit value to 0..65535 by multiplying by 65536-1: */ - x -= x >> 16; - return (png_uint_16)((x + 32767U) >> 16); -} -#endif /* FLOATING_ARITHMETIC */ - -png_byte -png_gamma_8bit_correct(unsigned int value, png_fixed_point gamma_val) -{ - if (value > 0 && value < 255) - { -# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - double r = floor(255*pow(value/255.,gamma_val*.00001)+.5); - return (png_byte)r; -# else - png_int_32 lg2 = png_log8bit(value); - png_fixed_point res; - - if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1)) - return png_exp8bit(res); - - /* Overflow. */ - value = 0; -# endif - } - - return (png_byte)value; -} - -png_uint_16 -png_gamma_16bit_correct(unsigned int value, png_fixed_point gamma_val) -{ - if (value > 0 && value < 65535) - { -# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - double r = floor(65535*pow(value/65535.,gamma_val*.00001)+.5); - return (png_uint_16)r; -# else - png_int_32 lg2 = png_log16bit(value); - png_fixed_point res; - - if (png_muldiv(&res, gamma_val, lg2, PNG_FP_1)) - return png_exp16bit(res); - - /* Overflow. */ - value = 0; -# endif - } - - return (png_uint_16)value; -} - -/* This does the right thing based on the bit_depth field of the - * png_struct, interpreting values as 8-bit or 16-bit. While the result - * is nominally a 16-bit value if bit depth is 8 then the result is - * 8-bit (as are the arguments.) - */ -png_uint_16 /* PRIVATE */ -png_gamma_correct(png_structrp png_ptr, unsigned int value, - png_fixed_point gamma_val) -{ - if (png_ptr->bit_depth == 8) - return png_gamma_8bit_correct(value, gamma_val); - - else - return png_gamma_16bit_correct(value, gamma_val); -} - -/* Internal function to build a single 16-bit table - the table consists of - * 'num' 256 entry subtables, where 'num' is determined by 'shift' - the amount - * to shift the input values right (or 16-number_of_signifiant_bits). - * - * The caller is responsible for ensuring that the table gets cleaned up on - * png_error (i.e. if one of the mallocs below fails) - i.e. the *table argument - * should be somewhere that will be cleaned. - */ -static void -png_build_16bit_table(png_structrp png_ptr, png_uint_16pp *ptable, - PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val) -{ - /* Various values derived from 'shift': */ - PNG_CONST unsigned int num = 1U << (8U - shift); - PNG_CONST unsigned int max = (1U << (16U - shift))-1U; - PNG_CONST unsigned int max_by_2 = 1U << (15U-shift); - unsigned int i; - - png_uint_16pp table = *ptable = - (png_uint_16pp)png_calloc(png_ptr, num * (sizeof (png_uint_16p))); - - for (i = 0; i < num; i++) - { - png_uint_16p sub_table = table[i] = - (png_uint_16p)png_malloc(png_ptr, 256 * (sizeof (png_uint_16))); - - /* The 'threshold' test is repeated here because it can arise for one of - * the 16-bit tables even if the others don't hit it. - */ - if (png_gamma_significant(gamma_val)) - { - /* The old code would overflow at the end and this would cause the - * 'pow' function to return a result >1, resulting in an - * arithmetic error. This code follows the spec exactly; ig is - * the recovered input sample, it always has 8-16 bits. - * - * We want input * 65535/max, rounded, the arithmetic fits in 32 - * bits (unsigned) so long as max <= 32767. - */ - unsigned int j; - for (j = 0; j < 256; j++) - { - png_uint_32 ig = (j << (8-shift)) + i; -# ifdef PNG_FLOATING_ARITHMETIC_SUPPORTED - /* Inline the 'max' scaling operation: */ - double d = floor(65535*pow(ig/(double)max, gamma_val*.00001)+.5); - sub_table[j] = (png_uint_16)d; -# else - if (shift) - ig = (ig * 65535U + max_by_2)/max; - - sub_table[j] = png_gamma_16bit_correct(ig, gamma_val); -# endif - } - } - else - { - /* We must still build a table, but do it the fast way. */ - unsigned int j; - - for (j = 0; j < 256; j++) - { - png_uint_32 ig = (j << (8-shift)) + i; - - if (shift) - ig = (ig * 65535U + max_by_2)/max; - - sub_table[j] = (png_uint_16)ig; - } - } - } -} - -/* NOTE: this function expects the *inverse* of the overall gamma transformation - * required. - */ -static void -png_build_16to8_table(png_structrp png_ptr, png_uint_16pp *ptable, - PNG_CONST unsigned int shift, PNG_CONST png_fixed_point gamma_val) -{ - PNG_CONST unsigned int num = 1U << (8U - shift); - PNG_CONST unsigned int max = (1U << (16U - shift))-1U; - unsigned int i; - png_uint_32 last; - - png_uint_16pp table = *ptable = - (png_uint_16pp)png_calloc(png_ptr, num * (sizeof (png_uint_16p))); - - /* 'num' is the number of tables and also the number of low bits of low - * bits of the input 16-bit value used to select a table. Each table is - * itself index by the high 8 bits of the value. - */ - for (i = 0; i < num; i++) - table[i] = (png_uint_16p)png_malloc(png_ptr, - 256 * (sizeof (png_uint_16))); - - /* 'gamma_val' is set to the reciprocal of the value calculated above, so - * pow(out,g) is an *input* value. 'last' is the last input value set. - * - * In the loop 'i' is used to find output values. Since the output is - * 8-bit there are only 256 possible values. The tables are set up to - * select the closest possible output value for each input by finding - * the input value at the boundary between each pair of output values - * and filling the table up to that boundary with the lower output - * value. - * - * The boundary values are 0.5,1.5..253.5,254.5. Since these are 9-bit - * values the code below uses a 16-bit value in i; the values start at - * 128.5 (for 0.5) and step by 257, for a total of 254 values (the last - * entries are filled with 255). Start i at 128 and fill all 'last' - * table entries <= 'max' - */ - last = 0; - for (i = 0; i < 255; ++i) /* 8-bit output value */ - { - /* Find the corresponding maximum input value */ - png_uint_16 out = (png_uint_16)(i * 257U); /* 16-bit output value */ - - /* Find the boundary value in 16 bits: */ - png_uint_32 bound = png_gamma_16bit_correct(out+128U, gamma_val); - - /* Adjust (round) to (16-shift) bits: */ - bound = (bound * max + 32768U)/65535U + 1U; - - while (last < bound) - { - table[last & (0xffU >> shift)][last >> (8U - shift)] = out; - last++; - } - } - - /* And fill in the final entries. */ - while (last < (num << 8)) - { - table[last & (0xff >> shift)][last >> (8U - shift)] = 65535U; - last++; - } -} - -/* Build a single 8-bit table: same as the 16-bit case but much simpler (and - * typically much faster). Note that libpng currently does no sBIT processing - * (apparently contrary to the spec) so a 256 entry table is always generated. - */ -static void -png_build_8bit_table(png_structrp png_ptr, png_bytepp ptable, - PNG_CONST png_fixed_point gamma_val) -{ - unsigned int i; - png_bytep table = *ptable = (png_bytep)png_malloc(png_ptr, 256); - - if (png_gamma_significant(gamma_val)) for (i=0; i<256; i++) - table[i] = png_gamma_8bit_correct(i, gamma_val); - - else for (i=0; i<256; ++i) - table[i] = (png_byte)i; -} - -/* Used from png_read_destroy and below to release the memory used by the gamma - * tables. - */ -void /* PRIVATE */ -png_destroy_gamma_table(png_structrp png_ptr) -{ - png_free(png_ptr, png_ptr->gamma_table); - png_ptr->gamma_table = NULL; - - if (png_ptr->gamma_16_table != NULL) - { - int i; - int istop = (1 << (8 - png_ptr->gamma_shift)); - for (i = 0; i < istop; i++) - { - png_free(png_ptr, png_ptr->gamma_16_table[i]); - } - png_free(png_ptr, png_ptr->gamma_16_table); - png_ptr->gamma_16_table = NULL; - } - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - png_free(png_ptr, png_ptr->gamma_from_1); - png_ptr->gamma_from_1 = NULL; - png_free(png_ptr, png_ptr->gamma_to_1); - png_ptr->gamma_to_1 = NULL; - - if (png_ptr->gamma_16_from_1 != NULL) - { - int i; - int istop = (1 << (8 - png_ptr->gamma_shift)); - for (i = 0; i < istop; i++) - { - png_free(png_ptr, png_ptr->gamma_16_from_1[i]); - } - png_free(png_ptr, png_ptr->gamma_16_from_1); - png_ptr->gamma_16_from_1 = NULL; - } - if (png_ptr->gamma_16_to_1 != NULL) - { - int i; - int istop = (1 << (8 - png_ptr->gamma_shift)); - for (i = 0; i < istop; i++) - { - png_free(png_ptr, png_ptr->gamma_16_to_1[i]); - } - png_free(png_ptr, png_ptr->gamma_16_to_1); - png_ptr->gamma_16_to_1 = NULL; - } -#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */ -} - -/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit - * tables, we don't make a full table if we are reducing to 8-bit in - * the future. Note also how the gamma_16 tables are segmented so that - * we don't need to allocate > 64K chunks for a full 16-bit table. - */ -void /* PRIVATE */ -png_build_gamma_table(png_structrp png_ptr, int bit_depth) -{ - png_debug(1, "in png_build_gamma_table"); - - /* Remove any existing table; this copes with multiple calls to - * png_read_update_info. The warning is because building the gamma tables - * multiple times is a performance hit - it's harmless but the ability to call - * png_read_update_info() multiple times is new in 1.5.6 so it seems sensible - * to warn if the app introduces such a hit. - */ - if (png_ptr->gamma_table != NULL || png_ptr->gamma_16_table != NULL) - { - png_warning(png_ptr, "gamma table being rebuilt"); - png_destroy_gamma_table(png_ptr); - } - - if (bit_depth <= 8) - { - png_build_8bit_table(png_ptr, &png_ptr->gamma_table, - png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma, - png_ptr->screen_gamma) : PNG_FP_1); - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) - { - png_build_8bit_table(png_ptr, &png_ptr->gamma_to_1, - png_reciprocal(png_ptr->colorspace.gamma)); - - png_build_8bit_table(png_ptr, &png_ptr->gamma_from_1, - png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) : - png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */); - } -#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */ - } - else - { - png_byte shift, sig_bit; - - if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) - { - sig_bit = png_ptr->sig_bit.red; - - if (png_ptr->sig_bit.green > sig_bit) - sig_bit = png_ptr->sig_bit.green; - - if (png_ptr->sig_bit.blue > sig_bit) - sig_bit = png_ptr->sig_bit.blue; - } - else - sig_bit = png_ptr->sig_bit.gray; - - /* 16-bit gamma code uses this equation: - * - * ov = table[(iv & 0xff) >> gamma_shift][iv >> 8] - * - * Where 'iv' is the input color value and 'ov' is the output value - - * pow(iv, gamma). - * - * Thus the gamma table consists of up to 256 256 entry tables. The table - * is selected by the (8-gamma_shift) most significant of the low 8 bits of - * the color value then indexed by the upper 8 bits: - * - * table[low bits][high 8 bits] - * - * So the table 'n' corresponds to all those 'iv' of: - * - * ..<(n+1 << gamma_shift)-1> - * - */ - if (sig_bit > 0 && sig_bit < 16U) - shift = (png_byte)(16U - sig_bit); /* shift == insignificant bits */ - - else - shift = 0; /* keep all 16 bits */ - - if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) - { - /* PNG_MAX_GAMMA_8 is the number of bits to keep - effectively - * the significant bits in the *input* when the output will - * eventually be 8 bits. By default it is 11. - */ - if (shift < (16U - PNG_MAX_GAMMA_8)) - shift = (16U - PNG_MAX_GAMMA_8); - } - - if (shift > 8U) - shift = 8U; /* Guarantees at least one table! */ - - png_ptr->gamma_shift = shift; - -#ifdef PNG_16BIT_SUPPORTED - /* NOTE: prior to 1.5.4 this test used to include PNG_BACKGROUND (now - * PNG_COMPOSE). This effectively smashed the background calculation for - * 16-bit output because the 8-bit table assumes the result will be reduced - * to 8 bits. - */ - if (png_ptr->transformations & (PNG_16_TO_8 | PNG_SCALE_16_TO_8)) -#endif - png_build_16to8_table(png_ptr, &png_ptr->gamma_16_table, shift, - png_ptr->screen_gamma > 0 ? png_product2(png_ptr->colorspace.gamma, - png_ptr->screen_gamma) : PNG_FP_1); - -#ifdef PNG_16BIT_SUPPORTED - else - png_build_16bit_table(png_ptr, &png_ptr->gamma_16_table, shift, - png_ptr->screen_gamma > 0 ? png_reciprocal2(png_ptr->colorspace.gamma, - png_ptr->screen_gamma) : PNG_FP_1); -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - if (png_ptr->transformations & (PNG_COMPOSE | PNG_RGB_TO_GRAY)) - { - png_build_16bit_table(png_ptr, &png_ptr->gamma_16_to_1, shift, - png_reciprocal(png_ptr->colorspace.gamma)); - - /* Notice that the '16 from 1' table should be full precision, however - * the lookup on this table still uses gamma_shift, so it can't be. - * TODO: fix this. - */ - png_build_16bit_table(png_ptr, &png_ptr->gamma_16_from_1, shift, - png_ptr->screen_gamma > 0 ? png_reciprocal(png_ptr->screen_gamma) : - png_ptr->colorspace.gamma/* Probably doing rgb_to_gray */); - } -#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */ - } -} -#endif /* READ_GAMMA */ - -/* HARDWARE OPTION SUPPORT */ -#ifdef PNG_SET_OPTION_SUPPORTED -int PNGAPI -png_set_option(png_structrp png_ptr, int option, int onoff) -{ - if (png_ptr != NULL && option >= 0 && option < PNG_OPTION_NEXT && - (option & 1) == 0) - { - int mask = 3 << option; - int setting = (2 + (onoff != 0)) << option; - int current = png_ptr->options; - - png_ptr->options = (png_byte)((current & ~mask) | setting); - - return (current & mask) >> option; - } - - return PNG_OPTION_INVALID; -} -#endif - -/* sRGB support */ -#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\ - defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) -/* sRGB conversion tables; these are machine generated with the code in - * contrib/tools/makesRGB.c. The actual sRGB transfer curve defined in the - * specification (see the article at http://en.wikipedia.org/wiki/SRGB) - * is used, not the gamma=1/2.2 approximation use elsewhere in libpng. - * The sRGB to linear table is exact (to the nearest 16 bit linear fraction). - * The inverse (linear to sRGB) table has accuracies as follows: - * - * For all possible (255*65535+1) input values: - * - * error: -0.515566 - 0.625971, 79441 (0.475369%) of readings inexact - * - * For the input values corresponding to the 65536 16-bit values: - * - * error: -0.513727 - 0.607759, 308 (0.469978%) of readings inexact - * - * In all cases the inexact readings are off by one. - */ - -#ifdef PNG_SIMPLIFIED_READ_SUPPORTED -/* The convert-to-sRGB table is only currently required for read. */ -const png_uint_16 png_sRGB_table[256] = -{ - 0,20,40,60,80,99,119,139, - 159,179,199,219,241,264,288,313, - 340,367,396,427,458,491,526,562, - 599,637,677,718,761,805,851,898, - 947,997,1048,1101,1156,1212,1270,1330, - 1391,1453,1517,1583,1651,1720,1790,1863, - 1937,2013,2090,2170,2250,2333,2418,2504, - 2592,2681,2773,2866,2961,3058,3157,3258, - 3360,3464,3570,3678,3788,3900,4014,4129, - 4247,4366,4488,4611,4736,4864,4993,5124, - 5257,5392,5530,5669,5810,5953,6099,6246, - 6395,6547,6700,6856,7014,7174,7335,7500, - 7666,7834,8004,8177,8352,8528,8708,8889, - 9072,9258,9445,9635,9828,10022,10219,10417, - 10619,10822,11028,11235,11446,11658,11873,12090, - 12309,12530,12754,12980,13209,13440,13673,13909, - 14146,14387,14629,14874,15122,15371,15623,15878, - 16135,16394,16656,16920,17187,17456,17727,18001, - 18277,18556,18837,19121,19407,19696,19987,20281, - 20577,20876,21177,21481,21787,22096,22407,22721, - 23038,23357,23678,24002,24329,24658,24990,25325, - 25662,26001,26344,26688,27036,27386,27739,28094, - 28452,28813,29176,29542,29911,30282,30656,31033, - 31412,31794,32179,32567,32957,33350,33745,34143, - 34544,34948,35355,35764,36176,36591,37008,37429, - 37852,38278,38706,39138,39572,40009,40449,40891, - 41337,41785,42236,42690,43147,43606,44069,44534, - 45002,45473,45947,46423,46903,47385,47871,48359, - 48850,49344,49841,50341,50844,51349,51858,52369, - 52884,53401,53921,54445,54971,55500,56032,56567, - 57105,57646,58190,58737,59287,59840,60396,60955, - 61517,62082,62650,63221,63795,64372,64952,65535 -}; - -#endif /* simplified read only */ - -/* The base/delta tables are required for both read and write (but currently - * only the simplified versions.) - */ -const png_uint_16 png_sRGB_base[512] = -{ - 128,1782,3383,4644,5675,6564,7357,8074, - 8732,9346,9921,10463,10977,11466,11935,12384, - 12816,13233,13634,14024,14402,14769,15125,15473, - 15812,16142,16466,16781,17090,17393,17690,17981, - 18266,18546,18822,19093,19359,19621,19879,20133, - 20383,20630,20873,21113,21349,21583,21813,22041, - 22265,22487,22707,22923,23138,23350,23559,23767, - 23972,24175,24376,24575,24772,24967,25160,25352, - 25542,25730,25916,26101,26284,26465,26645,26823, - 27000,27176,27350,27523,27695,27865,28034,28201, - 28368,28533,28697,28860,29021,29182,29341,29500, - 29657,29813,29969,30123,30276,30429,30580,30730, - 30880,31028,31176,31323,31469,31614,31758,31902, - 32045,32186,32327,32468,32607,32746,32884,33021, - 33158,33294,33429,33564,33697,33831,33963,34095, - 34226,34357,34486,34616,34744,34873,35000,35127, - 35253,35379,35504,35629,35753,35876,35999,36122, - 36244,36365,36486,36606,36726,36845,36964,37083, - 37201,37318,37435,37551,37668,37783,37898,38013, - 38127,38241,38354,38467,38580,38692,38803,38915, - 39026,39136,39246,39356,39465,39574,39682,39790, - 39898,40005,40112,40219,40325,40431,40537,40642, - 40747,40851,40955,41059,41163,41266,41369,41471, - 41573,41675,41777,41878,41979,42079,42179,42279, - 42379,42478,42577,42676,42775,42873,42971,43068, - 43165,43262,43359,43456,43552,43648,43743,43839, - 43934,44028,44123,44217,44311,44405,44499,44592, - 44685,44778,44870,44962,45054,45146,45238,45329, - 45420,45511,45601,45692,45782,45872,45961,46051, - 46140,46229,46318,46406,46494,46583,46670,46758, - 46846,46933,47020,47107,47193,47280,47366,47452, - 47538,47623,47709,47794,47879,47964,48048,48133, - 48217,48301,48385,48468,48552,48635,48718,48801, - 48884,48966,49048,49131,49213,49294,49376,49458, - 49539,49620,49701,49782,49862,49943,50023,50103, - 50183,50263,50342,50422,50501,50580,50659,50738, - 50816,50895,50973,51051,51129,51207,51285,51362, - 51439,51517,51594,51671,51747,51824,51900,51977, - 52053,52129,52205,52280,52356,52432,52507,52582, - 52657,52732,52807,52881,52956,53030,53104,53178, - 53252,53326,53400,53473,53546,53620,53693,53766, - 53839,53911,53984,54056,54129,54201,54273,54345, - 54417,54489,54560,54632,54703,54774,54845,54916, - 54987,55058,55129,55199,55269,55340,55410,55480, - 55550,55620,55689,55759,55828,55898,55967,56036, - 56105,56174,56243,56311,56380,56448,56517,56585, - 56653,56721,56789,56857,56924,56992,57059,57127, - 57194,57261,57328,57395,57462,57529,57595,57662, - 57728,57795,57861,57927,57993,58059,58125,58191, - 58256,58322,58387,58453,58518,58583,58648,58713, - 58778,58843,58908,58972,59037,59101,59165,59230, - 59294,59358,59422,59486,59549,59613,59677,59740, - 59804,59867,59930,59993,60056,60119,60182,60245, - 60308,60370,60433,60495,60558,60620,60682,60744, - 60806,60868,60930,60992,61054,61115,61177,61238, - 61300,61361,61422,61483,61544,61605,61666,61727, - 61788,61848,61909,61969,62030,62090,62150,62211, - 62271,62331,62391,62450,62510,62570,62630,62689, - 62749,62808,62867,62927,62986,63045,63104,63163, - 63222,63281,63340,63398,63457,63515,63574,63632, - 63691,63749,63807,63865,63923,63981,64039,64097, - 64155,64212,64270,64328,64385,64443,64500,64557, - 64614,64672,64729,64786,64843,64900,64956,65013, - 65070,65126,65183,65239,65296,65352,65409,65465 -}; - -const png_byte png_sRGB_delta[512] = -{ - 207,201,158,129,113,100,90,82,77,72,68,64,61,59,56,54, - 52,50,49,47,46,45,43,42,41,40,39,39,38,37,36,36, - 35,34,34,33,33,32,32,31,31,30,30,30,29,29,28,28, - 28,27,27,27,27,26,26,26,25,25,25,25,24,24,24,24, - 23,23,23,23,23,22,22,22,22,22,22,21,21,21,21,21, - 21,20,20,20,20,20,20,20,20,19,19,19,19,19,19,19, - 19,18,18,18,18,18,18,18,18,18,18,17,17,17,17,17, - 17,17,17,17,17,17,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, - 11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, - 10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, - 9,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 -}; -#endif /* SIMPLIFIED READ/WRITE sRGB support */ - -/* SIMPLIFIED READ/WRITE SUPPORT */ -#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\ - defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) -static int -png_image_free_function(png_voidp argument) -{ - png_imagep image = png_voidcast(png_imagep, argument); - png_controlp cp = image->opaque; - png_control c; - - /* Double check that we have a png_ptr - it should be impossible to get here - * without one. - */ - if (cp->png_ptr == NULL) - return 0; - - /* First free any data held in the control structure. */ -# ifdef PNG_STDIO_SUPPORTED - if (cp->owned_file) - { - FILE *fp = png_voidcast(FILE*, cp->png_ptr->io_ptr); - cp->owned_file = 0; - - /* Ignore errors here. */ - if (fp != NULL) - { - cp->png_ptr->io_ptr = NULL; - (void)fclose(fp); - } - } -# endif - - /* Copy the control structure so that the original, allocated, version can be - * safely freed. Notice that a png_error here stops the remainder of the - * cleanup, but this is probably fine because that would indicate bad memory - * problems anyway. - */ - c = *cp; - image->opaque = &c; - png_free(c.png_ptr, cp); - - /* Then the structures, calling the correct API. */ - if (c.for_write) - { -# ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED - png_destroy_write_struct(&c.png_ptr, &c.info_ptr); -# else - png_error(c.png_ptr, "simplified write not supported"); -# endif - } - else - { -# ifdef PNG_SIMPLIFIED_READ_SUPPORTED - png_destroy_read_struct(&c.png_ptr, &c.info_ptr, NULL); -# else - png_error(c.png_ptr, "simplified read not supported"); -# endif - } - - /* Success. */ - return 1; -} - -void PNGAPI -png_image_free(png_imagep image) -{ - /* Safely call the real function, but only if doing so is safe at this point - * (if not inside an error handling context). Otherwise assume - * png_safe_execute will call this API after the return. - */ - if (image != NULL && image->opaque != NULL && - image->opaque->error_buf == NULL) - { - /* Ignore errors here: */ - (void)png_safe_execute(image, png_image_free_function, image); - image->opaque = NULL; - } -} - -int /* PRIVATE */ -png_image_error(png_imagep image, png_const_charp error_message) -{ - /* Utility to log an error. */ - png_safecat(image->message, (sizeof image->message), 0, error_message); - image->warning_or_error |= PNG_IMAGE_ERROR; - png_image_free(image); - return 0; -} - -#endif /* SIMPLIFIED READ/WRITE */ -#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.h b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.h deleted file mode 100755 index d447233..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/png.h +++ /dev/null @@ -1,3292 +0,0 @@ - -/* png.h - header file for PNG reference library - * - * libpng version 1.6.1 - March 28, 2013 - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license (See LICENSE, below) - * - * Authors and maintainers: - * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat - * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.6.1 - March 28, 2013: Glenn - * See also "Contributing Authors", below. - * - * Note about libpng version numbers: - * - * Due to various miscommunications, unforeseen code incompatibilities - * and occasional factors outside the authors' control, version numbering - * on the library has not always been consistent and straightforward. - * The following table summarizes matters since version 0.89c, which was - * the first widely used release: - * - * source png.h png.h shared-lib - * version string int version - * ------- ------ ----- ---------- - * 0.89c "1.0 beta 3" 0.89 89 1.0.89 - * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] - * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] - * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] - * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] - * 0.97c 0.97 97 2.0.97 - * 0.98 0.98 98 2.0.98 - * 0.99 0.99 98 2.0.99 - * 0.99a-m 0.99 99 2.0.99 - * 1.00 1.00 100 2.1.0 [100 should be 10000] - * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] - * 1.0.1 png.h string is 10001 2.1.0 - * 1.0.1a-e identical to the 10002 from here on, the shared library - * 1.0.2 source version) 10002 is 2.V where V is the source code - * 1.0.2a-b 10003 version, except as noted. - * 1.0.3 10003 - * 1.0.3a-d 10004 - * 1.0.4 10004 - * 1.0.4a-f 10005 - * 1.0.5 (+ 2 patches) 10005 - * 1.0.5a-d 10006 - * 1.0.5e-r 10100 (not source compatible) - * 1.0.5s-v 10006 (not binary compatible) - * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) - * 1.0.6d-f 10007 (still binary incompatible) - * 1.0.6g 10007 - * 1.0.6h 10007 10.6h (testing xy.z so-numbering) - * 1.0.6i 10007 10.6i - * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) - * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) - * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) - * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) - * 1.0.7 1 10007 (still compatible) - * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 - * 1.0.8rc1 1 10008 2.1.0.8rc1 - * 1.0.8 1 10008 2.1.0.8 - * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 - * 1.0.9rc1 1 10009 2.1.0.9rc1 - * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 - * 1.0.9rc2 1 10009 2.1.0.9rc2 - * 1.0.9 1 10009 2.1.0.9 - * 1.0.10beta1 1 10010 2.1.0.10beta1 - * 1.0.10rc1 1 10010 2.1.0.10rc1 - * 1.0.10 1 10010 2.1.0.10 - * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 - * 1.0.11rc1 1 10011 2.1.0.11rc1 - * 1.0.11 1 10011 2.1.0.11 - * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 - * 1.0.12rc1 2 10012 2.1.0.12rc1 - * 1.0.12 2 10012 2.1.0.12 - * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) - * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 - * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 - * 1.2.0rc1 3 10200 3.1.2.0rc1 - * 1.2.0 3 10200 3.1.2.0 - * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 - * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 - * 1.2.1 3 10201 3.1.2.1 - * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 - * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 - * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 - * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 - * 1.0.13 10 10013 10.so.0.1.0.13 - * 1.2.2 12 10202 12.so.0.1.2.2 - * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 - * 1.2.3 12 10203 12.so.0.1.2.3 - * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 - * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 - * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 - * 1.0.14 10 10014 10.so.0.1.0.14 - * 1.2.4 13 10204 12.so.0.1.2.4 - * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 - * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 - * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 - * 1.0.15 10 10015 10.so.0.1.0.15 - * 1.2.5 13 10205 12.so.0.1.2.5 - * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 - * 1.0.16 10 10016 10.so.0.1.0.16 - * 1.2.6 13 10206 12.so.0.1.2.6 - * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 - * 1.0.17rc1 10 10017 12.so.0.1.0.17rc1 - * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 - * 1.0.17 10 10017 12.so.0.1.0.17 - * 1.2.7 13 10207 12.so.0.1.2.7 - * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 - * 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5 - * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 - * 1.0.18 10 10018 12.so.0.1.0.18 - * 1.2.8 13 10208 12.so.0.1.2.8 - * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 - * 1.2.9beta4-11 13 10209 12.so.0.9[.0] - * 1.2.9rc1 13 10209 12.so.0.9[.0] - * 1.2.9 13 10209 12.so.0.9[.0] - * 1.2.10beta1-7 13 10210 12.so.0.10[.0] - * 1.2.10rc1-2 13 10210 12.so.0.10[.0] - * 1.2.10 13 10210 12.so.0.10[.0] - * 1.4.0beta1-5 14 10400 14.so.0.0[.0] - * 1.2.11beta1-4 13 10211 12.so.0.11[.0] - * 1.4.0beta7-8 14 10400 14.so.0.0[.0] - * 1.2.11 13 10211 12.so.0.11[.0] - * 1.2.12 13 10212 12.so.0.12[.0] - * 1.4.0beta9-14 14 10400 14.so.0.0[.0] - * 1.2.13 13 10213 12.so.0.13[.0] - * 1.4.0beta15-36 14 10400 14.so.0.0[.0] - * 1.4.0beta37-87 14 10400 14.so.14.0[.0] - * 1.4.0rc01 14 10400 14.so.14.0[.0] - * 1.4.0beta88-109 14 10400 14.so.14.0[.0] - * 1.4.0rc02-08 14 10400 14.so.14.0[.0] - * 1.4.0 14 10400 14.so.14.0[.0] - * 1.4.1beta01-03 14 10401 14.so.14.1[.0] - * 1.4.1rc01 14 10401 14.so.14.1[.0] - * 1.4.1beta04-12 14 10401 14.so.14.1[.0] - * 1.4.1 14 10401 14.so.14.1[.0] - * 1.4.2 14 10402 14.so.14.2[.0] - * 1.4.3 14 10403 14.so.14.3[.0] - * 1.4.4 14 10404 14.so.14.4[.0] - * 1.5.0beta01-58 15 10500 15.so.15.0[.0] - * 1.5.0rc01-07 15 10500 15.so.15.0[.0] - * 1.5.0 15 10500 15.so.15.0[.0] - * 1.5.1beta01-11 15 10501 15.so.15.1[.0] - * 1.5.1rc01-02 15 10501 15.so.15.1[.0] - * 1.5.1 15 10501 15.so.15.1[.0] - * 1.5.2beta01-03 15 10502 15.so.15.2[.0] - * 1.5.2rc01-03 15 10502 15.so.15.2[.0] - * 1.5.2 15 10502 15.so.15.2[.0] - * 1.5.3beta01-10 15 10503 15.so.15.3[.0] - * 1.5.3rc01-02 15 10503 15.so.15.3[.0] - * 1.5.3beta11 15 10503 15.so.15.3[.0] - * 1.5.3 [omitted] - * 1.5.4beta01-08 15 10504 15.so.15.4[.0] - * 1.5.4rc01 15 10504 15.so.15.4[.0] - * 1.5.4 15 10504 15.so.15.4[.0] - * 1.5.5beta01-08 15 10505 15.so.15.5[.0] - * 1.5.5rc01 15 10505 15.so.15.5[.0] - * 1.5.5 15 10505 15.so.15.5[.0] - * 1.5.6beta01-07 15 10506 15.so.15.6[.0] - * 1.5.6rc01-03 15 10506 15.so.15.6[.0] - * 1.5.6 15 10506 15.so.15.6[.0] - * 1.5.7beta01-05 15 10507 15.so.15.7[.0] - * 1.5.7rc01-03 15 10507 15.so.15.7[.0] - * 1.5.7 15 10507 15.so.15.7[.0] - * 1.6.0beta01-40 16 10600 16.so.16.0[.0] - * 1.6.0rc01-08 16 10600 16.so.16.0[.0] - * 1.6.0 16 10600 16.so.16.0[.0] - * 1.6.1beta01-10 16 10601 16.so.16.1[.0] - * 1.6.1rc01 16 10601 16.so.16.1[.0] - * 1.6.1 16 10601 16.so.16.1[.0] - * - * Henceforth the source version will match the shared-library major - * and minor numbers; the shared-library major version number will be - * used for changes in backward compatibility, as it is intended. The - * PNG_LIBPNG_VER macro, which is not used within libpng but is available - * for applications, is an unsigned integer of the form xyyzz corresponding - * to the source version x.y.z (leading zeros in y and z). Beta versions - * were given the previous public release number plus a letter, until - * version 1.0.6j; from then on they were given the upcoming public - * release number plus "betaNN" or "rcNN". - * - * Binary incompatibility exists only when applications make direct access - * to the info_ptr or png_ptr members through png.h, and the compiled - * application is loaded with a different version of the library. - * - * DLLNUM will change each time there are forward or backward changes - * in binary compatibility (e.g., when a new feature is added). - * - * See libpng-manual.txt or libpng.3 for more information. The PNG - * specification is available as a W3C Recommendation and as an ISO - * Specification, defines should NOT be changed. - */ -#define PNG_INFO_gAMA 0x0001 -#define PNG_INFO_sBIT 0x0002 -#define PNG_INFO_cHRM 0x0004 -#define PNG_INFO_PLTE 0x0008 -#define PNG_INFO_tRNS 0x0010 -#define PNG_INFO_bKGD 0x0020 -#define PNG_INFO_hIST 0x0040 -#define PNG_INFO_pHYs 0x0080 -#define PNG_INFO_oFFs 0x0100 -#define PNG_INFO_tIME 0x0200 -#define PNG_INFO_pCAL 0x0400 -#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ -#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ -#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ -#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ -#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */ - -/* This is used for the transformation routines, as some of them - * change these values for the row. It also should enable using - * the routines for other purposes. - */ -typedef struct png_row_info_struct -{ - png_uint_32 width; /* width of row */ - png_size_t rowbytes; /* number of bytes in row */ - png_byte color_type; /* color type of row */ - png_byte bit_depth; /* bit depth of row */ - png_byte channels; /* number of channels (1, 2, 3, or 4) */ - png_byte pixel_depth; /* bits per pixel (depth * channels) */ -} png_row_info; - -typedef png_row_info * png_row_infop; -typedef png_row_info * * png_row_infopp; - -/* These are the function types for the I/O functions and for the functions - * that allow the user to override the default I/O functions with his or her - * own. The png_error_ptr type should match that of user-supplied warning - * and error functions, while the png_rw_ptr type should match that of the - * user read/write data functions. Note that the 'write' function must not - * modify the buffer it is passed. The 'read' function, on the other hand, is - * expected to return the read data in the buffer. - */ -typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp)); -typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t)); -typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp)); -typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32, - int)); -typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, - int)); - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); -typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); - -/* The following callback receives png_uint_32 row_number, int pass for the - * png_bytep data of the row. When transforming an interlaced image the - * row number is the row number within the sub-image of the interlace pass, so - * the value will increase to the height of the sub-image (not the full image) - * then reset to 0 for the next pass. - * - * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to - * find the output pixel (x,y) given an interlaced sub-image pixel - * (row,col,pass). (See below for these macros.) - */ -typedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep, - png_uint_32, int)); -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -typedef PNG_CALLBACK(void, *png_user_transform_ptr, (png_structp, png_row_infop, - png_bytep)); -#endif - -#ifdef PNG_USER_CHUNKS_SUPPORTED -typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp, - png_unknown_chunkp)); -#endif -#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED -/* not used anywhere */ -/* typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp)); */ -#endif - -#ifdef PNG_SETJMP_SUPPORTED -/* This must match the function definition in , and the application - * must include this before png.h to obtain the definition of jmp_buf. The - * function is required to be PNG_NORETURN, but this is not checked. If the - * function does return the application will crash via an abort() or similar - * system level call. - * - * If you get a warning here while building the library you may need to make - * changes to ensure that pnglibconf.h records the calling convention used by - * your compiler. This may be very difficult - try using a different compiler - * to build the library! - */ -PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), typedef); -#endif - -/* Transform masks for the high-level interface */ -#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ -#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ -#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ -#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ -#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ -#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ -#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ -#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ -#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ -#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ -#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ -#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ -#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* write only */ -/* Added to libpng-1.2.34 */ -#define PNG_TRANSFORM_STRIP_FILLER_BEFORE PNG_TRANSFORM_STRIP_FILLER -#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */ -/* Added to libpng-1.4.0 */ -#define PNG_TRANSFORM_GRAY_TO_RGB 0x2000 /* read only */ -/* Added to libpng-1.5.4 */ -#define PNG_TRANSFORM_EXPAND_16 0x4000 /* read only */ -#define PNG_TRANSFORM_SCALE_16 0x8000 /* read only */ - -/* Flags for MNG supported features */ -#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 -#define PNG_FLAG_MNG_FILTER_64 0x04 -#define PNG_ALL_MNG_FEATURES 0x05 - -/* NOTE: prior to 1.5 these functions had no 'API' style declaration, - * this allowed the zlib default functions to be used on Windows - * platforms. In 1.5 the zlib default malloc (which just calls malloc and - * ignores the first argument) should be completely compatible with the - * following. - */ -typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp, - png_alloc_size_t)); -typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp)); - -/* Section 3: exported functions - * Here are the function definitions most commonly used. This is not - * the place to find out how to use libpng. See libpng-manual.txt for the - * full explanation, see example.c for the summary. This just provides - * a simple one line description of the use of each function. - * - * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in - * pngconf.h and in the *.dfn files in the scripts directory. - * - * PNG_EXPORT(ordinal, type, name, (args)); - * - * ordinal: ordinal that is used while building - * *.def files. The ordinal value is only - * relevant when preprocessing png.h with - * the *.dfn files for building symbol table - * entries, and are removed by pngconf.h. - * type: return type of the function - * name: function name - * args: function arguments, with types - * - * When we wish to append attributes to a function prototype we use - * the PNG_EXPORTA() macro instead. - * - * PNG_EXPORTA(ordinal, type, name, (args), attributes); - * - * ordinal, type, name, and args: same as in PNG_EXPORT(). - * attributes: function attributes - */ - -/* Returns the version number of the library */ -PNG_EXPORT(1, png_uint_32, png_access_version_number, (void)); - -/* Tell lib we have already handled the first magic bytes. - * Handling more than 8 bytes from the beginning of the file is an error. - */ -PNG_EXPORT(2, void, png_set_sig_bytes, (png_structrp png_ptr, int num_bytes)); - -/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a - * PNG file. Returns zero if the supplied bytes match the 8-byte PNG - * signature, and non-zero otherwise. Having num_to_check == 0 or - * start > 7 will always fail (ie return non-zero). - */ -PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start, - png_size_t num_to_check)); - -/* Simple signature checking function. This is the same as calling - * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). - */ -#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n)) - -/* Allocate and initialize png_ptr struct for reading, and any other memory. */ -PNG_EXPORTA(4, png_structp, png_create_read_struct, - (png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn), - PNG_ALLOCATED); - -/* Allocate and initialize png_ptr struct for writing, and any other memory */ -PNG_EXPORTA(5, png_structp, png_create_write_struct, - (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, - png_error_ptr warn_fn), - PNG_ALLOCATED); - -PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size, - (png_const_structrp png_ptr)); - -PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structrp png_ptr, - png_size_t size)); - -/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp - * match up. - */ -#ifdef PNG_SETJMP_SUPPORTED -/* This function returns the jmp_buf built in to *png_ptr. It must be - * supplied with an appropriate 'longjmp' function to use on that jmp_buf - * unless the default error function is overridden in which case NULL is - * acceptable. The size of the jmp_buf is checked against the actual size - * allocated by the library - the call will return NULL on a mismatch - * indicating an ABI mismatch. - */ -PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structrp png_ptr, - png_longjmp_ptr longjmp_fn, size_t jmp_buf_size)); -# define png_jmpbuf(png_ptr) \ - (*png_set_longjmp_fn((png_ptr), longjmp, (sizeof (jmp_buf)))) -#else -# define png_jmpbuf(png_ptr) \ - (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP) -#endif -/* This function should be used by libpng applications in place of - * longjmp(png_ptr->jmpbuf, val). If longjmp_fn() has been set, it - * will use it; otherwise it will call PNG_ABORT(). This function was - * added in libpng-1.5.0. - */ -PNG_EXPORTA(9, void, png_longjmp, (png_const_structrp png_ptr, int val), - PNG_NORETURN); - -#ifdef PNG_READ_SUPPORTED -/* Reset the compression stream */ -PNG_EXPORTA(10, int, png_reset_zstream, (png_structrp png_ptr), PNG_DEPRECATED); -#endif - -/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ -#ifdef PNG_USER_MEM_SUPPORTED -PNG_EXPORTA(11, png_structp, png_create_read_struct_2, - (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, - png_error_ptr warn_fn, - png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), - PNG_ALLOCATED); -PNG_EXPORTA(12, png_structp, png_create_write_struct_2, - (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, - png_error_ptr warn_fn, - png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), - PNG_ALLOCATED); -#endif - -/* Write the PNG file signature. */ -PNG_EXPORT(13, void, png_write_sig, (png_structrp png_ptr)); - -/* Write a PNG chunk - size, type, (optional) data, CRC. */ -PNG_EXPORT(14, void, png_write_chunk, (png_structrp png_ptr, png_const_bytep - chunk_name, png_const_bytep data, png_size_t length)); - -/* Write the start of a PNG chunk - length and chunk name. */ -PNG_EXPORT(15, void, png_write_chunk_start, (png_structrp png_ptr, - png_const_bytep chunk_name, png_uint_32 length)); - -/* Write the data of a PNG chunk started with png_write_chunk_start(). */ -PNG_EXPORT(16, void, png_write_chunk_data, (png_structrp png_ptr, - png_const_bytep data, png_size_t length)); - -/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ -PNG_EXPORT(17, void, png_write_chunk_end, (png_structrp png_ptr)); - -/* Allocate and initialize the info structure */ -PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_const_structrp png_ptr), - PNG_ALLOCATED); - -/* DEPRECATED: this function allowed init structures to be created using the - * default allocation method (typically malloc). Use is deprecated in 1.6.0 and - * the API will be removed in the future. - */ -PNG_EXPORTA(19, void, png_info_init_3, (png_infopp info_ptr, - png_size_t png_info_struct_size), PNG_DEPRECATED); - -/* Writes all the PNG information before the image. */ -PNG_EXPORT(20, void, png_write_info_before_PLTE, - (png_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(21, void, png_write_info, - (png_structrp png_ptr, png_const_inforp info_ptr)); - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read the information before the actual image data. */ -PNG_EXPORT(22, void, png_read_info, - (png_structrp png_ptr, png_inforp info_ptr)); -#endif - -#ifdef PNG_TIME_RFC1123_SUPPORTED - /* Convert to a US string format: there is no localization support in this - * routine. The original implementation used a 29 character buffer in - * png_struct, this will be removed in future versions. - */ -#if PNG_LIBPNG_VER < 10700 -/* To do: remove this from libpng17 (and from libpng17/png.c and pngstruct.h) */ -PNG_EXPORTA(23, png_const_charp, png_convert_to_rfc1123, (png_structrp png_ptr, - png_const_timep ptime),PNG_DEPRECATED); -#endif -PNG_EXPORT(241, int, png_convert_to_rfc1123_buffer, (char out[29], - png_const_timep ptime)); -#endif - -#ifdef PNG_CONVERT_tIME_SUPPORTED -/* Convert from a struct tm to png_time */ -PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime, - const struct tm * ttime)); - -/* Convert from time_t to png_time. Uses gmtime() */ -PNG_EXPORT(25, void, png_convert_from_time_t, (png_timep ptime, time_t ttime)); -#endif /* PNG_CONVERT_tIME_SUPPORTED */ - -#ifdef PNG_READ_EXPAND_SUPPORTED -/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ -PNG_EXPORT(26, void, png_set_expand, (png_structrp png_ptr)); -PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structrp png_ptr)); -PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structrp png_ptr)); -PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_EXPAND_16_SUPPORTED -/* Expand to 16-bit channels, forces conversion of palette to RGB and expansion - * of a tRNS chunk if present. - */ -PNG_EXPORT(221, void, png_set_expand_16, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -/* Use blue, green, red order for pixels. */ -PNG_EXPORT(30, void, png_set_bgr, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED -/* Expand the grayscale to 24-bit RGB if necessary. */ -PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED -/* Reduce RGB to grayscale. */ -#define PNG_ERROR_ACTION_NONE 1 -#define PNG_ERROR_ACTION_WARN 2 -#define PNG_ERROR_ACTION_ERROR 3 -#define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/ - -PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structrp png_ptr, - int error_action, double red, double green)) -PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structrp png_ptr, - int error_action, png_fixed_point red, png_fixed_point green)) - -PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structrp - png_ptr)); -#endif - -#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED -PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth, - png_colorp palette)); -#endif - -#ifdef PNG_READ_ALPHA_MODE_SUPPORTED -/* How the alpha channel is interpreted - this affects how the color channels of - * a PNG file are returned when an alpha channel, or tRNS chunk in a palette - * file, is present. - * - * This has no effect on the way pixels are written into a PNG output - * datastream. The color samples in a PNG datastream are never premultiplied - * with the alpha samples. - * - * The default is to return data according to the PNG specification: the alpha - * channel is a linear measure of the contribution of the pixel to the - * corresponding composited pixel. The gamma encoded color channels must be - * scaled according to the contribution and to do this it is necessary to undo - * the encoding, scale the color values, perform the composition and reencode - * the values. This is the 'PNG' mode. - * - * The alternative is to 'associate' the alpha with the color information by - * storing color channel values that have been scaled by the alpha. The - * advantage is that the color channels can be resampled (the image can be - * scaled) in this form. The disadvantage is that normal practice is to store - * linear, not (gamma) encoded, values and this requires 16-bit channels for - * still images rather than the 8-bit channels that are just about sufficient if - * gamma encoding is used. In addition all non-transparent pixel values, - * including completely opaque ones, must be gamma encoded to produce the final - * image. This is the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' mode (the - * latter being the two common names for associated alpha color channels.) - * - * Since it is not necessary to perform arithmetic on opaque color values so - * long as they are not to be resampled and are in the final color space it is - * possible to optimize the handling of alpha by storing the opaque pixels in - * the PNG format (adjusted for the output color space) while storing partially - * opaque pixels in the standard, linear, format. The accuracy required for - * standard alpha composition is relatively low, because the pixels are - * isolated, therefore typically the accuracy loss in storing 8-bit linear - * values is acceptable. (This is not true if the alpha channel is used to - * simulate transparency over large areas - use 16 bits or the PNG mode in - * this case!) This is the 'OPTIMIZED' mode. For this mode a pixel is - * treated as opaque only if the alpha value is equal to the maximum value. - * - * The final choice is to gamma encode the alpha channel as well. This is - * broken because, in practice, no implementation that uses this choice - * correctly undoes the encoding before handling alpha composition. Use this - * choice only if other serious errors in the software or hardware you use - * mandate it; the typical serious error is for dark halos to appear around - * opaque areas of the composited PNG image because of arithmetic overflow. - * - * The API function png_set_alpha_mode specifies which of these choices to use - * with an enumerated 'mode' value and the gamma of the required output: - */ -#define PNG_ALPHA_PNG 0 /* according to the PNG standard */ -#define PNG_ALPHA_STANDARD 1 /* according to Porter/Duff */ -#define PNG_ALPHA_ASSOCIATED 1 /* as above; this is the normal practice */ -#define PNG_ALPHA_PREMULTIPLIED 1 /* as above */ -#define PNG_ALPHA_OPTIMIZED 2 /* 'PNG' for opaque pixels, else 'STANDARD' */ -#define PNG_ALPHA_BROKEN 3 /* the alpha channel is gamma encoded */ - -PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structrp png_ptr, int mode, - double output_gamma)) -PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structrp png_ptr, - int mode, png_fixed_point output_gamma)) -#endif - -#if defined(PNG_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED) -/* The output_gamma value is a screen gamma in libpng terminology: it expresses - * how to decode the output values, not how they are encoded. The values used - * correspond to the normal numbers used to describe the overall gamma of a - * computer display system; for example 2.2 for an sRGB conformant system. The - * values are scaled by 100000 in the _fixed version of the API (so 220000 for - * sRGB.) - * - * The inverse of the value is always used to provide a default for the PNG file - * encoding if it has no gAMA chunk and if png_set_gamma() has not been called - * to override the PNG gamma information. - * - * When the ALPHA_OPTIMIZED mode is selected the output gamma is used to encode - * opaque pixels however pixels with lower alpha values are not encoded, - * regardless of the output gamma setting. - * - * When the standard Porter Duff handling is requested with mode 1 the output - * encoding is set to be linear and the output_gamma value is only relevant - * as a default for input data that has no gamma information. The linear output - * encoding will be overridden if png_set_gamma() is called - the results may be - * highly unexpected! - * - * The following numbers are derived from the sRGB standard and the research - * behind it. sRGB is defined to be approximated by a PNG gAMA chunk value of - * 0.45455 (1/2.2) for PNG. The value implicitly includes any viewing - * correction required to take account of any differences in the color - * environment of the original scene and the intended display environment; the - * value expresses how to *decode* the image for display, not how the original - * data was *encoded*. - * - * sRGB provides a peg for the PNG standard by defining a viewing environment. - * sRGB itself, and earlier TV standards, actually use a more complex transform - * (a linear portion then a gamma 2.4 power law) than PNG can express. (PNG is - * limited to simple power laws.) By saying that an image for direct display on - * an sRGB conformant system should be stored with a gAMA chunk value of 45455 - * (11.3.3.2 and 11.3.3.5 of the ISO PNG specification) the PNG specification - * makes it possible to derive values for other display systems and - * environments. - * - * The Mac value is deduced from the sRGB based on an assumption that the actual - * extra viewing correction used in early Mac display systems was implemented as - * a power 1.45 lookup table. - * - * Any system where a programmable lookup table is used or where the behavior of - * the final display device characteristics can be changed requires system - * specific code to obtain the current characteristic. However this can be - * difficult and most PNG gamma correction only requires an approximate value. - * - * By default, if png_set_alpha_mode() is not called, libpng assumes that all - * values are unencoded, linear, values and that the output device also has a - * linear characteristic. This is only very rarely correct - it is invariably - * better to call png_set_alpha_mode() with PNG_DEFAULT_sRGB than rely on the - * default if you don't know what the right answer is! - * - * The special value PNG_GAMMA_MAC_18 indicates an older Mac system (pre Mac OS - * 10.6) which used a correction table to implement a somewhat lower gamma on an - * otherwise sRGB system. - * - * Both these values are reserved (not simple gamma values) in order to allow - * more precise correction internally in the future. - * - * NOTE: the following values can be passed to either the fixed or floating - * point APIs, but the floating point API will also accept floating point - * values. - */ -#define PNG_DEFAULT_sRGB -1 /* sRGB gamma and color space */ -#define PNG_GAMMA_MAC_18 -2 /* Old Mac '1.8' gamma and color space */ -#define PNG_GAMMA_sRGB 220000 /* Television standards--matches sRGB gamma */ -#define PNG_GAMMA_LINEAR PNG_FP_1 /* Linear */ -#endif - -/* The following are examples of calls to png_set_alpha_mode to achieve the - * required overall gamma correction and, where necessary, alpha - * premultiplication. - * - * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); - * This is the default libpng handling of the alpha channel - it is not - * pre-multiplied into the color components. In addition the call states - * that the output is for a sRGB system and causes all PNG files without gAMA - * chunks to be assumed to be encoded using sRGB. - * - * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); - * In this case the output is assumed to be something like an sRGB conformant - * display preceeded by a power-law lookup table of power 1.45. This is how - * early Mac systems behaved. - * - * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR); - * This is the classic Jim Blinn approach and will work in academic - * environments where everything is done by the book. It has the shortcoming - * of assuming that input PNG data with no gamma information is linear - this - * is unlikely to be correct unless the PNG files where generated locally. - * Most of the time the output precision will be so low as to show - * significant banding in dark areas of the image. - * - * png_set_expand_16(pp); - * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB); - * This is a somewhat more realistic Jim Blinn inspired approach. PNG files - * are assumed to have the sRGB encoding if not marked with a gamma value and - * the output is always 16 bits per component. This permits accurate scaling - * and processing of the data. If you know that your input PNG files were - * generated locally you might need to replace PNG_DEFAULT_sRGB with the - * correct value for your system. - * - * png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB); - * If you just need to composite the PNG image onto an existing background - * and if you control the code that does this you can use the optimization - * setting. In this case you just copy completely opaque pixels to the - * output. For pixels that are not completely transparent (you just skip - * those) you do the composition math using png_composite or png_composite_16 - * below then encode the resultant 8-bit or 16-bit values to match the output - * encoding. - * - * Other cases - * If neither the PNG nor the standard linear encoding work for you because - * of the software or hardware you use then you have a big problem. The PNG - * case will probably result in halos around the image. The linear encoding - * will probably result in a washed out, too bright, image (it's actually too - * contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably - * substantially reduce the halos. Alternatively try: - * - * png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB); - * This option will also reduce the halos, but there will be slight dark - * halos round the opaque parts of the image where the background is light. - * In the OPTIMIZED mode the halos will be light halos where the background - * is dark. Take your pick - the halos are unavoidable unless you can get - * your hardware/software fixed! (The OPTIMIZED approach is slightly - * faster.) - * - * When the default gamma of PNG files doesn't match the output gamma. - * If you have PNG files with no gamma information png_set_alpha_mode allows - * you to provide a default gamma, but it also sets the ouput gamma to the - * matching value. If you know your PNG files have a gamma that doesn't - * match the output you can take advantage of the fact that - * png_set_alpha_mode always sets the output gamma but only sets the PNG - * default if it is not already set: - * - * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); - * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); - * The first call sets both the default and the output gamma values, the - * second call overrides the output gamma without changing the default. This - * is easier than achieving the same effect with png_set_gamma. You must use - * PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will - * fire if more than one call to png_set_alpha_mode and png_set_background is - * made in the same read operation, however multiple calls with PNG_ALPHA_PNG - * are ignored. - */ - -#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED -PNG_EXPORT(36, void, png_set_strip_alpha, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -PNG_EXPORT(37, void, png_set_swap_alpha, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -PNG_EXPORT(38, void, png_set_invert_alpha, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) -/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ -PNG_EXPORT(39, void, png_set_filler, (png_structrp png_ptr, png_uint_32 filler, - int flags)); -/* The values of the PNG_FILLER_ defines should NOT be changed */ -# define PNG_FILLER_BEFORE 0 -# define PNG_FILLER_AFTER 1 -/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ -PNG_EXPORT(40, void, png_set_add_alpha, (png_structrp png_ptr, - png_uint_32 filler, int flags)); -#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ - -#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -/* Swap bytes in 16-bit depth files. */ -PNG_EXPORT(41, void, png_set_swap, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) -/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ -PNG_EXPORT(42, void, png_set_packing, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ - defined(PNG_WRITE_PACKSWAP_SUPPORTED) -/* Swap packing order of pixels in bytes. */ -PNG_EXPORT(43, void, png_set_packswap, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) -/* Converts files to legal bit depths. */ -PNG_EXPORT(44, void, png_set_shift, (png_structrp png_ptr, png_const_color_8p - true_bits)); -#endif - -#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ - defined(PNG_WRITE_INTERLACING_SUPPORTED) -/* Have the code handle the interlacing. Returns the number of passes. - * MUST be called before png_read_update_info or png_start_read_image, - * otherwise it will not have the desired effect. Note that it is still - * necessary to call png_read_row or png_read_rows png_get_image_height - * times for each pass. -*/ -PNG_EXPORT(45, int, png_set_interlace_handling, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) -/* Invert monochrome files */ -PNG_EXPORT(46, void, png_set_invert_mono, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_BACKGROUND_SUPPORTED -/* Handle alpha and tRNS by replacing with a background color. Prior to - * libpng-1.5.4 this API must not be called before the PNG file header has been - * read. Doing so will result in unexpected behavior and possible warnings or - * errors if the PNG file contains a bKGD chunk. - */ -PNG_FP_EXPORT(47, void, png_set_background, (png_structrp png_ptr, - png_const_color_16p background_color, int background_gamma_code, - int need_expand, double background_gamma)) -PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structrp png_ptr, - png_const_color_16p background_color, int background_gamma_code, - int need_expand, png_fixed_point background_gamma)) -#endif -#ifdef PNG_READ_BACKGROUND_SUPPORTED -# define PNG_BACKGROUND_GAMMA_UNKNOWN 0 -# define PNG_BACKGROUND_GAMMA_SCREEN 1 -# define PNG_BACKGROUND_GAMMA_FILE 2 -# define PNG_BACKGROUND_GAMMA_UNIQUE 3 -#endif - -#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED -/* Scale a 16-bit depth file down to 8-bit, accurately. */ -PNG_EXPORT(229, void, png_set_scale_16, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED -#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */ -/* Strip the second byte of information from a 16-bit depth file. */ -PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_QUANTIZE_SUPPORTED -/* Turn on quantizing, and reduce the palette to the number of colors - * available. - */ -PNG_EXPORT(49, void, png_set_quantize, (png_structrp png_ptr, - png_colorp palette, int num_palette, int maximum_colors, - png_const_uint_16p histogram, int full_quantize)); -#endif - -#ifdef PNG_READ_GAMMA_SUPPORTED -/* The threshold on gamma processing is configurable but hard-wired into the - * library. The following is the floating point variant. - */ -#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001) - -/* Handle gamma correction. Screen_gamma=(display_exponent). - * NOTE: this API simply sets the screen and file gamma values. It will - * therefore override the value for gamma in a PNG file if it is called after - * the file header has been read - use with care - call before reading the PNG - * file for best results! - * - * These routines accept the same gamma values as png_set_alpha_mode (described - * above). The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either - * API (floating point or fixed.) Notice, however, that the 'file_gamma' value - * is the inverse of a 'screen gamma' value. - */ -PNG_FP_EXPORT(50, void, png_set_gamma, (png_structrp png_ptr, - double screen_gamma, double override_file_gamma)) -PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structrp png_ptr, - png_fixed_point screen_gamma, png_fixed_point override_file_gamma)) -#endif - -#ifdef PNG_WRITE_FLUSH_SUPPORTED -/* Set how many lines between output flushes - 0 for no flushing */ -PNG_EXPORT(51, void, png_set_flush, (png_structrp png_ptr, int nrows)); -/* Flush the current PNG output buffer */ -PNG_EXPORT(52, void, png_write_flush, (png_structrp png_ptr)); -#endif - -/* Optional update palette with requested transformations */ -PNG_EXPORT(53, void, png_start_read_image, (png_structrp png_ptr)); - -/* Optional call to update the users info structure */ -PNG_EXPORT(54, void, png_read_update_info, (png_structrp png_ptr, - png_inforp info_ptr)); - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read one or more rows of image data. */ -PNG_EXPORT(55, void, png_read_rows, (png_structrp png_ptr, png_bytepp row, - png_bytepp display_row, png_uint_32 num_rows)); -#endif - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read a row of data. */ -PNG_EXPORT(56, void, png_read_row, (png_structrp png_ptr, png_bytep row, - png_bytep display_row)); -#endif - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read the whole image into memory at once. */ -PNG_EXPORT(57, void, png_read_image, (png_structrp png_ptr, png_bytepp image)); -#endif - -/* Write a row of image data */ -PNG_EXPORT(58, void, png_write_row, (png_structrp png_ptr, - png_const_bytep row)); - -/* Write a few rows of image data: (*row) is not written; however, the type - * is declared as writeable to maintain compatibility with previous versions - * of libpng and to allow the 'display_row' array from read_rows to be passed - * unchanged to write_rows. - */ -PNG_EXPORT(59, void, png_write_rows, (png_structrp png_ptr, png_bytepp row, - png_uint_32 num_rows)); - -/* Write the image data */ -PNG_EXPORT(60, void, png_write_image, (png_structrp png_ptr, png_bytepp image)); - -/* Write the end of the PNG file. */ -PNG_EXPORT(61, void, png_write_end, (png_structrp png_ptr, - png_inforp info_ptr)); - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read the end of the PNG file. */ -PNG_EXPORT(62, void, png_read_end, (png_structrp png_ptr, png_inforp info_ptr)); -#endif - -/* Free any memory associated with the png_info_struct */ -PNG_EXPORT(63, void, png_destroy_info_struct, (png_const_structrp png_ptr, - png_infopp info_ptr_ptr)); - -/* Free any memory associated with the png_struct and the png_info_structs */ -PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr, - png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); - -/* Free any memory associated with the png_struct and the png_info_structs */ -PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr, - png_infopp info_ptr_ptr)); - -/* Set the libpng method of handling chunk CRC errors */ -PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action, - int ancil_action)); - -/* Values for png_set_crc_action() say how to handle CRC errors in - * ancillary and critical chunks, and whether to use the data contained - * therein. Note that it is impossible to "discard" data in a critical - * chunk. For versions prior to 0.90, the action was always error/quit, - * whereas in version 0.90 and later, the action for CRC errors in ancillary - * chunks is warn/discard. These values should NOT be changed. - * - * value action:critical action:ancillary - */ -#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ -#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ -#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ -#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ -#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ -#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ - -/* These functions give the user control over the scan-line filtering in - * libpng and the compression methods used by zlib. These functions are - * mainly useful for testing, as the defaults should work with most users. - * Those users who are tight on memory or want faster performance at the - * expense of compression can modify them. See the compression library - * header file (zlib.h) for an explination of the compression functions. - */ - -/* Set the filtering method(s) used by libpng. Currently, the only valid - * value for "method" is 0. - */ -PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method, - int filters)); - -/* Flags for png_set_filter() to say which filters to use. The flags - * are chosen so that they don't conflict with real filter types - * below, in case they are supplied instead of the #defined constants. - * These values should NOT be changed. - */ -#define PNG_NO_FILTERS 0x00 -#define PNG_FILTER_NONE 0x08 -#define PNG_FILTER_SUB 0x10 -#define PNG_FILTER_UP 0x20 -#define PNG_FILTER_AVG 0x40 -#define PNG_FILTER_PAETH 0x80 -#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ - PNG_FILTER_AVG | PNG_FILTER_PAETH) - -/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. - * These defines should NOT be changed. - */ -#define PNG_FILTER_VALUE_NONE 0 -#define PNG_FILTER_VALUE_SUB 1 -#define PNG_FILTER_VALUE_UP 2 -#define PNG_FILTER_VALUE_AVG 3 -#define PNG_FILTER_VALUE_PAETH 4 -#define PNG_FILTER_VALUE_LAST 5 - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* EXPERIMENTAL */ -/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ - * defines, either the default (minimum-sum-of-absolute-differences), or - * the experimental method (weighted-minimum-sum-of-absolute-differences). - * - * Weights are factors >= 1.0, indicating how important it is to keep the - * filter type consistent between rows. Larger numbers mean the current - * filter is that many times as likely to be the same as the "num_weights" - * previous filters. This is cumulative for each previous row with a weight. - * There needs to be "num_weights" values in "filter_weights", or it can be - * NULL if the weights aren't being specified. Weights have no influence on - * the selection of the first row filter. Well chosen weights can (in theory) - * improve the compression for a given image. - * - * Costs are factors >= 1.0 indicating the relative decoding costs of a - * filter type. Higher costs indicate more decoding expense, and are - * therefore less likely to be selected over a filter with lower computational - * costs. There needs to be a value in "filter_costs" for each valid filter - * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't - * setting the costs. Costs try to improve the speed of decompression without - * unduly increasing the compressed image size. - * - * A negative weight or cost indicates the default value is to be used, and - * values in the range [0.0, 1.0) indicate the value is to remain unchanged. - * The default values for both weights and costs are currently 1.0, but may - * change if good general weighting/cost heuristics can be found. If both - * the weights and costs are set to 1.0, this degenerates the WEIGHTED method - * to the UNWEIGHTED method, but with added encoding time/computation. - */ -PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr, - int heuristic_method, int num_weights, png_const_doublep filter_weights, - png_const_doublep filter_costs)) -PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, - (png_structrp png_ptr, int heuristic_method, int num_weights, - png_const_fixed_point_p filter_weights, - png_const_fixed_point_p filter_costs)) -#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ - -/* Heuristic used for row filter selection. These defines should NOT be - * changed. - */ -#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ -#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ -#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ -#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ - -#ifdef PNG_WRITE_SUPPORTED -/* Set the library compression level. Currently, valid values range from - * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 - * (0 - no compression, 9 - "maximal" compression). Note that tests have - * shown that zlib compression levels 3-6 usually perform as well as level 9 - * for PNG images, and do considerably fewer caclulations. In the future, - * these values may not correspond directly to the zlib compression levels. - */ -PNG_EXPORT(69, void, png_set_compression_level, (png_structrp png_ptr, - int level)); - -PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structrp png_ptr, - int mem_level)); - -PNG_EXPORT(71, void, png_set_compression_strategy, (png_structrp png_ptr, - int strategy)); - -/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a - * smaller value of window_bits if it can do so safely. - */ -PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structrp png_ptr, - int window_bits)); - -PNG_EXPORT(73, void, png_set_compression_method, (png_structrp png_ptr, - int method)); -#endif - -#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED -/* Also set zlib parameters for compressing non-IDAT chunks */ -PNG_EXPORT(222, void, png_set_text_compression_level, (png_structrp png_ptr, - int level)); - -PNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structrp png_ptr, - int mem_level)); - -PNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structrp png_ptr, - int strategy)); - -/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a - * smaller value of window_bits if it can do so safely. - */ -PNG_EXPORT(225, void, png_set_text_compression_window_bits, - (png_structrp png_ptr, int window_bits)); - -PNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr, - int method)); -#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */ - -/* These next functions are called for input/output, memory, and error - * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, - * and call standard C I/O routines such as fread(), fwrite(), and - * fprintf(). These functions can be made to use other I/O routines - * at run time for those applications that need to handle I/O in a - * different manner by calling png_set_???_fn(). See libpng-manual.txt for - * more information. - */ - -#ifdef PNG_STDIO_SUPPORTED -/* Initialize the input/output for the PNG file to the default functions. */ -PNG_EXPORT(74, void, png_init_io, (png_structrp png_ptr, png_FILE_p fp)); -#endif - -/* Replace the (error and abort), and warning functions with user - * supplied functions. If no messages are to be printed you must still - * write and use replacement functions. The replacement error_fn should - * still do a longjmp to the last setjmp location if you are using this - * method of error handling. If error_fn or warning_fn is NULL, the - * default function will be used. - */ - -PNG_EXPORT(75, void, png_set_error_fn, (png_structrp png_ptr, - png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); - -/* Return the user pointer associated with the error functions */ -PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structrp png_ptr)); - -/* Replace the default data output functions with a user supplied one(s). - * If buffered output is not used, then output_flush_fn can be set to NULL. - * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time - * output_flush_fn will be ignored (and thus can be NULL). - * It is probably a mistake to use NULL for output_flush_fn if - * write_data_fn is not also NULL unless you have built libpng with - * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's - * default flush function, which uses the standard *FILE structure, will - * be used. - */ -PNG_EXPORT(77, void, png_set_write_fn, (png_structrp png_ptr, png_voidp io_ptr, - png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); - -/* Replace the default data input function with a user supplied one. */ -PNG_EXPORT(78, void, png_set_read_fn, (png_structrp png_ptr, png_voidp io_ptr, - png_rw_ptr read_data_fn)); - -/* Return the user pointer associated with the I/O functions */ -PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_const_structrp png_ptr)); - -PNG_EXPORT(80, void, png_set_read_status_fn, (png_structrp png_ptr, - png_read_status_ptr read_row_fn)); - -PNG_EXPORT(81, void, png_set_write_status_fn, (png_structrp png_ptr, - png_write_status_ptr write_row_fn)); - -#ifdef PNG_USER_MEM_SUPPORTED -/* Replace the default memory allocation functions with user supplied one(s). */ -PNG_EXPORT(82, void, png_set_mem_fn, (png_structrp png_ptr, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn)); -/* Return the user pointer associated with the memory functions */ -PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structrp png_ptr)); -#endif - -#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED -PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structrp png_ptr, - png_user_transform_ptr read_user_transform_fn)); -#endif - -#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED -PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structrp png_ptr, - png_user_transform_ptr write_user_transform_fn)); -#endif - -#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED -PNG_EXPORT(86, void, png_set_user_transform_info, (png_structrp png_ptr, - png_voidp user_transform_ptr, int user_transform_depth, - int user_transform_channels)); -/* Return the user pointer associated with the user transform functions */ -PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr, - (png_const_structrp png_ptr)); -#endif - -#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED -/* Return information about the row currently being processed. Note that these - * APIs do not fail but will return unexpected results if called outside a user - * transform callback. Also note that when transforming an interlaced image the - * row number is the row number within the sub-image of the interlace pass, so - * the value will increase to the height of the sub-image (not the full image) - * then reset to 0 for the next pass. - * - * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to - * find the output pixel (x,y) given an interlaced sub-image pixel - * (row,col,pass). (See below for these macros.) - */ -PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structrp)); -PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structrp)); -#endif - -#ifdef PNG_READ_USER_CHUNKS_SUPPORTED -/* This callback is called only for *unknown* chunks. If - * PNG_HANDLE_AS_UNKNOWN_SUPPORTED is set then it is possible to set known - * chunks to be treated as unknown, however in this case the callback must do - * any processing required by the chunk (e.g. by calling the appropriate - * png_set_ APIs.) - * - * There is no write support - on write, by default, all the chunks in the - * 'unknown' list are written in the specified position. - * - * The integer return from the callback function is interpreted thus: - * - * negative: An error occured, png_chunk_error will be called. - * zero: The chunk was not handled, the chunk will be saved. A critical - * chunk will cause an error at this point unless it is to be saved. - * positive: The chunk was handled, libpng will ignore/discard it. - * - * See "INTERACTION WTIH USER CHUNK CALLBACKS" below for important notes about - * how this behavior will change in libpng 1.7 - */ -PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structrp png_ptr, - png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); -#endif - -#ifdef PNG_USER_CHUNKS_SUPPORTED -PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structrp png_ptr)); -#endif - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -/* Sets the function callbacks for the push reader, and a pointer to a - * user-defined structure available to the callback functions. - */ -PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structrp png_ptr, - png_voidp progressive_ptr, png_progressive_info_ptr info_fn, - png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); - -/* Returns the user pointer associated with the push read functions */ -PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, - (png_const_structrp png_ptr)); - -/* Function to be called when data becomes available */ -PNG_EXPORT(92, void, png_process_data, (png_structrp png_ptr, - png_inforp info_ptr, png_bytep buffer, png_size_t buffer_size)); - -/* A function which may be called *only* within png_process_data to stop the - * processing of any more data. The function returns the number of bytes - * remaining, excluding any that libpng has cached internally. A subsequent - * call to png_process_data must supply these bytes again. If the argument - * 'save' is set to true the routine will first save all the pending data and - * will always return 0. - */ -PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structrp, int save)); - -/* A function which may be called *only* outside (after) a call to - * png_process_data. It returns the number of bytes of data to skip in the - * input. Normally it will return 0, but if it returns a non-zero value the - * application must skip than number of bytes of input data and pass the - * following data to the next call to png_process_data. - */ -PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structrp)); - -#ifdef PNG_READ_INTERLACING_SUPPORTED -/* Function that combines rows. 'new_row' is a flag that should come from - * the callback and be non-NULL if anything needs to be done; the library - * stores its own version of the new data internally and ignores the passed - * in value. - */ -PNG_EXPORT(93, void, png_progressive_combine_row, (png_const_structrp png_ptr, - png_bytep old_row, png_const_bytep new_row)); -#endif /* PNG_READ_INTERLACING_SUPPORTED */ -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - -PNG_EXPORTA(94, png_voidp, png_malloc, (png_const_structrp png_ptr, - png_alloc_size_t size), PNG_ALLOCATED); -/* Added at libpng version 1.4.0 */ -PNG_EXPORTA(95, png_voidp, png_calloc, (png_const_structrp png_ptr, - png_alloc_size_t size), PNG_ALLOCATED); - -/* Added at libpng version 1.2.4 */ -PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_const_structrp png_ptr, - png_alloc_size_t size), PNG_ALLOCATED); - -/* Frees a pointer allocated by png_malloc() */ -PNG_EXPORT(97, void, png_free, (png_const_structrp png_ptr, png_voidp ptr)); - -/* Free data that was allocated internally */ -PNG_EXPORT(98, void, png_free_data, (png_const_structrp png_ptr, - png_inforp info_ptr, png_uint_32 free_me, int num)); - -/* Reassign responsibility for freeing existing data, whether allocated - * by libpng or by the application; this works on the png_info structure passed - * in, it does not change the state for other png_info structures. - * - * It is unlikely that this function works correctly as of 1.6.0 and using it - * may result either in memory leaks or double free of allocated data. - */ -PNG_EXPORTA(99, void, png_data_freer, (png_const_structrp png_ptr, - png_inforp info_ptr, int freer, png_uint_32 mask), PNG_DEPRECATED); - -/* Assignments for png_data_freer */ -#define PNG_DESTROY_WILL_FREE_DATA 1 -#define PNG_SET_WILL_FREE_DATA 1 -#define PNG_USER_WILL_FREE_DATA 2 -/* Flags for png_ptr->free_me and info_ptr->free_me */ -#define PNG_FREE_HIST 0x0008 -#define PNG_FREE_ICCP 0x0010 -#define PNG_FREE_SPLT 0x0020 -#define PNG_FREE_ROWS 0x0040 -#define PNG_FREE_PCAL 0x0080 -#define PNG_FREE_SCAL 0x0100 -#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED -# define PNG_FREE_UNKN 0x0200 -#endif -/* PNG_FREE_LIST 0x0400 removed in 1.6.0 because it is ignored */ -#define PNG_FREE_PLTE 0x1000 -#define PNG_FREE_TRNS 0x2000 -#define PNG_FREE_TEXT 0x4000 -#define PNG_FREE_ALL 0x7fff -#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ - -#ifdef PNG_USER_MEM_SUPPORTED -PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr, - png_alloc_size_t size), PNG_ALLOCATED PNG_DEPRECATED); -PNG_EXPORTA(101, void, png_free_default, (png_const_structrp png_ptr, - png_voidp ptr), PNG_DEPRECATED); -#endif - -#ifdef PNG_ERROR_TEXT_SUPPORTED -/* Fatal error in PNG image of libpng - can't continue */ -PNG_EXPORTA(102, void, png_error, (png_const_structrp png_ptr, - png_const_charp error_message), PNG_NORETURN); - -/* The same, but the chunk name is prepended to the error string. */ -PNG_EXPORTA(103, void, png_chunk_error, (png_const_structrp png_ptr, - png_const_charp error_message), PNG_NORETURN); - -#else -/* Fatal error in PNG image of libpng - can't continue */ -PNG_EXPORTA(104, void, png_err, (png_const_structrp png_ptr), PNG_NORETURN); -#endif - -#ifdef PNG_WARNINGS_SUPPORTED -/* Non-fatal error in libpng. Can continue, but may have a problem. */ -PNG_EXPORT(105, void, png_warning, (png_const_structrp png_ptr, - png_const_charp warning_message)); - -/* Non-fatal error in libpng, chunk name is prepended to message. */ -PNG_EXPORT(106, void, png_chunk_warning, (png_const_structrp png_ptr, - png_const_charp warning_message)); -#endif - -#ifdef PNG_BENIGN_ERRORS_SUPPORTED -/* Benign error in libpng. Can continue, but may have a problem. - * User can choose whether to handle as a fatal error or as a warning. */ -PNG_EXPORT(107, void, png_benign_error, (png_const_structrp png_ptr, - png_const_charp warning_message)); - -#ifdef PNG_READ_SUPPORTED -/* Same, chunk name is prepended to message (only during read) */ -PNG_EXPORT(108, void, png_chunk_benign_error, (png_const_structrp png_ptr, - png_const_charp warning_message)); -#endif - -PNG_EXPORT(109, void, png_set_benign_errors, - (png_structrp png_ptr, int allowed)); -#else -# ifdef PNG_ALLOW_BENIGN_ERRORS -# define png_benign_error png_warning -# define png_chunk_benign_error png_chunk_warning -# else -# define png_benign_error png_error -# define png_chunk_benign_error png_chunk_error -# endif -#endif - -/* The png_set_ functions are for storing values in the png_info_struct. - * Similarly, the png_get_ calls are used to read values from the - * png_info_struct, either storing the parameters in the passed variables, or - * setting pointers into the png_info_struct where the data is stored. The - * png_get_ functions return a non-zero value if the data was available - * in info_ptr, or return zero and do not change any of the parameters if the - * data was not available. - * - * These functions should be used instead of directly accessing png_info - * to avoid problems with future changes in the size and internal layout of - * png_info_struct. - */ -/* Returns "flag" if chunk data is valid in info_ptr. */ -PNG_EXPORT(110, png_uint_32, png_get_valid, (png_const_structrp png_ptr, - png_const_inforp info_ptr, png_uint_32 flag)); - -/* Returns number of bytes needed to hold a transformed row. */ -PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -#ifdef PNG_INFO_IMAGE_SUPPORTED -/* Returns row_pointers, which is an array of pointers to scanlines that was - * returned from png_read_png(). - */ -PNG_EXPORT(112, png_bytepp, png_get_rows, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Set row_pointers, which is an array of pointers to scanlines for use - * by png_write_png(). - */ -PNG_EXPORT(113, void, png_set_rows, (png_const_structrp png_ptr, - png_inforp info_ptr, png_bytepp row_pointers)); -#endif - -/* Returns number of color channels in image. */ -PNG_EXPORT(114, png_byte, png_get_channels, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -#ifdef PNG_EASY_ACCESS_SUPPORTED -/* Returns image width in pixels. */ -PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image height in pixels. */ -PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image bit_depth. */ -PNG_EXPORT(117, png_byte, png_get_bit_depth, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image color_type. */ -PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image filter_type. */ -PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image interlace_type. */ -PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image compression_type. */ -PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image resolution in pixels per meter, from pHYs chunk data. */ -PNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); - -/* Returns pixel aspect ratio, computed from pHYs chunk data. */ -PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio, - (png_const_structrp png_ptr, png_const_inforp info_ptr)) -PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr)) - -/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ -PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(127, png_int_32, png_get_y_offset_pixels, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(128, png_int_32, png_get_x_offset_microns, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(129, png_int_32, png_get_y_offset_microns, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); - -#endif /* PNG_EASY_ACCESS_SUPPORTED */ - -#ifdef PNG_READ_SUPPORTED -/* Returns pointer to signature string read from PNG header */ -PNG_EXPORT(130, png_const_bytep, png_get_signature, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); -#endif - -#ifdef PNG_bKGD_SUPPORTED -PNG_EXPORT(131, png_uint_32, png_get_bKGD, (png_const_structrp png_ptr, - png_inforp info_ptr, png_color_16p *background)); -#endif - -#ifdef PNG_bKGD_SUPPORTED -PNG_EXPORT(132, void, png_set_bKGD, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_color_16p background)); -#endif - -#ifdef PNG_cHRM_SUPPORTED -PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structrp png_ptr, - png_const_inforp info_ptr, double *white_x, double *white_y, double *red_x, - double *red_y, double *green_x, double *green_y, double *blue_x, - double *blue_y)) -PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_const_structrp png_ptr, - png_const_inforp info_ptr, double *red_X, double *red_Y, double *red_Z, - double *green_X, double *green_Y, double *green_Z, double *blue_X, - double *blue_Y, double *blue_Z)) -PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr, - png_fixed_point *int_white_x, png_fixed_point *int_white_y, - png_fixed_point *int_red_x, png_fixed_point *int_red_y, - png_fixed_point *int_green_x, png_fixed_point *int_green_y, - png_fixed_point *int_blue_x, png_fixed_point *int_blue_y)) -PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr, - png_fixed_point *int_red_X, png_fixed_point *int_red_Y, - png_fixed_point *int_red_Z, png_fixed_point *int_green_X, - png_fixed_point *int_green_Y, png_fixed_point *int_green_Z, - png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y, - png_fixed_point *int_blue_Z)) -#endif - -#ifdef PNG_cHRM_SUPPORTED -PNG_FP_EXPORT(135, void, png_set_cHRM, (png_const_structrp png_ptr, - png_inforp info_ptr, - double white_x, double white_y, double red_x, double red_y, double green_x, - double green_y, double blue_x, double blue_y)) -PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_const_structrp png_ptr, - png_inforp info_ptr, double red_X, double red_Y, double red_Z, - double green_X, double green_Y, double green_Z, double blue_X, - double blue_Y, double blue_Z)) -PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_const_structrp png_ptr, - png_inforp info_ptr, png_fixed_point int_white_x, - png_fixed_point int_white_y, png_fixed_point int_red_x, - png_fixed_point int_red_y, png_fixed_point int_green_x, - png_fixed_point int_green_y, png_fixed_point int_blue_x, - png_fixed_point int_blue_y)) -PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_const_structrp png_ptr, - png_inforp info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y, - png_fixed_point int_red_Z, png_fixed_point int_green_X, - png_fixed_point int_green_Y, png_fixed_point int_green_Z, - png_fixed_point int_blue_X, png_fixed_point int_blue_Y, - png_fixed_point int_blue_Z)) -#endif - -#ifdef PNG_gAMA_SUPPORTED -PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, (png_const_structrp png_ptr, - png_const_inforp info_ptr, double *file_gamma)) -PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr, - png_fixed_point *int_file_gamma)) -#endif - -#ifdef PNG_gAMA_SUPPORTED -PNG_FP_EXPORT(139, void, png_set_gAMA, (png_const_structrp png_ptr, - png_inforp info_ptr, double file_gamma)) -PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_const_structrp png_ptr, - png_inforp info_ptr, png_fixed_point int_file_gamma)) -#endif - -#ifdef PNG_hIST_SUPPORTED -PNG_EXPORT(141, png_uint_32, png_get_hIST, (png_const_structrp png_ptr, - png_inforp info_ptr, png_uint_16p *hist)); -#endif - -#ifdef PNG_hIST_SUPPORTED -PNG_EXPORT(142, void, png_set_hIST, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_uint_16p hist)); -#endif - -PNG_EXPORT(143, png_uint_32, png_get_IHDR, (png_const_structrp png_ptr, - png_const_inforp info_ptr, png_uint_32 *width, png_uint_32 *height, - int *bit_depth, int *color_type, int *interlace_method, - int *compression_method, int *filter_method)); - -PNG_EXPORT(144, void, png_set_IHDR, (png_const_structrp png_ptr, - png_inforp info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_method, int compression_method, - int filter_method)); - -#ifdef PNG_oFFs_SUPPORTED -PNG_EXPORT(145, png_uint_32, png_get_oFFs, (png_const_structrp png_ptr, - png_const_inforp info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, - int *unit_type)); -#endif - -#ifdef PNG_oFFs_SUPPORTED -PNG_EXPORT(146, void, png_set_oFFs, (png_const_structrp png_ptr, - png_inforp info_ptr, png_int_32 offset_x, png_int_32 offset_y, - int unit_type)); -#endif - -#ifdef PNG_pCAL_SUPPORTED -PNG_EXPORT(147, png_uint_32, png_get_pCAL, (png_const_structrp png_ptr, - png_inforp info_ptr, png_charp *purpose, png_int_32 *X0, - png_int_32 *X1, int *type, int *nparams, png_charp *units, - png_charpp *params)); -#endif - -#ifdef PNG_pCAL_SUPPORTED -PNG_EXPORT(148, void, png_set_pCAL, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_charp purpose, png_int_32 X0, png_int_32 X1, - int type, int nparams, png_const_charp units, png_charpp params)); -#endif - -#ifdef PNG_pHYs_SUPPORTED -PNG_EXPORT(149, png_uint_32, png_get_pHYs, (png_const_structrp png_ptr, - png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, - int *unit_type)); -#endif - -#ifdef PNG_pHYs_SUPPORTED -PNG_EXPORT(150, void, png_set_pHYs, (png_const_structrp png_ptr, - png_inforp info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); -#endif - -PNG_EXPORT(151, png_uint_32, png_get_PLTE, (png_const_structrp png_ptr, - png_inforp info_ptr, png_colorp *palette, int *num_palette)); - -PNG_EXPORT(152, void, png_set_PLTE, (png_structrp png_ptr, - png_inforp info_ptr, png_const_colorp palette, int num_palette)); - -#ifdef PNG_sBIT_SUPPORTED -PNG_EXPORT(153, png_uint_32, png_get_sBIT, (png_const_structrp png_ptr, - png_inforp info_ptr, png_color_8p *sig_bit)); -#endif - -#ifdef PNG_sBIT_SUPPORTED -PNG_EXPORT(154, void, png_set_sBIT, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_color_8p sig_bit)); -#endif - -#ifdef PNG_sRGB_SUPPORTED -PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structrp png_ptr, - png_const_inforp info_ptr, int *file_srgb_intent)); -#endif - -#ifdef PNG_sRGB_SUPPORTED -PNG_EXPORT(156, void, png_set_sRGB, (png_const_structrp png_ptr, - png_inforp info_ptr, int srgb_intent)); -PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_const_structrp png_ptr, - png_inforp info_ptr, int srgb_intent)); -#endif - -#ifdef PNG_iCCP_SUPPORTED -PNG_EXPORT(158, png_uint_32, png_get_iCCP, (png_const_structrp png_ptr, - png_inforp info_ptr, png_charpp name, int *compression_type, - png_bytepp profile, png_uint_32 *proflen)); -#endif - -#ifdef PNG_iCCP_SUPPORTED -PNG_EXPORT(159, void, png_set_iCCP, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_charp name, int compression_type, - png_const_bytep profile, png_uint_32 proflen)); -#endif - -#ifdef PNG_sPLT_SUPPORTED -PNG_EXPORT(160, int, png_get_sPLT, (png_const_structrp png_ptr, - png_inforp info_ptr, png_sPLT_tpp entries)); -#endif - -#ifdef PNG_sPLT_SUPPORTED -PNG_EXPORT(161, void, png_set_sPLT, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_sPLT_tp entries, int nentries)); -#endif - -#ifdef PNG_TEXT_SUPPORTED -/* png_get_text also returns the number of text chunks in *num_text */ -PNG_EXPORT(162, int, png_get_text, (png_const_structrp png_ptr, - png_inforp info_ptr, png_textp *text_ptr, int *num_text)); -#endif - -/* Note while png_set_text() will accept a structure whose text, - * language, and translated keywords are NULL pointers, the structure - * returned by png_get_text will always contain regular - * zero-terminated C strings. They might be empty strings but - * they will never be NULL pointers. - */ - -#ifdef PNG_TEXT_SUPPORTED -PNG_EXPORT(163, void, png_set_text, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_textp text_ptr, int num_text)); -#endif - -#ifdef PNG_tIME_SUPPORTED -PNG_EXPORT(164, png_uint_32, png_get_tIME, (png_const_structrp png_ptr, - png_inforp info_ptr, png_timep *mod_time)); -#endif - -#ifdef PNG_tIME_SUPPORTED -PNG_EXPORT(165, void, png_set_tIME, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_timep mod_time)); -#endif - -#ifdef PNG_tRNS_SUPPORTED -PNG_EXPORT(166, png_uint_32, png_get_tRNS, (png_const_structrp png_ptr, - png_inforp info_ptr, png_bytep *trans_alpha, int *num_trans, - png_color_16p *trans_color)); -#endif - -#ifdef PNG_tRNS_SUPPORTED -PNG_EXPORT(167, void, png_set_tRNS, (png_structrp png_ptr, - png_inforp info_ptr, png_const_bytep trans_alpha, int num_trans, - png_const_color_16p trans_color)); -#endif - -#ifdef PNG_sCAL_SUPPORTED -PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, (png_const_structrp png_ptr, - png_const_inforp info_ptr, int *unit, double *width, double *height)) -#if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \ - defined(PNG_FLOATING_POINT_SUPPORTED) -/* NOTE: this API is currently implemented using floating point arithmetic, - * consequently it can only be used on systems with floating point support. - * In any case the range of values supported by png_fixed_point is small and it - * is highly recommended that png_get_sCAL_s be used instead. - */ -PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, - png_fixed_point *width, png_fixed_point *height)) -#endif -PNG_EXPORT(169, png_uint_32, png_get_sCAL_s, - (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, - png_charpp swidth, png_charpp sheight)); - -PNG_FP_EXPORT(170, void, png_set_sCAL, (png_const_structrp png_ptr, - png_inforp info_ptr, int unit, double width, double height)) -PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_const_structrp png_ptr, - png_inforp info_ptr, int unit, png_fixed_point width, - png_fixed_point height)) -PNG_EXPORT(171, void, png_set_sCAL_s, (png_const_structrp png_ptr, - png_inforp info_ptr, int unit, - png_const_charp swidth, png_const_charp sheight)); -#endif /* PNG_sCAL_SUPPORTED */ - -#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED -/* Provide the default handling for all unknown chunks or, optionally, for - * specific unknown chunks. - * - * NOTE: prior to 1.6.0 the handling specified for particular chunks on read was - * ignored and the default was used, the per-chunk setting only had an effect on - * write. If you wish to have chunk-specific handling on read in code that must - * work on earlier versions you must use a user chunk callback to specify the - * desired handling (keep or discard.) - * - * The 'keep' parameter is a PNG_HANDLE_CHUNK_ value as listed below. The - * parameter is interpreted as follows: - * - * READ: - * PNG_HANDLE_CHUNK_AS_DEFAULT: - * Known chunks: do normal libpng processing, do not keep the chunk (but - * see the comments below about PNG_HANDLE_AS_UNKNOWN_SUPPORTED) - * Unknown chunks: for a specific chunk use the global default, when used - * as the default discard the chunk data. - * PNG_HANDLE_CHUNK_NEVER: - * Discard the chunk data. - * PNG_HANDLE_CHUNK_IF_SAFE: - * Keep the chunk data if the chunk is not critical else raise a chunk - * error. - * PNG_HANDLE_CHUNK_ALWAYS: - * Keep the chunk data. - * - * If the chunk data is saved it can be retrieved using png_get_unknown_chunks, - * below. Notice that specifying "AS_DEFAULT" as a global default is equivalent - * to specifying "NEVER", however when "AS_DEFAULT" is used for specific chunks - * it simply resets the behavior to the libpng default. - * - * INTERACTION WTIH USER CHUNK CALLBACKS: - * The per-chunk handling is always used when there is a png_user_chunk_ptr - * callback and the callback returns 0; the chunk is then always stored *unless* - * it is critical and the per-chunk setting is other than ALWAYS. Notice that - * the global default is *not* used in this case. (In effect the per-chunk - * value is incremented to at least IF_SAFE.) - * - * IMPORTANT NOTE: this behavior will change in libpng 1.7 - the global and - * per-chunk defaults will be honored. If you want to preserve the current - * behavior when your callback returns 0 you must set PNG_HANDLE_CHUNK_IF_SAFE - * as the default - if you don't do this libpng 1.6 will issue a warning. - * - * If you want unhandled unknown chunks to be discarded in libpng 1.6 and - * earlier simply return '1' (handled). - * - * PNG_HANDLE_AS_UNKNOWN_SUPPORTED: - * If this is *not* set known chunks will always be handled by libpng and - * will never be stored in the unknown chunk list. Known chunks listed to - * png_set_keep_unknown_chunks will have no effect. If it is set then known - * chunks listed with a keep other than AS_DEFAULT will *never* be processed - * by libpng, in addition critical chunks must either be processed by the - * callback or saved. - * - * The IHDR and IEND chunks must not be listed. Because this turns off the - * default handling for chunks that would otherwise be recognized the - * behavior of libpng transformations may well become incorrect! - * - * WRITE: - * When writing chunks the options only apply to the chunks specified by - * png_set_unknown_chunks (below), libpng will *always* write known chunks - * required by png_set_ calls and will always write the core critical chunks - * (as required for PLTE). - * - * Each chunk in the png_set_unknown_chunks list is looked up in the - * png_set_keep_unknown_chunks list to find the keep setting, this is then - * interpreted as follows: - * - * PNG_HANDLE_CHUNK_AS_DEFAULT: - * Write safe-to-copy chunks and write other chunks if the global - * default is set to _ALWAYS, otherwise don't write this chunk. - * PNG_HANDLE_CHUNK_NEVER: - * Do not write the chunk. - * PNG_HANDLE_CHUNK_IF_SAFE: - * Write the chunk if it is safe-to-copy, otherwise do not write it. - * PNG_HANDLE_CHUNK_ALWAYS: - * Write the chunk. - * - * Note that the default behavior is effectively the opposite of the read case - - * in read unknown chunks are not stored by default, in write they are written - * by default. Also the behavior of PNG_HANDLE_CHUNK_IF_SAFE is very different - * - on write the safe-to-copy bit is checked, on read the critical bit is - * checked and on read if the chunk is critical an error will be raised. - * - * num_chunks: - * =========== - * If num_chunks is positive, then the "keep" parameter specifies the manner - * for handling only those chunks appearing in the chunk_list array, - * otherwise the chunk list array is ignored. - * - * If num_chunks is 0 the "keep" parameter specifies the default behavior for - * unknown chunks, as described above. - * - * If num_chunks is negative, then the "keep" parameter specifies the manner - * for handling all unknown chunks plus all chunks recognized by libpng - * except for the IHDR, PLTE, tRNS, IDAT, and IEND chunks (which continue to - * be processed by libpng. - */ -PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr, - int keep, png_const_bytep chunk_list, int num_chunks)); - -/* The "keep" PNG_HANDLE_CHUNK_ parameter for the specified chunk is returned; - * the result is therefore true (non-zero) if special handling is required, - * false for the default handling. - */ -PNG_EXPORT(173, int, png_handle_as_unknown, (png_const_structrp png_ptr, - png_const_bytep chunk_name)); -#endif - -#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED -PNG_EXPORT(174, void, png_set_unknown_chunks, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_unknown_chunkp unknowns, - int num_unknowns)); - /* NOTE: prior to 1.6.0 this routine set the 'location' field of the added - * unknowns to the location currently stored in the png_struct. This is - * invariably the wrong value on write. To fix this call the following API - * for each chunk in the list with the correct location. If you know your - * code won't be compiled on earlier versions you can rely on - * png_set_unknown_chunks(write-ptr, png_get_unknown_chunks(read-ptr)) doing - * the correct thing. - */ - -PNG_EXPORT(175, void, png_set_unknown_chunk_location, - (png_const_structrp png_ptr, png_inforp info_ptr, int chunk, int location)); - -PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structrp png_ptr, - png_inforp info_ptr, png_unknown_chunkpp entries)); -#endif - -/* Png_free_data() will turn off the "valid" flag for anything it frees. - * If you need to turn it off for a chunk that your application has freed, - * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); - */ -PNG_EXPORT(177, void, png_set_invalid, (png_const_structrp png_ptr, - png_inforp info_ptr, int mask)); - -#ifdef PNG_INFO_IMAGE_SUPPORTED -/* The "params" pointer is currently not used and is for future expansion. */ -PNG_EXPORT(178, void, png_read_png, (png_structrp png_ptr, png_inforp info_ptr, - int transforms, png_voidp params)); -PNG_EXPORT(179, void, png_write_png, (png_structrp png_ptr, png_inforp info_ptr, - int transforms, png_voidp params)); -#endif - -PNG_EXPORT(180, png_const_charp, png_get_copyright, - (png_const_structrp png_ptr)); -PNG_EXPORT(181, png_const_charp, png_get_header_ver, - (png_const_structrp png_ptr)); -PNG_EXPORT(182, png_const_charp, png_get_header_version, - (png_const_structrp png_ptr)); -PNG_EXPORT(183, png_const_charp, png_get_libpng_ver, - (png_const_structrp png_ptr)); - -#ifdef PNG_MNG_FEATURES_SUPPORTED -PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structrp png_ptr, - png_uint_32 mng_features_permitted)); -#endif - -/* For use in png_set_keep_unknown, added to version 1.2.6 */ -#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 -#define PNG_HANDLE_CHUNK_NEVER 1 -#define PNG_HANDLE_CHUNK_IF_SAFE 2 -#define PNG_HANDLE_CHUNK_ALWAYS 3 -#define PNG_HANDLE_CHUNK_LAST 4 - -/* Strip the prepended error numbers ("#nnn ") from error and warning - * messages before passing them to the error or warning handler. - */ -#ifdef PNG_ERROR_NUMBERS_SUPPORTED -PNG_EXPORT(185, void, png_set_strip_error_numbers, (png_structrp png_ptr, - png_uint_32 strip_mode)); -#endif - -/* Added in libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED -PNG_EXPORT(186, void, png_set_user_limits, (png_structrp png_ptr, - png_uint_32 user_width_max, png_uint_32 user_height_max)); -PNG_EXPORT(187, png_uint_32, png_get_user_width_max, - (png_const_structrp png_ptr)); -PNG_EXPORT(188, png_uint_32, png_get_user_height_max, - (png_const_structrp png_ptr)); -/* Added in libpng-1.4.0 */ -PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structrp png_ptr, - png_uint_32 user_chunk_cache_max)); -PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max, - (png_const_structrp png_ptr)); -/* Added in libpng-1.4.1 */ -PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structrp png_ptr, - png_alloc_size_t user_chunk_cache_max)); -PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max, - (png_const_structrp png_ptr)); -#endif - -#if defined(PNG_INCH_CONVERSIONS_SUPPORTED) -PNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); - -PNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); - -PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); - -PNG_FP_EXPORT(196, float, png_get_x_offset_inches, - (png_const_structrp png_ptr, png_const_inforp info_ptr)) -#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ -PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr)) -#endif - -PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structrp png_ptr, - png_const_inforp info_ptr)) -#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ -PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr)) -#endif - -# ifdef PNG_pHYs_SUPPORTED -PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structrp png_ptr, - png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, - int *unit_type)); -# endif /* PNG_pHYs_SUPPORTED */ -#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ - -/* Added in libpng-1.4.0 */ -#ifdef PNG_IO_STATE_SUPPORTED -PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_const_structrp png_ptr)); - -/* Removed from libpng 1.6; use png_get_io_chunk_type. */ -PNG_REMOVED(200, png_const_bytep, png_get_io_chunk_name, (png_structrp png_ptr), - PNG_DEPRECATED) - -PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type, - (png_const_structrp png_ptr)); - -/* The flags returned by png_get_io_state() are the following: */ -# define PNG_IO_NONE 0x0000 /* no I/O at this moment */ -# define PNG_IO_READING 0x0001 /* currently reading */ -# define PNG_IO_WRITING 0x0002 /* currently writing */ -# define PNG_IO_SIGNATURE 0x0010 /* currently at the file signature */ -# define PNG_IO_CHUNK_HDR 0x0020 /* currently at the chunk header */ -# define PNG_IO_CHUNK_DATA 0x0040 /* currently at the chunk data */ -# define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */ -# define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */ -# define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */ -#endif /* ?PNG_IO_STATE_SUPPORTED */ - -/* Interlace support. The following macros are always defined so that if - * libpng interlace handling is turned off the macros may be used to handle - * interlaced images within the application. - */ -#define PNG_INTERLACE_ADAM7_PASSES 7 - -/* Two macros to return the first row and first column of the original, - * full, image which appears in a given pass. 'pass' is in the range 0 - * to 6 and the result is in the range 0 to 7. - */ -#define PNG_PASS_START_ROW(pass) (((1&~(pass))<<(3-((pass)>>1)))&7) -#define PNG_PASS_START_COL(pass) (((1& (pass))<<(3-(((pass)+1)>>1)))&7) - -/* A macro to return the offset between pixels in the output row for a pair of - * pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that - * follows. Note that ROW_OFFSET is the offset from one row to the next whereas - * COL_OFFSET is from one column to the next, within a row. - */ -#define PNG_PASS_ROW_OFFSET(pass) ((pass)>2?(8>>(((pass)-1)>>1)):8) -#define PNG_PASS_COL_OFFSET(pass) (1<<((7-(pass))>>1)) - -/* Two macros to help evaluate the number of rows or columns in each - * pass. This is expressed as a shift - effectively log2 of the number or - * rows or columns in each 8x8 tile of the original image. - */ -#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3) -#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3) - -/* Hence two macros to determine the number of rows or columns in a given - * pass of an image given its height or width. In fact these macros may - * return non-zero even though the sub-image is empty, because the other - * dimension may be empty for a small image. - */ -#define PNG_PASS_ROWS(height, pass) (((height)+(((1<>PNG_PASS_ROW_SHIFT(pass)) -#define PNG_PASS_COLS(width, pass) (((width)+(((1<>PNG_PASS_COL_SHIFT(pass)) - -/* For the reader row callbacks (both progressive and sequential) it is - * necessary to find the row in the output image given a row in an interlaced - * image, so two more macros: - */ -#define PNG_ROW_FROM_PASS_ROW(y_in, pass) \ - (((y_in)<>(((7-(off))-(pass))<<2)) & 0xF) | \ - ((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0)) - -#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \ - ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1) -#define PNG_COL_IN_INTERLACE_PASS(x, pass) \ - ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1) - -#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED -/* With these routines we avoid an integer divide, which will be slower on - * most machines. However, it does take more operations than the corresponding - * divide method, so it may be slower on a few RISC systems. There are two - * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. - * - * Note that the rounding factors are NOT supposed to be the same! 128 and - * 32768 are correct for the NODIV code; 127 and 32767 are correct for the - * standard method. - * - * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] - */ - - /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ - -# define png_composite(composite, fg, alpha, bg) \ - { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \ - * (png_uint_16)(alpha) \ - + (png_uint_16)(bg)*(png_uint_16)(255 \ - - (png_uint_16)(alpha)) + 128); \ - (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } - -# define png_composite_16(composite, fg, alpha, bg) \ - { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \ - * (png_uint_32)(alpha) \ - + (png_uint_32)(bg)*(65535 \ - - (png_uint_32)(alpha)) + 32768); \ - (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } - -#else /* Standard method using integer division */ - -# define png_composite(composite, fg, alpha, bg) \ - (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ - (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ - 127) / 255) - -# define png_composite_16(composite, fg, alpha, bg) \ - (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ - (png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \ - 32767) / 65535) -#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ - -#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED -PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf)); -PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf)); -PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf)); -#endif - -PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_const_structrp png_ptr, - png_const_bytep buf)); -/* No png_get_int_16 -- may be added if there's a real need for it. */ - -/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ -#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED -PNG_EXPORT(205, void, png_save_uint_32, (png_bytep buf, png_uint_32 i)); -#endif -#ifdef PNG_SAVE_INT_32_SUPPORTED -PNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i)); -#endif - -/* Place a 16-bit number into a buffer in PNG byte order. - * The parameter is declared unsigned int, not png_uint_16, - * just to avoid potential problems on pre-ANSI C compilers. - */ -#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED -PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); -/* No png_save_int_16 -- may be added if there's a real need for it. */ -#endif - -#ifdef PNG_USE_READ_MACROS -/* Inline macros to do direct reads of bytes from the input buffer. - * The png_get_int_32() routine assumes we are using two's complement - * format for negative values, which is almost certainly true. - */ -# define PNG_get_uint_32(buf) \ - (((png_uint_32)(*(buf)) << 24) + \ - ((png_uint_32)(*((buf) + 1)) << 16) + \ - ((png_uint_32)(*((buf) + 2)) << 8) + \ - ((png_uint_32)(*((buf) + 3)))) - - /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the - * function) incorrectly returned a value of type png_uint_32. - */ -# define PNG_get_uint_16(buf) \ - ((png_uint_16) \ - (((unsigned int)(*(buf)) << 8) + \ - ((unsigned int)(*((buf) + 1))))) - -# define PNG_get_int_32(buf) \ - ((png_int_32)((*(buf) & 0x80) \ - ? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \ - : (png_int_32)png_get_uint_32(buf))) - - /* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h, - * but defining a macro name prefixed with PNG_PREFIX. - */ -# ifndef PNG_PREFIX -# define png_get_uint_32(buf) PNG_get_uint_32(buf) -# define png_get_uint_16(buf) PNG_get_uint_16(buf) -# define png_get_int_32(buf) PNG_get_int_32(buf) -# endif -#else -# ifdef PNG_PREFIX - /* No macros; revert to the (redefined) function */ -# define PNG_get_uint_32 (png_get_uint_32) -# define PNG_get_uint_16 (png_get_uint_16) -# define PNG_get_int_32 (png_get_int_32) -# endif -#endif - -/******************************************************************************* - * SIMPLIFIED API - ******************************************************************************* - * - * Please read the documentation in libpng-manual.txt (TODO: write said - * documentation) if you don't understand what follows. - * - * The simplified API hides the details of both libpng and the PNG file format - * itself. It allows PNG files to be read into a very limited number of - * in-memory bitmap formats or to be written from the same formats. If these - * formats do not accomodate your needs then you can, and should, use the more - * sophisticated APIs above - these support a wide variety of in-memory formats - * and a wide variety of sophisticated transformations to those formats as well - * as a wide variety of APIs to manipulate ancillary information. - * - * To read a PNG file using the simplified API: - * - * 1) Declare a 'png_image' structure (see below) on the stack and set the - * version field to PNG_IMAGE_VERSION. - * 2) Call the appropriate png_image_begin_read... function. - * 3) Set the png_image 'format' member to the required sample format. - * 4) Allocate a buffer for the image and, if required, the color-map. - * 5) Call png_image_finish_read to read the image and, if required, the - * color-map into your buffers. - * - * There are no restrictions on the format of the PNG input itself; all valid - * color types, bit depths, and interlace methods are acceptable, and the - * input image is transformed as necessary to the requested in-memory format - * during the png_image_finish_read() step. The only caveat is that if you - * request a color-mapped image from a PNG that is full-color or makes - * complex use of an alpha channel the transformation is extremely lossy and the - * result may look terrible. - * - * To write a PNG file using the simplified API: - * - * 1) Declare a 'png_image' structure on the stack and memset() it to all zero. - * 2) Initialize the members of the structure that describe the image, setting - * the 'format' member to the format of the image samples. - * 3) Call the appropriate png_image_write... function with a pointer to the - * image and, if necessary, the color-map to write the PNG data. - * - * png_image is a structure that describes the in-memory format of an image - * when it is being read or defines the in-memory format of an image that you - * need to write: - */ -#define PNG_IMAGE_VERSION 1 - -typedef struct png_control *png_controlp; -typedef struct -{ - png_controlp opaque; /* Initialize to NULL, free with png_image_free */ - png_uint_32 version; /* Set to PNG_IMAGE_VERSION */ - png_uint_32 width; /* Image width in pixels (columns) */ - png_uint_32 height; /* Image height in pixels (rows) */ - png_uint_32 format; /* Image format as defined below */ - png_uint_32 flags; /* A bit mask containing informational flags */ - png_uint_32 colormap_entries; - /* Number of entries in the color-map */ - - /* In the event of an error or warning the following field will be set to a - * non-zero value and the 'message' field will contain a '\0' terminated - * string with the libpng error or warning message. If both warnings and - * an error were encountered, only the error is recorded. If there - * are multiple warnings, only the first one is recorded. - * - * The upper 30 bits of this value are reserved, the low two bits contain - * a value as follows: - */ -# define PNG_IMAGE_WARNING 1 -# define PNG_IMAGE_ERROR 2 - /* - * The result is a two bit code such that a value more than 1 indicates - * a failure in the API just called: - * - * 0 - no warning or error - * 1 - warning - * 2 - error - * 3 - error preceded by warning - */ -# define PNG_IMAGE_FAILED(png_cntrl) ((((png_cntrl).warning_or_error)&0x03)>1) - - png_uint_32 warning_or_error; - - char message[64]; -} png_image, *png_imagep; - -/* The samples of the image have one to four channels whose components have - * original values in the range 0 to 1.0: - * - * 1: A single gray or luminance channel (G). - * 2: A gray/luminance channel and an alpha channel (GA). - * 3: Three red, green, blue color channels (RGB). - * 4: Three color channels and an alpha channel (RGBA). - * - * The components are encoded in one of two ways: - * - * a) As a small integer, value 0..255, contained in a single byte. For the - * alpha channel the original value is simply value/255. For the color or - * luminance channels the value is encoded according to the sRGB specification - * and matches the 8-bit format expected by typical display devices. - * - * The color/gray channels are not scaled (pre-multiplied) by the alpha - * channel and are suitable for passing to color management software. - * - * b) As a value in the range 0..65535, contained in a 2-byte integer. All - * channels can be converted to the original value by dividing by 65535; all - * channels are linear. Color channels use the RGB encoding (RGB end-points) of - * the sRGB specification. This encoding is identified by the - * PNG_FORMAT_FLAG_LINEAR flag below. - * - * When the simplified API needs to convert between sRGB and linear colorspaces, - * the actual sRGB transfer curve defined in the sRGB specification (see the - * article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2 - * approximation used elsewhere in libpng. - * - * When an alpha channel is present it is expected to denote pixel coverage - * of the color or luminance channels and is returned as an associated alpha - * channel: the color/gray channels are scaled (pre-multiplied) by the alpha - * value. - * - * The samples are either contained directly in the image data, between 1 and 8 - * bytes per pixel according to the encoding, or are held in a color-map indexed - * by bytes in the image data. In the case of a color-map the color-map entries - * are individual samples, encoded as above, and the image data has one byte per - * pixel to select the relevant sample from the color-map. - */ - -/* PNG_FORMAT_* - * - * #defines to be used in png_image::format. Each #define identifies a - * particular layout of sample data and, if present, alpha values. There are - * separate defines for each of the two component encodings. - * - * A format is built up using single bit flag values. All combinations are - * valid. Formats can be built up from the flag values or you can use one of - * the predefined values below. When testing formats always use the FORMAT_FLAG - * macros to test for individual features - future versions of the library may - * add new flags. - * - * When reading or writing color-mapped images the format should be set to the - * format of the entries in the color-map then png_image_{read,write}_colormap - * called to read or write the color-map and set the format correctly for the - * image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly! - * - * NOTE: libpng can be built with particular features disabled, if you see - * compiler errors because the definition of one of the following flags has been - * compiled out it is because libpng does not have the required support. It is - * possible, however, for the libpng configuration to enable the format on just - * read or just write; in that case you may see an error at run time. You can - * guard against this by checking for the definition of the appropriate - * "_SUPPORTED" macro, one of: - * - * PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED - */ -#define PNG_FORMAT_FLAG_ALPHA 0x01U /* format with an alpha channel */ -#define PNG_FORMAT_FLAG_COLOR 0x02U /* color format: otherwise grayscale */ -#define PNG_FORMAT_FLAG_LINEAR 0x04U /* 2 byte channels else 1 byte */ -#define PNG_FORMAT_FLAG_COLORMAP 0x08U /* image data is color-mapped */ - -#ifdef PNG_FORMAT_BGR_SUPPORTED -# define PNG_FORMAT_FLAG_BGR 0x10U /* BGR colors, else order is RGB */ -#endif - -#ifdef PNG_FORMAT_AFIRST_SUPPORTED -# define PNG_FORMAT_FLAG_AFIRST 0x20U /* alpha channel comes first */ -#endif - -/* Commonly used formats have predefined macros. - * - * First the single byte (sRGB) formats: - */ -#define PNG_FORMAT_GRAY 0 -#define PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA -#define PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST) -#define PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR -#define PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR) -#define PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA) -#define PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST) -#define PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA) -#define PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST) - -/* Then the linear 2-byte formats. When naming these "Y" is used to - * indicate a luminance (gray) channel. - */ -#define PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR -#define PNG_FORMAT_LINEAR_Y_ALPHA (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA) -#define PNG_FORMAT_LINEAR_RGB (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR) -#define PNG_FORMAT_LINEAR_RGB_ALPHA \ - (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA) - -/* With color-mapped formats the image data is one byte for each pixel, the byte - * is an index into the color-map which is formatted as above. To obtain a - * color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP - * to one of the above definitions, or you can use one of the definitions below. - */ -#define PNG_FORMAT_RGB_COLORMAP (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_COLORMAP) -#define PNG_FORMAT_BGR_COLORMAP (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_COLORMAP) -#define PNG_FORMAT_RGBA_COLORMAP (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_COLORMAP) -#define PNG_FORMAT_ARGB_COLORMAP (PNG_FORMAT_ARGB|PNG_FORMAT_FLAG_COLORMAP) -#define PNG_FORMAT_BGRA_COLORMAP (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_COLORMAP) -#define PNG_FORMAT_ABGR_COLORMAP (PNG_FORMAT_ABGR|PNG_FORMAT_FLAG_COLORMAP) - -/* PNG_IMAGE macros - * - * These are convenience macros to derive information from a png_image - * structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the - * actual image sample values - either the entries in the color-map or the - * pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values - * for the pixels and will always return 1 for color-mapped formats. The - * remaining macros return information about the rows in the image and the - * complete image. - * - * NOTE: All the macros that take a png_image::format parameter are compile time - * constants if the format parameter is, itself, a constant. Therefore these - * macros can be used in array declarations and case labels where required. - * Similarly the macros are also pre-processor constants (sizeof is not used) so - * they can be used in #if tests. - * - * First the information about the samples. - */ -#define PNG_IMAGE_SAMPLE_CHANNELS(fmt)\ - (((fmt)&(PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA))+1) - /* Return the total number of channels in a given format: 1..4 */ - -#define PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)\ - ((((fmt) & PNG_FORMAT_FLAG_LINEAR) >> 2)+1) - /* Return the size in bytes of a single component of a pixel or color-map - * entry (as appropriate) in the image: 1 or 2. - */ - -#define PNG_IMAGE_SAMPLE_SIZE(fmt)\ - (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)) - /* This is the size of the sample data for one sample. If the image is - * color-mapped it is the size of one color-map entry (and image pixels are - * one byte in size), otherwise it is the size of one image pixel. - */ - -#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\ - (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256) - /* The maximum size of the color-map required by the format expressed in a - * count of components. This can be used to compile-time allocate a - * color-map: - * - * png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)]; - * - * png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)]; - * - * Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the - * information from one of the png_image_begin_read_ APIs and dynamically - * allocate the required memory. - */ - -/* Corresponding information about the pixels */ -#define PNG_IMAGE_PIXEL_(test,fmt)\ - (((fmt)&PNG_FORMAT_FLAG_COLORMAP)?1:test(fmt)) - -#define PNG_IMAGE_PIXEL_CHANNELS(fmt)\ - PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_CHANNELS,fmt) - /* The number of separate channels (components) in a pixel; 1 for a - * color-mapped image. - */ - -#define PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\ - PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_COMPONENT_SIZE,fmt) - /* The size, in bytes, of each component in a pixel; 1 for a color-mapped - * image. - */ - -#define PNG_IMAGE_PIXEL_SIZE(fmt) PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_SIZE,fmt) - /* The size, in bytes, of a complete pixel; 1 for a color-mapped image. */ - -/* Information about the whole row, or whole image */ -#define PNG_IMAGE_ROW_STRIDE(image)\ - (PNG_IMAGE_PIXEL_CHANNELS((image).format) * (image).width) - /* Return the total number of components in a single row of the image; this - * is the minimum 'row stride', the minimum count of components between each - * row. For a color-mapped image this is the minimum number of bytes in a - * row. - */ - -#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\ - (PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride)) - /* Return the size, in bytes, of an image buffer given a png_image and a row - * stride - the number of components to leave space for in each row. - */ - -#define PNG_IMAGE_SIZE(image)\ - PNG_IMAGE_BUFFER_SIZE(image, PNG_IMAGE_ROW_STRIDE(image)) - /* Return the size, in bytes, of the image in memory given just a png_image; - * the row stride is the minimum stride required for the image. - */ - -#define PNG_IMAGE_COLORMAP_SIZE(image)\ - (PNG_IMAGE_SAMPLE_SIZE((image).format) * (image).colormap_entries) - /* Return the size, in bytes, of the color-map of this image. If the image - * format is not a color-map format this will return a size sufficient for - * 256 entries in the given format; check PNG_FORMAT_FLAG_COLORMAP if - * you don't want to allocate a color-map in this case. - */ - -/* PNG_IMAGE_FLAG_* - * - * Flags containing additional information about the image are held in the - * 'flags' field of png_image. - */ -#define PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB 0x01 - /* This indicates the the RGB values of the in-memory bitmap do not - * correspond to the red, green and blue end-points defined by sRGB. - */ - -#define PNG_IMAGE_FLAG_FAST 0x02 - /* On write emphasise speed over compression; the resultant PNG file will be - * larger but will be produced significantly faster, particular for large - * images. Do not use this option for images which will be distributed, only - * used it when producing intermediate files that will be read back in - * repeatedly. For a typical 24-bit image the option will double the read - * speed at the cost of increasing the image size by 25%, however for many - * more compressible images the PNG file can be 10 times larger with only a - * slight speed gain. - */ - -#define PNG_IMAGE_FLAG_16BIT_sRGB 0x04 - /* On read if the image is a 16-bit per component image and there is no gAMA - * or sRGB chunk assume that the components are sRGB encoded. Notice that - * images output by the simplified API always have gamma information; setting - * this flag only affects the interpretation of 16-bit images from an - * external source. It is recommended that the application expose this flag - * to the user; the user can normally easily recognize the difference between - * linear and sRGB encoding. This flag has no effect on write - the data - * passed to the write APIs must have the correct encoding (as defined - * above.) - * - * If the flag is not set (the default) input 16-bit per component data is - * assumed to be linear. - * - * NOTE: the flag can only be set after the png_image_begin_read_ call, - * because that call initializes the 'flags' field. - */ - -#ifdef PNG_SIMPLIFIED_READ_SUPPORTED -/* READ APIs - * --------- - * - * The png_image passed to the read APIs must have been initialized by setting - * the png_controlp field 'opaque' to NULL (or, safer, memset the whole thing.) - */ -#ifdef PNG_STDIO_SUPPORTED -PNG_EXPORT(234, int, png_image_begin_read_from_file, (png_imagep image, - const char *file_name)); - /* The named file is opened for read and the image header is filled in - * from the PNG header in the file. - */ - -PNG_EXPORT(235, int, png_image_begin_read_from_stdio, (png_imagep image, - FILE* file)); - /* The PNG header is read from the stdio FILE object. */ -#endif /* PNG_STDIO_SUPPORTED */ - -PNG_EXPORT(236, int, png_image_begin_read_from_memory, (png_imagep image, - png_const_voidp memory, png_size_t size)); - /* The PNG header is read from the given memory buffer. */ - -PNG_EXPORT(237, int, png_image_finish_read, (png_imagep image, - png_const_colorp background, void *buffer, png_int_32 row_stride, - void *colormap)); - /* Finish reading the image into the supplied buffer and clean up the - * png_image structure. - * - * row_stride is the step, in byte or 2-byte units as appropriate, - * between adjacent rows. A positive stride indicates that the top-most row - * is first in the buffer - the normal top-down arrangement. A negative - * stride indicates that the bottom-most row is first in the buffer. - * - * background need only be supplied if an alpha channel must be removed from - * a png_byte format and the removal is to be done by compositing on a solid - * color; otherwise it may be NULL and any composition will be done directly - * onto the buffer. The value is an sRGB color to use for the background, - * for grayscale output the green channel is used. - * - * background must be supplied when an alpha channel must be removed from a - * single byte color-mapped output format, in other words if: - * - * 1) The original format from png_image_begin_read_from_* had - * PNG_FORMAT_FLAG_ALPHA set. - * 2) The format set by the application does not. - * 3) The format set by the application has PNG_FORMAT_FLAG_COLORMAP set and - * PNG_FORMAT_FLAG_LINEAR *not* set. - * - * For linear output removing the alpha channel is always done by compositing - * on black and background is ignored. - * - * colormap must be supplied when PNG_FORMAT_FLAG_COLORMAP is set. It must - * be at least the size (in bytes) returned by PNG_IMAGE_COLORMAP_SIZE. - * image->colormap_entries will be updated to the actual number of entries - * written to the colormap; this may be less than the original value. - */ - -PNG_EXPORT(238, void, png_image_free, (png_imagep image)); - /* Free any data allocated by libpng in image->opaque, setting the pointer to - * NULL. May be called at any time after the structure is initialized. - */ -#endif /* PNG_SIMPLIFIED_READ_SUPPORTED */ - -#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED -/* WRITE APIS - * ---------- - * For write you must initialize a png_image structure to describe the image to - * be written. To do this use memset to set the whole structure to 0 then - * initialize fields describing your image. - * - * version: must be set to PNG_IMAGE_VERSION - * opaque: must be initialized to NULL - * width: image width in pixels - * height: image height in rows - * format: the format of the data (image and color-map) you wish to write - * flags: set to 0 unless one of the defined flags applies; set - * PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images where the RGB - * values do not correspond to the colors in sRGB. - * colormap_entries: set to the number of entries in the color-map (0 to 256) - */ -PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image, - const char *file, int convert_to_8bit, const void *buffer, - png_int_32 row_stride, const void *colormap)); - /* Write the image to the named file. */ - -PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file, - int convert_to_8_bit, const void *buffer, png_int_32 row_stride, - const void *colormap)); - /* Write the image to the given (FILE*). */ - -/* With both write APIs if image is in one of the linear formats with 16-bit - * data then setting convert_to_8_bit will cause the output to be an 8-bit PNG - * gamma encoded according to the sRGB specification, otherwise a 16-bit linear - * encoded PNG file is written. - * - * With color-mapped data formats the colormap parameter point to a color-map - * with at least image->colormap_entries encoded in the specified format. If - * the format is linear the written PNG color-map will be converted to sRGB - * regardless of the convert_to_8_bit flag. - * - * With all APIs row_stride is handled as in the read APIs - it is the spacing - * from one row to the next in component sized units (1 or 2 bytes) and if - * negative indicates a bottom-up row layout in the buffer. - * - * Note that the write API does not support interlacing or sub-8-bit pixels. - */ -#endif /* PNG_SIMPLIFIED_WRITE_SUPPORTED */ -/******************************************************************************* - * END OF SIMPLIFIED API - ******************************************************************************/ - -#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED -PNG_EXPORT(242, void, png_set_check_for_invalid_index, - (png_structrp png_ptr, int allowed)); -# ifdef PNG_GET_PALETTE_MAX_SUPPORTED -PNG_EXPORT(243, int, png_get_palette_max, (png_const_structp png_ptr, - png_const_infop info_ptr)); -# endif -#endif /* CHECK_FOR_INVALID_INDEX */ - -/******************************************************************************* - * IMPLEMENTATION OPTIONS - ******************************************************************************* - * - * Support for arbitrary implementation-specific optimizations. The API allows - * particular options to be turned on or off. 'Option' is the number of the - * option and 'onoff' is 0 (off) or non-0 (on). The value returned is given - * by the PNG_OPTION_ defines below. - * - * HARDWARE: normally hardware capabilites, such as the Intel SSE instructions, - * are detected at run time, however sometimes it may be impossible - * to do this in user mode, in which case it is necessary to discover - * the capabilities in an OS specific way. Such capabilities are - * listed here when libpng has support for them and must be turned - * ON by the application if present. - * - * SOFTWARE: sometimes software optimizations actually result in performance - * decrease on some architectures or systems, or with some sets of - * PNG images. 'Software' options allow such optimizations to be - * selected at run time. - */ -#ifdef PNG_SET_OPTION_SUPPORTED -#ifdef PNG_ARM_NEON_API_SUPPORTED -# define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */ -#endif -#define PNG_OPTION_NEXT 2 /* Next option - numbers must be even */ - -/* Return values: NOTE: there are four values and 'off' is *not* zero */ -#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */ -#define PNG_OPTION_INVALID 1 /* Option number out of range */ -#define PNG_OPTION_OFF 2 -#define PNG_OPTION_ON 3 - -PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option, - int onoff)); -#endif - -/******************************************************************************* - * END OF HARDWARE OPTIONS - ******************************************************************************/ - -/* Maintainer: Put new public prototypes here ^, in libpng.3, and project - * defs, scripts/pnglibconf.h, and scripts/pnglibconf.h.prebuilt - */ - -/* The last ordinal number (this is the *last* one already used; the next - * one to use is one more than this.) Maintainer, remember to add an entry to - * scripts/symbols.def as well. - */ -#ifdef PNG_EXPORT_LAST_ORDINAL - PNG_EXPORT_LAST_ORDINAL(244); -#endif - -#endif /* PNG_VERSION_INFO_ONLY */ -/* Do not put anything past this line */ -#endif /* PNG_H */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngconf.h b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngconf.h deleted file mode 100755 index b3ceeae..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngconf.h +++ /dev/null @@ -1,616 +0,0 @@ - -/* pngconf.h - machine configurable file for libpng - * - * libpng version 1.6.1 - March 28, 2013 - * - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - */ - -/* Any machine specific code is near the front of this file, so if you - * are configuring libpng for a machine, you may want to read the section - * starting here down to where it starts to typedef png_color, png_text, - * and png_info. - */ - -#ifndef PNGCONF_H -#define PNGCONF_H - -/* To do: Do all of this in scripts/pnglibconf.dfa */ -#ifdef PNG_SAFE_LIMITS_SUPPORTED -# ifdef PNG_USER_WIDTH_MAX -# undef PNG_USER_WIDTH_MAX -# define PNG_USER_WIDTH_MAX 1000000L -# endif -# ifdef PNG_USER_HEIGHT_MAX -# undef PNG_USER_HEIGHT_MAX -# define PNG_USER_HEIGHT_MAX 1000000L -# endif -# ifdef PNG_USER_CHUNK_MALLOC_MAX -# undef PNG_USER_CHUNK_MALLOC_MAX -# define PNG_USER_CHUNK_MALLOC_MAX 4000000L -# endif -# ifdef PNG_USER_CHUNK_CACHE_MAX -# undef PNG_USER_CHUNK_CACHE_MAX -# define PNG_USER_CHUNK_CACHE_MAX 128 -# endif -#endif - -#ifndef PNG_BUILDING_SYMBOL_TABLE /* else includes may cause problems */ - -/* From libpng 1.6.0 libpng requires an ANSI X3.159-1989 ("ISOC90") compliant C - * compiler for correct compilation. The following header files are required by - * the standard. If your compiler doesn't provide these header files, or they - * do not match the standard, you will need to provide/improve them. - */ -#include -#include - -/* Library header files. These header files are all defined by ISOC90; libpng - * expects conformant implementations, however, an ISOC90 conformant system need - * not provide these header files if the functionality cannot be implemented. - * In this case it will be necessary to disable the relevant parts of libpng in - * the build of pnglibconf.h. - * - * Prior to 1.6.0 string.h was included here; the API changes in 1.6.0 to not - * include this unnecessary header file. - */ - -#ifdef PNG_STDIO_SUPPORTED - /* Required for the definition of FILE: */ -# include -#endif - -#ifdef PNG_SETJMP_SUPPORTED - /* Required for the definition of jmp_buf and the declaration of longjmp: */ -# include -#endif - -#ifdef PNG_CONVERT_tIME_SUPPORTED - /* Required for struct tm: */ -# include -#endif - -#endif /* PNG_BUILDING_SYMBOL_TABLE */ - -/* Prior to 1.6.0 it was possible to turn off 'const' in declarations using - * PNG_NO_CONST; this is no longer supported except for data declarations which - * apparently still cause problems in 2011 on some compilers. - */ -#define PNG_CONST const /* backward compatibility only */ - -/* This controls optimization of the reading of 16 and 32 bit values - * from PNG files. It can be set on a per-app-file basis - it - * just changes whether a macro is used when the function is called. - * The library builder sets the default; if read functions are not - * built into the library the macro implementation is forced on. - */ -#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED -# define PNG_USE_READ_MACROS -#endif -#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) -# if PNG_DEFAULT_READ_MACROS -# define PNG_USE_READ_MACROS -# endif -#endif - -/* COMPILER SPECIFIC OPTIONS. - * - * These options are provided so that a variety of difficult compilers - * can be used. Some are fixed at build time (e.g. PNG_API_RULE - * below) but still have compiler specific implementations, others - * may be changed on a per-file basis when compiling against libpng. - */ - -/* The PNGARG macro was used in versions of libpng prior to 1.6.0 to protect - * against legacy (pre ISOC90) compilers that did not understand function - * prototypes. It is not required for modern C compilers. - */ -#ifndef PNGARG -# define PNGARG(arglist) arglist -#endif - -/* Function calling conventions. - * ============================= - * Normally it is not necessary to specify to the compiler how to call - * a function - it just does it - however on x86 systems derived from - * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems - * and some others) there are multiple ways to call a function and the - * default can be changed on the compiler command line. For this reason - * libpng specifies the calling convention of every exported function and - * every function called via a user supplied function pointer. This is - * done in this file by defining the following macros: - * - * PNGAPI Calling convention for exported functions. - * PNGCBAPI Calling convention for user provided (callback) functions. - * PNGCAPI Calling convention used by the ANSI-C library (required - * for longjmp callbacks and sometimes used internally to - * specify the calling convention for zlib). - * - * These macros should never be overridden. If it is necessary to - * change calling convention in a private build this can be done - * by setting PNG_API_RULE (which defaults to 0) to one of the values - * below to select the correct 'API' variants. - * - * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout. - * This is correct in every known environment. - * PNG_API_RULE=1 Use the operating system convention for PNGAPI and - * the 'C' calling convention (from PNGCAPI) for - * callbacks (PNGCBAPI). This is no longer required - * in any known environment - if it has to be used - * please post an explanation of the problem to the - * libpng mailing list. - * - * These cases only differ if the operating system does not use the C - * calling convention, at present this just means the above cases - * (x86 DOS/Windows sytems) and, even then, this does not apply to - * Cygwin running on those systems. - * - * Note that the value must be defined in pnglibconf.h so that what - * the application uses to call the library matches the conventions - * set when building the library. - */ - -/* Symbol export - * ============= - * When building a shared library it is almost always necessary to tell - * the compiler which symbols to export. The png.h macro 'PNG_EXPORT' - * is used to mark the symbols. On some systems these symbols can be - * extracted at link time and need no special processing by the compiler, - * on other systems the symbols are flagged by the compiler and just - * the declaration requires a special tag applied (unfortunately) in a - * compiler dependent way. Some systems can do either. - * - * A small number of older systems also require a symbol from a DLL to - * be flagged to the program that calls it. This is a problem because - * we do not know in the header file included by application code that - * the symbol will come from a shared library, as opposed to a statically - * linked one. For this reason the application must tell us by setting - * the magic flag PNG_USE_DLL to turn on the special processing before - * it includes png.h. - * - * Four additional macros are used to make this happen: - * - * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from - * the build or imported if PNG_USE_DLL is set - compiler - * and system specific. - * - * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to - * 'type', compiler specific. - * - * PNG_DLL_EXPORT Set to the magic to use during a libpng build to - * make a symbol exported from the DLL. Not used in the - * public header files; see pngpriv.h for how it is used - * in the libpng build. - * - * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come - * from a DLL - used to define PNG_IMPEXP when - * PNG_USE_DLL is set. - */ - -/* System specific discovery. - * ========================== - * This code is used at build time to find PNG_IMPEXP, the API settings - * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL - * import processing is possible. On Windows systems it also sets - * compiler-specific macros to the values required to change the calling - * conventions of the various functions. - */ -#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ - defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) - /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or - * MinGW on any architecture currently supported by Windows. Also includes - * Watcom builds but these need special treatment because they are not - * compatible with GCC or Visual C because of different calling conventions. - */ -# if PNG_API_RULE == 2 - /* If this line results in an error, either because __watcall is not - * understood or because of a redefine just below you cannot use *this* - * build of the library with the compiler you are using. *This* build was - * build using Watcom and applications must also be built using Watcom! - */ -# define PNGCAPI __watcall -# endif - -# if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800)) -# define PNGCAPI __cdecl -# if PNG_API_RULE == 1 - /* If this line results in an error __stdcall is not understood and - * PNG_API_RULE should not have been set to '1'. - */ -# define PNGAPI __stdcall -# endif -# else - /* An older compiler, or one not detected (erroneously) above, - * if necessary override on the command line to get the correct - * variants for the compiler. - */ -# ifndef PNGCAPI -# define PNGCAPI _cdecl -# endif -# if PNG_API_RULE == 1 && !defined(PNGAPI) -# define PNGAPI _stdcall -# endif -# endif /* compiler/api */ - /* NOTE: PNGCBAPI always defaults to PNGCAPI. */ - -# if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD) -# error "PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed" -# endif - -# if (defined(_MSC_VER) && _MSC_VER < 800) ||\ - (defined(__BORLANDC__) && __BORLANDC__ < 0x500) - /* older Borland and MSC - * compilers used '__export' and required this to be after - * the type. - */ -# ifndef PNG_EXPORT_TYPE -# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP -# endif -# define PNG_DLL_EXPORT __export -# else /* newer compiler */ -# define PNG_DLL_EXPORT __declspec(dllexport) -# ifndef PNG_DLL_IMPORT -# define PNG_DLL_IMPORT __declspec(dllimport) -# endif -# endif /* compiler */ - -#else /* !Windows */ -# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) -# define PNGAPI _System -# else /* !Windows/x86 && !OS/2 */ - /* Use the defaults, or define PNG*API on the command line (but - * this will have to be done for every compile!) - */ -# endif /* other system, !OS/2 */ -#endif /* !Windows/x86 */ - -/* Now do all the defaulting . */ -#ifndef PNGCAPI -# define PNGCAPI -#endif -#ifndef PNGCBAPI -# define PNGCBAPI PNGCAPI -#endif -#ifndef PNGAPI -# define PNGAPI PNGCAPI -#endif - -/* PNG_IMPEXP may be set on the compilation system command line or (if not set) - * then in an internal header file when building the library, otherwise (when - * using the library) it is set here. - */ -#ifndef PNG_IMPEXP -# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT) - /* This forces use of a DLL, disallowing static linking */ -# define PNG_IMPEXP PNG_DLL_IMPORT -# endif - -# ifndef PNG_IMPEXP -# define PNG_IMPEXP -# endif -#endif - -/* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat - * 'attributes' as a storage class - the attributes go at the start of the - * function definition, and attributes are always appended regardless of the - * compiler. This considerably simplifies these macros but may cause problems - * if any compilers both need function attributes and fail to handle them as - * a storage class (this is unlikely.) - */ -#ifndef PNG_FUNCTION -# define PNG_FUNCTION(type, name, args, attributes) attributes type name args -#endif - -#ifndef PNG_EXPORT_TYPE -# define PNG_EXPORT_TYPE(type) PNG_IMPEXP type -#endif - - /* The ordinal value is only relevant when preprocessing png.h for symbol - * table entries, so we discard it here. See the .dfn files in the - * scripts directory. - */ -#ifndef PNG_EXPORTA - -# define PNG_EXPORTA(ordinal, type, name, args, attributes)\ - PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \ - extern attributes) -#endif - -/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument, - * so make something non-empty to satisfy the requirement: - */ -#define PNG_EMPTY /*empty list*/ - -#define PNG_EXPORT(ordinal, type, name, args)\ - PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY) - -/* Use PNG_REMOVED to comment out a removed interface. */ -#ifndef PNG_REMOVED -# define PNG_REMOVED(ordinal, type, name, args, attributes) -#endif - -#ifndef PNG_CALLBACK -# define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args) -#endif - -/* Support for compiler specific function attributes. These are used - * so that where compiler support is available incorrect use of API - * functions in png.h will generate compiler warnings. - * - * Added at libpng-1.2.41. - */ - -#ifndef PNG_NO_PEDANTIC_WARNINGS -# ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED -# define PNG_PEDANTIC_WARNINGS_SUPPORTED -# endif -#endif - -#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED - /* Support for compiler specific function attributes. These are used - * so that where compiler support is available, incorrect use of API - * functions in png.h will generate compiler warnings. Added at libpng - * version 1.2.41. Disabling these removes the warnings but may also produce - * less efficient code. - */ -# if defined(__GNUC__) -# ifndef PNG_USE_RESULT -# define PNG_USE_RESULT __attribute__((__warn_unused_result__)) -# endif -# ifndef PNG_NORETURN -# define PNG_NORETURN __attribute__((__noreturn__)) -# endif -# if __GNUC__ >= 3 -# ifndef PNG_ALLOCATED -# define PNG_ALLOCATED __attribute__((__malloc__)) -# endif -# ifndef PNG_DEPRECATED -# define PNG_DEPRECATED __attribute__((__deprecated__)) -# endif -# ifndef PNG_PRIVATE -# if 0 /* Doesn't work so we use deprecated instead*/ -# define PNG_PRIVATE \ - __attribute__((warning("This function is not exported by libpng."))) -# else -# define PNG_PRIVATE \ - __attribute__((__deprecated__)) -# endif -# endif -# if ((__GNUC__ != 3) || !defined(__GNUC_MINOR__) || (__GNUC_MINOR__ >= 1)) -# ifndef PNG_RESTRICT -# define PNG_RESTRICT __restrict -# endif -# endif /* __GNUC__ == 3.0 */ -# endif /* __GNUC__ >= 3 */ - -# elif defined(_MSC_VER) && (_MSC_VER >= 1300) -# ifndef PNG_USE_RESULT -# define PNG_USE_RESULT /* not supported */ -# endif -# ifndef PNG_NORETURN -# define PNG_NORETURN __declspec(noreturn) -# endif -# ifndef PNG_ALLOCATED -# if (_MSC_VER >= 1400) -# define PNG_ALLOCATED __declspec(restrict) -# endif -# endif -# ifndef PNG_DEPRECATED -# define PNG_DEPRECATED __declspec(deprecated) -# endif -# ifndef PNG_PRIVATE -# define PNG_PRIVATE __declspec(deprecated) -# endif -# ifndef PNG_RESTRICT -# if (_MSC_VER >= 1400) -# define PNG_RESTRICT __restrict -# endif -# endif - -# elif defined(__WATCOMC__) -# ifndef PNG_RESTRICT -# define PNG_RESTRICT __restrict -# endif -# endif /* _MSC_VER */ -#endif /* PNG_PEDANTIC_WARNINGS */ - -#ifndef PNG_DEPRECATED -# define PNG_DEPRECATED /* Use of this function is deprecated */ -#endif -#ifndef PNG_USE_RESULT -# define PNG_USE_RESULT /* The result of this function must be checked */ -#endif -#ifndef PNG_NORETURN -# define PNG_NORETURN /* This function does not return */ -#endif -#ifndef PNG_ALLOCATED -# define PNG_ALLOCATED /* The result of the function is new memory */ -#endif -#ifndef PNG_PRIVATE -# define PNG_PRIVATE /* This is a private libpng function */ -#endif -#ifndef PNG_RESTRICT -# define PNG_RESTRICT /* The C99 "restrict" feature */ -#endif -#ifndef PNG_FP_EXPORT /* A floating point API. */ -# ifdef PNG_FLOATING_POINT_SUPPORTED -# define PNG_FP_EXPORT(ordinal, type, name, args)\ - PNG_EXPORT(ordinal, type, name, args); -# else /* No floating point APIs */ -# define PNG_FP_EXPORT(ordinal, type, name, args) -# endif -#endif -#ifndef PNG_FIXED_EXPORT /* A fixed point API. */ -# ifdef PNG_FIXED_POINT_SUPPORTED -# define PNG_FIXED_EXPORT(ordinal, type, name, args)\ - PNG_EXPORT(ordinal, type, name, args); -# else /* No fixed point APIs */ -# define PNG_FIXED_EXPORT(ordinal, type, name, args) -# endif -#endif - -#ifndef PNG_BUILDING_SYMBOL_TABLE -/* Some typedefs to get us started. These should be safe on most of the common - * platforms. - * - * png_uint_32 and png_int_32 may, currently, be larger than required to hold a - * 32-bit value however this is not normally advisable. - * - * png_uint_16 and png_int_16 should always be two bytes in size - this is - * verified at library build time. - * - * png_byte must always be one byte in size. - * - * The checks below use constants from limits.h, as defined by the ISOC90 - * standard. - */ -#if CHAR_BIT == 8 && UCHAR_MAX == 255 - typedef unsigned char png_byte; -#else -# error "libpng requires 8 bit bytes" -#endif - -#if INT_MIN == -32768 && INT_MAX == 32767 - typedef int png_int_16; -#elif SHRT_MIN == -32768 && SHRT_MAX == 32767 - typedef short png_int_16; -#else -# error "libpng requires a signed 16 bit type" -#endif - -#if UINT_MAX == 65535 - typedef unsigned int png_uint_16; -#elif USHRT_MAX == 65535 - typedef unsigned short png_uint_16; -#else -# error "libpng requires an unsigned 16 bit type" -#endif - -#if INT_MIN < -2147483646 && INT_MAX > 2147483646 - typedef int png_int_32; -#elif LONG_MIN < -2147483646 && LONG_MAX > 2147483646 - typedef long int png_int_32; -#else -# error "libpng requires a signed 32 bit (or more) type" -#endif - -#if UINT_MAX > 4294967294 - typedef unsigned int png_uint_32; -#elif ULONG_MAX > 4294967294 - typedef unsigned long int png_uint_32; -#else -# error "libpng requires an unsigned 32 bit (or more) type" -#endif - -/* Prior to 1.6.0 it was possible to disable the use of size_t, 1.6.0, however, - * requires an ISOC90 compiler and relies on consistent behavior of sizeof. - */ -typedef size_t png_size_t; -typedef ptrdiff_t png_ptrdiff_t; - -/* libpng needs to know the maximum value of 'size_t' and this controls the - * definition of png_alloc_size_t, below. This maximum value of size_t limits - * but does not control the maximum allocations the library makes - there is - * direct application control of this through png_set_user_limits(). - */ -#ifndef PNG_SMALL_SIZE_T - /* Compiler specific tests for systems where size_t is known to be less than - * 32 bits (some of these systems may no longer work because of the lack of - * 'far' support; see above.) - */ -# if (defined(__TURBOC__) && !defined(__FLAT__)) ||\ - (defined(_MSC_VER) && defined(MAXSEG_64K)) -# define PNG_SMALL_SIZE_T -# endif -#endif - -/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, and no - * smaller than png_uint_32. Casts from png_size_t or png_uint_32 to - * png_alloc_size_t are not necessary; in fact, it is recommended not to use - * them at all so that the compiler can complain when something turns out to be - * problematic. - * - * Casts in the other direction (from png_alloc_size_t to png_size_t or - * png_uint_32) should be explicitly applied; however, we do not expect to - * encounter practical situations that require such conversions. - * - * PNG_SMALL_SIZE_T must be defined if the maximum value of size_t is less than - * 4294967295 - i.e. less than the maximum value of png_uint_32. - */ -#ifdef PNG_SMALL_SIZE_T - typedef png_uint_32 png_alloc_size_t; -#else - typedef png_size_t png_alloc_size_t; -#endif - -/* Prior to 1.6.0 libpng offered limited support for Microsoft C compiler - * implementations of Intel CPU specific support of user-mode segmented address - * spaces, where 16-bit pointers address more than 65536 bytes of memory using - * separate 'segment' registers. The implementation requires two different - * types of pointer (only one of which includes the segment value.) - * - * If required this support is available in version 1.2 of libpng and may be - * available in versions through 1.5, although the correctness of the code has - * not been verified recently. - */ - -/* Typedef for floating-point numbers that are converted to fixed-point with a - * multiple of 100,000, e.g., gamma - */ -typedef png_int_32 png_fixed_point; - -/* Add typedefs for pointers */ -typedef void * png_voidp; -typedef const void * png_const_voidp; -typedef png_byte * png_bytep; -typedef const png_byte * png_const_bytep; -typedef png_uint_32 * png_uint_32p; -typedef const png_uint_32 * png_const_uint_32p; -typedef png_int_32 * png_int_32p; -typedef const png_int_32 * png_const_int_32p; -typedef png_uint_16 * png_uint_16p; -typedef const png_uint_16 * png_const_uint_16p; -typedef png_int_16 * png_int_16p; -typedef const png_int_16 * png_const_int_16p; -typedef char * png_charp; -typedef const char * png_const_charp; -typedef png_fixed_point * png_fixed_point_p; -typedef const png_fixed_point * png_const_fixed_point_p; -typedef png_size_t * png_size_tp; -typedef const png_size_t * png_const_size_tp; - -#ifdef PNG_STDIO_SUPPORTED -typedef FILE * png_FILE_p; -#endif - -#ifdef PNG_FLOATING_POINT_SUPPORTED -typedef double * png_doublep; -typedef const double * png_const_doublep; -#endif - -/* Pointers to pointers; i.e. arrays */ -typedef png_byte * * png_bytepp; -typedef png_uint_32 * * png_uint_32pp; -typedef png_int_32 * * png_int_32pp; -typedef png_uint_16 * * png_uint_16pp; -typedef png_int_16 * * png_int_16pp; -typedef const char * * png_const_charpp; -typedef char * * png_charpp; -typedef png_fixed_point * * png_fixed_point_pp; -#ifdef PNG_FLOATING_POINT_SUPPORTED -typedef double * * png_doublepp; -#endif - -/* Pointers to pointers to pointers; i.e., pointer to array */ -typedef char * * * png_charppp; - -#endif /* PNG_BUILDING_SYMBOL_TABLE */ - -#endif /* PNGCONF_H */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngerror.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngerror.c deleted file mode 100755 index f40cc83..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngerror.c +++ /dev/null @@ -1,932 +0,0 @@ - -/* pngerror.c - stub functions for i/o and memory allocation - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - * This file provides a location for all error handling. Users who - * need special error handling are expected to write replacement functions - * and use png_set_error_fn() to use those functions. See the instructions - * at each function. - */ - -#include "pngpriv.h" - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) - -static PNG_FUNCTION(void, png_default_error,PNGARG((png_const_structrp png_ptr, - png_const_charp error_message)),PNG_NORETURN); - -#ifdef PNG_WARNINGS_SUPPORTED -static void /* PRIVATE */ -png_default_warning PNGARG((png_const_structrp png_ptr, - png_const_charp warning_message)); -#endif /* PNG_WARNINGS_SUPPORTED */ - -/* This function is called whenever there is a fatal error. This function - * should not be changed. If there is a need to handle errors differently, - * you should supply a replacement error function and use png_set_error_fn() - * to replace the error function at run-time. - */ -#ifdef PNG_ERROR_TEXT_SUPPORTED -PNG_FUNCTION(void,PNGAPI -png_error,(png_const_structrp png_ptr, png_const_charp error_message), - PNG_NORETURN) -{ -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - char msg[16]; - if (png_ptr != NULL) - { - if (png_ptr->flags& - (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) - { - if (*error_message == PNG_LITERAL_SHARP) - { - /* Strip "#nnnn " from beginning of error message. */ - int offset; - for (offset = 1; offset<15; offset++) - if (error_message[offset] == ' ') - break; - - if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) - { - int i; - for (i = 0; i < offset - 1; i++) - msg[i] = error_message[i + 1]; - msg[i - 1] = '\0'; - error_message = msg; - } - - else - error_message += offset; - } - - else - { - if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT) - { - msg[0] = '0'; - msg[1] = '\0'; - error_message = msg; - } - } - } - } -#endif - if (png_ptr != NULL && png_ptr->error_fn != NULL) - (*(png_ptr->error_fn))(png_constcast(png_structrp,png_ptr), - error_message); - - /* If the custom handler doesn't exist, or if it returns, - use the default handler, which will not return. */ - png_default_error(png_ptr, error_message); -} -#else -PNG_FUNCTION(void,PNGAPI -png_err,(png_const_structrp png_ptr),PNG_NORETURN) -{ - /* Prior to 1.5.2 the error_fn received a NULL pointer, expressed - * erroneously as '\0', instead of the empty string "". This was - * apparently an error, introduced in libpng-1.2.20, and png_default_error - * will crash in this case. - */ - if (png_ptr != NULL && png_ptr->error_fn != NULL) - (*(png_ptr->error_fn))(png_constcast(png_structrp,png_ptr), ""); - - /* If the custom handler doesn't exist, or if it returns, - use the default handler, which will not return. */ - png_default_error(png_ptr, ""); -} -#endif /* PNG_ERROR_TEXT_SUPPORTED */ - -/* Utility to safely appends strings to a buffer. This never errors out so - * error checking is not required in the caller. - */ -size_t -png_safecat(png_charp buffer, size_t bufsize, size_t pos, - png_const_charp string) -{ - if (buffer != NULL && pos < bufsize) - { - if (string != NULL) - while (*string != '\0' && pos < bufsize-1) - buffer[pos++] = *string++; - - buffer[pos] = '\0'; - } - - return pos; -} - -#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_TIME_RFC1123_SUPPORTED) -/* Utility to dump an unsigned value into a buffer, given a start pointer and - * and end pointer (which should point just *beyond* the end of the buffer!) - * Returns the pointer to the start of the formatted string. - */ -png_charp -png_format_number(png_const_charp start, png_charp end, int format, - png_alloc_size_t number) -{ - int count = 0; /* number of digits output */ - int mincount = 1; /* minimum number required */ - int output = 0; /* digit output (for the fixed point format) */ - - *--end = '\0'; - - /* This is written so that the loop always runs at least once, even with - * number zero. - */ - while (end > start && (number != 0 || count < mincount)) - { - - static const char digits[] = "0123456789ABCDEF"; - - switch (format) - { - case PNG_NUMBER_FORMAT_fixed: - /* Needs five digits (the fraction) */ - mincount = 5; - if (output || number % 10 != 0) - { - *--end = digits[number % 10]; - output = 1; - } - number /= 10; - break; - - case PNG_NUMBER_FORMAT_02u: - /* Expects at least 2 digits. */ - mincount = 2; - /* FALL THROUGH */ - - case PNG_NUMBER_FORMAT_u: - *--end = digits[number % 10]; - number /= 10; - break; - - case PNG_NUMBER_FORMAT_02x: - /* This format expects at least two digits */ - mincount = 2; - /* FALL THROUGH */ - - case PNG_NUMBER_FORMAT_x: - *--end = digits[number & 0xf]; - number >>= 4; - break; - - default: /* an error */ - number = 0; - break; - } - - /* Keep track of the number of digits added */ - ++count; - - /* Float a fixed number here: */ - if (format == PNG_NUMBER_FORMAT_fixed) if (count == 5) if (end > start) - { - /* End of the fraction, but maybe nothing was output? In that case - * drop the decimal point. If the number is a true zero handle that - * here. - */ - if (output) - *--end = '.'; - else if (number == 0) /* and !output */ - *--end = '0'; - } - } - - return end; -} -#endif - -#ifdef PNG_WARNINGS_SUPPORTED -/* This function is called whenever there is a non-fatal error. This function - * should not be changed. If there is a need to handle warnings differently, - * you should supply a replacement warning function and use - * png_set_error_fn() to replace the warning function at run-time. - */ -void PNGAPI -png_warning(png_const_structrp png_ptr, png_const_charp warning_message) -{ - int offset = 0; - if (png_ptr != NULL) - { -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - if (png_ptr->flags& - (PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT)) -#endif - { - if (*warning_message == PNG_LITERAL_SHARP) - { - for (offset = 1; offset < 15; offset++) - if (warning_message[offset] == ' ') - break; - } - } - } - if (png_ptr != NULL && png_ptr->warning_fn != NULL) - (*(png_ptr->warning_fn))(png_constcast(png_structrp,png_ptr), - warning_message + offset); - else - png_default_warning(png_ptr, warning_message + offset); -} - -/* These functions support 'formatted' warning messages with up to - * PNG_WARNING_PARAMETER_COUNT parameters. In the format string the parameter - * is introduced by @, where 'number' starts at 1. This follows the - * standard established by X/Open for internationalizable error messages. - */ -void -png_warning_parameter(png_warning_parameters p, int number, - png_const_charp string) -{ - if (number > 0 && number <= PNG_WARNING_PARAMETER_COUNT) - (void)png_safecat(p[number-1], (sizeof p[number-1]), 0, string); -} - -void -png_warning_parameter_unsigned(png_warning_parameters p, int number, int format, - png_alloc_size_t value) -{ - char buffer[PNG_NUMBER_BUFFER_SIZE]; - png_warning_parameter(p, number, PNG_FORMAT_NUMBER(buffer, format, value)); -} - -void -png_warning_parameter_signed(png_warning_parameters p, int number, int format, - png_int_32 value) -{ - png_alloc_size_t u; - png_charp str; - char buffer[PNG_NUMBER_BUFFER_SIZE]; - - /* Avoid overflow by doing the negate in a png_alloc_size_t: */ - u = (png_alloc_size_t)value; - if (value < 0) - u = ~u + 1; - - str = PNG_FORMAT_NUMBER(buffer, format, u); - - if (value < 0 && str > buffer) - *--str = '-'; - - png_warning_parameter(p, number, str); -} - -void -png_formatted_warning(png_const_structrp png_ptr, png_warning_parameters p, - png_const_charp message) -{ - /* The internal buffer is just 192 bytes - enough for all our messages, - * overflow doesn't happen because this code checks! If someone figures - * out how to send us a message longer than 192 bytes, all that will - * happen is that the message will be truncated appropriately. - */ - size_t i = 0; /* Index in the msg[] buffer: */ - char msg[192]; - - /* Each iteration through the following loop writes at most one character - * to msg[i++] then returns here to validate that there is still space for - * the trailing '\0'. It may (in the case of a parameter) read more than - * one character from message[]; it must check for '\0' and continue to the - * test if it finds the end of string. - */ - while (i<(sizeof msg)-1 && *message != '\0') - { - /* '@' at end of string is now just printed (previously it was skipped); - * it is an error in the calling code to terminate the string with @. - */ - if (p != NULL && *message == '@' && message[1] != '\0') - { - int parameter_char = *++message; /* Consume the '@' */ - static const char valid_parameters[] = "123456789"; - int parameter = 0; - - /* Search for the parameter digit, the index in the string is the - * parameter to use. - */ - while (valid_parameters[parameter] != parameter_char && - valid_parameters[parameter] != '\0') - ++parameter; - - /* If the parameter digit is out of range it will just get printed. */ - if (parameter < PNG_WARNING_PARAMETER_COUNT) - { - /* Append this parameter */ - png_const_charp parm = p[parameter]; - png_const_charp pend = p[parameter] + (sizeof p[parameter]); - - /* No need to copy the trailing '\0' here, but there is no guarantee - * that parm[] has been initialized, so there is no guarantee of a - * trailing '\0': - */ - while (i<(sizeof msg)-1 && *parm != '\0' && parm < pend) - msg[i++] = *parm++; - - /* Consume the parameter digit too: */ - ++message; - continue; - } - - /* else not a parameter and there is a character after the @ sign; just - * copy that. This is known not to be '\0' because of the test above. - */ - } - - /* At this point *message can't be '\0', even in the bad parameter case - * above where there is a lone '@' at the end of the message string. - */ - msg[i++] = *message++; - } - - /* i is always less than (sizeof msg), so: */ - msg[i] = '\0'; - - /* And this is the formatted message. It may be larger than - * PNG_MAX_ERROR_TEXT, but that is only used for 'chunk' errors and these - * are not (currently) formatted. - */ - png_warning(png_ptr, msg); -} -#endif /* PNG_WARNINGS_SUPPORTED */ - -#ifdef PNG_BENIGN_ERRORS_SUPPORTED -void PNGAPI -png_benign_error(png_const_structrp png_ptr, png_const_charp error_message) -{ - if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) - { -# ifdef PNG_READ_SUPPORTED - if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && - png_ptr->chunk_name != 0) - png_chunk_warning(png_ptr, error_message); - else -# endif - png_warning(png_ptr, error_message); - } - - else - { -# ifdef PNG_READ_SUPPORTED - if ((png_ptr->mode & PNG_IS_READ_STRUCT) != 0 && - png_ptr->chunk_name != 0) - png_chunk_error(png_ptr, error_message); - else -# endif - png_error(png_ptr, error_message); - } -} - -void /* PRIVATE */ -png_app_warning(png_const_structrp png_ptr, png_const_charp error_message) -{ - if (png_ptr->flags & PNG_FLAG_APP_WARNINGS_WARN) - png_warning(png_ptr, error_message); - else - png_error(png_ptr, error_message); -} - -void /* PRIVATE */ -png_app_error(png_const_structrp png_ptr, png_const_charp error_message) -{ - if (png_ptr->flags & PNG_FLAG_APP_ERRORS_WARN) - png_warning(png_ptr, error_message); - else - png_error(png_ptr, error_message); -} -#endif /* BENIGN_ERRORS */ - -/* These utilities are used internally to build an error message that relates - * to the current chunk. The chunk name comes from png_ptr->chunk_name, - * this is used to prefix the message. The message is limited in length - * to 63 bytes, the name characters are output as hex digits wrapped in [] - * if the character is invalid. - */ -#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) -static PNG_CONST char png_digit[16] = { - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'A', 'B', 'C', 'D', 'E', 'F' -}; - -#define PNG_MAX_ERROR_TEXT 196 /* Currently limited be profile_error in png.c */ -#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_ERROR_TEXT_SUPPORTED) -static void /* PRIVATE */ -png_format_buffer(png_const_structrp png_ptr, png_charp buffer, png_const_charp - error_message) -{ - png_uint_32 chunk_name = png_ptr->chunk_name; - int iout = 0, ishift = 24; - - while (ishift >= 0) - { - int c = (int)(chunk_name >> ishift) & 0xff; - - ishift -= 8; - if (isnonalpha(c)) - { - buffer[iout++] = PNG_LITERAL_LEFT_SQUARE_BRACKET; - buffer[iout++] = png_digit[(c & 0xf0) >> 4]; - buffer[iout++] = png_digit[c & 0x0f]; - buffer[iout++] = PNG_LITERAL_RIGHT_SQUARE_BRACKET; - } - - else - { - buffer[iout++] = (char)c; - } - } - - if (error_message == NULL) - buffer[iout] = '\0'; - - else - { - int iin = 0; - - buffer[iout++] = ':'; - buffer[iout++] = ' '; - - while (iin < PNG_MAX_ERROR_TEXT-1 && error_message[iin] != '\0') - buffer[iout++] = error_message[iin++]; - - /* iin < PNG_MAX_ERROR_TEXT, so the following is safe: */ - buffer[iout] = '\0'; - } -} -#endif /* PNG_WARNINGS_SUPPORTED || PNG_ERROR_TEXT_SUPPORTED */ - -#if defined(PNG_READ_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED) -PNG_FUNCTION(void,PNGAPI -png_chunk_error,(png_const_structrp png_ptr, png_const_charp error_message), - PNG_NORETURN) -{ - char msg[18+PNG_MAX_ERROR_TEXT]; - if (png_ptr == NULL) - png_error(png_ptr, error_message); - - else - { - png_format_buffer(png_ptr, msg, error_message); - png_error(png_ptr, msg); - } -} -#endif /* PNG_READ_SUPPORTED && PNG_ERROR_TEXT_SUPPORTED */ - -#ifdef PNG_WARNINGS_SUPPORTED -void PNGAPI -png_chunk_warning(png_const_structrp png_ptr, png_const_charp warning_message) -{ - char msg[18+PNG_MAX_ERROR_TEXT]; - if (png_ptr == NULL) - png_warning(png_ptr, warning_message); - - else - { - png_format_buffer(png_ptr, msg, warning_message); - png_warning(png_ptr, msg); - } -} -#endif /* PNG_WARNINGS_SUPPORTED */ - -#ifdef PNG_READ_SUPPORTED -#ifdef PNG_BENIGN_ERRORS_SUPPORTED -void PNGAPI -png_chunk_benign_error(png_const_structrp png_ptr, png_const_charp - error_message) -{ - if (png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN) - png_chunk_warning(png_ptr, error_message); - - else - png_chunk_error(png_ptr, error_message); -} -#endif -#endif /* PNG_READ_SUPPORTED */ - -void /* PRIVATE */ -png_chunk_report(png_const_structrp png_ptr, png_const_charp message, int error) -{ - /* This is always supported, but for just read or just write it - * unconditionally does the right thing. - */ -# if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED) - if (png_ptr->mode & PNG_IS_READ_STRUCT) -# endif - -# ifdef PNG_READ_SUPPORTED - { - if (error < PNG_CHUNK_ERROR) - png_chunk_warning(png_ptr, message); - - else - png_chunk_benign_error(png_ptr, message); - } -# endif - -# if defined(PNG_READ_SUPPORTED) && defined(PNG_WRITE_SUPPORTED) - else if (!(png_ptr->mode & PNG_IS_READ_STRUCT)) -# endif - -# ifdef PNG_WRITE_SUPPORTED - { - if (error < PNG_CHUNK_WRITE_ERROR) - png_app_warning(png_ptr, message); - - else - png_app_error(png_ptr, message); - } -# endif -} - -#ifdef PNG_ERROR_TEXT_SUPPORTED -#ifdef PNG_FLOATING_POINT_SUPPORTED -PNG_FUNCTION(void, -png_fixed_error,(png_const_structrp png_ptr, png_const_charp name),PNG_NORETURN) -{ -# define fixed_message "fixed point overflow in " -# define fixed_message_ln ((sizeof fixed_message)-1) - int iin; - char msg[fixed_message_ln+PNG_MAX_ERROR_TEXT]; - memcpy(msg, fixed_message, fixed_message_ln); - iin = 0; - if (name != NULL) while (iin < (PNG_MAX_ERROR_TEXT-1) && name[iin] != 0) - { - msg[fixed_message_ln + iin] = name[iin]; - ++iin; - } - msg[fixed_message_ln + iin] = 0; - png_error(png_ptr, msg); -} -#endif -#endif - -#ifdef PNG_SETJMP_SUPPORTED -/* This API only exists if ANSI-C style error handling is used, - * otherwise it is necessary for png_default_error to be overridden. - */ -jmp_buf* PNGAPI -png_set_longjmp_fn(png_structrp png_ptr, png_longjmp_ptr longjmp_fn, - size_t jmp_buf_size) -{ - /* From libpng 1.6.0 the app gets one chance to set a 'jmpbuf_size' value - * and it must not change after that. Libpng doesn't care how big the - * buffer is, just that it doesn't change. - * - * If the buffer size is no *larger* than the size of jmp_buf when libpng is - * compiled a built in jmp_buf is returned; this preserves the pre-1.6.0 - * semantics that this call will not fail. If the size is larger, however, - * the buffer is allocated and this may fail, causing the function to return - * NULL. - */ - if (png_ptr == NULL) - return NULL; - - if (png_ptr->jmp_buf_ptr == NULL) - { - png_ptr->jmp_buf_size = 0; /* not allocated */ - - if (jmp_buf_size <= (sizeof png_ptr->jmp_buf_local)) - png_ptr->jmp_buf_ptr = &png_ptr->jmp_buf_local; - - else - { - png_ptr->jmp_buf_ptr = png_voidcast(jmp_buf *, - png_malloc_warn(png_ptr, jmp_buf_size)); - - if (png_ptr->jmp_buf_ptr == NULL) - return NULL; /* new NULL return on OOM */ - - png_ptr->jmp_buf_size = jmp_buf_size; - } - } - - else /* Already allocated: check the size */ - { - size_t size = png_ptr->jmp_buf_size; - - if (size == 0) - { - size = (sizeof png_ptr->jmp_buf_local); - if (png_ptr->jmp_buf_ptr != &png_ptr->jmp_buf_local) - { - /* This is an internal error in libpng: somehow we have been left - * with a stack allocated jmp_buf when the application regained - * control. It's always possible to fix this up, but for the moment - * this is a png_error because that makes it easy to detect. - */ - png_error(png_ptr, "Libpng jmp_buf still allocated"); - /* png_ptr->jmp_buf_ptr = &png_ptr->jmp_buf_local; */ - } - } - - if (size != jmp_buf_size) - { - png_warning(png_ptr, "Application jmp_buf size changed"); - return NULL; /* caller will probably crash: no choice here */ - } - } - - /* Finally fill in the function, now we have a satisfactory buffer. It is - * valid to change the function on every call. - */ - png_ptr->longjmp_fn = longjmp_fn; - return png_ptr->jmp_buf_ptr; -} - -void /* PRIVATE */ -png_free_jmpbuf(png_structrp png_ptr) -{ - if (png_ptr != NULL) - { - jmp_buf *jb = png_ptr->jmp_buf_ptr; - - /* A size of 0 is used to indicate a local, stack, allocation of the - * pointer; used here and in png.c - */ - if (jb != NULL && png_ptr->jmp_buf_size > 0) - { - - /* This stuff is so that a failure to free the error control structure - * does not leave libpng in a state with no valid error handling: the - * free always succeeds, if there is an error it gets ignored. - */ - if (jb != &png_ptr->jmp_buf_local) - { - /* Make an internal, libpng, jmp_buf to return here */ - jmp_buf free_jmp_buf; - - if (!setjmp(free_jmp_buf)) - { - png_ptr->jmp_buf_ptr = &free_jmp_buf; /* come back here */ - png_ptr->jmp_buf_size = 0; /* stack allocation */ - png_ptr->longjmp_fn = longjmp; - png_free(png_ptr, jb); /* Return to setjmp on error */ - } - } - } - - /* *Always* cancel everything out: */ - png_ptr->jmp_buf_size = 0; - png_ptr->jmp_buf_ptr = NULL; - png_ptr->longjmp_fn = 0; - } -} -#endif - -/* This is the default error handling function. Note that replacements for - * this function MUST NOT RETURN, or the program will likely crash. This - * function is used by default, or if the program supplies NULL for the - * error function pointer in png_set_error_fn(). - */ -static PNG_FUNCTION(void /* PRIVATE */, -png_default_error,(png_const_structrp png_ptr, png_const_charp error_message), - PNG_NORETURN) -{ -#ifdef PNG_CONSOLE_IO_SUPPORTED -#ifdef PNG_ERROR_NUMBERS_SUPPORTED - /* Check on NULL only added in 1.5.4 */ - if (error_message != NULL && *error_message == PNG_LITERAL_SHARP) - { - /* Strip "#nnnn " from beginning of error message. */ - int offset; - char error_number[16]; - for (offset = 0; offset<15; offset++) - { - error_number[offset] = error_message[offset + 1]; - if (error_message[offset] == ' ') - break; - } - - if ((offset > 1) && (offset < 15)) - { - error_number[offset - 1] = '\0'; - fprintf(stderr, "libpng error no. %s: %s", - error_number, error_message + offset + 1); - fprintf(stderr, PNG_STRING_NEWLINE); - } - - else - { - fprintf(stderr, "libpng error: %s, offset=%d", - error_message, offset); - fprintf(stderr, PNG_STRING_NEWLINE); - } - } - else -#endif - { - fprintf(stderr, "libpng error: %s", error_message ? error_message : - "undefined"); - fprintf(stderr, PNG_STRING_NEWLINE); - } -#else - PNG_UNUSED(error_message) /* Make compiler happy */ -#endif - png_longjmp(png_ptr, 1); -} - -PNG_FUNCTION(void,PNGAPI -png_longjmp,(png_const_structrp, int),PNG_NORETURN) -{ -#ifdef PNG_SETJMP_SUPPORTED - if (png_ptr && png_ptr->longjmp_fn && png_ptr->jmp_buf_ptr) - png_ptr->longjmp_fn(*png_ptr->jmp_buf_ptr, val); -#endif - - /* Here if not setjmp support or if png_ptr is null. */ - PNG_ABORT(); -} - -#ifdef PNG_WARNINGS_SUPPORTED -/* This function is called when there is a warning, but the library thinks - * it can continue anyway. Replacement functions don't have to do anything - * here if you don't want them to. In the default configuration, png_ptr is - * not used, but it is passed in case it may be useful. - */ -static void /* PRIVATE */ -png_default_warning(png_const_structrp png_ptr, png_const_charp warning_message) -{ -#ifdef PNG_CONSOLE_IO_SUPPORTED -# ifdef PNG_ERROR_NUMBERS_SUPPORTED - if (*warning_message == PNG_LITERAL_SHARP) - { - int offset; - char warning_number[16]; - for (offset = 0; offset < 15; offset++) - { - warning_number[offset] = warning_message[offset + 1]; - if (warning_message[offset] == ' ') - break; - } - - if ((offset > 1) && (offset < 15)) - { - warning_number[offset + 1] = '\0'; - fprintf(stderr, "libpng warning no. %s: %s", - warning_number, warning_message + offset); - fprintf(stderr, PNG_STRING_NEWLINE); - } - - else - { - fprintf(stderr, "libpng warning: %s", - warning_message); - fprintf(stderr, PNG_STRING_NEWLINE); - } - } - else -# endif - - { - fprintf(stderr, "libpng warning: %s", warning_message); - fprintf(stderr, PNG_STRING_NEWLINE); - } -#else - PNG_UNUSED(warning_message) /* Make compiler happy */ -#endif - PNG_UNUSED(png_ptr) /* Make compiler happy */ -} -#endif /* PNG_WARNINGS_SUPPORTED */ - -/* This function is called when the application wants to use another method - * of handling errors and warnings. Note that the error function MUST NOT - * return to the calling routine or serious problems will occur. The return - * method used in the default routine calls longjmp(png_ptr->jmp_buf_ptr, 1) - */ -void PNGAPI -png_set_error_fn(png_structrp png_ptr, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warning_fn) -{ - if (png_ptr == NULL) - return; - - png_ptr->error_ptr = error_ptr; - png_ptr->error_fn = error_fn; -#ifdef PNG_WARNINGS_SUPPORTED - png_ptr->warning_fn = warning_fn; -#else - PNG_UNUSED(warning_fn) -#endif -} - - -/* This function returns a pointer to the error_ptr associated with the user - * functions. The application should free any memory associated with this - * pointer before png_write_destroy and png_read_destroy are called. - */ -png_voidp PNGAPI -png_get_error_ptr(png_const_structrp png_ptr) -{ - if (png_ptr == NULL) - return NULL; - - return ((png_voidp)png_ptr->error_ptr); -} - - -#ifdef PNG_ERROR_NUMBERS_SUPPORTED -void PNGAPI -png_set_strip_error_numbers(png_structrp png_ptr, png_uint_32 strip_mode) -{ - if (png_ptr != NULL) - { - png_ptr->flags &= - ((~(PNG_FLAG_STRIP_ERROR_NUMBERS | - PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode); - } -} -#endif - -#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\ - defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) - /* Currently the above both depend on SETJMP_SUPPORTED, however it would be - * possible to implement without setjmp support just so long as there is some - * way to handle the error return here: - */ -PNG_FUNCTION(void /* PRIVATE */, -png_safe_error,(png_structp png_nonconst_ptr, png_const_charp error_message), - PNG_NORETURN) -{ - const png_const_structrp png_ptr = png_nonconst_ptr; - png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr); - - /* An error is always logged here, overwriting anything (typically a warning) - * that is already there: - */ - if (image != NULL) - { - png_safecat(image->message, (sizeof image->message), 0, error_message); - image->warning_or_error |= PNG_IMAGE_ERROR; - - /* Retrieve the jmp_buf from within the png_control, making this work for - * C++ compilation too is pretty tricky: C++ wants a pointer to the first - * element of a jmp_buf, but C doesn't tell us the type of that. - */ - if (image->opaque != NULL && image->opaque->error_buf != NULL) - longjmp(png_control_jmp_buf(image->opaque), 1); - - /* Missing longjmp buffer, the following is to help debugging: */ - { - size_t pos = png_safecat(image->message, (sizeof image->message), 0, - "bad longjmp: "); - png_safecat(image->message, (sizeof image->message), pos, - error_message); - } - } - - /* Here on an internal programming error. */ - abort(); -} - -#ifdef PNG_WARNINGS_SUPPORTED -void /* PRIVATE */ -png_safe_warning(png_structp png_nonconst_ptr, png_const_charp warning_message) -{ - const png_const_structrp png_ptr = png_nonconst_ptr; - png_imagep image = png_voidcast(png_imagep, png_ptr->error_ptr); - - /* A warning is only logged if there is no prior warning or error. */ - if (image->warning_or_error == 0) - { - png_safecat(image->message, (sizeof image->message), 0, warning_message); - image->warning_or_error |= PNG_IMAGE_WARNING; - } -} -#endif - -int /* PRIVATE */ -png_safe_execute(png_imagep image_in, int (*function)(png_voidp), png_voidp arg) -{ - volatile png_imagep image = image_in; - volatile int result; - volatile png_voidp saved_error_buf; - jmp_buf safe_jmpbuf; - - /* Safely execute function(arg) with png_error returning to this function. */ - saved_error_buf = image->opaque->error_buf; - result = setjmp(safe_jmpbuf) == 0; - - if (result) - { - - image->opaque->error_buf = safe_jmpbuf; - result = function(arg); - } - - image->opaque->error_buf = saved_error_buf; - - /* And do the cleanup prior to any failure return. */ - if (!result) - png_image_free(image); - - return result; -} -#endif /* SIMPLIFIED READ/WRITE */ -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngget.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngget.c deleted file mode 100755 index 80ab055..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngget.c +++ /dev/null @@ -1,1177 +0,0 @@ - -/* pngget.c - retrieval of values from info struct - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - */ - -#include "pngpriv.h" - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) - -png_uint_32 PNGAPI -png_get_valid(png_const_structrp png_ptr, png_const_inforp info_ptr, - png_uint_32 flag) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->valid & flag); - - return(0); -} - -png_size_t PNGAPI -png_get_rowbytes(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->rowbytes); - - return(0); -} - -#ifdef PNG_INFO_IMAGE_SUPPORTED -png_bytepp PNGAPI -png_get_rows(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->row_pointers); - - return(0); -} -#endif - -#ifdef PNG_EASY_ACCESS_SUPPORTED -/* Easy access to info, added in libpng-0.99 */ -png_uint_32 PNGAPI -png_get_image_width(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return info_ptr->width; - - return (0); -} - -png_uint_32 PNGAPI -png_get_image_height(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return info_ptr->height; - - return (0); -} - -png_byte PNGAPI -png_get_bit_depth(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return info_ptr->bit_depth; - - return (0); -} - -png_byte PNGAPI -png_get_color_type(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return info_ptr->color_type; - - return (0); -} - -png_byte PNGAPI -png_get_filter_type(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return info_ptr->filter_type; - - return (0); -} - -png_byte PNGAPI -png_get_interlace_type(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return info_ptr->interlace_type; - - return (0); -} - -png_byte PNGAPI -png_get_compression_type(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return info_ptr->compression_type; - - return (0); -} - -png_uint_32 PNGAPI -png_get_x_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp - info_ptr) -{ -#ifdef PNG_pHYs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) - { - png_debug1(1, "in %s retrieval function", - "png_get_x_pixels_per_meter"); - - if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER) - return (info_ptr->x_pixels_per_unit); - } -#endif - - return (0); -} - -png_uint_32 PNGAPI -png_get_y_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp - info_ptr) -{ -#ifdef PNG_pHYs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) - { - png_debug1(1, "in %s retrieval function", - "png_get_y_pixels_per_meter"); - - if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER) - return (info_ptr->y_pixels_per_unit); - } -#endif - - return (0); -} - -png_uint_32 PNGAPI -png_get_pixels_per_meter(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ -#ifdef PNG_pHYs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) - { - png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter"); - - if (info_ptr->phys_unit_type == PNG_RESOLUTION_METER && - info_ptr->x_pixels_per_unit == info_ptr->y_pixels_per_unit) - return (info_ptr->x_pixels_per_unit); - } -#endif - - return (0); -} - -#ifdef PNG_FLOATING_POINT_SUPPORTED -float PNGAPI -png_get_pixel_aspect_ratio(png_const_structrp png_ptr, png_const_inforp - info_ptr) -{ -#ifdef PNG_READ_pHYs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) - { - png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio"); - - if (info_ptr->x_pixels_per_unit != 0) - return ((float)((float)info_ptr->y_pixels_per_unit - /(float)info_ptr->x_pixels_per_unit)); - } -#else - PNG_UNUSED(png_ptr) - PNG_UNUSED(info_ptr) -#endif - - return ((float)0.0); -} -#endif - -#ifdef PNG_FIXED_POINT_SUPPORTED -png_fixed_point PNGAPI -png_get_pixel_aspect_ratio_fixed(png_const_structrp png_ptr, - png_const_inforp info_ptr) -{ -#ifdef PNG_READ_pHYs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs) - && info_ptr->x_pixels_per_unit > 0 && info_ptr->y_pixels_per_unit > 0 - && info_ptr->x_pixels_per_unit <= PNG_UINT_31_MAX - && info_ptr->y_pixels_per_unit <= PNG_UINT_31_MAX) - { - png_fixed_point res; - - png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio_fixed"); - - /* The following casts work because a PNG 4 byte integer only has a valid - * range of 0..2^31-1; otherwise the cast might overflow. - */ - if (png_muldiv(&res, (png_int_32)info_ptr->y_pixels_per_unit, PNG_FP_1, - (png_int_32)info_ptr->x_pixels_per_unit)) - return res; - } -#else - PNG_UNUSED(png_ptr) - PNG_UNUSED(info_ptr) -#endif - - return 0; -} -#endif - -png_int_32 PNGAPI -png_get_x_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ -#ifdef PNG_oFFs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) - { - png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns"); - - if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER) - return (info_ptr->x_offset); - } -#endif - - return (0); -} - -png_int_32 PNGAPI -png_get_y_offset_microns(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ -#ifdef PNG_oFFs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) - { - png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns"); - - if (info_ptr->offset_unit_type == PNG_OFFSET_MICROMETER) - return (info_ptr->y_offset); - } -#endif - - return (0); -} - -png_int_32 PNGAPI -png_get_x_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ -#ifdef PNG_oFFs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) - { - png_debug1(1, "in %s retrieval function", "png_get_x_offset_pixels"); - - if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL) - return (info_ptr->x_offset); - } -#endif - - return (0); -} - -png_int_32 PNGAPI -png_get_y_offset_pixels(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ -#ifdef PNG_oFFs_SUPPORTED - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) - { - png_debug1(1, "in %s retrieval function", "png_get_y_offset_pixels"); - - if (info_ptr->offset_unit_type == PNG_OFFSET_PIXEL) - return (info_ptr->y_offset); - } -#endif - - return (0); -} - -#ifdef PNG_INCH_CONVERSIONS_SUPPORTED -static png_uint_32 -ppi_from_ppm(png_uint_32 ppm) -{ -#if 0 - /* The conversion is *(2.54/100), in binary (32 digits): - * .00000110100000001001110101001001 - */ - png_uint_32 t1001, t1101; - ppm >>= 1; /* .1 */ - t1001 = ppm + (ppm >> 3); /* .1001 */ - t1101 = t1001 + (ppm >> 1); /* .1101 */ - ppm >>= 20; /* .000000000000000000001 */ - t1101 += t1101 >> 15; /* .1101000000000001101 */ - t1001 >>= 11; /* .000000000001001 */ - t1001 += t1001 >> 12; /* .000000000001001000000001001 */ - ppm += t1001; /* .000000000001001000001001001 */ - ppm += t1101; /* .110100000001001110101001001 */ - return (ppm + 16) >> 5;/* .00000110100000001001110101001001 */ -#else - /* The argument is a PNG unsigned integer, so it is not permitted - * to be bigger than 2^31. - */ - png_fixed_point result; - if (ppm <= PNG_UINT_31_MAX && png_muldiv(&result, (png_int_32)ppm, 127, - 5000)) - return result; - - /* Overflow. */ - return 0; -#endif -} - -png_uint_32 PNGAPI -png_get_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - return ppi_from_ppm(png_get_pixels_per_meter(png_ptr, info_ptr)); -} - -png_uint_32 PNGAPI -png_get_x_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - return ppi_from_ppm(png_get_x_pixels_per_meter(png_ptr, info_ptr)); -} - -png_uint_32 PNGAPI -png_get_y_pixels_per_inch(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - return ppi_from_ppm(png_get_y_pixels_per_meter(png_ptr, info_ptr)); -} - -#ifdef PNG_FIXED_POINT_SUPPORTED -static png_fixed_point -png_fixed_inches_from_microns(png_const_structrp png_ptr, png_int_32 microns) -{ - /* Convert from metres * 1,000,000 to inches * 100,000, meters to - * inches is simply *(100/2.54), so we want *(10/2.54) == 500/127. - * Notice that this can overflow - a warning is output and 0 is - * returned. - */ - return png_muldiv_warn(png_ptr, microns, 500, 127); -} - -png_fixed_point PNGAPI -png_get_x_offset_inches_fixed(png_const_structrp png_ptr, - png_const_inforp info_ptr) -{ - return png_fixed_inches_from_microns(png_ptr, - png_get_x_offset_microns(png_ptr, info_ptr)); -} -#endif - -#ifdef PNG_FIXED_POINT_SUPPORTED -png_fixed_point PNGAPI -png_get_y_offset_inches_fixed(png_const_structrp png_ptr, - png_const_inforp info_ptr) -{ - return png_fixed_inches_from_microns(png_ptr, - png_get_y_offset_microns(png_ptr, info_ptr)); -} -#endif - -#ifdef PNG_FLOATING_POINT_SUPPORTED -float PNGAPI -png_get_x_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - /* To avoid the overflow do the conversion directly in floating - * point. - */ - return (float)(png_get_x_offset_microns(png_ptr, info_ptr) * .00003937); -} -#endif - -#ifdef PNG_FLOATING_POINT_SUPPORTED -float PNGAPI -png_get_y_offset_inches(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - /* To avoid the overflow do the conversion directly in floating - * point. - */ - return (float)(png_get_y_offset_microns(png_ptr, info_ptr) * .00003937); -} -#endif - -#ifdef PNG_pHYs_SUPPORTED -png_uint_32 PNGAPI -png_get_pHYs_dpi(png_const_structrp png_ptr, png_const_inforp info_ptr, - png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) -{ - png_uint_32 retval = 0; - - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) - { - png_debug1(1, "in %s retrieval function", "pHYs"); - - if (res_x != NULL) - { - *res_x = info_ptr->x_pixels_per_unit; - retval |= PNG_INFO_pHYs; - } - - if (res_y != NULL) - { - *res_y = info_ptr->y_pixels_per_unit; - retval |= PNG_INFO_pHYs; - } - - if (unit_type != NULL) - { - *unit_type = (int)info_ptr->phys_unit_type; - retval |= PNG_INFO_pHYs; - - if (*unit_type == 1) - { - if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50); - if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50); - } - } - } - - return (retval); -} -#endif /* PNG_pHYs_SUPPORTED */ -#endif /* PNG_INCH_CONVERSIONS_SUPPORTED */ - -/* png_get_channels really belongs in here, too, but it's been around longer */ - -#endif /* PNG_EASY_ACCESS_SUPPORTED */ - - -png_byte PNGAPI -png_get_channels(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->channels); - - return (0); -} - -#ifdef PNG_READ_SUPPORTED -png_const_bytep PNGAPI -png_get_signature(png_const_structrp png_ptr, png_const_inforp info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return(info_ptr->signature); - - return (NULL); -} -#endif - -#ifdef PNG_bKGD_SUPPORTED -png_uint_32 PNGAPI -png_get_bKGD(png_const_structrp png_ptr, png_inforp info_ptr, - png_color_16p *background) -{ - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) - && background != NULL) - { - png_debug1(1, "in %s retrieval function", "bKGD"); - - *background = &(info_ptr->background); - return (PNG_INFO_bKGD); - } - - return (0); -} -#endif - -#ifdef PNG_cHRM_SUPPORTED -/* The XYZ APIs were added in 1.5.5 to take advantage of the code added at the - * same time to correct the rgb grayscale coefficient defaults obtained from the - * cHRM chunk in 1.5.4 - */ -# ifdef PNG_FLOATING_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_cHRM(png_const_structrp png_ptr, png_const_inforp info_ptr, - double *white_x, double *white_y, double *red_x, double *red_y, - double *green_x, double *green_y, double *blue_x, double *blue_y) -{ - /* Quiet API change: this code used to only return the end points if a cHRM - * chunk was present, but the end points can also come from iCCP or sRGB - * chunks, so in 1.6.0 the png_get_ APIs return the end points regardless and - * the png_set_ APIs merely check that set end points are mutually - * consistent. - */ - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS)) - { - png_debug1(1, "in %s retrieval function", "cHRM"); - - if (white_x != NULL) - *white_x = png_float(png_ptr, - info_ptr->colorspace.end_points_xy.whitex, "cHRM white X"); - if (white_y != NULL) - *white_y = png_float(png_ptr, - info_ptr->colorspace.end_points_xy.whitey, "cHRM white Y"); - if (red_x != NULL) - *red_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redx, - "cHRM red X"); - if (red_y != NULL) - *red_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.redy, - "cHRM red Y"); - if (green_x != NULL) - *green_x = png_float(png_ptr, - info_ptr->colorspace.end_points_xy.greenx, "cHRM green X"); - if (green_y != NULL) - *green_y = png_float(png_ptr, - info_ptr->colorspace.end_points_xy.greeny, "cHRM green Y"); - if (blue_x != NULL) - *blue_x = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluex, - "cHRM blue X"); - if (blue_y != NULL) - *blue_y = png_float(png_ptr, info_ptr->colorspace.end_points_xy.bluey, - "cHRM blue Y"); - return (PNG_INFO_cHRM); - } - - return (0); -} - -png_uint_32 PNGAPI -png_get_cHRM_XYZ(png_const_structrp png_ptr, png_const_inforp info_ptr, - double *red_X, double *red_Y, double *red_Z, double *green_X, - double *green_Y, double *green_Z, double *blue_X, double *blue_Y, - double *blue_Z) -{ - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS)) - { - png_debug1(1, "in %s retrieval function", "cHRM_XYZ(float)"); - - if (red_X != NULL) - *red_X = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_X, - "cHRM red X"); - if (red_Y != NULL) - *red_Y = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Y, - "cHRM red Y"); - if (red_Z != NULL) - *red_Z = png_float(png_ptr, info_ptr->colorspace.end_points_XYZ.red_Z, - "cHRM red Z"); - if (green_X != NULL) - *green_X = png_float(png_ptr, - info_ptr->colorspace.end_points_XYZ.green_X, "cHRM green X"); - if (green_Y != NULL) - *green_Y = png_float(png_ptr, - info_ptr->colorspace.end_points_XYZ.green_Y, "cHRM green Y"); - if (green_Z != NULL) - *green_Z = png_float(png_ptr, - info_ptr->colorspace.end_points_XYZ.green_Z, "cHRM green Z"); - if (blue_X != NULL) - *blue_X = png_float(png_ptr, - info_ptr->colorspace.end_points_XYZ.blue_X, "cHRM blue X"); - if (blue_Y != NULL) - *blue_Y = png_float(png_ptr, - info_ptr->colorspace.end_points_XYZ.blue_Y, "cHRM blue Y"); - if (blue_Z != NULL) - *blue_Z = png_float(png_ptr, - info_ptr->colorspace.end_points_XYZ.blue_Z, "cHRM blue Z"); - return (PNG_INFO_cHRM); - } - - return (0); -} -# endif - -# ifdef PNG_FIXED_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr, - png_fixed_point *int_red_X, png_fixed_point *int_red_Y, - png_fixed_point *int_red_Z, png_fixed_point *int_green_X, - png_fixed_point *int_green_Y, png_fixed_point *int_green_Z, - png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y, - png_fixed_point *int_blue_Z) -{ - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS)) - { - png_debug1(1, "in %s retrieval function", "cHRM_XYZ"); - - if (int_red_X != NULL) - *int_red_X = info_ptr->colorspace.end_points_XYZ.red_X; - if (int_red_Y != NULL) - *int_red_Y = info_ptr->colorspace.end_points_XYZ.red_Y; - if (int_red_Z != NULL) - *int_red_Z = info_ptr->colorspace.end_points_XYZ.red_Z; - if (int_green_X != NULL) - *int_green_X = info_ptr->colorspace.end_points_XYZ.green_X; - if (int_green_Y != NULL) - *int_green_Y = info_ptr->colorspace.end_points_XYZ.green_Y; - if (int_green_Z != NULL) - *int_green_Z = info_ptr->colorspace.end_points_XYZ.green_Z; - if (int_blue_X != NULL) - *int_blue_X = info_ptr->colorspace.end_points_XYZ.blue_X; - if (int_blue_Y != NULL) - *int_blue_Y = info_ptr->colorspace.end_points_XYZ.blue_Y; - if (int_blue_Z != NULL) - *int_blue_Z = info_ptr->colorspace.end_points_XYZ.blue_Z; - return (PNG_INFO_cHRM); - } - - return (0); -} - -png_uint_32 PNGAPI -png_get_cHRM_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr, - png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x, - png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y, - png_fixed_point *blue_x, png_fixed_point *blue_y) -{ - png_debug1(1, "in %s retrieval function", "cHRM"); - - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_ENDPOINTS)) - { - if (white_x != NULL) - *white_x = info_ptr->colorspace.end_points_xy.whitex; - if (white_y != NULL) - *white_y = info_ptr->colorspace.end_points_xy.whitey; - if (red_x != NULL) - *red_x = info_ptr->colorspace.end_points_xy.redx; - if (red_y != NULL) - *red_y = info_ptr->colorspace.end_points_xy.redy; - if (green_x != NULL) - *green_x = info_ptr->colorspace.end_points_xy.greenx; - if (green_y != NULL) - *green_y = info_ptr->colorspace.end_points_xy.greeny; - if (blue_x != NULL) - *blue_x = info_ptr->colorspace.end_points_xy.bluex; - if (blue_y != NULL) - *blue_y = info_ptr->colorspace.end_points_xy.bluey; - return (PNG_INFO_cHRM); - } - - return (0); -} -# endif -#endif - -#ifdef PNG_gAMA_SUPPORTED -# ifdef PNG_FIXED_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_gAMA_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr, - png_fixed_point *file_gamma) -{ - png_debug1(1, "in %s retrieval function", "gAMA"); - - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) && - file_gamma != NULL) - { - *file_gamma = info_ptr->colorspace.gamma; - return (PNG_INFO_gAMA); - } - - return (0); -} -# endif - -# ifdef PNG_FLOATING_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_gAMA(png_const_structrp png_ptr, png_const_inforp info_ptr, - double *file_gamma) -{ - png_debug1(1, "in %s retrieval function", "gAMA(float)"); - - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) && - file_gamma != NULL) - { - *file_gamma = png_float(png_ptr, info_ptr->colorspace.gamma, - "png_get_gAMA"); - return (PNG_INFO_gAMA); - } - - return (0); -} -# endif -#endif - -#ifdef PNG_sRGB_SUPPORTED -png_uint_32 PNGAPI -png_get_sRGB(png_const_structrp png_ptr, png_const_inforp info_ptr, - int *file_srgb_intent) -{ - png_debug1(1, "in %s retrieval function", "sRGB"); - - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB) - && file_srgb_intent != NULL) - { - *file_srgb_intent = info_ptr->colorspace.rendering_intent; - return (PNG_INFO_sRGB); - } - - return (0); -} -#endif - -#ifdef PNG_iCCP_SUPPORTED -png_uint_32 PNGAPI -png_get_iCCP(png_const_structrp png_ptr, png_inforp info_ptr, - png_charpp name, int *compression_type, - png_bytepp profile, png_uint_32 *proflen) -{ - png_debug1(1, "in %s retrieval function", "iCCP"); - - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP) - && name != NULL && compression_type != NULL && profile != NULL && - proflen != NULL) - { - *name = info_ptr->iccp_name; - *profile = info_ptr->iccp_profile; - *proflen = png_get_uint_32(info_ptr->iccp_profile); - /* This is somewhat irrelevant since the profile data returned has - * actually been uncompressed. - */ - *compression_type = PNG_COMPRESSION_TYPE_BASE; - return (PNG_INFO_iCCP); - } - - return (0); -} -#endif - -#ifdef PNG_sPLT_SUPPORTED -int PNGAPI -png_get_sPLT(png_const_structrp png_ptr, png_inforp info_ptr, - png_sPLT_tpp spalettes) -{ - if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL) - { - *spalettes = info_ptr->splt_palettes; - return info_ptr->splt_palettes_num; - } - - return (0); -} -#endif - -#ifdef PNG_hIST_SUPPORTED -png_uint_32 PNGAPI -png_get_hIST(png_const_structrp png_ptr, png_inforp info_ptr, - png_uint_16p *hist) -{ - png_debug1(1, "in %s retrieval function", "hIST"); - - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) - && hist != NULL) - { - *hist = info_ptr->hist; - return (PNG_INFO_hIST); - } - - return (0); -} -#endif - -png_uint_32 PNGAPI -png_get_IHDR(png_const_structrp png_ptr, png_const_inforp info_ptr, - png_uint_32 *width, png_uint_32 *height, int *bit_depth, - int *color_type, int *interlace_type, int *compression_type, - int *filter_type) -{ - png_debug1(1, "in %s retrieval function", "IHDR"); - - if (png_ptr == NULL || info_ptr == NULL || width == NULL || - height == NULL || bit_depth == NULL || color_type == NULL) - return (0); - - *width = info_ptr->width; - *height = info_ptr->height; - *bit_depth = info_ptr->bit_depth; - *color_type = info_ptr->color_type; - - if (compression_type != NULL) - *compression_type = info_ptr->compression_type; - - if (filter_type != NULL) - *filter_type = info_ptr->filter_type; - - if (interlace_type != NULL) - *interlace_type = info_ptr->interlace_type; - - /* This is redundant if we can be sure that the info_ptr values were all - * assigned in png_set_IHDR(). We do the check anyhow in case an - * application has ignored our advice not to mess with the members - * of info_ptr directly. - */ - png_check_IHDR(png_ptr, info_ptr->width, info_ptr->height, - info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type, - info_ptr->compression_type, info_ptr->filter_type); - - return (1); -} - -#ifdef PNG_oFFs_SUPPORTED -png_uint_32 PNGAPI -png_get_oFFs(png_const_structrp png_ptr, png_const_inforp info_ptr, - png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type) -{ - png_debug1(1, "in %s retrieval function", "oFFs"); - - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs) - && offset_x != NULL && offset_y != NULL && unit_type != NULL) - { - *offset_x = info_ptr->x_offset; - *offset_y = info_ptr->y_offset; - *unit_type = (int)info_ptr->offset_unit_type; - return (PNG_INFO_oFFs); - } - - return (0); -} -#endif - -#ifdef PNG_pCAL_SUPPORTED -png_uint_32 PNGAPI -png_get_pCAL(png_const_structrp png_ptr, png_inforp info_ptr, - png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams, - png_charp *units, png_charpp *params) -{ - png_debug1(1, "in %s retrieval function", "pCAL"); - - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL) - && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL && - nparams != NULL && units != NULL && params != NULL) - { - *purpose = info_ptr->pcal_purpose; - *X0 = info_ptr->pcal_X0; - *X1 = info_ptr->pcal_X1; - *type = (int)info_ptr->pcal_type; - *nparams = (int)info_ptr->pcal_nparams; - *units = info_ptr->pcal_units; - *params = info_ptr->pcal_params; - return (PNG_INFO_pCAL); - } - - return (0); -} -#endif - -#ifdef PNG_sCAL_SUPPORTED -# ifdef PNG_FIXED_POINT_SUPPORTED -# if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \ - defined(PNG_FLOATING_POINT_SUPPORTED) -png_uint_32 PNGAPI -png_get_sCAL_fixed(png_const_structrp png_ptr, png_const_inforp info_ptr, - int *unit, png_fixed_point *width, png_fixed_point *height) -{ - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_sCAL)) - { - *unit = info_ptr->scal_unit; - /*TODO: make this work without FP support; the API is currently eliminated - * if neither floating point APIs nor internal floating point arithmetic - * are enabled. - */ - *width = png_fixed(png_ptr, atof(info_ptr->scal_s_width), "sCAL width"); - *height = png_fixed(png_ptr, atof(info_ptr->scal_s_height), - "sCAL height"); - return (PNG_INFO_sCAL); - } - - return(0); -} -# endif /* FLOATING_ARITHMETIC */ -# endif /* FIXED_POINT */ -# ifdef PNG_FLOATING_POINT_SUPPORTED -png_uint_32 PNGAPI -png_get_sCAL(png_const_structrp png_ptr, png_const_inforp info_ptr, - int *unit, double *width, double *height) -{ - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_sCAL)) - { - *unit = info_ptr->scal_unit; - *width = atof(info_ptr->scal_s_width); - *height = atof(info_ptr->scal_s_height); - return (PNG_INFO_sCAL); - } - - return(0); -} -# endif /* FLOATING POINT */ -png_uint_32 PNGAPI -png_get_sCAL_s(png_const_structrp png_ptr, png_const_inforp info_ptr, - int *unit, png_charpp width, png_charpp height) -{ - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_sCAL)) - { - *unit = info_ptr->scal_unit; - *width = info_ptr->scal_s_width; - *height = info_ptr->scal_s_height; - return (PNG_INFO_sCAL); - } - - return(0); -} -#endif /* sCAL */ - -#ifdef PNG_pHYs_SUPPORTED -png_uint_32 PNGAPI -png_get_pHYs(png_const_structrp png_ptr, png_const_inforp info_ptr, - png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type) -{ - png_uint_32 retval = 0; - - png_debug1(1, "in %s retrieval function", "pHYs"); - - if (png_ptr != NULL && info_ptr != NULL && - (info_ptr->valid & PNG_INFO_pHYs)) - { - if (res_x != NULL) - { - *res_x = info_ptr->x_pixels_per_unit; - retval |= PNG_INFO_pHYs; - } - - if (res_y != NULL) - { - *res_y = info_ptr->y_pixels_per_unit; - retval |= PNG_INFO_pHYs; - } - - if (unit_type != NULL) - { - *unit_type = (int)info_ptr->phys_unit_type; - retval |= PNG_INFO_pHYs; - } - } - - return (retval); -} -#endif /* pHYs */ - -png_uint_32 PNGAPI -png_get_PLTE(png_const_structrp png_ptr, png_inforp info_ptr, - png_colorp *palette, int *num_palette) -{ - png_debug1(1, "in %s retrieval function", "PLTE"); - - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE) - && palette != NULL) - { - *palette = info_ptr->palette; - *num_palette = info_ptr->num_palette; - png_debug1(3, "num_palette = %d", *num_palette); - return (PNG_INFO_PLTE); - } - - return (0); -} - -#ifdef PNG_sBIT_SUPPORTED -png_uint_32 PNGAPI -png_get_sBIT(png_const_structrp png_ptr, png_inforp info_ptr, - png_color_8p *sig_bit) -{ - png_debug1(1, "in %s retrieval function", "sBIT"); - - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT) - && sig_bit != NULL) - { - *sig_bit = &(info_ptr->sig_bit); - return (PNG_INFO_sBIT); - } - - return (0); -} -#endif - -#ifdef PNG_TEXT_SUPPORTED -int PNGAPI -png_get_text(png_const_structrp png_ptr, png_inforp info_ptr, - png_textp *text_ptr, int *num_text) -{ - if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0) - { - png_debug1(1, "in 0x%lx retrieval function", - (unsigned long)png_ptr->chunk_name); - - if (text_ptr != NULL) - *text_ptr = info_ptr->text; - - if (num_text != NULL) - *num_text = info_ptr->num_text; - - return info_ptr->num_text; - } - - if (num_text != NULL) - *num_text = 0; - - return(0); -} -#endif - -#ifdef PNG_tIME_SUPPORTED -png_uint_32 PNGAPI -png_get_tIME(png_const_structrp png_ptr, png_inforp info_ptr, - png_timep *mod_time) -{ - png_debug1(1, "in %s retrieval function", "tIME"); - - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME) - && mod_time != NULL) - { - *mod_time = &(info_ptr->mod_time); - return (PNG_INFO_tIME); - } - - return (0); -} -#endif - -#ifdef PNG_tRNS_SUPPORTED -png_uint_32 PNGAPI -png_get_tRNS(png_const_structrp png_ptr, png_inforp info_ptr, - png_bytep *trans_alpha, int *num_trans, png_color_16p *trans_color) -{ - png_uint_32 retval = 0; - if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) - { - png_debug1(1, "in %s retrieval function", "tRNS"); - - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (trans_alpha != NULL) - { - *trans_alpha = info_ptr->trans_alpha; - retval |= PNG_INFO_tRNS; - } - - if (trans_color != NULL) - *trans_color = &(info_ptr->trans_color); - } - - else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */ - { - if (trans_color != NULL) - { - *trans_color = &(info_ptr->trans_color); - retval |= PNG_INFO_tRNS; - } - - if (trans_alpha != NULL) - *trans_alpha = NULL; - } - - if (num_trans != NULL) - { - *num_trans = info_ptr->num_trans; - retval |= PNG_INFO_tRNS; - } - } - - return (retval); -} -#endif - -#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED -int PNGAPI -png_get_unknown_chunks(png_const_structrp png_ptr, png_inforp info_ptr, - png_unknown_chunkpp unknowns) -{ - if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL) - { - *unknowns = info_ptr->unknown_chunks; - return info_ptr->unknown_chunks_num; - } - - return (0); -} -#endif - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED -png_byte PNGAPI -png_get_rgb_to_gray_status (png_const_structrp png_ptr) -{ - return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0); -} -#endif - -#ifdef PNG_USER_CHUNKS_SUPPORTED -png_voidp PNGAPI -png_get_user_chunk_ptr(png_const_structrp png_ptr) -{ - return (png_ptr ? png_ptr->user_chunk_ptr : NULL); -} -#endif - -png_size_t PNGAPI -png_get_compression_buffer_size(png_const_structrp png_ptr) -{ - if (png_ptr == NULL) - return 0; - -# ifdef PNG_WRITE_SUPPORTED - if (png_ptr->mode & PNG_IS_READ_STRUCT) -# endif - { -# ifdef PNG_SEQUENTIAL_READ_SUPPORTED - return png_ptr->IDAT_read_size; -# else - return PNG_IDAT_READ_SIZE; -# endif - } - -# ifdef PNG_WRITE_SUPPORTED - else - return png_ptr->zbuffer_size; -# endif -} - -#ifdef PNG_SET_USER_LIMITS_SUPPORTED -/* These functions were added to libpng 1.2.6 and were enabled - * by default in libpng-1.4.0 */ -png_uint_32 PNGAPI -png_get_user_width_max (png_const_structrp png_ptr) -{ - return (png_ptr ? png_ptr->user_width_max : 0); -} - -png_uint_32 PNGAPI -png_get_user_height_max (png_const_structrp png_ptr) -{ - return (png_ptr ? png_ptr->user_height_max : 0); -} - -/* This function was added to libpng 1.4.0 */ -png_uint_32 PNGAPI -png_get_chunk_cache_max (png_const_structrp png_ptr) -{ - return (png_ptr ? png_ptr->user_chunk_cache_max : 0); -} - -/* This function was added to libpng 1.4.1 */ -png_alloc_size_t PNGAPI -png_get_chunk_malloc_max (png_const_structrp png_ptr) -{ - return (png_ptr ? png_ptr->user_chunk_malloc_max : 0); -} -#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ - -/* These functions were added to libpng 1.4.0 */ -#ifdef PNG_IO_STATE_SUPPORTED -png_uint_32 PNGAPI -png_get_io_state (png_const_structrp png_ptr) -{ - return png_ptr->io_state; -} - -png_uint_32 PNGAPI -png_get_io_chunk_type (png_const_structrp png_ptr) -{ - return png_ptr->chunk_name; -} -#endif /* ?PNG_IO_STATE_SUPPORTED */ - -#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED -# ifdef PNG_GET_PALETTE_MAX_SUPPORTED -int PNGAPI -png_get_palette_max(png_const_structp png_ptr, png_const_infop info_ptr) -{ - if (png_ptr != NULL && info_ptr != NULL) - return png_ptr->num_palette_max; - - return (-1); -} -# endif -#endif - -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pnginfo.h b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pnginfo.h deleted file mode 100755 index 898a406..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pnginfo.h +++ /dev/null @@ -1,260 +0,0 @@ - -/* pnginfo.h - header file for PNG reference library - * - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - */ - - /* png_info is a structure that holds the information in a PNG file so - * that the application can find out the characteristics of the image. - * If you are reading the file, this structure will tell you what is - * in the PNG file. If you are writing the file, fill in the information - * you want to put into the PNG file, using png_set_*() functions, then - * call png_write_info(). - * - * The names chosen should be very close to the PNG specification, so - * consult that document for information about the meaning of each field. - * - * With libpng < 0.95, it was only possible to directly set and read the - * the values in the png_info_struct, which meant that the contents and - * order of the values had to remain fixed. With libpng 0.95 and later, - * however, there are now functions that abstract the contents of - * png_info_struct from the application, so this makes it easier to use - * libpng with dynamic libraries, and even makes it possible to use - * libraries that don't have all of the libpng ancillary chunk-handing - * functionality. In libpng-1.5.0 this was moved into a separate private - * file that is not visible to applications. - * - * The following members may have allocated storage attached that should be - * cleaned up before the structure is discarded: palette, trans, text, - * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile, - * splt_palettes, scal_unit, row_pointers, and unknowns. By default, these - * are automatically freed when the info structure is deallocated, if they were - * allocated internally by libpng. This behavior can be changed by means - * of the png_data_freer() function. - * - * More allocation details: all the chunk-reading functions that - * change these members go through the corresponding png_set_* - * functions. A function to clear these members is available: see - * png_free_data(). The png_set_* functions do not depend on being - * able to point info structure members to any of the storage they are - * passed (they make their own copies), EXCEPT that the png_set_text - * functions use the same storage passed to them in the text_ptr or - * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns - * functions do not make their own copies. - */ -#ifndef PNGINFO_H -#define PNGINFO_H - -struct png_info_def -{ - /* The following are necessary for every PNG file */ - png_uint_32 width; /* width of image in pixels (from IHDR) */ - png_uint_32 height; /* height of image in pixels (from IHDR) */ - png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */ - png_size_t rowbytes; /* bytes needed to hold an untransformed row */ - png_colorp palette; /* array of color values (valid & PNG_INFO_PLTE) */ - png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */ - png_uint_16 num_trans; /* number of transparent palette color (tRNS) */ - png_byte bit_depth; /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */ - png_byte color_type; /* see PNG_COLOR_TYPE_ below (from IHDR) */ - /* The following three should have been named *_method not *_type */ - png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */ - png_byte filter_type; /* must be PNG_FILTER_TYPE_BASE (from IHDR) */ - png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ - - /* The following are set by png_set_IHDR, called from the application on - * write, but the are never actually used by the write code. - */ - png_byte channels; /* number of data channels per pixel (1, 2, 3, 4) */ - png_byte pixel_depth; /* number of bits per pixel */ - png_byte spare_byte; /* to align the data, and for future use */ - -#ifdef PNG_READ_SUPPORTED - /* This is never set during write */ - png_byte signature[8]; /* magic bytes read by libpng from start of file */ -#endif - - /* The rest of the data is optional. If you are reading, check the - * valid field to see if the information in these are valid. If you - * are writing, set the valid field to those chunks you want written, - * and initialize the appropriate fields below. - */ - -#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED) - /* png_colorspace only contains 'flags' if neither GAMMA or COLORSPACE are - * defined. When COLORSPACE is switched on all the colorspace-defining - * chunks should be enabled, when GAMMA is switched on all the gamma-defining - * chunks should be enabled. If this is not done it becomes possible to read - * inconsistent PNG files and assign a probably incorrect interpretation to - * the information. (In other words, by carefully choosing which chunks to - * recognize the system configuration can select an interpretation for PNG - * files containing ambiguous data and this will result in inconsistent - * behavior between different libpng builds!) - */ - png_colorspace colorspace; -#endif - -#ifdef PNG_iCCP_SUPPORTED - /* iCCP chunk data. */ - png_charp iccp_name; /* profile name */ - png_bytep iccp_profile; /* International Color Consortium profile data */ - png_uint_32 iccp_proflen; /* ICC profile data length */ -#endif - -#ifdef PNG_TEXT_SUPPORTED - /* The tEXt, and zTXt chunks contain human-readable textual data in - * uncompressed, compressed, and optionally compressed forms, respectively. - * The data in "text" is an array of pointers to uncompressed, - * null-terminated C strings. Each chunk has a keyword that describes the - * textual data contained in that chunk. Keywords are not required to be - * unique, and the text string may be empty. Any number of text chunks may - * be in an image. - */ - int num_text; /* number of comments read or comments to write */ - int max_text; /* current size of text array */ - png_textp text; /* array of comments read or comments to write */ -#endif /* PNG_TEXT_SUPPORTED */ - -#ifdef PNG_tIME_SUPPORTED - /* The tIME chunk holds the last time the displayed image data was - * modified. See the png_time struct for the contents of this struct. - */ - png_time mod_time; -#endif - -#ifdef PNG_sBIT_SUPPORTED - /* The sBIT chunk specifies the number of significant high-order bits - * in the pixel data. Values are in the range [1, bit_depth], and are - * only specified for the channels in the pixel data. The contents of - * the low-order bits is not specified. Data is valid if - * (valid & PNG_INFO_sBIT) is non-zero. - */ - png_color_8 sig_bit; /* significant bits in color channels */ -#endif - -#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \ -defined(PNG_READ_BACKGROUND_SUPPORTED) - /* The tRNS chunk supplies transparency data for paletted images and - * other image types that don't need a full alpha channel. There are - * "num_trans" transparency values for a paletted image, stored in the - * same order as the palette colors, starting from index 0. Values - * for the data are in the range [0, 255], ranging from fully transparent - * to fully opaque, respectively. For non-paletted images, there is a - * single color specified that should be treated as fully transparent. - * Data is valid if (valid & PNG_INFO_tRNS) is non-zero. - */ - png_bytep trans_alpha; /* alpha values for paletted image */ - png_color_16 trans_color; /* transparent color for non-palette image */ -#endif - -#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - /* The bKGD chunk gives the suggested image background color if the - * display program does not have its own background color and the image - * is needs to composited onto a background before display. The colors - * in "background" are normally in the same color space/depth as the - * pixel data. Data is valid if (valid & PNG_INFO_bKGD) is non-zero. - */ - png_color_16 background; -#endif - -#ifdef PNG_oFFs_SUPPORTED - /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards - * and downwards from the top-left corner of the display, page, or other - * application-specific co-ordinate space. See the PNG_OFFSET_ defines - * below for the unit types. Valid if (valid & PNG_INFO_oFFs) non-zero. - */ - png_int_32 x_offset; /* x offset on page */ - png_int_32 y_offset; /* y offset on page */ - png_byte offset_unit_type; /* offset units type */ -#endif - -#ifdef PNG_pHYs_SUPPORTED - /* The pHYs chunk gives the physical pixel density of the image for - * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_ - * defines below). Data is valid if (valid & PNG_INFO_pHYs) is non-zero. - */ - png_uint_32 x_pixels_per_unit; /* horizontal pixel density */ - png_uint_32 y_pixels_per_unit; /* vertical pixel density */ - png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */ -#endif - -#ifdef PNG_hIST_SUPPORTED - /* The hIST chunk contains the relative frequency or importance of the - * various palette entries, so that a viewer can intelligently select a - * reduced-color palette, if required. Data is an array of "num_palette" - * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST) - * is non-zero. - */ - png_uint_16p hist; -#endif - -#ifdef PNG_pCAL_SUPPORTED - /* The pCAL chunk describes a transformation between the stored pixel - * values and original physical data values used to create the image. - * The integer range [0, 2^bit_depth - 1] maps to the floating-point - * range given by [pcal_X0, pcal_X1], and are further transformed by a - * (possibly non-linear) transformation function given by "pcal_type" - * and "pcal_params" into "pcal_units". Please see the PNG_EQUATION_ - * defines below, and the PNG-Group's PNG extensions document for a - * complete description of the transformations and how they should be - * implemented, and for a description of the ASCII parameter strings. - * Data values are valid if (valid & PNG_INFO_pCAL) non-zero. - */ - png_charp pcal_purpose; /* pCAL chunk description string */ - png_int_32 pcal_X0; /* minimum value */ - png_int_32 pcal_X1; /* maximum value */ - png_charp pcal_units; /* Latin-1 string giving physical units */ - png_charpp pcal_params; /* ASCII strings containing parameter values */ - png_byte pcal_type; /* equation type (see PNG_EQUATION_ below) */ - png_byte pcal_nparams; /* number of parameters given in pcal_params */ -#endif - -/* New members added in libpng-1.0.6 */ - png_uint_32 free_me; /* flags items libpng is responsible for freeing */ - -#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED - /* Storage for unknown chunks that the library doesn't recognize. */ - png_unknown_chunkp unknown_chunks; - - /* The type of this field is limited by the type of - * png_struct::user_chunk_cache_max, else overflow can occur. - */ - int unknown_chunks_num; -#endif - -#ifdef PNG_sPLT_SUPPORTED - /* Data on sPLT chunks (there may be more than one). */ - png_sPLT_tp splt_palettes; - int splt_palettes_num; /* Match type returned by png_get API */ -#endif - -#ifdef PNG_sCAL_SUPPORTED - /* The sCAL chunk describes the actual physical dimensions of the - * subject matter of the graphic. The chunk contains a unit specification - * a byte value, and two ASCII strings representing floating-point - * values. The values are width and height corresponsing to one pixel - * in the image. Data values are valid if (valid & PNG_INFO_sCAL) is - * non-zero. - */ - png_byte scal_unit; /* unit of physical scale */ - png_charp scal_s_width; /* string containing height */ - png_charp scal_s_height; /* string containing width */ -#endif - -#ifdef PNG_INFO_IMAGE_SUPPORTED - /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) - non-zero */ - /* Data valid if (valid & PNG_INFO_IDAT) non-zero */ - png_bytepp row_pointers; /* the image bits */ -#endif - -}; -#endif /* PNGINFO_H */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngmem.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngmem.c deleted file mode 100755 index 43e2948..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngmem.c +++ /dev/null @@ -1,277 +0,0 @@ - -/* pngmem.c - stub functions for memory allocation - * - * Last changed in libpng 1.6.0 [February 14, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - * This file provides a location for all memory allocation. Users who - * need special memory handling are expected to supply replacement - * functions for png_malloc() and png_free(), and to use - * png_create_read_struct_2() and png_create_write_struct_2() to - * identify the replacement functions. - */ - -#include "pngpriv.h" - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) -/* Free a png_struct */ -void /* PRIVATE */ -png_destroy_png_struct(png_structrp png_ptr) -{ - if (png_ptr != NULL) - { - /* png_free might call png_error and may certainly call - * png_get_mem_ptr, so fake a temporary png_struct to support this. - */ - png_struct dummy_struct = *png_ptr; - memset(png_ptr, 0, (sizeof *png_ptr)); - png_free(&dummy_struct, png_ptr); - -# ifdef PNG_SETJMP_SUPPORTED - /* We may have a jmp_buf left to deallocate. */ - png_free_jmpbuf(&dummy_struct); -# endif - } -} - -/* Allocate memory. For reasonable files, size should never exceed - * 64K. However, zlib may allocate more then 64K if you don't tell - * it not to. See zconf.h and png.h for more information. zlib does - * need to allocate exactly 64K, so whatever you call here must - * have the ability to do that. - */ -PNG_FUNCTION(png_voidp,PNGAPI -png_calloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) -{ - png_voidp ret; - - ret = png_malloc(png_ptr, size); - - if (ret != NULL) - memset(ret, 0, size); - - return ret; -} - -/* png_malloc_base, an internal function added at libpng 1.6.0, does the work of - * allocating memory, taking into account limits and PNG_USER_MEM_SUPPORTED. - * Checking and error handling must happen outside this routine; it returns NULL - * if the allocation cannot be done (for any reason.) - */ -PNG_FUNCTION(png_voidp /* PRIVATE */, -png_malloc_base,(png_const_structrp, png_alloc_size_t size), - PNG_ALLOCATED) -{ - /* Moved to png_malloc_base from png_malloc_default in 1.6.0; the DOS - * allocators have also been removed in 1.6.0, so any 16-bit system now has - * to implement a user memory handler. This checks to be sure it isn't - * called with big numbers. - */ -#ifdef PNG_USER_MEM_SUPPORTED - PNG_UNUSED(png_ptr) -#endif - if (size > 0 && size <= PNG_SIZE_MAX -# ifdef PNG_MAX_MALLOC_64K - && size <= 65536U -# endif - ) - { -#ifdef PNG_USER_MEM_SUPPORTED - if (png_ptr != NULL && png_ptr->malloc_fn != NULL) - return png_ptr->malloc_fn(png_constcast(png_structrp,png_ptr), size); - - else -#endif - return malloc((size_t)size); /* checked for truncation above */ - } - - else - return NULL; -} - -/* This is really here only to work round a spurious warning in GCC 4.6 and 4.7 - * that arises because of the checks in png_realloc_array that are repeated in - * png_malloc_array. - */ -static png_voidp -png_malloc_array_checked(png_const_structrp png_ptr, int nelements, - size_t element_size) -{ - png_alloc_size_t req = nelements; /* known to be > 0 */ - - if (req <= PNG_SIZE_MAX/element_size) - return png_malloc_base(png_ptr, req * element_size); - - /* The failure case when the request is too large */ - return NULL; -} - -PNG_FUNCTION(png_voidp /* PRIVATE */, -png_malloc_array,(png_const_structrp png_ptr, int nelements, - size_t element_size),PNG_ALLOCATED) -{ - if (nelements <= 0 || element_size == 0) - png_error(png_ptr, "internal error: array alloc"); - - return png_malloc_array_checked(png_ptr, nelements, element_size); -} - -PNG_FUNCTION(png_voidp /* PRIVATE */, -png_realloc_array,(png_const_structrp png_ptr, png_const_voidp old_array, - int old_elements, int add_elements, size_t element_size),PNG_ALLOCATED) -{ - /* These are internal errors: */ - if (add_elements <= 0 || element_size == 0 || old_elements < 0 || - (old_array == NULL && old_elements > 0)) - png_error(png_ptr, "internal error: array realloc"); - - /* Check for overflow on the elements count (so the caller does not have to - * check.) - */ - if (add_elements <= INT_MAX - old_elements) - { - png_voidp new_array = png_malloc_array_checked(png_ptr, - old_elements+add_elements, element_size); - - if (new_array != NULL) - { - /* Because png_malloc_array worked the size calculations below cannot - * overflow. - */ - if (old_elements > 0) - memcpy(new_array, old_array, element_size*(unsigned)old_elements); - - memset((char*)new_array + element_size*(unsigned)old_elements, 0, - element_size*(unsigned)add_elements); - - return new_array; - } - } - - return NULL; /* error */ -} - -/* Various functions that have different error handling are derived from this. - * png_malloc always exists, but if PNG_USER_MEM_SUPPORTED is defined a separate - * function png_malloc_default is also provided. - */ -PNG_FUNCTION(png_voidp,PNGAPI -png_malloc,(png_const_structrp png_ptr, png_alloc_size_t size),PNG_ALLOCATED) -{ - png_voidp ret; - - if (png_ptr == NULL) - return NULL; - - ret = png_malloc_base(png_ptr, size); - - if (ret == NULL) - png_error(png_ptr, "Out of memory"); /* 'm' means png_malloc */ - - return ret; -} - -#ifdef PNG_USER_MEM_SUPPORTED -PNG_FUNCTION(png_voidp,PNGAPI -png_malloc_default,(png_const_structrp png_ptr, png_alloc_size_t size), - PNG_ALLOCATED PNG_DEPRECATED) -{ - png_voidp ret; - - if (png_ptr == NULL) - return NULL; - - /* Passing 'NULL' here bypasses the application provided memory handler. */ - ret = png_malloc_base(NULL/*use malloc*/, size); - - if (ret == NULL) - png_error(png_ptr, "Out of Memory"); /* 'M' means png_malloc_default */ - - return ret; -} -#endif /* PNG_USER_MEM_SUPPORTED */ - -/* This function was added at libpng version 1.2.3. The png_malloc_warn() - * function will issue a png_warning and return NULL instead of issuing a - * png_error, if it fails to allocate the requested memory. - */ -PNG_FUNCTION(png_voidp,PNGAPI -png_malloc_warn,(png_const_structrp png_ptr, png_alloc_size_t size), - PNG_ALLOCATED) -{ - if (png_ptr != NULL) - { - png_voidp ret = png_malloc_base(png_ptr, size); - - if (ret != NULL) - return ret; - - png_warning(png_ptr, "Out of memory"); - } - - return NULL; -} - -/* Free a pointer allocated by png_malloc(). If ptr is NULL, return - * without taking any action. - */ -void PNGAPI -png_free(png_const_structrp png_ptr, png_voidp ptr) -{ - if (png_ptr == NULL || ptr == NULL) - return; - -#ifdef PNG_USER_MEM_SUPPORTED - if (png_ptr->free_fn != NULL) - png_ptr->free_fn(png_constcast(png_structrp,png_ptr), ptr); - - else - png_free_default(png_ptr, ptr); -} - -PNG_FUNCTION(void,PNGAPI -png_free_default,(png_const_structrp png_ptr, png_voidp ptr),PNG_DEPRECATED) -{ - if (png_ptr == NULL || ptr == NULL) - return; -#endif /* PNG_USER_MEM_SUPPORTED */ - - free(ptr); -} - -#ifdef PNG_USER_MEM_SUPPORTED -/* This function is called when the application wants to use another method - * of allocating and freeing memory. - */ -void PNGAPI -png_set_mem_fn(png_structrp png_ptr, png_voidp mem_ptr, png_malloc_ptr - malloc_fn, png_free_ptr free_fn) -{ - if (png_ptr != NULL) - { - png_ptr->mem_ptr = mem_ptr; - png_ptr->malloc_fn = malloc_fn; - png_ptr->free_fn = free_fn; - } -} - -/* This function returns a pointer to the mem_ptr associated with the user - * functions. The application should free any memory associated with this - * pointer before png_write_destroy and png_read_destroy are called. - */ -png_voidp PNGAPI -png_get_mem_ptr(png_const_structrp png_ptr) -{ - if (png_ptr == NULL) - return NULL; - - return png_ptr->mem_ptr; -} -#endif /* PNG_USER_MEM_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpread.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpread.c deleted file mode 100755 index a133331..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpread.c +++ /dev/null @@ -1,1291 +0,0 @@ - -/* pngpread.c - read a png file in push mode - * - * Last changed in libpng 1.6.0 [February 14, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - */ - -#include "pngpriv.h" - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED - -/* Push model modes */ -#define PNG_READ_SIG_MODE 0 -#define PNG_READ_CHUNK_MODE 1 -#define PNG_READ_IDAT_MODE 2 -#define PNG_SKIP_MODE 3 -#define PNG_READ_tEXt_MODE 4 -#define PNG_READ_zTXt_MODE 5 -#define PNG_READ_DONE_MODE 6 -#define PNG_READ_iTXt_MODE 7 -#define PNG_ERROR_MODE 8 - -void PNGAPI -png_process_data(png_structrp png_ptr, png_inforp info_ptr, - png_bytep buffer, png_size_t buffer_size) -{ - if (png_ptr == NULL || info_ptr == NULL) - return; - - png_push_restore_buffer(png_ptr, buffer, buffer_size); - - while (png_ptr->buffer_size) - { - png_process_some_data(png_ptr, info_ptr); - } -} - -png_size_t PNGAPI -png_process_data_pause(png_structrp png_ptr, int save) -{ - if (png_ptr != NULL) - { - /* It's easiest for the caller if we do the save, then the caller doesn't - * have to supply the same data again: - */ - if (save) - png_push_save_buffer(png_ptr); - else - { - /* This includes any pending saved bytes: */ - png_size_t remaining = png_ptr->buffer_size; - png_ptr->buffer_size = 0; - - /* So subtract the saved buffer size, unless all the data - * is actually 'saved', in which case we just return 0 - */ - if (png_ptr->save_buffer_size < remaining) - return remaining - png_ptr->save_buffer_size; - } - } - - return 0; -} - -png_uint_32 PNGAPI -png_process_data_skip(png_structrp png_ptr) -{ - png_uint_32 remaining = 0; - - if (png_ptr != NULL && png_ptr->process_mode == PNG_SKIP_MODE && - png_ptr->skip_length > 0) - { - /* At the end of png_process_data the buffer size must be 0 (see the loop - * above) so we can detect a broken call here: - */ - if (png_ptr->buffer_size != 0) - png_error(png_ptr, - "png_process_data_skip called inside png_process_data"); - - /* If is impossible for there to be a saved buffer at this point - - * otherwise we could not be in SKIP mode. This will also happen if - * png_process_skip is called inside png_process_data (but only very - * rarely.) - */ - if (png_ptr->save_buffer_size != 0) - png_error(png_ptr, "png_process_data_skip called with saved data"); - - remaining = png_ptr->skip_length; - png_ptr->skip_length = 0; - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - } - - return remaining; -} - -/* What we do with the incoming data depends on what we were previously - * doing before we ran out of data... - */ -void /* PRIVATE */ -png_process_some_data(png_structrp png_ptr, png_inforp info_ptr) -{ - if (png_ptr == NULL) - return; - - switch (png_ptr->process_mode) - { - case PNG_READ_SIG_MODE: - { - png_push_read_sig(png_ptr, info_ptr); - break; - } - - case PNG_READ_CHUNK_MODE: - { - png_push_read_chunk(png_ptr, info_ptr); - break; - } - - case PNG_READ_IDAT_MODE: - { - png_push_read_IDAT(png_ptr); - break; - } - - case PNG_SKIP_MODE: - { - png_push_crc_finish(png_ptr); - break; - } - - default: - { - png_ptr->buffer_size = 0; - break; - } - } -} - -/* Read any remaining signature bytes from the stream and compare them with - * the correct PNG signature. It is possible that this routine is called - * with bytes already read from the signature, either because they have been - * checked by the calling application, or because of multiple calls to this - * routine. - */ -void /* PRIVATE */ -png_push_read_sig(png_structrp png_ptr, png_inforp info_ptr) -{ - png_size_t num_checked = png_ptr->sig_bytes, - num_to_check = 8 - num_checked; - - if (png_ptr->buffer_size < num_to_check) - { - num_to_check = png_ptr->buffer_size; - } - - png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]), - num_to_check); - png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes + num_to_check); - - if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) - { - if (num_checked < 4 && - png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) - png_error(png_ptr, "Not a PNG file"); - - else - png_error(png_ptr, "PNG file corrupted by ASCII conversion"); - } - else - { - if (png_ptr->sig_bytes >= 8) - { - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - } - } -} - -void /* PRIVATE */ -png_push_read_chunk(png_structrp png_ptr, png_inforp info_ptr) -{ - png_uint_32 chunk_name; -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - int keep; /* unknown handling method */ -#endif - - /* First we make sure we have enough data for the 4 byte chunk name - * and the 4 byte chunk length before proceeding with decoding the - * chunk data. To fully decode each of these chunks, we also make - * sure we have enough data in the buffer for the 4 byte CRC at the - * end of every chunk (except IDAT, which is handled separately). - */ - if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) - { - png_byte chunk_length[4]; - png_byte chunk_tag[4]; - - if (png_ptr->buffer_size < 8) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_fill_buffer(png_ptr, chunk_length, 4); - png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); - png_reset_crc(png_ptr); - png_crc_read(png_ptr, chunk_tag, 4); - png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag); - png_check_chunk_name(png_ptr, png_ptr->chunk_name); - png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; - } - - chunk_name = png_ptr->chunk_name; - - if (chunk_name == png_IDAT) - { - if (png_ptr->mode & PNG_AFTER_IDAT) - png_ptr->mode |= PNG_HAVE_CHUNK_AFTER_IDAT; - - /* If we reach an IDAT chunk, this means we have read all of the - * header chunks, and we can start reading the image (or if this - * is called after the image has been read - we have an error). - */ - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_error(png_ptr, "Missing IHDR before IDAT"); - - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) - png_error(png_ptr, "Missing PLTE before IDAT"); - - png_ptr->mode |= PNG_HAVE_IDAT; - - if (!(png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) - if (png_ptr->push_length == 0) - return; - - if (png_ptr->mode & PNG_AFTER_IDAT) - png_benign_error(png_ptr, "Too many IDATs found"); - } - - if (chunk_name == png_IHDR) - { - if (png_ptr->push_length != 13) - png_error(png_ptr, "Invalid IHDR length"); - - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length); - } - - else if (chunk_name == png_IEND) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length); - - png_ptr->process_mode = PNG_READ_DONE_MODE; - png_push_have_end(png_ptr, info_ptr); - } - -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length, keep); - - if (chunk_name == png_PLTE) - png_ptr->mode |= PNG_HAVE_PLTE; - } - -#endif - else if (chunk_name == png_PLTE) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length); - } - - else if (chunk_name == png_IDAT) - { - png_ptr->idat_size = png_ptr->push_length; - png_ptr->process_mode = PNG_READ_IDAT_MODE; - png_push_have_info(png_ptr, info_ptr); - png_ptr->zstream.avail_out = - (uInt) PNG_ROWBYTES(png_ptr->pixel_depth, - png_ptr->iwidth) + 1; - png_ptr->zstream.next_out = png_ptr->row_buf; - return; - } - -#ifdef PNG_READ_gAMA_SUPPORTED - else if (png_ptr->chunk_name == png_gAMA) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_sBIT_SUPPORTED - else if (png_ptr->chunk_name == png_sBIT) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_cHRM_SUPPORTED - else if (png_ptr->chunk_name == png_cHRM) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_sRGB_SUPPORTED - else if (chunk_name == png_sRGB) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_iCCP_SUPPORTED - else if (png_ptr->chunk_name == png_iCCP) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_sPLT_SUPPORTED - else if (chunk_name == png_sPLT) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_tRNS_SUPPORTED - else if (chunk_name == png_tRNS) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_bKGD_SUPPORTED - else if (chunk_name == png_bKGD) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_hIST_SUPPORTED - else if (chunk_name == png_hIST) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_pHYs_SUPPORTED - else if (chunk_name == png_pHYs) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_oFFs_SUPPORTED - else if (chunk_name == png_oFFs) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length); - } -#endif - -#ifdef PNG_READ_pCAL_SUPPORTED - else if (chunk_name == png_pCAL) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_sCAL_SUPPORTED - else if (chunk_name == png_sCAL) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_tIME_SUPPORTED - else if (chunk_name == png_tIME) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_tEXt_SUPPORTED - else if (chunk_name == png_tEXt) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_zTXt_SUPPORTED - else if (chunk_name == png_zTXt) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif -#ifdef PNG_READ_iTXt_SUPPORTED - else if (chunk_name == png_iTXt) - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - - png_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length); - } - -#endif - else - { - if (png_ptr->push_length + 4 > png_ptr->buffer_size) - { - png_push_save_buffer(png_ptr); - return; - } - png_handle_unknown(png_ptr, info_ptr, png_ptr->push_length, - PNG_HANDLE_CHUNK_AS_DEFAULT); - } - - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; -} - -void /* PRIVATE */ -png_push_crc_skip(png_structrp png_ptr, png_uint_32 skip) -{ - png_ptr->process_mode = PNG_SKIP_MODE; - png_ptr->skip_length = skip; -} - -void /* PRIVATE */ -png_push_crc_finish(png_structrp png_ptr) -{ - if (png_ptr->skip_length && png_ptr->save_buffer_size) - { - png_size_t save_size = png_ptr->save_buffer_size; - png_uint_32 skip_length = png_ptr->skip_length; - - /* We want the smaller of 'skip_length' and 'save_buffer_size', but - * they are of different types and we don't know which variable has the - * fewest bits. Carefully select the smaller and cast it to the type of - * the larger - this cannot overflow. Do not cast in the following test - * - it will break on either 16 or 64 bit platforms. - */ - if (skip_length < save_size) - save_size = (png_size_t)skip_length; - - else - skip_length = (png_uint_32)save_size; - - png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); - - png_ptr->skip_length -= skip_length; - png_ptr->buffer_size -= save_size; - png_ptr->save_buffer_size -= save_size; - png_ptr->save_buffer_ptr += save_size; - } - if (png_ptr->skip_length && png_ptr->current_buffer_size) - { - png_size_t save_size = png_ptr->current_buffer_size; - png_uint_32 skip_length = png_ptr->skip_length; - - /* We want the smaller of 'skip_length' and 'current_buffer_size', here, - * the same problem exists as above and the same solution. - */ - if (skip_length < save_size) - save_size = (png_size_t)skip_length; - - else - skip_length = (png_uint_32)save_size; - - png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); - - png_ptr->skip_length -= skip_length; - png_ptr->buffer_size -= save_size; - png_ptr->current_buffer_size -= save_size; - png_ptr->current_buffer_ptr += save_size; - } - if (!png_ptr->skip_length) - { - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_crc_finish(png_ptr, 0); - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - } -} - -void PNGCBAPI -png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length) -{ - png_bytep ptr; - - if (png_ptr == NULL) - return; - - ptr = buffer; - if (png_ptr->save_buffer_size) - { - png_size_t save_size; - - if (length < png_ptr->save_buffer_size) - save_size = length; - - else - save_size = png_ptr->save_buffer_size; - - memcpy(ptr, png_ptr->save_buffer_ptr, save_size); - length -= save_size; - ptr += save_size; - png_ptr->buffer_size -= save_size; - png_ptr->save_buffer_size -= save_size; - png_ptr->save_buffer_ptr += save_size; - } - if (length && png_ptr->current_buffer_size) - { - png_size_t save_size; - - if (length < png_ptr->current_buffer_size) - save_size = length; - - else - save_size = png_ptr->current_buffer_size; - - memcpy(ptr, png_ptr->current_buffer_ptr, save_size); - png_ptr->buffer_size -= save_size; - png_ptr->current_buffer_size -= save_size; - png_ptr->current_buffer_ptr += save_size; - } -} - -void /* PRIVATE */ -png_push_save_buffer(png_structrp png_ptr) -{ - if (png_ptr->save_buffer_size) - { - if (png_ptr->save_buffer_ptr != png_ptr->save_buffer) - { - png_size_t i, istop; - png_bytep sp; - png_bytep dp; - - istop = png_ptr->save_buffer_size; - for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer; - i < istop; i++, sp++, dp++) - { - *dp = *sp; - } - } - } - if (png_ptr->save_buffer_size + png_ptr->current_buffer_size > - png_ptr->save_buffer_max) - { - png_size_t new_max; - png_bytep old_buffer; - - if (png_ptr->save_buffer_size > PNG_SIZE_MAX - - (png_ptr->current_buffer_size + 256)) - { - png_error(png_ptr, "Potential overflow of save_buffer"); - } - - new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256; - old_buffer = png_ptr->save_buffer; - png_ptr->save_buffer = (png_bytep)png_malloc_warn(png_ptr, - (png_size_t)new_max); - - if (png_ptr->save_buffer == NULL) - { - png_free(png_ptr, old_buffer); - png_error(png_ptr, "Insufficient memory for save_buffer"); - } - - memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size); - png_free(png_ptr, old_buffer); - png_ptr->save_buffer_max = new_max; - } - if (png_ptr->current_buffer_size) - { - memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size, - png_ptr->current_buffer_ptr, png_ptr->current_buffer_size); - png_ptr->save_buffer_size += png_ptr->current_buffer_size; - png_ptr->current_buffer_size = 0; - } - png_ptr->save_buffer_ptr = png_ptr->save_buffer; - png_ptr->buffer_size = 0; -} - -void /* PRIVATE */ -png_push_restore_buffer(png_structrp png_ptr, png_bytep buffer, - png_size_t buffer_length) -{ - png_ptr->current_buffer = buffer; - png_ptr->current_buffer_size = buffer_length; - png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size; - png_ptr->current_buffer_ptr = png_ptr->current_buffer; -} - -void /* PRIVATE */ -png_push_read_IDAT(png_structrp png_ptr) -{ - if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER)) - { - png_byte chunk_length[4]; - png_byte chunk_tag[4]; - - /* TODO: this code can be commoned up with the same code in push_read */ - if (png_ptr->buffer_size < 8) - { - png_push_save_buffer(png_ptr); - return; - } - - png_push_fill_buffer(png_ptr, chunk_length, 4); - png_ptr->push_length = png_get_uint_31(png_ptr, chunk_length); - png_reset_crc(png_ptr); - png_crc_read(png_ptr, chunk_tag, 4); - png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(chunk_tag); - png_ptr->mode |= PNG_HAVE_CHUNK_HEADER; - - if (png_ptr->chunk_name != png_IDAT) - { - png_ptr->process_mode = PNG_READ_CHUNK_MODE; - - if (!(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED)) - png_error(png_ptr, "Not enough compressed data"); - - return; - } - - png_ptr->idat_size = png_ptr->push_length; - } - - if (png_ptr->idat_size && png_ptr->save_buffer_size) - { - png_size_t save_size = png_ptr->save_buffer_size; - png_uint_32 idat_size = png_ptr->idat_size; - - /* We want the smaller of 'idat_size' and 'current_buffer_size', but they - * are of different types and we don't know which variable has the fewest - * bits. Carefully select the smaller and cast it to the type of the - * larger - this cannot overflow. Do not cast in the following test - it - * will break on either 16 or 64 bit platforms. - */ - if (idat_size < save_size) - save_size = (png_size_t)idat_size; - - else - idat_size = (png_uint_32)save_size; - - png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size); - - png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size); - - png_ptr->idat_size -= idat_size; - png_ptr->buffer_size -= save_size; - png_ptr->save_buffer_size -= save_size; - png_ptr->save_buffer_ptr += save_size; - } - - if (png_ptr->idat_size && png_ptr->current_buffer_size) - { - png_size_t save_size = png_ptr->current_buffer_size; - png_uint_32 idat_size = png_ptr->idat_size; - - /* We want the smaller of 'idat_size' and 'current_buffer_size', but they - * are of different types and we don't know which variable has the fewest - * bits. Carefully select the smaller and cast it to the type of the - * larger - this cannot overflow. - */ - if (idat_size < save_size) - save_size = (png_size_t)idat_size; - - else - idat_size = (png_uint_32)save_size; - - png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size); - - png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size); - - png_ptr->idat_size -= idat_size; - png_ptr->buffer_size -= save_size; - png_ptr->current_buffer_size -= save_size; - png_ptr->current_buffer_ptr += save_size; - } - if (!png_ptr->idat_size) - { - if (png_ptr->buffer_size < 4) - { - png_push_save_buffer(png_ptr); - return; - } - - png_crc_finish(png_ptr, 0); - png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER; - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->zowner = 0; - } -} - -void /* PRIVATE */ -png_process_IDAT_data(png_structrp png_ptr, png_bytep buffer, - png_size_t buffer_length) -{ - /* The caller checks for a non-zero buffer length. */ - if (!(buffer_length > 0) || buffer == NULL) - png_error(png_ptr, "No IDAT data (internal error)"); - - /* This routine must process all the data it has been given - * before returning, calling the row callback as required to - * handle the uncompressed results. - */ - png_ptr->zstream.next_in = buffer; - /* TODO: WARNING: TRUNCATION ERROR: DANGER WILL ROBINSON: */ - png_ptr->zstream.avail_in = (uInt)buffer_length; - - /* Keep going until the decompressed data is all processed - * or the stream marked as finished. - */ - while (png_ptr->zstream.avail_in > 0 && - !(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED)) - { - int ret; - - /* We have data for zlib, but we must check that zlib - * has someplace to put the results. It doesn't matter - * if we don't expect any results -- it may be the input - * data is just the LZ end code. - */ - if (!(png_ptr->zstream.avail_out > 0)) - { - /* TODO: WARNING: TRUNCATION ERROR: DANGER WILL ROBINSON: */ - png_ptr->zstream.avail_out = (uInt)(PNG_ROWBYTES(png_ptr->pixel_depth, - png_ptr->iwidth) + 1); - - png_ptr->zstream.next_out = png_ptr->row_buf; - } - - /* Using Z_SYNC_FLUSH here means that an unterminated - * LZ stream (a stream with a missing end code) can still - * be handled, otherwise (Z_NO_FLUSH) a future zlib - * implementation might defer output and therefore - * change the current behavior (see comments in inflate.c - * for why this doesn't happen at present with zlib 1.2.5). - */ - ret = inflate(&png_ptr->zstream, Z_SYNC_FLUSH); - - /* Check for any failure before proceeding. */ - if (ret != Z_OK && ret != Z_STREAM_END) - { - /* Terminate the decompression. */ - png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; - png_ptr->zowner = 0; - - /* This may be a truncated stream (missing or - * damaged end code). Treat that as a warning. - */ - if (png_ptr->row_number >= png_ptr->num_rows || - png_ptr->pass > 6) - png_warning(png_ptr, "Truncated compressed data in IDAT"); - - else - png_error(png_ptr, "Decompression error in IDAT"); - - /* Skip the check on unprocessed input */ - return; - } - - /* Did inflate output any data? */ - if (png_ptr->zstream.next_out != png_ptr->row_buf) - { - /* Is this unexpected data after the last row? - * If it is, artificially terminate the LZ output - * here. - */ - if (png_ptr->row_number >= png_ptr->num_rows || - png_ptr->pass > 6) - { - /* Extra data. */ - png_warning(png_ptr, "Extra compressed data in IDAT"); - png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; - png_ptr->zowner = 0; - - /* Do no more processing; skip the unprocessed - * input check below. - */ - return; - } - - /* Do we have a complete row? */ - if (png_ptr->zstream.avail_out == 0) - png_push_process_row(png_ptr); - } - - /* And check for the end of the stream. */ - if (ret == Z_STREAM_END) - png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; - } - - /* All the data should have been processed, if anything - * is left at this point we have bytes of IDAT data - * after the zlib end code. - */ - if (png_ptr->zstream.avail_in > 0) - png_warning(png_ptr, "Extra compression data in IDAT"); -} - -void /* PRIVATE */ -png_push_process_row(png_structrp png_ptr) -{ - /* 1.5.6: row_info moved out of png_struct to a local here. */ - png_row_info row_info; - - row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */ - row_info.color_type = png_ptr->color_type; - row_info.bit_depth = png_ptr->bit_depth; - row_info.channels = png_ptr->channels; - row_info.pixel_depth = png_ptr->pixel_depth; - row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width); - - if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE) - { - if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST) - png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1, - png_ptr->prev_row + 1, png_ptr->row_buf[0]); - else - png_error(png_ptr, "bad adaptive filter value"); - } - - /* libpng 1.5.6: the following line was copying png_ptr->rowbytes before - * 1.5.6, while the buffer really is this big in current versions of libpng - * it may not be in the future, so this was changed just to copy the - * interlaced row count: - */ - memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1); - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED - if (png_ptr->transformations) - png_do_read_transformations(png_ptr, &row_info); -#endif - - /* The transformed pixel depth should match the depth now in row_info. */ - if (png_ptr->transformed_pixel_depth == 0) - { - png_ptr->transformed_pixel_depth = row_info.pixel_depth; - if (row_info.pixel_depth > png_ptr->maximum_pixel_depth) - png_error(png_ptr, "progressive row overflow"); - } - - else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth) - png_error(png_ptr, "internal progressive row size calculation error"); - - -#ifdef PNG_READ_INTERLACING_SUPPORTED - /* Blow up interlaced rows to full size */ - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) - { - if (png_ptr->pass < 6) - png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass, - png_ptr->transformations); - - switch (png_ptr->pass) - { - case 0: - { - int i; - for (i = 0; i < 8 && png_ptr->pass == 0; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); /* Updates png_ptr->pass */ - } - - if (png_ptr->pass == 2) /* Pass 1 might be empty */ - { - for (i = 0; i < 4 && png_ptr->pass == 2; i++) - { - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - } - - if (png_ptr->pass == 4 && png_ptr->height <= 4) - { - for (i = 0; i < 2 && png_ptr->pass == 4; i++) - { - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - } - - if (png_ptr->pass == 6 && png_ptr->height <= 4) - { - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - - break; - } - - case 1: - { - int i; - for (i = 0; i < 8 && png_ptr->pass == 1; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } - - if (png_ptr->pass == 2) /* Skip top 4 generated rows */ - { - for (i = 0; i < 4 && png_ptr->pass == 2; i++) - { - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - } - - break; - } - - case 2: - { - int i; - - for (i = 0; i < 4 && png_ptr->pass == 2; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } - - for (i = 0; i < 4 && png_ptr->pass == 2; i++) - { - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - - if (png_ptr->pass == 4) /* Pass 3 might be empty */ - { - for (i = 0; i < 2 && png_ptr->pass == 4; i++) - { - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - } - - break; - } - - case 3: - { - int i; - - for (i = 0; i < 4 && png_ptr->pass == 3; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } - - if (png_ptr->pass == 4) /* Skip top two generated rows */ - { - for (i = 0; i < 2 && png_ptr->pass == 4; i++) - { - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - } - - break; - } - - case 4: - { - int i; - - for (i = 0; i < 2 && png_ptr->pass == 4; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } - - for (i = 0; i < 2 && png_ptr->pass == 4; i++) - { - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - - if (png_ptr->pass == 6) /* Pass 5 might be empty */ - { - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - - break; - } - - case 5: - { - int i; - - for (i = 0; i < 2 && png_ptr->pass == 5; i++) - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } - - if (png_ptr->pass == 6) /* Skip top generated row */ - { - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - - break; - } - - default: - case 6: - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - - if (png_ptr->pass != 6) - break; - - png_push_have_row(png_ptr, NULL); - png_read_push_finish_row(png_ptr); - } - } - } - else -#endif - { - png_push_have_row(png_ptr, png_ptr->row_buf + 1); - png_read_push_finish_row(png_ptr); - } -} - -void /* PRIVATE */ -png_read_push_finish_row(png_structrp png_ptr) -{ -#ifdef PNG_READ_INTERLACING_SUPPORTED - /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* Start of interlace block */ - static PNG_CONST png_byte png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; - - /* Offset to next interlace block */ - static PNG_CONST png_byte png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; - - /* Start of interlace block in the y direction */ - static PNG_CONST png_byte png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1}; - - /* Offset to next interlace block in the y direction */ - static PNG_CONST png_byte png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2}; - - /* Height of interlace block. This is not currently used - if you need - * it, uncomment it here and in png.h - static PNG_CONST png_byte png_pass_height[] = {8, 8, 4, 4, 2, 2, 1}; - */ -#endif - - png_ptr->row_number++; - if (png_ptr->row_number < png_ptr->num_rows) - return; - -#ifdef PNG_READ_INTERLACING_SUPPORTED - if (png_ptr->interlaced) - { - png_ptr->row_number = 0; - memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); - - do - { - png_ptr->pass++; - if ((png_ptr->pass == 1 && png_ptr->width < 5) || - (png_ptr->pass == 3 && png_ptr->width < 3) || - (png_ptr->pass == 5 && png_ptr->width < 2)) - png_ptr->pass++; - - if (png_ptr->pass > 7) - png_ptr->pass--; - - if (png_ptr->pass >= 7) - break; - - png_ptr->iwidth = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; - - if (png_ptr->transformations & PNG_INTERLACE) - break; - - png_ptr->num_rows = (png_ptr->height + - png_pass_yinc[png_ptr->pass] - 1 - - png_pass_ystart[png_ptr->pass]) / - png_pass_yinc[png_ptr->pass]; - - } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0); - } -#endif /* PNG_READ_INTERLACING_SUPPORTED */ -} - -void /* PRIVATE */ -png_push_have_info(png_structrp png_ptr, png_inforp info_ptr) -{ - if (png_ptr->info_fn != NULL) - (*(png_ptr->info_fn))(png_ptr, info_ptr); -} - -void /* PRIVATE */ -png_push_have_end(png_structrp png_ptr, png_inforp info_ptr) -{ - if (png_ptr->end_fn != NULL) - (*(png_ptr->end_fn))(png_ptr, info_ptr); -} - -void /* PRIVATE */ -png_push_have_row(png_structrp png_ptr, png_bytep row) -{ - if (png_ptr->row_fn != NULL) - (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number, - (int)png_ptr->pass); -} - -#ifdef PNG_READ_INTERLACING_SUPPORTED -void PNGAPI -png_progressive_combine_row(png_const_structrp png_ptr, png_bytep old_row, - png_const_bytep new_row) -{ - if (png_ptr == NULL) - return; - - /* new_row is a flag here - if it is NULL then the app callback was called - * from an empty row (see the calls to png_struct::row_fn below), otherwise - * it must be png_ptr->row_buf+1 - */ - if (new_row != NULL) - png_combine_row(png_ptr, old_row, 1/*display*/); -} -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - -void PNGAPI -png_set_progressive_read_fn(png_structrp png_ptr, png_voidp progressive_ptr, - png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, - png_progressive_end_ptr end_fn) -{ - if (png_ptr == NULL) - return; - - png_ptr->info_fn = info_fn; - png_ptr->row_fn = row_fn; - png_ptr->end_fn = end_fn; - - png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer); -} - -png_voidp PNGAPI -png_get_progressive_ptr(png_const_structrp png_ptr) -{ - if (png_ptr == NULL) - return (NULL); - - return png_ptr->io_ptr; -} -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpriv.h b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpriv.h deleted file mode 100755 index a93a877..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngpriv.h +++ /dev/null @@ -1,1904 +0,0 @@ - -/* pngpriv.h - private declarations for use inside libpng - * - * For conditions of distribution and use, see copyright notice in png.h - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - */ - -/* The symbols declared in this file (including the functions declared - * as extern) are PRIVATE. They are not part of the libpng public - * interface, and are not recommended for use by regular applications. - * Some of them may become public in the future; others may stay private, - * change in an incompatible way, or even disappear. - * Although the libpng users are not forbidden to include this header, - * they should be well aware of the issues that may arise from doing so. - */ - -#ifndef PNGPRIV_H -#define PNGPRIV_H - -/* Feature Test Macros. The following are defined here to ensure that correctly - * implemented libraries reveal the APIs libpng needs to build and hide those - * that are not needed and potentially damaging to the compilation. - * - * Feature Test Macros must be defined before any system header is included (see - * POSIX 1003.1 2.8.2 "POSIX Symbols." - * - * These macros only have an effect if the operating system supports either - * POSIX 1003.1 or C99, or both. On other operating systems (particularly - * Windows/Visual Studio) there is no effect; the OS specific tests below are - * still required (as of 2011-05-02.) - */ -#define _POSIX_SOURCE 1 /* Just the POSIX 1003.1 and C89 APIs */ - -#ifndef PNG_VERSION_INFO_ONLY -/* Standard library headers not required by png.h: */ -# include -# include -#endif - -#define PNGLIB_BUILD /*libpng is being built, not used*/ - -/* If HAVE_CONFIG_H is defined during the build then the build system must - * provide an appropriate "config.h" file on the include path. The header file - * must provide definitions as required below (search for "HAVE_CONFIG_H"); - * see configure.ac for more details of the requirements. The macro - * "PNG_NO_CONFIG_H" is provided for maintainers to test for dependencies on - * 'configure'; define this macro to prevent the configure build including the - * configure generated config.h. Libpng is expected to compile without *any* - * special build system support on a reasonably ANSI-C compliant system. - */ -#if defined(HAVE_CONFIG_H) && !defined(PNG_NO_CONFIG_H) -# include - - /* Pick up the definition of 'restrict' from config.h if it was read: */ -# define PNG_RESTRICT restrict -#endif - -/* To support symbol prefixing it is necessary to know *before* including png.h - * whether the fixed point (and maybe other) APIs are exported, because if they - * are not internal definitions may be required. This is handled below just - * before png.h is included, but load the configuration now if it is available. - */ -#ifndef PNGLCONF_H -# include "pnglibconf.h" -#endif - -/* Local renames may change non-exported API functions from png.h */ -#if defined(PNG_PREFIX) && !defined(PNGPREFIX_H) -# include "pngprefix.h" -#endif - -#ifdef PNG_USER_CONFIG -# include "pngusr.h" - /* These should have been defined in pngusr.h */ -# ifndef PNG_USER_PRIVATEBUILD -# define PNG_USER_PRIVATEBUILD "Custom libpng build" -# endif -# ifndef PNG_USER_DLLFNAME_POSTFIX -# define PNG_USER_DLLFNAME_POSTFIX "Cb" -# endif -#endif - -/* Is this a build of a DLL where compilation of the object modules requires - * different preprocessor settings to those required for a simple library? If - * so PNG_BUILD_DLL must be set. - * - * If libpng is used inside a DLL but that DLL does not export the libpng APIs - * PNG_BUILD_DLL must not be set. To avoid the code below kicking in build a - * static library of libpng then link the DLL against that. - */ -#ifndef PNG_BUILD_DLL -# ifdef DLL_EXPORT - /* This is set by libtool when files are compiled for a DLL; libtool - * always compiles twice, even on systems where it isn't necessary. Set - * PNG_BUILD_DLL in case it is necessary: - */ -# define PNG_BUILD_DLL -# else -# ifdef _WINDLL - /* This is set by the Microsoft Visual Studio IDE in projects that - * build a DLL. It can't easily be removed from those projects (it - * isn't visible in the Visual Studio UI) so it is a fairly reliable - * indication that PNG_IMPEXP needs to be set to the DLL export - * attributes. - */ -# define PNG_BUILD_DLL -# else -# ifdef __DLL__ - /* This is set by the Borland C system when compiling for a DLL - * (as above.) - */ -# define PNG_BUILD_DLL -# else - /* Add additional compiler cases here. */ -# endif -# endif -# endif -#endif /* Setting PNG_BUILD_DLL if required */ - -/* See pngconf.h for more details: the builder of the library may set this on - * the command line to the right thing for the specific compilation system or it - * may be automagically set above (at present we know of no system where it does - * need to be set on the command line.) - * - * PNG_IMPEXP must be set here when building the library to prevent pngconf.h - * setting it to the "import" setting for a DLL build. - */ -#ifndef PNG_IMPEXP -# ifdef PNG_BUILD_DLL -# define PNG_IMPEXP PNG_DLL_EXPORT -# else - /* Not building a DLL, or the DLL doesn't require specific export - * definitions. - */ -# define PNG_IMPEXP -# endif -#endif - -/* No warnings for private or deprecated functions in the build: */ -#ifndef PNG_DEPRECATED -# define PNG_DEPRECATED -#endif -#ifndef PNG_PRIVATE -# define PNG_PRIVATE -#endif - -/* Symbol preprocessing support. - * - * To enable listing global, but internal, symbols the following macros should - * always be used to declare an extern data or function object in this file. - */ -#ifndef PNG_INTERNAL_DATA -# define PNG_INTERNAL_DATA(type, name, array) extern type name array -#endif - -#ifndef PNG_INTERNAL_FUNCTION -# define PNG_INTERNAL_FUNCTION(type, name, args, attributes)\ - extern PNG_FUNCTION(type, name, args, PNG_EMPTY attributes) -#endif - -/* If floating or fixed point APIs are disabled they may still be compiled - * internally. To handle this make sure they are declared as the appropriate - * internal extern function (otherwise the symbol prefixing stuff won't work and - * the functions will be used without definitions.) - * - * NOTE: although all the API functions are declared here they are not all - * actually built! Because the declarations are still made it is necessary to - * fake out types that they depend on. - */ -#ifndef PNG_FP_EXPORT -# ifndef PNG_FLOATING_POINT_SUPPORTED -# define PNG_FP_EXPORT(ordinal, type, name, args)\ - PNG_INTERNAL_FUNCTION(type, name, args, PNG_EMPTY); -# ifndef PNG_VERSION_INFO_ONLY - typedef struct png_incomplete png_double; - typedef png_double* png_doublep; - typedef const png_double* png_const_doublep; - typedef png_double** png_doublepp; -# endif -# endif -#endif -#ifndef PNG_FIXED_EXPORT -# ifndef PNG_FIXED_POINT_SUPPORTED -# define PNG_FIXED_EXPORT(ordinal, type, name, args)\ - PNG_INTERNAL_FUNCTION(type, name, args, PNG_EMPTY); -# endif -#endif - -#include "png.h" - -/* pngconf.h does not set PNG_DLL_EXPORT unless it is required, so: */ -#ifndef PNG_DLL_EXPORT -# define PNG_DLL_EXPORT -#endif - -/* SECURITY and SAFETY: - * - * By default libpng is built without any internal limits on image size, - * individual heap (png_malloc) allocations or the total amount of memory used. - * If PNG_SAFE_LIMITS_SUPPORTED is defined, however, the limits below are used - * (unless individually overridden). These limits are believed to be fairly - * safe, but builders of secure systems should verify the values against the - * real system capabilities. - */ -#ifdef PNG_SAFE_LIMITS_SUPPORTED - /* 'safe' limits */ -# ifndef PNG_USER_WIDTH_MAX -# define PNG_USER_WIDTH_MAX 1000000 -# endif -# ifndef PNG_USER_HEIGHT_MAX -# define PNG_USER_HEIGHT_MAX 1000000 -# endif -# ifndef PNG_USER_CHUNK_CACHE_MAX -# define PNG_USER_CHUNK_CACHE_MAX 128 -# endif -# ifndef PNG_USER_CHUNK_MALLOC_MAX -# define PNG_USER_CHUNK_MALLOC_MAX 8000000 -# endif -#else - /* values for no limits */ -# ifndef PNG_USER_WIDTH_MAX -# define PNG_USER_WIDTH_MAX 0x7fffffff -# endif -# ifndef PNG_USER_HEIGHT_MAX -# define PNG_USER_HEIGHT_MAX 0x7fffffff -# endif -# ifndef PNG_USER_CHUNK_CACHE_MAX -# define PNG_USER_CHUNK_CACHE_MAX 0 -# endif -# ifndef PNG_USER_CHUNK_MALLOC_MAX -# define PNG_USER_CHUNK_MALLOC_MAX 0 -# endif -#endif - -/* Moved to pngpriv.h at libpng-1.5.0 */ -/* NOTE: some of these may have been used in external applications as - * these definitions were exposed in pngconf.h prior to 1.5. - */ - -/* If you are running on a machine where you cannot allocate more - * than 64K of memory at once, uncomment this. While libpng will not - * normally need that much memory in a chunk (unless you load up a very - * large file), zlib needs to know how big of a chunk it can use, and - * libpng thus makes sure to check any memory allocation to verify it - * will fit into memory. - * - * zlib provides 'MAXSEG_64K' which, if defined, indicates the - * same limit and pngconf.h (already included) sets the limit - * if certain operating systems are detected. - */ -#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) -# define PNG_MAX_MALLOC_64K -#endif - -#ifndef PNG_UNUSED -/* Unused formal parameter warnings are silenced using the following macro - * which is expected to have no bad effects on performance (optimizing - * compilers will probably remove it entirely). Note that if you replace - * it with something other than whitespace, you must include the terminating - * semicolon. - */ -# define PNG_UNUSED(param) (void)param; -#endif - -/* Just a little check that someone hasn't tried to define something - * contradictory. - */ -#if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) -# undef PNG_ZBUF_SIZE -# define PNG_ZBUF_SIZE 65536L -#endif - -/* If warnings or errors are turned off the code is disabled or redirected here. - * From 1.5.4 functions have been added to allow very limited formatting of - * error and warning messages - this code will also be disabled here. - */ -#ifdef PNG_WARNINGS_SUPPORTED -# define PNG_WARNING_PARAMETERS(p) png_warning_parameters p; -#else -# define png_warning(s1,s2) ((void)(s1)) -# define png_chunk_warning(s1,s2) ((void)(s1)) -# define png_warning_parameter(p,number,string) ((void)0) -# define png_warning_parameter_unsigned(p,number,format,value) ((void)0) -# define png_warning_parameter_signed(p,number,format,value) ((void)0) -# define png_formatted_warning(pp,p,message) ((void)(pp)) -# define PNG_WARNING_PARAMETERS(p) -#endif -#ifndef PNG_ERROR_TEXT_SUPPORTED -# define png_error(s1,s2) png_err(s1) -# define png_chunk_error(s1,s2) png_err(s1) -# define png_fixed_error(s1,s2) png_err(s1) -#endif - -/* C allows up-casts from (void*) to any pointer and (const void*) to any - * pointer to a const object. C++ regards this as a type error and requires an - * explicit, static, cast and provides the static_cast<> rune to ensure that - * const is not cast away. - */ -#ifdef __cplusplus -# define png_voidcast(type, value) static_cast(value) -# define png_constcast(type, value) const_cast(value) -# define png_aligncast(type, value) \ - static_cast(static_cast(value)) -# define png_aligncastconst(type, value) \ - static_cast(static_cast(value)) -#else -# define png_voidcast(type, value) (value) -# define png_constcast(type, value) ((type)(value)) -# define png_aligncast(type, value) ((void*)(value)) -# define png_aligncastconst(type, value) ((const void*)(value)) -#endif /* __cplusplus */ - -/* Some fixed point APIs are still required even if not exported because - * they get used by the corresponding floating point APIs. This magic - * deals with this: - */ -#ifdef PNG_FIXED_POINT_SUPPORTED -# define PNGFAPI PNGAPI -#else -# define PNGFAPI /* PRIVATE */ -#endif - -#ifndef PNG_VERSION_INFO_ONLY -/* Other defines specific to compilers can go here. Try to keep - * them inside an appropriate ifdef/endif pair for portability. - */ -#if defined(PNG_FLOATING_POINT_SUPPORTED) ||\ - defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) - /* png.c requires the following ANSI-C constants if the conversion of - * floating point to ASCII is implemented therein: - * - * DBL_DIG Maximum number of decimal digits (can be set to any constant) - * DBL_MIN Smallest normalized fp number (can be set to an arbitrary value) - * DBL_MAX Maximum floating point number (can be set to an arbitrary value) - */ -# include - -# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ - defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) - /* We need to check that hasn't already been included earlier - * as it seems it doesn't agree with , yet we should really use - * if possible. - */ -# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) -# include -# endif -# else -# include -# endif -# if defined(_AMIGA) && defined(__SASC) && defined(_M68881) - /* Amiga SAS/C: We must include builtin FPU functions when compiling using - * MATH=68881 - */ -# include -# endif -#endif - -/* This provides the non-ANSI (far) memory allocation routines. */ -#if defined(__TURBOC__) && defined(__MSDOS__) -# include -# include -#endif - -#if defined(WIN32) || defined(_Windows) || defined(_WINDOWS) || \ - defined(_WIN32) || defined(__WIN32__) -# include /* defines _WINDOWS_ macro */ -#endif -#endif /* PNG_VERSION_INFO_ONLY */ - -/* Moved here around 1.5.0beta36 from pngconf.h */ -/* Users may want to use these so they are not private. Any library - * functions that are passed far data must be model-independent. - */ - -/* Memory model/platform independent fns */ -#ifndef PNG_ABORT -# ifdef _WINDOWS_ -# define PNG_ABORT() ExitProcess(0) -# else -# define PNG_ABORT() abort() -# endif -#endif - -/* These macros may need to be architecture dependent. */ -#define PNG_ALIGN_NONE 0 /* do not use data alignment */ -#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */ -#ifdef offsetof -# define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */ -#else -# define PNG_ALIGN_OFFSET -1 /* prevent the use of this */ -#endif -#define PNG_ALIGN_SIZE 3 /* use sizeof to determine alignment */ - -#ifndef PNG_ALIGN_TYPE - /* Default to using aligned access optimizations and requiring alignment to a - * multiple of the data type size. Override in a compiler specific fashion - * if necessary by inserting tests here: - */ -# define PNG_ALIGN_TYPE PNG_ALIGN_SIZE -#endif - -#if PNG_ALIGN_TYPE == PNG_ALIGN_SIZE - /* This is used because in some compiler implementations non-aligned - * structure members are supported, so the offsetof approach below fails. - * Set PNG_ALIGN_SIZE=0 for compiler combinations where unaligned access - * is good for performance. Do not do this unless you have tested the result - * and understand it. - */ -# define png_alignof(type) (sizeof (type)) -#else -# if PNG_ALIGN_TYPE == PNG_ALIGN_OFFSET -# define png_alignof(type) offsetof(struct{char c; type t;}, t) -# else -# if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS -# define png_alignof(type) (1) -# endif - /* Else leave png_alignof undefined to prevent use thereof */ -# endif -#endif - -/* This implicitly assumes alignment is always to a power of 2. */ -#ifdef png_alignof -# define png_isaligned(ptr, type)\ - ((((const char*)ptr-(const char*)0) & (png_alignof(type)-1)) == 0) -#else -# define png_isaligned(ptr, type) 0 -#endif - -/* End of memory model/platform independent support */ -/* End of 1.5.0beta36 move from pngconf.h */ - -/* CONSTANTS and UTILITY MACROS - * These are used internally by libpng and not exposed in the API - */ - -/* Various modes of operation. Note that after an init, mode is set to - * zero automatically when the structure is created. Three of these - * are defined in png.h because they need to be visible to applications - * that call png_set_unknown_chunk(). - */ -/* #define PNG_HAVE_IHDR 0x01 (defined in png.h) */ -/* #define PNG_HAVE_PLTE 0x02 (defined in png.h) */ -#define PNG_HAVE_IDAT 0x04 -/* #define PNG_AFTER_IDAT 0x08 (defined in png.h) */ -#define PNG_HAVE_IEND 0x10 - /* 0x20 (unused) */ - /* 0x40 (unused) */ - /* 0x80 (unused) */ -#define PNG_HAVE_CHUNK_HEADER 0x100 -#define PNG_WROTE_tIME 0x200 -#define PNG_WROTE_INFO_BEFORE_PLTE 0x400 -#define PNG_BACKGROUND_IS_GRAY 0x800 -#define PNG_HAVE_PNG_SIGNATURE 0x1000 -#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ - /* 0x4000 (unused) */ -#define PNG_IS_READ_STRUCT 0x8000 /* Else is a write struct */ - -/* Flags for the transformations the PNG library does on the image data */ -#define PNG_BGR 0x0001 -#define PNG_INTERLACE 0x0002 -#define PNG_PACK 0x0004 -#define PNG_SHIFT 0x0008 -#define PNG_SWAP_BYTES 0x0010 -#define PNG_INVERT_MONO 0x0020 -#define PNG_QUANTIZE 0x0040 -#define PNG_COMPOSE 0x0080 /* Was PNG_BACKGROUND */ -#define PNG_BACKGROUND_EXPAND 0x0100 -#define PNG_EXPAND_16 0x0200 /* Added to libpng 1.5.2 */ -#define PNG_16_TO_8 0x0400 /* Becomes 'chop' in 1.5.4 */ -#define PNG_RGBA 0x0800 -#define PNG_EXPAND 0x1000 -#define PNG_GAMMA 0x2000 -#define PNG_GRAY_TO_RGB 0x4000 -#define PNG_FILLER 0x8000 -#define PNG_PACKSWAP 0x10000 -#define PNG_SWAP_ALPHA 0x20000 -#define PNG_STRIP_ALPHA 0x40000 -#define PNG_INVERT_ALPHA 0x80000 -#define PNG_USER_TRANSFORM 0x100000 -#define PNG_RGB_TO_GRAY_ERR 0x200000 -#define PNG_RGB_TO_GRAY_WARN 0x400000 -#define PNG_RGB_TO_GRAY 0x600000 /* two bits, RGB_TO_GRAY_ERR|WARN */ -#define PNG_ENCODE_ALPHA 0x800000 /* Added to libpng-1.5.4 */ -#define PNG_ADD_ALPHA 0x1000000 /* Added to libpng-1.2.7 */ -#define PNG_EXPAND_tRNS 0x2000000 /* Added to libpng-1.2.9 */ -#define PNG_SCALE_16_TO_8 0x4000000 /* Added to libpng-1.5.4 */ - /* 0x8000000 unused */ - /* 0x10000000 unused */ - /* 0x20000000 unused */ - /* 0x40000000 unused */ -/* Flags for png_create_struct */ -#define PNG_STRUCT_PNG 0x0001 -#define PNG_STRUCT_INFO 0x0002 - -/* Scaling factor for filter heuristic weighting calculations */ -#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) -#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) - -/* Flags for the png_ptr->flags rather than declaring a byte for each one */ -#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 -#define PNG_FLAG_ZSTREAM_INITIALIZED 0x0002 /* Added to libpng-1.6.0 */ - /* 0x0004 unused */ -#define PNG_FLAG_ZSTREAM_ENDED 0x0008 /* Added to libpng-1.6.0 */ - /* 0x0010 unused */ - /* 0x0020 unused */ -#define PNG_FLAG_ROW_INIT 0x0040 -#define PNG_FLAG_FILLER_AFTER 0x0080 -#define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 -#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 -#define PNG_FLAG_CRC_CRITICAL_USE 0x0400 -#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 -#define PNG_FLAG_ASSUME_sRGB 0x1000 /* Added to libpng-1.5.4 */ -#define PNG_FLAG_OPTIMIZE_ALPHA 0x2000 /* Added to libpng-1.5.4 */ -#define PNG_FLAG_DETECT_UNINITIALIZED 0x4000 /* Added to libpng-1.5.4 */ -/* #define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000 */ -/* #define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000 */ -#define PNG_FLAG_LIBRARY_MISMATCH 0x20000 -#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000 -#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000 -#define PNG_FLAG_BENIGN_ERRORS_WARN 0x100000 /* Added to libpng-1.4.0 */ -#define PNG_FLAG_APP_WARNINGS_WARN 0x200000 /* Added to libpng-1.6.0 */ -#define PNG_FLAG_APP_ERRORS_WARN 0x400000 /* Added to libpng-1.6.0 */ - /* 0x800000 unused */ - /* 0x1000000 unused */ - /* 0x2000000 unused */ - /* 0x4000000 unused */ - /* 0x8000000 unused */ - /* 0x10000000 unused */ - /* 0x20000000 unused */ - /* 0x40000000 unused */ - -#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ - PNG_FLAG_CRC_ANCILLARY_NOWARN) - -#define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ - PNG_FLAG_CRC_CRITICAL_IGNORE) - -#define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ - PNG_FLAG_CRC_CRITICAL_MASK) - -/* Save typing and make code easier to understand */ - -#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ - abs((int)((c1).green) - (int)((c2).green)) + \ - abs((int)((c1).blue) - (int)((c2).blue))) - -/* Added to libpng-1.6.0: scale a 16-bit value in the range 0..65535 to 0..255 - * by dividing by 257 *with rounding*. This macro is exact for the given range. - * See the discourse in pngrtran.c png_do_scale_16_to_8. The values in the - * macro were established by experiment (modifying the added value). The macro - * has a second variant that takes a value already scaled by 255 and divides by - * 65535 - this has a maximum error of .502. Over the range 0..65535*65535 it - * only gives off-by-one errors and only for 0.5% (1 in 200) of the values. - */ -#define PNG_DIV65535(v24) (((v24) + 32895) >> 16) -#define PNG_DIV257(v16) PNG_DIV65535((png_uint_32)(v16) * 255) - -/* Added to libpng-1.2.6 JB */ -#define PNG_ROWBYTES(pixel_bits, width) \ - ((pixel_bits) >= 8 ? \ - ((png_size_t)(width) * (((png_size_t)(pixel_bits)) >> 3)) : \ - (( ((png_size_t)(width) * ((png_size_t)(pixel_bits))) + 7) >> 3) ) - -/* PNG_OUT_OF_RANGE returns true if value is outside the range - * ideal-delta..ideal+delta. Each argument is evaluated twice. - * "ideal" and "delta" should be constants, normally simple - * integers, "value" a variable. Added to libpng-1.2.6 JB - */ -#define PNG_OUT_OF_RANGE(value, ideal, delta) \ - ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) - -/* Conversions between fixed and floating point, only defined if - * required (to make sure the code doesn't accidentally use float - * when it is supposedly disabled.) - */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -/* The floating point conversion can't overflow, though it can and - * does lose accuracy relative to the original fixed point value. - * In practice this doesn't matter because png_fixed_point only - * stores numbers with very low precision. The png_ptr and s - * arguments are unused by default but are there in case error - * checking becomes a requirement. - */ -#define png_float(png_ptr, fixed, s) (.00001 * (fixed)) - -/* The fixed point conversion performs range checking and evaluates - * its argument multiple times, so must be used with care. The - * range checking uses the PNG specification values for a signed - * 32 bit fixed point value except that the values are deliberately - * rounded-to-zero to an integral value - 21474 (21474.83 is roughly - * (2^31-1) * 100000). 's' is a string that describes the value being - * converted. - * - * NOTE: this macro will raise a png_error if the range check fails, - * therefore it is normally only appropriate to use this on values - * that come from API calls or other sources where an out of range - * error indicates a programming error, not a data error! - * - * NOTE: by default this is off - the macro is not used - because the - * function call saves a lot of code. - */ -#ifdef PNG_FIXED_POINT_MACRO_SUPPORTED -#define png_fixed(png_ptr, fp, s) ((fp) <= 21474 && (fp) >= -21474 ?\ - ((png_fixed_point)(100000 * (fp))) : (png_fixed_error(png_ptr, s),0)) -#endif -/* else the corresponding function is defined below, inside the scope of the - * cplusplus test. - */ -#endif - -/* Constants for known chunk types. If you need to add a chunk, define the name - * here. For historical reasons these constants have the form png_; i.e. - * the prefix is lower case. Please use decimal values as the parameters to - * match the ISO PNG specification and to avoid relying on the C locale - * interpretation of character values. - * - * Prior to 1.5.6 these constants were strings, as of 1.5.6 png_uint_32 values - * are computed and a new macro (PNG_STRING_FROM_CHUNK) added to allow a string - * to be generated if required. - * - * PNG_32b correctly produces a value shifted by up to 24 bits, even on - * architectures where (int) is only 16 bits. - */ -#define PNG_32b(b,s) ((png_uint_32)(b) << (s)) -#define PNG_CHUNK(b1,b2,b3,b4) \ - (PNG_32b(b1,24) | PNG_32b(b2,16) | PNG_32b(b3,8) | PNG_32b(b4,0)) - -#define png_IHDR PNG_CHUNK( 73, 72, 68, 82) -#define png_IDAT PNG_CHUNK( 73, 68, 65, 84) -#define png_IEND PNG_CHUNK( 73, 69, 78, 68) -#define png_PLTE PNG_CHUNK( 80, 76, 84, 69) -#define png_bKGD PNG_CHUNK( 98, 75, 71, 68) -#define png_cHRM PNG_CHUNK( 99, 72, 82, 77) -#define png_gAMA PNG_CHUNK(103, 65, 77, 65) -#define png_hIST PNG_CHUNK(104, 73, 83, 84) -#define png_iCCP PNG_CHUNK(105, 67, 67, 80) -#define png_iTXt PNG_CHUNK(105, 84, 88, 116) -#define png_oFFs PNG_CHUNK(111, 70, 70, 115) -#define png_pCAL PNG_CHUNK(112, 67, 65, 76) -#define png_sCAL PNG_CHUNK(115, 67, 65, 76) -#define png_pHYs PNG_CHUNK(112, 72, 89, 115) -#define png_sBIT PNG_CHUNK(115, 66, 73, 84) -#define png_sPLT PNG_CHUNK(115, 80, 76, 84) -#define png_sRGB PNG_CHUNK(115, 82, 71, 66) -#define png_sTER PNG_CHUNK(115, 84, 69, 82) -#define png_tEXt PNG_CHUNK(116, 69, 88, 116) -#define png_tIME PNG_CHUNK(116, 73, 77, 69) -#define png_tRNS PNG_CHUNK(116, 82, 78, 83) -#define png_zTXt PNG_CHUNK(122, 84, 88, 116) - -/* The following will work on (signed char*) strings, whereas the get_uint_32 - * macro will fail on top-bit-set values because of the sign extension. - */ -#define PNG_CHUNK_FROM_STRING(s)\ - PNG_CHUNK(0xff&(s)[0], 0xff&(s)[1], 0xff&(s)[2], 0xff&(s)[3]) - -/* This uses (char), not (png_byte) to avoid warnings on systems where (char) is - * signed and the argument is a (char[]) This macro will fail miserably on - * systems where (char) is more than 8 bits. - */ -#define PNG_STRING_FROM_CHUNK(s,c)\ - (void)(((char*)(s))[0]=(char)((c)>>24), ((char*)(s))[1]=(char)((c)>>16),\ - ((char*)(s))[2]=(char)((c)>>8), ((char*)(s))[3]=(char)((c))) - -/* Do the same but terminate with a null character. */ -#define PNG_CSTRING_FROM_CHUNK(s,c)\ - (void)(PNG_STRING_FROM_CHUNK(s,c), ((char*)(s))[4] = 0) - -/* Test on flag values as defined in the spec (section 5.4): */ -#define PNG_CHUNK_ANCILLIARY(c) (1 & ((c) >> 29)) -#define PNG_CHUNK_CRITICAL(c) (!PNG_CHUNK_ANCILLIARY(c)) -#define PNG_CHUNK_PRIVATE(c) (1 & ((c) >> 21)) -#define PNG_CHUNK_RESERVED(c) (1 & ((c) >> 13)) -#define PNG_CHUNK_SAFE_TO_COPY(c) (1 & ((c) >> 5)) - -/* Gamma values (new at libpng-1.5.4): */ -#define PNG_GAMMA_MAC_OLD 151724 /* Assume '1.8' is really 2.2/1.45! */ -#define PNG_GAMMA_MAC_INVERSE 65909 -#define PNG_GAMMA_sRGB_INVERSE 45455 - -/* Almost everything below is C specific; the #defines above can be used in - * non-C code (so long as it is C-preprocessed) the rest of this stuff cannot. - */ -#ifndef PNG_VERSION_INFO_ONLY - -#include "pngstruct.h" -#include "pnginfo.h" - -/* This is used for 16 bit gamma tables -- only the top level pointers are - * const; this could be changed: - */ -typedef const png_uint_16p * png_const_uint_16pp; - -/* Added to libpng-1.5.7: sRGB conversion tables */ -#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\ - defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) -#ifdef PNG_SIMPLIFIED_READ_SUPPORTED -PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_table, [256]); - /* Convert from an sRGB encoded value 0..255 to a 16-bit linear value, - * 0..65535. This table gives the closest 16-bit answers (no errors). - */ -#endif - -PNG_INTERNAL_DATA(const png_uint_16, png_sRGB_base, [512]); -PNG_INTERNAL_DATA(const png_byte, png_sRGB_delta, [512]); - -#define PNG_sRGB_FROM_LINEAR(linear) ((png_byte)((png_sRGB_base[(linear)>>15] +\ - ((((linear)&0x7fff)*png_sRGB_delta[(linear)>>15])>>12)) >> 8)) - /* Given a value 'linear' in the range 0..255*65535 calculate the 8-bit sRGB - * encoded value with maximum error 0.646365. Note that the input is not a - * 16-bit value; it has been multiplied by 255! */ -#endif /* PNG_SIMPLIFIED_READ/WRITE */ - - -/* Internal functions; these are not exported from a DLL however because they - * are used within several of the C source files they have to be C extern. - * - * All of these functions must be declared with PNG_INTERNAL_FUNCTION. - */ - -/* Zlib support */ -#define PNG_UNEXPECTED_ZLIB_RETURN (-7) -PNG_INTERNAL_FUNCTION(void, png_zstream_error,(png_structrp png_ptr, int ret), - PNG_EMPTY); - /* Used by the zlib handling functions to ensure that z_stream::msg is always - * set before they return. - */ - -#ifdef PNG_WRITE_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_free_buffer_list,(png_structrp png_ptr, - png_compression_bufferp *list),PNG_EMPTY); - /* Free the buffer list used by the compressed write code. */ -#endif - -#if defined(PNG_FLOATING_POINT_SUPPORTED) && \ - !defined(PNG_FIXED_POINT_MACRO_SUPPORTED) && \ - (defined(PNG_gAMA_SUPPORTED) || defined(PNG_cHRM_SUPPORTED) || \ - defined(PNG_sCAL_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)) || \ - (defined(PNG_sCAL_SUPPORTED) && \ - defined(PNG_FLOATING_ARITHMETIC_SUPPORTED)) -PNG_INTERNAL_FUNCTION(png_fixed_point,png_fixed,(png_const_structrp png_ptr, - double fp, png_const_charp text),PNG_EMPTY); -#endif - -/* Check the user version string for compatibility, returns false if the version - * numbers aren't compatible. - */ -PNG_INTERNAL_FUNCTION(int,png_user_version_check,(png_structrp png_ptr, - png_const_charp user_png_ver),PNG_EMPTY); - -/* Internal base allocator - no messages, NULL on failure to allocate. This - * does, however, call the application provided allocator and that could call - * png_error (although that would be a bug in the application implementation.) - */ -PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_base,(png_const_structrp png_ptr, - png_alloc_size_t size),PNG_ALLOCATED); - -#if defined(PNG_TEXT_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) ||\ - defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) -/* Internal array allocator, outputs no error or warning messages on failure, - * just returns NULL. - */ -PNG_INTERNAL_FUNCTION(png_voidp,png_malloc_array,(png_const_structrp png_ptr, - int nelements, size_t element_size),PNG_ALLOCATED); - -/* The same but an existing array is extended by add_elements. This function - * also memsets the new elements to 0 and copies the old elements. The old - * array is not freed or altered. - */ -PNG_INTERNAL_FUNCTION(png_voidp,png_realloc_array,(png_const_structrp png_ptr, - png_const_voidp array, int old_elements, int add_elements, - size_t element_size),PNG_ALLOCATED); -#endif /* text, sPLT or unknown chunks */ - -/* Magic to create a struct when there is no struct to call the user supplied - * memory allocators. Because error handling has not been set up the memory - * handlers can't safely call png_error, but this is an obscure and undocumented - * restriction so libpng has to assume that the 'free' handler, at least, might - * call png_error. - */ -PNG_INTERNAL_FUNCTION(png_structp,png_create_png_struct, - (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, - png_error_ptr warn_fn, png_voidp mem_ptr, png_malloc_ptr malloc_fn, - png_free_ptr free_fn),PNG_ALLOCATED); - -/* Free memory from internal libpng struct */ -PNG_INTERNAL_FUNCTION(void,png_destroy_png_struct,(png_structrp png_ptr), - PNG_EMPTY); - -/* Free an allocated jmp_buf (always succeeds) */ -PNG_INTERNAL_FUNCTION(void,png_free_jmpbuf,(png_structrp png_ptr),PNG_EMPTY); - -/* Function to allocate memory for zlib. PNGAPI is disallowed. */ -PNG_INTERNAL_FUNCTION(voidpf,png_zalloc,(voidpf png_ptr, uInt items, uInt size), - PNG_ALLOCATED); - -/* Function to free memory for zlib. PNGAPI is disallowed. */ -PNG_INTERNAL_FUNCTION(void,png_zfree,(voidpf png_ptr, voidpf ptr),PNG_EMPTY); - -/* Next four functions are used internally as callbacks. PNGCBAPI is required - * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3, changed to - * PNGCBAPI at 1.5.0 - */ - -PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_read_data,(png_structp png_ptr, - png_bytep data, png_size_t length),PNG_EMPTY); - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_push_fill_buffer,(png_structp png_ptr, - png_bytep buffer, png_size_t length),PNG_EMPTY); -#endif - -PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_write_data,(png_structp png_ptr, - png_bytep data, png_size_t length),PNG_EMPTY); - -#ifdef PNG_WRITE_FLUSH_SUPPORTED -# ifdef PNG_STDIO_SUPPORTED -PNG_INTERNAL_FUNCTION(void PNGCBAPI,png_default_flush,(png_structp png_ptr), - PNG_EMPTY); -# endif -#endif - -/* Reset the CRC variable */ -PNG_INTERNAL_FUNCTION(void,png_reset_crc,(png_structrp png_ptr),PNG_EMPTY); - -/* Write the "data" buffer to whatever output you are using */ -PNG_INTERNAL_FUNCTION(void,png_write_data,(png_structrp png_ptr, - png_const_bytep data, png_size_t length),PNG_EMPTY); - -/* Read and check the PNG file signature */ -PNG_INTERNAL_FUNCTION(void,png_read_sig,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); - -/* Read the chunk header (length + type name) */ -PNG_INTERNAL_FUNCTION(png_uint_32,png_read_chunk_header,(png_structrp png_ptr), - PNG_EMPTY); - -/* Read data from whatever input you are using into the "data" buffer */ -PNG_INTERNAL_FUNCTION(void,png_read_data,(png_structrp png_ptr, png_bytep data, - png_size_t length),PNG_EMPTY); - -/* Read bytes into buf, and update png_ptr->crc */ -PNG_INTERNAL_FUNCTION(void,png_crc_read,(png_structrp png_ptr, png_bytep buf, - png_uint_32 length),PNG_EMPTY); - -/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ -PNG_INTERNAL_FUNCTION(int,png_crc_finish,(png_structrp png_ptr, - png_uint_32 skip),PNG_EMPTY); - -/* Read the CRC from the file and compare it to the libpng calculated CRC */ -PNG_INTERNAL_FUNCTION(int,png_crc_error,(png_structrp png_ptr),PNG_EMPTY); - -/* Calculate the CRC over a section of data. Note that we are only - * passing a maximum of 64K on systems that have this as a memory limit, - * since this is the maximum buffer size we can specify. - */ -PNG_INTERNAL_FUNCTION(void,png_calculate_crc,(png_structrp png_ptr, - png_const_bytep ptr, png_size_t length),PNG_EMPTY); - -#ifdef PNG_WRITE_FLUSH_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_flush,(png_structrp png_ptr),PNG_EMPTY); -#endif - -/* Write various chunks */ - -/* Write the IHDR chunk, and update the png_struct with the necessary - * information. - */ -PNG_INTERNAL_FUNCTION(void,png_write_IHDR,(png_structrp png_ptr, - png_uint_32 width, png_uint_32 height, int bit_depth, int color_type, - int compression_method, int filter_method, int interlace_method),PNG_EMPTY); - -PNG_INTERNAL_FUNCTION(void,png_write_PLTE,(png_structrp png_ptr, - png_const_colorp palette, png_uint_32 num_pal),PNG_EMPTY); - -PNG_INTERNAL_FUNCTION(void,png_compress_IDAT,(png_structrp png_ptr, - png_const_bytep row_data, png_alloc_size_t row_data_length, int flush), - PNG_EMPTY); - -PNG_INTERNAL_FUNCTION(void,png_write_IEND,(png_structrp png_ptr),PNG_EMPTY); - -#ifdef PNG_WRITE_gAMA_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_gAMA_fixed,(png_structrp png_ptr, - png_fixed_point file_gamma),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_sBIT_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_sBIT,(png_structrp png_ptr, - png_const_color_8p sbit, int color_type),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_cHRM_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_cHRM_fixed,(png_structrp png_ptr, - const png_xy *xy), PNG_EMPTY); - /* The xy value must have been previously validated */ -#endif - -#ifdef PNG_WRITE_sRGB_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_sRGB,(png_structrp png_ptr, - int intent),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_iCCP_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_iCCP,(png_structrp png_ptr, - png_const_charp name, png_const_bytep profile), PNG_EMPTY); - /* The profile must have been previously validated for correctness, the - * length comes from the first four bytes. Only the base, deflate, - * compression is supported. - */ -#endif - -#ifdef PNG_WRITE_sPLT_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_sPLT,(png_structrp png_ptr, - png_const_sPLT_tp palette),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_tRNS_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_tRNS,(png_structrp png_ptr, - png_const_bytep trans, png_const_color_16p values, int number, - int color_type),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_bKGD_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_bKGD,(png_structrp png_ptr, - png_const_color_16p values, int color_type),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_hIST_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_hIST,(png_structrp png_ptr, - png_const_uint_16p hist, int num_hist),PNG_EMPTY); -#endif - -/* Chunks that have keywords */ -#ifdef PNG_WRITE_tEXt_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_tEXt,(png_structrp png_ptr, - png_const_charp key, png_const_charp text, png_size_t text_len),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_zTXt_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_zTXt,(png_structrp png_ptr, png_const_charp - key, png_const_charp text, png_size_t text_len, int compression),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_iTXt_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_iTXt,(png_structrp png_ptr, - int compression, png_const_charp key, png_const_charp lang, - png_const_charp lang_key, png_const_charp text),PNG_EMPTY); -#endif - -#ifdef PNG_TEXT_SUPPORTED /* Added at version 1.0.14 and 1.2.4 */ -PNG_INTERNAL_FUNCTION(int,png_set_text_2,(png_const_structrp png_ptr, - png_inforp info_ptr, png_const_textp text_ptr, int num_text),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_oFFs_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_oFFs,(png_structrp png_ptr, - png_int_32 x_offset, png_int_32 y_offset, int unit_type),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_pCAL_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_pCAL,(png_structrp png_ptr, - png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams, - png_const_charp units, png_charpp params),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_pHYs_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_pHYs,(png_structrp png_ptr, - png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, - int unit_type),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_tIME_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_tIME,(png_structrp png_ptr, - png_const_timep mod_time),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_sCAL_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_write_sCAL_s,(png_structrp png_ptr, - int unit, png_const_charp width, png_const_charp height),PNG_EMPTY); -#endif - -/* Called when finished processing a row of data */ -PNG_INTERNAL_FUNCTION(void,png_write_finish_row,(png_structrp png_ptr), - PNG_EMPTY); - -/* Internal use only. Called before first row of data */ -PNG_INTERNAL_FUNCTION(void,png_write_start_row,(png_structrp png_ptr), - PNG_EMPTY); - -/* Combine a row of data, dealing with alpha, etc. if requested. 'row' is an - * array of png_ptr->width pixels. If the image is not interlaced or this - * is the final pass this just does a memcpy, otherwise the "display" flag - * is used to determine whether to copy pixels that are not in the current pass. - * - * Because 'png_do_read_interlace' (below) replicates pixels this allows this - * function to achieve the documented 'blocky' appearance during interlaced read - * if display is 1 and the 'sparkle' appearance, where existing pixels in 'row' - * are not changed if they are not in the current pass, when display is 0. - * - * 'display' must be 0 or 1, otherwise the memcpy will be done regardless. - * - * The API always reads from the png_struct row buffer and always assumes that - * it is full width (png_do_read_interlace has already been called.) - * - * This function is only ever used to write to row buffers provided by the - * caller of the relevant libpng API and the row must have already been - * transformed by the read transformations. - * - * The PNG_USE_COMPILE_TIME_MASKS option causes generation of pre-computed - * bitmasks for use within the code, otherwise runtime generated masks are used. - * The default is compile time masks. - */ -#ifndef PNG_USE_COMPILE_TIME_MASKS -# define PNG_USE_COMPILE_TIME_MASKS 1 -#endif -PNG_INTERNAL_FUNCTION(void,png_combine_row,(png_const_structrp png_ptr, - png_bytep row, int display),PNG_EMPTY); - -#ifdef PNG_READ_INTERLACING_SUPPORTED -/* Expand an interlaced row: the 'row_info' describes the pass data that has - * been read in and must correspond to the pixels in 'row', the pixels are - * expanded (moved apart) in 'row' to match the final layout, when doing this - * the pixels are *replicated* to the intervening space. This is essential for - * the correct operation of png_combine_row, above. - */ -PNG_INTERNAL_FUNCTION(void,png_do_read_interlace,(png_row_infop row_info, - png_bytep row, int pass, png_uint_32 transformations),PNG_EMPTY); -#endif - -/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED -/* Grab pixels out of a row for an interlaced pass */ -PNG_INTERNAL_FUNCTION(void,png_do_write_interlace,(png_row_infop row_info, - png_bytep row, int pass),PNG_EMPTY); -#endif - -/* Unfilter a row: check the filter value before calling this, there is no point - * calling it for PNG_FILTER_VALUE_NONE. - */ -PNG_INTERNAL_FUNCTION(void,png_read_filter_row,(png_structrp pp, png_row_infop - row_info, png_bytep row, png_const_bytep prev_row, int filter),PNG_EMPTY); - -PNG_INTERNAL_FUNCTION(void,png_read_filter_row_up_neon,(png_row_infop row_info, - png_bytep row, png_const_bytep prev_row),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub3_neon,(png_row_infop - row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_filter_row_sub4_neon,(png_row_infop - row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg3_neon,(png_row_infop - row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_filter_row_avg4_neon,(png_row_infop - row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth3_neon,(png_row_infop - row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_filter_row_paeth4_neon,(png_row_infop - row_info, png_bytep row, png_const_bytep prev_row),PNG_EMPTY); - -/* Choose the best filter to use and filter the row data */ -PNG_INTERNAL_FUNCTION(void,png_write_find_filter,(png_structrp png_ptr, - png_row_infop row_info),PNG_EMPTY); - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_read_IDAT_data,(png_structrp png_ptr, - png_bytep output, png_alloc_size_t avail_out),PNG_EMPTY); - /* Read 'avail_out' bytes of data from the IDAT stream. If the output buffer - * is NULL the function checks, instead, for the end of the stream. In this - * case a benign error will be issued if the stream end is not found or if - * extra data has to be consumed. - */ -PNG_INTERNAL_FUNCTION(void,png_read_finish_IDAT,(png_structrp png_ptr), - PNG_EMPTY); - /* This cleans up when the IDAT LZ stream does not end when the last image - * byte is read; there is still some pending input. - */ - -PNG_INTERNAL_FUNCTION(void,png_read_finish_row,(png_structrp png_ptr), - PNG_EMPTY); - /* Finish a row while reading, dealing with interlacing passes, etc. */ -#endif - -/* Initialize the row buffers, etc. */ -PNG_INTERNAL_FUNCTION(void,png_read_start_row,(png_structrp png_ptr),PNG_EMPTY); - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED -/* Optional call to update the users info structure */ -PNG_INTERNAL_FUNCTION(void,png_read_transform_info,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); -#endif - -/* These are the functions that do the transformations */ -#ifdef PNG_READ_FILLER_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_read_filler,(png_row_infop row_info, - png_bytep row, png_uint_32 filler, png_uint_32 flags),PNG_EMPTY); -#endif - -#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_read_swap_alpha,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_write_swap_alpha,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_read_invert_alpha,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_write_invert_alpha,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ - defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -PNG_INTERNAL_FUNCTION(void,png_do_strip_channel,(png_row_infop row_info, - png_bytep row, int at_start),PNG_EMPTY); -#endif - -#ifdef PNG_16BIT_SUPPORTED -#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -PNG_INTERNAL_FUNCTION(void,png_do_swap,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ - defined(PNG_WRITE_PACKSWAP_SUPPORTED) -PNG_INTERNAL_FUNCTION(void,png_do_packswap,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED -PNG_INTERNAL_FUNCTION(int,png_do_rgb_to_gray,(png_structrp png_ptr, - png_row_infop row_info, png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_gray_to_rgb,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_READ_PACK_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_unpack,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_READ_SHIFT_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_unshift,(png_row_infop row_info, - png_bytep row, png_const_color_8p sig_bits),PNG_EMPTY); -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) -PNG_INTERNAL_FUNCTION(void,png_do_invert,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_scale_16_to_8,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_chop,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_READ_QUANTIZE_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_quantize,(png_row_infop row_info, - png_bytep row, png_const_bytep palette_lookup, - png_const_bytep quantize_lookup),PNG_EMPTY); - -# ifdef PNG_CORRECT_PALETTE_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_correct_palette,(png_structrp png_ptr, - png_colorp palette, int num_palette),PNG_EMPTY); -# endif -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -PNG_INTERNAL_FUNCTION(void,png_do_bgr,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_PACK_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_pack,(png_row_infop row_info, - png_bytep row, png_uint_32 bit_depth),PNG_EMPTY); -#endif - -#ifdef PNG_WRITE_SHIFT_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_shift,(png_row_infop row_info, - png_bytep row, png_const_color_8p bit_depth),PNG_EMPTY); -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ - defined(PNG_READ_ALPHA_MODE_SUPPORTED) -PNG_INTERNAL_FUNCTION(void,png_do_compose,(png_row_infop row_info, - png_bytep row, png_structrp png_ptr),PNG_EMPTY); -#endif - -#ifdef PNG_READ_GAMMA_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_gamma,(png_row_infop row_info, - png_bytep row, png_structrp png_ptr),PNG_EMPTY); -#endif - -#ifdef PNG_READ_ALPHA_MODE_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_encode_alpha,(png_row_infop row_info, - png_bytep row, png_structrp png_ptr),PNG_EMPTY); -#endif - -#ifdef PNG_READ_EXPAND_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_expand_palette,(png_row_infop row_info, - png_bytep row, png_const_colorp palette, png_const_bytep trans, - int num_trans),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_do_expand,(png_row_infop row_info, - png_bytep row, png_const_color_16p trans_color),PNG_EMPTY); -#endif - -#ifdef PNG_READ_EXPAND_16_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_expand_16,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -/* The following decodes the appropriate chunks, and does error correction, - * then calls the appropriate callback for the chunk if it is valid. - */ - -/* Decode the IHDR chunk */ -PNG_INTERNAL_FUNCTION(void,png_handle_IHDR,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_handle_PLTE,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_handle_IEND,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); - -#ifdef PNG_READ_bKGD_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_bKGD,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_cHRM_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_cHRM,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_gAMA_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_gAMA,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_hIST_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_hIST,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_iCCP_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_iCCP,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif /* PNG_READ_iCCP_SUPPORTED */ - -#ifdef PNG_READ_iTXt_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_iTXt,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_oFFs_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_oFFs,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_pCAL_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_pCAL,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_pHYs_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_pHYs,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_sBIT_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_sBIT,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_sCAL_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_sCAL,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_sPLT_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_sPLT,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif /* PNG_READ_sPLT_SUPPORTED */ - -#ifdef PNG_READ_sRGB_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_sRGB,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_tEXt_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_tEXt,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_tIME_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_tIME,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_tRNS_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_tRNS,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -#ifdef PNG_READ_zTXt_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_zTXt,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -#endif - -PNG_INTERNAL_FUNCTION(void,png_check_chunk_name,(png_structrp png_ptr, - png_uint_32 chunk_name),PNG_EMPTY); - -#ifdef PNG_READ_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_handle_unknown,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length, int keep),PNG_EMPTY); - /* This is the function that gets called for unknown chunks. The 'keep' - * argument is either non-zero for a known chunk that has been set to be - * handled as unknown or zero for an unknown chunk. By default the function - * just skips the chunk or errors out if it is critical. - */ - -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED -#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED -PNG_INTERNAL_FUNCTION(int,png_chunk_unknown_handling, - (png_const_structrp png_ptr, png_uint_32 chunk_name),PNG_EMPTY); - /* Exactly as the API png_handle_as_unknown() except that the argument is a - * 32-bit chunk name, not a string. - */ -#endif -#endif /* PNG_READ_UNKNOWN_CHUNKS_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED */ - -/* Handle the transformations for reading and writing */ -#ifdef PNG_READ_TRANSFORMS_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_read_transformations,(png_structrp png_ptr, - png_row_infop row_info),PNG_EMPTY); -#endif -#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_write_transformations,(png_structrp png_ptr, - png_row_infop row_info),PNG_EMPTY); -#endif - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_init_read_transformations,(png_structrp png_ptr), - PNG_EMPTY); -#endif - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_push_read_chunk,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_read_sig,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_check_crc,(png_structrp png_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_crc_skip,(png_structrp png_ptr, - png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_crc_finish,(png_structrp png_ptr), - PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_save_buffer,(png_structrp png_ptr), - PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_restore_buffer,(png_structrp png_ptr, - png_bytep buffer, png_size_t buffer_length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_read_IDAT,(png_structrp png_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_process_IDAT_data,(png_structrp png_ptr, - png_bytep buffer, png_size_t buffer_length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_process_row,(png_structrp png_ptr), - PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_handle_unknown,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_have_info,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_have_end,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_have_row,(png_structrp png_ptr, - png_bytep row),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_read_end,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_process_some_data,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_read_push_finish_row,(png_structrp png_ptr), - PNG_EMPTY); -# ifdef PNG_READ_tEXt_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_push_handle_tEXt,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_read_tEXt,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); -# endif -# ifdef PNG_READ_zTXt_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_push_handle_zTXt,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_read_zTXt,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); -# endif -# ifdef PNG_READ_iTXt_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_push_handle_iTXt,(png_structrp png_ptr, - png_inforp info_ptr, png_uint_32 length),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_push_read_iTXt,(png_structrp png_ptr, - png_inforp info_ptr),PNG_EMPTY); -# endif - -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - -#ifdef PNG_MNG_FEATURES_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_do_read_intrapixel,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_do_write_intrapixel,(png_row_infop row_info, - png_bytep row),PNG_EMPTY); -#endif - -/* Added at libpng version 1.6.0 */ -#ifdef PNG_GAMMA_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_colorspace_set_gamma,(png_const_structrp png_ptr, - png_colorspacerp colorspace, png_fixed_point gAMA), PNG_EMPTY); - /* Set the colorspace gamma with a value provided by the application or by - * the gAMA chunk on read. The value will override anything set by an ICC - * profile. - */ - -PNG_INTERNAL_FUNCTION(void,png_colorspace_sync_info,(png_const_structrp png_ptr, - png_inforp info_ptr), PNG_EMPTY); - /* Synchronize the info 'valid' flags with the colorspace */ - -PNG_INTERNAL_FUNCTION(void,png_colorspace_sync,(png_const_structrp png_ptr, - png_inforp info_ptr), PNG_EMPTY); - /* Copy the png_struct colorspace to the info_struct and call the above to - * synchronize the flags. Checks for NULL info_ptr and does nothing. - */ -#endif - -/* Added at libpng version 1.4.0 */ -#ifdef PNG_COLORSPACE_SUPPORTED -/* These internal functions are for maintaining the colorspace structure within - * a png_info or png_struct (or, indeed, both). - */ -PNG_INTERNAL_FUNCTION(int,png_colorspace_set_chromaticities, - (png_const_structrp png_ptr, png_colorspacerp colorspace, const png_xy *xy, - int preferred), PNG_EMPTY); - -PNG_INTERNAL_FUNCTION(int,png_colorspace_set_endpoints, - (png_const_structrp png_ptr, png_colorspacerp colorspace, const png_XYZ *XYZ, - int preferred), PNG_EMPTY); - -#ifdef PNG_sRGB_SUPPORTED -PNG_INTERNAL_FUNCTION(int,png_colorspace_set_sRGB,(png_const_structrp png_ptr, - png_colorspacerp colorspace, int intent), PNG_EMPTY); - /* This does set the colorspace gAMA and cHRM values too, but doesn't set the - * flags to write them, if it returns false there was a problem and an error - * message has already been output (but the colorspace may still need to be - * synced to record the invalid flag). - */ -#endif /* sRGB */ - -#ifdef PNG_iCCP_SUPPORTED -PNG_INTERNAL_FUNCTION(int,png_colorspace_set_ICC,(png_const_structrp png_ptr, - png_colorspacerp colorspace, png_const_charp name, - png_uint_32 profile_length, png_const_bytep profile, int color_type), - PNG_EMPTY); - /* The 'name' is used for information only */ - -/* Routines for checking parts of an ICC profile. */ -PNG_INTERNAL_FUNCTION(int,png_icc_check_length,(png_const_structrp png_ptr, - png_colorspacerp colorspace, png_const_charp name, - png_uint_32 profile_length), PNG_EMPTY); -PNG_INTERNAL_FUNCTION(int,png_icc_check_header,(png_const_structrp png_ptr, - png_colorspacerp colorspace, png_const_charp name, - png_uint_32 profile_length, - png_const_bytep profile /* first 132 bytes only */, int color_type), - PNG_EMPTY); -PNG_INTERNAL_FUNCTION(int,png_icc_check_tag_table,(png_const_structrp png_ptr, - png_colorspacerp colorspace, png_const_charp name, - png_uint_32 profile_length, - png_const_bytep profile /* header plus whole tag table */), PNG_EMPTY); -#ifdef PNG_sRGB_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_icc_set_sRGB,( - png_const_structrp png_ptr, png_colorspacerp colorspace, - png_const_bytep profile, uLong adler), PNG_EMPTY); - /* 'adler' is the Adler32 checksum of the uncompressed profile data. It may - * be zero to indicate that it is not available. It is used, if provided, - * as a fast check on the profile when checking to see if it is sRGB. - */ -#endif -#endif /* iCCP */ - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_colorspace_set_rgb_coefficients, - (png_structrp png_ptr), PNG_EMPTY); - /* Set the rgb_to_gray coefficients from the colorspace Y values */ -#endif /* READ_RGB_TO_GRAY */ -#endif /* COLORSPACE */ - -/* Added at libpng version 1.4.0 */ -PNG_INTERNAL_FUNCTION(void,png_check_IHDR,(png_const_structrp png_ptr, - png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_type, int compression_type, - int filter_type),PNG_EMPTY); - -/* Added at libpng version 1.5.10 */ -#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ - defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) -PNG_INTERNAL_FUNCTION(void,png_do_check_palette_indexes, - (png_structrp png_ptr, png_row_infop row_info),PNG_EMPTY); -#endif - -#if defined(PNG_FLOATING_POINT_SUPPORTED) && defined(PNG_ERROR_TEXT_SUPPORTED) -PNG_INTERNAL_FUNCTION(void,png_fixed_error,(png_const_structrp png_ptr, - png_const_charp name),PNG_NORETURN); -#endif - -/* Puts 'string' into 'buffer' at buffer[pos], taking care never to overwrite - * the end. Always leaves the buffer nul terminated. Never errors out (and - * there is no error code.) - */ -PNG_INTERNAL_FUNCTION(size_t,png_safecat,(png_charp buffer, size_t bufsize, - size_t pos, png_const_charp string),PNG_EMPTY); - -/* Various internal functions to handle formatted warning messages, currently - * only implemented for warnings. - */ -#if defined(PNG_WARNINGS_SUPPORTED) || defined(PNG_TIME_RFC1123_SUPPORTED) -/* Utility to dump an unsigned value into a buffer, given a start pointer and - * and end pointer (which should point just *beyond* the end of the buffer!) - * Returns the pointer to the start of the formatted string. This utility only - * does unsigned values. - */ -PNG_INTERNAL_FUNCTION(png_charp,png_format_number,(png_const_charp start, - png_charp end, int format, png_alloc_size_t number),PNG_EMPTY); - -/* Convenience macro that takes an array: */ -#define PNG_FORMAT_NUMBER(buffer,format,number) \ - png_format_number(buffer, buffer + (sizeof buffer), format, number) - -/* Suggested size for a number buffer (enough for 64 bits and a sign!) */ -#define PNG_NUMBER_BUFFER_SIZE 24 - -/* These are the integer formats currently supported, the name is formed from - * the standard printf(3) format string. - */ -#define PNG_NUMBER_FORMAT_u 1 /* chose unsigned API! */ -#define PNG_NUMBER_FORMAT_02u 2 -#define PNG_NUMBER_FORMAT_d 1 /* chose signed API! */ -#define PNG_NUMBER_FORMAT_02d 2 -#define PNG_NUMBER_FORMAT_x 3 -#define PNG_NUMBER_FORMAT_02x 4 -#define PNG_NUMBER_FORMAT_fixed 5 /* choose the signed API */ -#endif - -#ifdef PNG_WARNINGS_SUPPORTED -/* New defines and members adding in libpng-1.5.4 */ -# define PNG_WARNING_PARAMETER_SIZE 32 -# define PNG_WARNING_PARAMETER_COUNT 8 /* Maximum 9; see pngerror.c */ - -/* An l-value of this type has to be passed to the APIs below to cache the - * values of the parameters to a formatted warning message. - */ -typedef char png_warning_parameters[PNG_WARNING_PARAMETER_COUNT][ - PNG_WARNING_PARAMETER_SIZE]; - -PNG_INTERNAL_FUNCTION(void,png_warning_parameter,(png_warning_parameters p, - int number, png_const_charp string),PNG_EMPTY); - /* Parameters are limited in size to PNG_WARNING_PARAMETER_SIZE characters, - * including the trailing '\0'. - */ -PNG_INTERNAL_FUNCTION(void,png_warning_parameter_unsigned, - (png_warning_parameters p, int number, int format, png_alloc_size_t value), - PNG_EMPTY); - /* Use png_alloc_size_t because it is an unsigned type as big as any we - * need to output. Use the following for a signed value. - */ -PNG_INTERNAL_FUNCTION(void,png_warning_parameter_signed, - (png_warning_parameters p, int number, int format, png_int_32 value), - PNG_EMPTY); - -PNG_INTERNAL_FUNCTION(void,png_formatted_warning,(png_const_structrp png_ptr, - png_warning_parameters p, png_const_charp message),PNG_EMPTY); - /* 'message' follows the X/Open approach of using @1, @2 to insert - * parameters previously supplied using the above functions. Errors in - * specifying the parameters will simply result in garbage substitutions. - */ -#endif - -#ifdef PNG_BENIGN_ERRORS_SUPPORTED -/* Application errors (new in 1.6); use these functions (declared below) for - * errors in the parameters or order of API function calls on read. The - * 'warning' should be used for an error that can be handled completely; the - * 'error' for one which can be handled safely but which may lose application - * information or settings. - * - * By default these both result in a png_error call prior to release, while in a - * released version the 'warning' is just a warning. However if the application - * explicitly disables benign errors (explicitly permitting the code to lose - * information) they both turn into warnings. - * - * If benign errors aren't supported they end up as the corresponding base call - * (png_warning or png_error.) - */ -PNG_INTERNAL_FUNCTION(void,png_app_warning,(png_const_structrp png_ptr, - png_const_charp message),PNG_EMPTY); - /* The application provided invalid parameters to an API function or called - * an API function at the wrong time, libpng can completely recover. - */ - -PNG_INTERNAL_FUNCTION(void,png_app_error,(png_const_structrp png_ptr, - png_const_charp message),PNG_EMPTY); - /* As above but libpng will ignore the call, or attempt some other partial - * recovery from the error. - */ -#else -# define png_app_warning(pp,s) png_warning(pp,s) -# define png_app_error(pp,s) png_error(pp,s) -#endif - -PNG_INTERNAL_FUNCTION(void,png_chunk_report,(png_const_structrp png_ptr, - png_const_charp message, int error),PNG_EMPTY); - /* Report a recoverable issue in chunk data. On read this is used to report - * a problem found while reading a particular chunk and the - * png_chunk_benign_error or png_chunk_warning function is used as - * appropriate. On write this is used to report an error that comes from - * data set via an application call to a png_set_ API and png_app_error or - * png_app_warning is used as appropriate. - * - * The 'error' parameter must have one of the following values: - */ -#define PNG_CHUNK_WARNING 0 /* never an error */ -#define PNG_CHUNK_WRITE_ERROR 1 /* an error only on write */ -#define PNG_CHUNK_ERROR 2 /* always an error */ - -/* ASCII to FP interfaces, currently only implemented if sCAL - * support is required. - */ -#if defined(PNG_sCAL_SUPPORTED) -/* MAX_DIGITS is actually the maximum number of characters in an sCAL - * width or height, derived from the precision (number of significant - * digits - a build time settable option) and assumptions about the - * maximum ridiculous exponent. - */ -#define PNG_sCAL_MAX_DIGITS (PNG_sCAL_PRECISION+1/*.*/+1/*E*/+10/*exponent*/) - -#ifdef PNG_FLOATING_POINT_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_ascii_from_fp,(png_const_structrp png_ptr, - png_charp ascii, png_size_t size, double fp, unsigned int precision), - PNG_EMPTY); -#endif /* FLOATING_POINT */ - -#ifdef PNG_FIXED_POINT_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_ascii_from_fixed,(png_const_structrp png_ptr, - png_charp ascii, png_size_t size, png_fixed_point fp),PNG_EMPTY); -#endif /* FIXED_POINT */ -#endif /* sCAL */ - -#if defined(PNG_sCAL_SUPPORTED) || defined(PNG_pCAL_SUPPORTED) -/* An internal API to validate the format of a floating point number. - * The result is the index of the next character. If the number is - * not valid it will be the index of a character in the supposed number. - * - * The format of a number is defined in the PNG extensions specification - * and this API is strictly conformant to that spec, not anyone elses! - * - * The format as a regular expression is: - * - * [+-]?[0-9]+.?([Ee][+-]?[0-9]+)? - * - * or: - * - * [+-]?.[0-9]+(.[0-9]+)?([Ee][+-]?[0-9]+)? - * - * The complexity is that either integer or fraction must be present and the - * fraction is permitted to have no digits only if the integer is present. - * - * NOTE: The dangling E problem. - * There is a PNG valid floating point number in the following: - * - * PNG floating point numbers are not greedy. - * - * Working this out requires *TWO* character lookahead (because of the - * sign), the parser does not do this - it will fail at the 'r' - this - * doesn't matter for PNG sCAL chunk values, but it requires more care - * if the value were ever to be embedded in something more complex. Use - * ANSI-C strtod if you need the lookahead. - */ -/* State table for the parser. */ -#define PNG_FP_INTEGER 0 /* before or in integer */ -#define PNG_FP_FRACTION 1 /* before or in fraction */ -#define PNG_FP_EXPONENT 2 /* before or in exponent */ -#define PNG_FP_STATE 3 /* mask for the above */ -#define PNG_FP_SAW_SIGN 4 /* Saw +/- in current state */ -#define PNG_FP_SAW_DIGIT 8 /* Saw a digit in current state */ -#define PNG_FP_SAW_DOT 16 /* Saw a dot in current state */ -#define PNG_FP_SAW_E 32 /* Saw an E (or e) in current state */ -#define PNG_FP_SAW_ANY 60 /* Saw any of the above 4 */ - -/* These three values don't affect the parser. They are set but not used. - */ -#define PNG_FP_WAS_VALID 64 /* Preceding substring is a valid fp number */ -#define PNG_FP_NEGATIVE 128 /* A negative number, including "-0" */ -#define PNG_FP_NONZERO 256 /* A non-zero value */ -#define PNG_FP_STICKY 448 /* The above three flags */ - -/* This is available for the caller to store in 'state' if required. Do not - * call the parser after setting it (the parser sometimes clears it.) - */ -#define PNG_FP_INVALID 512 /* Available for callers as a distinct value */ - -/* Result codes for the parser (boolean - true meants ok, false means - * not ok yet.) - */ -#define PNG_FP_MAYBE 0 /* The number may be valid in the future */ -#define PNG_FP_OK 1 /* The number is valid */ - -/* Tests on the sticky non-zero and negative flags. To pass these checks - * the state must also indicate that the whole number is valid - this is - * achieved by testing PNG_FP_SAW_DIGIT (see the implementation for why this - * is equivalent to PNG_FP_OK above.) - */ -#define PNG_FP_NZ_MASK (PNG_FP_SAW_DIGIT | PNG_FP_NEGATIVE | PNG_FP_NONZERO) - /* NZ_MASK: the string is valid and a non-zero negative value */ -#define PNG_FP_Z_MASK (PNG_FP_SAW_DIGIT | PNG_FP_NONZERO) - /* Z MASK: the string is valid and a non-zero value. */ - /* PNG_FP_SAW_DIGIT: the string is valid. */ -#define PNG_FP_IS_ZERO(state) (((state) & PNG_FP_Z_MASK) == PNG_FP_SAW_DIGIT) -#define PNG_FP_IS_POSITIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_Z_MASK) -#define PNG_FP_IS_NEGATIVE(state) (((state) & PNG_FP_NZ_MASK) == PNG_FP_NZ_MASK) - -/* The actual parser. This can be called repeatedly. It updates - * the index into the string and the state variable (which must - * be initialized to 0). It returns a result code, as above. There - * is no point calling the parser any more if it fails to advance to - * the end of the string - it is stuck on an invalid character (or - * terminated by '\0'). - * - * Note that the pointer will consume an E or even an E+ and then leave - * a 'maybe' state even though a preceding integer.fraction is valid. - * The PNG_FP_WAS_VALID flag indicates that a preceding substring was - * a valid number. It's possible to recover from this by calling - * the parser again (from the start, with state 0) but with a string - * that omits the last character (i.e. set the size to the index of - * the problem character.) This has not been tested within libpng. - */ -PNG_INTERNAL_FUNCTION(int,png_check_fp_number,(png_const_charp string, - png_size_t size, int *statep, png_size_tp whereami),PNG_EMPTY); - -/* This is the same but it checks a complete string and returns true - * only if it just contains a floating point number. As of 1.5.4 this - * function also returns the state at the end of parsing the number if - * it was valid (otherwise it returns 0.) This can be used for testing - * for negative or zero values using the sticky flag. - */ -PNG_INTERNAL_FUNCTION(int,png_check_fp_string,(png_const_charp string, - png_size_t size),PNG_EMPTY); -#endif /* pCAL || sCAL */ - -#if defined(PNG_READ_GAMMA_SUPPORTED) ||\ - defined(PNG_INCH_CONVERSIONS_SUPPORTED) || defined(PNG_READ_pHYs_SUPPORTED) -/* Added at libpng version 1.5.0 */ -/* This is a utility to provide a*times/div (rounded) and indicate - * if there is an overflow. The result is a boolean - false (0) - * for overflow, true (1) if no overflow, in which case *res - * holds the result. - */ -PNG_INTERNAL_FUNCTION(int,png_muldiv,(png_fixed_point_p res, png_fixed_point a, - png_int_32 multiplied_by, png_int_32 divided_by),PNG_EMPTY); -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_INCH_CONVERSIONS_SUPPORTED) -/* Same deal, but issue a warning on overflow and return 0. */ -PNG_INTERNAL_FUNCTION(png_fixed_point,png_muldiv_warn, - (png_const_structrp png_ptr, png_fixed_point a, png_int_32 multiplied_by, - png_int_32 divided_by),PNG_EMPTY); -#endif - -#ifdef PNG_GAMMA_SUPPORTED -/* Calculate a reciprocal - used for gamma values. This returns - * 0 if the argument is 0 in order to maintain an undefined value; - * there are no warnings. - */ -PNG_INTERNAL_FUNCTION(png_fixed_point,png_reciprocal,(png_fixed_point a), - PNG_EMPTY); - -#ifdef PNG_READ_GAMMA_SUPPORTED -/* The same but gives a reciprocal of the product of two fixed point - * values. Accuracy is suitable for gamma calculations but this is - * not exact - use png_muldiv for that. Only required at present on read. - */ -PNG_INTERNAL_FUNCTION(png_fixed_point,png_reciprocal2,(png_fixed_point a, - png_fixed_point b),PNG_EMPTY); -#endif - -/* Return true if the gamma value is significantly different from 1.0 */ -PNG_INTERNAL_FUNCTION(int,png_gamma_significant,(png_fixed_point gamma_value), - PNG_EMPTY); -#endif - -#ifdef PNG_READ_GAMMA_SUPPORTED -/* Internal fixed point gamma correction. These APIs are called as - * required to convert single values - they don't need to be fast, - * they are not used when processing image pixel values. - * - * While the input is an 'unsigned' value it must actually be the - * correct bit value - 0..255 or 0..65535 as required. - */ -PNG_INTERNAL_FUNCTION(png_uint_16,png_gamma_correct,(png_structrp png_ptr, - unsigned int value, png_fixed_point gamma_value),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(png_uint_16,png_gamma_16bit_correct,(unsigned int value, - png_fixed_point gamma_value),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(png_byte,png_gamma_8bit_correct,(unsigned int value, - png_fixed_point gamma_value),PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_destroy_gamma_table,(png_structrp png_ptr), - PNG_EMPTY); -PNG_INTERNAL_FUNCTION(void,png_build_gamma_table,(png_structrp png_ptr, - int bit_depth),PNG_EMPTY); -#endif - -/* SIMPLIFIED READ/WRITE SUPPORT */ -#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) ||\ - defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) -/* The internal structure that png_image::opaque points to. */ -typedef struct png_control -{ - png_structp png_ptr; - png_infop info_ptr; - png_voidp error_buf; /* Always a jmp_buf at present. */ - - png_const_bytep memory; /* Memory buffer. */ - png_size_t size; /* Size of the memory buffer. */ - - unsigned int for_write :1; /* Otherwise it is a read structure */ - unsigned int owned_file :1; /* We own the file in io_ptr */ -} png_control; - -/* Return the pointer to the jmp_buf from a png_control: necessary because C - * does not reveal the type of the elements of jmp_buf. - */ -#ifdef __cplusplus -# define png_control_jmp_buf(pc) (((jmp_buf*)((pc)->error_buf))[0]) -#else -# define png_control_jmp_buf(pc) ((pc)->error_buf) -#endif - -/* Utility to safely execute a piece of libpng code catching and logging any - * errors that might occur. Returns true on success, false on failure (either - * of the function or as a result of a png_error.) - */ -PNG_INTERNAL_FUNCTION(void,png_safe_error,(png_structp png_ptr, - png_const_charp error_message),PNG_NORETURN); - -#ifdef PNG_WARNINGS_SUPPORTED -PNG_INTERNAL_FUNCTION(void,png_safe_warning,(png_structp png_ptr, - png_const_charp warning_message),PNG_EMPTY); -#else -# define png_safe_warning 0/*dummy argument*/ -#endif - -PNG_INTERNAL_FUNCTION(int,png_safe_execute,(png_imagep image, - int (*function)(png_voidp), png_voidp arg),PNG_EMPTY); - -/* Utility to log an error; this also cleans up the png_image; the function - * always returns 0 (false). - */ -PNG_INTERNAL_FUNCTION(int,png_image_error,(png_imagep image, - png_const_charp error_message),PNG_EMPTY); - -#ifndef PNG_SIMPLIFIED_READ_SUPPORTED -/* png_image_free is used by the write code but not exported */ -PNG_INTERNAL_FUNCTION(void, png_image_free, (png_imagep image), PNG_EMPTY); -#endif /* !SIMPLIFIED_READ */ - -#endif /* SIMPLIFIED READ/WRITE */ - -#ifdef PNG_FILTER_OPTIMIZATIONS -PNG_INTERNAL_FUNCTION(void, PNG_FILTER_OPTIMIZATIONS, (png_structp png_ptr, - unsigned int bpp), PNG_EMPTY); - /* This is the initialization function for hardware specific optimizations, - * one implementation (for ARM NEON machines) is contained in - * arm/filter_neon.c. It need not be defined - the generic code will be used - * if not. - */ -#endif - -/* Maintainer: Put new private prototypes here ^ */ - -//#include "pngdebug.h" - -#endif /* PNG_VERSION_INFO_ONLY */ -#endif /* PNGPRIV_H */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngread.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngread.c deleted file mode 100755 index f7bde96..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngread.c +++ /dev/null @@ -1,4000 +0,0 @@ - -/* pngread.c - read a PNG file - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - * This file contains routines that an application calls directly to - * read a PNG file or stream. - */ - -#include "pngpriv.h" -#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) && defined(PNG_STDIO_SUPPORTED) -# include -#endif - -#ifdef PNG_READ_SUPPORTED - -/* Create a PNG structure for reading, and allocate any memory needed. */ -PNG_FUNCTION(png_structp,PNGAPI -png_create_read_struct,(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED) -{ -#ifndef PNG_USER_MEM_SUPPORTED - png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr, - error_fn, warn_fn, NULL, NULL, NULL); -#else - return png_create_read_struct_2(user_png_ver, error_ptr, error_fn, - warn_fn, NULL, NULL, NULL); -} - -/* Alternate create PNG structure for reading, and allocate any memory - * needed. - */ -PNG_FUNCTION(png_structp,PNGAPI -png_create_read_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED) -{ - png_structp png_ptr = png_create_png_struct(user_png_ver, error_ptr, - error_fn, warn_fn, mem_ptr, malloc_fn, free_fn); -#endif /* PNG_USER_MEM_SUPPORTED */ - - if (png_ptr != NULL) - { - png_ptr->mode = PNG_IS_READ_STRUCT; - - /* Added in libpng-1.6.0; this can be used to detect a read structure if - * required (it will be zero in a write structure.) - */ -# ifdef PNG_SEQUENTIAL_READ_SUPPORTED - png_ptr->IDAT_read_size = PNG_IDAT_READ_SIZE; -# endif - -# ifdef PNG_BENIGN_READ_ERRORS_SUPPORTED - png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN; - - /* In stable builds only warn if an application error can be completely - * handled. - */ -# if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC - png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN; -# endif -# endif - - /* TODO: delay this, it can be done in png_init_io (if the app doesn't - * do it itself) avoiding setting the default function if it is not - * required. - */ - png_set_read_fn(png_ptr, NULL, NULL); - } - - return png_ptr; -} - - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read the information before the actual image data. This has been - * changed in v0.90 to allow reading a file that already has the magic - * bytes read from the stream. You can tell libpng how many bytes have - * been read from the beginning of the stream (up to the maximum of 8) - * via png_set_sig_bytes(), and we will only check the remaining bytes - * here. The application can then have access to the signature bytes we - * read if it is determined that this isn't a valid PNG file. - */ -void PNGAPI -png_read_info(png_structrp png_ptr, png_inforp info_ptr) -{ -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - int keep; -#endif - - png_debug(1, "in png_read_info"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - /* Read and check the PNG file signature. */ - png_read_sig(png_ptr, info_ptr); - - for (;;) - { - png_uint_32 length = png_read_chunk_header(png_ptr); - png_uint_32 chunk_name = png_ptr->chunk_name; - - /* IDAT logic needs to happen here to simplify getting the two flags - * right. - */ - if (chunk_name == png_IDAT) - { - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "Missing IHDR before IDAT"); - - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE)) - png_chunk_error(png_ptr, "Missing PLTE before IDAT"); - - else if (png_ptr->mode & PNG_AFTER_IDAT) - png_chunk_benign_error(png_ptr, "Too many IDATs found"); - - png_ptr->mode |= PNG_HAVE_IDAT; - } - - else if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - - /* This should be a binary subdivision search or a hash for - * matching the chunk name rather than a linear search. - */ - if (chunk_name == png_IHDR) - png_handle_IHDR(png_ptr, info_ptr, length); - - else if (chunk_name == png_IEND) - png_handle_IEND(png_ptr, info_ptr, length); - -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0) - { - png_handle_unknown(png_ptr, info_ptr, length, keep); - - if (chunk_name == png_PLTE) - png_ptr->mode |= PNG_HAVE_PLTE; - - else if (chunk_name == png_IDAT) - { - png_ptr->idat_size = 0; /* It has been consumed */ - break; - } - } -#endif - else if (chunk_name == png_PLTE) - png_handle_PLTE(png_ptr, info_ptr, length); - - else if (chunk_name == png_IDAT) - { - png_ptr->idat_size = length; - break; - } - -#ifdef PNG_READ_bKGD_SUPPORTED - else if (chunk_name == png_bKGD) - png_handle_bKGD(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_cHRM_SUPPORTED - else if (chunk_name == png_cHRM) - png_handle_cHRM(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_gAMA_SUPPORTED - else if (chunk_name == png_gAMA) - png_handle_gAMA(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_hIST_SUPPORTED - else if (chunk_name == png_hIST) - png_handle_hIST(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_oFFs_SUPPORTED - else if (chunk_name == png_oFFs) - png_handle_oFFs(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_pCAL_SUPPORTED - else if (chunk_name == png_pCAL) - png_handle_pCAL(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_sCAL_SUPPORTED - else if (chunk_name == png_sCAL) - png_handle_sCAL(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_pHYs_SUPPORTED - else if (chunk_name == png_pHYs) - png_handle_pHYs(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_sBIT_SUPPORTED - else if (chunk_name == png_sBIT) - png_handle_sBIT(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_sRGB_SUPPORTED - else if (chunk_name == png_sRGB) - png_handle_sRGB(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_iCCP_SUPPORTED - else if (chunk_name == png_iCCP) - png_handle_iCCP(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_sPLT_SUPPORTED - else if (chunk_name == png_sPLT) - png_handle_sPLT(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_tEXt_SUPPORTED - else if (chunk_name == png_tEXt) - png_handle_tEXt(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_tIME_SUPPORTED - else if (chunk_name == png_tIME) - png_handle_tIME(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_tRNS_SUPPORTED - else if (chunk_name == png_tRNS) - png_handle_tRNS(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_zTXt_SUPPORTED - else if (chunk_name == png_zTXt) - png_handle_zTXt(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_iTXt_SUPPORTED - else if (chunk_name == png_iTXt) - png_handle_iTXt(png_ptr, info_ptr, length); -#endif - - else - png_handle_unknown(png_ptr, info_ptr, length, - PNG_HANDLE_CHUNK_AS_DEFAULT); - } -} -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ - -/* Optional call to update the users info_ptr structure */ -void PNGAPI -png_read_update_info(png_structrp png_ptr, png_inforp info_ptr) -{ - png_debug(1, "in png_read_update_info"); - - if (png_ptr != NULL) - { - if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0) - { - png_read_start_row(png_ptr); - -# ifdef PNG_READ_TRANSFORMS_SUPPORTED - png_read_transform_info(png_ptr, info_ptr); -# else - PNG_UNUSED(info_ptr) -# endif - } - - /* New in 1.6.0 this avoids the bug of doing the initializations twice */ - else - png_app_error(png_ptr, - "png_read_update_info/png_start_read_image: duplicate call"); - } -} - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Initialize palette, background, etc, after transformations - * are set, but before any reading takes place. This allows - * the user to obtain a gamma-corrected palette, for example. - * If the user doesn't call this, we will do it ourselves. - */ -void PNGAPI -png_start_read_image(png_structrp png_ptr) -{ - png_debug(1, "in png_start_read_image"); - - if (png_ptr != NULL) - { - if ((png_ptr->flags & PNG_FLAG_ROW_INIT) == 0) - png_read_start_row(png_ptr); - - /* New in 1.6.0 this avoids the bug of doing the initializations twice */ - else - png_app_error(png_ptr, - "png_start_read_image/png_read_update_info: duplicate call"); - } -} -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -void PNGAPI -png_read_row(png_structrp png_ptr, png_bytep row, png_bytep dsp_row) -{ - png_row_info row_info; - - if (png_ptr == NULL) - return; - - png_debug2(1, "in png_read_row (row %lu, pass %d)", - (unsigned long)png_ptr->row_number, png_ptr->pass); - - /* png_read_start_row sets the information (in particular iwidth) for this - * interlace pass. - */ - if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) - png_read_start_row(png_ptr); - - /* 1.5.6: row_info moved out of png_struct to a local here. */ - row_info.width = png_ptr->iwidth; /* NOTE: width of current interlaced row */ - row_info.color_type = png_ptr->color_type; - row_info.bit_depth = png_ptr->bit_depth; - row_info.channels = png_ptr->channels; - row_info.pixel_depth = png_ptr->pixel_depth; - row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width); - - if (png_ptr->row_number == 0 && png_ptr->pass == 0) - { - /* Check for transforms that have been set but were defined out */ -#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_MONO) - png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined"); -#endif - -#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED) - if (png_ptr->transformations & PNG_FILLER) - png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined"); -#endif - -#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \ - !defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined"); -#endif - -#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED) - if (png_ptr->transformations & PNG_PACK) - png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined"); -#endif - -#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) - if (png_ptr->transformations & PNG_SHIFT) - png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined"); -#endif - -#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED) - if (png_ptr->transformations & PNG_BGR) - png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined"); -#endif - -#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_BYTES) - png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined"); -#endif - } - -#ifdef PNG_READ_INTERLACING_SUPPORTED - /* If interlaced and we do not need a new row, combine row and return. - * Notice that the pixels we have from previous rows have been transformed - * already; we can only combine like with like (transformed or - * untransformed) and, because of the libpng API for interlaced images, this - * means we must transform before de-interlacing. - */ - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) - { - switch (png_ptr->pass) - { - case 0: - if (png_ptr->row_number & 0x07) - { - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, 1/*display*/); - png_read_finish_row(png_ptr); - return; - } - break; - - case 1: - if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) - { - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, 1/*display*/); - - png_read_finish_row(png_ptr); - return; - } - break; - - case 2: - if ((png_ptr->row_number & 0x07) != 4) - { - if (dsp_row != NULL && (png_ptr->row_number & 4)) - png_combine_row(png_ptr, dsp_row, 1/*display*/); - - png_read_finish_row(png_ptr); - return; - } - break; - - case 3: - if ((png_ptr->row_number & 3) || png_ptr->width < 3) - { - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, 1/*display*/); - - png_read_finish_row(png_ptr); - return; - } - break; - - case 4: - if ((png_ptr->row_number & 3) != 2) - { - if (dsp_row != NULL && (png_ptr->row_number & 2)) - png_combine_row(png_ptr, dsp_row, 1/*display*/); - - png_read_finish_row(png_ptr); - return; - } - break; - - case 5: - if ((png_ptr->row_number & 1) || png_ptr->width < 2) - { - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, 1/*display*/); - - png_read_finish_row(png_ptr); - return; - } - break; - - default: - case 6: - if (!(png_ptr->row_number & 1)) - { - png_read_finish_row(png_ptr); - return; - } - break; - } - } -#endif - - if (!(png_ptr->mode & PNG_HAVE_IDAT)) - png_error(png_ptr, "Invalid attempt to read row data"); - - /* Fill the row with IDAT data: */ - png_read_IDAT_data(png_ptr, png_ptr->row_buf, row_info.rowbytes + 1); - - if (png_ptr->row_buf[0] > PNG_FILTER_VALUE_NONE) - { - if (png_ptr->row_buf[0] < PNG_FILTER_VALUE_LAST) - png_read_filter_row(png_ptr, &row_info, png_ptr->row_buf + 1, - png_ptr->prev_row + 1, png_ptr->row_buf[0]); - else - png_error(png_ptr, "bad adaptive filter value"); - } - - /* libpng 1.5.6: the following line was copying png_ptr->rowbytes before - * 1.5.6, while the buffer really is this big in current versions of libpng - * it may not be in the future, so this was changed just to copy the - * interlaced count: - */ - memcpy(png_ptr->prev_row, png_ptr->row_buf, row_info.rowbytes + 1); - -#ifdef PNG_MNG_FEATURES_SUPPORTED - if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) - { - /* Intrapixel differencing */ - png_do_read_intrapixel(&row_info, png_ptr->row_buf + 1); - } -#endif - - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED - if (png_ptr->transformations) - png_do_read_transformations(png_ptr, &row_info); -#endif - - /* The transformed pixel depth should match the depth now in row_info. */ - if (png_ptr->transformed_pixel_depth == 0) - { - png_ptr->transformed_pixel_depth = row_info.pixel_depth; - if (row_info.pixel_depth > png_ptr->maximum_pixel_depth) - png_error(png_ptr, "sequential row overflow"); - } - - else if (png_ptr->transformed_pixel_depth != row_info.pixel_depth) - png_error(png_ptr, "internal sequential row size calculation error"); - -#ifdef PNG_READ_INTERLACING_SUPPORTED - /* Blow up interlaced rows to full size */ - if (png_ptr->interlaced && - (png_ptr->transformations & PNG_INTERLACE)) - { - if (png_ptr->pass < 6) - png_do_read_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass, - png_ptr->transformations); - - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, 1/*display*/); - - if (row != NULL) - png_combine_row(png_ptr, row, 0/*row*/); - } - - else -#endif - { - if (row != NULL) - png_combine_row(png_ptr, row, -1/*ignored*/); - - if (dsp_row != NULL) - png_combine_row(png_ptr, dsp_row, -1/*ignored*/); - } - png_read_finish_row(png_ptr); - - if (png_ptr->read_row_fn != NULL) - (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); - -} -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read one or more rows of image data. If the image is interlaced, - * and png_set_interlace_handling() has been called, the rows need to - * contain the contents of the rows from the previous pass. If the - * image has alpha or transparency, and png_handle_alpha()[*] has been - * called, the rows contents must be initialized to the contents of the - * screen. - * - * "row" holds the actual image, and pixels are placed in it - * as they arrive. If the image is displayed after each pass, it will - * appear to "sparkle" in. "display_row" can be used to display a - * "chunky" progressive image, with finer detail added as it becomes - * available. If you do not want this "chunky" display, you may pass - * NULL for display_row. If you do not want the sparkle display, and - * you have not called png_handle_alpha(), you may pass NULL for rows. - * If you have called png_handle_alpha(), and the image has either an - * alpha channel or a transparency chunk, you must provide a buffer for - * rows. In this case, you do not have to provide a display_row buffer - * also, but you may. If the image is not interlaced, or if you have - * not called png_set_interlace_handling(), the display_row buffer will - * be ignored, so pass NULL to it. - * - * [*] png_handle_alpha() does not exist yet, as of this version of libpng - */ - -void PNGAPI -png_read_rows(png_structrp png_ptr, png_bytepp row, - png_bytepp display_row, png_uint_32 num_rows) -{ - png_uint_32 i; - png_bytepp rp; - png_bytepp dp; - - png_debug(1, "in png_read_rows"); - - if (png_ptr == NULL) - return; - - rp = row; - dp = display_row; - if (rp != NULL && dp != NULL) - for (i = 0; i < num_rows; i++) - { - png_bytep rptr = *rp++; - png_bytep dptr = *dp++; - - png_read_row(png_ptr, rptr, dptr); - } - - else if (rp != NULL) - for (i = 0; i < num_rows; i++) - { - png_bytep rptr = *rp; - png_read_row(png_ptr, rptr, NULL); - rp++; - } - - else if (dp != NULL) - for (i = 0; i < num_rows; i++) - { - png_bytep dptr = *dp; - png_read_row(png_ptr, NULL, dptr); - dp++; - } -} -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read the entire image. If the image has an alpha channel or a tRNS - * chunk, and you have called png_handle_alpha()[*], you will need to - * initialize the image to the current image that PNG will be overlaying. - * We set the num_rows again here, in case it was incorrectly set in - * png_read_start_row() by a call to png_read_update_info() or - * png_start_read_image() if png_set_interlace_handling() wasn't called - * prior to either of these functions like it should have been. You can - * only call this function once. If you desire to have an image for - * each pass of a interlaced image, use png_read_rows() instead. - * - * [*] png_handle_alpha() does not exist yet, as of this version of libpng - */ -void PNGAPI -png_read_image(png_structrp png_ptr, png_bytepp image) -{ - png_uint_32 i, image_height; - int pass, j; - png_bytepp rp; - - png_debug(1, "in png_read_image"); - - if (png_ptr == NULL) - return; - -#ifdef PNG_READ_INTERLACING_SUPPORTED - if (!(png_ptr->flags & PNG_FLAG_ROW_INIT)) - { - pass = png_set_interlace_handling(png_ptr); - /* And make sure transforms are initialized. */ - png_start_read_image(png_ptr); - } - else - { - if (png_ptr->interlaced && !(png_ptr->transformations & PNG_INTERLACE)) - { - /* Caller called png_start_read_image or png_read_update_info without - * first turning on the PNG_INTERLACE transform. We can fix this here, - * but the caller should do it! - */ - png_warning(png_ptr, "Interlace handling should be turned on when " - "using png_read_image"); - /* Make sure this is set correctly */ - png_ptr->num_rows = png_ptr->height; - } - - /* Obtain the pass number, which also turns on the PNG_INTERLACE flag in - * the above error case. - */ - pass = png_set_interlace_handling(png_ptr); - } -#else - if (png_ptr->interlaced) - png_error(png_ptr, - "Cannot read interlaced image -- interlace handler disabled"); - - pass = 1; -#endif - - image_height=png_ptr->height; - - for (j = 0; j < pass; j++) - { - rp = image; - for (i = 0; i < image_height; i++) - { - png_read_row(png_ptr, *rp, NULL); - rp++; - } - } -} -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read the end of the PNG file. Will not read past the end of the - * file, will verify the end is accurate, and will read any comments - * or time information at the end of the file, if info is not NULL. - */ -void PNGAPI -png_read_end(png_structrp png_ptr, png_inforp info_ptr) -{ -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - int keep; -#endif - - png_debug(1, "in png_read_end"); - - if (png_ptr == NULL) - return; - - /* If png_read_end is called in the middle of reading the rows there may - * still be pending IDAT data and an owned zstream. Deal with this here. - */ -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - if (!png_chunk_unknown_handling(png_ptr, png_IDAT)) -#endif - png_read_finish_IDAT(png_ptr); - -#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED - /* Report invalid palette index; added at libng-1.5.10 */ - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - png_ptr->num_palette_max > png_ptr->num_palette) - png_benign_error(png_ptr, "Read palette index exceeding num_palette"); -#endif - - do - { - png_uint_32 length = png_read_chunk_header(png_ptr); - png_uint_32 chunk_name = png_ptr->chunk_name; - - if (chunk_name == png_IHDR) - png_handle_IHDR(png_ptr, info_ptr, length); - - else if (chunk_name == png_IEND) - png_handle_IEND(png_ptr, info_ptr, length); - -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED - else if ((keep = png_chunk_unknown_handling(png_ptr, chunk_name)) != 0) - { - if (chunk_name == png_IDAT) - { - if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) - png_benign_error(png_ptr, "Too many IDATs found"); - } - png_handle_unknown(png_ptr, info_ptr, length, keep); - if (chunk_name == png_PLTE) - png_ptr->mode |= PNG_HAVE_PLTE; - } -#endif - - else if (chunk_name == png_IDAT) - { - /* Zero length IDATs are legal after the last IDAT has been - * read, but not after other chunks have been read. - */ - if ((length > 0) || (png_ptr->mode & PNG_HAVE_CHUNK_AFTER_IDAT)) - png_benign_error(png_ptr, "Too many IDATs found"); - - png_crc_finish(png_ptr, length); - } - else if (chunk_name == png_PLTE) - png_handle_PLTE(png_ptr, info_ptr, length); - -#ifdef PNG_READ_bKGD_SUPPORTED - else if (chunk_name == png_bKGD) - png_handle_bKGD(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_cHRM_SUPPORTED - else if (chunk_name == png_cHRM) - png_handle_cHRM(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_gAMA_SUPPORTED - else if (chunk_name == png_gAMA) - png_handle_gAMA(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_hIST_SUPPORTED - else if (chunk_name == png_hIST) - png_handle_hIST(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_oFFs_SUPPORTED - else if (chunk_name == png_oFFs) - png_handle_oFFs(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_pCAL_SUPPORTED - else if (chunk_name == png_pCAL) - png_handle_pCAL(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_sCAL_SUPPORTED - else if (chunk_name == png_sCAL) - png_handle_sCAL(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_pHYs_SUPPORTED - else if (chunk_name == png_pHYs) - png_handle_pHYs(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_sBIT_SUPPORTED - else if (chunk_name == png_sBIT) - png_handle_sBIT(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_sRGB_SUPPORTED - else if (chunk_name == png_sRGB) - png_handle_sRGB(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_iCCP_SUPPORTED - else if (chunk_name == png_iCCP) - png_handle_iCCP(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_sPLT_SUPPORTED - else if (chunk_name == png_sPLT) - png_handle_sPLT(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_tEXt_SUPPORTED - else if (chunk_name == png_tEXt) - png_handle_tEXt(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_tIME_SUPPORTED - else if (chunk_name == png_tIME) - png_handle_tIME(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_tRNS_SUPPORTED - else if (chunk_name == png_tRNS) - png_handle_tRNS(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_zTXt_SUPPORTED - else if (chunk_name == png_zTXt) - png_handle_zTXt(png_ptr, info_ptr, length); -#endif - -#ifdef PNG_READ_iTXt_SUPPORTED - else if (chunk_name == png_iTXt) - png_handle_iTXt(png_ptr, info_ptr, length); -#endif - - else - png_handle_unknown(png_ptr, info_ptr, length, - PNG_HANDLE_CHUNK_AS_DEFAULT); - } while (!(png_ptr->mode & PNG_HAVE_IEND)); -} -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ - -/* Free all memory used in the read struct */ -static void -png_read_destroy(png_structrp png_ptr) -{ - png_debug(1, "in png_read_destroy"); - -#ifdef PNG_READ_GAMMA_SUPPORTED - png_destroy_gamma_table(png_ptr); -#endif - - png_free(png_ptr, png_ptr->big_row_buf); - png_free(png_ptr, png_ptr->big_prev_row); - png_free(png_ptr, png_ptr->read_buffer); - -#ifdef PNG_READ_QUANTIZE_SUPPORTED - png_free(png_ptr, png_ptr->palette_lookup); - png_free(png_ptr, png_ptr->quantize_index); -#endif - - if (png_ptr->free_me & PNG_FREE_PLTE) - png_zfree(png_ptr, png_ptr->palette); - png_ptr->free_me &= ~PNG_FREE_PLTE; - -#if defined(PNG_tRNS_SUPPORTED) || \ - defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - if (png_ptr->free_me & PNG_FREE_TRNS) - png_free(png_ptr, png_ptr->trans_alpha); - png_ptr->free_me &= ~PNG_FREE_TRNS; -#endif - - inflateEnd(&png_ptr->zstream); - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED - png_free(png_ptr, png_ptr->save_buffer); -#endif - -#if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) &&\ - defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) - png_free(png_ptr, png_ptr->unknown_chunk.data); -#endif - -#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED - png_free(png_ptr, png_ptr->chunk_list); -#endif - - /* NOTE: the 'setjmp' buffer may still be allocated and the memory and error - * callbacks are still set at this point. They are required to complete the - * destruction of the png_struct itself. - */ -} - -/* Free all memory used by the read */ -void PNGAPI -png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, - png_infopp end_info_ptr_ptr) -{ - png_structrp png_ptr = NULL; - - png_debug(1, "in png_destroy_read_struct"); - - if (png_ptr_ptr != NULL) - png_ptr = *png_ptr_ptr; - - if (png_ptr == NULL) - return; - - /* libpng 1.6.0: use the API to destroy info structs to ensure consistent - * behavior. Prior to 1.6.0 libpng did extra 'info' destruction in this API. - * The extra was, apparently, unnecessary yet this hides memory leak bugs. - */ - png_destroy_info_struct(png_ptr, end_info_ptr_ptr); - png_destroy_info_struct(png_ptr, info_ptr_ptr); - - *png_ptr_ptr = NULL; - png_read_destroy(png_ptr); - png_destroy_png_struct(png_ptr); -} - -void PNGAPI -png_set_read_status_fn(png_structrp png_ptr, png_read_status_ptr read_row_fn) -{ - if (png_ptr == NULL) - return; - - png_ptr->read_row_fn = read_row_fn; -} - - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -#ifdef PNG_INFO_IMAGE_SUPPORTED -void PNGAPI -png_read_png(png_structrp png_ptr, png_inforp info_ptr, - int transforms, - voidp params) -{ - int row; - - if (png_ptr == NULL || info_ptr == NULL) - return; - - /* png_read_info() gives us all of the information from the - * PNG file before the first IDAT (image data chunk). - */ - png_read_info(png_ptr, info_ptr); - if (info_ptr->height > PNG_UINT_32_MAX/(sizeof (png_bytep))) - png_error(png_ptr, "Image is too high to process with png_read_png()"); - - /* -------------- image transformations start here ------------------- */ - -#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED - /* Tell libpng to strip 16-bit/color files down to 8 bits per color. - */ - if (transforms & PNG_TRANSFORM_SCALE_16) - { - /* Added at libpng-1.5.4. "strip_16" produces the same result that it - * did in earlier versions, while "scale_16" is now more accurate. - */ - png_set_scale_16(png_ptr); - } -#endif - -#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED - /* If both SCALE and STRIP are required pngrtran will effectively cancel the - * latter by doing SCALE first. This is ok and allows apps not to check for - * which is supported to get the right answer. - */ - if (transforms & PNG_TRANSFORM_STRIP_16) - png_set_strip_16(png_ptr); -#endif - -#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - /* Strip alpha bytes from the input data without combining with - * the background (not recommended). - */ - if (transforms & PNG_TRANSFORM_STRIP_ALPHA) - png_set_strip_alpha(png_ptr); -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED) - /* Extract multiple pixels with bit depths of 1, 2, or 4 from a single - * byte into separate bytes (useful for paletted and grayscale images). - */ - if (transforms & PNG_TRANSFORM_PACKING) - png_set_packing(png_ptr); -#endif - -#ifdef PNG_READ_PACKSWAP_SUPPORTED - /* Change the order of packed pixels to least significant bit first - * (not useful if you are using png_set_packing). - */ - if (transforms & PNG_TRANSFORM_PACKSWAP) - png_set_packswap(png_ptr); -#endif - -#ifdef PNG_READ_EXPAND_SUPPORTED - /* Expand paletted colors into true RGB triplets - * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel - * Expand paletted or RGB images with transparency to full alpha - * channels so the data will be available as RGBA quartets. - */ - if (transforms & PNG_TRANSFORM_EXPAND) - if ((png_ptr->bit_depth < 8) || - (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) || - (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS))) - png_set_expand(png_ptr); -#endif - - /* We don't handle background color or gamma transformation or quantizing. - */ - -#ifdef PNG_READ_INVERT_SUPPORTED - /* Invert monochrome files to have 0 as white and 1 as black - */ - if (transforms & PNG_TRANSFORM_INVERT_MONO) - png_set_invert_mono(png_ptr); -#endif - -#ifdef PNG_READ_SHIFT_SUPPORTED - /* If you want to shift the pixel values from the range [0,255] or - * [0,65535] to the original [0,7] or [0,31], or whatever range the - * colors were originally in: - */ - if ((transforms & PNG_TRANSFORM_SHIFT) - && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT)) - { - png_color_8p sig_bit = 0; - - png_get_sBIT(png_ptr, info_ptr, &sig_bit); - png_set_shift(png_ptr, sig_bit); - } -#endif - -#ifdef PNG_READ_BGR_SUPPORTED - /* Flip the RGB pixels to BGR (or RGBA to BGRA) */ - if (transforms & PNG_TRANSFORM_BGR) - png_set_bgr(png_ptr); -#endif - -#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED - /* Swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */ - if (transforms & PNG_TRANSFORM_SWAP_ALPHA) - png_set_swap_alpha(png_ptr); -#endif - -#ifdef PNG_READ_SWAP_SUPPORTED - /* Swap bytes of 16-bit files to least significant byte first */ - if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) - png_set_swap(png_ptr); -#endif - -/* Added at libpng-1.2.41 */ -#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED - /* Invert the alpha channel from opacity to transparency */ - if (transforms & PNG_TRANSFORM_INVERT_ALPHA) - png_set_invert_alpha(png_ptr); -#endif - -/* Added at libpng-1.2.41 */ -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED - /* Expand grayscale image to RGB */ - if (transforms & PNG_TRANSFORM_GRAY_TO_RGB) - png_set_gray_to_rgb(png_ptr); -#endif - -/* Added at libpng-1.5.4 */ -#ifdef PNG_READ_EXPAND_16_SUPPORTED - if (transforms & PNG_TRANSFORM_EXPAND_16) - png_set_expand_16(png_ptr); -#endif - - /* We don't handle adding filler bytes */ - - /* We use png_read_image and rely on that for interlace handling, but we also - * call png_read_update_info therefore must turn on interlace handling now: - */ - (void)png_set_interlace_handling(png_ptr); - - /* Optional call to gamma correct and add the background to the palette - * and update info structure. REQUIRED if you are expecting libpng to - * update the palette for you (i.e., you selected such a transform above). - */ - png_read_update_info(png_ptr, info_ptr); - - /* -------------- image transformations end here ------------------- */ - - png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); - if (info_ptr->row_pointers == NULL) - { - png_uint_32 iptr; - - info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr, - info_ptr->height * (sizeof (png_bytep))); - for (iptr=0; iptrheight; iptr++) - info_ptr->row_pointers[iptr] = NULL; - - info_ptr->free_me |= PNG_FREE_ROWS; - - for (row = 0; row < (int)info_ptr->height; row++) - info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr, - png_get_rowbytes(png_ptr, info_ptr)); - } - - png_read_image(png_ptr, info_ptr->row_pointers); - info_ptr->valid |= PNG_INFO_IDAT; - - /* Read rest of file, and get additional chunks in info_ptr - REQUIRED */ - png_read_end(png_ptr, info_ptr); - - PNG_UNUSED(transforms) /* Quiet compiler warnings */ - PNG_UNUSED(params) - -} -#endif /* PNG_INFO_IMAGE_SUPPORTED */ -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ - -#ifdef PNG_SIMPLIFIED_READ_SUPPORTED -/* SIMPLIFIED READ - * - * This code currently relies on the sequential reader, though it could easily - * be made to work with the progressive one. - */ -/* Arguments to png_image_finish_read: */ - -/* Encoding of PNG data (used by the color-map code) */ -/* TODO: change these, dang, ANSI-C reserves the 'E' namespace. */ -# define E_NOTSET 0 /* File encoding not yet known */ -# define E_sRGB 1 /* 8-bit encoded to sRGB gamma */ -# define E_LINEAR 2 /* 16-bit linear: not encoded, NOT pre-multiplied! */ -# define E_FILE 3 /* 8-bit encoded to file gamma, not sRGB or linear */ -# define E_LINEAR8 4 /* 8-bit linear: only from a file value */ - -/* Color-map processing: after libpng has run on the PNG image further - * processing may be needed to conver the data to color-map indicies. - */ -#define PNG_CMAP_NONE 0 -#define PNG_CMAP_GA 1 /* Process GA data to a color-map with alpha */ -#define PNG_CMAP_TRANS 2 /* Process GA data to a background index */ -#define PNG_CMAP_RGB 3 /* Process RGB data */ -#define PNG_CMAP_RGB_ALPHA 4 /* Process RGBA data */ - -/* The following document where the background is for each processing case. */ -#define PNG_CMAP_NONE_BACKGROUND 256 -#define PNG_CMAP_GA_BACKGROUND 231 -#define PNG_CMAP_TRANS_BACKGROUND 254 -#define PNG_CMAP_RGB_BACKGROUND 256 -#define PNG_CMAP_RGB_ALPHA_BACKGROUND 216 - -typedef struct -{ - /* Arguments: */ - png_imagep image; - png_voidp buffer; - png_int_32 row_stride; - png_voidp colormap; - png_const_colorp background; - /* Local variables: */ - png_voidp local_row; - png_voidp first_row; - ptrdiff_t row_bytes; /* step between rows */ - int file_encoding; /* E_ values above */ - png_fixed_point gamma_to_linear; /* For E_FILE, reciprocal of gamma */ - int colormap_processing; /* PNG_CMAP_ values above */ -} png_image_read_control; - -/* Do all the *safe* initialization - 'safe' means that png_error won't be - * called, so setting up the jmp_buf is not required. This means that anything - * called from here must *not* call png_malloc - it has to call png_malloc_warn - * instead so that control is returned safely back to this routine. - */ -static int -png_image_read_init(png_imagep image) -{ - if (image->opaque == NULL) - { - png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, image, - png_safe_error, png_safe_warning); - - /* And set the rest of the structure to NULL to ensure that the various - * fields are consistent. - */ - memset(image, 0, (sizeof *image)); - image->version = PNG_IMAGE_VERSION; - - if (png_ptr != NULL) - { - png_infop info_ptr = png_create_info_struct(png_ptr); - - if (info_ptr != NULL) - { - png_controlp control = png_voidcast(png_controlp, - png_malloc_warn(png_ptr, (sizeof *control))); - - if (control != NULL) - { - memset(control, 0, (sizeof *control)); - - control->png_ptr = png_ptr; - control->info_ptr = info_ptr; - control->for_write = 0; - - image->opaque = control; - return 1; - } - - /* Error clean up */ - png_destroy_info_struct(png_ptr, &info_ptr); - } - - png_destroy_read_struct(&png_ptr, NULL, NULL); - } - - return png_image_error(image, "png_image_read: out of memory"); - } - - return png_image_error(image, "png_image_read: opaque pointer not NULL"); -} - -/* Utility to find the base format of a PNG file from a png_struct. */ -static png_uint_32 -png_image_format(png_structrp png_ptr) -{ - png_uint_32 format = 0; - - if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) - format |= PNG_FORMAT_FLAG_COLOR; - - if (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) - format |= PNG_FORMAT_FLAG_ALPHA; - - /* Use png_ptr here, not info_ptr, because by examination png_handle_tRNS - * sets the png_struct fields; that's all we are interested in here. The - * precise interaction with an app call to png_set_tRNS and PNG file reading - * is unclear. - */ - else if (png_ptr->num_trans > 0) - format |= PNG_FORMAT_FLAG_ALPHA; - - if (png_ptr->bit_depth == 16) - format |= PNG_FORMAT_FLAG_LINEAR; - - if (png_ptr->color_type & PNG_COLOR_MASK_PALETTE) - format |= PNG_FORMAT_FLAG_COLORMAP; - - return format; -} - -/* Is the given gamma significantly different from sRGB? The test is the same - * one used in pngrtran.c when deciding whether to do gamma correction. The - * arithmetic optimizes the division by using the fact that the inverse of the - * file sRGB gamma is 2.2 - */ -static int -png_gamma_not_sRGB(png_fixed_point g) -{ - if (g < PNG_FP_1) - { - /* An uninitialized gamma is assumed to be sRGB for the simplified API. */ - if (g == 0) - return 0; - - return png_gamma_significant((g * 11 + 2)/5 /* i.e. *2.2, rounded */); - } - - return 1; -} - -/* Do the main body of a 'png_image_begin_read' function; read the PNG file - * header and fill in all the information. This is executed in a safe context, - * unlike the init routine above. - */ -static int -png_image_read_header(png_voidp argument) -{ - png_imagep image = png_voidcast(png_imagep, argument); - png_structrp png_ptr = image->opaque->png_ptr; - png_inforp info_ptr = image->opaque->info_ptr; - - png_set_benign_errors(png_ptr, 1/*warn*/); - png_read_info(png_ptr, info_ptr); - - /* Do this the fast way; just read directly out of png_struct. */ - image->width = png_ptr->width; - image->height = png_ptr->height; - - { - png_uint_32 format = png_image_format(png_ptr); - - image->format = format; - -#ifdef PNG_COLORSPACE_SUPPORTED - /* Does the colorspace match sRGB? If there is no color endpoint - * (colorant) information assume yes, otherwise require the - * 'ENDPOINTS_MATCHE_sRGB' colorspace flag to have been set. If the - * colorspace has been determined to be invalid ignore it. - */ - if ((format & PNG_FORMAT_FLAG_COLOR) != 0 && ((png_ptr->colorspace.flags - & (PNG_COLORSPACE_HAVE_ENDPOINTS|PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB| - PNG_COLORSPACE_INVALID)) == PNG_COLORSPACE_HAVE_ENDPOINTS)) - image->flags |= PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB; -#endif - } - - /* We need the maximum number of entries regardless of the format the - * application sets here. - */ - { - png_uint_32 cmap_entries; - - switch (png_ptr->color_type) - { - case PNG_COLOR_TYPE_GRAY: - cmap_entries = 1U << png_ptr->bit_depth; - break; - - case PNG_COLOR_TYPE_PALETTE: - cmap_entries = png_ptr->num_palette; - break; - - default: - cmap_entries = 256; - break; - } - - if (cmap_entries > 256) - cmap_entries = 256; - - image->colormap_entries = cmap_entries; - } - - return 1; -} - -#ifdef PNG_STDIO_SUPPORTED -int PNGAPI -png_image_begin_read_from_stdio(png_imagep image, FILE* file) -{ - if (image != NULL && image->version == PNG_IMAGE_VERSION) - { - if (file != NULL) - { - if (png_image_read_init(image)) - { - /* This is slightly evil, but png_init_io doesn't do anything other - * than this and we haven't changed the standard IO functions so - * this saves a 'safe' function. - */ - image->opaque->png_ptr->io_ptr = file; - return png_safe_execute(image, png_image_read_header, image); - } - } - - else - return png_image_error(image, - "png_image_begin_read_from_stdio: invalid argument"); - } - - else if (image != NULL) - return png_image_error(image, - "png_image_begin_read_from_stdio: incorrect PNG_IMAGE_VERSION"); - - return 0; -} - -int PNGAPI -png_image_begin_read_from_file(png_imagep image, const char *file_name) -{ - if (image != NULL && image->version == PNG_IMAGE_VERSION) - { - if (file_name != NULL) - { - FILE *fp = fopen(file_name, "rb"); - - if (fp != NULL) - { - if (png_image_read_init(image)) - { - image->opaque->png_ptr->io_ptr = fp; - image->opaque->owned_file = 1; - return png_safe_execute(image, png_image_read_header, image); - } - - /* Clean up: just the opened file. */ - (void)fclose(fp); - } - - else - return png_image_error(image, strerror(errno)); - } - - else - return png_image_error(image, - "png_image_begin_read_from_file: invalid argument"); - } - - else if (image != NULL) - return png_image_error(image, - "png_image_begin_read_from_file: incorrect PNG_IMAGE_VERSION"); - - return 0; -} -#endif /* PNG_STDIO_SUPPORTED */ - -static void PNGCBAPI -png_image_memory_read(png_structp png_ptr, png_bytep out, png_size_t need) -{ - if (png_ptr != NULL) - { - png_imagep image = png_voidcast(png_imagep, png_ptr->io_ptr); - if (image != NULL) - { - png_controlp cp = image->opaque; - if (cp != NULL) - { - png_const_bytep memory = cp->memory; - png_size_t size = cp->size; - - if (memory != NULL && size >= need) - { - memcpy(out, memory, need); - cp->memory = memory + need; - cp->size = size - need; - return; - } - - png_error(png_ptr, "read beyond end of data"); - } - } - - png_error(png_ptr, "invalid memory read"); - } -} - -int PNGAPI png_image_begin_read_from_memory(png_imagep image, - png_const_voidp memory, png_size_t size) -{ - if (image != NULL && image->version == PNG_IMAGE_VERSION) - { - if (memory != NULL && size > 0) - { - if (png_image_read_init(image)) - { - /* Now set the IO functions to read from the memory buffer and - * store it into io_ptr. Again do this in-place to avoid calling a - * libpng function that requires error handling. - */ - image->opaque->memory = png_voidcast(png_const_bytep, memory); - image->opaque->size = size; - image->opaque->png_ptr->io_ptr = image; - image->opaque->png_ptr->read_data_fn = png_image_memory_read; - - return png_safe_execute(image, png_image_read_header, image); - } - } - - else - return png_image_error(image, - "png_image_begin_read_from_memory: invalid argument"); - } - - else if (image != NULL) - return png_image_error(image, - "png_image_begin_read_from_memory: incorrect PNG_IMAGE_VERSION"); - - return 0; -} - -/* Utility function to skip chunks that are not used by the simplified image - * read functions and an appropriate macro to call it. - */ -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -static void -png_image_skip_unused_chunks(png_structrp png_ptr) -{ - /* Prepare the reader to ignore all recognized chunks whose data will not - * be used, i.e., all chunks recognized by libpng except for those - * involved in basic image reading: - * - * IHDR, PLTE, IDAT, IEND - * - * Or image data handling: - * - * tRNS, bKGD, gAMA, cHRM, sRGB, iCCP and sBIT. - * - * This provides a small performance improvement and eliminates any - * potential vulnerability to security problems in the unused chunks. - */ - { - static PNG_CONST png_byte chunks_to_process[] = { - 98, 75, 71, 68, '\0', /* bKGD */ - 99, 72, 82, 77, '\0', /* cHRM */ - 103, 65, 77, 65, '\0', /* gAMA */ - 105, 67, 67, 80, '\0', /* iCCP */ - 115, 66, 73, 84, '\0', /* sBIT */ - 115, 82, 71, 66, '\0', /* sRGB */ - }; - - /* Ignore unknown chunks and all other chunks except for the - * IHDR, PLTE, tRNS, IDAT, and IEND chunks. - */ - png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_NEVER, - NULL, -1); - - /* But do not ignore image data handling chunks */ - png_set_keep_unknown_chunks(png_ptr, PNG_HANDLE_CHUNK_AS_DEFAULT, - chunks_to_process, (sizeof chunks_to_process)/5); - } -} - -# define PNG_SKIP_CHUNKS(p) png_image_skip_unused_chunks(p) -#else -# define PNG_SKIP_CHUNKS(p) ((void)0) -#endif /* PNG_HANDLE_AS_UNKNOWN_SUPPORTED */ - -/* The following macro gives the exact rounded answer for all values in the - * range 0..255 (it actually divides by 51.2, but the rounding still generates - * the correct numbers 0..5 - */ -#define PNG_DIV51(v8) (((v8) * 5 + 130) >> 8) - -/* Utility functions to make particular color-maps */ -static void -set_file_encoding(png_image_read_control *display) -{ - png_fixed_point g = display->image->opaque->png_ptr->colorspace.gamma; - if (png_gamma_significant(g)) - { - if (png_gamma_not_sRGB(g)) - { - display->file_encoding = E_FILE; - display->gamma_to_linear = png_reciprocal(g); - } - - else - display->file_encoding = E_sRGB; - } - - else - display->file_encoding = E_LINEAR8; -} - -static unsigned int -decode_gamma(png_image_read_control *display, png_uint_32 value, int encoding) -{ - if (encoding == E_FILE) /* double check */ - encoding = display->file_encoding; - - if (encoding == E_NOTSET) /* must be the file encoding */ - { - set_file_encoding(display); - encoding = display->file_encoding; - } - - switch (encoding) - { - case E_FILE: - value = png_gamma_16bit_correct(value*257, display->gamma_to_linear); - break; - - case E_sRGB: - value = png_sRGB_table[value]; - break; - - case E_LINEAR: - break; - - case E_LINEAR8: - value *= 257; - break; - - default: - png_error(display->image->opaque->png_ptr, - "unexpected encoding (internal error)"); - break; - } - - return value; -} - -static png_uint_32 -png_colormap_compose(png_image_read_control *display, - png_uint_32 foreground, int foreground_encoding, png_uint_32 alpha, - png_uint_32 background, int encoding) -{ - /* The file value is composed on the background, the background has the given - * encoding and so does the result, the file is encoded with E_FILE and the - * file and alpha are 8-bit values. The (output) encoding will always be - * E_LINEAR or E_sRGB. - */ - png_uint_32 f = decode_gamma(display, foreground, foreground_encoding); - png_uint_32 b = decode_gamma(display, background, encoding); - - /* The alpha is always an 8-bit value (it comes from the palette), the value - * scaled by 255 is what PNG_sRGB_FROM_LINEAR requires. - */ - f = f * alpha + b * (255-alpha); - - if (encoding == E_LINEAR) - { - /* Scale to 65535; divide by 255, approximately (in fact this is extremely - * accurate, it divides by 255.00000005937181414556, with no overflow.) - */ - f *= 257; /* Now scaled by 65535 */ - f += f >> 16; - f = (f+32768) >> 16; - } - - else /* E_sRGB */ - f = PNG_sRGB_FROM_LINEAR(f); - - return f; -} - -/* NOTE: E_LINEAR values to this routine must be 16-bit, but E_FILE values must - * be 8-bit. - */ -static void -png_create_colormap_entry(png_image_read_control *display, - png_uint_32 ip, png_uint_32 red, png_uint_32 green, png_uint_32 blue, - png_uint_32 alpha, int encoding) -{ - png_imagep image = display->image; - const int output_encoding = (image->format & PNG_FORMAT_FLAG_LINEAR) ? - E_LINEAR : E_sRGB; - const int convert_to_Y = (image->format & PNG_FORMAT_FLAG_COLOR) == 0 && - (red != green || green != blue); - - if (ip > 255) - png_error(image->opaque->png_ptr, "color-map index out of range"); - - /* Update the cache with whether the file gamma is significantly different - * from sRGB. - */ - if (encoding == E_FILE) - { - if (display->file_encoding == E_NOTSET) - set_file_encoding(display); - - /* Note that the cached value may be E_FILE too, but if it is then the - * gamma_to_linear member has been set. - */ - encoding = display->file_encoding; - } - - if (encoding == E_FILE) - { - png_fixed_point g = display->gamma_to_linear; - - red = png_gamma_16bit_correct(red*257, g); - green = png_gamma_16bit_correct(green*257, g); - blue = png_gamma_16bit_correct(blue*257, g); - - if (convert_to_Y || output_encoding == E_LINEAR) - { - alpha *= 257; - encoding = E_LINEAR; - } - - else - { - red = PNG_sRGB_FROM_LINEAR(red * 255); - green = PNG_sRGB_FROM_LINEAR(green * 255); - blue = PNG_sRGB_FROM_LINEAR(blue * 255); - encoding = E_sRGB; - } - } - - else if (encoding == E_LINEAR8) - { - /* This encoding occurs quite frequently in test cases because PngSuite - * includes a gAMA 1.0 chunk with most images. - */ - red *= 257; - green *= 257; - blue *= 257; - alpha *= 257; - encoding = E_LINEAR; - } - - else if (encoding == E_sRGB && (convert_to_Y || output_encoding == E_LINEAR)) - { - /* The values are 8-bit sRGB values, but must be converted to 16-bit - * linear. - */ - red = png_sRGB_table[red]; - green = png_sRGB_table[green]; - blue = png_sRGB_table[blue]; - alpha *= 257; - encoding = E_LINEAR; - } - - /* This is set if the color isn't gray but the output is. */ - if (encoding == E_LINEAR) - { - if (convert_to_Y) - { - /* NOTE: these values are copied from png_do_rgb_to_gray */ - png_uint_32 y = (png_uint_32)6968 * red + (png_uint_32)23434 * green + - (png_uint_32)2366 * blue; - - if (output_encoding == E_LINEAR) - y = (y + 16384) >> 15; - - else - { - /* y is scaled by 32768, we need it scaled by 255: */ - y = (y + 128) >> 8; - y *= 255; - y = PNG_sRGB_FROM_LINEAR((y + 64) >> 7); - encoding = E_sRGB; - } - - blue = red = green = y; - } - - else if (output_encoding == E_sRGB) - { - red = PNG_sRGB_FROM_LINEAR(red * 255); - green = PNG_sRGB_FROM_LINEAR(green * 255); - blue = PNG_sRGB_FROM_LINEAR(blue * 255); - alpha = PNG_DIV257(alpha); - encoding = E_sRGB; - } - } - - if (encoding != output_encoding) - png_error(image->opaque->png_ptr, "bad encoding (internal error)"); - - /* Store the value. */ - { -# ifdef PNG_FORMAT_BGR_SUPPORTED - const int afirst = (image->format & PNG_FORMAT_FLAG_AFIRST) != 0 && - (image->format & PNG_FORMAT_FLAG_ALPHA) != 0; -# else -# define afirst 0 -# endif -# ifdef PNG_FORMAT_BGR_SUPPORTED - const int bgr = (image->format & PNG_FORMAT_FLAG_BGR) ? 2 : 0; -# else -# define bgr 0 -# endif - - if (output_encoding == E_LINEAR) - { - png_uint_16p entry = png_voidcast(png_uint_16p, display->colormap); - - entry += ip * PNG_IMAGE_SAMPLE_CHANNELS(image->format); - - /* The linear 16-bit values must be pre-multiplied by the alpha channel - * value, if less than 65535 (this is, effectively, composite on black - * if the alpha channel is removed.) - */ - switch (PNG_IMAGE_SAMPLE_CHANNELS(image->format)) - { - case 4: - entry[afirst ? 0 : 3] = (png_uint_16)alpha; - /* FALL THROUGH */ - - case 3: - if (alpha < 65535) - { - if (alpha > 0) - { - blue = (blue * alpha + 32767U)/65535U; - green = (green * alpha + 32767U)/65535U; - red = (red * alpha + 32767U)/65535U; - } - - else - red = green = blue = 0; - } - entry[afirst + (2 ^ bgr)] = (png_uint_16)blue; - entry[afirst + 1] = (png_uint_16)green; - entry[afirst + bgr] = (png_uint_16)red; - break; - - case 2: - entry[1 ^ afirst] = (png_uint_16)alpha; - /* FALL THROUGH */ - - case 1: - if (alpha < 65535) - { - if (alpha > 0) - green = (green * alpha + 32767U)/65535U; - - else - green = 0; - } - entry[afirst] = (png_uint_16)green; - break; - - default: - break; - } - } - - else /* output encoding is E_sRGB */ - { - png_bytep entry = png_voidcast(png_bytep, display->colormap); - - entry += ip * PNG_IMAGE_SAMPLE_CHANNELS(image->format); - - switch (PNG_IMAGE_SAMPLE_CHANNELS(image->format)) - { - case 4: - entry[afirst ? 0 : 3] = (png_byte)alpha; - case 3: - entry[afirst + (2 ^ bgr)] = (png_byte)blue; - entry[afirst + 1] = (png_byte)green; - entry[afirst + bgr] = (png_byte)red; - break; - - case 2: - entry[1 ^ afirst] = (png_byte)alpha; - case 1: - entry[afirst] = (png_byte)green; - break; - - default: - break; - } - } - -# ifdef afirst -# undef afirst -# endif -# ifdef bgr -# undef bgr -# endif - } -} - -static int -make_gray_file_colormap(png_image_read_control *display) -{ - unsigned int i; - - for (i=0; i<256; ++i) - png_create_colormap_entry(display, i, i, i, i, 255, E_FILE); - - return i; -} - -static int -make_gray_colormap(png_image_read_control *display) -{ - unsigned int i; - - for (i=0; i<256; ++i) - png_create_colormap_entry(display, i, i, i, i, 255, E_sRGB); - - return i; -} -#define PNG_GRAY_COLORMAP_ENTRIES 256 - -static int -make_ga_colormap(png_image_read_control *display) -{ - unsigned int i, a; - - /* Alpha is retained, the output will be a color-map with entries - * selected by six levels of alpha. One transparent entry, 6 gray - * levels for all the intermediate alpha values, leaving 230 entries - * for the opaque grays. The color-map entries are the six values - * [0..5]*51, the GA processing uses PNG_DIV51(value) to find the - * relevant entry. - * - * if (alpha > 229) // opaque - * { - * // The 231 entries are selected to make the math below work: - * base = 0; - * entry = (231 * gray + 128) >> 8; - * } - * else if (alpha < 26) // transparent - * { - * base = 231; - * entry = 0; - * } - * else // partially opaque - * { - * base = 226 + 6 * PNG_DIV51(alpha); - * entry = PNG_DIV51(gray); - * } - */ - i = 0; - while (i < 231) - { - unsigned int gray = (i * 256 + 115) / 231; - png_create_colormap_entry(display, i++, gray, gray, gray, 255, E_sRGB); - } - - /* 255 is used here for the component values for consistency with the code - * that undoes premultiplication in pngwrite.c. - */ - png_create_colormap_entry(display, i++, 255, 255, 255, 0, E_sRGB); - - for (a=1; a<5; ++a) - { - unsigned int g; - - for (g=0; g<6; ++g) - png_create_colormap_entry(display, i++, g*51, g*51, g*51, a*51, - E_sRGB); - } - - return i; -} - -#define PNG_GA_COLORMAP_ENTRIES 256 - -static int -make_rgb_colormap(png_image_read_control *display) -{ - unsigned int i, r; - - /* Build a 6x6x6 opaque RGB cube */ - for (i=r=0; r<6; ++r) - { - unsigned int g; - - for (g=0; g<6; ++g) - { - unsigned int b; - - for (b=0; b<6; ++b) - png_create_colormap_entry(display, i++, r*51, g*51, b*51, 255, - E_sRGB); - } - } - - return i; -} - -#define PNG_RGB_COLORMAP_ENTRIES 216 - -/* Return a palette index to the above palette given three 8-bit sRGB values. */ -#define PNG_RGB_INDEX(r,g,b) \ - ((png_byte)(6 * (6 * PNG_DIV51(r) + PNG_DIV51(g)) + PNG_DIV51(b))) - -static int -png_image_read_colormap(png_voidp argument) -{ - png_image_read_control *display = - png_voidcast(png_image_read_control*, argument); - const png_imagep image = display->image; - - const png_structrp png_ptr = image->opaque->png_ptr; - const png_uint_32 output_format = image->format; - const int output_encoding = (output_format & PNG_FORMAT_FLAG_LINEAR) ? - E_LINEAR : E_sRGB; - - unsigned int cmap_entries; - unsigned int output_processing; /* Output processing option */ - unsigned int data_encoding = E_NOTSET; /* Encoding libpng must produce */ - - /* Background information; the background color and the index of this color - * in the color-map if it exists (else 256). - */ - unsigned int background_index = 256; - png_uint_32 back_r, back_g, back_b; - - /* Flags to accumulate things that need to be done to the input. */ - int expand_tRNS = 0; - - /* Exclude the NYI feature of compositing onto a color-mapped buffer; it is - * very difficult to do, the results look awful, and it is difficult to see - * what possible use it is because the application can't control the - * color-map. - */ - if (((png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0 || - png_ptr->num_trans > 0) /* alpha in input */ && - ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0) /* no alpha in output */) - { - if (output_encoding == E_LINEAR) /* compose on black */ - back_b = back_g = back_r = 0; - - else if (display->background == NULL /* no way to remove it */) - png_error(png_ptr, - "a background color must be supplied to remove alpha/transparency"); - - /* Get a copy of the background color (this avoids repeating the checks - * below.) The encoding is 8-bit sRGB or 16-bit linear, depending on the - * output format. - */ - else - { - back_g = display->background->green; - if (output_format & PNG_FORMAT_FLAG_COLOR) - { - back_r = display->background->red; - back_b = display->background->blue; - } - else - back_b = back_r = back_g; - } - } - - else if (output_encoding == E_LINEAR) - back_b = back_r = back_g = 65535; - - else - back_b = back_r = back_g = 255; - - /* Default the input file gamma if required - this is necessary because - * libpng assumes that if no gamma information is present the data is in the - * output format, but the simplified API deduces the gamma from the input - * format. - */ - if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_GAMMA) == 0) - { - /* Do this directly, not using the png_colorspace functions, to ensure - * that it happens even if the colorspace is invalid (though probably if - * it is the setting will be ignored) Note that the same thing can be - * achieved at the application interface with png_set_gAMA. - */ - if (png_ptr->bit_depth == 16 && - (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0) - png_ptr->colorspace.gamma = PNG_GAMMA_LINEAR; - - else - png_ptr->colorspace.gamma = PNG_GAMMA_sRGB_INVERSE; - - png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA; - } - - /* Decide what to do based on the PNG color type of the input data. The - * utility function png_create_colormap_entry deals with most aspects of the - * output transformations; this code works out how to produce bytes of - * color-map entries from the original format. - */ - switch (png_ptr->color_type) - { - case PNG_COLOR_TYPE_GRAY: - if (png_ptr->bit_depth <= 8) - { - /* There at most 256 colors in the output, regardless of - * transparency. - */ - unsigned int step, i, val, trans = 256/*ignore*/, back_alpha = 0; - - cmap_entries = 1U << png_ptr->bit_depth; - if (cmap_entries > image->colormap_entries) - png_error(png_ptr, "gray[8] color-map: too few entries"); - - step = 255 / (cmap_entries - 1); - output_processing = PNG_CMAP_NONE; - - /* If there is a tRNS chunk then this either selects a transparent - * value or, if the output has no alpha, the background color. - */ - if (png_ptr->num_trans > 0) - { - trans = png_ptr->trans_color.gray; - - if ((output_format & PNG_FORMAT_FLAG_ALPHA) == 0) - back_alpha = output_encoding == E_LINEAR ? 65535 : 255; - } - - /* png_create_colormap_entry just takes an RGBA and writes the - * corresponding color-map entry using the format from 'image', - * including the required conversion to sRGB or linear as - * appropriate. The input values are always either sRGB (if the - * gamma correction flag is 0) or 0..255 scaled file encoded values - * (if the function must gamma correct them). - */ - for (i=val=0; ibit_depth < 8) - png_set_packing(png_ptr); - } - - else /* bit depth is 16 */ - { - /* The 16-bit input values can be converted directly to 8-bit gamma - * encoded values; however, if a tRNS chunk is present 257 color-map - * entries are required. This means that the extra entry requires - * special processing; add an alpha channel, sacrifice gray level - * 254 and convert transparent (alpha==0) entries to that. - * - * Use libpng to chop the data to 8 bits. Convert it to sRGB at the - * same time to minimize quality loss. If a tRNS chunk is present - * this means libpng must handle it too; otherwise it is impossible - * to do the exact match on the 16-bit value. - * - * If the output has no alpha channel *and* the background color is - * gray then it is possible to let libpng handle the substitution by - * ensuring that the corresponding gray level matches the background - * color exactly. - */ - data_encoding = E_sRGB; - - if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries) - png_error(png_ptr, "gray[16] color-map: too few entries"); - - cmap_entries = make_gray_colormap(display); - - if (png_ptr->num_trans > 0) - { - unsigned int back_alpha; - - if (output_format & PNG_FORMAT_FLAG_ALPHA) - back_alpha = 0; - - else - { - if (back_r == back_g && back_g == back_b) - { - /* Background is gray; no special processing will be - * required. - */ - png_color_16 c; - png_uint_32 gray = back_g; - - if (output_encoding == E_LINEAR) - { - gray = PNG_sRGB_FROM_LINEAR(gray * 255); - - /* And make sure the corresponding palette entry - * matches. - */ - png_create_colormap_entry(display, gray, back_g, back_g, - back_g, 65535, E_LINEAR); - } - - /* The background passed to libpng, however, must be the - * sRGB value. - */ - c.index = 0; /*unused*/ - c.gray = c.red = c.green = c.blue = (png_uint_16)gray; - - /* NOTE: does this work without expanding tRNS to alpha? - * It should be the color->gray case below apparently - * doesn't. - */ - png_set_background_fixed(png_ptr, &c, - PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/, - 0/*gamma: not used*/); - - output_processing = PNG_CMAP_NONE; - break; - } - - back_alpha = output_encoding == E_LINEAR ? 65535 : 255; - } - - /* output_processing means that the libpng-processed row will be - * 8-bit GA and it has to be processing to single byte color-map - * values. Entry 254 is replaced by either a completely - * transparent entry or by the background color at full - * precision (and the background color is not a simple gray leve - * in this case.) - */ - expand_tRNS = 1; - output_processing = PNG_CMAP_TRANS; - background_index = 254; - - /* And set (overwrite) color-map entry 254 to the actual - * background color at full precision. - */ - png_create_colormap_entry(display, 254, back_r, back_g, back_b, - back_alpha, output_encoding); - } - - else - output_processing = PNG_CMAP_NONE; - } - break; - - case PNG_COLOR_TYPE_GRAY_ALPHA: - /* 8-bit or 16-bit PNG with two channels - gray and alpha. A minimum - * of 65536 combinations. If, however, the alpha channel is to be - * removed there are only 256 possibilities if the background is gray. - * (Otherwise there is a subset of the 65536 possibilities defined by - * the triangle between black, white and the background color.) - * - * Reduce 16-bit files to 8-bit and sRGB encode the result. No need to - * worry about tRNS matching - tRNS is ignored if there is an alpha - * channel. - */ - data_encoding = E_sRGB; - - if (output_format & PNG_FORMAT_FLAG_ALPHA) - { - if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries) - png_error(png_ptr, "gray+alpha color-map: too few entries"); - - cmap_entries = make_ga_colormap(display); - - background_index = PNG_CMAP_GA_BACKGROUND; - output_processing = PNG_CMAP_GA; - } - - else /* alpha is removed */ - { - /* Alpha must be removed as the PNG data is processed when the - * background is a color because the G and A channels are - * independent and the vector addition (non-parallel vectors) is a - * 2-D problem. - * - * This can be reduced to the same algorithm as above by making a - * colormap containing gray levels (for the opaque grays), a - * background entry (for a transparent pixel) and a set of four six - * level color values, one set for each intermediate alpha value. - * See the comments in make_ga_colormap for how this works in the - * per-pixel processing. - * - * If the background is gray, however, we only need a 256 entry gray - * level color map. It is sufficient to make the entry generated - * for the background color be exactly the color specified. - */ - if ((output_format & PNG_FORMAT_FLAG_COLOR) == 0 || - (back_r == back_g && back_g == back_b)) - { - /* Background is gray; no special processing will be required. */ - png_color_16 c; - png_uint_32 gray = back_g; - - if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries) - png_error(png_ptr, "gray-alpha color-map: too few entries"); - - cmap_entries = make_gray_colormap(display); - - if (output_encoding == E_LINEAR) - { - gray = PNG_sRGB_FROM_LINEAR(gray * 255); - - /* And make sure the corresponding palette entry matches. */ - png_create_colormap_entry(display, gray, back_g, back_g, - back_g, 65535, E_LINEAR); - } - - /* The background passed to libpng, however, must be the sRGB - * value. - */ - c.index = 0; /*unused*/ - c.gray = c.red = c.green = c.blue = (png_uint_16)gray; - - png_set_background_fixed(png_ptr, &c, - PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/, - 0/*gamma: not used*/); - - output_processing = PNG_CMAP_NONE; - } - - else - { - png_uint_32 i, a; - - /* This is the same as png_make_ga_colormap, above, except that - * the entries are all opaque. - */ - if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries) - png_error(png_ptr, "ga-alpha color-map: too few entries"); - - i = 0; - while (i < 231) - { - png_uint_32 gray = (i * 256 + 115) / 231; - png_create_colormap_entry(display, i++, gray, gray, gray, - 255, E_sRGB); - } - - /* NOTE: this preserves the full precision of the application - * background color. - */ - background_index = i; - png_create_colormap_entry(display, i++, back_r, back_g, back_b, - output_encoding == E_LINEAR ? 65535U : 255U, output_encoding); - - /* For non-opaque input composite on the sRGB background - this - * requires inverting the encoding for each component. The input - * is still converted to the sRGB encoding because this is a - * reasonable approximate to the logarithmic curve of human - * visual sensitivity, at least over the narrow range which PNG - * represents. Consequently 'G' is always sRGB encoded, while - * 'A' is linear. We need the linear background colors. - */ - if (output_encoding == E_sRGB) /* else already linear */ - { - /* This may produce a value not exactly matching the - * background, but that's ok because these numbers are only - * used when alpha != 0 - */ - back_r = png_sRGB_table[back_r]; - back_g = png_sRGB_table[back_g]; - back_b = png_sRGB_table[back_b]; - } - - for (a=1; a<5; ++a) - { - unsigned int g; - - /* PNG_sRGB_FROM_LINEAR expects a 16-bit linear value scaled - * by an 8-bit alpha value (0..255). - */ - png_uint_32 alpha = 51 * a; - png_uint_32 back_rx = (255-alpha) * back_r; - png_uint_32 back_gx = (255-alpha) * back_g; - png_uint_32 back_bx = (255-alpha) * back_b; - - for (g=0; g<6; ++g) - { - png_uint_32 gray = png_sRGB_table[g*51] * alpha; - - png_create_colormap_entry(display, i++, - PNG_sRGB_FROM_LINEAR(gray + back_rx), - PNG_sRGB_FROM_LINEAR(gray + back_gx), - PNG_sRGB_FROM_LINEAR(gray + back_bx), 255, E_sRGB); - } - } - - cmap_entries = i; - output_processing = PNG_CMAP_GA; - } - } - break; - - case PNG_COLOR_TYPE_RGB: - case PNG_COLOR_TYPE_RGB_ALPHA: - /* Exclude the case where the output is gray; we can always handle this - * with the cases above. - */ - if ((output_format & PNG_FORMAT_FLAG_COLOR) == 0) - { - /* The color-map will be grayscale, so we may as well convert the - * input RGB values to a simple grayscale and use the grayscale - * code above. - * - * NOTE: calling this apparently damages the recognition of the - * transparent color in background color handling; call - * png_set_tRNS_to_alpha before png_set_background_fixed. - */ - png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, -1, - -1); - data_encoding = E_sRGB; - - /* The output will now be one or two 8-bit gray or gray+alpha - * channels. The more complex case arises when the input has alpha. - */ - if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || - png_ptr->num_trans > 0) && - (output_format & PNG_FORMAT_FLAG_ALPHA) != 0) - { - /* Both input and output have an alpha channel, so no background - * processing is required; just map the GA bytes to the right - * color-map entry. - */ - expand_tRNS = 1; - - if (PNG_GA_COLORMAP_ENTRIES > image->colormap_entries) - png_error(png_ptr, "rgb[ga] color-map: too few entries"); - - cmap_entries = make_ga_colormap(display); - background_index = PNG_CMAP_GA_BACKGROUND; - output_processing = PNG_CMAP_GA; - } - - else - { - /* Either the input or the output has no alpha channel, so there - * will be no non-opaque pixels in the color-map; it will just be - * grayscale. - */ - if (PNG_GRAY_COLORMAP_ENTRIES > image->colormap_entries) - png_error(png_ptr, "rgb[gray] color-map: too few entries"); - - /* Ideally this code would use libpng to do the gamma correction, - * but if an input alpha channel is to be removed we will hit the - * libpng bug in gamma+compose+rgb-to-gray (the double gamma - * correction bug). Fix this by dropping the gamma correction in - * this case and doing it in the palette; this will result in - * duplicate palette entries, but that's better than the - * alternative of double gamma correction. - */ - if ((png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || - png_ptr->num_trans > 0) && - png_gamma_not_sRGB(png_ptr->colorspace.gamma)) - { - cmap_entries = make_gray_file_colormap(display); - data_encoding = E_FILE; - } - - else - cmap_entries = make_gray_colormap(display); - - /* But if the input has alpha or transparency it must be removed - */ - if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || - png_ptr->num_trans > 0) - { - png_color_16 c; - png_uint_32 gray = back_g; - - /* We need to ensure that the application background exists in - * the colormap and that completely transparent pixels map to - * it. Achieve this simply by ensuring that the entry - * selected for the background really is the background color. - */ - if (data_encoding == E_FILE) /* from the fixup above */ - { - /* The app supplied a gray which is in output_encoding, we - * need to convert it to a value of the input (E_FILE) - * encoding then set this palette entry to the required - * output encoding. - */ - if (output_encoding == E_sRGB) - gray = png_sRGB_table[gray]; /* now E_LINEAR */ - - gray = PNG_DIV257(png_gamma_16bit_correct(gray, - png_ptr->colorspace.gamma)); /* now E_FILE */ - - /* And make sure the corresponding palette entry contains - * exactly the required sRGB value. - */ - png_create_colormap_entry(display, gray, back_g, back_g, - back_g, 0/*unused*/, output_encoding); - } - - else if (output_encoding == E_LINEAR) - { - gray = PNG_sRGB_FROM_LINEAR(gray * 255); - - /* And make sure the corresponding palette entry matches. - */ - png_create_colormap_entry(display, gray, back_g, back_g, - back_g, 0/*unused*/, E_LINEAR); - } - - /* The background passed to libpng, however, must be the - * output (normally sRGB) value. - */ - c.index = 0; /*unused*/ - c.gray = c.red = c.green = c.blue = (png_uint_16)gray; - - /* NOTE: the following is apparently a bug in libpng. Without - * it the transparent color recognition in - * png_set_background_fixed seems to go wrong. - */ - expand_tRNS = 1; - png_set_background_fixed(png_ptr, &c, - PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/, - 0/*gamma: not used*/); - } - - output_processing = PNG_CMAP_NONE; - } - } - - else /* output is color */ - { - /* We could use png_quantize here so long as there is no transparent - * color or alpha; png_quantize ignores alpha. Easier overall just - * to do it once and using PNG_DIV51 on the 6x6x6 reduced RGB cube. - * Consequently we always want libpng to produce sRGB data. - */ - data_encoding = E_sRGB; - - /* Is there any transparency or alpha? */ - if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA || - png_ptr->num_trans > 0) - { - /* Is there alpha in the output too? If so all four channels are - * processed into a special RGB cube with alpha support. - */ - if (output_format & PNG_FORMAT_FLAG_ALPHA) - { - png_uint_32 r; - - if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries) - png_error(png_ptr, "rgb+alpha color-map: too few entries"); - - cmap_entries = make_rgb_colormap(display); - - /* Add a transparent entry. */ - png_create_colormap_entry(display, cmap_entries, 255, 255, - 255, 0, E_sRGB); - - /* This is stored as the background index for the processing - * algorithm. - */ - background_index = cmap_entries++; - - /* Add 27 r,g,b entries each with alpha 0.5. */ - for (r=0; r<256; r = (r << 1) | 0x7f) - { - png_uint_32 g; - - for (g=0; g<256; g = (g << 1) | 0x7f) - { - png_uint_32 b; - - /* This generates components with the values 0, 127 and - * 255 - */ - for (b=0; b<256; b = (b << 1) | 0x7f) - png_create_colormap_entry(display, cmap_entries++, - r, g, b, 128, E_sRGB); - } - } - - expand_tRNS = 1; - output_processing = PNG_CMAP_RGB_ALPHA; - } - - else - { - /* Alpha/transparency must be removed. The background must - * exist in the color map (achieved by setting adding it after - * the 666 color-map). If the standard processing code will - * pick up this entry automatically that's all that is - * required; libpng can be called to do the background - * processing. - */ - unsigned int sample_size = - PNG_IMAGE_SAMPLE_SIZE(output_format); - png_uint_32 r, g, b; /* sRGB background */ - - if (PNG_RGB_COLORMAP_ENTRIES+1+27 > image->colormap_entries) - png_error(png_ptr, "rgb-alpha color-map: too few entries"); - - cmap_entries = make_rgb_colormap(display); - - png_create_colormap_entry(display, cmap_entries, back_r, - back_g, back_b, 0/*unused*/, output_encoding); - - if (output_encoding == E_LINEAR) - { - r = PNG_sRGB_FROM_LINEAR(back_r * 255); - g = PNG_sRGB_FROM_LINEAR(back_g * 255); - b = PNG_sRGB_FROM_LINEAR(back_b * 255); - } - - else - { - r = back_r; - g = back_g; - b = back_g; - } - - /* Compare the newly-created color-map entry with the one the - * PNG_CMAP_RGB algorithm will use. If the two entries don't - * match, add the new one and set this as the background - * index. - */ - if (memcmp((png_const_bytep)display->colormap + - sample_size * cmap_entries, - (png_const_bytep)display->colormap + - sample_size * PNG_RGB_INDEX(r,g,b), - sample_size) != 0) - { - /* The background color must be added. */ - background_index = cmap_entries++; - - /* Add 27 r,g,b entries each with created by composing with - * the background at alpha 0.5. - */ - for (r=0; r<256; r = (r << 1) | 0x7f) - { - for (g=0; g<256; g = (g << 1) | 0x7f) - { - /* This generates components with the values 0, 127 - * and 255 - */ - for (b=0; b<256; b = (b << 1) | 0x7f) - png_create_colormap_entry(display, cmap_entries++, - png_colormap_compose(display, r, E_sRGB, 128, - back_r, output_encoding), - png_colormap_compose(display, g, E_sRGB, 128, - back_g, output_encoding), - png_colormap_compose(display, b, E_sRGB, 128, - back_b, output_encoding), - 0/*unused*/, output_encoding); - } - } - - expand_tRNS = 1; - output_processing = PNG_CMAP_RGB_ALPHA; - } - - else /* background color is in the standard color-map */ - { - png_color_16 c; - - c.index = 0; /*unused*/ - c.red = (png_uint_16)back_r; - c.gray = c.green = (png_uint_16)back_g; - c.blue = (png_uint_16)back_b; - - png_set_background_fixed(png_ptr, &c, - PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/, - 0/*gamma: not used*/); - - output_processing = PNG_CMAP_RGB; - } - } - } - - else /* no alpha or transparency in the input */ - { - /* Alpha in the output is irrelevant, simply map the opaque input - * pixels to the 6x6x6 color-map. - */ - if (PNG_RGB_COLORMAP_ENTRIES > image->colormap_entries) - png_error(png_ptr, "rgb color-map: too few entries"); - - cmap_entries = make_rgb_colormap(display); - output_processing = PNG_CMAP_RGB; - } - } - break; - - case PNG_COLOR_TYPE_PALETTE: - /* It's already got a color-map. It may be necessary to eliminate the - * tRNS entries though. - */ - { - unsigned int num_trans = png_ptr->num_trans; - png_const_bytep trans = num_trans > 0 ? png_ptr->trans_alpha : NULL; - png_const_colorp colormap = png_ptr->palette; - const int do_background = trans != NULL && - (output_format & PNG_FORMAT_FLAG_ALPHA) == 0; - unsigned int i; - - /* Just in case: */ - if (trans == NULL) - num_trans = 0; - - output_processing = PNG_CMAP_NONE; - data_encoding = E_FILE; /* Don't change from color-map indicies */ - cmap_entries = png_ptr->num_palette; - if (cmap_entries > 256) - cmap_entries = 256; - - if (cmap_entries > image->colormap_entries) - png_error(png_ptr, "palette color-map: too few entries"); - - for (i=0; i < cmap_entries; ++i) - { - if (do_background && i < num_trans && trans[i] < 255) - { - if (trans[i] == 0) - png_create_colormap_entry(display, i, back_r, back_g, - back_b, 0, output_encoding); - - else - { - /* Must compose the PNG file color in the color-map entry - * on the sRGB color in 'back'. - */ - png_create_colormap_entry(display, i, - png_colormap_compose(display, colormap[i].red, E_FILE, - trans[i], back_r, output_encoding), - png_colormap_compose(display, colormap[i].green, E_FILE, - trans[i], back_g, output_encoding), - png_colormap_compose(display, colormap[i].blue, E_FILE, - trans[i], back_b, output_encoding), - output_encoding == E_LINEAR ? trans[i] * 257U : - trans[i], - output_encoding); - } - } - - else - png_create_colormap_entry(display, i, colormap[i].red, - colormap[i].green, colormap[i].blue, - i < num_trans ? trans[i] : 255U, E_FILE/*8-bit*/); - } - - /* The PNG data may have indicies packed in fewer than 8 bits, it - * must be expanded if so. - */ - if (png_ptr->bit_depth < 8) - png_set_packing(png_ptr); - } - break; - - default: - png_error(png_ptr, "invalid PNG color type"); - /*NOT REACHED*/ - break; - } - - /* Now deal with the output processing */ - if (expand_tRNS && png_ptr->num_trans > 0 && - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) == 0) - png_set_tRNS_to_alpha(png_ptr); - - switch (data_encoding) - { - default: - png_error(png_ptr, "bad data option (internal error)"); - break; - - case E_sRGB: - /* Change to 8-bit sRGB */ - png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, PNG_GAMMA_sRGB); - /* FALL THROUGH */ - - case E_FILE: - if (png_ptr->bit_depth > 8) - png_set_scale_16(png_ptr); - break; - } - - if (cmap_entries > 256 || cmap_entries > image->colormap_entries) - png_error(png_ptr, "color map overflow (BAD internal error)"); - - image->colormap_entries = cmap_entries; - - /* Double check using the recorded background index */ - switch (output_processing) - { - case PNG_CMAP_NONE: - if (background_index != PNG_CMAP_NONE_BACKGROUND) - goto bad_background; - break; - - case PNG_CMAP_GA: - if (background_index != PNG_CMAP_GA_BACKGROUND) - goto bad_background; - break; - - case PNG_CMAP_TRANS: - if (background_index >= cmap_entries || - background_index != PNG_CMAP_TRANS_BACKGROUND) - goto bad_background; - break; - - case PNG_CMAP_RGB: - if (background_index != PNG_CMAP_RGB_BACKGROUND) - goto bad_background; - break; - - case PNG_CMAP_RGB_ALPHA: - if (background_index != PNG_CMAP_RGB_ALPHA_BACKGROUND) - goto bad_background; - break; - - default: - png_error(png_ptr, "bad processing option (internal error)"); - - bad_background: - png_error(png_ptr, "bad background index (internal error)"); - } - - display->colormap_processing = output_processing; - - return 1/*ok*/; -} - -/* The final part of the color-map read called from png_image_finish_read. */ -static int -png_image_read_and_map(png_voidp argument) -{ - png_image_read_control *display = png_voidcast(png_image_read_control*, - argument); - png_imagep image = display->image; - png_structrp png_ptr = image->opaque->png_ptr; - int passes; - - /* Called when the libpng data must be transformed into the color-mapped - * form. There is a local row buffer in display->local and this routine must - * do the interlace handling. - */ - switch (png_ptr->interlaced) - { - case PNG_INTERLACE_NONE: - passes = 1; - break; - - case PNG_INTERLACE_ADAM7: - passes = PNG_INTERLACE_ADAM7_PASSES; - break; - - default: - passes = 0; - png_error(png_ptr, "unknown interlace type"); - } - - { - png_uint_32 height = image->height; - png_uint_32 width = image->width; - int proc = display->colormap_processing; - png_bytep first_row = png_voidcast(png_bytep, display->first_row); - ptrdiff_t step_row = display->row_bytes; - int pass; - - for (pass = 0; pass < passes; ++pass) - { - unsigned int startx, stepx, stepy; - png_uint_32 y; - - if (png_ptr->interlaced == PNG_INTERLACE_ADAM7) - { - /* The row may be empty for a short image: */ - if (PNG_PASS_COLS(width, pass) == 0) - continue; - - startx = PNG_PASS_START_COL(pass); - stepx = PNG_PASS_COL_OFFSET(pass); - y = PNG_PASS_START_ROW(pass); - stepy = PNG_PASS_ROW_OFFSET(pass); - } - - else - { - y = 0; - startx = 0; - stepx = stepy = 1; - } - - for (; ylocal_row); - png_bytep outrow = first_row + y * step_row; - png_const_bytep end_row = outrow + width; - - /* Read read the libpng data into the temporary buffer. */ - png_read_row(png_ptr, inrow, NULL); - - /* Now process the row according to the processing option, note - * that the caller verifies that the format of the libpng output - * data is as required. - */ - outrow += startx; - switch (proc) - { - case PNG_CMAP_GA: - for (; outrow < end_row; outrow += stepx) - { - /* The data is always in the PNG order */ - unsigned int gray = *inrow++; - unsigned int alpha = *inrow++; - unsigned int entry; - - /* NOTE: this code is copied as a comment in - * make_ga_colormap above. Please update the - * comment if you change this code! - */ - if (alpha > 229) /* opaque */ - { - entry = (231 * gray + 128) >> 8; - } - else if (alpha < 26) /* transparent */ - { - entry = 231; - } - else /* partially opaque */ - { - entry = 226 + 6 * PNG_DIV51(alpha) + PNG_DIV51(gray); - } - - *outrow = (png_byte)entry; - } - break; - - case PNG_CMAP_TRANS: - for (; outrow < end_row; outrow += stepx) - { - png_byte gray = *inrow++; - png_byte alpha = *inrow++; - - if (alpha == 0) - *outrow = PNG_CMAP_TRANS_BACKGROUND; - - else if (gray != PNG_CMAP_TRANS_BACKGROUND) - *outrow = gray; - - else - *outrow = (png_byte)(PNG_CMAP_TRANS_BACKGROUND+1); - } - break; - - case PNG_CMAP_RGB: - for (; outrow < end_row; outrow += stepx) - { - *outrow = PNG_RGB_INDEX(inrow[0], inrow[1], inrow[2]); - inrow += 3; - } - break; - - case PNG_CMAP_RGB_ALPHA: - for (; outrow < end_row; outrow += stepx) - { - unsigned int alpha = inrow[3]; - - /* Because the alpha entries only hold alpha==0.5 values - * split the processing at alpha==0.25 (64) and 0.75 - * (196). - */ - - if (alpha >= 196) - *outrow = PNG_RGB_INDEX(inrow[0], inrow[1], - inrow[2]); - - else if (alpha < 64) - *outrow = PNG_CMAP_RGB_ALPHA_BACKGROUND; - - else - { - /* Likewise there are three entries for each of r, g - * and b. We could select the entry by popcount on - * the top two bits on those architectures that - * support it, this is what the code below does, - * crudely. - */ - unsigned int back_i = PNG_CMAP_RGB_ALPHA_BACKGROUND+1; - - /* Here are how the values map: - * - * 0x00 .. 0x3f -> 0 - * 0x40 .. 0xbf -> 1 - * 0xc0 .. 0xff -> 2 - * - * So, as above with the explicit alpha checks, the - * breakpoints are at 64 and 196. - */ - if (inrow[0] & 0x80) back_i += 9; /* red */ - if (inrow[0] & 0x40) back_i += 9; - if (inrow[0] & 0x80) back_i += 3; /* green */ - if (inrow[0] & 0x40) back_i += 3; - if (inrow[0] & 0x80) back_i += 1; /* blue */ - if (inrow[0] & 0x40) back_i += 1; - - *outrow = (png_byte)back_i; - } - - inrow += 4; - } - break; - - default: - break; - } - } - } - } - - return 1; -} - -static int -png_image_read_colormapped(png_voidp argument) -{ - png_image_read_control *display = png_voidcast(png_image_read_control*, - argument); - png_imagep image = display->image; - png_controlp control = image->opaque; - png_structrp png_ptr = control->png_ptr; - png_inforp info_ptr = control->info_ptr; - - int passes = 0; /* As a flag */ - - PNG_SKIP_CHUNKS(png_ptr); - - /* Update the 'info' structure and make sure the result is as required; first - * make sure to turn on the interlace handling if it will be required - * (because it can't be turned on *after* the call to png_read_update_info!) - */ - if (display->colormap_processing == PNG_CMAP_NONE) - passes = png_set_interlace_handling(png_ptr); - - png_read_update_info(png_ptr, info_ptr); - - /* The expected output can be deduced from the colormap_processing option. */ - switch (display->colormap_processing) - { - case PNG_CMAP_NONE: - /* Output must be one channel and one byte per pixel, the output - * encoding can be anything. - */ - if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE || - info_ptr->color_type == PNG_COLOR_TYPE_GRAY) && - info_ptr->bit_depth == 8) - break; - - goto bad_output; - - case PNG_CMAP_TRANS: - case PNG_CMAP_GA: - /* Output must be two channels and the 'G' one must be sRGB, the latter - * can be checked with an exact number because it should have been set - * to this number above! - */ - if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && - info_ptr->bit_depth == 8 && - png_ptr->screen_gamma == PNG_GAMMA_sRGB && - image->colormap_entries == 256) - break; - - goto bad_output; - - case PNG_CMAP_RGB: - /* Output must be 8-bit sRGB encoded RGB */ - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB && - info_ptr->bit_depth == 8 && - png_ptr->screen_gamma == PNG_GAMMA_sRGB && - image->colormap_entries == 216) - break; - - goto bad_output; - - case PNG_CMAP_RGB_ALPHA: - /* Output must be 8-bit sRGB encoded RGBA */ - if (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA && - info_ptr->bit_depth == 8 && - png_ptr->screen_gamma == PNG_GAMMA_sRGB && - image->colormap_entries == 244 /* 216 + 1 + 27 */) - break; - - /* goto bad_output; */ - /* FALL THROUGH */ - - default: - bad_output: - png_error(png_ptr, "bad color-map processing (internal error)"); - } - - /* Now read the rows. Do this here if it is possible to read directly into - * the output buffer, otherwise allocate a local row buffer of the maximum - * size libpng requires and call the relevant processing routine safely. - */ - { - png_voidp first_row = display->buffer; - ptrdiff_t row_bytes = display->row_stride; - - /* The following expression is designed to work correctly whether it gives - * a signed or an unsigned result. - */ - if (row_bytes < 0) - { - char *ptr = png_voidcast(char*, first_row); - ptr += (image->height-1) * (-row_bytes); - first_row = png_voidcast(png_voidp, ptr); - } - - display->first_row = first_row; - display->row_bytes = row_bytes; - } - - if (passes == 0) - { - int result; - png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr)); - - display->local_row = row; - result = png_safe_execute(image, png_image_read_and_map, display); - display->local_row = NULL; - png_free(png_ptr, row); - - return result; - } - - else - { - png_alloc_size_t row_bytes = display->row_bytes; - - while (--passes >= 0) - { - png_uint_32 y = image->height; - png_bytep row = png_voidcast(png_bytep, display->first_row); - - while (y-- > 0) - { - png_read_row(png_ptr, row, NULL); - row += row_bytes; - } - } - - return 1; - } -} - -/* Just the row reading part of png_image_read. */ -static int -png_image_read_composite(png_voidp argument) -{ - png_image_read_control *display = png_voidcast(png_image_read_control*, - argument); - png_imagep image = display->image; - png_structrp png_ptr = image->opaque->png_ptr; - int passes; - - switch (png_ptr->interlaced) - { - case PNG_INTERLACE_NONE: - passes = 1; - break; - - case PNG_INTERLACE_ADAM7: - passes = PNG_INTERLACE_ADAM7_PASSES; - break; - - default: - passes = 0; - png_error(png_ptr, "unknown interlace type"); - } - - { - png_uint_32 height = image->height; - png_uint_32 width = image->width; - ptrdiff_t step_row = display->row_bytes; - unsigned int channels = (image->format & PNG_FORMAT_FLAG_COLOR) ? 3 : 1; - int pass; - - for (pass = 0; pass < passes; ++pass) - { - unsigned int startx, stepx, stepy; - png_uint_32 y; - - if (png_ptr->interlaced == PNG_INTERLACE_ADAM7) - { - /* The row may be empty for a short image: */ - if (PNG_PASS_COLS(width, pass) == 0) - continue; - - startx = PNG_PASS_START_COL(pass) * channels; - stepx = PNG_PASS_COL_OFFSET(pass) * channels; - y = PNG_PASS_START_ROW(pass); - stepy = PNG_PASS_ROW_OFFSET(pass); - } - - else - { - y = 0; - startx = 0; - stepx = channels; - stepy = 1; - } - - for (; ylocal_row); - png_bytep outrow; - png_const_bytep end_row; - - /* Read the row, which is packed: */ - png_read_row(png_ptr, inrow, NULL); - - outrow = png_voidcast(png_bytep, display->first_row); - outrow += y * step_row; - end_row = outrow + width * channels; - - /* Now do the composition on each pixel in this row. */ - outrow += startx; - for (; outrow < end_row; outrow += stepx) - { - png_byte alpha = inrow[channels]; - - if (alpha > 0) /* else no change to the output */ - { - unsigned int c; - - for (c=0; cimage; - png_structrp png_ptr = image->opaque->png_ptr; - png_inforp info_ptr = image->opaque->info_ptr; - png_uint_32 height = image->height; - png_uint_32 width = image->width; - int pass, passes; - - /* Double check the convoluted logic below. We expect to get here with - * libpng doing rgb to gray and gamma correction but background processing - * left to the png_image_read_background function. The rows libpng produce - * might be 8 or 16-bit but should always have two channels; gray plus alpha. - */ - if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == 0) - png_error(png_ptr, "lost rgb to gray"); - - if ((png_ptr->transformations & PNG_COMPOSE) != 0) - png_error(png_ptr, "unexpected compose"); - - if (png_get_channels(png_ptr, info_ptr) != 2) - png_error(png_ptr, "lost/gained channels"); - - /* Expect the 8-bit case to always remove the alpha channel */ - if ((image->format & PNG_FORMAT_FLAG_LINEAR) == 0 && - (image->format & PNG_FORMAT_FLAG_ALPHA) != 0) - png_error(png_ptr, "unexpected 8-bit transformation"); - - switch (png_ptr->interlaced) - { - case PNG_INTERLACE_NONE: - passes = 1; - break; - - case PNG_INTERLACE_ADAM7: - passes = PNG_INTERLACE_ADAM7_PASSES; - break; - - default: - passes = 0; - png_error(png_ptr, "unknown interlace type"); - } - - switch (png_get_bit_depth(png_ptr, info_ptr)) - { - default: - png_error(png_ptr, "unexpected bit depth"); - break; - - case 8: - /* 8-bit sRGB gray values with an alpha channel; the alpha channel is - * to be removed by composing on a backgroundi: either the row if - * display->background is NULL or display->background->green if not. - * Unlike the code above ALPHA_OPTIMIZED has *not* been done. - */ - { - png_bytep first_row = png_voidcast(png_bytep, display->first_row); - ptrdiff_t step_row = display->row_bytes; - - for (pass = 0; pass < passes; ++pass) - { - png_bytep row = png_voidcast(png_bytep, - display->first_row); - unsigned int startx, stepx, stepy; - png_uint_32 y; - - if (png_ptr->interlaced == PNG_INTERLACE_ADAM7) - { - /* The row may be empty for a short image: */ - if (PNG_PASS_COLS(width, pass) == 0) - continue; - - startx = PNG_PASS_START_COL(pass); - stepx = PNG_PASS_COL_OFFSET(pass); - y = PNG_PASS_START_ROW(pass); - stepy = PNG_PASS_ROW_OFFSET(pass); - } - - else - { - y = 0; - startx = 0; - stepx = stepy = 1; - } - - if (display->background == NULL) - { - for (; ylocal_row); - png_bytep outrow = first_row + y * step_row; - png_const_bytep end_row = outrow + width; - - /* Read the row, which is packed: */ - png_read_row(png_ptr, inrow, NULL); - - /* Now do the composition on each pixel in this row. */ - outrow += startx; - for (; outrow < end_row; outrow += stepx) - { - png_byte alpha = inrow[1]; - - if (alpha > 0) /* else no change to the output */ - { - png_uint_32 component = inrow[0]; - - if (alpha < 255) /* else just use component */ - { - /* Since PNG_OPTIMIZED_ALPHA was not set it is - * necessary to invert the sRGB transfer - * function and multiply the alpha out. - */ - component = png_sRGB_table[component] * alpha; - component += png_sRGB_table[outrow[0]] * - (255-alpha); - component = PNG_sRGB_FROM_LINEAR(component); - } - - outrow[0] = (png_byte)component; - } - - inrow += 2; /* gray and alpha channel */ - } - } - } - - else /* constant background value */ - { - png_byte background8 = display->background->green; - png_uint_16 background = png_sRGB_table[background8]; - - for (; ylocal_row); - png_bytep outrow = first_row + y * step_row; - png_const_bytep end_row = outrow + width; - - /* Read the row, which is packed: */ - png_read_row(png_ptr, inrow, NULL); - - /* Now do the composition on each pixel in this row. */ - outrow += startx; - for (; outrow < end_row; outrow += stepx) - { - png_byte alpha = inrow[1]; - - if (alpha > 0) /* else use background */ - { - png_uint_32 component = inrow[0]; - - if (alpha < 255) /* else just use component */ - { - component = png_sRGB_table[component] * alpha; - component += background * (255-alpha); - component = PNG_sRGB_FROM_LINEAR(component); - } - - outrow[0] = (png_byte)component; - } - - else - outrow[0] = background8; - - inrow += 2; /* gray and alpha channel */ - } - - row += display->row_bytes; - } - } - } - } - break; - - case 16: - /* 16-bit linear with pre-multiplied alpha; the pre-multiplication must - * still be done and, maybe, the alpha channel removed. This code also - * handles the alpha-first option. - */ - { - png_uint_16p first_row = png_voidcast(png_uint_16p, - display->first_row); - /* The division by two is safe because the caller passed in a - * stride which was multiplied by 2 (below) to get row_bytes. - */ - ptrdiff_t step_row = display->row_bytes / 2; - int preserve_alpha = (image->format & PNG_FORMAT_FLAG_ALPHA) != 0; - unsigned int outchannels = 1+preserve_alpha; - int swap_alpha = 0; - - if (preserve_alpha && (image->format & PNG_FORMAT_FLAG_AFIRST)) - swap_alpha = 1; - - for (pass = 0; pass < passes; ++pass) - { - unsigned int startx, stepx, stepy; - png_uint_32 y; - - /* The 'x' start and step are adjusted to output components here. - */ - if (png_ptr->interlaced == PNG_INTERLACE_ADAM7) - { - /* The row may be empty for a short image: */ - if (PNG_PASS_COLS(width, pass) == 0) - continue; - - startx = PNG_PASS_START_COL(pass) * outchannels; - stepx = PNG_PASS_COL_OFFSET(pass) * outchannels; - y = PNG_PASS_START_ROW(pass); - stepy = PNG_PASS_ROW_OFFSET(pass); - } - - else - { - y = 0; - startx = 0; - stepx = outchannels; - stepy = 1; - } - - for (; ylocal_row), NULL); - inrow = png_voidcast(png_const_uint_16p, display->local_row); - - /* Now do the pre-multiplication on each pixel in this row. - */ - outrow += startx; - for (; outrow < end_row; outrow += stepx) - { - png_uint_32 component = inrow[0]; - png_uint_16 alpha = inrow[1]; - - if (alpha > 0) /* else 0 */ - { - if (alpha < 65535) /* else just use component */ - { - component *= alpha; - component += 32767; - component /= 65535; - } - } - - else - component = 0; - - outrow[swap_alpha] = (png_uint_16)component; - if (preserve_alpha) - outrow[1 ^ swap_alpha] = alpha; - - inrow += 2; /* components and alpha channel */ - } - } - } - } - break; - } - - return 1; -} - -/* The guts of png_image_finish_read as a png_safe_execute callback. */ -static int -png_image_read_direct(png_voidp argument) -{ - png_image_read_control *display = png_voidcast(png_image_read_control*, - argument); - png_imagep image = display->image; - png_structrp png_ptr = image->opaque->png_ptr; - png_inforp info_ptr = image->opaque->info_ptr; - - png_uint_32 format = image->format; - int linear = (format & PNG_FORMAT_FLAG_LINEAR) != 0; - int do_local_compose = 0; - int do_local_background = 0; /* to avoid double gamma correction bug */ - int passes = 0; - - /* Add transforms to ensure the correct output format is produced then check - * that the required implementation support is there. Always expand; always - * need 8 bits minimum, no palette and expanded tRNS. - */ - png_set_expand(png_ptr); - - /* Now check the format to see if it was modified. */ - { - png_uint_32 base_format = png_image_format(png_ptr) & - ~PNG_FORMAT_FLAG_COLORMAP /* removed by png_set_expand */; - png_uint_32 change = format ^ base_format; - png_fixed_point output_gamma; - int mode; /* alpha mode */ - - /* Do this first so that we have a record if rgb to gray is happening. */ - if (change & PNG_FORMAT_FLAG_COLOR) - { - /* gray<->color transformation required. */ - if (format & PNG_FORMAT_FLAG_COLOR) - png_set_gray_to_rgb(png_ptr); - - else - { - /* libpng can't do both rgb to gray and - * background/pre-multiplication if there is also significant gamma - * correction, because both operations require linear colors and - * the code only supports one transform doing the gamma correction. - * Handle this by doing the pre-multiplication or background - * operation in this code, if necessary. - * - * TODO: fix this by rewriting pngrtran.c (!) - * - * For the moment (given that fixing this in pngrtran.c is an - * enormous change) 'do_local_background' is used to indicate that - * the problem exists. - */ - if (base_format & PNG_FORMAT_FLAG_ALPHA) - do_local_background = 1/*maybe*/; - - png_set_rgb_to_gray_fixed(png_ptr, PNG_ERROR_ACTION_NONE, - PNG_RGB_TO_GRAY_DEFAULT, PNG_RGB_TO_GRAY_DEFAULT); - } - - change &= ~PNG_FORMAT_FLAG_COLOR; - } - - /* Set the gamma appropriately, linear for 16-bit input, sRGB otherwise. - */ - { - png_fixed_point input_gamma_default; - - if ((base_format & PNG_FORMAT_FLAG_LINEAR) && - (image->flags & PNG_IMAGE_FLAG_16BIT_sRGB) == 0) - input_gamma_default = PNG_GAMMA_LINEAR; - else - input_gamma_default = PNG_DEFAULT_sRGB; - - /* Call png_set_alpha_mode to set the default for the input gamma; the - * output gamma is set by a second call below. - */ - png_set_alpha_mode_fixed(png_ptr, PNG_ALPHA_PNG, input_gamma_default); - } - - if (linear) - { - /* If there *is* an alpha channel in the input it must be multiplied - * out; use PNG_ALPHA_STANDARD, otherwise just use PNG_ALPHA_PNG. - */ - if (base_format & PNG_FORMAT_FLAG_ALPHA) - mode = PNG_ALPHA_STANDARD; /* associated alpha */ - - else - mode = PNG_ALPHA_PNG; - - output_gamma = PNG_GAMMA_LINEAR; - } - - else - { - mode = PNG_ALPHA_PNG; - output_gamma = PNG_DEFAULT_sRGB; - } - - /* If 'do_local_background' is set check for the presence of gamma - * correction; this is part of the work-round for the libpng bug - * described above. - * - * TODO: fix libpng and remove this. - */ - if (do_local_background) - { - png_fixed_point gtest; - - /* This is 'png_gamma_threshold' from pngrtran.c; the test used for - * gamma correction, the screen gamma hasn't been set on png_struct - * yet; it's set below. png_struct::gamma, however, is set to the - * final value. - */ - if (png_muldiv(>est, output_gamma, png_ptr->colorspace.gamma, - PNG_FP_1) && !png_gamma_significant(gtest)) - do_local_background = 0; - - else if (mode == PNG_ALPHA_STANDARD) - { - do_local_background = 2/*required*/; - mode = PNG_ALPHA_PNG; /* prevent libpng doing it */ - } - - /* else leave as 1 for the checks below */ - } - - /* If the bit-depth changes then handle that here. */ - if (change & PNG_FORMAT_FLAG_LINEAR) - { - if (linear /*16-bit output*/) - png_set_expand_16(png_ptr); - - else /* 8-bit output */ - png_set_scale_16(png_ptr); - - change &= ~PNG_FORMAT_FLAG_LINEAR; - } - - /* Now the background/alpha channel changes. */ - if (change & PNG_FORMAT_FLAG_ALPHA) - { - /* Removing an alpha channel requires composition for the 8-bit - * formats; for the 16-bit it is already done, above, by the - * pre-multiplication and the channel just needs to be stripped. - */ - if (base_format & PNG_FORMAT_FLAG_ALPHA) - { - /* If RGB->gray is happening the alpha channel must be left and the - * operation completed locally. - * - * TODO: fix libpng and remove this. - */ - if (do_local_background) - do_local_background = 2/*required*/; - - /* 16-bit output: just remove the channel */ - else if (linear) /* compose on black (well, pre-multiply) */ - png_set_strip_alpha(png_ptr); - - /* 8-bit output: do an appropriate compose */ - else if (display->background != NULL) - { - png_color_16 c; - - c.index = 0; /*unused*/ - c.red = display->background->red; - c.green = display->background->green; - c.blue = display->background->blue; - c.gray = display->background->green; - - /* This is always an 8-bit sRGB value, using the 'green' channel - * for gray is much better than calculating the luminance here; - * we can get off-by-one errors in that calculation relative to - * the app expectations and that will show up in transparent - * pixels. - */ - png_set_background_fixed(png_ptr, &c, - PNG_BACKGROUND_GAMMA_SCREEN, 0/*need_expand*/, - 0/*gamma: not used*/); - } - - else /* compose on row: implemented below. */ - { - do_local_compose = 1; - /* This leaves the alpha channel in the output, so it has to be - * removed by the code below. Set the encoding to the 'OPTIMIZE' - * one so the code only has to hack on the pixels that require - * composition. - */ - mode = PNG_ALPHA_OPTIMIZED; - } - } - - else /* output needs an alpha channel */ - { - /* This is tricky because it happens before the swap operation has - * been accomplished; however, the swap does *not* swap the added - * alpha channel (weird API), so it must be added in the correct - * place. - */ - png_uint_32 filler; /* opaque filler */ - int where; - - if (linear) - filler = 65535; - - else - filler = 255; - -# ifdef PNG_FORMAT_AFIRST_SUPPORTED - if (format & PNG_FORMAT_FLAG_AFIRST) - { - where = PNG_FILLER_BEFORE; - change &= ~PNG_FORMAT_FLAG_AFIRST; - } - - else -# endif - where = PNG_FILLER_AFTER; - - png_set_add_alpha(png_ptr, filler, where); - } - - /* This stops the (irrelevant) call to swap_alpha below. */ - change &= ~PNG_FORMAT_FLAG_ALPHA; - } - - /* Now set the alpha mode correctly; this is always done, even if there is - * no alpha channel in either the input or the output because it correctly - * sets the output gamma. - */ - png_set_alpha_mode_fixed(png_ptr, mode, output_gamma); - -# ifdef PNG_FORMAT_BGR_SUPPORTED - if (change & PNG_FORMAT_FLAG_BGR) - { - /* Check only the output format; PNG is never BGR; don't do this if - * the output is gray, but fix up the 'format' value in that case. - */ - if (format & PNG_FORMAT_FLAG_COLOR) - png_set_bgr(png_ptr); - - else - format &= ~PNG_FORMAT_FLAG_BGR; - - change &= ~PNG_FORMAT_FLAG_BGR; - } -# endif - -# ifdef PNG_FORMAT_AFIRST_SUPPORTED - if (change & PNG_FORMAT_FLAG_AFIRST) - { - /* Only relevant if there is an alpha channel - it's particularly - * important to handle this correctly because do_local_compose may - * be set above and then libpng will keep the alpha channel for this - * code to remove. - */ - if (format & PNG_FORMAT_FLAG_ALPHA) - { - /* Disable this if doing a local background, - * TODO: remove this when local background is no longer required. - */ - if (do_local_background != 2) - png_set_swap_alpha(png_ptr); - } - - else - format &= ~PNG_FORMAT_FLAG_AFIRST; - - change &= ~PNG_FORMAT_FLAG_AFIRST; - } -# endif - - /* If the *output* is 16-bit then we need to check for a byte-swap on this - * architecture. - */ - if (linear) - { - PNG_CONST png_uint_16 le = 0x0001; - - if (*(png_const_bytep)&le) - png_set_swap(png_ptr); - } - - /* If change is not now 0 some transformation is missing - error out. */ - if (change) - png_error(png_ptr, "png_read_image: unsupported transformation"); - } - - PNG_SKIP_CHUNKS(png_ptr); - - /* Update the 'info' structure and make sure the result is as required; first - * make sure to turn on the interlace handling if it will be required - * (because it can't be turned on *after* the call to png_read_update_info!) - * - * TODO: remove the do_local_background fixup below. - */ - if (!do_local_compose && do_local_background != 2) - passes = png_set_interlace_handling(png_ptr); - - png_read_update_info(png_ptr, info_ptr); - - { - png_uint_32 info_format = 0; - - if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) - info_format |= PNG_FORMAT_FLAG_COLOR; - - if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) - { - /* do_local_compose removes this channel below. */ - if (!do_local_compose) - { - /* do_local_background does the same if required. */ - if (do_local_background != 2 || - (format & PNG_FORMAT_FLAG_ALPHA) != 0) - info_format |= PNG_FORMAT_FLAG_ALPHA; - } - } - - else if (do_local_compose) /* internal error */ - png_error(png_ptr, "png_image_read: alpha channel lost"); - - if (info_ptr->bit_depth == 16) - info_format |= PNG_FORMAT_FLAG_LINEAR; - -# ifdef PNG_FORMAT_BGR_SUPPORTED - if (png_ptr->transformations & PNG_BGR) - info_format |= PNG_FORMAT_FLAG_BGR; -# endif - -# ifdef PNG_FORMAT_AFIRST_SUPPORTED - if (do_local_background == 2) - { - if (format & PNG_FORMAT_FLAG_AFIRST) - info_format |= PNG_FORMAT_FLAG_AFIRST; - } - - if ((png_ptr->transformations & PNG_SWAP_ALPHA) != 0 || - ((png_ptr->transformations & PNG_ADD_ALPHA) != 0 && - (png_ptr->flags & PNG_FLAG_FILLER_AFTER) == 0)) - { - if (do_local_background == 2) - png_error(png_ptr, "unexpected alpha swap transformation"); - - info_format |= PNG_FORMAT_FLAG_AFIRST; - } -# endif - - /* This is actually an internal error. */ - if (info_format != format) - png_error(png_ptr, "png_read_image: invalid transformations"); - } - - /* Now read the rows. If do_local_compose is set then it is necessary to use - * a local row buffer. The output will be GA, RGBA or BGRA and must be - * converted to G, RGB or BGR as appropriate. The 'local_row' member of the - * display acts as a flag. - */ - { - png_voidp first_row = display->buffer; - ptrdiff_t row_bytes = display->row_stride; - - if (linear) - row_bytes *= 2; - - /* The following expression is designed to work correctly whether it gives - * a signed or an unsigned result. - */ - if (row_bytes < 0) - { - char *ptr = png_voidcast(char*, first_row); - ptr += (image->height-1) * (-row_bytes); - first_row = png_voidcast(png_voidp, ptr); - } - - display->first_row = first_row; - display->row_bytes = row_bytes; - } - - if (do_local_compose) - { - int result; - png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr)); - - display->local_row = row; - result = png_safe_execute(image, png_image_read_composite, display); - display->local_row = NULL; - png_free(png_ptr, row); - - return result; - } - - else if (do_local_background == 2) - { - int result; - png_voidp row = png_malloc(png_ptr, png_get_rowbytes(png_ptr, info_ptr)); - - display->local_row = row; - result = png_safe_execute(image, png_image_read_background, display); - display->local_row = NULL; - png_free(png_ptr, row); - - return result; - } - - else - { - png_alloc_size_t row_bytes = display->row_bytes; - - while (--passes >= 0) - { - png_uint_32 y = image->height; - png_bytep row = png_voidcast(png_bytep, display->first_row); - - while (y-- > 0) - { - png_read_row(png_ptr, row, NULL); - row += row_bytes; - } - } - - return 1; - } -} - -int PNGAPI -png_image_finish_read(png_imagep image, png_const_colorp background, - void *buffer, png_int_32 row_stride, void *colormap) -{ - if (image != NULL && image->version == PNG_IMAGE_VERSION) - { - png_uint_32 check; - - if (row_stride == 0) - row_stride = PNG_IMAGE_ROW_STRIDE(*image); - - if (row_stride < 0) - check = -row_stride; - - else - check = row_stride; - - if (image->opaque != NULL && buffer != NULL && - check >= PNG_IMAGE_ROW_STRIDE(*image)) - { - if ((image->format & PNG_FORMAT_FLAG_COLORMAP) == 0 || - (image->colormap_entries > 0 && colormap != NULL)) - { - int result; - png_image_read_control display; - - memset(&display, 0, (sizeof display)); - display.image = image; - display.buffer = buffer; - display.row_stride = row_stride; - display.colormap = colormap; - display.background = background; - display.local_row = NULL; - - /* Choose the correct 'end' routine; for the color-map case all the - * setup has already been done. - */ - if (image->format & PNG_FORMAT_FLAG_COLORMAP) - result = - png_safe_execute(image, png_image_read_colormap, &display) && - png_safe_execute(image, png_image_read_colormapped, &display); - - else - result = - png_safe_execute(image, png_image_read_direct, &display); - - png_image_free(image); - return result; - } - - else - return png_image_error(image, - "png_image_finish_read[color-map]: no color-map"); - } - - else - return png_image_error(image, - "png_image_finish_read: invalid argument"); - } - - else if (image != NULL) - return png_image_error(image, - "png_image_finish_read: damaged PNG_IMAGE_VERSION"); - - return 0; -} - -#endif /* PNG_SIMPLIFIED_READ_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrio.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrio.c deleted file mode 100755 index 2b9c103..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrio.c +++ /dev/null @@ -1,118 +0,0 @@ - -/* pngrio.c - functions for data input - * - * Last changed in libpng 1.6.0 [February 14, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - * This file provides a location for all input. Users who need - * special handling are expected to write a function that has the same - * arguments as this and performs a similar function, but that possibly - * has a different input method. Note that you shouldn't change this - * function, but rather write a replacement function and then make - * libpng use it at run time with png_set_read_fn(...). - */ - -#include "pngpriv.h" - -#ifdef PNG_READ_SUPPORTED - -/* Read the data from whatever input you are using. The default routine - * reads from a file pointer. Note that this routine sometimes gets called - * with very small lengths, so you should implement some kind of simple - * buffering if you are using unbuffered reads. This should never be asked - * to read more then 64K on a 16 bit machine. - */ -void /* PRIVATE */ -png_read_data(png_structrp png_ptr, png_bytep data, png_size_t length) -{ - png_debug1(4, "reading %d bytes", (int)length); - - if (png_ptr->read_data_fn != NULL) - (*(png_ptr->read_data_fn))(png_ptr, data, length); - - else - png_error(png_ptr, "Call to NULL read function"); -} - -#ifdef PNG_STDIO_SUPPORTED -/* This is the function that does the actual reading of data. If you are - * not reading from a standard C stream, you should create a replacement - * read_data function and use it at run time with png_set_read_fn(), rather - * than changing the library. - */ -void PNGCBAPI -png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_size_t check; - - if (png_ptr == NULL) - return; - - /* fread() returns 0 on error, so it is OK to store this in a png_size_t - * instead of an int, which is what fread() actually returns. - */ - check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr)); - - if (check != length) - png_error(png_ptr, "Read Error"); -} -#endif - -/* This function allows the application to supply a new input function - * for libpng if standard C streams aren't being used. - * - * This function takes as its arguments: - * - * png_ptr - pointer to a png input data structure - * - * io_ptr - pointer to user supplied structure containing info about - * the input functions. May be NULL. - * - * read_data_fn - pointer to a new input function that takes as its - * arguments a pointer to a png_struct, a pointer to - * a location where input data can be stored, and a 32-bit - * unsigned int that is the number of bytes to be read. - * To exit and output any fatal error messages the new write - * function should call png_error(png_ptr, "Error msg"). - * May be NULL, in which case libpng's default function will - * be used. - */ -void PNGAPI -png_set_read_fn(png_structrp png_ptr, png_voidp io_ptr, - png_rw_ptr read_data_fn) -{ - if (png_ptr == NULL) - return; - - png_ptr->io_ptr = io_ptr; - -#ifdef PNG_STDIO_SUPPORTED - if (read_data_fn != NULL) - png_ptr->read_data_fn = read_data_fn; - - else - png_ptr->read_data_fn = png_default_read_data; -#else - png_ptr->read_data_fn = read_data_fn; -#endif - - /* It is an error to write to a read device */ - if (png_ptr->write_data_fn != NULL) - { - png_ptr->write_data_fn = NULL; - png_warning(png_ptr, - "Can't set both read_data_fn and write_data_fn in the" - " same structure"); - } - -#ifdef PNG_WRITE_FLUSH_SUPPORTED - png_ptr->output_flush_fn = NULL; -#endif -} -#endif /* PNG_READ_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrtran.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrtran.c deleted file mode 100755 index 034b9c3..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrtran.c +++ /dev/null @@ -1,5102 +0,0 @@ - -/* pngrtran.c - transforms the data in a row for PNG readers - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - * This file contains functions optionally called by an application - * in order to tell libpng how to handle data when reading a PNG. - * Transformations that are used in both reading and writing are - * in pngtrans.c. - */ - -#include "pngpriv.h" - -#ifdef PNG_READ_SUPPORTED - -/* Set the action on getting a CRC error for an ancillary or critical chunk. */ -void PNGAPI -png_set_crc_action(png_structrp png_ptr, int crit_action, int ancil_action) -{ - png_debug(1, "in png_set_crc_action"); - - if (png_ptr == NULL) - return; - - /* Tell libpng how we react to CRC errors in critical chunks */ - switch (crit_action) - { - case PNG_CRC_NO_CHANGE: /* Leave setting as is */ - break; - - case PNG_CRC_WARN_USE: /* Warn/use data */ - png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; - png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE; - break; - - case PNG_CRC_QUIET_USE: /* Quiet/use data */ - png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; - png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE | - PNG_FLAG_CRC_CRITICAL_IGNORE; - break; - - case PNG_CRC_WARN_DISCARD: /* Not a valid action for critical data */ - png_warning(png_ptr, - "Can't discard critical data on CRC error"); - case PNG_CRC_ERROR_QUIT: /* Error/quit */ - - case PNG_CRC_DEFAULT: - default: - png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK; - break; - } - - /* Tell libpng how we react to CRC errors in ancillary chunks */ - switch (ancil_action) - { - case PNG_CRC_NO_CHANGE: /* Leave setting as is */ - break; - - case PNG_CRC_WARN_USE: /* Warn/use data */ - png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; - png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE; - break; - - case PNG_CRC_QUIET_USE: /* Quiet/use data */ - png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; - png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE | - PNG_FLAG_CRC_ANCILLARY_NOWARN; - break; - - case PNG_CRC_ERROR_QUIT: /* Error/quit */ - png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; - png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN; - break; - - case PNG_CRC_WARN_DISCARD: /* Warn/discard data */ - - case PNG_CRC_DEFAULT: - default: - png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK; - break; - } -} - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED -/* Is it OK to set a transformation now? Only if png_start_read_image or - * png_read_update_info have not been called. It is not necessary for the IHDR - * to have been read in all cases, the parameter allows for this check too. - */ -static int -png_rtran_ok(png_structrp png_ptr, int need_IHDR) -{ - if (png_ptr != NULL) - { - if (png_ptr->flags & PNG_FLAG_ROW_INIT) - png_app_error(png_ptr, - "invalid after png_start_read_image or png_read_update_info"); - - else if (need_IHDR && (png_ptr->mode & PNG_HAVE_IHDR) == 0) - png_app_error(png_ptr, "invalid before the PNG header has been read"); - - else - { - /* Turn on failure to initialize correctly for all transforms. */ - png_ptr->flags |= PNG_FLAG_DETECT_UNINITIALIZED; - - return 1; /* Ok */ - } - } - - return 0; /* no png_error possible! */ -} -#endif - -#ifdef PNG_READ_BACKGROUND_SUPPORTED -/* Handle alpha and tRNS via a background color */ -void PNGFAPI -png_set_background_fixed(png_structrp png_ptr, - png_const_color_16p background_color, int background_gamma_code, - int need_expand, png_fixed_point background_gamma) -{ - png_debug(1, "in png_set_background_fixed"); - - if (!png_rtran_ok(png_ptr, 0) || background_color == NULL) - return; - - if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN) - { - png_warning(png_ptr, "Application must supply a known background gamma"); - return; - } - - png_ptr->transformations |= PNG_COMPOSE | PNG_STRIP_ALPHA; - png_ptr->transformations &= ~PNG_ENCODE_ALPHA; - png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; - - png_ptr->background = *background_color; - png_ptr->background_gamma = background_gamma; - png_ptr->background_gamma_type = (png_byte)(background_gamma_code); - if (need_expand) - png_ptr->transformations |= PNG_BACKGROUND_EXPAND; - else - png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND; -} - -# ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_background(png_structrp png_ptr, - png_const_color_16p background_color, int background_gamma_code, - int need_expand, double background_gamma) -{ - png_set_background_fixed(png_ptr, background_color, background_gamma_code, - need_expand, png_fixed(png_ptr, background_gamma, "png_set_background")); -} -# endif /* FLOATING_POINT */ -#endif /* READ_BACKGROUND */ - -/* Scale 16-bit depth files to 8-bit depth. If both of these are set then the - * one that pngrtran does first (scale) happens. This is necessary to allow the - * TRANSFORM and API behavior to be somewhat consistent, and it's simpler. - */ -#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED -void PNGAPI -png_set_scale_16(png_structrp png_ptr) -{ - png_debug(1, "in png_set_scale_16"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - png_ptr->transformations |= PNG_SCALE_16_TO_8; -} -#endif - -#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED -/* Chop 16-bit depth files to 8-bit depth */ -void PNGAPI -png_set_strip_16(png_structrp png_ptr) -{ - png_debug(1, "in png_set_strip_16"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - png_ptr->transformations |= PNG_16_TO_8; -} -#endif - -#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED -void PNGAPI -png_set_strip_alpha(png_structrp png_ptr) -{ - png_debug(1, "in png_set_strip_alpha"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - png_ptr->transformations |= PNG_STRIP_ALPHA; -} -#endif - -#if defined(PNG_READ_ALPHA_MODE_SUPPORTED) || defined(PNG_READ_GAMMA_SUPPORTED) -static png_fixed_point -translate_gamma_flags(png_structrp png_ptr, png_fixed_point output_gamma, - int is_screen) -{ - /* Check for flag values. The main reason for having the old Mac value as a - * flag is that it is pretty near impossible to work out what the correct - * value is from Apple documentation - a working Mac system is needed to - * discover the value! - */ - if (output_gamma == PNG_DEFAULT_sRGB || - output_gamma == PNG_FP_1 / PNG_DEFAULT_sRGB) - { - /* If there is no sRGB support this just sets the gamma to the standard - * sRGB value. (This is a side effect of using this function!) - */ -# ifdef PNG_READ_sRGB_SUPPORTED - png_ptr->flags |= PNG_FLAG_ASSUME_sRGB; -# endif - if (is_screen) - output_gamma = PNG_GAMMA_sRGB; - else - output_gamma = PNG_GAMMA_sRGB_INVERSE; - } - - else if (output_gamma == PNG_GAMMA_MAC_18 || - output_gamma == PNG_FP_1 / PNG_GAMMA_MAC_18) - { - if (is_screen) - output_gamma = PNG_GAMMA_MAC_OLD; - else - output_gamma = PNG_GAMMA_MAC_INVERSE; - } - - return output_gamma; -} - -# ifdef PNG_FLOATING_POINT_SUPPORTED -static png_fixed_point -convert_gamma_value(png_structrp png_ptr, double output_gamma) -{ - /* The following silently ignores cases where fixed point (times 100,000) - * gamma values are passed to the floating point API. This is safe and it - * means the fixed point constants work just fine with the floating point - * API. The alternative would just lead to undetected errors and spurious - * bug reports. Negative values fail inside the _fixed API unless they - * correspond to the flag values. - */ - if (output_gamma > 0 && output_gamma < 128) - output_gamma *= PNG_FP_1; - - /* This preserves -1 and -2 exactly: */ - output_gamma = floor(output_gamma + .5); - - if (output_gamma > PNG_FP_MAX || output_gamma < PNG_FP_MIN) - png_fixed_error(png_ptr, "gamma value"); - - return (png_fixed_point)output_gamma; -} -# endif -#endif /* READ_ALPHA_MODE || READ_GAMMA */ - -#ifdef PNG_READ_ALPHA_MODE_SUPPORTED -void PNGFAPI -png_set_alpha_mode_fixed(png_structrp png_ptr, int mode, - png_fixed_point output_gamma) -{ - int compose = 0; - png_fixed_point file_gamma; - - png_debug(1, "in png_set_alpha_mode"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - output_gamma = translate_gamma_flags(png_ptr, output_gamma, 1/*screen*/); - - /* Validate the value to ensure it is in a reasonable range. The value - * is expected to be 1 or greater, but this range test allows for some - * viewing correction values. The intent is to weed out users of this API - * who use the inverse of the gamma value accidentally! Since some of these - * values are reasonable this may have to be changed. - */ - if (output_gamma < 70000 || output_gamma > 300000) - png_error(png_ptr, "output gamma out of expected range"); - - /* The default file gamma is the inverse of the output gamma; the output - * gamma may be changed below so get the file value first: - */ - file_gamma = png_reciprocal(output_gamma); - - /* There are really 8 possibilities here, composed of any combination - * of: - * - * premultiply the color channels - * do not encode non-opaque pixels - * encode the alpha as well as the color channels - * - * The differences disappear if the input/output ('screen') gamma is 1.0, - * because then the encoding is a no-op and there is only the choice of - * premultiplying the color channels or not. - * - * png_set_alpha_mode and png_set_background interact because both use - * png_compose to do the work. Calling both is only useful when - * png_set_alpha_mode is used to set the default mode - PNG_ALPHA_PNG - along - * with a default gamma value. Otherwise PNG_COMPOSE must not be set. - */ - switch (mode) - { - case PNG_ALPHA_PNG: /* default: png standard */ - /* No compose, but it may be set by png_set_background! */ - png_ptr->transformations &= ~PNG_ENCODE_ALPHA; - png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; - break; - - case PNG_ALPHA_ASSOCIATED: /* color channels premultiplied */ - compose = 1; - png_ptr->transformations &= ~PNG_ENCODE_ALPHA; - png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; - /* The output is linear: */ - output_gamma = PNG_FP_1; - break; - - case PNG_ALPHA_OPTIMIZED: /* associated, non-opaque pixels linear */ - compose = 1; - png_ptr->transformations &= ~PNG_ENCODE_ALPHA; - png_ptr->flags |= PNG_FLAG_OPTIMIZE_ALPHA; - /* output_gamma records the encoding of opaque pixels! */ - break; - - case PNG_ALPHA_BROKEN: /* associated, non-linear, alpha encoded */ - compose = 1; - png_ptr->transformations |= PNG_ENCODE_ALPHA; - png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; - break; - - default: - png_error(png_ptr, "invalid alpha mode"); - } - - /* Only set the default gamma if the file gamma has not been set (this has - * the side effect that the gamma in a second call to png_set_alpha_mode will - * be ignored.) - */ - if (png_ptr->colorspace.gamma == 0) - { - png_ptr->colorspace.gamma = file_gamma; - png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA; - } - - /* But always set the output gamma: */ - png_ptr->screen_gamma = output_gamma; - - /* Finally, if pre-multiplying, set the background fields to achieve the - * desired result. - */ - if (compose) - { - /* And obtain alpha pre-multiplication by composing on black: */ - memset(&png_ptr->background, 0, (sizeof png_ptr->background)); - png_ptr->background_gamma = png_ptr->colorspace.gamma; /* just in case */ - png_ptr->background_gamma_type = PNG_BACKGROUND_GAMMA_FILE; - png_ptr->transformations &= ~PNG_BACKGROUND_EXPAND; - - if (png_ptr->transformations & PNG_COMPOSE) - png_error(png_ptr, - "conflicting calls to set alpha mode and background"); - - png_ptr->transformations |= PNG_COMPOSE; - } -} - -# ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_alpha_mode(png_structrp png_ptr, int mode, double output_gamma) -{ - png_set_alpha_mode_fixed(png_ptr, mode, convert_gamma_value(png_ptr, - output_gamma)); -} -# endif -#endif - -#ifdef PNG_READ_QUANTIZE_SUPPORTED -/* Dither file to 8-bit. Supply a palette, the current number - * of elements in the palette, the maximum number of elements - * allowed, and a histogram if possible. If the current number - * of colors is greater then the maximum number, the palette will be - * modified to fit in the maximum number. "full_quantize" indicates - * whether we need a quantizing cube set up for RGB images, or if we - * simply are reducing the number of colors in a paletted image. - */ - -typedef struct png_dsort_struct -{ - struct png_dsort_struct * next; - png_byte left; - png_byte right; -} png_dsort; -typedef png_dsort * png_dsortp; -typedef png_dsort * * png_dsortpp; - -void PNGAPI -png_set_quantize(png_structrp png_ptr, png_colorp palette, - int num_palette, int maximum_colors, png_const_uint_16p histogram, - int full_quantize) -{ - png_debug(1, "in png_set_quantize"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - png_ptr->transformations |= PNG_QUANTIZE; - - if (!full_quantize) - { - int i; - - png_ptr->quantize_index = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * (sizeof (png_byte)))); - for (i = 0; i < num_palette; i++) - png_ptr->quantize_index[i] = (png_byte)i; - } - - if (num_palette > maximum_colors) - { - if (histogram != NULL) - { - /* This is easy enough, just throw out the least used colors. - * Perhaps not the best solution, but good enough. - */ - - int i; - - /* Initialize an array to sort colors */ - png_ptr->quantize_sort = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * (sizeof (png_byte)))); - - /* Initialize the quantize_sort array */ - for (i = 0; i < num_palette; i++) - png_ptr->quantize_sort[i] = (png_byte)i; - - /* Find the least used palette entries by starting a - * bubble sort, and running it until we have sorted - * out enough colors. Note that we don't care about - * sorting all the colors, just finding which are - * least used. - */ - - for (i = num_palette - 1; i >= maximum_colors; i--) - { - int done; /* To stop early if the list is pre-sorted */ - int j; - - done = 1; - for (j = 0; j < i; j++) - { - if (histogram[png_ptr->quantize_sort[j]] - < histogram[png_ptr->quantize_sort[j + 1]]) - { - png_byte t; - - t = png_ptr->quantize_sort[j]; - png_ptr->quantize_sort[j] = png_ptr->quantize_sort[j + 1]; - png_ptr->quantize_sort[j + 1] = t; - done = 0; - } - } - - if (done) - break; - } - - /* Swap the palette around, and set up a table, if necessary */ - if (full_quantize) - { - int j = num_palette; - - /* Put all the useful colors within the max, but don't - * move the others. - */ - for (i = 0; i < maximum_colors; i++) - { - if ((int)png_ptr->quantize_sort[i] >= maximum_colors) - { - do - j--; - while ((int)png_ptr->quantize_sort[j] >= maximum_colors); - - palette[i] = palette[j]; - } - } - } - else - { - int j = num_palette; - - /* Move all the used colors inside the max limit, and - * develop a translation table. - */ - for (i = 0; i < maximum_colors; i++) - { - /* Only move the colors we need to */ - if ((int)png_ptr->quantize_sort[i] >= maximum_colors) - { - png_color tmp_color; - - do - j--; - while ((int)png_ptr->quantize_sort[j] >= maximum_colors); - - tmp_color = palette[j]; - palette[j] = palette[i]; - palette[i] = tmp_color; - /* Indicate where the color went */ - png_ptr->quantize_index[j] = (png_byte)i; - png_ptr->quantize_index[i] = (png_byte)j; - } - } - - /* Find closest color for those colors we are not using */ - for (i = 0; i < num_palette; i++) - { - if ((int)png_ptr->quantize_index[i] >= maximum_colors) - { - int min_d, k, min_k, d_index; - - /* Find the closest color to one we threw out */ - d_index = png_ptr->quantize_index[i]; - min_d = PNG_COLOR_DIST(palette[d_index], palette[0]); - for (k = 1, min_k = 0; k < maximum_colors; k++) - { - int d; - - d = PNG_COLOR_DIST(palette[d_index], palette[k]); - - if (d < min_d) - { - min_d = d; - min_k = k; - } - } - /* Point to closest color */ - png_ptr->quantize_index[i] = (png_byte)min_k; - } - } - } - png_free(png_ptr, png_ptr->quantize_sort); - png_ptr->quantize_sort = NULL; - } - else - { - /* This is much harder to do simply (and quickly). Perhaps - * we need to go through a median cut routine, but those - * don't always behave themselves with only a few colors - * as input. So we will just find the closest two colors, - * and throw out one of them (chosen somewhat randomly). - * [We don't understand this at all, so if someone wants to - * work on improving it, be our guest - AED, GRP] - */ - int i; - int max_d; - int num_new_palette; - png_dsortp t; - png_dsortpp hash; - - t = NULL; - - /* Initialize palette index arrays */ - png_ptr->index_to_palette = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * (sizeof (png_byte)))); - png_ptr->palette_to_index = (png_bytep)png_malloc(png_ptr, - (png_uint_32)(num_palette * (sizeof (png_byte)))); - - /* Initialize the sort array */ - for (i = 0; i < num_palette; i++) - { - png_ptr->index_to_palette[i] = (png_byte)i; - png_ptr->palette_to_index[i] = (png_byte)i; - } - - hash = (png_dsortpp)png_calloc(png_ptr, (png_uint_32)(769 * - (sizeof (png_dsortp)))); - - num_new_palette = num_palette; - - /* Initial wild guess at how far apart the farthest pixel - * pair we will be eliminating will be. Larger - * numbers mean more areas will be allocated, Smaller - * numbers run the risk of not saving enough data, and - * having to do this all over again. - * - * I have not done extensive checking on this number. - */ - max_d = 96; - - while (num_new_palette > maximum_colors) - { - for (i = 0; i < num_new_palette - 1; i++) - { - int j; - - for (j = i + 1; j < num_new_palette; j++) - { - int d; - - d = PNG_COLOR_DIST(palette[i], palette[j]); - - if (d <= max_d) - { - - t = (png_dsortp)png_malloc_warn(png_ptr, - (png_uint_32)(sizeof (png_dsort))); - - if (t == NULL) - break; - - t->next = hash[d]; - t->left = (png_byte)i; - t->right = (png_byte)j; - hash[d] = t; - } - } - if (t == NULL) - break; - } - - if (t != NULL) - for (i = 0; i <= max_d; i++) - { - if (hash[i] != NULL) - { - png_dsortp p; - - for (p = hash[i]; p; p = p->next) - { - if ((int)png_ptr->index_to_palette[p->left] - < num_new_palette && - (int)png_ptr->index_to_palette[p->right] - < num_new_palette) - { - int j, next_j; - - if (num_new_palette & 0x01) - { - j = p->left; - next_j = p->right; - } - else - { - j = p->right; - next_j = p->left; - } - - num_new_palette--; - palette[png_ptr->index_to_palette[j]] - = palette[num_new_palette]; - if (!full_quantize) - { - int k; - - for (k = 0; k < num_palette; k++) - { - if (png_ptr->quantize_index[k] == - png_ptr->index_to_palette[j]) - png_ptr->quantize_index[k] = - png_ptr->index_to_palette[next_j]; - - if ((int)png_ptr->quantize_index[k] == - num_new_palette) - png_ptr->quantize_index[k] = - png_ptr->index_to_palette[j]; - } - } - - png_ptr->index_to_palette[png_ptr->palette_to_index - [num_new_palette]] = png_ptr->index_to_palette[j]; - - png_ptr->palette_to_index[png_ptr->index_to_palette[j]] - = png_ptr->palette_to_index[num_new_palette]; - - png_ptr->index_to_palette[j] = - (png_byte)num_new_palette; - - png_ptr->palette_to_index[num_new_palette] = - (png_byte)j; - } - if (num_new_palette <= maximum_colors) - break; - } - if (num_new_palette <= maximum_colors) - break; - } - } - - for (i = 0; i < 769; i++) - { - if (hash[i] != NULL) - { - png_dsortp p = hash[i]; - while (p) - { - t = p->next; - png_free(png_ptr, p); - p = t; - } - } - hash[i] = 0; - } - max_d += 96; - } - png_free(png_ptr, hash); - png_free(png_ptr, png_ptr->palette_to_index); - png_free(png_ptr, png_ptr->index_to_palette); - png_ptr->palette_to_index = NULL; - png_ptr->index_to_palette = NULL; - } - num_palette = maximum_colors; - } - if (png_ptr->palette == NULL) - { - png_ptr->palette = palette; - } - png_ptr->num_palette = (png_uint_16)num_palette; - - if (full_quantize) - { - int i; - png_bytep distance; - int total_bits = PNG_QUANTIZE_RED_BITS + PNG_QUANTIZE_GREEN_BITS + - PNG_QUANTIZE_BLUE_BITS; - int num_red = (1 << PNG_QUANTIZE_RED_BITS); - int num_green = (1 << PNG_QUANTIZE_GREEN_BITS); - int num_blue = (1 << PNG_QUANTIZE_BLUE_BITS); - png_size_t num_entries = ((png_size_t)1 << total_bits); - - png_ptr->palette_lookup = (png_bytep)png_calloc(png_ptr, - (png_uint_32)(num_entries * (sizeof (png_byte)))); - - distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries * - (sizeof (png_byte)))); - - memset(distance, 0xff, num_entries * (sizeof (png_byte))); - - for (i = 0; i < num_palette; i++) - { - int ir, ig, ib; - int r = (palette[i].red >> (8 - PNG_QUANTIZE_RED_BITS)); - int g = (palette[i].green >> (8 - PNG_QUANTIZE_GREEN_BITS)); - int b = (palette[i].blue >> (8 - PNG_QUANTIZE_BLUE_BITS)); - - for (ir = 0; ir < num_red; ir++) - { - /* int dr = abs(ir - r); */ - int dr = ((ir > r) ? ir - r : r - ir); - int index_r = (ir << (PNG_QUANTIZE_BLUE_BITS + - PNG_QUANTIZE_GREEN_BITS)); - - for (ig = 0; ig < num_green; ig++) - { - /* int dg = abs(ig - g); */ - int dg = ((ig > g) ? ig - g : g - ig); - int dt = dr + dg; - int dm = ((dr > dg) ? dr : dg); - int index_g = index_r | (ig << PNG_QUANTIZE_BLUE_BITS); - - for (ib = 0; ib < num_blue; ib++) - { - int d_index = index_g | ib; - /* int db = abs(ib - b); */ - int db = ((ib > b) ? ib - b : b - ib); - int dmax = ((dm > db) ? dm : db); - int d = dmax + dt + db; - - if (d < (int)distance[d_index]) - { - distance[d_index] = (png_byte)d; - png_ptr->palette_lookup[d_index] = (png_byte)i; - } - } - } - } - } - - png_free(png_ptr, distance); - } -} -#endif /* PNG_READ_QUANTIZE_SUPPORTED */ - -#ifdef PNG_READ_GAMMA_SUPPORTED -void PNGFAPI -png_set_gamma_fixed(png_structrp png_ptr, png_fixed_point scrn_gamma, - png_fixed_point file_gamma) -{ - png_debug(1, "in png_set_gamma_fixed"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - /* New in libpng-1.5.4 - reserve particular negative values as flags. */ - scrn_gamma = translate_gamma_flags(png_ptr, scrn_gamma, 1/*screen*/); - file_gamma = translate_gamma_flags(png_ptr, file_gamma, 0/*file*/); - - /* Checking the gamma values for being >0 was added in 1.5.4 along with the - * premultiplied alpha support; this actually hides an undocumented feature - * of the previous implementation which allowed gamma processing to be - * disabled in background handling. There is no evidence (so far) that this - * was being used; however, png_set_background itself accepted and must still - * accept '0' for the gamma value it takes, because it isn't always used. - * - * Since this is an API change (albeit a very minor one that removes an - * undocumented API feature) the following checks were only enabled in - * libpng-1.6.0. - */ - if (file_gamma <= 0) - png_error(png_ptr, "invalid file gamma in png_set_gamma"); - - if (scrn_gamma <= 0) - png_error(png_ptr, "invalid screen gamma in png_set_gamma"); - - /* Set the gamma values unconditionally - this overrides the value in the PNG - * file if a gAMA chunk was present. png_set_alpha_mode provides a - * different, easier, way to default the file gamma. - */ - png_ptr->colorspace.gamma = file_gamma; - png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA; - png_ptr->screen_gamma = scrn_gamma; -} - -# ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_gamma(png_structrp png_ptr, double scrn_gamma, double file_gamma) -{ - png_set_gamma_fixed(png_ptr, convert_gamma_value(png_ptr, scrn_gamma), - convert_gamma_value(png_ptr, file_gamma)); -} -# endif /* FLOATING_POINT_SUPPORTED */ -#endif /* READ_GAMMA */ - -#ifdef PNG_READ_EXPAND_SUPPORTED -/* Expand paletted images to RGB, expand grayscale images of - * less than 8-bit depth to 8-bit depth, and expand tRNS chunks - * to alpha channels. - */ -void PNGAPI -png_set_expand(png_structrp png_ptr) -{ - png_debug(1, "in png_set_expand"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); -} - -/* GRR 19990627: the following three functions currently are identical - * to png_set_expand(). However, it is entirely reasonable that someone - * might wish to expand an indexed image to RGB but *not* expand a single, - * fully transparent palette entry to a full alpha channel--perhaps instead - * convert tRNS to the grayscale/RGB format (16-bit RGB value), or replace - * the transparent color with a particular RGB value, or drop tRNS entirely. - * IOW, a future version of the library may make the transformations flag - * a bit more fine-grained, with separate bits for each of these three - * functions. - * - * More to the point, these functions make it obvious what libpng will be - * doing, whereas "expand" can (and does) mean any number of things. - * - * GRP 20060307: In libpng-1.2.9, png_set_gray_1_2_4_to_8() was modified - * to expand only the sample depth but not to expand the tRNS to alpha - * and its name was changed to png_set_expand_gray_1_2_4_to_8(). - */ - -/* Expand paletted images to RGB. */ -void PNGAPI -png_set_palette_to_rgb(png_structrp png_ptr) -{ - png_debug(1, "in png_set_palette_to_rgb"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); -} - -/* Expand grayscale images of less than 8-bit depth to 8 bits. */ -void PNGAPI -png_set_expand_gray_1_2_4_to_8(png_structrp png_ptr) -{ - png_debug(1, "in png_set_expand_gray_1_2_4_to_8"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - png_ptr->transformations |= PNG_EXPAND; -} - -/* Expand tRNS chunks to alpha channels. */ -void PNGAPI -png_set_tRNS_to_alpha(png_structrp png_ptr) -{ - png_debug(1, "in png_set_tRNS_to_alpha"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS); -} -#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */ - -#ifdef PNG_READ_EXPAND_16_SUPPORTED -/* Expand to 16-bit channels, expand the tRNS chunk too (because otherwise - * it may not work correctly.) - */ -void PNGAPI -png_set_expand_16(png_structrp png_ptr) -{ - png_debug(1, "in png_set_expand_16"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - png_ptr->transformations |= (PNG_EXPAND_16 | PNG_EXPAND | PNG_EXPAND_tRNS); -} -#endif - -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED -void PNGAPI -png_set_gray_to_rgb(png_structrp png_ptr) -{ - png_debug(1, "in png_set_gray_to_rgb"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - - /* Because rgb must be 8 bits or more: */ - png_set_expand_gray_1_2_4_to_8(png_ptr); - png_ptr->transformations |= PNG_GRAY_TO_RGB; -} -#endif - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED -void PNGFAPI -png_set_rgb_to_gray_fixed(png_structrp png_ptr, int error_action, - png_fixed_point red, png_fixed_point green) -{ - png_debug(1, "in png_set_rgb_to_gray"); - - /* Need the IHDR here because of the check on color_type below. */ - /* TODO: fix this */ - if (!png_rtran_ok(png_ptr, 1)) - return; - - switch(error_action) - { - case PNG_ERROR_ACTION_NONE: - png_ptr->transformations |= PNG_RGB_TO_GRAY; - break; - - case PNG_ERROR_ACTION_WARN: - png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN; - break; - - case PNG_ERROR_ACTION_ERROR: - png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR; - break; - - default: - png_error(png_ptr, "invalid error action to rgb_to_gray"); - break; - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) -#ifdef PNG_READ_EXPAND_SUPPORTED - png_ptr->transformations |= PNG_EXPAND; -#else - { - /* Make this an error in 1.6 because otherwise the application may assume - * that it just worked and get a memory overwrite. - */ - png_error(png_ptr, - "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED"); - - /* png_ptr->transformations &= ~PNG_RGB_TO_GRAY; */ - } -#endif - { - if (red >= 0 && green >= 0 && red + green <= PNG_FP_1) - { - png_uint_16 red_int, green_int; - - /* NOTE: this calculation does not round, but this behavior is retained - * for consistency, the inaccuracy is very small. The code here always - * overwrites the coefficients, regardless of whether they have been - * defaulted or set already. - */ - red_int = (png_uint_16)(((png_uint_32)red*32768)/100000); - green_int = (png_uint_16)(((png_uint_32)green*32768)/100000); - - png_ptr->rgb_to_gray_red_coeff = red_int; - png_ptr->rgb_to_gray_green_coeff = green_int; - png_ptr->rgb_to_gray_coefficients_set = 1; - } - - else - { - if (red >= 0 && green >= 0) - png_app_warning(png_ptr, - "ignoring out of range rgb_to_gray coefficients"); - - /* Use the defaults, from the cHRM chunk if set, else the historical - * values which are close to the sRGB/HDTV/ITU-Rec 709 values. See - * png_do_rgb_to_gray for more discussion of the values. In this case - * the coefficients are not marked as 'set' and are not overwritten if - * something has already provided a default. - */ - if (png_ptr->rgb_to_gray_red_coeff == 0 && - png_ptr->rgb_to_gray_green_coeff == 0) - { - png_ptr->rgb_to_gray_red_coeff = 6968; - png_ptr->rgb_to_gray_green_coeff = 23434; - /* png_ptr->rgb_to_gray_blue_coeff = 2366; */ - } - } - } -} - -#ifdef PNG_FLOATING_POINT_SUPPORTED -/* Convert a RGB image to a grayscale of the same width. This allows us, - * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image. - */ - -void PNGAPI -png_set_rgb_to_gray(png_structrp png_ptr, int error_action, double red, - double green) -{ - png_set_rgb_to_gray_fixed(png_ptr, error_action, - png_fixed(png_ptr, red, "rgb to gray red coefficient"), - png_fixed(png_ptr, green, "rgb to gray green coefficient")); -} -#endif /* FLOATING POINT */ - -#endif /* RGB_TO_GRAY */ - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -void PNGAPI -png_set_read_user_transform_fn(png_structrp png_ptr, png_user_transform_ptr - read_user_transform_fn) -{ - png_debug(1, "in png_set_read_user_transform_fn"); - - if (!png_rtran_ok(png_ptr, 0)) - return; - -#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED - png_ptr->transformations |= PNG_USER_TRANSFORM; - png_ptr->read_user_transform_fn = read_user_transform_fn; -#endif -} -#endif - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED -#ifdef PNG_READ_GAMMA_SUPPORTED -/* In the case of gamma transformations only do transformations on images where - * the [file] gamma and screen_gamma are not close reciprocals, otherwise it - * slows things down slightly, and also needlessly introduces small errors. - */ -static int /* PRIVATE */ -png_gamma_threshold(png_fixed_point screen_gamma, png_fixed_point file_gamma) -{ - /* PNG_GAMMA_THRESHOLD is the threshold for performing gamma - * correction as a difference of the overall transform from 1.0 - * - * We want to compare the threshold with s*f - 1, if we get - * overflow here it is because of wacky gamma values so we - * turn on processing anyway. - */ - png_fixed_point gtest; - return !png_muldiv(>est, screen_gamma, file_gamma, PNG_FP_1) || - png_gamma_significant(gtest); -} -#endif - -/* Initialize everything needed for the read. This includes modifying - * the palette. - */ - -/*For the moment 'png_init_palette_transformations' and - * 'png_init_rgb_transformations' only do some flag canceling optimizations. - * The intent is that these two routines should have palette or rgb operations - * extracted from 'png_init_read_transformations'. - */ -static void /* PRIVATE */ -png_init_palette_transformations(png_structrp png_ptr) -{ - /* Called to handle the (input) palette case. In png_do_read_transformations - * the first step is to expand the palette if requested, so this code must - * take care to only make changes that are invariant with respect to the - * palette expansion, or only do them if there is no expansion. - * - * STRIP_ALPHA has already been handled in the caller (by setting num_trans - * to 0.) - */ - int input_has_alpha = 0; - int input_has_transparency = 0; - - if (png_ptr->num_trans > 0) - { - int i; - - /* Ignore if all the entries are opaque (unlikely!) */ - for (i=0; inum_trans; ++i) - if (png_ptr->trans_alpha[i] == 255) - continue; - else if (png_ptr->trans_alpha[i] == 0) - input_has_transparency = 1; - else - input_has_alpha = 1; - } - - /* If no alpha we can optimize. */ - if (!input_has_alpha) - { - /* Any alpha means background and associative alpha processing is - * required, however if the alpha is 0 or 1 throughout OPTIIMIZE_ALPHA - * and ENCODE_ALPHA are irrelevant. - */ - png_ptr->transformations &= ~PNG_ENCODE_ALPHA; - png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; - - if (!input_has_transparency) - png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND); - } - -#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED) - /* png_set_background handling - deals with the complexity of whether the - * background color is in the file format or the screen format in the case - * where an 'expand' will happen. - */ - - /* The following code cannot be entered in the alpha pre-multiplication case - * because PNG_BACKGROUND_EXPAND is cancelled below. - */ - if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - (png_ptr->transformations & PNG_EXPAND)) - { - { - png_ptr->background.red = - png_ptr->palette[png_ptr->background.index].red; - png_ptr->background.green = - png_ptr->palette[png_ptr->background.index].green; - png_ptr->background.blue = - png_ptr->palette[png_ptr->background.index].blue; - -#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_INVERT_ALPHA) - { - if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) - { - /* Invert the alpha channel (in tRNS) unless the pixels are - * going to be expanded, in which case leave it for later - */ - int i, istop = png_ptr->num_trans; - - for (i=0; itrans_alpha[i] = (png_byte)(255 - - png_ptr->trans_alpha[i]); - } - } -#endif /* PNG_READ_INVERT_ALPHA_SUPPORTED */ - } - } /* background expand and (therefore) no alpha association. */ -#endif /* PNG_READ_EXPAND_SUPPORTED && PNG_READ_BACKGROUND_SUPPORTED */ -} - -static void /* PRIVATE */ -png_init_rgb_transformations(png_structrp png_ptr) -{ - /* Added to libpng-1.5.4: check the color type to determine whether there - * is any alpha or transparency in the image and simply cancel the - * background and alpha mode stuff if there isn't. - */ - int input_has_alpha = (png_ptr->color_type & PNG_COLOR_MASK_ALPHA) != 0; - int input_has_transparency = png_ptr->num_trans > 0; - - /* If no alpha we can optimize. */ - if (!input_has_alpha) - { - /* Any alpha means background and associative alpha processing is - * required, however if the alpha is 0 or 1 throughout OPTIIMIZE_ALPHA - * and ENCODE_ALPHA are irrelevant. - */ -# ifdef PNG_READ_ALPHA_MODE_SUPPORTED - png_ptr->transformations &= ~PNG_ENCODE_ALPHA; - png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; -# endif - - if (!input_has_transparency) - png_ptr->transformations &= ~(PNG_COMPOSE | PNG_BACKGROUND_EXPAND); - } - -#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED) - /* png_set_background handling - deals with the complexity of whether the - * background color is in the file format or the screen format in the case - * where an 'expand' will happen. - */ - - /* The following code cannot be entered in the alpha pre-multiplication case - * because PNG_BACKGROUND_EXPAND is cancelled below. - */ - if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - (png_ptr->transformations & PNG_EXPAND) && - !(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) - /* i.e., GRAY or GRAY_ALPHA */ - { - { - /* Expand background and tRNS chunks */ - int gray = png_ptr->background.gray; - int trans_gray = png_ptr->trans_color.gray; - - switch (png_ptr->bit_depth) - { - case 1: - gray *= 0xff; - trans_gray *= 0xff; - break; - - case 2: - gray *= 0x55; - trans_gray *= 0x55; - break; - - case 4: - gray *= 0x11; - trans_gray *= 0x11; - break; - - default: - - case 8: - /* FALL THROUGH (Already 8 bits) */ - - case 16: - /* Already a full 16 bits */ - break; - } - - png_ptr->background.red = png_ptr->background.green = - png_ptr->background.blue = (png_uint_16)gray; - - if (!(png_ptr->transformations & PNG_EXPAND_tRNS)) - { - png_ptr->trans_color.red = png_ptr->trans_color.green = - png_ptr->trans_color.blue = (png_uint_16)trans_gray; - } - } - } /* background expand and (therefore) no alpha association. */ -#endif /* PNG_READ_EXPAND_SUPPORTED && PNG_READ_BACKGROUND_SUPPORTED */ -} - -void /* PRIVATE */ -png_init_read_transformations(png_structrp png_ptr) -{ - png_debug(1, "in png_init_read_transformations"); - - /* This internal function is called from png_read_start_row in pngrutil.c - * and it is called before the 'rowbytes' calculation is done, so the code - * in here can change or update the transformations flags. - * - * First do updates that do not depend on the details of the PNG image data - * being processed. - */ - -#ifdef PNG_READ_GAMMA_SUPPORTED - /* Prior to 1.5.4 these tests were performed from png_set_gamma, 1.5.4 adds - * png_set_alpha_mode and this is another source for a default file gamma so - * the test needs to be performed later - here. In addition prior to 1.5.4 - * the tests were repeated for the PALETTE color type here - this is no - * longer necessary (and doesn't seem to have been necessary before.) - */ - { - /* The following temporary indicates if overall gamma correction is - * required. - */ - int gamma_correction = 0; - - if (png_ptr->colorspace.gamma != 0) /* has been set */ - { - if (png_ptr->screen_gamma != 0) /* screen set too */ - gamma_correction = png_gamma_threshold(png_ptr->colorspace.gamma, - png_ptr->screen_gamma); - - else - /* Assume the output matches the input; a long time default behavior - * of libpng, although the standard has nothing to say about this. - */ - png_ptr->screen_gamma = png_reciprocal(png_ptr->colorspace.gamma); - } - - else if (png_ptr->screen_gamma != 0) - /* The converse - assume the file matches the screen, note that this - * perhaps undesireable default can (from 1.5.4) be changed by calling - * png_set_alpha_mode (even if the alpha handling mode isn't required - * or isn't changed from the default.) - */ - png_ptr->colorspace.gamma = png_reciprocal(png_ptr->screen_gamma); - - else /* neither are set */ - /* Just in case the following prevents any processing - file and screen - * are both assumed to be linear and there is no way to introduce a - * third gamma value other than png_set_background with 'UNIQUE', and, - * prior to 1.5.4 - */ - png_ptr->screen_gamma = png_ptr->colorspace.gamma = PNG_FP_1; - - /* We have a gamma value now. */ - png_ptr->colorspace.flags |= PNG_COLORSPACE_HAVE_GAMMA; - - /* Now turn the gamma transformation on or off as appropriate. Notice - * that PNG_GAMMA just refers to the file->screen correction. Alpha - * composition may independently cause gamma correction because it needs - * linear data (e.g. if the file has a gAMA chunk but the screen gamma - * hasn't been specified.) In any case this flag may get turned off in - * the code immediately below if the transform can be handled outside the - * row loop. - */ - if (gamma_correction) - png_ptr->transformations |= PNG_GAMMA; - - else - png_ptr->transformations &= ~PNG_GAMMA; - } -#endif - - /* Certain transformations have the effect of preventing other - * transformations that happen afterward in png_do_read_transformations, - * resolve the interdependencies here. From the code of - * png_do_read_transformations the order is: - * - * 1) PNG_EXPAND (including PNG_EXPAND_tRNS) - * 2) PNG_STRIP_ALPHA (if no compose) - * 3) PNG_RGB_TO_GRAY - * 4) PNG_GRAY_TO_RGB iff !PNG_BACKGROUND_IS_GRAY - * 5) PNG_COMPOSE - * 6) PNG_GAMMA - * 7) PNG_STRIP_ALPHA (if compose) - * 8) PNG_ENCODE_ALPHA - * 9) PNG_SCALE_16_TO_8 - * 10) PNG_16_TO_8 - * 11) PNG_QUANTIZE (converts to palette) - * 12) PNG_EXPAND_16 - * 13) PNG_GRAY_TO_RGB iff PNG_BACKGROUND_IS_GRAY - * 14) PNG_INVERT_MONO - * 15) PNG_SHIFT - * 16) PNG_PACK - * 17) PNG_BGR - * 18) PNG_PACKSWAP - * 19) PNG_FILLER (includes PNG_ADD_ALPHA) - * 20) PNG_INVERT_ALPHA - * 21) PNG_SWAP_ALPHA - * 22) PNG_SWAP_BYTES - * 23) PNG_USER_TRANSFORM [must be last] - */ -#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - if ((png_ptr->transformations & PNG_STRIP_ALPHA) && - !(png_ptr->transformations & PNG_COMPOSE)) - { - /* Stripping the alpha channel happens immediately after the 'expand' - * transformations, before all other transformation, so it cancels out - * the alpha handling. It has the side effect negating the effect of - * PNG_EXPAND_tRNS too: - */ - png_ptr->transformations &= ~(PNG_BACKGROUND_EXPAND | PNG_ENCODE_ALPHA | - PNG_EXPAND_tRNS); - png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; - - /* Kill the tRNS chunk itself too. Prior to 1.5.4 this did not happen - * so transparency information would remain just so long as it wasn't - * expanded. This produces unexpected API changes if the set of things - * that do PNG_EXPAND_tRNS changes (perfectly possible given the - * documentation - which says ask for what you want, accept what you - * get.) This makes the behavior consistent from 1.5.4: - */ - png_ptr->num_trans = 0; - } -#endif /* STRIP_ALPHA supported, no COMPOSE */ - -#ifdef PNG_READ_ALPHA_MODE_SUPPORTED - /* If the screen gamma is about 1.0 then the OPTIMIZE_ALPHA and ENCODE_ALPHA - * settings will have no effect. - */ - if (!png_gamma_significant(png_ptr->screen_gamma)) - { - png_ptr->transformations &= ~PNG_ENCODE_ALPHA; - png_ptr->flags &= ~PNG_FLAG_OPTIMIZE_ALPHA; - } -#endif - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED - /* Make sure the coefficients for the rgb to gray conversion are set - * appropriately. - */ - if (png_ptr->transformations & PNG_RGB_TO_GRAY) - png_colorspace_set_rgb_coefficients(png_ptr); -#endif - -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED -#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED) - /* Detect gray background and attempt to enable optimization for - * gray --> RGB case. - * - * Note: if PNG_BACKGROUND_EXPAND is set and color_type is either RGB or - * RGB_ALPHA (in which case need_expand is superfluous anyway), the - * background color might actually be gray yet not be flagged as such. - * This is not a problem for the current code, which uses - * PNG_BACKGROUND_IS_GRAY only to decide when to do the - * png_do_gray_to_rgb() transformation. - * - * TODO: this code needs to be revised to avoid the complexity and - * interdependencies. The color type of the background should be recorded in - * png_set_background, along with the bit depth, then the code has a record - * of exactly what color space the background is currently in. - */ - if (png_ptr->transformations & PNG_BACKGROUND_EXPAND) - { - /* PNG_BACKGROUND_EXPAND: the background is in the file color space, so if - * the file was grayscale the background value is gray. - */ - if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) - png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; - } - - else if (png_ptr->transformations & PNG_COMPOSE) - { - /* PNG_COMPOSE: png_set_background was called with need_expand false, - * so the color is in the color space of the output or png_set_alpha_mode - * was called and the color is black. Ignore RGB_TO_GRAY because that - * happens before GRAY_TO_RGB. - */ - if (png_ptr->transformations & PNG_GRAY_TO_RGB) - { - if (png_ptr->background.red == png_ptr->background.green && - png_ptr->background.red == png_ptr->background.blue) - { - png_ptr->mode |= PNG_BACKGROUND_IS_GRAY; - png_ptr->background.gray = png_ptr->background.red; - } - } - } -#endif /* PNG_READ_EXPAND_SUPPORTED && PNG_READ_BACKGROUND_SUPPORTED */ -#endif /* PNG_READ_GRAY_TO_RGB_SUPPORTED */ - - /* For indexed PNG data (PNG_COLOR_TYPE_PALETTE) many of the transformations - * can be performed directly on the palette, and some (such as rgb to gray) - * can be optimized inside the palette. This is particularly true of the - * composite (background and alpha) stuff, which can be pretty much all done - * in the palette even if the result is expanded to RGB or gray afterward. - * - * NOTE: this is Not Yet Implemented, the code behaves as in 1.5.1 and - * earlier and the palette stuff is actually handled on the first row. This - * leads to the reported bug that the palette returned by png_get_PLTE is not - * updated. - */ - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - png_init_palette_transformations(png_ptr); - - else - png_init_rgb_transformations(png_ptr); - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ - defined(PNG_READ_EXPAND_16_SUPPORTED) - if ((png_ptr->transformations & PNG_EXPAND_16) && - (png_ptr->transformations & PNG_COMPOSE) && - !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - png_ptr->bit_depth != 16) - { - /* TODO: fix this. Because the expand_16 operation is after the compose - * handling the background color must be 8, not 16, bits deep, but the - * application will supply a 16-bit value so reduce it here. - * - * The PNG_BACKGROUND_EXPAND code above does not expand to 16 bits at - * present, so that case is ok (until do_expand_16 is moved.) - * - * NOTE: this discards the low 16 bits of the user supplied background - * color, but until expand_16 works properly there is no choice! - */ -# define CHOP(x) (x)=((png_uint_16)PNG_DIV257(x)) - CHOP(png_ptr->background.red); - CHOP(png_ptr->background.green); - CHOP(png_ptr->background.blue); - CHOP(png_ptr->background.gray); -# undef CHOP - } -#endif /* PNG_READ_BACKGROUND_SUPPORTED && PNG_READ_EXPAND_16_SUPPORTED */ - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \ - (defined(PNG_READ_SCALE_16_TO_8_SUPPORTED) || \ - defined(PNG_READ_STRIP_16_TO_8_SUPPORTED)) - if ((png_ptr->transformations & (PNG_16_TO_8|PNG_SCALE_16_TO_8)) && - (png_ptr->transformations & PNG_COMPOSE) && - !(png_ptr->transformations & PNG_BACKGROUND_EXPAND) && - png_ptr->bit_depth == 16) - { - /* On the other hand, if a 16-bit file is to be reduced to 8-bits per - * component this will also happen after PNG_COMPOSE and so the background - * color must be pre-expanded here. - * - * TODO: fix this too. - */ - png_ptr->background.red = (png_uint_16)(png_ptr->background.red * 257); - png_ptr->background.green = - (png_uint_16)(png_ptr->background.green * 257); - png_ptr->background.blue = (png_uint_16)(png_ptr->background.blue * 257); - png_ptr->background.gray = (png_uint_16)(png_ptr->background.gray * 257); - } -#endif - - /* NOTE: below 'PNG_READ_ALPHA_MODE_SUPPORTED' is presumed to also enable the - * background support (see the comments in scripts/pnglibconf.dfa), this - * allows pre-multiplication of the alpha channel to be implemented as - * compositing on black. This is probably sub-optimal and has been done in - * 1.5.4 betas simply to enable external critique and testing (i.e. to - * implement the new API quickly, without lots of internal changes.) - */ - -#ifdef PNG_READ_GAMMA_SUPPORTED -# ifdef PNG_READ_BACKGROUND_SUPPORTED - /* Includes ALPHA_MODE */ - png_ptr->background_1 = png_ptr->background; -# endif - - /* This needs to change - in the palette image case a whole set of tables are - * built when it would be quicker to just calculate the correct value for - * each palette entry directly. Also, the test is too tricky - why check - * PNG_RGB_TO_GRAY if PNG_GAMMA is not set? The answer seems to be that - * PNG_GAMMA is cancelled even if the gamma is known? The test excludes the - * PNG_COMPOSE case, so apparently if there is no *overall* gamma correction - * the gamma tables will not be built even if composition is required on a - * gamma encoded value. - * - * In 1.5.4 this is addressed below by an additional check on the individual - * file gamma - if it is not 1.0 both RGB_TO_GRAY and COMPOSE need the - * tables. - */ - if ((png_ptr->transformations & PNG_GAMMA) - || ((png_ptr->transformations & PNG_RGB_TO_GRAY) - && (png_gamma_significant(png_ptr->colorspace.gamma) || - png_gamma_significant(png_ptr->screen_gamma))) - || ((png_ptr->transformations & PNG_COMPOSE) - && (png_gamma_significant(png_ptr->colorspace.gamma) - || png_gamma_significant(png_ptr->screen_gamma) -# ifdef PNG_READ_BACKGROUND_SUPPORTED - || (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_UNIQUE - && png_gamma_significant(png_ptr->background_gamma)) -# endif - )) || ((png_ptr->transformations & PNG_ENCODE_ALPHA) - && png_gamma_significant(png_ptr->screen_gamma)) - ) - { - png_build_gamma_table(png_ptr, png_ptr->bit_depth); - -#ifdef PNG_READ_BACKGROUND_SUPPORTED - if (png_ptr->transformations & PNG_COMPOSE) - { - /* Issue a warning about this combination: because RGB_TO_GRAY is - * optimized to do the gamma transform if present yet do_background has - * to do the same thing if both options are set a - * double-gamma-correction happens. This is true in all versions of - * libpng to date. - */ - if (png_ptr->transformations & PNG_RGB_TO_GRAY) - png_warning(png_ptr, - "libpng does not support gamma+background+rgb_to_gray"); - - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - /* We don't get to here unless there is a tRNS chunk with non-opaque - * entries - see the checking code at the start of this function. - */ - png_color back, back_1; - png_colorp palette = png_ptr->palette; - int num_palette = png_ptr->num_palette; - int i; - if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE) - { - - back.red = png_ptr->gamma_table[png_ptr->background.red]; - back.green = png_ptr->gamma_table[png_ptr->background.green]; - back.blue = png_ptr->gamma_table[png_ptr->background.blue]; - - back_1.red = png_ptr->gamma_to_1[png_ptr->background.red]; - back_1.green = png_ptr->gamma_to_1[png_ptr->background.green]; - back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue]; - } - else - { - png_fixed_point g, gs; - - switch (png_ptr->background_gamma_type) - { - case PNG_BACKGROUND_GAMMA_SCREEN: - g = (png_ptr->screen_gamma); - gs = PNG_FP_1; - break; - - case PNG_BACKGROUND_GAMMA_FILE: - g = png_reciprocal(png_ptr->colorspace.gamma); - gs = png_reciprocal2(png_ptr->colorspace.gamma, - png_ptr->screen_gamma); - break; - - case PNG_BACKGROUND_GAMMA_UNIQUE: - g = png_reciprocal(png_ptr->background_gamma); - gs = png_reciprocal2(png_ptr->background_gamma, - png_ptr->screen_gamma); - break; - default: - g = PNG_FP_1; /* back_1 */ - gs = PNG_FP_1; /* back */ - break; - } - - if (png_gamma_significant(gs)) - { - back.red = png_gamma_8bit_correct(png_ptr->background.red, - gs); - back.green = png_gamma_8bit_correct(png_ptr->background.green, - gs); - back.blue = png_gamma_8bit_correct(png_ptr->background.blue, - gs); - } - - else - { - back.red = (png_byte)png_ptr->background.red; - back.green = (png_byte)png_ptr->background.green; - back.blue = (png_byte)png_ptr->background.blue; - } - - if (png_gamma_significant(g)) - { - back_1.red = png_gamma_8bit_correct(png_ptr->background.red, - g); - back_1.green = png_gamma_8bit_correct( - png_ptr->background.green, g); - back_1.blue = png_gamma_8bit_correct(png_ptr->background.blue, - g); - } - - else - { - back_1.red = (png_byte)png_ptr->background.red; - back_1.green = (png_byte)png_ptr->background.green; - back_1.blue = (png_byte)png_ptr->background.blue; - } - } - - for (i = 0; i < num_palette; i++) - { - if (i < (int)png_ptr->num_trans && - png_ptr->trans_alpha[i] != 0xff) - { - if (png_ptr->trans_alpha[i] == 0) - { - palette[i] = back; - } - else /* if (png_ptr->trans_alpha[i] != 0xff) */ - { - png_byte v, w; - - v = png_ptr->gamma_to_1[palette[i].red]; - png_composite(w, v, png_ptr->trans_alpha[i], back_1.red); - palette[i].red = png_ptr->gamma_from_1[w]; - - v = png_ptr->gamma_to_1[palette[i].green]; - png_composite(w, v, png_ptr->trans_alpha[i], back_1.green); - palette[i].green = png_ptr->gamma_from_1[w]; - - v = png_ptr->gamma_to_1[palette[i].blue]; - png_composite(w, v, png_ptr->trans_alpha[i], back_1.blue); - palette[i].blue = png_ptr->gamma_from_1[w]; - } - } - else - { - palette[i].red = png_ptr->gamma_table[palette[i].red]; - palette[i].green = png_ptr->gamma_table[palette[i].green]; - palette[i].blue = png_ptr->gamma_table[palette[i].blue]; - } - } - - /* Prevent the transformations being done again. - * - * NOTE: this is highly dubious; it removes the transformations in - * place. This seems inconsistent with the general treatment of the - * transformations elsewhere. - */ - png_ptr->transformations &= ~(PNG_COMPOSE | PNG_GAMMA); - } /* color_type == PNG_COLOR_TYPE_PALETTE */ - - /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN) */ - else /* color_type != PNG_COLOR_TYPE_PALETTE */ - { - int gs_sig, g_sig; - png_fixed_point g = PNG_FP_1; /* Correction to linear */ - png_fixed_point gs = PNG_FP_1; /* Correction to screen */ - - switch (png_ptr->background_gamma_type) - { - case PNG_BACKGROUND_GAMMA_SCREEN: - g = png_ptr->screen_gamma; - /* gs = PNG_FP_1; */ - break; - - case PNG_BACKGROUND_GAMMA_FILE: - g = png_reciprocal(png_ptr->colorspace.gamma); - gs = png_reciprocal2(png_ptr->colorspace.gamma, - png_ptr->screen_gamma); - break; - - case PNG_BACKGROUND_GAMMA_UNIQUE: - g = png_reciprocal(png_ptr->background_gamma); - gs = png_reciprocal2(png_ptr->background_gamma, - png_ptr->screen_gamma); - break; - - default: - png_error(png_ptr, "invalid background gamma type"); - } - - g_sig = png_gamma_significant(g); - gs_sig = png_gamma_significant(gs); - - if (g_sig) - png_ptr->background_1.gray = png_gamma_correct(png_ptr, - png_ptr->background.gray, g); - - if (gs_sig) - png_ptr->background.gray = png_gamma_correct(png_ptr, - png_ptr->background.gray, gs); - - if ((png_ptr->background.red != png_ptr->background.green) || - (png_ptr->background.red != png_ptr->background.blue) || - (png_ptr->background.red != png_ptr->background.gray)) - { - /* RGB or RGBA with color background */ - if (g_sig) - { - png_ptr->background_1.red = png_gamma_correct(png_ptr, - png_ptr->background.red, g); - - png_ptr->background_1.green = png_gamma_correct(png_ptr, - png_ptr->background.green, g); - - png_ptr->background_1.blue = png_gamma_correct(png_ptr, - png_ptr->background.blue, g); - } - - if (gs_sig) - { - png_ptr->background.red = png_gamma_correct(png_ptr, - png_ptr->background.red, gs); - - png_ptr->background.green = png_gamma_correct(png_ptr, - png_ptr->background.green, gs); - - png_ptr->background.blue = png_gamma_correct(png_ptr, - png_ptr->background.blue, gs); - } - } - - else - { - /* GRAY, GRAY ALPHA, RGB, or RGBA with gray background */ - png_ptr->background_1.red = png_ptr->background_1.green - = png_ptr->background_1.blue = png_ptr->background_1.gray; - - png_ptr->background.red = png_ptr->background.green - = png_ptr->background.blue = png_ptr->background.gray; - } - - /* The background is now in screen gamma: */ - png_ptr->background_gamma_type = PNG_BACKGROUND_GAMMA_SCREEN; - } /* color_type != PNG_COLOR_TYPE_PALETTE */ - }/* png_ptr->transformations & PNG_BACKGROUND */ - - else - /* Transformation does not include PNG_BACKGROUND */ -#endif /* PNG_READ_BACKGROUND_SUPPORTED */ - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED - /* RGB_TO_GRAY needs to have non-gamma-corrected values! */ - && ((png_ptr->transformations & PNG_EXPAND) == 0 || - (png_ptr->transformations & PNG_RGB_TO_GRAY) == 0) -#endif - ) - { - png_colorp palette = png_ptr->palette; - int num_palette = png_ptr->num_palette; - int i; - - /* NOTE: there are other transformations that should probably be in - * here too. - */ - for (i = 0; i < num_palette; i++) - { - palette[i].red = png_ptr->gamma_table[palette[i].red]; - palette[i].green = png_ptr->gamma_table[palette[i].green]; - palette[i].blue = png_ptr->gamma_table[palette[i].blue]; - } - - /* Done the gamma correction. */ - png_ptr->transformations &= ~PNG_GAMMA; - } /* color_type == PALETTE && !PNG_BACKGROUND transformation */ - } -#ifdef PNG_READ_BACKGROUND_SUPPORTED - else -#endif -#endif /* PNG_READ_GAMMA_SUPPORTED */ - -#ifdef PNG_READ_BACKGROUND_SUPPORTED - /* No GAMMA transformation (see the hanging else 4 lines above) */ - if ((png_ptr->transformations & PNG_COMPOSE) && - (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) - { - int i; - int istop = (int)png_ptr->num_trans; - png_color back; - png_colorp palette = png_ptr->palette; - - back.red = (png_byte)png_ptr->background.red; - back.green = (png_byte)png_ptr->background.green; - back.blue = (png_byte)png_ptr->background.blue; - - for (i = 0; i < istop; i++) - { - if (png_ptr->trans_alpha[i] == 0) - { - palette[i] = back; - } - - else if (png_ptr->trans_alpha[i] != 0xff) - { - /* The png_composite() macro is defined in png.h */ - png_composite(palette[i].red, palette[i].red, - png_ptr->trans_alpha[i], back.red); - - png_composite(palette[i].green, palette[i].green, - png_ptr->trans_alpha[i], back.green); - - png_composite(palette[i].blue, palette[i].blue, - png_ptr->trans_alpha[i], back.blue); - } - } - - png_ptr->transformations &= ~PNG_COMPOSE; - } -#endif /* PNG_READ_BACKGROUND_SUPPORTED */ - -#ifdef PNG_READ_SHIFT_SUPPORTED - if ((png_ptr->transformations & PNG_SHIFT) && - !(png_ptr->transformations & PNG_EXPAND) && - (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)) - { - int i; - int istop = png_ptr->num_palette; - int shift = 8 - png_ptr->sig_bit.red; - - png_ptr->transformations &= ~PNG_SHIFT; - - /* significant bits can be in the range 1 to 7 for a meaninful result, if - * the number of significant bits is 0 then no shift is done (this is an - * error condition which is silently ignored.) - */ - if (shift > 0 && shift < 8) for (i=0; ipalette[i].red; - - component >>= shift; - png_ptr->palette[i].red = (png_byte)component; - } - - shift = 8 - png_ptr->sig_bit.green; - if (shift > 0 && shift < 8) for (i=0; ipalette[i].green; - - component >>= shift; - png_ptr->palette[i].green = (png_byte)component; - } - - shift = 8 - png_ptr->sig_bit.blue; - if (shift > 0 && shift < 8) for (i=0; ipalette[i].blue; - - component >>= shift; - png_ptr->palette[i].blue = (png_byte)component; - } - } -#endif /* PNG_READ_SHIFT_SUPPORTED */ -} - -/* Modify the info structure to reflect the transformations. The - * info should be updated so a PNG file could be written with it, - * assuming the transformations result in valid PNG data. - */ -void /* PRIVATE */ -png_read_transform_info(png_structrp png_ptr, png_inforp info_ptr) -{ - png_debug(1, "in png_read_transform_info"); - -#ifdef PNG_READ_EXPAND_SUPPORTED - if (png_ptr->transformations & PNG_EXPAND) - { - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - /* This check must match what actually happens in - * png_do_expand_palette; if it ever checks the tRNS chunk to see if - * it is all opaque we must do the same (at present it does not.) - */ - if (png_ptr->num_trans > 0) - info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; - - else - info_ptr->color_type = PNG_COLOR_TYPE_RGB; - - info_ptr->bit_depth = 8; - info_ptr->num_trans = 0; - } - else - { - if (png_ptr->num_trans) - { - if (png_ptr->transformations & PNG_EXPAND_tRNS) - info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; - } - if (info_ptr->bit_depth < 8) - info_ptr->bit_depth = 8; - - info_ptr->num_trans = 0; - } - } -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ - defined(PNG_READ_ALPHA_MODE_SUPPORTED) - /* The following is almost certainly wrong unless the background value is in - * the screen space! - */ - if (png_ptr->transformations & PNG_COMPOSE) - info_ptr->background = png_ptr->background; -#endif - -#ifdef PNG_READ_GAMMA_SUPPORTED - /* The following used to be conditional on PNG_GAMMA (prior to 1.5.4), - * however it seems that the code in png_init_read_transformations, which has - * been called before this from png_read_update_info->png_read_start_row - * sometimes does the gamma transform and cancels the flag. - * - * TODO: this looks wrong; the info_ptr should end up with a gamma equal to - * the screen_gamma value. The following probably results in weirdness if - * the info_ptr is used by the app after the rows have been read. - */ - info_ptr->colorspace.gamma = png_ptr->colorspace.gamma; -#endif - - if (info_ptr->bit_depth == 16) - { -# ifdef PNG_READ_16BIT_SUPPORTED -# ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED - if (png_ptr->transformations & PNG_SCALE_16_TO_8) - info_ptr->bit_depth = 8; -# endif - -# ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED - if (png_ptr->transformations & PNG_16_TO_8) - info_ptr->bit_depth = 8; -# endif - -# else - /* No 16 bit support: force chopping 16-bit input down to 8, in this case - * the app program can chose if both APIs are available by setting the - * correct scaling to use. - */ -# ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED - /* For compatibility with previous versions use the strip method by - * default. This code works because if PNG_SCALE_16_TO_8 is already - * set the code below will do that in preference to the chop. - */ - png_ptr->transformations |= PNG_16_TO_8; - info_ptr->bit_depth = 8; -# else - -# ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED - png_ptr->transformations |= PNG_SCALE_16_TO_8; - info_ptr->bit_depth = 8; -# else - - CONFIGURATION ERROR: you must enable at least one 16 to 8 method -# endif -# endif -#endif /* !READ_16BIT_SUPPORTED */ - } - -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED - if (png_ptr->transformations & PNG_GRAY_TO_RGB) - info_ptr->color_type = (png_byte)(info_ptr->color_type | - PNG_COLOR_MASK_COLOR); -#endif - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED - if (png_ptr->transformations & PNG_RGB_TO_GRAY) - info_ptr->color_type = (png_byte)(info_ptr->color_type & - ~PNG_COLOR_MASK_COLOR); -#endif - -#ifdef PNG_READ_QUANTIZE_SUPPORTED - if (png_ptr->transformations & PNG_QUANTIZE) - { - if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || - (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) && - png_ptr->palette_lookup && info_ptr->bit_depth == 8) - { - info_ptr->color_type = PNG_COLOR_TYPE_PALETTE; - } - } -#endif - -#ifdef PNG_READ_EXPAND_16_SUPPORTED - if (png_ptr->transformations & PNG_EXPAND_16 && info_ptr->bit_depth == 8 && - info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) - { - info_ptr->bit_depth = 16; - } -#endif - -#ifdef PNG_READ_PACK_SUPPORTED - if ((png_ptr->transformations & PNG_PACK) && (info_ptr->bit_depth < 8)) - info_ptr->bit_depth = 8; -#endif - - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - info_ptr->channels = 1; - - else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) - info_ptr->channels = 3; - - else - info_ptr->channels = 1; - -#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_STRIP_ALPHA) - { - info_ptr->color_type = (png_byte)(info_ptr->color_type & - ~PNG_COLOR_MASK_ALPHA); - info_ptr->num_trans = 0; - } -#endif - - if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) - info_ptr->channels++; - -#ifdef PNG_READ_FILLER_SUPPORTED - /* STRIP_ALPHA and FILLER allowed: MASK_ALPHA bit stripped above */ - if ((png_ptr->transformations & PNG_FILLER) && - ((info_ptr->color_type == PNG_COLOR_TYPE_RGB) || - (info_ptr->color_type == PNG_COLOR_TYPE_GRAY))) - { - info_ptr->channels++; - /* If adding a true alpha channel not just filler */ - if (png_ptr->transformations & PNG_ADD_ALPHA) - info_ptr->color_type |= PNG_COLOR_MASK_ALPHA; - } -#endif - -#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \ -defined(PNG_READ_USER_TRANSFORM_SUPPORTED) - if (png_ptr->transformations & PNG_USER_TRANSFORM) - { - if (info_ptr->bit_depth < png_ptr->user_transform_depth) - info_ptr->bit_depth = png_ptr->user_transform_depth; - - if (info_ptr->channels < png_ptr->user_transform_channels) - info_ptr->channels = png_ptr->user_transform_channels; - } -#endif - - info_ptr->pixel_depth = (png_byte)(info_ptr->channels * - info_ptr->bit_depth); - - info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, info_ptr->width); - - /* Adding in 1.5.4: cache the above value in png_struct so that we can later - * check in png_rowbytes that the user buffer won't get overwritten. Note - * that the field is not always set - if png_read_update_info isn't called - * the application has to either not do any transforms or get the calculation - * right itself. - */ - png_ptr->info_rowbytes = info_ptr->rowbytes; - -#ifndef PNG_READ_EXPAND_SUPPORTED - if (png_ptr) - return; -#endif -} - -/* Transform the row. The order of transformations is significant, - * and is very touchy. If you add a transformation, take care to - * decide how it fits in with the other transformations here. - */ -void /* PRIVATE */ -png_do_read_transformations(png_structrp png_ptr, png_row_infop row_info) -{ - png_debug(1, "in png_do_read_transformations"); - - if (png_ptr->row_buf == NULL) - { - /* Prior to 1.5.4 this output row/pass where the NULL pointer is, but this - * error is incredibly rare and incredibly easy to debug without this - * information. - */ - png_error(png_ptr, "NULL row buffer"); - } - - /* The following is debugging; prior to 1.5.4 the code was never compiled in; - * in 1.5.4 PNG_FLAG_DETECT_UNINITIALIZED was added and the macro - * PNG_WARN_UNINITIALIZED_ROW removed. In 1.6 the new flag is set only for - * all transformations, however in practice the ROW_INIT always gets done on - * demand, if necessary. - */ - if ((png_ptr->flags & PNG_FLAG_DETECT_UNINITIALIZED) != 0 && - !(png_ptr->flags & PNG_FLAG_ROW_INIT)) - { - /* Application has failed to call either png_read_start_image() or - * png_read_update_info() after setting transforms that expand pixels. - * This check added to libpng-1.2.19 (but not enabled until 1.5.4). - */ - png_error(png_ptr, "Uninitialized row"); - } - -#ifdef PNG_READ_EXPAND_SUPPORTED - if (png_ptr->transformations & PNG_EXPAND) - { - if (row_info->color_type == PNG_COLOR_TYPE_PALETTE) - { - png_do_expand_palette(row_info, png_ptr->row_buf + 1, - png_ptr->palette, png_ptr->trans_alpha, png_ptr->num_trans); - } - - else - { - if (png_ptr->num_trans && - (png_ptr->transformations & PNG_EXPAND_tRNS)) - png_do_expand(row_info, png_ptr->row_buf + 1, - &(png_ptr->trans_color)); - - else - png_do_expand(row_info, png_ptr->row_buf + 1, - NULL); - } - } -#endif - -#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - if ((png_ptr->transformations & PNG_STRIP_ALPHA) && - !(png_ptr->transformations & PNG_COMPOSE) && - (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA || - row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) - png_do_strip_channel(row_info, png_ptr->row_buf + 1, - 0 /* at_start == false, because SWAP_ALPHA happens later */); -#endif - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED - if (png_ptr->transformations & PNG_RGB_TO_GRAY) - { - int rgb_error = - png_do_rgb_to_gray(png_ptr, row_info, - png_ptr->row_buf + 1); - - if (rgb_error) - { - png_ptr->rgb_to_gray_status=1; - if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == - PNG_RGB_TO_GRAY_WARN) - png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel"); - - if ((png_ptr->transformations & PNG_RGB_TO_GRAY) == - PNG_RGB_TO_GRAY_ERR) - png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel"); - } - } -#endif - -/* From Andreas Dilger e-mail to png-implement, 26 March 1998: - * - * In most cases, the "simple transparency" should be done prior to doing - * gray-to-RGB, or you will have to test 3x as many bytes to check if a - * pixel is transparent. You would also need to make sure that the - * transparency information is upgraded to RGB. - * - * To summarize, the current flow is: - * - Gray + simple transparency -> compare 1 or 2 gray bytes and composite - * with background "in place" if transparent, - * convert to RGB if necessary - * - Gray + alpha -> composite with gray background and remove alpha bytes, - * convert to RGB if necessary - * - * To support RGB backgrounds for gray images we need: - * - Gray + simple transparency -> convert to RGB + simple transparency, - * compare 3 or 6 bytes and composite with - * background "in place" if transparent - * (3x compare/pixel compared to doing - * composite with gray bkgrnd) - * - Gray + alpha -> convert to RGB + alpha, composite with background and - * remove alpha bytes (3x float - * operations/pixel compared with composite - * on gray background) - * - * Greg's change will do this. The reason it wasn't done before is for - * performance, as this increases the per-pixel operations. If we would check - * in advance if the background was gray or RGB, and position the gray-to-RGB - * transform appropriately, then it would save a lot of work/time. - */ - -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED - /* If gray -> RGB, do so now only if background is non-gray; else do later - * for performance reasons - */ - if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && - !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) - png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1); -#endif - -#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ - defined(PNG_READ_ALPHA_MODE_SUPPORTED) - if (png_ptr->transformations & PNG_COMPOSE) - png_do_compose(row_info, png_ptr->row_buf + 1, png_ptr); -#endif - -#ifdef PNG_READ_GAMMA_SUPPORTED - if ((png_ptr->transformations & PNG_GAMMA) && -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED - /* Because RGB_TO_GRAY does the gamma transform. */ - !(png_ptr->transformations & PNG_RGB_TO_GRAY) && -#endif -#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ - defined(PNG_READ_ALPHA_MODE_SUPPORTED) - /* Because PNG_COMPOSE does the gamma transform if there is something to - * do (if there is an alpha channel or transparency.) - */ - !((png_ptr->transformations & PNG_COMPOSE) && - ((png_ptr->num_trans != 0) || - (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) && -#endif - /* Because png_init_read_transformations transforms the palette, unless - * RGB_TO_GRAY will do the transform. - */ - (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)) - png_do_gamma(row_info, png_ptr->row_buf + 1, png_ptr); -#endif - -#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED - if ((png_ptr->transformations & PNG_STRIP_ALPHA) && - (png_ptr->transformations & PNG_COMPOSE) && - (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA || - row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) - png_do_strip_channel(row_info, png_ptr->row_buf + 1, - 0 /* at_start == false, because SWAP_ALPHA happens later */); -#endif - -#ifdef PNG_READ_ALPHA_MODE_SUPPORTED - if ((png_ptr->transformations & PNG_ENCODE_ALPHA) && - (row_info->color_type & PNG_COLOR_MASK_ALPHA)) - png_do_encode_alpha(row_info, png_ptr->row_buf + 1, png_ptr); -#endif - -#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED - if (png_ptr->transformations & PNG_SCALE_16_TO_8) - png_do_scale_16_to_8(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED - /* There is no harm in doing both of these because only one has any effect, - * by putting the 'scale' option first if the app asks for scale (either by - * calling the API or in a TRANSFORM flag) this is what happens. - */ - if (png_ptr->transformations & PNG_16_TO_8) - png_do_chop(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_READ_QUANTIZE_SUPPORTED - if (png_ptr->transformations & PNG_QUANTIZE) - { - png_do_quantize(row_info, png_ptr->row_buf + 1, - png_ptr->palette_lookup, png_ptr->quantize_index); - - if (row_info->rowbytes == 0) - png_error(png_ptr, "png_do_quantize returned rowbytes=0"); - } -#endif /* PNG_READ_QUANTIZE_SUPPORTED */ - -#ifdef PNG_READ_EXPAND_16_SUPPORTED - /* Do the expansion now, after all the arithmetic has been done. Notice - * that previous transformations can handle the PNG_EXPAND_16 flag if this - * is efficient (particularly true in the case of gamma correction, where - * better accuracy results faster!) - */ - if (png_ptr->transformations & PNG_EXPAND_16) - png_do_expand_16(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED - /* NOTE: moved here in 1.5.4 (from much later in this list.) */ - if ((png_ptr->transformations & PNG_GRAY_TO_RGB) && - (png_ptr->mode & PNG_BACKGROUND_IS_GRAY)) - png_do_gray_to_rgb(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_READ_INVERT_SUPPORTED - if (png_ptr->transformations & PNG_INVERT_MONO) - png_do_invert(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_READ_SHIFT_SUPPORTED - if (png_ptr->transformations & PNG_SHIFT) - png_do_unshift(row_info, png_ptr->row_buf + 1, - &(png_ptr->shift)); -#endif - -#ifdef PNG_READ_PACK_SUPPORTED - if (png_ptr->transformations & PNG_PACK) - png_do_unpack(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED - /* Added at libpng-1.5.10 */ - if (row_info->color_type == PNG_COLOR_TYPE_PALETTE && - png_ptr->num_palette_max >= 0) - png_do_check_palette_indexes(png_ptr, row_info); -#endif - -#ifdef PNG_READ_BGR_SUPPORTED - if (png_ptr->transformations & PNG_BGR) - png_do_bgr(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_READ_PACKSWAP_SUPPORTED - if (png_ptr->transformations & PNG_PACKSWAP) - png_do_packswap(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_READ_FILLER_SUPPORTED - if (png_ptr->transformations & PNG_FILLER) - png_do_read_filler(row_info, png_ptr->row_buf + 1, - (png_uint_32)png_ptr->filler, png_ptr->flags); -#endif - -#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_INVERT_ALPHA) - png_do_read_invert_alpha(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_SWAP_ALPHA) - png_do_read_swap_alpha(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_READ_16BIT_SUPPORTED -#ifdef PNG_READ_SWAP_SUPPORTED - if (png_ptr->transformations & PNG_SWAP_BYTES) - png_do_swap(row_info, png_ptr->row_buf + 1); -#endif -#endif - -#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED - if (png_ptr->transformations & PNG_USER_TRANSFORM) - { - if (png_ptr->read_user_transform_fn != NULL) - (*(png_ptr->read_user_transform_fn)) /* User read transform function */ - (png_ptr, /* png_ptr */ - row_info, /* row_info: */ - /* png_uint_32 width; width of row */ - /* png_size_t rowbytes; number of bytes in row */ - /* png_byte color_type; color type of pixels */ - /* png_byte bit_depth; bit depth of samples */ - /* png_byte channels; number of channels (1-4) */ - /* png_byte pixel_depth; bits per pixel (depth*channels) */ - png_ptr->row_buf + 1); /* start of pixel data for row */ -#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED - if (png_ptr->user_transform_depth) - row_info->bit_depth = png_ptr->user_transform_depth; - - if (png_ptr->user_transform_channels) - row_info->channels = png_ptr->user_transform_channels; -#endif - row_info->pixel_depth = (png_byte)(row_info->bit_depth * - row_info->channels); - - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_info->width); - } -#endif -} - -#ifdef PNG_READ_PACK_SUPPORTED -/* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel, - * without changing the actual values. Thus, if you had a row with - * a bit depth of 1, you would end up with bytes that only contained - * the numbers 0 or 1. If you would rather they contain 0 and 255, use - * png_do_shift() after this. - */ -void /* PRIVATE */ -png_do_unpack(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_unpack"); - - if (row_info->bit_depth < 8) - { - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - switch (row_info->bit_depth) - { - case 1: - { - png_bytep sp = row + (png_size_t)((row_width - 1) >> 3); - png_bytep dp = row + (png_size_t)row_width - 1; - png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07); - for (i = 0; i < row_width; i++) - { - *dp = (png_byte)((*sp >> shift) & 0x01); - - if (shift == 7) - { - shift = 0; - sp--; - } - - else - shift++; - - dp--; - } - break; - } - - case 2: - { - - png_bytep sp = row + (png_size_t)((row_width - 1) >> 2); - png_bytep dp = row + (png_size_t)row_width - 1; - png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); - for (i = 0; i < row_width; i++) - { - *dp = (png_byte)((*sp >> shift) & 0x03); - - if (shift == 6) - { - shift = 0; - sp--; - } - - else - shift += 2; - - dp--; - } - break; - } - - case 4: - { - png_bytep sp = row + (png_size_t)((row_width - 1) >> 1); - png_bytep dp = row + (png_size_t)row_width - 1; - png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); - for (i = 0; i < row_width; i++) - { - *dp = (png_byte)((*sp >> shift) & 0x0f); - - if (shift == 4) - { - shift = 0; - sp--; - } - - else - shift = 4; - - dp--; - } - break; - } - - default: - break; - } - row_info->bit_depth = 8; - row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_width * row_info->channels; - } -} -#endif - -#ifdef PNG_READ_SHIFT_SUPPORTED -/* Reverse the effects of png_do_shift. This routine merely shifts the - * pixels back to their significant bits values. Thus, if you have - * a row of bit depth 8, but only 5 are significant, this will shift - * the values back to 0 through 31. - */ -void /* PRIVATE */ -png_do_unshift(png_row_infop row_info, png_bytep row, - png_const_color_8p sig_bits) -{ - int color_type; - - png_debug(1, "in png_do_unshift"); - - /* The palette case has already been handled in the _init routine. */ - color_type = row_info->color_type; - - if (color_type != PNG_COLOR_TYPE_PALETTE) - { - int shift[4]; - int channels = 0; - int bit_depth = row_info->bit_depth; - - if (color_type & PNG_COLOR_MASK_COLOR) - { - shift[channels++] = bit_depth - sig_bits->red; - shift[channels++] = bit_depth - sig_bits->green; - shift[channels++] = bit_depth - sig_bits->blue; - } - - else - { - shift[channels++] = bit_depth - sig_bits->gray; - } - - if (color_type & PNG_COLOR_MASK_ALPHA) - { - shift[channels++] = bit_depth - sig_bits->alpha; - } - - { - int c, have_shift; - - for (c = have_shift = 0; c < channels; ++c) - { - /* A shift of more than the bit depth is an error condition but it - * gets ignored here. - */ - if (shift[c] <= 0 || shift[c] >= bit_depth) - shift[c] = 0; - - else - have_shift = 1; - } - - if (!have_shift) - return; - } - - switch (bit_depth) - { - default: - /* Must be 1bpp gray: should not be here! */ - /* NOTREACHED */ - break; - - case 2: - /* Must be 2bpp gray */ - /* assert(channels == 1 && shift[0] == 1) */ - { - png_bytep bp = row; - png_bytep bp_end = bp + row_info->rowbytes; - - while (bp < bp_end) - { - int b = (*bp >> 1) & 0x55; - *bp++ = (png_byte)b; - } - break; - } - - case 4: - /* Must be 4bpp gray */ - /* assert(channels == 1) */ - { - png_bytep bp = row; - png_bytep bp_end = bp + row_info->rowbytes; - int gray_shift = shift[0]; - int mask = 0xf >> gray_shift; - - mask |= mask << 4; - - while (bp < bp_end) - { - int b = (*bp >> gray_shift) & mask; - *bp++ = (png_byte)b; - } - break; - } - - case 8: - /* Single byte components, G, GA, RGB, RGBA */ - { - png_bytep bp = row; - png_bytep bp_end = bp + row_info->rowbytes; - int channel = 0; - - while (bp < bp_end) - { - int b = *bp >> shift[channel]; - if (++channel >= channels) - channel = 0; - *bp++ = (png_byte)b; - } - break; - } - -#ifdef PNG_READ_16BIT_SUPPORTED - case 16: - /* Double byte components, G, GA, RGB, RGBA */ - { - png_bytep bp = row; - png_bytep bp_end = bp + row_info->rowbytes; - int channel = 0; - - while (bp < bp_end) - { - int value = (bp[0] << 8) + bp[1]; - - value >>= shift[channel]; - if (++channel >= channels) - channel = 0; - *bp++ = (png_byte)(value >> 8); - *bp++ = (png_byte)(value & 0xff); - } - break; - } -#endif - } - } -} -#endif - -#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED -/* Scale rows of bit depth 16 down to 8 accurately */ -void /* PRIVATE */ -png_do_scale_16_to_8(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_scale_16_to_8"); - - if (row_info->bit_depth == 16) - { - png_bytep sp = row; /* source */ - png_bytep dp = row; /* destination */ - png_bytep ep = sp + row_info->rowbytes; /* end+1 */ - - while (sp < ep) - { - /* The input is an array of 16 bit components, these must be scaled to - * 8 bits each. For a 16 bit value V the required value (from the PNG - * specification) is: - * - * (V * 255) / 65535 - * - * This reduces to round(V / 257), or floor((V + 128.5)/257) - * - * Represent V as the two byte value vhi.vlo. Make a guess that the - * result is the top byte of V, vhi, then the correction to this value - * is: - * - * error = floor(((V-vhi.vhi) + 128.5) / 257) - * = floor(((vlo-vhi) + 128.5) / 257) - * - * This can be approximated using integer arithmetic (and a signed - * shift): - * - * error = (vlo-vhi+128) >> 8; - * - * The approximate differs from the exact answer only when (vlo-vhi) is - * 128; it then gives a correction of +1 when the exact correction is - * 0. This gives 128 errors. The exact answer (correct for all 16 bit - * input values) is: - * - * error = (vlo-vhi+128)*65535 >> 24; - * - * An alternative arithmetic calculation which also gives no errors is: - * - * (V * 255 + 32895) >> 16 - */ - - png_int_32 tmp = *sp++; /* must be signed! */ - tmp += (((int)*sp++ - tmp + 128) * 65535) >> 24; - *dp++ = (png_byte)tmp; - } - - row_info->bit_depth = 8; - row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_info->width * row_info->channels; - } -} -#endif - -#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED -void /* PRIVATE */ -/* Simply discard the low byte. This was the default behavior prior - * to libpng-1.5.4. - */ -png_do_chop(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_chop"); - - if (row_info->bit_depth == 16) - { - png_bytep sp = row; /* source */ - png_bytep dp = row; /* destination */ - png_bytep ep = sp + row_info->rowbytes; /* end+1 */ - - while (sp < ep) - { - *dp++ = *sp; - sp += 2; /* skip low byte */ - } - - row_info->bit_depth = 8; - row_info->pixel_depth = (png_byte)(8 * row_info->channels); - row_info->rowbytes = row_info->width * row_info->channels; - } -} -#endif - -#ifdef PNG_READ_SWAP_ALPHA_SUPPORTED -void /* PRIVATE */ -png_do_read_swap_alpha(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_read_swap_alpha"); - - { - png_uint_32 row_width = row_info->width; - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - /* This converts from RGBA to ARGB */ - if (row_info->bit_depth == 8) - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_byte save; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - save = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = save; - } - } - -#ifdef PNG_READ_16BIT_SUPPORTED - /* This converts from RRGGBBAA to AARRGGBB */ - else - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_byte save[2]; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - save[0] = *(--sp); - save[1] = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = save[0]; - *(--dp) = save[1]; - } - } -#endif - } - - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - /* This converts from GA to AG */ - if (row_info->bit_depth == 8) - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_byte save; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - save = *(--sp); - *(--dp) = *(--sp); - *(--dp) = save; - } - } - -#ifdef PNG_READ_16BIT_SUPPORTED - /* This converts from GGAA to AAGG */ - else - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_byte save[2]; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - save[0] = *(--sp); - save[1] = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = save[0]; - *(--dp) = save[1]; - } - } -#endif - } - } -} -#endif - -#ifdef PNG_READ_INVERT_ALPHA_SUPPORTED -void /* PRIVATE */ -png_do_read_invert_alpha(png_row_infop row_info, png_bytep row) -{ - png_uint_32 row_width; - png_debug(1, "in png_do_read_invert_alpha"); - - row_width = row_info->width; - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - if (row_info->bit_depth == 8) - { - /* This inverts the alpha channel in RGBA */ - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - -/* This does nothing: - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - We can replace it with: -*/ - sp-=3; - dp=sp; - } - } - -#ifdef PNG_READ_16BIT_SUPPORTED - /* This inverts the alpha channel in RRGGBBAA */ - else - { - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - *(--dp) = (png_byte)(255 - *(--sp)); - -/* This does nothing: - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - We can replace it with: -*/ - sp-=6; - dp=sp; - } - } -#endif - } - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - if (row_info->bit_depth == 8) - { - /* This inverts the alpha channel in GA */ - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - *(--dp) = *(--sp); - } - } - -#ifdef PNG_READ_16BIT_SUPPORTED - else - { - /* This inverts the alpha channel in GGAA */ - png_bytep sp = row + row_info->rowbytes; - png_bytep dp = sp; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - *(--dp) = (png_byte)(255 - *(--sp)); - *(--dp) = (png_byte)(255 - *(--sp)); -/* - *(--dp) = *(--sp); - *(--dp) = *(--sp); -*/ - sp-=2; - dp=sp; - } - } -#endif - } -} -#endif - -#ifdef PNG_READ_FILLER_SUPPORTED -/* Add filler channel if we have RGB color */ -void /* PRIVATE */ -png_do_read_filler(png_row_infop row_info, png_bytep row, - png_uint_32 filler, png_uint_32 flags) -{ - png_uint_32 i; - png_uint_32 row_width = row_info->width; - -#ifdef PNG_READ_16BIT_SUPPORTED - png_byte hi_filler = (png_byte)((filler>>8) & 0xff); -#endif - png_byte lo_filler = (png_byte)(filler & 0xff); - - png_debug(1, "in png_do_read_filler"); - - if ( - row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - if (row_info->bit_depth == 8) - { - if (flags & PNG_FLAG_FILLER_AFTER) - { - /* This changes the data from G to GX */ - png_bytep sp = row + (png_size_t)row_width; - png_bytep dp = sp + (png_size_t)row_width; - for (i = 1; i < row_width; i++) - { - *(--dp) = lo_filler; - *(--dp) = *(--sp); - } - *(--dp) = lo_filler; - row_info->channels = 2; - row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; - } - - else - { - /* This changes the data from G to XG */ - png_bytep sp = row + (png_size_t)row_width; - png_bytep dp = sp + (png_size_t)row_width; - for (i = 0; i < row_width; i++) - { - *(--dp) = *(--sp); - *(--dp) = lo_filler; - } - row_info->channels = 2; - row_info->pixel_depth = 16; - row_info->rowbytes = row_width * 2; - } - } - -#ifdef PNG_READ_16BIT_SUPPORTED - else if (row_info->bit_depth == 16) - { - if (flags & PNG_FLAG_FILLER_AFTER) - { - /* This changes the data from GG to GGXX */ - png_bytep sp = row + (png_size_t)row_width * 2; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 1; i < row_width; i++) - { - *(--dp) = hi_filler; - *(--dp) = lo_filler; - *(--dp) = *(--sp); - *(--dp) = *(--sp); - } - *(--dp) = hi_filler; - *(--dp) = lo_filler; - row_info->channels = 2; - row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; - } - - else - { - /* This changes the data from GG to XXGG */ - png_bytep sp = row + (png_size_t)row_width * 2; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 0; i < row_width; i++) - { - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = hi_filler; - *(--dp) = lo_filler; - } - row_info->channels = 2; - row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; - } - } -#endif - } /* COLOR_TYPE == GRAY */ - else if (row_info->color_type == PNG_COLOR_TYPE_RGB) - { - if (row_info->bit_depth == 8) - { - if (flags & PNG_FLAG_FILLER_AFTER) - { - /* This changes the data from RGB to RGBX */ - png_bytep sp = row + (png_size_t)row_width * 3; - png_bytep dp = sp + (png_size_t)row_width; - for (i = 1; i < row_width; i++) - { - *(--dp) = lo_filler; - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - } - *(--dp) = lo_filler; - row_info->channels = 4; - row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; - } - - else - { - /* This changes the data from RGB to XRGB */ - png_bytep sp = row + (png_size_t)row_width * 3; - png_bytep dp = sp + (png_size_t)row_width; - for (i = 0; i < row_width; i++) - { - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = lo_filler; - } - row_info->channels = 4; - row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; - } - } - -#ifdef PNG_READ_16BIT_SUPPORTED - else if (row_info->bit_depth == 16) - { - if (flags & PNG_FLAG_FILLER_AFTER) - { - /* This changes the data from RRGGBB to RRGGBBXX */ - png_bytep sp = row + (png_size_t)row_width * 6; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 1; i < row_width; i++) - { - *(--dp) = hi_filler; - *(--dp) = lo_filler; - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - } - *(--dp) = hi_filler; - *(--dp) = lo_filler; - row_info->channels = 4; - row_info->pixel_depth = 64; - row_info->rowbytes = row_width * 8; - } - - else - { - /* This changes the data from RRGGBB to XXRRGGBB */ - png_bytep sp = row + (png_size_t)row_width * 6; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 0; i < row_width; i++) - { - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = *(--sp); - *(--dp) = hi_filler; - *(--dp) = lo_filler; - } - - row_info->channels = 4; - row_info->pixel_depth = 64; - row_info->rowbytes = row_width * 8; - } - } -#endif - } /* COLOR_TYPE == RGB */ -} -#endif - -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED -/* Expand grayscale files to RGB, with or without alpha */ -void /* PRIVATE */ -png_do_gray_to_rgb(png_row_infop row_info, png_bytep row) -{ - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - png_debug(1, "in png_do_gray_to_rgb"); - - if (row_info->bit_depth >= 8 && - !(row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - if (row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - if (row_info->bit_depth == 8) - { - /* This changes G to RGB */ - png_bytep sp = row + (png_size_t)row_width - 1; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 0; i < row_width; i++) - { - *(dp--) = *sp; - *(dp--) = *sp; - *(dp--) = *(sp--); - } - } - - else - { - /* This changes GG to RRGGBB */ - png_bytep sp = row + (png_size_t)row_width * 2 - 1; - png_bytep dp = sp + (png_size_t)row_width * 4; - for (i = 0; i < row_width; i++) - { - *(dp--) = *sp; - *(dp--) = *(sp - 1); - *(dp--) = *sp; - *(dp--) = *(sp - 1); - *(dp--) = *(sp--); - *(dp--) = *(sp--); - } - } - } - - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - if (row_info->bit_depth == 8) - { - /* This changes GA to RGBA */ - png_bytep sp = row + (png_size_t)row_width * 2 - 1; - png_bytep dp = sp + (png_size_t)row_width * 2; - for (i = 0; i < row_width; i++) - { - *(dp--) = *(sp--); - *(dp--) = *sp; - *(dp--) = *sp; - *(dp--) = *(sp--); - } - } - - else - { - /* This changes GGAA to RRGGBBAA */ - png_bytep sp = row + (png_size_t)row_width * 4 - 1; - png_bytep dp = sp + (png_size_t)row_width * 4; - for (i = 0; i < row_width; i++) - { - *(dp--) = *(sp--); - *(dp--) = *(sp--); - *(dp--) = *sp; - *(dp--) = *(sp - 1); - *(dp--) = *sp; - *(dp--) = *(sp - 1); - *(dp--) = *(sp--); - *(dp--) = *(sp--); - } - } - } - row_info->channels = (png_byte)(row_info->channels + 2); - row_info->color_type |= PNG_COLOR_MASK_COLOR; - row_info->pixel_depth = (png_byte)(row_info->channels * - row_info->bit_depth); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); - } -} -#endif - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED -/* Reduce RGB files to grayscale, with or without alpha - * using the equation given in Poynton's ColorFAQ of 1998-01-04 at - * (THIS LINK IS DEAD June 2008 but - * versions dated 1998 through November 2002 have been archived at - * http://web.archive.org/web/20000816232553/http://www.inforamp.net/ - * ~poynton/notes/colour_and_gamma/ColorFAQ.txt ) - * Charles Poynton poynton at poynton.com - * - * Y = 0.212671 * R + 0.715160 * G + 0.072169 * B - * - * which can be expressed with integers as - * - * Y = (6969 * R + 23434 * G + 2365 * B)/32768 - * - * Poynton's current link (as of January 2003 through July 2011): - * - * has changed the numbers slightly: - * - * Y = 0.2126*R + 0.7152*G + 0.0722*B - * - * which can be expressed with integers as - * - * Y = (6966 * R + 23436 * G + 2366 * B)/32768 - * - * Historically, however, libpng uses numbers derived from the ITU-R Rec 709 - * end point chromaticities and the D65 white point. Depending on the - * precision used for the D65 white point this produces a variety of different - * numbers, however if the four decimal place value used in ITU-R Rec 709 is - * used (0.3127,0.3290) the Y calculation would be: - * - * Y = (6968 * R + 23435 * G + 2366 * B)/32768 - * - * While this is correct the rounding results in an overflow for white, because - * the sum of the rounded coefficients is 32769, not 32768. Consequently - * libpng uses, instead, the closest non-overflowing approximation: - * - * Y = (6968 * R + 23434 * G + 2366 * B)/32768 - * - * Starting with libpng-1.5.5, if the image being converted has a cHRM chunk - * (including an sRGB chunk) then the chromaticities are used to calculate the - * coefficients. See the chunk handling in pngrutil.c for more information. - * - * In all cases the calculation is to be done in a linear colorspace. If no - * gamma information is available to correct the encoding of the original RGB - * values this results in an implicit assumption that the original PNG RGB - * values were linear. - * - * Other integer coefficents can be used via png_set_rgb_to_gray(). Because - * the API takes just red and green coefficients the blue coefficient is - * calculated to make the sum 32768. This will result in different rounding - * to that used above. - */ -int /* PRIVATE */ -png_do_rgb_to_gray(png_structrp png_ptr, png_row_infop row_info, png_bytep row) - -{ - int rgb_error = 0; - - png_debug(1, "in png_do_rgb_to_gray"); - - if (!(row_info->color_type & PNG_COLOR_MASK_PALETTE) && - (row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - PNG_CONST png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff; - PNG_CONST png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff; - PNG_CONST png_uint_32 bc = 32768 - rc - gc; - PNG_CONST png_uint_32 row_width = row_info->width; - PNG_CONST int have_alpha = - (row_info->color_type & PNG_COLOR_MASK_ALPHA) != 0; - - if (row_info->bit_depth == 8) - { -#ifdef PNG_READ_GAMMA_SUPPORTED - /* Notice that gamma to/from 1 are not necessarily inverses (if - * there is an overall gamma correction). Prior to 1.5.5 this code - * checked the linearized values for equality; this doesn't match - * the documentation, the original values must be checked. - */ - if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL) - { - png_bytep sp = row; - png_bytep dp = row; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - png_byte red = *(sp++); - png_byte green = *(sp++); - png_byte blue = *(sp++); - - if (red != green || red != blue) - { - red = png_ptr->gamma_to_1[red]; - green = png_ptr->gamma_to_1[green]; - blue = png_ptr->gamma_to_1[blue]; - - rgb_error |= 1; - *(dp++) = png_ptr->gamma_from_1[ - (rc*red + gc*green + bc*blue + 16384)>>15]; - } - - else - { - /* If there is no overall correction the table will not be - * set. - */ - if (png_ptr->gamma_table != NULL) - red = png_ptr->gamma_table[red]; - - *(dp++) = red; - } - - if (have_alpha) - *(dp++) = *(sp++); - } - } - else -#endif - { - png_bytep sp = row; - png_bytep dp = row; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - png_byte red = *(sp++); - png_byte green = *(sp++); - png_byte blue = *(sp++); - - if (red != green || red != blue) - { - rgb_error |= 1; - /* NOTE: this is the historical approach which simply - * truncates the results. - */ - *(dp++) = (png_byte)((rc*red + gc*green + bc*blue)>>15); - } - - else - *(dp++) = red; - - if (have_alpha) - *(dp++) = *(sp++); - } - } - } - - else /* RGB bit_depth == 16 */ - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (png_ptr->gamma_16_to_1 != NULL && png_ptr->gamma_16_from_1 != NULL) - { - png_bytep sp = row; - png_bytep dp = row; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - png_uint_16 red, green, blue, w; - - red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; - green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; - blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; - - if (red == green && red == blue) - { - if (png_ptr->gamma_16_table != NULL) - w = png_ptr->gamma_16_table[(red&0xff) - >> png_ptr->gamma_shift][red>>8]; - - else - w = red; - } - - else - { - png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) - >> png_ptr->gamma_shift][red>>8]; - png_uint_16 green_1 = - png_ptr->gamma_16_to_1[(green&0xff) >> - png_ptr->gamma_shift][green>>8]; - png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) - >> png_ptr->gamma_shift][blue>>8]; - png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1 - + bc*blue_1 + 16384)>>15); - w = png_ptr->gamma_16_from_1[(gray16&0xff) >> - png_ptr->gamma_shift][gray16 >> 8]; - rgb_error |= 1; - } - - *(dp++) = (png_byte)((w>>8) & 0xff); - *(dp++) = (png_byte)(w & 0xff); - - if (have_alpha) - { - *(dp++) = *(sp++); - *(dp++) = *(sp++); - } - } - } - else -#endif - { - png_bytep sp = row; - png_bytep dp = row; - png_uint_32 i; - - for (i = 0; i < row_width; i++) - { - png_uint_16 red, green, blue, gray16; - - red = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; - green = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; - blue = (png_uint_16)(((*(sp))<<8) | *(sp + 1)); sp += 2; - - if (red != green || red != blue) - rgb_error |= 1; - - /* From 1.5.5 in the 16 bit case do the accurate conversion even - * in the 'fast' case - this is because this is where the code - * ends up when handling linear 16 bit data. - */ - gray16 = (png_uint_16)((rc*red + gc*green + bc*blue + 16384) >> - 15); - *(dp++) = (png_byte)((gray16>>8) & 0xff); - *(dp++) = (png_byte)(gray16 & 0xff); - - if (have_alpha) - { - *(dp++) = *(sp++); - *(dp++) = *(sp++); - } - } - } - } - - row_info->channels = (png_byte)(row_info->channels - 2); - row_info->color_type = (png_byte)(row_info->color_type & - ~PNG_COLOR_MASK_COLOR); - row_info->pixel_depth = (png_byte)(row_info->channels * - row_info->bit_depth); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); - } - return rgb_error; -} -#endif -#endif /* PNG_READ_TRANSFORMS_SUPPORTED */ - -#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED -/* Build a grayscale palette. Palette is assumed to be 1 << bit_depth - * large of png_color. This lets grayscale images be treated as - * paletted. Most useful for gamma correction and simplification - * of code. This API is not used internally. - */ -void PNGAPI -png_build_grayscale_palette(int bit_depth, png_colorp palette) -{ - int num_palette; - int color_inc; - int i; - int v; - - png_debug(1, "in png_do_build_grayscale_palette"); - - if (palette == NULL) - return; - - switch (bit_depth) - { - case 1: - num_palette = 2; - color_inc = 0xff; - break; - - case 2: - num_palette = 4; - color_inc = 0x55; - break; - - case 4: - num_palette = 16; - color_inc = 0x11; - break; - - case 8: - num_palette = 256; - color_inc = 1; - break; - - default: - num_palette = 0; - color_inc = 0; - break; - } - - for (i = 0, v = 0; i < num_palette; i++, v += color_inc) - { - palette[i].red = (png_byte)v; - palette[i].green = (png_byte)v; - palette[i].blue = (png_byte)v; - } -} -#endif - - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED -#if defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ - defined(PNG_READ_ALPHA_MODE_SUPPORTED) -/* Replace any alpha or transparency with the supplied background color. - * "background" is already in the screen gamma, while "background_1" is - * at a gamma of 1.0. Paletted files have already been taken care of. - */ -void /* PRIVATE */ -png_do_compose(png_row_infop row_info, png_bytep row, png_structrp png_ptr) -{ -#ifdef PNG_READ_GAMMA_SUPPORTED - png_const_bytep gamma_table = png_ptr->gamma_table; - png_const_bytep gamma_from_1 = png_ptr->gamma_from_1; - png_const_bytep gamma_to_1 = png_ptr->gamma_to_1; - png_const_uint_16pp gamma_16 = png_ptr->gamma_16_table; - png_const_uint_16pp gamma_16_from_1 = png_ptr->gamma_16_from_1; - png_const_uint_16pp gamma_16_to_1 = png_ptr->gamma_16_to_1; - int gamma_shift = png_ptr->gamma_shift; - int optimize = (png_ptr->flags & PNG_FLAG_OPTIMIZE_ALPHA) != 0; -#endif - - png_bytep sp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - int shift; - - png_debug(1, "in png_do_compose"); - - { - switch (row_info->color_type) - { - case PNG_COLOR_TYPE_GRAY: - { - switch (row_info->bit_depth) - { - case 1: - { - sp = row; - shift = 7; - for (i = 0; i < row_width; i++) - { - if ((png_uint_16)((*sp >> shift) & 0x01) - == png_ptr->trans_color.gray) - { - unsigned int tmp = *sp & (0x7f7f >> (7 - shift)); - tmp |= png_ptr->background.gray << shift; - *sp = (png_byte)(tmp & 0xff); - } - - if (!shift) - { - shift = 7; - sp++; - } - - else - shift--; - } - break; - } - - case 2: - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (gamma_table != NULL) - { - sp = row; - shift = 6; - for (i = 0; i < row_width; i++) - { - if ((png_uint_16)((*sp >> shift) & 0x03) - == png_ptr->trans_color.gray) - { - unsigned int tmp = *sp & (0x3f3f >> (6 - shift)); - tmp |= png_ptr->background.gray << shift; - *sp = (png_byte)(tmp & 0xff); - } - - else - { - unsigned int p = (*sp >> shift) & 0x03; - unsigned int g = (gamma_table [p | (p << 2) | - (p << 4) | (p << 6)] >> 6) & 0x03; - unsigned int tmp = *sp & (0x3f3f >> (6 - shift)); - tmp |= g << shift; - *sp = (png_byte)(tmp & 0xff); - } - - if (!shift) - { - shift = 6; - sp++; - } - - else - shift -= 2; - } - } - - else -#endif - { - sp = row; - shift = 6; - for (i = 0; i < row_width; i++) - { - if ((png_uint_16)((*sp >> shift) & 0x03) - == png_ptr->trans_color.gray) - { - unsigned int tmp = *sp & (0x3f3f >> (6 - shift)); - tmp |= png_ptr->background.gray << shift; - *sp = (png_byte)(tmp & 0xff); - } - - if (!shift) - { - shift = 6; - sp++; - } - - else - shift -= 2; - } - } - break; - } - - case 4: - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (gamma_table != NULL) - { - sp = row; - shift = 4; - for (i = 0; i < row_width; i++) - { - if ((png_uint_16)((*sp >> shift) & 0x0f) - == png_ptr->trans_color.gray) - { - unsigned int tmp = *sp & (0xf0f >> (4 - shift)); - tmp |= png_ptr->background.gray << shift; - *sp = (png_byte)(tmp & 0xff); - } - - else - { - unsigned int p = (*sp >> shift) & 0x0f; - unsigned int g = (gamma_table[p | (p << 4)] >> 4) & - 0x0f; - unsigned int tmp = *sp & (0xf0f >> (4 - shift)); - tmp |= g << shift; - *sp = (png_byte)(tmp & 0xff); - } - - if (!shift) - { - shift = 4; - sp++; - } - - else - shift -= 4; - } - } - - else -#endif - { - sp = row; - shift = 4; - for (i = 0; i < row_width; i++) - { - if ((png_uint_16)((*sp >> shift) & 0x0f) - == png_ptr->trans_color.gray) - { - unsigned int tmp = *sp & (0xf0f >> (4 - shift)); - tmp |= png_ptr->background.gray << shift; - *sp = (png_byte)(tmp & 0xff); - } - - if (!shift) - { - shift = 4; - sp++; - } - - else - shift -= 4; - } - } - break; - } - - case 8: - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (gamma_table != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp++) - { - if (*sp == png_ptr->trans_color.gray) - *sp = (png_byte)png_ptr->background.gray; - - else - *sp = gamma_table[*sp]; - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp++) - { - if (*sp == png_ptr->trans_color.gray) - *sp = (png_byte)png_ptr->background.gray; - } - } - break; - } - - case 16: - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (gamma_16 != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 2) - { - png_uint_16 v; - - v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - - if (v == png_ptr->trans_color.gray) - { - /* Background is already in screen gamma */ - *sp = (png_byte)((png_ptr->background.gray >> 8) - & 0xff); - *(sp + 1) = (png_byte)(png_ptr->background.gray - & 0xff); - } - - else - { - v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - } - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp += 2) - { - png_uint_16 v; - - v = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - - if (v == png_ptr->trans_color.gray) - { - *sp = (png_byte)((png_ptr->background.gray >> 8) - & 0xff); - *(sp + 1) = (png_byte)(png_ptr->background.gray - & 0xff); - } - } - } - break; - } - - default: - break; - } - break; - } - - case PNG_COLOR_TYPE_RGB: - { - if (row_info->bit_depth == 8) - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (gamma_table != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 3) - { - if (*sp == png_ptr->trans_color.red && - *(sp + 1) == png_ptr->trans_color.green && - *(sp + 2) == png_ptr->trans_color.blue) - { - *sp = (png_byte)png_ptr->background.red; - *(sp + 1) = (png_byte)png_ptr->background.green; - *(sp + 2) = (png_byte)png_ptr->background.blue; - } - - else - { - *sp = gamma_table[*sp]; - *(sp + 1) = gamma_table[*(sp + 1)]; - *(sp + 2) = gamma_table[*(sp + 2)]; - } - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp += 3) - { - if (*sp == png_ptr->trans_color.red && - *(sp + 1) == png_ptr->trans_color.green && - *(sp + 2) == png_ptr->trans_color.blue) - { - *sp = (png_byte)png_ptr->background.red; - *(sp + 1) = (png_byte)png_ptr->background.green; - *(sp + 2) = (png_byte)png_ptr->background.blue; - } - } - } - } - else /* if (row_info->bit_depth == 16) */ - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (gamma_16 != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 6) - { - png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - - png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) - + *(sp + 3)); - - png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) - + *(sp + 5)); - - if (r == png_ptr->trans_color.red && - g == png_ptr->trans_color.green && - b == png_ptr->trans_color.blue) - { - /* Background is already in screen gamma */ - *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); - *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); - *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) - & 0xff); - *(sp + 3) = (png_byte)(png_ptr->background.green - & 0xff); - *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) - & 0xff); - *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); - } - - else - { - png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - - v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; - *(sp + 2) = (png_byte)((v >> 8) & 0xff); - *(sp + 3) = (png_byte)(v & 0xff); - - v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; - *(sp + 4) = (png_byte)((v >> 8) & 0xff); - *(sp + 5) = (png_byte)(v & 0xff); - } - } - } - - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp += 6) - { - png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - - png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) - + *(sp + 3)); - - png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) - + *(sp + 5)); - - if (r == png_ptr->trans_color.red && - g == png_ptr->trans_color.green && - b == png_ptr->trans_color.blue) - { - *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); - *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); - *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) - & 0xff); - *(sp + 3) = (png_byte)(png_ptr->background.green - & 0xff); - *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) - & 0xff); - *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); - } - } - } - } - break; - } - - case PNG_COLOR_TYPE_GRAY_ALPHA: - { - if (row_info->bit_depth == 8) - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (gamma_to_1 != NULL && gamma_from_1 != NULL && - gamma_table != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 2) - { - png_uint_16 a = *(sp + 1); - - if (a == 0xff) - *sp = gamma_table[*sp]; - - else if (a == 0) - { - /* Background is already in screen gamma */ - *sp = (png_byte)png_ptr->background.gray; - } - - else - { - png_byte v, w; - - v = gamma_to_1[*sp]; - png_composite(w, v, a, png_ptr->background_1.gray); - if (!optimize) - w = gamma_from_1[w]; - *sp = w; - } - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp += 2) - { - png_byte a = *(sp + 1); - - if (a == 0) - *sp = (png_byte)png_ptr->background.gray; - - else if (a < 0xff) - png_composite(*sp, *sp, a, png_ptr->background.gray); - } - } - } - else /* if (png_ptr->bit_depth == 16) */ - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (gamma_16 != NULL && gamma_16_from_1 != NULL && - gamma_16_to_1 != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 4) - { - png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8) - + *(sp + 3)); - - if (a == (png_uint_16)0xffff) - { - png_uint_16 v; - - v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - } - - else if (a == 0) - { - /* Background is already in screen gamma */ - *sp = (png_byte)((png_ptr->background.gray >> 8) - & 0xff); - *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff); - } - - else - { - png_uint_16 g, v, w; - - g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; - png_composite_16(v, g, a, png_ptr->background_1.gray); - if (optimize) - w = v; - else - w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8]; - *sp = (png_byte)((w >> 8) & 0xff); - *(sp + 1) = (png_byte)(w & 0xff); - } - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp += 4) - { - png_uint_16 a = (png_uint_16)(((*(sp + 2)) << 8) - + *(sp + 3)); - - if (a == 0) - { - *sp = (png_byte)((png_ptr->background.gray >> 8) - & 0xff); - *(sp + 1) = (png_byte)(png_ptr->background.gray & 0xff); - } - - else if (a < 0xffff) - { - png_uint_16 g, v; - - g = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - png_composite_16(v, g, a, png_ptr->background.gray); - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - } - } - } - } - break; - } - - case PNG_COLOR_TYPE_RGB_ALPHA: - { - if (row_info->bit_depth == 8) - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (gamma_to_1 != NULL && gamma_from_1 != NULL && - gamma_table != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 4) - { - png_byte a = *(sp + 3); - - if (a == 0xff) - { - *sp = gamma_table[*sp]; - *(sp + 1) = gamma_table[*(sp + 1)]; - *(sp + 2) = gamma_table[*(sp + 2)]; - } - - else if (a == 0) - { - /* Background is already in screen gamma */ - *sp = (png_byte)png_ptr->background.red; - *(sp + 1) = (png_byte)png_ptr->background.green; - *(sp + 2) = (png_byte)png_ptr->background.blue; - } - - else - { - png_byte v, w; - - v = gamma_to_1[*sp]; - png_composite(w, v, a, png_ptr->background_1.red); - if (!optimize) w = gamma_from_1[w]; - *sp = w; - - v = gamma_to_1[*(sp + 1)]; - png_composite(w, v, a, png_ptr->background_1.green); - if (!optimize) w = gamma_from_1[w]; - *(sp + 1) = w; - - v = gamma_to_1[*(sp + 2)]; - png_composite(w, v, a, png_ptr->background_1.blue); - if (!optimize) w = gamma_from_1[w]; - *(sp + 2) = w; - } - } - } - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp += 4) - { - png_byte a = *(sp + 3); - - if (a == 0) - { - *sp = (png_byte)png_ptr->background.red; - *(sp + 1) = (png_byte)png_ptr->background.green; - *(sp + 2) = (png_byte)png_ptr->background.blue; - } - - else if (a < 0xff) - { - png_composite(*sp, *sp, a, png_ptr->background.red); - - png_composite(*(sp + 1), *(sp + 1), a, - png_ptr->background.green); - - png_composite(*(sp + 2), *(sp + 2), a, - png_ptr->background.blue); - } - } - } - } - else /* if (row_info->bit_depth == 16) */ - { -#ifdef PNG_READ_GAMMA_SUPPORTED - if (gamma_16 != NULL && gamma_16_from_1 != NULL && - gamma_16_to_1 != NULL) - { - sp = row; - for (i = 0; i < row_width; i++, sp += 8) - { - png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) - << 8) + (png_uint_16)(*(sp + 7))); - - if (a == (png_uint_16)0xffff) - { - png_uint_16 v; - - v = gamma_16[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - - v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)]; - *(sp + 2) = (png_byte)((v >> 8) & 0xff); - *(sp + 3) = (png_byte)(v & 0xff); - - v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)]; - *(sp + 4) = (png_byte)((v >> 8) & 0xff); - *(sp + 5) = (png_byte)(v & 0xff); - } - - else if (a == 0) - { - /* Background is already in screen gamma */ - *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); - *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); - *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) - & 0xff); - *(sp + 3) = (png_byte)(png_ptr->background.green - & 0xff); - *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) - & 0xff); - *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); - } - - else - { - png_uint_16 v, w; - - v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp]; - png_composite_16(w, v, a, png_ptr->background_1.red); - if (!optimize) - w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> - 8]; - *sp = (png_byte)((w >> 8) & 0xff); - *(sp + 1) = (png_byte)(w & 0xff); - - v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)]; - png_composite_16(w, v, a, png_ptr->background_1.green); - if (!optimize) - w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> - 8]; - - *(sp + 2) = (png_byte)((w >> 8) & 0xff); - *(sp + 3) = (png_byte)(w & 0xff); - - v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)]; - png_composite_16(w, v, a, png_ptr->background_1.blue); - if (!optimize) - w = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> - 8]; - - *(sp + 4) = (png_byte)((w >> 8) & 0xff); - *(sp + 5) = (png_byte)(w & 0xff); - } - } - } - - else -#endif - { - sp = row; - for (i = 0; i < row_width; i++, sp += 8) - { - png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6)) - << 8) + (png_uint_16)(*(sp + 7))); - - if (a == 0) - { - *sp = (png_byte)((png_ptr->background.red >> 8) & 0xff); - *(sp + 1) = (png_byte)(png_ptr->background.red & 0xff); - *(sp + 2) = (png_byte)((png_ptr->background.green >> 8) - & 0xff); - *(sp + 3) = (png_byte)(png_ptr->background.green - & 0xff); - *(sp + 4) = (png_byte)((png_ptr->background.blue >> 8) - & 0xff); - *(sp + 5) = (png_byte)(png_ptr->background.blue & 0xff); - } - - else if (a < 0xffff) - { - png_uint_16 v; - - png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1)); - png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8) - + *(sp + 3)); - png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8) - + *(sp + 5)); - - png_composite_16(v, r, a, png_ptr->background.red); - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - - png_composite_16(v, g, a, png_ptr->background.green); - *(sp + 2) = (png_byte)((v >> 8) & 0xff); - *(sp + 3) = (png_byte)(v & 0xff); - - png_composite_16(v, b, a, png_ptr->background.blue); - *(sp + 4) = (png_byte)((v >> 8) & 0xff); - *(sp + 5) = (png_byte)(v & 0xff); - } - } - } - } - break; - } - - default: - break; - } - } -} -#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_READ_ALPHA_MODE_SUPPORTED */ - -#ifdef PNG_READ_GAMMA_SUPPORTED -/* Gamma correct the image, avoiding the alpha channel. Make sure - * you do this after you deal with the transparency issue on grayscale - * or RGB images. If your bit depth is 8, use gamma_table, if it - * is 16, use gamma_16_table and gamma_shift. Build these with - * build_gamma_table(). - */ -void /* PRIVATE */ -png_do_gamma(png_row_infop row_info, png_bytep row, png_structrp png_ptr) -{ - png_const_bytep gamma_table = png_ptr->gamma_table; - png_const_uint_16pp gamma_16_table = png_ptr->gamma_16_table; - int gamma_shift = png_ptr->gamma_shift; - - png_bytep sp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - png_debug(1, "in png_do_gamma"); - - if (((row_info->bit_depth <= 8 && gamma_table != NULL) || - (row_info->bit_depth == 16 && gamma_16_table != NULL))) - { - switch (row_info->color_type) - { - case PNG_COLOR_TYPE_RGB: - { - if (row_info->bit_depth == 8) - { - sp = row; - for (i = 0; i < row_width; i++) - { - *sp = gamma_table[*sp]; - sp++; - *sp = gamma_table[*sp]; - sp++; - *sp = gamma_table[*sp]; - sp++; - } - } - - else /* if (row_info->bit_depth == 16) */ - { - sp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 v; - - v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - - v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - - v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - } - } - break; - } - - case PNG_COLOR_TYPE_RGB_ALPHA: - { - if (row_info->bit_depth == 8) - { - sp = row; - for (i = 0; i < row_width; i++) - { - *sp = gamma_table[*sp]; - sp++; - - *sp = gamma_table[*sp]; - sp++; - - *sp = gamma_table[*sp]; - sp++; - - sp++; - } - } - - else /* if (row_info->bit_depth == 16) */ - { - sp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - - v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - - v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 4; - } - } - break; - } - - case PNG_COLOR_TYPE_GRAY_ALPHA: - { - if (row_info->bit_depth == 8) - { - sp = row; - for (i = 0; i < row_width; i++) - { - *sp = gamma_table[*sp]; - sp += 2; - } - } - - else /* if (row_info->bit_depth == 16) */ - { - sp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 4; - } - } - break; - } - - case PNG_COLOR_TYPE_GRAY: - { - if (row_info->bit_depth == 2) - { - sp = row; - for (i = 0; i < row_width; i += 4) - { - int a = *sp & 0xc0; - int b = *sp & 0x30; - int c = *sp & 0x0c; - int d = *sp & 0x03; - - *sp = (png_byte)( - ((((int)gamma_table[a|(a>>2)|(a>>4)|(a>>6)]) ) & 0xc0)| - ((((int)gamma_table[(b<<2)|b|(b>>2)|(b>>4)])>>2) & 0x30)| - ((((int)gamma_table[(c<<4)|(c<<2)|c|(c>>2)])>>4) & 0x0c)| - ((((int)gamma_table[(d<<6)|(d<<4)|(d<<2)|d])>>6) )); - sp++; - } - } - - if (row_info->bit_depth == 4) - { - sp = row; - for (i = 0; i < row_width; i += 2) - { - int msb = *sp & 0xf0; - int lsb = *sp & 0x0f; - - *sp = (png_byte)((((int)gamma_table[msb | (msb >> 4)]) & 0xf0) - | (((int)gamma_table[(lsb << 4) | lsb]) >> 4)); - sp++; - } - } - - else if (row_info->bit_depth == 8) - { - sp = row; - for (i = 0; i < row_width; i++) - { - *sp = gamma_table[*sp]; - sp++; - } - } - - else if (row_info->bit_depth == 16) - { - sp = row; - for (i = 0; i < row_width; i++) - { - png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp]; - *sp = (png_byte)((v >> 8) & 0xff); - *(sp + 1) = (png_byte)(v & 0xff); - sp += 2; - } - } - break; - } - - default: - break; - } - } -} -#endif - -#ifdef PNG_READ_ALPHA_MODE_SUPPORTED -/* Encode the alpha channel to the output gamma (the input channel is always - * linear.) Called only with color types that have an alpha channel. Needs the - * from_1 tables. - */ -void /* PRIVATE */ -png_do_encode_alpha(png_row_infop row_info, png_bytep row, png_structrp png_ptr) -{ - png_uint_32 row_width = row_info->width; - - png_debug(1, "in png_do_encode_alpha"); - - if (row_info->color_type & PNG_COLOR_MASK_ALPHA) - { - if (row_info->bit_depth == 8) - { - PNG_CONST png_bytep table = png_ptr->gamma_from_1; - - if (table != NULL) - { - PNG_CONST int step = - (row_info->color_type & PNG_COLOR_MASK_COLOR) ? 4 : 2; - - /* The alpha channel is the last component: */ - row += step - 1; - - for (; row_width > 0; --row_width, row += step) - *row = table[*row]; - - return; - } - } - - else if (row_info->bit_depth == 16) - { - PNG_CONST png_uint_16pp table = png_ptr->gamma_16_from_1; - PNG_CONST int gamma_shift = png_ptr->gamma_shift; - - if (table != NULL) - { - PNG_CONST int step = - (row_info->color_type & PNG_COLOR_MASK_COLOR) ? 8 : 4; - - /* The alpha channel is the last component: */ - row += step - 2; - - for (; row_width > 0; --row_width, row += step) - { - png_uint_16 v; - - v = table[*(row + 1) >> gamma_shift][*row]; - *row = (png_byte)((v >> 8) & 0xff); - *(row + 1) = (png_byte)(v & 0xff); - } - - return; - } - } - } - - /* Only get to here if called with a weird row_info; no harm has been done, - * so just issue a warning. - */ - png_warning(png_ptr, "png_do_encode_alpha: unexpected call"); -} -#endif - -#ifdef PNG_READ_EXPAND_SUPPORTED -/* Expands a palette row to an RGB or RGBA row depending - * upon whether you supply trans and num_trans. - */ -void /* PRIVATE */ -png_do_expand_palette(png_row_infop row_info, png_bytep row, - png_const_colorp palette, png_const_bytep trans_alpha, int num_trans) -{ - int shift, value; - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - png_debug(1, "in png_do_expand_palette"); - - if (row_info->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (row_info->bit_depth < 8) - { - switch (row_info->bit_depth) - { - case 1: - { - sp = row + (png_size_t)((row_width - 1) >> 3); - dp = row + (png_size_t)row_width - 1; - shift = 7 - (int)((row_width + 7) & 0x07); - for (i = 0; i < row_width; i++) - { - if ((*sp >> shift) & 0x01) - *dp = 1; - - else - *dp = 0; - - if (shift == 7) - { - shift = 0; - sp--; - } - - else - shift++; - - dp--; - } - break; - } - - case 2: - { - sp = row + (png_size_t)((row_width - 1) >> 2); - dp = row + (png_size_t)row_width - 1; - shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); - for (i = 0; i < row_width; i++) - { - value = (*sp >> shift) & 0x03; - *dp = (png_byte)value; - if (shift == 6) - { - shift = 0; - sp--; - } - - else - shift += 2; - - dp--; - } - break; - } - - case 4: - { - sp = row + (png_size_t)((row_width - 1) >> 1); - dp = row + (png_size_t)row_width - 1; - shift = (int)((row_width & 0x01) << 2); - for (i = 0; i < row_width; i++) - { - value = (*sp >> shift) & 0x0f; - *dp = (png_byte)value; - if (shift == 4) - { - shift = 0; - sp--; - } - - else - shift += 4; - - dp--; - } - break; - } - - default: - break; - } - row_info->bit_depth = 8; - row_info->pixel_depth = 8; - row_info->rowbytes = row_width; - } - - if (row_info->bit_depth == 8) - { - { - if (num_trans > 0) - { - sp = row + (png_size_t)row_width - 1; - dp = row + (png_size_t)(row_width << 2) - 1; - - for (i = 0; i < row_width; i++) - { - if ((int)(*sp) >= num_trans) - *dp-- = 0xff; - - else - *dp-- = trans_alpha[*sp]; - - *dp-- = palette[*sp].blue; - *dp-- = palette[*sp].green; - *dp-- = palette[*sp].red; - sp--; - } - row_info->bit_depth = 8; - row_info->pixel_depth = 32; - row_info->rowbytes = row_width * 4; - row_info->color_type = 6; - row_info->channels = 4; - } - - else - { - sp = row + (png_size_t)row_width - 1; - dp = row + (png_size_t)(row_width * 3) - 1; - - for (i = 0; i < row_width; i++) - { - *dp-- = palette[*sp].blue; - *dp-- = palette[*sp].green; - *dp-- = palette[*sp].red; - sp--; - } - - row_info->bit_depth = 8; - row_info->pixel_depth = 24; - row_info->rowbytes = row_width * 3; - row_info->color_type = 2; - row_info->channels = 3; - } - } - } - } -} - -/* If the bit depth < 8, it is expanded to 8. Also, if the already - * expanded transparency value is supplied, an alpha channel is built. - */ -void /* PRIVATE */ -png_do_expand(png_row_infop row_info, png_bytep row, - png_const_color_16p trans_color) -{ - int shift, value; - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - png_debug(1, "in png_do_expand"); - - { - if (row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - unsigned int gray = trans_color ? trans_color->gray : 0; - - if (row_info->bit_depth < 8) - { - switch (row_info->bit_depth) - { - case 1: - { - gray = (gray & 0x01) * 0xff; - sp = row + (png_size_t)((row_width - 1) >> 3); - dp = row + (png_size_t)row_width - 1; - shift = 7 - (int)((row_width + 7) & 0x07); - for (i = 0; i < row_width; i++) - { - if ((*sp >> shift) & 0x01) - *dp = 0xff; - - else - *dp = 0; - - if (shift == 7) - { - shift = 0; - sp--; - } - - else - shift++; - - dp--; - } - break; - } - - case 2: - { - gray = (gray & 0x03) * 0x55; - sp = row + (png_size_t)((row_width - 1) >> 2); - dp = row + (png_size_t)row_width - 1; - shift = (int)((3 - ((row_width + 3) & 0x03)) << 1); - for (i = 0; i < row_width; i++) - { - value = (*sp >> shift) & 0x03; - *dp = (png_byte)(value | (value << 2) | (value << 4) | - (value << 6)); - if (shift == 6) - { - shift = 0; - sp--; - } - - else - shift += 2; - - dp--; - } - break; - } - - case 4: - { - gray = (gray & 0x0f) * 0x11; - sp = row + (png_size_t)((row_width - 1) >> 1); - dp = row + (png_size_t)row_width - 1; - shift = (int)((1 - ((row_width + 1) & 0x01)) << 2); - for (i = 0; i < row_width; i++) - { - value = (*sp >> shift) & 0x0f; - *dp = (png_byte)(value | (value << 4)); - if (shift == 4) - { - shift = 0; - sp--; - } - - else - shift = 4; - - dp--; - } - break; - } - - default: - break; - } - - row_info->bit_depth = 8; - row_info->pixel_depth = 8; - row_info->rowbytes = row_width; - } - - if (trans_color != NULL) - { - if (row_info->bit_depth == 8) - { - gray = gray & 0xff; - sp = row + (png_size_t)row_width - 1; - dp = row + (png_size_t)(row_width << 1) - 1; - - for (i = 0; i < row_width; i++) - { - if (*sp == gray) - *dp-- = 0; - - else - *dp-- = 0xff; - - *dp-- = *sp--; - } - } - - else if (row_info->bit_depth == 16) - { - unsigned int gray_high = (gray >> 8) & 0xff; - unsigned int gray_low = gray & 0xff; - sp = row + row_info->rowbytes - 1; - dp = row + (row_info->rowbytes << 1) - 1; - for (i = 0; i < row_width; i++) - { - if (*(sp - 1) == gray_high && *(sp) == gray_low) - { - *dp-- = 0; - *dp-- = 0; - } - - else - { - *dp-- = 0xff; - *dp-- = 0xff; - } - - *dp-- = *sp--; - *dp-- = *sp--; - } - } - - row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA; - row_info->channels = 2; - row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, - row_width); - } - } - else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_color) - { - if (row_info->bit_depth == 8) - { - png_byte red = (png_byte)(trans_color->red & 0xff); - png_byte green = (png_byte)(trans_color->green & 0xff); - png_byte blue = (png_byte)(trans_color->blue & 0xff); - sp = row + (png_size_t)row_info->rowbytes - 1; - dp = row + (png_size_t)(row_width << 2) - 1; - for (i = 0; i < row_width; i++) - { - if (*(sp - 2) == red && *(sp - 1) == green && *(sp) == blue) - *dp-- = 0; - - else - *dp-- = 0xff; - - *dp-- = *sp--; - *dp-- = *sp--; - *dp-- = *sp--; - } - } - else if (row_info->bit_depth == 16) - { - png_byte red_high = (png_byte)((trans_color->red >> 8) & 0xff); - png_byte green_high = (png_byte)((trans_color->green >> 8) & 0xff); - png_byte blue_high = (png_byte)((trans_color->blue >> 8) & 0xff); - png_byte red_low = (png_byte)(trans_color->red & 0xff); - png_byte green_low = (png_byte)(trans_color->green & 0xff); - png_byte blue_low = (png_byte)(trans_color->blue & 0xff); - sp = row + row_info->rowbytes - 1; - dp = row + (png_size_t)(row_width << 3) - 1; - for (i = 0; i < row_width; i++) - { - if (*(sp - 5) == red_high && - *(sp - 4) == red_low && - *(sp - 3) == green_high && - *(sp - 2) == green_low && - *(sp - 1) == blue_high && - *(sp ) == blue_low) - { - *dp-- = 0; - *dp-- = 0; - } - - else - { - *dp-- = 0xff; - *dp-- = 0xff; - } - - *dp-- = *sp--; - *dp-- = *sp--; - *dp-- = *sp--; - *dp-- = *sp--; - *dp-- = *sp--; - *dp-- = *sp--; - } - } - row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA; - row_info->channels = 4; - row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); - } - } -} -#endif - -#ifdef PNG_READ_EXPAND_16_SUPPORTED -/* If the bit depth is 8 and the color type is not a palette type expand the - * whole row to 16 bits. Has no effect otherwise. - */ -void /* PRIVATE */ -png_do_expand_16(png_row_infop row_info, png_bytep row) -{ - if (row_info->bit_depth == 8 && - row_info->color_type != PNG_COLOR_TYPE_PALETTE) - { - /* The row have a sequence of bytes containing [0..255] and we need - * to turn it into another row containing [0..65535], to do this we - * calculate: - * - * (input / 255) * 65535 - * - * Which happens to be exactly input * 257 and this can be achieved - * simply by byte replication in place (copying backwards). - */ - png_byte *sp = row + row_info->rowbytes; /* source, last byte + 1 */ - png_byte *dp = sp + row_info->rowbytes; /* destination, end + 1 */ - while (dp > sp) - dp[-2] = dp[-1] = *--sp, dp -= 2; - - row_info->rowbytes *= 2; - row_info->bit_depth = 16; - row_info->pixel_depth = (png_byte)(row_info->channels * 16); - } -} -#endif - -#ifdef PNG_READ_QUANTIZE_SUPPORTED -void /* PRIVATE */ -png_do_quantize(png_row_infop row_info, png_bytep row, - png_const_bytep palette_lookup, png_const_bytep quantize_lookup) -{ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width=row_info->width; - - png_debug(1, "in png_do_quantize"); - - if (row_info->bit_depth == 8) - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB && palette_lookup) - { - int r, g, b, p; - sp = row; - dp = row; - for (i = 0; i < row_width; i++) - { - r = *sp++; - g = *sp++; - b = *sp++; - - /* This looks real messy, but the compiler will reduce - * it down to a reasonable formula. For example, with - * 5 bits per color, we get: - * p = (((r >> 3) & 0x1f) << 10) | - * (((g >> 3) & 0x1f) << 5) | - * ((b >> 3) & 0x1f); - */ - p = (((r >> (8 - PNG_QUANTIZE_RED_BITS)) & - ((1 << PNG_QUANTIZE_RED_BITS) - 1)) << - (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) | - (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) & - ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) << - (PNG_QUANTIZE_BLUE_BITS)) | - ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) & - ((1 << PNG_QUANTIZE_BLUE_BITS) - 1)); - - *dp++ = palette_lookup[p]; - } - - row_info->color_type = PNG_COLOR_TYPE_PALETTE; - row_info->channels = 1; - row_info->pixel_depth = row_info->bit_depth; - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); - } - - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA && - palette_lookup != NULL) - { - int r, g, b, p; - sp = row; - dp = row; - for (i = 0; i < row_width; i++) - { - r = *sp++; - g = *sp++; - b = *sp++; - sp++; - - p = (((r >> (8 - PNG_QUANTIZE_RED_BITS)) & - ((1 << PNG_QUANTIZE_RED_BITS) - 1)) << - (PNG_QUANTIZE_GREEN_BITS + PNG_QUANTIZE_BLUE_BITS)) | - (((g >> (8 - PNG_QUANTIZE_GREEN_BITS)) & - ((1 << PNG_QUANTIZE_GREEN_BITS) - 1)) << - (PNG_QUANTIZE_BLUE_BITS)) | - ((b >> (8 - PNG_QUANTIZE_BLUE_BITS)) & - ((1 << PNG_QUANTIZE_BLUE_BITS) - 1)); - - *dp++ = palette_lookup[p]; - } - - row_info->color_type = PNG_COLOR_TYPE_PALETTE; - row_info->channels = 1; - row_info->pixel_depth = row_info->bit_depth; - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, row_width); - } - - else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE && - quantize_lookup) - { - sp = row; - - for (i = 0; i < row_width; i++, sp++) - { - *sp = quantize_lookup[*sp]; - } - } - } -} -#endif /* PNG_READ_QUANTIZE_SUPPORTED */ -#endif /* PNG_READ_TRANSFORMS_SUPPORTED */ - -#ifdef PNG_MNG_FEATURES_SUPPORTED -/* Undoes intrapixel differencing */ -void /* PRIVATE */ -png_do_read_intrapixel(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_read_intrapixel"); - - if ( - (row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - int bytes_per_pixel; - png_uint_32 row_width = row_info->width; - - if (row_info->bit_depth == 8) - { - png_bytep rp; - png_uint_32 i; - - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - bytes_per_pixel = 3; - - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - bytes_per_pixel = 4; - - else - return; - - for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) - { - *(rp) = (png_byte)((256 + *rp + *(rp + 1)) & 0xff); - *(rp+2) = (png_byte)((256 + *(rp + 2) + *(rp + 1)) & 0xff); - } - } - else if (row_info->bit_depth == 16) - { - png_bytep rp; - png_uint_32 i; - - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - bytes_per_pixel = 6; - - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - bytes_per_pixel = 8; - - else - return; - - for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) - { - png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1); - png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3); - png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5); - png_uint_32 red = (s0 + s1 + 65536) & 0xffff; - png_uint_32 blue = (s2 + s1 + 65536) & 0xffff; - *(rp ) = (png_byte)((red >> 8) & 0xff); - *(rp + 1) = (png_byte)(red & 0xff); - *(rp + 4) = (png_byte)((blue >> 8) & 0xff); - *(rp + 5) = (png_byte)(blue & 0xff); - } - } - } -} -#endif /* PNG_MNG_FEATURES_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrutil.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrutil.c deleted file mode 100755 index b998fe6..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngrutil.c +++ /dev/null @@ -1,4459 +0,0 @@ - -/* pngrutil.c - utilities to read a PNG file - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - * This file contains routines that are only called from within - * libpng itself during the course of reading an image. - */ - -#include "pngpriv.h" - -#ifdef PNG_READ_SUPPORTED - -#define png_strtod(p,a,b) strtod(a,b) - -png_uint_32 PNGAPI -png_get_uint_31(png_const_structrp png_ptr, png_const_bytep buf) -{ - png_uint_32 uval = png_get_uint_32(buf); - - if (uval > PNG_UINT_31_MAX) - png_error(png_ptr, "PNG unsigned integer out of range"); - - return (uval); -} - -#if defined(PNG_READ_gAMA_SUPPORTED) || defined(PNG_READ_cHRM_SUPPORTED) -/* The following is a variation on the above for use with the fixed - * point values used for gAMA and cHRM. Instead of png_error it - * issues a warning and returns (-1) - an invalid value because both - * gAMA and cHRM use *unsigned* integers for fixed point values. - */ -#define PNG_FIXED_ERROR (-1) - -static png_fixed_point /* PRIVATE */ -png_get_fixed_point(png_structrp png_ptr, png_const_bytep buf) -{ - png_uint_32 uval = png_get_uint_32(buf); - - if (uval <= PNG_UINT_31_MAX) - return (png_fixed_point)uval; /* known to be in range */ - - /* The caller can turn off the warning by passing NULL. */ - if (png_ptr != NULL) - png_warning(png_ptr, "PNG fixed point integer out of range"); - - return PNG_FIXED_ERROR; -} -#endif - -#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED -/* NOTE: the read macros will obscure these definitions, so that if - * PNG_USE_READ_MACROS is set the library will not use them internally, - * but the APIs will still be available externally. - * - * The parentheses around "PNGAPI function_name" in the following three - * functions are necessary because they allow the macros to co-exist with - * these (unused but exported) functions. - */ - -/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */ -png_uint_32 (PNGAPI -png_get_uint_32)(png_const_bytep buf) -{ - png_uint_32 uval = - ((png_uint_32)(*(buf )) << 24) + - ((png_uint_32)(*(buf + 1)) << 16) + - ((png_uint_32)(*(buf + 2)) << 8) + - ((png_uint_32)(*(buf + 3)) ) ; - - return uval; -} - -/* Grab a signed 32-bit integer from a buffer in big-endian format. The - * data is stored in the PNG file in two's complement format and there - * is no guarantee that a 'png_int_32' is exactly 32 bits, therefore - * the following code does a two's complement to native conversion. - */ -png_int_32 (PNGAPI -png_get_int_32)(png_const_bytep buf) -{ - png_uint_32 uval = png_get_uint_32(buf); - if ((uval & 0x80000000) == 0) /* non-negative */ - return uval; - - uval = (uval ^ 0xffffffff) + 1; /* 2's complement: -x = ~x+1 */ - return -(png_int_32)uval; -} - -/* Grab an unsigned 16-bit integer from a buffer in big-endian format. */ -png_uint_16 (PNGAPI -png_get_uint_16)(png_const_bytep buf) -{ - /* ANSI-C requires an int value to accomodate at least 16 bits so this - * works and allows the compiler not to worry about possible narrowing - * on 32 bit systems. (Pre-ANSI systems did not make integers smaller - * than 16 bits either.) - */ - unsigned int val = - ((unsigned int)(*buf) << 8) + - ((unsigned int)(*(buf + 1))); - - return (png_uint_16)val; -} - -#endif /* PNG_READ_INT_FUNCTIONS_SUPPORTED */ - -/* Read and check the PNG file signature */ -void /* PRIVATE */ -png_read_sig(png_structrp png_ptr, png_inforp info_ptr) -{ - png_size_t num_checked, num_to_check; - - /* Exit if the user application does not expect a signature. */ - if (png_ptr->sig_bytes >= 8) - return; - - num_checked = png_ptr->sig_bytes; - num_to_check = 8 - num_checked; - -#ifdef PNG_IO_STATE_SUPPORTED - png_ptr->io_state = PNG_IO_READING | PNG_IO_SIGNATURE; -#endif - - /* The signature must be serialized in a single I/O call. */ - png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check); - png_ptr->sig_bytes = 8; - - if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check)) - { - if (num_checked < 4 && - png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4)) - png_error(png_ptr, "Not a PNG file"); - else - png_error(png_ptr, "PNG file corrupted by ASCII conversion"); - } - if (num_checked < 3) - png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; -} - -/* Read the chunk header (length + type name). - * Put the type name into png_ptr->chunk_name, and return the length. - */ -png_uint_32 /* PRIVATE */ -png_read_chunk_header(png_structrp png_ptr) -{ - png_byte buf[8]; - png_uint_32 length; - -#ifdef PNG_IO_STATE_SUPPORTED - png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_HDR; -#endif - - /* Read the length and the chunk name. - * This must be performed in a single I/O call. - */ - png_read_data(png_ptr, buf, 8); - length = png_get_uint_31(png_ptr, buf); - - /* Put the chunk name into png_ptr->chunk_name. */ - png_ptr->chunk_name = PNG_CHUNK_FROM_STRING(buf+4); - - png_debug2(0, "Reading %lx chunk, length = %lu", - (unsigned long)png_ptr->chunk_name, (unsigned long)length); - - /* Reset the crc and run it over the chunk name. */ - png_reset_crc(png_ptr); - png_calculate_crc(png_ptr, buf + 4, 4); - - /* Check to see if chunk name is valid. */ - png_check_chunk_name(png_ptr, png_ptr->chunk_name); - -#ifdef PNG_IO_STATE_SUPPORTED - png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_DATA; -#endif - - return length; -} - -/* Read data, and (optionally) run it through the CRC. */ -void /* PRIVATE */ -png_crc_read(png_structrp png_ptr, png_bytep buf, png_uint_32 length) -{ - if (png_ptr == NULL) - return; - - png_read_data(png_ptr, buf, length); - png_calculate_crc(png_ptr, buf, length); -} - -/* Optionally skip data and then check the CRC. Depending on whether we - * are reading an ancillary or critical chunk, and how the program has set - * things up, we may calculate the CRC on the data and print a message. - * Returns '1' if there was a CRC error, '0' otherwise. - */ -int /* PRIVATE */ -png_crc_finish(png_structrp png_ptr, png_uint_32 skip) -{ - /* The size of the local buffer for inflate is a good guess as to a - * reasonable size to use for buffering reads from the application. - */ - while (skip > 0) - { - png_uint_32 len; - png_byte tmpbuf[PNG_INFLATE_BUF_SIZE]; - - len = (sizeof tmpbuf); - if (len > skip) - len = skip; - skip -= len; - - png_crc_read(png_ptr, tmpbuf, len); - } - - if (png_crc_error(png_ptr)) - { - if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name) ? - !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) : - (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE)) - { - png_chunk_warning(png_ptr, "CRC error"); - } - - else - { - png_chunk_benign_error(png_ptr, "CRC error"); - return (0); - } - - return (1); - } - - return (0); -} - -/* Compare the CRC stored in the PNG file with that calculated by libpng from - * the data it has read thus far. - */ -int /* PRIVATE */ -png_crc_error(png_structrp png_ptr) -{ - png_byte crc_bytes[4]; - png_uint_32 crc; - int need_crc = 1; - - if (PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name)) - { - if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) == - (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN)) - need_crc = 0; - } - - else /* critical */ - { - if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE) - need_crc = 0; - } - -#ifdef PNG_IO_STATE_SUPPORTED - png_ptr->io_state = PNG_IO_READING | PNG_IO_CHUNK_CRC; -#endif - - /* The chunk CRC must be serialized in a single I/O call. */ - png_read_data(png_ptr, crc_bytes, 4); - - if (need_crc) - { - crc = png_get_uint_32(crc_bytes); - return ((int)(crc != png_ptr->crc)); - } - - else - return (0); -} - -/* Manage the read buffer; this simply reallocates the buffer if it is not small - * enough (or if it is not allocated). The routine returns a pointer to the - * buffer; if an error occurs and 'warn' is set the routine returns NULL, else - * it will call png_error (via png_malloc) on failure. (warn == 2 means - * 'silent'). - */ -static png_bytep -png_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size, int warn) -{ - png_bytep buffer = png_ptr->read_buffer; - - if (buffer != NULL && new_size > png_ptr->read_buffer_size) - { - png_ptr->read_buffer = NULL; - png_ptr->read_buffer = NULL; - png_ptr->read_buffer_size = 0; - png_free(png_ptr, buffer); - buffer = NULL; - } - - if (buffer == NULL) - { - buffer = png_voidcast(png_bytep, png_malloc_base(png_ptr, new_size)); - - if (buffer != NULL) - { - png_ptr->read_buffer = buffer; - png_ptr->read_buffer_size = new_size; - } - - else if (warn < 2) /* else silent */ - { -#ifdef PNG_WARNINGS_SUPPORTED - if (warn) - png_chunk_warning(png_ptr, "insufficient memory to read chunk"); - else -#endif - { -#ifdef PNG_ERROR_TEXT_SUPPORTED - png_chunk_error(png_ptr, "insufficient memory to read chunk"); -#endif - } - } - } - - return buffer; -} - -/* png_inflate_claim: claim the zstream for some nefarious purpose that involves - * decompression. Returns Z_OK on success, else a zlib error code. It checks - * the owner but, in final release builds, just issues a warning if some other - * chunk apparently owns the stream. Prior to release it does a png_error. - */ -static int -png_inflate_claim(png_structrp png_ptr, png_uint_32 owner, int window_bits) -{ - if (png_ptr->zowner != 0) - { - char msg[64]; - - PNG_STRING_FROM_CHUNK(msg, png_ptr->zowner); - /* So the message that results is " using zstream"; this is an - * internal error, but is very useful for debugging. i18n requirements - * are minimal. - */ - (void)png_safecat(msg, (sizeof msg), 4, " using zstream"); -# if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC - png_chunk_warning(png_ptr, msg); - png_ptr->zowner = 0; -# else - png_chunk_error(png_ptr, msg); -# endif - } - - /* Implementation note: unlike 'png_deflate_claim' this internal function - * does not take the size of the data as an argument. Some efficiency could - * be gained by using this when it is known *if* the zlib stream itself does - * not record the number; however, this is an illusion: the original writer - * of the PNG may have selected a lower window size, and we really must - * follow that because, for systems with with limited capabilities, we - * would otherwise reject the application's attempts to use a smaller window - * size (zlib doesn't have an interface to say "this or lower"!). - * - * inflateReset2 was added to zlib 1.2.4; before this the window could not be - * reset, therefore it is necessary to always allocate the maximum window - * size with earlier zlibs just in case later compressed chunks need it. - */ - { - int ret; /* zlib return code */ - - /* Set this for safety, just in case the previous owner left pointers to - * memory allocations. - */ - png_ptr->zstream.next_in = NULL; - png_ptr->zstream.avail_in = 0; - png_ptr->zstream.next_out = NULL; - png_ptr->zstream.avail_out = 0; - - if (png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) - { -# if ZLIB_VERNUM < 0x1240 - PNG_UNUSED(window_bits) - ret = inflateReset(&png_ptr->zstream); -# else - ret = inflateReset2(&png_ptr->zstream, window_bits); -# endif - } - - else - { -# if ZLIB_VERNUM < 0x1240 - ret = inflateInit(&png_ptr->zstream); -# else - ret = inflateInit2(&png_ptr->zstream, window_bits); -# endif - - if (ret == Z_OK) - png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED; - } - - if (ret == Z_OK) - png_ptr->zowner = owner; - - else - png_zstream_error(png_ptr, ret); - - return ret; - } -} - -#ifdef PNG_READ_COMPRESSED_TEXT_SUPPORTED -/* png_inflate now returns zlib error codes including Z_OK and Z_STREAM_END to - * allow the caller to do multiple calls if required. If the 'finish' flag is - * set Z_FINISH will be passed to the final inflate() call and Z_STREAM_END must - * be returned or there has been a problem, otherwise Z_SYNC_FLUSH is used and - * Z_OK or Z_STREAM_END will be returned on success. - * - * The input and output sizes are updated to the actual amounts of data consumed - * or written, not the amount available (as in a z_stream). The data pointers - * are not changed, so the next input is (data+input_size) and the next - * available output is (output+output_size). - */ -static int -png_inflate(png_structrp png_ptr, png_uint_32 owner, int finish, - /* INPUT: */ png_const_bytep input, png_uint_32p input_size_ptr, - /* OUTPUT: */ png_bytep output, png_alloc_size_t *output_size_ptr) -{ - if (png_ptr->zowner == owner) /* Else not claimed */ - { - int ret; - png_alloc_size_t avail_out = *output_size_ptr; - png_uint_32 avail_in = *input_size_ptr; - - /* zlib can't necessarily handle more than 65535 bytes at once (i.e. it - * can't even necessarily handle 65536 bytes) because the type uInt is - * "16 bits or more". Consequently it is necessary to chunk the input to - * zlib. This code uses ZLIB_IO_MAX, from pngpriv.h, as the maximum (the - * maximum value that can be stored in a uInt.) It is possible to set - * ZLIB_IO_MAX to a lower value in pngpriv.h and this may sometimes have - * a performance advantage, because it reduces the amount of data accessed - * at each step and that may give the OS more time to page it in. - */ - png_ptr->zstream.next_in = PNGZ_INPUT_CAST(input); - /* avail_in and avail_out are set below from 'size' */ - png_ptr->zstream.avail_in = 0; - png_ptr->zstream.avail_out = 0; - - /* Read directly into the output if it is available (this is set to - * a local buffer below if output is NULL). - */ - if (output != NULL) - png_ptr->zstream.next_out = output; - - do - { - uInt avail; - unsigned char local_buffer[PNG_INFLATE_BUF_SIZE]; - - /* zlib INPUT BUFFER */ - /* The setting of 'avail_in' used to be outside the loop; by setting it - * inside it is possible to chunk the input to zlib and simply rely on - * zlib to advance the 'next_in' pointer. This allows arbitrary - * amounts of data to be passed through zlib at the unavoidable cost of - * requiring a window save (memcpy of up to 32768 output bytes) - * every ZLIB_IO_MAX input bytes. - */ - avail_in += png_ptr->zstream.avail_in; /* not consumed last time */ - - avail = ZLIB_IO_MAX; - - if (avail_in < avail) - avail = (uInt)avail_in; /* safe: < than ZLIB_IO_MAX */ - - avail_in -= avail; - png_ptr->zstream.avail_in = avail; - - /* zlib OUTPUT BUFFER */ - avail_out += png_ptr->zstream.avail_out; /* not written last time */ - - avail = ZLIB_IO_MAX; /* maximum zlib can process */ - - if (output == NULL) - { - /* Reset the output buffer each time round if output is NULL and - * make available the full buffer, up to 'remaining_space' - */ - png_ptr->zstream.next_out = local_buffer; - if ((sizeof local_buffer) < avail) - avail = (sizeof local_buffer); - } - - if (avail_out < avail) - avail = (uInt)avail_out; /* safe: < ZLIB_IO_MAX */ - - png_ptr->zstream.avail_out = avail; - avail_out -= avail; - - /* zlib inflate call */ - /* In fact 'avail_out' may be 0 at this point, that happens at the end - * of the read when the final LZ end code was not passed at the end of - * the previous chunk of input data. Tell zlib if we have reached the - * end of the output buffer. - */ - ret = inflate(&png_ptr->zstream, avail_out > 0 ? Z_NO_FLUSH : - (finish ? Z_FINISH : Z_SYNC_FLUSH)); - } while (ret == Z_OK); - - /* For safety kill the local buffer pointer now */ - if (output == NULL) - png_ptr->zstream.next_out = NULL; - - /* Claw back the 'size' and 'remaining_space' byte counts. */ - avail_in += png_ptr->zstream.avail_in; - avail_out += png_ptr->zstream.avail_out; - - /* Update the input and output sizes; the updated values are the amount - * consumed or written, effectively the inverse of what zlib uses. - */ - if (avail_out > 0) - *output_size_ptr -= avail_out; - - if (avail_in > 0) - *input_size_ptr -= avail_in; - - /* Ensure png_ptr->zstream.msg is set (even in the success case!) */ - png_zstream_error(png_ptr, ret); - return ret; - } - - else - { - /* This is a bad internal error. The recovery assigns to the zstream msg - * pointer, which is not owned by the caller, but this is safe; it's only - * used on errors! - */ - png_ptr->zstream.msg = PNGZ_MSG_CAST("zstream unclaimed"); - return Z_STREAM_ERROR; - } -} - -/* - * Decompress trailing data in a chunk. The assumption is that read_buffer - * points at an allocated area holding the contents of a chunk with a - * trailing compressed part. What we get back is an allocated area - * holding the original prefix part and an uncompressed version of the - * trailing part (the malloc area passed in is freed). - */ -static int -png_decompress_chunk(png_structrp png_ptr, - png_uint_32 chunklength, png_uint_32 prefix_size, - png_alloc_size_t *newlength /* must be initialized to the maximum! */, - int terminate /*add a '\0' to the end of the uncompressed data*/) -{ - /* TODO: implement different limits for different types of chunk. - * - * The caller supplies *newlength set to the maximum length of the - * uncompressed data, but this routine allocates space for the prefix and - * maybe a '\0' terminator too. We have to assume that 'prefix_size' is - * limited only by the maximum chunk size. - */ - png_alloc_size_t limit = PNG_SIZE_MAX; - -# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED - if (png_ptr->user_chunk_malloc_max > 0 && - png_ptr->user_chunk_malloc_max < limit) - limit = png_ptr->user_chunk_malloc_max; -# elif PNG_USER_CHUNK_MALLOC_MAX > 0 - if (PNG_USER_CHUNK_MALLOC_MAX < limit) - limit = PNG_USER_CHUNK_MALLOC_MAX; -# endif - - if (limit >= prefix_size + (terminate != 0)) - { - int ret; - - limit -= prefix_size + (terminate != 0); - - if (limit < *newlength) - *newlength = limit; - - /* Now try to claim the stream; the 'warn' setting causes zlib to be told - * to use the maximum window size during inflate; this hides errors in the - * deflate header window bits value which is used if '0' is passed. In - * fact this only has an effect with zlib versions 1.2.4 and later - see - * the comments in png_inflate_claim above. - */ - ret = png_inflate_claim(png_ptr, png_ptr->chunk_name, - png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN ? 15 : 0); - - if (ret == Z_OK) - { - png_uint_32 lzsize = chunklength - prefix_size; - - ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/, - /* input: */ png_ptr->read_buffer + prefix_size, &lzsize, - /* output: */ NULL, newlength); - - if (ret == Z_STREAM_END) - { - /* Use 'inflateReset' here, not 'inflateReset2' because this - * preserves the previously decided window size (otherwise it would - * be necessary to store the previous window size.) In practice - * this doesn't matter anyway, because png_inflate will call inflate - * with Z_FINISH in almost all cases, so the window will not be - * maintained. - */ - if (inflateReset(&png_ptr->zstream) == Z_OK) - { - /* Because of the limit checks above we know that the new, - * expanded, size will fit in a size_t (let alone an - * png_alloc_size_t). Use png_malloc_base here to avoid an - * extra OOM message. - */ - png_alloc_size_t new_size = *newlength; - png_alloc_size_t buffer_size = prefix_size + new_size + - (terminate != 0); - png_bytep text = png_voidcast(png_bytep, png_malloc_base(png_ptr, - buffer_size)); - - if (text != NULL) - { - ret = png_inflate(png_ptr, png_ptr->chunk_name, 1/*finish*/, - png_ptr->read_buffer + prefix_size, &lzsize, - text + prefix_size, newlength); - - if (ret == Z_STREAM_END) - { - if (new_size == *newlength) - { - if (terminate) - text[prefix_size + *newlength] = 0; - - if (prefix_size > 0) - memcpy(text, png_ptr->read_buffer, prefix_size); - - { - png_bytep old_ptr = png_ptr->read_buffer; - - png_ptr->read_buffer = text; - png_ptr->read_buffer_size = buffer_size; - text = old_ptr; /* freed below */ - } - } - - else - { - /* The size changed on the second read, there can be no - * guarantee that anything is correct at this point. - * The 'msg' pointer has been set to "unexpected end of - * LZ stream", which is fine, but return an error code - * that the caller won't accept. - */ - ret = PNG_UNEXPECTED_ZLIB_RETURN; - } - } - - else if (ret == Z_OK) - ret = PNG_UNEXPECTED_ZLIB_RETURN; /* for safety */ - - /* Free the text pointer (this is the old read_buffer on - * success) - */ - png_free(png_ptr, text); - - /* This really is very benign, but it's still an error because - * the extra space may otherwise be used as a Trojan Horse. - */ - if (ret == Z_STREAM_END && - chunklength - prefix_size != lzsize) - png_chunk_benign_error(png_ptr, "extra compressed data"); - } - - else - { - /* Out of memory allocating the buffer */ - ret = Z_MEM_ERROR; - png_zstream_error(png_ptr, Z_MEM_ERROR); - } - } - - else - { - /* inflateReset failed, store the error message */ - png_zstream_error(png_ptr, ret); - - if (ret == Z_STREAM_END) - ret = PNG_UNEXPECTED_ZLIB_RETURN; - } - } - - else if (ret == Z_OK) - ret = PNG_UNEXPECTED_ZLIB_RETURN; - - /* Release the claimed stream */ - png_ptr->zowner = 0; - } - - else /* the claim failed */ if (ret == Z_STREAM_END) /* impossible! */ - ret = PNG_UNEXPECTED_ZLIB_RETURN; - - return ret; - } - - else - { - /* Application/configuration limits exceeded */ - png_zstream_error(png_ptr, Z_MEM_ERROR); - return Z_MEM_ERROR; - } -} -#endif /* PNG_READ_COMPRESSED_TEXT_SUPPORTED */ - -#ifdef PNG_READ_iCCP_SUPPORTED -/* Perform a partial read and decompress, producing 'avail_out' bytes and - * reading from the current chunk as required. - */ -static int -png_inflate_read(png_structrp png_ptr, png_bytep read_buffer, uInt read_size, - png_uint_32p chunk_bytes, png_bytep next_out, png_alloc_size_t *out_size, - int finish) -{ - if (png_ptr->zowner == png_ptr->chunk_name) - { - int ret; - - /* next_in and avail_in must have been initialized by the caller. */ - png_ptr->zstream.next_out = next_out; - png_ptr->zstream.avail_out = 0; /* set in the loop */ - - do - { - if (png_ptr->zstream.avail_in == 0) - { - if (read_size > *chunk_bytes) - read_size = (uInt)*chunk_bytes; - *chunk_bytes -= read_size; - - if (read_size > 0) - png_crc_read(png_ptr, read_buffer, read_size); - - png_ptr->zstream.next_in = read_buffer; - png_ptr->zstream.avail_in = read_size; - } - - if (png_ptr->zstream.avail_out == 0) - { - uInt avail = ZLIB_IO_MAX; - if (avail > *out_size) - avail = (uInt)*out_size; - *out_size -= avail; - - png_ptr->zstream.avail_out = avail; - } - - /* Use Z_SYNC_FLUSH when there is no more chunk data to ensure that all - * the available output is produced; this allows reading of truncated - * streams. - */ - ret = inflate(&png_ptr->zstream, - *chunk_bytes > 0 ? Z_NO_FLUSH : (finish ? Z_FINISH : Z_SYNC_FLUSH)); - } - while (ret == Z_OK && (*out_size > 0 || png_ptr->zstream.avail_out > 0)); - - *out_size += png_ptr->zstream.avail_out; - png_ptr->zstream.avail_out = 0; /* Should not be required, but is safe */ - - /* Ensure the error message pointer is always set: */ - png_zstream_error(png_ptr, ret); - return ret; - } - - else - { - png_ptr->zstream.msg = PNGZ_MSG_CAST("zstream unclaimed"); - return Z_STREAM_ERROR; - } -} -#endif - -/* Read and check the IDHR chunk */ -void /* PRIVATE */ -png_handle_IHDR(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_byte buf[13]; - png_uint_32 width, height; - int bit_depth, color_type, compression_type, filter_type; - int interlace_type; - - png_debug(1, "in png_handle_IHDR"); - - if (png_ptr->mode & PNG_HAVE_IHDR) - png_chunk_error(png_ptr, "out of place"); - - /* Check the length */ - if (length != 13) - png_chunk_error(png_ptr, "invalid"); - - png_ptr->mode |= PNG_HAVE_IHDR; - - png_crc_read(png_ptr, buf, 13); - png_crc_finish(png_ptr, 0); - - width = png_get_uint_31(png_ptr, buf); - height = png_get_uint_31(png_ptr, buf + 4); - bit_depth = buf[8]; - color_type = buf[9]; - compression_type = buf[10]; - filter_type = buf[11]; - interlace_type = buf[12]; - - /* Set internal variables */ - png_ptr->width = width; - png_ptr->height = height; - png_ptr->bit_depth = (png_byte)bit_depth; - png_ptr->interlaced = (png_byte)interlace_type; - png_ptr->color_type = (png_byte)color_type; -#ifdef PNG_MNG_FEATURES_SUPPORTED - png_ptr->filter_type = (png_byte)filter_type; -#endif - png_ptr->compression_type = (png_byte)compression_type; - - /* Find number of channels */ - switch (png_ptr->color_type) - { - default: /* invalid, png_set_IHDR calls png_error */ - case PNG_COLOR_TYPE_GRAY: - case PNG_COLOR_TYPE_PALETTE: - png_ptr->channels = 1; - break; - - case PNG_COLOR_TYPE_RGB: - png_ptr->channels = 3; - break; - - case PNG_COLOR_TYPE_GRAY_ALPHA: - png_ptr->channels = 2; - break; - - case PNG_COLOR_TYPE_RGB_ALPHA: - png_ptr->channels = 4; - break; - } - - /* Set up other useful info */ - png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth * - png_ptr->channels); - png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width); - png_debug1(3, "bit_depth = %d", png_ptr->bit_depth); - png_debug1(3, "channels = %d", png_ptr->channels); - png_debug1(3, "rowbytes = %lu", (unsigned long)png_ptr->rowbytes); - png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, - color_type, interlace_type, compression_type, filter_type); -} - -/* Read and check the palette */ -void /* PRIVATE */ -png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_color palette[PNG_MAX_PALETTE_LENGTH]; - int num, i; -#ifdef PNG_POINTER_INDEXING_SUPPORTED - png_colorp pal_ptr; -#endif - - png_debug(1, "in png_handle_PLTE"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - /* Moved to before the 'after IDAT' check below because otherwise duplicate - * PLTE chunks are potentially ignored (the spec says there shall not be more - * than one PLTE, the error is not treated as benign, so this check trumps - * the requirement that PLTE appears before IDAT.) - */ - else if (png_ptr->mode & PNG_HAVE_PLTE) - png_chunk_error(png_ptr, "duplicate"); - - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - /* This is benign because the non-benign error happened before, when an - * IDAT was encountered in a color-mapped image with no PLTE. - */ - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - png_ptr->mode |= PNG_HAVE_PLTE; - - if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "ignored in grayscale PNG"); - return; - } - -#ifndef PNG_READ_OPT_PLTE_SUPPORTED - if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) - { - png_crc_finish(png_ptr, length); - return; - } -#endif - - if (length > 3*PNG_MAX_PALETTE_LENGTH || length % 3) - { - png_crc_finish(png_ptr, length); - - if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE) - png_chunk_benign_error(png_ptr, "invalid"); - - else - png_chunk_error(png_ptr, "invalid"); - - return; - } - - /* The cast is safe because 'length' is less than 3*PNG_MAX_PALETTE_LENGTH */ - num = (int)length / 3; - -#ifdef PNG_POINTER_INDEXING_SUPPORTED - for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++) - { - png_byte buf[3]; - - png_crc_read(png_ptr, buf, 3); - pal_ptr->red = buf[0]; - pal_ptr->green = buf[1]; - pal_ptr->blue = buf[2]; - } -#else - for (i = 0; i < num; i++) - { - png_byte buf[3]; - - png_crc_read(png_ptr, buf, 3); - /* Don't depend upon png_color being any order */ - palette[i].red = buf[0]; - palette[i].green = buf[1]; - palette[i].blue = buf[2]; - } -#endif - - /* If we actually need the PLTE chunk (ie for a paletted image), we do - * whatever the normal CRC configuration tells us. However, if we - * have an RGB image, the PLTE can be considered ancillary, so - * we will act as though it is. - */ -#ifndef PNG_READ_OPT_PLTE_SUPPORTED - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) -#endif - { - png_crc_finish(png_ptr, 0); - } - -#ifndef PNG_READ_OPT_PLTE_SUPPORTED - else if (png_crc_error(png_ptr)) /* Only if we have a CRC error */ - { - /* If we don't want to use the data from an ancillary chunk, - * we have two options: an error abort, or a warning and we - * ignore the data in this chunk (which should be OK, since - * it's considered ancillary for a RGB or RGBA image). - * - * IMPLEMENTATION NOTE: this is only here because png_crc_finish uses the - * chunk type to determine whether to check the ancillary or the critical - * flags. - */ - if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE)) - { - if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN) - { - png_chunk_benign_error(png_ptr, "CRC error"); - } - - else - { - png_chunk_warning(png_ptr, "CRC error"); - return; - } - } - - /* Otherwise, we (optionally) emit a warning and use the chunk. */ - else if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) - { - png_chunk_warning(png_ptr, "CRC error"); - } - } -#endif - - /* TODO: png_set_PLTE has the side effect of setting png_ptr->palette to its - * own copy of the palette. This has the side effect that when png_start_row - * is called (this happens after any call to png_read_update_info) the - * info_ptr palette gets changed. This is extremely unexpected and - * confusing. - * - * Fix this by not sharing the palette in this way. - */ - png_set_PLTE(png_ptr, info_ptr, palette, num); - - /* The three chunks, bKGD, hIST and tRNS *must* appear after PLTE and before - * IDAT. Prior to 1.6.0 this was not checked; instead the code merely - * checked the apparent validity of a tRNS chunk inserted before PLTE on a - * palette PNG. 1.6.0 attempts to rigorously follow the standard and - * therefore does a benign error if the erroneous condition is detected *and* - * cancels the tRNS if the benign error returns. The alternative is to - * amend the standard since it would be rather hypocritical of the standards - * maintainers to ignore it. - */ -#ifdef PNG_READ_tRNS_SUPPORTED - if (png_ptr->num_trans > 0 || - (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS) != 0)) - { - /* Cancel this because otherwise it would be used if the transforms - * require it. Don't cancel the 'valid' flag because this would prevent - * detection of duplicate chunks. - */ - png_ptr->num_trans = 0; - - if (info_ptr != NULL) - info_ptr->num_trans = 0; - - png_chunk_benign_error(png_ptr, "tRNS must be after"); - } -#endif - -#ifdef PNG_READ_hIST_SUPPORTED - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST) != 0) - png_chunk_benign_error(png_ptr, "hIST must be after"); -#endif - -#ifdef PNG_READ_bKGD_SUPPORTED - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD) != 0) - png_chunk_benign_error(png_ptr, "bKGD must be after"); -#endif -} - -void /* PRIVATE */ -png_handle_IEND(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_debug(1, "in png_handle_IEND"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT)) - png_chunk_error(png_ptr, "out of place"); - - png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND); - - png_crc_finish(png_ptr, length); - - if (length != 0) - png_chunk_benign_error(png_ptr, "invalid"); - - PNG_UNUSED(info_ptr) -} - -#ifdef PNG_READ_gAMA_SUPPORTED -void /* PRIVATE */ -png_handle_gAMA(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_fixed_point igamma; - png_byte buf[4]; - - png_debug(1, "in png_handle_gAMA"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - if (length != 4) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_crc_read(png_ptr, buf, 4); - - if (png_crc_finish(png_ptr, 0)) - return; - - igamma = png_get_fixed_point(NULL, buf); - - png_colorspace_set_gamma(png_ptr, &png_ptr->colorspace, igamma); - png_colorspace_sync(png_ptr, info_ptr); -} -#endif - -#ifdef PNG_READ_sBIT_SUPPORTED -void /* PRIVATE */ -png_handle_sBIT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - unsigned int truelen; - png_byte buf[4]; - - png_debug(1, "in png_handle_sBIT"); - - buf[0] = buf[1] = buf[2] = buf[3] = 0; - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "duplicate"); - return; - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - truelen = 3; - - else - truelen = png_ptr->channels; - - if (length != truelen || length > 4) - { - png_chunk_benign_error(png_ptr, "invalid"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buf, truelen); - - if (png_crc_finish(png_ptr, 0)) - return; - - if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) - { - png_ptr->sig_bit.red = buf[0]; - png_ptr->sig_bit.green = buf[1]; - png_ptr->sig_bit.blue = buf[2]; - png_ptr->sig_bit.alpha = buf[3]; - } - - else - { - png_ptr->sig_bit.gray = buf[0]; - png_ptr->sig_bit.red = buf[0]; - png_ptr->sig_bit.green = buf[0]; - png_ptr->sig_bit.blue = buf[0]; - png_ptr->sig_bit.alpha = buf[1]; - } - - png_set_sBIT(png_ptr, info_ptr, &(png_ptr->sig_bit)); -} -#endif - -#ifdef PNG_READ_cHRM_SUPPORTED -void /* PRIVATE */ -png_handle_cHRM(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_byte buf[32]; - png_xy xy; - - png_debug(1, "in png_handle_cHRM"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - if (length != 32) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_crc_read(png_ptr, buf, 32); - - if (png_crc_finish(png_ptr, 0)) - return; - - xy.whitex = png_get_fixed_point(NULL, buf); - xy.whitey = png_get_fixed_point(NULL, buf + 4); - xy.redx = png_get_fixed_point(NULL, buf + 8); - xy.redy = png_get_fixed_point(NULL, buf + 12); - xy.greenx = png_get_fixed_point(NULL, buf + 16); - xy.greeny = png_get_fixed_point(NULL, buf + 20); - xy.bluex = png_get_fixed_point(NULL, buf + 24); - xy.bluey = png_get_fixed_point(NULL, buf + 28); - - if (xy.whitex == PNG_FIXED_ERROR || - xy.whitey == PNG_FIXED_ERROR || - xy.redx == PNG_FIXED_ERROR || - xy.redy == PNG_FIXED_ERROR || - xy.greenx == PNG_FIXED_ERROR || - xy.greeny == PNG_FIXED_ERROR || - xy.bluex == PNG_FIXED_ERROR || - xy.bluey == PNG_FIXED_ERROR) - { - png_chunk_benign_error(png_ptr, "invalid values"); - return; - } - - /* If a colorspace error has already been output skip this chunk */ - if (png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) - return; - - if (png_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) - { - png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID; - png_colorspace_sync(png_ptr, info_ptr); - png_chunk_benign_error(png_ptr, "duplicate"); - return; - } - - png_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM; - (void)png_colorspace_set_chromaticities(png_ptr, &png_ptr->colorspace, &xy, - 1/*prefer cHRM values*/); - png_colorspace_sync(png_ptr, info_ptr); -} -#endif - -#ifdef PNG_READ_sRGB_SUPPORTED -void /* PRIVATE */ -png_handle_sRGB(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_byte intent; - - png_debug(1, "in png_handle_sRGB"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - if (length != 1) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_crc_read(png_ptr, &intent, 1); - - if (png_crc_finish(png_ptr, 0)) - return; - - /* If a colorspace error has already been output skip this chunk */ - if (png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) - return; - - /* Only one sRGB or iCCP chunk is allowed, use the HAVE_INTENT flag to detect - * this. - */ - if (png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_INTENT) - { - png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID; - png_colorspace_sync(png_ptr, info_ptr); - png_chunk_benign_error(png_ptr, "too many profiles"); - return; - } - - (void)png_colorspace_set_sRGB(png_ptr, &png_ptr->colorspace, intent); - png_colorspace_sync(png_ptr, info_ptr); -} -#endif /* PNG_READ_sRGB_SUPPORTED */ - -#ifdef PNG_READ_iCCP_SUPPORTED -void /* PRIVATE */ -png_handle_iCCP(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -/* Note: this does not properly handle profiles that are > 64K under DOS */ -{ - png_const_charp errmsg = NULL; /* error message output, or no error */ - int finished = 0; /* crc checked */ - - png_debug(1, "in png_handle_iCCP"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & (PNG_HAVE_IDAT|PNG_HAVE_PLTE)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - /* Consistent with all the above colorspace handling an obviously *invalid* - * chunk is just ignored, so does not invalidate the color space. An - * alternative is to set the 'invalid' flags at the start of this routine - * and only clear them in they were not set before and all the tests pass. - * The minimum 'deflate' stream is assumed to be just the 2 byte header and 4 - * byte checksum. The keyword must be one character and there is a - * terminator (0) byte and the compression method. - */ - if (length < 9) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "too short"); - return; - } - - /* If a colorspace error has already been output skip this chunk */ - if (png_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) - { - png_crc_finish(png_ptr, length); - return; - } - - /* Only one sRGB or iCCP chunk is allowed, use the HAVE_INTENT flag to detect - * this. - */ - if ((png_ptr->colorspace.flags & PNG_COLORSPACE_HAVE_INTENT) == 0) - { - uInt read_length, keyword_length; - char keyword[81]; - - /* Find the keyword; the keyword plus separator and compression method - * bytes can be at most 81 characters long. - */ - read_length = 81; /* maximum */ - if (read_length > length) - read_length = (uInt)length; - - png_crc_read(png_ptr, (png_bytep)keyword, read_length); - length -= read_length; - - keyword_length = 0; - while (keyword_length < 80 && keyword_length < read_length && - keyword[keyword_length] != 0) - ++keyword_length; - - /* TODO: make the keyword checking common */ - if (keyword_length >= 1 && keyword_length <= 79) - { - /* We only understand '0' compression - deflate - so if we get a - * different value we can't safely decode the chunk. - */ - if (keyword_length+1 < read_length && - keyword[keyword_length+1] == PNG_COMPRESSION_TYPE_BASE) - { - read_length -= keyword_length+2; - - if (png_inflate_claim(png_ptr, png_iCCP, - png_ptr->flags & PNG_FLAG_BENIGN_ERRORS_WARN ? 15 : 0) == Z_OK) - { - unsigned char profile_header[132]; - unsigned char local_buffer[PNG_INFLATE_BUF_SIZE]; - png_alloc_size_t size = (sizeof profile_header); - - png_ptr->zstream.next_in = (Bytef*)keyword + (keyword_length+2); - png_ptr->zstream.avail_in = read_length; - (void)png_inflate_read(png_ptr, local_buffer, - (sizeof local_buffer), &length, profile_header, &size, - 0/*finish: don't, because the output is too small*/); - - if (size == 0) - { - /* We have the ICC profile header; do the basic header checks. - */ - const png_uint_32 profile_length = - png_get_uint_32(profile_header); - - if (png_icc_check_length(png_ptr, &png_ptr->colorspace, - keyword, profile_length)) - { - /* The length is apparently ok, so we can check the 132 - * byte header. - */ - if (png_icc_check_header(png_ptr, &png_ptr->colorspace, - keyword, profile_length, profile_header, - png_ptr->color_type)) - { - /* Now read the tag table; a variable size buffer is - * needed at this point, allocate one for the whole - * profile. The header check has already validated - * that none of these stuff will overflow. - */ - const png_uint_32 tag_count = png_get_uint_32( - profile_header+128); - png_bytep profile = png_read_buffer(png_ptr, - profile_length, 2/*silent*/); - - if (profile != NULL) - { - memcpy(profile, profile_header, - (sizeof profile_header)); - - size = 12 * tag_count; - - (void)png_inflate_read(png_ptr, local_buffer, - (sizeof local_buffer), &length, - profile + (sizeof profile_header), &size, 0); - - /* Still expect a a buffer error because we expect - * there to be some tag data! - */ - if (size == 0) - { - if (png_icc_check_tag_table(png_ptr, - &png_ptr->colorspace, keyword, profile_length, - profile)) - { - /* The profile has been validated for basic - * security issues, so read the whole thing in. - */ - size = profile_length - (sizeof profile_header) - - 12 * tag_count; - - (void)png_inflate_read(png_ptr, local_buffer, - (sizeof local_buffer), &length, - profile + (sizeof profile_header) + - 12 * tag_count, &size, 1/*finish*/); - - if (length > 0 && !(png_ptr->flags & - PNG_FLAG_BENIGN_ERRORS_WARN)) - errmsg = "extra compressed data"; - - /* But otherwise allow extra data: */ - else if (size == 0) - { - if (length > 0) - { - /* This can be handled completely, so - * keep going. - */ - png_chunk_warning(png_ptr, - "extra compressed data"); - } - - png_crc_finish(png_ptr, length); - finished = 1; - -# ifdef PNG_sRGB_SUPPORTED - /* Check for a match against sRGB */ - png_icc_set_sRGB(png_ptr, - &png_ptr->colorspace, profile, - png_ptr->zstream.adler); -# endif - - /* Steal the profile for info_ptr. */ - if (info_ptr != NULL) - { - png_free_data(png_ptr, info_ptr, - PNG_FREE_ICCP, 0); - - info_ptr->iccp_name = png_voidcast(char*, - png_malloc_base(png_ptr, - keyword_length+1)); - if (info_ptr->iccp_name != NULL) - { - memcpy(info_ptr->iccp_name, keyword, - keyword_length+1); - info_ptr->iccp_proflen = - profile_length; - info_ptr->iccp_profile = profile; - png_ptr->read_buffer = NULL; /*steal*/ - info_ptr->free_me |= PNG_FREE_ICCP; - info_ptr->valid |= PNG_INFO_iCCP; - } - - else - { - png_ptr->colorspace.flags |= - PNG_COLORSPACE_INVALID; - errmsg = "out of memory"; - } - } - - /* else the profile remains in the read - * buffer which gets reused for subsequent - * chunks. - */ - - if (info_ptr != NULL) - png_colorspace_sync(png_ptr, info_ptr); - - if (errmsg == NULL) - { - png_ptr->zowner = 0; - return; - } - } - - else if (size > 0) - errmsg = "truncated"; - - else - errmsg = png_ptr->zstream.msg; - } - - /* else png_icc_check_tag_table output an error */ - } - - else /* profile truncated */ - errmsg = png_ptr->zstream.msg; - } - - else - errmsg = "out of memory"; - } - - /* else png_icc_check_header output an error */ - } - - /* else png_icc_check_length output an error */ - } - - else /* profile truncated */ - errmsg = png_ptr->zstream.msg; - - /* Release the stream */ - png_ptr->zowner = 0; - } - - else /* png_inflate_claim failed */ - errmsg = png_ptr->zstream.msg; - } - - else - errmsg = "bad compression method"; /* or missing */ - } - - else - errmsg = "bad keyword"; - } - - else - errmsg = "too many profiles"; - - /* Failure: the reason is in 'errmsg' */ - if (!finished) - png_crc_finish(png_ptr, length); - - png_ptr->colorspace.flags |= PNG_COLORSPACE_INVALID; - png_colorspace_sync(png_ptr, info_ptr); - if (errmsg != NULL) /* else already output */ - png_chunk_benign_error(png_ptr, errmsg); -} -#endif /* PNG_READ_iCCP_SUPPORTED */ - -#ifdef PNG_READ_sPLT_SUPPORTED -void /* PRIVATE */ -png_handle_sPLT(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -/* Note: this does not properly handle chunks that are > 64K under DOS */ -{ - png_bytep entry_start, buffer; - png_sPLT_t new_palette; - png_sPLT_entryp pp; - png_uint_32 data_length; - int entry_size, i; - png_uint_32 skip = 0; - png_uint_32 dl; - png_size_t max_dl; - - png_debug(1, "in png_handle_sPLT"); - -#ifdef PNG_USER_LIMITS_SUPPORTED - if (png_ptr->user_chunk_cache_max != 0) - { - if (png_ptr->user_chunk_cache_max == 1) - { - png_crc_finish(png_ptr, length); - return; - } - - if (--png_ptr->user_chunk_cache_max == 1) - { - png_warning(png_ptr, "No space in chunk cache for sPLT"); - png_crc_finish(png_ptr, length); - return; - } - } -#endif - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - -#ifdef PNG_MAX_MALLOC_64K - if (length > 65535U) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "too large to fit in memory"); - return; - } -#endif - - buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/); - if (buffer == NULL) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of memory"); - return; - } - - - /* WARNING: this may break if size_t is less than 32 bits; it is assumed - * that the PNG_MAX_MALLOC_64K test is enabled in this case, but this is a - * potential breakage point if the types in pngconf.h aren't exactly right. - */ - png_crc_read(png_ptr, buffer, length); - - if (png_crc_finish(png_ptr, skip)) - return; - - buffer[length] = 0; - - for (entry_start = buffer; *entry_start; entry_start++) - /* Empty loop to find end of name */ ; - - ++entry_start; - - /* A sample depth should follow the separator, and we should be on it */ - if (entry_start > buffer + length - 2) - { - png_warning(png_ptr, "malformed sPLT chunk"); - return; - } - - new_palette.depth = *entry_start++; - entry_size = (new_palette.depth == 8 ? 6 : 10); - /* This must fit in a png_uint_32 because it is derived from the original - * chunk data length. - */ - data_length = length - (png_uint_32)(entry_start - buffer); - - /* Integrity-check the data length */ - if (data_length % entry_size) - { - png_warning(png_ptr, "sPLT chunk has bad length"); - return; - } - - dl = (png_int_32)(data_length / entry_size); - max_dl = PNG_SIZE_MAX / (sizeof (png_sPLT_entry)); - - if (dl > max_dl) - { - png_warning(png_ptr, "sPLT chunk too long"); - return; - } - - new_palette.nentries = (png_int_32)(data_length / entry_size); - - new_palette.entries = (png_sPLT_entryp)png_malloc_warn( - png_ptr, new_palette.nentries * (sizeof (png_sPLT_entry))); - - if (new_palette.entries == NULL) - { - png_warning(png_ptr, "sPLT chunk requires too much memory"); - return; - } - -#ifdef PNG_POINTER_INDEXING_SUPPORTED - for (i = 0; i < new_palette.nentries; i++) - { - pp = new_palette.entries + i; - - if (new_palette.depth == 8) - { - pp->red = *entry_start++; - pp->green = *entry_start++; - pp->blue = *entry_start++; - pp->alpha = *entry_start++; - } - - else - { - pp->red = png_get_uint_16(entry_start); entry_start += 2; - pp->green = png_get_uint_16(entry_start); entry_start += 2; - pp->blue = png_get_uint_16(entry_start); entry_start += 2; - pp->alpha = png_get_uint_16(entry_start); entry_start += 2; - } - - pp->frequency = png_get_uint_16(entry_start); entry_start += 2; - } -#else - pp = new_palette.entries; - - for (i = 0; i < new_palette.nentries; i++) - { - - if (new_palette.depth == 8) - { - pp[i].red = *entry_start++; - pp[i].green = *entry_start++; - pp[i].blue = *entry_start++; - pp[i].alpha = *entry_start++; - } - - else - { - pp[i].red = png_get_uint_16(entry_start); entry_start += 2; - pp[i].green = png_get_uint_16(entry_start); entry_start += 2; - pp[i].blue = png_get_uint_16(entry_start); entry_start += 2; - pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2; - } - - pp[i].frequency = png_get_uint_16(entry_start); entry_start += 2; - } -#endif - - /* Discard all chunk data except the name and stash that */ - new_palette.name = (png_charp)buffer; - - png_set_sPLT(png_ptr, info_ptr, &new_palette, 1); - - png_free(png_ptr, new_palette.entries); -} -#endif /* PNG_READ_sPLT_SUPPORTED */ - -#ifdef PNG_READ_tRNS_SUPPORTED -void /* PRIVATE */ -png_handle_tRNS(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_byte readbuf[PNG_MAX_PALETTE_LENGTH]; - - png_debug(1, "in png_handle_tRNS"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "duplicate"); - return; - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) - { - png_byte buf[2]; - - if (length != 2) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_crc_read(png_ptr, buf, 2); - png_ptr->num_trans = 1; - png_ptr->trans_color.gray = png_get_uint_16(buf); - } - - else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) - { - png_byte buf[6]; - - if (length != 6) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_crc_read(png_ptr, buf, length); - png_ptr->num_trans = 1; - png_ptr->trans_color.red = png_get_uint_16(buf); - png_ptr->trans_color.green = png_get_uint_16(buf + 2); - png_ptr->trans_color.blue = png_get_uint_16(buf + 4); - } - - else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (!(png_ptr->mode & PNG_HAVE_PLTE)) - { - /* TODO: is this actually an error in the ISO spec? */ - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - if (length > png_ptr->num_palette || length > PNG_MAX_PALETTE_LENGTH || - length == 0) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_crc_read(png_ptr, readbuf, length); - png_ptr->num_trans = (png_uint_16)length; - } - - else - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid with alpha channel"); - return; - } - - if (png_crc_finish(png_ptr, 0)) - { - png_ptr->num_trans = 0; - return; - } - - /* TODO: this is a horrible side effect in the palette case because the - * png_struct ends up with a pointer to the tRNS buffer owned by the - * png_info. Fix this. - */ - png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans, - &(png_ptr->trans_color)); -} -#endif - -#ifdef PNG_READ_bKGD_SUPPORTED -void /* PRIVATE */ -png_handle_bKGD(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - unsigned int truelen; - png_byte buf[6]; - png_color_16 background; - - png_debug(1, "in png_handle_bKGD"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if ((png_ptr->mode & PNG_HAVE_IDAT) || - (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE && - !(png_ptr->mode & PNG_HAVE_PLTE))) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "duplicate"); - return; - } - - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - truelen = 1; - - else if (png_ptr->color_type & PNG_COLOR_MASK_COLOR) - truelen = 6; - - else - truelen = 2; - - if (length != truelen) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_crc_read(png_ptr, buf, truelen); - - if (png_crc_finish(png_ptr, 0)) - return; - - /* We convert the index value into RGB components so that we can allow - * arbitrary RGB values for background when we have transparency, and - * so it is easy to determine the RGB values of the background color - * from the info_ptr struct. - */ - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - background.index = buf[0]; - - if (info_ptr && info_ptr->num_palette) - { - if (buf[0] >= info_ptr->num_palette) - { - png_chunk_benign_error(png_ptr, "invalid index"); - return; - } - - background.red = (png_uint_16)png_ptr->palette[buf[0]].red; - background.green = (png_uint_16)png_ptr->palette[buf[0]].green; - background.blue = (png_uint_16)png_ptr->palette[buf[0]].blue; - } - - else - background.red = background.green = background.blue = 0; - - background.gray = 0; - } - - else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */ - { - background.index = 0; - background.red = - background.green = - background.blue = - background.gray = png_get_uint_16(buf); - } - - else - { - background.index = 0; - background.red = png_get_uint_16(buf); - background.green = png_get_uint_16(buf + 2); - background.blue = png_get_uint_16(buf + 4); - background.gray = 0; - } - - png_set_bKGD(png_ptr, info_ptr, &background); -} -#endif - -#ifdef PNG_READ_hIST_SUPPORTED -void /* PRIVATE */ -png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - unsigned int num, i; - png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH]; - - png_debug(1, "in png_handle_hIST"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if ((png_ptr->mode & PNG_HAVE_IDAT) || !(png_ptr->mode & PNG_HAVE_PLTE)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "duplicate"); - return; - } - - num = length / 2 ; - - if (num != png_ptr->num_palette || num > PNG_MAX_PALETTE_LENGTH) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - for (i = 0; i < num; i++) - { - png_byte buf[2]; - - png_crc_read(png_ptr, buf, 2); - readbuf[i] = png_get_uint_16(buf); - } - - if (png_crc_finish(png_ptr, 0)) - return; - - png_set_hIST(png_ptr, info_ptr, readbuf); -} -#endif - -#ifdef PNG_READ_pHYs_SUPPORTED -void /* PRIVATE */ -png_handle_pHYs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_byte buf[9]; - png_uint_32 res_x, res_y; - int unit_type; - - png_debug(1, "in png_handle_pHYs"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "duplicate"); - return; - } - - if (length != 9) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_crc_read(png_ptr, buf, 9); - - if (png_crc_finish(png_ptr, 0)) - return; - - res_x = png_get_uint_32(buf); - res_y = png_get_uint_32(buf + 4); - unit_type = buf[8]; - png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type); -} -#endif - -#ifdef PNG_READ_oFFs_SUPPORTED -void /* PRIVATE */ -png_handle_oFFs(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_byte buf[9]; - png_int_32 offset_x, offset_y; - int unit_type; - - png_debug(1, "in png_handle_oFFs"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "duplicate"); - return; - } - - if (length != 9) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_crc_read(png_ptr, buf, 9); - - if (png_crc_finish(png_ptr, 0)) - return; - - offset_x = png_get_int_32(buf); - offset_y = png_get_int_32(buf + 4); - unit_type = buf[8]; - png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type); -} -#endif - -#ifdef PNG_READ_pCAL_SUPPORTED -/* Read the pCAL chunk (described in the PNG Extensions document) */ -void /* PRIVATE */ -png_handle_pCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_int_32 X0, X1; - png_byte type, nparams; - png_bytep buffer, buf, units, endptr; - png_charpp params; - int i; - - png_debug(1, "in png_handle_pCAL"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "duplicate"); - return; - } - - png_debug1(2, "Allocating and reading pCAL chunk data (%u bytes)", - length + 1); - - buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/); - - if (buffer == NULL) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of memory"); - return; - } - - png_crc_read(png_ptr, buffer, length); - - if (png_crc_finish(png_ptr, 0)) - return; - - buffer[length] = 0; /* Null terminate the last string */ - - png_debug(3, "Finding end of pCAL purpose string"); - for (buf = buffer; *buf; buf++) - /* Empty loop */ ; - - endptr = buffer + length; - - /* We need to have at least 12 bytes after the purpose string - * in order to get the parameter information. - */ - if (endptr <= buf + 12) - { - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_debug(3, "Reading pCAL X0, X1, type, nparams, and units"); - X0 = png_get_int_32((png_bytep)buf+1); - X1 = png_get_int_32((png_bytep)buf+5); - type = buf[9]; - nparams = buf[10]; - units = buf + 11; - - png_debug(3, "Checking pCAL equation type and number of parameters"); - /* Check that we have the right number of parameters for known - * equation types. - */ - if ((type == PNG_EQUATION_LINEAR && nparams != 2) || - (type == PNG_EQUATION_BASE_E && nparams != 3) || - (type == PNG_EQUATION_ARBITRARY && nparams != 3) || - (type == PNG_EQUATION_HYPERBOLIC && nparams != 4)) - { - png_chunk_benign_error(png_ptr, "invalid parameter count"); - return; - } - - else if (type >= PNG_EQUATION_LAST) - { - png_chunk_benign_error(png_ptr, "unrecognized equation type"); - } - - for (buf = units; *buf; buf++) - /* Empty loop to move past the units string. */ ; - - png_debug(3, "Allocating pCAL parameters array"); - - params = png_voidcast(png_charpp, png_malloc_warn(png_ptr, - nparams * (sizeof (png_charp)))); - - if (params == NULL) - { - png_chunk_benign_error(png_ptr, "out of memory"); - return; - } - - /* Get pointers to the start of each parameter string. */ - for (i = 0; i < nparams; i++) - { - buf++; /* Skip the null string terminator from previous parameter. */ - - png_debug1(3, "Reading pCAL parameter %d", i); - - for (params[i] = (png_charp)buf; buf <= endptr && *buf != 0; buf++) - /* Empty loop to move past each parameter string */ ; - - /* Make sure we haven't run out of data yet */ - if (buf > endptr) - { - png_free(png_ptr, params); - png_chunk_benign_error(png_ptr, "invalid data"); - return; - } - } - - png_set_pCAL(png_ptr, info_ptr, (png_charp)buffer, X0, X1, type, nparams, - (png_charp)units, params); - - png_free(png_ptr, params); -} -#endif - -#ifdef PNG_READ_sCAL_SUPPORTED -/* Read the sCAL chunk */ -void /* PRIVATE */ -png_handle_sCAL(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_bytep buffer; - png_size_t i; - int state; - - png_debug(1, "in png_handle_sCAL"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (png_ptr->mode & PNG_HAVE_IDAT) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of place"); - return; - } - - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "duplicate"); - return; - } - - /* Need unit type, width, \0, height: minimum 4 bytes */ - else if (length < 4) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_debug1(2, "Allocating and reading sCAL chunk data (%u bytes)", - length + 1); - - buffer = png_read_buffer(png_ptr, length+1, 2/*silent*/); - - if (buffer == NULL) - { - png_chunk_benign_error(png_ptr, "out of memory"); - png_crc_finish(png_ptr, length); - return; - } - - png_crc_read(png_ptr, buffer, length); - buffer[length] = 0; /* Null terminate the last string */ - - if (png_crc_finish(png_ptr, 0)) - return; - - /* Validate the unit. */ - if (buffer[0] != 1 && buffer[0] != 2) - { - png_chunk_benign_error(png_ptr, "invalid unit"); - return; - } - - /* Validate the ASCII numbers, need two ASCII numbers separated by - * a '\0' and they need to fit exactly in the chunk data. - */ - i = 1; - state = 0; - - if (!png_check_fp_number((png_const_charp)buffer, length, &state, &i) || - i >= length || buffer[i++] != 0) - png_chunk_benign_error(png_ptr, "bad width format"); - - else if (!PNG_FP_IS_POSITIVE(state)) - png_chunk_benign_error(png_ptr, "non-positive width"); - - else - { - png_size_t heighti = i; - - state = 0; - if (!png_check_fp_number((png_const_charp)buffer, length, &state, &i) || - i != length) - png_chunk_benign_error(png_ptr, "bad height format"); - - else if (!PNG_FP_IS_POSITIVE(state)) - png_chunk_benign_error(png_ptr, "non-positive height"); - - else - /* This is the (only) success case. */ - png_set_sCAL_s(png_ptr, info_ptr, buffer[0], - (png_charp)buffer+1, (png_charp)buffer+heighti); - } -} -#endif - -#ifdef PNG_READ_tIME_SUPPORTED -void /* PRIVATE */ -png_handle_tIME(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_byte buf[7]; - png_time mod_time; - - png_debug(1, "in png_handle_tIME"); - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "duplicate"); - return; - } - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - - if (length != 7) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "invalid"); - return; - } - - png_crc_read(png_ptr, buf, 7); - - if (png_crc_finish(png_ptr, 0)) - return; - - mod_time.second = buf[6]; - mod_time.minute = buf[5]; - mod_time.hour = buf[4]; - mod_time.day = buf[3]; - mod_time.month = buf[2]; - mod_time.year = png_get_uint_16(buf); - - png_set_tIME(png_ptr, info_ptr, &mod_time); -} -#endif - -#ifdef PNG_READ_tEXt_SUPPORTED -/* Note: this does not properly handle chunks that are > 64K under DOS */ -void /* PRIVATE */ -png_handle_tEXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_text text_info; - png_bytep buffer; - png_charp key; - png_charp text; - png_uint_32 skip = 0; - - png_debug(1, "in png_handle_tEXt"); - -#ifdef PNG_USER_LIMITS_SUPPORTED - if (png_ptr->user_chunk_cache_max != 0) - { - if (png_ptr->user_chunk_cache_max == 1) - { - png_crc_finish(png_ptr, length); - return; - } - - if (--png_ptr->user_chunk_cache_max == 1) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "no space in chunk cache"); - return; - } - } -#endif - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - -#ifdef PNG_MAX_MALLOC_64K - if (length > 65535U) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "too large to fit in memory"); - return; - } -#endif - - buffer = png_read_buffer(png_ptr, length+1, 1/*warn*/); - - if (buffer == NULL) - { - png_chunk_benign_error(png_ptr, "out of memory"); - return; - } - - png_crc_read(png_ptr, buffer, length); - - if (png_crc_finish(png_ptr, skip)) - return; - - key = (png_charp)buffer; - key[length] = 0; - - for (text = key; *text; text++) - /* Empty loop to find end of key */ ; - - if (text != key + length) - text++; - - text_info.compression = PNG_TEXT_COMPRESSION_NONE; - text_info.key = key; - text_info.lang = NULL; - text_info.lang_key = NULL; - text_info.itxt_length = 0; - text_info.text = text; - text_info.text_length = strlen(text); - - if (png_set_text_2(png_ptr, info_ptr, &text_info, 1)) - png_warning(png_ptr, "Insufficient memory to process text chunk"); -} -#endif - -#ifdef PNG_READ_zTXt_SUPPORTED -/* Note: this does not correctly handle chunks that are > 64K under DOS */ -void /* PRIVATE */ -png_handle_zTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_const_charp errmsg = NULL; - png_bytep buffer; - png_uint_32 keyword_length; - - png_debug(1, "in png_handle_zTXt"); - -#ifdef PNG_USER_LIMITS_SUPPORTED - if (png_ptr->user_chunk_cache_max != 0) - { - if (png_ptr->user_chunk_cache_max == 1) - { - png_crc_finish(png_ptr, length); - return; - } - - if (--png_ptr->user_chunk_cache_max == 1) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "no space in chunk cache"); - return; - } - } -#endif - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - - buffer = png_read_buffer(png_ptr, length, 2/*silent*/); - - if (buffer == NULL) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of memory"); - return; - } - - png_crc_read(png_ptr, buffer, length); - - if (png_crc_finish(png_ptr, 0)) - return; - - /* TODO: also check that the keyword contents match the spec! */ - for (keyword_length = 0; - keyword_length < length && buffer[keyword_length] != 0; - ++keyword_length) - /* Empty loop to find end of name */ ; - - if (keyword_length > 79 || keyword_length < 1) - errmsg = "bad keyword"; - - /* zTXt must have some LZ data after the keyword, although it may expand to - * zero bytes; we need a '\0' at the end of the keyword, the compression type - * then the LZ data: - */ - else if (keyword_length + 3 > length) - errmsg = "truncated"; - - else if (buffer[keyword_length+1] != PNG_COMPRESSION_TYPE_BASE) - errmsg = "unknown compression type"; - - else - { - png_alloc_size_t uncompressed_length = PNG_SIZE_MAX; - - /* TODO: at present png_decompress_chunk imposes a single application - * level memory limit, this should be split to different values for iCCP - * and text chunks. - */ - if (png_decompress_chunk(png_ptr, length, keyword_length+2, - &uncompressed_length, 1/*terminate*/) == Z_STREAM_END) - { - png_text text; - - /* It worked; png_ptr->read_buffer now looks like a tEXt chunk except - * for the extra compression type byte and the fact that it isn't - * necessarily '\0' terminated. - */ - buffer = png_ptr->read_buffer; - buffer[uncompressed_length+(keyword_length+2)] = 0; - - text.compression = PNG_TEXT_COMPRESSION_zTXt; - text.key = (png_charp)buffer; - text.text = (png_charp)(buffer + keyword_length+2); - text.text_length = uncompressed_length; - text.itxt_length = 0; - text.lang = NULL; - text.lang_key = NULL; - - if (png_set_text_2(png_ptr, info_ptr, &text, 1)) - errmsg = "insufficient memory"; - } - - else - errmsg = png_ptr->zstream.msg; - } - - if (errmsg != NULL) - png_chunk_benign_error(png_ptr, errmsg); -} -#endif - -#ifdef PNG_READ_iTXt_SUPPORTED -/* Note: this does not correctly handle chunks that are > 64K under DOS */ -void /* PRIVATE */ -png_handle_iTXt(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) -{ - png_const_charp errmsg = NULL; - png_bytep buffer; - png_uint_32 prefix_length; - - png_debug(1, "in png_handle_iTXt"); - -#ifdef PNG_USER_LIMITS_SUPPORTED - if (png_ptr->user_chunk_cache_max != 0) - { - if (png_ptr->user_chunk_cache_max == 1) - { - png_crc_finish(png_ptr, length); - return; - } - - if (--png_ptr->user_chunk_cache_max == 1) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "no space in chunk cache"); - return; - } - } -#endif - - if (!(png_ptr->mode & PNG_HAVE_IHDR)) - png_chunk_error(png_ptr, "missing IHDR"); - - if (png_ptr->mode & PNG_HAVE_IDAT) - png_ptr->mode |= PNG_AFTER_IDAT; - - buffer = png_read_buffer(png_ptr, length+1, 1/*warn*/); - - if (buffer == NULL) - { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "out of memory"); - return; - } - - png_crc_read(png_ptr, buffer, length); - - if (png_crc_finish(png_ptr, 0)) - return; - - /* First the keyword. */ - for (prefix_length=0; - prefix_length < length && buffer[prefix_length] != 0; - ++prefix_length) - /* Empty loop */ ; - - /* Perform a basic check on the keyword length here. */ - if (prefix_length > 79 || prefix_length < 1) - errmsg = "bad keyword"; - - /* Expect keyword, compression flag, compression type, language, translated - * keyword (both may be empty but are 0 terminated) then the text, which may - * be empty. - */ - else if (prefix_length + 5 > length) - errmsg = "truncated"; - - else if (buffer[prefix_length+1] == 0 || - (buffer[prefix_length+1] == 1 && - buffer[prefix_length+2] == PNG_COMPRESSION_TYPE_BASE)) - { - int compressed = buffer[prefix_length+1] != 0; - png_uint_32 language_offset, translated_keyword_offset; - png_alloc_size_t uncompressed_length = 0; - - /* Now the language tag */ - prefix_length += 3; - language_offset = prefix_length; - - for (; prefix_length < length && buffer[prefix_length] != 0; - ++prefix_length) - /* Empty loop */ ; - - /* WARNING: the length may be invalid here, this is checked below. */ - translated_keyword_offset = ++prefix_length; - - for (; prefix_length < length && buffer[prefix_length] != 0; - ++prefix_length) - /* Empty loop */ ; - - /* prefix_length should now be at the trailing '\0' of the translated - * keyword, but it may already be over the end. None of this arithmetic - * can overflow because chunks are at most 2^31 bytes long, but on 16-bit - * systems the available allocaton may overflow. - */ - ++prefix_length; - - if (!compressed && prefix_length <= length) - uncompressed_length = length - prefix_length; - - else if (compressed && prefix_length < length) - { - uncompressed_length = PNG_SIZE_MAX; - - /* TODO: at present png_decompress_chunk imposes a single application - * level memory limit, this should be split to different values for - * iCCP and text chunks. - */ - if (png_decompress_chunk(png_ptr, length, prefix_length, - &uncompressed_length, 1/*terminate*/) == Z_STREAM_END) - buffer = png_ptr->read_buffer; - - else - errmsg = png_ptr->zstream.msg; - } - - else - errmsg = "truncated"; - - if (errmsg == NULL) - { - png_text text; - - buffer[uncompressed_length+prefix_length] = 0; - - if (compressed) - text.compression = PNG_ITXT_COMPRESSION_NONE; - - else - text.compression = PNG_ITXT_COMPRESSION_zTXt; - - text.key = (png_charp)buffer; - text.lang = (png_charp)buffer + language_offset; - text.lang_key = (png_charp)buffer + translated_keyword_offset; - text.text = (png_charp)buffer + prefix_length; - text.text_length = 0; - text.itxt_length = uncompressed_length; - - if (png_set_text_2(png_ptr, info_ptr, &text, 1)) - errmsg = "insufficient memory"; - } - } - - else - errmsg = "bad compression info"; - - if (errmsg != NULL) - png_chunk_benign_error(png_ptr, errmsg); -} -#endif - -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED -/* Utility function for png_handle_unknown; set up png_ptr::unknown_chunk */ -static int -png_cache_unknown_chunk(png_structrp png_ptr, png_uint_32 length) -{ - png_alloc_size_t limit = PNG_SIZE_MAX; - - if (png_ptr->unknown_chunk.data != NULL) - { - png_free(png_ptr, png_ptr->unknown_chunk.data); - png_ptr->unknown_chunk.data = NULL; - } - -# ifdef PNG_SET_CHUNK_MALLOC_LIMIT_SUPPORTED - if (png_ptr->user_chunk_malloc_max > 0 && - png_ptr->user_chunk_malloc_max < limit) - limit = png_ptr->user_chunk_malloc_max; - -# elif PNG_USER_CHUNK_MALLOC_MAX > 0 - if (PNG_USER_CHUNK_MALLOC_MAX < limit) - limit = PNG_USER_CHUNK_MALLOC_MAX; -# endif - - if (length <= limit) - { - PNG_CSTRING_FROM_CHUNK(png_ptr->unknown_chunk.name, png_ptr->chunk_name); - /* The following is safe because of the PNG_SIZE_MAX init above */ - png_ptr->unknown_chunk.size = (png_size_t)length/*SAFE*/; - /* 'mode' is a flag array, only the bottom four bits matter here */ - png_ptr->unknown_chunk.location = (png_byte)png_ptr->mode/*SAFE*/; - - if (length == 0) - png_ptr->unknown_chunk.data = NULL; - - else - { - /* Do a 'warn' here - it is handled below. */ - png_ptr->unknown_chunk.data = png_voidcast(png_bytep, - png_malloc_warn(png_ptr, length)); - } - } - - if (png_ptr->unknown_chunk.data == NULL && length > 0) - { - /* This is benign because we clean up correctly */ - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "unknown chunk exceeds memory limits"); - return 0; - } - - else - { - if (length > 0) - png_crc_read(png_ptr, png_ptr->unknown_chunk.data, length); - png_crc_finish(png_ptr, 0); - return 1; - } -} -#endif /* PNG_READ_UNKNOWN_CHUNKS_SUPPORTED */ - -/* Handle an unknown, or known but disabled, chunk */ -void /* PRIVATE */ -png_handle_unknown(png_structrp png_ptr, png_inforp info_ptr, - png_uint_32 length, int keep) -{ - int handled = 0; /* the chunk was handled */ - - png_debug(1, "in png_handle_unknown"); - -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED - /* NOTE: this code is based on the code in libpng-1.4.12 except for fixing - * the bug which meant that setting a non-default behavior for a specific - * chunk would be ignored (the default was always used unless a user - * callback was installed). - * - * 'keep' is the value from the png_chunk_unknown_handling, the setting for - * this specific chunk_name, if PNG_HANDLE_AS_UNKNOWN_SUPPORTED, if not it - * will always be PNG_HANDLE_CHUNK_AS_DEFAULT and it needs to be set here. - * This is just an optimization to avoid multiple calls to the lookup - * function. - */ -# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED - keep = png_chunk_unknown_handling(png_ptr, png_ptr->chunk_name); -# endif -# endif - - /* One of the following methods will read the chunk or skip it (at least one - * of these is always defined because this is the only way to switch on - * PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) - */ -# ifdef PNG_READ_USER_CHUNKS_SUPPORTED - /* The user callback takes precedence over the chunk keep value, but the - * keep value is still required to validate a save of a critical chunk. - */ - if (png_ptr->read_user_chunk_fn != NULL) - { - if (png_cache_unknown_chunk(png_ptr, length)) - { - /* Callback to user unknown chunk handler */ - int ret = (*(png_ptr->read_user_chunk_fn))(png_ptr, - &png_ptr->unknown_chunk); - - /* ret is: - * negative: An error occured, png_chunk_error will be called. - * zero: The chunk was not handled, the chunk will be discarded - * unless png_set_keep_unknown_chunks has been used to set - * a 'keep' behavior for this particular chunk, in which - * case that will be used. A critical chunk will cause an - * error at this point unless it is to be saved. - * positive: The chunk was handled, libpng will ignore/discard it. - */ - if (ret < 0) - png_chunk_error(png_ptr, "error in user chunk"); - - else if (ret == 0) - { - /* If the keep value is 'default' or 'never' override it, but - * still error out on critical chunks unless the keep value is - * 'always' While this is weird it is the behavior in 1.4.12. - * A possible improvement would be to obey the value set for the - * chunk, but this would be an API change that would probably - * damage some applications. - * - * The png_app_warning below catches the case that matters, where - * the application has not set specific save or ignore for this - * chunk or global save or ignore. - */ - if (keep < PNG_HANDLE_CHUNK_IF_SAFE) - { -# ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED - if (png_ptr->unknown_default < PNG_HANDLE_CHUNK_IF_SAFE) - { - png_chunk_warning(png_ptr, "Saving unknown chunk:"); - png_app_warning(png_ptr, - "forcing save of an unhandled chunk;" - " please call png_set_keep_unknown_chunks"); - /* with keep = PNG_HANDLE_CHUNK_IF_SAFE */ - } -# endif - keep = PNG_HANDLE_CHUNK_IF_SAFE; - } - } - - else /* chunk was handled */ - { - handled = 1; - /* Critical chunks can be safely discarded at this point. */ - keep = PNG_HANDLE_CHUNK_NEVER; - } - } - - else - keep = PNG_HANDLE_CHUNK_NEVER; /* insufficient memory */ - } - - else - /* Use the SAVE_UNKNOWN_CHUNKS code or skip the chunk */ -# endif /* PNG_READ_USER_CHUNKS_SUPPORTED */ - -# ifdef PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED - { - /* keep is currently just the per-chunk setting, if there was no - * setting change it to the global default now (not that this may - * still be AS_DEFAULT) then obtain the cache of the chunk if required, - * if not simply skip the chunk. - */ - if (keep == PNG_HANDLE_CHUNK_AS_DEFAULT) - keep = png_ptr->unknown_default; - - if (keep == PNG_HANDLE_CHUNK_ALWAYS || - (keep == PNG_HANDLE_CHUNK_IF_SAFE && - PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name))) - { - if (!png_cache_unknown_chunk(png_ptr, length)) - keep = PNG_HANDLE_CHUNK_NEVER; - } - - else - png_crc_finish(png_ptr, length); - } -# else -# ifndef PNG_READ_USER_CHUNKS_SUPPORTED -# error no method to support READ_UNKNOWN_CHUNKS -# endif - - { - /* If here there is no read callback pointer set and no support is - * compiled in to just save the unknown chunks, so simply skip this - * chunk. If 'keep' is something other than AS_DEFAULT or NEVER then - * the app has erroneously asked for unknown chunk saving when there - * is no support. - */ - if (keep > PNG_HANDLE_CHUNK_NEVER) - png_app_error(png_ptr, "no unknown chunk support available"); - - png_crc_finish(png_ptr, length); - } -# endif - -# ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED - /* Now store the chunk in the chunk list if appropriate, and if the limits - * permit it. - */ - if (keep == PNG_HANDLE_CHUNK_ALWAYS || - (keep == PNG_HANDLE_CHUNK_IF_SAFE && - PNG_CHUNK_ANCILLIARY(png_ptr->chunk_name))) - { -# ifdef PNG_USER_LIMITS_SUPPORTED - switch (png_ptr->user_chunk_cache_max) - { - case 2: - png_ptr->user_chunk_cache_max = 1; - png_chunk_benign_error(png_ptr, "no space in chunk cache"); - /* FALL THROUGH */ - case 1: - /* NOTE: prior to 1.6.0 this case resulted in an unknown critical - * chunk being skipped, now there will be a hard error below. - */ - break; - - default: /* not at limit */ - --(png_ptr->user_chunk_cache_max); - /* FALL THROUGH */ - case 0: /* no limit */ -# endif /* PNG_USER_LIMITS_SUPPORTED */ - /* Here when the limit isn't reached or when limits are compiled - * out; store the chunk. - */ - png_set_unknown_chunks(png_ptr, info_ptr, - &png_ptr->unknown_chunk, 1); - handled = 1; -# ifdef PNG_USER_LIMITS_SUPPORTED - break; - } -# endif - } -# else /* no store support! */ - PNG_UNUSED(info_ptr) -# error untested code (reading unknown chunks with no store support) -# endif - - /* Regardless of the error handling below the cached data (if any) can be - * freed now. Notice that the data is not freed if there is a png_error, but - * it will be freed by destroy_read_struct. - */ - if (png_ptr->unknown_chunk.data != NULL) - png_free(png_ptr, png_ptr->unknown_chunk.data); - png_ptr->unknown_chunk.data = NULL; - -#else /* !PNG_READ_UNKNOWN_CHUNKS_SUPPORTED */ - /* There is no support to read an unknown chunk, so just skip it. */ - png_crc_finish(png_ptr, length); - PNG_UNUSED(info_ptr) - PNG_UNUSED(keep) -#endif /* !PNG_READ_UNKNOWN_CHUNKS_SUPPORTED */ - - /* Check for unhandled critical chunks */ - if (!handled && PNG_CHUNK_CRITICAL(png_ptr->chunk_name)) - png_chunk_error(png_ptr, "unhandled critical chunk"); -} - -/* This function is called to verify that a chunk name is valid. - * This function can't have the "critical chunk check" incorporated - * into it, since in the future we will need to be able to call user - * functions to handle unknown critical chunks after we check that - * the chunk name itself is valid. - */ - -/* Bit hacking: the test for an invalid byte in the 4 byte chunk name is: - * - * ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97)) - */ - -void /* PRIVATE */ -png_check_chunk_name(png_structrp png_ptr, png_uint_32 chunk_name) -{ - int i; - - png_debug(1, "in png_check_chunk_name"); - - for (i=1; i<=4; ++i) - { - int c = chunk_name & 0xff; - - if (c < 65 || c > 122 || (c > 90 && c < 97)) - png_chunk_error(png_ptr, "invalid chunk type"); - - chunk_name >>= 8; - } -} - -/* Combines the row recently read in with the existing pixels in the row. This - * routine takes care of alpha and transparency if requested. This routine also - * handles the two methods of progressive display of interlaced images, - * depending on the 'display' value; if 'display' is true then the whole row - * (dp) is filled from the start by replicating the available pixels. If - * 'display' is false only those pixels present in the pass are filled in. - */ -void /* PRIVATE */ -png_combine_row(png_const_structrp png_ptr, png_bytep dp, int display) -{ - unsigned int pixel_depth = png_ptr->transformed_pixel_depth; - png_const_bytep sp = png_ptr->row_buf + 1; - png_uint_32 row_width = png_ptr->width; - unsigned int pass = png_ptr->pass; - png_bytep end_ptr = 0; - png_byte end_byte = 0; - unsigned int end_mask; - - png_debug(1, "in png_combine_row"); - - /* Added in 1.5.6: it should not be possible to enter this routine until at - * least one row has been read from the PNG data and transformed. - */ - if (pixel_depth == 0) - png_error(png_ptr, "internal row logic error"); - - /* Added in 1.5.4: the pixel depth should match the information returned by - * any call to png_read_update_info at this point. Do not continue if we got - * this wrong. - */ - if (png_ptr->info_rowbytes != 0 && png_ptr->info_rowbytes != - PNG_ROWBYTES(pixel_depth, row_width)) - png_error(png_ptr, "internal row size calculation error"); - - /* Don't expect this to ever happen: */ - if (row_width == 0) - png_error(png_ptr, "internal row width error"); - - /* Preserve the last byte in cases where only part of it will be overwritten, - * the multiply below may overflow, we don't care because ANSI-C guarantees - * we get the low bits. - */ - end_mask = (pixel_depth * row_width) & 7; - if (end_mask != 0) - { - /* end_ptr == NULL is a flag to say do nothing */ - end_ptr = dp + PNG_ROWBYTES(pixel_depth, row_width) - 1; - end_byte = *end_ptr; -# ifdef PNG_READ_PACKSWAP_SUPPORTED - if (png_ptr->transformations & PNG_PACKSWAP) /* little-endian byte */ - end_mask = 0xff << end_mask; - - else /* big-endian byte */ -# endif - end_mask = 0xff >> end_mask; - /* end_mask is now the bits to *keep* from the destination row */ - } - - /* For non-interlaced images this reduces to a memcpy(). A memcpy() - * will also happen if interlacing isn't supported or if the application - * does not call png_set_interlace_handling(). In the latter cases the - * caller just gets a sequence of the unexpanded rows from each interlace - * pass. - */ -#ifdef PNG_READ_INTERLACING_SUPPORTED - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE) && - pass < 6 && (display == 0 || - /* The following copies everything for 'display' on passes 0, 2 and 4. */ - (display == 1 && (pass & 1) != 0))) - { - /* Narrow images may have no bits in a pass; the caller should handle - * this, but this test is cheap: - */ - if (row_width <= PNG_PASS_START_COL(pass)) - return; - - if (pixel_depth < 8) - { - /* For pixel depths up to 4 bpp the 8-pixel mask can be expanded to fit - * into 32 bits, then a single loop over the bytes using the four byte - * values in the 32-bit mask can be used. For the 'display' option the - * expanded mask may also not require any masking within a byte. To - * make this work the PACKSWAP option must be taken into account - it - * simply requires the pixels to be reversed in each byte. - * - * The 'regular' case requires a mask for each of the first 6 passes, - * the 'display' case does a copy for the even passes in the range - * 0..6. This has already been handled in the test above. - * - * The masks are arranged as four bytes with the first byte to use in - * the lowest bits (little-endian) regardless of the order (PACKSWAP or - * not) of the pixels in each byte. - * - * NOTE: the whole of this logic depends on the caller of this function - * only calling it on rows appropriate to the pass. This function only - * understands the 'x' logic; the 'y' logic is handled by the caller. - * - * The following defines allow generation of compile time constant bit - * masks for each pixel depth and each possibility of swapped or not - * swapped bytes. Pass 'p' is in the range 0..6; 'x', a pixel index, - * is in the range 0..7; and the result is 1 if the pixel is to be - * copied in the pass, 0 if not. 'S' is for the sparkle method, 'B' - * for the block method. - * - * With some compilers a compile time expression of the general form: - * - * (shift >= 32) ? (a >> (shift-32)) : (b >> shift) - * - * Produces warnings with values of 'shift' in the range 33 to 63 - * because the right hand side of the ?: expression is evaluated by - * the compiler even though it isn't used. Microsoft Visual C (various - * versions) and the Intel C compiler are known to do this. To avoid - * this the following macros are used in 1.5.6. This is a temporary - * solution to avoid destabilizing the code during the release process. - */ -# if PNG_USE_COMPILE_TIME_MASKS -# define PNG_LSR(x,s) ((x)>>((s) & 0x1f)) -# define PNG_LSL(x,s) ((x)<<((s) & 0x1f)) -# else -# define PNG_LSR(x,s) ((x)>>(s)) -# define PNG_LSL(x,s) ((x)<<(s)) -# endif -# define S_COPY(p,x) (((p)<4 ? PNG_LSR(0x80088822,(3-(p))*8+(7-(x))) :\ - PNG_LSR(0xaa55ff00,(7-(p))*8+(7-(x)))) & 1) -# define B_COPY(p,x) (((p)<4 ? PNG_LSR(0xff0fff33,(3-(p))*8+(7-(x))) :\ - PNG_LSR(0xff55ff00,(7-(p))*8+(7-(x)))) & 1) - - /* Return a mask for pass 'p' pixel 'x' at depth 'd'. The mask is - * little endian - the first pixel is at bit 0 - however the extra - * parameter 's' can be set to cause the mask position to be swapped - * within each byte, to match the PNG format. This is done by XOR of - * the shift with 7, 6 or 4 for bit depths 1, 2 and 4. - */ -# define PIXEL_MASK(p,x,d,s) \ - (PNG_LSL(((PNG_LSL(1U,(d)))-1),(((x)*(d))^((s)?8-(d):0)))) - - /* Hence generate the appropriate 'block' or 'sparkle' pixel copy mask. - */ -# define S_MASKx(p,x,d,s) (S_COPY(p,x)?PIXEL_MASK(p,x,d,s):0) -# define B_MASKx(p,x,d,s) (B_COPY(p,x)?PIXEL_MASK(p,x,d,s):0) - - /* Combine 8 of these to get the full mask. For the 1-bpp and 2-bpp - * cases the result needs replicating, for the 4-bpp case the above - * generates a full 32 bits. - */ -# define MASK_EXPAND(m,d) ((m)*((d)==1?0x01010101:((d)==2?0x00010001:1))) - -# define S_MASK(p,d,s) MASK_EXPAND(S_MASKx(p,0,d,s) + S_MASKx(p,1,d,s) +\ - S_MASKx(p,2,d,s) + S_MASKx(p,3,d,s) + S_MASKx(p,4,d,s) +\ - S_MASKx(p,5,d,s) + S_MASKx(p,6,d,s) + S_MASKx(p,7,d,s), d) - -# define B_MASK(p,d,s) MASK_EXPAND(B_MASKx(p,0,d,s) + B_MASKx(p,1,d,s) +\ - B_MASKx(p,2,d,s) + B_MASKx(p,3,d,s) + B_MASKx(p,4,d,s) +\ - B_MASKx(p,5,d,s) + B_MASKx(p,6,d,s) + B_MASKx(p,7,d,s), d) - -#if PNG_USE_COMPILE_TIME_MASKS - /* Utility macros to construct all the masks for a depth/swap - * combination. The 's' parameter says whether the format is PNG - * (big endian bytes) or not. Only the three odd-numbered passes are - * required for the display/block algorithm. - */ -# define S_MASKS(d,s) { S_MASK(0,d,s), S_MASK(1,d,s), S_MASK(2,d,s),\ - S_MASK(3,d,s), S_MASK(4,d,s), S_MASK(5,d,s) } - -# define B_MASKS(d,s) { B_MASK(1,d,s), S_MASK(3,d,s), S_MASK(5,d,s) } - -# define DEPTH_INDEX(d) ((d)==1?0:((d)==2?1:2)) - - /* Hence the pre-compiled masks indexed by PACKSWAP (or not), depth and - * then pass: - */ - static PNG_CONST png_uint_32 row_mask[2/*PACKSWAP*/][3/*depth*/][6] = - { - /* Little-endian byte masks for PACKSWAP */ - { S_MASKS(1,0), S_MASKS(2,0), S_MASKS(4,0) }, - /* Normal (big-endian byte) masks - PNG format */ - { S_MASKS(1,1), S_MASKS(2,1), S_MASKS(4,1) } - }; - - /* display_mask has only three entries for the odd passes, so index by - * pass>>1. - */ - static PNG_CONST png_uint_32 display_mask[2][3][3] = - { - /* Little-endian byte masks for PACKSWAP */ - { B_MASKS(1,0), B_MASKS(2,0), B_MASKS(4,0) }, - /* Normal (big-endian byte) masks - PNG format */ - { B_MASKS(1,1), B_MASKS(2,1), B_MASKS(4,1) } - }; - -# define MASK(pass,depth,display,png)\ - ((display)?display_mask[png][DEPTH_INDEX(depth)][pass>>1]:\ - row_mask[png][DEPTH_INDEX(depth)][pass]) - -#else /* !PNG_USE_COMPILE_TIME_MASKS */ - /* This is the runtime alternative: it seems unlikely that this will - * ever be either smaller or faster than the compile time approach. - */ -# define MASK(pass,depth,display,png)\ - ((display)?B_MASK(pass,depth,png):S_MASK(pass,depth,png)) -#endif /* !PNG_USE_COMPILE_TIME_MASKS */ - - /* Use the appropriate mask to copy the required bits. In some cases - * the byte mask will be 0 or 0xff, optimize these cases. row_width is - * the number of pixels, but the code copies bytes, so it is necessary - * to special case the end. - */ - png_uint_32 pixels_per_byte = 8 / pixel_depth; - png_uint_32 mask; - -# ifdef PNG_READ_PACKSWAP_SUPPORTED - if (png_ptr->transformations & PNG_PACKSWAP) - mask = MASK(pass, pixel_depth, display, 0); - - else -# endif - mask = MASK(pass, pixel_depth, display, 1); - - for (;;) - { - png_uint_32 m; - - /* It doesn't matter in the following if png_uint_32 has more than - * 32 bits because the high bits always match those in m<<24; it is, - * however, essential to use OR here, not +, because of this. - */ - m = mask; - mask = (m >> 8) | (m << 24); /* rotate right to good compilers */ - m &= 0xff; - - if (m != 0) /* something to copy */ - { - if (m != 0xff) - *dp = (png_byte)((*dp & ~m) | (*sp & m)); - else - *dp = *sp; - } - - /* NOTE: this may overwrite the last byte with garbage if the image - * is not an exact number of bytes wide; libpng has always done - * this. - */ - if (row_width <= pixels_per_byte) - break; /* May need to restore part of the last byte */ - - row_width -= pixels_per_byte; - ++dp; - ++sp; - } - } - - else /* pixel_depth >= 8 */ - { - unsigned int bytes_to_copy, bytes_to_jump; - - /* Validate the depth - it must be a multiple of 8 */ - if (pixel_depth & 7) - png_error(png_ptr, "invalid user transform pixel depth"); - - pixel_depth >>= 3; /* now in bytes */ - row_width *= pixel_depth; - - /* Regardless of pass number the Adam 7 interlace always results in a - * fixed number of pixels to copy then to skip. There may be a - * different number of pixels to skip at the start though. - */ - { - unsigned int offset = PNG_PASS_START_COL(pass) * pixel_depth; - - row_width -= offset; - dp += offset; - sp += offset; - } - - /* Work out the bytes to copy. */ - if (display) - { - /* When doing the 'block' algorithm the pixel in the pass gets - * replicated to adjacent pixels. This is why the even (0,2,4,6) - * passes are skipped above - the entire expanded row is copied. - */ - bytes_to_copy = (1<<((6-pass)>>1)) * pixel_depth; - - /* But don't allow this number to exceed the actual row width. */ - if (bytes_to_copy > row_width) - bytes_to_copy = row_width; - } - - else /* normal row; Adam7 only ever gives us one pixel to copy. */ - bytes_to_copy = pixel_depth; - - /* In Adam7 there is a constant offset between where the pixels go. */ - bytes_to_jump = PNG_PASS_COL_OFFSET(pass) * pixel_depth; - - /* And simply copy these bytes. Some optimization is possible here, - * depending on the value of 'bytes_to_copy'. Special case the low - * byte counts, which we know to be frequent. - * - * Notice that these cases all 'return' rather than 'break' - this - * avoids an unnecessary test on whether to restore the last byte - * below. - */ - switch (bytes_to_copy) - { - case 1: - for (;;) - { - *dp = *sp; - - if (row_width <= bytes_to_jump) - return; - - dp += bytes_to_jump; - sp += bytes_to_jump; - row_width -= bytes_to_jump; - } - - case 2: - /* There is a possibility of a partial copy at the end here; this - * slows the code down somewhat. - */ - do - { - dp[0] = sp[0], dp[1] = sp[1]; - - if (row_width <= bytes_to_jump) - return; - - sp += bytes_to_jump; - dp += bytes_to_jump; - row_width -= bytes_to_jump; - } - while (row_width > 1); - - /* And there can only be one byte left at this point: */ - *dp = *sp; - return; - - case 3: - /* This can only be the RGB case, so each copy is exactly one - * pixel and it is not necessary to check for a partial copy. - */ - for(;;) - { - dp[0] = sp[0], dp[1] = sp[1], dp[2] = sp[2]; - - if (row_width <= bytes_to_jump) - return; - - sp += bytes_to_jump; - dp += bytes_to_jump; - row_width -= bytes_to_jump; - } - - default: -#if PNG_ALIGN_TYPE != PNG_ALIGN_NONE - /* Check for double byte alignment and, if possible, use a - * 16-bit copy. Don't attempt this for narrow images - ones that - * are less than an interlace panel wide. Don't attempt it for - * wide bytes_to_copy either - use the memcpy there. - */ - if (bytes_to_copy < 16 /*else use memcpy*/ && - png_isaligned(dp, png_uint_16) && - png_isaligned(sp, png_uint_16) && - bytes_to_copy % (sizeof (png_uint_16)) == 0 && - bytes_to_jump % (sizeof (png_uint_16)) == 0) - { - /* Everything is aligned for png_uint_16 copies, but try for - * png_uint_32 first. - */ - if (png_isaligned(dp, png_uint_32) && - png_isaligned(sp, png_uint_32) && - bytes_to_copy % (sizeof (png_uint_32)) == 0 && - bytes_to_jump % (sizeof (png_uint_32)) == 0) - { - png_uint_32p dp32 = png_aligncast(png_uint_32p,dp); - png_const_uint_32p sp32 = png_aligncastconst( - png_const_uint_32p, sp); - size_t skip = (bytes_to_jump-bytes_to_copy) / - (sizeof (png_uint_32)); - - do - { - size_t c = bytes_to_copy; - do - { - *dp32++ = *sp32++; - c -= (sizeof (png_uint_32)); - } - while (c > 0); - - if (row_width <= bytes_to_jump) - return; - - dp32 += skip; - sp32 += skip; - row_width -= bytes_to_jump; - } - while (bytes_to_copy <= row_width); - - /* Get to here when the row_width truncates the final copy. - * There will be 1-3 bytes left to copy, so don't try the - * 16-bit loop below. - */ - dp = (png_bytep)dp32; - sp = (png_const_bytep)sp32; - do - *dp++ = *sp++; - while (--row_width > 0); - return; - } - - /* Else do it in 16-bit quantities, but only if the size is - * not too large. - */ - else - { - png_uint_16p dp16 = png_aligncast(png_uint_16p, dp); - png_const_uint_16p sp16 = png_aligncastconst( - png_const_uint_16p, sp); - size_t skip = (bytes_to_jump-bytes_to_copy) / - (sizeof (png_uint_16)); - - do - { - size_t c = bytes_to_copy; - do - { - *dp16++ = *sp16++; - c -= (sizeof (png_uint_16)); - } - while (c > 0); - - if (row_width <= bytes_to_jump) - return; - - dp16 += skip; - sp16 += skip; - row_width -= bytes_to_jump; - } - while (bytes_to_copy <= row_width); - - /* End of row - 1 byte left, bytes_to_copy > row_width: */ - dp = (png_bytep)dp16; - sp = (png_const_bytep)sp16; - do - *dp++ = *sp++; - while (--row_width > 0); - return; - } - } -#endif /* PNG_ALIGN_ code */ - - /* The true default - use a memcpy: */ - for (;;) - { - memcpy(dp, sp, bytes_to_copy); - - if (row_width <= bytes_to_jump) - return; - - sp += bytes_to_jump; - dp += bytes_to_jump; - row_width -= bytes_to_jump; - if (bytes_to_copy > row_width) - bytes_to_copy = row_width; - } - } - - /* NOT REACHED*/ - } /* pixel_depth >= 8 */ - - /* Here if pixel_depth < 8 to check 'end_ptr' below. */ - } - else -#endif - - /* If here then the switch above wasn't used so just memcpy the whole row - * from the temporary row buffer (notice that this overwrites the end of the - * destination row if it is a partial byte.) - */ - memcpy(dp, sp, PNG_ROWBYTES(pixel_depth, row_width)); - - /* Restore the overwritten bits from the last byte if necessary. */ - if (end_ptr != NULL) - *end_ptr = (png_byte)((end_byte & end_mask) | (*end_ptr & ~end_mask)); -} - -#ifdef PNG_READ_INTERLACING_SUPPORTED -void /* PRIVATE */ -png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass, - png_uint_32 transformations /* Because these may affect the byte layout */) -{ - /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - /* Offset to next interlace block */ - static PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - png_debug(1, "in png_do_read_interlace"); - if (row != NULL && row_info != NULL) - { - png_uint_32 final_width; - - final_width = row_info->width * png_pass_inc[pass]; - - switch (row_info->pixel_depth) - { - case 1: - { - png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3); - png_bytep dp = row + (png_size_t)((final_width - 1) >> 3); - int sshift, dshift; - int s_start, s_end, s_inc; - int jstop = png_pass_inc[pass]; - png_byte v; - png_uint_32 i; - int j; - -#ifdef PNG_READ_PACKSWAP_SUPPORTED - if (transformations & PNG_PACKSWAP) - { - sshift = (int)((row_info->width + 7) & 0x07); - dshift = (int)((final_width + 7) & 0x07); - s_start = 7; - s_end = 0; - s_inc = -1; - } - - else -#endif - { - sshift = 7 - (int)((row_info->width + 7) & 0x07); - dshift = 7 - (int)((final_width + 7) & 0x07); - s_start = 0; - s_end = 7; - s_inc = 1; - } - - for (i = 0; i < row_info->width; i++) - { - v = (png_byte)((*sp >> sshift) & 0x01); - for (j = 0; j < jstop; j++) - { - unsigned int tmp = *dp & (0x7f7f >> (7 - dshift)); - tmp |= v << dshift; - *dp = (png_byte)(tmp & 0xff); - - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - - else - dshift += s_inc; - } - - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - - else - sshift += s_inc; - } - break; - } - - case 2: - { - png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2); - png_bytep dp = row + (png_uint_32)((final_width - 1) >> 2); - int sshift, dshift; - int s_start, s_end, s_inc; - int jstop = png_pass_inc[pass]; - png_uint_32 i; - -#ifdef PNG_READ_PACKSWAP_SUPPORTED - if (transformations & PNG_PACKSWAP) - { - sshift = (int)(((row_info->width + 3) & 0x03) << 1); - dshift = (int)(((final_width + 3) & 0x03) << 1); - s_start = 6; - s_end = 0; - s_inc = -2; - } - - else -#endif - { - sshift = (int)((3 - ((row_info->width + 3) & 0x03)) << 1); - dshift = (int)((3 - ((final_width + 3) & 0x03)) << 1); - s_start = 0; - s_end = 6; - s_inc = 2; - } - - for (i = 0; i < row_info->width; i++) - { - png_byte v; - int j; - - v = (png_byte)((*sp >> sshift) & 0x03); - for (j = 0; j < jstop; j++) - { - unsigned int tmp = *dp & (0x3f3f >> (6 - dshift)); - tmp |= v << dshift; - *dp = (png_byte)(tmp & 0xff); - - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - - else - dshift += s_inc; - } - - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - - else - sshift += s_inc; - } - break; - } - - case 4: - { - png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1); - png_bytep dp = row + (png_size_t)((final_width - 1) >> 1); - int sshift, dshift; - int s_start, s_end, s_inc; - png_uint_32 i; - int jstop = png_pass_inc[pass]; - -#ifdef PNG_READ_PACKSWAP_SUPPORTED - if (transformations & PNG_PACKSWAP) - { - sshift = (int)(((row_info->width + 1) & 0x01) << 2); - dshift = (int)(((final_width + 1) & 0x01) << 2); - s_start = 4; - s_end = 0; - s_inc = -4; - } - - else -#endif - { - sshift = (int)((1 - ((row_info->width + 1) & 0x01)) << 2); - dshift = (int)((1 - ((final_width + 1) & 0x01)) << 2); - s_start = 0; - s_end = 4; - s_inc = 4; - } - - for (i = 0; i < row_info->width; i++) - { - png_byte v = (png_byte)((*sp >> sshift) & 0x0f); - int j; - - for (j = 0; j < jstop; j++) - { - unsigned int tmp = *dp & (0xf0f >> (4 - dshift)); - tmp |= v << dshift; - *dp = (png_byte)(tmp & 0xff); - - if (dshift == s_end) - { - dshift = s_start; - dp--; - } - - else - dshift += s_inc; - } - - if (sshift == s_end) - { - sshift = s_start; - sp--; - } - - else - sshift += s_inc; - } - break; - } - - default: - { - png_size_t pixel_bytes = (row_info->pixel_depth >> 3); - - png_bytep sp = row + (png_size_t)(row_info->width - 1) - * pixel_bytes; - - png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes; - - int jstop = png_pass_inc[pass]; - png_uint_32 i; - - for (i = 0; i < row_info->width; i++) - { - png_byte v[8]; - int j; - - memcpy(v, sp, pixel_bytes); - - for (j = 0; j < jstop; j++) - { - memcpy(dp, v, pixel_bytes); - dp -= pixel_bytes; - } - - sp -= pixel_bytes; - } - break; - } - } - - row_info->width = final_width; - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, final_width); - } -#ifndef PNG_READ_PACKSWAP_SUPPORTED - PNG_UNUSED(transformations) /* Silence compiler warning */ -#endif -} -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - -static void -png_read_filter_row_sub(png_row_infop row_info, png_bytep row, - png_const_bytep prev_row) -{ - png_size_t i; - png_size_t istop = row_info->rowbytes; - unsigned int bpp = (row_info->pixel_depth + 7) >> 3; - png_bytep rp = row + bpp; - - PNG_UNUSED(prev_row) - - for (i = bpp; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*(rp-bpp))) & 0xff); - rp++; - } -} - -static void -png_read_filter_row_up(png_row_infop row_info, png_bytep row, - png_const_bytep prev_row) -{ - png_size_t i; - png_size_t istop = row_info->rowbytes; - png_bytep rp = row; - png_const_bytep pp = prev_row; - - for (i = 0; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff); - rp++; - } -} - -static void -png_read_filter_row_avg(png_row_infop row_info, png_bytep row, - png_const_bytep prev_row) -{ - png_size_t i; - png_bytep rp = row; - png_const_bytep pp = prev_row; - unsigned int bpp = (row_info->pixel_depth + 7) >> 3; - png_size_t istop = row_info->rowbytes - bpp; - - for (i = 0; i < bpp; i++) - { - *rp = (png_byte)(((int)(*rp) + - ((int)(*pp++) / 2 )) & 0xff); - - rp++; - } - - for (i = 0; i < istop; i++) - { - *rp = (png_byte)(((int)(*rp) + - (int)(*pp++ + *(rp-bpp)) / 2 ) & 0xff); - - rp++; - } -} - -static void -png_read_filter_row_paeth_1byte_pixel(png_row_infop row_info, png_bytep row, - png_const_bytep prev_row) -{ - png_bytep rp_end = row + row_info->rowbytes; - int a, c; - - /* First pixel/byte */ - c = *prev_row++; - a = *row + c; - *row++ = (png_byte)a; - - /* Remainder */ - while (row < rp_end) - { - int b, pa, pb, pc, p; - - a &= 0xff; /* From previous iteration or start */ - b = *prev_row++; - - p = b - c; - pc = a - c; - -# ifdef PNG_USE_ABS - pa = abs(p); - pb = abs(pc); - pc = abs(p + pc); -# else - pa = p < 0 ? -p : p; - pb = pc < 0 ? -pc : pc; - pc = (p + pc) < 0 ? -(p + pc) : p + pc; -# endif - - /* Find the best predictor, the least of pa, pb, pc favoring the earlier - * ones in the case of a tie. - */ - if (pb < pa) pa = pb, a = b; - if (pc < pa) a = c; - - /* Calculate the current pixel in a, and move the previous row pixel to c - * for the next time round the loop - */ - c = b; - a += *row; - *row++ = (png_byte)a; - } -} - -static void -png_read_filter_row_paeth_multibyte_pixel(png_row_infop row_info, png_bytep row, - png_const_bytep prev_row) -{ - int bpp = (row_info->pixel_depth + 7) >> 3; - png_bytep rp_end = row + bpp; - - /* Process the first pixel in the row completely (this is the same as 'up' - * because there is only one candidate predictor for the first row). - */ - while (row < rp_end) - { - int a = *row + *prev_row++; - *row++ = (png_byte)a; - } - - /* Remainder */ - rp_end += row_info->rowbytes - bpp; - - while (row < rp_end) - { - int a, b, c, pa, pb, pc, p; - - c = *(prev_row - bpp); - a = *(row - bpp); - b = *prev_row++; - - p = b - c; - pc = a - c; - -# ifdef PNG_USE_ABS - pa = abs(p); - pb = abs(pc); - pc = abs(p + pc); -# else - pa = p < 0 ? -p : p; - pb = pc < 0 ? -pc : pc; - pc = (p + pc) < 0 ? -(p + pc) : p + pc; -# endif - - if (pb < pa) pa = pb, a = b; - if (pc < pa) a = c; - - //c = b; - a += *row; - *row++ = (png_byte)a; - } -} - -static void -png_init_filter_functions(png_structrp pp) - /* This function is called once for every PNG image to set the - * implementations required to reverse the filtering of PNG rows. Reversing - * the filter is the first transformation performed on the row data. It is - * performed in place, therefore an implementation can be selected based on - * the image pixel format. If the implementation depends on image width then - * take care to ensure that it works corretly if the image is interlaced - - * interlacing causes the actual row width to vary. - */ -{ - unsigned int bpp = (pp->pixel_depth + 7) >> 3; - - pp->read_filter[PNG_FILTER_VALUE_SUB-1] = png_read_filter_row_sub; - pp->read_filter[PNG_FILTER_VALUE_UP-1] = png_read_filter_row_up; - pp->read_filter[PNG_FILTER_VALUE_AVG-1] = png_read_filter_row_avg; - if (bpp == 1) - pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = - png_read_filter_row_paeth_1byte_pixel; - else - pp->read_filter[PNG_FILTER_VALUE_PAETH-1] = - png_read_filter_row_paeth_multibyte_pixel; - -#ifdef PNG_FILTER_OPTIMIZATIONS - /* To use this define PNG_FILTER_OPTIMIZATIONS as the name of a function to - * call to install hardware optimizations for the above functions; simply - * replace whatever elements of the pp->read_filter[] array with a hardware - * specific (or, for that matter, generic) optimization. - * - * To see an example of this examine what configure.ac does when - * --enable-arm-neon is specified on the command line. - */ - PNG_FILTER_OPTIMIZATIONS(pp, bpp); -#endif -} - -void /* PRIVATE */ -png_read_filter_row(png_structrp pp, png_row_infop row_info, png_bytep row, - png_const_bytep prev_row, int filter) -{ - /* OPTIMIZATION: DO NOT MODIFY THIS FUNCTION, instead #define - * PNG_FILTER_OPTIMIZATIONS to a function that overrides the generic - * implementations. See png_init_filter_functions above. - */ - if (pp->read_filter[0] == NULL) - png_init_filter_functions(pp); - if (filter > PNG_FILTER_VALUE_NONE && filter < PNG_FILTER_VALUE_LAST) - pp->read_filter[filter-1](row_info, row, prev_row); -} - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -void /* PRIVATE */ -png_read_IDAT_data(png_structrp png_ptr, png_bytep output, - png_alloc_size_t avail_out) -{ - /* Loop reading IDATs and decompressing the result into output[avail_out] */ - png_ptr->zstream.next_out = output; - png_ptr->zstream.avail_out = 0; /* safety: set below */ - - if (output == NULL) - avail_out = 0; - - do - { - int ret; - png_byte tmpbuf[PNG_INFLATE_BUF_SIZE]; - - if (png_ptr->zstream.avail_in == 0) - { - uInt avail_in; - png_bytep buffer; - - while (png_ptr->idat_size == 0) - { - png_crc_finish(png_ptr, 0); - - png_ptr->idat_size = png_read_chunk_header(png_ptr); - /* This is an error even in the 'check' case because the code just - * consumed a non-IDAT header. - */ - if (png_ptr->chunk_name != png_IDAT) - png_error(png_ptr, "Not enough image data"); - } - - avail_in = png_ptr->IDAT_read_size; - - if (avail_in > png_ptr->idat_size) - avail_in = (uInt)png_ptr->idat_size; - - /* A PNG with a gradually increasing IDAT size will defeat this attempt - * to minimize memory usage by causing lots of re-allocs, but - * realistically doing IDAT_read_size re-allocs is not likely to be a - * big problem. - */ - buffer = png_read_buffer(png_ptr, avail_in, 0/*error*/); - - png_crc_read(png_ptr, buffer, avail_in); - png_ptr->idat_size -= avail_in; - - png_ptr->zstream.next_in = buffer; - png_ptr->zstream.avail_in = avail_in; - } - - /* And set up the output side. */ - if (output != NULL) /* standard read */ - { - uInt out = ZLIB_IO_MAX; - - if (out > avail_out) - out = (uInt)avail_out; - - avail_out -= out; - png_ptr->zstream.avail_out = out; - } - - else /* check for end */ - { - png_ptr->zstream.next_out = tmpbuf; - png_ptr->zstream.avail_out = (sizeof tmpbuf); - } - - /* Use NO_FLUSH; this gives zlib the maximum opportunity to optimize the - * process. If the LZ stream is truncated the sequential reader will - * terminally damage the stream, above, by reading the chunk header of the - * following chunk (it then exits with png_error). - * - * TODO: deal more elegantly with truncated IDAT lists. - */ - ret = inflate(&png_ptr->zstream, Z_NO_FLUSH); - - /* Take the unconsumed output back (so, in the 'check' case this just - * counts up). - */ - avail_out += png_ptr->zstream.avail_out; - png_ptr->zstream.avail_out = 0; - - if (ret == Z_STREAM_END) - { - /* Do this for safety; we won't read any more into this row. */ - png_ptr->zstream.next_out = NULL; - - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; - - if (png_ptr->zstream.avail_in > 0 || png_ptr->idat_size > 0) - png_chunk_benign_error(png_ptr, "Extra compressed data"); - break; - } - - if (ret != Z_OK) - { - png_zstream_error(png_ptr, ret); - - if (output != NULL) - png_chunk_error(png_ptr, png_ptr->zstream.msg); - - else /* checking */ - { - png_chunk_benign_error(png_ptr, png_ptr->zstream.msg); - return; - } - } - } while (avail_out > 0); - - if (avail_out > 0) - { - /* The stream ended before the image; this is the same as too few IDATs so - * should be handled the same way. - */ - if (output != NULL) - png_error(png_ptr, "Not enough image data"); - - else /* checking */ - png_chunk_benign_error(png_ptr, "Too much image data"); - } -} - -void /* PRIVATE */ -png_read_finish_IDAT(png_structrp png_ptr) -{ - /* We don't need any more data and the stream should have ended, however the - * LZ end code may actually not have been processed. In this case we must - * read it otherwise stray unread IDAT data or, more likely, an IDAT chunk - * may still remain to be consumed. - */ - if (!(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED)) - { - /* The NULL causes png_read_IDAT_data to swallow any remaining bytes in - * the compressed stream, but the stream may be damaged too, so even after - * this call we may need to terminate the zstream ownership. - */ - png_read_IDAT_data(png_ptr, NULL, 0); - png_ptr->zstream.next_out = NULL; /* safety */ - - /* Now clear everything out for safety; the following may not have been - * done. - */ - if (!(png_ptr->flags & PNG_FLAG_ZSTREAM_ENDED)) - { - png_ptr->mode |= PNG_AFTER_IDAT; - png_ptr->flags |= PNG_FLAG_ZSTREAM_ENDED; - } - } - - /* If the zstream has not been released do it now *and* terminate the reading - * of the final IDAT chunk. - */ - if (png_ptr->zowner == png_IDAT) - { - /* Always do this; the pointers otherwise point into the read buffer. */ - png_ptr->zstream.next_in = NULL; - png_ptr->zstream.avail_in = 0; - - /* Now we no longer own the zstream. */ - png_ptr->zowner = 0; - - /* The slightly weird semantics of the sequential IDAT reading is that we - * are always in or at the end of an IDAT chunk, so we always need to do a - * crc_finish here. If idat_size is non-zero we also need to read the - * spurious bytes at the end of the chunk now. - */ - (void)png_crc_finish(png_ptr, png_ptr->idat_size); - } -} - -void /* PRIVATE */ -png_read_finish_row(png_structrp png_ptr) -{ -#ifdef PNG_READ_INTERLACING_SUPPORTED - /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* Start of interlace block */ - static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* Offset to next interlace block */ - static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* Start of interlace block in the y direction */ - static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* Offset to next interlace block in the y direction */ - static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - - png_debug(1, "in png_read_finish_row"); - png_ptr->row_number++; - if (png_ptr->row_number < png_ptr->num_rows) - return; - -#ifdef PNG_READ_INTERLACING_SUPPORTED - if (png_ptr->interlaced) - { - png_ptr->row_number = 0; - - /* TO DO: don't do this if prev_row isn't needed (requires - * read-ahead of the next row's filter byte. - */ - memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); - - do - { - png_ptr->pass++; - - if (png_ptr->pass >= 7) - break; - - png_ptr->iwidth = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; - - if (!(png_ptr->transformations & PNG_INTERLACE)) - { - png_ptr->num_rows = (png_ptr->height + - png_pass_yinc[png_ptr->pass] - 1 - - png_pass_ystart[png_ptr->pass]) / - png_pass_yinc[png_ptr->pass]; - } - - else /* if (png_ptr->transformations & PNG_INTERLACE) */ - break; /* libpng deinterlacing sees every row */ - - } while (png_ptr->num_rows == 0 || png_ptr->iwidth == 0); - - if (png_ptr->pass < 7) - return; - } -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - - /* Here after at the end of the last row of the last pass. */ - png_read_finish_IDAT(png_ptr); -} -#endif /* PNG_SEQUENTIAL_READ_SUPPORTED */ - -void /* PRIVATE */ -png_read_start_row(png_structrp png_ptr) -{ -#ifdef PNG_READ_INTERLACING_SUPPORTED - /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* Start of interlace block */ - static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* Offset to next interlace block */ - static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* Start of interlace block in the y direction */ - static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* Offset to next interlace block in the y direction */ - static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif - - int max_pixel_depth; - png_size_t row_bytes; - - png_debug(1, "in png_read_start_row"); - -#ifdef PNG_READ_TRANSFORMS_SUPPORTED - png_init_read_transformations(png_ptr); -#endif -#ifdef PNG_READ_INTERLACING_SUPPORTED - if (png_ptr->interlaced) - { - if (!(png_ptr->transformations & PNG_INTERLACE)) - png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - - png_pass_ystart[0]) / png_pass_yinc[0]; - - else - png_ptr->num_rows = png_ptr->height; - - png_ptr->iwidth = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; - } - - else -#endif /* PNG_READ_INTERLACING_SUPPORTED */ - { - png_ptr->num_rows = png_ptr->height; - png_ptr->iwidth = png_ptr->width; - } - - max_pixel_depth = png_ptr->pixel_depth; - - /* WARNING: * png_read_transform_info (pngrtran.c) performs a simpliar set of - * calculations to calculate the final pixel depth, then - * png_do_read_transforms actually does the transforms. This means that the - * code which effectively calculates this value is actually repeated in three - * separate places. They must all match. Innocent changes to the order of - * transformations can and will break libpng in a way that causes memory - * overwrites. - * - * TODO: fix this. - */ -#ifdef PNG_READ_PACK_SUPPORTED - if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8) - max_pixel_depth = 8; -#endif - -#ifdef PNG_READ_EXPAND_SUPPORTED - if (png_ptr->transformations & PNG_EXPAND) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (png_ptr->num_trans) - max_pixel_depth = 32; - - else - max_pixel_depth = 24; - } - - else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) - { - if (max_pixel_depth < 8) - max_pixel_depth = 8; - - if (png_ptr->num_trans) - max_pixel_depth *= 2; - } - - else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB) - { - if (png_ptr->num_trans) - { - max_pixel_depth *= 4; - max_pixel_depth /= 3; - } - } - } -#endif - -#ifdef PNG_READ_EXPAND_16_SUPPORTED - if (png_ptr->transformations & PNG_EXPAND_16) - { -# ifdef PNG_READ_EXPAND_SUPPORTED - /* In fact it is an error if it isn't supported, but checking is - * the safe way. - */ - if (png_ptr->transformations & PNG_EXPAND) - { - if (png_ptr->bit_depth < 16) - max_pixel_depth *= 2; - } - else -# endif - png_ptr->transformations &= ~PNG_EXPAND_16; - } -#endif - -#ifdef PNG_READ_FILLER_SUPPORTED - if (png_ptr->transformations & (PNG_FILLER)) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY) - { - if (max_pixel_depth <= 8) - max_pixel_depth = 16; - - else - max_pixel_depth = 32; - } - - else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB || - png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - if (max_pixel_depth <= 32) - max_pixel_depth = 32; - - else - max_pixel_depth = 64; - } - } -#endif - -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED - if (png_ptr->transformations & PNG_GRAY_TO_RGB) - { - if ( -#ifdef PNG_READ_EXPAND_SUPPORTED - (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) || -#endif -#ifdef PNG_READ_FILLER_SUPPORTED - (png_ptr->transformations & (PNG_FILLER)) || -#endif - png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - if (max_pixel_depth <= 16) - max_pixel_depth = 32; - - else - max_pixel_depth = 64; - } - - else - { - if (max_pixel_depth <= 8) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - max_pixel_depth = 32; - - else - max_pixel_depth = 24; - } - - else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - max_pixel_depth = 64; - - else - max_pixel_depth = 48; - } - } -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \ -defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) - if (png_ptr->transformations & PNG_USER_TRANSFORM) - { - int user_pixel_depth = png_ptr->user_transform_depth * - png_ptr->user_transform_channels; - - if (user_pixel_depth > max_pixel_depth) - max_pixel_depth = user_pixel_depth; - } -#endif - - /* This value is stored in png_struct and double checked in the row read - * code. - */ - png_ptr->maximum_pixel_depth = (png_byte)max_pixel_depth; - png_ptr->transformed_pixel_depth = 0; /* calculated on demand */ - - /* Align the width on the next larger 8 pixels. Mainly used - * for interlacing - */ - row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7)); - /* Calculate the maximum bytes needed, adding a byte and a pixel - * for safety's sake - */ - row_bytes = PNG_ROWBYTES(max_pixel_depth, row_bytes) + - 1 + ((max_pixel_depth + 7) >> 3); - -#ifdef PNG_MAX_MALLOC_64K - if (row_bytes > (png_uint_32)65536L) - png_error(png_ptr, "This image requires a row greater than 64KB"); -#endif - - if (row_bytes + 48 > png_ptr->old_big_row_buf_size) - { - png_free(png_ptr, png_ptr->big_row_buf); - png_free(png_ptr, png_ptr->big_prev_row); - - if (png_ptr->interlaced) - png_ptr->big_row_buf = (png_bytep)png_calloc(png_ptr, - row_bytes + 48); - - else - png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes + 48); - - png_ptr->big_prev_row = (png_bytep)png_malloc(png_ptr, row_bytes + 48); - -#ifdef PNG_ALIGNED_MEMORY_SUPPORTED - /* Use 16-byte aligned memory for row_buf with at least 16 bytes - * of padding before and after row_buf; treat prev_row similarly. - * NOTE: the alignment is to the start of the pixels, one beyond the start - * of the buffer, because of the filter byte. Prior to libpng 1.5.6 this - * was incorrect; the filter byte was aligned, which had the exact - * opposite effect of that intended. - */ - { - png_bytep temp = png_ptr->big_row_buf + 32; - int extra = (int)((temp - (png_bytep)0) & 0x0f); - png_ptr->row_buf = temp - extra - 1/*filter byte*/; - - temp = png_ptr->big_prev_row + 32; - extra = (int)((temp - (png_bytep)0) & 0x0f); - png_ptr->prev_row = temp - extra - 1/*filter byte*/; - } - -#else - /* Use 31 bytes of padding before and 17 bytes after row_buf. */ - png_ptr->row_buf = png_ptr->big_row_buf + 31; - png_ptr->prev_row = png_ptr->big_prev_row + 31; -#endif - png_ptr->old_big_row_buf_size = row_bytes + 48; - } - -#ifdef PNG_MAX_MALLOC_64K - if (png_ptr->rowbytes > 65535) - png_error(png_ptr, "This image requires a row greater than 64KB"); - -#endif - if (png_ptr->rowbytes > (PNG_SIZE_MAX - 1)) - png_error(png_ptr, "Row has too many bytes to allocate in memory"); - - memset(png_ptr->prev_row, 0, png_ptr->rowbytes + 1); - - png_debug1(3, "width = %u,", png_ptr->width); - png_debug1(3, "height = %u,", png_ptr->height); - png_debug1(3, "iwidth = %u,", png_ptr->iwidth); - png_debug1(3, "num_rows = %u,", png_ptr->num_rows); - png_debug1(3, "rowbytes = %lu,", (unsigned long)png_ptr->rowbytes); - png_debug1(3, "irowbytes = %lu", - (unsigned long)PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->iwidth) + 1); - - /* The sequential reader needs a buffer for IDAT, but the progressive reader - * does not, so free the read buffer now regardless; the sequential reader - * reallocates it on demand. - */ - if (png_ptr->read_buffer) - { - png_bytep buffer = png_ptr->read_buffer; - - png_ptr->read_buffer_size = 0; - png_ptr->read_buffer = NULL; - png_free(png_ptr, buffer); - } - - /* Finally claim the zstream for the inflate of the IDAT data, use the bits - * value from the stream (note that this will result in a fatal error if the - * IDAT stream has a bogus deflate header window_bits value, but this should - * not be happening any longer!) - */ - if (png_inflate_claim(png_ptr, png_IDAT, 0) != Z_OK) - png_error(png_ptr, png_ptr->zstream.msg); - - png_ptr->flags |= PNG_FLAG_ROW_INIT; -} -#endif /* PNG_READ_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngset.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngset.c deleted file mode 100755 index a1b9d49..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngset.c +++ /dev/null @@ -1,1606 +0,0 @@ - -/* pngset.c - storage of image information into info struct - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - * The functions here are used during reads to store data from the file - * into the info struct, and during writes to store application data - * into the info struct for writing into the file. This abstracts the - * info struct and allows us to change the structure in the future. - */ - -#include "pngpriv.h" - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) - -#ifdef PNG_bKGD_SUPPORTED -void PNGAPI -png_set_bKGD(png_const_structrp png_ptr, png_inforp info_ptr, - png_const_color_16p background) -{ - png_debug1(1, "in %s storage function", "bKGD"); - - if (png_ptr == NULL || info_ptr == NULL || background == NULL) - return; - - info_ptr->background = *background; - info_ptr->valid |= PNG_INFO_bKGD; -} -#endif - -#ifdef PNG_cHRM_SUPPORTED -void PNGFAPI -png_set_cHRM_fixed(png_const_structrp png_ptr, png_inforp info_ptr, - png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x, - png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y, - png_fixed_point blue_x, png_fixed_point blue_y) -{ - png_xy xy; - - png_debug1(1, "in %s storage function", "cHRM fixed"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - xy.redx = red_x; - xy.redy = red_y; - xy.greenx = green_x; - xy.greeny = green_y; - xy.bluex = blue_x; - xy.bluey = blue_y; - xy.whitex = white_x; - xy.whitey = white_y; - - if (png_colorspace_set_chromaticities(png_ptr, &info_ptr->colorspace, &xy, - 2/* override with app values*/)) - info_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM; - - png_colorspace_sync_info(png_ptr, info_ptr); -} - -void PNGFAPI -png_set_cHRM_XYZ_fixed(png_const_structrp png_ptr, png_inforp info_ptr, - png_fixed_point int_red_X, png_fixed_point int_red_Y, - png_fixed_point int_red_Z, png_fixed_point int_green_X, - png_fixed_point int_green_Y, png_fixed_point int_green_Z, - png_fixed_point int_blue_X, png_fixed_point int_blue_Y, - png_fixed_point int_blue_Z) -{ - png_XYZ XYZ; - - png_debug1(1, "in %s storage function", "cHRM XYZ fixed"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - XYZ.red_X = int_red_X; - XYZ.red_Y = int_red_Y; - XYZ.red_Z = int_red_Z; - XYZ.green_X = int_green_X; - XYZ.green_Y = int_green_Y; - XYZ.green_Z = int_green_Z; - XYZ.blue_X = int_blue_X; - XYZ.blue_Y = int_blue_Y; - XYZ.blue_Z = int_blue_Z; - - if (png_colorspace_set_endpoints(png_ptr, &info_ptr->colorspace, &XYZ, 2)) - info_ptr->colorspace.flags |= PNG_COLORSPACE_FROM_cHRM; - - png_colorspace_sync_info(png_ptr, info_ptr); -} - -# ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_cHRM(png_const_structrp png_ptr, png_inforp info_ptr, - double white_x, double white_y, double red_x, double red_y, - double green_x, double green_y, double blue_x, double blue_y) -{ - png_set_cHRM_fixed(png_ptr, info_ptr, - png_fixed(png_ptr, white_x, "cHRM White X"), - png_fixed(png_ptr, white_y, "cHRM White Y"), - png_fixed(png_ptr, red_x, "cHRM Red X"), - png_fixed(png_ptr, red_y, "cHRM Red Y"), - png_fixed(png_ptr, green_x, "cHRM Green X"), - png_fixed(png_ptr, green_y, "cHRM Green Y"), - png_fixed(png_ptr, blue_x, "cHRM Blue X"), - png_fixed(png_ptr, blue_y, "cHRM Blue Y")); -} - -void PNGAPI -png_set_cHRM_XYZ(png_const_structrp png_ptr, png_inforp info_ptr, double red_X, - double red_Y, double red_Z, double green_X, double green_Y, double green_Z, - double blue_X, double blue_Y, double blue_Z) -{ - png_set_cHRM_XYZ_fixed(png_ptr, info_ptr, - png_fixed(png_ptr, red_X, "cHRM Red X"), - png_fixed(png_ptr, red_Y, "cHRM Red Y"), - png_fixed(png_ptr, red_Z, "cHRM Red Z"), - png_fixed(png_ptr, green_X, "cHRM Red X"), - png_fixed(png_ptr, green_Y, "cHRM Red Y"), - png_fixed(png_ptr, green_Z, "cHRM Red Z"), - png_fixed(png_ptr, blue_X, "cHRM Red X"), - png_fixed(png_ptr, blue_Y, "cHRM Red Y"), - png_fixed(png_ptr, blue_Z, "cHRM Red Z")); -} -# endif /* PNG_FLOATING_POINT_SUPPORTED */ - -#endif /* PNG_cHRM_SUPPORTED */ - -#ifdef PNG_gAMA_SUPPORTED -void PNGFAPI -png_set_gAMA_fixed(png_const_structrp png_ptr, png_inforp info_ptr, - png_fixed_point file_gamma) -{ - png_debug1(1, "in %s storage function", "gAMA"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - png_colorspace_set_gamma(png_ptr, &info_ptr->colorspace, file_gamma); - png_colorspace_sync_info(png_ptr, info_ptr); -} - -# ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_gAMA(png_const_structrp png_ptr, png_inforp info_ptr, double file_gamma) -{ - png_set_gAMA_fixed(png_ptr, info_ptr, png_fixed(png_ptr, file_gamma, - "png_set_gAMA")); -} -# endif -#endif - -#ifdef PNG_hIST_SUPPORTED -void PNGAPI -png_set_hIST(png_const_structrp png_ptr, png_inforp info_ptr, - png_const_uint_16p hist) -{ - int i; - - png_debug1(1, "in %s storage function", "hIST"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (info_ptr->num_palette == 0 || info_ptr->num_palette - > PNG_MAX_PALETTE_LENGTH) - { - png_warning(png_ptr, - "Invalid palette size, hIST allocation skipped"); - - return; - } - - png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0); - - /* Changed from info->num_palette to PNG_MAX_PALETTE_LENGTH in - * version 1.2.1 - */ - info_ptr->hist = png_voidcast(png_uint_16p, png_malloc_warn(png_ptr, - PNG_MAX_PALETTE_LENGTH * (sizeof (png_uint_16)))); - - if (info_ptr->hist == NULL) - { - png_warning(png_ptr, "Insufficient memory for hIST chunk data"); - return; - } - - info_ptr->free_me |= PNG_FREE_HIST; - - for (i = 0; i < info_ptr->num_palette; i++) - info_ptr->hist[i] = hist[i]; - - info_ptr->valid |= PNG_INFO_hIST; -} -#endif - -void PNGAPI -png_set_IHDR(png_const_structrp png_ptr, png_inforp info_ptr, - png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_type, int compression_type, - int filter_type) -{ - png_debug1(1, "in %s storage function", "IHDR"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->width = width; - info_ptr->height = height; - info_ptr->bit_depth = (png_byte)bit_depth; - info_ptr->color_type = (png_byte)color_type; - info_ptr->compression_type = (png_byte)compression_type; - info_ptr->filter_type = (png_byte)filter_type; - info_ptr->interlace_type = (png_byte)interlace_type; - - png_check_IHDR (png_ptr, info_ptr->width, info_ptr->height, - info_ptr->bit_depth, info_ptr->color_type, info_ptr->interlace_type, - info_ptr->compression_type, info_ptr->filter_type); - - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - info_ptr->channels = 1; - - else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) - info_ptr->channels = 3; - - else - info_ptr->channels = 1; - - if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA) - info_ptr->channels++; - - info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth); - - /* Check for potential overflow */ - if (width > - (PNG_UINT_32_MAX >> 3) /* 8-byte RRGGBBAA pixels */ - - 48 /* bigrowbuf hack */ - - 1 /* filter byte */ - - 7*8 /* rounding of width to multiple of 8 pixels */ - - 8) /* extra max_pixel_depth pad */ - info_ptr->rowbytes = 0; - else - info_ptr->rowbytes = PNG_ROWBYTES(info_ptr->pixel_depth, width); -} - -#ifdef PNG_oFFs_SUPPORTED -void PNGAPI -png_set_oFFs(png_const_structrp png_ptr, png_inforp info_ptr, - png_int_32 offset_x, png_int_32 offset_y, int unit_type) -{ - png_debug1(1, "in %s storage function", "oFFs"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->x_offset = offset_x; - info_ptr->y_offset = offset_y; - info_ptr->offset_unit_type = (png_byte)unit_type; - info_ptr->valid |= PNG_INFO_oFFs; -} -#endif - -#ifdef PNG_pCAL_SUPPORTED -void PNGAPI -png_set_pCAL(png_const_structrp png_ptr, png_inforp info_ptr, - png_const_charp purpose, png_int_32 X0, png_int_32 X1, int type, - int nparams, png_const_charp units, png_charpp params) -{ - png_size_t length; - int i; - - png_debug1(1, "in %s storage function", "pCAL"); - - if (png_ptr == NULL || info_ptr == NULL || purpose == NULL || units == NULL - || (nparams > 0 && params == NULL)) - return; - - length = strlen(purpose) + 1; - png_debug1(3, "allocating purpose for info (%lu bytes)", - (unsigned long)length); - - /* TODO: validate format of calibration name and unit name */ - - /* Check that the type matches the specification. */ - if (type < 0 || type > 3) - png_error(png_ptr, "Invalid pCAL equation type"); - - if (nparams < 0 || nparams > 255) - png_error(png_ptr, "Invalid pCAL parameter count"); - - /* Validate params[nparams] */ - for (i=0; ipcal_purpose = png_voidcast(png_charp, - png_malloc_warn(png_ptr, length)); - - if (info_ptr->pcal_purpose == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL purpose"); - return; - } - - memcpy(info_ptr->pcal_purpose, purpose, length); - - png_debug(3, "storing X0, X1, type, and nparams in info"); - info_ptr->pcal_X0 = X0; - info_ptr->pcal_X1 = X1; - info_ptr->pcal_type = (png_byte)type; - info_ptr->pcal_nparams = (png_byte)nparams; - - length = strlen(units) + 1; - png_debug1(3, "allocating units for info (%lu bytes)", - (unsigned long)length); - - info_ptr->pcal_units = png_voidcast(png_charp, - png_malloc_warn(png_ptr, length)); - - if (info_ptr->pcal_units == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL units"); - return; - } - - memcpy(info_ptr->pcal_units, units, length); - - info_ptr->pcal_params = png_voidcast(png_charpp, png_malloc_warn(png_ptr, - (png_size_t)((nparams + 1) * (sizeof (png_charp))))); - - if (info_ptr->pcal_params == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL params"); - return; - } - - memset(info_ptr->pcal_params, 0, (nparams + 1) * (sizeof (png_charp))); - - for (i = 0; i < nparams; i++) - { - length = strlen(params[i]) + 1; - png_debug2(3, "allocating parameter %d for info (%lu bytes)", i, - (unsigned long)length); - - info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length); - - if (info_ptr->pcal_params[i] == NULL) - { - png_warning(png_ptr, "Insufficient memory for pCAL parameter"); - return; - } - - memcpy(info_ptr->pcal_params[i], params[i], length); - } - - info_ptr->valid |= PNG_INFO_pCAL; - info_ptr->free_me |= PNG_FREE_PCAL; -} -#endif - -#ifdef PNG_sCAL_SUPPORTED -void PNGAPI -png_set_sCAL_s(png_const_structrp png_ptr, png_inforp info_ptr, - int unit, png_const_charp swidth, png_const_charp sheight) -{ - png_size_t lengthw = 0, lengthh = 0; - - png_debug1(1, "in %s storage function", "sCAL"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - /* Double check the unit (should never get here with an invalid - * unit unless this is an API call.) - */ - if (unit != 1 && unit != 2) - png_error(png_ptr, "Invalid sCAL unit"); - - if (swidth == NULL || (lengthw = strlen(swidth)) == 0 || - swidth[0] == 45 /* '-' */ || !png_check_fp_string(swidth, lengthw)) - png_error(png_ptr, "Invalid sCAL width"); - - if (sheight == NULL || (lengthh = strlen(sheight)) == 0 || - sheight[0] == 45 /* '-' */ || !png_check_fp_string(sheight, lengthh)) - png_error(png_ptr, "Invalid sCAL height"); - - info_ptr->scal_unit = (png_byte)unit; - - ++lengthw; - - png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthw); - - info_ptr->scal_s_width = png_voidcast(png_charp, - png_malloc_warn(png_ptr, lengthw)); - - if (info_ptr->scal_s_width == NULL) - { - png_warning(png_ptr, "Memory allocation failed while processing sCAL"); - return; - } - - memcpy(info_ptr->scal_s_width, swidth, lengthw); - - ++lengthh; - - png_debug1(3, "allocating unit for info (%u bytes)", (unsigned int)lengthh); - - info_ptr->scal_s_height = png_voidcast(png_charp, - png_malloc_warn(png_ptr, lengthh)); - - if (info_ptr->scal_s_height == NULL) - { - png_free (png_ptr, info_ptr->scal_s_width); - info_ptr->scal_s_width = NULL; - - png_warning(png_ptr, "Memory allocation failed while processing sCAL"); - return; - } - - memcpy(info_ptr->scal_s_height, sheight, lengthh); - - info_ptr->valid |= PNG_INFO_sCAL; - info_ptr->free_me |= PNG_FREE_SCAL; -} - -# ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_sCAL(png_const_structrp png_ptr, png_inforp info_ptr, int unit, - double width, double height) -{ - png_debug1(1, "in %s storage function", "sCAL"); - - /* Check the arguments. */ - if (width <= 0) - png_warning(png_ptr, "Invalid sCAL width ignored"); - - else if (height <= 0) - png_warning(png_ptr, "Invalid sCAL height ignored"); - - else - { - /* Convert 'width' and 'height' to ASCII. */ - char swidth[PNG_sCAL_MAX_DIGITS+1]; - char sheight[PNG_sCAL_MAX_DIGITS+1]; - - png_ascii_from_fp(png_ptr, swidth, (sizeof swidth), width, - PNG_sCAL_PRECISION); - png_ascii_from_fp(png_ptr, sheight, (sizeof sheight), height, - PNG_sCAL_PRECISION); - - png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight); - } -} -# endif - -# ifdef PNG_FIXED_POINT_SUPPORTED -void PNGAPI -png_set_sCAL_fixed(png_const_structrp png_ptr, png_inforp info_ptr, int unit, - png_fixed_point width, png_fixed_point height) -{ - png_debug1(1, "in %s storage function", "sCAL"); - - /* Check the arguments. */ - if (width <= 0) - png_warning(png_ptr, "Invalid sCAL width ignored"); - - else if (height <= 0) - png_warning(png_ptr, "Invalid sCAL height ignored"); - - else - { - /* Convert 'width' and 'height' to ASCII. */ - char swidth[PNG_sCAL_MAX_DIGITS+1]; - char sheight[PNG_sCAL_MAX_DIGITS+1]; - - png_ascii_from_fixed(png_ptr, swidth, (sizeof swidth), width); - png_ascii_from_fixed(png_ptr, sheight, (sizeof sheight), height); - - png_set_sCAL_s(png_ptr, info_ptr, unit, swidth, sheight); - } -} -# endif -#endif - -#ifdef PNG_pHYs_SUPPORTED -void PNGAPI -png_set_pHYs(png_const_structrp png_ptr, png_inforp info_ptr, - png_uint_32 res_x, png_uint_32 res_y, int unit_type) -{ - png_debug1(1, "in %s storage function", "pHYs"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - info_ptr->x_pixels_per_unit = res_x; - info_ptr->y_pixels_per_unit = res_y; - info_ptr->phys_unit_type = (png_byte)unit_type; - info_ptr->valid |= PNG_INFO_pHYs; -} -#endif - -void PNGAPI -png_set_PLTE(png_structrp png_ptr, png_inforp info_ptr, - png_const_colorp palette, int num_palette) -{ - - png_debug1(1, "in %s storage function", "PLTE"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH) - { - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - png_error(png_ptr, "Invalid palette length"); - - else - { - png_warning(png_ptr, "Invalid palette length"); - return; - } - } - - if ((num_palette > 0 && palette == NULL) || - (num_palette == 0 -# ifdef PNG_MNG_FEATURES_SUPPORTED - && (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0 -# endif - )) - { - png_chunk_report(png_ptr, "Invalid palette", PNG_CHUNK_ERROR); - return; - } - - /* It may not actually be necessary to set png_ptr->palette here; - * we do it for backward compatibility with the way the png_handle_tRNS - * function used to do the allocation. - * - * 1.6.0: the above statement appears to be incorrect; something has to set - * the palette inside png_struct on read. - */ - png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0); - - /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead - * of num_palette entries, in case of an invalid PNG file that has - * too-large sample values. - */ - png_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr, - PNG_MAX_PALETTE_LENGTH * (sizeof (png_color)))); - - if (num_palette > 0) - memcpy(png_ptr->palette, palette, num_palette * (sizeof (png_color))); - info_ptr->palette = png_ptr->palette; - info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette; - - info_ptr->free_me |= PNG_FREE_PLTE; - - info_ptr->valid |= PNG_INFO_PLTE; -} - -#ifdef PNG_sBIT_SUPPORTED -void PNGAPI -png_set_sBIT(png_const_structrp png_ptr, png_inforp info_ptr, - png_const_color_8p sig_bit) -{ - png_debug1(1, "in %s storage function", "sBIT"); - - if (png_ptr == NULL || info_ptr == NULL || sig_bit == NULL) - return; - - info_ptr->sig_bit = *sig_bit; - info_ptr->valid |= PNG_INFO_sBIT; -} -#endif - -#ifdef PNG_sRGB_SUPPORTED -void PNGAPI -png_set_sRGB(png_const_structrp png_ptr, png_inforp info_ptr, int srgb_intent) -{ - png_debug1(1, "in %s storage function", "sRGB"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - (void)png_colorspace_set_sRGB(png_ptr, &info_ptr->colorspace, srgb_intent); - png_colorspace_sync_info(png_ptr, info_ptr); -} - -void PNGAPI -png_set_sRGB_gAMA_and_cHRM(png_const_structrp png_ptr, png_inforp info_ptr, - int srgb_intent) -{ - png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (png_colorspace_set_sRGB(png_ptr, &info_ptr->colorspace, srgb_intent)) - { - /* This causes the gAMA and cHRM to be written too */ - info_ptr->colorspace.flags |= - PNG_COLORSPACE_FROM_gAMA|PNG_COLORSPACE_FROM_cHRM; - } - - png_colorspace_sync_info(png_ptr, info_ptr); -} -#endif /* sRGB */ - - -#ifdef PNG_iCCP_SUPPORTED -void PNGAPI -png_set_iCCP(png_const_structrp png_ptr, png_inforp info_ptr, - png_const_charp name, int compression_type, - png_const_bytep profile, png_uint_32 proflen) -{ - png_charp new_iccp_name; - png_bytep new_iccp_profile; - png_size_t length; - - png_debug1(1, "in %s storage function", "iCCP"); - - if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL) - return; - - if (compression_type != PNG_COMPRESSION_TYPE_BASE) - png_app_error(png_ptr, "Invalid iCCP compression method"); - - /* Set the colorspace first because this validates the profile; do not - * override previously set app cHRM or gAMA here (because likely as not the - * application knows better than libpng what the correct values are.) Pass - * the info_ptr color_type field to png_colorspace_set_ICC because in the - * write case it has not yet been stored in png_ptr. - */ - { - int result = png_colorspace_set_ICC(png_ptr, &info_ptr->colorspace, name, - proflen, profile, info_ptr->color_type); - - png_colorspace_sync_info(png_ptr, info_ptr); - - /* Don't do any of the copying if the profile was bad, or inconsistent. */ - if (!result) - return; - - /* But do write the gAMA and cHRM chunks from the profile. */ - info_ptr->colorspace.flags |= - PNG_COLORSPACE_FROM_gAMA|PNG_COLORSPACE_FROM_cHRM; - } - - length = strlen(name)+1; - new_iccp_name = png_voidcast(png_charp, png_malloc_warn(png_ptr, length)); - - if (new_iccp_name == NULL) - { - png_benign_error(png_ptr, "Insufficient memory to process iCCP chunk"); - return; - } - - memcpy(new_iccp_name, name, length); - new_iccp_profile = png_voidcast(png_bytep, - png_malloc_warn(png_ptr, proflen)); - - if (new_iccp_profile == NULL) - { - png_free(png_ptr, new_iccp_name); - png_benign_error(png_ptr, - "Insufficient memory to process iCCP profile"); - return; - } - - memcpy(new_iccp_profile, profile, proflen); - - png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0); - - info_ptr->iccp_proflen = proflen; - info_ptr->iccp_name = new_iccp_name; - info_ptr->iccp_profile = new_iccp_profile; - info_ptr->free_me |= PNG_FREE_ICCP; - info_ptr->valid |= PNG_INFO_iCCP; -} -#endif - -#ifdef PNG_TEXT_SUPPORTED -void PNGAPI -png_set_text(png_const_structrp png_ptr, png_inforp info_ptr, - png_const_textp text_ptr, int num_text) -{ - int ret; - ret = png_set_text_2(png_ptr, info_ptr, text_ptr, num_text); - - if (ret) - png_error(png_ptr, "Insufficient memory to store text"); -} - -int /* PRIVATE */ -png_set_text_2(png_const_structrp png_ptr, png_inforp info_ptr, - png_const_textp text_ptr, int num_text) -{ - int i; - - png_debug1(1, "in %lx storage function", png_ptr == NULL ? "unexpected" : - (unsigned long)png_ptr->chunk_name); - - if (png_ptr == NULL || info_ptr == NULL || num_text <= 0 || text_ptr == NULL) - return(0); - - /* Make sure we have enough space in the "text" array in info_struct - * to hold all of the incoming text_ptr objects. This compare can't overflow - * because max_text >= num_text (anyway, subtract of two positive integers - * can't overflow in any case.) - */ - if (num_text > info_ptr->max_text - info_ptr->num_text) - { - int old_num_text = info_ptr->num_text; - int max_text; - png_textp new_text = NULL; - - /* Calculate an appropriate max_text, checking for overflow. */ - max_text = old_num_text; - if (num_text <= INT_MAX - max_text) - { - max_text += num_text; - - /* Round up to a multiple of 8 */ - if (max_text < INT_MAX-8) - max_text = (max_text + 8) & ~0x7; - - else - max_text = INT_MAX; - - /* Now allocate a new array and copy the old members in, this does all - * the overflow checks. - */ - new_text = png_voidcast(png_textp,png_realloc_array(png_ptr, - info_ptr->text, old_num_text, max_text-old_num_text, - sizeof *new_text)); - } - - if (new_text == NULL) - { - png_chunk_report(png_ptr, "too many text chunks", - PNG_CHUNK_WRITE_ERROR); - return 1; - } - - png_free(png_ptr, info_ptr->text); - - info_ptr->text = new_text; - info_ptr->free_me |= PNG_FREE_TEXT; - info_ptr->max_text = max_text; - /* num_text is adjusted below as the entries are copied in */ - - png_debug1(3, "allocated %d entries for info_ptr->text", max_text); - } - - for (i = 0; i < num_text; i++) - { - size_t text_length, key_len; - size_t lang_len, lang_key_len; - png_textp textp = &(info_ptr->text[info_ptr->num_text]); - - if (text_ptr[i].key == NULL) - continue; - - if (text_ptr[i].compression < PNG_TEXT_COMPRESSION_NONE || - text_ptr[i].compression >= PNG_TEXT_COMPRESSION_LAST) - { - png_chunk_report(png_ptr, "text compression mode is out of range", - PNG_CHUNK_WRITE_ERROR); - continue; - } - - key_len = strlen(text_ptr[i].key); - - if (text_ptr[i].compression <= 0) - { - lang_len = 0; - lang_key_len = 0; - } - - else -# ifdef PNG_iTXt_SUPPORTED - { - /* Set iTXt data */ - - if (text_ptr[i].lang != NULL) - lang_len = strlen(text_ptr[i].lang); - - else - lang_len = 0; - - if (text_ptr[i].lang_key != NULL) - lang_key_len = strlen(text_ptr[i].lang_key); - - else - lang_key_len = 0; - } -# else /* PNG_iTXt_SUPPORTED */ - { - png_chunk_report(png_ptr, "iTXt chunk not supported", - PNG_CHUNK_WRITE_ERROR); - continue; - } -# endif - - if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0') - { - text_length = 0; -# ifdef PNG_iTXt_SUPPORTED - if (text_ptr[i].compression > 0) - textp->compression = PNG_ITXT_COMPRESSION_NONE; - - else -# endif - textp->compression = PNG_TEXT_COMPRESSION_NONE; - } - - else - { - text_length = strlen(text_ptr[i].text); - textp->compression = text_ptr[i].compression; - } - - textp->key = png_voidcast(png_charp,png_malloc_base(png_ptr, - key_len + text_length + lang_len + lang_key_len + 4)); - - if (textp->key == NULL) - { - png_chunk_report(png_ptr, "text chunk: out of memory", - PNG_CHUNK_WRITE_ERROR); - return 1; - } - - png_debug2(2, "Allocated %lu bytes at %p in png_set_text", - (unsigned long)(png_uint_32) - (key_len + lang_len + lang_key_len + text_length + 4), - textp->key); - - memcpy(textp->key, text_ptr[i].key, key_len); - *(textp->key + key_len) = '\0'; - - if (text_ptr[i].compression > 0) - { - textp->lang = textp->key + key_len + 1; - memcpy(textp->lang, text_ptr[i].lang, lang_len); - *(textp->lang + lang_len) = '\0'; - textp->lang_key = textp->lang + lang_len + 1; - memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len); - *(textp->lang_key + lang_key_len) = '\0'; - textp->text = textp->lang_key + lang_key_len + 1; - } - - else - { - textp->lang=NULL; - textp->lang_key=NULL; - textp->text = textp->key + key_len + 1; - } - - if (text_length) - memcpy(textp->text, text_ptr[i].text, text_length); - - *(textp->text + text_length) = '\0'; - -# ifdef PNG_iTXt_SUPPORTED - if (textp->compression > 0) - { - textp->text_length = 0; - textp->itxt_length = text_length; - } - - else -# endif - { - textp->text_length = text_length; - textp->itxt_length = 0; - } - - info_ptr->num_text++; - png_debug1(3, "transferred text chunk %d", info_ptr->num_text); - } - - return(0); -} -#endif - -#ifdef PNG_tIME_SUPPORTED -void PNGAPI -png_set_tIME(png_const_structrp png_ptr, png_inforp info_ptr, - png_const_timep mod_time) -{ - png_debug1(1, "in %s storage function", "tIME"); - - if (png_ptr == NULL || info_ptr == NULL || mod_time == NULL || - (png_ptr->mode & PNG_WROTE_tIME)) - return; - - if (mod_time->month == 0 || mod_time->month > 12 || - mod_time->day == 0 || mod_time->day > 31 || - mod_time->hour > 23 || mod_time->minute > 59 || - mod_time->second > 60) - { - png_warning(png_ptr, "Ignoring invalid time value"); - return; - } - - info_ptr->mod_time = *mod_time; - info_ptr->valid |= PNG_INFO_tIME; -} -#endif - -#ifdef PNG_tRNS_SUPPORTED -void PNGAPI -png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr, - png_const_bytep trans_alpha, int num_trans, png_const_color_16p trans_color) -{ - png_debug1(1, "in %s storage function", "tRNS"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (trans_alpha != NULL) - { - /* It may not actually be necessary to set png_ptr->trans_alpha here; - * we do it for backward compatibility with the way the png_handle_tRNS - * function used to do the allocation. - * - * 1.6.0: The above statement is incorrect; png_handle_tRNS effectively - * relies on png_set_tRNS storing the information in png_struct - * (otherwise it won't be there for the code in pngrtran.c). - */ - - png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0); - - /* Changed from num_trans to PNG_MAX_PALETTE_LENGTH in version 1.2.1 */ - png_ptr->trans_alpha = info_ptr->trans_alpha = png_voidcast(png_bytep, - png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH)); - - if (num_trans > 0 && num_trans <= PNG_MAX_PALETTE_LENGTH) - memcpy(info_ptr->trans_alpha, trans_alpha, (png_size_t)num_trans); - } - - if (trans_color != NULL) - { - int sample_max = (1 << info_ptr->bit_depth); - - if ((info_ptr->color_type == PNG_COLOR_TYPE_GRAY && - trans_color->gray > sample_max) || - (info_ptr->color_type == PNG_COLOR_TYPE_RGB && - (trans_color->red > sample_max || - trans_color->green > sample_max || - trans_color->blue > sample_max))) - png_warning(png_ptr, - "tRNS chunk has out-of-range samples for bit_depth"); - - info_ptr->trans_color = *trans_color; - - if (num_trans == 0) - num_trans = 1; - } - - info_ptr->num_trans = (png_uint_16)num_trans; - - if (num_trans != 0) - { - info_ptr->valid |= PNG_INFO_tRNS; - info_ptr->free_me |= PNG_FREE_TRNS; - } -} -#endif - -#ifdef PNG_sPLT_SUPPORTED -void PNGAPI -png_set_sPLT(png_const_structrp png_ptr, - png_inforp info_ptr, png_const_sPLT_tp entries, int nentries) -/* - * entries - array of png_sPLT_t structures - * to be added to the list of palettes - * in the info structure. - * - * nentries - number of palette structures to be - * added. - */ -{ - png_sPLT_tp np; - - if (png_ptr == NULL || info_ptr == NULL || nentries <= 0 || entries == NULL) - return; - - /* Use the internal realloc function, which checks for all the possible - * overflows. Notice that the parameters are (int) and (size_t) - */ - np = png_voidcast(png_sPLT_tp,png_realloc_array(png_ptr, - info_ptr->splt_palettes, info_ptr->splt_palettes_num, nentries, - sizeof *np)); - - if (np == NULL) - { - /* Out of memory or too many chunks */ - png_chunk_report(png_ptr, "too many sPLT chunks", PNG_CHUNK_WRITE_ERROR); - return; - } - - png_free(png_ptr, info_ptr->splt_palettes); - info_ptr->splt_palettes = np; - info_ptr->free_me |= PNG_FREE_SPLT; - - np += info_ptr->splt_palettes_num; - - do - { - png_size_t length; - - /* Skip invalid input entries */ - if (entries->name == NULL || entries->entries == NULL) - { - /* png_handle_sPLT doesn't do this, so this is an app error */ - png_app_error(png_ptr, "png_set_sPLT: invalid sPLT"); - /* Just skip the invalid entry */ - continue; - } - - np->depth = entries->depth; - - /* In the even of out-of-memory just return - there's no point keeping on - * trying to add sPLT chunks. - */ - length = strlen(entries->name) + 1; - np->name = png_voidcast(png_charp, png_malloc_base(png_ptr, length)); - - if (np->name == NULL) - break; - - memcpy(np->name, entries->name, length); - - /* IMPORTANT: we have memory now that won't get freed if something else - * goes wrong, this code must free it. png_malloc_array produces no - * warnings, use a png_chunk_report (below) if there is an error. - */ - np->entries = png_voidcast(png_sPLT_entryp, png_malloc_array(png_ptr, - entries->nentries, sizeof (png_sPLT_entry))); - - if (np->entries == NULL) - { - png_free(png_ptr, np->name); - break; - } - - np->nentries = entries->nentries; - /* This multiply can't overflow because png_malloc_array has already - * checked it when doing the allocation. - */ - memcpy(np->entries, entries->entries, - entries->nentries * sizeof (png_sPLT_entry)); - - /* Note that 'continue' skips the advance of the out pointer and out - * count, so an invalid entry is not added. - */ - info_ptr->valid |= PNG_INFO_sPLT; - ++(info_ptr->splt_palettes_num); - ++np; - } - while (++entries, --nentries); - - if (nentries > 0) - png_chunk_report(png_ptr, "sPLT out of memory", PNG_CHUNK_WRITE_ERROR); -} -#endif /* PNG_sPLT_SUPPORTED */ - -#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED -static png_byte -check_location(png_const_structrp png_ptr, int location) -{ - location &= (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT); - - /* New in 1.6.0; copy the location and check it. This is an API - * change, previously the app had to use the - * png_set_unknown_chunk_location API below for each chunk. - */ - if (location == 0 && !(png_ptr->mode & PNG_IS_READ_STRUCT)) - { - /* Write struct, so unknown chunks come from the app */ - png_app_warning(png_ptr, - "png_set_unknown_chunks now expects a valid location"); - /* Use the old behavior */ - location = (png_byte)(png_ptr->mode & - (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT)); - } - - /* This need not be an internal error - if the app calls - * png_set_unknown_chunks on a read pointer it must get the location right. - */ - if (location == 0) - png_error(png_ptr, "invalid location in png_set_unknown_chunks"); - - /* Now reduce the location to the top-most set bit by removing each least - * significant bit in turn. - */ - while (location != (location & -location)) - location &= ~(location & -location); - - /* The cast is safe because 'location' is a bit mask and only the low four - * bits are significant. - */ - return (png_byte)location; -} - -void PNGAPI -png_set_unknown_chunks(png_const_structrp png_ptr, - png_inforp info_ptr, png_const_unknown_chunkp unknowns, int num_unknowns) -{ - png_unknown_chunkp np; - - if (png_ptr == NULL || info_ptr == NULL || num_unknowns <= 0 || - unknowns == NULL) - return; - - /* Check for the failure cases where support has been disabled at compile - * time. This code is hardly ever compiled - it's here because - * STORE_UNKNOWN_CHUNKS is set by both read and write code (compiling in this - * code) but may be meaningless if the read or write handling of unknown - * chunks is not compiled in. - */ -# if !defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) && \ - defined(PNG_READ_SUPPORTED) - if (png_ptr->mode & PNG_IS_READ_STRUCT) - { - png_app_error(png_ptr, "no unknown chunk support on read"); - return; - } -# endif -# if !defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED) && \ - defined(PNG_WRITE_SUPPORTED) - if (!(png_ptr->mode & PNG_IS_READ_STRUCT)) - { - png_app_error(png_ptr, "no unknown chunk support on write"); - return; - } -# endif - - /* Prior to 1.6.0 this code used png_malloc_warn; however, this meant that - * unknown critical chunks could be lost with just a warning resulting in - * undefined behavior. Now png_chunk_report is used to provide behavior - * appropriate to read or write. - */ - np = png_voidcast(png_unknown_chunkp, png_realloc_array(png_ptr, - info_ptr->unknown_chunks, info_ptr->unknown_chunks_num, num_unknowns, - sizeof *np)); - - if (np == NULL) - { - png_chunk_report(png_ptr, "too many unknown chunks", - PNG_CHUNK_WRITE_ERROR); - return; - } - - png_free(png_ptr, info_ptr->unknown_chunks); - info_ptr->unknown_chunks = np; /* safe because it is initialized */ - info_ptr->free_me |= PNG_FREE_UNKN; - - np += info_ptr->unknown_chunks_num; - - /* Increment unknown_chunks_num each time round the loop to protect the - * just-allocated chunk data. - */ - for (; num_unknowns > 0; --num_unknowns, ++unknowns) - { - memcpy(np->name, unknowns->name, (sizeof np->name)); - np->name[(sizeof np->name)-1] = '\0'; - np->location = check_location(png_ptr, unknowns->location); - - if (unknowns->size == 0) - { - np->data = NULL; - np->size = 0; - } - - else - { - np->data = png_voidcast(png_bytep, - png_malloc_base(png_ptr, unknowns->size)); - - if (np->data == NULL) - { - png_chunk_report(png_ptr, "unknown chunk: out of memory", - PNG_CHUNK_WRITE_ERROR); - /* But just skip storing the unknown chunk */ - continue; - } - - memcpy(np->data, unknowns->data, unknowns->size); - np->size = unknowns->size; - } - - /* These increments are skipped on out-of-memory for the data - the - * unknown chunk entry gets overwritten if the png_chunk_report returns. - * This is correct in the read case (the chunk is just dropped.) - */ - ++np; - ++(info_ptr->unknown_chunks_num); - } -} - -void PNGAPI -png_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr, - int chunk, int location) -{ - /* This API is pretty pointless in 1.6.0 because the location can be set - * before the call to png_set_unknown_chunks. - * - * TODO: add a png_app_warning in 1.7 - */ - if (png_ptr != NULL && info_ptr != NULL && chunk >= 0 && - chunk < info_ptr->unknown_chunks_num) - { - if ((location & (PNG_HAVE_IHDR|PNG_HAVE_PLTE|PNG_AFTER_IDAT)) == 0) - { - png_app_error(png_ptr, "invalid unknown chunk location"); - /* Fake out the pre 1.6.0 behavior: */ - if ((location & PNG_HAVE_IDAT)) /* undocumented! */ - location = PNG_AFTER_IDAT; - - else - location = PNG_HAVE_IHDR; /* also undocumented */ - } - - info_ptr->unknown_chunks[chunk].location = - check_location(png_ptr, location); - } -} -#endif - - -#ifdef PNG_MNG_FEATURES_SUPPORTED -png_uint_32 PNGAPI -png_permit_mng_features (png_structrp png_ptr, png_uint_32 mng_features) -{ - png_debug(1, "in png_permit_mng_features"); - - if (png_ptr == NULL) - return 0; - - png_ptr->mng_features_permitted = mng_features & PNG_ALL_MNG_FEATURES; - - return png_ptr->mng_features_permitted; -} -#endif - -#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED -static unsigned int -add_one_chunk(png_bytep list, unsigned int count, png_const_bytep add, int keep) -{ - unsigned int i; - - /* Utility function: update the 'keep' state of a chunk if it is already in - * the list, otherwise add it to the list. - */ - for (i=0; i= PNG_HANDLE_CHUNK_LAST) - { - png_app_error(png_ptr, "png_set_keep_unknown_chunks: invalid keep"); - return; - } - - if (num_chunks_in <= 0) - { - png_ptr->unknown_default = keep; - - /* '0' means just set the flags, so stop here */ - if (num_chunks_in == 0) - return; - } - - if (num_chunks_in < 0) - { - /* Ignore all unknown chunks and all chunks recognized by - * libpng except for IHDR, PLTE, tRNS, IDAT, and IEND - */ - static PNG_CONST png_byte chunks_to_ignore[] = { - 98, 75, 71, 68, '\0', /* bKGD */ - 99, 72, 82, 77, '\0', /* cHRM */ - 103, 65, 77, 65, '\0', /* gAMA */ - 104, 73, 83, 84, '\0', /* hIST */ - 105, 67, 67, 80, '\0', /* iCCP */ - 105, 84, 88, 116, '\0', /* iTXt */ - 111, 70, 70, 115, '\0', /* oFFs */ - 112, 67, 65, 76, '\0', /* pCAL */ - 112, 72, 89, 115, '\0', /* pHYs */ - 115, 66, 73, 84, '\0', /* sBIT */ - 115, 67, 65, 76, '\0', /* sCAL */ - 115, 80, 76, 84, '\0', /* sPLT */ - 115, 84, 69, 82, '\0', /* sTER */ - 115, 82, 71, 66, '\0', /* sRGB */ - 116, 69, 88, 116, '\0', /* tEXt */ - 116, 73, 77, 69, '\0', /* tIME */ - 122, 84, 88, 116, '\0' /* zTXt */ - }; - - chunk_list = chunks_to_ignore; - num_chunks = (sizeof chunks_to_ignore)/5; - } - - else /* num_chunks_in > 0 */ - { - if (chunk_list == NULL) - { - /* Prior to 1.6.0 this was silently ignored, now it is an app_error - * which can be switched off. - */ - png_app_error(png_ptr, "png_set_keep_unknown_chunks: no chunk list"); - return; - } - - num_chunks = num_chunks_in; - } - - old_num_chunks = png_ptr->num_chunk_list; - if (png_ptr->chunk_list == NULL) - old_num_chunks = 0; - - /* Since num_chunks is always restricted to UINT_MAX/5 this can't overflow. - */ - if (num_chunks + old_num_chunks > UINT_MAX/5) - { - png_app_error(png_ptr, "png_set_keep_unknown_chunks: too many chunks"); - return; - } - - /* If these chunks are being reset to the default then no more memory is - * required because add_one_chunk above doesn't extend the list if the 'keep' - * parameter is the default. - */ - if (keep) - { - new_list = png_voidcast(png_bytep, png_malloc(png_ptr, - 5 * (num_chunks + old_num_chunks))); - - if (old_num_chunks > 0) - memcpy(new_list, png_ptr->chunk_list, 5*old_num_chunks); - } - - else if (old_num_chunks > 0) - new_list = png_ptr->chunk_list; - - else - new_list = NULL; - - /* Add the new chunks together with each one's handling code. If the chunk - * already exists the code is updated, otherwise the chunk is added to the - * end. (In libpng 1.6.0 order no longer matters because this code enforces - * the earlier convention that the last setting is the one that is used.) - */ - if (new_list != NULL) - { - png_const_bytep inlist; - png_bytep outlist; - unsigned int i; - - for (i=0; ichunk_list != new_list) - png_free(png_ptr, new_list); - - new_list = NULL; - } - } - - else - num_chunks = 0; - - png_ptr->num_chunk_list = num_chunks; - - if (png_ptr->chunk_list != new_list) - { - if (png_ptr->chunk_list != NULL) - png_free(png_ptr, png_ptr->chunk_list); - - png_ptr->chunk_list = new_list; - } -} -#endif - -#ifdef PNG_READ_USER_CHUNKS_SUPPORTED -void PNGAPI -png_set_read_user_chunk_fn(png_structrp png_ptr, png_voidp user_chunk_ptr, - png_user_chunk_ptr read_user_chunk_fn) -{ - png_debug(1, "in png_set_read_user_chunk_fn"); - - if (png_ptr == NULL) - return; - - png_ptr->read_user_chunk_fn = read_user_chunk_fn; - png_ptr->user_chunk_ptr = user_chunk_ptr; -} -#endif - -#ifdef PNG_INFO_IMAGE_SUPPORTED -void PNGAPI -png_set_rows(png_const_structrp png_ptr, png_inforp info_ptr, - png_bytepp row_pointers) -{ - png_debug1(1, "in %s storage function", "rows"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers)) - png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0); - - info_ptr->row_pointers = row_pointers; - - if (row_pointers) - info_ptr->valid |= PNG_INFO_IDAT; -} -#endif - -void PNGAPI -png_set_compression_buffer_size(png_structrp png_ptr, png_size_t size) -{ - if (png_ptr == NULL) - return; - - if (size == 0 || size > PNG_UINT_31_MAX) - png_error(png_ptr, "invalid compression buffer size"); - -# ifdef PNG_SEQUENTIAL_READ_SUPPORTED - if (png_ptr->mode & PNG_IS_READ_STRUCT) - { - png_ptr->IDAT_read_size = (png_uint_32)size; /* checked above */ - return; - } -# endif - -# ifdef PNG_WRITE_SUPPORTED - if (!(png_ptr->mode & PNG_IS_READ_STRUCT)) - { - if (png_ptr->zowner != 0) - { - png_warning(png_ptr, - "Compression buffer size cannot be changed because it is in use"); - return; - } - - if (size > ZLIB_IO_MAX) - { - png_warning(png_ptr, - "Compression buffer size limited to system maximum"); - size = ZLIB_IO_MAX; /* must fit */ - } - - else if (size < 6) - { - /* Deflate will potentially go into an infinite loop on a SYNC_FLUSH - * if this is permitted. - */ - png_warning(png_ptr, - "Compression buffer size cannot be reduced below 6"); - return; - } - - if (png_ptr->zbuffer_size != size) - { - png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list); - png_ptr->zbuffer_size = (uInt)size; - } - } -# endif -} - -void PNGAPI -png_set_invalid(png_const_structrp png_ptr, png_inforp info_ptr, int mask) -{ - if (png_ptr && info_ptr) - info_ptr->valid &= ~mask; -} - - -#ifdef PNG_SET_USER_LIMITS_SUPPORTED -/* This function was added to libpng 1.2.6 */ -void PNGAPI -png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max, - png_uint_32 user_height_max) -{ - /* Images with dimensions larger than these limits will be - * rejected by png_set_IHDR(). To accept any PNG datastream - * regardless of dimensions, set both limits to 0x7ffffffL. - */ - if (png_ptr == NULL) - return; - - png_ptr->user_width_max = user_width_max; - png_ptr->user_height_max = user_height_max; -} - -/* This function was added to libpng 1.4.0 */ -void PNGAPI -png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max) -{ - if (png_ptr) - png_ptr->user_chunk_cache_max = user_chunk_cache_max; -} - -/* This function was added to libpng 1.4.1 */ -void PNGAPI -png_set_chunk_malloc_max (png_structrp png_ptr, - png_alloc_size_t user_chunk_malloc_max) -{ - if (png_ptr) - png_ptr->user_chunk_malloc_max = user_chunk_malloc_max; -} -#endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ - - -#ifdef PNG_BENIGN_ERRORS_SUPPORTED -void PNGAPI -png_set_benign_errors(png_structrp png_ptr, int allowed) -{ - png_debug(1, "in png_set_benign_errors"); - - /* If allowed is 1, png_benign_error() is treated as a warning. - * - * If allowed is 0, png_benign_error() is treated as an error (which - * is the default behavior if png_set_benign_errors() is not called). - */ - - if (allowed) - png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN | - PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN; - - else - png_ptr->flags &= ~(PNG_FLAG_BENIGN_ERRORS_WARN | - PNG_FLAG_APP_WARNINGS_WARN | PNG_FLAG_APP_ERRORS_WARN); -} -#endif /* PNG_BENIGN_ERRORS_SUPPORTED */ - -#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED - /* Whether to report invalid palette index; added at libng-1.5.10. - * It is possible for an indexed (color-type==3) PNG file to contain - * pixels with invalid (out-of-range) indexes if the PLTE chunk has - * fewer entries than the image's bit-depth would allow. We recover - * from this gracefully by filling any incomplete palette with zeroes - * (opaque black). By default, when this occurs libpng will issue - * a benign error. This API can be used to override that behavior. - */ -void PNGAPI -png_set_check_for_invalid_index(png_structrp png_ptr, int allowed) -{ - png_debug(1, "in png_set_check_for_invalid_index"); - - if (allowed > 0) - png_ptr->num_palette_max = 0; - - else - png_ptr->num_palette_max = -1; -} -#endif -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngstruct.h b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngstruct.h deleted file mode 100755 index 89605b1..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngstruct.h +++ /dev/null @@ -1,489 +0,0 @@ - -/* pngstruct.h - header file for PNG reference library - * - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - */ - -/* The structure that holds the information to read and write PNG files. - * The only people who need to care about what is inside of this are the - * people who will be modifying the library for their own special needs. - * It should NOT be accessed directly by an application. - */ - -#ifndef PNGSTRUCT_H -#define PNGSTRUCT_H -/* zlib.h defines the structure z_stream, an instance of which is included - * in this structure and is required for decompressing the LZ compressed - * data in PNG files. - */ -#ifndef ZLIB_CONST - /* We must ensure that zlib uses 'const' in declarations. */ -# define ZLIB_CONST -#endif -#include "../../../juce_core/zip/zlib/zlib.h" -#ifdef const - /* zlib.h sometimes #defines const to nothing, undo this. */ -# undef const -#endif - -/* zlib.h has mediocre z_const use before 1.2.6, this stuff is for compatibility - * with older builds. - */ -#if ZLIB_VERNUM < 0x1260 -# define PNGZ_MSG_CAST(s) png_constcast(char*,s) -# define PNGZ_INPUT_CAST(b) png_constcast(png_bytep,b) -#else -# define PNGZ_MSG_CAST(s) (s) -# define PNGZ_INPUT_CAST(b) (b) -#endif - -/* zlib.h declares a magic type 'uInt' that limits the amount of data that zlib - * can handle at once. This type need be no larger than 16 bits (so maximum of - * 65535), this define allows us to discover how big it is, but limited by the - * maximuum for png_size_t. The value can be overriden in a library build - * (pngusr.h, or set it in CPPFLAGS) and it works to set it to a considerably - * lower value (e.g. 255 works). A lower value may help memory usage (slightly) - * and may even improve performance on some systems (and degrade it on others.) - */ -#ifndef ZLIB_IO_MAX -# define ZLIB_IO_MAX ((uInt)-1) -#endif - -#ifdef PNG_WRITE_SUPPORTED -/* The type of a compression buffer list used by the write code. */ -typedef struct png_compression_buffer -{ - struct png_compression_buffer *next; - png_byte output[1]; /* actually zbuf_size */ -} png_compression_buffer, *png_compression_bufferp; - -#define PNG_COMPRESSION_BUFFER_SIZE(pp)\ - (offsetof(png_compression_buffer, output) + (pp)->zbuffer_size) -#endif - -/* Colorspace support; structures used in png_struct, png_info and in internal - * functions to hold and communicate information about the color space. - * - * PNG_COLORSPACE_SUPPORTED is only required if the application will perform - * colorspace corrections, otherwise all the colorspace information can be - * skipped and the size of libpng can be reduced (significantly) by compiling - * out the colorspace support. - */ -#ifdef PNG_COLORSPACE_SUPPORTED -/* The chromaticities of the red, green and blue colorants and the chromaticity - * of the corresponding white point (i.e. of rgb(1.0,1.0,1.0)). - */ -typedef struct png_xy -{ - png_fixed_point redx, redy; - png_fixed_point greenx, greeny; - png_fixed_point bluex, bluey; - png_fixed_point whitex, whitey; -} png_xy; - -/* The same data as above but encoded as CIE XYZ values. When this data comes - * from chromaticities the sum of the Y values is assumed to be 1.0 - */ -typedef struct png_XYZ -{ - png_fixed_point red_X, red_Y, red_Z; - png_fixed_point green_X, green_Y, green_Z; - png_fixed_point blue_X, blue_Y, blue_Z; -} png_XYZ; -#endif /* COLORSPACE */ - -#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED) -/* A colorspace is all the above plus, potentially, profile information, - * however at present libpng does not use the profile internally so it is only - * stored in the png_info struct (if iCCP is supported.) The rendering intent - * is retained here and is checked. - * - * The file gamma encoding information is also stored here and gamma correction - * is done by libpng, whereas color correction must currently be done by the - * application. - */ -typedef struct png_colorspace -{ -#ifdef PNG_GAMMA_SUPPORTED - png_fixed_point gamma; /* File gamma */ -#endif - -#ifdef PNG_COLORSPACE_SUPPORTED - png_xy end_points_xy; /* End points as chromaticities */ - png_XYZ end_points_XYZ; /* End points as CIE XYZ colorant values */ - png_uint_16 rendering_intent; /* Rendering intent of a profile */ -#endif - - /* Flags are always defined to simplify the code. */ - png_uint_16 flags; /* As defined below */ -} png_colorspace, * PNG_RESTRICT png_colorspacerp; - -typedef const png_colorspace * PNG_RESTRICT png_const_colorspacerp; - -/* General flags for the 'flags' field */ -#define PNG_COLORSPACE_HAVE_GAMMA 0x0001 -#define PNG_COLORSPACE_HAVE_ENDPOINTS 0x0002 -#define PNG_COLORSPACE_HAVE_INTENT 0x0004 -#define PNG_COLORSPACE_FROM_gAMA 0x0008 -#define PNG_COLORSPACE_FROM_cHRM 0x0010 -#define PNG_COLORSPACE_FROM_sRGB 0x0020 -#define PNG_COLORSPACE_ENDPOINTS_MATCH_sRGB 0x0040 -#define PNG_COLORSPACE_MATCHES_sRGB 0x0080 /* exact match on profile */ -#define PNG_COLORSPACE_INVALID 0x8000 -#define PNG_COLORSPACE_CANCEL(flags) (0xffff ^ (flags)) -#endif /* COLORSPACE || GAMMA */ - -struct png_struct_def -{ -#ifdef PNG_SETJMP_SUPPORTED - jmp_buf jmp_buf_local; /* New name in 1.6.0 for jmp_buf in png_struct */ - png_longjmp_ptr longjmp_fn;/* setjmp non-local goto function. */ - jmp_buf *jmp_buf_ptr; /* passed to longjmp_fn */ - size_t jmp_buf_size; /* size of the above, if allocated */ -#endif - png_error_ptr error_fn; /* function for printing errors and aborting */ -#ifdef PNG_WARNINGS_SUPPORTED - png_error_ptr warning_fn; /* function for printing warnings */ -#endif - png_voidp error_ptr; /* user supplied struct for error functions */ - png_rw_ptr write_data_fn; /* function for writing output data */ - png_rw_ptr read_data_fn; /* function for reading input data */ - png_voidp io_ptr; /* ptr to application struct for I/O functions */ - -#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED - png_user_transform_ptr read_user_transform_fn; /* user read transform */ -#endif - -#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED - png_user_transform_ptr write_user_transform_fn; /* user write transform */ -#endif - -/* These were added in libpng-1.0.2 */ -#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) - png_voidp user_transform_ptr; /* user supplied struct for user transform */ - png_byte user_transform_depth; /* bit depth of user transformed pixels */ - png_byte user_transform_channels; /* channels in user transformed pixels */ -#endif -#endif - - png_uint_32 mode; /* tells us where we are in the PNG file */ - png_uint_32 flags; /* flags indicating various things to libpng */ - png_uint_32 transformations; /* which transformations to perform */ - - png_uint_32 zowner; /* ID (chunk type) of zstream owner, 0 if none */ - z_stream zstream; /* decompression structure */ - -#ifdef PNG_WRITE_SUPPORTED - png_compression_bufferp zbuffer_list; /* Created on demand during write */ - uInt zbuffer_size; /* size of the actual buffer */ - - int zlib_level; /* holds zlib compression level */ - int zlib_method; /* holds zlib compression method */ - int zlib_window_bits; /* holds zlib compression window bits */ - int zlib_mem_level; /* holds zlib compression memory level */ - int zlib_strategy; /* holds zlib compression strategy */ -#endif -/* Added at libpng 1.5.4 */ -#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED - int zlib_text_level; /* holds zlib compression level */ - int zlib_text_method; /* holds zlib compression method */ - int zlib_text_window_bits; /* holds zlib compression window bits */ - int zlib_text_mem_level; /* holds zlib compression memory level */ - int zlib_text_strategy; /* holds zlib compression strategy */ -#endif -/* End of material added at libpng 1.5.4 */ -/* Added at libpng 1.6.0 */ -#ifdef PNG_WRITE_SUPPORTED - int zlib_set_level; /* Actual values set into the zstream on write */ - int zlib_set_method; - int zlib_set_window_bits; - int zlib_set_mem_level; - int zlib_set_strategy; -#endif - - png_uint_32 width; /* width of image in pixels */ - png_uint_32 height; /* height of image in pixels */ - png_uint_32 num_rows; /* number of rows in current pass */ - png_uint_32 usr_width; /* width of row at start of write */ - png_size_t rowbytes; /* size of row in bytes */ - png_uint_32 iwidth; /* width of current interlaced row in pixels */ - png_uint_32 row_number; /* current row in interlace pass */ - png_uint_32 chunk_name; /* PNG_CHUNK() id of current chunk */ - png_bytep prev_row; /* buffer to save previous (unfiltered) row. - * This is a pointer into big_prev_row - */ - png_bytep row_buf; /* buffer to save current (unfiltered) row. - * This is a pointer into big_row_buf - */ -#ifdef PNG_WRITE_SUPPORTED - png_bytep sub_row; /* buffer to save "sub" row when filtering */ - png_bytep up_row; /* buffer to save "up" row when filtering */ - png_bytep avg_row; /* buffer to save "avg" row when filtering */ - png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ -#endif - png_size_t info_rowbytes; /* Added in 1.5.4: cache of updated row bytes */ - - png_uint_32 idat_size; /* current IDAT size for read */ - png_uint_32 crc; /* current chunk CRC value */ - png_colorp palette; /* palette from the input file */ - png_uint_16 num_palette; /* number of color entries in palette */ - -/* Added at libpng-1.5.10 */ -#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED - int num_palette_max; /* maximum palette index found in IDAT */ -#endif - - png_uint_16 num_trans; /* number of transparency values */ - png_byte compression; /* file compression type (always 0) */ - png_byte filter; /* file filter type (always 0) */ - png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ - png_byte pass; /* current interlace pass (0 - 6) */ - png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ - png_byte color_type; /* color type of file */ - png_byte bit_depth; /* bit depth of file */ - png_byte usr_bit_depth; /* bit depth of users row: write only */ - png_byte pixel_depth; /* number of bits per pixel */ - png_byte channels; /* number of channels in file */ -#ifdef PNG_WRITE_SUPPORTED - png_byte usr_channels; /* channels at start of write: write only */ -#endif - png_byte sig_bytes; /* magic bytes read/written from start of file */ - png_byte maximum_pixel_depth; - /* pixel depth used for the row buffers */ - png_byte transformed_pixel_depth; - /* pixel depth after read/write transforms */ -#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) - png_uint_16 filler; /* filler bytes for pixel expansion */ -#endif - -#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) ||\ - defined(PNG_READ_ALPHA_MODE_SUPPORTED) - png_byte background_gamma_type; - png_fixed_point background_gamma; - png_color_16 background; /* background color in screen gamma space */ -#ifdef PNG_READ_GAMMA_SUPPORTED - png_color_16 background_1; /* background normalized to gamma 1.0 */ -#endif -#endif /* PNG_bKGD_SUPPORTED */ - -#ifdef PNG_WRITE_FLUSH_SUPPORTED - png_flush_ptr output_flush_fn; /* Function for flushing output */ - png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ - png_uint_32 flush_rows; /* number of rows written since last flush */ -#endif - -#ifdef PNG_READ_GAMMA_SUPPORTED - int gamma_shift; /* number of "insignificant" bits in 16-bit gamma */ - png_fixed_point screen_gamma; /* screen gamma value (display_exponent) */ - - png_bytep gamma_table; /* gamma table for 8-bit depth files */ - png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ -#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \ - defined(PNG_READ_ALPHA_MODE_SUPPORTED) || \ - defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) - png_bytep gamma_from_1; /* converts from 1.0 to screen */ - png_bytep gamma_to_1; /* converts from file to 1.0 */ - png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ - png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ -#endif /* READ_BACKGROUND || READ_ALPHA_MODE || RGB_TO_GRAY */ -#endif - -#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) - png_color_8 sig_bit; /* significant bits in each available channel */ -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) - png_color_8 shift; /* shift for significant bit tranformation */ -#endif - -#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ - || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) - png_bytep trans_alpha; /* alpha values for paletted files */ - png_color_16 trans_color; /* transparent color for non-paletted files */ -#endif - - png_read_status_ptr read_row_fn; /* called after each row is decoded */ - png_write_status_ptr write_row_fn; /* called after each row is encoded */ -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED - png_progressive_info_ptr info_fn; /* called after header data fully read */ - png_progressive_row_ptr row_fn; /* called after a prog. row is decoded */ - png_progressive_end_ptr end_fn; /* called after image is complete */ - png_bytep save_buffer_ptr; /* current location in save_buffer */ - png_bytep save_buffer; /* buffer for previously read data */ - png_bytep current_buffer_ptr; /* current location in current_buffer */ - png_bytep current_buffer; /* buffer for recently used data */ - png_uint_32 push_length; /* size of current input chunk */ - png_uint_32 skip_length; /* bytes to skip in input data */ - png_size_t save_buffer_size; /* amount of data now in save_buffer */ - png_size_t save_buffer_max; /* total size of save_buffer */ - png_size_t buffer_size; /* total amount of available input data */ - png_size_t current_buffer_size; /* amount of data now in current_buffer */ - int process_mode; /* what push library is currently doing */ - int cur_palette; /* current push library palette index */ - -#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ - -#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) -/* For the Borland special 64K segment handler */ - png_bytepp offset_table_ptr; - png_bytep offset_table; - png_uint_16 offset_table_number; - png_uint_16 offset_table_count; - png_uint_16 offset_table_count_free; -#endif - -#ifdef PNG_READ_QUANTIZE_SUPPORTED - png_bytep palette_lookup; /* lookup table for quantizing */ - png_bytep quantize_index; /* index translation for palette files */ -#endif - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - png_byte heuristic_method; /* heuristic for row filter selection */ - png_byte num_prev_filters; /* number of weights for previous rows */ - png_bytep prev_filters; /* filter type(s) of previous row(s) */ - png_uint_16p filter_weights; /* weight(s) for previous line(s) */ - png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ - png_uint_16p filter_costs; /* relative filter calculation cost */ - png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ -#endif - - /* Options */ -#ifdef PNG_SET_OPTION_SUPPORTED - png_byte options; /* On/off state (up to 4 options) */ -#endif - -#if PNG_LIBPNG_VER < 10700 -/* To do: remove this from libpng-1.7 */ -#ifdef PNG_TIME_RFC1123_SUPPORTED - char time_buffer[29]; /* String to hold RFC 1123 time text */ -#endif -#endif - -/* New members added in libpng-1.0.6 */ - - png_uint_32 free_me; /* flags items libpng is responsible for freeing */ - -#ifdef PNG_USER_CHUNKS_SUPPORTED - png_voidp user_chunk_ptr; -#ifdef PNG_READ_USER_CHUNKS_SUPPORTED - png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ -#endif -#endif - -#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED - int unknown_default; /* As PNG_HANDLE_* */ - unsigned int num_chunk_list; /* Number of entries in the list */ - png_bytep chunk_list; /* List of png_byte[5]; the textual chunk name - * followed by a PNG_HANDLE_* byte */ -#endif - -/* New members added in libpng-1.0.3 */ -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED - png_byte rgb_to_gray_status; - /* Added in libpng 1.5.5 to record setting of coefficients: */ - png_byte rgb_to_gray_coefficients_set; - /* These were changed from png_byte in libpng-1.0.6 */ - png_uint_16 rgb_to_gray_red_coeff; - png_uint_16 rgb_to_gray_green_coeff; - /* deleted in 1.5.5: rgb_to_gray_blue_coeff; */ -#endif - -/* New member added in libpng-1.0.4 (renamed in 1.0.9) */ -#if defined(PNG_MNG_FEATURES_SUPPORTED) -/* Changed from png_byte to png_uint_32 at version 1.2.0 */ - png_uint_32 mng_features_permitted; -#endif - -/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ -#ifdef PNG_MNG_FEATURES_SUPPORTED - png_byte filter_type; -#endif - -/* New members added in libpng-1.2.0 */ - -/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ -#ifdef PNG_USER_MEM_SUPPORTED - png_voidp mem_ptr; /* user supplied struct for mem functions */ - png_malloc_ptr malloc_fn; /* function for allocating memory */ - png_free_ptr free_fn; /* function for freeing memory */ -#endif - -/* New member added in libpng-1.0.13 and 1.2.0 */ - png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ - -#ifdef PNG_READ_QUANTIZE_SUPPORTED -/* The following three members were added at version 1.0.14 and 1.2.4 */ - png_bytep quantize_sort; /* working sort array */ - png_bytep index_to_palette; /* where the original index currently is - in the palette */ - png_bytep palette_to_index; /* which original index points to this - palette color */ -#endif - -/* New members added in libpng-1.0.16 and 1.2.6 */ - png_byte compression_type; - -#ifdef PNG_USER_LIMITS_SUPPORTED - png_uint_32 user_width_max; - png_uint_32 user_height_max; - - /* Added in libpng-1.4.0: Total number of sPLT, text, and unknown - * chunks that can be stored (0 means unlimited). - */ - png_uint_32 user_chunk_cache_max; - - /* Total memory that a zTXt, sPLT, iTXt, iCCP, or unknown chunk - * can occupy when decompressed. 0 means unlimited. - */ - png_alloc_size_t user_chunk_malloc_max; -#endif - -/* New member added in libpng-1.0.25 and 1.2.17 */ -#ifdef PNG_READ_UNKNOWN_CHUNKS_SUPPORTED - /* Temporary storage for unknown chunk that the library doesn't recognize, - * used while reading the chunk. - */ - png_unknown_chunk unknown_chunk; -#endif - -/* New member added in libpng-1.2.26 */ - png_size_t old_big_row_buf_size; - -#ifdef PNG_READ_SUPPORTED -/* New member added in libpng-1.2.30 */ - png_bytep read_buffer; /* buffer for reading chunk data */ - png_alloc_size_t read_buffer_size; /* current size of the buffer */ -#endif -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED - uInt IDAT_read_size; /* limit on read buffer size for IDAT */ -#endif - -#ifdef PNG_IO_STATE_SUPPORTED -/* New member added in libpng-1.4.0 */ - png_uint_32 io_state; -#endif - -/* New member added in libpng-1.5.6 */ - png_bytep big_prev_row; - -/* New member added in libpng-1.5.7 */ - void (*read_filter[PNG_FILTER_VALUE_LAST-1])(png_row_infop row_info, - png_bytep row, png_const_bytep prev_row); - -#ifdef PNG_READ_SUPPORTED -#if defined(PNG_COLORSPACE_SUPPORTED) || defined(PNG_GAMMA_SUPPORTED) - png_colorspace colorspace; -#endif -#endif -}; -#endif /* PNGSTRUCT_H */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngtrans.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngtrans.c deleted file mode 100755 index 20558af..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngtrans.c +++ /dev/null @@ -1,830 +0,0 @@ - -/* pngtrans.c - transforms the data in a row (used by both readers and writers) - * - * Last changed in libpng 1.6.0 [February 14, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - */ - -#include "pngpriv.h" - -#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -/* Turn on BGR-to-RGB mapping */ -void PNGAPI -png_set_bgr(png_structrp png_ptr) -{ - png_debug(1, "in png_set_bgr"); - - if (png_ptr == NULL) - return; - - png_ptr->transformations |= PNG_BGR; -} -#endif - -#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -/* Turn on 16 bit byte swapping */ -void PNGAPI -png_set_swap(png_structrp png_ptr) -{ - png_debug(1, "in png_set_swap"); - - if (png_ptr == NULL) - return; - - if (png_ptr->bit_depth == 16) - png_ptr->transformations |= PNG_SWAP_BYTES; -} -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) -/* Turn on pixel packing */ -void PNGAPI -png_set_packing(png_structrp png_ptr) -{ - png_debug(1, "in png_set_packing"); - - if (png_ptr == NULL) - return; - - if (png_ptr->bit_depth < 8) - { - png_ptr->transformations |= PNG_PACK; - png_ptr->usr_bit_depth = 8; - } -} -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) -/* Turn on packed pixel swapping */ -void PNGAPI -png_set_packswap(png_structrp png_ptr) -{ - png_debug(1, "in png_set_packswap"); - - if (png_ptr == NULL) - return; - - if (png_ptr->bit_depth < 8) - png_ptr->transformations |= PNG_PACKSWAP; -} -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) -void PNGAPI -png_set_shift(png_structrp png_ptr, png_const_color_8p true_bits) -{ - png_debug(1, "in png_set_shift"); - - if (png_ptr == NULL) - return; - - png_ptr->transformations |= PNG_SHIFT; - png_ptr->shift = *true_bits; -} -#endif - -#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ - defined(PNG_WRITE_INTERLACING_SUPPORTED) -int PNGAPI -png_set_interlace_handling(png_structrp png_ptr) -{ - png_debug(1, "in png_set_interlace handling"); - - if (png_ptr && png_ptr->interlaced) - { - png_ptr->transformations |= PNG_INTERLACE; - return (7); - } - - return (1); -} -#endif - -#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) -/* Add a filler byte on read, or remove a filler or alpha byte on write. - * The filler type has changed in v0.95 to allow future 2-byte fillers - * for 48-bit input data, as well as to avoid problems with some compilers - * that don't like bytes as parameters. - */ -void PNGAPI -png_set_filler(png_structrp png_ptr, png_uint_32 filler, int filler_loc) -{ - png_debug(1, "in png_set_filler"); - - if (png_ptr == NULL) - return; - - /* In libpng 1.6 it is possible to determine whether this is a read or write - * operation and therefore to do more checking here for a valid call. - */ - if (png_ptr->mode & PNG_IS_READ_STRUCT) - { -# ifdef PNG_READ_FILLER_SUPPORTED - /* On read png_set_filler is always valid, regardless of the base PNG - * format, because other transformations can give a format where the - * filler code can execute (basically an 8 or 16-bit component RGB or G - * format.) - * - * NOTE: usr_channels is not used by the read code! (This has led to - * confusion in the past.) The filler is only used in the read code. - */ - png_ptr->filler = (png_uint_16)filler; -# else - png_app_error(png_ptr, "png_set_filler not supported on read"); - PNG_UNUSED(filler) /* not used in the write case */ - return; -# endif - } - - else /* write */ - { -# ifdef PNG_WRITE_FILLER_SUPPORTED - /* On write the usr_channels parameter must be set correctly at the - * start to record the number of channels in the app-supplied data. - */ - switch (png_ptr->color_type) - { - case PNG_COLOR_TYPE_RGB: - png_ptr->usr_channels = 4; - break; - - case PNG_COLOR_TYPE_GRAY: - if (png_ptr->bit_depth >= 8) - { - png_ptr->usr_channels = 2; - break; - } - - else - { - /* There simply isn't any code in libpng to strip out bits - * from bytes when the components are less than a byte in - * size! - */ - png_app_error(png_ptr, - "png_set_filler is invalid for low bit depth gray output"); - return; - } - - default: - png_app_error(png_ptr, - "png_set_filler: inappropriate color type"); - return; - } -# else - png_app_error(png_ptr, "png_set_filler not supported on write"); - return; -# endif - } - - /* Here on success - libpng supports the operation, set the transformation - * and the flag to say where the filler channel is. - */ - png_ptr->transformations |= PNG_FILLER; - - if (filler_loc == PNG_FILLER_AFTER) - png_ptr->flags |= PNG_FLAG_FILLER_AFTER; - - else - png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER; -} - -/* Added to libpng-1.2.7 */ -void PNGAPI -png_set_add_alpha(png_structrp png_ptr, png_uint_32 filler, int filler_loc) -{ - png_debug(1, "in png_set_add_alpha"); - - if (png_ptr == NULL) - return; - - png_set_filler(png_ptr, filler, filler_loc); - /* The above may fail to do anything. */ - if (png_ptr->transformations & PNG_FILLER) - png_ptr->transformations |= PNG_ADD_ALPHA; -} - -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -void PNGAPI -png_set_swap_alpha(png_structrp png_ptr) -{ - png_debug(1, "in png_set_swap_alpha"); - - if (png_ptr == NULL) - return; - - png_ptr->transformations |= PNG_SWAP_ALPHA; -} -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -void PNGAPI -png_set_invert_alpha(png_structrp png_ptr) -{ - png_debug(1, "in png_set_invert_alpha"); - - if (png_ptr == NULL) - return; - - png_ptr->transformations |= PNG_INVERT_ALPHA; -} -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) -void PNGAPI -png_set_invert_mono(png_structrp png_ptr) -{ - png_debug(1, "in png_set_invert_mono"); - - if (png_ptr == NULL) - return; - - png_ptr->transformations |= PNG_INVERT_MONO; -} - -/* Invert monochrome grayscale data */ -void /* PRIVATE */ -png_do_invert(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_invert"); - - /* This test removed from libpng version 1.0.13 and 1.2.0: - * if (row_info->bit_depth == 1 && - */ - if (row_info->color_type == PNG_COLOR_TYPE_GRAY) - { - png_bytep rp = row; - png_size_t i; - png_size_t istop = row_info->rowbytes; - - for (i = 0; i < istop; i++) - { - *rp = (png_byte)(~(*rp)); - rp++; - } - } - - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && - row_info->bit_depth == 8) - { - png_bytep rp = row; - png_size_t i; - png_size_t istop = row_info->rowbytes; - - for (i = 0; i < istop; i += 2) - { - *rp = (png_byte)(~(*rp)); - rp += 2; - } - } - -#ifdef PNG_16BIT_SUPPORTED - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && - row_info->bit_depth == 16) - { - png_bytep rp = row; - png_size_t i; - png_size_t istop = row_info->rowbytes; - - for (i = 0; i < istop; i += 4) - { - *rp = (png_byte)(~(*rp)); - *(rp + 1) = (png_byte)(~(*(rp + 1))); - rp += 4; - } - } -#endif -} -#endif - -#ifdef PNG_16BIT_SUPPORTED -#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -/* Swaps byte order on 16 bit depth images */ -void /* PRIVATE */ -png_do_swap(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_swap"); - - if (row_info->bit_depth == 16) - { - png_bytep rp = row; - png_uint_32 i; - png_uint_32 istop= row_info->width * row_info->channels; - - for (i = 0; i < istop; i++, rp += 2) - { - png_byte t = *rp; - *rp = *(rp + 1); - *(rp + 1) = t; - } - } -} -#endif -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED) -static PNG_CONST png_byte onebppswaptable[256] = { - 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, - 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, - 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, - 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, - 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, - 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, - 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, - 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, - 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, - 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, - 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, - 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, - 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, - 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, - 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, - 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, - 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, - 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, - 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, - 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, - 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, - 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, - 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, - 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, - 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, - 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, - 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, - 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, - 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, - 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, - 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, - 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF -}; - -static PNG_CONST png_byte twobppswaptable[256] = { - 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0, - 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0, - 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4, - 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4, - 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8, - 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8, - 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC, - 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC, - 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1, - 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1, - 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5, - 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5, - 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9, - 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9, - 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD, - 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD, - 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2, - 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2, - 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6, - 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6, - 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA, - 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA, - 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE, - 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE, - 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3, - 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3, - 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7, - 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7, - 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB, - 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB, - 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF, - 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF -}; - -static PNG_CONST png_byte fourbppswaptable[256] = { - 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, - 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, - 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, - 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, - 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, - 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, - 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, - 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, - 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, - 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, - 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, - 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, - 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, - 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, - 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, - 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, - 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, - 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, - 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, - 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, - 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, - 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, - 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, - 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, - 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, - 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, - 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, - 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, - 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, - 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, - 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, - 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF -}; - -/* Swaps pixel packing order within bytes */ -void /* PRIVATE */ -png_do_packswap(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_packswap"); - - if (row_info->bit_depth < 8) - { - png_bytep rp; - png_const_bytep end, table; - - end = row + row_info->rowbytes; - - if (row_info->bit_depth == 1) - table = onebppswaptable; - - else if (row_info->bit_depth == 2) - table = twobppswaptable; - - else if (row_info->bit_depth == 4) - table = fourbppswaptable; - - else - return; - - for (rp = row; rp < end; rp++) - *rp = table[*rp]; - } -} -#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */ - -#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ - defined(PNG_READ_STRIP_ALPHA_SUPPORTED) -/* Remove a channel - this used to be 'png_do_strip_filler' but it used a - * somewhat weird combination of flags to determine what to do. All the calls - * to png_do_strip_filler are changed in 1.5.2 to call this instead with the - * correct arguments. - * - * The routine isn't general - the channel must be the channel at the start or - * end (not in the middle) of each pixel. - */ -void /* PRIVATE */ -png_do_strip_channel(png_row_infop row_info, png_bytep row, int at_start) -{ - png_bytep sp = row; /* source pointer */ - png_bytep dp = row; /* destination pointer */ - png_bytep ep = row + row_info->rowbytes; /* One beyond end of row */ - - /* At the start sp will point to the first byte to copy and dp to where - * it is copied to. ep always points just beyond the end of the row, so - * the loop simply copies (channels-1) channels until sp reaches ep. - * - * at_start: 0 -- convert AG, XG, ARGB, XRGB, AAGG, XXGG, etc. - * nonzero -- convert GA, GX, RGBA, RGBX, GGAA, RRGGBBXX, etc. - */ - - /* GA, GX, XG cases */ - if (row_info->channels == 2) - { - if (row_info->bit_depth == 8) - { - if (at_start) /* Skip initial filler */ - ++sp; - else /* Skip initial channel and, for sp, the filler */ - sp += 2, ++dp; - - /* For a 1 pixel wide image there is nothing to do */ - while (sp < ep) - *dp++ = *sp, sp += 2; - - row_info->pixel_depth = 8; - } - - else if (row_info->bit_depth == 16) - { - if (at_start) /* Skip initial filler */ - sp += 2; - else /* Skip initial channel and, for sp, the filler */ - sp += 4, dp += 2; - - while (sp < ep) - *dp++ = *sp++, *dp++ = *sp, sp += 3; - - row_info->pixel_depth = 16; - } - - else - return; /* bad bit depth */ - - row_info->channels = 1; - - /* Finally fix the color type if it records an alpha channel */ - if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - row_info->color_type = PNG_COLOR_TYPE_GRAY; - } - - /* RGBA, RGBX, XRGB cases */ - else if (row_info->channels == 4) - { - if (row_info->bit_depth == 8) - { - if (at_start) /* Skip initial filler */ - ++sp; - else /* Skip initial channels and, for sp, the filler */ - sp += 4, dp += 3; - - /* Note that the loop adds 3 to dp and 4 to sp each time. */ - while (sp < ep) - *dp++ = *sp++, *dp++ = *sp++, *dp++ = *sp, sp += 2; - - row_info->pixel_depth = 24; - } - - else if (row_info->bit_depth == 16) - { - if (at_start) /* Skip initial filler */ - sp += 2; - else /* Skip initial channels and, for sp, the filler */ - sp += 8, dp += 6; - - while (sp < ep) - { - /* Copy 6 bytes, skip 2 */ - *dp++ = *sp++, *dp++ = *sp++; - *dp++ = *sp++, *dp++ = *sp++; - *dp++ = *sp++, *dp++ = *sp, sp += 3; - } - - row_info->pixel_depth = 48; - } - - else - return; /* bad bit depth */ - - row_info->channels = 3; - - /* Finally fix the color type if it records an alpha channel */ - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - row_info->color_type = PNG_COLOR_TYPE_RGB; - } - - else - return; /* The filler channel has gone already */ - - /* Fix the rowbytes value. */ - row_info->rowbytes = dp-row; -} -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -/* Swaps red and blue bytes within a pixel */ -void /* PRIVATE */ -png_do_bgr(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_bgr"); - - if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - png_uint_32 row_width = row_info->width; - if (row_info->bit_depth == 8) - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - { - png_bytep rp; - png_uint_32 i; - - for (i = 0, rp = row; i < row_width; i++, rp += 3) - { - png_byte save = *rp; - *rp = *(rp + 2); - *(rp + 2) = save; - } - } - - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - png_bytep rp; - png_uint_32 i; - - for (i = 0, rp = row; i < row_width; i++, rp += 4) - { - png_byte save = *rp; - *rp = *(rp + 2); - *(rp + 2) = save; - } - } - } - -#ifdef PNG_16BIT_SUPPORTED - else if (row_info->bit_depth == 16) - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - { - png_bytep rp; - png_uint_32 i; - - for (i = 0, rp = row; i < row_width; i++, rp += 6) - { - png_byte save = *rp; - *rp = *(rp + 4); - *(rp + 4) = save; - save = *(rp + 1); - *(rp + 1) = *(rp + 5); - *(rp + 5) = save; - } - } - - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - png_bytep rp; - png_uint_32 i; - - for (i = 0, rp = row; i < row_width; i++, rp += 8) - { - png_byte save = *rp; - *rp = *(rp + 4); - *(rp + 4) = save; - save = *(rp + 1); - *(rp + 1) = *(rp + 5); - *(rp + 5) = save; - } - } - } -#endif - } -} -#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */ - -#if defined(PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED) || \ - defined(PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED) -/* Added at libpng-1.5.10 */ -void /* PRIVATE */ -png_do_check_palette_indexes(png_structrp png_ptr, png_row_infop row_info) -{ - if (png_ptr->num_palette < (1 << row_info->bit_depth) && - png_ptr->num_palette > 0) /* num_palette can be 0 in MNG files */ - { - /* Calculations moved outside switch in an attempt to stop different - * compiler warnings. 'padding' is in *bits* within the last byte, it is - * an 'int' because pixel_depth becomes an 'int' in the expression below, - * and this calculation is used because it avoids warnings that other - * forms produced on either GCC or MSVC. - */ - int padding = (-row_info->pixel_depth * row_info->width) & 7; - png_bytep rp = png_ptr->row_buf + row_info->rowbytes; - - switch (row_info->bit_depth) - { - case 1: - { - /* in this case, all bytes must be 0 so we don't need - * to unpack the pixels except for the rightmost one. - */ - for (; rp > png_ptr->row_buf; rp--) - { - if (*rp >> padding != 0) - png_ptr->num_palette_max = 1; - padding = 0; - } - - break; - } - - case 2: - { - for (; rp > png_ptr->row_buf; rp--) - { - int i = ((*rp >> padding) & 0x03); - - if (i > png_ptr->num_palette_max) - png_ptr->num_palette_max = i; - - i = (((*rp >> padding) >> 2) & 0x03); - - if (i > png_ptr->num_palette_max) - png_ptr->num_palette_max = i; - - i = (((*rp >> padding) >> 4) & 0x03); - - if (i > png_ptr->num_palette_max) - png_ptr->num_palette_max = i; - - i = (((*rp >> padding) >> 6) & 0x03); - - if (i > png_ptr->num_palette_max) - png_ptr->num_palette_max = i; - - padding = 0; - } - - break; - } - - case 4: - { - for (; rp > png_ptr->row_buf; rp--) - { - int i = ((*rp >> padding) & 0x0f); - - if (i > png_ptr->num_palette_max) - png_ptr->num_palette_max = i; - - i = (((*rp >> padding) >> 4) & 0x0f); - - if (i > png_ptr->num_palette_max) - png_ptr->num_palette_max = i; - - padding = 0; - } - - break; - } - - case 8: - { - for (; rp > png_ptr->row_buf; rp--) - { - if (*rp > png_ptr->num_palette_max) - png_ptr->num_palette_max = (int) *rp; - } - - break; - } - - default: - break; - } - } -} -#endif /* PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED */ - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED -void PNGAPI -png_set_user_transform_info(png_structrp png_ptr, png_voidp - user_transform_ptr, int user_transform_depth, int user_transform_channels) -{ - png_debug(1, "in png_set_user_transform_info"); - - if (png_ptr == NULL) - return; - png_ptr->user_transform_ptr = user_transform_ptr; - png_ptr->user_transform_depth = (png_byte)user_transform_depth; - png_ptr->user_transform_channels = (png_byte)user_transform_channels; -} -#endif - -/* This function returns a pointer to the user_transform_ptr associated with - * the user transform functions. The application should free any memory - * associated with this pointer before png_write_destroy and png_read_destroy - * are called. - */ -#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED -png_voidp PNGAPI -png_get_user_transform_ptr(png_const_structrp png_ptr) -{ - if (png_ptr == NULL) - return (NULL); - - return png_ptr->user_transform_ptr; -} -#endif - -#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED -png_uint_32 PNGAPI -png_get_current_row_number(png_const_structrp png_ptr) -{ - /* See the comments in png.h - this is the sub-image row when reading and - * interlaced image. - */ - if (png_ptr != NULL) - return png_ptr->row_number; - - return PNG_UINT_32_MAX; /* help the app not to fail silently */ -} - -png_byte PNGAPI -png_get_current_pass_number(png_const_structrp png_ptr) -{ - if (png_ptr != NULL) - return png_ptr->pass; - return 8; /* invalid */ -} -#endif /* PNG_USER_TRANSFORM_INFO_SUPPORTED */ -#endif /* PNG_READ_USER_TRANSFORM_SUPPORTED || - PNG_WRITE_USER_TRANSFORM_SUPPORTED */ -#endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwio.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwio.c deleted file mode 100755 index c5fca98..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwio.c +++ /dev/null @@ -1,164 +0,0 @@ - -/* pngwio.c - functions for data output - * - * Last changed in libpng 1.6.0 [February 14, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - * This file provides a location for all output. Users who need - * special handling are expected to write functions that have the same - * arguments as these and perform similar functions, but that possibly - * use different output methods. Note that you shouldn't change these - * functions, but rather write replacement functions and then change - * them at run time with png_set_write_fn(...). - */ - -#include "pngpriv.h" - -#ifdef PNG_WRITE_SUPPORTED - -/* Write the data to whatever output you are using. The default routine - * writes to a file pointer. Note that this routine sometimes gets called - * with very small lengths, so you should implement some kind of simple - * buffering if you are using unbuffered writes. This should never be asked - * to write more than 64K on a 16 bit machine. - */ - -void /* PRIVATE */ -png_write_data(png_structrp png_ptr, png_const_bytep data, png_size_t length) -{ - /* NOTE: write_data_fn must not change the buffer! */ - if (png_ptr->write_data_fn != NULL ) - (*(png_ptr->write_data_fn))(png_ptr, png_constcast(png_bytep,data), - length); - - else - png_error(png_ptr, "Call to NULL write function"); -} - -#ifdef PNG_STDIO_SUPPORTED -/* This is the function that does the actual writing of data. If you are - * not writing to a standard C stream, you should create a replacement - * write_data function and use it at run time with png_set_write_fn(), rather - * than changing the library. - */ -void PNGCBAPI -png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_size_t check; - - if (png_ptr == NULL) - return; - - check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr)); - - if (check != length) - png_error(png_ptr, "Write Error"); -} -#endif - -/* This function is called to output any data pending writing (normally - * to disk). After png_flush is called, there should be no data pending - * writing in any buffers. - */ -#ifdef PNG_WRITE_FLUSH_SUPPORTED -void /* PRIVATE */ -png_flush(png_structrp png_ptr) -{ - if (png_ptr->output_flush_fn != NULL) - (*(png_ptr->output_flush_fn))(png_ptr); -} - -# ifdef PNG_STDIO_SUPPORTED -void PNGCBAPI -png_default_flush(png_structp png_ptr) -{ - png_FILE_p io_ptr; - - if (png_ptr == NULL) - return; - - io_ptr = png_voidcast(png_FILE_p, (png_ptr->io_ptr)); - fflush(io_ptr); -} -# endif -#endif - -/* This function allows the application to supply new output functions for - * libpng if standard C streams aren't being used. - * - * This function takes as its arguments: - * png_ptr - pointer to a png output data structure - * io_ptr - pointer to user supplied structure containing info about - * the output functions. May be NULL. - * write_data_fn - pointer to a new output function that takes as its - * arguments a pointer to a png_struct, a pointer to - * data to be written, and a 32-bit unsigned int that is - * the number of bytes to be written. The new write - * function should call png_error(png_ptr, "Error msg") - * to exit and output any fatal error messages. May be - * NULL, in which case libpng's default function will - * be used. - * flush_data_fn - pointer to a new flush function that takes as its - * arguments a pointer to a png_struct. After a call to - * the flush function, there should be no data in any buffers - * or pending transmission. If the output method doesn't do - * any buffering of output, a function prototype must still be - * supplied although it doesn't have to do anything. If - * PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile - * time, output_flush_fn will be ignored, although it must be - * supplied for compatibility. May be NULL, in which case - * libpng's default function will be used, if - * PNG_WRITE_FLUSH_SUPPORTED is defined. This is not - * a good idea if io_ptr does not point to a standard - * *FILE structure. - */ -void PNGAPI -png_set_write_fn(png_structrp png_ptr, png_voidp io_ptr, - png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn) -{ - if (png_ptr == NULL) - return; - - png_ptr->io_ptr = io_ptr; - -#ifdef PNG_STDIO_SUPPORTED - if (write_data_fn != NULL) - png_ptr->write_data_fn = write_data_fn; - - else - png_ptr->write_data_fn = png_default_write_data; -#else - png_ptr->write_data_fn = write_data_fn; -#endif - -#ifdef PNG_WRITE_FLUSH_SUPPORTED -# ifdef PNG_STDIO_SUPPORTED - - if (output_flush_fn != NULL) - png_ptr->output_flush_fn = output_flush_fn; - - else - png_ptr->output_flush_fn = png_default_flush; - -# else - png_ptr->output_flush_fn = output_flush_fn; -# endif -#endif /* PNG_WRITE_FLUSH_SUPPORTED */ - - /* It is an error to read while writing a png file */ - if (png_ptr->read_data_fn != NULL) - { - png_ptr->read_data_fn = NULL; - - png_warning(png_ptr, - "Can't set both read_data_fn and write_data_fn in the" - " same structure"); - } -} -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwrite.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwrite.c deleted file mode 100755 index 4c68682..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwrite.c +++ /dev/null @@ -1,2331 +0,0 @@ - -/* pngwrite.c - general routines to write a PNG file - * - * Last changed in libpng 1.6.1 [March 28, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - */ - -#include "pngpriv.h" -#if defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) && defined(PNG_STDIO_SUPPORTED) -# include -#endif - -#ifdef PNG_WRITE_SUPPORTED - -#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED -/* Write out all the unknown chunks for the current given location */ -static void -write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr, - unsigned int where) -{ - if (info_ptr->unknown_chunks_num) - { - png_const_unknown_chunkp up; - - png_debug(5, "writing extra chunks"); - - for (up = info_ptr->unknown_chunks; - up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num; - ++up) - if (up->location & where) - { - /* If per-chunk unknown chunk handling is enabled use it, otherwise - * just write the chunks the application has set. - */ -#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED - int keep = png_handle_as_unknown(png_ptr, up->name); - - /* NOTE: this code is radically different from the read side in the - * matter of handling an ancillary unknown chunk. In the read side - * the default behavior is to discard it, in the code below the default - * behavior is to write it. Critical chunks are, however, only - * written if explicitly listed or if the default is set to write all - * unknown chunks. - * - * The default handling is also slightly weird - it is not possible to - * stop the writing of all unsafe-to-copy chunks! - * - * TODO: REVIEW: this would seem to be a bug. - */ - if (keep != PNG_HANDLE_CHUNK_NEVER && - ((up->name[3] & 0x20) /* safe-to-copy overrides everything */ || - keep == PNG_HANDLE_CHUNK_ALWAYS || - (keep == PNG_HANDLE_CHUNK_AS_DEFAULT && - png_ptr->unknown_default == PNG_HANDLE_CHUNK_ALWAYS))) -#endif - { - /* TODO: review, what is wrong with a zero length unknown chunk? */ - if (up->size == 0) - png_warning(png_ptr, "Writing zero-length unknown chunk"); - - png_write_chunk(png_ptr, up->name, up->data, up->size); - } - } - } -} -#endif /* PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED */ - -/* Writes all the PNG information. This is the suggested way to use the - * library. If you have a new chunk to add, make a function to write it, - * and put it in the correct location here. If you want the chunk written - * after the image data, put it in png_write_end(). I strongly encourage - * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing - * the chunk, as that will keep the code from breaking if you want to just - * write a plain PNG file. If you have long comments, I suggest writing - * them in png_write_end(), and compressing them. - */ -void PNGAPI -png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr) -{ - png_debug(1, "in png_write_info_before_PLTE"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) - { - /* Write PNG signature */ - png_write_sig(png_ptr); - -#ifdef PNG_MNG_FEATURES_SUPPORTED - if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) && \ - (png_ptr->mng_features_permitted)) - { - png_warning(png_ptr, "MNG features are not allowed in a PNG datastream"); - png_ptr->mng_features_permitted = 0; - } -#endif - - /* Write IHDR information. */ - png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height, - info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type, - info_ptr->filter_type, -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - info_ptr->interlace_type -#else - 0 -#endif - ); - - /* The rest of these check to see if the valid field has the appropriate - * flag set, and if it does, writes the chunk. - * - * 1.6.0: COLORSPACE support controls the writing of these chunks too, and - * the chunks will be written if the WRITE routine is there and information - * is available in the COLORSPACE. (See png_colorspace_sync_info in png.c - * for where the valid flags get set.) - * - * Under certain circumstances the colorspace can be invalidated without - * syncing the info_struct 'valid' flags; this happens if libpng detects and - * error and calls png_error while the color space is being set, yet the - * application continues writing the PNG. So check the 'invalid' flag here - * too. - */ -#ifdef PNG_GAMMA_SUPPORTED -# ifdef PNG_WRITE_gAMA_SUPPORTED - if (!(info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) && - (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_gAMA) && - (info_ptr->valid & PNG_INFO_gAMA)) - png_write_gAMA_fixed(png_ptr, info_ptr->colorspace.gamma); -# endif -#endif - -#ifdef PNG_COLORSPACE_SUPPORTED - /* Write only one of sRGB or an ICC profile. If a profile was supplied - * and it matches one of the known sRGB ones issue a warning. - */ -# ifdef PNG_WRITE_iCCP_SUPPORTED - if (!(info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) && - (info_ptr->valid & PNG_INFO_iCCP)) - { -# ifdef PNG_WRITE_sRGB_SUPPORTED - if (info_ptr->valid & PNG_INFO_sRGB) - png_app_warning(png_ptr, - "profile matches sRGB but writing iCCP instead"); -# endif - - png_write_iCCP(png_ptr, info_ptr->iccp_name, - info_ptr->iccp_profile); - } -# ifdef PNG_WRITE_sRGB_SUPPORTED - else -# endif -# endif - -# ifdef PNG_WRITE_sRGB_SUPPORTED - if (!(info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) && - (info_ptr->valid & PNG_INFO_sRGB)) - png_write_sRGB(png_ptr, info_ptr->colorspace.rendering_intent); -# endif /* WRITE_sRGB */ -#endif /* COLORSPACE */ - -#ifdef PNG_WRITE_sBIT_SUPPORTED - if (info_ptr->valid & PNG_INFO_sBIT) - png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type); -#endif - -#ifdef PNG_COLORSPACE_SUPPORTED -# ifdef PNG_WRITE_cHRM_SUPPORTED - if (!(info_ptr->colorspace.flags & PNG_COLORSPACE_INVALID) && - (info_ptr->colorspace.flags & PNG_COLORSPACE_FROM_cHRM) && - (info_ptr->valid & PNG_INFO_cHRM)) - png_write_cHRM_fixed(png_ptr, &info_ptr->colorspace.end_points_xy); -# endif -#endif - -#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED - write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_IHDR); -#endif - - png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE; - } -} - -void PNGAPI -png_write_info(png_structrp png_ptr, png_const_inforp info_ptr) -{ -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) - int i; -#endif - - png_debug(1, "in png_write_info"); - - if (png_ptr == NULL || info_ptr == NULL) - return; - - png_write_info_before_PLTE(png_ptr, info_ptr); - - if (info_ptr->valid & PNG_INFO_PLTE) - png_write_PLTE(png_ptr, info_ptr->palette, - (png_uint_32)info_ptr->num_palette); - - else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - png_error(png_ptr, "Valid palette required for paletted images"); - -#ifdef PNG_WRITE_tRNS_SUPPORTED - if (info_ptr->valid & PNG_INFO_tRNS) - { -#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED - /* Invert the alpha channel (in tRNS) */ - if ((png_ptr->transformations & PNG_INVERT_ALPHA) && - info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - int j; - for (j = 0; j<(int)info_ptr->num_trans; j++) - info_ptr->trans_alpha[j] = - (png_byte)(255 - info_ptr->trans_alpha[j]); - } -#endif - png_write_tRNS(png_ptr, info_ptr->trans_alpha, &(info_ptr->trans_color), - info_ptr->num_trans, info_ptr->color_type); - } -#endif -#ifdef PNG_WRITE_bKGD_SUPPORTED - if (info_ptr->valid & PNG_INFO_bKGD) - png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type); -#endif - -#ifdef PNG_WRITE_hIST_SUPPORTED - if (info_ptr->valid & PNG_INFO_hIST) - png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette); -#endif - -#ifdef PNG_WRITE_oFFs_SUPPORTED - if (info_ptr->valid & PNG_INFO_oFFs) - png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset, - info_ptr->offset_unit_type); -#endif - -#ifdef PNG_WRITE_pCAL_SUPPORTED - if (info_ptr->valid & PNG_INFO_pCAL) - png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0, - info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams, - info_ptr->pcal_units, info_ptr->pcal_params); -#endif - -#ifdef PNG_WRITE_sCAL_SUPPORTED - if (info_ptr->valid & PNG_INFO_sCAL) - png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit, - info_ptr->scal_s_width, info_ptr->scal_s_height); -#endif /* sCAL */ - -#ifdef PNG_WRITE_pHYs_SUPPORTED - if (info_ptr->valid & PNG_INFO_pHYs) - png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit, - info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type); -#endif /* pHYs */ - -#ifdef PNG_WRITE_tIME_SUPPORTED - if (info_ptr->valid & PNG_INFO_tIME) - { - png_write_tIME(png_ptr, &(info_ptr->mod_time)); - png_ptr->mode |= PNG_WROTE_tIME; - } -#endif /* tIME */ - -#ifdef PNG_WRITE_sPLT_SUPPORTED - if (info_ptr->valid & PNG_INFO_sPLT) - for (i = 0; i < (int)info_ptr->splt_palettes_num; i++) - png_write_sPLT(png_ptr, info_ptr->splt_palettes + i); -#endif /* sPLT */ - -#ifdef PNG_WRITE_TEXT_SUPPORTED - /* Check to see if we need to write text chunks */ - for (i = 0; i < info_ptr->num_text; i++) - { - png_debug2(2, "Writing header text chunk %d, type %d", i, - info_ptr->text[i].compression); - /* An internationalized chunk? */ - if (info_ptr->text[i].compression > 0) - { -#ifdef PNG_WRITE_iTXt_SUPPORTED - /* Write international chunk */ - png_write_iTXt(png_ptr, - info_ptr->text[i].compression, - info_ptr->text[i].key, - info_ptr->text[i].lang, - info_ptr->text[i].lang_key, - info_ptr->text[i].text); -#else - png_warning(png_ptr, "Unable to write international text"); -#endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; - } - - /* If we want a compressed text chunk */ - else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt) - { -#ifdef PNG_WRITE_zTXt_SUPPORTED - /* Write compressed chunk */ - png_write_zTXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0, - info_ptr->text[i].compression); -#else - png_warning(png_ptr, "Unable to write compressed text"); -#endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; - } - - else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) - { -#ifdef PNG_WRITE_tEXt_SUPPORTED - /* Write uncompressed chunk */ - png_write_tEXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, - 0); - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; -#else - /* Can't get here */ - png_warning(png_ptr, "Unable to write uncompressed text"); -#endif - } - } -#endif /* tEXt */ - -#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED - write_unknown_chunks(png_ptr, info_ptr, PNG_HAVE_PLTE); -#endif -} - -/* Writes the end of the PNG file. If you don't want to write comments or - * time information, you can pass NULL for info. If you already wrote these - * in png_write_info(), do not write them again here. If you have long - * comments, I suggest writing them here, and compressing them. - */ -void PNGAPI -png_write_end(png_structrp png_ptr, png_inforp info_ptr) -{ - png_debug(1, "in png_write_end"); - - if (png_ptr == NULL) - return; - - if (!(png_ptr->mode & PNG_HAVE_IDAT)) - png_error(png_ptr, "No IDATs written into file"); - -#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED - if (png_ptr->num_palette_max > png_ptr->num_palette) - png_benign_error(png_ptr, "Wrote palette index exceeding num_palette"); -#endif - - /* See if user wants us to write information chunks */ - if (info_ptr != NULL) - { -#ifdef PNG_WRITE_TEXT_SUPPORTED - int i; /* local index variable */ -#endif -#ifdef PNG_WRITE_tIME_SUPPORTED - /* Check to see if user has supplied a time chunk */ - if ((info_ptr->valid & PNG_INFO_tIME) && - !(png_ptr->mode & PNG_WROTE_tIME)) - png_write_tIME(png_ptr, &(info_ptr->mod_time)); - -#endif -#ifdef PNG_WRITE_TEXT_SUPPORTED - /* Loop through comment chunks */ - for (i = 0; i < info_ptr->num_text; i++) - { - png_debug2(2, "Writing trailer text chunk %d, type %d", i, - info_ptr->text[i].compression); - /* An internationalized chunk? */ - if (info_ptr->text[i].compression > 0) - { -#ifdef PNG_WRITE_iTXt_SUPPORTED - /* Write international chunk */ - png_write_iTXt(png_ptr, - info_ptr->text[i].compression, - info_ptr->text[i].key, - info_ptr->text[i].lang, - info_ptr->text[i].lang_key, - info_ptr->text[i].text); -#else - png_warning(png_ptr, "Unable to write international text"); -#endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; - } - - else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt) - { -#ifdef PNG_WRITE_zTXt_SUPPORTED - /* Write compressed chunk */ - png_write_zTXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0, - info_ptr->text[i].compression); -#else - png_warning(png_ptr, "Unable to write compressed text"); -#endif - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR; - } - - else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE) - { -#ifdef PNG_WRITE_tEXt_SUPPORTED - /* Write uncompressed chunk */ - png_write_tEXt(png_ptr, info_ptr->text[i].key, - info_ptr->text[i].text, 0); -#else - png_warning(png_ptr, "Unable to write uncompressed text"); -#endif - - /* Mark this chunk as written */ - info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR; - } - } -#endif -#ifdef PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED - write_unknown_chunks(png_ptr, info_ptr, PNG_AFTER_IDAT); -#endif - } - - png_ptr->mode |= PNG_AFTER_IDAT; - - /* Write end of PNG file */ - png_write_IEND(png_ptr); - /* This flush, added in libpng-1.0.8, removed from libpng-1.0.9beta03, - * and restored again in libpng-1.2.30, may cause some applications that - * do not set png_ptr->output_flush_fn to crash. If your application - * experiences a problem, please try building libpng with - * PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED defined, and report the event to - * png-mng-implement at lists.sf.net . - */ -#ifdef PNG_WRITE_FLUSH_SUPPORTED -# ifdef PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED - png_flush(png_ptr); -# endif -#endif -} - -#ifdef PNG_CONVERT_tIME_SUPPORTED -void PNGAPI -png_convert_from_struct_tm(png_timep ptime, PNG_CONST struct tm * ttime) -{ - png_debug(1, "in png_convert_from_struct_tm"); - - ptime->year = (png_uint_16)(1900 + ttime->tm_year); - ptime->month = (png_byte)(ttime->tm_mon + 1); - ptime->day = (png_byte)ttime->tm_mday; - ptime->hour = (png_byte)ttime->tm_hour; - ptime->minute = (png_byte)ttime->tm_min; - ptime->second = (png_byte)ttime->tm_sec; -} - -void PNGAPI -png_convert_from_time_t(png_timep ptime, time_t ttime) -{ - struct tm *tbuf; - - png_debug(1, "in png_convert_from_time_t"); - - tbuf = gmtime(&ttime); - png_convert_from_struct_tm(ptime, tbuf); -} -#endif - -/* Initialize png_ptr structure, and allocate any memory needed */ -PNG_FUNCTION(png_structp,PNGAPI -png_create_write_struct,(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn),PNG_ALLOCATED) -{ -#ifndef PNG_USER_MEM_SUPPORTED - png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr, - error_fn, warn_fn, NULL, NULL, NULL); -#else - return png_create_write_struct_2(user_png_ver, error_ptr, error_fn, - warn_fn, NULL, NULL, NULL); -} - -/* Alternate initialize png_ptr structure, and allocate any memory needed */ -PNG_FUNCTION(png_structp,PNGAPI -png_create_write_struct_2,(png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn),PNG_ALLOCATED) -{ - png_structrp png_ptr = png_create_png_struct(user_png_ver, error_ptr, - error_fn, warn_fn, mem_ptr, malloc_fn, free_fn); -#endif /* PNG_USER_MEM_SUPPORTED */ - - /* Set the zlib control values to defaults; they can be overridden by the - * application after the struct has been created. - */ - png_ptr->zbuffer_size = PNG_ZBUF_SIZE; - - /* The 'zlib_strategy' setting is irrelevant because png_default_claim in - * pngwutil.c defaults it according to whether or not filters will be used, - * and ignores this setting. - */ - png_ptr->zlib_strategy = PNG_Z_DEFAULT_STRATEGY; - png_ptr->zlib_level = PNG_Z_DEFAULT_COMPRESSION; - png_ptr->zlib_mem_level = 8; - png_ptr->zlib_window_bits = 15; - png_ptr->zlib_method = 8; - -#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED - png_ptr->zlib_text_strategy = PNG_TEXT_Z_DEFAULT_STRATEGY; - png_ptr->zlib_text_level = PNG_TEXT_Z_DEFAULT_COMPRESSION; - png_ptr->zlib_text_mem_level = 8; - png_ptr->zlib_text_window_bits = 15; - png_ptr->zlib_text_method = 8; -#endif /* PNG_WRITE_COMPRESSED_TEXT_SUPPORTED */ - - /* This is a highly dubious configuration option; by default it is off, but - * it may be appropriate for private builds that are testing extensions not - * conformant to the current specification, or of applications that must not - * fail to write at all costs! - */ -# ifdef PNG_BENIGN_WRITE_ERRORS_SUPPORTED - png_ptr->flags |= PNG_FLAG_BENIGN_ERRORS_WARN; - /* In stable builds only warn if an application error can be completely - * handled. - */ -# endif - - /* App warnings are warnings in release (or release candidate) builds but - * are errors during development. - */ -# if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC - png_ptr->flags |= PNG_FLAG_APP_WARNINGS_WARN; -# endif - - if (png_ptr != NULL) - { - /* TODO: delay this, it can be done in png_init_io() (if the app doesn't - * do it itself) avoiding setting the default function if it is not - * required. - */ - png_set_write_fn(png_ptr, NULL, NULL, NULL); - } - - return png_ptr; -} - - -/* Write a few rows of image data. If the image is interlaced, - * either you will have to write the 7 sub images, or, if you - * have called png_set_interlace_handling(), you will have to - * "write" the image seven times. - */ -void PNGAPI -png_write_rows(png_structrp png_ptr, png_bytepp row, - png_uint_32 num_rows) -{ - png_uint_32 i; /* row counter */ - png_bytepp rp; /* row pointer */ - - png_debug(1, "in png_write_rows"); - - if (png_ptr == NULL) - return; - - /* Loop through the rows */ - for (i = 0, rp = row; i < num_rows; i++, rp++) - { - png_write_row(png_ptr, *rp); - } -} - -/* Write the image. You only need to call this function once, even - * if you are writing an interlaced image. - */ -void PNGAPI -png_write_image(png_structrp png_ptr, png_bytepp image) -{ - png_uint_32 i; /* row index */ - int pass, num_pass; /* pass variables */ - png_bytepp rp; /* points to current row */ - - if (png_ptr == NULL) - return; - - png_debug(1, "in png_write_image"); - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - /* Initialize interlace handling. If image is not interlaced, - * this will set pass to 1 - */ - num_pass = png_set_interlace_handling(png_ptr); -#else - num_pass = 1; -#endif - /* Loop through passes */ - for (pass = 0; pass < num_pass; pass++) - { - /* Loop through image */ - for (i = 0, rp = image; i < png_ptr->height; i++, rp++) - { - png_write_row(png_ptr, *rp); - } - } -} - -/* Called by user to write a row of image data */ -void PNGAPI -png_write_row(png_structrp png_ptr, png_const_bytep row) -{ - /* 1.5.6: moved from png_struct to be a local structure: */ - png_row_info row_info; - - if (png_ptr == NULL) - return; - - png_debug2(1, "in png_write_row (row %u, pass %d)", - png_ptr->row_number, png_ptr->pass); - - /* Initialize transformations and other stuff if first time */ - if (png_ptr->row_number == 0 && png_ptr->pass == 0) - { - /* Make sure we wrote the header info */ - if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE)) - png_error(png_ptr, - "png_write_info was never called before png_write_row"); - - /* Check for transforms that have been set but were defined out */ -#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED) - if (png_ptr->transformations & PNG_INVERT_MONO) - png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined"); -#endif - -#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED) - if (png_ptr->transformations & PNG_FILLER) - png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined"); -#endif -#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && \ - defined(PNG_READ_PACKSWAP_SUPPORTED) - if (png_ptr->transformations & PNG_PACKSWAP) - png_warning(png_ptr, - "PNG_WRITE_PACKSWAP_SUPPORTED is not defined"); -#endif - -#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED) - if (png_ptr->transformations & PNG_PACK) - png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined"); -#endif - -#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED) - if (png_ptr->transformations & PNG_SHIFT) - png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined"); -#endif - -#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED) - if (png_ptr->transformations & PNG_BGR) - png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined"); -#endif - -#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED) - if (png_ptr->transformations & PNG_SWAP_BYTES) - png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined"); -#endif - - png_write_start_row(png_ptr); - } - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - /* If interlaced and not interested in row, return */ - if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE)) - { - switch (png_ptr->pass) - { - case 0: - if (png_ptr->row_number & 0x07) - { - png_write_finish_row(png_ptr); - return; - } - break; - - case 1: - if ((png_ptr->row_number & 0x07) || png_ptr->width < 5) - { - png_write_finish_row(png_ptr); - return; - } - break; - - case 2: - if ((png_ptr->row_number & 0x07) != 4) - { - png_write_finish_row(png_ptr); - return; - } - break; - - case 3: - if ((png_ptr->row_number & 0x03) || png_ptr->width < 3) - { - png_write_finish_row(png_ptr); - return; - } - break; - - case 4: - if ((png_ptr->row_number & 0x03) != 2) - { - png_write_finish_row(png_ptr); - return; - } - break; - - case 5: - if ((png_ptr->row_number & 0x01) || png_ptr->width < 2) - { - png_write_finish_row(png_ptr); - return; - } - break; - - case 6: - if (!(png_ptr->row_number & 0x01)) - { - png_write_finish_row(png_ptr); - return; - } - break; - - default: /* error: ignore it */ - break; - } - } -#endif - - /* Set up row info for transformations */ - row_info.color_type = png_ptr->color_type; - row_info.width = png_ptr->usr_width; - row_info.channels = png_ptr->usr_channels; - row_info.bit_depth = png_ptr->usr_bit_depth; - row_info.pixel_depth = (png_byte)(row_info.bit_depth * row_info.channels); - row_info.rowbytes = PNG_ROWBYTES(row_info.pixel_depth, row_info.width); - - png_debug1(3, "row_info->color_type = %d", row_info.color_type); - png_debug1(3, "row_info->width = %u", row_info.width); - png_debug1(3, "row_info->channels = %d", row_info.channels); - png_debug1(3, "row_info->bit_depth = %d", row_info.bit_depth); - png_debug1(3, "row_info->pixel_depth = %d", row_info.pixel_depth); - png_debug1(3, "row_info->rowbytes = %lu", (unsigned long)row_info.rowbytes); - - /* Copy user's row into buffer, leaving room for filter byte. */ - memcpy(png_ptr->row_buf + 1, row, row_info.rowbytes); - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - /* Handle interlacing */ - if (png_ptr->interlaced && png_ptr->pass < 6 && - (png_ptr->transformations & PNG_INTERLACE)) - { - png_do_write_interlace(&row_info, png_ptr->row_buf + 1, png_ptr->pass); - /* This should always get caught above, but still ... */ - if (!(row_info.width)) - { - png_write_finish_row(png_ptr); - return; - } - } -#endif - -#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED - /* Handle other transformations */ - if (png_ptr->transformations) - png_do_write_transformations(png_ptr, &row_info); -#endif - - /* At this point the row_info pixel depth must match the 'transformed' depth, - * which is also the output depth. - */ - if (row_info.pixel_depth != png_ptr->pixel_depth || - row_info.pixel_depth != png_ptr->transformed_pixel_depth) - png_error(png_ptr, "internal write transform logic error"); - -#ifdef PNG_MNG_FEATURES_SUPPORTED - /* Write filter_method 64 (intrapixel differencing) only if - * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and - * 2. Libpng did not write a PNG signature (this filter_method is only - * used in PNG datastreams that are embedded in MNG datastreams) and - * 3. The application called png_permit_mng_features with a mask that - * included PNG_FLAG_MNG_FILTER_64 and - * 4. The filter_method is 64 and - * 5. The color_type is RGB or RGBA - */ - if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING)) - { - /* Intrapixel differencing */ - png_do_write_intrapixel(&row_info, png_ptr->row_buf + 1); - } -#endif - -/* Added at libpng-1.5.10 */ -#ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED - /* Check for out-of-range palette index */ - if (row_info.color_type == PNG_COLOR_TYPE_PALETTE && - png_ptr->num_palette_max >= 0) - png_do_check_palette_indexes(png_ptr, &row_info); -#endif - - /* Find a filter if necessary, filter the row and write it out. */ - png_write_find_filter(png_ptr, &row_info); - - if (png_ptr->write_row_fn != NULL) - (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass); -} - -#ifdef PNG_WRITE_FLUSH_SUPPORTED -/* Set the automatic flush interval or 0 to turn flushing off */ -void PNGAPI -png_set_flush(png_structrp png_ptr, int nrows) -{ - png_debug(1, "in png_set_flush"); - - if (png_ptr == NULL) - return; - - png_ptr->flush_dist = (nrows < 0 ? 0 : nrows); -} - -/* Flush the current output buffers now */ -void PNGAPI -png_write_flush(png_structrp png_ptr) -{ - png_debug(1, "in png_write_flush"); - - if (png_ptr == NULL) - return; - - /* We have already written out all of the data */ - if (png_ptr->row_number >= png_ptr->num_rows) - return; - - png_compress_IDAT(png_ptr, NULL, 0, Z_SYNC_FLUSH); - png_ptr->flush_rows = 0; - png_flush(png_ptr); -} -#endif /* PNG_WRITE_FLUSH_SUPPORTED */ - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED -static void png_reset_filter_heuristics(png_structrp png_ptr);/* forward decl */ -#endif - -/* Free any memory used in png_ptr struct without freeing the struct itself. */ -static void -png_write_destroy(png_structrp png_ptr) -{ - png_debug(1, "in png_write_destroy"); - - /* Free any memory zlib uses */ - if (png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) - deflateEnd(&png_ptr->zstream); - - /* Free our memory. png_free checks NULL for us. */ - png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list); - png_free(png_ptr, png_ptr->row_buf); -#ifdef PNG_WRITE_FILTER_SUPPORTED - png_free(png_ptr, png_ptr->prev_row); - png_free(png_ptr, png_ptr->sub_row); - png_free(png_ptr, png_ptr->up_row); - png_free(png_ptr, png_ptr->avg_row); - png_free(png_ptr, png_ptr->paeth_row); -#endif - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - /* Use this to save a little code space, it doesn't free the filter_costs */ - png_reset_filter_heuristics(png_ptr); - png_free(png_ptr, png_ptr->filter_costs); - png_free(png_ptr, png_ptr->inv_filter_costs); -#endif - -#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED - png_free(png_ptr, png_ptr->chunk_list); -#endif - - /* The error handling and memory handling information is left intact at this - * point: the jmp_buf may still have to be freed. See png_destroy_png_struct - * for how this happens. - */ -} - -/* Free all memory used by the write. - * In libpng 1.6.0 this API changed quietly to no longer accept a NULL value for - * *png_ptr_ptr. Prior to 1.6.0 it would accept such a value and it would free - * the passed in info_structs but it would quietly fail to free any of the data - * inside them. In 1.6.0 it quietly does nothing (it has to be quiet because it - * has no png_ptr.) - */ -void PNGAPI -png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr) -{ - png_debug(1, "in png_destroy_write_struct"); - - if (png_ptr_ptr != NULL) - { - png_structrp png_ptr = *png_ptr_ptr; - - if (png_ptr != NULL) /* added in libpng 1.6.0 */ - { - png_destroy_info_struct(png_ptr, info_ptr_ptr); - - *png_ptr_ptr = NULL; - png_write_destroy(png_ptr); - png_destroy_png_struct(png_ptr); - } - } -} - -/* Allow the application to select one or more row filters to use. */ -void PNGAPI -png_set_filter(png_structrp png_ptr, int method, int filters) -{ - png_debug(1, "in png_set_filter"); - - if (png_ptr == NULL) - return; - -#ifdef PNG_MNG_FEATURES_SUPPORTED - if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - (method == PNG_INTRAPIXEL_DIFFERENCING)) - method = PNG_FILTER_TYPE_BASE; - -#endif - if (method == PNG_FILTER_TYPE_BASE) - { - switch (filters & (PNG_ALL_FILTERS | 0x07)) - { -#ifdef PNG_WRITE_FILTER_SUPPORTED - case 5: - case 6: - case 7: png_app_error(png_ptr, "Unknown row filter for method 0"); - /* FALL THROUGH */ -#endif /* PNG_WRITE_FILTER_SUPPORTED */ - case PNG_FILTER_VALUE_NONE: - png_ptr->do_filter = PNG_FILTER_NONE; break; - -#ifdef PNG_WRITE_FILTER_SUPPORTED - case PNG_FILTER_VALUE_SUB: - png_ptr->do_filter = PNG_FILTER_SUB; break; - - case PNG_FILTER_VALUE_UP: - png_ptr->do_filter = PNG_FILTER_UP; break; - - case PNG_FILTER_VALUE_AVG: - png_ptr->do_filter = PNG_FILTER_AVG; break; - - case PNG_FILTER_VALUE_PAETH: - png_ptr->do_filter = PNG_FILTER_PAETH; break; - - default: - png_ptr->do_filter = (png_byte)filters; break; -#else - default: - png_app_error(png_ptr, "Unknown row filter for method 0"); -#endif /* PNG_WRITE_FILTER_SUPPORTED */ - } - - /* If we have allocated the row_buf, this means we have already started - * with the image and we should have allocated all of the filter buffers - * that have been selected. If prev_row isn't already allocated, then - * it is too late to start using the filters that need it, since we - * will be missing the data in the previous row. If an application - * wants to start and stop using particular filters during compression, - * it should start out with all of the filters, and then add and - * remove them after the start of compression. - */ - if (png_ptr->row_buf != NULL) - { -#ifdef PNG_WRITE_FILTER_SUPPORTED - if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL) - { - png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; - } - - if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL) - { - if (png_ptr->prev_row == NULL) - { - png_warning(png_ptr, "Can't add Up filter after starting"); - png_ptr->do_filter = (png_byte)(png_ptr->do_filter & - ~PNG_FILTER_UP); - } - - else - { - png_ptr->up_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; - } - } - - if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL) - { - if (png_ptr->prev_row == NULL) - { - png_warning(png_ptr, "Can't add Average filter after starting"); - png_ptr->do_filter = (png_byte)(png_ptr->do_filter & - ~PNG_FILTER_AVG); - } - - else - { - png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; - } - } - - if ((png_ptr->do_filter & PNG_FILTER_PAETH) && - png_ptr->paeth_row == NULL) - { - if (png_ptr->prev_row == NULL) - { - png_warning(png_ptr, "Can't add Paeth filter after starting"); - png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH); - } - - else - { - png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, - (png_ptr->rowbytes + 1)); - png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; - } - } - - if (png_ptr->do_filter == PNG_NO_FILTERS) -#endif /* PNG_WRITE_FILTER_SUPPORTED */ - png_ptr->do_filter = PNG_FILTER_NONE; - } - } - else - png_error(png_ptr, "Unknown custom filter method"); -} - -/* This allows us to influence the way in which libpng chooses the "best" - * filter for the current scanline. While the "minimum-sum-of-absolute- - * differences metric is relatively fast and effective, there is some - * question as to whether it can be improved upon by trying to keep the - * filtered data going to zlib more consistent, hopefully resulting in - * better compression. - */ -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* GRR 970116 */ -/* Convenience reset API. */ -static void -png_reset_filter_heuristics(png_structrp png_ptr) -{ - /* Clear out any old values in the 'weights' - this must be done because if - * the app calls set_filter_heuristics multiple times with different - * 'num_weights' values we would otherwise potentially have wrong sized - * arrays. - */ - png_ptr->num_prev_filters = 0; - png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED; - if (png_ptr->prev_filters != NULL) - { - png_bytep old = png_ptr->prev_filters; - png_ptr->prev_filters = NULL; - png_free(png_ptr, old); - } - if (png_ptr->filter_weights != NULL) - { - png_uint_16p old = png_ptr->filter_weights; - png_ptr->filter_weights = NULL; - png_free(png_ptr, old); - } - - if (png_ptr->inv_filter_weights != NULL) - { - png_uint_16p old = png_ptr->inv_filter_weights; - png_ptr->inv_filter_weights = NULL; - png_free(png_ptr, old); - } - - /* Leave the filter_costs - this array is fixed size. */ -} - -static int -png_init_filter_heuristics(png_structrp png_ptr, int heuristic_method, - int num_weights) -{ - if (png_ptr == NULL) - return 0; - - /* Clear out the arrays */ - png_reset_filter_heuristics(png_ptr); - - /* Check arguments; the 'reset' function makes the correct settings for the - * unweighted case, but we must handle the weight case by initializing the - * arrays for the caller. - */ - if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int i; - - if (num_weights > 0) - { - png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr, - (png_uint_32)((sizeof (png_byte)) * num_weights)); - - /* To make sure that the weighting starts out fairly */ - for (i = 0; i < num_weights; i++) - { - png_ptr->prev_filters[i] = 255; - } - - png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)((sizeof (png_uint_16)) * num_weights)); - - png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)((sizeof (png_uint_16)) * num_weights)); - - for (i = 0; i < num_weights; i++) - { - png_ptr->inv_filter_weights[i] = - png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; - } - - /* Safe to set this now */ - png_ptr->num_prev_filters = (png_byte)num_weights; - } - - /* If, in the future, there are other filter methods, this would - * need to be based on png_ptr->filter. - */ - if (png_ptr->filter_costs == NULL) - { - png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST)); - - png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr, - (png_uint_32)((sizeof (png_uint_16)) * PNG_FILTER_VALUE_LAST)); - } - - for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) - { - png_ptr->inv_filter_costs[i] = - png_ptr->filter_costs[i] = PNG_COST_FACTOR; - } - - /* All the arrays are inited, safe to set this: */ - png_ptr->heuristic_method = PNG_FILTER_HEURISTIC_WEIGHTED; - - /* Return the 'ok' code. */ - return 1; - } - else if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT || - heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED) - { - return 1; - } - else - { - png_warning(png_ptr, "Unknown filter heuristic method"); - return 0; - } -} - -/* Provide floating and fixed point APIs */ -#ifdef PNG_FLOATING_POINT_SUPPORTED -void PNGAPI -png_set_filter_heuristics(png_structrp png_ptr, int heuristic_method, - int num_weights, png_const_doublep filter_weights, - png_const_doublep filter_costs) -{ - png_debug(1, "in png_set_filter_heuristics"); - - /* The internal API allocates all the arrays and ensures that the elements of - * those arrays are set to the default value. - */ - if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights)) - return; - - /* If using the weighted method copy in the weights. */ - if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int i; - for (i = 0; i < num_weights; i++) - { - if (filter_weights[i] <= 0.0) - { - png_ptr->inv_filter_weights[i] = - png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; - } - - else - { - png_ptr->inv_filter_weights[i] = - (png_uint_16)(PNG_WEIGHT_FACTOR*filter_weights[i]+.5); - - png_ptr->filter_weights[i] = - (png_uint_16)(PNG_WEIGHT_FACTOR/filter_weights[i]+.5); - } - } - - /* Here is where we set the relative costs of the different filters. We - * should take the desired compression level into account when setting - * the costs, so that Paeth, for instance, has a high relative cost at low - * compression levels, while it has a lower relative cost at higher - * compression settings. The filter types are in order of increasing - * relative cost, so it would be possible to do this with an algorithm. - */ - for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) if (filter_costs[i] >= 1.0) - { - png_ptr->inv_filter_costs[i] = - (png_uint_16)(PNG_COST_FACTOR / filter_costs[i] + .5); - - png_ptr->filter_costs[i] = - (png_uint_16)(PNG_COST_FACTOR * filter_costs[i] + .5); - } - } -} -#endif /* FLOATING_POINT */ - -#ifdef PNG_FIXED_POINT_SUPPORTED -void PNGAPI -png_set_filter_heuristics_fixed(png_structrp png_ptr, int heuristic_method, - int num_weights, png_const_fixed_point_p filter_weights, - png_const_fixed_point_p filter_costs) -{ - png_debug(1, "in png_set_filter_heuristics_fixed"); - - /* The internal API allocates all the arrays and ensures that the elements of - * those arrays are set to the default value. - */ - if (!png_init_filter_heuristics(png_ptr, heuristic_method, num_weights)) - return; - - /* If using the weighted method copy in the weights. */ - if (heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int i; - for (i = 0; i < num_weights; i++) - { - if (filter_weights[i] <= 0) - { - png_ptr->inv_filter_weights[i] = - png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR; - } - - else - { - png_ptr->inv_filter_weights[i] = (png_uint_16) - ((PNG_WEIGHT_FACTOR*filter_weights[i]+PNG_FP_HALF)/PNG_FP_1); - - png_ptr->filter_weights[i] = (png_uint_16)((PNG_WEIGHT_FACTOR* - PNG_FP_1+(filter_weights[i]/2))/filter_weights[i]); - } - } - - /* Here is where we set the relative costs of the different filters. We - * should take the desired compression level into account when setting - * the costs, so that Paeth, for instance, has a high relative cost at low - * compression levels, while it has a lower relative cost at higher - * compression settings. The filter types are in order of increasing - * relative cost, so it would be possible to do this with an algorithm. - */ - for (i = 0; i < PNG_FILTER_VALUE_LAST; i++) - if (filter_costs[i] >= PNG_FP_1) - { - png_uint_32 tmp; - - /* Use a 32 bit unsigned temporary here because otherwise the - * intermediate value will be a 32 bit *signed* integer (ANSI rules) - * and this will get the wrong answer on division. - */ - tmp = PNG_COST_FACTOR*PNG_FP_1 + (filter_costs[i]/2); - tmp /= filter_costs[i]; - - png_ptr->inv_filter_costs[i] = (png_uint_16)tmp; - - tmp = PNG_COST_FACTOR * filter_costs[i] + PNG_FP_HALF; - tmp /= PNG_FP_1; - - png_ptr->filter_costs[i] = (png_uint_16)tmp; - } - } -} -#endif /* FIXED_POINT */ -#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ - -void PNGAPI -png_set_compression_level(png_structrp png_ptr, int level) -{ - png_debug(1, "in png_set_compression_level"); - - if (png_ptr == NULL) - return; - - png_ptr->zlib_level = level; -} - -void PNGAPI -png_set_compression_mem_level(png_structrp png_ptr, int mem_level) -{ - png_debug(1, "in png_set_compression_mem_level"); - - if (png_ptr == NULL) - return; - - png_ptr->zlib_mem_level = mem_level; -} - -void PNGAPI -png_set_compression_strategy(png_structrp png_ptr, int strategy) -{ - png_debug(1, "in png_set_compression_strategy"); - - if (png_ptr == NULL) - return; - - /* The flag setting here prevents the libpng dynamic selection of strategy. - */ - png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY; - png_ptr->zlib_strategy = strategy; -} - -/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a - * smaller value of window_bits if it can do so safely. - */ -void PNGAPI -png_set_compression_window_bits(png_structrp png_ptr, int window_bits) -{ - if (png_ptr == NULL) - return; - - /* Prior to 1.6.0 this would warn but then set the window_bits value, this - * meant that negative window bits values could be selected which would cause - * libpng to write a non-standard PNG file with raw deflate or gzip - * compressed IDAT or ancillary chunks. Such files can be read and there is - * no warning on read, so this seems like a very bad idea. - */ - if (window_bits > 15) - { - png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); - window_bits = 15; - } - - else if (window_bits < 8) - { - png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); - window_bits = 8; - } - - png_ptr->zlib_window_bits = window_bits; -} - -void PNGAPI -png_set_compression_method(png_structrp png_ptr, int method) -{ - png_debug(1, "in png_set_compression_method"); - - if (png_ptr == NULL) - return; - - /* This would produce an invalid PNG file if it worked, but it doesn't and - * deflate will fault it, so it is harmless to just warn here. - */ - if (method != 8) - png_warning(png_ptr, "Only compression method 8 is supported by PNG"); - - png_ptr->zlib_method = method; -} - -/* The following were added to libpng-1.5.4 */ -#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED -void PNGAPI -png_set_text_compression_level(png_structrp png_ptr, int level) -{ - png_debug(1, "in png_set_text_compression_level"); - - if (png_ptr == NULL) - return; - - png_ptr->zlib_text_level = level; -} - -void PNGAPI -png_set_text_compression_mem_level(png_structrp png_ptr, int mem_level) -{ - png_debug(1, "in png_set_text_compression_mem_level"); - - if (png_ptr == NULL) - return; - - png_ptr->zlib_text_mem_level = mem_level; -} - -void PNGAPI -png_set_text_compression_strategy(png_structrp png_ptr, int strategy) -{ - png_debug(1, "in png_set_text_compression_strategy"); - - if (png_ptr == NULL) - return; - - png_ptr->zlib_text_strategy = strategy; -} - -/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a - * smaller value of window_bits if it can do so safely. - */ -void PNGAPI -png_set_text_compression_window_bits(png_structrp png_ptr, int window_bits) -{ - if (png_ptr == NULL) - return; - - if (window_bits > 15) - { - png_warning(png_ptr, "Only compression windows <= 32k supported by PNG"); - window_bits = 15; - } - - else if (window_bits < 8) - { - png_warning(png_ptr, "Only compression windows >= 256 supported by PNG"); - window_bits = 8; - } - - png_ptr->zlib_text_window_bits = window_bits; -} - -void PNGAPI -png_set_text_compression_method(png_structrp png_ptr, int method) -{ - png_debug(1, "in png_set_text_compression_method"); - - if (png_ptr == NULL) - return; - - if (method != 8) - png_warning(png_ptr, "Only compression method 8 is supported by PNG"); - - png_ptr->zlib_text_method = method; -} -#endif /* PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED */ -/* end of API added to libpng-1.5.4 */ - -void PNGAPI -png_set_write_status_fn(png_structrp png_ptr, png_write_status_ptr write_row_fn) -{ - if (png_ptr == NULL) - return; - - png_ptr->write_row_fn = write_row_fn; -} - -#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED -void PNGAPI -png_set_write_user_transform_fn(png_structrp png_ptr, png_user_transform_ptr - write_user_transform_fn) -{ - png_debug(1, "in png_set_write_user_transform_fn"); - - if (png_ptr == NULL) - return; - - png_ptr->transformations |= PNG_USER_TRANSFORM; - png_ptr->write_user_transform_fn = write_user_transform_fn; -} -#endif - - -#ifdef PNG_INFO_IMAGE_SUPPORTED -void PNGAPI -png_write_png(png_structrp png_ptr, png_inforp info_ptr, - int transforms, voidp params) -{ - if (png_ptr == NULL || info_ptr == NULL) - return; - - /* Write the file header information. */ - png_write_info(png_ptr, info_ptr); - - /* ------ these transformations don't touch the info structure ------- */ - -#ifdef PNG_WRITE_INVERT_SUPPORTED - /* Invert monochrome pixels */ - if (transforms & PNG_TRANSFORM_INVERT_MONO) - png_set_invert_mono(png_ptr); -#endif - -#ifdef PNG_WRITE_SHIFT_SUPPORTED - /* Shift the pixels up to a legal bit depth and fill in - * as appropriate to correctly scale the image. - */ - if ((transforms & PNG_TRANSFORM_SHIFT) - && (info_ptr->valid & PNG_INFO_sBIT)) - png_set_shift(png_ptr, &info_ptr->sig_bit); -#endif - -#ifdef PNG_WRITE_PACK_SUPPORTED - /* Pack pixels into bytes */ - if (transforms & PNG_TRANSFORM_PACKING) - png_set_packing(png_ptr); -#endif - -#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED - /* Swap location of alpha bytes from ARGB to RGBA */ - if (transforms & PNG_TRANSFORM_SWAP_ALPHA) - png_set_swap_alpha(png_ptr); -#endif - -#ifdef PNG_WRITE_FILLER_SUPPORTED - /* Pack XRGB/RGBX/ARGB/RGBA into RGB (4 channels -> 3 channels) */ - if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER) - png_set_filler(png_ptr, 0, PNG_FILLER_AFTER); - - else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE) - png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE); -#endif - -#ifdef PNG_WRITE_BGR_SUPPORTED - /* Flip BGR pixels to RGB */ - if (transforms & PNG_TRANSFORM_BGR) - png_set_bgr(png_ptr); -#endif - -#ifdef PNG_WRITE_SWAP_SUPPORTED - /* Swap bytes of 16-bit files to most significant byte first */ - if (transforms & PNG_TRANSFORM_SWAP_ENDIAN) - png_set_swap(png_ptr); -#endif - -#ifdef PNG_WRITE_PACKSWAP_SUPPORTED - /* Swap bits of 1, 2, 4 bit packed pixel formats */ - if (transforms & PNG_TRANSFORM_PACKSWAP) - png_set_packswap(png_ptr); -#endif - -#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED - /* Invert the alpha channel from opacity to transparency */ - if (transforms & PNG_TRANSFORM_INVERT_ALPHA) - png_set_invert_alpha(png_ptr); -#endif - - /* ----------------------- end of transformations ------------------- */ - - /* Write the bits */ - if (info_ptr->valid & PNG_INFO_IDAT) - png_write_image(png_ptr, info_ptr->row_pointers); - - /* It is REQUIRED to call this to finish writing the rest of the file */ - png_write_end(png_ptr, info_ptr); - - PNG_UNUSED(transforms) /* Quiet compiler warnings */ - PNG_UNUSED(params) -} -#endif - - -#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED -#ifdef PNG_STDIO_SUPPORTED /* currently required for png_image_write_* */ -/* Initialize the write structure - general purpose utility. */ -static int -png_image_write_init(png_imagep image) -{ - png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, image, - png_safe_error, png_safe_warning); - - if (png_ptr != NULL) - { - png_infop info_ptr = png_create_info_struct(png_ptr); - - if (info_ptr != NULL) - { - png_controlp control = png_voidcast(png_controlp, - png_malloc_warn(png_ptr, (sizeof *control))); - - if (control != NULL) - { - memset(control, 0, (sizeof *control)); - - control->png_ptr = png_ptr; - control->info_ptr = info_ptr; - control->for_write = 1; - - image->opaque = control; - return 1; - } - - /* Error clean up */ - png_destroy_info_struct(png_ptr, &info_ptr); - } - - png_destroy_write_struct(&png_ptr, NULL); - } - - return png_image_error(image, "png_image_write_: out of memory"); -} - -/* Arguments to png_image_write_main: */ -typedef struct -{ - /* Arguments: */ - png_imagep image; - png_const_voidp buffer; - png_int_32 row_stride; - png_const_voidp colormap; - int convert_to_8bit; - /* Local variables: */ - png_const_voidp first_row; - ptrdiff_t row_bytes; - png_voidp local_row; -} png_image_write_control; - -/* Write png_uint_16 input to a 16-bit PNG; the png_ptr has already been set to - * do any necessary byte swapping. The component order is defined by the - * png_image format value. - */ -static int -png_write_image_16bit(png_voidp argument) -{ - png_image_write_control *display = png_voidcast(png_image_write_control*, - argument); - png_imagep image = display->image; - png_structrp png_ptr = image->opaque->png_ptr; - - png_const_uint_16p input_row = png_voidcast(png_const_uint_16p, - display->first_row); - png_uint_16p output_row = png_voidcast(png_uint_16p, display->local_row); - png_uint_16p row_end; - const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) ? 3 : 1; - int aindex = 0; - png_uint_32 y = image->height; - - if (image->format & PNG_FORMAT_FLAG_ALPHA) - { - if (image->format & PNG_FORMAT_FLAG_AFIRST) - { - aindex = -1; - ++input_row; /* To point to the first component */ - ++output_row; - } - - else - aindex = channels; - } - - else - png_error(png_ptr, "png_write_image: internal call error"); - - /* Work out the output row end and count over this, note that the increment - * above to 'row' means that row_end can actually be beyond the end of the - * row; this is correct. - */ - row_end = output_row + image->width * (channels+1); - - while (y-- > 0) - { - png_const_uint_16p in_ptr = input_row; - png_uint_16p out_ptr = output_row; - - while (out_ptr < row_end) - { - const png_uint_16 alpha = in_ptr[aindex]; - png_uint_32 reciprocal = 0; - int c; - - out_ptr[aindex] = alpha; - - /* Calculate a reciprocal. The correct calculation is simply - * component/alpha*65535 << 15. (I.e. 15 bits of precision); this - * allows correct rounding by adding .5 before the shift. 'reciprocal' - * is only initialized when required. - */ - if (alpha > 0 && alpha < 65535) - reciprocal = ((0xffff<<15)+(alpha>>1))/alpha; - - c = channels; - do /* always at least one channel */ - { - png_uint_16 component = *in_ptr++; - - /* The following gives 65535 for an alpha of 0, which is fine, - * otherwise if 0/0 is represented as some other value there is more - * likely to be a discontinuity which will probably damage - * compression when moving from a fully transparent area to a - * nearly transparent one. (The assumption here is that opaque - * areas tend not to be 0 intensity.) - */ - if (component >= alpha) - component = 65535; - - /* component 0 && alpha < 65535) - { - png_uint_32 calc = component * reciprocal; - calc += 16384; /* round to nearest */ - component = (png_uint_16)(calc >> 15); - } - - *out_ptr++ = component; - } - while (--c > 0); - - /* Skip to next component (skip the intervening alpha channel) */ - ++in_ptr; - ++out_ptr; - } - - png_write_row(png_ptr, png_voidcast(png_const_bytep, display->local_row)); - input_row += display->row_bytes/(sizeof (png_uint_16)); - } - - return 1; -} - -/* Given 16-bit input (1 to 4 channels) write 8-bit output. If an alpha channel - * is present it must be removed from the components, the components are then - * written in sRGB encoding. No components are added or removed. - * - * Calculate an alpha reciprocal to reverse pre-multiplication. As above the - * calculation can be done to 15 bits of accuracy; however, the output needs to - * be scaled in the range 0..255*65535, so include that scaling here. - */ -#define UNP_RECIPROCAL(alpha) ((((0xffff*0xff)<<7)+(alpha>>1))/alpha) - -static png_byte -png_unpremultiply(png_uint_32 component, png_uint_32 alpha, - png_uint_32 reciprocal/*from the above macro*/) -{ - /* The following gives 1.0 for an alpha of 0, which is fine, otherwise if 0/0 - * is represented as some other value there is more likely to be a - * discontinuity which will probably damage compression when moving from a - * fully transparent area to a nearly transparent one. (The assumption here - * is that opaque areas tend not to be 0 intensity.) - * - * There is a rounding problem here; if alpha is less than 128 it will end up - * as 0 when scaled to 8 bits. To avoid introducing spurious colors into the - * output change for this too. - */ - if (component >= alpha || alpha < 128) - return 255; - - /* component 0) - { - /* The test is that alpha/257 (rounded) is less than 255, the first value - * that becomes 255 is 65407. - * NOTE: this must agree with the PNG_DIV257 macro (which must, therefore, - * be exact!) [Could also test reciprocal != 0] - */ - if (alpha < 65407) - { - component *= reciprocal; - component += 64; /* round to nearest */ - component >>= 7; - } - - else - component *= 255; - - /* Convert the component to sRGB. */ - return (png_byte)PNG_sRGB_FROM_LINEAR(component); - } - - else - return 0; -} - -static int -png_write_image_8bit(png_voidp argument) -{ - png_image_write_control *display = png_voidcast(png_image_write_control*, - argument); - png_imagep image = display->image; - png_structrp png_ptr = image->opaque->png_ptr; - - png_const_uint_16p input_row = png_voidcast(png_const_uint_16p, - display->first_row); - png_bytep output_row = png_voidcast(png_bytep, display->local_row); - png_uint_32 y = image->height; - const int channels = (image->format & PNG_FORMAT_FLAG_COLOR) ? 3 : 1; - - if (image->format & PNG_FORMAT_FLAG_ALPHA) - { - png_bytep row_end; - int aindex; - - if (image->format & PNG_FORMAT_FLAG_AFIRST) - { - aindex = -1; - ++input_row; /* To point to the first component */ - ++output_row; - } - - else - aindex = channels; - - /* Use row_end in place of a loop counter: */ - row_end = output_row + image->width * (channels+1); - - while (y-- > 0) - { - png_const_uint_16p in_ptr = input_row; - png_bytep out_ptr = output_row; - - while (out_ptr < row_end) - { - png_uint_16 alpha = in_ptr[aindex]; - png_byte alphabyte = (png_byte)PNG_DIV257(alpha); - png_uint_32 reciprocal = 0; - int c; - - /* Scale and write the alpha channel. */ - out_ptr[aindex] = alphabyte; - - if (alphabyte > 0 && alphabyte < 255) - reciprocal = UNP_RECIPROCAL(alpha); - - c = channels; - do /* always at least one channel */ - *out_ptr++ = png_unpremultiply(*in_ptr++, alpha, reciprocal); - while (--c > 0); - - /* Skip to next component (skip the intervening alpha channel) */ - ++in_ptr; - ++out_ptr; - } /* while out_ptr < row_end */ - - png_write_row(png_ptr, png_voidcast(png_const_bytep, - display->local_row)); - input_row += display->row_bytes/(sizeof (png_uint_16)); - } /* while y */ - } - - else - { - /* No alpha channel, so the row_end really is the end of the row and it - * is sufficient to loop over the components one by one. - */ - png_bytep row_end = output_row + image->width * channels; - - while (y-- > 0) - { - png_const_uint_16p in_ptr = input_row; - png_bytep out_ptr = output_row; - - while (out_ptr < row_end) - { - png_uint_32 component = *in_ptr++; - - component *= 255; - *out_ptr++ = (png_byte)PNG_sRGB_FROM_LINEAR(component); - } - - png_write_row(png_ptr, output_row); - input_row += display->row_bytes/(sizeof (png_uint_16)); - } - } - - return 1; -} - -static void -png_image_set_PLTE(png_image_write_control *display) -{ - const png_imagep image = display->image; - const void *cmap = display->colormap; - const int entries = image->colormap_entries > 256 ? 256 : - (int)image->colormap_entries; - - /* NOTE: the caller must check for cmap != NULL and entries != 0 */ - const png_uint_32 format = image->format; - const int channels = PNG_IMAGE_SAMPLE_CHANNELS(format); - -# ifdef PNG_FORMAT_BGR_SUPPORTED - const int afirst = (format & PNG_FORMAT_FLAG_AFIRST) != 0 && - (format & PNG_FORMAT_FLAG_ALPHA) != 0; -# else -# define afirst 0 -# endif - -# ifdef PNG_FORMAT_BGR_SUPPORTED - const int bgr = (format & PNG_FORMAT_FLAG_BGR) ? 2 : 0; -# else -# define bgr 0 -# endif - - int i, num_trans; - png_color palette[256]; - png_byte tRNS[256]; - - memset(tRNS, 255, (sizeof tRNS)); - memset(palette, 0, (sizeof palette)); - - for (i=num_trans=0; i= 3) /* RGB */ - { - palette[i].blue = (png_byte)PNG_sRGB_FROM_LINEAR(255 * - entry[(2 ^ bgr)]); - palette[i].green = (png_byte)PNG_sRGB_FROM_LINEAR(255 * - entry[1]); - palette[i].red = (png_byte)PNG_sRGB_FROM_LINEAR(255 * - entry[bgr]); - } - - else /* Gray */ - palette[i].blue = palette[i].red = palette[i].green = - (png_byte)PNG_sRGB_FROM_LINEAR(255 * *entry); - } - - else /* alpha */ - { - png_uint_16 alpha = entry[afirst ? 0 : channels-1]; - png_byte alphabyte = (png_byte)PNG_DIV257(alpha); - png_uint_32 reciprocal = 0; - - /* Calculate a reciprocal, as in the png_write_image_8bit code above - * this is designed to produce a value scaled to 255*65535 when - * divided by 128 (i.e. asr 7). - */ - if (alphabyte > 0 && alphabyte < 255) - reciprocal = (((0xffff*0xff)<<7)+(alpha>>1))/alpha; - - tRNS[i] = alphabyte; - if (alphabyte < 255) - num_trans = i+1; - - if (channels >= 3) /* RGB */ - { - palette[i].blue = png_unpremultiply(entry[afirst + (2 ^ bgr)], - alpha, reciprocal); - palette[i].green = png_unpremultiply(entry[afirst + 1], alpha, - reciprocal); - palette[i].red = png_unpremultiply(entry[afirst + bgr], alpha, - reciprocal); - } - - else /* gray */ - palette[i].blue = palette[i].red = palette[i].green = - png_unpremultiply(entry[afirst], alpha, reciprocal); - } - } - - else /* Color-map has sRGB values */ - { - png_const_bytep entry = png_voidcast(png_const_bytep, cmap); - - entry += i * channels; - - switch (channels) - { - case 4: - tRNS[i] = entry[afirst ? 0 : 3]; - if (tRNS[i] < 255) - num_trans = i+1; - /* FALL THROUGH */ - case 3: - palette[i].blue = entry[afirst + (2 ^ bgr)]; - palette[i].green = entry[afirst + 1]; - palette[i].red = entry[afirst + bgr]; - break; - - case 2: - tRNS[i] = entry[1 ^ afirst]; - if (tRNS[i] < 255) - num_trans = i+1; - /* FALL THROUGH */ - case 1: - palette[i].blue = palette[i].red = palette[i].green = - entry[afirst]; - break; - - default: - break; - } - } - } - -# ifdef afirst -# undef afirst -# endif -# ifdef bgr -# undef bgr -# endif - - png_set_PLTE(image->opaque->png_ptr, image->opaque->info_ptr, palette, - entries); - - if (num_trans > 0) - png_set_tRNS(image->opaque->png_ptr, image->opaque->info_ptr, tRNS, - num_trans, NULL); - - image->colormap_entries = entries; -} - -static int -png_image_write_main(png_voidp argument) -{ - png_image_write_control *display = png_voidcast(png_image_write_control*, - argument); - png_imagep image = display->image; - png_structrp png_ptr = image->opaque->png_ptr; - png_inforp info_ptr = image->opaque->info_ptr; - png_uint_32 format = image->format; - - int colormap = (format & PNG_FORMAT_FLAG_COLORMAP) != 0; - int linear = !colormap && (format & PNG_FORMAT_FLAG_LINEAR) != 0; /* input */ - int alpha = !colormap && (format & PNG_FORMAT_FLAG_ALPHA) != 0; - int write_16bit = linear && !colormap && !display->convert_to_8bit; - -# ifdef PNG_BENIGN_ERRORS_SUPPORTED - /* Make sure we error out on any bad situation */ - png_set_benign_errors(png_ptr, 0/*error*/); -# endif - - /* Default the 'row_stride' parameter if required. */ - if (display->row_stride == 0) - display->row_stride = PNG_IMAGE_ROW_STRIDE(*image); - - /* Set the required transforms then write the rows in the correct order. */ - if (format & PNG_FORMAT_FLAG_COLORMAP) - { - if (display->colormap != NULL && image->colormap_entries > 0) - { - png_uint_32 entries = image->colormap_entries; - - png_set_IHDR(png_ptr, info_ptr, image->width, image->height, - entries > 16 ? 8 : (entries > 4 ? 4 : (entries > 2 ? 2 : 1)), - PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - - png_image_set_PLTE(display); - } - - else - png_error(image->opaque->png_ptr, - "no color-map for color-mapped image"); - } - - else - png_set_IHDR(png_ptr, info_ptr, image->width, image->height, - write_16bit ? 16 : 8, - ((format & PNG_FORMAT_FLAG_COLOR) ? PNG_COLOR_MASK_COLOR : 0) + - ((format & PNG_FORMAT_FLAG_ALPHA) ? PNG_COLOR_MASK_ALPHA : 0), - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - - /* Counter-intuitively the data transformations must be called *after* - * png_write_info, not before as in the read code, but the 'set' functions - * must still be called before. Just set the color space information, never - * write an interlaced image. - */ - - if (write_16bit) - { - /* The gamma here is 1.0 (linear) and the cHRM chunk matches sRGB. */ - png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_LINEAR); - - if (!(image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB)) - png_set_cHRM_fixed(png_ptr, info_ptr, - /* color x y */ - /* white */ 31270, 32900, - /* red */ 64000, 33000, - /* green */ 30000, 60000, - /* blue */ 15000, 6000 - ); - } - - else if (!(image->flags & PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB)) - png_set_sRGB(png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL); - - /* Else writing an 8-bit file and the *colors* aren't sRGB, but the 8-bit - * space must still be gamma encoded. - */ - else - png_set_gAMA_fixed(png_ptr, info_ptr, PNG_GAMMA_sRGB_INVERSE); - - /* Write the file header. */ - png_write_info(png_ptr, info_ptr); - - /* Now set up the data transformations (*after* the header is written), - * remove the handled transformations from the 'format' flags for checking. - * - * First check for a little endian system if writing 16 bit files. - */ - if (write_16bit) - { - PNG_CONST png_uint_16 le = 0x0001; - - if (*(png_const_bytep)&le) - png_set_swap(png_ptr); - } - -# ifdef PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED - if (format & PNG_FORMAT_FLAG_BGR) - { - if (!colormap && (format & PNG_FORMAT_FLAG_COLOR) != 0) - png_set_bgr(png_ptr); - format &= ~PNG_FORMAT_FLAG_BGR; - } -# endif - -# ifdef PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED - if (format & PNG_FORMAT_FLAG_AFIRST) - { - if (!colormap && (format & PNG_FORMAT_FLAG_ALPHA) != 0) - png_set_swap_alpha(png_ptr); - format &= ~PNG_FORMAT_FLAG_AFIRST; - } -# endif - - /* If there are 16 or fewer color-map entries we wrote a lower bit depth - * above, but the application data is still byte packed. - */ - if (colormap && image->colormap_entries <= 16) - png_set_packing(png_ptr); - - /* That should have handled all (both) the transforms. */ - if ((format & ~(png_uint_32)(PNG_FORMAT_FLAG_COLOR | PNG_FORMAT_FLAG_LINEAR | - PNG_FORMAT_FLAG_ALPHA | PNG_FORMAT_FLAG_COLORMAP)) != 0) - png_error(png_ptr, "png_write_image: unsupported transformation"); - - { - png_const_bytep row = png_voidcast(png_const_bytep, display->buffer); - ptrdiff_t row_bytes = display->row_stride; - - if (linear) - row_bytes *= (sizeof (png_uint_16)); - - if (row_bytes < 0) - row += (image->height-1) * (-row_bytes); - - display->first_row = row; - display->row_bytes = row_bytes; - } - - /* Apply 'fast' options if the flag is set. */ - if ((image->flags & PNG_IMAGE_FLAG_FAST) != 0) - { - png_set_filter(png_ptr, PNG_FILTER_TYPE_BASE, PNG_NO_FILTERS); - /* NOTE: determined by experiment using pngstest, this reflects some - * balance between the time to write the image once and the time to read - * it about 50 times. The speed-up in pngstest was about 10-20% of the - * total (user) time on a heavily loaded system. - */ - png_set_compression_level(png_ptr, 3); - } - - /* Check for the cases that currently require a pre-transform on the row - * before it is written. This only applies when the input is 16-bit and - * either there is an alpha channel or it is converted to 8-bit. - */ - if ((linear && alpha) || (!colormap && display->convert_to_8bit)) - { - png_bytep row = png_voidcast(png_bytep, png_malloc(png_ptr, - png_get_rowbytes(png_ptr, info_ptr))); - int result; - - display->local_row = row; - if (write_16bit) - result = png_safe_execute(image, png_write_image_16bit, display); - else - result = png_safe_execute(image, png_write_image_8bit, display); - display->local_row = NULL; - - png_free(png_ptr, row); - - /* Skip the 'write_end' on error: */ - if (!result) - return 0; - } - - /* Otherwise this is the case where the input is in a format currently - * supported by the rest of the libpng write code; call it directly. - */ - else - { - png_const_bytep row = png_voidcast(png_const_bytep, display->first_row); - ptrdiff_t row_bytes = display->row_bytes; - png_uint_32 y = image->height; - - while (y-- > 0) - { - png_write_row(png_ptr, row); - row += row_bytes; - } - } - - png_write_end(png_ptr, info_ptr); - return 1; -} - -int PNGAPI -png_image_write_to_stdio(png_imagep image, FILE *file, int convert_to_8bit, - const void *buffer, png_int_32 row_stride, const void *colormap) -{ - /* Write the image to the given (FILE*). */ - if (image != NULL && image->version == PNG_IMAGE_VERSION) - { - if (file != NULL) - { - if (png_image_write_init(image)) - { - png_image_write_control display; - int result; - - /* This is slightly evil, but png_init_io doesn't do anything other - * than this and we haven't changed the standard IO functions so - * this saves a 'safe' function. - */ - image->opaque->png_ptr->io_ptr = file; - - memset(&display, 0, (sizeof display)); - display.image = image; - display.buffer = buffer; - display.row_stride = row_stride; - display.colormap = colormap; - display.convert_to_8bit = convert_to_8bit; - - result = png_safe_execute(image, png_image_write_main, &display); - png_image_free(image); - return result; - } - - else - return 0; - } - - else - return png_image_error(image, - "png_image_write_to_stdio: invalid argument"); - } - - else if (image != NULL) - return png_image_error(image, - "png_image_write_to_stdio: incorrect PNG_IMAGE_VERSION"); - - else - return 0; -} - -int PNGAPI -png_image_write_to_file(png_imagep image, const char *file_name, - int convert_to_8bit, const void *buffer, png_int_32 row_stride, - const void *colormap) -{ - /* Write the image to the named file. */ - if (image != NULL && image->version == PNG_IMAGE_VERSION) - { - if (file_name != NULL) - { - FILE *fp = fopen(file_name, "wb"); - - if (fp != NULL) - { - if (png_image_write_to_stdio(image, fp, convert_to_8bit, buffer, - row_stride, colormap)) - { - int error; /* from fflush/fclose */ - - /* Make sure the file is flushed correctly. */ - if (fflush(fp) == 0 && ferror(fp) == 0) - { - if (fclose(fp) == 0) - return 1; - - error = errno; /* from fclose */ - } - - else - { - error = errno; /* from fflush or ferror */ - (void)fclose(fp); - } - - (void)remove(file_name); - /* The image has already been cleaned up; this is just used to - * set the error (because the original write succeeded). - */ - return png_image_error(image, strerror(error)); - } - - else - { - /* Clean up: just the opened file. */ - (void)fclose(fp); - (void)remove(file_name); - return 0; - } - } - - else - return png_image_error(image, strerror(errno)); - } - - else - return png_image_error(image, - "png_image_write_to_file: invalid argument"); - } - - else if (image != NULL) - return png_image_error(image, - "png_image_write_to_file: incorrect PNG_IMAGE_VERSION"); - - else - return 0; -} -#endif /* PNG_STDIO_SUPPORTED */ -#endif /* SIMPLIFIED_WRITE */ -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwtran.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwtran.c deleted file mode 100755 index 2cdd7c9..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwtran.c +++ /dev/null @@ -1,637 +0,0 @@ - -/* pngwtran.c - transforms the data in a row for PNG writers - * - * Last changed in libpng 1.6.0 [February 14, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - */ - -#include "pngpriv.h" - -#ifdef PNG_WRITE_SUPPORTED - -#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED -/* Transform the data according to the user's wishes. The order of - * transformations is significant. - */ -void /* PRIVATE */ -png_do_write_transformations(png_structrp png_ptr, png_row_infop row_info) -{ - png_debug(1, "in png_do_write_transformations"); - - if (png_ptr == NULL) - return; - -#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED - if (png_ptr->transformations & PNG_USER_TRANSFORM) - if (png_ptr->write_user_transform_fn != NULL) - (*(png_ptr->write_user_transform_fn)) /* User write transform - function */ - (png_ptr, /* png_ptr */ - row_info, /* row_info: */ - /* png_uint_32 width; width of row */ - /* png_size_t rowbytes; number of bytes in row */ - /* png_byte color_type; color type of pixels */ - /* png_byte bit_depth; bit depth of samples */ - /* png_byte channels; number of channels (1-4) */ - /* png_byte pixel_depth; bits per pixel (depth*channels) */ - png_ptr->row_buf + 1); /* start of pixel data for row */ -#endif - -#ifdef PNG_WRITE_FILLER_SUPPORTED - if (png_ptr->transformations & PNG_FILLER) - png_do_strip_channel(row_info, png_ptr->row_buf + 1, - !(png_ptr->flags & PNG_FLAG_FILLER_AFTER)); -#endif - -#ifdef PNG_WRITE_PACKSWAP_SUPPORTED - if (png_ptr->transformations & PNG_PACKSWAP) - png_do_packswap(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_WRITE_PACK_SUPPORTED - if (png_ptr->transformations & PNG_PACK) - png_do_pack(row_info, png_ptr->row_buf + 1, - (png_uint_32)png_ptr->bit_depth); -#endif - -#ifdef PNG_WRITE_SWAP_SUPPORTED - if (png_ptr->transformations & PNG_SWAP_BYTES) - png_do_swap(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_WRITE_SHIFT_SUPPORTED - if (png_ptr->transformations & PNG_SHIFT) - png_do_shift(row_info, png_ptr->row_buf + 1, - &(png_ptr->shift)); -#endif - -#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_SWAP_ALPHA) - png_do_write_swap_alpha(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED - if (png_ptr->transformations & PNG_INVERT_ALPHA) - png_do_write_invert_alpha(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_WRITE_BGR_SUPPORTED - if (png_ptr->transformations & PNG_BGR) - png_do_bgr(row_info, png_ptr->row_buf + 1); -#endif - -#ifdef PNG_WRITE_INVERT_SUPPORTED - if (png_ptr->transformations & PNG_INVERT_MONO) - png_do_invert(row_info, png_ptr->row_buf + 1); -#endif -} - -#ifdef PNG_WRITE_PACK_SUPPORTED -/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The - * row_info bit depth should be 8 (one pixel per byte). The channels - * should be 1 (this only happens on grayscale and paletted images). - */ -void /* PRIVATE */ -png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth) -{ - png_debug(1, "in png_do_pack"); - - if (row_info->bit_depth == 8 && - row_info->channels == 1) - { - switch ((int)bit_depth) - { - case 1: - { - png_bytep sp, dp; - int mask, v; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - sp = row; - dp = row; - mask = 0x80; - v = 0; - - for (i = 0; i < row_width; i++) - { - if (*sp != 0) - v |= mask; - - sp++; - - if (mask > 1) - mask >>= 1; - - else - { - mask = 0x80; - *dp = (png_byte)v; - dp++; - v = 0; - } - } - - if (mask != 0x80) - *dp = (png_byte)v; - - break; - } - - case 2: - { - png_bytep sp, dp; - int shift, v; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - sp = row; - dp = row; - shift = 6; - v = 0; - - for (i = 0; i < row_width; i++) - { - png_byte value; - - value = (png_byte)(*sp & 0x03); - v |= (value << shift); - - if (shift == 0) - { - shift = 6; - *dp = (png_byte)v; - dp++; - v = 0; - } - - else - shift -= 2; - - sp++; - } - - if (shift != 6) - *dp = (png_byte)v; - - break; - } - - case 4: - { - png_bytep sp, dp; - int shift, v; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - sp = row; - dp = row; - shift = 4; - v = 0; - - for (i = 0; i < row_width; i++) - { - png_byte value; - - value = (png_byte)(*sp & 0x0f); - v |= (value << shift); - - if (shift == 0) - { - shift = 4; - *dp = (png_byte)v; - dp++; - v = 0; - } - - else - shift -= 4; - - sp++; - } - - if (shift != 4) - *dp = (png_byte)v; - - break; - } - - default: - break; - } - - row_info->bit_depth = (png_byte)bit_depth; - row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels); - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, - row_info->width); - } -} -#endif - -#ifdef PNG_WRITE_SHIFT_SUPPORTED -/* Shift pixel values to take advantage of whole range. Pass the - * true number of bits in bit_depth. The row should be packed - * according to row_info->bit_depth. Thus, if you had a row of - * bit depth 4, but the pixels only had values from 0 to 7, you - * would pass 3 as bit_depth, and this routine would translate the - * data to 0 to 15. - */ -void /* PRIVATE */ -png_do_shift(png_row_infop row_info, png_bytep row, - png_const_color_8p bit_depth) -{ - png_debug(1, "in png_do_shift"); - - if (row_info->color_type != PNG_COLOR_TYPE_PALETTE) - { - int shift_start[4], shift_dec[4]; - int channels = 0; - - if (row_info->color_type & PNG_COLOR_MASK_COLOR) - { - shift_start[channels] = row_info->bit_depth - bit_depth->red; - shift_dec[channels] = bit_depth->red; - channels++; - - shift_start[channels] = row_info->bit_depth - bit_depth->green; - shift_dec[channels] = bit_depth->green; - channels++; - - shift_start[channels] = row_info->bit_depth - bit_depth->blue; - shift_dec[channels] = bit_depth->blue; - channels++; - } - - else - { - shift_start[channels] = row_info->bit_depth - bit_depth->gray; - shift_dec[channels] = bit_depth->gray; - channels++; - } - - if (row_info->color_type & PNG_COLOR_MASK_ALPHA) - { - shift_start[channels] = row_info->bit_depth - bit_depth->alpha; - shift_dec[channels] = bit_depth->alpha; - channels++; - } - - /* With low row depths, could only be grayscale, so one channel */ - if (row_info->bit_depth < 8) - { - png_bytep bp = row; - png_size_t i; - unsigned int mask; - png_size_t row_bytes = row_info->rowbytes; - - if (bit_depth->gray == 1 && row_info->bit_depth == 2) - mask = 0x55; - - else if (row_info->bit_depth == 4 && bit_depth->gray == 3) - mask = 0x11; - - else - mask = 0xff; - - for (i = 0; i < row_bytes; i++, bp++) - { - int j; - unsigned int v, out; - - v = *bp; - out = 0; - - for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0]) - { - if (j > 0) - out |= v << j; - - else - out |= (v >> (-j)) & mask; - } - - *bp = (png_byte)(out & 0xff); - } - } - - else if (row_info->bit_depth == 8) - { - png_bytep bp = row; - png_uint_32 i; - png_uint_32 istop = channels * row_info->width; - - for (i = 0; i < istop; i++, bp++) - { - - const unsigned int c = i%channels; - int j; - unsigned int v, out; - - v = *bp; - out = 0; - - for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) - { - if (j > 0) - out |= v << j; - - else - out |= v >> (-j); - } - - *bp = (png_byte)(out & 0xff); - } - } - - else - { - png_bytep bp; - png_uint_32 i; - png_uint_32 istop = channels * row_info->width; - - for (bp = row, i = 0; i < istop; i++) - { - const unsigned int c = i%channels; - int j; - unsigned int value, v; - - v = png_get_uint_16(bp); - value = 0; - - for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c]) - { - if (j > 0) - value |= v << j; - - else - value |= v >> (-j); - } - *bp++ = (png_byte)((value >> 8) & 0xff); - *bp++ = (png_byte)(value & 0xff); - } - } - } -} -#endif - -#ifdef PNG_WRITE_SWAP_ALPHA_SUPPORTED -void /* PRIVATE */ -png_do_write_swap_alpha(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_write_swap_alpha"); - - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - if (row_info->bit_depth == 8) - { - /* This converts from ARGB to RGBA */ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - png_byte save = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = save; - } - } - -#ifdef PNG_WRITE_16BIT_SUPPORTED - else - { - /* This converts from AARRGGBB to RRGGBBAA */ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - png_byte save[2]; - save[0] = *(sp++); - save[1] = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = save[0]; - *(dp++) = save[1]; - } - } -#endif /* PNG_WRITE_16BIT_SUPPORTED */ - } - - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - if (row_info->bit_depth == 8) - { - /* This converts from AG to GA */ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - png_byte save = *(sp++); - *(dp++) = *(sp++); - *(dp++) = save; - } - } - -#ifdef PNG_WRITE_16BIT_SUPPORTED - else - { - /* This converts from AAGG to GGAA */ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - png_byte save[2]; - save[0] = *(sp++); - save[1] = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = save[0]; - *(dp++) = save[1]; - } - } -#endif /* PNG_WRITE_16BIT_SUPPORTED */ - } - } -} -#endif - -#ifdef PNG_WRITE_INVERT_ALPHA_SUPPORTED -void /* PRIVATE */ -png_do_write_invert_alpha(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_write_invert_alpha"); - - { - if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - { - if (row_info->bit_depth == 8) - { - /* This inverts the alpha channel in RGBA */ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - /* Does nothing - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - */ - sp+=3; dp = sp; - *(dp++) = (png_byte)(255 - *(sp++)); - } - } - -#ifdef PNG_WRITE_16BIT_SUPPORTED - else - { - /* This inverts the alpha channel in RRGGBBAA */ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - /* Does nothing - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - *(dp++) = *(sp++); - */ - sp+=6; dp = sp; - *(dp++) = (png_byte)(255 - *(sp++)); - *(dp++) = (png_byte)(255 - *(sp++)); - } - } -#endif /* PNG_WRITE_16BIT_SUPPORTED */ - } - - else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA) - { - if (row_info->bit_depth == 8) - { - /* This inverts the alpha channel in GA */ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - *(dp++) = *(sp++); - *(dp++) = (png_byte)(255 - *(sp++)); - } - } - -#ifdef PNG_WRITE_16BIT_SUPPORTED - else - { - /* This inverts the alpha channel in GGAA */ - png_bytep sp, dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - for (i = 0, sp = dp = row; i < row_width; i++) - { - /* Does nothing - *(dp++) = *(sp++); - *(dp++) = *(sp++); - */ - sp+=2; dp = sp; - *(dp++) = (png_byte)(255 - *(sp++)); - *(dp++) = (png_byte)(255 - *(sp++)); - } - } -#endif /* PNG_WRITE_16BIT_SUPPORTED */ - } - } -} -#endif -#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ - -#ifdef PNG_MNG_FEATURES_SUPPORTED -/* Undoes intrapixel differencing */ -void /* PRIVATE */ -png_do_write_intrapixel(png_row_infop row_info, png_bytep row) -{ - png_debug(1, "in png_do_write_intrapixel"); - - if ((row_info->color_type & PNG_COLOR_MASK_COLOR)) - { - int bytes_per_pixel; - png_uint_32 row_width = row_info->width; - if (row_info->bit_depth == 8) - { - png_bytep rp; - png_uint_32 i; - - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - bytes_per_pixel = 3; - - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - bytes_per_pixel = 4; - - else - return; - - for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) - { - *(rp) = (png_byte)((*rp - *(rp + 1)) & 0xff); - *(rp + 2) = (png_byte)((*(rp + 2) - *(rp + 1)) & 0xff); - } - } - -#ifdef PNG_WRITE_16BIT_SUPPORTED - else if (row_info->bit_depth == 16) - { - png_bytep rp; - png_uint_32 i; - - if (row_info->color_type == PNG_COLOR_TYPE_RGB) - bytes_per_pixel = 6; - - else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA) - bytes_per_pixel = 8; - - else - return; - - for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel) - { - png_uint_32 s0 = (*(rp ) << 8) | *(rp + 1); - png_uint_32 s1 = (*(rp + 2) << 8) | *(rp + 3); - png_uint_32 s2 = (*(rp + 4) << 8) | *(rp + 5); - png_uint_32 red = (png_uint_32)((s0 - s1) & 0xffffL); - png_uint_32 blue = (png_uint_32)((s2 - s1) & 0xffffL); - *(rp ) = (png_byte)((red >> 8) & 0xff); - *(rp + 1) = (png_byte)(red & 0xff); - *(rp + 4) = (png_byte)((blue >> 8) & 0xff); - *(rp + 5) = (png_byte)(blue & 0xff); - } - } -#endif /* PNG_WRITE_16BIT_SUPPORTED */ - } -} -#endif /* PNG_MNG_FEATURES_SUPPORTED */ -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwutil.c b/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwutil.c deleted file mode 100755 index c90ff8b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/image_formats/pnglib/pngwutil.c +++ /dev/null @@ -1,3020 +0,0 @@ - -/* pngwutil.c - utilities to write a PNG file - * - * Last changed in libpng 1.6.0 [February 14, 2013] - * Copyright (c) 1998-2013 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - */ - -#include "pngpriv.h" - -#ifdef PNG_WRITE_SUPPORTED - -#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED -/* Place a 32-bit number into a buffer in PNG byte order. We work - * with unsigned numbers for convenience, although one supported - * ancillary chunk uses signed (two's complement) numbers. - */ -void PNGAPI -png_save_uint_32(png_bytep buf, png_uint_32 i) -{ - buf[0] = (png_byte)((i >> 24) & 0xff); - buf[1] = (png_byte)((i >> 16) & 0xff); - buf[2] = (png_byte)((i >> 8) & 0xff); - buf[3] = (png_byte)(i & 0xff); -} - -/* Place a 16-bit number into a buffer in PNG byte order. - * The parameter is declared unsigned int, not png_uint_16, - * just to avoid potential problems on pre-ANSI C compilers. - */ -void PNGAPI -png_save_uint_16(png_bytep buf, unsigned int i) -{ - buf[0] = (png_byte)((i >> 8) & 0xff); - buf[1] = (png_byte)(i & 0xff); -} -#endif - -/* Simple function to write the signature. If we have already written - * the magic bytes of the signature, or more likely, the PNG stream is - * being embedded into another stream and doesn't need its own signature, - * we should call png_set_sig_bytes() to tell libpng how many of the - * bytes have already been written. - */ -void PNGAPI -png_write_sig(png_structrp png_ptr) -{ - png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; - -#ifdef PNG_IO_STATE_SUPPORTED - /* Inform the I/O callback that the signature is being written */ - png_ptr->io_state = PNG_IO_WRITING | PNG_IO_SIGNATURE; -#endif - - /* Write the rest of the 8 byte signature */ - png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes], - (png_size_t)(8 - png_ptr->sig_bytes)); - - if (png_ptr->sig_bytes < 3) - png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE; -} - -/* Write the start of a PNG chunk. The type is the chunk type. - * The total_length is the sum of the lengths of all the data you will be - * passing in png_write_chunk_data(). - */ -static void -png_write_chunk_header(png_structrp png_ptr, png_uint_32 chunk_name, - png_uint_32 length) -{ - png_byte buf[8]; - -#if defined(PNG_DEBUG) && (PNG_DEBUG > 0) - PNG_CSTRING_FROM_CHUNK(buf, chunk_name); - png_debug2(0, "Writing %s chunk, length = %lu", buf, (unsigned long)length); -#endif - - if (png_ptr == NULL) - return; - -#ifdef PNG_IO_STATE_SUPPORTED - /* Inform the I/O callback that the chunk header is being written. - * PNG_IO_CHUNK_HDR requires a single I/O call. - */ - png_ptr->io_state = PNG_IO_WRITING | PNG_IO_CHUNK_HDR; -#endif - - /* Write the length and the chunk name */ - png_save_uint_32(buf, length); - png_save_uint_32(buf + 4, chunk_name); - png_write_data(png_ptr, buf, 8); - - /* Put the chunk name into png_ptr->chunk_name */ - png_ptr->chunk_name = chunk_name; - - /* Reset the crc and run it over the chunk name */ - png_reset_crc(png_ptr); - - png_calculate_crc(png_ptr, buf + 4, 4); - -#ifdef PNG_IO_STATE_SUPPORTED - /* Inform the I/O callback that chunk data will (possibly) be written. - * PNG_IO_CHUNK_DATA does NOT require a specific number of I/O calls. - */ - png_ptr->io_state = PNG_IO_WRITING | PNG_IO_CHUNK_DATA; -#endif -} - -void PNGAPI -png_write_chunk_start(png_structrp png_ptr, png_const_bytep chunk_string, - png_uint_32 length) -{ - png_write_chunk_header(png_ptr, PNG_CHUNK_FROM_STRING(chunk_string), length); -} - -/* Write the data of a PNG chunk started with png_write_chunk_header(). - * Note that multiple calls to this function are allowed, and that the - * sum of the lengths from these calls *must* add up to the total_length - * given to png_write_chunk_header(). - */ -void PNGAPI -png_write_chunk_data(png_structrp png_ptr, png_const_bytep data, - png_size_t length) -{ - /* Write the data, and run the CRC over it */ - if (png_ptr == NULL) - return; - - if (data != NULL && length > 0) - { - png_write_data(png_ptr, data, length); - - /* Update the CRC after writing the data, - * in case that the user I/O routine alters it. - */ - png_calculate_crc(png_ptr, data, length); - } -} - -/* Finish a chunk started with png_write_chunk_header(). */ -void PNGAPI -png_write_chunk_end(png_structrp png_ptr) -{ - png_byte buf[4]; - - if (png_ptr == NULL) return; - -#ifdef PNG_IO_STATE_SUPPORTED - /* Inform the I/O callback that the chunk CRC is being written. - * PNG_IO_CHUNK_CRC requires a single I/O function call. - */ - png_ptr->io_state = PNG_IO_WRITING | PNG_IO_CHUNK_CRC; -#endif - - /* Write the crc in a single operation */ - png_save_uint_32(buf, png_ptr->crc); - - png_write_data(png_ptr, buf, (png_size_t)4); -} - -/* Write a PNG chunk all at once. The type is an array of ASCII characters - * representing the chunk name. The array must be at least 4 bytes in - * length, and does not need to be null terminated. To be safe, pass the - * pre-defined chunk names here, and if you need a new one, define it - * where the others are defined. The length is the length of the data. - * All the data must be present. If that is not possible, use the - * png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end() - * functions instead. - */ -static void -png_write_complete_chunk(png_structrp png_ptr, png_uint_32 chunk_name, - png_const_bytep data, png_size_t length) -{ - if (png_ptr == NULL) - return; - - /* On 64 bit architectures 'length' may not fit in a png_uint_32. */ - if (length > PNG_UINT_31_MAX) - png_error(png_ptr, "length exceeds PNG maxima"); - - png_write_chunk_header(png_ptr, chunk_name, (png_uint_32)length); - png_write_chunk_data(png_ptr, data, length); - png_write_chunk_end(png_ptr); -} - -/* This is the API that calls the internal function above. */ -void PNGAPI -png_write_chunk(png_structrp png_ptr, png_const_bytep chunk_string, - png_const_bytep data, png_size_t length) -{ - png_write_complete_chunk(png_ptr, PNG_CHUNK_FROM_STRING(chunk_string), data, - length); -} - -/* This is used below to find the size of an image to pass to png_deflate_claim, - * so it only needs to be accurate if the size is less than 16384 bytes (the - * point at which a lower LZ window size can be used.) - */ -static png_alloc_size_t -png_image_size(png_structrp png_ptr) -{ - /* Only return sizes up to the maximum of a png_uint_32, do this by limiting - * the width and height used to 15 bits. - */ - png_uint_32 h = png_ptr->height; - - if (png_ptr->rowbytes < 32768 && h < 32768) - { - if (png_ptr->interlaced) - { - /* Interlacing makes the image larger because of the replication of - * both the filter byte and the padding to a byte boundary. - */ - png_uint_32 w = png_ptr->width; - unsigned int pd = png_ptr->pixel_depth; - png_alloc_size_t cb_base; - int pass; - - for (cb_base=0, pass=0; pass<=6; ++pass) - { - png_uint_32 pw = PNG_PASS_COLS(w, pass); - - if (pw > 0) - cb_base += (PNG_ROWBYTES(pd, pw)+1) * PNG_PASS_ROWS(h, pass); - } - - return cb_base; - } - - else - return (png_ptr->rowbytes+1) * h; - } - - else - return 0xffffffffU; -} - -#ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED - /* This is the code to hack the first two bytes of the deflate stream (the - * deflate header) to correct the windowBits value to match the actual data - * size. Note that the second argument is the *uncompressed* size but the - * first argument is the *compressed* data (and it must be deflate - * compressed.) - */ -static void -optimize_cmf(png_bytep data, png_alloc_size_t data_size) -{ - /* Optimize the CMF field in the zlib stream. The resultant zlib stream is - * still compliant to the stream specification. - */ - if (data_size <= 16384) /* else windowBits must be 15 */ - { - unsigned int z_cmf = data[0]; /* zlib compression method and flags */ - - if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70) - { - unsigned int z_cinfo; - unsigned int half_z_window_size; - - z_cinfo = z_cmf >> 4; - half_z_window_size = 1U << (z_cinfo + 7); - - if (data_size <= half_z_window_size) /* else no change */ - { - unsigned int tmp; - - do - { - half_z_window_size >>= 1; - --z_cinfo; - } - while (z_cinfo > 0 && data_size <= half_z_window_size); - - z_cmf = (z_cmf & 0x0f) | (z_cinfo << 4); - - data[0] = (png_byte)z_cmf; - tmp = data[1] & 0xe0; - tmp += 0x1f - ((z_cmf << 8) + tmp) % 0x1f; - data[1] = (png_byte)tmp; - } - } - } -} -#else -# define optimize_cmf(dp,dl) ((void)0) -#endif /* PNG_WRITE_OPTIMIZE_CMF_SUPPORTED */ - -/* Initialize the compressor for the appropriate type of compression. */ -static int -png_deflate_claim(png_structrp png_ptr, png_uint_32 owner, - png_alloc_size_t data_size) -{ - if (png_ptr->zowner != 0) - { - char msg[64]; - - PNG_STRING_FROM_CHUNK(msg, owner); - msg[4] = ':'; - msg[5] = ' '; - PNG_STRING_FROM_CHUNK(msg+6, png_ptr->zowner); - /* So the message that results is " using zstream"; this is an - * internal error, but is very useful for debugging. i18n requirements - * are minimal. - */ - (void)png_safecat(msg, (sizeof msg), 10, " using zstream"); -# if PNG_LIBPNG_BUILD_BASE_TYPE >= PNG_LIBPNG_BUILD_RC - png_warning(png_ptr, msg); - - /* Attempt sane error recovery */ - if (png_ptr->zowner == png_IDAT) /* don't steal from IDAT */ - { - png_ptr->zstream.msg = PNGZ_MSG_CAST("in use by IDAT"); - return Z_STREAM_ERROR; - } - - png_ptr->zowner = 0; -# else - png_error(png_ptr, msg); -# endif - } - - { - int level = png_ptr->zlib_level; - int method = png_ptr->zlib_method; - int windowBits = png_ptr->zlib_window_bits; - int memLevel = png_ptr->zlib_mem_level; - int strategy; /* set below */ - int ret; /* zlib return code */ - - if (owner == png_IDAT) - { - if (png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY) - strategy = png_ptr->zlib_strategy; - - else if (png_ptr->do_filter != PNG_FILTER_NONE) - strategy = PNG_Z_DEFAULT_STRATEGY; - - else - strategy = PNG_Z_DEFAULT_NOFILTER_STRATEGY; - } - - else - { -# ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED - level = png_ptr->zlib_text_level; - method = png_ptr->zlib_text_method; - windowBits = png_ptr->zlib_text_window_bits; - memLevel = png_ptr->zlib_text_mem_level; - strategy = png_ptr->zlib_text_strategy; -# else - /* If customization is not supported the values all come from the - * IDAT values except for the strategy, which is fixed to the - * default. (This is the pre-1.6.0 behavior too, although it was - * implemented in a very different way.) - */ - strategy = Z_DEFAULT_STRATEGY; -# endif - } - - /* Adjust 'windowBits' down if larger than 'data_size'; to stop this - * happening just pass 32768 as the data_size parameter. Notice that zlib - * requires an extra 262 bytes in the window in addition to the data to be - * able to see the whole of the data, so if data_size+262 takes us to the - * next windowBits size we need to fix up the value later. (Because even - * though deflate needs the extra window, inflate does not!) - */ - if (data_size <= 16384) - { - /* IMPLEMENTATION NOTE: this 'half_window_size' stuff is only here to - * work round a Microsoft Visual C misbehavior which, contrary to C-90, - * widens the result of the following shift to 64-bits if (and, - * apparently, only if) it is used in a test. - */ - unsigned int half_window_size = 1U << (windowBits-1); - - while (data_size + 262 <= half_window_size) - { - half_window_size >>= 1; - --windowBits; - } - } - - /* Check against the previous initialized values, if any. */ - if ((png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) && - (png_ptr->zlib_set_level != level || - png_ptr->zlib_set_method != method || - png_ptr->zlib_set_window_bits != windowBits || - png_ptr->zlib_set_mem_level != memLevel || - png_ptr->zlib_set_strategy != strategy)) - { - if (deflateEnd(&png_ptr->zstream) != Z_OK) - png_warning(png_ptr, "deflateEnd failed (ignored)"); - - png_ptr->flags &= ~PNG_FLAG_ZSTREAM_INITIALIZED; - } - - /* For safety clear out the input and output pointers (currently zlib - * doesn't use them on Init, but it might in the future). - */ - png_ptr->zstream.next_in = NULL; - png_ptr->zstream.avail_in = 0; - png_ptr->zstream.next_out = NULL; - png_ptr->zstream.avail_out = 0; - - /* Now initialize if required, setting the new parameters, otherwise just - * to a simple reset to the previous parameters. - */ - if (png_ptr->flags & PNG_FLAG_ZSTREAM_INITIALIZED) - ret = deflateReset(&png_ptr->zstream); - - else - { - ret = deflateInit2(&png_ptr->zstream, level, method, windowBits, - memLevel, strategy); - - if (ret == Z_OK) - png_ptr->flags |= PNG_FLAG_ZSTREAM_INITIALIZED; - } - - /* The return code is from either deflateReset or deflateInit2; they have - * pretty much the same set of error codes. - */ - if (ret == Z_OK) - png_ptr->zowner = owner; - - else - png_zstream_error(png_ptr, ret); - - return ret; - } -} - -/* Clean up (or trim) a linked list of compression buffers. */ -void /* PRIVATE */ -png_free_buffer_list(png_structrp png_ptr, png_compression_bufferp *listp) -{ - png_compression_bufferp list = *listp; - - if (list != NULL) - { - *listp = NULL; - - do - { - png_compression_bufferp next = list->next; - - png_free(png_ptr, list); - list = next; - } - while (list != NULL); - } -} - -#ifdef PNG_WRITE_COMPRESSED_TEXT_SUPPORTED -/* This pair of functions encapsulates the operation of (a) compressing a - * text string, and (b) issuing it later as a series of chunk data writes. - * The compression_state structure is shared context for these functions - * set up by the caller to allow access to the relevant local variables. - * - * compression_buffer (new in 1.6.0) is just a linked list of zbuffer_size - * temporary buffers. From 1.6.0 it is retained in png_struct so that it will - * be correctly freed in the event of a write error (previous implementations - * just leaked memory.) - */ -typedef struct -{ - png_const_bytep input; /* The uncompressed input data */ - png_alloc_size_t input_len; /* Its length */ - png_uint_32 output_len; /* Final compressed length */ - png_byte output[1024]; /* First block of output */ -} compression_state; - -static void -png_text_compress_init(compression_state *comp, png_const_bytep input, - png_alloc_size_t input_len) -{ - comp->input = input; - comp->input_len = input_len; - comp->output_len = 0; -} - -/* Compress the data in the compression state input */ -static int -png_text_compress(png_structrp png_ptr, png_uint_32 chunk_name, - compression_state *comp, png_uint_32 prefix_len) -{ - int ret; - - /* To find the length of the output it is necessary to first compress the - * input, the result is buffered rather than using the two-pass algorithm - * that is used on the inflate side; deflate is assumed to be slower and a - * PNG writer is assumed to have more memory available than a PNG reader. - * - * IMPLEMENTATION NOTE: the zlib API deflateBound() can be used to find an - * upper limit on the output size, but it is always bigger than the input - * size so it is likely to be more efficient to use this linked-list - * approach. - */ - ret = png_deflate_claim(png_ptr, chunk_name, comp->input_len); - - if (ret != Z_OK) - return ret; - - /* Set up the compression buffers, we need a loop here to avoid overflowing a - * uInt. Use ZLIB_IO_MAX to limit the input. The output is always limited - * by the output buffer size, so there is no need to check that. Since this - * is ANSI-C we know that an 'int', hence a uInt, is always at least 16 bits - * in size. - */ - { - png_compression_bufferp *end = &png_ptr->zbuffer_list; - png_alloc_size_t input_len = comp->input_len; /* may be zero! */ - png_uint_32 output_len; - - /* zlib updates these for us: */ - png_ptr->zstream.next_in = PNGZ_INPUT_CAST(comp->input); - png_ptr->zstream.avail_in = 0; /* Set below */ - png_ptr->zstream.next_out = comp->output; - png_ptr->zstream.avail_out = (sizeof comp->output); - - output_len = png_ptr->zstream.avail_out; - - do - { - uInt avail_in = ZLIB_IO_MAX; - - if (avail_in > input_len) - avail_in = (uInt)input_len; - - input_len -= avail_in; - - png_ptr->zstream.avail_in = avail_in; - - if (png_ptr->zstream.avail_out == 0) - { - png_compression_buffer *next; - - /* Chunk data is limited to 2^31 bytes in length, so the prefix - * length must be counted here. - */ - if (output_len + prefix_len > PNG_UINT_31_MAX) - { - ret = Z_MEM_ERROR; - break; - } - - /* Need a new (malloc'ed) buffer, but there may be one present - * already. - */ - next = *end; - if (next == NULL) - { - next = png_voidcast(png_compression_bufferp, png_malloc_base - (png_ptr, PNG_COMPRESSION_BUFFER_SIZE(png_ptr))); - - if (next == NULL) - { - ret = Z_MEM_ERROR; - break; - } - - /* Link in this buffer (so that it will be freed later) */ - next->next = NULL; - *end = next; - } - - png_ptr->zstream.next_out = next->output; - png_ptr->zstream.avail_out = png_ptr->zbuffer_size; - output_len += png_ptr->zstream.avail_out; - - /* Move 'end' to the next buffer pointer. */ - end = &next->next; - } - - /* Compress the data */ - ret = deflate(&png_ptr->zstream, - input_len > 0 ? Z_NO_FLUSH : Z_FINISH); - - /* Claw back input data that was not consumed (because avail_in is - * reset above every time round the loop). - */ - input_len += png_ptr->zstream.avail_in; - png_ptr->zstream.avail_in = 0; /* safety */ - } - while (ret == Z_OK); - - /* There may be some space left in the last output buffer, this needs to - * be subtracted from output_len. - */ - output_len -= png_ptr->zstream.avail_out; - png_ptr->zstream.avail_out = 0; /* safety */ - comp->output_len = output_len; - - /* Now double check the output length, put in a custom message if it is - * too long. Otherwise ensure the z_stream::msg pointer is set to - * something. - */ - if (output_len + prefix_len >= PNG_UINT_31_MAX) - { - png_ptr->zstream.msg = PNGZ_MSG_CAST("compressed data too long"); - ret = Z_MEM_ERROR; - } - - else - png_zstream_error(png_ptr, ret); - - /* Reset zlib for another zTXt/iTXt or image data */ - png_ptr->zowner = 0; - - /* The only success case is Z_STREAM_END, input_len must be 0, if not this - * is an internal error. - */ - if (ret == Z_STREAM_END && input_len == 0) - { - /* Fix up the deflate header, if required */ - optimize_cmf(comp->output, comp->input_len); - - /* But Z_OK is returned, not Z_STREAM_END; this allows the claim - * function above to return Z_STREAM_END on an error (though it never - * does in the current versions of zlib.) - */ - return Z_OK; - } - - else - return ret; - } -} - -/* Ship the compressed text out via chunk writes */ -static void -png_write_compressed_data_out(png_structrp png_ptr, compression_state *comp) -{ - png_uint_32 output_len = comp->output_len; - png_const_bytep output = comp->output; - png_uint_32 avail = (sizeof comp->output); - png_compression_buffer *next = png_ptr->zbuffer_list; - - for (;;) - { - if (avail > output_len) - avail = output_len; - - png_write_chunk_data(png_ptr, output, avail); - - output_len -= avail; - - if (output_len == 0 || next == NULL) - break; - - avail = png_ptr->zbuffer_size; - output = next->output; - next = next->next; - } - - /* This is an internal error; 'next' must have been NULL! */ - if (output_len > 0) - png_error(png_ptr, "error writing ancillary chunked compressed data"); -} -#endif /* PNG_WRITE_COMPRESSED_TEXT_SUPPORTED */ - -#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ - defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) -/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification, - * and if invalid, correct the keyword rather than discarding the entire - * chunk. The PNG 1.0 specification requires keywords 1-79 characters in - * length, forbids leading or trailing whitespace, multiple internal spaces, - * and the non-break space (0x80) from ISO 8859-1. Returns keyword length. - * - * The 'new_key' buffer must be 80 characters in size (for the keyword plus a - * trailing '\0'). If this routine returns 0 then there was no keyword, or a - * valid one could not be generated, and the caller must png_error. - */ -static png_uint_32 -png_check_keyword(png_structrp png_ptr, png_const_charp key, png_bytep new_key) -{ - png_const_charp orig_key = key; - png_uint_32 key_len = 0; - int bad_character = 0; - int space = 1; - - png_debug(1, "in png_check_keyword"); - - if (key == NULL) - { - *new_key = 0; - return 0; - } - - while (*key && key_len < 79) - { - png_byte ch = (png_byte)(0xff & *key++); - - if ((ch > 32 && ch <= 126) || (ch >= 161 /*&& ch <= 255*/)) - *new_key++ = ch, ++key_len, space = 0; - - else if (!space) - { - /* A space or an invalid character when one wasn't seen immediately - * before; output just a space. - */ - *new_key++ = 32, ++key_len, space = 1; - - /* If the character was not a space then it is invalid. */ - if (ch != 32) - bad_character = ch; - } - - else if (!bad_character) - bad_character = ch; /* just skip it, record the first error */ - } - - if (key_len > 0 && space) /* trailing space */ - { - --key_len, --new_key; - if (!bad_character) - bad_character = 32; - } - - /* Terminate the keyword */ - *new_key = 0; - - if (key_len == 0) - return 0; - - /* Try to only output one warning per keyword: */ - if (*key) /* keyword too long */ - png_warning(png_ptr, "keyword truncated"); - - else if (bad_character) - { - PNG_WARNING_PARAMETERS(p) - - png_warning_parameter(p, 1, orig_key); - png_warning_parameter_signed(p, 2, PNG_NUMBER_FORMAT_02x, bad_character); - - png_formatted_warning(png_ptr, p, "keyword \"@1\": bad character '0x@2'"); - } - - return key_len; -} -#endif - -/* Write the IHDR chunk, and update the png_struct with the necessary - * information. Note that the rest of this code depends upon this - * information being correct. - */ -void /* PRIVATE */ -png_write_IHDR(png_structrp png_ptr, png_uint_32 width, png_uint_32 height, - int bit_depth, int color_type, int compression_type, int filter_type, - int interlace_type) -{ - png_byte buf[13]; /* Buffer to store the IHDR info */ - - png_debug(1, "in png_write_IHDR"); - - /* Check that we have valid input data from the application info */ - switch (color_type) - { - case PNG_COLOR_TYPE_GRAY: - switch (bit_depth) - { - case 1: - case 2: - case 4: - case 8: -#ifdef PNG_WRITE_16BIT_SUPPORTED - case 16: -#endif - png_ptr->channels = 1; break; - - default: - png_error(png_ptr, - "Invalid bit depth for grayscale image"); - } - break; - - case PNG_COLOR_TYPE_RGB: -#ifdef PNG_WRITE_16BIT_SUPPORTED - if (bit_depth != 8 && bit_depth != 16) -#else - if (bit_depth != 8) -#endif - png_error(png_ptr, "Invalid bit depth for RGB image"); - - png_ptr->channels = 3; - break; - - case PNG_COLOR_TYPE_PALETTE: - switch (bit_depth) - { - case 1: - case 2: - case 4: - case 8: - png_ptr->channels = 1; - break; - - default: - png_error(png_ptr, "Invalid bit depth for paletted image"); - } - break; - - case PNG_COLOR_TYPE_GRAY_ALPHA: - if (bit_depth != 8 && bit_depth != 16) - png_error(png_ptr, "Invalid bit depth for grayscale+alpha image"); - - png_ptr->channels = 2; - break; - - case PNG_COLOR_TYPE_RGB_ALPHA: -#ifdef PNG_WRITE_16BIT_SUPPORTED - if (bit_depth != 8 && bit_depth != 16) -#else - if (bit_depth != 8) -#endif - png_error(png_ptr, "Invalid bit depth for RGBA image"); - - png_ptr->channels = 4; - break; - - default: - png_error(png_ptr, "Invalid image color type specified"); - } - - if (compression_type != PNG_COMPRESSION_TYPE_BASE) - { - png_warning(png_ptr, "Invalid compression type specified"); - compression_type = PNG_COMPRESSION_TYPE_BASE; - } - - /* Write filter_method 64 (intrapixel differencing) only if - * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and - * 2. Libpng did not write a PNG signature (this filter_method is only - * used in PNG datastreams that are embedded in MNG datastreams) and - * 3. The application called png_permit_mng_features with a mask that - * included PNG_FLAG_MNG_FILTER_64 and - * 4. The filter_method is 64 and - * 5. The color_type is RGB or RGBA - */ - if ( -#ifdef PNG_MNG_FEATURES_SUPPORTED - !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) && - ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) && - (color_type == PNG_COLOR_TYPE_RGB || - color_type == PNG_COLOR_TYPE_RGB_ALPHA) && - (filter_type == PNG_INTRAPIXEL_DIFFERENCING)) && -#endif - filter_type != PNG_FILTER_TYPE_BASE) - { - png_warning(png_ptr, "Invalid filter type specified"); - filter_type = PNG_FILTER_TYPE_BASE; - } - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - if (interlace_type != PNG_INTERLACE_NONE && - interlace_type != PNG_INTERLACE_ADAM7) - { - png_warning(png_ptr, "Invalid interlace type specified"); - interlace_type = PNG_INTERLACE_ADAM7; - } -#else - interlace_type=PNG_INTERLACE_NONE; -#endif - - /* Save the relevent information */ - png_ptr->bit_depth = (png_byte)bit_depth; - png_ptr->color_type = (png_byte)color_type; - png_ptr->interlaced = (png_byte)interlace_type; -#ifdef PNG_MNG_FEATURES_SUPPORTED - png_ptr->filter_type = (png_byte)filter_type; -#endif - png_ptr->compression_type = (png_byte)compression_type; - png_ptr->width = width; - png_ptr->height = height; - - png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels); - png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, width); - /* Set the usr info, so any transformations can modify it */ - png_ptr->usr_width = png_ptr->width; - png_ptr->usr_bit_depth = png_ptr->bit_depth; - png_ptr->usr_channels = png_ptr->channels; - - /* Pack the header information into the buffer */ - png_save_uint_32(buf, width); - png_save_uint_32(buf + 4, height); - buf[8] = (png_byte)bit_depth; - buf[9] = (png_byte)color_type; - buf[10] = (png_byte)compression_type; - buf[11] = (png_byte)filter_type; - buf[12] = (png_byte)interlace_type; - - /* Write the chunk */ - png_write_complete_chunk(png_ptr, png_IHDR, buf, (png_size_t)13); - - if (!(png_ptr->do_filter)) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE || - png_ptr->bit_depth < 8) - png_ptr->do_filter = PNG_FILTER_NONE; - - else - png_ptr->do_filter = PNG_ALL_FILTERS; - } - - png_ptr->mode = PNG_HAVE_IHDR; /* not READY_FOR_ZTXT */ -} - -/* Write the palette. We are careful not to trust png_color to be in the - * correct order for PNG, so people can redefine it to any convenient - * structure. - */ -void /* PRIVATE */ -png_write_PLTE(png_structrp png_ptr, png_const_colorp palette, - png_uint_32 num_pal) -{ - png_uint_32 i; - png_const_colorp pal_ptr; - png_byte buf[3]; - - png_debug(1, "in png_write_PLTE"); - - if (( -#ifdef PNG_MNG_FEATURES_SUPPORTED - !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) && -#endif - num_pal == 0) || num_pal > 256) - { - if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - { - png_error(png_ptr, "Invalid number of colors in palette"); - } - - else - { - png_warning(png_ptr, "Invalid number of colors in palette"); - return; - } - } - - if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR)) - { - png_warning(png_ptr, - "Ignoring request to write a PLTE chunk in grayscale PNG"); - - return; - } - - png_ptr->num_palette = (png_uint_16)num_pal; - png_debug1(3, "num_palette = %d", png_ptr->num_palette); - - png_write_chunk_header(png_ptr, png_PLTE, (png_uint_32)(num_pal * 3)); -#ifdef PNG_POINTER_INDEXING_SUPPORTED - - for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++) - { - buf[0] = pal_ptr->red; - buf[1] = pal_ptr->green; - buf[2] = pal_ptr->blue; - png_write_chunk_data(png_ptr, buf, (png_size_t)3); - } - -#else - /* This is a little slower but some buggy compilers need to do this - * instead - */ - pal_ptr=palette; - - for (i = 0; i < num_pal; i++) - { - buf[0] = pal_ptr[i].red; - buf[1] = pal_ptr[i].green; - buf[2] = pal_ptr[i].blue; - png_write_chunk_data(png_ptr, buf, (png_size_t)3); - } - -#endif - png_write_chunk_end(png_ptr); - png_ptr->mode |= PNG_HAVE_PLTE; -} - -/* This is similar to png_text_compress, above, except that it does not require - * all of the data at once and, instead of buffering the compressed result, - * writes it as IDAT chunks. Unlike png_text_compress it *can* png_error out - * because it calls the write interface. As a result it does its own error - * reporting and does not return an error code. In the event of error it will - * just call png_error. The input data length may exceed 32-bits. The 'flush' - * parameter is exactly the same as that to deflate, with the following - * meanings: - * - * Z_NO_FLUSH: normal incremental output of compressed data - * Z_SYNC_FLUSH: do a SYNC_FLUSH, used by png_write_flush - * Z_FINISH: this is the end of the input, do a Z_FINISH and clean up - * - * The routine manages the acquire and release of the png_ptr->zstream by - * checking and (at the end) clearing png_ptr->zowner, it does some sanity - * checks on the 'mode' flags while doing this. - */ -void /* PRIVATE */ -png_compress_IDAT(png_structrp png_ptr, png_const_bytep input, - png_alloc_size_t input_len, int flush) -{ - if (png_ptr->zowner != png_IDAT) - { - /* First time. Ensure we have a temporary buffer for compression and - * trim the buffer list if it has more than one entry to free memory. - * If 'WRITE_COMPRESSED_TEXT' is not set the list will never have been - * created at this point, but the check here is quick and safe. - */ - if (png_ptr->zbuffer_list == NULL) - { - png_ptr->zbuffer_list = png_voidcast(png_compression_bufferp, - png_malloc(png_ptr, PNG_COMPRESSION_BUFFER_SIZE(png_ptr))); - png_ptr->zbuffer_list->next = NULL; - } - - else - png_free_buffer_list(png_ptr, &png_ptr->zbuffer_list->next); - - /* It is a terminal error if we can't claim the zstream. */ - if (png_deflate_claim(png_ptr, png_IDAT, png_image_size(png_ptr)) != Z_OK) - png_error(png_ptr, png_ptr->zstream.msg); - - /* The output state is maintained in png_ptr->zstream, so it must be - * initialized here after the claim. - */ - png_ptr->zstream.next_out = png_ptr->zbuffer_list->output; - png_ptr->zstream.avail_out = png_ptr->zbuffer_size; - } - - /* Now loop reading and writing until all the input is consumed or an error - * terminates the operation. The _out values are maintained across calls to - * this function, but the input must be reset each time. - */ - png_ptr->zstream.next_in = PNGZ_INPUT_CAST(input); - png_ptr->zstream.avail_in = 0; /* set below */ - for (;;) - { - int ret; - - /* INPUT: from the row data */ - uInt avail = ZLIB_IO_MAX; - - if (avail > input_len) - avail = (uInt)input_len; /* safe because of the check */ - - png_ptr->zstream.avail_in = avail; - input_len -= avail; - - ret = deflate(&png_ptr->zstream, input_len > 0 ? Z_NO_FLUSH : flush); - - /* Include as-yet unconsumed input */ - input_len += png_ptr->zstream.avail_in; - png_ptr->zstream.avail_in = 0; - - /* OUTPUT: write complete IDAT chunks when avail_out drops to zero, note - * that these two zstream fields are preserved across the calls, therefore - * there is no need to set these up on entry to the loop. - */ - if (png_ptr->zstream.avail_out == 0) - { - png_bytep data = png_ptr->zbuffer_list->output; - uInt size = png_ptr->zbuffer_size; - - /* Write an IDAT containing the data then reset the buffer. The - * first IDAT may need deflate header optimization. - */ -# ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED - if (!(png_ptr->mode & PNG_HAVE_IDAT) && - png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE) - optimize_cmf(data, png_image_size(png_ptr)); -# endif - - png_write_complete_chunk(png_ptr, png_IDAT, data, size); - png_ptr->mode |= PNG_HAVE_IDAT; - - png_ptr->zstream.next_out = data; - png_ptr->zstream.avail_out = size; - - /* For SYNC_FLUSH or FINISH it is essential to keep calling zlib with - * the same flush parameter until it has finished output, for NO_FLUSH - * it doesn't matter. - */ - if (ret == Z_OK && flush != Z_NO_FLUSH) - continue; - } - - /* The order of these checks doesn't matter much; it just effect which - * possible error might be detected if multiple things go wrong at once. - */ - if (ret == Z_OK) /* most likely return code! */ - { - /* If all the input has been consumed then just return. If Z_FINISH - * was used as the flush parameter something has gone wrong if we get - * here. - */ - if (input_len == 0) - { - if (flush == Z_FINISH) - png_error(png_ptr, "Z_OK on Z_FINISH with output space"); - - return; - } - } - - else if (ret == Z_STREAM_END && flush == Z_FINISH) - { - /* This is the end of the IDAT data; any pending output must be - * flushed. For small PNG files we may still be at the beginning. - */ - png_bytep data = png_ptr->zbuffer_list->output; - uInt size = png_ptr->zbuffer_size - png_ptr->zstream.avail_out; - -# ifdef PNG_WRITE_OPTIMIZE_CMF_SUPPORTED - if (!(png_ptr->mode & PNG_HAVE_IDAT) && - png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE) - optimize_cmf(data, png_image_size(png_ptr)); -# endif - - png_write_complete_chunk(png_ptr, png_IDAT, data, size); - png_ptr->zstream.avail_out = 0; - png_ptr->zstream.next_out = NULL; - png_ptr->mode |= PNG_HAVE_IDAT | PNG_AFTER_IDAT; - - png_ptr->zowner = 0; /* Release the stream */ - return; - } - - else - { - /* This is an error condition. */ - png_zstream_error(png_ptr, ret); - png_error(png_ptr, png_ptr->zstream.msg); - } - } -} - -/* Write an IEND chunk */ -void /* PRIVATE */ -png_write_IEND(png_structrp png_ptr) -{ - png_debug(1, "in png_write_IEND"); - - png_write_complete_chunk(png_ptr, png_IEND, NULL, (png_size_t)0); - png_ptr->mode |= PNG_HAVE_IEND; -} - -#ifdef PNG_WRITE_gAMA_SUPPORTED -/* Write a gAMA chunk */ -void /* PRIVATE */ -png_write_gAMA_fixed(png_structrp png_ptr, png_fixed_point file_gamma) -{ - png_byte buf[4]; - - png_debug(1, "in png_write_gAMA"); - - /* file_gamma is saved in 1/100,000ths */ - png_save_uint_32(buf, (png_uint_32)file_gamma); - png_write_complete_chunk(png_ptr, png_gAMA, buf, (png_size_t)4); -} -#endif - -#ifdef PNG_WRITE_sRGB_SUPPORTED -/* Write a sRGB chunk */ -void /* PRIVATE */ -png_write_sRGB(png_structrp png_ptr, int srgb_intent) -{ - png_byte buf[1]; - - png_debug(1, "in png_write_sRGB"); - - if (srgb_intent >= PNG_sRGB_INTENT_LAST) - png_warning(png_ptr, - "Invalid sRGB rendering intent specified"); - - buf[0]=(png_byte)srgb_intent; - png_write_complete_chunk(png_ptr, png_sRGB, buf, (png_size_t)1); -} -#endif - -#ifdef PNG_WRITE_iCCP_SUPPORTED -/* Write an iCCP chunk */ -void /* PRIVATE */ -png_write_iCCP(png_structrp png_ptr, png_const_charp name, - png_const_bytep profile) -{ - png_uint_32 name_len; - png_uint_32 profile_len; - png_byte new_name[81]; /* 1 byte for the compression byte */ - compression_state comp; - - png_debug(1, "in png_write_iCCP"); - - /* These are all internal problems: the profile should have been checked - * before when it was stored. - */ - if (profile == NULL) - png_error(png_ptr, "No profile for iCCP chunk"); /* internal error */ - - profile_len = png_get_uint_32(profile); - - if (profile_len < 132) - png_error(png_ptr, "ICC profile too short"); - - if (profile_len & 0x03) - png_error(png_ptr, "ICC profile length invalid (not a multiple of 4)"); - - { - png_uint_32 embedded_profile_len = png_get_uint_32(profile); - - if (profile_len != embedded_profile_len) - png_error(png_ptr, "Profile length does not match profile"); - } - - name_len = png_check_keyword(png_ptr, name, new_name); - - if (name_len == 0) - png_error(png_ptr, "iCCP: invalid keyword"); - - new_name[++name_len] = PNG_COMPRESSION_TYPE_BASE; - - /* Make sure we include the NULL after the name and the compression type */ - ++name_len; - - png_text_compress_init(&comp, profile, profile_len); - - /* Allow for keyword terminator and compression byte */ - if (png_text_compress(png_ptr, png_iCCP, &comp, name_len) != Z_OK) - png_error(png_ptr, png_ptr->zstream.msg); - - png_write_chunk_header(png_ptr, png_iCCP, name_len + comp.output_len); - - png_write_chunk_data(png_ptr, new_name, name_len); - - png_write_compressed_data_out(png_ptr, &comp); - - png_write_chunk_end(png_ptr); -} -#endif - -#ifdef PNG_WRITE_sPLT_SUPPORTED -/* Write a sPLT chunk */ -void /* PRIVATE */ -png_write_sPLT(png_structrp png_ptr, png_const_sPLT_tp spalette) -{ - png_uint_32 name_len; - png_byte new_name[80]; - png_byte entrybuf[10]; - png_size_t entry_size = (spalette->depth == 8 ? 6 : 10); - png_size_t palette_size = entry_size * spalette->nentries; - png_sPLT_entryp ep; -#ifndef PNG_POINTER_INDEXING_SUPPORTED - int i; -#endif - - png_debug(1, "in png_write_sPLT"); - - name_len = png_check_keyword(png_ptr, spalette->name, new_name); - - if (name_len == 0) - png_error(png_ptr, "sPLT: invalid keyword"); - - /* Make sure we include the NULL after the name */ - png_write_chunk_header(png_ptr, png_sPLT, - (png_uint_32)(name_len + 2 + palette_size)); - - png_write_chunk_data(png_ptr, (png_bytep)new_name, - (png_size_t)(name_len + 1)); - - png_write_chunk_data(png_ptr, &spalette->depth, (png_size_t)1); - - /* Loop through each palette entry, writing appropriately */ -#ifdef PNG_POINTER_INDEXING_SUPPORTED - for (ep = spalette->entries; epentries + spalette->nentries; ep++) - { - if (spalette->depth == 8) - { - entrybuf[0] = (png_byte)ep->red; - entrybuf[1] = (png_byte)ep->green; - entrybuf[2] = (png_byte)ep->blue; - entrybuf[3] = (png_byte)ep->alpha; - png_save_uint_16(entrybuf + 4, ep->frequency); - } - - else - { - png_save_uint_16(entrybuf + 0, ep->red); - png_save_uint_16(entrybuf + 2, ep->green); - png_save_uint_16(entrybuf + 4, ep->blue); - png_save_uint_16(entrybuf + 6, ep->alpha); - png_save_uint_16(entrybuf + 8, ep->frequency); - } - - png_write_chunk_data(png_ptr, entrybuf, entry_size); - } -#else - ep=spalette->entries; - for (i = 0; i>spalette->nentries; i++) - { - if (spalette->depth == 8) - { - entrybuf[0] = (png_byte)ep[i].red; - entrybuf[1] = (png_byte)ep[i].green; - entrybuf[2] = (png_byte)ep[i].blue; - entrybuf[3] = (png_byte)ep[i].alpha; - png_save_uint_16(entrybuf + 4, ep[i].frequency); - } - - else - { - png_save_uint_16(entrybuf + 0, ep[i].red); - png_save_uint_16(entrybuf + 2, ep[i].green); - png_save_uint_16(entrybuf + 4, ep[i].blue); - png_save_uint_16(entrybuf + 6, ep[i].alpha); - png_save_uint_16(entrybuf + 8, ep[i].frequency); - } - - png_write_chunk_data(png_ptr, entrybuf, entry_size); - } -#endif - - png_write_chunk_end(png_ptr); -} -#endif - -#ifdef PNG_WRITE_sBIT_SUPPORTED -/* Write the sBIT chunk */ -void /* PRIVATE */ -png_write_sBIT(png_structrp png_ptr, png_const_color_8p sbit, int color_type) -{ - png_byte buf[4]; - png_size_t size; - - png_debug(1, "in png_write_sBIT"); - - /* Make sure we don't depend upon the order of PNG_COLOR_8 */ - if (color_type & PNG_COLOR_MASK_COLOR) - { - png_byte maxbits; - - maxbits = (png_byte)(color_type==PNG_COLOR_TYPE_PALETTE ? 8 : - png_ptr->usr_bit_depth); - - if (sbit->red == 0 || sbit->red > maxbits || - sbit->green == 0 || sbit->green > maxbits || - sbit->blue == 0 || sbit->blue > maxbits) - { - png_warning(png_ptr, "Invalid sBIT depth specified"); - return; - } - - buf[0] = sbit->red; - buf[1] = sbit->green; - buf[2] = sbit->blue; - size = 3; - } - - else - { - if (sbit->gray == 0 || sbit->gray > png_ptr->usr_bit_depth) - { - png_warning(png_ptr, "Invalid sBIT depth specified"); - return; - } - - buf[0] = sbit->gray; - size = 1; - } - - if (color_type & PNG_COLOR_MASK_ALPHA) - { - if (sbit->alpha == 0 || sbit->alpha > png_ptr->usr_bit_depth) - { - png_warning(png_ptr, "Invalid sBIT depth specified"); - return; - } - - buf[size++] = sbit->alpha; - } - - png_write_complete_chunk(png_ptr, png_sBIT, buf, size); -} -#endif - -#ifdef PNG_WRITE_cHRM_SUPPORTED -/* Write the cHRM chunk */ -void /* PRIVATE */ -png_write_cHRM_fixed(png_structrp png_ptr, const png_xy *xy) -{ - png_byte buf[32]; - - png_debug(1, "in png_write_cHRM"); - - /* Each value is saved in 1/100,000ths */ - png_save_int_32(buf, xy->whitex); - png_save_int_32(buf + 4, xy->whitey); - - png_save_int_32(buf + 8, xy->redx); - png_save_int_32(buf + 12, xy->redy); - - png_save_int_32(buf + 16, xy->greenx); - png_save_int_32(buf + 20, xy->greeny); - - png_save_int_32(buf + 24, xy->bluex); - png_save_int_32(buf + 28, xy->bluey); - - png_write_complete_chunk(png_ptr, png_cHRM, buf, 32); -} -#endif - -#ifdef PNG_WRITE_tRNS_SUPPORTED -/* Write the tRNS chunk */ -void /* PRIVATE */ -png_write_tRNS(png_structrp png_ptr, png_const_bytep trans_alpha, - png_const_color_16p tran, int num_trans, int color_type) -{ - png_byte buf[6]; - - png_debug(1, "in png_write_tRNS"); - - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette) - { - png_app_warning(png_ptr, - "Invalid number of transparent colors specified"); - return; - } - - /* Write the chunk out as it is */ - png_write_complete_chunk(png_ptr, png_tRNS, trans_alpha, - (png_size_t)num_trans); - } - - else if (color_type == PNG_COLOR_TYPE_GRAY) - { - /* One 16 bit value */ - if (tran->gray >= (1 << png_ptr->bit_depth)) - { - png_app_warning(png_ptr, - "Ignoring attempt to write tRNS chunk out-of-range for bit_depth"); - - return; - } - - png_save_uint_16(buf, tran->gray); - png_write_complete_chunk(png_ptr, png_tRNS, buf, (png_size_t)2); - } - - else if (color_type == PNG_COLOR_TYPE_RGB) - { - /* Three 16 bit values */ - png_save_uint_16(buf, tran->red); - png_save_uint_16(buf + 2, tran->green); - png_save_uint_16(buf + 4, tran->blue); -#ifdef PNG_WRITE_16BIT_SUPPORTED - if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) -#else - if (buf[0] | buf[2] | buf[4]) -#endif - { - png_app_warning(png_ptr, - "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8"); - return; - } - - png_write_complete_chunk(png_ptr, png_tRNS, buf, (png_size_t)6); - } - - else - { - png_app_warning(png_ptr, "Can't write tRNS with an alpha channel"); - } -} -#endif - -#ifdef PNG_WRITE_bKGD_SUPPORTED -/* Write the background chunk */ -void /* PRIVATE */ -png_write_bKGD(png_structrp png_ptr, png_const_color_16p back, int color_type) -{ - png_byte buf[6]; - - png_debug(1, "in png_write_bKGD"); - - if (color_type == PNG_COLOR_TYPE_PALETTE) - { - if ( -#ifdef PNG_MNG_FEATURES_SUPPORTED - (png_ptr->num_palette || - (!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) && -#endif - back->index >= png_ptr->num_palette) - { - png_warning(png_ptr, "Invalid background palette index"); - return; - } - - buf[0] = back->index; - png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)1); - } - - else if (color_type & PNG_COLOR_MASK_COLOR) - { - png_save_uint_16(buf, back->red); - png_save_uint_16(buf + 2, back->green); - png_save_uint_16(buf + 4, back->blue); -#ifdef PNG_WRITE_16BIT_SUPPORTED - if (png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4])) -#else - if (buf[0] | buf[2] | buf[4]) -#endif - { - png_warning(png_ptr, - "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8"); - - return; - } - - png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)6); - } - - else - { - if (back->gray >= (1 << png_ptr->bit_depth)) - { - png_warning(png_ptr, - "Ignoring attempt to write bKGD chunk out-of-range for bit_depth"); - - return; - } - - png_save_uint_16(buf, back->gray); - png_write_complete_chunk(png_ptr, png_bKGD, buf, (png_size_t)2); - } -} -#endif - -#ifdef PNG_WRITE_hIST_SUPPORTED -/* Write the histogram */ -void /* PRIVATE */ -png_write_hIST(png_structrp png_ptr, png_const_uint_16p hist, int num_hist) -{ - int i; - png_byte buf[3]; - - png_debug(1, "in png_write_hIST"); - - if (num_hist > (int)png_ptr->num_palette) - { - png_debug2(3, "num_hist = %d, num_palette = %d", num_hist, - png_ptr->num_palette); - - png_warning(png_ptr, "Invalid number of histogram entries specified"); - return; - } - - png_write_chunk_header(png_ptr, png_hIST, (png_uint_32)(num_hist * 2)); - - for (i = 0; i < num_hist; i++) - { - png_save_uint_16(buf, hist[i]); - png_write_chunk_data(png_ptr, buf, (png_size_t)2); - } - - png_write_chunk_end(png_ptr); -} -#endif - -#ifdef PNG_WRITE_tEXt_SUPPORTED -/* Write a tEXt chunk */ -void /* PRIVATE */ -png_write_tEXt(png_structrp png_ptr, png_const_charp key, png_const_charp text, - png_size_t text_len) -{ - png_uint_32 key_len; - png_byte new_key[80]; - - png_debug(1, "in png_write_tEXt"); - - key_len = png_check_keyword(png_ptr, key, new_key); - - if (key_len == 0) - png_error(png_ptr, "tEXt: invalid keyword"); - - if (text == NULL || *text == '\0') - text_len = 0; - - else - text_len = strlen(text); - - if (text_len > PNG_UINT_31_MAX - (key_len+1)) - png_error(png_ptr, "tEXt: text too long"); - - /* Make sure we include the 0 after the key */ - png_write_chunk_header(png_ptr, png_tEXt, - (png_uint_32)/*checked above*/(key_len + text_len + 1)); - /* - * We leave it to the application to meet PNG-1.0 requirements on the - * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of - * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them. - * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. - */ - png_write_chunk_data(png_ptr, new_key, key_len + 1); - - if (text_len) - png_write_chunk_data(png_ptr, (png_const_bytep)text, text_len); - - png_write_chunk_end(png_ptr); -} -#endif - -#ifdef PNG_WRITE_zTXt_SUPPORTED -/* Write a compressed text chunk */ -void /* PRIVATE */ -png_write_zTXt(png_structrp png_ptr, png_const_charp key, png_const_charp text, - png_size_t text_len, int compression) -{ - png_uint_32 key_len; - png_byte new_key[81]; - compression_state comp; - - png_debug(1, "in png_write_zTXt"); - PNG_UNUSED(text_len) /* Always use strlen */ - - if (compression == PNG_TEXT_COMPRESSION_NONE) - { - png_write_tEXt(png_ptr, key, text, 0); - return; - } - - if (compression != PNG_TEXT_COMPRESSION_zTXt) - png_error(png_ptr, "zTXt: invalid compression type"); - - key_len = png_check_keyword(png_ptr, key, new_key); - - if (key_len == 0) - png_error(png_ptr, "zTXt: invalid keyword"); - - /* Add the compression method and 1 for the keyword separator. */ - new_key[++key_len] = PNG_COMPRESSION_TYPE_BASE; - ++key_len; - - /* Compute the compressed data; do it now for the length */ - png_text_compress_init(&comp, (png_const_bytep)text, - text == NULL ? 0 : strlen(text)); - - if (png_text_compress(png_ptr, png_zTXt, &comp, key_len) != Z_OK) - png_error(png_ptr, png_ptr->zstream.msg); - - /* Write start of chunk */ - png_write_chunk_header(png_ptr, png_zTXt, key_len + comp.output_len); - - /* Write key */ - png_write_chunk_data(png_ptr, new_key, key_len); - - /* Write the compressed data */ - png_write_compressed_data_out(png_ptr, &comp); - - /* Close the chunk */ - png_write_chunk_end(png_ptr); -} -#endif - -#ifdef PNG_WRITE_iTXt_SUPPORTED -/* Write an iTXt chunk */ -void /* PRIVATE */ -png_write_iTXt(png_structrp png_ptr, int compression, png_const_charp key, - png_const_charp lang, png_const_charp lang_key, png_const_charp text) -{ - png_uint_32 key_len, prefix_len; - png_size_t lang_len, lang_key_len; - png_byte new_key[82]; - compression_state comp; - - png_debug(1, "in png_write_iTXt"); - - key_len = png_check_keyword(png_ptr, key, new_key); - - if (key_len == 0) - png_error(png_ptr, "iTXt: invalid keyword"); - - /* Set the compression flag */ - switch (compression) - { - case PNG_ITXT_COMPRESSION_NONE: - case PNG_TEXT_COMPRESSION_NONE: - compression = new_key[++key_len] = 0; /* no compression */ - break; - - case PNG_TEXT_COMPRESSION_zTXt: - case PNG_ITXT_COMPRESSION_zTXt: - compression = new_key[++key_len] = 1; /* compressed */ - break; - - default: - png_error(png_ptr, "iTXt: invalid compression"); - } - - new_key[++key_len] = PNG_COMPRESSION_TYPE_BASE; - ++key_len; /* for the keywod separator */ - - /* We leave it to the application to meet PNG-1.0 requirements on the - * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of - * any non-Latin-1 characters except for NEWLINE. ISO PNG, however, - * specifies that the text is UTF-8 and this really doesn't require any - * checking. - * - * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG. - * - * TODO: validate the language tag correctly (see the spec.) - */ - if (lang == NULL) lang = ""; /* empty language is valid */ - lang_len = strlen(lang)+1; - if (lang_key == NULL) lang_key = ""; /* may be empty */ - lang_key_len = strlen(lang_key)+1; - if (text == NULL) text = ""; /* may be empty */ - - prefix_len = key_len; - if (lang_len > PNG_UINT_31_MAX-prefix_len) - prefix_len = PNG_UINT_31_MAX; - else - prefix_len = (png_uint_32)(prefix_len + lang_len); - - if (lang_key_len > PNG_UINT_31_MAX-prefix_len) - prefix_len = PNG_UINT_31_MAX; - else - prefix_len = (png_uint_32)(prefix_len + lang_key_len); - - png_text_compress_init(&comp, (png_const_bytep)text, strlen(text)); - - if (compression) - { - if (png_text_compress(png_ptr, png_iTXt, &comp, prefix_len) != Z_OK) - png_error(png_ptr, png_ptr->zstream.msg); - } - - else - { - if (comp.input_len > PNG_UINT_31_MAX-prefix_len) - png_error(png_ptr, "iTXt: uncompressed text too long"); - } - - png_write_chunk_header(png_ptr, png_iTXt, comp.output_len + prefix_len); - - png_write_chunk_data(png_ptr, new_key, key_len); - - png_write_chunk_data(png_ptr, (png_const_bytep)lang, lang_len); - - png_write_chunk_data(png_ptr, (png_const_bytep)lang_key, lang_key_len); - - if (compression) - png_write_compressed_data_out(png_ptr, &comp); - - else - png_write_chunk_data(png_ptr, (png_const_bytep)text, comp.input_len); - - png_write_chunk_end(png_ptr); -} -#endif - -#ifdef PNG_WRITE_oFFs_SUPPORTED -/* Write the oFFs chunk */ -void /* PRIVATE */ -png_write_oFFs(png_structrp png_ptr, png_int_32 x_offset, png_int_32 y_offset, - int unit_type) -{ - png_byte buf[9]; - - png_debug(1, "in png_write_oFFs"); - - if (unit_type >= PNG_OFFSET_LAST) - png_warning(png_ptr, "Unrecognized unit type for oFFs chunk"); - - png_save_int_32(buf, x_offset); - png_save_int_32(buf + 4, y_offset); - buf[8] = (png_byte)unit_type; - - png_write_complete_chunk(png_ptr, png_oFFs, buf, (png_size_t)9); -} -#endif -#ifdef PNG_WRITE_pCAL_SUPPORTED -/* Write the pCAL chunk (described in the PNG extensions document) */ -void /* PRIVATE */ -png_write_pCAL(png_structrp png_ptr, png_charp purpose, png_int_32 X0, - png_int_32 X1, int type, int nparams, png_const_charp units, - png_charpp params) -{ - png_uint_32 purpose_len; - png_size_t units_len, total_len; - png_size_tp params_len; - png_byte buf[10]; - png_byte new_purpose[80]; - int i; - - png_debug1(1, "in png_write_pCAL (%d parameters)", nparams); - - if (type >= PNG_EQUATION_LAST) - png_error(png_ptr, "Unrecognized equation type for pCAL chunk"); - - purpose_len = png_check_keyword(png_ptr, purpose, new_purpose); - - if (purpose_len == 0) - png_error(png_ptr, "pCAL: invalid keyword"); - - ++purpose_len; /* terminator */ - - png_debug1(3, "pCAL purpose length = %d", (int)purpose_len); - units_len = strlen(units) + (nparams == 0 ? 0 : 1); - png_debug1(3, "pCAL units length = %d", (int)units_len); - total_len = purpose_len + units_len + 10; - - params_len = (png_size_tp)png_malloc(png_ptr, - (png_alloc_size_t)(nparams * (sizeof (png_size_t)))); - - /* Find the length of each parameter, making sure we don't count the - * null terminator for the last parameter. - */ - for (i = 0; i < nparams; i++) - { - params_len[i] = strlen(params[i]) + (i == nparams - 1 ? 0 : 1); - png_debug2(3, "pCAL parameter %d length = %lu", i, - (unsigned long)params_len[i]); - total_len += params_len[i]; - } - - png_debug1(3, "pCAL total length = %d", (int)total_len); - png_write_chunk_header(png_ptr, png_pCAL, (png_uint_32)total_len); - png_write_chunk_data(png_ptr, new_purpose, purpose_len); - png_save_int_32(buf, X0); - png_save_int_32(buf + 4, X1); - buf[8] = (png_byte)type; - buf[9] = (png_byte)nparams; - png_write_chunk_data(png_ptr, buf, (png_size_t)10); - png_write_chunk_data(png_ptr, (png_const_bytep)units, (png_size_t)units_len); - - for (i = 0; i < nparams; i++) - { - png_write_chunk_data(png_ptr, (png_const_bytep)params[i], params_len[i]); - } - - png_free(png_ptr, params_len); - png_write_chunk_end(png_ptr); -} -#endif - -#ifdef PNG_WRITE_sCAL_SUPPORTED -/* Write the sCAL chunk */ -void /* PRIVATE */ -png_write_sCAL_s(png_structrp png_ptr, int unit, png_const_charp width, - png_const_charp height) -{ - png_byte buf[64]; - png_size_t wlen, hlen, total_len; - - png_debug(1, "in png_write_sCAL_s"); - - wlen = strlen(width); - hlen = strlen(height); - total_len = wlen + hlen + 2; - - if (total_len > 64) - { - png_warning(png_ptr, "Can't write sCAL (buffer too small)"); - return; - } - - buf[0] = (png_byte)unit; - memcpy(buf + 1, width, wlen + 1); /* Append the '\0' here */ - memcpy(buf + wlen + 2, height, hlen); /* Do NOT append the '\0' here */ - - png_debug1(3, "sCAL total length = %u", (unsigned int)total_len); - png_write_complete_chunk(png_ptr, png_sCAL, buf, total_len); -} -#endif - -#ifdef PNG_WRITE_pHYs_SUPPORTED -/* Write the pHYs chunk */ -void /* PRIVATE */ -png_write_pHYs(png_structrp png_ptr, png_uint_32 x_pixels_per_unit, - png_uint_32 y_pixels_per_unit, - int unit_type) -{ - png_byte buf[9]; - - png_debug(1, "in png_write_pHYs"); - - if (unit_type >= PNG_RESOLUTION_LAST) - png_warning(png_ptr, "Unrecognized unit type for pHYs chunk"); - - png_save_uint_32(buf, x_pixels_per_unit); - png_save_uint_32(buf + 4, y_pixels_per_unit); - buf[8] = (png_byte)unit_type; - - png_write_complete_chunk(png_ptr, png_pHYs, buf, (png_size_t)9); -} -#endif - -#ifdef PNG_WRITE_tIME_SUPPORTED -/* Write the tIME chunk. Use either png_convert_from_struct_tm() - * or png_convert_from_time_t(), or fill in the structure yourself. - */ -void /* PRIVATE */ -png_write_tIME(png_structrp png_ptr, png_const_timep mod_time) -{ - png_byte buf[7]; - - png_debug(1, "in png_write_tIME"); - - if (mod_time->month > 12 || mod_time->month < 1 || - mod_time->day > 31 || mod_time->day < 1 || - mod_time->hour > 23 || mod_time->second > 60) - { - png_warning(png_ptr, "Invalid time specified for tIME chunk"); - return; - } - - png_save_uint_16(buf, mod_time->year); - buf[2] = mod_time->month; - buf[3] = mod_time->day; - buf[4] = mod_time->hour; - buf[5] = mod_time->minute; - buf[6] = mod_time->second; - - png_write_complete_chunk(png_ptr, png_tIME, buf, (png_size_t)7); -} -#endif - -/* Initializes the row writing capability of libpng */ -void /* PRIVATE */ -png_write_start_row(png_structrp png_ptr) -{ -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* Start of interlace block */ - static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* Offset to next interlace block */ - static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* Start of interlace block in the y direction */ - static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* Offset to next interlace block in the y direction */ - static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif - - png_alloc_size_t buf_size; - int usr_pixel_depth; - - png_debug(1, "in png_write_start_row"); - - usr_pixel_depth = png_ptr->usr_channels * png_ptr->usr_bit_depth; - buf_size = PNG_ROWBYTES(usr_pixel_depth, png_ptr->width) + 1; - - /* 1.5.6: added to allow checking in the row write code. */ - png_ptr->transformed_pixel_depth = png_ptr->pixel_depth; - png_ptr->maximum_pixel_depth = (png_byte)usr_pixel_depth; - - /* Set up row buffer */ - png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, buf_size); - - png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE; - -#ifdef PNG_WRITE_FILTER_SUPPORTED - /* Set up filtering buffer, if using this filter */ - if (png_ptr->do_filter & PNG_FILTER_SUB) - { - png_ptr->sub_row = (png_bytep)png_malloc(png_ptr, png_ptr->rowbytes + 1); - - png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB; - } - - /* We only need to keep the previous row if we are using one of these. */ - if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH)) - { - /* Set up previous row buffer */ - png_ptr->prev_row = (png_bytep)png_calloc(png_ptr, buf_size); - - if (png_ptr->do_filter & PNG_FILTER_UP) - { - png_ptr->up_row = (png_bytep)png_malloc(png_ptr, - png_ptr->rowbytes + 1); - - png_ptr->up_row[0] = PNG_FILTER_VALUE_UP; - } - - if (png_ptr->do_filter & PNG_FILTER_AVG) - { - png_ptr->avg_row = (png_bytep)png_malloc(png_ptr, - png_ptr->rowbytes + 1); - - png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG; - } - - if (png_ptr->do_filter & PNG_FILTER_PAETH) - { - png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr, - png_ptr->rowbytes + 1); - - png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH; - } - } -#endif /* PNG_WRITE_FILTER_SUPPORTED */ - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - /* If interlaced, we need to set up width and height of pass */ - if (png_ptr->interlaced) - { - if (!(png_ptr->transformations & PNG_INTERLACE)) - { - png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 - - png_pass_ystart[0]) / png_pass_yinc[0]; - - png_ptr->usr_width = (png_ptr->width + png_pass_inc[0] - 1 - - png_pass_start[0]) / png_pass_inc[0]; - } - - else - { - png_ptr->num_rows = png_ptr->height; - png_ptr->usr_width = png_ptr->width; - } - } - - else -#endif - { - png_ptr->num_rows = png_ptr->height; - png_ptr->usr_width = png_ptr->width; - } -} - -/* Internal use only. Called when finished processing a row of data. */ -void /* PRIVATE */ -png_write_finish_row(png_structrp png_ptr) -{ -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* Start of interlace block */ - static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* Offset to next interlace block */ - static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - /* Start of interlace block in the y direction */ - static PNG_CONST png_byte png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1}; - - /* Offset to next interlace block in the y direction */ - static PNG_CONST png_byte png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2}; -#endif - - png_debug(1, "in png_write_finish_row"); - - /* Next row */ - png_ptr->row_number++; - - /* See if we are done */ - if (png_ptr->row_number < png_ptr->num_rows) - return; - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED - /* If interlaced, go to next pass */ - if (png_ptr->interlaced) - { - png_ptr->row_number = 0; - if (png_ptr->transformations & PNG_INTERLACE) - { - png_ptr->pass++; - } - - else - { - /* Loop until we find a non-zero width or height pass */ - do - { - png_ptr->pass++; - - if (png_ptr->pass >= 7) - break; - - png_ptr->usr_width = (png_ptr->width + - png_pass_inc[png_ptr->pass] - 1 - - png_pass_start[png_ptr->pass]) / - png_pass_inc[png_ptr->pass]; - - png_ptr->num_rows = (png_ptr->height + - png_pass_yinc[png_ptr->pass] - 1 - - png_pass_ystart[png_ptr->pass]) / - png_pass_yinc[png_ptr->pass]; - - if (png_ptr->transformations & PNG_INTERLACE) - break; - - } while (png_ptr->usr_width == 0 || png_ptr->num_rows == 0); - - } - - /* Reset the row above the image for the next pass */ - if (png_ptr->pass < 7) - { - if (png_ptr->prev_row != NULL) - memset(png_ptr->prev_row, 0, - (png_size_t)(PNG_ROWBYTES(png_ptr->usr_channels* - png_ptr->usr_bit_depth, png_ptr->width)) + 1); - - return; - } - } -#endif - - /* If we get here, we've just written the last row, so we need - to flush the compressor */ - png_compress_IDAT(png_ptr, NULL, 0, Z_FINISH); -} - -#ifdef PNG_WRITE_INTERLACING_SUPPORTED -/* Pick out the correct pixels for the interlace pass. - * The basic idea here is to go through the row with a source - * pointer and a destination pointer (sp and dp), and copy the - * correct pixels for the pass. As the row gets compacted, - * sp will always be >= dp, so we should never overwrite anything. - * See the default: case for the easiest code to understand. - */ -void /* PRIVATE */ -png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass) -{ - /* Arrays to facilitate easy interlacing - use pass (0 - 6) as index */ - - /* Start of interlace block */ - static PNG_CONST png_byte png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0}; - - /* Offset to next interlace block */ - static PNG_CONST png_byte png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1}; - - png_debug(1, "in png_do_write_interlace"); - - /* We don't have to do anything on the last pass (6) */ - if (pass < 6) - { - /* Each pixel depth is handled separately */ - switch (row_info->pixel_depth) - { - case 1: - { - png_bytep sp; - png_bytep dp; - int shift; - int d; - int value; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - dp = row; - d = 0; - shift = 7; - - for (i = png_pass_start[pass]; i < row_width; - i += png_pass_inc[pass]) - { - sp = row + (png_size_t)(i >> 3); - value = (int)(*sp >> (7 - (int)(i & 0x07))) & 0x01; - d |= (value << shift); - - if (shift == 0) - { - shift = 7; - *dp++ = (png_byte)d; - d = 0; - } - - else - shift--; - - } - if (shift != 7) - *dp = (png_byte)d; - - break; - } - - case 2: - { - png_bytep sp; - png_bytep dp; - int shift; - int d; - int value; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - dp = row; - shift = 6; - d = 0; - - for (i = png_pass_start[pass]; i < row_width; - i += png_pass_inc[pass]) - { - sp = row + (png_size_t)(i >> 2); - value = (*sp >> ((3 - (int)(i & 0x03)) << 1)) & 0x03; - d |= (value << shift); - - if (shift == 0) - { - shift = 6; - *dp++ = (png_byte)d; - d = 0; - } - - else - shift -= 2; - } - if (shift != 6) - *dp = (png_byte)d; - - break; - } - - case 4: - { - png_bytep sp; - png_bytep dp; - int shift; - int d; - int value; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - - dp = row; - shift = 4; - d = 0; - for (i = png_pass_start[pass]; i < row_width; - i += png_pass_inc[pass]) - { - sp = row + (png_size_t)(i >> 1); - value = (*sp >> ((1 - (int)(i & 0x01)) << 2)) & 0x0f; - d |= (value << shift); - - if (shift == 0) - { - shift = 4; - *dp++ = (png_byte)d; - d = 0; - } - - else - shift -= 4; - } - if (shift != 4) - *dp = (png_byte)d; - - break; - } - - default: - { - png_bytep sp; - png_bytep dp; - png_uint_32 i; - png_uint_32 row_width = row_info->width; - png_size_t pixel_bytes; - - /* Start at the beginning */ - dp = row; - - /* Find out how many bytes each pixel takes up */ - pixel_bytes = (row_info->pixel_depth >> 3); - - /* Loop through the row, only looking at the pixels that matter */ - for (i = png_pass_start[pass]; i < row_width; - i += png_pass_inc[pass]) - { - /* Find out where the original pixel is */ - sp = row + (png_size_t)i * pixel_bytes; - - /* Move the pixel */ - if (dp != sp) - memcpy(dp, sp, pixel_bytes); - - /* Next pixel */ - dp += pixel_bytes; - } - break; - } - } - /* Set new row width */ - row_info->width = (row_info->width + - png_pass_inc[pass] - 1 - - png_pass_start[pass]) / - png_pass_inc[pass]; - - row_info->rowbytes = PNG_ROWBYTES(row_info->pixel_depth, - row_info->width); - } -} -#endif - -/* This filters the row, chooses which filter to use, if it has not already - * been specified by the application, and then writes the row out with the - * chosen filter. - */ -static void png_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row, - png_size_t row_bytes); - -#define PNG_MAXSUM (((png_uint_32)(-1)) >> 1) -#define PNG_HISHIFT 10 -#define PNG_LOMASK ((png_uint_32)0xffffL) -#define PNG_HIMASK ((png_uint_32)(~PNG_LOMASK >> PNG_HISHIFT)) -void /* PRIVATE */ -png_write_find_filter(png_structrp png_ptr, png_row_infop row_info) -{ - png_bytep best_row; -#ifdef PNG_WRITE_FILTER_SUPPORTED - png_bytep prev_row, row_buf; - png_uint_32 mins, bpp; - png_byte filter_to_do = png_ptr->do_filter; - png_size_t row_bytes = row_info->rowbytes; -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - int num_p_filters = png_ptr->num_prev_filters; -#endif - - png_debug(1, "in png_write_find_filter"); - -#ifndef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->row_number == 0 && filter_to_do == PNG_ALL_FILTERS) - { - /* These will never be selected so we need not test them. */ - filter_to_do &= ~(PNG_FILTER_UP | PNG_FILTER_PAETH); - } -#endif - - /* Find out how many bytes offset each pixel is */ - bpp = (row_info->pixel_depth + 7) >> 3; - - prev_row = png_ptr->prev_row; -#endif - best_row = png_ptr->row_buf; -#ifdef PNG_WRITE_FILTER_SUPPORTED - row_buf = best_row; - mins = PNG_MAXSUM; - - /* The prediction method we use is to find which method provides the - * smallest value when summing the absolute values of the distances - * from zero, using anything >= 128 as negative numbers. This is known - * as the "minimum sum of absolute differences" heuristic. Other - * heuristics are the "weighted minimum sum of absolute differences" - * (experimental and can in theory improve compression), and the "zlib - * predictive" method (not implemented yet), which does test compressions - * of lines using different filter methods, and then chooses the - * (series of) filter(s) that give minimum compressed data size (VERY - * computationally expensive). - * - * GRR 980525: consider also - * - * (1) minimum sum of absolute differences from running average (i.e., - * keep running sum of non-absolute differences & count of bytes) - * [track dispersion, too? restart average if dispersion too large?] - * - * (1b) minimum sum of absolute differences from sliding average, probably - * with window size <= deflate window (usually 32K) - * - * (2) minimum sum of squared differences from zero or running average - * (i.e., ~ root-mean-square approach) - */ - - - /* We don't need to test the 'no filter' case if this is the only filter - * that has been chosen, as it doesn't actually do anything to the data. - */ - if ((filter_to_do & PNG_FILTER_NONE) && filter_to_do != PNG_FILTER_NONE) - { - png_bytep rp; - png_uint_32 sum = 0; - png_size_t i; - int v; - - for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++) - { - v = *rp; - sum += (v < 128) ? v : 256 - v; - } - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - png_uint_32 sumhi, sumlo; - int j; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */ - - /* Reduce the sum if we match any of the previous rows */ - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - /* Factor in the cost of this filter (this is here for completeness, - * but it makes no sense to have a "cost" for the NONE filter, as - * it has the minimum possible computational cost - none). - */ - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> - PNG_COST_SHIFT; - - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - mins = sum; - } - - /* Sub filter */ - if (filter_to_do == PNG_FILTER_SUB) - /* It's the only filter so no testing is needed */ - { - png_bytep rp, lp, dp; - png_size_t i; - - for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; - i++, rp++, dp++) - { - *dp = *rp; - } - - for (lp = row_buf + 1; i < row_bytes; - i++, rp++, lp++, dp++) - { - *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); - } - - best_row = png_ptr->sub_row; - } - - else if (filter_to_do & PNG_FILTER_SUB) - { - png_bytep rp, dp, lp; - png_uint_32 sum = 0, lmins = mins; - png_size_t i; - int v; - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - /* We temporarily increase the "minimum sum" by the factor we - * would reduce the sum of this filter, so that we can do the - * early exit comparison without scaling the sum each time. - */ - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - - for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp; - i++, rp++, dp++) - { - v = *dp = *rp; - - sum += (v < 128) ? v : 256 - v; - } - - for (lp = row_buf + 1; i < row_bytes; - i++, rp++, lp++, dp++) - { - v = *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff); - - sum += (v < 128) ? v : 256 - v; - - if (sum > lmins) /* We are already worse, don't continue. */ - break; - } - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB) - { - sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - - sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - - if (sum < mins) - { - mins = sum; - best_row = png_ptr->sub_row; - } - } - - /* Up filter */ - if (filter_to_do == PNG_FILTER_UP) - { - png_bytep rp, dp, pp; - png_size_t i; - - for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, - pp = prev_row + 1; i < row_bytes; - i++, rp++, pp++, dp++) - { - *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff); - } - - best_row = png_ptr->up_row; - } - - else if (filter_to_do & PNG_FILTER_UP) - { - png_bytep rp, dp, pp; - png_uint_32 sum = 0, lmins = mins; - png_size_t i; - int v; - - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - - for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1, - pp = prev_row + 1; i < row_bytes; i++) - { - v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); - - sum += (v < 128) ? v : 256 - v; - - if (sum > lmins) /* We are already worse, don't continue. */ - break; - } - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - - if (sum < mins) - { - mins = sum; - best_row = png_ptr->up_row; - } - } - - /* Avg filter */ - if (filter_to_do == PNG_FILTER_AVG) - { - png_bytep rp, dp, pp, lp; - png_uint_32 i; - - for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, - pp = prev_row + 1; i < bpp; i++) - { - *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); - } - - for (lp = row_buf + 1; i < row_bytes; i++) - { - *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) - & 0xff); - } - best_row = png_ptr->avg_row; - } - - else if (filter_to_do & PNG_FILTER_AVG) - { - png_bytep rp, dp, pp, lp; - png_uint_32 sum = 0, lmins = mins; - png_size_t i; - int v; - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - - for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1, - pp = prev_row + 1; i < bpp; i++) - { - v = *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff); - - sum += (v < 128) ? v : 256 - v; - } - - for (lp = row_buf + 1; i < row_bytes; i++) - { - v = *dp++ = - (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff); - - sum += (v < 128) ? v : 256 - v; - - if (sum > lmins) /* We are already worse, don't continue. */ - break; - } - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - - if (sum < mins) - { - mins = sum; - best_row = png_ptr->avg_row; - } - } - - /* Paeth filter */ - if (filter_to_do == PNG_FILTER_PAETH) - { - png_bytep rp, dp, pp, cp, lp; - png_size_t i; - - for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, - pp = prev_row + 1; i < bpp; i++) - { - *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); - } - - for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) - { - int a, b, c, pa, pb, pc, p; - - b = *pp++; - c = *cp++; - a = *lp++; - - p = b - c; - pc = a - c; - -#ifdef PNG_USE_ABS - pa = abs(p); - pb = abs(pc); - pc = abs(p + pc); -#else - pa = p < 0 ? -p : p; - pb = pc < 0 ? -pc : pc; - pc = (p + pc) < 0 ? -(p + pc) : p + pc; -#endif - - p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; - - *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); - } - best_row = png_ptr->paeth_row; - } - - else if (filter_to_do & PNG_FILTER_PAETH) - { - png_bytep rp, dp, pp, cp, lp; - png_uint_32 sum = 0, lmins = mins; - png_size_t i; - int v; - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 lmhi, lmlo; - lmlo = lmins & PNG_LOMASK; - lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) - { - lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - - lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - - if (lmhi > PNG_HIMASK) - lmins = PNG_MAXSUM; - - else - lmins = (lmhi << PNG_HISHIFT) + lmlo; - } -#endif - - for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1, - pp = prev_row + 1; i < bpp; i++) - { - v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff); - - sum += (v < 128) ? v : 256 - v; - } - - for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++) - { - int a, b, c, pa, pb, pc, p; - - b = *pp++; - c = *cp++; - a = *lp++; - -#ifndef PNG_SLOW_PAETH - p = b - c; - pc = a - c; -#ifdef PNG_USE_ABS - pa = abs(p); - pb = abs(pc); - pc = abs(p + pc); -#else - pa = p < 0 ? -p : p; - pb = pc < 0 ? -pc : pc; - pc = (p + pc) < 0 ? -(p + pc) : p + pc; -#endif - p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c; -#else /* PNG_SLOW_PAETH */ - p = a + b - c; - pa = abs(p - a); - pb = abs(p - b); - pc = abs(p - c); - - if (pa <= pb && pa <= pc) - p = a; - - else if (pb <= pc) - p = b; - - else - p = c; -#endif /* PNG_SLOW_PAETH */ - - v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff); - - sum += (v < 128) ? v : 256 - v; - - if (sum > lmins) /* We are already worse, don't continue. */ - break; - } - -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED) - { - int j; - png_uint_32 sumhi, sumlo; - sumlo = sum & PNG_LOMASK; - sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; - - for (j = 0; j < num_p_filters; j++) - { - if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH) - { - sumlo = (sumlo * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - - sumhi = (sumhi * png_ptr->filter_weights[j]) >> - PNG_WEIGHT_SHIFT; - } - } - - sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - - sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >> - PNG_COST_SHIFT; - - if (sumhi > PNG_HIMASK) - sum = PNG_MAXSUM; - - else - sum = (sumhi << PNG_HISHIFT) + sumlo; - } -#endif - - if (sum < mins) - { - best_row = png_ptr->paeth_row; - } - } -#endif /* PNG_WRITE_FILTER_SUPPORTED */ - - /* Do the actual writing of the filtered row data from the chosen filter. */ - png_write_filtered_row(png_ptr, best_row, row_info->rowbytes+1); - -#ifdef PNG_WRITE_FILTER_SUPPORTED -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED - /* Save the type of filter we picked this time for future calculations */ - if (png_ptr->num_prev_filters > 0) - { - int j; - - for (j = 1; j < num_p_filters; j++) - { - png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1]; - } - - png_ptr->prev_filters[j] = best_row[0]; - } -#endif -#endif /* PNG_WRITE_FILTER_SUPPORTED */ -} - - -/* Do the actual writing of a previously filtered row. */ -static void -png_write_filtered_row(png_structrp png_ptr, png_bytep filtered_row, - png_size_t full_row_length/*includes filter byte*/) -{ - png_debug(1, "in png_write_filtered_row"); - - png_debug1(2, "filter = %d", filtered_row[0]); - - png_compress_IDAT(png_ptr, filtered_row, full_row_length, Z_NO_FLUSH); - - /* Swap the current and previous rows */ - if (png_ptr->prev_row != NULL) - { - png_bytep tptr; - - tptr = png_ptr->prev_row; - png_ptr->prev_row = png_ptr->row_buf; - png_ptr->row_buf = tptr; - } - - /* Finish row - updates counters and flushes zlib if last row */ - png_write_finish_row(png_ptr); - -#ifdef PNG_WRITE_FLUSH_SUPPORTED - png_ptr->flush_rows++; - - if (png_ptr->flush_dist > 0 && - png_ptr->flush_rows >= png_ptr->flush_dist) - { - png_write_flush(png_ptr); - } -#endif -} -#endif /* PNG_WRITE_SUPPORTED */ diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp b/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp deleted file mode 100755 index e7be9a3..0000000 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_Image.cpp +++ /dev/null @@ -1,659 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ImagePixelData::ImagePixelData (const Image::PixelFormat format, const int w, const int h) - : pixelFormat (format), width (w), height (h) -{ - jassert (format == Image::RGB || format == Image::ARGB || format == Image::SingleChannel); - jassert (w > 0 && h > 0); // It's illegal to create a zero-sized image! -} - -ImagePixelData::~ImagePixelData() -{ - listeners.call (&Listener::imageDataBeingDeleted, this); -} - -void ImagePixelData::sendDataChangeMessage() -{ - listeners.call (&Listener::imageDataChanged, this); -} - -//============================================================================== -ImageType::ImageType() {} -ImageType::~ImageType() {} - -Image ImageType::convert (const Image& source) const -{ - if (source.isNull() || getTypeID() == (ScopedPointer (source.getPixelData()->createType())->getTypeID())) - return source; - - const Image::BitmapData src (source, Image::BitmapData::readOnly); - - Image newImage (create (src.pixelFormat, src.width, src.height, false)); - Image::BitmapData dest (newImage, Image::BitmapData::writeOnly); - - jassert (src.pixelStride == dest.pixelStride && src.pixelFormat == dest.pixelFormat); - - for (int y = 0; y < dest.height; ++y) - memcpy (dest.getLinePointer (y), src.getLinePointer (y), (size_t) dest.lineStride); - - return newImage; -} - -//============================================================================== -class SoftwarePixelData : public ImagePixelData -{ -public: - SoftwarePixelData (const Image::PixelFormat format_, const int w, const int h, const bool clearImage) - : ImagePixelData (format_, w, h), - pixelStride (format_ == Image::RGB ? 3 : ((format_ == Image::ARGB) ? 4 : 1)), - lineStride ((pixelStride * jmax (1, w) + 3) & ~3) - { - imageData.allocate ((size_t) (lineStride * jmax (1, h)), clearImage); - } - - LowLevelGraphicsContext* createLowLevelContext() override - { - sendDataChangeMessage(); - return new LowLevelGraphicsSoftwareRenderer (Image (this)); - } - - void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override - { - bitmap.data = imageData + x * pixelStride + y * lineStride; - bitmap.pixelFormat = pixelFormat; - bitmap.lineStride = lineStride; - bitmap.pixelStride = pixelStride; - - if (mode != Image::BitmapData::readOnly) - sendDataChangeMessage(); - } - - ImagePixelData* clone() override - { - SoftwarePixelData* s = new SoftwarePixelData (pixelFormat, width, height, false); - memcpy (s->imageData, imageData, (size_t) (lineStride * height)); - return s; - } - - ImageType* createType() const override { return new SoftwareImageType(); } - -private: - HeapBlock imageData; - const int pixelStride, lineStride; - - JUCE_LEAK_DETECTOR (SoftwarePixelData) -}; - -SoftwareImageType::SoftwareImageType() {} -SoftwareImageType::~SoftwareImageType() {} - -ImagePixelData::Ptr SoftwareImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const -{ - return new SoftwarePixelData (format, width, height, clearImage); -} - -int SoftwareImageType::getTypeID() const -{ - return 2; -} - -//============================================================================== -NativeImageType::NativeImageType() {} -NativeImageType::~NativeImageType() {} - -int NativeImageType::getTypeID() const -{ - return 1; -} - -#if JUCE_WINDOWS || JUCE_LINUX -ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const -{ - return new SoftwarePixelData (format, width, height, clearImage); -} -#endif - -//============================================================================== -class SubsectionPixelData : public ImagePixelData -{ -public: - SubsectionPixelData (ImagePixelData* const im, const Rectangle& r) - : ImagePixelData (im->pixelFormat, r.getWidth(), r.getHeight()), - image (im), area (r) - { - } - - LowLevelGraphicsContext* createLowLevelContext() override - { - LowLevelGraphicsContext* g = image->createLowLevelContext(); - g->clipToRectangle (area); - g->setOrigin (area.getPosition()); - return g; - } - - void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override - { - image->initialiseBitmapData (bitmap, x + area.getX(), y + area.getY(), mode); - - if (mode != Image::BitmapData::readOnly) - sendDataChangeMessage(); - } - - ImagePixelData* clone() override - { - jassert (getReferenceCount() > 0); // (This method can't be used on an unowned pointer, as it will end up self-deleting) - const ScopedPointer type (image->createType()); - - Image newImage (type->create (pixelFormat, area.getWidth(), area.getHeight(), pixelFormat != Image::RGB)); - - { - Graphics g (newImage); - g.drawImageAt (Image (this), 0, 0); - } - - newImage.getPixelData()->incReferenceCount(); - return newImage.getPixelData(); - } - - ImageType* createType() const override { return image->createType(); } - -private: - const ImagePixelData::Ptr image; - const Rectangle area; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SubsectionPixelData) -}; - -Image Image::getClippedImage (const Rectangle& area) const -{ - if (area.contains (getBounds())) - return *this; - - const Rectangle validArea (area.getIntersection (getBounds())); - return Image (validArea.isEmpty() ? nullptr : new SubsectionPixelData (image, validArea)); -} - - -//============================================================================== -Image::Image() noexcept -{ -} - -Image::Image (ImagePixelData* const instance) noexcept - : image (instance) -{ -} - -Image::Image (const PixelFormat format, int width, int height, bool clearImage) - : image (NativeImageType().create (format, width, height, clearImage)) -{ -} - -Image::Image (const PixelFormat format, int width, int height, bool clearImage, const ImageType& type) - : image (type.create (format, width, height, clearImage)) -{ -} - -Image::Image (const Image& other) noexcept - : image (other.image) -{ -} - -Image& Image::operator= (const Image& other) -{ - image = other.image; - return *this; -} - -#if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS -Image::Image (Image&& other) noexcept - : image (static_cast (other.image)) -{ -} - -Image& Image::operator= (Image&& other) noexcept -{ - image = static_cast (other.image); - return *this; -} -#endif - -Image::~Image() -{ -} - -const Image Image::null; - -int Image::getReferenceCount() const noexcept { return image == nullptr ? 0 : image->getReferenceCount(); } -int Image::getWidth() const noexcept { return image == nullptr ? 0 : image->width; } -int Image::getHeight() const noexcept { return image == nullptr ? 0 : image->height; } -Rectangle Image::getBounds() const noexcept { return image == nullptr ? Rectangle() : Rectangle (image->width, image->height); } -Image::PixelFormat Image::getFormat() const noexcept { return image == nullptr ? UnknownFormat : image->pixelFormat; } -bool Image::isARGB() const noexcept { return getFormat() == ARGB; } -bool Image::isRGB() const noexcept { return getFormat() == RGB; } -bool Image::isSingleChannel() const noexcept { return getFormat() == SingleChannel; } -bool Image::hasAlphaChannel() const noexcept { return getFormat() != RGB; } - -LowLevelGraphicsContext* Image::createLowLevelContext() const -{ - return image == nullptr ? nullptr : image->createLowLevelContext(); -} - -void Image::duplicateIfShared() -{ - if (image != nullptr && image->getReferenceCount() > 1) - image = image->clone(); -} - -Image Image::createCopy() const -{ - if (image != nullptr) - return Image (image->clone()); - - return Image(); -} - -Image Image::rescaled (const int newWidth, const int newHeight, const Graphics::ResamplingQuality quality) const -{ - if (image == nullptr || (image->width == newWidth && image->height == newHeight)) - return *this; - - const ScopedPointer type (image->createType()); - Image newImage (type->create (image->pixelFormat, newWidth, newHeight, hasAlphaChannel())); - - Graphics g (newImage); - g.setImageResamplingQuality (quality); - g.drawImageTransformed (*this, AffineTransform::scale (newWidth / (float) image->width, - newHeight / (float) image->height), false); - return newImage; -} - -Image Image::convertedToFormat (PixelFormat newFormat) const -{ - if (image == nullptr || newFormat == image->pixelFormat) - return *this; - - const int w = image->width, h = image->height; - - const ScopedPointer type (image->createType()); - Image newImage (type->create (newFormat, w, h, false)); - - if (newFormat == SingleChannel) - { - if (! hasAlphaChannel()) - { - newImage.clear (getBounds(), Colours::black); - } - else - { - const BitmapData destData (newImage, 0, 0, w, h, BitmapData::writeOnly); - const BitmapData srcData (*this, 0, 0, w, h); - - for (int y = 0; y < h; ++y) - { - const PixelARGB* const src = (const PixelARGB*) srcData.getLinePointer (y); - uint8* const dst = destData.getLinePointer (y); - - for (int x = 0; x < w; ++x) - dst[x] = src[x].getAlpha(); - } - } - } - else if (image->pixelFormat == SingleChannel && newFormat == Image::ARGB) - { - const BitmapData destData (newImage, 0, 0, w, h, BitmapData::writeOnly); - const BitmapData srcData (*this, 0, 0, w, h); - - for (int y = 0; y < h; ++y) - { - const PixelAlpha* const src = (const PixelAlpha*) srcData.getLinePointer (y); - PixelARGB* const dst = (PixelARGB*) destData.getLinePointer (y); - - for (int x = 0; x < w; ++x) - dst[x].set (src[x]); - } - } - else - { - if (hasAlphaChannel()) - newImage.clear (getBounds()); - - Graphics g (newImage); - g.drawImageAt (*this, 0, 0); - } - - return newImage; -} - -NamedValueSet* Image::getProperties() const -{ - return image == nullptr ? nullptr : &(image->userData); -} - -//============================================================================== -Image::BitmapData::BitmapData (Image& im, const int x, const int y, const int w, const int h, BitmapData::ReadWriteMode mode) - : width (w), height (h) -{ - // The BitmapData class must be given a valid image, and a valid rectangle within it! - jassert (im.image != nullptr); - jassert (x >= 0 && y >= 0 && w > 0 && h > 0 && x + w <= im.getWidth() && y + h <= im.getHeight()); - - im.image->initialiseBitmapData (*this, x, y, mode); - jassert (data != nullptr && pixelStride > 0 && lineStride != 0); -} - -Image::BitmapData::BitmapData (const Image& im, const int x, const int y, const int w, const int h) - : width (w), height (h) -{ - // The BitmapData class must be given a valid image, and a valid rectangle within it! - jassert (im.image != nullptr); - jassert (x >= 0 && y >= 0 && w > 0 && h > 0 && x + w <= im.getWidth() && y + h <= im.getHeight()); - - im.image->initialiseBitmapData (*this, x, y, readOnly); - jassert (data != nullptr && pixelStride > 0 && lineStride != 0); -} - -Image::BitmapData::BitmapData (const Image& im, BitmapData::ReadWriteMode mode) - : width (im.getWidth()), - height (im.getHeight()) -{ - // The BitmapData class must be given a valid image! - jassert (im.image != nullptr); - - im.image->initialiseBitmapData (*this, 0, 0, mode); - jassert (data != nullptr && pixelStride > 0 && lineStride != 0); -} - -Image::BitmapData::~BitmapData() -{ -} - -Colour Image::BitmapData::getPixelColour (const int x, const int y) const noexcept -{ - jassert (isPositiveAndBelow (x, width) && isPositiveAndBelow (y, height)); - - const uint8* const pixel = getPixelPointer (x, y); - - switch (pixelFormat) - { - case Image::ARGB: return Colour (((const PixelARGB*) pixel)->getUnpremultipliedARGB()); - case Image::RGB: return Colour (((const PixelRGB*) pixel)->getUnpremultipliedARGB()); - case Image::SingleChannel: return Colour (((const PixelAlpha*) pixel)->getUnpremultipliedARGB()); - default: jassertfalse; break; - } - - return Colour(); -} - -void Image::BitmapData::setPixelColour (const int x, const int y, Colour colour) const noexcept -{ - jassert (isPositiveAndBelow (x, width) && isPositiveAndBelow (y, height)); - - uint8* const pixel = getPixelPointer (x, y); - const PixelARGB col (colour.getPixelARGB()); - - switch (pixelFormat) - { - case Image::ARGB: ((PixelARGB*) pixel)->set (col); break; - case Image::RGB: ((PixelRGB*) pixel)->set (col); break; - case Image::SingleChannel: ((PixelAlpha*) pixel)->set (col); break; - default: jassertfalse; break; - } -} - -//============================================================================== -void Image::clear (const Rectangle& area, Colour colourToClearTo) -{ - const ScopedPointer g (image->createLowLevelContext()); - g->setFill (colourToClearTo); - g->fillRect (area, true); -} - -//============================================================================== -Colour Image::getPixelAt (const int x, const int y) const -{ - if (isPositiveAndBelow (x, getWidth()) && isPositiveAndBelow (y, getHeight())) - { - const BitmapData srcData (*this, x, y, 1, 1); - return srcData.getPixelColour (0, 0); - } - - return Colour(); -} - -void Image::setPixelAt (const int x, const int y, Colour colour) -{ - if (isPositiveAndBelow (x, getWidth()) && isPositiveAndBelow (y, getHeight())) - { - const BitmapData destData (*this, x, y, 1, 1, BitmapData::writeOnly); - destData.setPixelColour (0, 0, colour); - } -} - -void Image::multiplyAlphaAt (const int x, const int y, const float multiplier) -{ - if (isPositiveAndBelow (x, getWidth()) && isPositiveAndBelow (y, getHeight()) - && hasAlphaChannel()) - { - const BitmapData destData (*this, x, y, 1, 1, BitmapData::readWrite); - - if (isARGB()) - ((PixelARGB*) destData.data)->multiplyAlpha (multiplier); - else - *(destData.data) = (uint8) (*(destData.data) * multiplier); - } -} - -template -struct PixelIterator -{ - template - static void iterate (const Image::BitmapData& data, const PixelOperation& pixelOp) - { - for (int y = 0; y < data.height; ++y) - { - uint8* p = data.getLinePointer (y); - - for (int x = 0; x < data.width; ++x) - { - pixelOp (*(PixelType*) p); - p += data.pixelStride; - } - } - } -}; - -template -static void performPixelOp (const Image::BitmapData& data, const PixelOperation& pixelOp) -{ - switch (data.pixelFormat) - { - case Image::ARGB: PixelIterator ::iterate (data, pixelOp); break; - case Image::RGB: PixelIterator ::iterate (data, pixelOp); break; - case Image::SingleChannel: PixelIterator::iterate (data, pixelOp); break; - default: jassertfalse; break; - } -} - -struct AlphaMultiplyOp -{ - AlphaMultiplyOp (float alpha_) noexcept : alpha (alpha_) {} - - const float alpha; - - template - void operator() (PixelType& pixel) const - { - pixel.multiplyAlpha (alpha); - } - - JUCE_DECLARE_NON_COPYABLE (AlphaMultiplyOp) -}; - -void Image::multiplyAllAlphas (const float amountToMultiplyBy) -{ - jassert (hasAlphaChannel()); - - const BitmapData destData (*this, 0, 0, getWidth(), getHeight(), BitmapData::readWrite); - performPixelOp (destData, AlphaMultiplyOp (amountToMultiplyBy)); -} - -struct DesaturateOp -{ - template - void operator() (PixelType& pixel) const - { - pixel.desaturate(); - } -}; - -void Image::desaturate() -{ - if (isARGB() || isRGB()) - { - const BitmapData destData (*this, 0, 0, getWidth(), getHeight(), BitmapData::readWrite); - performPixelOp (destData, DesaturateOp()); - } -} - -void Image::createSolidAreaMask (RectangleList& result, const float alphaThreshold) const -{ - if (hasAlphaChannel()) - { - const uint8 threshold = (uint8) jlimit (0, 255, roundToInt (alphaThreshold * 255.0f)); - SparseSet pixelsOnRow; - - const BitmapData srcData (*this, 0, 0, getWidth(), getHeight()); - - for (int y = 0; y < srcData.height; ++y) - { - pixelsOnRow.clear(); - const uint8* lineData = srcData.getLinePointer (y); - - if (isARGB()) - { - for (int x = 0; x < srcData.width; ++x) - { - if (((const PixelARGB*) lineData)->getAlpha() >= threshold) - pixelsOnRow.addRange (Range (x, x + 1)); - - lineData += srcData.pixelStride; - } - } - else - { - for (int x = 0; x < srcData.width; ++x) - { - if (*lineData >= threshold) - pixelsOnRow.addRange (Range (x, x + 1)); - - lineData += srcData.pixelStride; - } - } - - for (int i = 0; i < pixelsOnRow.getNumRanges(); ++i) - { - const Range range (pixelsOnRow.getRange (i)); - result.add (Rectangle (range.getStart(), y, range.getLength(), 1)); - } - - result.consolidate(); - } - } - else - { - result.add (0, 0, getWidth(), getHeight()); - } -} - -void Image::moveImageSection (int dx, int dy, - int sx, int sy, - int w, int h) -{ - if (dx < 0) - { - w += dx; - sx -= dx; - dx = 0; - } - - if (dy < 0) - { - h += dy; - sy -= dy; - dy = 0; - } - - if (sx < 0) - { - w += sx; - dx -= sx; - sx = 0; - } - - if (sy < 0) - { - h += sy; - dy -= sy; - sy = 0; - } - - const int minX = jmin (dx, sx); - const int minY = jmin (dy, sy); - - w = jmin (w, getWidth() - jmax (sx, dx)); - h = jmin (h, getHeight() - jmax (sy, dy)); - - if (w > 0 && h > 0) - { - const int maxX = jmax (dx, sx) + w; - const int maxY = jmax (dy, sy) + h; - - const BitmapData destData (*this, minX, minY, maxX - minX, maxY - minY, BitmapData::readWrite); - - uint8* dst = destData.getPixelPointer (dx - minX, dy - minY); - const uint8* src = destData.getPixelPointer (sx - minX, sy - minY); - - const size_t lineSize = (size_t) (destData.pixelStride * w); - - if (dy > sy) - { - while (--h >= 0) - { - const int offset = h * destData.lineStride; - memmove (dst + offset, src + offset, lineSize); - } - } - else if (dst != src) - { - while (--h >= 0) - { - memmove (dst, src, lineSize); - dst += destData.lineStride; - src += destData.lineStride; - } - } - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h b/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h deleted file mode 100755 index 0f67b4e..0000000 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_Image.h +++ /dev/null @@ -1,533 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_IMAGE_H_INCLUDED -#define JUCE_IMAGE_H_INCLUDED - -class ImageType; -class ImagePixelData; - - -//============================================================================== -/** - Holds a fixed-size bitmap. - - The image is stored in either 24-bit RGB or 32-bit premultiplied-ARGB format. - - To draw into an image, create a Graphics object for it. - e.g. @code - - // create a transparent 500x500 image.. - Image myImage (Image::RGB, 500, 500, true); - - Graphics g (myImage); - g.setColour (Colours::red); - g.fillEllipse (20, 20, 300, 200); // draws a red ellipse in our image. - @endcode - - Other useful ways to create an image are with the ImageCache class, or the - ImageFileFormat, which provides a way to load common image files. - - @see Graphics, ImageFileFormat, ImageCache, ImageConvolutionKernel -*/ -class JUCE_API Image -{ -public: - //============================================================================== - /** - */ - enum PixelFormat - { - UnknownFormat, - RGB, /**<< each pixel is a 3-byte packed RGB colour value. For byte order, see the PixelRGB class. */ - ARGB, /**<< each pixel is a 4-byte ARGB premultiplied colour value. For byte order, see the PixelARGB class. */ - SingleChannel /**<< each pixel is a 1-byte alpha channel value. */ - }; - - //============================================================================== - /** Creates a null image. */ - Image() noexcept; - - /** Creates an image with a specified size and format. - - The image's internal type will be of the NativeImageType class - to specify a - different type, use the other constructor, which takes an ImageType to use. - - @param format the number of colour channels in the image - @param imageWidth the desired width of the image, in pixels - this value must be - greater than zero (otherwise a width of 1 will be used) - @param imageHeight the desired width of the image, in pixels - this value must be - greater than zero (otherwise a height of 1 will be used) - @param clearImage if true, the image will initially be cleared to black (if it's RGB) - or transparent black (if it's ARGB). If false, the image may contain - junk initially, so you need to make sure you overwrite it thoroughly. - */ - Image (PixelFormat format, int imageWidth, int imageHeight, bool clearImage); - - /** Creates an image with a specified size and format. - - @param format the number of colour channels in the image - @param imageWidth the desired width of the image, in pixels - this value must be - greater than zero (otherwise a width of 1 will be used) - @param imageHeight the desired width of the image, in pixels - this value must be - greater than zero (otherwise a height of 1 will be used) - @param clearImage if true, the image will initially be cleared to black (if it's RGB) - or transparent black (if it's ARGB). If false, the image may contain - junk initially, so you need to make sure you overwrite it thoroughly. - @param type the type of image - this lets you specify the internal format that will - be used to allocate and manage the image data. - */ - Image (PixelFormat format, int imageWidth, int imageHeight, bool clearImage, const ImageType& type); - - /** Creates a shared reference to another image. - - This won't create a duplicate of the image - when Image objects are copied, they simply - point to the same shared image data. To make sure that an Image object has its own unique, - unshared internal data, call duplicateIfShared(). - */ - Image (const Image&) noexcept; - - /** Makes this image refer to the same underlying image as another object. - - This won't create a duplicate of the image - when Image objects are copied, they simply - point to the same shared image data. To make sure that an Image object has its own unique, - unshared internal data, call duplicateIfShared(). - */ - Image& operator= (const Image&); - - #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS - Image (Image&&) noexcept; - Image& operator= (Image&&) noexcept; - #endif - - /** Destructor. */ - ~Image(); - - /** Returns true if the two images are referring to the same internal, shared image. */ - bool operator== (const Image& other) const noexcept { return image == other.image; } - - /** Returns true if the two images are not referring to the same internal, shared image. */ - bool operator!= (const Image& other) const noexcept { return image != other.image; } - - /** Returns true if this image isn't null. - If you create an Image with the default constructor, it has no size or content, and is null - until you reassign it to an Image which contains some actual data. - The isNull() method is the opposite of isValid(). - @see isNull - */ - inline bool isValid() const noexcept { return image != nullptr; } - - /** Returns true if this image is not valid. - If you create an Image with the default constructor, it has no size or content, and is null - until you reassign it to an Image which contains some actual data. - The isNull() method is the opposite of isValid(). - @see isValid - */ - inline bool isNull() const noexcept { return image == nullptr; } - - /** A null Image object that can be used when you need to return an invalid image. - This object is the equivalient to an Image created with the default constructor. - */ - static const Image null; - - //============================================================================== - /** Returns the image's width (in pixels). */ - int getWidth() const noexcept; - - /** Returns the image's height (in pixels). */ - int getHeight() const noexcept; - - /** Returns a rectangle with the same size as this image. - The rectangle's origin is always (0, 0). - */ - Rectangle getBounds() const noexcept; - - /** Returns the image's pixel format. */ - PixelFormat getFormat() const noexcept; - - /** True if the image's format is ARGB. */ - bool isARGB() const noexcept; - - /** True if the image's format is RGB. */ - bool isRGB() const noexcept; - - /** True if the image's format is a single-channel alpha map. */ - bool isSingleChannel() const noexcept; - - /** True if the image contains an alpha-channel. */ - bool hasAlphaChannel() const noexcept; - - //============================================================================== - /** Clears a section of the image with a given colour. - - This won't do any alpha-blending - it just sets all pixels in the image to - the given colour (which may be non-opaque if the image has an alpha channel). - */ - void clear (const Rectangle& area, Colour colourToClearTo = Colour (0x00000000)); - - /** Returns a rescaled version of this image. - - A new image is returned which is a copy of this one, rescaled to the given size. - - Note that if the new size is identical to the existing image, this will just return - a reference to the original image, and won't actually create a duplicate. - */ - Image rescaled (int newWidth, int newHeight, - Graphics::ResamplingQuality quality = Graphics::mediumResamplingQuality) const; - - /** Creates a copy of this image. - Note that it's usually more efficient to use duplicateIfShared(), because it may not be necessary - to copy an image if nothing else is using it. - @see getReferenceCount - */ - Image createCopy() const; - - /** Returns a version of this image with a different image format. - - A new image is returned which has been converted to the specified format. - - Note that if the new format is no different to the current one, this will just return - a reference to the original image, and won't actually create a copy. - */ - Image convertedToFormat (PixelFormat newFormat) const; - - /** Makes sure that no other Image objects share the same underlying data as this one. - - If no other Image objects refer to the same shared data as this one, this method has no - effect. But if there are other references to the data, this will create a new copy of - the data internally. - - Call this if you want to draw onto the image, but want to make sure that this doesn't - affect any other code that may be sharing the same data. - - @see getReferenceCount - */ - void duplicateIfShared(); - - /** Returns an image which refers to a subsection of this image. - - This will not make a copy of the original - the new image will keep a reference to it, so that - if the original image is changed, the contents of the subsection will also change. Likewise if you - draw into the subimage, you'll also be drawing onto that area of the original image. Note that if - you use operator= to make the original Image object refer to something else, the subsection image - won't pick up this change, it'll remain pointing at the original. - - The area passed-in will be clipped to the bounds of this image, so this may return a smaller - image than the area you asked for, or even a null image if the area was out-of-bounds. - */ - Image getClippedImage (const Rectangle& area) const; - - //============================================================================== - /** Returns the colour of one of the pixels in the image. - - If the coordinates given are beyond the image's boundaries, this will - return Colours::transparentBlack. - - @see setPixelAt, Image::BitmapData::getPixelColour - */ - Colour getPixelAt (int x, int y) const; - - /** Sets the colour of one of the image's pixels. - - If the coordinates are beyond the image's boundaries, then nothing will happen. - - Note that this won't do any alpha-blending, it'll just replace the existing pixel - with the given one. The colour's opacity will be ignored if this image doesn't have - an alpha-channel. - - @see getPixelAt, Image::BitmapData::setPixelColour - */ - void setPixelAt (int x, int y, Colour colour); - - /** Changes the opacity of a pixel. - - This only has an effect if the image has an alpha channel and if the - given coordinates are inside the image's boundary. - - The multiplier must be in the range 0 to 1.0, and the current alpha - at the given coordinates will be multiplied by this value. - - @see setPixelAt - */ - void multiplyAlphaAt (int x, int y, float multiplier); - - /** Changes the overall opacity of the image. - - This will multiply the alpha value of each pixel in the image by the given - amount (limiting the resulting alpha values between 0 and 255). This allows - you to make an image more or less transparent. - - If the image doesn't have an alpha channel, this won't have any effect. - */ - void multiplyAllAlphas (float amountToMultiplyBy); - - /** Changes all the colours to be shades of grey, based on their current luminosity. - */ - void desaturate(); - - //============================================================================== - /** Retrieves a section of an image as raw pixel data, so it can be read or written to. - - You should only use this class as a last resort - messing about with the internals of - an image is only recommended for people who really know what they're doing! - - A BitmapData object should be used as a temporary, stack-based object. Don't keep one - hanging around while the image is being used elsewhere. - - Depending on the way the image class is implemented, this may create a temporary buffer - which is copied back to the image when the object is deleted, or it may just get a pointer - directly into the image's raw data. - - You can use the stride and data values in this class directly, but don't alter them! - The actual format of the pixel data depends on the image's format - see Image::getFormat(), - and the PixelRGB, PixelARGB and PixelAlpha classes for more info. - */ - class JUCE_API BitmapData - { - public: - enum ReadWriteMode - { - readOnly, - writeOnly, - readWrite - }; - - BitmapData (Image& image, int x, int y, int w, int h, ReadWriteMode mode); - BitmapData (const Image& image, int x, int y, int w, int h); - BitmapData (const Image& image, ReadWriteMode mode); - ~BitmapData(); - - /** Returns a pointer to the start of a line in the image. - The coordinate you provide here isn't checked, so it's the caller's responsibility to make - sure it's not out-of-range. - */ - inline uint8* getLinePointer (int y) const noexcept { return data + y * lineStride; } - - /** Returns a pointer to a pixel in the image. - The coordinates you give here are not checked, so it's the caller's responsibility to make sure they're - not out-of-range. - */ - inline uint8* getPixelPointer (int x, int y) const noexcept { return data + y * lineStride + x * pixelStride; } - - /** Returns the colour of a given pixel. - For performance reasons, this won't do any bounds-checking on the coordinates, so it's the caller's - repsonsibility to make sure they're within the image's size. - */ - Colour getPixelColour (int x, int y) const noexcept; - - /** Sets the colour of a given pixel. - For performance reasons, this won't do any bounds-checking on the coordinates, so it's the caller's - repsonsibility to make sure they're within the image's size. - */ - void setPixelColour (int x, int y, Colour colour) const noexcept; - - /** Returns the size of the bitmap. */ - Rectangle getBounds() const noexcept { return Rectangle (width, height); } - - uint8* data; /**< The raw pixel data, packed according to the image's pixel format. */ - PixelFormat pixelFormat; /**< The format of the data. */ - int lineStride; /**< The number of bytes between each line. */ - int pixelStride; /**< The number of bytes between each pixel. */ - int width, height; - - //============================================================================== - /** Used internally by custom image types to manage pixel data lifetime. */ - class BitmapDataReleaser - { - protected: - BitmapDataReleaser() {} - public: - virtual ~BitmapDataReleaser() {} - }; - - ScopedPointer dataReleaser; - - private: - JUCE_DECLARE_NON_COPYABLE (BitmapData) - }; - - //============================================================================== - /** Copies a section of the image to somewhere else within itself. */ - void moveImageSection (int destX, int destY, - int sourceX, int sourceY, - int width, int height); - - /** Creates a RectangleList containing rectangles for all non-transparent pixels - of the image. - - @param result the list that will have the area added to it - @param alphaThreshold for a semi-transparent image, any pixels whose alpha is - above this level will be considered opaque - */ - void createSolidAreaMask (RectangleList& result, float alphaThreshold) const; - - //============================================================================== - /** Returns a NamedValueSet that is attached to the image and which can be used for - associating custom values with it. - - If this is a null image, this will return a null pointer. - */ - NamedValueSet* getProperties() const; - - //============================================================================== - /** Creates a context suitable for drawing onto this image. - Don't call this method directly! It's used internally by the Graphics class. - */ - LowLevelGraphicsContext* createLowLevelContext() const; - - /** Returns the number of Image objects which are currently referring to the same internal - shared image data. - - @see duplicateIfShared - */ - int getReferenceCount() const noexcept; - - //============================================================================== - /** @internal */ - ImagePixelData* getPixelData() const noexcept { return image; } - - /** @internal */ - explicit Image (ImagePixelData*) noexcept; - -private: - //============================================================================== - ReferenceCountedObjectPtr image; - - JUCE_LEAK_DETECTOR (Image) -}; - - -//============================================================================== -/** - This is a base class for holding image data in implementation-specific ways. - - You may never need to use this class directly - it's used internally - by the Image class to store the actual image data. To access pixel data directly, - you should use Image::BitmapData rather than this class. - - ImagePixelData objects are created indirectly, by subclasses of ImageType. - @see Image, ImageType -*/ -class JUCE_API ImagePixelData : public ReferenceCountedObject -{ -public: - ImagePixelData (Image::PixelFormat, int width, int height); - ~ImagePixelData(); - - /** Creates a context that will draw into this image. */ - virtual LowLevelGraphicsContext* createLowLevelContext() = 0; - /** Creates a copy of this image. */ - virtual ImagePixelData* clone() = 0; - /** Creates an instance of the type of this image. */ - virtual ImageType* createType() const = 0; - /** Initialises a BitmapData object. */ - virtual void initialiseBitmapData (Image::BitmapData&, int x, int y, Image::BitmapData::ReadWriteMode) = 0; - - /** The pixel format of the image data. */ - const Image::PixelFormat pixelFormat; - const int width, height; - - /** User-defined settings that are attached to this image. - @see Image::getProperties(). - */ - NamedValueSet userData; - - typedef ReferenceCountedObjectPtr Ptr; - - //============================================================================== - struct Listener - { - virtual ~Listener() {} - - virtual void imageDataChanged (ImagePixelData*) = 0; - virtual void imageDataBeingDeleted (ImagePixelData*) = 0; - }; - - ListenerList listeners; - - void sendDataChangeMessage(); - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ImagePixelData) -}; - -//============================================================================== -/** - This base class is for handlers that control a type of image manipulation format, - e.g. an in-memory bitmap, an OpenGL image, CoreGraphics image, etc. - - @see SoftwareImageType, NativeImageType, OpenGLImageType -*/ -class JUCE_API ImageType -{ -public: - ImageType(); - virtual ~ImageType(); - - /** Creates a new image of this type, and the specified parameters. */ - virtual ImagePixelData::Ptr create (Image::PixelFormat format, int width, int height, bool shouldClearImage) const = 0; - - /** Must return a unique number to identify this type. */ - virtual int getTypeID() const = 0; - - /** Returns an image which is a copy of the source image, but using this type of storage mechanism. - For example, to make sure that an image is stored in-memory, you could use: - @code myImage = SoftwareImageType().convert (myImage); @endcode - */ - virtual Image convert (const Image& source) const; -}; - -//============================================================================== -/** - An image storage type which holds the pixels in-memory as a simple block of values. - @see ImageType, NativeImageType -*/ -class JUCE_API SoftwareImageType : public ImageType -{ -public: - SoftwareImageType(); - ~SoftwareImageType(); - - ImagePixelData::Ptr create (Image::PixelFormat, int width, int height, bool clearImage) const override; - int getTypeID() const override; -}; - -//============================================================================== -/** - An image storage type which holds the pixels using whatever is the default storage - format on the current platform. - @see ImageType, SoftwareImageType -*/ -class JUCE_API NativeImageType : public ImageType -{ -public: - NativeImageType(); - ~NativeImageType(); - - ImagePixelData::Ptr create (Image::PixelFormat, int width, int height, bool clearImage) const override; - int getTypeID() const override; -}; - - -#endif // JUCE_IMAGE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp deleted file mode 100755 index a806e48..0000000 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class ImageCache::Pimpl : private Timer, - private DeletedAtShutdown -{ -public: - Pimpl() : cacheTimeout (5000) - { - } - - ~Pimpl() - { - clearSingletonInstance(); - } - - Image getFromHashCode (const int64 hashCode) - { - const ScopedLock sl (lock); - - for (int i = images.size(); --i >= 0;) - { - const Item* const item = images.getUnchecked(i); - - if (item->hashCode == hashCode) - return item->image; - } - - return Image::null; - } - - void addImageToCache (const Image& image, const int64 hashCode) - { - if (image.isValid()) - { - if (! isTimerRunning()) - startTimer (2000); - - Item* const item = new Item(); - item->hashCode = hashCode; - item->image = image; - item->lastUseTime = Time::getApproximateMillisecondCounter(); - - const ScopedLock sl (lock); - images.add (item); - } - } - - void timerCallback() override - { - const uint32 now = Time::getApproximateMillisecondCounter(); - - const ScopedLock sl (lock); - - for (int i = images.size(); --i >= 0;) - { - Item* const item = images.getUnchecked(i); - - if (item->image.getReferenceCount() <= 1) - { - if (now > item->lastUseTime + cacheTimeout || now < item->lastUseTime - 1000) - images.remove (i); - } - else - { - item->lastUseTime = now; // multiply-referenced, so this image is still in use. - } - } - - if (images.size() == 0) - stopTimer(); - } - - void releaseUnusedImages() - { - const ScopedLock sl (lock); - - for (int i = images.size(); --i >= 0;) - if (images.getUnchecked(i)->image.getReferenceCount() <= 1) - images.remove (i); - } - - struct Item - { - Image image; - int64 hashCode; - uint32 lastUseTime; - }; - - unsigned int cacheTimeout; - - juce_DeclareSingleton_SingleThreaded_Minimal (ImageCache::Pimpl) - -private: - OwnedArray images; - CriticalSection lock; - - JUCE_DECLARE_NON_COPYABLE (Pimpl) -}; - -juce_ImplementSingleton_SingleThreaded (ImageCache::Pimpl) - - -//============================================================================== -Image ImageCache::getFromHashCode (const int64 hashCode) -{ - if (Pimpl::getInstanceWithoutCreating() != nullptr) - return Pimpl::getInstanceWithoutCreating()->getFromHashCode (hashCode); - - return Image::null; -} - -void ImageCache::addImageToCache (const Image& image, const int64 hashCode) -{ - Pimpl::getInstance()->addImageToCache (image, hashCode); -} - -Image ImageCache::getFromFile (const File& file) -{ - const int64 hashCode = file.hashCode64(); - Image image (getFromHashCode (hashCode)); - - if (image.isNull()) - { - image = ImageFileFormat::loadFrom (file); - addImageToCache (image, hashCode); - } - - return image; -} - -Image ImageCache::getFromMemory (const void* imageData, const int dataSize) -{ - const int64 hashCode = (int64) (pointer_sized_int) imageData; - Image image (getFromHashCode (hashCode)); - - if (image.isNull()) - { - image = ImageFileFormat::loadFrom (imageData, (size_t) dataSize); - addImageToCache (image, hashCode); - } - - return image; -} - -void ImageCache::setCacheTimeout (const int millisecs) -{ - jassert (millisecs >= 0); - Pimpl::getInstance()->cacheTimeout = (unsigned int) millisecs; -} - -void ImageCache::releaseUnusedImages() -{ - Pimpl::getInstance()->releaseUnusedImages(); -} diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h deleted file mode 100755 index c424395..0000000 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageCache.h +++ /dev/null @@ -1,125 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_IMAGECACHE_H_INCLUDED -#define JUCE_IMAGECACHE_H_INCLUDED - - -//============================================================================== -/** - A global cache of images that have been loaded from files or memory. - - If you're loading an image and may need to use the image in more than one - place, this is used to allow the same image to be shared rather than loading - multiple copies into memory. - - Another advantage is that after images are released, they will be kept in - memory for a few seconds before it is actually deleted, so if you're repeatedly - loading/deleting the same image, it'll reduce the chances of having to reload it - each time. - - @see Image, ImageFileFormat -*/ -class JUCE_API ImageCache -{ -public: - //============================================================================== - /** Loads an image from a file, (or just returns the image if it's already cached). - - If the cache already contains an image that was loaded from this file, - that image will be returned. Otherwise, this method will try to load the - file, add it to the cache, and return it. - - Remember that the image returned is shared, so drawing into it might - affect other things that are using it! If you want to draw on it, first - call Image::duplicateIfShared() - - @param file the file to try to load - @returns the image, or null if it there was an error loading it - @see getFromMemory, getFromCache, ImageFileFormat::loadFrom - */ - static Image getFromFile (const File& file); - - /** Loads an image from an in-memory image file, (or just returns the image if it's already cached). - - If the cache already contains an image that was loaded from this block of memory, - that image will be returned. Otherwise, this method will try to load the - file, add it to the cache, and return it. - - Remember that the image returned is shared, so drawing into it might - affect other things that are using it! If you want to draw on it, first - call Image::duplicateIfShared() - - @param imageData the block of memory containing the image data - @param dataSize the data size in bytes - @returns the image, or an invalid image if it there was an error loading it - @see getFromMemory, getFromCache, ImageFileFormat::loadFrom - */ - static Image getFromMemory (const void* imageData, int dataSize); - - //============================================================================== - /** Checks the cache for an image with a particular hashcode. - - If there's an image in the cache with this hashcode, it will be returned, - otherwise it will return an invalid image. - - @param hashCode the hash code that was associated with the image by addImageToCache() - @see addImageToCache - */ - static Image getFromHashCode (int64 hashCode); - - /** Adds an image to the cache with a user-defined hash-code. - - The image passed-in will be referenced (not copied) by the cache, so it's probably - a good idea not to draw into it after adding it, otherwise this will affect all - instances of it that may be in use. - - @param image the image to add - @param hashCode the hash-code to associate with it - @see getFromHashCode - */ - static void addImageToCache (const Image& image, int64 hashCode); - - /** Changes the amount of time before an unused image will be removed from the cache. - By default this is about 5 seconds. - */ - static void setCacheTimeout (int millisecs); - - /** Releases any images in the cache that aren't being referenced by active - Image objects. - */ - static void releaseUnusedImages(); - -private: - //============================================================================== - class Pimpl; - friend class Pimpl; - - ImageCache(); - ~ImageCache(); - - JUCE_DECLARE_NON_COPYABLE (ImageCache) -}; - -#endif // JUCE_IMAGECACHE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp deleted file mode 100755 index 78e4fb8..0000000 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ImageConvolutionKernel::ImageConvolutionKernel (const int size_) - : values ((size_t) (size_ * size_)), - size (size_) -{ - clear(); -} - -ImageConvolutionKernel::~ImageConvolutionKernel() -{ -} - -//============================================================================== -float ImageConvolutionKernel::getKernelValue (const int x, const int y) const noexcept -{ - if (isPositiveAndBelow (x, size) && isPositiveAndBelow (y, size)) - return values [x + y * size]; - - jassertfalse; - return 0; -} - -void ImageConvolutionKernel::setKernelValue (const int x, const int y, const float value) noexcept -{ - if (isPositiveAndBelow (x, size) && isPositiveAndBelow (y, size)) - { - values [x + y * size] = value; - } - else - { - jassertfalse; - } -} - -void ImageConvolutionKernel::clear() -{ - for (int i = size * size; --i >= 0;) - values[i] = 0; -} - -void ImageConvolutionKernel::setOverallSum (const float desiredTotalSum) -{ - double currentTotal = 0.0; - - for (int i = size * size; --i >= 0;) - currentTotal += values[i]; - - rescaleAllValues ((float) (desiredTotalSum / currentTotal)); -} - -void ImageConvolutionKernel::rescaleAllValues (const float multiplier) -{ - for (int i = size * size; --i >= 0;) - values[i] *= multiplier; -} - -//============================================================================== -void ImageConvolutionKernel::createGaussianBlur (const float radius) -{ - const double radiusFactor = -1.0 / (radius * radius * 2); - const int centre = size >> 1; - - for (int y = size; --y >= 0;) - { - for (int x = size; --x >= 0;) - { - const int cx = x - centre; - const int cy = y - centre; - - values [x + y * size] = (float) exp (radiusFactor * (cx * cx + cy * cy)); - } - } - - setOverallSum (1.0f); -} - -//============================================================================== -void ImageConvolutionKernel::applyToImage (Image& destImage, - const Image& sourceImage, - const Rectangle& destinationArea) const -{ - if (sourceImage == destImage) - { - destImage.duplicateIfShared(); - } - else - { - if (sourceImage.getWidth() != destImage.getWidth() - || sourceImage.getHeight() != destImage.getHeight() - || sourceImage.getFormat() != destImage.getFormat()) - { - jassertfalse; - return; - } - } - - const Rectangle area (destinationArea.getIntersection (destImage.getBounds())); - - if (area.isEmpty()) - return; - - const int right = area.getRight(); - const int bottom = area.getBottom(); - - const Image::BitmapData destData (destImage, area.getX(), area.getY(), area.getWidth(), area.getHeight(), - Image::BitmapData::writeOnly); - uint8* line = destData.data; - - const Image::BitmapData srcData (sourceImage, Image::BitmapData::readOnly); - - if (destData.pixelStride == 4) - { - for (int y = area.getY(); y < bottom; ++y) - { - uint8* dest = line; - line += destData.lineStride; - - for (int x = area.getX(); x < right; ++x) - { - float c1 = 0; - float c2 = 0; - float c3 = 0; - float c4 = 0; - - for (int yy = 0; yy < size; ++yy) - { - const int sy = y + yy - (size >> 1); - - if (sy >= srcData.height) - break; - - if (sy >= 0) - { - int sx = x - (size >> 1); - const uint8* src = srcData.getPixelPointer (sx, sy); - - for (int xx = 0; xx < size; ++xx) - { - if (sx >= srcData.width) - break; - - if (sx >= 0) - { - const float kernelMult = values [xx + yy * size]; - c1 += kernelMult * *src++; - c2 += kernelMult * *src++; - c3 += kernelMult * *src++; - c4 += kernelMult * *src++; - } - else - { - src += 4; - } - - ++sx; - } - } - } - - *dest++ = (uint8) jmin (0xff, roundToInt (c1)); - *dest++ = (uint8) jmin (0xff, roundToInt (c2)); - *dest++ = (uint8) jmin (0xff, roundToInt (c3)); - *dest++ = (uint8) jmin (0xff, roundToInt (c4)); - } - } - } - else if (destData.pixelStride == 3) - { - for (int y = area.getY(); y < bottom; ++y) - { - uint8* dest = line; - line += destData.lineStride; - - for (int x = area.getX(); x < right; ++x) - { - float c1 = 0; - float c2 = 0; - float c3 = 0; - - for (int yy = 0; yy < size; ++yy) - { - const int sy = y + yy - (size >> 1); - - if (sy >= srcData.height) - break; - - if (sy >= 0) - { - int sx = x - (size >> 1); - const uint8* src = srcData.getPixelPointer (sx, sy); - - for (int xx = 0; xx < size; ++xx) - { - if (sx >= srcData.width) - break; - - if (sx >= 0) - { - const float kernelMult = values [xx + yy * size]; - c1 += kernelMult * *src++; - c2 += kernelMult * *src++; - c3 += kernelMult * *src++; - } - else - { - src += 3; - } - - ++sx; - } - } - } - - *dest++ = (uint8) roundToInt (c1); - *dest++ = (uint8) roundToInt (c2); - *dest++ = (uint8) roundToInt (c3); - } - } - } - else if (destData.pixelStride == 1) - { - for (int y = area.getY(); y < bottom; ++y) - { - uint8* dest = line; - line += destData.lineStride; - - for (int x = area.getX(); x < right; ++x) - { - float c1 = 0; - - for (int yy = 0; yy < size; ++yy) - { - const int sy = y + yy - (size >> 1); - - if (sy >= srcData.height) - break; - - if (sy >= 0) - { - int sx = x - (size >> 1); - const uint8* src = srcData.getPixelPointer (sx, sy); - - for (int xx = 0; xx < size; ++xx) - { - if (sx >= srcData.width) - break; - - if (sx >= 0) - { - const float kernelMult = values [xx + yy * size]; - c1 += kernelMult * *src++; - } - else - { - src += 3; - } - - ++sx; - } - } - } - - *dest++ = (uint8) roundToInt (c1); - } - } - } -} diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h deleted file mode 100755 index 885dc6b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageConvolutionKernel.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_IMAGECONVOLUTIONKERNEL_H_INCLUDED -#define JUCE_IMAGECONVOLUTIONKERNEL_H_INCLUDED - - -//============================================================================== -/** - Represents a filter kernel to use in convoluting an image. - - @see Image::applyConvolution -*/ -class JUCE_API ImageConvolutionKernel -{ -public: - //============================================================================== - /** Creates an empty convulution kernel. - - @param size the length of each dimension of the kernel, so e.g. if the size - is 5, it will create a 5x5 kernel - */ - ImageConvolutionKernel (int size); - - /** Destructor. */ - ~ImageConvolutionKernel(); - - //============================================================================== - /** Resets all values in the kernel to zero. */ - void clear(); - - /** Returns one of the kernel values. */ - float getKernelValue (int x, int y) const noexcept; - - /** Sets the value of a specific cell in the kernel. - - The x and y parameters must be in the range 0 < x < getKernelSize(). - - @see setOverallSum - */ - void setKernelValue (int x, int y, float value) noexcept; - - /** Rescales all values in the kernel to make the total add up to a fixed value. - - This will multiply all values in the kernel by (desiredTotalSum / currentTotalSum). - */ - void setOverallSum (float desiredTotalSum); - - /** Multiplies all values in the kernel by a value. */ - void rescaleAllValues (float multiplier); - - /** Intialises the kernel for a gaussian blur. - - @param blurRadius this may be larger or smaller than the kernel's actual - size but this will obviously be wasteful or clip at the - edges. Ideally the kernel should be just larger than - (blurRadius * 2). - */ - void createGaussianBlur (float blurRadius); - - //============================================================================== - /** Returns the size of the kernel. - - E.g. if it's a 3x3 kernel, this returns 3. - */ - int getKernelSize() const { return size; } - - //============================================================================== - /** Applies the kernel to an image. - - @param destImage the image that will receive the resultant convoluted pixels. - @param sourceImage the source image to read from - this can be the same image as - the destination, but if different, it must be exactly the same - size and format. - @param destinationArea the region of the image to apply the filter to - */ - void applyToImage (Image& destImage, - const Image& sourceImage, - const Rectangle& destinationArea) const; - -private: - //============================================================================== - HeapBlock values; - const int size; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ImageConvolutionKernel) -}; - - -#endif // JUCE_IMAGECONVOLUTIONKERNEL_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp deleted file mode 100755 index a1cfd6a..0000000 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -struct DefaultImageFormats -{ - static ImageFileFormat** get() - { - static DefaultImageFormats formats; - return formats.formats; - } - -private: - DefaultImageFormats() noexcept - { - formats[0] = &png; - formats[1] = &jpg; - formats[2] = &gif; - formats[3] = nullptr; - } - - PNGImageFormat png; - JPEGImageFormat jpg; - GIFImageFormat gif; - - ImageFileFormat* formats[4]; -}; - -ImageFileFormat* ImageFileFormat::findImageFormatForStream (InputStream& input) -{ - const int64 streamPos = input.getPosition(); - - for (ImageFileFormat** i = DefaultImageFormats::get(); *i != nullptr; ++i) - { - const bool found = (*i)->canUnderstand (input); - input.setPosition (streamPos); - - if (found) - return *i; - } - - return nullptr; -} - -ImageFileFormat* ImageFileFormat::findImageFormatForFileExtension (const File& file) -{ - for (ImageFileFormat** i = DefaultImageFormats::get(); *i != nullptr; ++i) - if ((*i)->usesFileExtension (file)) - return *i; - - return nullptr; -} - -//============================================================================== -Image ImageFileFormat::loadFrom (InputStream& input) -{ - ImageFileFormat* const format = findImageFormatForStream (input); - - if (format != nullptr) - return format->decodeImage (input); - - return Image::null; -} - -Image ImageFileFormat::loadFrom (const File& file) -{ - FileInputStream stream (file); - - if (stream.openedOk()) - { - BufferedInputStream b (stream, 8192); - return loadFrom (b); - } - - return Image::null; -} - -Image ImageFileFormat::loadFrom (const void* rawData, const size_t numBytes) -{ - if (rawData != nullptr && numBytes > 4) - { - MemoryInputStream stream (rawData, numBytes, false); - return loadFrom (stream); - } - - return Image::null; -} diff --git a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h b/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h deleted file mode 100755 index 76a13d2..0000000 --- a/JuceLibraryCode/modules/juce_graphics/images/juce_ImageFileFormat.h +++ /dev/null @@ -1,216 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_IMAGEFILEFORMAT_H_INCLUDED -#define JUCE_IMAGEFILEFORMAT_H_INCLUDED - - -//============================================================================== -/** - Base-class for codecs that can read and write image file formats such - as PNG, JPEG, etc. - - This class also contains static methods to make it easy to load images - from files, streams or from memory. - - @see Image, ImageCache -*/ -class JUCE_API ImageFileFormat -{ -protected: - //============================================================================== - /** Creates an ImageFormat. */ - ImageFileFormat() {} - -public: - /** Destructor. */ - virtual ~ImageFileFormat() {} - - //============================================================================== - /** Returns a description of this file format. - - E.g. "JPEG", "PNG" - */ - virtual String getFormatName() = 0; - - /** Returns true if the given stream seems to contain data that this format understands. - - The format class should only read the first few bytes of the stream and sniff - for header bytes that it understands. - - Note that this will advance the stream and leave it in a new position, so if you're - planning on re-using it, you may want to rewind it after calling this method. - - @see decodeImage - */ - virtual bool canUnderstand (InputStream& input) = 0; - - /** Returns true if this format uses the file extension of the given file. */ - virtual bool usesFileExtension (const File& possibleFile) = 0; - - /** Tries to decode and return an image from the given stream. - - This will be called for an image format after calling its canUnderStand() method - to see if it can handle the stream. - - @param input the stream to read the data from. The stream will be positioned - at the start of the image data (but this may not necessarily - be position 0) - @returns the image that was decoded, or an invalid image if it fails. - @see loadFrom - */ - virtual Image decodeImage (InputStream& input) = 0; - - //============================================================================== - /** Attempts to write an image to a stream. - - To specify extra information like encoding quality, there will be appropriate parameters - in the subclasses of the specific file types. - - @returns true if it nothing went wrong. - */ - virtual bool writeImageToStream (const Image& sourceImage, - OutputStream& destStream) = 0; - - //============================================================================== - /** Tries the built-in formats to see if it can find one to read this stream. - There are currently built-in decoders for PNG, JPEG and GIF formats. - The object that is returned should not be deleted by the caller. - @see canUnderstand, decodeImage, loadFrom - */ - static ImageFileFormat* findImageFormatForStream (InputStream& input); - - /** Looks for a format that can handle the given file extension. - There are currently built-in formats for PNG, JPEG and GIF formats. - The object that is returned should not be deleted by the caller. - */ - static ImageFileFormat* findImageFormatForFileExtension (const File& file); - - //============================================================================== - /** Tries to load an image from a stream. - - This will use the findImageFormatForStream() method to locate a suitable - codec, and use that to load the image. - - @returns the image that was decoded, or an invalid image if it fails. - */ - static Image loadFrom (InputStream& input); - - /** Tries to load an image from a file. - - This will use the findImageFormatForStream() method to locate a suitable - codec, and use that to load the image. - - @returns the image that was decoded, or an invalid image if it fails. - */ - static Image loadFrom (const File& file); - - /** Tries to load an image from a block of raw image data. - - This will use the findImageFormatForStream() method to locate a suitable - codec, and use that to load the image. - - @returns the image that was decoded, or an invalid image if it fails. - */ - static Image loadFrom (const void* rawData, - size_t numBytesOfData); -}; - -//============================================================================== -/** - A subclass of ImageFileFormat for reading and writing PNG files. - - @see ImageFileFormat, JPEGImageFormat -*/ -class JUCE_API PNGImageFormat : public ImageFileFormat -{ -public: - //============================================================================== - PNGImageFormat(); - ~PNGImageFormat(); - - //============================================================================== - String getFormatName() override; - bool usesFileExtension (const File&) override; - bool canUnderstand (InputStream&) override; - Image decodeImage (InputStream&) override; - bool writeImageToStream (const Image&, OutputStream&) override; -}; - - -//============================================================================== -/** - A subclass of ImageFileFormat for reading and writing JPEG files. - - @see ImageFileFormat, PNGImageFormat -*/ -class JUCE_API JPEGImageFormat : public ImageFileFormat -{ -public: - //============================================================================== - JPEGImageFormat(); - ~JPEGImageFormat(); - - //============================================================================== - /** Specifies the quality to be used when writing a JPEG file. - - @param newQuality a value 0 to 1.0, where 0 is low quality, 1.0 is best, or - any negative value is "default" quality - */ - void setQuality (float newQuality); - - //============================================================================== - String getFormatName() override; - bool usesFileExtension (const File&) override; - bool canUnderstand (InputStream&) override; - Image decodeImage (InputStream&) override; - bool writeImageToStream (const Image&, OutputStream&) override; - -private: - float quality; -}; - -//============================================================================== -/** - A subclass of ImageFileFormat for reading GIF files. - - @see ImageFileFormat, PNGImageFormat, JPEGImageFormat -*/ -class JUCE_API GIFImageFormat : public ImageFileFormat -{ -public: - //============================================================================== - GIFImageFormat(); - ~GIFImageFormat(); - - //============================================================================== - String getFormatName() override; - bool usesFileExtension (const File&) override; - bool canUnderstand (InputStream&) override; - Image decodeImage (InputStream&) override; - bool writeImageToStream (const Image&, OutputStream&) override; -}; - - -#endif // JUCE_IMAGEFILEFORMAT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp b/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp deleted file mode 100755 index 627d565..0000000 --- a/JuceLibraryCode/modules/juce_graphics/juce_graphics.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if defined (JUCE_GRAPHICS_H_INCLUDED) && ! JUCE_AMALGAMATED_INCLUDE - /* When you add this cpp file to your project, you mustn't include it in a file where you've - already included any other headers - just put it inside a file on its own, possibly with your config - flags preceding it, but don't include anything else. That also includes avoiding any automatic prefix - header files that the compiler may be using. - */ - #error "Incorrect use of JUCE cpp file" -#endif - -// Your project must contain an AppConfig.h file with your project-specific settings in it, -// and your header search path must make it accessible to the module's files. -#include "AppConfig.h" - -#include "../juce_core/native/juce_BasicNativeHeaders.h" -#include "juce_graphics.h" - -//============================================================================== -#if JUCE_MAC - #import - -#elif JUCE_WINDOWS - #if JUCE_MINGW && JUCE_USE_DIRECTWRITE - #warning "DirectWrite not currently implemented with mingw..." - #undef JUCE_USE_DIRECTWRITE - #endif - - #if JUCE_USE_DIRECTWRITE - /* If you hit a compile error trying to include these files, you may need to update - your version of the Windows SDK to the latest one. The DirectWrite and Direct2D - headers are in the version 7 SDKs. - */ - #include - #include - #endif - - #if JUCE_MINGW - #include - #endif - -#elif JUCE_IOS - #import - #import - - #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_3_2 - #error "JUCE no longer supports targets earlier than iOS 3.2" - #endif - -#elif JUCE_LINUX - #ifndef JUCE_USE_FREETYPE - #define JUCE_USE_FREETYPE 1 - #endif - - #if ! JUCE_USE_FREETYPE_AMALGAMATED - #include - #include FT_FREETYPE_H - #endif -#endif - -#if JUCE_USE_FREETYPE && JUCE_USE_FREETYPE_AMALGAMATED - #include "native/freetype/FreeTypeAmalgam.h" -#endif - -#undef SIZEOF - -#if (JUCE_MAC || JUCE_IOS) && USE_COREGRAPHICS_RENDERING && JUCE_USE_COREIMAGE_LOADER - #define JUCE_USING_COREIMAGE_LOADER 1 -#else - #define JUCE_USING_COREIMAGE_LOADER 0 -#endif - -//============================================================================== -namespace juce -{ - -#include "colour/juce_Colour.cpp" -#include "colour/juce_ColourGradient.cpp" -#include "colour/juce_Colours.cpp" -#include "colour/juce_FillType.cpp" -#include "geometry/juce_AffineTransform.cpp" -#include "geometry/juce_EdgeTable.cpp" -#include "geometry/juce_Path.cpp" -#include "geometry/juce_PathIterator.cpp" -#include "geometry/juce_PathStrokeType.cpp" -#include "placement/juce_RectanglePlacement.cpp" -#include "contexts/juce_GraphicsContext.cpp" -#include "contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" -#include "contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" -#include "images/juce_Image.cpp" -#include "images/juce_ImageCache.cpp" -#include "images/juce_ImageConvolutionKernel.cpp" -#include "images/juce_ImageFileFormat.cpp" -#include "image_formats/juce_GIFLoader.cpp" -#include "image_formats/juce_JPEGLoader.cpp" -#include "image_formats/juce_PNGLoader.cpp" -#include "fonts/juce_AttributedString.cpp" -#include "fonts/juce_Typeface.cpp" -#include "fonts/juce_CustomTypeface.cpp" -#include "fonts/juce_Font.cpp" -#include "fonts/juce_GlyphArrangement.cpp" -#include "fonts/juce_TextLayout.cpp" -#include "effects/juce_DropShadowEffect.cpp" -#include "effects/juce_GlowEffect.cpp" - -#if JUCE_USE_FREETYPE - #include "native/juce_freetype_Fonts.cpp" -#endif - -//============================================================================== -#if JUCE_MAC || JUCE_IOS - #include "../juce_core/native/juce_osx_ObjCHelpers.h" - #include "native/juce_mac_CoreGraphicsHelpers.h" - #include "native/juce_mac_Fonts.mm" - #include "native/juce_mac_CoreGraphicsContext.mm" - -#elif JUCE_WINDOWS - #include "../juce_core/native/juce_win32_ComSmartPtr.h" - #include "native/juce_win32_DirectWriteTypeface.cpp" - #include "native/juce_win32_DirectWriteTypeLayout.cpp" - #include "native/juce_win32_Fonts.cpp" - #if JUCE_DIRECT2D - #include "native/juce_win32_Direct2DGraphicsContext.cpp" - #endif - -#elif JUCE_LINUX - #include "native/juce_linux_Fonts.cpp" - -#elif JUCE_ANDROID - #include "../juce_core/native/juce_android_JNIHelpers.h" - #include "native/juce_android_GraphicsContext.cpp" - #include "native/juce_android_Fonts.cpp" - -#endif -} - -//============================================================================== -#if JUCE_USE_FREETYPE && JUCE_USE_FREETYPE_AMALGAMATED - #undef PIXEL_MASK - #undef ZLIB_VERSION - #undef Z_ASCII - #undef ZEXTERN - #undef ZEXPORT - - extern "C" - { - #include "native/freetype/FreeTypeAmalgam.c" - } -#endif diff --git a/JuceLibraryCode/modules/juce_graphics/juce_graphics.h b/JuceLibraryCode/modules/juce_graphics/juce_graphics.h deleted file mode 100755 index 912f925..0000000 --- a/JuceLibraryCode/modules/juce_graphics/juce_graphics.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_GRAPHICS_H_INCLUDED // %% -#define JUCE_GRAPHICS_H_INCLUDED - -#include "../juce_core/juce_core.h" -#include "../juce_events/juce_events.h" - -//============================================================================= -/** Config: JUCE_USE_COREIMAGE_LOADER - - On OSX, enabling this flag means that the CoreImage codecs will be used to load - PNG/JPEG/GIF files. It is enabled by default, but you may want to disable it if - you'd rather use libpng, libjpeg, etc. -*/ -#ifndef JUCE_USE_COREIMAGE_LOADER - #define JUCE_USE_COREIMAGE_LOADER 1 -#endif - -/** Config: JUCE_USE_DIRECTWRITE - - Enabling this flag means that DirectWrite will be used when available for font - management and layout. -*/ -#ifndef JUCE_USE_DIRECTWRITE - #define JUCE_USE_DIRECTWRITE 1 -#endif - -#ifndef JUCE_INCLUDE_PNGLIB_CODE - #define JUCE_INCLUDE_PNGLIB_CODE 1 -#endif - -#ifndef JUCE_INCLUDE_JPEGLIB_CODE - #define JUCE_INCLUDE_JPEGLIB_CODE 1 -#endif - -#ifndef USE_COREGRAPHICS_RENDERING - #define USE_COREGRAPHICS_RENDERING 0 -#endif - -//============================================================================= -namespace juce -{ - -class Image; -class AffineTransform; -class Path; -class Font; -class Graphics; -class FillType; -class LowLevelGraphicsContext; - -#include "geometry/juce_AffineTransform.h" -#include "geometry/juce_Point.h" -#include "geometry/juce_Line.h" -#include "geometry/juce_Rectangle.h" -#include "placement/juce_Justification.h" -#include "geometry/juce_Path.h" -#include "geometry/juce_RectangleList.h" -#include "colour/juce_PixelFormats.h" -#include "colour/juce_Colour.h" -#include "colour/juce_ColourGradient.h" -#include "colour/juce_Colours.h" -#include "geometry/juce_BorderSize.h" -#include "geometry/juce_EdgeTable.h" -#include "geometry/juce_PathIterator.h" -#include "geometry/juce_PathStrokeType.h" -#include "placement/juce_RectanglePlacement.h" -#include "images/juce_ImageCache.h" -#include "images/juce_ImageConvolutionKernel.h" -#include "images/juce_ImageFileFormat.h" -#include "fonts/juce_AttributedString.h" -#include "fonts/juce_Typeface.h" -#include "fonts/juce_Font.h" -#include "fonts/juce_GlyphArrangement.h" -#include "fonts/juce_TextLayout.h" -#include "fonts/juce_CustomTypeface.h" -#include "contexts/juce_GraphicsContext.h" -#include "contexts/juce_LowLevelGraphicsContext.h" -#include "images/juce_Image.h" -#include "colour/juce_FillType.h" -#include "native/juce_RenderingHelpers.h" -#include "contexts/juce_LowLevelGraphicsSoftwareRenderer.h" -#include "contexts/juce_LowLevelGraphicsPostScriptRenderer.h" -#include "effects/juce_ImageEffectFilter.h" -#include "effects/juce_DropShadowEffect.h" -#include "effects/juce_GlowEffect.h" - -} - -#endif // JUCE_GRAPHICS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm b/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm deleted file mode 100755 index b36b0ed..0000000 --- a/JuceLibraryCode/modules/juce_graphics/juce_graphics.mm +++ /dev/null @@ -1,25 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#include "juce_graphics.cpp" diff --git a/JuceLibraryCode/modules/juce_graphics/juce_module_info b/JuceLibraryCode/modules/juce_graphics/juce_module_info deleted file mode 100755 index ab4d71b..0000000 --- a/JuceLibraryCode/modules/juce_graphics/juce_module_info +++ /dev/null @@ -1,30 +0,0 @@ -{ - "id": "juce_graphics", - "name": "JUCE graphics classes", - "version": "3.1.1", - "description": "Classes for 2D vector graphics, image loading/saving, font handling, etc.", - "website": "http://www.juce.com/juce", - "license": "GPL/Commercial", - - "dependencies": [ { "id": "juce_core", "version": "matching" }, - { "id": "juce_events", "version": "matching" } ], - - "include": "juce_graphics.h", - - "compile": [ { "file": "juce_graphics.cpp", "target": "! xcode" }, - { "file": "juce_graphics.mm", "target": "xcode" } ], - - "browse": [ "colour/*", - "contexts/*", - "images/*", - "image_formats/*", - "geometry/*", - "placement/*", - "fonts/*", - "effects/*", - "native/*" ], - - "OSXFrameworks": "Cocoa QuartzCore", - "iOSFrameworks": "CoreGraphics CoreText QuartzCore", - "LinuxLibs": "X11 Xinerama Xext freetype" -} diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h b/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h deleted file mode 100755 index ad08e9f..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_RenderingHelpers.h +++ /dev/null @@ -1,2682 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_RENDERINGHELPERS_H_INCLUDED -#define JUCE_RENDERINGHELPERS_H_INCLUDED - -#if JUCE_MSVC - #pragma warning (push) - #pragma warning (disable: 4127) // "expression is constant" warning -#endif - -namespace RenderingHelpers -{ - -//============================================================================== -/** Holds either a simple integer translation, or an affine transform. -*/ -class TranslationOrTransform -{ -public: - TranslationOrTransform (Point origin) noexcept - : offset (origin), isOnlyTranslated (true), isRotated (false) - { - } - - TranslationOrTransform (const TranslationOrTransform& other) noexcept - : complexTransform (other.complexTransform), offset (other.offset), - isOnlyTranslated (other.isOnlyTranslated), isRotated (other.isRotated) - { - } - - AffineTransform getTransform() const noexcept - { - return isOnlyTranslated ? AffineTransform::translation (offset) - : complexTransform; - } - - AffineTransform getTransformWith (const AffineTransform& userTransform) const noexcept - { - return isOnlyTranslated ? userTransform.translated (offset) - : userTransform.followedBy (complexTransform); - } - - void setOrigin (Point delta) noexcept - { - if (isOnlyTranslated) - offset += delta; - else - complexTransform = AffineTransform::translation (delta) - .followedBy (complexTransform); - } - - void addTransform (const AffineTransform& t) noexcept - { - if (isOnlyTranslated && t.isOnlyTranslation()) - { - const int tx = (int) (t.getTranslationX() * 256.0f); - const int ty = (int) (t.getTranslationY() * 256.0f); - - if (((tx | ty) & 0xf8) == 0) - { - offset += Point (tx >> 8, ty >> 8); - return; - } - } - - complexTransform = getTransformWith (t); - isOnlyTranslated = false; - isRotated = (complexTransform.mat01 != 0 || complexTransform.mat10 != 0 - || complexTransform.mat00 < 0 || complexTransform.mat11 < 0); - } - - float getPhysicalPixelScaleFactor() const noexcept - { - return isOnlyTranslated ? 1.0f : std::abs (complexTransform.getScaleFactor()); - } - - void moveOriginInDeviceSpace (Point delta) noexcept - { - if (isOnlyTranslated) - offset += delta; - else - complexTransform = complexTransform.translated (delta); - } - - Rectangle translated (const Rectangle& r) const noexcept - { - jassert (isOnlyTranslated); - return r + offset; - } - - Rectangle translated (const Rectangle& r) const noexcept - { - jassert (isOnlyTranslated); - return r + offset.toFloat(); - } - - template - RectangleOrPoint transformed (const RectangleOrPoint& r) const noexcept - { - jassert (! isOnlyTranslated); - return r.transformedBy (complexTransform); - } - - template - Rectangle deviceSpaceToUserSpace (const Rectangle& r) const noexcept - { - return isOnlyTranslated ? r - offset - : r.transformedBy (complexTransform.inverted()); - } - - AffineTransform complexTransform; - Point offset; - bool isOnlyTranslated, isRotated; -}; - -//============================================================================== -/** Holds a cache of recently-used glyph objects of some type. */ -template -class GlyphCache : private DeletedAtShutdown -{ -public: - GlyphCache() - { - reset(); - } - - ~GlyphCache() - { - getSingletonPointer() = nullptr; - } - - static GlyphCache& getInstance() - { - GlyphCache*& g = getSingletonPointer(); - - if (g == nullptr) - g = new GlyphCache(); - - return *g; - } - - //============================================================================== - void reset() - { - const ScopedLock sl (lock); - glyphs.clear(); - addNewGlyphSlots (120); - hits.set (0); - misses.set (0); - } - - void drawGlyph (RenderTargetType& target, const Font& font, const int glyphNumber, Point pos) - { - if (ReferenceCountedObjectPtr glyph = findOrCreateGlyph (font, glyphNumber)) - { - glyph->lastAccessCount = ++accessCounter; - glyph->draw (target, pos); - } - } - - ReferenceCountedObjectPtr findOrCreateGlyph (const Font& font, int glyphNumber) - { - const ScopedLock sl (lock); - - if (CachedGlyphType* g = findExistingGlyph (font, glyphNumber)) - { - ++hits; - return g; - } - - ++misses; - CachedGlyphType* g = getGlyphForReuse(); - jassert (g != nullptr); - g->generate (font, glyphNumber); - return g; - } - -private: - friend struct ContainerDeletePolicy; - ReferenceCountedArray glyphs; - Atomic accessCounter, hits, misses; - CriticalSection lock; - - CachedGlyphType* findExistingGlyph (const Font& font, int glyphNumber) const - { - for (int i = 0; i < glyphs.size(); ++i) - { - CachedGlyphType* const g = glyphs.getUnchecked (i); - - if (g->glyph == glyphNumber && g->font == font) - return g; - } - - return nullptr; - } - - CachedGlyphType* getGlyphForReuse() - { - if (hits.value + misses.value > glyphs.size() * 16) - { - if (misses.value * 2 > hits.value) - addNewGlyphSlots (32); - - hits.set (0); - misses.set (0); - } - - if (CachedGlyphType* g = findLeastRecentlyUsedGlyph()) - return g; - - addNewGlyphSlots (32); - return glyphs.getLast(); - } - - void addNewGlyphSlots (int num) - { - glyphs.ensureStorageAllocated (glyphs.size() + num); - - while (--num >= 0) - glyphs.add (new CachedGlyphType()); - } - - CachedGlyphType* findLeastRecentlyUsedGlyph() const noexcept - { - CachedGlyphType* oldest = nullptr; - int oldestCounter = std::numeric_limits::max(); - - for (int i = glyphs.size() - 1; --i >= 0;) - { - CachedGlyphType* const glyph = glyphs.getUnchecked(i); - - if (glyph->lastAccessCount <= oldestCounter - && glyph->getReferenceCount() == 1) - { - oldestCounter = glyph->lastAccessCount; - oldest = glyph; - } - } - - return oldest; - } - - static GlyphCache*& getSingletonPointer() noexcept - { - static GlyphCache* g = nullptr; - return g; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GlyphCache) -}; - -//============================================================================== -/** Caches a glyph as an edge-table. */ -template -class CachedGlyphEdgeTable : public ReferenceCountedObject -{ -public: - CachedGlyphEdgeTable() : glyph (0), lastAccessCount (0) {} - - void draw (RendererType& state, Point pos) const - { - if (snapToIntegerCoordinate) - pos.x = std::floor (pos.x + 0.5f); - - if (edgeTable != nullptr) - state.fillEdgeTable (*edgeTable, pos.x, roundToInt (pos.y)); - } - - void generate (const Font& newFont, const int glyphNumber) - { - font = newFont; - Typeface* const typeface = newFont.getTypeface(); - snapToIntegerCoordinate = typeface->isHinted(); - glyph = glyphNumber; - - const float fontHeight = font.getHeight(); - edgeTable = typeface->getEdgeTableForGlyph (glyphNumber, - AffineTransform::scale (fontHeight * font.getHorizontalScale(), - fontHeight), fontHeight); - } - - Font font; - ScopedPointer edgeTable; - int glyph, lastAccessCount; - bool snapToIntegerCoordinate; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CachedGlyphEdgeTable) -}; - -//============================================================================== -/** Calculates the alpha values and positions for rendering the edges of a - non-pixel-aligned rectangle. -*/ -struct FloatRectangleRasterisingInfo -{ - FloatRectangleRasterisingInfo (const Rectangle& area) - : left (roundToInt (256.0f * area.getX())), - top (roundToInt (256.0f * area.getY())), - right (roundToInt (256.0f * area.getRight())), - bottom (roundToInt (256.0f * area.getBottom())) - { - if ((top >> 8) == (bottom >> 8)) - { - topAlpha = bottom - top; - bottomAlpha = 0; - totalTop = top >> 8; - totalBottom = bottom = top = totalTop + 1; - } - else - { - if ((top & 255) == 0) - { - topAlpha = 0; - top = totalTop = (top >> 8); - } - else - { - topAlpha = 255 - (top & 255); - totalTop = (top >> 8); - top = totalTop + 1; - } - - bottomAlpha = bottom & 255; - bottom >>= 8; - totalBottom = bottom + (bottomAlpha != 0 ? 1 : 0); - } - - if ((left >> 8) == (right >> 8)) - { - leftAlpha = right - left; - rightAlpha = 0; - totalLeft = (left >> 8); - totalRight = right = left = totalLeft + 1; - } - else - { - if ((left & 255) == 0) - { - leftAlpha = 0; - left = totalLeft = (left >> 8); - } - else - { - leftAlpha = 255 - (left & 255); - totalLeft = (left >> 8); - left = totalLeft + 1; - } - - rightAlpha = right & 255; - right >>= 8; - totalRight = right + (rightAlpha != 0 ? 1 : 0); - } - } - - template - void iterate (Callback& callback) const - { - if (topAlpha != 0) callback (totalLeft, totalTop, totalRight - totalLeft, 1, topAlpha); - if (bottomAlpha != 0) callback (totalLeft, bottom, totalRight - totalLeft, 1, bottomAlpha); - if (leftAlpha != 0) callback (totalLeft, totalTop, 1, totalBottom - totalTop, leftAlpha); - if (rightAlpha != 0) callback (right, totalTop, 1, totalBottom - totalTop, rightAlpha); - - callback (left, top, right - left, bottom - top, 255); - } - - inline bool isOnePixelWide() const noexcept { return right - left == 1 && leftAlpha + rightAlpha == 0; } - - inline int getTopLeftCornerAlpha() const noexcept { return (topAlpha * leftAlpha) >> 8; } - inline int getTopRightCornerAlpha() const noexcept { return (topAlpha * rightAlpha) >> 8; } - inline int getBottomLeftCornerAlpha() const noexcept { return (bottomAlpha * leftAlpha) >> 8; } - inline int getBottomRightCornerAlpha() const noexcept { return (bottomAlpha * rightAlpha) >> 8; } - - //============================================================================== - int left, top, right, bottom; // bounds of the solid central area, excluding anti-aliased edges - int totalTop, totalLeft, totalBottom, totalRight; // bounds of the total area, including edges - int topAlpha, leftAlpha, bottomAlpha, rightAlpha; // alpha of each anti-aliased edge -}; - -//============================================================================== -/** Contains classes for calculating the colour of pixels within various types of gradient. */ -namespace GradientPixelIterators -{ - /** Iterates the colour of pixels in a linear gradient */ - class Linear - { - public: - Linear (const ColourGradient& gradient, const AffineTransform& transform, - const PixelARGB* const colours, const int numColours) - : lookupTable (colours), - numEntries (numColours) - { - jassert (numColours >= 0); - Point p1 (gradient.point1); - Point p2 (gradient.point2); - - if (! transform.isIdentity()) - { - const Line l (p2, p1); - Point p3 = l.getPointAlongLine (0.0f, 100.0f); - - p1.applyTransform (transform); - p2.applyTransform (transform); - p3.applyTransform (transform); - - p2 = Line (p2, p3).findNearestPointTo (p1); - } - - vertical = std::abs (p1.x - p2.x) < 0.001f; - horizontal = std::abs (p1.y - p2.y) < 0.001f; - - if (vertical) - { - scale = roundToInt ((numEntries << (int) numScaleBits) / (double) (p2.y - p1.y)); - start = roundToInt (p1.y * scale); - } - else if (horizontal) - { - scale = roundToInt ((numEntries << (int) numScaleBits) / (double) (p2.x - p1.x)); - start = roundToInt (p1.x * scale); - } - else - { - grad = (p2.getY() - p1.y) / (double) (p1.x - p2.x); - yTerm = p1.getY() - p1.x / grad; - scale = roundToInt ((numEntries << (int) numScaleBits) / (yTerm * grad - (p2.y * grad - p2.x))); - grad *= scale; - } - } - - forcedinline void setY (const int y) noexcept - { - if (vertical) - linePix = lookupTable [jlimit (0, numEntries, (y * scale - start) >> (int) numScaleBits)]; - else if (! horizontal) - start = roundToInt ((y - yTerm) * grad); - } - - inline PixelARGB getPixel (const int x) const noexcept - { - return vertical ? linePix - : lookupTable [jlimit (0, numEntries, (x * scale - start) >> (int) numScaleBits)]; - } - - private: - const PixelARGB* const lookupTable; - const int numEntries; - PixelARGB linePix; - int start, scale; - double grad, yTerm; - bool vertical, horizontal; - enum { numScaleBits = 12 }; - - JUCE_DECLARE_NON_COPYABLE (Linear) - }; - - //============================================================================== - /** Iterates the colour of pixels in a circular radial gradient */ - class Radial - { - public: - Radial (const ColourGradient& gradient, const AffineTransform&, - const PixelARGB* const colours, const int numColours) - : lookupTable (colours), - numEntries (numColours), - gx1 (gradient.point1.x), - gy1 (gradient.point1.y) - { - jassert (numColours >= 0); - const Point diff (gradient.point1 - gradient.point2); - maxDist = diff.x * diff.x + diff.y * diff.y; - invScale = numEntries / std::sqrt (maxDist); - jassert (roundToInt (std::sqrt (maxDist) * invScale) <= numEntries); - } - - forcedinline void setY (const int y) noexcept - { - dy = y - gy1; - dy *= dy; - } - - inline PixelARGB getPixel (const int px) const noexcept - { - double x = px - gx1; - x *= x; - x += dy; - - return lookupTable [x >= maxDist ? numEntries : roundToInt (std::sqrt (x) * invScale)]; - } - - protected: - const PixelARGB* const lookupTable; - const int numEntries; - const double gx1, gy1; - double maxDist, invScale, dy; - - JUCE_DECLARE_NON_COPYABLE (Radial) - }; - - //============================================================================== - /** Iterates the colour of pixels in a skewed radial gradient */ - class TransformedRadial : public Radial - { - public: - TransformedRadial (const ColourGradient& gradient, const AffineTransform& transform, - const PixelARGB* const colours, const int numColours) - : Radial (gradient, transform, colours, numColours), - inverseTransform (transform.inverted()) - { - tM10 = inverseTransform.mat10; - tM00 = inverseTransform.mat00; - } - - forcedinline void setY (const int y) noexcept - { - lineYM01 = inverseTransform.mat01 * y + inverseTransform.mat02 - gx1; - lineYM11 = inverseTransform.mat11 * y + inverseTransform.mat12 - gy1; - } - - inline PixelARGB getPixel (const int px) const noexcept - { - double x = px; - const double y = tM10 * x + lineYM11; - x = tM00 * x + lineYM01; - x *= x; - x += y * y; - - if (x >= maxDist) - return lookupTable [numEntries]; - - return lookupTable [jmin (numEntries, roundToInt (std::sqrt (x) * invScale))]; - } - - private: - double tM10, tM00, lineYM01, lineYM11; - const AffineTransform inverseTransform; - - JUCE_DECLARE_NON_COPYABLE (TransformedRadial) - }; -} - -#define JUCE_PERFORM_PIXEL_OP_LOOP(op) \ -{ \ - const int destStride = destData.pixelStride; \ - do { dest->op; dest = addBytesToPointer (dest, destStride); } while (--width > 0); \ -} - -//============================================================================== -/** Contains classes for filling edge tables with various fill types. */ -namespace EdgeTableFillers -{ - /** Fills an edge-table with a solid colour. */ - template - class SolidColour - { - public: - SolidColour (const Image::BitmapData& image, const PixelARGB colour) - : destData (image), sourceColour (colour) - { - if (sizeof (PixelType) == 3 && destData.pixelStride == sizeof (PixelType)) - { - areRGBComponentsEqual = sourceColour.getRed() == sourceColour.getGreen() - && sourceColour.getGreen() == sourceColour.getBlue(); - filler[0].set (sourceColour); - filler[1].set (sourceColour); - filler[2].set (sourceColour); - filler[3].set (sourceColour); - } - else - { - areRGBComponentsEqual = false; - } - } - - forcedinline void setEdgeTableYPos (const int y) noexcept - { - linePixels = (PixelType*) destData.getLinePointer (y); - } - - forcedinline void handleEdgeTablePixel (const int x, const int alphaLevel) const noexcept - { - if (replaceExisting) - getPixel (x)->set (sourceColour); - else - getPixel (x)->blend (sourceColour, (uint32) alphaLevel); - } - - forcedinline void handleEdgeTablePixelFull (const int x) const noexcept - { - if (replaceExisting) - getPixel (x)->set (sourceColour); - else - getPixel (x)->blend (sourceColour); - } - - forcedinline void handleEdgeTableLine (const int x, const int width, const int alphaLevel) const noexcept - { - PixelARGB p (sourceColour); - p.multiplyAlpha (alphaLevel); - - PixelType* dest = getPixel (x); - - if (replaceExisting || p.getAlpha() >= 0xff) - replaceLine (dest, p, width); - else - blendLine (dest, p, width); - } - - forcedinline void handleEdgeTableLineFull (const int x, const int width) const noexcept - { - PixelType* dest = getPixel (x); - - if (replaceExisting || sourceColour.getAlpha() >= 0xff) - replaceLine (dest, sourceColour, width); - else - blendLine (dest, sourceColour, width); - } - - private: - const Image::BitmapData& destData; - PixelType* linePixels; - PixelARGB sourceColour; - PixelRGB filler [4]; - bool areRGBComponentsEqual; - - forcedinline PixelType* getPixel (const int x) const noexcept - { - return addBytesToPointer (linePixels, x * destData.pixelStride); - } - - inline void blendLine (PixelType* dest, const PixelARGB colour, int width) const noexcept - { - JUCE_PERFORM_PIXEL_OP_LOOP (blend (colour)) - } - - forcedinline void replaceLine (PixelRGB* dest, const PixelARGB colour, int width) const noexcept - { - if (destData.pixelStride == sizeof (*dest)) - { - if (areRGBComponentsEqual) // if all the component values are the same, we can cheat.. - { - memset (dest, colour.getRed(), (size_t) width * 3); - } - else - { - if (width >> 5) - { - const int* const intFiller = reinterpret_cast (filler); - - while (width > 8 && (((pointer_sized_int) dest) & 7) != 0) - { - dest->set (colour); - ++dest; - --width; - } - - while (width > 4) - { - int* d = reinterpret_cast (dest); - *d++ = intFiller[0]; - *d++ = intFiller[1]; - *d++ = intFiller[2]; - dest = reinterpret_cast (d); - width -= 4; - } - } - - while (--width >= 0) - { - dest->set (colour); - ++dest; - } - } - } - else - { - JUCE_PERFORM_PIXEL_OP_LOOP (set (colour)) - } - } - - forcedinline void replaceLine (PixelAlpha* dest, const PixelARGB colour, int width) const noexcept - { - if (destData.pixelStride == sizeof (*dest)) - memset (dest, colour.getAlpha(), (size_t) width); - else - JUCE_PERFORM_PIXEL_OP_LOOP (setAlpha (colour.getAlpha())) - } - - forcedinline void replaceLine (PixelARGB* dest, const PixelARGB colour, int width) const noexcept - { - JUCE_PERFORM_PIXEL_OP_LOOP (set (colour)) - } - - JUCE_DECLARE_NON_COPYABLE (SolidColour) - }; - - //============================================================================== - /** Fills an edge-table with a gradient. */ - template - class Gradient : public GradientType - { - public: - Gradient (const Image::BitmapData& dest, const ColourGradient& gradient, const AffineTransform& transform, - const PixelARGB* const colours, const int numColours) - : GradientType (gradient, transform, colours, numColours - 1), - destData (dest) - { - } - - forcedinline void setEdgeTableYPos (const int y) noexcept - { - linePixels = (PixelType*) destData.getLinePointer (y); - GradientType::setY (y); - } - - forcedinline void handleEdgeTablePixel (const int x, const int alphaLevel) const noexcept - { - getPixel (x)->blend (GradientType::getPixel (x), (uint32) alphaLevel); - } - - forcedinline void handleEdgeTablePixelFull (const int x) const noexcept - { - getPixel (x)->blend (GradientType::getPixel (x)); - } - - void handleEdgeTableLine (int x, int width, const int alphaLevel) const noexcept - { - PixelType* dest = getPixel (x); - - if (alphaLevel < 0xff) - JUCE_PERFORM_PIXEL_OP_LOOP (blend (GradientType::getPixel (x++), (uint32) alphaLevel)) - else - JUCE_PERFORM_PIXEL_OP_LOOP (blend (GradientType::getPixel (x++))) - } - - void handleEdgeTableLineFull (int x, int width) const noexcept - { - PixelType* dest = getPixel (x); - JUCE_PERFORM_PIXEL_OP_LOOP (blend (GradientType::getPixel (x++))) - } - - private: - const Image::BitmapData& destData; - PixelType* linePixels; - - forcedinline PixelType* getPixel (const int x) const noexcept - { - return addBytesToPointer (linePixels, x * destData.pixelStride); - } - - JUCE_DECLARE_NON_COPYABLE (Gradient) - }; - - //============================================================================== - /** Fills an edge-table with a non-transformed image. */ - template - class ImageFill - { - public: - ImageFill (const Image::BitmapData& dest, const Image::BitmapData& src, - const int alpha, const int x, const int y) - : destData (dest), - srcData (src), - extraAlpha (alpha + 1), - xOffset (repeatPattern ? negativeAwareModulo (x, src.width) - src.width : x), - yOffset (repeatPattern ? negativeAwareModulo (y, src.height) - src.height : y) - { - } - - forcedinline void setEdgeTableYPos (int y) noexcept - { - linePixels = (DestPixelType*) destData.getLinePointer (y); - - y -= yOffset; - if (repeatPattern) - { - jassert (y >= 0); - y %= srcData.height; - } - - sourceLineStart = (SrcPixelType*) srcData.getLinePointer (y); - } - - forcedinline void handleEdgeTablePixel (const int x, int alphaLevel) const noexcept - { - alphaLevel = (alphaLevel * extraAlpha) >> 8; - - getDestPixel (x)->blend (*getSrcPixel (repeatPattern ? ((x - xOffset) % srcData.width) : (x - xOffset)), (uint32) alphaLevel); - } - - forcedinline void handleEdgeTablePixelFull (const int x) const noexcept - { - getDestPixel (x)->blend (*getSrcPixel (repeatPattern ? ((x - xOffset) % srcData.width) : (x - xOffset)), (uint32) extraAlpha); - } - - void handleEdgeTableLine (int x, int width, int alphaLevel) const noexcept - { - DestPixelType* dest = getDestPixel (x); - alphaLevel = (alphaLevel * extraAlpha) >> 8; - x -= xOffset; - - if (repeatPattern) - { - if (alphaLevel < 0xfe) - JUCE_PERFORM_PIXEL_OP_LOOP (blend (*getSrcPixel (x++ % srcData.width), (uint32) alphaLevel)) - else - JUCE_PERFORM_PIXEL_OP_LOOP (blend (*getSrcPixel (x++ % srcData.width))) - } - else - { - jassert (x >= 0 && x + width <= srcData.width); - - if (alphaLevel < 0xfe) - JUCE_PERFORM_PIXEL_OP_LOOP (blend (*getSrcPixel (x++), (uint32) alphaLevel)) - else - copyRow (dest, getSrcPixel (x), width); - } - } - - void handleEdgeTableLineFull (int x, int width) const noexcept - { - DestPixelType* dest = getDestPixel (x); - x -= xOffset; - - if (repeatPattern) - { - if (extraAlpha < 0xfe) - JUCE_PERFORM_PIXEL_OP_LOOP (blend (*getSrcPixel (x++ % srcData.width), (uint32) extraAlpha)) - else - JUCE_PERFORM_PIXEL_OP_LOOP (blend (*getSrcPixel (x++ % srcData.width))) - } - else - { - jassert (x >= 0 && x + width <= srcData.width); - - if (extraAlpha < 0xfe) - JUCE_PERFORM_PIXEL_OP_LOOP (blend (*getSrcPixel (x++), (uint32) extraAlpha)) - else - copyRow (dest, getSrcPixel (x), width); - } - } - - void clipEdgeTableLine (EdgeTable& et, int x, int y, int width) - { - jassert (x - xOffset >= 0 && x + width - xOffset <= srcData.width); - SrcPixelType* s = (SrcPixelType*) srcData.getLinePointer (y - yOffset); - uint8* mask = (uint8*) (s + x - xOffset); - - if (sizeof (SrcPixelType) == sizeof (PixelARGB)) - mask += PixelARGB::indexA; - - et.clipLineToMask (x, y, mask, sizeof (SrcPixelType), width); - } - - private: - const Image::BitmapData& destData; - const Image::BitmapData& srcData; - const int extraAlpha, xOffset, yOffset; - DestPixelType* linePixels; - SrcPixelType* sourceLineStart; - - forcedinline DestPixelType* getDestPixel (int const x) const noexcept - { - return addBytesToPointer (linePixels, x * destData.pixelStride); - } - - forcedinline SrcPixelType const* getSrcPixel (int const x) const noexcept - { - return addBytesToPointer (sourceLineStart, x * srcData.pixelStride); - } - - forcedinline void copyRow (DestPixelType* dest, SrcPixelType const* src, int width) const noexcept - { - const int destStride = destData.pixelStride; - const int srcStride = srcData.pixelStride; - - if (destStride == srcStride - && srcData.pixelFormat == Image::RGB - && destData.pixelFormat == Image::RGB) - { - memcpy (dest, src, (size_t) (width * srcStride)); - } - else - { - do - { - dest->blend (*src); - dest = addBytesToPointer (dest, destStride); - src = addBytesToPointer (src, srcStride); - } while (--width > 0); - } - } - - JUCE_DECLARE_NON_COPYABLE (ImageFill) - }; - - //============================================================================== - /** Fills an edge-table with a transformed image. */ - template - class TransformedImageFill - { - public: - TransformedImageFill (const Image::BitmapData& dest, const Image::BitmapData& src, - const AffineTransform& transform, const int alpha, const Graphics::ResamplingQuality q) - : interpolator (transform, - q != Graphics::lowResamplingQuality ? 0.5f : 0.0f, - q != Graphics::lowResamplingQuality ? -128 : 0), - destData (dest), - srcData (src), - extraAlpha (alpha + 1), - quality (q), - maxX (src.width - 1), - maxY (src.height - 1), - scratchSize (2048) - { - scratchBuffer.malloc (scratchSize); - } - - forcedinline void setEdgeTableYPos (const int newY) noexcept - { - y = newY; - linePixels = (DestPixelType*) destData.getLinePointer (newY); - } - - forcedinline void handleEdgeTablePixel (const int x, const int alphaLevel) noexcept - { - SrcPixelType p; - generate (&p, x, 1); - - getDestPixel (x)->blend (p, (uint32) (alphaLevel * extraAlpha) >> 8); - } - - forcedinline void handleEdgeTablePixelFull (const int x) noexcept - { - SrcPixelType p; - generate (&p, x, 1); - - getDestPixel (x)->blend (p, (uint32) extraAlpha); - } - - void handleEdgeTableLine (const int x, int width, int alphaLevel) noexcept - { - if (width > (int) scratchSize) - { - scratchSize = (size_t) width; - scratchBuffer.malloc (scratchSize); - } - - SrcPixelType* span = scratchBuffer; - generate (span, x, width); - - DestPixelType* dest = getDestPixel (x); - alphaLevel *= extraAlpha; - alphaLevel >>= 8; - - if (alphaLevel < 0xfe) - JUCE_PERFORM_PIXEL_OP_LOOP (blend (*span++, (uint32) alphaLevel)) - else - JUCE_PERFORM_PIXEL_OP_LOOP (blend (*span++)) - } - - forcedinline void handleEdgeTableLineFull (const int x, int width) noexcept - { - handleEdgeTableLine (x, width, 255); - } - - void clipEdgeTableLine (EdgeTable& et, int x, int y_, int width) - { - if (width > (int) scratchSize) - { - scratchSize = (size_t) width; - scratchBuffer.malloc (scratchSize); - } - - y = y_; - generate (scratchBuffer.getData(), x, width); - - et.clipLineToMask (x, y_, - reinterpret_cast (scratchBuffer.getData()) + SrcPixelType::indexA, - sizeof (SrcPixelType), width); - } - - private: - forcedinline DestPixelType* getDestPixel (const int x) const noexcept - { - return addBytesToPointer (linePixels, x * destData.pixelStride); - } - - //============================================================================== - template - void generate (PixelType* dest, const int x, int numPixels) noexcept - { - this->interpolator.setStartOfLine ((float) x, (float) y, numPixels); - - do - { - int hiResX, hiResY; - this->interpolator.next (hiResX, hiResY); - - int loResX = hiResX >> 8; - int loResY = hiResY >> 8; - - if (repeatPattern) - { - loResX = negativeAwareModulo (loResX, srcData.width); - loResY = negativeAwareModulo (loResY, srcData.height); - } - - if (quality != Graphics::lowResamplingQuality) - { - if (isPositiveAndBelow (loResX, maxX)) - { - if (isPositiveAndBelow (loResY, maxY)) - { - // In the centre of the image.. - render4PixelAverage (dest, this->srcData.getPixelPointer (loResX, loResY), - hiResX & 255, hiResY & 255); - ++dest; - continue; - } - - if (! repeatPattern) - { - // At a top or bottom edge.. - if (loResY < 0) - render2PixelAverageX (dest, this->srcData.getPixelPointer (loResX, 0), hiResX & 255); - else - render2PixelAverageX (dest, this->srcData.getPixelPointer (loResX, maxY), hiResX & 255); - - ++dest; - continue; - } - } - else - { - if (isPositiveAndBelow (loResY, maxY) && ! repeatPattern) - { - // At a left or right hand edge.. - if (loResX < 0) - render2PixelAverageY (dest, this->srcData.getPixelPointer (0, loResY), hiResY & 255); - else - render2PixelAverageY (dest, this->srcData.getPixelPointer (maxX, loResY), hiResY & 255); - - ++dest; - continue; - } - } - } - - if (! repeatPattern) - { - if (loResX < 0) loResX = 0; - if (loResY < 0) loResY = 0; - if (loResX > maxX) loResX = maxX; - if (loResY > maxY) loResY = maxY; - } - - dest->set (*(const PixelType*) this->srcData.getPixelPointer (loResX, loResY)); - ++dest; - - } while (--numPixels > 0); - } - - //============================================================================== - void render4PixelAverage (PixelARGB* const dest, const uint8* src, const int subPixelX, const int subPixelY) noexcept - { - uint32 c[4] = { 256 * 128, 256 * 128, 256 * 128, 256 * 128 }; - - uint32 weight = (uint32) ((256 - subPixelX) * (256 - subPixelY)); - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - c[3] += weight * src[3]; - - src += this->srcData.pixelStride; - - weight = (uint32) (subPixelX * (256 - subPixelY)); - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - c[3] += weight * src[3]; - - src += this->srcData.lineStride; - - weight = (uint32) (subPixelX * subPixelY); - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - c[3] += weight * src[3]; - - src -= this->srcData.pixelStride; - - weight = (uint32) ((256 - subPixelX) * subPixelY); - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - c[3] += weight * src[3]; - - dest->setARGB ((uint8) (c[PixelARGB::indexA] >> 16), - (uint8) (c[PixelARGB::indexR] >> 16), - (uint8) (c[PixelARGB::indexG] >> 16), - (uint8) (c[PixelARGB::indexB] >> 16)); - } - - void render2PixelAverageX (PixelARGB* const dest, const uint8* src, const uint32 subPixelX) noexcept - { - uint32 c[4] = { 128, 128, 128, 128 }; - - uint32 weight = 256 - subPixelX; - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - c[3] += weight * src[3]; - - src += this->srcData.pixelStride; - - weight = subPixelX; - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - c[3] += weight * src[3]; - - dest->setARGB ((uint8) (c[PixelARGB::indexA] >> 8), - (uint8) (c[PixelARGB::indexR] >> 8), - (uint8) (c[PixelARGB::indexG] >> 8), - (uint8) (c[PixelARGB::indexB] >> 8)); - } - - void render2PixelAverageY (PixelARGB* const dest, const uint8* src, const uint32 subPixelY) noexcept - { - uint32 c[4] = { 128, 128, 128, 128 }; - - uint32 weight = 256 - subPixelY; - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - c[3] += weight * src[3]; - - src += this->srcData.lineStride; - - weight = subPixelY; - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - c[3] += weight * src[3]; - - dest->setARGB ((uint8) (c[PixelARGB::indexA] >> 8), - (uint8) (c[PixelARGB::indexR] >> 8), - (uint8) (c[PixelARGB::indexG] >> 8), - (uint8) (c[PixelARGB::indexB] >> 8)); - } - - //============================================================================== - void render4PixelAverage (PixelRGB* const dest, const uint8* src, const uint32 subPixelX, const uint32 subPixelY) noexcept - { - uint32 c[3] = { 256 * 128, 256 * 128, 256 * 128 }; - - uint32 weight = (256 - subPixelX) * (256 - subPixelY); - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - - src += this->srcData.pixelStride; - - weight = subPixelX * (256 - subPixelY); - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - - src += this->srcData.lineStride; - - weight = subPixelX * subPixelY; - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - - src -= this->srcData.pixelStride; - - weight = (256 - subPixelX) * subPixelY; - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - - dest->setARGB ((uint8) 255, - (uint8) (c[PixelRGB::indexR] >> 16), - (uint8) (c[PixelRGB::indexG] >> 16), - (uint8) (c[PixelRGB::indexB] >> 16)); - } - - void render2PixelAverageX (PixelRGB* const dest, const uint8* src, const uint32 subPixelX) noexcept - { - uint32 c[3] = { 128, 128, 128 }; - - const uint32 weight = 256 - subPixelX; - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - - src += this->srcData.pixelStride; - - c[0] += subPixelX * src[0]; - c[1] += subPixelX * src[1]; - c[2] += subPixelX * src[2]; - - dest->setARGB ((uint8) 255, - (uint8) (c[PixelRGB::indexR] >> 8), - (uint8) (c[PixelRGB::indexG] >> 8), - (uint8) (c[PixelRGB::indexB] >> 8)); - } - - void render2PixelAverageY (PixelRGB* const dest, const uint8* src, const uint32 subPixelY) noexcept - { - uint32 c[3] = { 128, 128, 128 }; - - const uint32 weight = 256 - subPixelY; - c[0] += weight * src[0]; - c[1] += weight * src[1]; - c[2] += weight * src[2]; - - src += this->srcData.lineStride; - - c[0] += subPixelY * src[0]; - c[1] += subPixelY * src[1]; - c[2] += subPixelY * src[2]; - - dest->setARGB ((uint8) 255, - (uint8) (c[PixelRGB::indexR] >> 8), - (uint8) (c[PixelRGB::indexG] >> 8), - (uint8) (c[PixelRGB::indexB] >> 8)); - } - - //============================================================================== - void render4PixelAverage (PixelAlpha* const dest, const uint8* src, const uint32 subPixelX, const uint32 subPixelY) noexcept - { - uint32 c = 256 * 128; - c += src[0] * ((256 - subPixelX) * (256 - subPixelY)); - src += this->srcData.pixelStride; - c += src[1] * (subPixelX * (256 - subPixelY)); - src += this->srcData.lineStride; - c += src[1] * (subPixelX * subPixelY); - src -= this->srcData.pixelStride; - - c += src[0] * ((256 - subPixelX) * subPixelY); - - *((uint8*) dest) = (uint8) (c >> 16); - } - - void render2PixelAverageX (PixelAlpha* const dest, const uint8* src, const uint32 subPixelX) noexcept - { - uint32 c = 128; - c += src[0] * (256 - subPixelX); - src += this->srcData.pixelStride; - c += src[0] * subPixelX; - *((uint8*) dest) = (uint8) (c >> 8); - } - - void render2PixelAverageY (PixelAlpha* const dest, const uint8* src, const uint32 subPixelY) noexcept - { - uint32 c = 128; - c += src[0] * (256 - subPixelY); - src += this->srcData.lineStride; - c += src[0] * subPixelY; - *((uint8*) dest) = (uint8) (c >> 8); - } - - //============================================================================== - class TransformedImageSpanInterpolator - { - public: - TransformedImageSpanInterpolator (const AffineTransform& transform, - const float offsetFloat, const int offsetInt) noexcept - : inverseTransform (transform.inverted()), - pixelOffset (offsetFloat), pixelOffsetInt (offsetInt) - {} - - void setStartOfLine (float sx, float sy, const int numPixels) noexcept - { - jassert (numPixels > 0); - - sx += pixelOffset; - sy += pixelOffset; - float x1 = sx, y1 = sy; - sx += numPixels; - inverseTransform.transformPoints (x1, y1, sx, sy); - - xBresenham.set ((int) (x1 * 256.0f), (int) (sx * 256.0f), numPixels, pixelOffsetInt); - yBresenham.set ((int) (y1 * 256.0f), (int) (sy * 256.0f), numPixels, pixelOffsetInt); - } - - void next (int& px, int& py) noexcept - { - px = xBresenham.n; xBresenham.stepToNext(); - py = yBresenham.n; yBresenham.stepToNext(); - } - - private: - class BresenhamInterpolator - { - public: - BresenhamInterpolator() noexcept {} - - void set (const int n1, const int n2, const int steps, const int offsetInt) noexcept - { - numSteps = steps; - step = (n2 - n1) / numSteps; - remainder = modulo = (n2 - n1) % numSteps; - n = n1 + offsetInt; - - if (modulo <= 0) - { - modulo += numSteps; - remainder += numSteps; - --step; - } - - modulo -= numSteps; - } - - forcedinline void stepToNext() noexcept - { - modulo += remainder; - n += step; - - if (modulo > 0) - { - modulo -= numSteps; - ++n; - } - } - - int n; - - private: - int numSteps, step, modulo, remainder; - }; - - const AffineTransform inverseTransform; - BresenhamInterpolator xBresenham, yBresenham; - const float pixelOffset; - const int pixelOffsetInt; - - JUCE_DECLARE_NON_COPYABLE (TransformedImageSpanInterpolator) - }; - - //============================================================================== - TransformedImageSpanInterpolator interpolator; - const Image::BitmapData& destData; - const Image::BitmapData& srcData; - const int extraAlpha; - const Graphics::ResamplingQuality quality; - const int maxX, maxY; - int y; - DestPixelType* linePixels; - HeapBlock scratchBuffer; - size_t scratchSize; - - JUCE_DECLARE_NON_COPYABLE (TransformedImageFill) - }; - - - //============================================================================== - template - void renderImageTransformed (Iterator& iter, const Image::BitmapData& destData, const Image::BitmapData& srcData, - const int alpha, const AffineTransform& transform, Graphics::ResamplingQuality quality, bool tiledFill) - { - switch (destData.pixelFormat) - { - case Image::ARGB: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - else { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - else { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - break; - default: - if (tiledFill) { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - else { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - break; - } - break; - - case Image::RGB: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - else { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - else { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - break; - default: - if (tiledFill) { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - else { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - break; - } - break; - - default: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - else { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - else { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - break; - default: - if (tiledFill) { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - else { TransformedImageFill r (destData, srcData, transform, alpha, quality); iter.iterate (r); } - break; - } - break; - } - } - - template - void renderImageUntransformed (Iterator& iter, const Image::BitmapData& destData, const Image::BitmapData& srcData, const int alpha, int x, int y, bool tiledFill) - { - switch (destData.pixelFormat) - { - case Image::ARGB: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - default: - if (tiledFill) { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - } - break; - - case Image::RGB: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - default: - if (tiledFill) { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - } - break; - - default: - switch (srcData.pixelFormat) - { - case Image::ARGB: - if (tiledFill) { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - case Image::RGB: - if (tiledFill) { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - default: - if (tiledFill) { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - else { ImageFill r (destData, srcData, alpha, x, y); iter.iterate (r); } - break; - } - break; - } - } - - template - void renderSolidFill (Iterator& iter, const Image::BitmapData& destData, const PixelARGB fillColour, const bool replaceContents, DestPixelType*) - { - if (replaceContents) - { - EdgeTableFillers::SolidColour r (destData, fillColour); - iter.iterate (r); - } - else - { - EdgeTableFillers::SolidColour r (destData, fillColour); - iter.iterate (r); - } - } - - template - void renderGradient (Iterator& iter, const Image::BitmapData& destData, const ColourGradient& g, const AffineTransform& transform, - const PixelARGB* const lookupTable, const int numLookupEntries, const bool isIdentity, DestPixelType*) - { - if (g.isRadial) - { - if (isIdentity) - { - EdgeTableFillers::Gradient renderer (destData, g, transform, lookupTable, numLookupEntries); - iter.iterate (renderer); - } - else - { - EdgeTableFillers::Gradient renderer (destData, g, transform, lookupTable, numLookupEntries); - iter.iterate (renderer); - } - } - else - { - EdgeTableFillers::Gradient renderer (destData, g, transform, lookupTable, numLookupEntries); - iter.iterate (renderer); - } - } -} - -//============================================================================== -template -struct ClipRegions -{ - class Base : public SingleThreadedReferenceCountedObject - { - public: - Base() {} - virtual ~Base() {} - - typedef ReferenceCountedObjectPtr Ptr; - - virtual Ptr clone() const = 0; - virtual Ptr applyClipTo (const Ptr& target) const = 0; - - virtual Ptr clipToRectangle (const Rectangle&) = 0; - virtual Ptr clipToRectangleList (const RectangleList&) = 0; - virtual Ptr excludeClipRectangle (const Rectangle&) = 0; - virtual Ptr clipToPath (const Path&, const AffineTransform&) = 0; - virtual Ptr clipToEdgeTable (const EdgeTable& et) = 0; - virtual Ptr clipToImageAlpha (const Image&, const AffineTransform&, const Graphics::ResamplingQuality) = 0; - virtual void translate (Point delta) = 0; - - virtual bool clipRegionIntersects (const Rectangle&) const = 0; - virtual Rectangle getClipBounds() const = 0; - - virtual void fillRectWithColour (SavedStateType&, const Rectangle&, const PixelARGB colour, bool replaceContents) const = 0; - virtual void fillRectWithColour (SavedStateType&, const Rectangle&, const PixelARGB colour) const = 0; - virtual void fillAllWithColour (SavedStateType&, const PixelARGB colour, bool replaceContents) const = 0; - virtual void fillAllWithGradient (SavedStateType&, ColourGradient&, const AffineTransform&, bool isIdentity) const = 0; - virtual void renderImageTransformed (SavedStateType&, const Image&, const int alpha, const AffineTransform&, Graphics::ResamplingQuality, bool tiledFill) const = 0; - virtual void renderImageUntransformed (SavedStateType&, const Image&, const int alpha, int x, int y, bool tiledFill) const = 0; - }; - - //============================================================================== - class EdgeTableRegion : public Base - { - public: - EdgeTableRegion (const EdgeTable& e) : edgeTable (e) {} - EdgeTableRegion (const Rectangle& r) : edgeTable (r) {} - EdgeTableRegion (const Rectangle& r) : edgeTable (r) {} - EdgeTableRegion (const RectangleList& r) : edgeTable (r) {} - EdgeTableRegion (const RectangleList& r) : edgeTable (r) {} - EdgeTableRegion (const Rectangle& bounds, const Path& p, const AffineTransform& t) : edgeTable (bounds, p, t) {} - EdgeTableRegion (const EdgeTableRegion& other) : Base(), edgeTable (other.edgeTable) {} - - typedef typename Base::Ptr Ptr; - - Ptr clone() const { return new EdgeTableRegion (*this); } - Ptr applyClipTo (const Ptr& target) const { return target->clipToEdgeTable (edgeTable); } - - Ptr clipToRectangle (const Rectangle& r) - { - edgeTable.clipToRectangle (r); - return edgeTable.isEmpty() ? nullptr : this; - } - - Ptr clipToRectangleList (const RectangleList& r) - { - RectangleList inverse (edgeTable.getMaximumBounds()); - - if (inverse.subtract (r)) - for (const Rectangle* i = inverse.begin(), * const e = inverse.end(); i != e; ++i) - edgeTable.excludeRectangle (*i); - - return edgeTable.isEmpty() ? nullptr : this; - } - - Ptr excludeClipRectangle (const Rectangle& r) - { - edgeTable.excludeRectangle (r); - return edgeTable.isEmpty() ? nullptr : this; - } - - Ptr clipToPath (const Path& p, const AffineTransform& transform) - { - EdgeTable et (edgeTable.getMaximumBounds(), p, transform); - edgeTable.clipToEdgeTable (et); - return edgeTable.isEmpty() ? nullptr : this; - } - - Ptr clipToEdgeTable (const EdgeTable& et) - { - edgeTable.clipToEdgeTable (et); - return edgeTable.isEmpty() ? nullptr : this; - } - - Ptr clipToImageAlpha (const Image& image, const AffineTransform& transform, const Graphics::ResamplingQuality quality) - { - const Image::BitmapData srcData (image, Image::BitmapData::readOnly); - - if (transform.isOnlyTranslation()) - { - // If our translation doesn't involve any distortion, just use a simple blit.. - const int tx = (int) (transform.getTranslationX() * 256.0f); - const int ty = (int) (transform.getTranslationY() * 256.0f); - - if (quality == Graphics::lowResamplingQuality || ((tx | ty) & 224) == 0) - { - const int imageX = ((tx + 128) >> 8); - const int imageY = ((ty + 128) >> 8); - - if (image.getFormat() == Image::ARGB) - straightClipImage (srcData, imageX, imageY, (PixelARGB*) 0); - else - straightClipImage (srcData, imageX, imageY, (PixelAlpha*) 0); - - return edgeTable.isEmpty() ? nullptr : this; - } - } - - if (transform.isSingularity()) - return Ptr(); - - { - Path p; - p.addRectangle (0, 0, (float) srcData.width, (float) srcData.height); - EdgeTable et2 (edgeTable.getMaximumBounds(), p, transform); - edgeTable.clipToEdgeTable (et2); - } - - if (! edgeTable.isEmpty()) - { - if (image.getFormat() == Image::ARGB) - transformedClipImage (srcData, transform, quality, (PixelARGB*) 0); - else - transformedClipImage (srcData, transform, quality, (PixelAlpha*) 0); - } - - return edgeTable.isEmpty() ? nullptr : this; - } - - void translate (Point delta) - { - edgeTable.translate ((float) delta.x, delta.y); - } - - bool clipRegionIntersects (const Rectangle& r) const - { - return edgeTable.getMaximumBounds().intersects (r); - } - - Rectangle getClipBounds() const - { - return edgeTable.getMaximumBounds(); - } - - void fillRectWithColour (SavedStateType& state, const Rectangle& area, const PixelARGB colour, bool replaceContents) const - { - const Rectangle totalClip (edgeTable.getMaximumBounds()); - const Rectangle clipped (totalClip.getIntersection (area)); - - if (! clipped.isEmpty()) - { - EdgeTableRegion et (clipped); - et.edgeTable.clipToEdgeTable (edgeTable); - state.fillWithSolidColour (et.edgeTable, colour, replaceContents); - } - } - - void fillRectWithColour (SavedStateType& state, const Rectangle& area, const PixelARGB colour) const - { - const Rectangle totalClip (edgeTable.getMaximumBounds().toFloat()); - const Rectangle clipped (totalClip.getIntersection (area)); - - if (! clipped.isEmpty()) - { - EdgeTableRegion et (clipped); - et.edgeTable.clipToEdgeTable (edgeTable); - state.fillWithSolidColour (et.edgeTable, colour, false); - } - } - - void fillAllWithColour (SavedStateType& state, const PixelARGB colour, bool replaceContents) const - { - state.fillWithSolidColour (edgeTable, colour, replaceContents); - } - - void fillAllWithGradient (SavedStateType& state, ColourGradient& gradient, const AffineTransform& transform, bool isIdentity) const - { - state.fillWithGradient (edgeTable, gradient, transform, isIdentity); - } - - void renderImageTransformed (SavedStateType& state, const Image& src, const int alpha, const AffineTransform& transform, Graphics::ResamplingQuality quality, bool tiledFill) const - { - state.renderImageTransformed (edgeTable, src, alpha, transform, quality, tiledFill); - } - - void renderImageUntransformed (SavedStateType& state, const Image& src, const int alpha, int x, int y, bool tiledFill) const - { - state.renderImageUntransformed (edgeTable, src, alpha, x, y, tiledFill); - } - - EdgeTable edgeTable; - - private: - template - void transformedClipImage (const Image::BitmapData& srcData, const AffineTransform& transform, const Graphics::ResamplingQuality quality, const SrcPixelType*) - { - EdgeTableFillers::TransformedImageFill renderer (srcData, srcData, transform, 255, quality); - - for (int y = 0; y < edgeTable.getMaximumBounds().getHeight(); ++y) - renderer.clipEdgeTableLine (edgeTable, edgeTable.getMaximumBounds().getX(), y + edgeTable.getMaximumBounds().getY(), - edgeTable.getMaximumBounds().getWidth()); - } - - template - void straightClipImage (const Image::BitmapData& srcData, int imageX, int imageY, const SrcPixelType*) - { - Rectangle r (imageX, imageY, srcData.width, srcData.height); - edgeTable.clipToRectangle (r); - - EdgeTableFillers::ImageFill renderer (srcData, srcData, 255, imageX, imageY); - - for (int y = 0; y < r.getHeight(); ++y) - renderer.clipEdgeTableLine (edgeTable, r.getX(), y + r.getY(), r.getWidth()); - } - - EdgeTableRegion& operator= (const EdgeTableRegion&); - }; - - //============================================================================== - class RectangleListRegion : public Base - { - public: - RectangleListRegion (const Rectangle& r) : clip (r) {} - RectangleListRegion (const RectangleList& r) : clip (r) {} - RectangleListRegion (const RectangleListRegion& other) : Base(), clip (other.clip) {} - - typedef typename Base::Ptr Ptr; - - Ptr clone() const { return new RectangleListRegion (*this); } - Ptr applyClipTo (const Ptr& target) const { return target->clipToRectangleList (clip); } - - Ptr clipToRectangle (const Rectangle& r) - { - clip.clipTo (r); - return clip.isEmpty() ? nullptr : this; - } - - Ptr clipToRectangleList (const RectangleList& r) - { - clip.clipTo (r); - return clip.isEmpty() ? nullptr : this; - } - - Ptr excludeClipRectangle (const Rectangle& r) - { - clip.subtract (r); - return clip.isEmpty() ? nullptr : this; - } - - Ptr clipToPath (const Path& p, const AffineTransform& transform) { return toEdgeTable()->clipToPath (p, transform); } - Ptr clipToEdgeTable (const EdgeTable& et) { return toEdgeTable()->clipToEdgeTable (et); } - - Ptr clipToImageAlpha (const Image& image, const AffineTransform& transform, const Graphics::ResamplingQuality quality) - { - return toEdgeTable()->clipToImageAlpha (image, transform, quality); - } - - void translate (Point delta) { clip.offsetAll (delta); } - bool clipRegionIntersects (const Rectangle& r) const { return clip.intersects (r); } - Rectangle getClipBounds() const { return clip.getBounds(); } - - void fillRectWithColour (SavedStateType& state, const Rectangle& area, const PixelARGB colour, bool replaceContents) const - { - SubRectangleIterator iter (clip, area); - state.fillWithSolidColour (iter, colour, replaceContents); - } - - void fillRectWithColour (SavedStateType& state, const Rectangle& area, const PixelARGB colour) const - { - SubRectangleIteratorFloat iter (clip, area); - state.fillWithSolidColour (iter, colour, false); - } - - void fillAllWithColour (SavedStateType& state, const PixelARGB colour, bool replaceContents) const - { - state.fillWithSolidColour (*this, colour, replaceContents); - } - - void fillAllWithGradient (SavedStateType& state, ColourGradient& gradient, const AffineTransform& transform, bool isIdentity) const - { - state.fillWithGradient (*this, gradient, transform, isIdentity); - } - - void renderImageTransformed (SavedStateType& state, const Image& src, const int alpha, const AffineTransform& transform, Graphics::ResamplingQuality quality, bool tiledFill) const - { - state.renderImageTransformed (*this, src, alpha, transform, quality, tiledFill); - } - - void renderImageUntransformed (SavedStateType& state, const Image& src, const int alpha, int x, int y, bool tiledFill) const - { - state.renderImageUntransformed (*this, src, alpha, x, y, tiledFill); - } - - RectangleList clip; - - //============================================================================== - template - void iterate (Renderer& r) const noexcept - { - for (const Rectangle* i = clip.begin(), * const e = clip.end(); i != e; ++i) - { - const int x = i->getX(); - const int w = i->getWidth(); - jassert (w > 0); - const int bottom = i->getBottom(); - - for (int y = i->getY(); y < bottom; ++y) - { - r.setEdgeTableYPos (y); - r.handleEdgeTableLineFull (x, w); - } - } - } - - private: - //============================================================================== - class SubRectangleIterator - { - public: - SubRectangleIterator (const RectangleList& clipList, const Rectangle& clipBounds) - : clip (clipList), area (clipBounds) - {} - - template - void iterate (Renderer& r) const noexcept - { - for (const Rectangle* i = clip.begin(), * const e = clip.end(); i != e; ++i) - { - const Rectangle rect (i->getIntersection (area)); - - if (! rect.isEmpty()) - { - const int x = rect.getX(); - const int w = rect.getWidth(); - const int bottom = rect.getBottom(); - - for (int y = rect.getY(); y < bottom; ++y) - { - r.setEdgeTableYPos (y); - r.handleEdgeTableLineFull (x, w); - } - } - } - } - - private: - const RectangleList& clip; - const Rectangle area; - - JUCE_DECLARE_NON_COPYABLE (SubRectangleIterator) - }; - - //============================================================================== - class SubRectangleIteratorFloat - { - public: - SubRectangleIteratorFloat (const RectangleList& clipList, const Rectangle& clipBounds) noexcept - : clip (clipList), area (clipBounds) - { - } - - template - void iterate (Renderer& r) const noexcept - { - const RenderingHelpers::FloatRectangleRasterisingInfo f (area); - - for (const Rectangle* i = clip.begin(), * const e = clip.end(); i != e; ++i) - { - const int clipLeft = i->getX(); - const int clipRight = i->getRight(); - const int clipTop = i->getY(); - const int clipBottom = i->getBottom(); - - if (f.totalBottom > clipTop && f.totalTop < clipBottom - && f.totalRight > clipLeft && f.totalLeft < clipRight) - { - if (f.isOnePixelWide()) - { - if (f.topAlpha != 0 && f.totalTop >= clipTop) - { - r.setEdgeTableYPos (f.totalTop); - r.handleEdgeTablePixel (f.left, f.topAlpha); - } - - const int endY = jmin (f.bottom, clipBottom); - for (int y = jmax (clipTop, f.top); y < endY; ++y) - { - r.setEdgeTableYPos (y); - r.handleEdgeTablePixelFull (f.left); - } - - if (f.bottomAlpha != 0 && f.bottom < clipBottom) - { - r.setEdgeTableYPos (f.bottom); - r.handleEdgeTablePixel (f.left, f.bottomAlpha); - } - } - else - { - const int clippedLeft = jmax (f.left, clipLeft); - const int clippedWidth = jmin (f.right, clipRight) - clippedLeft; - const bool doLeftAlpha = f.leftAlpha != 0 && f.totalLeft >= clipLeft; - const bool doRightAlpha = f.rightAlpha != 0 && f.right < clipRight; - - if (f.topAlpha != 0 && f.totalTop >= clipTop) - { - r.setEdgeTableYPos (f.totalTop); - - if (doLeftAlpha) r.handleEdgeTablePixel (f.totalLeft, f.getTopLeftCornerAlpha()); - if (clippedWidth > 0) r.handleEdgeTableLine (clippedLeft, clippedWidth, f.topAlpha); - if (doRightAlpha) r.handleEdgeTablePixel (f.right, f.getTopRightCornerAlpha()); - } - - const int endY = jmin (f.bottom, clipBottom); - for (int y = jmax (clipTop, f.top); y < endY; ++y) - { - r.setEdgeTableYPos (y); - - if (doLeftAlpha) r.handleEdgeTablePixel (f.totalLeft, f.leftAlpha); - if (clippedWidth > 0) r.handleEdgeTableLineFull (clippedLeft, clippedWidth); - if (doRightAlpha) r.handleEdgeTablePixel (f.right, f.rightAlpha); - } - - if (f.bottomAlpha != 0 && f.bottom < clipBottom) - { - r.setEdgeTableYPos (f.bottom); - - if (doLeftAlpha) r.handleEdgeTablePixel (f.totalLeft, f.getBottomLeftCornerAlpha()); - if (clippedWidth > 0) r.handleEdgeTableLine (clippedLeft, clippedWidth, f.bottomAlpha); - if (doRightAlpha) r.handleEdgeTablePixel (f.right, f.getBottomRightCornerAlpha()); - } - } - } - } - } - - private: - const RectangleList& clip; - const Rectangle& area; - - JUCE_DECLARE_NON_COPYABLE (SubRectangleIteratorFloat) - }; - - Ptr toEdgeTable() const { return new EdgeTableRegion (clip); } - - RectangleListRegion& operator= (const RectangleListRegion&); - }; -}; - -//============================================================================== -template -class SavedStateBase -{ -public: - typedef typename ClipRegions::Base BaseRegionType; - typedef typename ClipRegions::EdgeTableRegion EdgeTableRegionType; - typedef typename ClipRegions::RectangleListRegion RectangleListRegionType; - - SavedStateBase (const Rectangle& initialClip) - : clip (new RectangleListRegionType (initialClip)), transform (Point()), - interpolationQuality (Graphics::mediumResamplingQuality), transparencyLayerAlpha (1.0f) - { - } - - SavedStateBase (const RectangleList& clipList, Point origin) - : clip (new RectangleListRegionType (clipList)), transform (origin), - interpolationQuality (Graphics::mediumResamplingQuality), transparencyLayerAlpha (1.0f) - { - } - - SavedStateBase (const SavedStateBase& other) - : clip (other.clip), transform (other.transform), fillType (other.fillType), - interpolationQuality (other.interpolationQuality), - transparencyLayerAlpha (other.transparencyLayerAlpha) - { - } - - SavedStateType& getThis() noexcept { return *static_cast (this); } - - bool clipToRectangle (const Rectangle& r) - { - if (clip != nullptr) - { - if (transform.isOnlyTranslated) - { - cloneClipIfMultiplyReferenced(); - clip = clip->clipToRectangle (transform.translated (r)); - } - else if (! transform.isRotated) - { - cloneClipIfMultiplyReferenced(); - clip = clip->clipToRectangle (transform.transformed (r)); - } - else - { - Path p; - p.addRectangle (r); - clipToPath (p, AffineTransform::identity); - } - } - - return clip != nullptr; - } - - bool clipToRectangleList (const RectangleList& r) - { - if (clip != nullptr) - { - if (transform.isOnlyTranslated) - { - cloneClipIfMultiplyReferenced(); - RectangleList offsetList (r); - offsetList.offsetAll (transform.offset.x, transform.offset.y); - clip = clip->clipToRectangleList (offsetList); - } - else if (! transform.isRotated) - { - cloneClipIfMultiplyReferenced(); - RectangleList scaledList; - - for (const Rectangle* i = r.begin(), * const e = r.end(); i != e; ++i) - scaledList.add (transform.transformed (*i)); - - clip = clip->clipToRectangleList (scaledList); - } - else - { - clipToPath (r.toPath(), AffineTransform::identity); - } - } - - return clip != nullptr; - } - - static Rectangle getLargestIntegerWithin (Rectangle r) - { - const int x1 = (int) std::ceil (r.getX()); - const int y1 = (int) std::ceil (r.getY()); - const int x2 = (int) std::floor (r.getRight()); - const int y2 = (int) std::floor (r.getBottom()); - - return Rectangle (x1, y1, x2 - x1, y2 - y1); - } - - bool excludeClipRectangle (const Rectangle& r) - { - if (clip != nullptr) - { - cloneClipIfMultiplyReferenced(); - - if (transform.isOnlyTranslated) - { - clip = clip->excludeClipRectangle (getLargestIntegerWithin (transform.translated (r.toFloat()))); - } - else if (! transform.isRotated) - { - clip = clip->excludeClipRectangle (getLargestIntegerWithin (transform.transformed (r.toFloat()))); - } - else - { - Path p; - p.addRectangle (r.toFloat()); - p.applyTransform (transform.complexTransform); - p.addRectangle (clip->getClipBounds().toFloat()); - p.setUsingNonZeroWinding (false); - clip = clip->clipToPath (p, AffineTransform::identity); - } - } - - return clip != nullptr; - } - - void clipToPath (const Path& p, const AffineTransform& t) - { - if (clip != nullptr) - { - cloneClipIfMultiplyReferenced(); - clip = clip->clipToPath (p, transform.getTransformWith (t)); - } - } - - void clipToImageAlpha (const Image& sourceImage, const AffineTransform& t) - { - if (clip != nullptr) - { - if (sourceImage.hasAlphaChannel()) - { - cloneClipIfMultiplyReferenced(); - clip = clip->clipToImageAlpha (sourceImage, transform.getTransformWith (t), interpolationQuality); - } - else - { - Path p; - p.addRectangle (sourceImage.getBounds()); - clipToPath (p, t); - } - } - } - - bool clipRegionIntersects (const Rectangle& r) const - { - if (clip != nullptr) - { - if (transform.isOnlyTranslated) - return clip->clipRegionIntersects (transform.translated (r)); - - return getClipBounds().intersects (r); - } - - return false; - } - - Rectangle getClipBounds() const - { - return clip != nullptr ? transform.deviceSpaceToUserSpace (clip->getClipBounds()) - : Rectangle(); - } - - void setFillType (const FillType& newFill) - { - fillType = newFill; - } - - void fillTargetRect (const Rectangle& r, const bool replaceContents) - { - if (fillType.isColour()) - { - clip->fillRectWithColour (getThis(), r, fillType.colour.getPixelARGB(), replaceContents); - } - else - { - const Rectangle clipped (clip->getClipBounds().getIntersection (r)); - - if (! clipped.isEmpty()) - fillShape (new RectangleListRegionType (clipped), false); - } - } - - void fillTargetRect (const Rectangle& r) - { - if (fillType.isColour()) - { - clip->fillRectWithColour (getThis(), r, fillType.colour.getPixelARGB()); - } - else - { - const Rectangle clipped (clip->getClipBounds().toFloat().getIntersection (r)); - - if (! clipped.isEmpty()) - fillShape (new EdgeTableRegionType (clipped), false); - } - } - - template - void fillRectAsPath (const Rectangle& r) - { - Path p; - p.addRectangle (r); - fillPath (p, AffineTransform::identity); - } - - void fillRect (const Rectangle& r, const bool replaceContents) - { - if (clip != nullptr) - { - if (transform.isOnlyTranslated) - { - fillTargetRect (transform.translated (r), replaceContents); - } - else if (! transform.isRotated) - { - fillTargetRect (transform.transformed (r), replaceContents); - } - else - { - jassert (! replaceContents); // not implemented.. - fillRectAsPath (r); - } - } - } - - void fillRect (const Rectangle& r) - { - if (clip != nullptr) - { - if (transform.isOnlyTranslated) - fillTargetRect (transform.translated (r)); - else if (! transform.isRotated) - fillTargetRect (transform.transformed (r)); - else - fillRectAsPath (r); - } - } - - void fillRectList (const RectangleList& list) - { - if (clip != nullptr) - { - if (! transform.isRotated) - { - RectangleList transformed (list); - - if (transform.isOnlyTranslated) - transformed.offsetAll (transform.offset.toFloat()); - else - transformed.transformAll (transform.getTransform()); - - fillShape (new EdgeTableRegionType (transformed), false); - } - else - { - fillPath (list.toPath(), AffineTransform::identity); - } - } - } - - void fillPath (const Path& path, const AffineTransform& t) - { - if (clip != nullptr) - fillShape (new EdgeTableRegionType (clip->getClipBounds(), path, transform.getTransformWith (t)), false); - } - - void fillEdgeTable (const EdgeTable& edgeTable, const float x, const int y) - { - if (clip != nullptr) - { - EdgeTableRegionType* edgeTableClip = new EdgeTableRegionType (edgeTable); - edgeTableClip->edgeTable.translate (x, y); - - if (fillType.isColour()) - { - float brightness = fillType.colour.getBrightness() - 0.5f; - - if (brightness > 0.0f) - edgeTableClip->edgeTable.multiplyLevels (1.0f + 1.6f * brightness); - } - - fillShape (edgeTableClip, false); - } - } - - void drawLine (const Line& line) - { - Path p; - p.addLineSegment (line, 1.0f); - fillPath (p, AffineTransform::identity); - } - - void drawImage (const Image& sourceImage, const AffineTransform& trans) - { - if (clip != nullptr && ! fillType.colour.isTransparent()) - renderImage (sourceImage, trans, nullptr); - } - - static bool isOnlyTranslationAllowingError (const AffineTransform& t) - { - return (std::abs (t.mat01) < 0.002) - && (std::abs (t.mat10) < 0.002) - && (std::abs (t.mat00 - 1.0f) < 0.002) - && (std::abs (t.mat11 - 1.0f) < 0.002); - } - - void renderImage (const Image& sourceImage, const AffineTransform& trans, - const BaseRegionType* const tiledFillClipRegion) - { - const AffineTransform t (transform.getTransformWith (trans)); - - const int alpha = fillType.colour.getAlpha(); - - if (isOnlyTranslationAllowingError (t)) - { - // If our translation doesn't involve any distortion, just use a simple blit.. - int tx = (int) (t.getTranslationX() * 256.0f); - int ty = (int) (t.getTranslationY() * 256.0f); - - if (interpolationQuality == Graphics::lowResamplingQuality || ((tx | ty) & 224) == 0) - { - tx = ((tx + 128) >> 8); - ty = ((ty + 128) >> 8); - - if (tiledFillClipRegion != nullptr) - { - tiledFillClipRegion->renderImageUntransformed (getThis(), sourceImage, alpha, tx, ty, true); - } - else - { - Rectangle area (tx, ty, sourceImage.getWidth(), sourceImage.getHeight()); - area = area.getIntersection (getThis().getMaximumBounds()); - - if (! area.isEmpty()) - if (typename BaseRegionType::Ptr c = clip->applyClipTo (new EdgeTableRegionType (area))) - c->renderImageUntransformed (getThis(), sourceImage, alpha, tx, ty, false); - } - - return; - } - } - - if (! t.isSingularity()) - { - if (tiledFillClipRegion != nullptr) - { - tiledFillClipRegion->renderImageTransformed (getThis(), sourceImage, alpha, t, interpolationQuality, true); - } - else - { - Path p; - p.addRectangle (sourceImage.getBounds()); - - typename BaseRegionType::Ptr c (clip->clone()); - c = c->clipToPath (p, t); - - if (c != nullptr) - c->renderImageTransformed (getThis(), sourceImage, alpha, t, interpolationQuality, false); - } - } - } - - void fillShape (typename BaseRegionType::Ptr shapeToFill, const bool replaceContents) - { - jassert (clip != nullptr); - - shapeToFill = clip->applyClipTo (shapeToFill); - - if (shapeToFill != nullptr) - { - if (fillType.isGradient()) - { - jassert (! replaceContents); // that option is just for solid colours - - ColourGradient g2 (*(fillType.gradient)); - g2.multiplyOpacity (fillType.getOpacity()); - AffineTransform t (transform.getTransformWith (fillType.transform).translated (-0.5f, -0.5f)); - - const bool isIdentity = t.isOnlyTranslation(); - - if (isIdentity) - { - // If our translation doesn't involve any distortion, we can speed it up.. - g2.point1.applyTransform (t); - g2.point2.applyTransform (t); - t = AffineTransform::identity; - } - - shapeToFill->fillAllWithGradient (getThis(), g2, t, isIdentity); - } - else if (fillType.isTiledImage()) - { - renderImage (fillType.image, fillType.transform, shapeToFill); - } - else - { - shapeToFill->fillAllWithColour (getThis(), fillType.colour.getPixelARGB(), replaceContents); - } - } - } - - void cloneClipIfMultiplyReferenced() - { - if (clip->getReferenceCount() > 1) - clip = clip->clone(); - } - - typename BaseRegionType::Ptr clip; - RenderingHelpers::TranslationOrTransform transform; - FillType fillType; - Graphics::ResamplingQuality interpolationQuality; - float transparencyLayerAlpha; -}; - -//============================================================================== -class SoftwareRendererSavedState : public SavedStateBase -{ - typedef SavedStateBase BaseClass; - -public: - SoftwareRendererSavedState (const Image& im, const Rectangle& clipBounds) - : BaseClass (clipBounds), image (im) - { - } - - SoftwareRendererSavedState (const Image& im, const RectangleList& clipList, Point origin) - : BaseClass (clipList, origin), image (im) - { - } - - SoftwareRendererSavedState (const SoftwareRendererSavedState& other) - : BaseClass (other), image (other.image), font (other.font) - { - } - - SoftwareRendererSavedState* beginTransparencyLayer (float opacity) - { - SoftwareRendererSavedState* s = new SoftwareRendererSavedState (*this); - - if (clip != nullptr) - { - const Rectangle layerBounds (clip->getClipBounds()); - - s->image = Image (Image::ARGB, layerBounds.getWidth(), layerBounds.getHeight(), true); - s->transparencyLayerAlpha = opacity; - s->transform.moveOriginInDeviceSpace (-layerBounds.getPosition()); - s->cloneClipIfMultiplyReferenced(); - s->clip->translate (-layerBounds.getPosition()); - } - - return s; - } - - void endTransparencyLayer (SoftwareRendererSavedState& finishedLayerState) - { - if (clip != nullptr) - { - const Rectangle layerBounds (clip->getClipBounds()); - - const ScopedPointer g (image.createLowLevelContext()); - g->setOpacity (finishedLayerState.transparencyLayerAlpha); - g->drawImage (finishedLayerState.image, AffineTransform::translation (layerBounds.getPosition())); - } - } - - typedef GlyphCache, SoftwareRendererSavedState> GlyphCacheType; - - static void clearGlyphCache() - { - GlyphCacheType::getInstance().reset(); - } - - //============================================================================== - void drawGlyph (int glyphNumber, const AffineTransform& trans) - { - if (clip != nullptr) - { - if (trans.isOnlyTranslation() && ! transform.isRotated) - { - GlyphCacheType& cache = GlyphCacheType::getInstance(); - - Point pos (trans.getTranslationX(), trans.getTranslationY()); - - if (transform.isOnlyTranslated) - { - cache.drawGlyph (*this, font, glyphNumber, pos + transform.offset.toFloat()); - } - else - { - pos = transform.transformed (pos); - - Font f (font); - f.setHeight (font.getHeight() * transform.complexTransform.mat11); - - const float xScale = transform.complexTransform.mat00 / transform.complexTransform.mat11; - if (std::abs (xScale - 1.0f) > 0.01f) - f.setHorizontalScale (xScale); - - cache.drawGlyph (*this, f, glyphNumber, pos); - } - } - else - { - const float fontHeight = font.getHeight(); - - AffineTransform t (transform.getTransformWith (AffineTransform::scale (fontHeight * font.getHorizontalScale(), fontHeight) - .followedBy (trans))); - - const ScopedPointer et (font.getTypeface()->getEdgeTableForGlyph (glyphNumber, t, fontHeight)); - - if (et != nullptr) - fillShape (new EdgeTableRegionType (*et), false); - } - } - } - - Rectangle getMaximumBounds() const { return image.getBounds(); } - - //============================================================================== - template - void renderImageTransformed (IteratorType& iter, const Image& src, const int alpha, const AffineTransform& trans, Graphics::ResamplingQuality quality, bool tiledFill) const - { - Image::BitmapData destData (image, Image::BitmapData::readWrite); - const Image::BitmapData srcData (src, Image::BitmapData::readOnly); - EdgeTableFillers::renderImageTransformed (iter, destData, srcData, alpha, trans, quality, tiledFill); - } - - template - void renderImageUntransformed (IteratorType& iter, const Image& src, const int alpha, int x, int y, bool tiledFill) const - { - Image::BitmapData destData (image, Image::BitmapData::readWrite); - const Image::BitmapData srcData (src, Image::BitmapData::readOnly); - EdgeTableFillers::renderImageUntransformed (iter, destData, srcData, alpha, x, y, tiledFill); - } - - template - void fillWithSolidColour (IteratorType& iter, const PixelARGB colour, bool replaceContents) const - { - Image::BitmapData destData (image, Image::BitmapData::readWrite); - - switch (destData.pixelFormat) - { - case Image::ARGB: EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelARGB*) 0); break; - case Image::RGB: EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelRGB*) 0); break; - default: EdgeTableFillers::renderSolidFill (iter, destData, colour, replaceContents, (PixelAlpha*) 0); break; - } - } - - template - void fillWithGradient (IteratorType& iter, ColourGradient& gradient, const AffineTransform& trans, bool isIdentity) const - { - HeapBlock lookupTable; - const int numLookupEntries = gradient.createLookupTable (trans, lookupTable); - jassert (numLookupEntries > 0); - - Image::BitmapData destData (image, Image::BitmapData::readWrite); - - switch (destData.pixelFormat) - { - case Image::ARGB: EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelARGB*) 0); break; - case Image::RGB: EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelRGB*) 0); break; - default: EdgeTableFillers::renderGradient (iter, destData, gradient, trans, lookupTable, numLookupEntries, isIdentity, (PixelAlpha*) 0); break; - } - } - - //============================================================================== - Image image; - Font font; - -private: - SoftwareRendererSavedState& operator= (const SoftwareRendererSavedState&); -}; - -//============================================================================== -template -class SavedStateStack -{ -public: - SavedStateStack (StateObjectType* const initialState) noexcept - : currentState (initialState) - {} - - SavedStateStack() noexcept {} - - void initialise (StateObjectType* state) - { - currentState = state; - } - - inline StateObjectType* operator->() const noexcept { return currentState; } - inline StateObjectType& operator*() const noexcept { return *currentState; } - - void save() - { - stack.add (new StateObjectType (*currentState)); - } - - void restore() - { - if (StateObjectType* const top = stack.getLast()) - { - currentState = top; - stack.removeLast (1, false); - } - else - { - jassertfalse; // trying to pop with an empty stack! - } - } - - void beginTransparencyLayer (float opacity) - { - save(); - currentState = currentState->beginTransparencyLayer (opacity); - } - - void endTransparencyLayer() - { - const ScopedPointer finishedTransparencyLayer (currentState); - restore(); - currentState->endTransparencyLayer (*finishedTransparencyLayer); - } - -private: - ScopedPointer currentState; - OwnedArray stack; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SavedStateStack) -}; - -//============================================================================== -template -class StackBasedLowLevelGraphicsContext : public LowLevelGraphicsContext -{ -public: - bool isVectorDevice() const override { return false; } - void setOrigin (Point o) override { stack->transform.setOrigin (o); } - void addTransform (const AffineTransform& t) override { stack->transform.addTransform (t); } - float getPhysicalPixelScaleFactor() override { return stack->transform.getPhysicalPixelScaleFactor(); } - Rectangle getClipBounds() const override { return stack->getClipBounds(); } - bool isClipEmpty() const override { return stack->clip == nullptr; } - bool clipRegionIntersects (const Rectangle& r) override { return stack->clipRegionIntersects (r); } - bool clipToRectangle (const Rectangle& r) override { return stack->clipToRectangle (r); } - bool clipToRectangleList (const RectangleList& r) override { return stack->clipToRectangleList (r); } - void excludeClipRectangle (const Rectangle& r) override { stack->excludeClipRectangle (r); } - void clipToPath (const Path& path, const AffineTransform& t) override { stack->clipToPath (path, t); } - void clipToImageAlpha (const Image& im, const AffineTransform& t) override { stack->clipToImageAlpha (im, t); } - void saveState() override { stack.save(); } - void restoreState() override { stack.restore(); } - void beginTransparencyLayer (float opacity) override { stack.beginTransparencyLayer (opacity); } - void endTransparencyLayer() override { stack.endTransparencyLayer(); } - void setFill (const FillType& fillType) override { stack->setFillType (fillType); } - void setOpacity (float newOpacity) override { stack->fillType.setOpacity (newOpacity); } - void setInterpolationQuality (Graphics::ResamplingQuality quality) override { stack->interpolationQuality = quality; } - void fillRect (const Rectangle& r, bool replace) override { stack->fillRect (r, replace); } - void fillRect (const Rectangle& r) override { stack->fillRect (r); } - void fillRectList (const RectangleList& list) override { stack->fillRectList (list); } - void fillPath (const Path& path, const AffineTransform& t) override { stack->fillPath (path, t); } - void drawImage (const Image& im, const AffineTransform& t) override { stack->drawImage (im, t); } - void drawGlyph (int glyphNumber, const AffineTransform& t) override { stack->drawGlyph (glyphNumber, t); } - void drawLine (const Line& line) override { stack->drawLine (line); } - void setFont (const Font& newFont) override { stack->font = newFont; } - const Font& getFont() override { return stack->font; } - -protected: - StackBasedLowLevelGraphicsContext (SavedStateType* initialState) : stack (initialState) {} - StackBasedLowLevelGraphicsContext() {} - - RenderingHelpers::SavedStateStack stack; -}; - -} - -#if JUCE_MSVC - #pragma warning (pop) -#endif - -#endif // JUCE_RENDERINGHELPERS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp deleted file mode 100755 index 29702a2..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_android_Fonts.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -struct DefaultFontNames -{ - DefaultFontNames() - : defaultSans ("sans"), - defaultSerif ("serif"), - defaultFixed ("monospace"), - defaultFallback ("sans") - { - } - - String getRealFontName (const String& faceName) const - { - if (faceName == Font::getDefaultSansSerifFontName()) return defaultSans; - if (faceName == Font::getDefaultSerifFontName()) return defaultSerif; - if (faceName == Font::getDefaultMonospacedFontName()) return defaultFixed; - - return faceName; - } - - String defaultSans, defaultSerif, defaultFixed, defaultFallback; -}; - -Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) -{ - static DefaultFontNames defaultNames; - - Font f (font); - f.setTypefaceName (defaultNames.getRealFontName (font.getTypefaceName())); - return Typeface::createSystemTypefaceFor (f); -} - -//============================================================================== -#if JUCE_USE_FREETYPE - -StringArray FTTypefaceList::getDefaultFontDirectories() -{ - return StringArray ("/system/fonts"); -} - -Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) -{ - return new FreeTypeTypeface (font); -} - -void Typeface::scanFolderForFonts (const File& folder) -{ - FTTypefaceList::getInstance()->scanFontPaths (StringArray (folder.getFullPathName())); -} - -StringArray Font::findAllTypefaceNames() -{ - return FTTypefaceList::getInstance()->findAllFamilyNames(); -} - -StringArray Font::findAllTypefaceStyles (const String& family) -{ - return FTTypefaceList::getInstance()->findAllTypefaceStyles (family); -} - -bool TextLayout::createNativeLayout (const AttributedString&) -{ - return false; -} - -#else - -//============================================================================== -#define JNI_CLASS_MEMBERS(METHOD, STATICMETHOD, FIELD, STATICFIELD) \ - STATICMETHOD (create, "create", "(Ljava/lang/String;I)Landroid/graphics/Typeface;") \ - STATICMETHOD (createFromFile, "createFromFile", "(Ljava/lang/String;)Landroid/graphics/Typeface;") \ - -DECLARE_JNI_CLASS (TypefaceClass, "android/graphics/Typeface"); -#undef JNI_CLASS_MEMBERS - -//============================================================================== -StringArray Font::findAllTypefaceNames() -{ - StringArray results; - - Array fonts; - File ("/system/fonts").findChildFiles (fonts, File::findFiles, false, "*.ttf"); - - for (int i = 0; i < fonts.size(); ++i) - results.addIfNotAlreadyThere (fonts.getReference(i).getFileNameWithoutExtension() - .upToLastOccurrenceOf ("-", false, false)); - - return results; -} - -StringArray Font::findAllTypefaceStyles (const String& family) -{ - StringArray results ("Regular"); - - Array fonts; - File ("/system/fonts").findChildFiles (fonts, File::findFiles, false, family + "-*.ttf"); - - for (int i = 0; i < fonts.size(); ++i) - results.addIfNotAlreadyThere (fonts.getReference(i).getFileNameWithoutExtension() - .fromLastOccurrenceOf ("-", false, false)); - - return results; -} - -const float referenceFontSize = 256.0f; -const float referenceFontToUnits = 1.0f / referenceFontSize; - -//============================================================================== -class AndroidTypeface : public Typeface -{ -public: - AndroidTypeface (const Font& font) - : Typeface (font.getTypefaceName(), font.getTypefaceStyle()), - ascent (0), descent (0), heightToPointsFactor (1.0f) - { - JNIEnv* const env = getEnv(); - - const bool isBold = style.contains ("Bold"); - const bool isItalic = style.contains ("Italic"); - - File fontFile (getFontFile (name, style)); - - if (! fontFile.exists()) - fontFile = findFontFile (name, isBold, isItalic); - - if (fontFile.exists()) - typeface = GlobalRef (env->CallStaticObjectMethod (TypefaceClass, TypefaceClass.createFromFile, - javaString (fontFile.getFullPathName()).get())); - else - typeface = GlobalRef (env->CallStaticObjectMethod (TypefaceClass, TypefaceClass.create, - javaString (getName()).get(), - (isBold ? 1 : 0) + (isItalic ? 2 : 0))); - - rect = GlobalRef (env->NewObject (RectClass, RectClass.constructor, 0, 0, 0, 0)); - - paint = GlobalRef (GraphicsHelpers::createPaint (Graphics::highResamplingQuality)); - const LocalRef ignored (paint.callObjectMethod (Paint.setTypeface, typeface.get())); - - paint.callVoidMethod (Paint.setTextSize, referenceFontSize); - - const float fullAscent = std::abs (paint.callFloatMethod (Paint.ascent)); - const float fullDescent = paint.callFloatMethod (Paint.descent); - const float totalHeight = fullAscent + fullDescent; - - ascent = fullAscent / totalHeight; - descent = fullDescent / totalHeight; - heightToPointsFactor = referenceFontSize / totalHeight; - } - - float getAscent() const override { return ascent; } - float getDescent() const override { return descent; } - float getHeightToPointsFactor() const override { return heightToPointsFactor; } - - float getStringWidth (const String& text) override - { - JNIEnv* env = getEnv(); - const int numChars = text.length(); - jfloatArray widths = env->NewFloatArray (numChars); - - const int numDone = paint.callIntMethod (Paint.getTextWidths, javaString (text).get(), widths); - - HeapBlock localWidths (numDone); - env->GetFloatArrayRegion (widths, 0, numDone, localWidths); - env->DeleteLocalRef (widths); - - float x = 0; - for (int i = 0; i < numDone; ++i) - x += localWidths[i]; - - return x * referenceFontToUnits; - } - - void getGlyphPositions (const String& text, Array& glyphs, Array& xOffsets) override - { - JNIEnv* env = getEnv(); - const int numChars = text.length(); - jfloatArray widths = env->NewFloatArray (numChars); - - const int numDone = paint.callIntMethod (Paint.getTextWidths, javaString (text).get(), widths); - - HeapBlock localWidths (numDone); - env->GetFloatArrayRegion (widths, 0, numDone, localWidths); - env->DeleteLocalRef (widths); - - String::CharPointerType s (text.getCharPointer()); - - xOffsets.add (0); - - float x = 0; - for (int i = 0; i < numDone; ++i) - { - glyphs.add ((int) s.getAndAdvance()); - x += localWidths[i]; - xOffsets.add (x * referenceFontToUnits); - } - } - - bool getOutlineForGlyph (int /*glyphNumber*/, Path& /*destPath*/) override - { - return false; - } - - EdgeTable* getEdgeTableForGlyph (int glyphNumber, const AffineTransform& t, float /*fontHeight*/) override - { - JNIEnv* env = getEnv(); - - jobject matrix = GraphicsHelpers::createMatrix (env, AffineTransform::scale (referenceFontToUnits).followedBy (t)); - jintArray maskData = (jintArray) android.activity.callObjectMethod (JuceAppActivity.renderGlyph, (jchar) glyphNumber, paint.get(), matrix, rect.get()); - - env->DeleteLocalRef (matrix); - - const int left = env->GetIntField (rect.get(), RectClass.left); - const int top = env->GetIntField (rect.get(), RectClass.top); - const int right = env->GetIntField (rect.get(), RectClass.right); - const int bottom = env->GetIntField (rect.get(), RectClass.bottom); - - const Rectangle bounds (left, top, right - left, bottom - top); - - EdgeTable* et = nullptr; - - if (! bounds.isEmpty()) - { - et = new EdgeTable (bounds); - - jint* const maskDataElements = env->GetIntArrayElements (maskData, 0); - const jint* mask = maskDataElements; - - for (int y = top; y < bottom; ++y) - { - #if JUCE_LITTLE_ENDIAN - const uint8* const lineBytes = ((const uint8*) mask) + 3; - #else - const uint8* const lineBytes = (const uint8*) mask; - #endif - - et->clipLineToMask (left, y, lineBytes, 4, bounds.getWidth()); - mask += bounds.getWidth(); - } - - env->ReleaseIntArrayElements (maskData, maskDataElements, 0); - } - - env->DeleteLocalRef (maskData); - return et; - } - - GlobalRef typeface, paint, rect; - float ascent, descent, heightToPointsFactor; - -private: - static File findFontFile (const String& family, - const bool bold, const bool italic) - { - File file; - - if (bold || italic) - { - String suffix; - if (bold) suffix = "Bold"; - if (italic) suffix << "Italic"; - - file = getFontFile (family, suffix); - - if (file.exists()) - return file; - } - - file = getFontFile (family, "Regular"); - - if (! file.exists()) - file = getFontFile (family, String()); - - return file; - } - - static File getFontFile (const String& family, const String& style) - { - String path ("/system/fonts/" + family); - - if (style.isNotEmpty()) - path << '-' << style; - - return File (path + ".ttf"); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AndroidTypeface) -}; - -//============================================================================== -Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) -{ - return new AndroidTypeface (font); -} - -Typeface::Ptr Typeface::createSystemTypefaceFor (const void*, size_t) -{ - jassertfalse; // not yet implemented! - return nullptr; -} - -void Typeface::scanFolderForFonts (const File&) -{ - jassertfalse; // not available unless using FreeType -} - -bool TextLayout::createNativeLayout (const AttributedString&) -{ - return false; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp deleted file mode 100755 index 9382c1d..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_android_GraphicsContext.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -namespace GraphicsHelpers -{ - jobject createPaint (Graphics::ResamplingQuality quality) - { - jint constructorFlags = 1 /*ANTI_ALIAS_FLAG*/ - | 4 /*DITHER_FLAG*/ - | 128 /*SUBPIXEL_TEXT_FLAG*/; - - if (quality > Graphics::lowResamplingQuality) - constructorFlags |= 2; /*FILTER_BITMAP_FLAG*/ - - return getEnv()->NewObject (Paint, Paint.constructor, constructorFlags); - } - - const jobject createMatrix (JNIEnv* env, const AffineTransform& t) - { - jobject m = env->NewObject (Matrix, Matrix.constructor); - - jfloat values[9] = { t.mat00, t.mat01, t.mat02, - t.mat10, t.mat11, t.mat12, - 0.0f, 0.0f, 1.0f }; - - jfloatArray javaArray = env->NewFloatArray (9); - env->SetFloatArrayRegion (javaArray, 0, 9, values); - - env->CallVoidMethod (m, Matrix.setValues, javaArray); - env->DeleteLocalRef (javaArray); - - return m; - } -} - -ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const -{ - return SoftwareImageType().create (format, width, height, clearImage); -} diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp deleted file mode 100755 index d124eaf..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_freetype_Fonts.cpp +++ /dev/null @@ -1,455 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -struct FTLibWrapper : public ReferenceCountedObject -{ - FTLibWrapper() : library (0) - { - if (FT_Init_FreeType (&library) != 0) - { - library = 0; - DBG ("Failed to initialize FreeType"); - } - } - - ~FTLibWrapper() - { - if (library != 0) - FT_Done_FreeType (library); - } - - FT_Library library; - - typedef ReferenceCountedObjectPtr Ptr; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FTLibWrapper) -}; - -//============================================================================== -struct FTFaceWrapper : public ReferenceCountedObject -{ - FTFaceWrapper (const FTLibWrapper::Ptr& ftLib, const File& file, int faceIndex) - : face (0), library (ftLib) - { - if (FT_New_Face (ftLib->library, file.getFullPathName().toUTF8(), faceIndex, &face) != 0) - face = 0; - } - - FTFaceWrapper (const FTLibWrapper::Ptr& ftLib, const void* data, size_t dataSize, int faceIndex) - : face (0), library (ftLib), savedFaceData (data, dataSize) - { - if (FT_New_Memory_Face (ftLib->library, (const FT_Byte*) savedFaceData.getData(), - (FT_Long) savedFaceData.getSize(), faceIndex, &face) != 0) - face = 0; - } - - ~FTFaceWrapper() - { - if (face != 0) - FT_Done_Face (face); - } - - FT_Face face; - FTLibWrapper::Ptr library; - MemoryBlock savedFaceData; - - typedef ReferenceCountedObjectPtr Ptr; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FTFaceWrapper) -}; - -//============================================================================== -class FTTypefaceList : private DeletedAtShutdown -{ -public: - FTTypefaceList() : library (new FTLibWrapper()) - { - scanFontPaths (getDefaultFontDirectories()); - } - - ~FTTypefaceList() - { - clearSingletonInstance(); - } - - //============================================================================== - struct KnownTypeface - { - KnownTypeface (const File& f, const int index, const FTFaceWrapper& face) - : file (f), - family (face.face->family_name), - style (face.face->style_name), - faceIndex (index), - isMonospaced ((face.face->face_flags & FT_FACE_FLAG_FIXED_WIDTH) != 0), - isSansSerif (isFaceSansSerif (family)) - { - } - - const File file; - const String family, style; - const int faceIndex; - const bool isMonospaced, isSansSerif; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (KnownTypeface) - }; - - //============================================================================== - static FTFaceWrapper::Ptr selectUnicodeCharmap (FTFaceWrapper* face) - { - if (face != nullptr) - if (FT_Select_Charmap (face->face, ft_encoding_unicode) != 0) - FT_Set_Charmap (face->face, face->face->charmaps[0]); - - return face; - } - - FTFaceWrapper::Ptr createFace (const void* data, size_t dataSize, int index) - { - return selectUnicodeCharmap (new FTFaceWrapper (library, data, dataSize, index)); - } - - FTFaceWrapper::Ptr createFace (const File& file, int index) - { - return selectUnicodeCharmap (new FTFaceWrapper (library, file, index)); - } - - FTFaceWrapper::Ptr createFace (const String& fontName, const String& fontStyle) - { - const KnownTypeface* ftFace = matchTypeface (fontName, fontStyle); - - if (ftFace == nullptr) ftFace = matchTypeface (fontName, "Regular"); - if (ftFace == nullptr) ftFace = matchTypeface (fontName, String()); - - if (ftFace != nullptr) - return createFace (ftFace->file, ftFace->faceIndex); - - return nullptr; - } - - //============================================================================== - StringArray findAllFamilyNames() const - { - StringArray s; - - for (int i = 0; i < faces.size(); ++i) - s.addIfNotAlreadyThere (faces.getUnchecked(i)->family); - - return s; - } - - static int indexOfRegularStyle (const StringArray& styles) - { - int i = styles.indexOf ("Regular", true); - - if (i < 0) - for (i = 0; i < styles.size(); ++i) - if (! (styles[i].containsIgnoreCase ("Bold") || styles[i].containsIgnoreCase ("Italic"))) - break; - - return i; - } - - StringArray findAllTypefaceStyles (const String& family) const - { - StringArray s; - - for (int i = 0; i < faces.size(); ++i) - { - const KnownTypeface* const face = faces.getUnchecked(i); - - if (face->family == family) - s.addIfNotAlreadyThere (face->style); - } - - // try to get a regular style to be first in the list - const int regular = indexOfRegularStyle (s); - if (regular > 0) - s.strings.swap (0, regular); - - return s; - } - - void scanFontPaths (const StringArray& paths) - { - for (int i = 0; i < paths.size(); ++i) - { - DirectoryIterator iter (File::getCurrentWorkingDirectory() - .getChildFile (paths[i]), true); - - while (iter.next()) - if (iter.getFile().hasFileExtension ("ttf;pfb;pcf;otf")) - scanFont (iter.getFile()); - } - } - - void getMonospacedNames (StringArray& monoSpaced) const - { - for (int i = 0; i < faces.size(); ++i) - if (faces.getUnchecked(i)->isMonospaced) - monoSpaced.addIfNotAlreadyThere (faces.getUnchecked(i)->family); - } - - void getSerifNames (StringArray& serif) const - { - for (int i = 0; i < faces.size(); ++i) - if (! faces.getUnchecked(i)->isSansSerif) - serif.addIfNotAlreadyThere (faces.getUnchecked(i)->family); - } - - void getSansSerifNames (StringArray& sansSerif) const - { - for (int i = 0; i < faces.size(); ++i) - if (faces.getUnchecked(i)->isSansSerif) - sansSerif.addIfNotAlreadyThere (faces.getUnchecked(i)->family); - } - - juce_DeclareSingleton_SingleThreaded_Minimal (FTTypefaceList) - -private: - FTLibWrapper::Ptr library; - OwnedArray faces; - - static StringArray getDefaultFontDirectories(); - - void scanFont (const File& file) - { - int faceIndex = 0; - int numFaces = 0; - - do - { - FTFaceWrapper face (library, file, faceIndex); - - if (face.face != 0) - { - if (faceIndex == 0) - numFaces = face.face->num_faces; - - if ((face.face->face_flags & FT_FACE_FLAG_SCALABLE) != 0) - faces.add (new KnownTypeface (file, faceIndex, face)); - } - - ++faceIndex; - } - while (faceIndex < numFaces); - } - - const KnownTypeface* matchTypeface (const String& familyName, const String& style) const noexcept - { - for (int i = 0; i < faces.size(); ++i) - { - const KnownTypeface* const face = faces.getUnchecked(i); - - if (face->family == familyName - && (face->style.equalsIgnoreCase (style) || style.isEmpty())) - return face; - } - - return nullptr; - } - - static bool isFaceSansSerif (const String& family) - { - static const char* sansNames[] = { "Sans", "Verdana", "Arial", "Ubuntu" }; - - for (int i = 0; i < numElementsInArray (sansNames); ++i) - if (family.containsIgnoreCase (sansNames[i])) - return true; - - return false; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FTTypefaceList) -}; - -juce_ImplementSingleton_SingleThreaded (FTTypefaceList) - - -//============================================================================== -class FreeTypeTypeface : public CustomTypeface -{ -public: - FreeTypeTypeface (const Font& font) - : faceWrapper (FTTypefaceList::getInstance()->createFace (font.getTypefaceName(), - font.getTypefaceStyle())) - { - if (faceWrapper != nullptr) - initialiseCharacteristics (font.getTypefaceName(), - font.getTypefaceStyle()); - } - - FreeTypeTypeface (const void* data, size_t dataSize) - : faceWrapper (FTTypefaceList::getInstance()->createFace (data, dataSize, 0)) - { - if (faceWrapper != nullptr) - initialiseCharacteristics (faceWrapper->face->family_name, - faceWrapper->face->style_name); - } - - void initialiseCharacteristics (const String& name, const String& style) - { - setCharacteristics (name, style, - faceWrapper->face->ascender / (float) (faceWrapper->face->ascender - faceWrapper->face->descender), - L' '); - } - - bool loadGlyphIfPossible (const juce_wchar character) - { - if (faceWrapper != nullptr) - { - FT_Face face = faceWrapper->face; - const unsigned int glyphIndex = FT_Get_Char_Index (face, character); - - if (FT_Load_Glyph (face, glyphIndex, FT_LOAD_NO_SCALE | FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM | FT_LOAD_NO_HINTING) == 0 - && face->glyph->format == ft_glyph_format_outline) - { - const float scale = 1.0f / (float) (face->ascender - face->descender); - Path destShape; - - if (getGlyphShape (destShape, face->glyph->outline, scale)) - { - addGlyph (character, destShape, face->glyph->metrics.horiAdvance * scale); - - if ((face->face_flags & FT_FACE_FLAG_KERNING) != 0) - addKerning (face, character, glyphIndex); - - return true; - } - } - } - - return false; - } - -private: - FTFaceWrapper::Ptr faceWrapper; - - bool getGlyphShape (Path& destShape, const FT_Outline& outline, const float scaleX) - { - const float scaleY = -scaleX; - const short* const contours = outline.contours; - const char* const tags = outline.tags; - const FT_Vector* const points = outline.points; - - for (int c = 0; c < outline.n_contours; ++c) - { - const int startPoint = (c == 0) ? 0 : contours [c - 1] + 1; - const int endPoint = contours[c]; - - for (int p = startPoint; p <= endPoint; ++p) - { - const float x = scaleX * points[p].x; - const float y = scaleY * points[p].y; - - if (p == startPoint) - { - if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_Conic) - { - float x2 = scaleX * points [endPoint].x; - float y2 = scaleY * points [endPoint].y; - - if (FT_CURVE_TAG (tags[endPoint]) != FT_Curve_Tag_On) - { - x2 = (x + x2) * 0.5f; - y2 = (y + y2) * 0.5f; - } - - destShape.startNewSubPath (x2, y2); - } - else - { - destShape.startNewSubPath (x, y); - } - } - - if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_On) - { - if (p != startPoint) - destShape.lineTo (x, y); - } - else if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_Conic) - { - const int nextIndex = (p == endPoint) ? startPoint : p + 1; - float x2 = scaleX * points [nextIndex].x; - float y2 = scaleY * points [nextIndex].y; - - if (FT_CURVE_TAG (tags [nextIndex]) == FT_Curve_Tag_Conic) - { - x2 = (x + x2) * 0.5f; - y2 = (y + y2) * 0.5f; - } - else - { - ++p; - } - - destShape.quadraticTo (x, y, x2, y2); - } - else if (FT_CURVE_TAG (tags[p]) == FT_Curve_Tag_Cubic) - { - const int next1 = p + 1; - const int next2 = (p == (endPoint - 1)) ? startPoint : (p + 2); - - if (p >= endPoint - || FT_CURVE_TAG (tags[next1]) != FT_Curve_Tag_Cubic - || FT_CURVE_TAG (tags[next2]) != FT_Curve_Tag_On) - return false; - - const float x2 = scaleX * points [next1].x; - const float y2 = scaleY * points [next1].y; - const float x3 = scaleX * points [next2].x; - const float y3 = scaleY * points [next2].y; - - destShape.cubicTo (x, y, x2, y2, x3, y3); - p += 2; - } - } - - destShape.closeSubPath(); - } - - return true; - } - - void addKerning (FT_Face face, const uint32 character, const uint32 glyphIndex) - { - const float height = (float) (face->ascender - face->descender); - - uint32 rightGlyphIndex; - uint32 rightCharCode = FT_Get_First_Char (face, &rightGlyphIndex); - - while (rightGlyphIndex != 0) - { - FT_Vector kerning; - - if (FT_Get_Kerning (face, glyphIndex, rightGlyphIndex, ft_kerning_unscaled, &kerning) == 0 - && kerning.x != 0) - addKerningPair (character, rightCharCode, kerning.x / height); - - rightCharCode = FT_Get_Next_Char (face, rightCharCode, &rightGlyphIndex); - } - } - - JUCE_DECLARE_NON_COPYABLE (FreeTypeTypeface) -}; diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp deleted file mode 100755 index 0869ec7..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_linux_Fonts.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -StringArray FTTypefaceList::getDefaultFontDirectories() -{ - StringArray fontDirs; - - fontDirs.addTokens (String (CharPointer_UTF8 (getenv ("JUCE_FONT_PATH"))), ";,", ""); - fontDirs.removeEmptyStrings (true); - - if (fontDirs.size() == 0) - { - const ScopedPointer fontsInfo (XmlDocument::parse (File ("/etc/fonts/fonts.conf"))); - - if (fontsInfo != nullptr) - { - forEachXmlChildElementWithTagName (*fontsInfo, e, "dir") - { - String fontPath (e->getAllSubText().trim()); - - if (fontPath.isNotEmpty()) - { - if (e->getStringAttribute ("prefix") == "xdg") - { - String xdgDataHome (SystemStats::getEnvironmentVariable ("XDG_DATA_HOME", String())); - - if (xdgDataHome.trimStart().isEmpty()) - xdgDataHome = "~/.local/share"; - - fontPath = File (xdgDataHome).getChildFile (fontPath).getFullPathName(); - } - - fontDirs.add (fontPath); - } - } - } - } - - if (fontDirs.size() == 0) - fontDirs.add ("/usr/X11R6/lib/X11/fonts"); - - fontDirs.removeDuplicates (false); - return fontDirs; -} - -Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) -{ - return new FreeTypeTypeface (font); -} - -Typeface::Ptr Typeface::createSystemTypefaceFor (const void* data, size_t dataSize) -{ - return new FreeTypeTypeface (data, dataSize); -} - -void Typeface::scanFolderForFonts (const File& folder) -{ - FTTypefaceList::getInstance()->scanFontPaths (StringArray (folder.getFullPathName())); -} - -StringArray Font::findAllTypefaceNames() -{ - return FTTypefaceList::getInstance()->findAllFamilyNames(); -} - -StringArray Font::findAllTypefaceStyles (const String& family) -{ - return FTTypefaceList::getInstance()->findAllTypefaceStyles (family); -} - -bool TextLayout::createNativeLayout (const AttributedString&) -{ - return false; -} - -//============================================================================== -struct DefaultFontNames -{ - DefaultFontNames() - : defaultSans (getDefaultSansSerifFontName()), - defaultSerif (getDefaultSerifFontName()), - defaultFixed (getDefaultMonospacedFontName()) - { - } - - String getRealFontName (const String& faceName) const - { - if (faceName == Font::getDefaultSansSerifFontName()) return defaultSans; - if (faceName == Font::getDefaultSerifFontName()) return defaultSerif; - if (faceName == Font::getDefaultMonospacedFontName()) return defaultFixed; - - return faceName; - } - - String defaultSans, defaultSerif, defaultFixed; - -private: - static String pickBestFont (const StringArray& names, const char* const* choicesArray) - { - const StringArray choices (choicesArray); - - for (int j = 0; j < choices.size(); ++j) - if (names.contains (choices[j], true)) - return choices[j]; - - for (int j = 0; j < choices.size(); ++j) - for (int i = 0; i < names.size(); ++i) - if (names[i].startsWithIgnoreCase (choices[j])) - return names[i]; - - for (int j = 0; j < choices.size(); ++j) - for (int i = 0; i < names.size(); ++i) - if (names[i].containsIgnoreCase (choices[j])) - return names[i]; - - return names[0]; - } - - static String getDefaultSansSerifFontName() - { - StringArray allFonts; - FTTypefaceList::getInstance()->getSansSerifNames (allFonts); - - static const char* targets[] = { "Verdana", "Bitstream Vera Sans", "Luxi Sans", - "Liberation Sans", "DejaVu Sans", "Sans", nullptr }; - return pickBestFont (allFonts, targets); - } - - static String getDefaultSerifFontName() - { - StringArray allFonts; - FTTypefaceList::getInstance()->getSerifNames (allFonts); - - static const char* targets[] = { "Bitstream Vera Serif", "Times", "Nimbus Roman", - "Liberation Serif", "DejaVu Serif", "Serif", nullptr }; - return pickBestFont (allFonts, targets); - } - - static String getDefaultMonospacedFontName() - { - StringArray allFonts; - FTTypefaceList::getInstance()->getMonospacedNames (allFonts); - - static const char* targets[] = { "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Sans Mono", - "Liberation Mono", "Courier", "DejaVu Mono", "Mono", nullptr }; - return pickBestFont (allFonts, targets); - } - - JUCE_DECLARE_NON_COPYABLE (DefaultFontNames) -}; - -Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) -{ - static DefaultFontNames defaultNames; - - Font f (font); - f.setTypefaceName (defaultNames.getRealFontName (font.getTypefaceName())); - return Typeface::createSystemTypefaceFor (f); -} diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h deleted file mode 100755 index 9beefef..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MAC_COREGRAPHICSCONTEXT_H_INCLUDED -#define JUCE_MAC_COREGRAPHICSCONTEXT_H_INCLUDED - -//============================================================================== -class CoreGraphicsContext : public LowLevelGraphicsContext -{ -public: - CoreGraphicsContext (CGContextRef context, const float flipHeight, const float targetScale); - ~CoreGraphicsContext(); - - //============================================================================== - bool isVectorDevice() const override { return false; } - - void setOrigin (Point) override; - void addTransform (const AffineTransform&) override; - float getPhysicalPixelScaleFactor() override; - bool clipToRectangle (const Rectangle&) override; - bool clipToRectangleList (const RectangleList&) override; - void excludeClipRectangle (const Rectangle&) override; - void clipToPath (const Path&, const AffineTransform&) override; - void clipToImageAlpha (const Image&, const AffineTransform&) override; - bool clipRegionIntersects (const Rectangle&) override; - Rectangle getClipBounds() const override; - bool isClipEmpty() const override; - - //============================================================================== - void saveState() override; - void restoreState() override; - void beginTransparencyLayer (float opacity) override; - void endTransparencyLayer() override; - - //============================================================================== - void setFill (const FillType&) override; - void setOpacity (float) override; - void setInterpolationQuality (Graphics::ResamplingQuality) override; - - //============================================================================== - void fillRect (const Rectangle&, bool replaceExistingContents) override; - void fillRect (const Rectangle&) override; - void fillRectList (const RectangleList&) override; - void fillPath (const Path&, const AffineTransform&) override; - void drawImage (const Image& sourceImage, const AffineTransform&) override; - - //============================================================================== - void drawLine (const Line&) override; - void setFont (const Font&) override; - const Font& getFont() override; - void drawGlyph (int glyphNumber, const AffineTransform&) override; - bool drawTextLayout (const AttributedString&, const Rectangle&) override; - -private: - CGContextRef context; - const CGFloat flipHeight; - float targetScale; - CGColorSpaceRef rgbColourSpace, greyColourSpace; - mutable Rectangle lastClipRect; - mutable bool lastClipRectIsValid; - - struct SavedState - { - SavedState(); - SavedState (const SavedState&); - ~SavedState(); - - void setFill (const FillType&); - - FillType fillType; - Font font; - CGFontRef fontRef; - CGAffineTransform fontTransform; - CGGradientRef gradient; - }; - - ScopedPointer state; - OwnedArray stateStack; - - void drawGradient(); - void createPath (const Path&) const; - void createPath (const Path&, const AffineTransform&) const; - void flip() const; - void applyTransform (const AffineTransform&) const; - void drawImage (const Image&, const AffineTransform&, bool fillEntireClipAsTiles); - bool clipToRectangleListWithoutTest (const RectangleList&); - void fillCGRect (const CGRect&, bool replaceExistingContents); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreGraphicsContext) -}; - -#endif // JUCE_MAC_COREGRAPHICSCONTEXT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm deleted file mode 100755 index 31e7ee1..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm +++ /dev/null @@ -1,913 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#include "juce_mac_CoreGraphicsContext.h" - -//============================================================================== -class CoreGraphicsImage : public ImagePixelData -{ -public: - CoreGraphicsImage (const Image::PixelFormat format, const int w, const int h, const bool clearImage) - : ImagePixelData (format, w, h), cachedImageRef (0) - { - pixelStride = format == Image::RGB ? 3 : ((format == Image::ARGB) ? 4 : 1); - lineStride = (pixelStride * jmax (1, width) + 3) & ~3; - - imageData.allocate ((size_t) (lineStride * jmax (1, height)), clearImage); - - CGColorSpaceRef colourSpace = (format == Image::SingleChannel) ? CGColorSpaceCreateDeviceGray() - : CGColorSpaceCreateDeviceRGB(); - - context = CGBitmapContextCreate (imageData, (size_t) width, (size_t) height, 8, (size_t) lineStride, - colourSpace, getCGImageFlags (format)); - - CGColorSpaceRelease (colourSpace); - } - - ~CoreGraphicsImage() - { - freeCachedImageRef(); - CGContextRelease (context); - } - - LowLevelGraphicsContext* createLowLevelContext() override - { - freeCachedImageRef(); - sendDataChangeMessage(); - return new CoreGraphicsContext (context, height, 1.0f); - } - - void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override - { - bitmap.data = imageData + x * pixelStride + y * lineStride; - bitmap.pixelFormat = pixelFormat; - bitmap.lineStride = lineStride; - bitmap.pixelStride = pixelStride; - - if (mode != Image::BitmapData::readOnly) - { - freeCachedImageRef(); - sendDataChangeMessage(); - } - } - - ImagePixelData* clone() override - { - CoreGraphicsImage* im = new CoreGraphicsImage (pixelFormat, width, height, false); - memcpy (im->imageData, imageData, (size_t) (lineStride * height)); - return im; - } - - ImageType* createType() const override { return new NativeImageType(); } - - //============================================================================== - static CGImageRef getCachedImageRef (const Image& juceImage, CGColorSpaceRef colourSpace) - { - CoreGraphicsImage* const cgim = dynamic_cast (juceImage.getPixelData()); - - if (cgim != nullptr && cgim->cachedImageRef != 0) - { - CGImageRetain (cgim->cachedImageRef); - return cgim->cachedImageRef; - } - - CGImageRef ref = createImage (juceImage, colourSpace, false); - - if (cgim != nullptr) - { - CGImageRetain (ref); - cgim->cachedImageRef = ref; - } - - return ref; - } - - static CGImageRef createImage (const Image& juceImage, CGColorSpaceRef colourSpace, const bool mustOutliveSource) - { - const Image::BitmapData srcData (juceImage, Image::BitmapData::readOnly); - CGDataProviderRef provider; - - if (mustOutliveSource) - { - CFDataRef data = CFDataCreate (0, (const UInt8*) srcData.data, (CFIndex) (srcData.lineStride * srcData.height)); - provider = CGDataProviderCreateWithCFData (data); - CFRelease (data); - } - else - { - provider = CGDataProviderCreateWithData (0, srcData.data, (size_t) (srcData.lineStride * srcData.height), 0); - } - - CGImageRef imageRef = CGImageCreate ((size_t) srcData.width, - (size_t) srcData.height, - 8, (size_t) srcData.pixelStride * 8, - (size_t) srcData.lineStride, - colourSpace, getCGImageFlags (juceImage.getFormat()), provider, - 0, true, kCGRenderingIntentDefault); - - CGDataProviderRelease (provider); - return imageRef; - } - - //============================================================================== - CGContextRef context; - CGImageRef cachedImageRef; - HeapBlock imageData; - int pixelStride, lineStride; - -private: - void freeCachedImageRef() - { - if (cachedImageRef != 0) - { - CGImageRelease (cachedImageRef); - cachedImageRef = 0; - } - } - - static CGBitmapInfo getCGImageFlags (const Image::PixelFormat& format) - { - #if JUCE_BIG_ENDIAN - return format == Image::ARGB ? (kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Big) : kCGBitmapByteOrderDefault; - #else - return format == Image::ARGB ? (kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little) : kCGBitmapByteOrderDefault; - #endif - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoreGraphicsImage) -}; - -ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const -{ - return new CoreGraphicsImage (format == Image::RGB ? Image::ARGB : format, width, height, clearImage); -} - -//============================================================================== -CoreGraphicsContext::CoreGraphicsContext (CGContextRef c, const float h, const float scale) - : context (c), - flipHeight (h), - targetScale (scale), - lastClipRectIsValid (false), - state (new SavedState()) -{ - CGContextRetain (context); - CGContextSaveGState(context); - CGContextSetShouldSmoothFonts (context, true); - CGContextSetShouldAntialias (context, true); - CGContextSetBlendMode (context, kCGBlendModeNormal); - rgbColourSpace = CGColorSpaceCreateDeviceRGB(); - greyColourSpace = CGColorSpaceCreateDeviceGray(); - setFont (Font()); -} - -CoreGraphicsContext::~CoreGraphicsContext() -{ - CGContextRestoreGState (context); - CGContextRelease (context); - CGColorSpaceRelease (rgbColourSpace); - CGColorSpaceRelease (greyColourSpace); -} - -//============================================================================== -void CoreGraphicsContext::setOrigin (Point o) -{ - CGContextTranslateCTM (context, o.x, -o.y); - - if (lastClipRectIsValid) - lastClipRect.translate (-o.x, -o.y); -} - -void CoreGraphicsContext::addTransform (const AffineTransform& transform) -{ - applyTransform (AffineTransform::verticalFlip ((float) flipHeight) - .followedBy (transform) - .translated (0, (float) -flipHeight) - .scaled (1.0f, -1.0f)); - lastClipRectIsValid = false; - - jassert (getPhysicalPixelScaleFactor() > 0.0f); - jassert (getPhysicalPixelScaleFactor() > 0.0f); -} - -float CoreGraphicsContext::getPhysicalPixelScaleFactor() -{ - const CGAffineTransform t = CGContextGetCTM (context); - - return targetScale * (float) (juce_hypot (t.a, t.c) + juce_hypot (t.b, t.d)) / 2.0f; - -// return targetScale * (float) (t.a + t.d) / 2.0f; -} - -bool CoreGraphicsContext::clipToRectangle (const Rectangle& r) -{ - CGContextClipToRect (context, CGRectMake (r.getX(), flipHeight - r.getBottom(), r.getWidth(), r.getHeight())); - - if (lastClipRectIsValid) - { - // This is actually incorrect, because the actual clip region may be complex, and - // clipping its bounds to a rect may not be right... But, removing this shortcut - // doesn't actually fix anything because CoreGraphics also ignores complex regions - // when calculating the resultant clip bounds, and makes the same mistake! - lastClipRect = lastClipRect.getIntersection (r); - return ! lastClipRect.isEmpty(); - } - - return ! isClipEmpty(); -} - -bool CoreGraphicsContext::clipToRectangleListWithoutTest (const RectangleList& clipRegion) -{ - if (clipRegion.isEmpty()) - { - CGContextClipToRect (context, CGRectZero); - lastClipRectIsValid = true; - lastClipRect = Rectangle(); - return false; - } - else - { - const size_t numRects = (size_t) clipRegion.getNumRectangles(); - HeapBlock rects (numRects); - - int i = 0; - for (const Rectangle* r = clipRegion.begin(), * const e = clipRegion.end(); r != e; ++r) - rects[i++] = CGRectMake (r->getX(), flipHeight - r->getBottom(), r->getWidth(), r->getHeight()); - - CGContextClipToRects (context, rects, numRects); - lastClipRectIsValid = false; - return true; - } -} - -bool CoreGraphicsContext::clipToRectangleList (const RectangleList& clipRegion) -{ - return clipToRectangleListWithoutTest (clipRegion) && ! isClipEmpty(); -} - -void CoreGraphicsContext::excludeClipRectangle (const Rectangle& r) -{ - RectangleList remaining (getClipBounds()); - remaining.subtract (r); - clipToRectangleListWithoutTest (remaining); -} - -void CoreGraphicsContext::clipToPath (const Path& path, const AffineTransform& transform) -{ - createPath (path, transform); - CGContextClip (context); - lastClipRectIsValid = false; -} - -void CoreGraphicsContext::clipToImageAlpha (const Image& sourceImage, const AffineTransform& transform) -{ - if (! transform.isSingularity()) - { - Image singleChannelImage (sourceImage); - - if (sourceImage.getFormat() != Image::SingleChannel) - singleChannelImage = sourceImage.convertedToFormat (Image::SingleChannel); - - CGImageRef image = CoreGraphicsImage::createImage (singleChannelImage, greyColourSpace, true); - - flip(); - AffineTransform t (AffineTransform::verticalFlip (sourceImage.getHeight()).followedBy (transform)); - applyTransform (t); - - CGRect r = convertToCGRect (sourceImage.getBounds()); - CGContextClipToMask (context, r, image); - - applyTransform (t.inverted()); - flip(); - - CGImageRelease (image); - lastClipRectIsValid = false; - } -} - -bool CoreGraphicsContext::clipRegionIntersects (const Rectangle& r) -{ - return getClipBounds().intersects (r); -} - -Rectangle CoreGraphicsContext::getClipBounds() const -{ - if (! lastClipRectIsValid) - { - CGRect bounds = CGRectIntegral (CGContextGetClipBoundingBox (context)); - - lastClipRectIsValid = true; - lastClipRect.setBounds (roundToInt (bounds.origin.x), - roundToInt (flipHeight - (bounds.origin.y + bounds.size.height)), - roundToInt (bounds.size.width), - roundToInt (bounds.size.height)); - } - - return lastClipRect; -} - -bool CoreGraphicsContext::isClipEmpty() const -{ - return getClipBounds().isEmpty(); -} - -//============================================================================== -void CoreGraphicsContext::saveState() -{ - CGContextSaveGState (context); - stateStack.add (new SavedState (*state)); -} - -void CoreGraphicsContext::restoreState() -{ - CGContextRestoreGState (context); - - if (SavedState* const top = stateStack.getLast()) - { - state = top; - stateStack.removeLast (1, false); - lastClipRectIsValid = false; - } - else - { - jassertfalse; // trying to pop with an empty stack! - } -} - -void CoreGraphicsContext::beginTransparencyLayer (float opacity) -{ - saveState(); - CGContextSetAlpha (context, opacity); - CGContextBeginTransparencyLayer (context, 0); -} - -void CoreGraphicsContext::endTransparencyLayer() -{ - CGContextEndTransparencyLayer (context); - restoreState(); -} - -//============================================================================== -void CoreGraphicsContext::setFill (const FillType& fillType) -{ - state->setFill (fillType); - - if (fillType.isColour()) - { - CGContextSetRGBFillColor (context, fillType.colour.getFloatRed(), fillType.colour.getFloatGreen(), - fillType.colour.getFloatBlue(), fillType.colour.getFloatAlpha()); - CGContextSetAlpha (context, 1.0f); - } -} - -void CoreGraphicsContext::setOpacity (float newOpacity) -{ - state->fillType.setOpacity (newOpacity); - setFill (state->fillType); -} - -void CoreGraphicsContext::setInterpolationQuality (Graphics::ResamplingQuality quality) -{ - CGContextSetInterpolationQuality (context, quality == Graphics::lowResamplingQuality - ? kCGInterpolationLow - : kCGInterpolationHigh); -} - -//============================================================================== -void CoreGraphicsContext::fillRect (const Rectangle& r, const bool replaceExistingContents) -{ - fillCGRect (CGRectMake (r.getX(), flipHeight - r.getBottom(), r.getWidth(), r.getHeight()), replaceExistingContents); -} - -void CoreGraphicsContext::fillRect (const Rectangle& r) -{ - fillCGRect (CGRectMake (r.getX(), flipHeight - r.getBottom(), r.getWidth(), r.getHeight()), false); -} - -void CoreGraphicsContext::fillCGRect (const CGRect& cgRect, const bool replaceExistingContents) -{ - if (replaceExistingContents) - { - #if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 - CGContextClearRect (context, cgRect); - #else - #if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - if (CGContextDrawLinearGradient == 0) // (just a way of checking whether we're running in 10.5 or later) - CGContextClearRect (context, cgRect); - else - #endif - CGContextSetBlendMode (context, kCGBlendModeCopy); - #endif - - fillCGRect (cgRect, false); - CGContextSetBlendMode (context, kCGBlendModeNormal); - } - else - { - if (state->fillType.isColour()) - { - CGContextFillRect (context, cgRect); - } - else if (state->fillType.isGradient()) - { - CGContextSaveGState (context); - CGContextClipToRect (context, cgRect); - drawGradient(); - CGContextRestoreGState (context); - } - else - { - CGContextSaveGState (context); - CGContextClipToRect (context, cgRect); - drawImage (state->fillType.image, state->fillType.transform, true); - CGContextRestoreGState (context); - } - } -} - -void CoreGraphicsContext::fillPath (const Path& path, const AffineTransform& transform) -{ - CGContextSaveGState (context); - - if (state->fillType.isColour()) - { - flip(); - applyTransform (transform); - createPath (path); - - if (path.isUsingNonZeroWinding()) - CGContextFillPath (context); - else - CGContextEOFillPath (context); - } - else - { - createPath (path, transform); - - if (path.isUsingNonZeroWinding()) - CGContextClip (context); - else - CGContextEOClip (context); - - if (state->fillType.isGradient()) - drawGradient(); - else - drawImage (state->fillType.image, state->fillType.transform, true); - } - - CGContextRestoreGState (context); -} - -void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTransform& transform) -{ - drawImage (sourceImage, transform, false); -} - -void CoreGraphicsContext::drawImage (const Image& sourceImage, const AffineTransform& transform, const bool fillEntireClipAsTiles) -{ - const int iw = sourceImage.getWidth(); - const int ih = sourceImage.getHeight(); - CGImageRef image = CoreGraphicsImage::getCachedImageRef (sourceImage, rgbColourSpace); - - CGContextSaveGState (context); - CGContextSetAlpha (context, state->fillType.getOpacity()); - - flip(); - applyTransform (AffineTransform::verticalFlip (ih).followedBy (transform)); - CGRect imageRect = CGRectMake (0, 0, iw, ih); - - if (fillEntireClipAsTiles) - { - #if JUCE_IOS - CGContextDrawTiledImage (context, imageRect, image); - #else - #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5 - // There's a bug in CGContextDrawTiledImage that makes it incredibly slow - // if it's doing a transformation - it's quicker to just draw lots of images manually - if (&CGContextDrawTiledImage != 0 && transform.isOnlyTranslation()) - CGContextDrawTiledImage (context, imageRect, image); - else - #endif - { - // Fallback to manually doing a tiled fill on 10.4 - CGRect clip = CGRectIntegral (CGContextGetClipBoundingBox (context)); - - int x = 0, y = 0; - while (x > clip.origin.x) x -= iw; - while (y > clip.origin.y) y -= ih; - - const int right = (int) (clip.origin.x + clip.size.width); - const int bottom = (int) (clip.origin.y + clip.size.height); - - while (y < bottom) - { - for (int x2 = x; x2 < right; x2 += iw) - CGContextDrawImage (context, CGRectMake (x2, y, iw, ih), image); - - y += ih; - } - } - #endif - } - else - { - CGContextDrawImage (context, imageRect, image); - } - - CGImageRelease (image); // (This causes a memory bug in iOS sim 3.0 - try upgrading to a later version if you hit this) - CGContextRestoreGState (context); -} - -//============================================================================== -void CoreGraphicsContext::drawLine (const Line& line) -{ - if (state->fillType.isColour()) - { - CGContextSetLineCap (context, kCGLineCapSquare); - CGContextSetLineWidth (context, 1.0f); - CGContextSetRGBStrokeColor (context, - state->fillType.colour.getFloatRed(), state->fillType.colour.getFloatGreen(), - state->fillType.colour.getFloatBlue(), state->fillType.colour.getFloatAlpha()); - - CGPoint cgLine[] = { { (CGFloat) line.getStartX(), flipHeight - (CGFloat) line.getStartY() }, - { (CGFloat) line.getEndX(), flipHeight - (CGFloat) line.getEndY() } }; - - CGContextStrokeLineSegments (context, cgLine, 1); - } - else - { - Path p; - p.addLineSegment (line, 1.0f); - fillPath (p, AffineTransform::identity); - } -} - -void CoreGraphicsContext::fillRectList (const RectangleList& list) -{ - HeapBlock rects ((size_t) list.getNumRectangles()); - - size_t num = 0; - for (const Rectangle* r = list.begin(), * const e = list.end(); r != e; ++r) - rects[num++] = CGRectMake (r->getX(), flipHeight - r->getBottom(), r->getWidth(), r->getHeight()); - - if (state->fillType.isColour()) - { - CGContextFillRects (context, rects, num); - } - else if (state->fillType.isGradient()) - { - CGContextSaveGState (context); - CGContextClipToRects (context, rects, num); - drawGradient(); - CGContextRestoreGState (context); - } - else - { - CGContextSaveGState (context); - CGContextClipToRects (context, rects, num); - drawImage (state->fillType.image, state->fillType.transform, true); - CGContextRestoreGState (context); - } -} - -void CoreGraphicsContext::setFont (const Font& newFont) -{ - if (state->font != newFont) - { - state->fontRef = 0; - state->font = newFont; - - if (OSXTypeface* osxTypeface = dynamic_cast (state->font.getTypeface())) - { - state->fontRef = osxTypeface->fontRef; - CGContextSetFont (context, state->fontRef); - CGContextSetFontSize (context, state->font.getHeight() * osxTypeface->fontHeightToPointsFactor); - - state->fontTransform = osxTypeface->renderingTransform; - state->fontTransform.a *= state->font.getHorizontalScale(); - CGContextSetTextMatrix (context, state->fontTransform); - } - } -} - -const Font& CoreGraphicsContext::getFont() -{ - return state->font; -} - -void CoreGraphicsContext::drawGlyph (int glyphNumber, const AffineTransform& transform) -{ - if (state->fontRef != 0 && state->fillType.isColour()) - { - #if JUCE_CLANG - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - #endif - - if (transform.isOnlyTranslation()) - { - CGContextSetTextMatrix (context, state->fontTransform); // have to set this each time, as it's not saved as part of the state - - CGGlyph g = (CGGlyph) glyphNumber; - CGContextShowGlyphsAtPoint (context, transform.getTranslationX(), - flipHeight - roundToInt (transform.getTranslationY()), &g, 1); - } - else - { - CGContextSaveGState (context); - flip(); - applyTransform (transform); - - CGAffineTransform t = state->fontTransform; - t.d = -t.d; - CGContextSetTextMatrix (context, t); - - CGGlyph g = (CGGlyph) glyphNumber; - CGContextShowGlyphsAtPoint (context, 0, 0, &g, 1); - - CGContextRestoreGState (context); - } - - #if JUCE_CLANG - #pragma clang diagnostic pop - #endif - } - else - { - Path p; - Font& f = state->font; - f.getTypeface()->getOutlineForGlyph (glyphNumber, p); - - fillPath (p, AffineTransform::scale (f.getHeight() * f.getHorizontalScale(), f.getHeight()) - .followedBy (transform)); - } -} - -bool CoreGraphicsContext::drawTextLayout (const AttributedString& text, const Rectangle& area) -{ - #if JUCE_CORETEXT_AVAILABLE - CoreTextTypeLayout::drawToCGContext (text, area, context, (float) flipHeight); - return true; - #else - (void) text; (void) area; - return false; - #endif -} - -CoreGraphicsContext::SavedState::SavedState() - : font (1.0f), fontRef (0), fontTransform (CGAffineTransformIdentity), gradient (0) -{ -} - -CoreGraphicsContext::SavedState::SavedState (const SavedState& other) - : fillType (other.fillType), font (other.font), fontRef (other.fontRef), - fontTransform (other.fontTransform), gradient (other.gradient) -{ - if (gradient != 0) - CGGradientRetain (gradient); -} - -CoreGraphicsContext::SavedState::~SavedState() -{ - if (gradient != 0) - CGGradientRelease (gradient); -} - -void CoreGraphicsContext::SavedState::setFill (const FillType& newFill) -{ - fillType = newFill; - - if (gradient != 0) - { - CGGradientRelease (gradient); - gradient = 0; - } -} - -static CGGradientRef createGradient (const ColourGradient& g, CGColorSpaceRef colourSpace) -{ - const int numColours = g.getNumColours(); - CGFloat* const data = (CGFloat*) alloca (numColours * 5 * sizeof (CGFloat)); - CGFloat* const locations = data; - CGFloat* const components = data + numColours; - CGFloat* comps = components; - - for (int i = 0; i < numColours; ++i) - { - const Colour colour (g.getColour (i)); - *comps++ = colour.getFloatRed(); - *comps++ = colour.getFloatGreen(); - *comps++ = colour.getFloatBlue(); - *comps++ = colour.getFloatAlpha(); - locations[i] = g.getColourPosition (i); - } - - return CGGradientCreateWithColorComponents (colourSpace, components, locations, numColours); -} - -void CoreGraphicsContext::drawGradient() -{ - flip(); - applyTransform (state->fillType.transform); - CGContextSetAlpha (context, state->fillType.getOpacity()); - - const ColourGradient& g = *state->fillType.gradient; - - CGPoint p1 (convertToCGPoint (g.point1)); - CGPoint p2 (convertToCGPoint (g.point2)); - - state->fillType.transform.transformPoints (p1.x, p1.y, p2.x, p2.y); - - if (state->gradient == 0) - state->gradient = createGradient (g, rgbColourSpace); - - if (g.isRadial) - CGContextDrawRadialGradient (context, state->gradient, p1, 0, p1, g.point1.getDistanceFrom (g.point2), - kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); - else - CGContextDrawLinearGradient (context, state->gradient, p1, p2, - kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation); -} - -void CoreGraphicsContext::createPath (const Path& path) const -{ - CGContextBeginPath (context); - Path::Iterator i (path); - - while (i.next()) - { - switch (i.elementType) - { - case Path::Iterator::startNewSubPath: CGContextMoveToPoint (context, i.x1, i.y1); break; - case Path::Iterator::lineTo: CGContextAddLineToPoint (context, i.x1, i.y1); break; - case Path::Iterator::quadraticTo: CGContextAddQuadCurveToPoint (context, i.x1, i.y1, i.x2, i.y2); break; - case Path::Iterator::cubicTo: CGContextAddCurveToPoint (context, i.x1, i.y1, i.x2, i.y2, i.x3, i.y3); break; - case Path::Iterator::closePath: CGContextClosePath (context); break; - default: jassertfalse; break; - } - } -} - -void CoreGraphicsContext::createPath (const Path& path, const AffineTransform& transform) const -{ - CGContextBeginPath (context); - Path::Iterator i (path); - - while (i.next()) - { - switch (i.elementType) - { - case Path::Iterator::startNewSubPath: - transform.transformPoint (i.x1, i.y1); - CGContextMoveToPoint (context, i.x1, flipHeight - i.y1); - break; - case Path::Iterator::lineTo: - transform.transformPoint (i.x1, i.y1); - CGContextAddLineToPoint (context, i.x1, flipHeight - i.y1); - break; - case Path::Iterator::quadraticTo: - transform.transformPoints (i.x1, i.y1, i.x2, i.y2); - CGContextAddQuadCurveToPoint (context, i.x1, flipHeight - i.y1, i.x2, flipHeight - i.y2); - break; - case Path::Iterator::cubicTo: - transform.transformPoints (i.x1, i.y1, i.x2, i.y2, i.x3, i.y3); - CGContextAddCurveToPoint (context, i.x1, flipHeight - i.y1, i.x2, flipHeight - i.y2, i.x3, flipHeight - i.y3); - break; - case Path::Iterator::closePath: - CGContextClosePath (context); break; - default: - jassertfalse; - break; - } - } -} - -void CoreGraphicsContext::flip() const -{ - CGContextConcatCTM (context, CGAffineTransformMake (1, 0, 0, -1, 0, flipHeight)); -} - -void CoreGraphicsContext::applyTransform (const AffineTransform& transform) const -{ - CGAffineTransform t; - t.a = transform.mat00; - t.b = transform.mat10; - t.c = transform.mat01; - t.d = transform.mat11; - t.tx = transform.mat02; - t.ty = transform.mat12; - CGContextConcatCTM (context, t); -} - -//============================================================================== -#if USE_COREGRAPHICS_RENDERING && JUCE_USE_COREIMAGE_LOADER -Image juce_loadWithCoreImage (InputStream& input) -{ - MemoryBlock data; - input.readIntoMemoryBlock (data, -1); - - #if JUCE_IOS - JUCE_AUTORELEASEPOOL - #endif - { - #if JUCE_IOS - if (UIImage* uiImage = [UIImage imageWithData: [NSData dataWithBytesNoCopy: data.getData() - length: data.getSize() - freeWhenDone: NO]]) - { - CGImageRef loadedImage = uiImage.CGImage; - - #else - CGDataProviderRef provider = CGDataProviderCreateWithData (0, data.getData(), data.getSize(), 0); - CGImageSourceRef imageSource = CGImageSourceCreateWithDataProvider (provider, 0); - CGDataProviderRelease (provider); - - if (imageSource != 0) - { - CGImageRef loadedImage = CGImageSourceCreateImageAtIndex (imageSource, 0, 0); - CFRelease (imageSource); - #endif - - if (loadedImage != 0) - { - CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo (loadedImage); - const bool hasAlphaChan = (alphaInfo != kCGImageAlphaNone - && alphaInfo != kCGImageAlphaNoneSkipLast - && alphaInfo != kCGImageAlphaNoneSkipFirst); - - Image image (NativeImageType().create (Image::ARGB, // (CoreImage doesn't work with 24-bit images) - (int) CGImageGetWidth (loadedImage), - (int) CGImageGetHeight (loadedImage), - hasAlphaChan)); - - CoreGraphicsImage* const cgImage = dynamic_cast (image.getPixelData()); - jassert (cgImage != nullptr); // if USE_COREGRAPHICS_RENDERING is set, the CoreGraphicsImage class should have been used. - - CGContextDrawImage (cgImage->context, convertToCGRect (image.getBounds()), loadedImage); - CGContextFlush (cgImage->context); - - #if ! JUCE_IOS - CFRelease (loadedImage); - #endif - - // Because it's impossible to create a truly 24-bit CG image, this flag allows a user - // to find out whether the file they just loaded the image from had an alpha channel or not. - image.getProperties()->set ("originalImageHadAlpha", hasAlphaChan); - return image; - } - } - } - - return Image::null; -} -#endif - -#if JUCE_MAC -Image juce_createImageFromCIImage (CIImage*, int, int); -Image juce_createImageFromCIImage (CIImage* im, int w, int h) -{ - CoreGraphicsImage* cgImage = new CoreGraphicsImage (Image::ARGB, w, h, false); - - CIContext* cic = [CIContext contextWithCGContext: cgImage->context options: nil]; - [cic drawImage: im inRect: CGRectMake (0, 0, w, h) fromRect: CGRectMake (0, 0, w, h)]; - CGContextFlush (cgImage->context); - - return Image (cgImage); -} - -CGImageRef juce_createCoreGraphicsImage (const Image& juceImage, CGColorSpaceRef colourSpace, - const bool mustOutliveSource) -{ - return CoreGraphicsImage::createImage (juceImage, colourSpace, mustOutliveSource); -} - -CGContextRef juce_getImageContext (const Image& image) -{ - if (CoreGraphicsImage* const cgi = dynamic_cast (image.getPixelData())) - return cgi->context; - - jassertfalse; - return 0; -} - -#endif diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h deleted file mode 100755 index ca6f699..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MAC_COREGRAPHICSHELPERS_H_INCLUDED -#define JUCE_MAC_COREGRAPHICSHELPERS_H_INCLUDED - - -//============================================================================== -namespace -{ - template - Rectangle convertToRectInt (const RectType& r) noexcept - { - return Rectangle ((int) r.origin.x, (int) r.origin.y, (int) r.size.width, (int) r.size.height); - } - - template - Rectangle convertToRectFloat (const RectType& r) noexcept - { - return Rectangle (r.origin.x, r.origin.y, r.size.width, r.size.height); - } - - template - CGRect convertToCGRect (const RectType& r) noexcept - { - return CGRectMake ((CGFloat) r.getX(), (CGFloat) r.getY(), (CGFloat) r.getWidth(), (CGFloat) r.getHeight()); - } - - template - CGPoint convertToCGPoint (const PointType& p) noexcept - { - return CGPointMake ((CGFloat) p.x, (CGFloat) p.y); - } -} - -extern CGImageRef juce_createCoreGraphicsImage (const Image&, CGColorSpaceRef, bool mustOutliveSource); -extern CGContextRef juce_getImageContext (const Image&); - -#endif // JUCE_MAC_COREGRAPHICSHELPERS_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm b/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm deleted file mode 100755 index 3298e9e..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_mac_Fonts.mm +++ /dev/null @@ -1,1321 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if (! defined (JUCE_CORETEXT_AVAILABLE)) \ - && (JUCE_IOS || (JUCE_MAC && MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_4)) - #define JUCE_CORETEXT_AVAILABLE 1 -#endif - -const float referenceFontSize = 1024.0f; - -#if JUCE_CORETEXT_AVAILABLE - -#if JUCE_MAC && MAC_OS_X_VERSION_MAX_ALLOWED == MAC_OS_X_VERSION_10_5 -extern "C" -{ - void CTRunGetAdvances (CTRunRef, CFRange, CGSize buffer[]); - const CGSize* CTRunGetAdvancesPtr (CTRunRef); -} -#endif - -static CTFontRef getCTFontFromTypeface (const Font& f); - -namespace CoreTextTypeLayout -{ - static String findBestAvailableStyle (const Font& font, CGAffineTransform& requiredTransform) - { - const StringArray availableStyles (Font::findAllTypefaceStyles (font.getTypefaceName())); - const String style (font.getTypefaceStyle()); - - if (! availableStyles.contains (style)) - { - if (font.isItalic()) // Fake-up an italic font if there isn't a real one. - requiredTransform = CGAffineTransformMake (1.0f, 0, 0.25f, 1.0f, 0, 0); - - return availableStyles[0]; - } - - return style; - } - - // Workaround for Apple bug in CTFontCreateWithFontDescriptor in Garageband/Logic on 10.6 - #if JUCE_MAC && ((! defined (MAC_OS_X_VERSION_10_7)) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7) - static CTFontRef getFontWithTrait (CTFontRef ctFontRef, CTFontSymbolicTraits trait) - { - if (CTFontRef newFont = CTFontCreateCopyWithSymbolicTraits (ctFontRef, 0.0f, nullptr, trait, trait)) - { - CFRelease (ctFontRef); - return newFont; - } - - return ctFontRef; - } - - static CTFontRef useStyleFallbackIfNecessary (CTFontRef ctFontRef, CFStringRef cfFontFamily, - const float fontSizePoints, const Font& font) - { - CFStringRef cfActualFontFamily = (CFStringRef) CTFontCopyAttribute (ctFontRef, kCTFontFamilyNameAttribute); - - if (CFStringCompare (cfFontFamily, cfActualFontFamily, 0) != kCFCompareEqualTo) - { - CFRelease (ctFontRef); - ctFontRef = CTFontCreateWithName (cfFontFamily, fontSizePoints, nullptr); - - if (font.isItalic()) ctFontRef = getFontWithTrait (ctFontRef, kCTFontItalicTrait); - if (font.isBold()) ctFontRef = getFontWithTrait (ctFontRef, kCTFontBoldTrait); - } - - CFRelease (cfActualFontFamily); - return ctFontRef; - } - #endif - - static float getFontTotalHeight (CTFontRef font) - { - return std::abs ((float) CTFontGetAscent (font)) + std::abs ((float) CTFontGetDescent (font)); - } - - static float getHeightToPointsFactor (CTFontRef font) - { - return referenceFontSize / getFontTotalHeight (font); - } - - static CTFontRef getFontWithPointSize (CTFontRef font, float size) - { - CTFontRef newFont = CTFontCreateCopyWithAttributes (font, size, nullptr, nullptr); - CFRelease (font); - return newFont; - } - - static CTFontRef createCTFont (const Font& font, const float fontSizePoints, CGAffineTransform& transformRequired) - { - CFStringRef cfFontFamily = FontStyleHelpers::getConcreteFamilyName (font).toCFString(); - CFStringRef cfFontStyle = findBestAvailableStyle (font, transformRequired).toCFString(); - CFStringRef keys[] = { kCTFontFamilyNameAttribute, kCTFontStyleNameAttribute }; - CFTypeRef values[] = { cfFontFamily, cfFontStyle }; - - CFDictionaryRef fontDescAttributes = CFDictionaryCreate (nullptr, (const void**) &keys, - (const void**) &values, - numElementsInArray (keys), - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks); - CFRelease (cfFontStyle); - - CTFontDescriptorRef ctFontDescRef = CTFontDescriptorCreateWithAttributes (fontDescAttributes); - CFRelease (fontDescAttributes); - - CTFontRef ctFontRef = CTFontCreateWithFontDescriptor (ctFontDescRef, fontSizePoints, nullptr); - CFRelease (ctFontDescRef); - - #if JUCE_MAC && ((! defined (MAC_OS_X_VERSION_10_7)) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7) - ctFontRef = useStyleFallbackIfNecessary (ctFontRef, cfFontFamily, fontSizePoints, font); - #endif - - CFRelease (cfFontFamily); - - return ctFontRef; - } - - //============================================================================== - struct Advances - { - Advances (CTRunRef run, const CFIndex numGlyphs) - : advances (CTRunGetAdvancesPtr (run)) - { - if (advances == nullptr) - { - local.malloc ((size_t) numGlyphs); - CTRunGetAdvances (run, CFRangeMake (0, 0), local); - advances = local; - } - } - - const CGSize* advances; - HeapBlock local; - }; - - struct Glyphs - { - Glyphs (CTRunRef run, const size_t numGlyphs) - : glyphs (CTRunGetGlyphsPtr (run)) - { - if (glyphs == nullptr) - { - local.malloc (numGlyphs); - CTRunGetGlyphs (run, CFRangeMake (0, 0), local); - glyphs = local; - } - } - - const CGGlyph* glyphs; - HeapBlock local; - }; - - struct Positions - { - Positions (CTRunRef run, const size_t numGlyphs) - : points (CTRunGetPositionsPtr (run)) - { - if (points == nullptr) - { - local.malloc (numGlyphs); - CTRunGetPositions (run, CFRangeMake (0, 0), local); - points = local; - } - } - - const CGPoint* points; - HeapBlock local; - }; - - struct LineInfo - { - LineInfo (CTFrameRef frame, CTLineRef line, CFIndex lineIndex) - { - CTFrameGetLineOrigins (frame, CFRangeMake (lineIndex, 1), &origin); - CTLineGetTypographicBounds (line, &ascent, &descent, &leading); - } - - CGPoint origin; - CGFloat ascent, descent, leading; - }; - - static CTFontRef getOrCreateFont (const Font& f) - { - if (CTFontRef ctf = getCTFontFromTypeface (f)) - { - CFRetain (ctf); - return ctf; - } - - CGAffineTransform transform; - return createCTFont (f, referenceFontSize, transform); - } - - //============================================================================== - static CFAttributedStringRef createCFAttributedString (const AttributedString& text) - { - #if JUCE_IOS - CGColorSpaceRef rgbColourSpace = CGColorSpaceCreateDeviceRGB(); - #endif - - CFStringRef cfText = text.getText().toCFString(); - CFMutableAttributedStringRef attribString = CFAttributedStringCreateMutable (kCFAllocatorDefault, 0); - CFAttributedStringReplaceString (attribString, CFRangeMake(0, 0), cfText); - CFRelease (cfText); - - const int numCharacterAttributes = text.getNumAttributes(); - - for (int i = 0; i < numCharacterAttributes; ++i) - { - const AttributedString::Attribute& attr = *text.getAttribute (i); - - if (attr.range.getStart() > CFAttributedStringGetLength (attribString)) - continue; - - Range range (attr.range); - range.setEnd (jmin (range.getEnd(), (int) CFAttributedStringGetLength (attribString))); - - if (const Font* const f = attr.getFont()) - { - if (CTFontRef ctFontRef = getOrCreateFont (*f)) - { - ctFontRef = getFontWithPointSize (ctFontRef, f->getHeight() * getHeightToPointsFactor (ctFontRef)); - - CFAttributedStringSetAttribute (attribString, CFRangeMake (range.getStart(), range.getLength()), - kCTFontAttributeName, ctFontRef); - CFRelease (ctFontRef); - } - } - - if (const Colour* const col = attr.getColour()) - { - #if JUCE_IOS - const CGFloat components[] = { col->getFloatRed(), - col->getFloatGreen(), - col->getFloatBlue(), - col->getFloatAlpha() }; - CGColorRef colour = CGColorCreate (rgbColourSpace, components); - #else - CGColorRef colour = CGColorCreateGenericRGB (col->getFloatRed(), - col->getFloatGreen(), - col->getFloatBlue(), - col->getFloatAlpha()); - #endif - - CFAttributedStringSetAttribute (attribString, - CFRangeMake (range.getStart(), range.getLength()), - kCTForegroundColorAttributeName, colour); - CGColorRelease (colour); - } - } - - // Paragraph Attributes - CTTextAlignment ctTextAlignment = kCTLeftTextAlignment; - CTLineBreakMode ctLineBreakMode = kCTLineBreakByWordWrapping; - const CGFloat ctLineSpacing = text.getLineSpacing(); - - switch (text.getJustification().getOnlyHorizontalFlags()) - { - case Justification::left: break; - case Justification::right: ctTextAlignment = kCTRightTextAlignment; break; - case Justification::horizontallyCentred: ctTextAlignment = kCTCenterTextAlignment; break; - case Justification::horizontallyJustified: ctTextAlignment = kCTJustifiedTextAlignment; break; - default: jassertfalse; break; // Illegal justification flags - } - - switch (text.getWordWrap()) - { - case AttributedString::byWord: break; - case AttributedString::none: ctLineBreakMode = kCTLineBreakByClipping; break; - case AttributedString::byChar: ctLineBreakMode = kCTLineBreakByCharWrapping; break; - default: break; - } - - CTParagraphStyleSetting settings[] = - { - { kCTParagraphStyleSpecifierAlignment, sizeof (CTTextAlignment), &ctTextAlignment }, - { kCTParagraphStyleSpecifierLineBreakMode, sizeof (CTLineBreakMode), &ctLineBreakMode }, - - #if defined (MAC_OS_X_VERSION_10_7) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7 - { kCTParagraphStyleSpecifierLineSpacingAdjustment, sizeof (CGFloat), &ctLineSpacing } - #else - { kCTParagraphStyleSpecifierLineSpacing, sizeof (CGFloat), &ctLineSpacing } - #endif - }; - - CTParagraphStyleRef ctParagraphStyleRef = CTParagraphStyleCreate (settings, (size_t) numElementsInArray (settings)); - CFAttributedStringSetAttribute (attribString, CFRangeMake (0, CFAttributedStringGetLength (attribString)), - kCTParagraphStyleAttributeName, ctParagraphStyleRef); - CFRelease (ctParagraphStyleRef); - #if JUCE_IOS - CGColorSpaceRelease (rgbColourSpace); - #endif - return attribString; - } - - static CTFrameRef createCTFrame (const AttributedString& text, CGRect bounds) - { - CFAttributedStringRef attribString = createCFAttributedString (text); - CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString (attribString); - CFRelease (attribString); - - CGMutablePathRef path = CGPathCreateMutable(); - CGPathAddRect (path, nullptr, bounds); - - CTFrameRef frame = CTFramesetterCreateFrame (framesetter, CFRangeMake (0, 0), path, nullptr); - CFRelease (framesetter); - CGPathRelease (path); - - return frame; - } - - static Range getLineVerticalRange (CTFrameRef frame, CFArrayRef lines, int lineIndex) - { - LineInfo info (frame, (CTLineRef) CFArrayGetValueAtIndex (lines, lineIndex), lineIndex); - return Range ((float) (info.origin.y - info.descent), - (float) (info.origin.y + info.ascent)); - } - - static float findCTFrameHeight (CTFrameRef frame) - { - CFArrayRef lines = CTFrameGetLines (frame); - const CFIndex numLines = CFArrayGetCount (lines); - - if (numLines == 0) - return 0; - - Range range (getLineVerticalRange (frame, lines, 0)); - - if (numLines > 1) - range = range.getUnionWith (getLineVerticalRange (frame, lines, (int) numLines - 1)); - - return range.getLength(); - } - - static void drawToCGContext (const AttributedString& text, const Rectangle& area, - const CGContextRef& context, const float flipHeight) - { - CTFrameRef frame = createCTFrame (text, CGRectMake ((CGFloat) area.getX(), flipHeight - (CGFloat) area.getBottom(), - (CGFloat) area.getWidth(), (CGFloat) area.getHeight())); - - const int verticalJustification = text.getJustification().getOnlyVerticalFlags(); - - if (verticalJustification == Justification::verticallyCentred - || verticalJustification == Justification::bottom) - { - float adjust = area.getHeight() - findCTFrameHeight (frame); - - if (verticalJustification == Justification::verticallyCentred) - adjust *= 0.5f; - - CGContextSaveGState (context); - CGContextTranslateCTM (context, 0, -adjust); - CTFrameDraw (frame, context); - CGContextRestoreGState (context); - } - else - { - CTFrameDraw (frame, context); - } - - CFRelease (frame); - } - - static void createLayout (TextLayout& glyphLayout, const AttributedString& text) - { - const CGFloat boundsHeight = glyphLayout.getHeight(); - CTFrameRef frame = createCTFrame (text, CGRectMake (0, 0, glyphLayout.getWidth(), boundsHeight)); - - CFArrayRef lines = CTFrameGetLines (frame); - const CFIndex numLines = CFArrayGetCount (lines); - - glyphLayout.ensureStorageAllocated ((int) numLines); - - for (CFIndex i = 0; i < numLines; ++i) - { - CTLineRef line = (CTLineRef) CFArrayGetValueAtIndex (lines, i); - - CFArrayRef runs = CTLineGetGlyphRuns (line); - const CFIndex numRuns = CFArrayGetCount (runs); - - const CFRange cfrlineStringRange = CTLineGetStringRange (line); - const CFIndex lineStringEnd = cfrlineStringRange.location + cfrlineStringRange.length - 1; - const Range lineStringRange ((int) cfrlineStringRange.location, (int) lineStringEnd); - - LineInfo lineInfo (frame, line, i); - - TextLayout::Line* const glyphLine = new TextLayout::Line (lineStringRange, - Point ((float) lineInfo.origin.x, - (float) (boundsHeight - lineInfo.origin.y)), - (float) lineInfo.ascent, - (float) lineInfo.descent, - (float) lineInfo.leading, - (int) numRuns); - glyphLayout.addLine (glyphLine); - - for (CFIndex j = 0; j < numRuns; ++j) - { - CTRunRef run = (CTRunRef) CFArrayGetValueAtIndex (runs, j); - const CFIndex numGlyphs = CTRunGetGlyphCount (run); - const CFRange runStringRange = CTRunGetStringRange (run); - - TextLayout::Run* const glyphRun = new TextLayout::Run (Range ((int) runStringRange.location, - (int) (runStringRange.location + runStringRange.length - 1)), - (int) numGlyphs); - glyphLine->runs.add (glyphRun); - - CFDictionaryRef runAttributes = CTRunGetAttributes (run); - - CTFontRef ctRunFont; - if (CFDictionaryGetValueIfPresent (runAttributes, kCTFontAttributeName, (const void **) &ctRunFont)) - { - CFStringRef cfsFontName = CTFontCopyPostScriptName (ctRunFont); - CTFontRef ctFontRef = CTFontCreateWithName (cfsFontName, referenceFontSize, nullptr); - CFRelease (cfsFontName); - - const float fontHeightToPointsFactor = getHeightToPointsFactor (ctFontRef); - CFRelease (ctFontRef); - - CFStringRef cfsFontFamily = (CFStringRef) CTFontCopyAttribute (ctRunFont, kCTFontFamilyNameAttribute); - CFStringRef cfsFontStyle = (CFStringRef) CTFontCopyAttribute (ctRunFont, kCTFontStyleNameAttribute); - - glyphRun->font = Font (String::fromCFString (cfsFontFamily), - String::fromCFString (cfsFontStyle), - (float) (CTFontGetSize (ctRunFont) / fontHeightToPointsFactor)); - - CFRelease (cfsFontStyle); - CFRelease (cfsFontFamily); - } - - CGColorRef cgRunColor; - if (CFDictionaryGetValueIfPresent (runAttributes, kCTForegroundColorAttributeName, (const void**) &cgRunColor) - && CGColorGetNumberOfComponents (cgRunColor) == 4) - { - const CGFloat* const components = CGColorGetComponents (cgRunColor); - - glyphRun->colour = Colour::fromFloatRGBA ((float) components[0], - (float) components[1], - (float) components[2], - (float) components[3]); - } - - const Glyphs glyphs (run, (size_t) numGlyphs); - const Advances advances (run, numGlyphs); - const Positions positions (run, (size_t) numGlyphs); - - for (CFIndex k = 0; k < numGlyphs; ++k) - glyphRun->glyphs.add (TextLayout::Glyph (glyphs.glyphs[k], Point ((float) positions.points[k].x, - (float) positions.points[k].y), - (float) advances.advances[k].width)); - } - } - - CFRelease (frame); - } -} - - -//============================================================================== -class OSXTypeface : public Typeface -{ -public: - OSXTypeface (const Font& font) - : Typeface (font.getTypefaceName(), - font.getTypefaceStyle()), - fontRef (nullptr), - ctFontRef (nullptr), - fontHeightToPointsFactor (1.0f), - renderingTransform (CGAffineTransformIdentity), - isMemoryFont (false), - attributedStringAtts (nullptr), - ascent (0.0f), - unitsToHeightScaleFactor (0.0f) - { - ctFontRef = CoreTextTypeLayout::createCTFont (font, referenceFontSize, renderingTransform); - - if (ctFontRef != nullptr) - { - fontRef = CTFontCopyGraphicsFont (ctFontRef, nullptr); - initialiseMetrics(); - } - } - - OSXTypeface (const void* data, size_t dataSize) - : Typeface (String(), String()), - fontRef (nullptr), - ctFontRef (nullptr), - fontHeightToPointsFactor (1.0f), - renderingTransform (CGAffineTransformIdentity), - isMemoryFont (true), - attributedStringAtts (nullptr), - ascent (0.0f), - unitsToHeightScaleFactor (0.0f) - { - CFDataRef cfData = CFDataCreate (kCFAllocatorDefault, (const UInt8*) data, (CFIndex) dataSize); - CGDataProviderRef provider = CGDataProviderCreateWithCFData (cfData); - CFRelease (cfData); - - fontRef = CGFontCreateWithDataProvider (provider); - CGDataProviderRelease (provider); - - if (fontRef != nullptr) - { - ctFontRef = CTFontCreateWithGraphicsFont (fontRef, referenceFontSize, nullptr, nullptr); - - if (ctFontRef != nullptr) - { - if (CFStringRef fontName = CTFontCopyName (ctFontRef, kCTFontFamilyNameKey)) - { - name = String::fromCFString (fontName); - CFRelease (fontName); - } - - if (CFStringRef fontStyle = CTFontCopyName (ctFontRef, kCTFontStyleNameKey)) - { - style = String::fromCFString (fontStyle); - CFRelease (fontStyle); - } - - initialiseMetrics(); - } - } - } - - void initialiseMetrics() - { - const float ctAscent = std::abs ((float) CTFontGetAscent (ctFontRef)); - const float ctDescent = std::abs ((float) CTFontGetDescent (ctFontRef)); - const float ctTotalHeight = ctAscent + ctDescent; - - ascent = ctAscent / ctTotalHeight; - unitsToHeightScaleFactor = 1.0f / ctTotalHeight; - pathTransform = AffineTransform::identity.scale (unitsToHeightScaleFactor); - - fontHeightToPointsFactor = referenceFontSize / ctTotalHeight; - - const short zero = 0; - CFNumberRef numberRef = CFNumberCreate (0, kCFNumberShortType, &zero); - - CFStringRef keys[] = { kCTFontAttributeName, kCTLigatureAttributeName }; - CFTypeRef values[] = { ctFontRef, numberRef }; - attributedStringAtts = CFDictionaryCreate (nullptr, (const void**) &keys, (const void**) &values, numElementsInArray (keys), - &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFRelease (numberRef); - } - - ~OSXTypeface() - { - if (attributedStringAtts != nullptr) - CFRelease (attributedStringAtts); - - if (fontRef != nullptr) - CGFontRelease (fontRef); - - if (ctFontRef != nullptr) - CFRelease (ctFontRef); - } - - float getAscent() const override { return ascent; } - float getDescent() const override { return 1.0f - ascent; } - float getHeightToPointsFactor() const override { return fontHeightToPointsFactor; } - - float getStringWidth (const String& text) override - { - float x = 0; - - if (ctFontRef != nullptr && text.isNotEmpty()) - { - CFStringRef cfText = text.toCFString(); - CFAttributedStringRef attribString = CFAttributedStringCreate (kCFAllocatorDefault, cfText, attributedStringAtts); - CFRelease (cfText); - - CTLineRef line = CTLineCreateWithAttributedString (attribString); - CFArrayRef runArray = CTLineGetGlyphRuns (line); - - for (CFIndex i = 0; i < CFArrayGetCount (runArray); ++i) - { - CTRunRef run = (CTRunRef) CFArrayGetValueAtIndex (runArray, i); - CFIndex length = CTRunGetGlyphCount (run); - - const CoreTextTypeLayout::Advances advances (run, length); - - for (int j = 0; j < length; ++j) - x += (float) advances.advances[j].width; - } - - CFRelease (line); - CFRelease (attribString); - - x *= unitsToHeightScaleFactor; - } - - return x; - } - - void getGlyphPositions (const String& text, Array & resultGlyphs, Array & xOffsets) override - { - xOffsets.add (0); - - if (ctFontRef != nullptr && text.isNotEmpty()) - { - float x = 0; - - CFStringRef cfText = text.toCFString(); - CFAttributedStringRef attribString = CFAttributedStringCreate (kCFAllocatorDefault, cfText, attributedStringAtts); - CFRelease (cfText); - - CTLineRef line = CTLineCreateWithAttributedString (attribString); - CFArrayRef runArray = CTLineGetGlyphRuns (line); - - for (CFIndex i = 0; i < CFArrayGetCount (runArray); ++i) - { - CTRunRef run = (CTRunRef) CFArrayGetValueAtIndex (runArray, i); - CFIndex length = CTRunGetGlyphCount (run); - - const CoreTextTypeLayout::Advances advances (run, length); - const CoreTextTypeLayout::Glyphs glyphs (run, (size_t) length); - - for (int j = 0; j < length; ++j) - { - x += (float) advances.advances[j].width; - xOffsets.add (x * unitsToHeightScaleFactor); - resultGlyphs.add (glyphs.glyphs[j]); - } - } - - CFRelease (line); - CFRelease (attribString); - } - } - - bool getOutlineForGlyph (int glyphNumber, Path& path) override - { - jassert (path.isEmpty()); // we might need to apply a transform to the path, so this must be empty - - CGPathRef pathRef = CTFontCreatePathForGlyph (ctFontRef, (CGGlyph) glyphNumber, &renderingTransform); - if (pathRef == 0) - return false; - - CGPathApply (pathRef, &path, pathApplier); - CFRelease (pathRef); - - if (! pathTransform.isIdentity()) - path.applyTransform (pathTransform); - - return true; - } - - //============================================================================== - CGFontRef fontRef; - CTFontRef ctFontRef; - - float fontHeightToPointsFactor; - CGAffineTransform renderingTransform; - - bool isMemoryFont; - -private: - CFDictionaryRef attributedStringAtts; - float ascent, unitsToHeightScaleFactor; - AffineTransform pathTransform; - - static void pathApplier (void* info, const CGPathElement* const element) - { - Path& path = *static_cast (info); - const CGPoint* const p = element->points; - - switch (element->type) - { - case kCGPathElementMoveToPoint: path.startNewSubPath ((float) p[0].x, (float) -p[0].y); break; - case kCGPathElementAddLineToPoint: path.lineTo ((float) p[0].x, (float) -p[0].y); break; - case kCGPathElementAddQuadCurveToPoint: path.quadraticTo ((float) p[0].x, (float) -p[0].y, - (float) p[1].x, (float) -p[1].y); break; - case kCGPathElementAddCurveToPoint: path.cubicTo ((float) p[0].x, (float) -p[0].y, - (float) p[1].x, (float) -p[1].y, - (float) p[2].x, (float) -p[2].y); break; - case kCGPathElementCloseSubpath: path.closeSubPath(); break; - default: jassertfalse; break; - } - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OSXTypeface) -}; - -CTFontRef getCTFontFromTypeface (const Font& f) -{ - if (OSXTypeface* tf = dynamic_cast (f.getTypeface())) - return tf->ctFontRef; - - return 0; -} - -StringArray Font::findAllTypefaceNames() -{ - StringArray names; - - #if MAC_OS_X_VERSION_MIN_REQUIRED > MAC_OS_X_VERSION_10_5 && ! JUCE_IOS - // CTFontManager only exists on OS X 10.6 and later, it does not exist on iOS - CFArrayRef fontFamilyArray = CTFontManagerCopyAvailableFontFamilyNames(); - - for (CFIndex i = 0; i < CFArrayGetCount (fontFamilyArray); ++i) - { - const String family (String::fromCFString ((CFStringRef) CFArrayGetValueAtIndex (fontFamilyArray, i))); - - if (! family.startsWithChar ('.')) // ignore fonts that start with a '.' - names.addIfNotAlreadyThere (family); - } - - CFRelease (fontFamilyArray); - #else - CTFontCollectionRef fontCollectionRef = CTFontCollectionCreateFromAvailableFonts (nullptr); - CFArrayRef fontDescriptorArray = CTFontCollectionCreateMatchingFontDescriptors (fontCollectionRef); - CFRelease (fontCollectionRef); - - for (CFIndex i = 0; i < CFArrayGetCount (fontDescriptorArray); ++i) - { - CTFontDescriptorRef ctFontDescriptorRef = (CTFontDescriptorRef) CFArrayGetValueAtIndex (fontDescriptorArray, i); - CFStringRef cfsFontFamily = (CFStringRef) CTFontDescriptorCopyAttribute (ctFontDescriptorRef, kCTFontFamilyNameAttribute); - - names.addIfNotAlreadyThere (String::fromCFString (cfsFontFamily)); - - CFRelease (cfsFontFamily); - } - - CFRelease (fontDescriptorArray); - #endif - - names.sort (true); - return names; -} - -StringArray Font::findAllTypefaceStyles (const String& family) -{ - if (FontStyleHelpers::isPlaceholderFamilyName (family)) - return findAllTypefaceStyles (FontStyleHelpers::getConcreteFamilyNameFromPlaceholder (family)); - - StringArray results; - - CFStringRef cfsFontFamily = family.toCFString(); - CFStringRef keys[] = { kCTFontFamilyNameAttribute }; - CFTypeRef values[] = { cfsFontFamily }; - - CFDictionaryRef fontDescAttributes = CFDictionaryCreate (nullptr, (const void**) &keys, (const void**) &values, numElementsInArray (keys), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFRelease (cfsFontFamily); - - CTFontDescriptorRef ctFontDescRef = CTFontDescriptorCreateWithAttributes (fontDescAttributes); - CFRelease (fontDescAttributes); - - CFArrayRef fontFamilyArray = CFArrayCreate (kCFAllocatorDefault, (const void**) &ctFontDescRef, 1, &kCFTypeArrayCallBacks); - CFRelease (ctFontDescRef); - - CTFontCollectionRef fontCollectionRef = CTFontCollectionCreateWithFontDescriptors (fontFamilyArray, nullptr); - CFRelease (fontFamilyArray); - - CFArrayRef fontDescriptorArray = CTFontCollectionCreateMatchingFontDescriptors (fontCollectionRef); - CFRelease (fontCollectionRef); - - if (fontDescriptorArray != nullptr) - { - for (CFIndex i = 0; i < CFArrayGetCount (fontDescriptorArray); ++i) - { - CTFontDescriptorRef ctFontDescriptorRef = (CTFontDescriptorRef) CFArrayGetValueAtIndex (fontDescriptorArray, i); - CFStringRef cfsFontStyle = (CFStringRef) CTFontDescriptorCopyAttribute (ctFontDescriptorRef, kCTFontStyleNameAttribute); - results.add (String::fromCFString (cfsFontStyle)); - CFRelease (cfsFontStyle); - } - - CFRelease (fontDescriptorArray); - } - - return results; -} - -#else - -//============================================================================== -// The stuff that follows is a mash-up that supports pre-OSX 10.5 APIs. -// (Hopefully all of this can be ditched at some point in the future). - -//============================================================================== -#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 - #define SUPPORT_10_4_FONTS 1 - #define NEW_CGFONT_FUNCTIONS_UNAVAILABLE (CGFontCreateWithFontName == 0) - - #if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 - #define SUPPORT_ONLY_10_4_FONTS 1 - #endif - - } // (juce namespace) - - @interface NSFont (PrivateHack) - - (NSGlyph) _defaultGlyphForChar: (unichar) theChar; - @end - - namespace juce - { -#endif - -//============================================================================== -class OSXTypeface : public Typeface -{ -public: - OSXTypeface (const Font& font) - : Typeface (font.getTypefaceName(), font.getTypefaceStyle()) - { - JUCE_AUTORELEASEPOOL - { - renderingTransform = CGAffineTransformIdentity; - - NSDictionary* nsDict = [NSDictionary dictionaryWithObjectsAndKeys: - juceStringToNS (name), NSFontFamilyAttribute, - juceStringToNS (style), NSFontFaceAttribute, nil]; - - NSFontDescriptor* nsFontDesc = [NSFontDescriptor fontDescriptorWithFontAttributes: nsDict]; - nsFont = [NSFont fontWithDescriptor: nsFontDesc size: referenceFontSize]; - - [nsFont retain]; - - #if SUPPORT_ONLY_10_4_FONTS - initWithATSFont(); - #else - #if SUPPORT_10_4_FONTS - if (NEW_CGFONT_FUNCTIONS_UNAVAILABLE) - { - initWithATSFont(); - } - else - #endif - { - fontRef = CGFontCreateWithFontName ((CFStringRef) [nsFont fontName]); - - const float absAscent = std::abs ((float) CGFontGetAscent (fontRef)); - const float totalHeight = absAscent + std::abs ((float) CGFontGetDescent (fontRef)); - - ascent = absAscent / totalHeight; - unitsToHeightScaleFactor = 1.0f / totalHeight; - - const float nsFontAscent = std::abs ([nsFont ascender]); - const float nsFontDescent = std::abs ([nsFont descender]); - - fontHeightToPointsFactor = referenceFontSize / (nsFontAscent + nsFontDescent); - } - #endif - - pathTransform = AffineTransform::identity.scale (unitsToHeightScaleFactor); - } - } - - ~OSXTypeface() - { - #if ! JUCE_IOS - [nsFont release]; - #endif - - if (fontRef != 0) - CGFontRelease (fontRef); - } - - #if SUPPORT_10_4_FONTS - void initWithATSFont() - { - ATSFontRef atsFont = ATSFontFindFromName ((CFStringRef) [nsFont fontName], kATSOptionFlagsDefault); - - if (atsFont == 0) - atsFont = ATSFontFindFromPostScriptName ((CFStringRef) [nsFont fontName], kATSOptionFlagsDefault); - - fontRef = CGFontCreateWithPlatformFont (&atsFont); - - const float absAscent = std::abs ([nsFont ascender]); - const float absDescent = std::abs ([nsFont descender]); - const float totalHeight = absAscent + absDescent; - - unitsToHeightScaleFactor = 1.0f / totalHeight; - fontHeightToPointsFactor = referenceFontSize / totalHeight; - ascent = absAscent / totalHeight; - } - #endif - - - float getAscent() const override { return ascent; } - float getDescent() const override { return 1.0f - ascent; } - float getHeightToPointsFactor() const override { return fontHeightToPointsFactor; } - - float getStringWidth (const String& text) override - { - if (fontRef == 0 || text.isEmpty()) - return 0; - - const int length = text.length(); - HeapBlock glyphs; - createGlyphsForString (text.getCharPointer(), length, glyphs); - - float x = 0; - -#if SUPPORT_ONLY_10_4_FONTS - HeapBlock advances (length); - [nsFont getAdvancements: advances forGlyphs: reinterpret_cast (glyphs.getData()) count: length]; - - for (int i = 0; i < length; ++i) - x += advances[i].width; -#else - #if SUPPORT_10_4_FONTS - if (NEW_CGFONT_FUNCTIONS_UNAVAILABLE) - { - HeapBlock advances (length); - [nsFont getAdvancements: advances forGlyphs: reinterpret_cast (glyphs.getData()) count: length]; - - for (int i = 0; i < length; ++i) - x += advances[i].width; - } - else - #endif - { - HeapBlock advances (length); - - if (CGFontGetGlyphAdvances (fontRef, glyphs, length, advances)) - for (int i = 0; i < length; ++i) - x += advances[i]; - } -#endif - - return x * unitsToHeightScaleFactor; - } - - void getGlyphPositions (const String& text, Array& resultGlyphs, Array& xOffsets) override - { - xOffsets.add (0); - - if (fontRef == 0 || text.isEmpty()) - return; - - const int length = text.length(); - HeapBlock glyphs; - createGlyphsForString (text.getCharPointer(), length, glyphs); - -#if SUPPORT_ONLY_10_4_FONTS - HeapBlock advances (length); - [nsFont getAdvancements: advances forGlyphs: reinterpret_cast (glyphs.getData()) count: length]; - - int x = 0; - for (int i = 0; i < length; ++i) - { - x += advances[i].width; - xOffsets.add (x * unitsToHeightScaleFactor); - resultGlyphs.add (reinterpret_cast (glyphs.getData())[i]); - } - -#else - #if SUPPORT_10_4_FONTS - if (NEW_CGFONT_FUNCTIONS_UNAVAILABLE) - { - HeapBlock advances (length); - NSGlyph* const nsGlyphs = reinterpret_cast (glyphs.getData()); - [nsFont getAdvancements: advances forGlyphs: nsGlyphs count: length]; - - float x = 0; - for (int i = 0; i < length; ++i) - { - x += advances[i].width; - xOffsets.add (x * unitsToHeightScaleFactor); - resultGlyphs.add (nsGlyphs[i]); - } - } - else - #endif - { - HeapBlock advances (length); - - if (CGFontGetGlyphAdvances (fontRef, glyphs, length, advances)) - { - int x = 0; - for (int i = 0; i < length; ++i) - { - x += advances [i]; - xOffsets.add (x * unitsToHeightScaleFactor); - resultGlyphs.add (glyphs[i]); - } - } - } -#endif - } - - bool getOutlineForGlyph (int glyphNumber, Path& path) override - { - #if JUCE_IOS - return false; - #else - if (nsFont == nil) - return false; - - // we might need to apply a transform to the path, so it mustn't have anything else in it - jassert (path.isEmpty()); - - JUCE_AUTORELEASEPOOL - { - NSBezierPath* bez = [NSBezierPath bezierPath]; - [bez moveToPoint: NSMakePoint (0, 0)]; - [bez appendBezierPathWithGlyph: (NSGlyph) glyphNumber - inFont: nsFont]; - - for (int i = 0; i < [bez elementCount]; ++i) - { - NSPoint p[3]; - switch ([bez elementAtIndex: i associatedPoints: p]) - { - case NSMoveToBezierPathElement: path.startNewSubPath ((float) p[0].x, (float) -p[0].y); break; - case NSLineToBezierPathElement: path.lineTo ((float) p[0].x, (float) -p[0].y); break; - case NSCurveToBezierPathElement: path.cubicTo ((float) p[0].x, (float) -p[0].y, - (float) p[1].x, (float) -p[1].y, - (float) p[2].x, (float) -p[2].y); break; - case NSClosePathBezierPathElement: path.closeSubPath(); break; - default: jassertfalse; break; - } - } - - path.applyTransform (pathTransform); - } - return true; - #endif - } - - //============================================================================== - CGFontRef fontRef; - float fontHeightToPointsFactor; - CGAffineTransform renderingTransform; - -private: - float ascent, unitsToHeightScaleFactor; - - #if ! JUCE_IOS - NSFont* nsFont; - AffineTransform pathTransform; - #endif - - void createGlyphsForString (String::CharPointerType text, const int length, HeapBlock & glyphs) - { - #if SUPPORT_10_4_FONTS - #if ! SUPPORT_ONLY_10_4_FONTS - if (NEW_CGFONT_FUNCTIONS_UNAVAILABLE) - #endif - { - glyphs.malloc (sizeof (NSGlyph) * length, 1); - NSGlyph* const nsGlyphs = reinterpret_cast (glyphs.getData()); - - for (int i = 0; i < length; ++i) - nsGlyphs[i] = (NSGlyph) [nsFont _defaultGlyphForChar: text.getAndAdvance()]; - - return; - } - #endif - - #if ! SUPPORT_ONLY_10_4_FONTS - if (charToGlyphMapper == nullptr) - charToGlyphMapper = new CharToGlyphMapper (fontRef); - - glyphs.malloc (length); - - for (int i = 0; i < length; ++i) - glyphs[i] = (CGGlyph) charToGlyphMapper->getGlyphForCharacter (text.getAndAdvance()); - #endif - } - - #if ! SUPPORT_ONLY_10_4_FONTS - // Reads a CGFontRef's character map table to convert unicode into glyph numbers - class CharToGlyphMapper - { - public: - CharToGlyphMapper (CGFontRef cgFontRef) - : segCount (0), endCode (0), startCode (0), idDelta (0), - idRangeOffset (0), glyphIndexes (0) - { - CFDataRef cmapTable = CGFontCopyTableForTag (cgFontRef, 'cmap'); - - if (cmapTable != 0) - { - const int numSubtables = getValue16 (cmapTable, 2); - - for (int i = 0; i < numSubtables; ++i) - { - if (getValue16 (cmapTable, i * 8 + 4) == 0) // check for platform ID of 0 - { - const int offset = getValue32 (cmapTable, i * 8 + 8); - - if (getValue16 (cmapTable, offset) == 4) // check that it's format 4.. - { - const int length = getValue16 (cmapTable, offset + 2); - const int segCountX2 = getValue16 (cmapTable, offset + 6); - segCount = segCountX2 / 2; - const int endCodeOffset = offset + 14; - const int startCodeOffset = endCodeOffset + 2 + segCountX2; - const int idDeltaOffset = startCodeOffset + segCountX2; - const int idRangeOffsetOffset = idDeltaOffset + segCountX2; - const int glyphIndexesOffset = idRangeOffsetOffset + segCountX2; - - endCode = CFDataCreate (kCFAllocatorDefault, CFDataGetBytePtr (cmapTable) + endCodeOffset, segCountX2); - startCode = CFDataCreate (kCFAllocatorDefault, CFDataGetBytePtr (cmapTable) + startCodeOffset, segCountX2); - idDelta = CFDataCreate (kCFAllocatorDefault, CFDataGetBytePtr (cmapTable) + idDeltaOffset, segCountX2); - idRangeOffset = CFDataCreate (kCFAllocatorDefault, CFDataGetBytePtr (cmapTable) + idRangeOffsetOffset, segCountX2); - glyphIndexes = CFDataCreate (kCFAllocatorDefault, CFDataGetBytePtr (cmapTable) + glyphIndexesOffset, offset + length - glyphIndexesOffset); - } - - break; - } - } - - CFRelease (cmapTable); - } - } - - ~CharToGlyphMapper() - { - if (endCode != 0) - { - CFRelease (endCode); - CFRelease (startCode); - CFRelease (idDelta); - CFRelease (idRangeOffset); - CFRelease (glyphIndexes); - } - } - - int getGlyphForCharacter (const juce_wchar c) const - { - for (int i = 0; i < segCount; ++i) - { - if (getValue16 (endCode, i * 2) >= c) - { - const int start = getValue16 (startCode, i * 2); - if (start > c) - break; - - const int delta = getValue16 (idDelta, i * 2); - const int rangeOffset = getValue16 (idRangeOffset, i * 2); - - if (rangeOffset == 0) - return delta + c; - - return getValue16 (glyphIndexes, 2 * ((rangeOffset / 2) + (c - start) - (segCount - i))); - } - } - - // If we failed to find it "properly", this dodgy fall-back seems to do the trick for most fonts! - return jmax (-1, (int) c - 29); - } - - private: - int segCount; - CFDataRef endCode, startCode, idDelta, idRangeOffset, glyphIndexes; - - static uint16 getValue16 (CFDataRef data, const int index) - { - return CFSwapInt16BigToHost (*(UInt16*) (CFDataGetBytePtr (data) + index)); - } - - static uint32 getValue32 (CFDataRef data, const int index) - { - return CFSwapInt32BigToHost (*(UInt32*) (CFDataGetBytePtr (data) + index)); - } - }; - - ScopedPointer charToGlyphMapper; - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OSXTypeface) -}; - -StringArray Font::findAllTypefaceNames() -{ - StringArray names; - - JUCE_AUTORELEASEPOOL - { - #if JUCE_IOS - for (NSString* name in [UIFont familyNames]) - #else - for (NSString* name in [[NSFontManager sharedFontManager] availableFontFamilies]) - #endif - names.add (nsStringToJuce (name)); - - names.sort (true); - } - - return names; -} - -StringArray Font::findAllTypefaceStyles (const String& family) -{ - if (FontStyleHelpers::isPlaceholderFamilyName (family)) - return findAllTypefaceStyles (FontStyleHelpers::getConcreteFamilyNameFromPlaceholder (family)); - - StringArray results; - - JUCE_AUTORELEASEPOOL - { - for (NSArray* style in [[NSFontManager sharedFontManager] availableMembersOfFontFamily: juceStringToNS (family)]) - results.add (nsStringToJuce ((NSString*) [style objectAtIndex: 1])); - } - - return results; -} - -#endif - -//============================================================================== -Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) -{ - return new OSXTypeface (font); -} - -Typeface::Ptr Typeface::createSystemTypefaceFor (const void* data, size_t dataSize) -{ - #if JUCE_CORETEXT_AVAILABLE - return new OSXTypeface (data, dataSize); - #else - jassertfalse; // You need CoreText enabled to use this feature! - return nullptr; - #endif -} - -void Typeface::scanFolderForFonts (const File&) -{ - jassertfalse; // not implemented on this platform -} - -struct DefaultFontNames -{ - DefaultFontNames() - #if JUCE_IOS - : defaultSans ("Helvetica"), - defaultSerif ("Times New Roman"), - defaultFixed ("Courier New"), - #else - : defaultSans ("Lucida Grande"), - defaultSerif ("Times New Roman"), - defaultFixed ("Menlo"), - #endif - defaultFallback ("Arial Unicode MS") - { - } - - String defaultSans, defaultSerif, defaultFixed, defaultFallback; -}; - -Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) -{ - static DefaultFontNames defaultNames; - - Font newFont (font); - const String& faceName = font.getTypefaceName(); - - if (faceName == getDefaultSansSerifFontName()) newFont.setTypefaceName (defaultNames.defaultSans); - else if (faceName == getDefaultSerifFontName()) newFont.setTypefaceName (defaultNames.defaultSerif); - else if (faceName == getDefaultMonospacedFontName()) newFont.setTypefaceName (defaultNames.defaultFixed); - - if (font.getTypefaceStyle() == getDefaultStyle()) - newFont.setTypefaceStyle ("Regular"); - - return Typeface::createSystemTypefaceFor (newFont); -} - -#if JUCE_CORETEXT_AVAILABLE -static bool canAllTypefacesBeUsedInLayout (const AttributedString& text) -{ - const int numCharacterAttributes = text.getNumAttributes(); - - for (int i = 0; i < numCharacterAttributes; ++i) - { - if (const Font* const f = text.getAttribute (i)->getFont()) - { - if (OSXTypeface* tf = dynamic_cast (f->getTypeface())) - { - if (tf->isMemoryFont) - return false; - } - else if (dynamic_cast (f->getTypeface()) != nullptr) - { - return false; - } - } - } - - return true; -} -#endif - -bool TextLayout::createNativeLayout (const AttributedString& text) -{ - #if JUCE_CORETEXT_AVAILABLE - // Seems to be an unfathomable bug in CoreText which prevents the layout working with - // typefaces that were loaded from memory, so have to fallback if we hit any of those.. - if (canAllTypefacesBeUsedInLayout (text)) - { - CoreTextTypeLayout::createLayout (*this, text); - return true; - } - #endif - - (void) text; - return false; -} diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp deleted file mode 100755 index e4356b7..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Direct2DGraphicsContext.cpp +++ /dev/null @@ -1,838 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class Direct2DLowLevelGraphicsContext : public LowLevelGraphicsContext -{ -public: - Direct2DLowLevelGraphicsContext (HWND hwnd_) - : hwnd (hwnd_), - currentState (nullptr) - { - RECT windowRect; - GetClientRect (hwnd, &windowRect); - D2D1_SIZE_U size = { windowRect.right - windowRect.left, windowRect.bottom - windowRect.top }; - bounds.setSize (size.width, size.height); - - D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties(); - D2D1_HWND_RENDER_TARGET_PROPERTIES propsHwnd = D2D1::HwndRenderTargetProperties (hwnd, size); - - if (factories->d2dFactory != nullptr) - { - HRESULT hr = factories->d2dFactory->CreateHwndRenderTarget (props, propsHwnd, renderingTarget.resetAndGetPointerAddress()); - jassert (SUCCEEDED (hr)); (void) hr; - hr = renderingTarget->CreateSolidColorBrush (D2D1::ColorF::ColorF (0.0f, 0.0f, 0.0f, 1.0f), colourBrush.resetAndGetPointerAddress()); - } - } - - ~Direct2DLowLevelGraphicsContext() - { - states.clear(); - } - - void resized() - { - RECT windowRect; - GetClientRect (hwnd, &windowRect); - D2D1_SIZE_U size = { windowRect.right - windowRect.left, windowRect.bottom - windowRect.top }; - - renderingTarget->Resize (size); - bounds.setSize (size.width, size.height); - } - - void clear() - { - renderingTarget->Clear (D2D1::ColorF (D2D1::ColorF::White, 0.0f)); // xxx why white and not black? - } - - void start() - { - renderingTarget->BeginDraw(); - saveState(); - } - - void end() - { - states.clear(); - currentState = 0; - renderingTarget->EndDraw(); - renderingTarget->CheckWindowState(); - } - - bool isVectorDevice() const { return false; } - - void setOrigin (Point o) - { - addTransform (AffineTransform::translation ((float) o.x, (float) o.y)); - } - - void addTransform (const AffineTransform& transform) - { - currentState->transform = transform.followedBy (currentState->transform); - } - - float getPhysicalPixelScaleFactor() - { - return currentState->transform.getScaleFactor(); - } - - bool clipToRectangle (const Rectangle& r) - { - currentState->clipToRectangle (r); - return ! isClipEmpty(); - } - - bool clipToRectangleList (const RectangleList& clipRegion) - { - currentState->clipToRectList (rectListToPathGeometry (clipRegion)); - return ! isClipEmpty(); - } - - void excludeClipRectangle (const Rectangle&) - { - //xxx - } - - void clipToPath (const Path& path, const AffineTransform& transform) - { - currentState->clipToPath (pathToPathGeometry (path, transform)); - } - - void clipToImageAlpha (const Image& sourceImage, const AffineTransform& transform) - { - currentState->clipToImage (sourceImage, transform); - } - - bool clipRegionIntersects (const Rectangle& r) - { - return currentState->clipRect.intersects (r.toFloat().transformed (currentState->transform).getSmallestIntegerContainer()); - } - - Rectangle getClipBounds() const - { - // xxx could this take into account complex clip regions? - return currentState->clipRect.toFloat().transformed (currentState->transform.inverted()).getSmallestIntegerContainer(); - } - - bool isClipEmpty() const - { - return currentState->clipRect.isEmpty(); - } - - void saveState() - { - states.add (new SavedState (*this)); - currentState = states.getLast(); - } - - void restoreState() - { - jassert (states.size() > 1) //you should never pop the last state! - states.removeLast (1); - currentState = states.getLast(); - } - - void beginTransparencyLayer (float /*opacity*/) - { - jassertfalse; //xxx todo - } - - void endTransparencyLayer() - { - jassertfalse; //xxx todo - } - - void setFill (const FillType& fillType) - { - currentState->setFill (fillType); - } - - void setOpacity (float newOpacity) - { - currentState->setOpacity (newOpacity); - } - - void setInterpolationQuality (Graphics::ResamplingQuality /*quality*/) - { - } - - void fillRect (const Rectangle& r, bool /*replaceExistingContents*/) - { - fillRect (r.toFloat()); - } - - void fillRect (const Rectangle& r) - { - renderingTarget->SetTransform (transformToMatrix (currentState->transform)); - currentState->createBrush(); - renderingTarget->FillRectangle (rectangleToRectF (r), currentState->currentBrush); - renderingTarget->SetTransform (D2D1::IdentityMatrix()); - } - - void fillRectList (const RectangleList& list) - { - for (const Rectangle* r = list.begin(), * const e = list.end(); r != e; ++r) - fillRect (*r); - } - - void fillPath (const Path& p, const AffineTransform& transform) - { - currentState->createBrush(); - ComSmartPtr geometry (pathToPathGeometry (p, transform.followedBy (currentState->transform))); - - if (renderingTarget != nullptr) - renderingTarget->FillGeometry (geometry, currentState->currentBrush); - } - - void drawImage (const Image& image, const AffineTransform& transform) - { - renderingTarget->SetTransform (transformToMatrix (transform.followedBy (currentState->transform))); - - D2D1_SIZE_U size; - size.width = image.getWidth(); - size.height = image.getHeight(); - - D2D1_BITMAP_PROPERTIES bp = D2D1::BitmapProperties(); - - Image img (image.convertedToFormat (Image::ARGB)); - Image::BitmapData bd (img, Image::BitmapData::readOnly); - bp.pixelFormat = renderingTarget->GetPixelFormat(); - bp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED; - - { - ComSmartPtr tempBitmap; - renderingTarget->CreateBitmap (size, bd.data, bd.lineStride, bp, tempBitmap.resetAndGetPointerAddress()); - if (tempBitmap != nullptr) - renderingTarget->DrawBitmap (tempBitmap); - } - - renderingTarget->SetTransform (D2D1::IdentityMatrix()); - } - - void drawLine (const Line & line) - { - // xxx doesn't seem to be correctly aligned, may need nudging by 0.5 to match the software renderer's behaviour - renderingTarget->SetTransform (transformToMatrix (currentState->transform)); - currentState->createBrush(); - - renderingTarget->DrawLine (D2D1::Point2F (line.getStartX(), line.getStartY()), - D2D1::Point2F (line.getEndX(), line.getEndY()), - currentState->currentBrush); - renderingTarget->SetTransform (D2D1::IdentityMatrix()); - } - - void setFont (const Font& newFont) - { - currentState->setFont (newFont); - } - - const Font& getFont() - { - return currentState->font; - } - - void drawGlyph (int glyphNumber, const AffineTransform& transform) - { - currentState->createBrush(); - currentState->createFont(); - - float hScale = currentState->font.getHorizontalScale(); - - renderingTarget->SetTransform (transformToMatrix (AffineTransform::scale (hScale, 1.0f) - .followedBy (transform) - .followedBy (currentState->transform))); - - const UINT16 glyphIndices = (UINT16) glyphNumber; - const FLOAT glyphAdvances = 0; - DWRITE_GLYPH_OFFSET offset; - offset.advanceOffset = 0; - offset.ascenderOffset = 0; - - DWRITE_GLYPH_RUN glyphRun; - glyphRun.fontFace = currentState->currentFontFace; - glyphRun.fontEmSize = (FLOAT) (currentState->font.getHeight() * currentState->fontHeightToEmSizeFactor); - glyphRun.glyphCount = 1; - glyphRun.glyphIndices = &glyphIndices; - glyphRun.glyphAdvances = &glyphAdvances; - glyphRun.glyphOffsets = &offset; - glyphRun.isSideways = FALSE; - glyphRun.bidiLevel = 0; - - renderingTarget->DrawGlyphRun (D2D1::Point2F (0, 0), &glyphRun, currentState->currentBrush); - renderingTarget->SetTransform (D2D1::IdentityMatrix()); - } - - bool drawTextLayout (const AttributedString& text, const Rectangle& area) - { - renderingTarget->SetTransform (transformToMatrix (currentState->transform)); - - DirectWriteTypeLayout::drawToD2DContext (text, area, renderingTarget, factories->directWriteFactory, - factories->d2dFactory, factories->systemFonts); - - renderingTarget->SetTransform (D2D1::IdentityMatrix()); - return true; - } - - //============================================================================== - class SavedState - { - public: - SavedState (Direct2DLowLevelGraphicsContext& owner_) - : owner (owner_), currentBrush (0), - fontHeightToEmSizeFactor (1.0f), currentFontFace (0), - clipsRect (false), shouldClipRect (false), - clipsRectList (false), shouldClipRectList (false), - clipsComplex (false), shouldClipComplex (false), - clipsBitmap (false), shouldClipBitmap (false) - { - if (owner.currentState != nullptr) - { - // xxx seems like a very slow way to create one of these, and this is a performance - // bottleneck.. Can the same internal objects be shared by multiple state objects, maybe using copy-on-write? - setFill (owner.currentState->fillType); - currentBrush = owner.currentState->currentBrush; - clipRect = owner.currentState->clipRect; - transform = owner.currentState->transform; - - font = owner.currentState->font; - currentFontFace = owner.currentState->currentFontFace; - } - else - { - const D2D1_SIZE_U size (owner.renderingTarget->GetPixelSize()); - clipRect.setSize (size.width, size.height); - setFill (FillType (Colours::black)); - } - } - - ~SavedState() - { - clearClip(); - clearFont(); - clearFill(); - clearPathClip(); - clearImageClip(); - complexClipLayer = 0; - bitmapMaskLayer = 0; - } - - void clearClip() - { - popClips(); - shouldClipRect = false; - } - - void clipToRectangle (const Rectangle& r) - { - clearClip(); - clipRect = r.toFloat().transformed (transform).getSmallestIntegerContainer(); - shouldClipRect = true; - pushClips(); - } - - void clearPathClip() - { - popClips(); - - if (shouldClipComplex) - { - complexClipGeometry = 0; - shouldClipComplex = false; - } - } - - void clipToPath (ID2D1Geometry* geometry) - { - clearPathClip(); - - if (complexClipLayer == 0) - owner.renderingTarget->CreateLayer (complexClipLayer.resetAndGetPointerAddress()); - - complexClipGeometry = geometry; - shouldClipComplex = true; - pushClips(); - } - - void clearRectListClip() - { - popClips(); - - if (shouldClipRectList) - { - rectListGeometry = 0; - shouldClipRectList = false; - } - } - - void clipToRectList (ID2D1Geometry* geometry) - { - clearRectListClip(); - - if (rectListLayer == 0) - owner.renderingTarget->CreateLayer (rectListLayer.resetAndGetPointerAddress()); - - rectListGeometry = geometry; - shouldClipRectList = true; - pushClips(); - } - - void clearImageClip() - { - popClips(); - - if (shouldClipBitmap) - { - maskBitmap = 0; - bitmapMaskBrush = 0; - shouldClipBitmap = false; - } - } - - void clipToImage (const Image& image, const AffineTransform& transform) - { - clearImageClip(); - - if (bitmapMaskLayer == 0) - owner.renderingTarget->CreateLayer (bitmapMaskLayer.resetAndGetPointerAddress()); - - D2D1_BRUSH_PROPERTIES brushProps; - brushProps.opacity = 1; - brushProps.transform = transformToMatrix (transform); - - D2D1_BITMAP_BRUSH_PROPERTIES bmProps = D2D1::BitmapBrushProperties (D2D1_EXTEND_MODE_WRAP, D2D1_EXTEND_MODE_WRAP); - - D2D1_SIZE_U size; - size.width = image.getWidth(); - size.height = image.getHeight(); - - D2D1_BITMAP_PROPERTIES bp = D2D1::BitmapProperties(); - - maskImage = image.convertedToFormat (Image::ARGB); - Image::BitmapData bd (this->image, Image::BitmapData::readOnly); // xxx should be maskImage? - bp.pixelFormat = owner.renderingTarget->GetPixelFormat(); - bp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED; - - HRESULT hr = owner.renderingTarget->CreateBitmap (size, bd.data, bd.lineStride, bp, maskBitmap.resetAndGetPointerAddress()); - hr = owner.renderingTarget->CreateBitmapBrush (maskBitmap, bmProps, brushProps, bitmapMaskBrush.resetAndGetPointerAddress()); - - imageMaskLayerParams = D2D1::LayerParameters(); - imageMaskLayerParams.opacityBrush = bitmapMaskBrush; - - shouldClipBitmap = true; - pushClips(); - } - - void popClips() - { - if (clipsBitmap) - { - owner.renderingTarget->PopLayer(); - clipsBitmap = false; - } - - if (clipsComplex) - { - owner.renderingTarget->PopLayer(); - clipsComplex = false; - } - - if (clipsRectList) - { - owner.renderingTarget->PopLayer(); - clipsRectList = false; - } - - if (clipsRect) - { - owner.renderingTarget->PopAxisAlignedClip(); - clipsRect = false; - } - } - - void pushClips() - { - if (shouldClipRect && ! clipsRect) - { - owner.renderingTarget->PushAxisAlignedClip (rectangleToRectF (clipRect), D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); - clipsRect = true; - } - - if (shouldClipRectList && ! clipsRectList) - { - D2D1_LAYER_PARAMETERS layerParams = D2D1::LayerParameters(); - rectListGeometry->GetBounds (D2D1::IdentityMatrix(), &layerParams.contentBounds); - layerParams.geometricMask = rectListGeometry; - owner.renderingTarget->PushLayer (layerParams, rectListLayer); - clipsRectList = true; - } - - if (shouldClipComplex && ! clipsComplex) - { - D2D1_LAYER_PARAMETERS layerParams = D2D1::LayerParameters(); - complexClipGeometry->GetBounds (D2D1::IdentityMatrix(), &layerParams.contentBounds); - layerParams.geometricMask = complexClipGeometry; - owner.renderingTarget->PushLayer (layerParams, complexClipLayer); - clipsComplex = true; - } - - if (shouldClipBitmap && ! clipsBitmap) - { - owner.renderingTarget->PushLayer (imageMaskLayerParams, bitmapMaskLayer); - clipsBitmap = true; - } - } - - void setFill (const FillType& newFillType) - { - if (fillType != newFillType) - { - fillType = newFillType; - clearFill(); - } - } - - void clearFont() - { - currentFontFace = localFontFace = 0; - } - - void setFont (const Font& newFont) - { - if (font != newFont) - { - font = newFont; - clearFont(); - } - } - - void createFont() - { - if (currentFontFace == nullptr) - { - WindowsDirectWriteTypeface* typeface = dynamic_cast (font.getTypeface()); - currentFontFace = typeface->getIDWriteFontFace(); - fontHeightToEmSizeFactor = typeface->unitsToHeightScaleFactor(); - } - } - - void setOpacity (float newOpacity) - { - fillType.setOpacity (newOpacity); - - if (currentBrush != nullptr) - currentBrush->SetOpacity (newOpacity); - } - - void clearFill() - { - gradientStops = 0; - linearGradient = 0; - radialGradient = 0; - bitmap = 0; - bitmapBrush = 0; - currentBrush = 0; - } - - void createBrush() - { - if (currentBrush == 0) - { - if (fillType.isColour()) - { - D2D1_COLOR_F colour = colourToD2D (fillType.colour); - owner.colourBrush->SetColor (colour); - currentBrush = owner.colourBrush; - } - else if (fillType.isTiledImage()) - { - D2D1_BRUSH_PROPERTIES brushProps; - brushProps.opacity = fillType.getOpacity(); - brushProps.transform = transformToMatrix (fillType.transform); - - D2D1_BITMAP_BRUSH_PROPERTIES bmProps = D2D1::BitmapBrushProperties (D2D1_EXTEND_MODE_WRAP,D2D1_EXTEND_MODE_WRAP); - - image = fillType.image; - - D2D1_SIZE_U size; - size.width = image.getWidth(); - size.height = image.getHeight(); - - D2D1_BITMAP_PROPERTIES bp = D2D1::BitmapProperties(); - - this->image = image.convertedToFormat (Image::ARGB); - Image::BitmapData bd (this->image, Image::BitmapData::readOnly); - bp.pixelFormat = owner.renderingTarget->GetPixelFormat(); - bp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED; - - HRESULT hr = owner.renderingTarget->CreateBitmap (size, bd.data, bd.lineStride, bp, bitmap.resetAndGetPointerAddress()); - hr = owner.renderingTarget->CreateBitmapBrush (bitmap, bmProps, brushProps, bitmapBrush.resetAndGetPointerAddress()); - - currentBrush = bitmapBrush; - } - else if (fillType.isGradient()) - { - gradientStops = 0; - - D2D1_BRUSH_PROPERTIES brushProps; - brushProps.opacity = fillType.getOpacity(); - brushProps.transform = transformToMatrix (fillType.transform.followedBy (transform)); - - const int numColors = fillType.gradient->getNumColours(); - - HeapBlock stops (numColors); - - for (int i = fillType.gradient->getNumColours(); --i >= 0;) - { - stops[i].color = colourToD2D (fillType.gradient->getColour(i)); - stops[i].position = (FLOAT) fillType.gradient->getColourPosition(i); - } - - owner.renderingTarget->CreateGradientStopCollection (stops.getData(), numColors, gradientStops.resetAndGetPointerAddress()); - - if (fillType.gradient->isRadial) - { - radialGradient = 0; - - const Point p1 = fillType.gradient->point1; - const Point p2 = fillType.gradient->point2; - float r = p1.getDistanceFrom (p2); - - D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES props = - D2D1::RadialGradientBrushProperties (D2D1::Point2F (p1.x, p1.y), - D2D1::Point2F (0, 0), - r, r); - - owner.renderingTarget->CreateRadialGradientBrush (props, brushProps, gradientStops, radialGradient.resetAndGetPointerAddress()); - currentBrush = radialGradient; - } - else - { - linearGradient = 0; - - const Point p1 = fillType.gradient->point1; - const Point p2 = fillType.gradient->point2; - - D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES props = - D2D1::LinearGradientBrushProperties (D2D1::Point2F (p1.x, p1.y), - D2D1::Point2F (p2.x, p2.y)); - - owner.renderingTarget->CreateLinearGradientBrush (props, brushProps, gradientStops, linearGradient.resetAndGetPointerAddress()); - - currentBrush = linearGradient; - } - } - } - } - - //============================================================================== - //xxx most of these members should probably be private... - - Direct2DLowLevelGraphicsContext& owner; - - AffineTransform transform; - - Font font; - float fontHeightToEmSizeFactor; - IDWriteFontFace* currentFontFace; - ComSmartPtr localFontFace; - - FillType fillType; - - Image image; - ComSmartPtr bitmap; // xxx needs a better name - what is this for?? - - Rectangle clipRect; - bool clipsRect, shouldClipRect; - - ComSmartPtr complexClipGeometry; - D2D1_LAYER_PARAMETERS complexClipLayerParams; - ComSmartPtr complexClipLayer; - bool clipsComplex, shouldClipComplex; - - ComSmartPtr rectListGeometry; - D2D1_LAYER_PARAMETERS rectListLayerParams; - ComSmartPtr rectListLayer; - bool clipsRectList, shouldClipRectList; - - Image maskImage; - D2D1_LAYER_PARAMETERS imageMaskLayerParams; - ComSmartPtr bitmapMaskLayer; - ComSmartPtr maskBitmap; - ComSmartPtr bitmapMaskBrush; - bool clipsBitmap, shouldClipBitmap; - - ID2D1Brush* currentBrush; - ComSmartPtr bitmapBrush; - ComSmartPtr linearGradient; - ComSmartPtr radialGradient; - ComSmartPtr gradientStops; - - private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SavedState) - }; - - //============================================================================== -private: - SharedResourcePointer factories; - HWND hwnd; - ComSmartPtr renderingTarget; - ComSmartPtr colourBrush; - Rectangle bounds; - - SavedState* currentState; - OwnedArray states; - - //============================================================================== - template - static D2D1_RECT_F rectangleToRectF (const Rectangle& r) - { - return D2D1::RectF ((float) r.getX(), (float) r.getY(), (float) r.getRight(), (float) r.getBottom()); - } - - static D2D1_COLOR_F colourToD2D (Colour c) - { - return D2D1::ColorF::ColorF (c.getFloatRed(), c.getFloatGreen(), c.getFloatBlue(), c.getFloatAlpha()); - } - - static D2D1_POINT_2F pointTransformed (int x, int y, const AffineTransform& transform) - { - transform.transformPoint (x, y); - return D2D1::Point2F ((FLOAT) x, (FLOAT) y); - } - - static void rectToGeometrySink (const Rectangle& rect, ID2D1GeometrySink* sink) - { - sink->BeginFigure (pointTransformed (rect.getX(), rect.getY()), D2D1_FIGURE_BEGIN_FILLED); - sink->AddLine (pointTransformed (rect.getRight(), rect.getY())); - sink->AddLine (pointTransformed (rect.getRight(), rect.getBottom())); - sink->AddLine (pointTransformed (rect.getX(), rect.getBottom())); - sink->EndFigure (D2D1_FIGURE_END_CLOSED); - } - - static ID2D1PathGeometry* rectListToPathGeometry (const RectangleList& clipRegion) - { - ID2D1PathGeometry* p = nullptr; - factories->d2dFactory->CreatePathGeometry (&p); - - ComSmartPtr sink; - HRESULT hr = p->Open (sink.resetAndGetPointerAddress()); // xxx handle error - sink->SetFillMode (D2D1_FILL_MODE_WINDING); - - for (int i = clipRegion.getNumRectangles(); --i >= 0;) - rectToGeometrySink (clipRegion.getRectangle(i), sink); - - hr = sink->Close(); - return p; - } - - static void pathToGeometrySink (const Path& path, ID2D1GeometrySink* sink, const AffineTransform& transform) - { - Path::Iterator it (path); - - while (it.next()) - { - switch (it.elementType) - { - case Path::Iterator::cubicTo: - { - D2D1_BEZIER_SEGMENT seg; - - transform.transformPoint (it.x1, it.y1); - seg.point1 = D2D1::Point2F (it.x1, it.y1); - - transform.transformPoint (it.x2, it.y2); - seg.point2 = D2D1::Point2F (it.x2, it.y2); - - transform.transformPoint(it.x3, it.y3); - seg.point3 = D2D1::Point2F (it.x3, it.y3); - - sink->AddBezier (seg); - break; - } - - case Path::Iterator::lineTo: - { - transform.transformPoint (it.x1, it.y1); - sink->AddLine (D2D1::Point2F (it.x1, it.y1)); - break; - } - - case Path::Iterator::quadraticTo: - { - D2D1_QUADRATIC_BEZIER_SEGMENT seg; - - transform.transformPoint (it.x1, it.y1); - seg.point1 = D2D1::Point2F (it.x1, it.y1); - - transform.transformPoint (it.x2, it.y2); - seg.point2 = D2D1::Point2F (it.x2, it.y2); - - sink->AddQuadraticBezier (seg); - break; - } - - case Path::Iterator::closePath: - { - sink->EndFigure (D2D1_FIGURE_END_CLOSED); - break; - } - - case Path::Iterator::startNewSubPath: - { - transform.transformPoint (it.x1, it.y1); - sink->BeginFigure (D2D1::Point2F (it.x1, it.y1), D2D1_FIGURE_BEGIN_FILLED); - break; - } - } - } - } - - static ID2D1PathGeometry* pathToPathGeometry (const Path& path, const AffineTransform& transform) - { - ID2D1PathGeometry* p = nullptr; - factories->d2dFactory->CreatePathGeometry (&p); - - ComSmartPtr sink; - HRESULT hr = p->Open (sink.resetAndGetPointerAddress()); - sink->SetFillMode (D2D1_FILL_MODE_WINDING); // xxx need to check Path::isUsingNonZeroWinding() - - pathToGeometrySink (path, sink, transform); - - hr = sink->Close(); - return p; - } - - static D2D1::Matrix3x2F transformToMatrix (const AffineTransform& transform) - { - D2D1::Matrix3x2F matrix; - matrix._11 = transform.mat00; - matrix._12 = transform.mat10; - matrix._21 = transform.mat01; - matrix._22 = transform.mat11; - matrix._31 = transform.mat02; - matrix._32 = transform.mat12; - return matrix; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Direct2DLowLevelGraphicsContext) -}; diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp deleted file mode 100755 index fd2c7a7..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeLayout.cpp +++ /dev/null @@ -1,445 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -//================================================================================================== -#if JUCE_USE_DIRECTWRITE -namespace DirectWriteTypeLayout -{ - class CustomDirectWriteTextRenderer : public ComBaseClassHelper - { - public: - CustomDirectWriteTextRenderer (IDWriteFontCollection* const fonts, const AttributedString& as) - : ComBaseClassHelper (0), - attributedString (as), - fontCollection (fonts), - currentLine (-1), - lastOriginY (-10000.0f) - { - } - - JUCE_COMRESULT QueryInterface (REFIID refId, void** result) - { - if (refId == __uuidof (IDWritePixelSnapping)) - return castToType (result); - - return ComBaseClassHelper::QueryInterface (refId, result); - } - - JUCE_COMRESULT IsPixelSnappingDisabled (void* /*clientDrawingContext*/, BOOL* isDisabled) - { - *isDisabled = FALSE; - return S_OK; - } - - JUCE_COMRESULT GetCurrentTransform (void*, DWRITE_MATRIX*) { return S_OK; } - JUCE_COMRESULT GetPixelsPerDip (void*, FLOAT*) { return S_OK; } - JUCE_COMRESULT DrawUnderline (void*, FLOAT, FLOAT, DWRITE_UNDERLINE const*, IUnknown*) { return S_OK; } - JUCE_COMRESULT DrawStrikethrough (void*, FLOAT, FLOAT, DWRITE_STRIKETHROUGH const*, IUnknown*) { return S_OK; } - JUCE_COMRESULT DrawInlineObject (void*, FLOAT, FLOAT, IDWriteInlineObject*, BOOL, BOOL, IUnknown*) { return E_NOTIMPL; } - - JUCE_COMRESULT DrawGlyphRun (void* clientDrawingContext, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_MEASURING_MODE, - DWRITE_GLYPH_RUN const* glyphRun, DWRITE_GLYPH_RUN_DESCRIPTION const* runDescription, - IUnknown* clientDrawingEffect) - { - TextLayout* const layout = static_cast (clientDrawingContext); - - if (! (baselineOriginY >= -1.0e10f && baselineOriginY <= 1.0e10f)) - baselineOriginY = 0; // DirectWrite sometimes sends NaNs in this parameter - - if (baselineOriginY != lastOriginY) - { - lastOriginY = baselineOriginY; - ++currentLine; - - if (currentLine >= layout->getNumLines()) - { - jassert (currentLine == layout->getNumLines()); - TextLayout::Line* const newLine = new TextLayout::Line(); - layout->addLine (newLine); - - newLine->lineOrigin = Point (baselineOriginX, baselineOriginY); - } - } - - TextLayout::Line& glyphLine = layout->getLine (currentLine); - - DWRITE_FONT_METRICS dwFontMetrics; - glyphRun->fontFace->GetMetrics (&dwFontMetrics); - - glyphLine.ascent = jmax (glyphLine.ascent, scaledFontSize (dwFontMetrics.ascent, dwFontMetrics, glyphRun)); - glyphLine.descent = jmax (glyphLine.descent, scaledFontSize (dwFontMetrics.descent, dwFontMetrics, glyphRun)); - - TextLayout::Run* const glyphRunLayout = new TextLayout::Run (Range (runDescription->textPosition, - runDescription->textPosition + runDescription->stringLength), - glyphRun->glyphCount); - glyphLine.runs.add (glyphRunLayout); - - glyphRun->fontFace->GetMetrics (&dwFontMetrics); - const float totalHeight = std::abs ((float) dwFontMetrics.ascent) + std::abs ((float) dwFontMetrics.descent); - const float fontHeightToEmSizeFactor = (float) dwFontMetrics.designUnitsPerEm / totalHeight; - - glyphRunLayout->font = getFontForRun (glyphRun, glyphRun->fontEmSize / fontHeightToEmSizeFactor); - glyphRunLayout->colour = getColourOf (static_cast (clientDrawingEffect)); - - const Point lineOrigin (layout->getLine (currentLine).lineOrigin); - float x = baselineOriginX - lineOrigin.x; - - for (UINT32 i = 0; i < glyphRun->glyphCount; ++i) - { - const float advance = glyphRun->glyphAdvances[i]; - - if ((glyphRun->bidiLevel & 1) != 0) - x -= advance; // RTL text - - glyphRunLayout->glyphs.add (TextLayout::Glyph (glyphRun->glyphIndices[i], - Point (x, baselineOriginY - lineOrigin.y), - advance)); - - if ((glyphRun->bidiLevel & 1) == 0) - x += advance; // LTR text - } - - return S_OK; - } - - private: - const AttributedString& attributedString; - IDWriteFontCollection* const fontCollection; - int currentLine; - float lastOriginY; - - static float scaledFontSize (int n, const DWRITE_FONT_METRICS& metrics, const DWRITE_GLYPH_RUN* glyphRun) noexcept - { - return (std::abs ((float) n) / (float) metrics.designUnitsPerEm) * glyphRun->fontEmSize; - } - - static Colour getColourOf (ID2D1SolidColorBrush* d2dBrush) - { - if (d2dBrush == nullptr) - return Colours::black; - - const D2D1_COLOR_F colour (d2dBrush->GetColor()); - return Colour::fromFloatRGBA (colour.r, colour.g, colour.b, colour.a); - } - - Font getFontForRun (DWRITE_GLYPH_RUN const* glyphRun, float fontHeight) - { - for (int i = 0; i < attributedString.getNumAttributes(); ++i) - if (const Font* font = attributedString.getAttribute(i)->getFont()) - if (WindowsDirectWriteTypeface* wt = dynamic_cast (font->getTypeface())) - if (wt->getIDWriteFontFace() == glyphRun->fontFace) - return font->withHeight (fontHeight); - - ComSmartPtr dwFont; - HRESULT hr = fontCollection->GetFontFromFontFace (glyphRun->fontFace, dwFont.resetAndGetPointerAddress()); - jassert (dwFont != nullptr); - - ComSmartPtr dwFontFamily; - hr = dwFont->GetFontFamily (dwFontFamily.resetAndGetPointerAddress()); - - return Font (getFontFamilyName (dwFontFamily), getFontFaceName (dwFont), fontHeight); - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CustomDirectWriteTextRenderer) - }; - - //================================================================================================== - static float getFontHeightToEmSizeFactor (IDWriteFont* const dwFont) - { - ComSmartPtr dwFontFace; - dwFont->CreateFontFace (dwFontFace.resetAndGetPointerAddress()); - - if (dwFontFace == nullptr) - return 1.0f; - - DWRITE_FONT_METRICS dwFontMetrics; - dwFontFace->GetMetrics (&dwFontMetrics); - - const float totalHeight = (float) (std::abs (dwFontMetrics.ascent) + std::abs (dwFontMetrics.descent)); - return dwFontMetrics.designUnitsPerEm / totalHeight; - } - - void setTextFormatProperties (const AttributedString& text, IDWriteTextFormat* const format) - { - DWRITE_TEXT_ALIGNMENT alignment = DWRITE_TEXT_ALIGNMENT_LEADING; - DWRITE_WORD_WRAPPING wrapType = DWRITE_WORD_WRAPPING_WRAP; - - switch (text.getJustification().getOnlyHorizontalFlags()) - { - case Justification::left: break; - case Justification::right: alignment = DWRITE_TEXT_ALIGNMENT_TRAILING; break; - case Justification::horizontallyCentred: alignment = DWRITE_TEXT_ALIGNMENT_CENTER; break; - case Justification::horizontallyJustified: break; // DirectWrite cannot justify text, default to left alignment - default: jassertfalse; break; // Illegal justification flags - } - - switch (text.getWordWrap()) - { - case AttributedString::none: wrapType = DWRITE_WORD_WRAPPING_NO_WRAP; break; - case AttributedString::byWord: break; - case AttributedString::byChar: break; // DirectWrite doesn't support wrapping by character, default to word-wrap - default: jassertfalse; break; // Illegal flags! - } - - // DirectWrite does not automatically set reading direction - // This must be set correctly and manually when using RTL Scripts (Hebrew, Arabic) - if (text.getReadingDirection() == AttributedString::rightToLeft) - { - format->SetReadingDirection (DWRITE_READING_DIRECTION_RIGHT_TO_LEFT); - - switch (text.getJustification().getOnlyHorizontalFlags()) - { - case Justification::left: alignment = DWRITE_TEXT_ALIGNMENT_TRAILING; break; - case Justification::right: alignment = DWRITE_TEXT_ALIGNMENT_LEADING; break; - default: break; - } - } - - format->SetTextAlignment (alignment); - format->SetWordWrapping (wrapType); - } - - void addAttributedRange (const AttributedString::Attribute& attr, IDWriteTextLayout* textLayout, - const int textLen, ID2D1RenderTarget* const renderTarget, IDWriteFontCollection* const fontCollection) - { - DWRITE_TEXT_RANGE range; - range.startPosition = attr.range.getStart(); - range.length = jmin (attr.range.getLength(), textLen - attr.range.getStart()); - - if (const Font* const font = attr.getFont()) - { - const String familyName (FontStyleHelpers::getConcreteFamilyName (*font)); - - BOOL fontFound = false; - uint32 fontIndex; - fontCollection->FindFamilyName (familyName.toWideCharPointer(), - &fontIndex, &fontFound); - - if (! fontFound) - fontIndex = 0; - - ComSmartPtr fontFamily; - HRESULT hr = fontCollection->GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress()); - - ComSmartPtr dwFont; - uint32 fontFacesCount = 0; - fontFacesCount = fontFamily->GetFontCount(); - - for (int i = fontFacesCount; --i >= 0;) - { - hr = fontFamily->GetFont (i, dwFont.resetAndGetPointerAddress()); - - if (font->getTypefaceStyle() == getFontFaceName (dwFont)) - break; - } - - textLayout->SetFontFamilyName (familyName.toWideCharPointer(), range); - textLayout->SetFontWeight (dwFont->GetWeight(), range); - textLayout->SetFontStretch (dwFont->GetStretch(), range); - textLayout->SetFontStyle (dwFont->GetStyle(), range); - - const float fontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (dwFont); - textLayout->SetFontSize (font->getHeight() * fontHeightToEmSizeFactor, range); - } - - if (const Colour* const colour = attr.getColour()) - { - ComSmartPtr d2dBrush; - renderTarget->CreateSolidColorBrush (D2D1::ColorF (D2D1::ColorF (colour->getFloatRed(), - colour->getFloatGreen(), - colour->getFloatBlue(), - colour->getFloatAlpha())), - d2dBrush.resetAndGetPointerAddress()); - - // We need to call SetDrawingEffect with a legimate brush to get DirectWrite to break text based on colours - textLayout->SetDrawingEffect (d2dBrush, range); - } - } - - bool setupLayout (const AttributedString& text, const float maxWidth, const float maxHeight, - ID2D1RenderTarget* const renderTarget, IDWriteFactory* const directWriteFactory, - IDWriteFontCollection* const fontCollection, ComSmartPtr& textLayout) - { - // To add color to text, we need to create a D2D render target - // Since we are not actually rendering to a D2D context we create a temporary GDI render target - - Font defaultFont; - BOOL fontFound = false; - uint32 fontIndex; - fontCollection->FindFamilyName (defaultFont.getTypeface()->getName().toWideCharPointer(), &fontIndex, &fontFound); - - if (! fontFound) - fontIndex = 0; - - ComSmartPtr dwFontFamily; - HRESULT hr = fontCollection->GetFontFamily (fontIndex, dwFontFamily.resetAndGetPointerAddress()); - - ComSmartPtr dwFont; - hr = dwFontFamily->GetFirstMatchingFont (DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STYLE_NORMAL, - dwFont.resetAndGetPointerAddress()); - - const float defaultFontHeightToEmSizeFactor = getFontHeightToEmSizeFactor (dwFont); - - jassert (directWriteFactory != nullptr); - - ComSmartPtr dwTextFormat; - hr = directWriteFactory->CreateTextFormat (defaultFont.getTypefaceName().toWideCharPointer(), fontCollection, - DWRITE_FONT_WEIGHT_REGULAR, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, - defaultFont.getHeight() * defaultFontHeightToEmSizeFactor, - L"en-us", dwTextFormat.resetAndGetPointerAddress()); - - setTextFormatProperties (text, dwTextFormat); - - { - DWRITE_TRIMMING trimming = { DWRITE_TRIMMING_GRANULARITY_CHARACTER, 0, 0 }; - ComSmartPtr trimmingSign; - hr = directWriteFactory->CreateEllipsisTrimmingSign (dwTextFormat, trimmingSign.resetAndGetPointerAddress()); - hr = dwTextFormat->SetTrimming (&trimming, trimmingSign); - } - - const int textLen = text.getText().length(); - - hr = directWriteFactory->CreateTextLayout (text.getText().toWideCharPointer(), textLen, dwTextFormat, - maxWidth, maxHeight, textLayout.resetAndGetPointerAddress()); - - if (FAILED (hr) || textLayout == nullptr) - return false; - - const int numAttributes = text.getNumAttributes(); - - for (int i = 0; i < numAttributes; ++i) - addAttributedRange (*text.getAttribute (i), textLayout, textLen, renderTarget, fontCollection); - - return true; - } - - void createLayout (TextLayout& layout, const AttributedString& text, IDWriteFactory* const directWriteFactory, - ID2D1Factory* const direct2dFactory, IDWriteFontCollection* const fontCollection) - { - // To add color to text, we need to create a D2D render target - // Since we are not actually rendering to a D2D context we create a temporary GDI render target - - D2D1_RENDER_TARGET_PROPERTIES d2dRTProp = D2D1::RenderTargetProperties (D2D1_RENDER_TARGET_TYPE_SOFTWARE, - D2D1::PixelFormat (DXGI_FORMAT_B8G8R8A8_UNORM, - D2D1_ALPHA_MODE_IGNORE), - 0, 0, - D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE, - D2D1_FEATURE_LEVEL_DEFAULT); - ComSmartPtr renderTarget; - HRESULT hr = direct2dFactory->CreateDCRenderTarget (&d2dRTProp, renderTarget.resetAndGetPointerAddress()); - - ComSmartPtr dwTextLayout; - - if (! setupLayout (text, layout.getWidth(), layout.getHeight(), renderTarget, - directWriteFactory, fontCollection, dwTextLayout)) - return; - - UINT32 actualLineCount = 0; - hr = dwTextLayout->GetLineMetrics (nullptr, 0, &actualLineCount); - - layout.ensureStorageAllocated (actualLineCount); - - { - ComSmartPtr textRenderer (new CustomDirectWriteTextRenderer (fontCollection, text)); - hr = dwTextLayout->Draw (&layout, textRenderer, 0, 0); - } - - HeapBlock dwLineMetrics (actualLineCount); - hr = dwTextLayout->GetLineMetrics (dwLineMetrics, actualLineCount, &actualLineCount); - int lastLocation = 0; - const int numLines = jmin ((int) actualLineCount, layout.getNumLines()); - - for (int i = 0; i < numLines; ++i) - { - layout.getLine(i).stringRange = Range (lastLocation, (int) lastLocation + dwLineMetrics[i].length); - lastLocation += dwLineMetrics[i].length; - } - } - - void drawToD2DContext (const AttributedString& text, const Rectangle& area, ID2D1RenderTarget* const renderTarget, - IDWriteFactory* const directWriteFactory, IDWriteFontCollection* const fontCollection) - { - ComSmartPtr dwTextLayout; - - if (setupLayout (text, area.getWidth(), area.getHeight(), renderTarget, - directWriteFactory, fontCollection, dwTextLayout)) - { - ComSmartPtr d2dBrush; - renderTarget->CreateSolidColorBrush (D2D1::ColorF (D2D1::ColorF (0.0f, 0.0f, 0.0f, 1.0f)), - d2dBrush.resetAndGetPointerAddress()); - - renderTarget->DrawTextLayout (D2D1::Point2F ((float) area.getX(), (float) area.getY()), - dwTextLayout, d2dBrush, D2D1_DRAW_TEXT_OPTIONS_CLIP); - } - } -} - -static bool canAllTypefacesBeUsedInLayout (const AttributedString& text) -{ - const int numCharacterAttributes = text.getNumAttributes(); - - for (int i = 0; i < numCharacterAttributes; ++i) - if (const Font* const font = text.getAttribute (i)->getFont()) - if (dynamic_cast (font->getTypeface()) == nullptr) - return false; - - return true; -} - -#endif - -bool TextLayout::createNativeLayout (const AttributedString& text) -{ - #if JUCE_USE_DIRECTWRITE - if (! canAllTypefacesBeUsedInLayout (text)) - return false; - - SharedResourcePointer factories; - - if (factories->d2dFactory != nullptr && factories->systemFonts != nullptr) - { - #if JUCE_64BIT - // There's a mysterious bug in 64-bit Windows that causes garbage floating-point - // values to be returned to DrawGlyphRun the first time that it gets used. - // In lieu of a better plan, this bodge uses a dummy call to work around this. - static bool hasBeenCalled = false; - if (! hasBeenCalled) - { - hasBeenCalled = true; - TextLayout dummy; - DirectWriteTypeLayout::createLayout (dummy, text, factories->directWriteFactory, - factories->d2dFactory, factories->systemFonts); - } - #endif - - DirectWriteTypeLayout::createLayout (*this, text, factories->directWriteFactory, - factories->d2dFactory, factories->systemFonts); - return true; - } - #else - (void) text; - #endif - - return false; -} diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp deleted file mode 100755 index 0673aa5..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp +++ /dev/null @@ -1,307 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#if JUCE_USE_DIRECTWRITE -namespace -{ - static String getLocalisedName (IDWriteLocalizedStrings* names) - { - jassert (names != nullptr); - - uint32 index = 0; - BOOL exists = false; - HRESULT hr = names->FindLocaleName (L"en-us", &index, &exists); - if (! exists) - index = 0; - - uint32 length = 0; - hr = names->GetStringLength (index, &length); - - HeapBlock name (length + 1); - hr = names->GetString (index, name, length + 1); - - return static_cast (name); - } - - static String getFontFamilyName (IDWriteFontFamily* family) - { - jassert (family != nullptr); - ComSmartPtr familyNames; - HRESULT hr = family->GetFamilyNames (familyNames.resetAndGetPointerAddress()); - jassert (SUCCEEDED (hr)); (void) hr; - return getLocalisedName (familyNames); - } - - static String getFontFaceName (IDWriteFont* font) - { - jassert (font != nullptr); - ComSmartPtr faceNames; - HRESULT hr = font->GetFaceNames (faceNames.resetAndGetPointerAddress()); - jassert (SUCCEEDED (hr)); (void) hr; - - return getLocalisedName (faceNames); - } -} - -class Direct2DFactories -{ -public: - Direct2DFactories() - { - if (direct2dDll.open ("d2d1.dll")) - { - JUCE_LOAD_WINAPI_FUNCTION (direct2dDll, D2D1CreateFactory, d2d1CreateFactory, - HRESULT, (D2D1_FACTORY_TYPE, REFIID, D2D1_FACTORY_OPTIONS*, void**)) - - if (d2d1CreateFactory != nullptr) - { - D2D1_FACTORY_OPTIONS options; - options.debugLevel = D2D1_DEBUG_LEVEL_NONE; - - d2d1CreateFactory (D2D1_FACTORY_TYPE_SINGLE_THREADED, __uuidof (ID2D1Factory), &options, - (void**) d2dFactory.resetAndGetPointerAddress()); - } - } - - if (directWriteDll.open ("DWrite.dll")) - { - JUCE_LOAD_WINAPI_FUNCTION (directWriteDll, DWriteCreateFactory, dWriteCreateFactory, - HRESULT, (DWRITE_FACTORY_TYPE, REFIID, IUnknown**)) - - if (dWriteCreateFactory != nullptr) - { - dWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory), - (IUnknown**) directWriteFactory.resetAndGetPointerAddress()); - - if (directWriteFactory != nullptr) - directWriteFactory->GetSystemFontCollection (systemFonts.resetAndGetPointerAddress()); - } - } - } - - ~Direct2DFactories() - { - d2dFactory = nullptr; // (need to make sure these are released before deleting the DynamicLibrary objects) - directWriteFactory = nullptr; - systemFonts = nullptr; - } - - ComSmartPtr d2dFactory; - ComSmartPtr directWriteFactory; - ComSmartPtr systemFonts; - -private: - DynamicLibrary direct2dDll, directWriteDll; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Direct2DFactories) -}; - -//================================================================================================== -class WindowsDirectWriteTypeface : public Typeface -{ -public: - WindowsDirectWriteTypeface (const Font& font, IDWriteFontCollection* fontCollection) - : Typeface (font.getTypefaceName(), font.getTypefaceStyle()), - unitsToHeightScaleFactor (1.0f), heightToPointsFactor (1.0f), ascent (0.0f) - { - jassert (fontCollection != nullptr); - - BOOL fontFound = false; - uint32 fontIndex = 0; - HRESULT hr = fontCollection->FindFamilyName (font.getTypefaceName().toWideCharPointer(), &fontIndex, &fontFound); - if (! fontFound) - fontIndex = 0; - - // Get the font family using the search results - // Fonts like: Times New Roman, Times New Roman Bold, Times New Roman Italic are all in the same font family - ComSmartPtr dwFontFamily; - hr = fontCollection->GetFontFamily (fontIndex, dwFontFamily.resetAndGetPointerAddress()); - - // Get a specific font in the font family using typeface style - { - ComSmartPtr dwFont; - - for (int i = (int) dwFontFamily->GetFontCount(); --i >= 0;) - { - hr = dwFontFamily->GetFont (i, dwFont.resetAndGetPointerAddress()); - - if (i == 0) - break; - - ComSmartPtr faceNames; - hr = dwFont->GetFaceNames (faceNames.resetAndGetPointerAddress()); - - if (font.getTypefaceStyle() == getLocalisedName (faceNames)) - break; - } - - jassert (dwFont != nullptr); - hr = dwFont->CreateFontFace (dwFontFace.resetAndGetPointerAddress()); - } - - if (dwFontFace != nullptr) - { - DWRITE_FONT_METRICS dwFontMetrics; - dwFontFace->GetMetrics (&dwFontMetrics); - - // All Font Metrics are in design units so we need to get designUnitsPerEm value - // to get the metrics into Em/Design Independent Pixels - designUnitsPerEm = dwFontMetrics.designUnitsPerEm; - - ascent = std::abs ((float) dwFontMetrics.ascent); - const float totalSize = ascent + std::abs ((float) dwFontMetrics.descent); - ascent /= totalSize; - unitsToHeightScaleFactor = designUnitsPerEm / totalSize; - - HDC tempDC = GetDC (0); - float dpi = (GetDeviceCaps (tempDC, LOGPIXELSX) + GetDeviceCaps (tempDC, LOGPIXELSY)) / 2.0f; - heightToPointsFactor = (dpi / GetDeviceCaps (tempDC, LOGPIXELSY)) * unitsToHeightScaleFactor; - ReleaseDC (0, tempDC); - - const float pathAscent = (1024.0f * dwFontMetrics.ascent) / designUnitsPerEm; - const float pathDescent = (1024.0f * dwFontMetrics.descent) / designUnitsPerEm; - const float pathScale = 1.0f / (std::abs (pathAscent) + std::abs (pathDescent)); - pathTransform = AffineTransform::scale (pathScale); - } - } - - bool loadedOk() const noexcept { return dwFontFace != nullptr; } - - float getAscent() const { return ascent; } - float getDescent() const { return 1.0f - ascent; } - float getHeightToPointsFactor() const { return heightToPointsFactor; } - - float getStringWidth (const String& text) - { - const CharPointer_UTF32 textUTF32 (text.toUTF32()); - const size_t len = textUTF32.length(); - - HeapBlock glyphIndices (len); - dwFontFace->GetGlyphIndices (textUTF32, (UINT32) len, glyphIndices); - - HeapBlock dwGlyphMetrics (len); - dwFontFace->GetDesignGlyphMetrics (glyphIndices, (UINT32) len, dwGlyphMetrics, false); - - float x = 0; - for (size_t i = 0; i < len; ++i) - x += (float) dwGlyphMetrics[i].advanceWidth / designUnitsPerEm; - - return x * unitsToHeightScaleFactor; - } - - void getGlyphPositions (const String& text, Array & resultGlyphs, Array & xOffsets) - { - xOffsets.add (0); - - const CharPointer_UTF32 textUTF32 (text.toUTF32()); - const size_t len = textUTF32.length(); - - HeapBlock glyphIndices (len); - dwFontFace->GetGlyphIndices (textUTF32, (UINT32) len, glyphIndices); - HeapBlock dwGlyphMetrics (len); - dwFontFace->GetDesignGlyphMetrics (glyphIndices, (UINT32) len, dwGlyphMetrics, false); - - float x = 0; - for (size_t i = 0; i < len; ++i) - { - x += (float) dwGlyphMetrics[i].advanceWidth / designUnitsPerEm; - xOffsets.add (x * unitsToHeightScaleFactor); - resultGlyphs.add (glyphIndices[i]); - } - } - - bool getOutlineForGlyph (int glyphNumber, Path& path) - { - jassert (path.isEmpty()); // we might need to apply a transform to the path, so this must be empty - UINT16 glyphIndex = (UINT16) glyphNumber; - ComSmartPtr pathGeometrySink (new PathGeometrySink()); - - dwFontFace->GetGlyphRunOutline (1024.0f, &glyphIndex, nullptr, nullptr, 1, false, false, pathGeometrySink); - path = pathGeometrySink->path; - - if (! pathTransform.isIdentity()) - path.applyTransform (pathTransform); - - return true; - } - - IDWriteFontFace* getIDWriteFontFace() const noexcept { return dwFontFace; } - -private: - SharedResourcePointer factories; - ComSmartPtr dwFontFace; - float unitsToHeightScaleFactor, heightToPointsFactor, ascent; - int designUnitsPerEm; - AffineTransform pathTransform; - - class PathGeometrySink : public ComBaseClassHelper - { - public: - PathGeometrySink() : ComBaseClassHelper (0) {} - - void __stdcall AddBeziers (const D2D1_BEZIER_SEGMENT *beziers, UINT beziersCount) - { - for (UINT i = 0; i < beziersCount; ++i) - path.cubicTo ((float) beziers[i].point1.x, (float) beziers[i].point1.y, - (float) beziers[i].point2.x, (float) beziers[i].point2.y, - (float) beziers[i].point3.x, (float) beziers[i].point3.y); - } - - void __stdcall AddLines (const D2D1_POINT_2F* points, UINT pointsCount) - { - for (UINT i = 0; i < pointsCount; ++i) - path.lineTo ((float) points[i].x, - (float) points[i].y); - } - - void __stdcall BeginFigure (D2D1_POINT_2F startPoint, D2D1_FIGURE_BEGIN) - { - path.startNewSubPath ((float) startPoint.x, - (float) startPoint.y); - } - - void __stdcall EndFigure (D2D1_FIGURE_END figureEnd) - { - if (figureEnd == D2D1_FIGURE_END_CLOSED) - path.closeSubPath(); - } - - void __stdcall SetFillMode (D2D1_FILL_MODE fillMode) - { - path.setUsingNonZeroWinding (fillMode == D2D1_FILL_MODE_WINDING); - } - - void __stdcall SetSegmentFlags (D2D1_PATH_SEGMENT) {} - JUCE_COMRESULT Close() { return S_OK; } - - Path path; - - private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PathGeometrySink) - }; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WindowsDirectWriteTypeface) -}; - -#endif diff --git a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp b/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp deleted file mode 100755 index bc5bb35..0000000 --- a/JuceLibraryCode/modules/juce_graphics/native/juce_win32_Fonts.cpp +++ /dev/null @@ -1,644 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -/* This is some quick-and-dirty code to extract the typeface name from a lump of TTF file data. - It's needed because although win32 will happily load a TTF file from in-memory data, it won't - tell you the name of the damned font that it just loaded.. and in order to actually use the font, - you need to know its name!! Anyway, this awful hack seems to work for most fonts. -*/ -namespace TTFNameExtractor -{ - struct OffsetTable - { - uint32 version; - uint16 numTables, searchRange, entrySelector, rangeShift; - }; - - struct TableDirectory - { - char tag[4]; - uint32 checkSum, offset, length; - }; - - struct NamingTable - { - uint16 formatSelector; - uint16 numberOfNameRecords; - uint16 offsetStartOfStringStorage; - }; - - struct NameRecord - { - uint16 platformID, encodingID, languageID; - uint16 nameID, stringLength, offsetFromStorageArea; - }; - - static String parseNameRecord (MemoryInputStream& input, const NameRecord& nameRecord, - const int64 directoryOffset, const int64 offsetOfStringStorage) - { - String result; - const int64 oldPos = input.getPosition(); - input.setPosition (directoryOffset + offsetOfStringStorage + ByteOrder::swapIfLittleEndian (nameRecord.offsetFromStorageArea)); - const int stringLength = (int) ByteOrder::swapIfLittleEndian (nameRecord.stringLength); - const int platformID = ByteOrder::swapIfLittleEndian (nameRecord.platformID); - - if (platformID == 0 || platformID == 3) - { - const int numChars = stringLength / 2 + 1; - HeapBlock buffer; - buffer.calloc (numChars + 1); - input.read (buffer, stringLength); - - for (int i = 0; i < numChars; ++i) - buffer[i] = ByteOrder::swapIfLittleEndian (buffer[i]); - - static_jassert (sizeof (CharPointer_UTF16::CharType) == sizeof (uint16)); - result = CharPointer_UTF16 ((CharPointer_UTF16::CharType*) buffer.getData()); - } - else - { - HeapBlock buffer; - buffer.calloc (stringLength + 1); - input.read (buffer, stringLength); - result = CharPointer_UTF8 (buffer.getData()); - } - - input.setPosition (oldPos); - return result; - } - - static String parseNameTable (MemoryInputStream& input, int64 directoryOffset) - { - input.setPosition (directoryOffset); - - NamingTable namingTable = { 0 }; - input.read (&namingTable, sizeof (namingTable)); - - for (int i = 0; i < (int) ByteOrder::swapIfLittleEndian (namingTable.numberOfNameRecords); ++i) - { - NameRecord nameRecord = { 0 }; - input.read (&nameRecord, sizeof (nameRecord)); - - if (ByteOrder::swapIfLittleEndian (nameRecord.nameID) == 4) - { - const String result (parseNameRecord (input, nameRecord, directoryOffset, - ByteOrder::swapIfLittleEndian (namingTable.offsetStartOfStringStorage))); - - if (result.isNotEmpty()) - return result; - } - } - - return String(); - } - - static String getTypefaceNameFromFile (MemoryInputStream& input) - { - OffsetTable offsetTable = { 0 }; - input.read (&offsetTable, sizeof (offsetTable)); - - for (int i = 0; i < (int) ByteOrder::swapIfLittleEndian (offsetTable.numTables); ++i) - { - TableDirectory tableDirectory; - zerostruct (tableDirectory); - input.read (&tableDirectory, sizeof (tableDirectory)); - - if (String (tableDirectory.tag, sizeof (tableDirectory.tag)).equalsIgnoreCase ("name")) - return parseNameTable (input, ByteOrder::swapIfLittleEndian (tableDirectory.offset)); - } - - return String(); - } -} - -namespace FontEnumerators -{ - static int CALLBACK fontEnum2 (ENUMLOGFONTEXW* lpelfe, NEWTEXTMETRICEXW*, int type, LPARAM lParam) - { - if (lpelfe != nullptr && (type & RASTER_FONTTYPE) == 0) - { - const String fontName (lpelfe->elfLogFont.lfFaceName); - ((StringArray*) lParam)->addIfNotAlreadyThere (fontName.removeCharacters ("@")); - } - - return 1; - } - - static int CALLBACK fontEnum1 (ENUMLOGFONTEXW* lpelfe, NEWTEXTMETRICEXW*, int type, LPARAM lParam) - { - if (lpelfe != nullptr && (type & RASTER_FONTTYPE) == 0) - { - LOGFONTW lf = { 0 }; - lf.lfWeight = FW_DONTCARE; - lf.lfOutPrecision = OUT_OUTLINE_PRECIS; - lf.lfQuality = DEFAULT_QUALITY; - lf.lfCharSet = DEFAULT_CHARSET; - lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; - lf.lfPitchAndFamily = FF_DONTCARE; - - const String fontName (lpelfe->elfLogFont.lfFaceName); - fontName.copyToUTF16 (lf.lfFaceName, sizeof (lf.lfFaceName)); - - HDC dc = CreateCompatibleDC (0); - EnumFontFamiliesEx (dc, &lf, - (FONTENUMPROCW) &fontEnum2, - lParam, 0); - DeleteDC (dc); - } - - return 1; - } -} - -StringArray Font::findAllTypefaceNames() -{ - StringArray results; - - #if JUCE_USE_DIRECTWRITE - SharedResourcePointer factories; - - if (factories->systemFonts != nullptr) - { - ComSmartPtr fontFamily; - uint32 fontFamilyCount = 0; - fontFamilyCount = factories->systemFonts->GetFontFamilyCount(); - - for (uint32 i = 0; i < fontFamilyCount; ++i) - { - HRESULT hr = factories->systemFonts->GetFontFamily (i, fontFamily.resetAndGetPointerAddress()); - - if (SUCCEEDED (hr)) - results.addIfNotAlreadyThere (getFontFamilyName (fontFamily)); - } - } - else - #endif - { - HDC dc = CreateCompatibleDC (0); - - { - LOGFONTW lf = { 0 }; - lf.lfWeight = FW_DONTCARE; - lf.lfOutPrecision = OUT_OUTLINE_PRECIS; - lf.lfQuality = DEFAULT_QUALITY; - lf.lfCharSet = DEFAULT_CHARSET; - lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; - lf.lfPitchAndFamily = FF_DONTCARE; - - EnumFontFamiliesEx (dc, &lf, - (FONTENUMPROCW) &FontEnumerators::fontEnum1, - (LPARAM) &results, 0); - } - - DeleteDC (dc); - } - - results.sort (true); - return results; -} - -StringArray Font::findAllTypefaceStyles (const String& family) -{ - if (FontStyleHelpers::isPlaceholderFamilyName (family)) - return findAllTypefaceStyles (FontStyleHelpers::getConcreteFamilyNameFromPlaceholder (family)); - - StringArray results; - - #if JUCE_USE_DIRECTWRITE - SharedResourcePointer factories; - - if (factories->systemFonts != nullptr) - { - BOOL fontFound = false; - uint32 fontIndex = 0; - HRESULT hr = factories->systemFonts->FindFamilyName (family.toWideCharPointer(), &fontIndex, &fontFound); - if (! fontFound) - fontIndex = 0; - - // Get the font family using the search results - // Fonts like: Times New Roman, Times New Roman Bold, Times New Roman Italic are all in the same font family - ComSmartPtr fontFamily; - hr = factories->systemFonts->GetFontFamily (fontIndex, fontFamily.resetAndGetPointerAddress()); - - // Get the font faces - ComSmartPtr dwFont; - uint32 fontFacesCount = 0; - fontFacesCount = fontFamily->GetFontCount(); - - for (uint32 i = 0; i < fontFacesCount; ++i) - { - hr = fontFamily->GetFont (i, dwFont.resetAndGetPointerAddress()); - - // Ignore any algorithmically generated bold and oblique styles.. - if (dwFont->GetSimulations() == DWRITE_FONT_SIMULATIONS_NONE) - results.addIfNotAlreadyThere (getFontFaceName (dwFont)); - } - } - else - #endif - { - results.add ("Regular"); - results.add ("Italic"); - results.add ("Bold"); - results.add ("Bold Italic"); - } - - return results; -} - -extern bool juce_isRunningInWine(); - -struct DefaultFontNames -{ - DefaultFontNames() - { - if (juce_isRunningInWine()) - { - // If we're running in Wine, then use fonts that might be available on Linux.. - defaultSans = "Bitstream Vera Sans"; - defaultSerif = "Bitstream Vera Serif"; - defaultFixed = "Bitstream Vera Sans Mono"; - } - else - { - defaultSans = "Verdana"; - defaultSerif = "Times New Roman"; - defaultFixed = "Lucida Console"; - defaultFallback = "Tahoma"; // (contains plenty of unicode characters) - } - } - - String defaultSans, defaultSerif, defaultFixed, defaultFallback; -}; - -Typeface::Ptr Font::getDefaultTypefaceForFont (const Font& font) -{ - static DefaultFontNames defaultNames; - - Font newFont (font); - const String& faceName = font.getTypefaceName(); - - if (faceName == getDefaultSansSerifFontName()) newFont.setTypefaceName (defaultNames.defaultSans); - else if (faceName == getDefaultSerifFontName()) newFont.setTypefaceName (defaultNames.defaultSerif); - else if (faceName == getDefaultMonospacedFontName()) newFont.setTypefaceName (defaultNames.defaultFixed); - - if (font.getTypefaceStyle() == getDefaultStyle()) - newFont.setTypefaceStyle ("Regular"); - - return Typeface::createSystemTypefaceFor (newFont); -} - -//============================================================================== -class WindowsTypeface : public Typeface -{ -public: - WindowsTypeface (const Font& font) - : Typeface (font.getTypefaceName(), font.getTypefaceStyle()), - fontH (0), previousFontH (0), - dc (CreateCompatibleDC (0)), memoryFont (0), - ascent (1.0f), heightToPointsFactor (1.0f), - defaultGlyph (-1) - { - loadFont(); - } - - WindowsTypeface (const void* data, size_t dataSize) - : Typeface (String(), String()), - fontH (0), previousFontH (0), - dc (CreateCompatibleDC (0)), memoryFont (0), - ascent (1.0f), heightToPointsFactor (1.0f), - defaultGlyph (-1) - { - DWORD numInstalled = 0; - memoryFont = AddFontMemResourceEx (const_cast (data), (DWORD) dataSize, - nullptr, &numInstalled); - - MemoryInputStream m (data, dataSize, false); - name = TTFNameExtractor::getTypefaceNameFromFile (m); - loadFont(); - } - - ~WindowsTypeface() - { - SelectObject (dc, previousFontH); // Replacing the previous font before deleting the DC avoids a warning in BoundsChecker - DeleteDC (dc); - - if (fontH != 0) - DeleteObject (fontH); - - if (memoryFont != 0) - RemoveFontMemResourceEx (memoryFont); - } - - float getAscent() const { return ascent; } - float getDescent() const { return 1.0f - ascent; } - float getHeightToPointsFactor() const { return heightToPointsFactor; } - - float getStringWidth (const String& text) - { - const CharPointer_UTF16 utf16 (text.toUTF16()); - const size_t numChars = utf16.length(); - HeapBlock results (numChars + 1); - results[numChars] = -1; - float x = 0; - - if (GetGlyphIndices (dc, utf16, (int) numChars, reinterpret_cast (results.getData()), - GGI_MARK_NONEXISTING_GLYPHS) != GDI_ERROR) - { - for (size_t i = 0; i < numChars; ++i) - x += getKerning (dc, results[i], results[i + 1]); - } - - return x; - } - - void getGlyphPositions (const String& text, Array & resultGlyphs, Array & xOffsets) - { - const CharPointer_UTF16 utf16 (text.toUTF16()); - const size_t numChars = utf16.length(); - HeapBlock results (numChars + 1); - results[numChars] = -1; - float x = 0; - - if (GetGlyphIndices (dc, utf16, (int) numChars, reinterpret_cast (results.getData()), - GGI_MARK_NONEXISTING_GLYPHS) != GDI_ERROR) - { - resultGlyphs.ensureStorageAllocated ((int) numChars); - xOffsets.ensureStorageAllocated ((int) numChars + 1); - - for (size_t i = 0; i < numChars; ++i) - { - resultGlyphs.add (results[i]); - xOffsets.add (x); - x += getKerning (dc, results[i], results[i + 1]); - } - } - - xOffsets.add (x); - } - - bool getOutlineForGlyph (int glyphNumber, Path& glyphPath) - { - if (glyphNumber < 0) - glyphNumber = defaultGlyph; - - GLYPHMETRICS gm; - // (although GetGlyphOutline returns a DWORD, it may be -1 on failure, so treat it as signed int..) - const int bufSize = (int) GetGlyphOutline (dc, (UINT) glyphNumber, GGO_NATIVE | GGO_GLYPH_INDEX, - &gm, 0, 0, &identityMatrix); - - if (bufSize > 0) - { - HeapBlock data (bufSize); - GetGlyphOutline (dc, (UINT) glyphNumber, GGO_NATIVE | GGO_GLYPH_INDEX, &gm, - bufSize, data, &identityMatrix); - - const TTPOLYGONHEADER* pheader = reinterpret_cast (data.getData()); - - const float scaleX = 1.0f / tm.tmHeight; - const float scaleY = -scaleX; - - while ((char*) pheader < data + bufSize) - { - glyphPath.startNewSubPath (scaleX * pheader->pfxStart.x.value, - scaleY * pheader->pfxStart.y.value); - - const TTPOLYCURVE* curve = (const TTPOLYCURVE*) ((const char*) pheader + sizeof (TTPOLYGONHEADER)); - const char* const curveEnd = ((const char*) pheader) + pheader->cb; - - while ((const char*) curve < curveEnd) - { - if (curve->wType == TT_PRIM_LINE) - { - for (int i = 0; i < curve->cpfx; ++i) - glyphPath.lineTo (scaleX * curve->apfx[i].x.value, - scaleY * curve->apfx[i].y.value); - } - else if (curve->wType == TT_PRIM_QSPLINE) - { - for (int i = 0; i < curve->cpfx - 1; ++i) - { - const float x2 = scaleX * curve->apfx[i].x.value; - const float y2 = scaleY * curve->apfx[i].y.value; - float x3 = scaleX * curve->apfx[i + 1].x.value; - float y3 = scaleY * curve->apfx[i + 1].y.value; - - if (i < curve->cpfx - 2) - { - x3 = 0.5f * (x2 + x3); - y3 = 0.5f * (y2 + y3); - } - - glyphPath.quadraticTo (x2, y2, x3, y3); - } - } - - curve = (const TTPOLYCURVE*) &(curve->apfx [curve->cpfx]); - } - - pheader = (const TTPOLYGONHEADER*) curve; - - glyphPath.closeSubPath(); - } - } - - return true; - } - -private: - static const MAT2 identityMatrix; - HFONT fontH; - HGDIOBJ previousFontH; - HDC dc; - TEXTMETRIC tm; - HANDLE memoryFont; - float ascent, heightToPointsFactor; - int defaultGlyph, heightInPoints; - - struct KerningPair - { - int glyph1, glyph2; - float kerning; - - bool operator== (const KerningPair& other) const noexcept - { - return glyph1 == other.glyph1 && glyph2 == other.glyph2; - } - - bool operator< (const KerningPair& other) const noexcept - { - return glyph1 < other.glyph1 - || (glyph1 == other.glyph1 && glyph2 < other.glyph2); - } - }; - - SortedSet kerningPairs; - - void loadFont() - { - SetMapperFlags (dc, 0); - SetMapMode (dc, MM_TEXT); - - LOGFONTW lf = { 0 }; - lf.lfCharSet = DEFAULT_CHARSET; - lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; - lf.lfOutPrecision = OUT_OUTLINE_PRECIS; - lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; - lf.lfQuality = PROOF_QUALITY; - lf.lfItalic = (BYTE) (style.contains ("Italic") ? TRUE : FALSE); - lf.lfWeight = style.contains ("Bold") ? FW_BOLD : FW_NORMAL; - lf.lfHeight = -256; - name.copyToUTF16 (lf.lfFaceName, sizeof (lf.lfFaceName)); - - HFONT standardSizedFont = CreateFontIndirect (&lf); - - if (standardSizedFont != 0) - { - if ((previousFontH = SelectObject (dc, standardSizedFont)) != 0) - { - fontH = standardSizedFont; - - OUTLINETEXTMETRIC otm; - if (GetOutlineTextMetrics (dc, sizeof (otm), &otm) != 0) - { - heightInPoints = otm.otmEMSquare; - lf.lfHeight = -(int) heightInPoints; - fontH = CreateFontIndirect (&lf); - - SelectObject (dc, fontH); - DeleteObject (standardSizedFont); - } - } - } - - if (GetTextMetrics (dc, &tm)) - { - float dpi = (GetDeviceCaps (dc, LOGPIXELSX) + GetDeviceCaps (dc, LOGPIXELSY)) / 2.0f; - heightToPointsFactor = (dpi / GetDeviceCaps (dc, LOGPIXELSY)) * heightInPoints / (float) tm.tmHeight; - ascent = tm.tmAscent / (float) tm.tmHeight; - defaultGlyph = getGlyphForChar (dc, tm.tmDefaultChar); - createKerningPairs (dc, (float) tm.tmHeight); - } - } - - void createKerningPairs (HDC dc, const float height) - { - HeapBlock rawKerning; - const DWORD numKPs = GetKerningPairs (dc, 0, 0); - rawKerning.calloc (numKPs); - GetKerningPairs (dc, numKPs, rawKerning); - - kerningPairs.ensureStorageAllocated ((int) numKPs); - - for (DWORD i = 0; i < numKPs; ++i) - { - KerningPair kp; - kp.glyph1 = getGlyphForChar (dc, rawKerning[i].wFirst); - kp.glyph2 = getGlyphForChar (dc, rawKerning[i].wSecond); - - const int standardWidth = getGlyphWidth (dc, kp.glyph1); - kp.kerning = (standardWidth + rawKerning[i].iKernAmount) / height; - kerningPairs.add (kp); - - kp.glyph2 = -1; // add another entry for the standard width version.. - kp.kerning = standardWidth / height; - kerningPairs.add (kp); - } - } - - static int getGlyphForChar (HDC dc, juce_wchar character) - { - const WCHAR charToTest[] = { (WCHAR) character, 0 }; - WORD index = 0; - - if (GetGlyphIndices (dc, charToTest, 1, &index, GGI_MARK_NONEXISTING_GLYPHS) == GDI_ERROR - || index == 0xffff) - return -1; - - return index; - } - - static int getGlyphWidth (HDC dc, int glyphNumber) - { - GLYPHMETRICS gm; - gm.gmCellIncX = 0; - GetGlyphOutline (dc, (UINT) glyphNumber, GGO_NATIVE | GGO_GLYPH_INDEX, &gm, 0, 0, &identityMatrix); - return gm.gmCellIncX; - } - - float getKerning (HDC dc, const int glyph1, const int glyph2) - { - KerningPair kp; - kp.glyph1 = glyph1; - kp.glyph2 = glyph2; - int index = kerningPairs.indexOf (kp); - - if (index < 0) - { - kp.glyph2 = -1; - index = kerningPairs.indexOf (kp); - - if (index < 0) - { - kp.glyph2 = -1; - kp.kerning = getGlyphWidth (dc, kp.glyph1) / (float) tm.tmHeight; - kerningPairs.add (kp); - return kp.kerning; - } - } - - return kerningPairs.getReference (index).kerning; - } - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WindowsTypeface) -}; - -const MAT2 WindowsTypeface::identityMatrix = { { 0, 1 }, { 0, 0 }, { 0, 0 }, { 0, 1 } }; - -Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) -{ - #if JUCE_USE_DIRECTWRITE - SharedResourcePointer factories; - - if (factories->systemFonts != nullptr) - { - ScopedPointer wtf (new WindowsDirectWriteTypeface (font, factories->systemFonts)); - - if (wtf->loadedOk()) - return wtf.release(); - } - #endif - - return new WindowsTypeface (font); -} - -Typeface::Ptr Typeface::createSystemTypefaceFor (const void* data, size_t dataSize) -{ - return new WindowsTypeface (data, dataSize); -} - -void Typeface::scanFolderForFonts (const File&) -{ - jassertfalse; // not implemented on this platform -} diff --git a/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h b/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h deleted file mode 100755 index f80fa21..0000000 --- a/JuceLibraryCode/modules/juce_graphics/placement/juce_Justification.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_JUSTIFICATION_H_INCLUDED -#define JUCE_JUSTIFICATION_H_INCLUDED - - -//============================================================================== -/** - Represents a type of justification to be used when positioning graphical items. - - e.g. it indicates whether something should be placed top-left, top-right, - centred, etc. - - It is used in various places wherever this kind of information is needed. -*/ -class Justification -{ -public: - //============================================================================== - /** Creates a Justification object using a combination of flags from the Flags enum. */ - Justification (int justificationFlags) noexcept : flags (justificationFlags) {} - - /** Creates a copy of another Justification object. */ - Justification (const Justification& other) noexcept : flags (other.flags) {} - - /** Copies another Justification object. */ - Justification& operator= (const Justification& other) noexcept - { - flags = other.flags; - return *this; - } - - bool operator== (const Justification& other) const noexcept { return flags == other.flags; } - bool operator!= (const Justification& other) const noexcept { return flags != other.flags; } - - //============================================================================== - /** Returns the raw flags that are set for this Justification object. */ - inline int getFlags() const noexcept { return flags; } - - /** Tests a set of flags for this object. - @returns true if any of the flags passed in are set on this object. - */ - inline bool testFlags (int flagsToTest) const noexcept { return (flags & flagsToTest) != 0; } - - /** Returns just the flags from this object that deal with vertical layout. */ - int getOnlyVerticalFlags() const noexcept { return flags & (top | bottom | verticallyCentred); } - - /** Returns just the flags from this object that deal with horizontal layout. */ - int getOnlyHorizontalFlags() const noexcept { return flags & (left | right | horizontallyCentred | horizontallyJustified); } - - //============================================================================== - /** Adjusts the position of a rectangle to fit it into a space. - - The (x, y) position of the rectangle will be updated to position it inside the - given space according to the justification flags. - */ - template - void applyToRectangle (ValueType& x, ValueType& y, ValueType w, ValueType h, - ValueType spaceX, ValueType spaceY, ValueType spaceW, ValueType spaceH) const noexcept - { - x = spaceX; - if ((flags & horizontallyCentred) != 0) x += (spaceW - w) / (ValueType) 2; - else if ((flags & right) != 0) x += spaceW - w; - - y = spaceY; - if ((flags & verticallyCentred) != 0) y += (spaceH - h) / (ValueType) 2; - else if ((flags & bottom) != 0) y += spaceH - h; - } - - /** Returns the new position of a rectangle that has been justified to fit within a given space. - */ - template - const Rectangle appliedToRectangle (const Rectangle& areaToAdjust, - const Rectangle& targetSpace) const noexcept - { - ValueType x = areaToAdjust.getX(), y = areaToAdjust.getY(); - applyToRectangle (x, y, areaToAdjust.getWidth(), areaToAdjust.getHeight(), - targetSpace.getX(), targetSpace.getY(), targetSpace.getWidth(), targetSpace.getHeight()); - return areaToAdjust.withPosition (x, y); - } - - //============================================================================== - /** Flag values that can be combined and used in the constructor. */ - enum Flags - { - //============================================================================== - /** Indicates that the item should be aligned against the left edge of the available space. */ - left = 1, - - /** Indicates that the item should be aligned against the right edge of the available space. */ - right = 2, - - /** Indicates that the item should be placed in the centre between the left and right - sides of the available space. */ - horizontallyCentred = 4, - - //============================================================================== - /** Indicates that the item should be aligned against the top edge of the available space. */ - top = 8, - - /** Indicates that the item should be aligned against the bottom edge of the available space. */ - bottom = 16, - - /** Indicates that the item should be placed in the centre between the top and bottom - sides of the available space. */ - verticallyCentred = 32, - - //============================================================================== - /** Indicates that lines of text should be spread out to fill the maximum width - available, so that both margins are aligned vertically. - */ - horizontallyJustified = 64, - - //============================================================================== - /** Indicates that the item should be centred vertically and horizontally. - This is equivalent to (horizontallyCentred | verticallyCentred) - */ - centred = 36, - - /** Indicates that the item should be centred vertically but placed on the left hand side. - This is equivalent to (left | verticallyCentred) - */ - centredLeft = 33, - - /** Indicates that the item should be centred vertically but placed on the right hand side. - This is equivalent to (right | verticallyCentred) - */ - centredRight = 34, - - /** Indicates that the item should be centred horizontally and placed at the top. - This is equivalent to (horizontallyCentred | top) - */ - centredTop = 12, - - /** Indicates that the item should be centred horizontally and placed at the bottom. - This is equivalent to (horizontallyCentred | bottom) - */ - centredBottom = 20, - - /** Indicates that the item should be placed in the top-left corner. - This is equivalent to (left | top) - */ - topLeft = 9, - - /** Indicates that the item should be placed in the top-right corner. - This is equivalent to (right | top) - */ - topRight = 10, - - /** Indicates that the item should be placed in the bottom-left corner. - This is equivalent to (left | bottom) - */ - bottomLeft = 17, - - /** Indicates that the item should be placed in the bottom-left corner. - This is equivalent to (right | bottom) - */ - bottomRight = 18 - }; - - -private: - //============================================================================== - int flags; -}; - -#endif // JUCE_JUSTIFICATION_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp b/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp deleted file mode 100755 index 031048e..0000000 --- a/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -RectanglePlacement::RectanglePlacement (const RectanglePlacement& other) noexcept - : flags (other.flags) -{ -} - -RectanglePlacement& RectanglePlacement::operator= (const RectanglePlacement& other) noexcept -{ - flags = other.flags; - return *this; -} - -bool RectanglePlacement::operator== (const RectanglePlacement& other) const noexcept -{ - return flags == other.flags; -} - -bool RectanglePlacement::operator!= (const RectanglePlacement& other) const noexcept -{ - return flags != other.flags; -} - -void RectanglePlacement::applyTo (double& x, double& y, double& w, double& h, - const double dx, const double dy, const double dw, const double dh) const noexcept -{ - if (w == 0 || h == 0) - return; - - if ((flags & stretchToFit) != 0) - { - x = dx; - y = dy; - w = dw; - h = dh; - } - else - { - double scale = (flags & fillDestination) != 0 ? jmax (dw / w, dh / h) - : jmin (dw / w, dh / h); - - if ((flags & onlyReduceInSize) != 0) - scale = jmin (scale, 1.0); - - if ((flags & onlyIncreaseInSize) != 0) - scale = jmax (scale, 1.0); - - w *= scale; - h *= scale; - - if ((flags & xLeft) != 0) - x = dx; - else if ((flags & xRight) != 0) - x = dx + dw - w; - else - x = dx + (dw - w) * 0.5; - - if ((flags & yTop) != 0) - y = dy; - else if ((flags & yBottom) != 0) - y = dy + dh - h; - else - y = dy + (dh - h) * 0.5; - } -} - -AffineTransform RectanglePlacement::getTransformToFit (const Rectangle& source, const Rectangle& destination) const noexcept -{ - if (source.isEmpty()) - return AffineTransform::identity; - - float newX = destination.getX(); - float newY = destination.getY(); - - float scaleX = destination.getWidth() / source.getWidth(); - float scaleY = destination.getHeight() / source.getHeight(); - - if ((flags & stretchToFit) == 0) - { - scaleX = (flags & fillDestination) != 0 ? jmax (scaleX, scaleY) - : jmin (scaleX, scaleY); - - if ((flags & onlyReduceInSize) != 0) - scaleX = jmin (scaleX, 1.0f); - - if ((flags & onlyIncreaseInSize) != 0) - scaleX = jmax (scaleX, 1.0f); - - scaleY = scaleX; - - if ((flags & xRight) != 0) - newX += destination.getWidth() - source.getWidth() * scaleX; // right - else if ((flags & xLeft) == 0) - newX += (destination.getWidth() - source.getWidth() * scaleX) / 2.0f; // centre - - if ((flags & yBottom) != 0) - newY += destination.getHeight() - source.getHeight() * scaleX; // bottom - else if ((flags & yTop) == 0) - newY += (destination.getHeight() - source.getHeight() * scaleX) / 2.0f; // centre - } - - return AffineTransform::translation (-source.getX(), -source.getY()) - .scaled (scaleX, scaleY) - .translated (newX, newY); -} diff --git a/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h b/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h deleted file mode 100755 index 9341e67..0000000 --- a/JuceLibraryCode/modules/juce_graphics/placement/juce_RectanglePlacement.h +++ /dev/null @@ -1,172 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_RECTANGLEPLACEMENT_H_INCLUDED -#define JUCE_RECTANGLEPLACEMENT_H_INCLUDED - - -//============================================================================== -/** - Defines the method used to postion some kind of rectangular object within - a rectangular viewport. - - Although similar to Justification, this is more specific, and has some extra - options. -*/ -class JUCE_API RectanglePlacement -{ -public: - //============================================================================== - /** Creates a RectanglePlacement object using a combination of flags from the Flags enum. */ - inline RectanglePlacement (int placementFlags) noexcept : flags (placementFlags) {} - - /** Creates a default RectanglePlacement object, which is equivalent to using the 'centred' flag. */ - inline RectanglePlacement() noexcept : flags (centred) {} - - /** Creates a copy of another RectanglePlacement object. */ - RectanglePlacement (const RectanglePlacement&) noexcept; - - /** Copies another RectanglePlacement object. */ - RectanglePlacement& operator= (const RectanglePlacement&) noexcept; - - bool operator== (const RectanglePlacement&) const noexcept; - bool operator!= (const RectanglePlacement&) const noexcept; - - //============================================================================== - /** Flag values that can be combined and used in the constructor. */ - enum Flags - { - //============================================================================== - /** Indicates that the source rectangle's left edge should be aligned with the left edge of the target rectangle. */ - xLeft = 1, - - /** Indicates that the source rectangle's right edge should be aligned with the right edge of the target rectangle. */ - xRight = 2, - - /** Indicates that the source should be placed in the centre between the left and right - sides of the available space. */ - xMid = 4, - - //============================================================================== - /** Indicates that the source's top edge should be aligned with the top edge of the - destination rectangle. */ - yTop = 8, - - /** Indicates that the source's bottom edge should be aligned with the bottom edge of the - destination rectangle. */ - yBottom = 16, - - /** Indicates that the source should be placed in the centre between the top and bottom - sides of the available space. */ - yMid = 32, - - //============================================================================== - /** If this flag is set, then the source rectangle will be resized to completely fill - the destination rectangle, and all other flags are ignored. - */ - stretchToFit = 64, - - //============================================================================== - /** If this flag is set, then the source rectangle will be resized so that it is the - minimum size to completely fill the destination rectangle, without changing its - aspect ratio. This means that some of the source rectangle may fall outside - the destination. - - If this flag is not set, the source will be given the maximum size at which none - of it falls outside the destination rectangle. - */ - fillDestination = 128, - - /** Indicates that the source rectangle can be reduced in size if required, but should - never be made larger than its original size. - */ - onlyReduceInSize = 256, - - /** Indicates that the source rectangle can be enlarged if required, but should - never be made smaller than its original size. - */ - onlyIncreaseInSize = 512, - - /** Indicates that the source rectangle's size should be left unchanged. - */ - doNotResize = (onlyIncreaseInSize | onlyReduceInSize), - - //============================================================================== - /** A shorthand value that is equivalent to (xMid | yMid). */ - centred = 4 + 32 - }; - - //============================================================================== - /** Returns the raw flags that are set for this object. */ - inline int getFlags() const noexcept { return flags; } - - /** Tests a set of flags for this object. - - @returns true if any of the flags passed in are set on this object. - */ - inline bool testFlags (int flagsToTest) const noexcept { return (flags & flagsToTest) != 0; } - - - //============================================================================== - /** Adjusts the position and size of a rectangle to fit it into a space. - - The source rectangle coordinates will be adjusted so that they fit into - the destination rectangle based on this object's flags. - */ - void applyTo (double& sourceX, - double& sourceY, - double& sourceW, - double& sourceH, - double destinationX, - double destinationY, - double destinationW, - double destinationH) const noexcept; - - /** Returns the rectangle that should be used to fit the given source rectangle - into the destination rectangle using the current flags. - */ - template - Rectangle appliedTo (const Rectangle& source, - const Rectangle& destination) const noexcept - { - double x = source.getX(), y = source.getY(), w = source.getWidth(), h = source.getHeight(); - applyTo (x, y, w, h, static_cast (destination.getX()), static_cast (destination.getY()), - static_cast (destination.getWidth()), static_cast (destination.getHeight())); - return Rectangle (static_cast (x), static_cast (y), - static_cast (w), static_cast (h)); - } - - /** Returns the transform that should be applied to these source coordinates to fit them - into the destination rectangle using the current flags. - */ - AffineTransform getTransformToFit (const Rectangle& source, - const Rectangle& destination) const noexcept; - - -private: - //============================================================================== - int flags; -}; - -#endif // JUCE_RECTANGLEPLACEMENT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp b/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp deleted file mode 100755 index 4e21873..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -JUCEApplication::JUCEApplication() {} -JUCEApplication::~JUCEApplication() {} - -//============================================================================== -JUCEApplication* JUCE_CALLTYPE JUCEApplication::getInstance() noexcept -{ - return dynamic_cast (JUCEApplicationBase::getInstance()); -} - -bool JUCEApplication::moreThanOneInstanceAllowed() { return true; } -void JUCEApplication::anotherInstanceStarted (const String&) {} - -void JUCEApplication::suspended() {} -void JUCEApplication::resumed() {} - -void JUCEApplication::systemRequestedQuit() { quit(); } - -void JUCEApplication::unhandledException (const std::exception*, const String&, int) -{ - jassertfalse; -} - -//============================================================================== -ApplicationCommandTarget* JUCEApplication::getNextCommandTarget() -{ - return nullptr; -} - -void JUCEApplication::getAllCommands (Array& commands) -{ - commands.add (StandardApplicationCommandIDs::quit); -} - -void JUCEApplication::getCommandInfo (const CommandID commandID, ApplicationCommandInfo& result) -{ - if (commandID == StandardApplicationCommandIDs::quit) - { - result.setInfo (TRANS("Quit"), - TRANS("Quits the application"), - "Application", 0); - - result.defaultKeypresses.add (KeyPress ('q', ModifierKeys::commandModifier, 0)); - } -} - -bool JUCEApplication::perform (const InvocationInfo& info) -{ - if (info.commandID == StandardApplicationCommandIDs::quit) - { - systemRequestedQuit(); - return true; - } - - return false; -} - -//============================================================================== -#if JUCE_MAC - extern void juce_initialiseMacMainMenu(); -#endif - -bool JUCEApplication::initialiseApp() -{ - if (JUCEApplicationBase::initialiseApp()) - { - #if JUCE_MAC - juce_initialiseMacMainMenu(); // (needs to get the app's name) - #endif - - return true; - } - - return false; -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h b/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h deleted file mode 100755 index 140cf9d..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/application/juce_Application.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_APPLICATION_H_INCLUDED -#define JUCE_APPLICATION_H_INCLUDED - - -//============================================================================== -/** - An instance of this class is used to specify initialisation and shutdown - code for the application. - - Any application that wants to run an event loop must declare a subclass of - JUCEApplicationBase or JUCEApplication, and implement its various pure virtual - methods. - - It then needs to use the START_JUCE_APPLICATION macro somewhere in a CPP file - to declare an instance of this class and generate suitable platform-specific - boilerplate code to launch the app. - - Note that this class is derived from JUCEApplicationBase, which contains most - of the useful methods and functionality. This derived class is here simply as - a convenient way to also inherit from an ApplicationCommandTarget, and to implement - default versions of some of the pure virtual base class methods. But you can derive - your app object directly from JUCEApplicationBase if you want to, and by doing so - can avoid having a dependency on the juce_gui_basics module. - - e.g. @code - class MyJUCEApp : public JUCEApplication - { - public: - MyJUCEApp() {} - ~MyJUCEApp() {} - - void initialise (const String& commandLine) override - { - myMainWindow = new MyApplicationWindow(); - myMainWindow->setBounds (100, 100, 400, 500); - myMainWindow->setVisible (true); - } - - void shutdown() override - { - myMainWindow = nullptr; - } - - const String getApplicationName() override - { - return "Super JUCE-o-matic"; - } - - const String getApplicationVersion() override - { - return "1.0"; - } - - private: - ScopedPointer myMainWindow; - }; - - // this generates boilerplate code to launch our app class: - START_JUCE_APPLICATION (MyJUCEApp) - @endcode - - @see JUCEApplicationBase, START_JUCE_APPLICATION -*/ -class JUCE_API JUCEApplication : public JUCEApplicationBase, - public ApplicationCommandTarget -{ -public: - //============================================================================== - /** Constructs a JUCE app object. - - If subclasses implement a constructor or destructor, they shouldn't call any - JUCE code in there - put your startup/shutdown code in initialise() and - shutdown() instead. - */ - JUCEApplication(); - - /** Destructor. - - If subclasses implement a constructor or destructor, they shouldn't call any - JUCE code in there - put your startup/shutdown code in initialise() and - shutdown() instead. - */ - ~JUCEApplication(); - - //============================================================================== - /** Returns the global instance of the application object being run. */ - static JUCEApplication* JUCE_CALLTYPE getInstance() noexcept; - - //============================================================================== - /** Returns the application's name. */ - virtual const String getApplicationName() = 0; - - /** Returns the application's version number. */ - virtual const String getApplicationVersion() = 0; - - /** Checks whether multiple instances of the app are allowed. - - If you application class returns true for this, more than one instance is - permitted to run (except on OSX where the OS automatically stops you launching - a second instance of an app without explicitly starting it from the command-line). - - If it's false, the second instance won't start, but it you will still get a - callback to anotherInstanceStarted() to tell you about this - which - gives you a chance to react to what the user was trying to do. - */ - bool moreThanOneInstanceAllowed() override; - - /** Indicates that the user has tried to start up another instance of the app. - This will get called even if moreThanOneInstanceAllowed() is false. - */ - void anotherInstanceStarted (const String& commandLine) override; - - /** Called when the operating system is trying to close the application. - - The default implementation of this method is to call quit(), but it may - be overloaded to ignore the request or do some other special behaviour - instead. For example, you might want to offer the user the chance to save - their changes before quitting, and give them the chance to cancel. - - If you want to send a quit signal to your app, this is the correct method - to call, because it means that requests that come from the system get handled - in the same way as those from your own application code. So e.g. you'd - call this method from a "quit" item on a menu bar. - */ - void systemRequestedQuit() override; - - /** This method is called when the application is being put into background mode - by the operating system. - */ - void suspended() override; - - /** This method is called when the application is being woken from background mode - by the operating system. - */ - void resumed() override; - - /** If any unhandled exceptions make it through to the message dispatch loop, this - callback will be triggered, in case you want to log them or do some other - type of error-handling. - - If the type of exception is derived from the std::exception class, the pointer - passed-in will be valid. If the exception is of unknown type, this pointer - will be null. - */ - void unhandledException (const std::exception* e, - const String& sourceFilename, - int lineNumber) override; - - //============================================================================== - /** @internal */ - ApplicationCommandTarget* getNextCommandTarget(); - /** @internal */ - void getCommandInfo (CommandID, ApplicationCommandInfo&); - /** @internal */ - void getAllCommands (Array&); - /** @internal */ - bool perform (const InvocationInfo&); - -private: - bool initialiseApp() override; - - JUCE_DECLARE_NON_COPYABLE (JUCEApplication) -}; - - -#endif // JUCE_APPLICATION_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp deleted file mode 100755 index 75f8590..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ArrowButton::ArrowButton (const String& name, float arrowDirectionInRadians, Colour arrowColour) - : Button (name), colour (arrowColour) -{ - path.addTriangle (0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.5f); - path.applyTransform (AffineTransform::rotation (float_Pi * 2.0f * arrowDirectionInRadians, 0.5f, 0.5f)); -} - -ArrowButton::~ArrowButton() {} - -void ArrowButton::paintButton (Graphics& g, bool /*isMouseOverButton*/, bool isButtonDown) -{ - Path p (path); - - const float offset = isButtonDown ? 1.0f : 0.0f; - p.applyTransform (path.getTransformToScaleToFit (offset, offset, getWidth() - 3.0f, getHeight() - 3.0f, false)); - - DropShadow (Colours::black.withAlpha (0.3f), isButtonDown ? 2 : 4, Point()).drawForPath (g, p); - - g.setColour (colour); - g.fillPath (p); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h deleted file mode 100755 index 5d64123..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ArrowButton.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_ARROWBUTTON_H_INCLUDED -#define JUCE_ARROWBUTTON_H_INCLUDED - - -//============================================================================== -/** - A button with an arrow in it. - - @see Button -*/ -class JUCE_API ArrowButton : public Button -{ -public: - //============================================================================== - /** Creates an ArrowButton. - - @param buttonName the name to give the button - @param arrowDirection the direction the arrow should point in, where 0.0 is - pointing right, 0.25 is down, 0.5 is left, 0.75 is up - @param arrowColour the colour to use for the arrow - */ - ArrowButton (const String& buttonName, - float arrowDirection, - Colour arrowColour); - - /** Destructor. */ - ~ArrowButton(); - - /** @internal */ - void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override; - -private: - Colour colour; - Path path; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ArrowButton) -}; - - -#endif // JUCE_ARROWBUTTON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp deleted file mode 100755 index 10d6e03..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.cpp +++ /dev/null @@ -1,674 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class Button::CallbackHelper : public Timer, - public ApplicationCommandManagerListener, - public ValueListener, - public KeyListener -{ -public: - CallbackHelper (Button& b) : button (b) {} - - void timerCallback() override - { - button.repeatTimerCallback(); - } - - bool keyStateChanged (bool, Component*) override - { - return button.keyStateChangedCallback(); - } - - void valueChanged (Value& value) override - { - if (value.refersToSameSourceAs (button.isOn)) - button.setToggleState (button.isOn.getValue(), sendNotification); - } - - bool keyPressed (const KeyPress&, Component*) override - { - // returning true will avoid forwarding events for keys that we're using as shortcuts - return button.isShortcutPressed(); - } - - void applicationCommandInvoked (const ApplicationCommandTarget::InvocationInfo& info) override - { - if (info.commandID == button.commandID - && (info.commandFlags & ApplicationCommandInfo::dontTriggerVisualFeedback) == 0) - button.flashButtonState(); - } - - void applicationCommandListChanged() override - { - button.applicationCommandListChangeCallback(); - } - -private: - Button& button; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CallbackHelper) -}; - -//============================================================================== -Button::Button (const String& name) - : Component (name), - text (name), - buttonPressTime (0), - lastRepeatTime (0), - commandManagerToUse (nullptr), - autoRepeatDelay (-1), - autoRepeatSpeed (0), - autoRepeatMinimumDelay (-1), - radioGroupId (0), - connectedEdgeFlags (0), - commandID(), - buttonState (buttonNormal), - lastToggleState (false), - clickTogglesState (false), - needsToRelease (false), - needsRepainting (false), - isKeyDown (false), - triggerOnMouseDown (false), - generateTooltip (false) -{ - callbackHelper = new CallbackHelper (*this); - - setWantsKeyboardFocus (true); - isOn.addListener (callbackHelper); -} - -Button::~Button() -{ - clearShortcuts(); - - if (commandManagerToUse != nullptr) - commandManagerToUse->removeListener (callbackHelper); - - isOn.removeListener (callbackHelper); - callbackHelper = nullptr; -} - -//============================================================================== -void Button::setButtonText (const String& newText) -{ - if (text != newText) - { - text = newText; - repaint(); - } -} - -void Button::setTooltip (const String& newTooltip) -{ - SettableTooltipClient::setTooltip (newTooltip); - generateTooltip = false; -} - -void Button::updateAutomaticTooltip (const ApplicationCommandInfo& info) -{ - if (generateTooltip && commandManagerToUse != nullptr) - { - String tt (info.description.isNotEmpty() ? info.description - : info.shortName); - - Array keyPresses (commandManagerToUse->getKeyMappings()->getKeyPressesAssignedToCommand (commandID)); - - for (int i = 0; i < keyPresses.size(); ++i) - { - const String key (keyPresses.getReference(i).getTextDescription()); - - tt << " ["; - - if (key.length() == 1) - tt << TRANS("shortcut") << ": '" << key << "']"; - else - tt << key << ']'; - } - - SettableTooltipClient::setTooltip (tt); - } -} - -void Button::setConnectedEdges (const int newFlags) -{ - if (connectedEdgeFlags != newFlags) - { - connectedEdgeFlags = newFlags; - repaint(); - } -} - -//============================================================================== -void Button::setToggleState (const bool shouldBeOn, const NotificationType notification) -{ - if (shouldBeOn != lastToggleState) - { - WeakReference deletionWatcher (this); - - if (shouldBeOn) - { - turnOffOtherButtonsInGroup (notification); - - if (deletionWatcher == nullptr) - return; - } - - if (getToggleState() != shouldBeOn) // this test means that if the value is void rather than explicitly set to - isOn = shouldBeOn; // false, it won't be changed unless the required value is true. - - lastToggleState = shouldBeOn; - repaint(); - - if (notification != dontSendNotification) - { - // async callbacks aren't possible here - jassert (notification != sendNotificationAsync); - - sendClickMessage (ModifierKeys::getCurrentModifiers()); - - if (deletionWatcher == nullptr) - return; - } - - if (notification != dontSendNotification) - sendStateMessage(); - else - buttonStateChanged(); - } -} - -void Button::setToggleState (const bool shouldBeOn, bool sendChange) -{ - setToggleState (shouldBeOn, sendChange ? sendNotification : dontSendNotification); -} - -void Button::setClickingTogglesState (const bool shouldToggle) noexcept -{ - clickTogglesState = shouldToggle; - - // if you've got clickTogglesState turned on, you shouldn't also connect the button - // up to be a command invoker. Instead, your command handler must flip the state of whatever - // it is that this button represents, and the button will update its state to reflect this - // in the applicationCommandListChanged() method. - jassert (commandManagerToUse == nullptr || ! clickTogglesState); -} - -bool Button::getClickingTogglesState() const noexcept -{ - return clickTogglesState; -} - -void Button::setRadioGroupId (const int newGroupId, NotificationType notification) -{ - if (radioGroupId != newGroupId) - { - radioGroupId = newGroupId; - - if (lastToggleState) - turnOffOtherButtonsInGroup (notification); - } -} - -void Button::turnOffOtherButtonsInGroup (const NotificationType notification) -{ - if (Component* const p = getParentComponent()) - { - if (radioGroupId != 0) - { - WeakReference deletionWatcher (this); - - for (int i = p->getNumChildComponents(); --i >= 0;) - { - Component* const c = p->getChildComponent (i); - - if (c != this) - { - if (Button* const b = dynamic_cast (c)) - { - if (b->getRadioGroupId() == radioGroupId) - { - b->setToggleState (false, notification); - - if (deletionWatcher == nullptr) - return; - } - } - } - } - } - } -} - -//============================================================================== -void Button::enablementChanged() -{ - updateState(); - repaint(); -} - -Button::ButtonState Button::updateState() -{ - return updateState (isMouseOver (true), isMouseButtonDown()); -} - -Button::ButtonState Button::updateState (const bool over, const bool down) -{ - ButtonState newState = buttonNormal; - - if (isEnabled() && isVisible() && ! isCurrentlyBlockedByAnotherModalComponent()) - { - if ((down && (over || (triggerOnMouseDown && buttonState == buttonDown))) || isKeyDown) - newState = buttonDown; - else if (over) - newState = buttonOver; - } - - setState (newState); - return newState; -} - -void Button::setState (const ButtonState newState) -{ - if (buttonState != newState) - { - buttonState = newState; - repaint(); - - if (buttonState == buttonDown) - { - buttonPressTime = Time::getApproximateMillisecondCounter(); - lastRepeatTime = 0; - } - - sendStateMessage(); - } -} - -bool Button::isDown() const noexcept { return buttonState == buttonDown; } -bool Button::isOver() const noexcept { return buttonState != buttonNormal; } - -void Button::buttonStateChanged() {} - -uint32 Button::getMillisecondsSinceButtonDown() const noexcept -{ - const uint32 now = Time::getApproximateMillisecondCounter(); - return now > buttonPressTime ? now - buttonPressTime : 0; -} - -void Button::setTriggeredOnMouseDown (const bool isTriggeredOnMouseDown) noexcept -{ - triggerOnMouseDown = isTriggeredOnMouseDown; -} - -//============================================================================== -void Button::clicked() -{ -} - -void Button::clicked (const ModifierKeys&) -{ - clicked(); -} - -enum { clickMessageId = 0x2f3f4f99 }; - -void Button::triggerClick() -{ - postCommandMessage (clickMessageId); -} - -void Button::internalClickCallback (const ModifierKeys& modifiers) -{ - if (clickTogglesState) - { - const bool shouldBeOn = (radioGroupId != 0 || ! lastToggleState); - - if (shouldBeOn != getToggleState()) - { - setToggleState (shouldBeOn, sendNotification); - return; - } - } - - sendClickMessage (modifiers); -} - -void Button::flashButtonState() -{ - if (isEnabled()) - { - needsToRelease = true; - setState (buttonDown); - callbackHelper->startTimer (100); - } -} - -void Button::handleCommandMessage (int commandId) -{ - if (commandId == clickMessageId) - { - if (isEnabled()) - { - flashButtonState(); - internalClickCallback (ModifierKeys::getCurrentModifiers()); - } - } - else - { - Component::handleCommandMessage (commandId); - } -} - -//============================================================================== -void Button::addListener (ButtonListener* const newListener) -{ - buttonListeners.add (newListener); -} - -void Button::removeListener (ButtonListener* const listener) -{ - buttonListeners.remove (listener); -} - -void Button::sendClickMessage (const ModifierKeys& modifiers) -{ - Component::BailOutChecker checker (this); - - if (commandManagerToUse != nullptr && commandID != 0) - { - ApplicationCommandTarget::InvocationInfo info (commandID); - info.invocationMethod = ApplicationCommandTarget::InvocationInfo::fromButton; - info.originatingComponent = this; - - commandManagerToUse->invoke (info, true); - } - - clicked (modifiers); - - if (! checker.shouldBailOut()) - buttonListeners.callChecked (checker, &ButtonListener::buttonClicked, this); // (can't use Button::Listener due to idiotic VC2005 bug) -} - -void Button::sendStateMessage() -{ - Component::BailOutChecker checker (this); - - buttonStateChanged(); - - if (! checker.shouldBailOut()) - buttonListeners.callChecked (checker, &ButtonListener::buttonStateChanged, this); -} - -//============================================================================== -void Button::paint (Graphics& g) -{ - if (needsToRelease && isEnabled()) - { - needsToRelease = false; - needsRepainting = true; - } - - paintButton (g, isOver(), isDown()); -} - -//============================================================================== -void Button::mouseEnter (const MouseEvent&) { updateState (true, false); } -void Button::mouseExit (const MouseEvent&) { updateState (false, false); } - -void Button::mouseDown (const MouseEvent& e) -{ - updateState (true, true); - - if (isDown()) - { - if (autoRepeatDelay >= 0) - callbackHelper->startTimer (autoRepeatDelay); - - if (triggerOnMouseDown) - internalClickCallback (e.mods); - } -} - -void Button::mouseUp (const MouseEvent& e) -{ - const bool wasDown = isDown(); - const bool wasOver = isOver(); - updateState (isMouseOver(), false); - - if (wasDown && wasOver && ! triggerOnMouseDown) - internalClickCallback (e.mods); -} - -void Button::mouseDrag (const MouseEvent&) -{ - const ButtonState oldState = buttonState; - updateState (isMouseOver(), true); - - if (autoRepeatDelay >= 0 && buttonState != oldState && isDown()) - callbackHelper->startTimer (autoRepeatSpeed); -} - -void Button::focusGained (FocusChangeType) -{ - updateState(); - repaint(); -} - -void Button::focusLost (FocusChangeType) -{ - updateState(); - repaint(); -} - -void Button::visibilityChanged() -{ - needsToRelease = false; - updateState(); -} - -void Button::parentHierarchyChanged() -{ - Component* const newKeySource = (shortcuts.size() == 0) ? nullptr : getTopLevelComponent(); - - if (newKeySource != keySource.get()) - { - if (keySource != nullptr) - keySource->removeKeyListener (callbackHelper); - - keySource = newKeySource; - - if (keySource != nullptr) - keySource->addKeyListener (callbackHelper); - } -} - -//============================================================================== -void Button::setCommandToTrigger (ApplicationCommandManager* const newCommandManager, - const CommandID newCommandID, const bool generateTip) -{ - commandID = newCommandID; - generateTooltip = generateTip; - - if (commandManagerToUse != newCommandManager) - { - if (commandManagerToUse != nullptr) - commandManagerToUse->removeListener (callbackHelper); - - commandManagerToUse = newCommandManager; - - if (commandManagerToUse != nullptr) - commandManagerToUse->addListener (callbackHelper); - - // if you've got clickTogglesState turned on, you shouldn't also connect the button - // up to be a command invoker. Instead, your command handler must flip the state of whatever - // it is that this button represents, and the button will update its state to reflect this - // in the applicationCommandListChanged() method. - jassert (commandManagerToUse == nullptr || ! clickTogglesState); - } - - if (commandManagerToUse != nullptr) - applicationCommandListChangeCallback(); - else - setEnabled (true); -} - -void Button::applicationCommandListChangeCallback() -{ - if (commandManagerToUse != nullptr) - { - ApplicationCommandInfo info (0); - - if (commandManagerToUse->getTargetForCommand (commandID, info) != nullptr) - { - updateAutomaticTooltip (info); - setEnabled ((info.flags & ApplicationCommandInfo::isDisabled) == 0); - setToggleState ((info.flags & ApplicationCommandInfo::isTicked) != 0, dontSendNotification); - } - else - { - setEnabled (false); - } - } -} - -//============================================================================== -void Button::addShortcut (const KeyPress& key) -{ - if (key.isValid()) - { - jassert (! isRegisteredForShortcut (key)); // already registered! - - shortcuts.add (key); - parentHierarchyChanged(); - } -} - -void Button::clearShortcuts() -{ - shortcuts.clear(); - parentHierarchyChanged(); -} - -bool Button::isShortcutPressed() const -{ - if (isShowing() && ! isCurrentlyBlockedByAnotherModalComponent()) - for (int i = shortcuts.size(); --i >= 0;) - if (shortcuts.getReference(i).isCurrentlyDown()) - return true; - - return false; -} - -bool Button::isRegisteredForShortcut (const KeyPress& key) const -{ - for (int i = shortcuts.size(); --i >= 0;) - if (key == shortcuts.getReference(i)) - return true; - - return false; -} - -bool Button::keyStateChangedCallback() -{ - if (! isEnabled()) - return false; - - const bool wasDown = isKeyDown; - isKeyDown = isShortcutPressed(); - - if (autoRepeatDelay >= 0 && (isKeyDown && ! wasDown)) - callbackHelper->startTimer (autoRepeatDelay); - - updateState(); - - if (isEnabled() && wasDown && ! isKeyDown) - { - internalClickCallback (ModifierKeys::getCurrentModifiers()); - - // (return immediately - this button may now have been deleted) - return true; - } - - return wasDown || isKeyDown; -} - -bool Button::keyPressed (const KeyPress& key) -{ - if (isEnabled() && key.isKeyCode (KeyPress::returnKey)) - { - triggerClick(); - return true; - } - - return false; -} - -//============================================================================== -void Button::setRepeatSpeed (const int initialDelayMillisecs, - const int repeatMillisecs, - const int minimumDelayInMillisecs) noexcept -{ - autoRepeatDelay = initialDelayMillisecs; - autoRepeatSpeed = repeatMillisecs; - autoRepeatMinimumDelay = jmin (autoRepeatSpeed, minimumDelayInMillisecs); -} - -void Button::repeatTimerCallback() -{ - if (needsRepainting) - { - callbackHelper->stopTimer(); - updateState(); - needsRepainting = false; - } - else if (autoRepeatSpeed > 0 && (isKeyDown || (updateState() == buttonDown))) - { - int repeatSpeed = autoRepeatSpeed; - - if (autoRepeatMinimumDelay >= 0) - { - double timeHeldDown = jmin (1.0, getMillisecondsSinceButtonDown() / 4000.0); - timeHeldDown *= timeHeldDown; - - repeatSpeed = repeatSpeed + (int) (timeHeldDown * (autoRepeatMinimumDelay - repeatSpeed)); - } - - repeatSpeed = jmax (1, repeatSpeed); - - const uint32 now = Time::getMillisecondCounter(); - - // if we've been blocked from repeating often enough, speed up the repeat timer to compensate.. - if (lastRepeatTime != 0 && (int) (now - lastRepeatTime) > repeatSpeed * 2) - repeatSpeed = jmax (1, repeatSpeed / 2); - - lastRepeatTime = now; - callbackHelper->startTimer (repeatSpeed); - - internalClickCallback (ModifierKeys::getCurrentModifiers()); - } - else if (! needsToRelease) - { - callbackHelper->stopTimer(); - } -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h deleted file mode 100755 index a58342d..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_Button.h +++ /dev/null @@ -1,514 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_BUTTON_H_INCLUDED -#define JUCE_BUTTON_H_INCLUDED - - -//============================================================================== -/** - A base class for buttons. - - This contains all the logic for button behaviours such as enabling/disabling, - responding to shortcut keystrokes, auto-repeating when held down, toggle-buttons - and radio groups, etc. - - @see TextButton, DrawableButton, ToggleButton -*/ -class JUCE_API Button : public Component, - public SettableTooltipClient -{ -protected: - //============================================================================== - /** Creates a button. - - @param buttonName the text to put in the button (the component's name is also - initially set to this string, but these can be changed later - using the setName() and setButtonText() methods) - */ - explicit Button (const String& buttonName); - -public: - /** Destructor. */ - virtual ~Button(); - - //============================================================================== - /** Changes the button's text. - @see getButtonText - */ - void setButtonText (const String& newText); - - /** Returns the text displayed in the button. - @see setButtonText - */ - const String& getButtonText() const { return text; } - - //============================================================================== - /** Returns true if the button is currently being held down. - @see isOver - */ - bool isDown() const noexcept; - - /** Returns true if the mouse is currently over the button. - This will be also be true if the button is being held down. - @see isDown - */ - bool isOver() const noexcept; - - //============================================================================== - /** A button has an on/off state associated with it, and this changes that. - - By default buttons are 'off' and for simple buttons that you click to perform - an action you won't change this. Toggle buttons, however will want to - change their state when turned on or off. - - @param shouldBeOn whether to set the button's toggle state to be on or - off. If it's a member of a button group, this will - always try to turn it on, and to turn off any other - buttons in the group - @param notification determines the behaviour if the value changes - this - can invoke a synchronous call to clicked(), but - sendNotificationAsync is not supported - @see getToggleState, setRadioGroupId - */ - void setToggleState (bool shouldBeOn, NotificationType notification); - - /** Returns true if the button is 'on'. - - By default buttons are 'off' and for simple buttons that you click to perform - an action you won't change this. Toggle buttons, however will want to - change their state when turned on or off. - - @see setToggleState - */ - bool getToggleState() const noexcept { return isOn.getValue(); } - - /** Returns the Value object that represents the botton's toggle state. - You can use this Value object to connect the button's state to external values or setters, - either by taking a copy of the Value, or by using Value::referTo() to make it point to - your own Value object. - @see getToggleState, Value - */ - Value& getToggleStateValue() noexcept { return isOn; } - - /** This tells the button to automatically flip the toggle state when - the button is clicked. - - If set to true, then before the clicked() callback occurs, the toggle-state - of the button is flipped. - */ - void setClickingTogglesState (bool shouldAutoToggleOnClick) noexcept; - - /** Returns true if this button is set to be an automatic toggle-button. - This returns the last value that was passed to setClickingTogglesState(). - */ - bool getClickingTogglesState() const noexcept; - - //============================================================================== - /** Enables the button to act as a member of a mutually-exclusive group - of 'radio buttons'. - - If the group ID is set to a non-zero number, then this button will - act as part of a group of buttons with the same ID, only one of - which can be 'on' at the same time. Note that when it's part of - a group, clicking a toggle-button that's 'on' won't turn it off. - - To find other buttons with the same ID, this button will search through - its sibling components for ToggleButtons, so all the buttons for a - particular group must be placed inside the same parent component. - - Set the group ID back to zero if you want it to act as a normal toggle - button again. - - The notification argument lets you specify how other buttons should react - to being turned on or off in response to this call. - - @see getRadioGroupId - */ - void setRadioGroupId (int newGroupId, NotificationType notification = sendNotification); - - /** Returns the ID of the group to which this button belongs. - (See setRadioGroupId() for an explanation of this). - */ - int getRadioGroupId() const noexcept { return radioGroupId; } - - //============================================================================== - /** - Used to receive callbacks when a button is clicked. - - @see Button::addListener, Button::removeListener - */ - class JUCE_API Listener - { - public: - /** Destructor. */ - virtual ~Listener() {} - - /** Called when the button is clicked. */ - virtual void buttonClicked (Button*) = 0; - - /** Called when the button's state changes. */ - virtual void buttonStateChanged (Button*) {} - }; - - /** Registers a listener to receive events when this button's state changes. - If the listener is already registered, this will not register it again. - @see removeListener - */ - void addListener (Listener* newListener); - - /** Removes a previously-registered button listener - @see addListener - */ - void removeListener (Listener* listener); - - //============================================================================== - /** Causes the button to act as if it's been clicked. - - This will asynchronously make the button draw itself going down and up, and - will then call back the clicked() method as if mouse was clicked on it. - - @see clicked - */ - virtual void triggerClick(); - - //============================================================================== - /** Sets a command ID for this button to automatically invoke when it's clicked. - - When the button is pressed, it will use the given manager to trigger the - command ID. - - Obviously be careful that the ApplicationCommandManager doesn't get deleted - before this button is. To disable the command triggering, call this method and - pass nullptr as the command manager. - - If generateTooltip is true, then the button's tooltip will be automatically - generated based on the name of this command and its current shortcut key. - - @see addShortcut, getCommandID - */ - void setCommandToTrigger (ApplicationCommandManager* commandManagerToUse, - CommandID commandID, - bool generateTooltip); - - /** Returns the command ID that was set by setCommandToTrigger(). */ - CommandID getCommandID() const noexcept { return commandID; } - - //============================================================================== - /** Assigns a shortcut key to trigger the button. - - The button registers itself with its top-level parent component for keypresses. - - Note that a different way of linking buttons to keypresses is by using the - setCommandToTrigger() method to invoke a command. - - @see clearShortcuts - */ - void addShortcut (const KeyPress&); - - /** Removes all key shortcuts that had been set for this button. - @see addShortcut - */ - void clearShortcuts(); - - /** Returns true if the given keypress is a shortcut for this button. - @see addShortcut - */ - bool isRegisteredForShortcut (const KeyPress&) const; - - //============================================================================== - /** Sets an auto-repeat speed for the button when it is held down. - - (Auto-repeat is disabled by default). - - @param initialDelayInMillisecs how long to wait after the mouse is pressed before - triggering the next click. If this is zero, auto-repeat - is disabled - @param repeatDelayInMillisecs the frequently subsequent repeated clicks should be - triggered - @param minimumDelayInMillisecs if this is greater than 0, the auto-repeat speed will - get faster, the longer the button is held down, up to the - minimum interval specified here - */ - void setRepeatSpeed (int initialDelayInMillisecs, - int repeatDelayInMillisecs, - int minimumDelayInMillisecs = -1) noexcept; - - /** Sets whether the button click should happen when the mouse is pressed or released. - - By default the button is only considered to have been clicked when the mouse is - released, but setting this to true will make it call the clicked() method as soon - as the button is pressed. - - This is useful if the button is being used to show a pop-up menu, as it allows - the click to be used as a drag onto the menu. - */ - void setTriggeredOnMouseDown (bool isTriggeredOnMouseDown) noexcept; - - /** Returns the number of milliseconds since the last time the button - went into the 'down' state. - */ - uint32 getMillisecondsSinceButtonDown() const noexcept; - - //============================================================================== - /** Sets the tooltip for this button. - @see TooltipClient, TooltipWindow - */ - void setTooltip (const String& newTooltip) override; - - //============================================================================== - /** A combination of these flags are used by setConnectedEdges(). */ - enum ConnectedEdgeFlags - { - ConnectedOnLeft = 1, - ConnectedOnRight = 2, - ConnectedOnTop = 4, - ConnectedOnBottom = 8 - }; - - /** Hints about which edges of the button might be connected to adjoining buttons. - - The value passed in is a bitwise combination of any of the values in the - ConnectedEdgeFlags enum. - - E.g. if you are placing two buttons adjacent to each other, you could use this to - indicate which edges are touching, and the LookAndFeel might choose to drawn them - without rounded corners on the edges that connect. It's only a hint, so the - LookAndFeel can choose to ignore it if it's not relevent for this type of - button. - */ - void setConnectedEdges (int connectedEdgeFlags); - - /** Returns the set of flags passed into setConnectedEdges(). */ - int getConnectedEdgeFlags() const noexcept { return connectedEdgeFlags; } - - /** Indicates whether the button adjoins another one on its left edge. - @see setConnectedEdges - */ - bool isConnectedOnLeft() const noexcept { return (connectedEdgeFlags & ConnectedOnLeft) != 0; } - - /** Indicates whether the button adjoins another one on its right edge. - @see setConnectedEdges - */ - bool isConnectedOnRight() const noexcept { return (connectedEdgeFlags & ConnectedOnRight) != 0; } - - /** Indicates whether the button adjoins another one on its top edge. - @see setConnectedEdges - */ - bool isConnectedOnTop() const noexcept { return (connectedEdgeFlags & ConnectedOnTop) != 0; } - - /** Indicates whether the button adjoins another one on its bottom edge. - @see setConnectedEdges - */ - bool isConnectedOnBottom() const noexcept { return (connectedEdgeFlags & ConnectedOnBottom) != 0; } - - - //============================================================================== - /** Used by setState(). */ - enum ButtonState - { - buttonNormal, - buttonOver, - buttonDown - }; - - /** Can be used to force the button into a particular state. - - This only changes the button's appearance, it won't trigger a click, or stop any mouse-clicks - from happening. - - The state that you set here will only last until it is automatically changed when the mouse - enters or exits the button, or the mouse-button is pressed or released. - */ - void setState (ButtonState newState); - - /** Returns the button's current over/down/up state. */ - ButtonState getState() const noexcept { return buttonState; } - - // This method's parameters have changed - see the new version. - JUCE_DEPRECATED (void setToggleState (bool, bool)); - - //============================================================================== - /** This abstract base class is implemented by LookAndFeel classes to provide - button-drawing functionality. - */ - struct JUCE_API LookAndFeelMethods - { - virtual ~LookAndFeelMethods() {} - - virtual void drawButtonBackground (Graphics&, Button&, const Colour& backgroundColour, - bool isMouseOverButton, bool isButtonDown) = 0; - - virtual Font getTextButtonFont (TextButton&, int buttonHeight) = 0; - virtual int getTextButtonWidthToFitText (TextButton&, int buttonHeight) = 0; - - /** Draws the text for a TextButton. */ - virtual void drawButtonText (Graphics&, TextButton&, bool isMouseOverButton, bool isButtonDown) = 0; - - /** Draws the contents of a standard ToggleButton. */ - virtual void drawToggleButton (Graphics&, ToggleButton&, bool isMouseOverButton, bool isButtonDown) = 0; - - virtual void changeToggleButtonWidthToFitText (ToggleButton&) = 0; - - virtual void drawTickBox (Graphics&, Component&, float x, float y, float w, float h, - bool ticked, bool isEnabled, bool isMouseOverButton, bool isButtonDown) = 0; - - virtual void drawDrawableButton (Graphics&, DrawableButton&, bool isMouseOverButton, bool isButtonDown) = 0; - - private: - #if JUCE_CATCH_DEPRECATED_CODE_MISUSE - // These method have been deprecated: see their replacements above. - virtual int getTextButtonFont (TextButton&) { return 0; } - virtual int changeTextButtonWidthToFitText (TextButton&, int) { return 0; } - #endif - }; - -protected: - //============================================================================== - /** This method is called when the button has been clicked. - - Subclasses can override this to perform whatever they actions they need - to do. - - Alternatively, a ButtonListener can be added to the button, and these listeners - will be called when the click occurs. - - @see triggerClick - */ - virtual void clicked(); - - /** This method is called when the button has been clicked. - - By default it just calls clicked(), but you might want to override it to handle - things like clicking when a modifier key is pressed, etc. - - @see ModifierKeys - */ - virtual void clicked (const ModifierKeys& modifiers); - - /** Subclasses should override this to actually paint the button's contents. - - It's better to use this than the paint method, because it gives you information - about the over/down state of the button. - - @param g the graphics context to use - @param isMouseOverButton true if the button is either in the 'over' or - 'down' state - @param isButtonDown true if the button should be drawn in the 'down' position - */ - virtual void paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown) = 0; - - /** Called when the button's up/down/over state changes. - - Subclasses can override this if they need to do something special when the button - goes up or down. - - @see isDown, isOver - */ - virtual void buttonStateChanged(); - - //============================================================================== - /** @internal */ - virtual void internalClickCallback (const ModifierKeys&); - /** @internal */ - void handleCommandMessage (int commandId) override; - /** @internal */ - void mouseEnter (const MouseEvent&) override; - /** @internal */ - void mouseExit (const MouseEvent&) override; - /** @internal */ - void mouseDown (const MouseEvent&) override; - /** @internal */ - void mouseDrag (const MouseEvent&) override; - /** @internal */ - void mouseUp (const MouseEvent&) override; - /** @internal */ - bool keyPressed (const KeyPress&) override; - /** @internal */ - using Component::keyStateChanged; - /** @internal */ - void paint (Graphics&) override; - /** @internal */ - void parentHierarchyChanged() override; - /** @internal */ - void visibilityChanged() override; - /** @internal */ - void focusGained (FocusChangeType) override; - /** @internal */ - void focusLost (FocusChangeType) override; - /** @internal */ - void enablementChanged() override; - -private: - //============================================================================== - Array shortcuts; - WeakReference keySource; - String text; - ListenerList buttonListeners; - - class CallbackHelper; - friend class CallbackHelper; - friend struct ContainerDeletePolicy; - ScopedPointer callbackHelper; - uint32 buttonPressTime, lastRepeatTime; - ApplicationCommandManager* commandManagerToUse; - int autoRepeatDelay, autoRepeatSpeed, autoRepeatMinimumDelay; - int radioGroupId, connectedEdgeFlags; - CommandID commandID; - ButtonState buttonState; - - Value isOn; - bool lastToggleState; - bool clickTogglesState; - bool needsToRelease; - bool needsRepainting; - bool isKeyDown; - bool triggerOnMouseDown; - bool generateTooltip; - - void repeatTimerCallback(); - bool keyStateChangedCallback(); - void applicationCommandListChangeCallback(); - void updateAutomaticTooltip (const ApplicationCommandInfo&); - - ButtonState updateState(); - ButtonState updateState (bool isOver, bool isDown); - bool isShortcutPressed() const; - void turnOffOtherButtonsInGroup (NotificationType); - - void flashButtonState(); - void sendClickMessage (const ModifierKeys&); - void sendStateMessage(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Button) -}; - -#ifndef DOXYGEN - /** This typedef is just for compatibility with old code and VC6 - newer code should use Button::Listener instead. */ - typedef Button::Listener ButtonListener; -#endif - -#endif // JUCE_BUTTON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp deleted file mode 100755 index 83e9c89..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.cpp +++ /dev/null @@ -1,221 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -DrawableButton::DrawableButton (const String& name, const DrawableButton::ButtonStyle buttonStyle) - : Button (name), - style (buttonStyle), - currentImage (nullptr), - edgeIndent (3) -{ -} - -DrawableButton::~DrawableButton() -{ -} - -//============================================================================== -static Drawable* copyDrawableIfNotNull (const Drawable* const d) -{ - return d != nullptr ? d->createCopy() : nullptr; -} - -void DrawableButton::setImages (const Drawable* normal, - const Drawable* over, - const Drawable* down, - const Drawable* disabled, - const Drawable* normalOn, - const Drawable* overOn, - const Drawable* downOn, - const Drawable* disabledOn) -{ - jassert (normal != nullptr); // you really need to give it at least a normal image.. - - normalImage = copyDrawableIfNotNull (normal); - overImage = copyDrawableIfNotNull (over); - downImage = copyDrawableIfNotNull (down); - disabledImage = copyDrawableIfNotNull (disabled); - normalImageOn = copyDrawableIfNotNull (normalOn); - overImageOn = copyDrawableIfNotNull (overOn); - downImageOn = copyDrawableIfNotNull (downOn); - disabledImageOn = copyDrawableIfNotNull (disabledOn); - - buttonStateChanged(); -} - -//============================================================================== -void DrawableButton::setButtonStyle (const DrawableButton::ButtonStyle newStyle) -{ - if (style != newStyle) - { - style = newStyle; - buttonStateChanged(); - } -} - -void DrawableButton::setEdgeIndent (const int numPixelsIndent) -{ - edgeIndent = numPixelsIndent; - repaint(); - resized(); -} - -Rectangle DrawableButton::getImageBounds() const -{ - Rectangle r (getLocalBounds()); - - if (style != ImageStretched) - { - int indentX = jmin (edgeIndent, proportionOfWidth (0.3f)); - int indentY = jmin (edgeIndent, proportionOfHeight (0.3f)); - - if (style == ImageOnButtonBackground) - { - indentX = jmax (getWidth() / 4, indentX); - indentY = jmax (getHeight() / 4, indentY); - } - else if (style == ImageAboveTextLabel) - { - r = r.withTrimmedBottom (jmin (16, proportionOfHeight (0.25f))); - } - - r = r.reduced (indentX, indentY); - } - - return r.toFloat(); -} - -void DrawableButton::resized() -{ - Button::resized(); - - if (currentImage != nullptr) - { - if (style == ImageRaw) - currentImage->setOriginWithOriginalSize (Point()); - else - currentImage->setTransformToFit (getImageBounds(), - style == ImageStretched ? RectanglePlacement::stretchToFit - : RectanglePlacement::centred); - } -} - -void DrawableButton::buttonStateChanged() -{ - repaint(); - - Drawable* imageToDraw = nullptr; - float opacity = 1.0f; - - if (isEnabled()) - { - imageToDraw = getCurrentImage(); - } - else - { - imageToDraw = getToggleState() ? disabledImageOn - : disabledImage; - - if (imageToDraw == nullptr) - { - opacity = 0.4f; - imageToDraw = getNormalImage(); - } - } - - if (imageToDraw != currentImage) - { - removeChildComponent (currentImage); - currentImage = imageToDraw; - - if (currentImage != nullptr) - { - currentImage->setInterceptsMouseClicks (false, false); - addAndMakeVisible (currentImage); - resized(); - } - } - - if (currentImage != nullptr) - currentImage->setAlpha (opacity); -} - -void DrawableButton::enablementChanged() -{ - Button::enablementChanged(); - buttonStateChanged(); -} - -void DrawableButton::colourChanged() -{ - repaint(); -} - -void DrawableButton::paintButton (Graphics& g, - const bool isMouseOverButton, - const bool isButtonDown) -{ - LookAndFeel& lf = getLookAndFeel(); - - if (style == ImageOnButtonBackground) - lf.drawButtonBackground (g, *this, - findColour (getToggleState() ? TextButton::buttonOnColourId - : TextButton::buttonColourId), - isMouseOverButton, isButtonDown); - else - lf.drawDrawableButton (g, *this, isMouseOverButton, isButtonDown); -} - -//============================================================================== -Drawable* DrawableButton::getCurrentImage() const noexcept -{ - if (isDown()) return getDownImage(); - if (isOver()) return getOverImage(); - - return getNormalImage(); -} - -Drawable* DrawableButton::getNormalImage() const noexcept -{ - return (getToggleState() && normalImageOn != nullptr) ? normalImageOn - : normalImage; -} - -Drawable* DrawableButton::getOverImage() const noexcept -{ - if (getToggleState()) - { - if (overImageOn != nullptr) return overImageOn; - if (normalImageOn != nullptr) return normalImageOn; - } - - return overImage != nullptr ? overImage : normalImage; -} - -Drawable* DrawableButton::getDownImage() const noexcept -{ - if (Drawable* const d = getToggleState() ? downImageOn : downImage) - return d; - - return getOverImage(); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h deleted file mode 100755 index f07616f..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_DrawableButton.h +++ /dev/null @@ -1,188 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DRAWABLEBUTTON_H_INCLUDED -#define JUCE_DRAWABLEBUTTON_H_INCLUDED - - -//============================================================================== -/** - A button that displays a Drawable. - - Up to three Drawable objects can be given to this button, to represent the - 'normal', 'over' and 'down' states. - - @see Button -*/ -class JUCE_API DrawableButton : public Button -{ -public: - //============================================================================== - enum ButtonStyle - { - ImageFitted, /**< The button will just display the images, but will resize and centre them to fit inside it. */ - ImageRaw, /**< The button will just display the images in their normal size and position. - This leaves it up to the caller to make sure the images are the correct size and position for the button. */ - ImageAboveTextLabel, /**< Draws the button as a text label across the bottom with the image resized and scaled to fit above it. */ - ImageOnButtonBackground, /**< Draws the button as a standard rounded-rectangle button with the image on top. - Note that if you use this style, the colour IDs that control the button colour are - TextButton::buttonColourId and TextButton::buttonOnColourId. */ - ImageStretched /**< Fills the button with a stretched version of the image. */ - }; - - //============================================================================== - /** Creates a DrawableButton. - - After creating one of these, use setImages() to specify the drawables to use. - - @param buttonName the name to give the component - @param buttonStyle the layout to use - - @see ButtonStyle, setButtonStyle, setImages - */ - DrawableButton (const String& buttonName, - ButtonStyle buttonStyle); - - /** Destructor. */ - ~DrawableButton(); - - //============================================================================== - /** Sets up the images to draw for the various button states. - - The button will keep its own internal copies of these drawables. - - @param normalImage the thing to draw for the button's 'normal' state. An internal copy - will be made of the object passed-in if it is non-zero. - @param overImage the thing to draw for the button's 'over' state - if this is - zero, the button's normal image will be used when the mouse is - over it. An internal copy will be made of the object passed-in - if it is non-zero. - @param downImage the thing to draw for the button's 'down' state - if this is - zero, the 'over' image will be used instead (or the normal image - as a last resort). An internal copy will be made of the object - passed-in if it is non-zero. - @param disabledImage an image to draw when the button is disabled. If this is zero, - the normal image will be drawn with a reduced opacity instead. - An internal copy will be made of the object passed-in if it is - non-zero. - @param normalImageOn same as the normalImage, but this is used when the button's toggle - state is 'on'. If this is nullptr, the normal image is used instead - @param overImageOn same as the overImage, but this is used when the button's toggle - state is 'on'. If this is nullptr, the normalImageOn is drawn instead - @param downImageOn same as the downImage, but this is used when the button's toggle - state is 'on'. If this is nullptr, the overImageOn is drawn instead - @param disabledImageOn same as the disabledImage, but this is used when the button's toggle - state is 'on'. If this is nullptr, the normal image will be drawn instead - with a reduced opacity - */ - void setImages (const Drawable* normalImage, - const Drawable* overImage = nullptr, - const Drawable* downImage = nullptr, - const Drawable* disabledImage = nullptr, - const Drawable* normalImageOn = nullptr, - const Drawable* overImageOn = nullptr, - const Drawable* downImageOn = nullptr, - const Drawable* disabledImageOn = nullptr); - - - //============================================================================== - /** Changes the button's style. - @see ButtonStyle - */ - void setButtonStyle (ButtonStyle newStyle); - - /** Returns the current style. */ - ButtonStyle getStyle() const noexcept { return style; } - - //============================================================================== - /** Gives the button an optional amount of space around the edge of the drawable. - By default there's a gap of about 3 pixels. - */ - void setEdgeIndent (int numPixelsIndent); - - //============================================================================== - /** Returns the image that the button is currently displaying. */ - Drawable* getCurrentImage() const noexcept; - - /** Returns the image that the button will use for its normal state. */ - Drawable* getNormalImage() const noexcept; - /** Returns the image that the button will use when the mouse is over it. */ - Drawable* getOverImage() const noexcept; - /** Returns the image that the button will use when the mouse is held down on it. */ - Drawable* getDownImage() const noexcept; - - /** Can be overridden to specify a custom position for the image within the button. */ - virtual Rectangle getImageBounds() const; - - //============================================================================== - /** A set of colour IDs to use to change the colour of various aspects of the link. - - These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() - methods. - - Note that when the ImageOnButtonBackground style is used, the colour IDs that control - the button colour are TextButton::buttonColourId and TextButton::buttonOnColourId. - - @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour - */ - enum ColourIds - { - textColourId = 0x1004010, /**< The colour to use for the button's text label. */ - textColourOnId = 0x1004013, /**< The colour to use for the button's text.when the button's toggle state is "on". */ - - backgroundColourId = 0x1004011, /**< The colour used to fill the button's background (when - the button is toggled 'off'). Note that if you use the - ImageOnButtonBackground style, you should use TextButton::buttonColourId - to change the button's colour. */ - backgroundOnColourId = 0x1004012, /**< The colour used to fill the button's background (when - the button is toggled 'on'). Note that if you use the - ImageOnButtonBackground style, you should use TextButton::buttonOnColourId - to change the button's colour. */ - }; - - //============================================================================== - /** @internal */ - void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override; - /** @internal */ - void buttonStateChanged() override; - /** @internal */ - void resized() override; - /** @internal */ - void enablementChanged() override; - /** @internal */ - void colourChanged() override; - -private: - //============================================================================== - ButtonStyle style; - ScopedPointer normalImage, overImage, downImage, disabledImage, - normalImageOn, overImageOn, downImageOn, disabledImageOn; - Drawable* currentImage; - int edgeIndent; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DrawableButton) -}; - - -#endif // JUCE_DRAWABLEBUTTON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp deleted file mode 100755 index 8274f4c..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -HyperlinkButton::HyperlinkButton (const String& linkText, - const URL& linkURL) - : Button (linkText), - url (linkURL), - font (14.0f, Font::underlined), - resizeFont (true), - justification (Justification::centred) -{ - setMouseCursor (MouseCursor::PointingHandCursor); - setTooltip (linkURL.toString (false)); -} - -HyperlinkButton::HyperlinkButton () - : Button (String::empty), - font (14.0f, Font::underlined), - resizeFont (true), - justification (Justification::centred) -{ - setMouseCursor (MouseCursor::PointingHandCursor); -} - -HyperlinkButton::~HyperlinkButton() -{ -} - -//============================================================================== -void HyperlinkButton::setFont (const Font& newFont, - const bool resizeToMatchComponentHeight, - Justification justificationType) -{ - font = newFont; - resizeFont = resizeToMatchComponentHeight; - justification = justificationType; - repaint(); -} - -void HyperlinkButton::setURL (const URL& newURL) noexcept -{ - url = newURL; - setTooltip (newURL.toString (false)); -} - -Font HyperlinkButton::getFontToUse() const -{ - if (resizeFont) - return font.withHeight (getHeight() * 0.7f); - - return font; -} - -void HyperlinkButton::changeWidthToFitText() -{ - setSize (getFontToUse().getStringWidth (getButtonText()) + 6, getHeight()); -} - -void HyperlinkButton::colourChanged() -{ - repaint(); -} - -//============================================================================== -void HyperlinkButton::clicked() -{ - if (url.isWellFormed()) - url.launchInDefaultBrowser(); -} - -void HyperlinkButton::paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown) -{ - const Colour textColour (findColour (textColourId)); - - if (isEnabled()) - g.setColour ((isMouseOverButton) ? textColour.darker ((isButtonDown) ? 1.3f : 0.4f) - : textColour); - else - g.setColour (textColour.withMultipliedAlpha (0.4f)); - - g.setFont (getFontToUse()); - - g.drawText (getButtonText(), getLocalBounds().reduced (1, 0), - justification.getOnlyHorizontalFlags() | Justification::verticallyCentred, - true); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h deleted file mode 100755 index 4cd3f52..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_HyperlinkButton.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_HYPERLINKBUTTON_H_INCLUDED -#define JUCE_HYPERLINKBUTTON_H_INCLUDED - - -//============================================================================== -/** - A button showing an underlined weblink, that will launch the link - when it's clicked. - - @see Button -*/ -class JUCE_API HyperlinkButton : public Button -{ -public: - //============================================================================== - /** Creates a HyperlinkButton. - - @param linkText the text that will be displayed in the button - this is - also set as the Component's name, but the text can be - changed later with the Button::getButtonText() method - @param linkURL the URL to launch when the user clicks the button - */ - HyperlinkButton (const String& linkText, - const URL& linkURL); - - /** Creates a HyperlinkButton. */ - HyperlinkButton(); - - /** Destructor. */ - ~HyperlinkButton(); - - //============================================================================== - /** Changes the font to use for the text. - - If resizeToMatchComponentHeight is true, the font's height will be adjusted - to match the size of the component. - */ - void setFont (const Font& newFont, - bool resizeToMatchComponentHeight, - Justification justificationType = Justification::horizontallyCentred); - - //============================================================================== - /** A set of colour IDs to use to change the colour of various aspects of the link. - - These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() - methods. - - @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour - */ - enum ColourIds - { - textColourId = 0x1001f00, /**< The colour to use for the URL text. */ - }; - - //============================================================================== - /** Changes the URL that the button will trigger. */ - void setURL (const URL& newURL) noexcept; - - /** Returns the URL that the button will trigger. */ - const URL& getURL() const noexcept { return url; } - - //============================================================================== - /** Resizes the button horizontally to fit snugly around the text. - - This won't affect the button's height. - */ - void changeWidthToFitText(); - -protected: - //============================================================================== - /** @internal */ - void clicked() override; - /** @internal */ - void colourChanged() override; - /** @internal */ - void paintButton (Graphics&, bool isMouseOver, bool isButtonDown) override; - -private: - //============================================================================== - URL url; - Font font; - bool resizeFont; - Justification justification; - - Font getFontToUse() const; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HyperlinkButton) -}; - -#endif // JUCE_HYPERLINKBUTTON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp deleted file mode 100755 index 3170d05..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.cpp +++ /dev/null @@ -1,189 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ImageButton::ImageButton (const String& text_) - : Button (text_), - scaleImageToFit (true), - preserveProportions (true), - alphaThreshold (0) -{ -} - -ImageButton::~ImageButton() -{ -} - -void ImageButton::setImages (const bool resizeButtonNowToFitThisImage, - const bool rescaleImagesWhenButtonSizeChanges, - const bool preserveImageProportions, - const Image& normalImage_, - const float imageOpacityWhenNormal, - Colour overlayColourWhenNormal, - const Image& overImage_, - const float imageOpacityWhenOver, - Colour overlayColourWhenOver, - const Image& downImage_, - const float imageOpacityWhenDown, - Colour overlayColourWhenDown, - const float hitTestAlphaThreshold) -{ - normalImage = normalImage_; - overImage = overImage_; - downImage = downImage_; - - if (resizeButtonNowToFitThisImage && normalImage.isValid()) - { - imageBounds.setSize (normalImage.getWidth(), - normalImage.getHeight()); - - setSize (imageBounds.getWidth(), imageBounds.getHeight()); - } - - scaleImageToFit = rescaleImagesWhenButtonSizeChanges; - preserveProportions = preserveImageProportions; - - normalOpacity = imageOpacityWhenNormal; - normalOverlay = overlayColourWhenNormal; - overOpacity = imageOpacityWhenOver; - overOverlay = overlayColourWhenOver; - downOpacity = imageOpacityWhenDown; - downOverlay = overlayColourWhenDown; - - alphaThreshold = (uint8) jlimit (0, 0xff, roundToInt (255.0f * hitTestAlphaThreshold)); - - repaint(); -} - -Image ImageButton::getCurrentImage() const -{ - if (isDown() || getToggleState()) - return getDownImage(); - - if (isOver()) - return getOverImage(); - - return getNormalImage(); -} - -Image ImageButton::getNormalImage() const -{ - return normalImage; -} - -Image ImageButton::getOverImage() const -{ - return overImage.isValid() ? overImage - : normalImage; -} - -Image ImageButton::getDownImage() const -{ - return downImage.isValid() ? downImage - : getOverImage(); -} - -void ImageButton::paintButton (Graphics& g, - bool isMouseOverButton, - bool isButtonDown) -{ - if (! isEnabled()) - { - isMouseOverButton = false; - isButtonDown = false; - } - - Image im (getCurrentImage()); - - if (im.isValid()) - { - const int iw = im.getWidth(); - const int ih = im.getHeight(); - int w = getWidth(); - int h = getHeight(); - int x = (w - iw) / 2; - int y = (h - ih) / 2; - - if (scaleImageToFit) - { - if (preserveProportions) - { - int newW, newH; - const float imRatio = ih / (float) iw; - const float destRatio = h / (float) w; - - if (imRatio > destRatio) - { - newW = roundToInt (h / imRatio); - newH = h; - } - else - { - newW = w; - newH = roundToInt (w * imRatio); - } - - x = (w - newW) / 2; - y = (h - newH) / 2; - w = newW; - h = newH; - } - else - { - x = 0; - y = 0; - } - } - - if (! scaleImageToFit) - { - w = iw; - h = ih; - } - - imageBounds.setBounds (x, y, w, h); - - const bool useDownImage = isButtonDown || getToggleState(); - - getLookAndFeel().drawImageButton (g, &im, x, y, w, h, - useDownImage ? downOverlay - : (isMouseOverButton ? overOverlay - : normalOverlay), - useDownImage ? downOpacity - : (isMouseOverButton ? overOpacity - : normalOpacity), - *this); - } -} - -bool ImageButton::hitTest (int x, int y) -{ - if (alphaThreshold == 0) - return true; - - Image im (getCurrentImage()); - - return im.isNull() || ((! imageBounds.isEmpty()) - && alphaThreshold < im.getPixelAt (((x - imageBounds.getX()) * im.getWidth()) / imageBounds.getWidth(), - ((y - imageBounds.getY()) * im.getHeight()) / imageBounds.getHeight()).getAlpha()); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h deleted file mode 100755 index 64db59d..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ImageButton.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_IMAGEBUTTON_H_INCLUDED -#define JUCE_IMAGEBUTTON_H_INCLUDED - - -//============================================================================== -/** - As the title suggests, this is a button containing an image. - - The colour and transparency of the image can be set to vary when the - button state changes. - - @see Button, ShapeButton, TextButton -*/ -class JUCE_API ImageButton : public Button -{ -public: - //============================================================================== - /** Creates an ImageButton. - - Use setImage() to specify the image to use. The colours and opacities that - are specified here can be changed later using setImages(). - - @param name the name to give the component - */ - explicit ImageButton (const String& name = String::empty); - - /** Destructor. */ - ~ImageButton(); - - //============================================================================== - /** Sets up the images to draw in various states. - - @param resizeButtonNowToFitThisImage if true, the button will be immediately - resized to the same dimensions as the normal image - @param rescaleImagesWhenButtonSizeChanges if true, the image will be rescaled to fit the - button when the button's size changes - @param preserveImageProportions if true then any rescaling of the image to fit - the button will keep the image's x and y proportions - correct - i.e. it won't distort its shape, although - this might create gaps around the edges - @param normalImage the image to use when the button is in its normal state. - button no longer needs it. - @param imageOpacityWhenNormal the opacity to use when drawing the normal image. - @param overlayColourWhenNormal an overlay colour to use to fill the alpha channel of the - normal image - if this colour is transparent, no overlay - will be drawn. The overlay will be drawn over the top of the - image, so you can basically add a solid or semi-transparent - colour to the image to brighten or darken it - @param overImage the image to use when the mouse is over the button. If - you want to use the same image as was set in the normalImage - parameter, this value can be a null image. - @param imageOpacityWhenOver the opacity to use when drawing the image when the mouse - is over the button - @param overlayColourWhenOver an overlay colour to use to fill the alpha channel of the - image when the mouse is over - if this colour is transparent, - no overlay will be drawn - @param downImage an image to use when the button is pressed down. If set - to a null image, the 'over' image will be drawn instead (or the - normal image if there isn't an 'over' image either). - @param imageOpacityWhenDown the opacity to use when drawing the image when the button - is pressed - @param overlayColourWhenDown an overlay colour to use to fill the alpha channel of the - image when the button is pressed down - if this colour is - transparent, no overlay will be drawn - @param hitTestAlphaThreshold if set to zero, the mouse is considered to be over the button - whenever it's inside the button's bounding rectangle. If - set to values higher than 0, the mouse will only be - considered to be over the image when the value of the - image's alpha channel at that position is greater than - this level. - */ - void setImages (bool resizeButtonNowToFitThisImage, - bool rescaleImagesWhenButtonSizeChanges, - bool preserveImageProportions, - const Image& normalImage, - float imageOpacityWhenNormal, - Colour overlayColourWhenNormal, - const Image& overImage, - float imageOpacityWhenOver, - Colour overlayColourWhenOver, - const Image& downImage, - float imageOpacityWhenDown, - Colour overlayColourWhenDown, - float hitTestAlphaThreshold = 0.0f); - - /** Returns the currently set 'normal' image. */ - Image getNormalImage() const; - - /** Returns the image that's drawn when the mouse is over the button. - - If a valid 'over' image has been set, this will return it; otherwise it'll - just return the normal image. - */ - Image getOverImage() const; - - /** Returns the image that's drawn when the button is held down. - - If a valid 'down' image has been set, this will return it; otherwise it'll - return the 'over' image or normal image, depending on what's available. - */ - Image getDownImage() const; - - //============================================================================== - /** This abstract base class is implemented by LookAndFeel classes. */ - struct JUCE_API LookAndFeelMethods - { - virtual ~LookAndFeelMethods() {} - - virtual void drawImageButton (Graphics&, Image*, - int imageX, int imageY, int imageW, int imageH, - const Colour& overlayColour, float imageOpacity, ImageButton&) = 0; - }; - -protected: - //============================================================================== - /** @internal */ - bool hitTest (int x, int y) override; - /** @internal */ - void paintButton (Graphics&, bool isMouseOver, bool isButtonDown) override; - -private: - //============================================================================== - bool scaleImageToFit, preserveProportions; - uint8 alphaThreshold; - Rectangle imageBounds; - Image normalImage, overImage, downImage; - float normalOpacity, overOpacity, downOpacity; - Colour normalOverlay, overOverlay, downOverlay; - - Image getCurrentImage() const; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ImageButton) -}; - - -#endif // JUCE_IMAGEBUTTON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp deleted file mode 100755 index 28cd8de..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.cpp +++ /dev/null @@ -1,114 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ShapeButton::ShapeButton (const String& t, Colour n, Colour o, Colour d) - : Button (t), - normalColour (n), overColour (o), downColour (d), - maintainShapeProportions (false), - outlineWidth (0.0f) -{ -} - -ShapeButton::~ShapeButton() {} - -void ShapeButton::setColours (Colour newNormalColour, Colour newOverColour, Colour newDownColour) -{ - normalColour = newNormalColour; - overColour = newOverColour; - downColour = newDownColour; -} - -void ShapeButton::setOutline (Colour newOutlineColour, const float newOutlineWidth) -{ - outlineColour = newOutlineColour; - outlineWidth = newOutlineWidth; -} - -void ShapeButton::setBorderSize (BorderSize newBorder) -{ - border = newBorder; -} - -void ShapeButton::setShape (const Path& newShape, - const bool resizeNowToFitThisShape, - const bool maintainShapeProportions_, - const bool hasShadow) -{ - shape = newShape; - maintainShapeProportions = maintainShapeProportions_; - - shadow.setShadowProperties (DropShadow (Colours::black.withAlpha (0.5f), 3, Point())); - setComponentEffect (hasShadow ? &shadow : nullptr); - - if (resizeNowToFitThisShape) - { - Rectangle newBounds (shape.getBounds()); - - if (hasShadow) - newBounds = newBounds.expanded (4.0f); - - shape.applyTransform (AffineTransform::translation (-newBounds.getX(), - -newBounds.getY())); - - setSize (1 + (int) (newBounds.getWidth() + outlineWidth) + border.getLeftAndRight(), - 1 + (int) (newBounds.getHeight() + outlineWidth) + border.getTopAndBottom()); - } - - repaint(); -} - -void ShapeButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) -{ - if (! isEnabled()) - { - isMouseOverButton = false; - isButtonDown = false; - } - - Rectangle r (border.subtractedFrom (getLocalBounds()).toFloat().reduced (outlineWidth * 0.5f)); - - if (getComponentEffect() != nullptr) - r = r.reduced (2.0f); - - if (isButtonDown) - { - const float sizeReductionWhenPressed = 0.04f; - - r = r.reduced (sizeReductionWhenPressed * r.getWidth(), - sizeReductionWhenPressed * r.getHeight()); - } - - const AffineTransform trans (shape.getTransformToScaleToFit (r, maintainShapeProportions)); - - g.setColour (isButtonDown ? downColour - : isMouseOverButton ? overColour - : normalColour); - g.fillPath (shape, trans); - - if (outlineWidth > 0.0f) - { - g.setColour (outlineColour); - g.strokePath (shape, PathStrokeType (outlineWidth), trans); - } -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h deleted file mode 100755 index ddc4625..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ShapeButton.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_SHAPEBUTTON_H_INCLUDED -#define JUCE_SHAPEBUTTON_H_INCLUDED - - -//============================================================================== -/** - A button that contains a filled shape. - - @see Button, ImageButton, TextButton, ArrowButton -*/ -class JUCE_API ShapeButton : public Button -{ -public: - //============================================================================== - /** Creates a ShapeButton. - - @param name a name to give the component - see Component::setName() - @param normalColour the colour to fill the shape with when the mouse isn't over - @param overColour the colour to use when the mouse is over the shape - @param downColour the colour to use when the button is in the pressed-down state - */ - ShapeButton (const String& name, - Colour normalColour, - Colour overColour, - Colour downColour); - - /** Destructor. */ - ~ShapeButton(); - - //============================================================================== - /** Sets the shape to use. - - @param newShape the shape to use - @param resizeNowToFitThisShape if true, the button will be resized to fit the shape's bounds - @param maintainShapeProportions if true, the shape's proportions will be kept fixed when - the button is resized - @param hasDropShadow if true, the button will be given a drop-shadow effect - */ - void setShape (const Path& newShape, - bool resizeNowToFitThisShape, - bool maintainShapeProportions, - bool hasDropShadow); - - /** Set the colours to use for drawing the shape. - - @param normalColour the colour to fill the shape with when the mouse isn't over - @param overColour the colour to use when the mouse is over the shape - @param downColour the colour to use when the button is in the pressed-down state - */ - void setColours (Colour normalColour, - Colour overColour, - Colour downColour); - - /** Sets up an outline to draw around the shape. - - @param outlineColour the colour to use - @param outlineStrokeWidth the thickness of line to draw - */ - void setOutline (Colour outlineColour, float outlineStrokeWidth); - - /** This lets you specify a border to be left around the edge of the button when - drawing the shape. - */ - void setBorderSize (BorderSize border); - - /** @internal */ - void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override; - -private: - //============================================================================== - Colour normalColour, overColour, downColour, outlineColour; - DropShadowEffect shadow; - Path shape; - BorderSize border; - bool maintainShapeProportions; - float outlineWidth; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ShapeButton) -}; - - -#endif // JUCE_SHAPEBUTTON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp deleted file mode 100755 index b51ea65..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - ============================================================================== - file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -TextButton::TextButton() : Button (String()) -{ -} - -TextButton::TextButton (const String& name) : Button (name) -{ -} - -TextButton::TextButton (const String& name, const String& toolTip) : Button (name) -{ - setTooltip (toolTip); -} - -TextButton::~TextButton() -{ -} - -void TextButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) -{ - LookAndFeel& lf = getLookAndFeel(); - - lf.drawButtonBackground (g, *this, - findColour (getToggleState() ? buttonOnColourId : buttonColourId), - isMouseOverButton, isButtonDown); - - lf.drawButtonText (g, *this, isMouseOverButton, isButtonDown); -} - -void TextButton::colourChanged() -{ - repaint(); -} - -void TextButton::changeWidthToFitText() -{ - changeWidthToFitText (getHeight()); -} - -void TextButton::changeWidthToFitText (const int newHeight) -{ - setSize (getBestWidthForHeight (newHeight), newHeight); -} - -int TextButton::getBestWidthForHeight (int buttonHeight) -{ - return getLookAndFeel().getTextButtonWidthToFitText (*this, buttonHeight); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h deleted file mode 100755 index 31c477b..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_TextButton.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_TEXTBUTTON_H_INCLUDED -#define JUCE_TEXTBUTTON_H_INCLUDED - - -//============================================================================== -/** - A button that uses the standard lozenge-shaped background with a line of - text on it. - - @see Button, DrawableButton -*/ -class JUCE_API TextButton : public Button -{ -public: - //============================================================================== - /** Creates a TextButton. */ - TextButton(); - - /** Creates a TextButton. - @param buttonName the text to put in the button (the component's name is also - initially set to this string, but these can be changed later - using the setName() and setButtonText() methods) - */ - explicit TextButton (const String& buttonName); - - /** Creates a TextButton. - @param buttonName the text to put in the button (the component's name is also - initially set to this string, but these can be changed later - using the setName() and setButtonText() methods) - @param toolTip an optional string to use as a toolip - */ - TextButton (const String& buttonName, const String& toolTip); - - /** Destructor. */ - ~TextButton(); - - //============================================================================== - /** A set of colour IDs to use to change the colour of various aspects of the button. - - These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() - methods. - - @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour - */ - enum ColourIds - { - buttonColourId = 0x1000100, /**< The colour used to fill the button shape (when the button is toggled - 'off'). The look-and-feel class might re-interpret this to add - effects, etc. */ - buttonOnColourId = 0x1000101, /**< The colour used to fill the button shape (when the button is toggled - 'on'). The look-and-feel class might re-interpret this to add - effects, etc. */ - textColourOffId = 0x1000102, /**< The colour to use for the button's text when the button's toggle state is "off". */ - textColourOnId = 0x1000103 /**< The colour to use for the button's text.when the button's toggle state is "on". */ - }; - - //============================================================================== - /** Changes this button's width to fit neatly around its current text, without - changing its height. - */ - void changeWidthToFitText(); - - /** Resizes the button's width to fit neatly around its current text, and gives it - the specified height. - */ - void changeWidthToFitText (int newHeight); - - /** Returns the width that the LookAndFeel suggests would be best for this button if it - had the given height. - */ - int getBestWidthForHeight (int buttonHeight); - - //============================================================================== - /** @internal */ - void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override; - /** @internal */ - void colourChanged() override; - -private: - #if JUCE_CATCH_DEPRECATED_CODE_MISUSE - // Note that this method has been removed - instead, see LookAndFeel::getTextButtonFont() - virtual int getFont() { return 0; } - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TextButton) -}; - - -#endif // JUCE_TEXTBUTTON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp deleted file mode 100755 index edaf7ab..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ToggleButton::ToggleButton() - : Button (String::empty) -{ - setClickingTogglesState (true); -} - -ToggleButton::ToggleButton (const String& buttonText) - : Button (buttonText) -{ - setClickingTogglesState (true); -} - -ToggleButton::~ToggleButton() -{ -} - -void ToggleButton::paintButton (Graphics& g, bool isMouseOverButton, bool isButtonDown) -{ - getLookAndFeel().drawToggleButton (g, *this, isMouseOverButton, isButtonDown); -} - -void ToggleButton::changeWidthToFitText() -{ - getLookAndFeel().changeToggleButtonWidthToFitText (*this); -} - -void ToggleButton::colourChanged() -{ - repaint(); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h deleted file mode 100755 index 911bc59..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToggleButton.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_TOGGLEBUTTON_H_INCLUDED -#define JUCE_TOGGLEBUTTON_H_INCLUDED - - -//============================================================================== -/** - A button that can be toggled on/off. - - All buttons can be toggle buttons, but this lets you create one of the - standard ones which has a tick-box and a text label next to it. - - @see Button, DrawableButton, TextButton -*/ -class JUCE_API ToggleButton : public Button -{ -public: - //============================================================================== - /** Creates a ToggleButton. */ - ToggleButton(); - - /** Creates a ToggleButton. - - @param buttonText the text to put in the button (the component's name is also - initially set to this string, but these can be changed later - using the setName() and setButtonText() methods) - */ - explicit ToggleButton (const String& buttonText); - - /** Destructor. */ - ~ToggleButton(); - - //============================================================================== - /** Resizes the button to fit neatly around its current text. - The button's height won't be affected, only its width. - */ - void changeWidthToFitText(); - - //============================================================================== - /** A set of colour IDs to use to change the colour of various aspects of the button. - - These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() - methods. - - @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour - */ - enum ColourIds - { - textColourId = 0x1006501 /**< The colour to use for the button's text. */ - }; - -protected: - //============================================================================== - /** @internal */ - void paintButton (Graphics&, bool isMouseOverButton, bool isButtonDown) override; - /** @internal */ - void colourChanged() override; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToggleButton) -}; - - -#endif // JUCE_TOGGLEBUTTON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp deleted file mode 100755 index f7ef1b0..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ToolbarButton::ToolbarButton (const int iid, const String& buttonText, - Drawable* const normalIm, Drawable* const toggledOnIm) - : ToolbarItemComponent (iid, buttonText, true), - normalImage (normalIm), - toggledOnImage (toggledOnIm), - currentImage (nullptr) -{ - jassert (normalImage != nullptr); -} - -ToolbarButton::~ToolbarButton() -{ -} - -//============================================================================== -bool ToolbarButton::getToolbarItemSizes (int toolbarDepth, bool /*isToolbarVertical*/, int& preferredSize, int& minSize, int& maxSize) -{ - preferredSize = minSize = maxSize = toolbarDepth; - return true; -} - -void ToolbarButton::paintButtonArea (Graphics&, int /*width*/, int /*height*/, bool /*isMouseOver*/, bool /*isMouseDown*/) -{ -} - -void ToolbarButton::contentAreaChanged (const Rectangle&) -{ - buttonStateChanged(); -} - -void ToolbarButton::setCurrentImage (Drawable* const newImage) -{ - if (newImage != currentImage) - { - removeChildComponent (currentImage); - currentImage = newImage; - - if (currentImage != nullptr) - { - enablementChanged(); - addAndMakeVisible (currentImage); - updateDrawable(); - } - } -} - -void ToolbarButton::updateDrawable() -{ - if (currentImage != nullptr) - { - currentImage->setInterceptsMouseClicks (false, false); - currentImage->setTransformToFit (getContentArea().toFloat(), RectanglePlacement::centred); - currentImage->setAlpha (isEnabled() ? 1.0f : 0.5f); - } -} - -void ToolbarButton::resized() -{ - ToolbarItemComponent::resized(); - updateDrawable(); -} - -void ToolbarButton::enablementChanged() -{ - ToolbarItemComponent::enablementChanged(); - updateDrawable(); -} - -Drawable* ToolbarButton::getImageToUse() const -{ - if (getStyle() == Toolbar::textOnly) - return nullptr; - - if (getToggleState() && toggledOnImage != nullptr) - return toggledOnImage; - - return normalImage; -} - -void ToolbarButton::buttonStateChanged() -{ - setCurrentImage (getImageToUse()); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h b/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h deleted file mode 100755 index 1f2548f..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/buttons/juce_ToolbarButton.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_TOOLBARBUTTON_H_INCLUDED -#define JUCE_TOOLBARBUTTON_H_INCLUDED - - -//============================================================================== -/** - A type of button designed to go on a toolbar. - - This simple button can have two Drawable objects specified - one for normal - use and another one (optionally) for the button's "on" state if it's a - toggle button. - - @see Toolbar, ToolbarItemFactory, ToolbarItemComponent, Drawable, Button -*/ -class JUCE_API ToolbarButton : public ToolbarItemComponent -{ -public: - //============================================================================== - /** Creates a ToolbarButton. - - @param itemId the ID for this toolbar item type. This is passed through to the - ToolbarItemComponent constructor - @param labelText the text to display on the button (if the toolbar is using a style - that shows text labels). This is passed through to the - ToolbarItemComponent constructor - @param normalImage a drawable object that the button should use as its icon. The object - that is passed-in here will be kept by this object and will be - deleted when no longer needed or when this button is deleted. - @param toggledOnImage a drawable object that the button can use as its icon if the button - is in a toggled-on state (see the Button::getToggleState() method). If - nullptr is passed-in here, then the normal image will be used instead, - regardless of the toggle state. The object that is passed-in here will be - owned by this object and will be deleted when no longer needed or when - this button is deleted. - */ - ToolbarButton (int itemId, - const String& labelText, - Drawable* normalImage, - Drawable* toggledOnImage); - - /** Destructor. */ - ~ToolbarButton(); - - - //============================================================================== - /** @internal */ - bool getToolbarItemSizes (int toolbarDepth, bool isToolbarVertical, int& preferredSize, - int& minSize, int& maxSize) override; - /** @internal */ - void paintButtonArea (Graphics&, int width, int height, bool isMouseOver, bool isMouseDown) override; - /** @internal */ - void contentAreaChanged (const Rectangle&) override; - /** @internal */ - void buttonStateChanged() override; - /** @internal */ - void resized() override; - /** @internal */ - void enablementChanged() override; - -private: - //============================================================================== - ScopedPointer normalImage, toggledOnImage; - Drawable* currentImage; - - void updateDrawable(); - Drawable* getImageToUse() const; - void setCurrentImage (Drawable*); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToolbarButton) -}; - - -#endif // JUCE_TOOLBARBUTTON_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h deleted file mode 100755 index 9a00cbc..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandID.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_APPLICATIONCOMMANDID_H_INCLUDED -#define JUCE_APPLICATIONCOMMANDID_H_INCLUDED - - -//============================================================================== -/** A type used to hold the unique ID for an application command. - - This is a numeric type, so it can be stored as an integer. - - @see ApplicationCommandInfo, ApplicationCommandManager, - ApplicationCommandTarget, KeyPressMappingSet -*/ -typedef int CommandID; - - -//============================================================================== -/** A set of general-purpose application command IDs. - - Because these commands are likely to be used in most apps, they're defined - here to help different apps to use the same numeric values for them. - - Of course you don't have to use these, but some of them are used internally by - Juce - e.g. the quit ID is recognised as a command by the JUCEApplication class. - - @see ApplicationCommandInfo, ApplicationCommandManager, - ApplicationCommandTarget, KeyPressMappingSet -*/ -namespace StandardApplicationCommandIDs -{ - enum - { - /** This command ID should be used to send a "Quit the App" command. - - This command is recognised by the JUCEApplication class, so if it is invoked - and no other ApplicationCommandTarget handles the event first, the JUCEApplication - object will catch it and call JUCEApplicationBase::systemRequestedQuit(). - */ - quit = 0x1001, - - /** The command ID that should be used to send a "Delete" command. */ - del = 0x1002, - - /** The command ID that should be used to send a "Cut" command. */ - cut = 0x1003, - - /** The command ID that should be used to send a "Copy to clipboard" command. */ - copy = 0x1004, - - /** The command ID that should be used to send a "Paste from clipboard" command. */ - paste = 0x1005, - - /** The command ID that should be used to send a "Select all" command. */ - selectAll = 0x1006, - - /** The command ID that should be used to send a "Deselect all" command. */ - deselectAll = 0x1007, - - /** The command ID that should be used to send a "undo" command. */ - undo = 0x1008, - - /** The command ID that should be used to send a "redo" command. */ - redo = 0x1009 - }; -} - - -#endif // JUCE_APPLICATIONCOMMANDID_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp deleted file mode 100755 index 174ec80..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ApplicationCommandInfo::ApplicationCommandInfo (const CommandID cid) noexcept - : commandID (cid), flags (0) -{ -} - -void ApplicationCommandInfo::setInfo (const String& shortName_, - const String& description_, - const String& categoryName_, - const int flags_) noexcept -{ - shortName = shortName_; - description = description_; - categoryName = categoryName_; - flags = flags_; -} - -void ApplicationCommandInfo::setActive (const bool b) noexcept -{ - if (b) - flags &= ~isDisabled; - else - flags |= isDisabled; -} - -void ApplicationCommandInfo::setTicked (const bool b) noexcept -{ - if (b) - flags |= isTicked; - else - flags &= ~isTicked; -} - -void ApplicationCommandInfo::addDefaultKeypress (const int keyCode, ModifierKeys modifiers) noexcept -{ - defaultKeypresses.add (KeyPress (keyCode, modifiers, 0)); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h deleted file mode 100755 index f906f43..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.h +++ /dev/null @@ -1,189 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_APPLICATIONCOMMANDINFO_H_INCLUDED -#define JUCE_APPLICATIONCOMMANDINFO_H_INCLUDED - - -//============================================================================== -/** - Holds information describing an application command. - - This object is used to pass information about a particular command, such as its - name, description and other usage flags. - - When an ApplicationCommandTarget is asked to provide information about the commands - it can perform, this is the structure gets filled-in to describe each one. - - @see ApplicationCommandTarget, ApplicationCommandTarget::getCommandInfo(), - ApplicationCommandManager -*/ -struct JUCE_API ApplicationCommandInfo -{ - //============================================================================== - explicit ApplicationCommandInfo (CommandID commandID) noexcept; - - //============================================================================== - /** Sets a number of the structures values at once. - - The meanings of each of the parameters is described below, in the appropriate - member variable's description. - */ - void setInfo (const String& shortName, - const String& description, - const String& categoryName, - int flags) noexcept; - - /** An easy way to set or remove the isDisabled bit in the structure's flags field. - - If isActive is true, the flags member has the isDisabled bit cleared; if isActive - is false, the bit is set. - */ - void setActive (bool isActive) noexcept; - - /** An easy way to set or remove the isTicked bit in the structure's flags field. - */ - void setTicked (bool isTicked) noexcept; - - /** Handy method for adding a keypress to the defaultKeypresses array. - - This is just so you can write things like: - @code - myinfo.addDefaultKeypress ('s', ModifierKeys::commandModifier); - @endcode - instead of - @code - myinfo.defaultKeypresses.add (KeyPress ('s', ModifierKeys::commandModifier)); - @endcode - */ - void addDefaultKeypress (int keyCode, ModifierKeys modifiers) noexcept; - - //============================================================================== - /** The command's unique ID number. - */ - CommandID commandID; - - /** A short name to describe the command. - - This should be suitable for use in menus, on buttons that trigger the command, etc. - - You can use the setInfo() method to quickly set this and some of the command's - other properties. - */ - String shortName; - - /** A longer description of the command. - - This should be suitable for use in contexts such as a KeyMappingEditorComponent or - pop-up tooltip describing what the command does. - - You can use the setInfo() method to quickly set this and some of the command's - other properties. - */ - String description; - - /** A named category that the command fits into. - - You can give your commands any category you like, and these will be displayed in - contexts such as the KeyMappingEditorComponent, where the category is used to group - commands together. - - You can use the setInfo() method to quickly set this and some of the command's - other properties. - */ - String categoryName; - - /** A list of zero or more keypresses that should be used as the default keys for - this command. - - Methods such as KeyPressMappingSet::resetToDefaultMappings() will use the keypresses in - this list to initialise the default set of key-to-command mappings. - - @see addDefaultKeypress - */ - Array defaultKeypresses; - - //============================================================================== - /** Flags describing the ways in which this command should be used. - - A bitwise-OR of these values is stored in the ApplicationCommandInfo::flags - variable. - */ - enum CommandFlags - { - /** Indicates that the command can't currently be performed. - - The ApplicationCommandTarget::getCommandInfo() method must set this flag if it's - not currently permissable to perform the command. If the flag is set, then - components that trigger the command, e.g. PopupMenu, may choose to grey-out the - command or show themselves as not being enabled. - - @see ApplicationCommandInfo::setActive - */ - isDisabled = 1 << 0, - - /** Indicates that the command should have a tick next to it on a menu. - - If your command is shown on a menu and this is set, it'll show a tick next to - it. Other components such as buttons may also use this flag to indicate that it - is a value that can be toggled, and is currently in the 'on' state. - - @see ApplicationCommandInfo::setTicked - */ - isTicked = 1 << 1, - - /** If this flag is present, then when a KeyPressMappingSet invokes the command, - it will call the command twice, once on key-down and again on key-up. - - @see ApplicationCommandTarget::InvocationInfo - */ - wantsKeyUpDownCallbacks = 1 << 2, - - /** If this flag is present, then a KeyMappingEditorComponent will not display the - command in its list. - */ - hiddenFromKeyEditor = 1 << 3, - - /** If this flag is present, then a KeyMappingEditorComponent will display the - command in its list, but won't allow the assigned keypress to be changed. - */ - readOnlyInKeyEditor = 1 << 4, - - /** If this flag is present and the command is invoked from a keypress, then any - buttons or menus that are also connected to the command will not flash to - indicate that they've been triggered. - */ - dontTriggerVisualFeedback = 1 << 5 - }; - - /** A bitwise-OR of the values specified in the CommandFlags enum. - - You can use the setInfo() method to quickly set this and some of the command's - other properties. - */ - int flags; -}; - - -#endif // JUCE_APPLICATIONCOMMANDINFO_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp deleted file mode 100755 index 82ec3a2..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.cpp +++ /dev/null @@ -1,312 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -ApplicationCommandManager::ApplicationCommandManager() - : firstTarget (nullptr) -{ - keyMappings = new KeyPressMappingSet (*this); - Desktop::getInstance().addFocusChangeListener (this); -} - -ApplicationCommandManager::~ApplicationCommandManager() -{ - Desktop::getInstance().removeFocusChangeListener (this); - keyMappings = nullptr; -} - -//============================================================================== -void ApplicationCommandManager::clearCommands() -{ - commands.clear(); - keyMappings->clearAllKeyPresses(); - triggerAsyncUpdate(); -} - -void ApplicationCommandManager::registerCommand (const ApplicationCommandInfo& newCommand) -{ - // zero isn't a valid command ID! - jassert (newCommand.commandID != 0); - - // the name isn't optional! - jassert (newCommand.shortName.isNotEmpty()); - - if (ApplicationCommandInfo* command = getMutableCommandForID (newCommand.commandID)) - { - // Trying to re-register the same command ID with different parameters can often indicate a typo. - // This assertion is here because I've found it useful catching some mistakes, but it may also cause - // false alarms if you're deliberately updating some flags for a command. - jassert (newCommand.shortName == getCommandForID (newCommand.commandID)->shortName - && newCommand.categoryName == getCommandForID (newCommand.commandID)->categoryName - && newCommand.defaultKeypresses == getCommandForID (newCommand.commandID)->defaultKeypresses - && (newCommand.flags & (ApplicationCommandInfo::wantsKeyUpDownCallbacks | ApplicationCommandInfo::hiddenFromKeyEditor | ApplicationCommandInfo::readOnlyInKeyEditor)) - == (getCommandForID (newCommand.commandID)->flags & (ApplicationCommandInfo::wantsKeyUpDownCallbacks | ApplicationCommandInfo::hiddenFromKeyEditor | ApplicationCommandInfo::readOnlyInKeyEditor))); - - *command = newCommand; - } - else - { - ApplicationCommandInfo* const newInfo = new ApplicationCommandInfo (newCommand); - newInfo->flags &= ~ApplicationCommandInfo::isTicked; - commands.add (newInfo); - - keyMappings->resetToDefaultMapping (newCommand.commandID); - - triggerAsyncUpdate(); - } -} - -void ApplicationCommandManager::registerAllCommandsForTarget (ApplicationCommandTarget* target) -{ - if (target != nullptr) - { - Array commandIDs; - target->getAllCommands (commandIDs); - - for (int i = 0; i < commandIDs.size(); ++i) - { - ApplicationCommandInfo info (commandIDs.getUnchecked(i)); - target->getCommandInfo (info.commandID, info); - - registerCommand (info); - } - } -} - -void ApplicationCommandManager::removeCommand (const CommandID commandID) -{ - for (int i = commands.size(); --i >= 0;) - { - if (commands.getUnchecked (i)->commandID == commandID) - { - commands.remove (i); - triggerAsyncUpdate(); - - const Array keys (keyMappings->getKeyPressesAssignedToCommand (commandID)); - - for (int j = keys.size(); --j >= 0;) - keyMappings->removeKeyPress (keys.getReference (j)); - } - } -} - -void ApplicationCommandManager::commandStatusChanged() -{ - triggerAsyncUpdate(); -} - -//============================================================================== -ApplicationCommandInfo* ApplicationCommandManager::getMutableCommandForID (CommandID commandID) const noexcept -{ - for (int i = commands.size(); --i >= 0;) - if (commands.getUnchecked(i)->commandID == commandID) - return commands.getUnchecked(i); - - return nullptr; -} - -const ApplicationCommandInfo* ApplicationCommandManager::getCommandForID (const CommandID commandID) const noexcept -{ - return getMutableCommandForID (commandID); -} - -String ApplicationCommandManager::getNameOfCommand (const CommandID commandID) const noexcept -{ - if (const ApplicationCommandInfo* const ci = getCommandForID (commandID)) - return ci->shortName; - - return String(); -} - -String ApplicationCommandManager::getDescriptionOfCommand (const CommandID commandID) const noexcept -{ - if (const ApplicationCommandInfo* const ci = getCommandForID (commandID)) - return ci->description.isNotEmpty() ? ci->description - : ci->shortName; - - return String(); -} - -StringArray ApplicationCommandManager::getCommandCategories() const -{ - StringArray s; - - for (int i = 0; i < commands.size(); ++i) - s.addIfNotAlreadyThere (commands.getUnchecked(i)->categoryName, false); - - return s; -} - -Array ApplicationCommandManager::getCommandsInCategory (const String& categoryName) const -{ - Array results; - - for (int i = 0; i < commands.size(); ++i) - if (commands.getUnchecked(i)->categoryName == categoryName) - results.add (commands.getUnchecked(i)->commandID); - - return results; -} - -//============================================================================== -bool ApplicationCommandManager::invokeDirectly (const CommandID commandID, const bool asynchronously) -{ - ApplicationCommandTarget::InvocationInfo info (commandID); - info.invocationMethod = ApplicationCommandTarget::InvocationInfo::direct; - - return invoke (info, asynchronously); -} - -bool ApplicationCommandManager::invoke (const ApplicationCommandTarget::InvocationInfo& inf, const bool asynchronously) -{ - // This call isn't thread-safe for use from a non-UI thread without locking the message - // manager first.. - jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); - - bool ok = false; - ApplicationCommandInfo commandInfo (0); - - if (ApplicationCommandTarget* const target = getTargetForCommand (inf.commandID, commandInfo)) - { - ApplicationCommandTarget::InvocationInfo info (inf); - info.commandFlags = commandInfo.flags; - - sendListenerInvokeCallback (info); - ok = target->invoke (info, asynchronously); - commandStatusChanged(); - } - - return ok; -} - -//============================================================================== -ApplicationCommandTarget* ApplicationCommandManager::getFirstCommandTarget (const CommandID) -{ - return firstTarget != nullptr ? firstTarget - : findDefaultComponentTarget(); -} - -void ApplicationCommandManager::setFirstCommandTarget (ApplicationCommandTarget* const newTarget) noexcept -{ - firstTarget = newTarget; -} - -ApplicationCommandTarget* ApplicationCommandManager::getTargetForCommand (const CommandID commandID, - ApplicationCommandInfo& upToDateInfo) -{ - ApplicationCommandTarget* target = getFirstCommandTarget (commandID); - - if (target == nullptr) - target = JUCEApplication::getInstance(); - - if (target != nullptr) - target = target->getTargetForCommand (commandID); - - if (target != nullptr) - { - upToDateInfo.commandID = commandID; - target->getCommandInfo (commandID, upToDateInfo); - } - - return target; -} - -//============================================================================== -ApplicationCommandTarget* ApplicationCommandManager::findTargetForComponent (Component* c) -{ - ApplicationCommandTarget* target = dynamic_cast (c); - - if (target == nullptr && c != nullptr) - target = c->findParentComponentOfClass(); - - return target; -} - -ApplicationCommandTarget* ApplicationCommandManager::findDefaultComponentTarget() -{ - Component* c = Component::getCurrentlyFocusedComponent(); - - if (c == nullptr) - { - if (TopLevelWindow* const activeWindow = TopLevelWindow::getActiveTopLevelWindow()) - { - c = activeWindow->getPeer()->getLastFocusedSubcomponent(); - - if (c == nullptr) - c = activeWindow; - } - } - - if (c == nullptr && Process::isForegroundProcess()) - { - Desktop& desktop = Desktop::getInstance(); - - // getting a bit desperate now: try all desktop comps.. - for (int i = desktop.getNumComponents(); --i >= 0;) - if (ComponentPeer* const peer = desktop.getComponent(i)->getPeer()) - if (ApplicationCommandTarget* const target = findTargetForComponent (peer->getLastFocusedSubcomponent())) - return target; - } - - if (c != nullptr) - { - // if we're focused on a ResizableWindow, chances are that it's the content - // component that really should get the event. And if not, the event will - // still be passed up to the top level window anyway, so let's send it to the - // content comp. - if (ResizableWindow* const resizableWindow = dynamic_cast (c)) - if (Component* const content = resizableWindow->getContentComponent()) - c = content; - - if (ApplicationCommandTarget* const target = findTargetForComponent (c)) - return target; - } - - return JUCEApplication::getInstance(); -} - -//============================================================================== -void ApplicationCommandManager::addListener (ApplicationCommandManagerListener* const listener) -{ - listeners.add (listener); -} - -void ApplicationCommandManager::removeListener (ApplicationCommandManagerListener* const listener) -{ - listeners.remove (listener); -} - -void ApplicationCommandManager::sendListenerInvokeCallback (const ApplicationCommandTarget::InvocationInfo& info) -{ - listeners.call (&ApplicationCommandManagerListener::applicationCommandInvoked, info); -} - -void ApplicationCommandManager::handleAsyncUpdate() -{ - listeners.call (&ApplicationCommandManagerListener::applicationCommandListChanged); -} - -void ApplicationCommandManager::globalFocusChanged (Component*) -{ - commandStatusChanged(); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h deleted file mode 100755 index 5be135a..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h +++ /dev/null @@ -1,353 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_APPLICATIONCOMMANDMANAGER_H_INCLUDED -#define JUCE_APPLICATIONCOMMANDMANAGER_H_INCLUDED - - -//============================================================================== -/** - One of these objects holds a list of all the commands your app can perform, - and despatches these commands when needed. - - Application commands are a good way to trigger actions in your app, e.g. "Quit", - "Copy", "Paste", etc. Menus, buttons and keypresses can all be given commands - to invoke automatically, which means you don't have to handle the result of a menu - or button click manually. Commands are despatched to ApplicationCommandTarget objects - which can choose which events they want to handle. - - This architecture also allows for nested ApplicationCommandTargets, so that for example - you could have two different objects, one inside the other, both of which can respond to - a "delete" command. Depending on which one has focus, the command will be sent to the - appropriate place, regardless of whether it was triggered by a menu, keypress or some other - method. - - To set up your app to use commands, you'll need to do the following: - - - Create a global ApplicationCommandManager to hold the list of all possible - commands. (This will also manage a set of key-mappings for them). - - - Make some of your UI components (or other objects) inherit from ApplicationCommandTarget. - This allows the object to provide a list of commands that it can perform, and - to handle them. - - - Register each type of command using ApplicationCommandManager::registerAllCommandsForTarget(), - or ApplicationCommandManager::registerCommand(). - - - If you want key-presses to trigger your commands, use the ApplicationCommandManager::getKeyMappings() - method to access the key-mapper object, which you will need to register as a key-listener - in whatever top-level component you're using. See the KeyPressMappingSet class for more help - about setting this up. - - - Use methods such as PopupMenu::addCommandItem() or Button::setCommandToTrigger() to - cause these commands to be invoked automatically. - - - Commands can be invoked directly by your code using ApplicationCommandManager::invokeDirectly(). - - When a command is invoked, the ApplicationCommandManager will try to choose the best - ApplicationCommandTarget to receive the specified command. To do this it will use the - current keyboard focus to see which component might be interested, and will search the - component hierarchy for those that also implement the ApplicationCommandTarget interface. - If an ApplicationCommandTarget isn't interested in the command that is being invoked, then - the next one in line will be tried (see the ApplicationCommandTarget::getNextCommandTarget() - method), and so on until ApplicationCommandTarget::getNextCommandTarget() returns nullptr. - At this point if the command still hasn't been performed, it will be passed to the current - JUCEApplication object (which is itself an ApplicationCommandTarget). - - To exert some custom control over which ApplicationCommandTarget is chosen to invoke a command, - you can override the ApplicationCommandManager::getFirstCommandTarget() method and choose - the object yourself. - - @see ApplicationCommandTarget, ApplicationCommandInfo -*/ -class JUCE_API ApplicationCommandManager : private AsyncUpdater, - private FocusChangeListener -{ -public: - //============================================================================== - /** Creates an ApplicationCommandManager. - - Once created, you'll need to register all your app's commands with it, using - ApplicationCommandManager::registerAllCommandsForTarget() or - ApplicationCommandManager::registerCommand(). - */ - ApplicationCommandManager(); - - /** Destructor. - - Make sure that you don't delete this if pointers to it are still being used by - objects such as PopupMenus or Buttons. - */ - virtual ~ApplicationCommandManager(); - - //============================================================================== - /** Clears the current list of all commands. - Note that this will also clear the contents of the KeyPressMappingSet. - */ - void clearCommands(); - - /** Adds a command to the list of registered commands. - @see registerAllCommandsForTarget - */ - void registerCommand (const ApplicationCommandInfo& newCommand); - - /** Adds all the commands that this target publishes to the manager's list. - - This will use ApplicationCommandTarget::getAllCommands() and ApplicationCommandTarget::getCommandInfo() - to get details about all the commands that this target can do, and will call - registerCommand() to add each one to the manger's list. - - @see registerCommand - */ - void registerAllCommandsForTarget (ApplicationCommandTarget* target); - - /** Removes the command with a specified ID. - Note that this will also remove any key mappings that are mapped to the command. - */ - void removeCommand (CommandID commandID); - - /** This should be called to tell the manager that one of its registered commands may have changed - its active status. - - Because the command manager only finds out whether a command is active or inactive by querying - the current ApplicationCommandTarget, this is used to tell it that things may have changed. It - allows things like buttons to update their enablement, etc. - - This method will cause an asynchronous call to ApplicationCommandManagerListener::applicationCommandListChanged() - for any registered listeners. - */ - void commandStatusChanged(); - - //============================================================================== - /** Returns the number of commands that have been registered. - @see registerCommand - */ - int getNumCommands() const noexcept { return commands.size(); } - - /** Returns the details about one of the registered commands. - The index is between 0 and (getNumCommands() - 1). - */ - const ApplicationCommandInfo* getCommandForIndex (int index) const noexcept { return commands [index]; } - - /** Returns the details about a given command ID. - - This will search the list of registered commands for one with the given command - ID number, and return its associated info. If no matching command is found, this - will return 0. - */ - const ApplicationCommandInfo* getCommandForID (CommandID commandID) const noexcept; - - /** Returns the name field for a command. - - An empty string is returned if no command with this ID has been registered. - @see getDescriptionOfCommand - */ - String getNameOfCommand (CommandID commandID) const noexcept; - - /** Returns the description field for a command. - - An empty string is returned if no command with this ID has been registered. If the - command has no description, this will return its short name field instead. - - @see getNameOfCommand - */ - String getDescriptionOfCommand (CommandID commandID) const noexcept; - - /** Returns the list of categories. - - This will go through all registered commands, and return a list of all the distinct - categoryName values from their ApplicationCommandInfo structure. - - @see getCommandsInCategory() - */ - StringArray getCommandCategories() const; - - /** Returns a list of all the command UIDs in a particular category. - @see getCommandCategories() - */ - Array getCommandsInCategory (const String& categoryName) const; - - //============================================================================== - /** Returns the manager's internal set of key mappings. - - This object can be used to edit the keypresses. To actually link this object up - to invoke commands when a key is pressed, see the comments for the KeyPressMappingSet - class. - - @see KeyPressMappingSet - */ - KeyPressMappingSet* getKeyMappings() const noexcept { return keyMappings; } - - - //============================================================================== - /** Invokes the given command directly, sending it to the default target. - This is just an easy way to call invoke() without having to fill out the InvocationInfo - structure. - */ - bool invokeDirectly (CommandID commandID, bool asynchronously); - - /** Sends a command to the default target. - - This will choose a target using getFirstCommandTarget(), and send the specified command - to it using the ApplicationCommandTarget::invoke() method. This means that if the - first target can't handle the command, it will be passed on to targets further down the - chain (see ApplicationCommandTarget::invoke() for more info). - - @param invocationInfo this must be correctly filled-in, describing the context for - the invocation. - @param asynchronously if false, the command will be performed before this method returns. - If true, a message will be posted so that the command will be performed - later on the message thread, and this method will return immediately. - - @see ApplicationCommandTarget::invoke - */ - bool invoke (const ApplicationCommandTarget::InvocationInfo& invocationInfo, - bool asynchronously); - - - //============================================================================== - /** Chooses the ApplicationCommandTarget to which a command should be sent. - - Whenever the manager needs to know which target a command should be sent to, it calls - this method to determine the first one to try. - - By default, this method will return the target that was set by calling setFirstCommandTarget(). - If no target is set, it will return the result of findDefaultComponentTarget(). - - If you need to make sure all commands go via your own custom target, then you can - either use setFirstCommandTarget() to specify a single target, or override this method - if you need more complex logic to choose one. - - It may return nullptr if no targets are available. - - @see getTargetForCommand, invoke, invokeDirectly - */ - virtual ApplicationCommandTarget* getFirstCommandTarget (CommandID commandID); - - /** Sets a target to be returned by getFirstCommandTarget(). - - If this is set to nullptr, then getFirstCommandTarget() will by default return the - result of findDefaultComponentTarget(). - - If you use this to set a target, make sure you call setFirstCommandTarget(nullptr) - before deleting the target object. - */ - void setFirstCommandTarget (ApplicationCommandTarget* newTarget) noexcept; - - /** Tries to find the best target to use to perform a given command. - - This will call getFirstCommandTarget() to find the preferred target, and will - check whether that target can handle the given command. If it can't, then it'll use - ApplicationCommandTarget::getNextCommandTarget() to find the next one to try, and - so on until no more are available. - - If no targets are found that can perform the command, this method will return nullptr. - - If a target is found, then it will get the target to fill-in the upToDateInfo - structure with the latest info about that command, so that the caller can see - whether the command is disabled, ticked, etc. - */ - ApplicationCommandTarget* getTargetForCommand (CommandID commandID, - ApplicationCommandInfo& upToDateInfo); - - //============================================================================== - /** Registers a listener that will be called when various events occur. */ - void addListener (ApplicationCommandManagerListener* listener); - - /** Deregisters a previously-added listener. */ - void removeListener (ApplicationCommandManagerListener* listener); - - //============================================================================== - /** Looks for a suitable command target based on which Components have the keyboard focus. - - This is used by the default implementation of ApplicationCommandTarget::getFirstCommandTarget(), - but is exposed here in case it's useful. - - It tries to pick the best ApplicationCommandTarget by looking at focused components, top level - windows, etc., and using the findTargetForComponent() method. - */ - static ApplicationCommandTarget* findDefaultComponentTarget(); - - /** Examines this component and all its parents in turn, looking for the first one - which is an ApplicationCommandTarget. - - Returns the first ApplicationCommandTarget that it finds, or nullptr if none of them - implement that class. - */ - static ApplicationCommandTarget* findTargetForComponent (Component*); - - -private: - //============================================================================== - OwnedArray commands; - ListenerList listeners; - ScopedPointer keyMappings; - ApplicationCommandTarget* firstTarget; - - void sendListenerInvokeCallback (const ApplicationCommandTarget::InvocationInfo&); - void handleAsyncUpdate() override; - void globalFocusChanged (Component*) override; - ApplicationCommandInfo* getMutableCommandForID (CommandID) const noexcept; - - #if JUCE_CATCH_DEPRECATED_CODE_MISUSE - // This is just here to cause a compile error in old code that hasn't been changed to use the new - // version of this method. - virtual short getFirstCommandTarget() { return 0; } - #endif - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ApplicationCommandManager) -}; - - -//============================================================================== -/** - A listener that receives callbacks from an ApplicationCommandManager when - commands are invoked or the command list is changed. - - @see ApplicationCommandManager::addListener, ApplicationCommandManager::removeListener - -*/ -class JUCE_API ApplicationCommandManagerListener -{ -public: - //============================================================================== - /** Destructor. */ - virtual ~ApplicationCommandManagerListener() {} - - /** Called when an app command is about to be invoked. */ - virtual void applicationCommandInvoked (const ApplicationCommandTarget::InvocationInfo&) = 0; - - /** Called when commands are registered or deregistered from the - command manager, or when commands are made active or inactive. - - Note that if you're using this to watch for changes to whether a command is disabled, - you'll need to make sure that ApplicationCommandManager::commandStatusChanged() is called - whenever the status of your command might have changed. - */ - virtual void applicationCommandListChanged() = 0; -}; - - - -#endif // JUCE_APPLICATIONCOMMANDMANAGER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp deleted file mode 100755 index c31d187..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp +++ /dev/null @@ -1,186 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class ApplicationCommandTarget::CommandMessage : public MessageManager::MessageBase -{ -public: - CommandMessage (ApplicationCommandTarget* const target, const InvocationInfo& inf) - : owner (target), info (inf) - { - } - - void messageCallback() override - { - if (ApplicationCommandTarget* const target = owner) - target->tryToInvoke (info, false); - } - -private: - WeakReference owner; - const InvocationInfo info; - - JUCE_DECLARE_NON_COPYABLE (CommandMessage) -}; - -//============================================================================== -ApplicationCommandTarget::ApplicationCommandTarget() -{ -} - -ApplicationCommandTarget::~ApplicationCommandTarget() -{ - masterReference.clear(); -} - -//============================================================================== -bool ApplicationCommandTarget::tryToInvoke (const InvocationInfo& info, const bool async) -{ - if (isCommandActive (info.commandID)) - { - if (async) - { - (new CommandMessage (this, info))->post(); - return true; - } - - if (perform (info)) - return true; - - // Hmm.. your target claimed that it could perform this command, but failed to do so. - // If it can't do it at the moment for some reason, it should clear the 'isActive' flag - // when it returns the command's info. - jassertfalse; - } - - return false; -} - -ApplicationCommandTarget* ApplicationCommandTarget::findFirstTargetParentComponent() -{ - if (Component* const c = dynamic_cast (this)) - return c->findParentComponentOfClass(); - - return nullptr; -} - -ApplicationCommandTarget* ApplicationCommandTarget::getTargetForCommand (const CommandID commandID) -{ - ApplicationCommandTarget* target = this; - int depth = 0; - - while (target != nullptr) - { - Array commandIDs; - target->getAllCommands (commandIDs); - - if (commandIDs.contains (commandID)) - return target; - - target = target->getNextCommandTarget(); - - ++depth; - jassert (depth < 100); // could be a recursive command chain?? - jassert (target != this); // definitely a recursive command chain! - - if (depth > 100 || target == this) - break; - } - - if (target == nullptr) - { - target = JUCEApplication::getInstance(); - - if (target != nullptr) - { - Array commandIDs; - target->getAllCommands (commandIDs); - - if (commandIDs.contains (commandID)) - return target; - } - } - - return nullptr; -} - -bool ApplicationCommandTarget::isCommandActive (const CommandID commandID) -{ - ApplicationCommandInfo info (commandID); - info.flags = ApplicationCommandInfo::isDisabled; - - getCommandInfo (commandID, info); - - return (info.flags & ApplicationCommandInfo::isDisabled) == 0; -} - -//============================================================================== -bool ApplicationCommandTarget::invoke (const InvocationInfo& info, const bool async) -{ - ApplicationCommandTarget* target = this; - int depth = 0; - - while (target != nullptr) - { - if (target->tryToInvoke (info, async)) - return true; - - target = target->getNextCommandTarget(); - - ++depth; - jassert (depth < 100); // could be a recursive command chain?? - jassert (target != this); // definitely a recursive command chain! - - if (depth > 100 || target == this) - break; - } - - if (target == nullptr) - { - target = JUCEApplication::getInstance(); - - if (target != nullptr) - return target->tryToInvoke (info, async); - } - - return false; -} - -bool ApplicationCommandTarget::invokeDirectly (const CommandID commandID, const bool asynchronously) -{ - ApplicationCommandTarget::InvocationInfo info (commandID); - info.invocationMethod = ApplicationCommandTarget::InvocationInfo::direct; - - return invoke (info, asynchronously); -} - -//============================================================================== -ApplicationCommandTarget::InvocationInfo::InvocationInfo (const CommandID command) - : commandID (command), - commandFlags (0), - invocationMethod (direct), - originatingComponent (nullptr), - isKeyDown (false), - millisecsSinceKeyPressed (0) -{ -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h deleted file mode 100755 index c14faa8..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h +++ /dev/null @@ -1,245 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_APPLICATIONCOMMANDTARGET_H_INCLUDED -#define JUCE_APPLICATIONCOMMANDTARGET_H_INCLUDED - - -//============================================================================== -/** - A command target publishes a list of command IDs that it can perform. - - An ApplicationCommandManager despatches commands to targets, which must be - able to provide information about what commands they can handle. - - To create a target, you'll need to inherit from this class, implementing all of - its pure virtual methods. - - For info about how a target is chosen to receive a command, see - ApplicationCommandManager::getFirstCommandTarget(). - - @see ApplicationCommandManager, ApplicationCommandInfo -*/ -class JUCE_API ApplicationCommandTarget -{ -public: - //============================================================================== - /** Creates a command target. */ - ApplicationCommandTarget(); - - /** Destructor. */ - virtual ~ApplicationCommandTarget(); - - //============================================================================== - /** - Contains contextual details about the invocation of a command. - */ - struct JUCE_API InvocationInfo - { - //============================================================================== - InvocationInfo (const CommandID commandID); - - //============================================================================== - /** The UID of the command that should be performed. */ - CommandID commandID; - - /** The command's flags. - See ApplicationCommandInfo for a description of these flag values. - */ - int commandFlags; - - //============================================================================== - /** The types of context in which the command might be called. */ - enum InvocationMethod - { - direct = 0, /**< The command is being invoked directly by a piece of code. */ - fromKeyPress, /**< The command is being invoked by a key-press. */ - fromMenu, /**< The command is being invoked by a menu selection. */ - fromButton /**< The command is being invoked by a button click. */ - }; - - /** The type of event that triggered this command. */ - InvocationMethod invocationMethod; - - //============================================================================== - /** If triggered by a keypress or menu, this will be the component that had the - keyboard focus at the time. - - If triggered by a button, it may be set to that component, or it may be null. - */ - Component* originatingComponent; - - //============================================================================== - /** The keypress that was used to invoke it. - - Note that this will be an invalid keypress if the command was invoked - by some other means than a keyboard shortcut. - */ - KeyPress keyPress; - - /** True if the callback is being invoked when the key is pressed, - false if the key is being released. - - @see KeyPressMappingSet::addCommand() - */ - bool isKeyDown; - - /** If the key is being released, this indicates how long it had been held - down for. - - (Only relevant if isKeyDown is false.) - */ - int millisecsSinceKeyPressed; - }; - - //============================================================================== - /** This must return the next target to try after this one. - - When a command is being sent, and the first target can't handle - that command, this method is used to determine the next target that should - be tried. - - It may return nullptr if it doesn't know of another target. - - If your target is a Component, you would usually use the findFirstTargetParentComponent() - method to return a parent component that might want to handle it. - - @see invoke - */ - virtual ApplicationCommandTarget* getNextCommandTarget() = 0; - - /** This must return a complete list of commands that this target can handle. - - Your target should add all the command IDs that it handles to the array that is - passed-in. - */ - virtual void getAllCommands (Array& commands) = 0; - - /** This must provide details about one of the commands that this target can perform. - - This will be called with one of the command IDs that the target provided in its - getAllCommands() methods. - - It should fill-in all appropriate fields of the ApplicationCommandInfo structure with - suitable information about the command. (The commandID field will already have been filled-in - by the caller). - - The easiest way to set the info is using the ApplicationCommandInfo::setInfo() method to - set all the fields at once. - - If the command is currently inactive for some reason, this method must use - ApplicationCommandInfo::setActive() to make that clear, (or it should set the isDisabled - bit of the ApplicationCommandInfo::flags field). - - Any default key-presses for the command should be appended to the - ApplicationCommandInfo::defaultKeypresses field. - - Note that if you change something that affects the status of the commands - that would be returned by this method (e.g. something that makes some commands - active or inactive), you should call ApplicationCommandManager::commandStatusChanged() - to cause the manager to refresh its status. - */ - virtual void getCommandInfo (CommandID commandID, ApplicationCommandInfo& result) = 0; - - /** This must actually perform the specified command. - - If this target is able to perform the command specified by the commandID field of the - InvocationInfo structure, then it should do so, and must return true. - - If it can't handle this command, it should return false, which tells the caller to pass - the command on to the next target in line. - - @see invoke, ApplicationCommandManager::invoke - */ - virtual bool perform (const InvocationInfo& info) = 0; - - //============================================================================== - /** Makes this target invoke a command. - - Your code can call this method to invoke a command on this target, but normally - you'd call it indirectly via ApplicationCommandManager::invoke() or - ApplicationCommandManager::invokeDirectly(). - - If this target can perform the given command, it will call its perform() method to - do so. If not, then getNextCommandTarget() will be used to determine the next target - to try, and the command will be passed along to it. - - @param invocationInfo this must be correctly filled-in, describing the context for - the invocation. - @param asynchronously if false, the command will be performed before this method returns. - If true, a message will be posted so that the command will be performed - later on the message thread, and this method will return immediately. - @see perform, ApplicationCommandManager::invoke - */ - bool invoke (const InvocationInfo& invocationInfo, - const bool asynchronously); - - /** Invokes a given command directly on this target. - - This is just an easy way to call invoke() without having to fill out the InvocationInfo - structure. - */ - bool invokeDirectly (const CommandID commandID, - const bool asynchronously); - - //============================================================================== - /** Searches this target and all subsequent ones for the first one that can handle - the specified command. - - This will use getNextCommandTarget() to determine the chain of targets to try - after this one. - */ - ApplicationCommandTarget* getTargetForCommand (const CommandID commandID); - - /** Checks whether this command can currently be performed by this target. - - This will return true only if a call to getCommandInfo() doesn't set the - isDisabled flag to indicate that the command is inactive. - */ - bool isCommandActive (const CommandID commandID); - - /** If this object is a Component, this method will seach upwards in its current - UI hierarchy for the next parent component that implements the - ApplicationCommandTarget class. - - If your target is a Component, this is a very handy method to use in your - getNextCommandTarget() implementation. - */ - ApplicationCommandTarget* findFirstTargetParentComponent(); - -private: - //============================================================================== - WeakReference::Master masterReference; - friend class WeakReference; - - class CommandMessage; - friend class CommandMessage; - - bool tryToInvoke (const InvocationInfo&, bool async); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ApplicationCommandTarget) -}; - - -#endif // JUCE_APPLICATIONCOMMANDTARGET_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp deleted file mode 100755 index bcfac4e..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.cpp +++ /dev/null @@ -1,412 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -KeyPressMappingSet::KeyPressMappingSet (ApplicationCommandManager& cm) - : commandManager (cm) -{ - Desktop::getInstance().addFocusChangeListener (this); -} - -KeyPressMappingSet::KeyPressMappingSet (const KeyPressMappingSet& other) - : KeyListener(), ChangeBroadcaster(), FocusChangeListener(), commandManager (other.commandManager) -{ - Desktop::getInstance().addFocusChangeListener (this); -} - -KeyPressMappingSet::~KeyPressMappingSet() -{ - Desktop::getInstance().removeFocusChangeListener (this); -} - -//============================================================================== -Array KeyPressMappingSet::getKeyPressesAssignedToCommand (const CommandID commandID) const -{ - for (int i = 0; i < mappings.size(); ++i) - if (mappings.getUnchecked(i)->commandID == commandID) - return mappings.getUnchecked (i)->keypresses; - - return Array(); -} - -void KeyPressMappingSet::addKeyPress (const CommandID commandID, const KeyPress& newKeyPress, int insertIndex) -{ - // If you specify an upper-case letter but no shift key, how is the user supposed to press it!? - // Stick to lower-case letters when defining a keypress, to avoid ambiguity. - jassert (! (CharacterFunctions::isUpperCase (newKeyPress.getTextCharacter()) - && ! newKeyPress.getModifiers().isShiftDown())); - - if (findCommandForKeyPress (newKeyPress) != commandID) - { - if (newKeyPress.isValid()) - { - for (int i = mappings.size(); --i >= 0;) - { - if (mappings.getUnchecked(i)->commandID == commandID) - { - mappings.getUnchecked(i)->keypresses.insert (insertIndex, newKeyPress); - - sendChangeMessage(); - return; - } - } - - if (const ApplicationCommandInfo* const ci = commandManager.getCommandForID (commandID)) - { - CommandMapping* const cm = new CommandMapping(); - cm->commandID = commandID; - cm->keypresses.add (newKeyPress); - cm->wantsKeyUpDownCallbacks = (ci->flags & ApplicationCommandInfo::wantsKeyUpDownCallbacks) != 0; - - mappings.add (cm); - sendChangeMessage(); - } - else - { - // If you hit this, you're trying to attach a keypress to a command ID that - // doesn't exist, so the key is not being attached. - jassertfalse; - } - } - } -} - -static void addKeyPresses (KeyPressMappingSet& set, const ApplicationCommandInfo* const ci) -{ - for (int j = 0; j < ci->defaultKeypresses.size(); ++j) - set.addKeyPress (ci->commandID, ci->defaultKeypresses.getReference (j)); -} - -void KeyPressMappingSet::resetToDefaultMappings() -{ - mappings.clear(); - - for (int i = 0; i < commandManager.getNumCommands(); ++i) - addKeyPresses (*this, commandManager.getCommandForIndex (i)); - - sendChangeMessage(); -} - -void KeyPressMappingSet::resetToDefaultMapping (const CommandID commandID) -{ - clearAllKeyPresses (commandID); - - if (const ApplicationCommandInfo* const ci = commandManager.getCommandForID (commandID)) - addKeyPresses (*this, ci); -} - -void KeyPressMappingSet::clearAllKeyPresses() -{ - if (mappings.size() > 0) - { - sendChangeMessage(); - mappings.clear(); - } -} - -void KeyPressMappingSet::clearAllKeyPresses (const CommandID commandID) -{ - for (int i = mappings.size(); --i >= 0;) - { - if (mappings.getUnchecked(i)->commandID == commandID) - { - mappings.remove (i); - sendChangeMessage(); - } - } -} - -void KeyPressMappingSet::removeKeyPress (const KeyPress& keypress) -{ - if (keypress.isValid()) - { - for (int i = mappings.size(); --i >= 0;) - { - CommandMapping& cm = *mappings.getUnchecked(i); - - for (int j = cm.keypresses.size(); --j >= 0;) - { - if (keypress == cm.keypresses [j]) - { - cm.keypresses.remove (j); - sendChangeMessage(); - } - } - } - } -} - -void KeyPressMappingSet::removeKeyPress (const CommandID commandID, const int keyPressIndex) -{ - for (int i = mappings.size(); --i >= 0;) - { - if (mappings.getUnchecked(i)->commandID == commandID) - { - mappings.getUnchecked(i)->keypresses.remove (keyPressIndex); - sendChangeMessage(); - break; - } - } -} - -//============================================================================== -CommandID KeyPressMappingSet::findCommandForKeyPress (const KeyPress& keyPress) const noexcept -{ - for (int i = 0; i < mappings.size(); ++i) - if (mappings.getUnchecked(i)->keypresses.contains (keyPress)) - return mappings.getUnchecked(i)->commandID; - - return 0; -} - -bool KeyPressMappingSet::containsMapping (const CommandID commandID, const KeyPress& keyPress) const noexcept -{ - for (int i = mappings.size(); --i >= 0;) - if (mappings.getUnchecked(i)->commandID == commandID) - return mappings.getUnchecked(i)->keypresses.contains (keyPress); - - return false; -} - -void KeyPressMappingSet::invokeCommand (const CommandID commandID, - const KeyPress& key, - const bool isKeyDown, - const int millisecsSinceKeyPressed, - Component* const originatingComponent) const -{ - ApplicationCommandTarget::InvocationInfo info (commandID); - - info.invocationMethod = ApplicationCommandTarget::InvocationInfo::fromKeyPress; - info.isKeyDown = isKeyDown; - info.keyPress = key; - info.millisecsSinceKeyPressed = millisecsSinceKeyPressed; - info.originatingComponent = originatingComponent; - - commandManager.invoke (info, false); -} - -//============================================================================== -bool KeyPressMappingSet::restoreFromXml (const XmlElement& xmlVersion) -{ - if (xmlVersion.hasTagName ("KEYMAPPINGS")) - { - if (xmlVersion.getBoolAttribute ("basedOnDefaults", true)) - { - // if the XML was created as a set of differences from the default mappings, - // (i.e. by calling createXml (true)), then we need to first restore the defaults. - resetToDefaultMappings(); - } - else - { - // if the XML was created calling createXml (false), then we need to clear all - // the keys and treat the xml as describing the entire set of mappings. - clearAllKeyPresses(); - } - - forEachXmlChildElement (xmlVersion, map) - { - const CommandID commandId = map->getStringAttribute ("commandId").getHexValue32(); - - if (commandId != 0) - { - const KeyPress key (KeyPress::createFromDescription (map->getStringAttribute ("key"))); - - if (map->hasTagName ("MAPPING")) - { - addKeyPress (commandId, key); - } - else if (map->hasTagName ("UNMAPPING")) - { - for (int i = mappings.size(); --i >= 0;) - if (mappings.getUnchecked(i)->commandID == commandId) - mappings.getUnchecked(i)->keypresses.removeAllInstancesOf (key); - } - } - } - - return true; - } - - return false; -} - -XmlElement* KeyPressMappingSet::createXml (const bool saveDifferencesFromDefaultSet) const -{ - ScopedPointer defaultSet; - - if (saveDifferencesFromDefaultSet) - { - defaultSet = new KeyPressMappingSet (commandManager); - defaultSet->resetToDefaultMappings(); - } - - XmlElement* const doc = new XmlElement ("KEYMAPPINGS"); - - doc->setAttribute ("basedOnDefaults", saveDifferencesFromDefaultSet); - - for (int i = 0; i < mappings.size(); ++i) - { - const CommandMapping& cm = *mappings.getUnchecked(i); - - for (int j = 0; j < cm.keypresses.size(); ++j) - { - if (defaultSet == nullptr - || ! defaultSet->containsMapping (cm.commandID, cm.keypresses.getReference (j))) - { - XmlElement* const map = doc->createNewChildElement ("MAPPING"); - - map->setAttribute ("commandId", String::toHexString ((int) cm.commandID)); - map->setAttribute ("description", commandManager.getDescriptionOfCommand (cm.commandID)); - map->setAttribute ("key", cm.keypresses.getReference (j).getTextDescription()); - } - } - } - - if (defaultSet != nullptr) - { - for (int i = 0; i < defaultSet->mappings.size(); ++i) - { - const CommandMapping& cm = *defaultSet->mappings.getUnchecked(i); - - for (int j = 0; j < cm.keypresses.size(); ++j) - { - if (! containsMapping (cm.commandID, cm.keypresses.getReference (j))) - { - XmlElement* const map = doc->createNewChildElement ("UNMAPPING"); - - map->setAttribute ("commandId", String::toHexString ((int) cm.commandID)); - map->setAttribute ("description", commandManager.getDescriptionOfCommand (cm.commandID)); - map->setAttribute ("key", cm.keypresses.getReference (j).getTextDescription()); - } - } - } - } - - return doc; -} - -//============================================================================== -bool KeyPressMappingSet::keyPressed (const KeyPress& key, Component* const originatingComponent) -{ - bool commandWasDisabled = false; - - for (int i = 0; i < mappings.size(); ++i) - { - CommandMapping& cm = *mappings.getUnchecked(i); - - if (cm.keypresses.contains (key)) - { - if (const ApplicationCommandInfo* const ci = commandManager.getCommandForID (cm.commandID)) - { - if ((ci->flags & ApplicationCommandInfo::wantsKeyUpDownCallbacks) == 0) - { - ApplicationCommandInfo info (0); - - if (commandManager.getTargetForCommand (cm.commandID, info) != nullptr) - { - if ((info.flags & ApplicationCommandInfo::isDisabled) == 0) - { - invokeCommand (cm.commandID, key, true, 0, originatingComponent); - return true; - } - - commandWasDisabled = true; - } - } - } - } - } - - if (originatingComponent != nullptr && commandWasDisabled) - originatingComponent->getLookAndFeel().playAlertSound(); - - return false; -} - -bool KeyPressMappingSet::keyStateChanged (const bool /*isKeyDown*/, Component* originatingComponent) -{ - bool used = false; - const uint32 now = Time::getMillisecondCounter(); - - for (int i = mappings.size(); --i >= 0;) - { - CommandMapping& cm = *mappings.getUnchecked(i); - - if (cm.wantsKeyUpDownCallbacks) - { - for (int j = cm.keypresses.size(); --j >= 0;) - { - const KeyPress key (cm.keypresses.getReference (j)); - const bool isDown = key.isCurrentlyDown(); - - int keyPressEntryIndex = 0; - bool wasDown = false; - - for (int k = keysDown.size(); --k >= 0;) - { - if (key == keysDown.getUnchecked(k)->key) - { - keyPressEntryIndex = k; - wasDown = true; - used = true; - break; - } - } - - if (isDown != wasDown) - { - int millisecs = 0; - - if (isDown) - { - KeyPressTime* const k = new KeyPressTime(); - k->key = key; - k->timeWhenPressed = now; - - keysDown.add (k); - } - else - { - const uint32 pressTime = keysDown.getUnchecked (keyPressEntryIndex)->timeWhenPressed; - - if (now > pressTime) - millisecs = (int) (now - pressTime); - - keysDown.remove (keyPressEntryIndex); - } - - invokeCommand (cm.commandID, key, isDown, millisecs, originatingComponent); - used = true; - } - } - } - } - - return used; -} - -void KeyPressMappingSet::globalFocusChanged (Component* focusedComponent) -{ - if (focusedComponent != nullptr) - focusedComponent->keyStateChanged (false); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h b/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h deleted file mode 100755 index d3351ac..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/commands/juce_KeyPressMappingSet.h +++ /dev/null @@ -1,245 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_KEYPRESSMAPPINGSET_H_INCLUDED -#define JUCE_KEYPRESSMAPPINGSET_H_INCLUDED - - -//============================================================================== -/** - Manages and edits a list of keypresses, which it uses to invoke the appropriate - command in an ApplicationCommandManager. - - Normally, you won't actually create a KeyPressMappingSet directly, because - each ApplicationCommandManager contains its own KeyPressMappingSet, so typically - you'd create yourself an ApplicationCommandManager, and call its - ApplicationCommandManager::getKeyMappings() method to get a pointer to its - KeyPressMappingSet. - - For one of these to actually use keypresses, you'll need to add it as a KeyListener - to the top-level component for which you want to handle keystrokes. So for example: - - @code - class MyMainWindow : public Component - { - ApplicationCommandManager* myCommandManager; - - public: - MyMainWindow() - { - myCommandManager = new ApplicationCommandManager(); - - // first, make sure the command manager has registered all the commands that its - // targets can perform.. - myCommandManager->registerAllCommandsForTarget (myCommandTarget1); - myCommandManager->registerAllCommandsForTarget (myCommandTarget2); - - // this will use the command manager to initialise the KeyPressMappingSet with - // the default keypresses that were specified when the targets added their commands - // to the manager. - myCommandManager->getKeyMappings()->resetToDefaultMappings(); - - // having set up the default key-mappings, you might now want to load the last set - // of mappings that the user configured. - myCommandManager->getKeyMappings()->restoreFromXml (lastSavedKeyMappingsXML); - - // Now tell our top-level window to send any keypresses that arrive to the - // KeyPressMappingSet, which will use them to invoke the appropriate commands. - addKeyListener (myCommandManager->getKeyMappings()); - } - - ... - } - @endcode - - KeyPressMappingSet derives from ChangeBroadcaster so that interested parties can - register to be told when a command or mapping is added, removed, etc. - - There's also a UI component called KeyMappingEditorComponent that can be used - to easily edit the key mappings. - - @see Component::addKeyListener(), KeyMappingEditorComponent, ApplicationCommandManager -*/ -class JUCE_API KeyPressMappingSet : public KeyListener, - public ChangeBroadcaster, - private FocusChangeListener -{ -public: - //============================================================================== - /** Creates a KeyPressMappingSet for a given command manager. - - Normally, you won't actually create a KeyPressMappingSet directly, because - each ApplicationCommandManager contains its own KeyPressMappingSet, so the - best thing to do is to create your ApplicationCommandManager, and use the - ApplicationCommandManager::getKeyMappings() method to access its mappings. - - When a suitable keypress happens, the manager's invoke() method will be - used to invoke the appropriate command. - - @see ApplicationCommandManager - */ - explicit KeyPressMappingSet (ApplicationCommandManager&); - - /** Creates an copy of a KeyPressMappingSet. */ - KeyPressMappingSet (const KeyPressMappingSet&); - - /** Destructor. */ - ~KeyPressMappingSet(); - - //============================================================================== - ApplicationCommandManager& getCommandManager() const noexcept { return commandManager; } - - //============================================================================== - /** Returns a list of keypresses that are assigned to a particular command. - - @param commandID the command's ID - */ - Array getKeyPressesAssignedToCommand (CommandID commandID) const; - - /** Assigns a keypress to a command. - - If the keypress is already assigned to a different command, it will first be - removed from that command, to avoid it triggering multiple functions. - - @param commandID the ID of the command that you want to add a keypress to. If - this is 0, the keypress will be removed from anything that it - was previously assigned to, but not re-assigned - @param newKeyPress the new key-press - @param insertIndex if this is less than zero, the key will be appended to the - end of the list of keypresses; otherwise the new keypress will - be inserted into the existing list at this index - */ - void addKeyPress (CommandID commandID, - const KeyPress& newKeyPress, - int insertIndex = -1); - - /** Reset all mappings to the defaults, as dictated by the ApplicationCommandManager. - @see resetToDefaultMapping - */ - void resetToDefaultMappings(); - - /** Resets all key-mappings to the defaults for a particular command. - @see resetToDefaultMappings - */ - void resetToDefaultMapping (CommandID commandID); - - /** Removes all keypresses that are assigned to any commands. */ - void clearAllKeyPresses(); - - /** Removes all keypresses that are assigned to a particular command. */ - void clearAllKeyPresses (CommandID commandID); - - /** Removes one of the keypresses that are assigned to a command. - See the getKeyPressesAssignedToCommand() for the list of keypresses to - which the keyPressIndex refers. - */ - void removeKeyPress (CommandID commandID, int keyPressIndex); - - /** Removes a keypress from any command that it may be assigned to. */ - void removeKeyPress (const KeyPress& keypress); - - /** Returns true if the given command is linked to this key. */ - bool containsMapping (CommandID commandID, const KeyPress& keyPress) const noexcept; - - //============================================================================== - /** Looks for a command that corresponds to a keypress. - @returns the UID of the command or 0 if none was found - */ - CommandID findCommandForKeyPress (const KeyPress& keyPress) const noexcept; - - //============================================================================== - /** Tries to recreate the mappings from a previously stored state. - - The XML passed in must have been created by the createXml() method. - - If the stored state makes any reference to commands that aren't - currently available, these will be ignored. - - If the set of mappings being loaded was a set of differences (using createXml (true)), - then this will call resetToDefaultMappings() and then merge the saved mappings - on top. If the saved set was created with createXml (false), then this method - will first clear all existing mappings and load the saved ones as a complete set. - - @returns true if it manages to load the XML correctly - @see createXml - */ - bool restoreFromXml (const XmlElement& xmlVersion); - - /** Creates an XML representation of the current mappings. - - This will produce a lump of XML that can be later reloaded using - restoreFromXml() to recreate the current mapping state. - - The object that is returned must be deleted by the caller. - - @param saveDifferencesFromDefaultSet if this is false, then all keypresses - will be saved into the XML. If it's true, then the XML will - only store the differences between the current mappings and - the default mappings you'd get from calling resetToDefaultMappings(). - The advantage of saving a set of differences from the default is that - if you change the default mappings (in a new version of your app, for - example), then these will be merged into a user's saved preferences. - - @see restoreFromXml - */ - XmlElement* createXml (bool saveDifferencesFromDefaultSet) const; - - //============================================================================== - /** @internal */ - bool keyPressed (const KeyPress&, Component*) override; - /** @internal */ - bool keyStateChanged (bool isKeyDown, Component*) override; - /** @internal */ - void globalFocusChanged (Component*) override; - -private: - //============================================================================== - ApplicationCommandManager& commandManager; - - struct CommandMapping - { - CommandID commandID; - Array keypresses; - bool wantsKeyUpDownCallbacks; - }; - - OwnedArray mappings; - - struct KeyPressTime - { - KeyPress key; - uint32 timeWhenPressed; - }; - - OwnedArray keysDown; - - void invokeCommand (const CommandID, const KeyPress&, const bool isKeyDown, - const int millisecsSinceKeyPressed, Component* originator) const; - - KeyPressMappingSet& operator= (const KeyPressMappingSet&); - JUCE_LEAK_DETECTOR (KeyPressMappingSet) -}; - - -#endif // JUCE_KEYPRESSMAPPINGSET_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h b/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h deleted file mode 100755 index 3f273cb..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_CachedComponentImage.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_CACHEDCOMPONENTIMAGE_H_INCLUDED -#define JUCE_CACHEDCOMPONENTIMAGE_H_INCLUDED - - -//============================================================================== -/** - Base class used internally for structures that can store cached images of - component state. - - Most people are unlikely to ever need to know about this class - it's really - only for power-users! - - @see Component::setCachedComponentImage -*/ -class JUCE_API CachedComponentImage -{ -public: - CachedComponentImage() noexcept {} - virtual ~CachedComponentImage() {} - - //============================================================================== - /** Called as part of the parent component's paint method, this must draw - the given component into the target graphics context, using the cached - version where possible. - */ - virtual void paint (Graphics&) = 0; - - /** Invalidates all cached image data. - @returns true if the peer should also be repainted, or false if this object - handles all repaint work internally. - */ - virtual bool invalidateAll() = 0; - - /** Invalidates a section of the cached image data. - @returns true if the peer should also be repainted, or false if this object - handles all repaint work internally. - */ - virtual bool invalidate (const Rectangle& area) = 0; - - /** Called to indicate that the component is no longer active, so - any cached data should be released if possible. - */ - virtual void releaseResources() = 0; -}; - -#endif // JUCE_CACHEDCOMPONENTIMAGE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp deleted file mode 100755 index d1a9318..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.cpp +++ /dev/null @@ -1,3026 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -Component* Component::currentlyFocusedComponent = nullptr; - - -//============================================================================== -class Component::MouseListenerList -{ -public: - MouseListenerList() noexcept - : numDeepMouseListeners (0) - { - } - - void addListener (MouseListener* const newListener, const bool wantsEventsForAllNestedChildComponents) - { - if (! listeners.contains (newListener)) - { - if (wantsEventsForAllNestedChildComponents) - { - listeners.insert (0, newListener); - ++numDeepMouseListeners; - } - else - { - listeners.add (newListener); - } - } - } - - void removeListener (MouseListener* const listenerToRemove) - { - const int index = listeners.indexOf (listenerToRemove); - - if (index >= 0) - { - if (index < numDeepMouseListeners) - --numDeepMouseListeners; - - listeners.remove (index); - } - } - - static void sendMouseEvent (Component& comp, Component::BailOutChecker& checker, - void (MouseListener::*eventMethod) (const MouseEvent&), const MouseEvent& e) - { - if (checker.shouldBailOut()) - return; - - if (MouseListenerList* const list = comp.mouseListeners) - { - for (int i = list->listeners.size(); --i >= 0;) - { - (list->listeners.getUnchecked(i)->*eventMethod) (e); - - if (checker.shouldBailOut()) - return; - - i = jmin (i, list->listeners.size()); - } - } - - for (Component* p = comp.parentComponent; p != nullptr; p = p->parentComponent) - { - MouseListenerList* const list = p->mouseListeners; - - if (list != nullptr && list->numDeepMouseListeners > 0) - { - BailOutChecker2 checker2 (checker, p); - - for (int i = list->numDeepMouseListeners; --i >= 0;) - { - (list->listeners.getUnchecked(i)->*eventMethod) (e); - - if (checker2.shouldBailOut()) - return; - - i = jmin (i, list->numDeepMouseListeners); - } - } - } - } - - static void sendWheelEvent (Component& comp, Component::BailOutChecker& checker, - const MouseEvent& e, const MouseWheelDetails& wheel) - { - if (MouseListenerList* const list = comp.mouseListeners) - { - for (int i = list->listeners.size(); --i >= 0;) - { - list->listeners.getUnchecked(i)->mouseWheelMove (e, wheel); - - if (checker.shouldBailOut()) - return; - - i = jmin (i, list->listeners.size()); - } - } - - for (Component* p = comp.parentComponent; p != nullptr; p = p->parentComponent) - { - MouseListenerList* const list = p->mouseListeners; - - if (list != nullptr && list->numDeepMouseListeners > 0) - { - BailOutChecker2 checker2 (checker, p); - - for (int i = list->numDeepMouseListeners; --i >= 0;) - { - list->listeners.getUnchecked(i)->mouseWheelMove (e, wheel); - - if (checker2.shouldBailOut()) - return; - - i = jmin (i, list->numDeepMouseListeners); - } - } - } - } - -private: - Array listeners; - int numDeepMouseListeners; - - class BailOutChecker2 - { - public: - BailOutChecker2 (Component::BailOutChecker& boc, Component* const comp) - : checker (boc), safePointer (comp) - { - } - - bool shouldBailOut() const noexcept - { - return checker.shouldBailOut() || safePointer == 0; - } - - private: - Component::BailOutChecker& checker; - const WeakReference safePointer; - - JUCE_DECLARE_NON_COPYABLE (BailOutChecker2) - }; - - JUCE_DECLARE_NON_COPYABLE (MouseListenerList) -}; - -//============================================================================== -struct FocusRestorer -{ - FocusRestorer() : lastFocus (Component::getCurrentlyFocusedComponent()) {} - - ~FocusRestorer() - { - if (lastFocus != nullptr && ! lastFocus->isCurrentlyBlockedByAnotherModalComponent()) - lastFocus->grabKeyboardFocus(); - } - - WeakReference lastFocus; - - JUCE_DECLARE_NON_COPYABLE (FocusRestorer) -}; - -//============================================================================== -struct ScalingHelpers -{ - template - static PointOrRect unscaledScreenPosToScaled (float scale, PointOrRect pos) noexcept - { - return scale != 1.0f ? pos / scale : pos; - } - - template - static PointOrRect scaledScreenPosToUnscaled (float scale, PointOrRect pos) noexcept - { - return scale != 1.0f ? pos * scale : pos; - } - - // For these, we need to avoid getSmallestIntegerContainer being used, which causes - // judder when moving windows - static Rectangle unscaledScreenPosToScaled (float scale, const Rectangle& pos) noexcept - { - return scale != 1.0f ? Rectangle (roundToInt (pos.getX() / scale), - roundToInt (pos.getY() / scale), - roundToInt (pos.getWidth() / scale), - roundToInt (pos.getHeight() / scale)) : pos; - } - - static Rectangle scaledScreenPosToUnscaled (float scale, Rectangle& pos) noexcept - { - return scale != 1.0f ? Rectangle (roundToInt (pos.getX() * scale), - roundToInt (pos.getY() * scale), - roundToInt (pos.getWidth() * scale), - roundToInt (pos.getHeight() * scale)) : pos; - } - - template - static PointOrRect unscaledScreenPosToScaled (PointOrRect pos) noexcept - { - return unscaledScreenPosToScaled (Desktop::getInstance().getGlobalScaleFactor(), pos); - } - - template - static PointOrRect scaledScreenPosToUnscaled (PointOrRect pos) noexcept - { - return scaledScreenPosToUnscaled (Desktop::getInstance().getGlobalScaleFactor(), pos); - } - - template - static PointOrRect unscaledScreenPosToScaled (const Component& comp, PointOrRect pos) noexcept - { - return unscaledScreenPosToScaled (comp.getDesktopScaleFactor(), pos); - } - - template - static PointOrRect scaledScreenPosToUnscaled (const Component& comp, PointOrRect pos) noexcept - { - return scaledScreenPosToUnscaled (comp.getDesktopScaleFactor(), pos); - } - - static Point addPosition (Point p, const Component& c) noexcept { return p + c.getPosition(); } - static Rectangle addPosition (Rectangle p, const Component& c) noexcept { return p + c.getPosition(); } - static Point addPosition (Point p, const Component& c) noexcept { return p + c.getPosition().toFloat(); } - static Rectangle addPosition (Rectangle p, const Component& c) noexcept { return p + c.getPosition().toFloat(); } - static Point subtractPosition (Point p, const Component& c) noexcept { return p - c.getPosition(); } - static Rectangle subtractPosition (Rectangle p, const Component& c) noexcept { return p - c.getPosition(); } - static Point subtractPosition (Point p, const Component& c) noexcept { return p - c.getPosition().toFloat(); } - static Rectangle subtractPosition (Rectangle p, const Component& c) noexcept { return p - c.getPosition().toFloat(); } -}; - -//============================================================================== -struct Component::ComponentHelpers -{ - #if JUCE_MODAL_LOOPS_PERMITTED - static void* runModalLoopCallback (void* userData) - { - return (void*) (pointer_sized_int) static_cast (userData)->runModalLoop(); - } - #endif - - static Identifier getColourPropertyId (int colourId) - { - char reversedHex[32]; - char* t = reversedHex; - - for (unsigned int v = (unsigned int) colourId;;) - { - *t++ = "0123456789abcdef" [(int) (v & 15)]; - v >>= 4; - - if (v == 0) - break; - } - - char destBuffer[32]; - char* dest = destBuffer; - memcpy (dest, "jcclr_", 6); - dest += 6; - - while (t > reversedHex) - *dest++ = *--t; - - *dest++ = 0; - return destBuffer; - } - - //============================================================================== - static inline bool hitTest (Component& comp, Point localPoint) - { - return isPositiveAndBelow (localPoint.x, comp.getWidth()) - && isPositiveAndBelow (localPoint.y, comp.getHeight()) - && comp.hitTest (localPoint.x, localPoint.y); - } - - // converts an unscaled position within a peer to the local position within that peer's component - template - static PointOrRect rawPeerPositionToLocal (const Component& comp, PointOrRect pos) noexcept - { - if (comp.isTransformed()) - pos = pos.transformedBy (comp.getTransform().inverted()); - - return ScalingHelpers::unscaledScreenPosToScaled (comp, pos); - } - - // converts a position within a peer's component to the unscaled position within the peer - template - static PointOrRect localPositionToRawPeerPos (const Component& comp, PointOrRect pos) noexcept - { - if (comp.isTransformed()) - pos = pos.transformedBy (comp.getTransform()); - - return ScalingHelpers::scaledScreenPosToUnscaled (comp, pos); - } - - template - static PointOrRect convertFromParentSpace (const Component& comp, PointOrRect pointInParentSpace) - { - if (comp.affineTransform != nullptr) - pointInParentSpace = pointInParentSpace.transformedBy (comp.affineTransform->inverted()); - - if (comp.isOnDesktop()) - { - if (ComponentPeer* peer = comp.getPeer()) - pointInParentSpace = ScalingHelpers::unscaledScreenPosToScaled - (comp, peer->globalToLocal (ScalingHelpers::scaledScreenPosToUnscaled (pointInParentSpace))); - else - jassertfalse; - } - else - { - pointInParentSpace = ScalingHelpers::subtractPosition (pointInParentSpace, comp); - } - - return pointInParentSpace; - } - - template - static PointOrRect convertToParentSpace (const Component& comp, PointOrRect pointInLocalSpace) - { - if (comp.isOnDesktop()) - { - if (ComponentPeer* peer = comp.getPeer()) - pointInLocalSpace = ScalingHelpers::unscaledScreenPosToScaled - (peer->localToGlobal (ScalingHelpers::scaledScreenPosToUnscaled (comp, pointInLocalSpace))); - else - jassertfalse; - } - else - { - pointInLocalSpace = ScalingHelpers::addPosition (pointInLocalSpace, comp); - } - - if (comp.affineTransform != nullptr) - pointInLocalSpace = pointInLocalSpace.transformedBy (*comp.affineTransform); - - return pointInLocalSpace; - } - - template - static PointOrRect convertFromDistantParentSpace (const Component* parent, const Component& target, const PointOrRect& coordInParent) - { - const Component* const directParent = target.getParentComponent(); - jassert (directParent != nullptr); - - if (directParent == parent) - return convertFromParentSpace (target, coordInParent); - - return convertFromParentSpace (target, convertFromDistantParentSpace (parent, *directParent, coordInParent)); - } - - template - static PointOrRect convertCoordinate (const Component* target, const Component* source, PointOrRect p) - { - while (source != nullptr) - { - if (source == target) - return p; - - if (source->isParentOf (target)) - return convertFromDistantParentSpace (source, *target, p); - - p = convertToParentSpace (*source, p); - source = source->getParentComponent(); - } - - jassert (source == nullptr); - if (target == nullptr) - return p; - - const Component* const topLevelComp = target->getTopLevelComponent(); - - p = convertFromParentSpace (*topLevelComp, p); - - if (topLevelComp == target) - return p; - - return convertFromDistantParentSpace (topLevelComp, *target, p); - } - - static bool clipObscuredRegions (const Component& comp, Graphics& g, const Rectangle& clipRect, Point delta) - { - bool nothingChanged = true; - - for (int i = comp.childComponentList.size(); --i >= 0;) - { - const Component& child = *comp.childComponentList.getUnchecked(i); - - if (child.isVisible() && ! child.isTransformed()) - { - const Rectangle newClip (clipRect.getIntersection (child.bounds)); - - if (! newClip.isEmpty()) - { - if (child.isOpaque() && child.componentTransparency == 0) - { - g.excludeClipRegion (newClip + delta); - nothingChanged = false; - } - else - { - const Point childPos (child.getPosition()); - if (clipObscuredRegions (child, g, newClip - childPos, childPos + delta)) - nothingChanged = false; - } - } - } - } - - return nothingChanged; - } - - static Rectangle getParentOrMainMonitorBounds (const Component& comp) - { - if (Component* p = comp.getParentComponent()) - return p->getLocalBounds(); - - return Desktop::getInstance().getDisplays().getMainDisplay().userArea; - } -}; - -//============================================================================== -Component::Component() noexcept - : parentComponent (nullptr), - lookAndFeel (nullptr), - effect (nullptr), - componentFlags (0), - componentTransparency (0) -{ -} - -Component::Component (const String& name) noexcept - : componentName (name), - parentComponent (nullptr), - lookAndFeel (nullptr), - effect (nullptr), - componentFlags (0), - componentTransparency (0) -{ -} - -Component::~Component() -{ - static_jassert (sizeof (flags) <= sizeof (componentFlags)); - - componentListeners.call (&ComponentListener::componentBeingDeleted, *this); - - masterReference.clear(); - - while (childComponentList.size() > 0) - removeChildComponent (childComponentList.size() - 1, false, true); - - if (parentComponent != nullptr) - parentComponent->removeChildComponent (parentComponent->childComponentList.indexOf (this), true, false); - else if (currentlyFocusedComponent == this || isParentOf (currentlyFocusedComponent)) - giveAwayFocus (currentlyFocusedComponent != this); - - if (flags.hasHeavyweightPeerFlag) - removeFromDesktop(); - - // Something has added some children to this component during its destructor! Not a smart idea! - jassert (childComponentList.size() == 0); -} - -//============================================================================== -void Component::setName (const String& name) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN - - if (componentName != name) - { - componentName = name; - - if (flags.hasHeavyweightPeerFlag) - if (ComponentPeer* const peer = getPeer()) - peer->setTitle (name); - - BailOutChecker checker (this); - componentListeners.callChecked (checker, &ComponentListener::componentNameChanged, *this); - } -} - -void Component::setComponentID (const String& newID) -{ - componentID = newID; -} - -void Component::setVisible (bool shouldBeVisible) -{ - if (flags.visibleFlag != shouldBeVisible) - { - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN - - const WeakReference safePointer (this); - flags.visibleFlag = shouldBeVisible; - - if (shouldBeVisible) - repaint(); - else - repaintParent(); - - sendFakeMouseMove(); - - if (! shouldBeVisible) - { - if (cachedImage != nullptr) - cachedImage->releaseResources(); - - if (currentlyFocusedComponent == this || isParentOf (currentlyFocusedComponent)) - { - if (parentComponent != nullptr) - parentComponent->grabKeyboardFocus(); - else - giveAwayFocus (true); - } - } - - if (safePointer != nullptr) - { - sendVisibilityChangeMessage(); - - if (safePointer != nullptr && flags.hasHeavyweightPeerFlag) - { - if (ComponentPeer* const peer = getPeer()) - { - peer->setVisible (shouldBeVisible); - internalHierarchyChanged(); - } - } - } - } -} - -void Component::visibilityChanged() {} - -void Component::sendVisibilityChangeMessage() -{ - BailOutChecker checker (this); - visibilityChanged(); - - if (! checker.shouldBailOut()) - componentListeners.callChecked (checker, &ComponentListener::componentVisibilityChanged, *this); -} - -bool Component::isShowing() const -{ - if (! flags.visibleFlag) - return false; - - if (parentComponent != nullptr) - return parentComponent->isShowing(); - - if (const ComponentPeer* const peer = getPeer()) - return ! peer->isMinimised(); - - return false; -} - -//============================================================================== -void* Component::getWindowHandle() const -{ - if (const ComponentPeer* const peer = getPeer()) - return peer->getNativeHandle(); - - return nullptr; -} - -//============================================================================== -void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED - - if (isOpaque()) - styleWanted &= ~ComponentPeer::windowIsSemiTransparent; - else - styleWanted |= ComponentPeer::windowIsSemiTransparent; - - // don't use getPeer(), so that we only get the peer that's specifically - // for this comp, and not for one of its parents. - ComponentPeer* peer = ComponentPeer::getPeerFor (this); - - if (peer == nullptr || styleWanted != peer->getStyleFlags()) - { - const WeakReference safePointer (this); - - #if JUCE_LINUX - // it's wise to give the component a non-zero size before - // putting it on the desktop, as X windows get confused by this, and - // a (1, 1) minimum size is enforced here. - setSize (jmax (1, getWidth()), - jmax (1, getHeight())); - #endif - - const Point topLeft (getScreenPosition()); - - bool wasFullscreen = false; - bool wasMinimised = false; - ComponentBoundsConstrainer* currentConstrainer = nullptr; - Rectangle oldNonFullScreenBounds; - int oldRenderingEngine = -1; - - if (peer != nullptr) - { - ScopedPointer oldPeerToDelete (peer); - - wasFullscreen = peer->isFullScreen(); - wasMinimised = peer->isMinimised(); - currentConstrainer = peer->getConstrainer(); - oldNonFullScreenBounds = peer->getNonFullScreenBounds(); - oldRenderingEngine = peer->getCurrentRenderingEngine(); - - flags.hasHeavyweightPeerFlag = false; - Desktop::getInstance().removeDesktopComponent (this); - internalHierarchyChanged(); // give comps a chance to react to the peer change before the old peer is deleted. - - if (safePointer == nullptr) - return; - - setTopLeftPosition (topLeft); - } - - if (parentComponent != nullptr) - parentComponent->removeChildComponent (this); - - if (safePointer != nullptr) - { - flags.hasHeavyweightPeerFlag = true; - - peer = createNewPeer (styleWanted, nativeWindowToAttachTo); - - Desktop::getInstance().addDesktopComponent (this); - - bounds.setPosition (topLeft); - peer->updateBounds(); - - if (oldRenderingEngine >= 0) - peer->setCurrentRenderingEngine (oldRenderingEngine); - - peer->setVisible (isVisible()); - - peer = ComponentPeer::getPeerFor (this); - if (peer == nullptr) - return; - - if (wasFullscreen) - { - peer->setFullScreen (true); - peer->setNonFullScreenBounds (oldNonFullScreenBounds); - } - - if (wasMinimised) - peer->setMinimised (true); - - #if JUCE_WINDOWS - if (isAlwaysOnTop()) - peer->setAlwaysOnTop (true); - #endif - - peer->setConstrainer (currentConstrainer); - - repaint(); - internalHierarchyChanged(); - } - } -} - -void Component::removeFromDesktop() -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN - - if (flags.hasHeavyweightPeerFlag) - { - ComponentPeer* const peer = ComponentPeer::getPeerFor (this); - jassert (peer != nullptr); - - flags.hasHeavyweightPeerFlag = false; - delete peer; - - Desktop::getInstance().removeDesktopComponent (this); - } -} - -bool Component::isOnDesktop() const noexcept -{ - return flags.hasHeavyweightPeerFlag; -} - -ComponentPeer* Component::getPeer() const -{ - if (flags.hasHeavyweightPeerFlag) - return ComponentPeer::getPeerFor (this); - - if (parentComponent == nullptr) - return nullptr; - - return parentComponent->getPeer(); -} - -void Component::userTriedToCloseWindow() -{ - /* This means that the user's trying to get rid of your window with the 'close window' system - menu option (on windows) or possibly the task manager - you should really handle this - and delete or hide your component in an appropriate way. - - If you want to ignore the event and don't want to trigger this assertion, just override - this method and do nothing. - */ - jassertfalse; -} - -void Component::minimisationStateChanged (bool) {} - -float Component::getDesktopScaleFactor() const { return Desktop::getInstance().getGlobalScaleFactor(); } - -//============================================================================== -void Component::setOpaque (const bool shouldBeOpaque) -{ - if (shouldBeOpaque != flags.opaqueFlag) - { - flags.opaqueFlag = shouldBeOpaque; - - if (flags.hasHeavyweightPeerFlag) - if (const ComponentPeer* const peer = ComponentPeer::getPeerFor (this)) - addToDesktop (peer->getStyleFlags()); // recreates the heavyweight window - - repaint(); - } -} - -bool Component::isOpaque() const noexcept -{ - return flags.opaqueFlag; -} - -//============================================================================== -class StandardCachedComponentImage : public CachedComponentImage -{ -public: - StandardCachedComponentImage (Component& c) noexcept : owner (c), scale (1.0f) {} - - void paint (Graphics& g) override - { - scale = g.getInternalContext().getPhysicalPixelScaleFactor(); - const Rectangle compBounds (owner.getLocalBounds()); - const Rectangle imageBounds (compBounds * scale); - - if (image.isNull() || image.getBounds() != imageBounds) - { - image = Image (owner.isOpaque() ? Image::RGB - : Image::ARGB, - jmax (1, imageBounds.getWidth()), - jmax (1, imageBounds.getHeight()), - ! owner.isOpaque()); - - validArea.clear(); - } - - if (! validArea.containsRectangle (compBounds)) - { - Graphics imG (image); - LowLevelGraphicsContext& lg = imG.getInternalContext(); - - for (const Rectangle* i = validArea.begin(), * const e = validArea.end(); i != e; ++i) - lg.excludeClipRectangle (*i); - - if (! owner.isOpaque()) - { - lg.setFill (Colours::transparentBlack); - lg.fillRect (imageBounds, true); - lg.setFill (Colours::black); - } - - lg.addTransform (AffineTransform::scale (scale)); - owner.paintEntireComponent (imG, true); - } - - validArea = imageBounds; - - g.setColour (Colours::black.withAlpha (owner.getAlpha())); - g.drawImageTransformed (image, AffineTransform::scale (compBounds.getWidth() / (float) imageBounds.getWidth(), - compBounds.getHeight() / (float) imageBounds.getHeight()), false); - } - - bool invalidateAll() override { validArea.clear(); return true; } - bool invalidate (const Rectangle& area) override { validArea.subtract (area * scale); return true; } - void releaseResources() override { image = Image::null; } - -private: - Image image; - RectangleList validArea; - Component& owner; - float scale; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StandardCachedComponentImage) -}; - -void Component::setCachedComponentImage (CachedComponentImage* newCachedImage) -{ - if (cachedImage != newCachedImage) - { - cachedImage = newCachedImage; - repaint(); - } -} - -void Component::setBufferedToImage (const bool shouldBeBuffered) -{ - // This assertion means that this component is already using a custom CachedComponentImage, - // so by calling setBufferedToImage, you'll be deleting the custom one - this is almost certainly - // not what you wanted to happen... If you really do know what you're doing here, and want to - // avoid this assertion, just call setCachedComponentImage (nullptr) before setBufferedToImage(). - jassert (cachedImage == nullptr || dynamic_cast (cachedImage.get()) != nullptr); - - if (shouldBeBuffered) - { - if (cachedImage == nullptr) - cachedImage = new StandardCachedComponentImage (*this); - } - else - { - cachedImage = nullptr; - } -} - -//============================================================================== -void Component::reorderChildInternal (const int sourceIndex, const int destIndex) -{ - if (sourceIndex != destIndex) - { - Component* const c = childComponentList.getUnchecked (sourceIndex); - jassert (c != nullptr); - c->repaintParent(); - - childComponentList.move (sourceIndex, destIndex); - - sendFakeMouseMove(); - internalChildrenChanged(); - } -} - -void Component::toFront (const bool setAsForeground) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN - - if (flags.hasHeavyweightPeerFlag) - { - if (ComponentPeer* const peer = getPeer()) - { - peer->toFront (setAsForeground); - - if (setAsForeground && ! hasKeyboardFocus (true)) - grabKeyboardFocus(); - } - } - else if (parentComponent != nullptr) - { - const Array& childList = parentComponent->childComponentList; - - if (childList.getLast() != this) - { - const int index = childList.indexOf (this); - - if (index >= 0) - { - int insertIndex = -1; - - if (! flags.alwaysOnTopFlag) - { - insertIndex = childList.size() - 1; - - while (insertIndex > 0 && childList.getUnchecked (insertIndex)->isAlwaysOnTop()) - --insertIndex; - } - - parentComponent->reorderChildInternal (index, insertIndex); - } - } - - if (setAsForeground) - { - internalBroughtToFront(); - grabKeyboardFocus(); - } - } -} - -void Component::toBehind (Component* const other) -{ - if (other != nullptr && other != this) - { - // the two components must belong to the same parent.. - jassert (parentComponent == other->parentComponent); - - if (parentComponent != nullptr) - { - const Array& childList = parentComponent->childComponentList; - const int index = childList.indexOf (this); - - if (index >= 0 && childList [index + 1] != other) - { - int otherIndex = childList.indexOf (other); - - if (otherIndex >= 0) - { - if (index < otherIndex) - --otherIndex; - - parentComponent->reorderChildInternal (index, otherIndex); - } - } - } - else if (isOnDesktop()) - { - jassert (other->isOnDesktop()); - - if (other->isOnDesktop()) - { - ComponentPeer* const us = getPeer(); - ComponentPeer* const them = other->getPeer(); - - jassert (us != nullptr && them != nullptr); - if (us != nullptr && them != nullptr) - us->toBehind (them); - } - } - } -} - -void Component::toBack() -{ - if (isOnDesktop()) - { - jassertfalse; //xxx need to add this to native window - } - else if (parentComponent != nullptr) - { - const Array& childList = parentComponent->childComponentList; - - if (childList.getFirst() != this) - { - const int index = childList.indexOf (this); - - if (index > 0) - { - int insertIndex = 0; - - if (flags.alwaysOnTopFlag) - while (insertIndex < childList.size() && ! childList.getUnchecked (insertIndex)->isAlwaysOnTop()) - ++insertIndex; - - parentComponent->reorderChildInternal (index, insertIndex); - } - } - } -} - -void Component::setAlwaysOnTop (const bool shouldStayOnTop) -{ - if (shouldStayOnTop != flags.alwaysOnTopFlag) - { - BailOutChecker checker (this); - - flags.alwaysOnTopFlag = shouldStayOnTop; - - if (isOnDesktop()) - { - if (ComponentPeer* const peer = getPeer()) - { - if (! peer->setAlwaysOnTop (shouldStayOnTop)) - { - // some kinds of peer can't change their always-on-top status, so - // for these, we'll need to create a new window - const int oldFlags = peer->getStyleFlags(); - removeFromDesktop(); - addToDesktop (oldFlags); - } - } - } - - if (shouldStayOnTop && ! checker.shouldBailOut()) - toFront (false); - - if (! checker.shouldBailOut()) - internalHierarchyChanged(); - } -} - -bool Component::isAlwaysOnTop() const noexcept -{ - return flags.alwaysOnTopFlag; -} - -//============================================================================== -int Component::proportionOfWidth (const float proportion) const noexcept { return roundToInt (proportion * bounds.getWidth()); } -int Component::proportionOfHeight (const float proportion) const noexcept { return roundToInt (proportion * bounds.getHeight()); } - -int Component::getParentWidth() const noexcept -{ - return parentComponent != nullptr ? parentComponent->getWidth() - : getParentMonitorArea().getWidth(); -} - -int Component::getParentHeight() const noexcept -{ - return parentComponent != nullptr ? parentComponent->getHeight() - : getParentMonitorArea().getHeight(); -} - -int Component::getScreenX() const { return getScreenPosition().x; } -int Component::getScreenY() const { return getScreenPosition().y; } - -Point Component::getScreenPosition() const { return localPointToGlobal (Point()); } -Rectangle Component::getScreenBounds() const { return localAreaToGlobal (getLocalBounds()); } - -Rectangle Component::getParentMonitorArea() const -{ - return Desktop::getInstance().getDisplays().getDisplayContaining (getScreenBounds().getCentre()).userArea; -} - -Point Component::getLocalPoint (const Component* source, Point point) const -{ - return ComponentHelpers::convertCoordinate (this, source, point); -} - -Point Component::getLocalPoint (const Component* source, Point point) const -{ - return ComponentHelpers::convertCoordinate (this, source, point); -} - -Rectangle Component::getLocalArea (const Component* source, const Rectangle& area) const -{ - return ComponentHelpers::convertCoordinate (this, source, area); -} - -Point Component::localPointToGlobal (Point point) const -{ - return ComponentHelpers::convertCoordinate (nullptr, this, point); -} - -Point Component::localPointToGlobal (Point point) const -{ - return ComponentHelpers::convertCoordinate (nullptr, this, point); -} - -Rectangle Component::localAreaToGlobal (const Rectangle& area) const -{ - return ComponentHelpers::convertCoordinate (nullptr, this, area); -} - -// Deprecated methods... -Point Component::relativePositionToGlobal (Point relativePosition) const -{ - return localPointToGlobal (relativePosition); -} - -Point Component::globalPositionToRelative (Point screenPosition) const -{ - return getLocalPoint (nullptr, screenPosition); -} - -Point Component::relativePositionToOtherComponent (const Component* const targetComponent, Point positionRelativeToThis) const -{ - return targetComponent == nullptr ? localPointToGlobal (positionRelativeToThis) - : targetComponent->getLocalPoint (this, positionRelativeToThis); -} - - -//============================================================================== -void Component::setBounds (const int x, const int y, int w, int h) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN - - if (w < 0) w = 0; - if (h < 0) h = 0; - - const bool wasResized = (getWidth() != w || getHeight() != h); - const bool wasMoved = (getX() != x || getY() != y); - - #if JUCE_DEBUG - // It's a very bad idea to try to resize a window during its paint() method! - jassert (! (flags.isInsidePaintCall && wasResized && isOnDesktop())); - #endif - - if (wasMoved || wasResized) - { - const bool showing = isShowing(); - if (showing) - { - // send a fake mouse move to trigger enter/exit messages if needed.. - sendFakeMouseMove(); - - if (! flags.hasHeavyweightPeerFlag) - repaintParent(); - } - - bounds.setBounds (x, y, w, h); - - if (showing) - { - if (wasResized) - repaint(); - else if (! flags.hasHeavyweightPeerFlag) - repaintParent(); - } - else if (cachedImage != nullptr) - { - cachedImage->invalidateAll(); - } - - flags.isMoveCallbackPending = wasMoved; - flags.isResizeCallbackPending = wasResized; - - if (flags.hasHeavyweightPeerFlag) - if (ComponentPeer* const peer = getPeer()) - peer->updateBounds(); - - sendMovedResizedMessagesIfPending(); - } -} - -void Component::sendMovedResizedMessagesIfPending() -{ - if (flags.isMoveCallbackPending || flags.isResizeCallbackPending) - { - sendMovedResizedMessages (flags.isMoveCallbackPending, flags.isResizeCallbackPending); - - flags.isMoveCallbackPending = false; - flags.isResizeCallbackPending = false; - } -} - -void Component::sendMovedResizedMessages (const bool wasMoved, const bool wasResized) -{ - BailOutChecker checker (this); - - if (wasMoved) - { - moved(); - - if (checker.shouldBailOut()) - return; - } - - if (wasResized) - { - resized(); - - if (checker.shouldBailOut()) - return; - - for (int i = childComponentList.size(); --i >= 0;) - { - childComponentList.getUnchecked(i)->parentSizeChanged(); - - if (checker.shouldBailOut()) - return; - - i = jmin (i, childComponentList.size()); - } - } - - if (parentComponent != nullptr) - parentComponent->childBoundsChanged (this); - - if (! checker.shouldBailOut()) - componentListeners.callChecked (checker, &ComponentListener::componentMovedOrResized, - *this, wasMoved, wasResized); -} - -void Component::setSize (const int w, const int h) -{ - setBounds (getX(), getY(), w, h); -} - -void Component::setTopLeftPosition (const int x, const int y) -{ - setBounds (x, y, getWidth(), getHeight()); -} - -void Component::setTopLeftPosition (Point pos) -{ - setBounds (pos.x, pos.y, getWidth(), getHeight()); -} - -void Component::setTopRightPosition (const int x, const int y) -{ - setTopLeftPosition (x - getWidth(), y); -} - -void Component::setBounds (const Rectangle& r) -{ - setBounds (r.getX(), r.getY(), r.getWidth(), r.getHeight()); -} - -void Component::setBounds (const RelativeRectangle& newBounds) -{ - newBounds.applyToComponent (*this); -} - -void Component::setBounds (const String& newBoundsExpression) -{ - setBounds (RelativeRectangle (newBoundsExpression)); -} - -void Component::setBoundsRelative (const float x, const float y, - const float w, const float h) -{ - const int pw = getParentWidth(); - const int ph = getParentHeight(); - - setBounds (roundToInt (x * pw), - roundToInt (y * ph), - roundToInt (w * pw), - roundToInt (h * ph)); -} - -void Component::setCentrePosition (const int x, const int y) -{ - setTopLeftPosition (x - getWidth() / 2, - y - getHeight() / 2); -} - -void Component::setCentreRelative (const float x, const float y) -{ - setCentrePosition (roundToInt (getParentWidth() * x), - roundToInt (getParentHeight() * y)); -} - -void Component::centreWithSize (const int width, const int height) -{ - const Rectangle parentArea (ComponentHelpers::getParentOrMainMonitorBounds (*this)); - - setBounds (parentArea.getCentreX() - width / 2, - parentArea.getCentreY() - height / 2, - width, height); -} - -void Component::setBoundsInset (const BorderSize& borders) -{ - setBounds (borders.subtractedFrom (ComponentHelpers::getParentOrMainMonitorBounds (*this))); -} - -void Component::setBoundsToFit (int x, int y, int width, int height, - Justification justification, - const bool onlyReduceInSize) -{ - // it's no good calling this method unless both the component and - // target rectangle have a finite size. - jassert (getWidth() > 0 && getHeight() > 0 && width > 0 && height > 0); - - if (getWidth() > 0 && getHeight() > 0 - && width > 0 && height > 0) - { - int newW, newH; - - if (onlyReduceInSize && getWidth() <= width && getHeight() <= height) - { - newW = getWidth(); - newH = getHeight(); - } - else - { - const double imageRatio = getHeight() / (double) getWidth(); - const double targetRatio = height / (double) width; - - if (imageRatio <= targetRatio) - { - newW = width; - newH = jmin (height, roundToInt (newW * imageRatio)); - } - else - { - newH = height; - newW = jmin (width, roundToInt (newH / imageRatio)); - } - } - - if (newW > 0 && newH > 0) - setBounds (justification.appliedToRectangle (Rectangle (newW, newH), - Rectangle (x, y, width, height))); - } -} - -//============================================================================== -void Component::setTransform (const AffineTransform& newTransform) -{ - // If you pass in a transform with no inverse, the component will have no dimensions, - // and there will be all sorts of maths errors when converting coordinates. - jassert (! newTransform.isSingularity()); - - if (newTransform.isIdentity()) - { - if (affineTransform != nullptr) - { - repaint(); - affineTransform = nullptr; - repaint(); - - sendMovedResizedMessages (false, false); - } - } - else if (affineTransform == nullptr) - { - repaint(); - affineTransform = new AffineTransform (newTransform); - repaint(); - sendMovedResizedMessages (false, false); - } - else if (*affineTransform != newTransform) - { - repaint(); - *affineTransform = newTransform; - repaint(); - sendMovedResizedMessages (false, false); - } -} - -bool Component::isTransformed() const noexcept -{ - return affineTransform != nullptr; -} - -AffineTransform Component::getTransform() const -{ - return affineTransform != nullptr ? *affineTransform : AffineTransform::identity; -} - -//============================================================================== -bool Component::hitTest (int x, int y) -{ - if (! flags.ignoresMouseClicksFlag) - return true; - - if (flags.allowChildMouseClicksFlag) - { - for (int i = childComponentList.size(); --i >= 0;) - { - Component& child = *childComponentList.getUnchecked (i); - - if (child.isVisible() - && ComponentHelpers::hitTest (child, ComponentHelpers::convertFromParentSpace (child, Point (x, y)))) - return true; - } - } - - return false; -} - -void Component::setInterceptsMouseClicks (const bool allowClicks, - const bool allowClicksOnChildComponents) noexcept -{ - flags.ignoresMouseClicksFlag = ! allowClicks; - flags.allowChildMouseClicksFlag = allowClicksOnChildComponents; -} - -void Component::getInterceptsMouseClicks (bool& allowsClicksOnThisComponent, - bool& allowsClicksOnChildComponents) const noexcept -{ - allowsClicksOnThisComponent = ! flags.ignoresMouseClicksFlag; - allowsClicksOnChildComponents = flags.allowChildMouseClicksFlag; -} - -bool Component::contains (Point point) -{ - if (ComponentHelpers::hitTest (*this, point)) - { - if (parentComponent != nullptr) - return parentComponent->contains (ComponentHelpers::convertToParentSpace (*this, point)); - - if (flags.hasHeavyweightPeerFlag) - if (const ComponentPeer* const peer = getPeer()) - return peer->contains (ComponentHelpers::localPositionToRawPeerPos (*this, point), true); - } - - return false; -} - -bool Component::reallyContains (Point point, const bool returnTrueIfWithinAChild) -{ - if (! contains (point)) - return false; - - Component* const top = getTopLevelComponent(); - const Component* const compAtPosition = top->getComponentAt (top->getLocalPoint (this, point)); - - return (compAtPosition == this) || (returnTrueIfWithinAChild && isParentOf (compAtPosition)); -} - -Component* Component::getComponentAt (Point position) -{ - if (flags.visibleFlag && ComponentHelpers::hitTest (*this, position)) - { - for (int i = childComponentList.size(); --i >= 0;) - { - Component* child = childComponentList.getUnchecked(i); - child = child->getComponentAt (ComponentHelpers::convertFromParentSpace (*child, position)); - - if (child != nullptr) - return child; - } - - return this; - } - - return nullptr; -} - -Component* Component::getComponentAt (const int x, const int y) -{ - return getComponentAt (Point (x, y)); -} - -//============================================================================== -void Component::addChildComponent (Component& child, int zOrder) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN - - if (child.parentComponent != this) - { - if (child.parentComponent != nullptr) - child.parentComponent->removeChildComponent (&child); - else - child.removeFromDesktop(); - - child.parentComponent = this; - - if (child.isVisible()) - child.repaintParent(); - - if (! child.isAlwaysOnTop()) - { - if (zOrder < 0 || zOrder > childComponentList.size()) - zOrder = childComponentList.size(); - - while (zOrder > 0) - { - if (! childComponentList.getUnchecked (zOrder - 1)->isAlwaysOnTop()) - break; - - --zOrder; - } - } - - childComponentList.insert (zOrder, &child); - - child.internalHierarchyChanged(); - internalChildrenChanged(); - } -} - -void Component::addAndMakeVisible (Component& child, int zOrder) -{ - child.setVisible (true); - addChildComponent (child, zOrder); -} - -void Component::addChildComponent (Component* const child, int zOrder) -{ - if (child != nullptr) - addChildComponent (*child, zOrder); -} - -void Component::addAndMakeVisible (Component* const child, int zOrder) -{ - if (child != nullptr) - addAndMakeVisible (*child, zOrder); -} - -void Component::addChildAndSetID (Component* const child, const String& childID) -{ - if (child != nullptr) - { - child->setComponentID (childID); - addAndMakeVisible (child); - } -} - -void Component::removeChildComponent (Component* const child) -{ - removeChildComponent (childComponentList.indexOf (child), true, true); -} - -Component* Component::removeChildComponent (const int index) -{ - return removeChildComponent (index, true, true); -} - -Component* Component::removeChildComponent (const int index, bool sendParentEvents, const bool sendChildEvents) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED_OR_OFFSCREEN - - Component* const child = childComponentList [index]; - - if (child != nullptr) - { - sendParentEvents = sendParentEvents && child->isShowing(); - - if (sendParentEvents) - { - sendFakeMouseMove(); - - if (child->isVisible()) - child->repaintParent(); - } - - childComponentList.remove (index); - child->parentComponent = nullptr; - - if (child->cachedImage != nullptr) - child->cachedImage->releaseResources(); - - // (NB: there are obscure situations where child->isShowing() = false, but it still has the focus) - if (currentlyFocusedComponent == child || child->isParentOf (currentlyFocusedComponent)) - { - if (sendParentEvents) - { - const WeakReference thisPointer (this); - - giveAwayFocus (sendChildEvents || currentlyFocusedComponent != child); - - if (thisPointer == nullptr) - return child; - - grabKeyboardFocus(); - } - else - { - giveAwayFocus (sendChildEvents || currentlyFocusedComponent != child); - } - } - - if (sendChildEvents) - child->internalHierarchyChanged(); - - if (sendParentEvents) - internalChildrenChanged(); - } - - return child; -} - -//============================================================================== -void Component::removeAllChildren() -{ - while (childComponentList.size() > 0) - removeChildComponent (childComponentList.size() - 1); -} - -void Component::deleteAllChildren() -{ - while (childComponentList.size() > 0) - delete (removeChildComponent (childComponentList.size() - 1)); -} - -int Component::getNumChildComponents() const noexcept -{ - return childComponentList.size(); -} - -Component* Component::getChildComponent (const int index) const noexcept -{ - return childComponentList [index]; -} - -int Component::getIndexOfChildComponent (const Component* const child) const noexcept -{ - return childComponentList.indexOf (const_cast (child)); -} - -Component* Component::findChildWithID (StringRef targetID) const noexcept -{ - for (int i = childComponentList.size(); --i >= 0;) - { - Component* const c = childComponentList.getUnchecked(i); - if (c->componentID == targetID) - return c; - } - - return nullptr; -} - -Component* Component::getTopLevelComponent() const noexcept -{ - const Component* comp = this; - - while (comp->parentComponent != nullptr) - comp = comp->parentComponent; - - return const_cast (comp); -} - -bool Component::isParentOf (const Component* possibleChild) const noexcept -{ - while (possibleChild != nullptr) - { - possibleChild = possibleChild->parentComponent; - - if (possibleChild == this) - return true; - } - - return false; -} - -//============================================================================== -void Component::parentHierarchyChanged() {} -void Component::childrenChanged() {} - -void Component::internalChildrenChanged() -{ - if (componentListeners.isEmpty()) - { - childrenChanged(); - } - else - { - BailOutChecker checker (this); - - childrenChanged(); - - if (! checker.shouldBailOut()) - componentListeners.callChecked (checker, &ComponentListener::componentChildrenChanged, *this); - } -} - -void Component::internalHierarchyChanged() -{ - BailOutChecker checker (this); - - parentHierarchyChanged(); - - if (checker.shouldBailOut()) - return; - - componentListeners.callChecked (checker, &ComponentListener::componentParentHierarchyChanged, *this); - - if (checker.shouldBailOut()) - return; - - for (int i = childComponentList.size(); --i >= 0;) - { - childComponentList.getUnchecked (i)->internalHierarchyChanged(); - - if (checker.shouldBailOut()) - { - // you really shouldn't delete the parent component during a callback telling you - // that it's changed.. - jassertfalse; - return; - } - - i = jmin (i, childComponentList.size()); - } -} - -//============================================================================== -#if JUCE_MODAL_LOOPS_PERMITTED -int Component::runModalLoop() -{ - if (! MessageManager::getInstance()->isThisTheMessageThread()) - { - // use a callback so this can be called from non-gui threads - return (int) (pointer_sized_int) MessageManager::getInstance() - ->callFunctionOnMessageThread (&ComponentHelpers::runModalLoopCallback, this); - } - - if (! isCurrentlyModal()) - enterModalState (true); - - return ModalComponentManager::getInstance()->runEventLoopForCurrentComponent(); -} -#endif - -//============================================================================== -void Component::enterModalState (const bool shouldTakeKeyboardFocus, - ModalComponentManager::Callback* callback, - const bool deleteWhenDismissed) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED - - // Check for an attempt to make a component modal when it already is! - // This can cause nasty problems.. - jassert (! flags.currentlyModalFlag); - - if (! isCurrentlyModal()) - { - ModalComponentManager* const mcm = ModalComponentManager::getInstance(); - mcm->startModal (this, deleteWhenDismissed); - mcm->attachCallback (this, callback); - - flags.currentlyModalFlag = true; - setVisible (true); - - if (shouldTakeKeyboardFocus) - grabKeyboardFocus(); - } -} - -void Component::exitModalState (const int returnValue) -{ - if (flags.currentlyModalFlag) - { - if (MessageManager::getInstance()->isThisTheMessageThread()) - { - ModalComponentManager::getInstance()->endModal (this, returnValue); - flags.currentlyModalFlag = false; - - ModalComponentManager::getInstance()->bringModalComponentsToFront(); - } - else - { - class ExitModalStateMessage : public CallbackMessage - { - public: - ExitModalStateMessage (Component* const c, const int res) - : target (c), result (res) {} - - void messageCallback() override - { - if (target.get() != nullptr) // (get() required for VS2003 bug) - target->exitModalState (result); - } - - private: - WeakReference target; - int result; - }; - - (new ExitModalStateMessage (this, returnValue))->post(); - } - } -} - -bool Component::isCurrentlyModal() const noexcept -{ - return flags.currentlyModalFlag - && getCurrentlyModalComponent() == this; -} - -bool Component::isCurrentlyBlockedByAnotherModalComponent() const -{ - Component* const mc = getCurrentlyModalComponent(); - - return ! (mc == nullptr || mc == this || mc->isParentOf (this) - || mc->canModalEventBeSentToComponent (this)); -} - -int JUCE_CALLTYPE Component::getNumCurrentlyModalComponents() noexcept -{ - return ModalComponentManager::getInstance()->getNumModalComponents(); -} - -Component* JUCE_CALLTYPE Component::getCurrentlyModalComponent (int index) noexcept -{ - return ModalComponentManager::getInstance()->getModalComponent (index); -} - -//============================================================================== -void Component::setBroughtToFrontOnMouseClick (const bool shouldBeBroughtToFront) noexcept -{ - flags.bringToFrontOnClickFlag = shouldBeBroughtToFront; -} - -bool Component::isBroughtToFrontOnMouseClick() const noexcept -{ - return flags.bringToFrontOnClickFlag; -} - -//============================================================================== -void Component::setMouseCursor (const MouseCursor& newCursor) -{ - if (cursor != newCursor) - { - cursor = newCursor; - - if (flags.visibleFlag) - updateMouseCursor(); - } -} - -MouseCursor Component::getMouseCursor() -{ - return cursor; -} - -void Component::updateMouseCursor() const -{ - Desktop::getInstance().getMainMouseSource().forceMouseCursorUpdate(); -} - -//============================================================================== -void Component::setRepaintsOnMouseActivity (const bool shouldRepaint) noexcept -{ - flags.repaintOnMouseActivityFlag = shouldRepaint; -} - -//============================================================================== -void Component::setAlpha (const float newAlpha) -{ - const uint8 newIntAlpha = (uint8) (255 - jlimit (0, 255, roundToInt (newAlpha * 255.0))); - - if (componentTransparency != newIntAlpha) - { - componentTransparency = newIntAlpha; - - if (flags.hasHeavyweightPeerFlag) - { - if (ComponentPeer* const peer = getPeer()) - peer->setAlpha (newAlpha); - } - else - { - repaint(); - } - } -} - -float Component::getAlpha() const -{ - return (255 - componentTransparency) / 255.0f; -} - -//============================================================================== -void Component::repaint() -{ - internalRepaintUnchecked (getLocalBounds(), true); -} - -void Component::repaint (const int x, const int y, const int w, const int h) -{ - internalRepaint (Rectangle (x, y, w, h)); -} - -void Component::repaint (const Rectangle& area) -{ - internalRepaint (area); -} - -void Component::repaintParent() -{ - if (parentComponent != nullptr) - parentComponent->internalRepaint (ComponentHelpers::convertToParentSpace (*this, getLocalBounds())); -} - -void Component::internalRepaint (const Rectangle& area) -{ - const Rectangle r (area.getIntersection (getLocalBounds())); - - if (! r.isEmpty()) - internalRepaintUnchecked (r, false); -} - -void Component::internalRepaintUnchecked (const Rectangle& area, const bool isEntireComponent) -{ - if (flags.visibleFlag) - { - if (cachedImage != nullptr) - if (! (isEntireComponent ? cachedImage->invalidateAll() - : cachedImage->invalidate (area))) - return; - - if (flags.hasHeavyweightPeerFlag) - { - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED - - if (ComponentPeer* const peer = getPeer()) - { - // Tweak the scaling so that the component's integer size exactly aligns with the peer's scaled size - const Rectangle peerBounds (peer->getBounds()); - const Rectangle scaled (area * Point (peerBounds.getWidth() / (float) getWidth(), - peerBounds.getHeight() / (float) getHeight())); - - peer->repaint (affineTransform != nullptr ? scaled.transformedBy (*affineTransform) : scaled); - } - } - else - { - if (parentComponent != nullptr) - parentComponent->internalRepaint (ComponentHelpers::convertToParentSpace (*this, area)); - } - } -} - -//============================================================================== -void Component::paint (Graphics&) -{ - // if your component is marked as opaque, you must implement a paint - // method and ensure that its entire area is completely painted. - jassert (getBounds().isEmpty() || ! isOpaque()); -} - -void Component::paintOverChildren (Graphics&) -{ - // all painting is done in the subclasses -} - -//============================================================================== -void Component::paintWithinParentContext (Graphics& g) -{ - g.setOrigin (getPosition()); - - if (cachedImage != nullptr) - cachedImage->paint (g); - else - paintEntireComponent (g, false); -} - -void Component::paintComponentAndChildren (Graphics& g) -{ - const Rectangle clipBounds (g.getClipBounds()); - - if (flags.dontClipGraphicsFlag) - { - paint (g); - } - else - { - g.saveState(); - - if (ComponentHelpers::clipObscuredRegions (*this, g, clipBounds, Point()) || ! g.isClipEmpty()) - paint (g); - - g.restoreState(); - } - - for (int i = 0; i < childComponentList.size(); ++i) - { - Component& child = *childComponentList.getUnchecked (i); - - if (child.isVisible()) - { - if (child.affineTransform != nullptr) - { - g.saveState(); - g.addTransform (*child.affineTransform); - - if ((child.flags.dontClipGraphicsFlag && ! g.isClipEmpty()) || g.reduceClipRegion (child.getBounds())) - child.paintWithinParentContext (g); - - g.restoreState(); - } - else if (clipBounds.intersects (child.getBounds())) - { - g.saveState(); - - if (child.flags.dontClipGraphicsFlag) - { - child.paintWithinParentContext (g); - } - else if (g.reduceClipRegion (child.getBounds())) - { - bool nothingClipped = true; - - for (int j = i + 1; j < childComponentList.size(); ++j) - { - const Component& sibling = *childComponentList.getUnchecked (j); - - if (sibling.flags.opaqueFlag && sibling.isVisible() && sibling.affineTransform == nullptr) - { - nothingClipped = false; - g.excludeClipRegion (sibling.getBounds()); - } - } - - if (nothingClipped || ! g.isClipEmpty()) - child.paintWithinParentContext (g); - } - - g.restoreState(); - } - } - } - - g.saveState(); - paintOverChildren (g); - g.restoreState(); -} - -void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) -{ - // If sizing a top-level-window and the OS paint message is delivered synchronously - // before resized() is called, then we'll invoke the callback here, to make sure - // the components inside have had a chance to sort their sizes out.. - #if JUCE_DEBUG - if (! flags.isInsidePaintCall) // (avoids an assertion in plugins hosted in WaveLab) - #endif - sendMovedResizedMessagesIfPending(); - - #if JUCE_DEBUG - flags.isInsidePaintCall = true; - #endif - - if (effect != nullptr) - { - const float scale = g.getInternalContext().getPhysicalPixelScaleFactor(); - - const Rectangle scaledBounds (getLocalBounds() * scale); - - Image effectImage (flags.opaqueFlag ? Image::RGB : Image::ARGB, - scaledBounds.getWidth(), scaledBounds.getHeight(), ! flags.opaqueFlag); - { - Graphics g2 (effectImage); - g2.addTransform (AffineTransform::scale (scaledBounds.getWidth() / (float) getWidth(), - scaledBounds.getHeight() / (float) getHeight())); - paintComponentAndChildren (g2); - } - - g.saveState(); - g.addTransform (AffineTransform::scale (1.0f / scale)); - effect->applyEffect (effectImage, g, scale, ignoreAlphaLevel ? 1.0f : getAlpha()); - g.restoreState(); - } - else if (componentTransparency > 0 && ! ignoreAlphaLevel) - { - if (componentTransparency < 255) - { - g.beginTransparencyLayer (getAlpha()); - paintComponentAndChildren (g); - g.endTransparencyLayer(); - } - } - else - { - paintComponentAndChildren (g); - } - - #if JUCE_DEBUG - flags.isInsidePaintCall = false; - #endif -} - -void Component::setPaintingIsUnclipped (const bool shouldPaintWithoutClipping) noexcept -{ - flags.dontClipGraphicsFlag = shouldPaintWithoutClipping; -} - -//============================================================================== -Image Component::createComponentSnapshot (const Rectangle& areaToGrab, - bool clipImageToComponentBounds, float scaleFactor) -{ - Rectangle r (areaToGrab); - - if (clipImageToComponentBounds) - r = r.getIntersection (getLocalBounds()); - - if (r.isEmpty()) - return Image(); - - const int w = roundToInt (scaleFactor * r.getWidth()); - const int h = roundToInt (scaleFactor * r.getHeight()); - - Image image (flags.opaqueFlag ? Image::RGB : Image::ARGB, w, h, true); - - Graphics g (image); - - if (w != getWidth() || h != getHeight()) - g.addTransform (AffineTransform::scale (w / (float) r.getWidth(), - h / (float) r.getHeight())); - g.setOrigin (-r.getPosition()); - - paintEntireComponent (g, true); - - return image; -} - -void Component::setComponentEffect (ImageEffectFilter* const newEffect) -{ - if (effect != newEffect) - { - effect = newEffect; - repaint(); - } -} - -//============================================================================== -LookAndFeel& Component::getLookAndFeel() const noexcept -{ - for (const Component* c = this; c != nullptr; c = c->parentComponent) - if (c->lookAndFeel != nullptr) - return *(c->lookAndFeel); - - return LookAndFeel::getDefaultLookAndFeel(); -} - -void Component::setLookAndFeel (LookAndFeel* const newLookAndFeel) -{ - if (lookAndFeel != newLookAndFeel) - { - lookAndFeel = newLookAndFeel; - sendLookAndFeelChange(); - } -} - -void Component::lookAndFeelChanged() {} -void Component::colourChanged() {} - -void Component::sendLookAndFeelChange() -{ - const WeakReference safePointer (this); - repaint(); - lookAndFeelChanged(); - - if (safePointer != nullptr) - { - colourChanged(); - - if (safePointer != nullptr) - { - for (int i = childComponentList.size(); --i >= 0;) - { - childComponentList.getUnchecked (i)->sendLookAndFeelChange(); - - if (safePointer == nullptr) - return; - - i = jmin (i, childComponentList.size()); - } - } - } -} - -Colour Component::findColour (const int colourId, const bool inheritFromParent) const -{ - if (const var* const v = properties.getVarPointer (ComponentHelpers::getColourPropertyId (colourId))) - return Colour ((uint32) static_cast (*v)); - - if (inheritFromParent && parentComponent != nullptr - && (lookAndFeel == nullptr || ! lookAndFeel->isColourSpecified (colourId))) - return parentComponent->findColour (colourId, true); - - return getLookAndFeel().findColour (colourId); -} - -bool Component::isColourSpecified (const int colourId) const -{ - return properties.contains (ComponentHelpers::getColourPropertyId (colourId)); -} - -void Component::removeColour (const int colourId) -{ - if (properties.remove (ComponentHelpers::getColourPropertyId (colourId))) - colourChanged(); -} - -void Component::setColour (const int colourId, Colour colour) -{ - if (properties.set (ComponentHelpers::getColourPropertyId (colourId), (int) colour.getARGB())) - colourChanged(); -} - -void Component::copyAllExplicitColoursTo (Component& target) const -{ - bool changed = false; - - for (int i = properties.size(); --i >= 0;) - { - const Identifier name (properties.getName(i)); - - if (name.toString().startsWith ("jcclr_")) - if (target.properties.set (name, properties [name])) - changed = true; - } - - if (changed) - target.colourChanged(); -} - -//============================================================================== -MarkerList* Component::getMarkers (bool /*xAxis*/) -{ - return nullptr; -} - -//============================================================================== -Component::Positioner::Positioner (Component& c) noexcept - : component (c) -{ -} - -Component::Positioner* Component::getPositioner() const noexcept -{ - return positioner; -} - -void Component::setPositioner (Positioner* newPositioner) -{ - // You can only assign a positioner to the component that it was created for! - jassert (newPositioner == nullptr || this == &(newPositioner->getComponent())); - positioner = newPositioner; -} - -//============================================================================== -Rectangle Component::getLocalBounds() const noexcept -{ - return bounds.withZeroOrigin(); -} - -Rectangle Component::getBoundsInParent() const noexcept -{ - return affineTransform == nullptr ? bounds - : bounds.transformedBy (*affineTransform); -} - -//============================================================================== -void Component::mouseEnter (const MouseEvent&) {} -void Component::mouseExit (const MouseEvent&) {} -void Component::mouseDown (const MouseEvent&) {} -void Component::mouseUp (const MouseEvent&) {} -void Component::mouseDrag (const MouseEvent&) {} -void Component::mouseMove (const MouseEvent&) {} -void Component::mouseDoubleClick (const MouseEvent&) {} - -void Component::mouseWheelMove (const MouseEvent& e, const MouseWheelDetails& wheel) -{ - // the base class just passes this event up to its parent.. - if (parentComponent != nullptr) - parentComponent->mouseWheelMove (e.getEventRelativeTo (parentComponent), wheel); -} - -void Component::mouseMagnify (const MouseEvent& e, float magnifyAmount) -{ - // the base class just passes this event up to its parent.. - if (parentComponent != nullptr) - parentComponent->mouseMagnify (e.getEventRelativeTo (parentComponent), magnifyAmount); -} - -//============================================================================== -void Component::resized() {} -void Component::moved() {} -void Component::childBoundsChanged (Component*) {} -void Component::parentSizeChanged() {} - -void Component::addComponentListener (ComponentListener* const newListener) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - #if JUCE_DEBUG || JUCE_LOG_ASSERTIONS - if (getParentComponent() != nullptr) - ASSERT_MESSAGE_MANAGER_IS_LOCKED; - #endif - - componentListeners.add (newListener); -} - -void Component::removeComponentListener (ComponentListener* const listenerToRemove) -{ - componentListeners.remove (listenerToRemove); -} - -//============================================================================== -void Component::inputAttemptWhenModal() -{ - ModalComponentManager::getInstance()->bringModalComponentsToFront(); - getLookAndFeel().playAlertSound(); -} - -bool Component::canModalEventBeSentToComponent (const Component*) -{ - return false; -} - -void Component::internalModalInputAttempt() -{ - if (Component* const current = getCurrentlyModalComponent()) - current->inputAttemptWhenModal(); -} - -//============================================================================== -void Component::postCommandMessage (const int commandId) -{ - struct CustomCommandMessage : public CallbackMessage - { - CustomCommandMessage (Component* const c, const int command) - : target (c), commandId (command) {} - - void messageCallback() override - { - if (Component* c = target.get()) - c->handleCommandMessage (commandId); - } - - private: - WeakReference target; - int commandId; - }; - - (new CustomCommandMessage (this, commandId))->post(); -} - -void Component::handleCommandMessage (int) -{ - // used by subclasses -} - -//============================================================================== -void Component::addMouseListener (MouseListener* const newListener, - const bool wantsEventsForAllNestedChildComponents) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED - - // If you register a component as a mouselistener for itself, it'll receive all the events - // twice - once via the direct callback that all components get anyway, and then again as a listener! - jassert ((newListener != this) || wantsEventsForAllNestedChildComponents); - - if (mouseListeners == nullptr) - mouseListeners = new MouseListenerList(); - - mouseListeners->addListener (newListener, wantsEventsForAllNestedChildComponents); -} - -void Component::removeMouseListener (MouseListener* const listenerToRemove) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED - - if (mouseListeners != nullptr) - mouseListeners->removeListener (listenerToRemove); -} - -//============================================================================== -void Component::internalMouseEnter (MouseInputSource source, Point relativePos, Time time) -{ - if (isCurrentlyBlockedByAnotherModalComponent()) - { - // if something else is modal, always just show a normal mouse cursor - source.showMouseCursor (MouseCursor::NormalCursor); - return; - } - - if (flags.repaintOnMouseActivityFlag) - repaint(); - - BailOutChecker checker (this); - - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), - this, this, time, relativePos, time, 0, false); - mouseEnter (me); - - if (checker.shouldBailOut()) - return; - - Desktop::getInstance().getMouseListeners().callChecked (checker, &MouseListener::mouseEnter, me); - - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseEnter, me); -} - -void Component::internalMouseExit (MouseInputSource source, Point relativePos, Time time) -{ - if (flags.repaintOnMouseActivityFlag) - repaint(); - - BailOutChecker checker (this); - - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), - this, this, time, relativePos, time, 0, false); - - mouseExit (me); - - if (checker.shouldBailOut()) - return; - - Desktop::getInstance().getMouseListeners().callChecked (checker, &MouseListener::mouseExit, me); - - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseExit, me); -} - -void Component::internalMouseDown (MouseInputSource source, Point relativePos, Time time) -{ - Desktop& desktop = Desktop::getInstance(); - BailOutChecker checker (this); - - if (isCurrentlyBlockedByAnotherModalComponent()) - { - flags.mouseDownWasBlocked = true; - internalModalInputAttempt(); - - if (checker.shouldBailOut()) - return; - - // If processing the input attempt has exited the modal loop, we'll allow the event - // to be delivered.. - if (isCurrentlyBlockedByAnotherModalComponent()) - { - // allow blocked mouse-events to go to global listeners.. - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), - this, this, time, relativePos, time, - source.getNumberOfMultipleClicks(), false); - - desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseDown, me); - return; - } - } - - flags.mouseDownWasBlocked = false; - - for (Component* c = this; c != nullptr; c = c->parentComponent) - { - if (c->isBroughtToFrontOnMouseClick()) - { - c->toFront (true); - - if (checker.shouldBailOut()) - return; - } - } - - if (! flags.dontFocusOnMouseClickFlag) - { - grabFocusInternal (focusChangedByMouseClick, true); - - if (checker.shouldBailOut()) - return; - } - - if (flags.repaintOnMouseActivityFlag) - repaint(); - - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), - this, this, time, relativePos, time, - source.getNumberOfMultipleClicks(), false); - mouseDown (me); - - if (checker.shouldBailOut()) - return; - - desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseDown, me); - - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDown, me); -} - -void Component::internalMouseUp (MouseInputSource source, Point relativePos, - Time time, const ModifierKeys oldModifiers) -{ - if (flags.mouseDownWasBlocked && isCurrentlyBlockedByAnotherModalComponent()) - return; - - BailOutChecker checker (this); - - if (flags.repaintOnMouseActivityFlag) - repaint(); - - const MouseEvent me (source, relativePos, - oldModifiers, this, this, time, - getLocalPoint (nullptr, source.getLastMouseDownPosition()), - source.getLastMouseDownTime(), - source.getNumberOfMultipleClicks(), - source.hasMouseMovedSignificantlySincePressed()); - mouseUp (me); - - if (checker.shouldBailOut()) - return; - - Desktop& desktop = Desktop::getInstance(); - desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseUp, me); - - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseUp, me); - - if (checker.shouldBailOut()) - return; - - // check for double-click - if (me.getNumberOfClicks() >= 2) - { - mouseDoubleClick (me); - - if (checker.shouldBailOut()) - return; - - desktop.mouseListeners.callChecked (checker, &MouseListener::mouseDoubleClick, me); - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDoubleClick, me); - } -} - -void Component::internalMouseDrag (MouseInputSource source, Point relativePos, Time time) -{ - if (! isCurrentlyBlockedByAnotherModalComponent()) - { - BailOutChecker checker (this); - - const MouseEvent me (source, relativePos, - source.getCurrentModifiers(), this, this, time, - getLocalPoint (nullptr, source.getLastMouseDownPosition()), - source.getLastMouseDownTime(), - source.getNumberOfMultipleClicks(), - source.hasMouseMovedSignificantlySincePressed()); - mouseDrag (me); - - if (checker.shouldBailOut()) - return; - - Desktop::getInstance().getMouseListeners().callChecked (checker, &MouseListener::mouseDrag, me); - - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseDrag, me); - } -} - -void Component::internalMouseMove (MouseInputSource source, Point relativePos, Time time) -{ - Desktop& desktop = Desktop::getInstance(); - - if (isCurrentlyBlockedByAnotherModalComponent()) - { - // allow blocked mouse-events to go to global listeners.. - desktop.sendMouseMove(); - } - else - { - BailOutChecker checker (this); - - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), - this, this, time, relativePos, time, 0, false); - mouseMove (me); - - if (checker.shouldBailOut()) - return; - - desktop.getMouseListeners().callChecked (checker, &MouseListener::mouseMove, me); - - MouseListenerList::sendMouseEvent (*this, checker, &MouseListener::mouseMove, me); - } -} - -void Component::internalMouseWheel (MouseInputSource source, Point relativePos, - Time time, const MouseWheelDetails& wheel) -{ - Desktop& desktop = Desktop::getInstance(); - BailOutChecker checker (this); - - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), - this, this, time, relativePos, time, 0, false); - - if (isCurrentlyBlockedByAnotherModalComponent()) - { - // allow blocked mouse-events to go to global listeners.. - desktop.mouseListeners.callChecked (checker, &MouseListener::mouseWheelMove, me, wheel); - } - else - { - mouseWheelMove (me, wheel); - - if (checker.shouldBailOut()) - return; - - desktop.mouseListeners.callChecked (checker, &MouseListener::mouseWheelMove, me, wheel); - - if (! checker.shouldBailOut()) - MouseListenerList::sendWheelEvent (*this, checker, me, wheel); - } -} - -void Component::internalMagnifyGesture (MouseInputSource source, Point relativePos, - Time time, float amount) -{ - if (! isCurrentlyBlockedByAnotherModalComponent()) - { - const MouseEvent me (source, relativePos, source.getCurrentModifiers(), - this, this, time, relativePos, time, 0, false); - - mouseMagnify (me, amount); - } -} - -void Component::sendFakeMouseMove() const -{ - MouseInputSource mainMouse = Desktop::getInstance().getMainMouseSource(); - - if (! mainMouse.isDragging()) - mainMouse.triggerFakeMove(); -} - -void JUCE_CALLTYPE Component::beginDragAutoRepeat (const int interval) -{ - Desktop::getInstance().beginDragAutoRepeat (interval); -} - -//============================================================================== -void Component::broughtToFront() -{ -} - -void Component::internalBroughtToFront() -{ - if (flags.hasHeavyweightPeerFlag) - Desktop::getInstance().componentBroughtToFront (this); - - BailOutChecker checker (this); - broughtToFront(); - - if (checker.shouldBailOut()) - return; - - componentListeners.callChecked (checker, &ComponentListener::componentBroughtToFront, *this); - - if (checker.shouldBailOut()) - return; - - // When brought to the front and there's a modal component blocking this one, - // we need to bring the modal one to the front instead.. - if (Component* const cm = getCurrentlyModalComponent()) - if (cm->getTopLevelComponent() != getTopLevelComponent()) - ModalComponentManager::getInstance()->bringModalComponentsToFront (false); // very important that this is false, otherwise in Windows, - // non-front components can't get focus when another modal comp is - // active, and therefore can't receive mouse-clicks -} - -//============================================================================== -void Component::focusGained (FocusChangeType) {} -void Component::focusLost (FocusChangeType) {} -void Component::focusOfChildComponentChanged (FocusChangeType) {} - -void Component::internalFocusGain (const FocusChangeType cause) -{ - internalFocusGain (cause, WeakReference (this)); -} - -void Component::internalFocusGain (const FocusChangeType cause, const WeakReference& safePointer) -{ - focusGained (cause); - - if (safePointer != nullptr) - internalChildFocusChange (cause, safePointer); -} - -void Component::internalFocusLoss (const FocusChangeType cause) -{ - const WeakReference safePointer (this); - - focusLost (focusChangedDirectly); - - if (safePointer != nullptr) - internalChildFocusChange (cause, safePointer); -} - -void Component::internalChildFocusChange (FocusChangeType cause, const WeakReference& safePointer) -{ - const bool childIsNowFocused = hasKeyboardFocus (true); - - if (flags.childCompFocusedFlag != childIsNowFocused) - { - flags.childCompFocusedFlag = childIsNowFocused; - - focusOfChildComponentChanged (cause); - - if (safePointer == nullptr) - return; - } - - if (parentComponent != nullptr) - parentComponent->internalChildFocusChange (cause, WeakReference (parentComponent)); -} - -void Component::setWantsKeyboardFocus (const bool wantsFocus) noexcept -{ - flags.wantsFocusFlag = wantsFocus; -} - -void Component::setMouseClickGrabsKeyboardFocus (const bool shouldGrabFocus) -{ - flags.dontFocusOnMouseClickFlag = ! shouldGrabFocus; -} - -bool Component::getMouseClickGrabsKeyboardFocus() const noexcept -{ - return ! flags.dontFocusOnMouseClickFlag; -} - -bool Component::getWantsKeyboardFocus() const noexcept -{ - return flags.wantsFocusFlag && ! flags.isDisabledFlag; -} - -void Component::setFocusContainer (const bool shouldBeFocusContainer) noexcept -{ - flags.isFocusContainerFlag = shouldBeFocusContainer; -} - -bool Component::isFocusContainer() const noexcept -{ - return flags.isFocusContainerFlag; -} - -static const Identifier juce_explicitFocusOrderId ("_jexfo"); - -int Component::getExplicitFocusOrder() const -{ - return properties [juce_explicitFocusOrderId]; -} - -void Component::setExplicitFocusOrder (const int newFocusOrderIndex) -{ - properties.set (juce_explicitFocusOrderId, newFocusOrderIndex); -} - -KeyboardFocusTraverser* Component::createFocusTraverser() -{ - if (flags.isFocusContainerFlag || parentComponent == nullptr) - return new KeyboardFocusTraverser(); - - return parentComponent->createFocusTraverser(); -} - -void Component::takeKeyboardFocus (const FocusChangeType cause) -{ - // give the focus to this component - if (currentlyFocusedComponent != this) - { - // get the focus onto our desktop window - if (ComponentPeer* const peer = getPeer()) - { - const WeakReference safePointer (this); - peer->grabFocus(); - - if (peer->isFocused() && currentlyFocusedComponent != this) - { - WeakReference componentLosingFocus (currentlyFocusedComponent); - currentlyFocusedComponent = this; - - Desktop::getInstance().triggerFocusCallback(); - - // call this after setting currentlyFocusedComponent so that the one that's - // losing it has a chance to see where focus is going - if (componentLosingFocus != nullptr) - componentLosingFocus->internalFocusLoss (cause); - - if (currentlyFocusedComponent == this) - internalFocusGain (cause, safePointer); - } - } - } -} - -void Component::grabFocusInternal (const FocusChangeType cause, const bool canTryParent) -{ - if (isShowing()) - { - if (flags.wantsFocusFlag && (isEnabled() || parentComponent == nullptr)) - { - takeKeyboardFocus (cause); - } - else - { - if (isParentOf (currentlyFocusedComponent) - && currentlyFocusedComponent->isShowing()) - { - // do nothing if the focused component is actually a child of ours.. - } - else - { - // find the default child component.. - ScopedPointer traverser (createFocusTraverser()); - - if (traverser != nullptr) - { - Component* const defaultComp = traverser->getDefaultComponent (this); - traverser = nullptr; - - if (defaultComp != nullptr) - { - defaultComp->grabFocusInternal (cause, false); - return; - } - } - - if (canTryParent && parentComponent != nullptr) - { - // if no children want it and we're allowed to try our parent comp, - // then pass up to parent, which will try our siblings. - parentComponent->grabFocusInternal (cause, true); - } - } - } - } -} - -void Component::grabKeyboardFocus() -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED - - grabFocusInternal (focusChangedDirectly, true); -} - -void Component::moveKeyboardFocusToSibling (const bool moveToNext) -{ - // if component methods are being called from threads other than the message - // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. - ASSERT_MESSAGE_MANAGER_IS_LOCKED - - if (parentComponent != nullptr) - { - ScopedPointer traverser (createFocusTraverser()); - - if (traverser != nullptr) - { - Component* const nextComp = moveToNext ? traverser->getNextComponent (this) - : traverser->getPreviousComponent (this); - traverser = nullptr; - - if (nextComp != nullptr) - { - if (nextComp->isCurrentlyBlockedByAnotherModalComponent()) - { - const WeakReference nextCompPointer (nextComp); - internalModalInputAttempt(); - - if (nextCompPointer == nullptr || nextComp->isCurrentlyBlockedByAnotherModalComponent()) - return; - } - - nextComp->grabFocusInternal (focusChangedByTabKey, true); - return; - } - } - - parentComponent->moveKeyboardFocusToSibling (moveToNext); - } -} - -bool Component::hasKeyboardFocus (const bool trueIfChildIsFocused) const -{ - return (currentlyFocusedComponent == this) - || (trueIfChildIsFocused && isParentOf (currentlyFocusedComponent)); -} - -Component* JUCE_CALLTYPE Component::getCurrentlyFocusedComponent() noexcept -{ - return currentlyFocusedComponent; -} - -void JUCE_CALLTYPE Component::unfocusAllComponents() -{ - if (Component* c = getCurrentlyFocusedComponent()) - c->giveAwayFocus (true); -} - -void Component::giveAwayFocus (const bool sendFocusLossEvent) -{ - Component* const componentLosingFocus = currentlyFocusedComponent; - currentlyFocusedComponent = nullptr; - - if (sendFocusLossEvent && componentLosingFocus != nullptr) - componentLosingFocus->internalFocusLoss (focusChangedDirectly); - - Desktop::getInstance().triggerFocusCallback(); -} - -//============================================================================== -bool Component::isEnabled() const noexcept -{ - return (! flags.isDisabledFlag) - && (parentComponent == nullptr || parentComponent->isEnabled()); -} - -void Component::setEnabled (const bool shouldBeEnabled) -{ - if (flags.isDisabledFlag == shouldBeEnabled) - { - flags.isDisabledFlag = ! shouldBeEnabled; - - // if any parent components are disabled, setting our flag won't make a difference, - // so no need to send a change message - if (parentComponent == nullptr || parentComponent->isEnabled()) - sendEnablementChangeMessage(); - } -} - -void Component::enablementChanged() {} - -void Component::sendEnablementChangeMessage() -{ - const WeakReference safePointer (this); - - enablementChanged(); - - if (safePointer == nullptr) - return; - - for (int i = getNumChildComponents(); --i >= 0;) - { - if (Component* const c = getChildComponent (i)) - { - c->sendEnablementChangeMessage(); - - if (safePointer == nullptr) - return; - } - } -} - -//============================================================================== -bool Component::isMouseOver (const bool includeChildren) const -{ - const Array& mouseSources = Desktop::getInstance().getMouseSources(); - - for (MouseInputSource* mi = mouseSources.begin(), * const e = mouseSources.end(); mi != e; ++mi) - { - Component* const c = mi->getComponentUnderMouse(); - - if ((c == this || (includeChildren && isParentOf (c))) - && c->reallyContains (c->getLocalPoint (nullptr, mi->getScreenPosition()).roundToInt(), false) - && (mi->isMouse() || mi->isDragging())) - return true; - } - - return false; -} - -bool Component::isMouseButtonDown() const -{ - const Array& mouseSources = Desktop::getInstance().getMouseSources(); - - for (MouseInputSource* mi = mouseSources.begin(), * const e = mouseSources.end(); mi != e; ++mi) - if (mi->isDragging() && mi->getComponentUnderMouse() == this) - return true; - - return false; -} - -bool Component::isMouseOverOrDragging() const -{ - const Array& mouseSources = Desktop::getInstance().getMouseSources(); - - for (MouseInputSource* mi = mouseSources.begin(), * const e = mouseSources.end(); mi != e; ++mi) - if (mi->getComponentUnderMouse() == this - && (mi->isMouse() || mi->isDragging())) - return true; - - return false; -} - -bool JUCE_CALLTYPE Component::isMouseButtonDownAnywhere() noexcept -{ - return ModifierKeys::getCurrentModifiers().isAnyMouseButtonDown(); -} - -Point Component::getMouseXYRelative() const -{ - return getLocalPoint (nullptr, Desktop::getMousePosition()); -} - -//============================================================================== -void Component::addKeyListener (KeyListener* const newListener) -{ - if (keyListeners == nullptr) - keyListeners = new Array(); - - keyListeners->addIfNotAlreadyThere (newListener); -} - -void Component::removeKeyListener (KeyListener* const listenerToRemove) -{ - if (keyListeners != nullptr) - keyListeners->removeFirstMatchingValue (listenerToRemove); -} - -bool Component::keyPressed (const KeyPress&) { return false; } -bool Component::keyStateChanged (const bool /*isKeyDown*/) { return false; } - -void Component::modifierKeysChanged (const ModifierKeys& modifiers) -{ - if (parentComponent != nullptr) - parentComponent->modifierKeysChanged (modifiers); -} - -void Component::internalModifierKeysChanged() -{ - sendFakeMouseMove(); - modifierKeysChanged (ModifierKeys::getCurrentModifiers()); -} - -//============================================================================== -Component::BailOutChecker::BailOutChecker (Component* const component) - : safePointer (component) -{ - jassert (component != nullptr); -} - -bool Component::BailOutChecker::shouldBailOut() const noexcept -{ - return safePointer == nullptr; -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h deleted file mode 100755 index 8004fd6..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Component.h +++ /dev/null @@ -1,2384 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_COMPONENT_H_INCLUDED -#define JUCE_COMPONENT_H_INCLUDED - - -//============================================================================== -/** - The base class for all JUCE user-interface objects. -*/ -class JUCE_API Component : public MouseListener -{ -public: - //============================================================================== - /** Creates a component. - - To get it to actually appear, you'll also need to: - - Either add it to a parent component or use the addToDesktop() method to - make it a desktop window - - Set its size and position to something sensible - - Use setVisible() to make it visible - - And for it to serve any useful purpose, you'll need to write a - subclass of Component or use one of the other types of component from - the library. - */ - Component() noexcept; - - /** Destructor. - - Note that when a component is deleted, any child components it contains are NOT - automatically deleted. It's your responsibilty to manage their lifespan - you - may want to use helper methods like deleteAllChildren(), or less haphazard - approaches like using ScopedPointers or normal object aggregation to manage them. - - If the component being deleted is currently the child of another one, then during - deletion, it will be removed from its parent, and the parent will receive a childrenChanged() - callback. Any ComponentListener objects that have registered with it will also have their - ComponentListener::componentBeingDeleted() methods called. - */ - virtual ~Component(); - - //============================================================================== - /** Creates a component, setting its name at the same time. - @see getName, setName - */ - explicit Component (const String& componentName) noexcept; - - /** Returns the name of this component. - @see setName - */ - const String& getName() const noexcept { return componentName; } - - /** Sets the name of this component. - - When the name changes, all registered ComponentListeners will receive a - ComponentListener::componentNameChanged() callback. - - @see getName - */ - virtual void setName (const String& newName); - - /** Returns the ID string that was set by setComponentID(). - @see setComponentID, findChildWithID - */ - const String& getComponentID() const noexcept { return componentID; } - - /** Sets the component's ID string. - You can retrieve the ID using getComponentID(). - @see getComponentID, findChildWithID - */ - void setComponentID (const String& newID); - - //============================================================================== - /** Makes the component visible or invisible. - - This method will show or hide the component. - Note that components default to being non-visible when first created. - Also note that visible components won't be seen unless all their parent components - are also visible. - - This method will call visibilityChanged() and also componentVisibilityChanged() - for any component listeners that are interested in this component. - - @param shouldBeVisible whether to show or hide the component - @see isVisible, isShowing, visibilityChanged, ComponentListener::componentVisibilityChanged - */ - virtual void setVisible (bool shouldBeVisible); - - /** Tests whether the component is visible or not. - - this doesn't necessarily tell you whether this comp is actually on the screen - because this depends on whether all the parent components are also visible - use - isShowing() to find this out. - - @see isShowing, setVisible - */ - bool isVisible() const noexcept { return flags.visibleFlag; } - - /** Called when this component's visibility changes. - @see setVisible, isVisible - */ - virtual void visibilityChanged(); - - /** Tests whether this component and all its parents are visible. - - @returns true only if this component and all its parents are visible. - @see isVisible - */ - bool isShowing() const; - - //============================================================================== - /** Makes this component appear as a window on the desktop. - - Note that before calling this, you should make sure that the component's opacity is - set correctly using setOpaque(). If the component is non-opaque, the windowing - system will try to create a special transparent window for it, which will generally take - a lot more CPU to operate (and might not even be possible on some platforms). - - If the component is inside a parent component at the time this method is called, it - will be first be removed from that parent. Likewise if a component on the desktop - is subsequently added to another component, it'll be removed from the desktop. - - @param windowStyleFlags a combination of the flags specified in the - ComponentPeer::StyleFlags enum, which define the - window's characteristics. - @param nativeWindowToAttachTo this allows an OS object to be passed-in as the window - in which the juce component should place itself. On Windows, - this would be a HWND, a HIViewRef on the Mac. Not necessarily - supported on all platforms, and best left as 0 unless you know - what you're doing - @see removeFromDesktop, isOnDesktop, userTriedToCloseWindow, - getPeer, ComponentPeer::setMinimised, ComponentPeer::StyleFlags, - ComponentPeer::getStyleFlags, ComponentPeer::setFullScreen - */ - virtual void addToDesktop (int windowStyleFlags, - void* nativeWindowToAttachTo = nullptr); - - /** If the component is currently showing on the desktop, this will hide it. - - You can also use setVisible() to hide a desktop window temporarily, but - removeFromDesktop() will free any system resources that are being used up. - - @see addToDesktop, isOnDesktop - */ - void removeFromDesktop(); - - /** Returns true if this component is currently showing on the desktop. - @see addToDesktop, removeFromDesktop - */ - bool isOnDesktop() const noexcept; - - /** Returns the heavyweight window that contains this component. - - If this component is itself on the desktop, this will return the window - object that it is using. Otherwise, it will return the window of - its top-level parent component. - - This may return nullptr if there isn't a desktop component. - - @see addToDesktop, isOnDesktop - */ - ComponentPeer* getPeer() const; - - /** For components on the desktop, this is called if the system wants to close the window. - - This is a signal that either the user or the system wants the window to close. The - default implementation of this method will trigger an assertion to warn you that your - component should do something about it, but you can override this to ignore the event - if you want. - */ - virtual void userTriedToCloseWindow(); - - /** Called for a desktop component which has just been minimised or un-minimised. - This will only be called for components on the desktop. - @see getPeer, ComponentPeer::setMinimised, ComponentPeer::isMinimised - */ - virtual void minimisationStateChanged (bool isNowMinimised); - - /** Returns the default scale factor to use for this component when it is placed - on the desktop. - The default implementation of this method just returns the value from - Desktop::getGlobalScaleFactor(), but it can be overridden if a particular component - has different requirements. The method only used if this component is added - to the desktop - it has no effect for child components. - */ - virtual float getDesktopScaleFactor() const; - - //============================================================================== - /** Brings the component to the front of its siblings. - - If some of the component's siblings have had their 'always-on-top' flag set, - then they will still be kept in front of this one (unless of course this - one is also 'always-on-top'). - - @param shouldAlsoGainFocus if true, this will also try to assign keyboard focus - to the component (see grabKeyboardFocus() for more details) - @see toBack, toBehind, setAlwaysOnTop - */ - void toFront (bool shouldAlsoGainFocus); - - /** Changes this component's z-order to be at the back of all its siblings. - - If the component is set to be 'always-on-top', it will only be moved to the - back of the other other 'always-on-top' components. - - @see toFront, toBehind, setAlwaysOnTop - */ - void toBack(); - - /** Changes this component's z-order so that it's just behind another component. - @see toFront, toBack - */ - void toBehind (Component* other); - - /** Sets whether the component should always be kept at the front of its siblings. - @see isAlwaysOnTop - */ - void setAlwaysOnTop (bool shouldStayOnTop); - - /** Returns true if this component is set to always stay in front of its siblings. - @see setAlwaysOnTop - */ - bool isAlwaysOnTop() const noexcept; - - //============================================================================== - /** Returns the x coordinate of the component's left edge. - This is a distance in pixels from the left edge of the component's parent. - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to its bounding box. - */ - int getX() const noexcept { return bounds.getX(); } - - /** Returns the y coordinate of the top of this component. - This is a distance in pixels from the top edge of the component's parent. - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to its bounding box. - */ - int getY() const noexcept { return bounds.getY(); } - - /** Returns the component's width in pixels. */ - int getWidth() const noexcept { return bounds.getWidth(); } - - /** Returns the component's height in pixels. */ - int getHeight() const noexcept { return bounds.getHeight(); } - - /** Returns the x coordinate of the component's right-hand edge. - This is a distance in pixels from the left edge of the component's parent. - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to its bounding box. - */ - int getRight() const noexcept { return bounds.getRight(); } - - /** Returns the component's top-left position as a Point. */ - Point getPosition() const noexcept { return bounds.getPosition(); } - - /** Returns the y coordinate of the bottom edge of this component. - This is a distance in pixels from the top edge of the component's parent. - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to its bounding box. - */ - int getBottom() const noexcept { return bounds.getBottom(); } - - /** Returns this component's bounding box. - The rectangle returned is relative to the top-left of the component's parent. - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to its bounding box. - */ - const Rectangle& getBounds() const noexcept { return bounds; } - - /** Returns the component's bounds, relative to its own origin. - This is like getBounds(), but returns the rectangle in local coordinates, In practice, it'll - return a rectangle with position (0, 0), and the same size as this component. - */ - Rectangle getLocalBounds() const noexcept; - - /** Returns the area of this component's parent which this component covers. - - The returned area is relative to the parent's coordinate space. - If the component has an affine transform specified, then the resulting area will be - the smallest rectangle that fully covers the component's transformed bounding box. - If this component has no parent, the return value will simply be the same as getBounds(). - */ - Rectangle getBoundsInParent() const noexcept; - - //============================================================================== - /** Returns this component's x coordinate relative the screen's top-left origin. - @see getX, localPointToGlobal - */ - int getScreenX() const; - - /** Returns this component's y coordinate relative the screen's top-left origin. - @see getY, localPointToGlobal - */ - int getScreenY() const; - - /** Returns the position of this component's top-left corner relative to the screen's top-left. - @see getScreenBounds - */ - Point getScreenPosition() const; - - /** Returns the bounds of this component, relative to the screen's top-left. - @see getScreenPosition - */ - Rectangle getScreenBounds() const; - - /** Converts a point to be relative to this component's coordinate space. - - This takes a point relative to a different component, and returns its position relative to this - component. If the sourceComponent parameter is null, the source point is assumed to be a global - screen coordinate. - */ - Point getLocalPoint (const Component* sourceComponent, - Point pointRelativeToSourceComponent) const; - - /** Converts a point to be relative to this component's coordinate space. - - This takes a point relative to a different component, and returns its position relative to this - component. If the sourceComponent parameter is null, the source point is assumed to be a global - screen coordinate. - */ - Point getLocalPoint (const Component* sourceComponent, - Point pointRelativeToSourceComponent) const; - - /** Converts a rectangle to be relative to this component's coordinate space. - - This takes a rectangle that is relative to a different component, and returns its position relative - to this component. If the sourceComponent parameter is null, the source rectangle is assumed to be - a screen coordinate. - - If you've used setTransform() to apply one or more transforms to components, then the source rectangle - may not actually be rectanglular when converted to the target space, so in that situation this will return - the smallest rectangle that fully contains the transformed area. - */ - Rectangle getLocalArea (const Component* sourceComponent, - const Rectangle& areaRelativeToSourceComponent) const; - - /** Converts a point relative to this component's top-left into a screen coordinate. - @see getLocalPoint, localAreaToGlobal - */ - Point localPointToGlobal (Point localPoint) const; - - /** Converts a point relative to this component's top-left into a screen coordinate. - @see getLocalPoint, localAreaToGlobal - */ - Point localPointToGlobal (Point localPoint) const; - - /** Converts a rectangle from this component's coordinate space to a screen coordinate. - - If you've used setTransform() to apply one or more transforms to components, then the source rectangle - may not actually be rectanglular when converted to the target space, so in that situation this will return - the smallest rectangle that fully contains the transformed area. - @see getLocalPoint, localPointToGlobal - */ - Rectangle localAreaToGlobal (const Rectangle& localArea) const; - - //============================================================================== - /** Moves the component to a new position. - - Changes the component's top-left position (without changing its size). - The position is relative to the top-left of the component's parent. - - If the component actually moves, this method will make a synchronous call to moved(). - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to whatever bounds you set for it. - - @see setBounds, ComponentListener::componentMovedOrResized - */ - void setTopLeftPosition (int x, int y); - - /** Moves the component to a new position. - - Changes the component's top-left position (without changing its size). - The position is relative to the top-left of the component's parent. - - If the component actually moves, this method will make a synchronous call to moved(). - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to whatever bounds you set for it. - - @see setBounds, ComponentListener::componentMovedOrResized - */ - void setTopLeftPosition (Point newTopLeftPosition); - - /** Moves the component to a new position. - - Changes the position of the component's top-right corner (keeping it the same size). - The position is relative to the top-left of the component's parent. - - If the component actually moves, this method will make a synchronous call to moved(). - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to whatever bounds you set for it. - */ - void setTopRightPosition (int x, int y); - - /** Changes the size of the component. - - A synchronous call to resized() will be occur if the size actually changes. - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to whatever bounds you set for it. - */ - void setSize (int newWidth, int newHeight); - - /** Changes the component's position and size. - - The coordinates are relative to the top-left of the component's parent, or relative - to the origin of the screen is the component is on the desktop. - - If this method changes the component's top-left position, it will make a synchronous - call to moved(). If it changes the size, it will also make a call to resized(). - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to whatever bounds you set for it. - - @see setTopLeftPosition, setSize, ComponentListener::componentMovedOrResized - */ - void setBounds (int x, int y, int width, int height); - - /** Changes the component's position and size. - - The coordinates are relative to the top-left of the component's parent, or relative - to the origin of the screen is the component is on the desktop. - - If this method changes the component's top-left position, it will make a synchronous - call to moved(). If it changes the size, it will also make a call to resized(). - - Note that if you've used setTransform() to apply a transform, then the component's - bounds will no longer be a direct reflection of the position at which it appears within - its parent, as the transform will be applied to whatever bounds you set for it. - - @see setBounds - */ - void setBounds (const Rectangle& newBounds); - - /** Changes the component's position and size. - - This is similar to the other setBounds() methods, but uses RelativeRectangle::applyToComponent() - to set the position, This uses a Component::Positioner to make sure that any dynamic - expressions are used in the RelativeRectangle will be automatically re-applied to the - component's bounds when the source values change. See RelativeRectangle::applyToComponent() - for more details. - - When using relative expressions, the following symbols are available: - - "left", "right", "top", "bottom" refer to the position of those edges in this component, so - e.g. for a component whose width is always 100, you might set the right edge to the "left + 100". - - "[id].left", "[id].right", "[id].top", "[id].bottom", "[id].width", "[id].height", where [id] is - the identifier of one of this component's siblings. A component's identifier is set with - Component::setComponentID(). So for example if you want your component to always be 50 pixels to the - right of the one called "xyz", you could set your left edge to be "xyz.right + 50". - - Instead of an [id], you can use the name "parent" to refer to this component's parent. Like - any other component, these values are relative to their component's parent, so "parent.right" won't be - very useful for positioning a component because it refers to a position with the parent's parent.. but - "parent.width" can be used for setting positions relative to the parent's size. E.g. to make a 10x10 - component which remains 1 pixel away from its parent's bottom-right, you could use - "right - 10, bottom - 10, parent.width - 1, parent.height - 1". - - The name of one of the parent component's markers can also be used as a symbol. For markers to be - used, the parent component must implement its Component::getMarkers() method, and return at least one - valid MarkerList. So if you want your component's top edge to be 10 pixels below the - marker called "foobar", you'd set it to "foobar + 10". - - See the Expression class for details about the operators that are supported, but for example - if you wanted to make your component remain centred within its parent with a size of 100, 100, - you could express it as: - @code myComp.setBounds (RelativeBounds ("parent.width / 2 - 50, parent.height / 2 - 50, left + 100, top + 100")); - @endcode - ..or an alternative way to achieve the same thing: - @code myComp.setBounds (RelativeBounds ("right - 100, bottom - 100, parent.width / 2 + 50, parent.height / 2 + 50")); - @endcode - - Or if you wanted a 100x100 component whose top edge is lined up to a marker called "topMarker" and - which is positioned 50 pixels to the right of another component called "otherComp", you could write: - @code myComp.setBounds (RelativeBounds ("otherComp.right + 50, topMarker, left + 100, top + 100")); - @endcode - - Be careful not to make your coordinate expressions recursive, though, or exceptions and assertions will - be thrown! - - @see setBounds, RelativeRectangle::applyToComponent(), Expression - */ - void setBounds (const RelativeRectangle& newBounds); - - /** Sets the component's bounds with an expression. - The string is parsed as a RelativeRectangle expression - see the notes for - Component::setBounds (const RelativeRectangle&) for more information. This method is - basically just a shortcut for writing setBounds (RelativeRectangle ("...")) - */ - void setBounds (const String& newBoundsExpression); - - /** Changes the component's position and size in terms of fractions of its parent's size. - - The values are factors of the parent's size, so for example - setBoundsRelative (0.2f, 0.2f, 0.5f, 0.5f) would give it half the - width and height of the parent, with its top-left position 20% of - the way across and down the parent. - - @see setBounds - */ - void setBoundsRelative (float proportionalX, float proportionalY, - float proportionalWidth, float proportionalHeight); - - /** Changes the component's position and size based on the amount of space to leave around it. - - This will position the component within its parent, leaving the specified number of - pixels around each edge. - - @see setBounds - */ - void setBoundsInset (const BorderSize& borders); - - /** Positions the component within a given rectangle, keeping its proportions - unchanged. - - If onlyReduceInSize is false, the component will be resized to fill as much of the - rectangle as possible without changing its aspect ratio (the component's - current size is used to determine its aspect ratio, so a zero-size component - won't work here). If onlyReduceInSize is true, it will only be resized if it's - too big to fit inside the rectangle. - - It will then be positioned within the rectangle according to the justification flags - specified. - - @see setBounds - */ - void setBoundsToFit (int x, int y, int width, int height, - Justification justification, - bool onlyReduceInSize); - - /** Changes the position of the component's centre. - - Leaves the component's size unchanged, but sets the position of its centre - relative to its parent's top-left. - - @see setBounds - */ - void setCentrePosition (int x, int y); - - /** Changes the position of the component's centre. - - Leaves the position unchanged, but positions its centre relative to its - parent's size. E.g. setCentreRelative (0.5f, 0.5f) would place it centrally in - its parent. - */ - void setCentreRelative (float x, float y); - - /** Changes the component's size and centres it within its parent. - - After changing the size, the component will be moved so that it's - centred within its parent. If the component is on the desktop (or has no - parent component), then it'll be centred within the main monitor area. - */ - void centreWithSize (int width, int height); - - //============================================================================== - /** Sets a transform matrix to be applied to this component. - - If you set a transform for a component, the component's position will be warped by it, relative to - the component's parent's top-left origin. This means that the values you pass into setBounds() will no - longer reflect the actual area within the parent that the component covers, as the bounds will be - transformed and the component will probably end up actually appearing somewhere else within its parent. - - When using transforms you need to be extremely careful when converting coordinates between the - coordinate spaces of different components or the screen - you should always use getLocalPoint(), - getLocalArea(), etc to do this, and never just manually add a component's position to a point in order to - convert it between different components (but I'm sure you would never have done that anyway...). - - Currently, transforms are not supported for desktop windows, so the transform will be ignored if you - put a component on the desktop. - - To remove a component's transform, simply pass AffineTransform::identity as the parameter to this method. - */ - void setTransform (const AffineTransform& transform); - - /** Returns the transform that is currently being applied to this component. - For more details about transforms, see setTransform(). - @see setTransform - */ - AffineTransform getTransform() const; - - /** Returns true if a non-identity transform is being applied to this component. - For more details about transforms, see setTransform(). - @see setTransform - */ - bool isTransformed() const noexcept; - - //============================================================================== - /** Returns a proportion of the component's width. - This is a handy equivalent of (getWidth() * proportion). - */ - int proportionOfWidth (float proportion) const noexcept; - - /** Returns a proportion of the component's height. - This is a handy equivalent of (getHeight() * proportion). - */ - int proportionOfHeight (float proportion) const noexcept; - - /** Returns the width of the component's parent. - - If the component has no parent (i.e. if it's on the desktop), this will return - the width of the screen. - */ - int getParentWidth() const noexcept; - - /** Returns the height of the component's parent. - - If the component has no parent (i.e. if it's on the desktop), this will return - the height of the screen. - */ - int getParentHeight() const noexcept; - - /** Returns the screen coordinates of the monitor that contains this component. - - If there's only one monitor, this will return its size - if there are multiple - monitors, it will return the area of the monitor that contains the component's - centre. - */ - Rectangle getParentMonitorArea() const; - - //============================================================================== - /** Returns the number of child components that this component contains. - - @see getChildComponent, getIndexOfChildComponent - */ - int getNumChildComponents() const noexcept; - - /** Returns one of this component's child components, by it index. - - The component with index 0 is at the back of the z-order, the one at the - front will have index (getNumChildComponents() - 1). - - If the index is out-of-range, this will return a null pointer. - - @see getNumChildComponents, getIndexOfChildComponent - */ - Component* getChildComponent (int index) const noexcept; - - /** Returns the index of this component in the list of child components. - - A value of 0 means it is first in the list (i.e. behind all other components). Higher - values are further towards the front. - - Returns -1 if the component passed-in is not a child of this component. - - @see getNumChildComponents, getChildComponent, addChildComponent, toFront, toBack, toBehind - */ - int getIndexOfChildComponent (const Component* child) const noexcept; - - /** Looks for a child component with the specified ID. - @see setComponentID, getComponentID - */ - Component* findChildWithID (StringRef componentID) const noexcept; - - /** Adds a child component to this one. - - Adding a child component does not mean that the component will own or delete the child - it's - your responsibility to delete the component. Note that it's safe to delete a component - without first removing it from its parent - doing so will automatically remove it and - send out the appropriate notifications before the deletion completes. - - If the child is already a child of this component, then no action will be taken, and its - z-order will be left unchanged. - - @param child the new component to add. If the component passed-in is already - the child of another component, it'll first be removed from it current parent. - @param zOrder The index in the child-list at which this component should be inserted. - A value of -1 will insert it in front of the others, 0 is the back. - @see removeChildComponent, addAndMakeVisible, addChildAndSetID, getChild, ComponentListener::componentChildrenChanged - */ - void addChildComponent (Component* child, int zOrder = -1); - - /** Adds a child component to this one. - - Adding a child component does not mean that the component will own or delete the child - it's - your responsibility to delete the component. Note that it's safe to delete a component - without first removing it from its parent - doing so will automatically remove it and - send out the appropriate notifications before the deletion completes. - - If the child is already a child of this component, then no action will be taken, and its - z-order will be left unchanged. - - @param child the new component to add. If the component passed-in is already - the child of another component, it'll first be removed from it current parent. - @param zOrder The index in the child-list at which this component should be inserted. - A value of -1 will insert it in front of the others, 0 is the back. - @see removeChildComponent, addAndMakeVisible, addChildAndSetID, getChild, ComponentListener::componentChildrenChanged - */ - void addChildComponent (Component& child, int zOrder = -1); - - /** Adds a child component to this one, and also makes the child visible if it isn't already. - - This is the same as calling setVisible (true) on the child and then addChildComponent(). - See addChildComponent() for more details. - */ - void addAndMakeVisible (Component* child, int zOrder = -1); - - /** Adds a child component to this one, and also makes the child visible if it isn't already. - - This is the same as calling setVisible (true) on the child and then addChildComponent(). - See addChildComponent() for more details. - */ - void addAndMakeVisible (Component& child, int zOrder = -1); - - /** Adds a child component to this one, makes it visible, and sets its component ID. - @see addAndMakeVisible, addChildComponent - */ - void addChildAndSetID (Component* child, const String& componentID); - - /** Removes one of this component's child-components. - - If the child passed-in isn't actually a child of this component (either because - it's invalid or is the child of a different parent), then no action is taken. - - Note that removing a child will not delete it! But it's ok to delete a component - without first removing it - doing so will automatically remove it and send out the - appropriate notifications before the deletion completes. - - @see addChildComponent, ComponentListener::componentChildrenChanged - */ - void removeChildComponent (Component* childToRemove); - - /** Removes one of this component's child-components by index. - - This will return a pointer to the component that was removed, or null if - the index was out-of-range. - - Note that removing a child will not delete it! But it's ok to delete a component - without first removing it - doing so will automatically remove it and send out the - appropriate notifications before the deletion completes. - - @see addChildComponent, ComponentListener::componentChildrenChanged - */ - Component* removeChildComponent (int childIndexToRemove); - - /** Removes all this component's children. - Note that this won't delete them! To do that, use deleteAllChildren() instead. - */ - void removeAllChildren(); - - /** Removes and deletes all of this component's children. - My advice is to avoid this method! It's an old function that is only kept here for - backwards-compatibility with legacy code, and should be viewed with extreme - suspicion by anyone attempting to write modern C++. In almost all cases, it's much - smarter to manage the lifetimes of your child components via modern RAII techniques - such as simply making them member variables, or using ScopedPointer, OwnedArray, etc - to manage their lifetimes appropriately. - @see removeAllChildren - */ - void deleteAllChildren(); - - /** Returns the component which this component is inside. - - If this is the highest-level component or hasn't yet been added to - a parent, this will return null. - */ - Component* getParentComponent() const noexcept { return parentComponent; } - - /** Searches the parent components for a component of a specified class. - - For example findParentComponentOfClass \() would return the first parent - component that can be dynamically cast to a MyComp, or will return 0 if none - of the parents are suitable. - */ - template - TargetClass* findParentComponentOfClass() const - { - for (Component* p = parentComponent; p != nullptr; p = p->parentComponent) - if (TargetClass* const target = dynamic_cast (p)) - return target; - - return nullptr; - } - - /** Returns the highest-level component which contains this one or its parents. - - This will search upwards in the parent-hierarchy from this component, until it - finds the highest one that doesn't have a parent (i.e. is on the desktop or - not yet added to a parent), and will return that. - */ - Component* getTopLevelComponent() const noexcept; - - /** Checks whether a component is anywhere inside this component or its children. - - This will recursively check through this component's children to see if the - given component is anywhere inside. - */ - bool isParentOf (const Component* possibleChild) const noexcept; - - //============================================================================== - /** Called to indicate that the component's parents have changed. - - When a component is added or removed from its parent, this method will - be called on all of its children (recursively - so all children of its - children will also be called as well). - - Subclasses can override this if they need to react to this in some way. - - @see getParentComponent, isShowing, ComponentListener::componentParentHierarchyChanged - */ - virtual void parentHierarchyChanged(); - - /** Subclasses can use this callback to be told when children are added or removed, or - when their z-order changes. - @see parentHierarchyChanged, ComponentListener::componentChildrenChanged - */ - virtual void childrenChanged(); - - //============================================================================== - /** Tests whether a given point inside the component. - - Overriding this method allows you to create components which only intercept - mouse-clicks within a user-defined area. - - This is called to find out whether a particular x, y coordinate is - considered to be inside the component or not, and is used by methods such - as contains() and getComponentAt() to work out which component - the mouse is clicked on. - - Components with custom shapes will probably want to override it to perform - some more complex hit-testing. - - The default implementation of this method returns either true or false, - depending on the value that was set by calling setInterceptsMouseClicks() (true - is the default return value). - - Note that the hit-test region is not related to the opacity with which - areas of a component are painted. - - Applications should never call hitTest() directly - instead use the - contains() method, because this will also test for occlusion by the - component's parent. - - Note that for components on the desktop, this method will be ignored, because it's - not always possible to implement this behaviour on all platforms. - - @param x the x coordinate to test, relative to the left hand edge of this - component. This value is guaranteed to be greater than or equal to - zero, and less than the component's width - @param y the y coordinate to test, relative to the top edge of this - component. This value is guaranteed to be greater than or equal to - zero, and less than the component's height - @returns true if the click is considered to be inside the component - @see setInterceptsMouseClicks, contains - */ - virtual bool hitTest (int x, int y); - - /** Changes the default return value for the hitTest() method. - - Setting this to false is an easy way to make a component pass its mouse-clicks - through to the components behind it. - - When a component is created, the default setting for this is true. - - @param allowClicksOnThisComponent if true, hitTest() will always return true; if false, it will - return false (or true for child components if allowClicksOnChildComponents - is true) - @param allowClicksOnChildComponents if this is true and allowClicksOnThisComponent is false, then child - components can be clicked on as normal but clicks on this component pass - straight through; if this is false and allowClicksOnThisComponent - is false, then neither this component nor any child components can - be clicked on - @see hitTest, getInterceptsMouseClicks - */ - void setInterceptsMouseClicks (bool allowClicksOnThisComponent, - bool allowClicksOnChildComponents) noexcept; - - /** Retrieves the current state of the mouse-click interception flags. - - On return, the two parameters are set to the state used in the last call to - setInterceptsMouseClicks(). - - @see setInterceptsMouseClicks - */ - void getInterceptsMouseClicks (bool& allowsClicksOnThisComponent, - bool& allowsClicksOnChildComponents) const noexcept; - - - /** Returns true if a given point lies within this component or one of its children. - - Never override this method! Use hitTest to create custom hit regions. - - @param localPoint the coordinate to test, relative to this component's top-left. - @returns true if the point is within the component's hit-test area, but only if - that part of the component isn't clipped by its parent component. Note - that this won't take into account any overlapping sibling components - which might be in the way - for that, see reallyContains() - @see hitTest, reallyContains, getComponentAt - */ - bool contains (Point localPoint); - - /** Returns true if a given point lies in this component, taking any overlapping - siblings into account. - - @param localPoint the coordinate to test, relative to this component's top-left. - @param returnTrueIfWithinAChild if the point actually lies within a child of this component, - this determines whether that is counted as a hit. - @see contains, getComponentAt - */ - bool reallyContains (Point localPoint, bool returnTrueIfWithinAChild); - - /** Returns the component at a certain point within this one. - - @param x the x coordinate to test, relative to this component's left edge. - @param y the y coordinate to test, relative to this component's top edge. - @returns the component that is at this position - which may be 0, this component, - or one of its children. Note that overlapping siblings that might actually - be in the way are not taken into account by this method - to account for these, - instead call getComponentAt on the top-level parent of this component. - @see hitTest, contains, reallyContains - */ - Component* getComponentAt (int x, int y); - - /** Returns the component at a certain point within this one. - - @param position the coordinate to test, relative to this component's top-left. - @returns the component that is at this position - which may be 0, this component, - or one of its children. Note that overlapping siblings that might actually - be in the way are not taken into account by this method - to account for these, - instead call getComponentAt on the top-level parent of this component. - @see hitTest, contains, reallyContains - */ - Component* getComponentAt (Point position); - - //============================================================================== - /** Marks the whole component as needing to be redrawn. - - Calling this will not do any repainting immediately, but will mark the component - as 'dirty'. At some point in the near future the operating system will send a paint - message, which will redraw all the dirty regions of all components. - There's no guarantee about how soon after calling repaint() the redraw will actually - happen, and other queued events may be delivered before a redraw is done. - - If the setBufferedToImage() method has been used to cause this component to use a - buffer, the repaint() call will invalidate the cached buffer. If setCachedComponentImage() - has been used to provide a custom image cache, that cache will be invalidated appropriately. - - To redraw just a subsection of the component rather than the whole thing, - use the repaint (int, int, int, int) method. - - @see paint - */ - void repaint(); - - /** Marks a subsection of this component as needing to be redrawn. - - Calling this will not do any repainting immediately, but will mark the given region - of the component as 'dirty'. At some point in the near future the operating system - will send a paint message, which will redraw all the dirty regions of all components. - There's no guarantee about how soon after calling repaint() the redraw will actually - happen, and other queued events may be delivered before a redraw is done. - - The region that is passed in will be clipped to keep it within the bounds of this - component. - - @see repaint() - */ - void repaint (int x, int y, int width, int height); - - /** Marks a subsection of this component as needing to be redrawn. - - Calling this will not do any repainting immediately, but will mark the given region - of the component as 'dirty'. At some point in the near future the operating system - will send a paint message, which will redraw all the dirty regions of all components. - There's no guarantee about how soon after calling repaint() the redraw will actually - happen, and other queued events may be delivered before a redraw is done. - - The region that is passed in will be clipped to keep it within the bounds of this - component. - - @see repaint() - */ - void repaint (const Rectangle& area); - - //============================================================================== - /** Makes the component use an internal buffer to optimise its redrawing. - - Setting this flag to true will cause the component to allocate an - internal buffer into which it paints itself, so that when asked to - redraw itself, it can use this buffer rather than actually calling the - paint() method. - - The buffer is kept until the repaint() method is called directly on - this component (or until it is resized), when the image is invalidated - and then redrawn the next time the component is painted. - - Note that only the drawing that happens within the component's paint() - method is drawn into the buffer, it's child components are not buffered, and - nor is the paintOverChildren() method. - - @see repaint, paint, createComponentSnapshot - */ - void setBufferedToImage (bool shouldBeBuffered); - - /** Generates a snapshot of part of this component. - - This will return a new Image, the size of the rectangle specified, - containing a snapshot of the specified area of the component and all - its children. - - The image may or may not have an alpha-channel, depending on whether the - image is opaque or not. - - If the clipImageToComponentBounds parameter is true and the area is greater than - the size of the component, it'll be clipped. If clipImageToComponentBounds is false - then parts of the component beyond its bounds can be drawn. - - @see paintEntireComponent - */ - Image createComponentSnapshot (const Rectangle& areaToGrab, - bool clipImageToComponentBounds = true, - float scaleFactor = 1.0f); - - /** Draws this component and all its subcomponents onto the specified graphics - context. - - You should very rarely have to use this method, it's simply there in case you need - to draw a component with a custom graphics context for some reason, e.g. for - creating a snapshot of the component. - - It calls paint(), paintOverChildren() and recursively calls paintEntireComponent() - on its children in order to render the entire tree. - - The graphics context may be left in an undefined state after this method returns, - so you may need to reset it if you're going to use it again. - - If ignoreAlphaLevel is false, then the component will be drawn with the opacity level - specified by getAlpha(); if ignoreAlphaLevel is true, then this will be ignored and - an alpha of 1.0 will be used. - */ - void paintEntireComponent (Graphics& context, bool ignoreAlphaLevel); - - /** This allows you to indicate that this component doesn't require its graphics - context to be clipped when it is being painted. - - Most people will never need to use this setting, but in situations where you have a very large - number of simple components being rendered, and where they are guaranteed never to do any drawing - beyond their own boundaries, setting this to true will reduce the overhead involved in clipping - the graphics context that gets passed to the component's paint() callback. - If you enable this mode, you'll need to make sure your paint method doesn't call anything like - Graphics::fillAll(), and doesn't draw beyond the component's bounds, because that'll produce - artifacts. Your component also can't have any child components that may be placed beyond its - bounds. - */ - void setPaintingIsUnclipped (bool shouldPaintWithoutClipping) noexcept; - - //============================================================================== - /** Adds an effect filter to alter the component's appearance. - - When a component has an effect filter set, then this is applied to the - results of its paint() method. There are a few preset effects, such as - a drop-shadow or glow, but they can be user-defined as well. - - The effect that is passed in will not be deleted by the component - the - caller must take care of deleting it. - - To remove an effect from a component, pass a null pointer in as the parameter. - - @see ImageEffectFilter, DropShadowEffect, GlowEffect - */ - void setComponentEffect (ImageEffectFilter* newEffect); - - /** Returns the current component effect. - @see setComponentEffect - */ - ImageEffectFilter* getComponentEffect() const noexcept { return effect; } - - //============================================================================== - /** Finds the appropriate look-and-feel to use for this component. - - If the component hasn't had a look-and-feel explicitly set, this will - return the parent's look-and-feel, or just the default one if there's no - parent. - - @see setLookAndFeel, lookAndFeelChanged - */ - LookAndFeel& getLookAndFeel() const noexcept; - - /** Sets the look and feel to use for this component. - - This will also change the look and feel for any child components that haven't - had their look set explicitly. - - The object passed in will not be deleted by the component, so it's the caller's - responsibility to manage it. It may be used at any time until this component - has been deleted. - - Calling this method will also invoke the sendLookAndFeelChange() method. - - @see getLookAndFeel, lookAndFeelChanged - */ - void setLookAndFeel (LookAndFeel* newLookAndFeel); - - /** Called to let the component react to a change in the look-and-feel setting. - - When the look-and-feel is changed for a component, this will be called in - all its child components, recursively. - - It can also be triggered manually by the sendLookAndFeelChange() method, in case - an application uses a LookAndFeel class that might have changed internally. - - @see sendLookAndFeelChange, getLookAndFeel - */ - virtual void lookAndFeelChanged(); - - /** Calls the lookAndFeelChanged() method in this component and all its children. - - This will recurse through the children and their children, calling lookAndFeelChanged() - on them all. - - @see lookAndFeelChanged - */ - void sendLookAndFeelChange(); - - //============================================================================== - /** Indicates whether any parts of the component might be transparent. - - Components that always paint all of their contents with solid colour and - thus completely cover any components behind them should use this method - to tell the repaint system that they are opaque. - - This information is used to optimise drawing, because it means that - objects underneath opaque windows don't need to be painted. - - By default, components are considered transparent, unless this is used to - make it otherwise. - - @see isOpaque - */ - void setOpaque (bool shouldBeOpaque); - - /** Returns true if no parts of this component are transparent. - - @returns the value that was set by setOpaque, (the default being false) - @see setOpaque - */ - bool isOpaque() const noexcept; - - //============================================================================== - /** Indicates whether the component should be brought to the front when clicked. - - Setting this flag to true will cause the component to be brought to the front - when the mouse is clicked somewhere inside it or its child components. - - Note that a top-level desktop window might still be brought to the front by the - operating system when it's clicked, depending on how the OS works. - - By default this is set to false. - - @see setMouseClickGrabsKeyboardFocus - */ - void setBroughtToFrontOnMouseClick (bool shouldBeBroughtToFront) noexcept; - - /** Indicates whether the component should be brought to the front when clicked-on. - @see setBroughtToFrontOnMouseClick - */ - bool isBroughtToFrontOnMouseClick() const noexcept; - - //============================================================================== - // Keyboard focus methods - - /** Sets a flag to indicate whether this component needs keyboard focus or not. - - By default components aren't actually interested in gaining the - focus, but this method can be used to turn this on. - - See the grabKeyboardFocus() method for details about the way a component - is chosen to receive the focus. - - @see grabKeyboardFocus, getWantsKeyboardFocus - */ - void setWantsKeyboardFocus (bool wantsFocus) noexcept; - - /** Returns true if the component is interested in getting keyboard focus. - - This returns the flag set by setWantsKeyboardFocus(). The default - setting is false. - - @see setWantsKeyboardFocus - */ - bool getWantsKeyboardFocus() const noexcept; - - //============================================================================== - /** Chooses whether a click on this component automatically grabs the focus. - - By default this is set to true, but you might want a component which can - be focused, but where you don't want the user to be able to affect it directly - by clicking. - */ - void setMouseClickGrabsKeyboardFocus (bool shouldGrabFocus); - - /** Returns the last value set with setMouseClickGrabsKeyboardFocus(). - See setMouseClickGrabsKeyboardFocus() for more info. - */ - bool getMouseClickGrabsKeyboardFocus() const noexcept; - - //============================================================================== - /** Tries to give keyboard focus to this component. - - When the user clicks on a component or its grabKeyboardFocus() - method is called, the following procedure is used to work out which - component should get it: - - - if the component that was clicked on actually wants focus (as indicated - by calling getWantsKeyboardFocus), it gets it. - - if the component itself doesn't want focus, it will try to pass it - on to whichever of its children is the default component, as determined by - KeyboardFocusTraverser::getDefaultComponent() - - if none of its children want focus at all, it will pass it up to its - parent instead, unless it's a top-level component without a parent, - in which case it just takes the focus itself. - - @see setWantsKeyboardFocus, getWantsKeyboardFocus, hasKeyboardFocus, - getCurrentlyFocusedComponent, focusGained, focusLost, - keyPressed, keyStateChanged - */ - void grabKeyboardFocus(); - - /** Returns true if this component currently has the keyboard focus. - - @param trueIfChildIsFocused if this is true, then the method returns true if - either this component or any of its children (recursively) - have the focus. If false, the method only returns true if - this component has the focus. - - @see grabKeyboardFocus, setWantsKeyboardFocus, getCurrentlyFocusedComponent, - focusGained, focusLost - */ - bool hasKeyboardFocus (bool trueIfChildIsFocused) const; - - /** Returns the component that currently has the keyboard focus. - @returns the focused component, or null if nothing is focused. - */ - static Component* JUCE_CALLTYPE getCurrentlyFocusedComponent() noexcept; - - /** If any component has keyboard focus, this will defocus it. */ - static void JUCE_CALLTYPE unfocusAllComponents(); - - //============================================================================== - /** Tries to move the keyboard focus to one of this component's siblings. - - This will try to move focus to either the next or previous component. (This - is the method that is used when shifting focus by pressing the tab key). - - Components for which getWantsKeyboardFocus() returns false are not looked at. - - @param moveToNext if true, the focus will move forwards; if false, it will - move backwards - @see grabKeyboardFocus, setFocusContainer, setWantsKeyboardFocus - */ - void moveKeyboardFocusToSibling (bool moveToNext); - - /** Creates a KeyboardFocusTraverser object to use to determine the logic by - which focus should be passed from this component. - - The default implementation of this method will return a default - KeyboardFocusTraverser if this component is a focus container (as determined - by the setFocusContainer() method). If the component isn't a focus - container, then it will recursively ask its parents for a KeyboardFocusTraverser. - - If you overrride this to return a custom KeyboardFocusTraverser, then - this component and all its sub-components will use the new object to - make their focusing decisions. - - The method should return a new object, which the caller is required to - delete when no longer needed. - */ - virtual KeyboardFocusTraverser* createFocusTraverser(); - - /** Returns the focus order of this component, if one has been specified. - - By default components don't have a focus order - in that case, this - will return 0. Lower numbers indicate that the component will be - earlier in the focus traversal order. - - To change the order, call setExplicitFocusOrder(). - - The focus order may be used by the KeyboardFocusTraverser class as part of - its algorithm for deciding the order in which components should be traversed. - See the KeyboardFocusTraverser class for more details on this. - - @see moveKeyboardFocusToSibling, createFocusTraverser, KeyboardFocusTraverser - */ - int getExplicitFocusOrder() const; - - /** Sets the index used in determining the order in which focusable components - should be traversed. - - A value of 0 or less is taken to mean that no explicit order is wanted, and - that traversal should use other factors, like the component's position. - - @see getExplicitFocusOrder, moveKeyboardFocusToSibling - */ - void setExplicitFocusOrder (int newFocusOrderIndex); - - /** Indicates whether this component is a parent for components that can have - their focus traversed. - - This flag is used by the default implementation of the createFocusTraverser() - method, which uses the flag to find the first parent component (of the currently - focused one) which wants to be a focus container. - - So using this method to set the flag to 'true' causes this component to - act as the top level within which focus is passed around. - - @see isFocusContainer, createFocusTraverser, moveKeyboardFocusToSibling - */ - void setFocusContainer (bool shouldBeFocusContainer) noexcept; - - /** Returns true if this component has been marked as a focus container. - - See setFocusContainer() for more details. - - @see setFocusContainer, moveKeyboardFocusToSibling, createFocusTraverser - */ - bool isFocusContainer() const noexcept; - - //============================================================================== - /** Returns true if the component (and all its parents) are enabled. - - Components are enabled by default, and can be disabled with setEnabled(). Exactly - what difference this makes to the component depends on the type. E.g. buttons - and sliders will choose to draw themselves differently, etc. - - Note that if one of this component's parents is disabled, this will always - return false, even if this component itself is enabled. - - @see setEnabled, enablementChanged - */ - bool isEnabled() const noexcept; - - /** Enables or disables this component. - - Disabling a component will also cause all of its child components to become - disabled. - - Similarly, enabling a component which is inside a disabled parent - component won't make any difference until the parent is re-enabled. - - @see isEnabled, enablementChanged - */ - void setEnabled (bool shouldBeEnabled); - - /** Callback to indicate that this component has been enabled or disabled. - - This can be triggered by one of the component's parent components - being enabled or disabled, as well as changes to the component itself. - - The default implementation of this method does nothing; your class may - wish to repaint itself or something when this happens. - - @see setEnabled, isEnabled - */ - virtual void enablementChanged(); - - /** Changes the transparency of this component. - When painted, the entire component and all its children will be rendered - with this as the overall opacity level, where 0 is completely invisible, and - 1.0 is fully opaque (i.e. normal). - - @see getAlpha - */ - void setAlpha (float newAlpha); - - /** Returns the component's current transparancy level. - See setAlpha() for more details. - */ - float getAlpha() const; - - //============================================================================== - /** Changes the mouse cursor shape to use when the mouse is over this component. - - Note that the cursor set by this method can be overridden by the getMouseCursor - method. - - @see MouseCursor - */ - void setMouseCursor (const MouseCursor& cursorType); - - /** Returns the mouse cursor shape to use when the mouse is over this component. - - The default implementation will return the cursor that was set by setCursor() - but can be overridden for more specialised purposes, e.g. returning different - cursors depending on the mouse position. - - @see MouseCursor - */ - virtual MouseCursor getMouseCursor(); - - /** Forces the current mouse cursor to be updated. - - If you're overriding the getMouseCursor() method to control which cursor is - displayed, then this will only be checked each time the user moves the mouse. So - if you want to force the system to check that the cursor being displayed is - up-to-date (even if the mouse is just sitting there), call this method. - - (If you're changing the cursor using setMouseCursor(), you don't need to bother - calling this). - */ - void updateMouseCursor() const; - - //============================================================================== - /** Components can override this method to draw their content. - - The paint() method gets called when a region of a component needs redrawing, - either because the component's repaint() method has been called, or because - something has happened on the screen that means a section of a window needs - to be redrawn. - - Any child components will draw themselves over whatever this method draws. If - you need to paint over the top of your child components, you can also implement - the paintOverChildren() method to do this. - - If you want to cause a component to redraw itself, this is done asynchronously - - calling the repaint() method marks a region of the component as "dirty", and the - paint() method will automatically be called sometime later, by the message thread, - to paint any bits that need refreshing. In Juce (and almost all modern UI frameworks), - you never redraw something synchronously. - - You should never need to call this method directly - to take a snapshot of the - component you could use createComponentSnapshot() or paintEntireComponent(). - - @param g the graphics context that must be used to do the drawing operations. - @see repaint, paintOverChildren, Graphics - */ - virtual void paint (Graphics& g); - - /** Components can override this method to draw over the top of their children. - - For most drawing operations, it's better to use the normal paint() method, - but if you need to overlay something on top of the children, this can be - used. - - @see paint, Graphics - */ - virtual void paintOverChildren (Graphics& g); - - - //============================================================================== - /** Called when the mouse moves inside a component. - - If the mouse button isn't pressed and the mouse moves over a component, - this will be called to let the component react to this. - - A component will always get a mouseEnter callback before a mouseMove. - - @param event details about the position and status of the mouse event, including - the source component in which it occurred - @see mouseEnter, mouseExit, mouseDrag, contains - */ - virtual void mouseMove (const MouseEvent& event) override; - - /** Called when the mouse first enters a component. - - If the mouse button isn't pressed and the mouse moves into a component, - this will be called to let the component react to this. - - When the mouse button is pressed and held down while being moved in - or out of a component, no mouseEnter or mouseExit callbacks are made - only - mouseDrag messages are sent to the component that the mouse was originally - clicked on, until the button is released. - - @param event details about the position and status of the mouse event, including - the source component in which it occurred - @see mouseExit, mouseDrag, mouseMove, contains - */ - virtual void mouseEnter (const MouseEvent& event) override; - - /** Called when the mouse moves out of a component. - - This will be called when the mouse moves off the edge of this - component. - - If the mouse button was pressed, and it was then dragged off the - edge of the component and released, then this callback will happen - when the button is released, after the mouseUp callback. - - @param event details about the position and status of the mouse event, including - the source component in which it occurred - @see mouseEnter, mouseDrag, mouseMove, contains - */ - virtual void mouseExit (const MouseEvent& event) override; - - /** Called when a mouse button is pressed. - - The MouseEvent object passed in contains lots of methods for finding out - which button was pressed, as well as which modifier keys (e.g. shift, ctrl) - were held down at the time. - - Once a button is held down, the mouseDrag method will be called when the - mouse moves, until the button is released. - - @param event details about the position and status of the mouse event, including - the source component in which it occurred - @see mouseUp, mouseDrag, mouseDoubleClick, contains - */ - virtual void mouseDown (const MouseEvent& event) override; - - /** Called when the mouse is moved while a button is held down. - - When a mouse button is pressed inside a component, that component - receives mouseDrag callbacks each time the mouse moves, even if the - mouse strays outside the component's bounds. - - @param event details about the position and status of the mouse event, including - the source component in which it occurred - @see mouseDown, mouseUp, mouseMove, contains, setDragRepeatInterval - */ - virtual void mouseDrag (const MouseEvent& event) override; - - /** Called when a mouse button is released. - - A mouseUp callback is sent to the component in which a button was pressed - even if the mouse is actually over a different component when the - button is released. - - The MouseEvent object passed in contains lots of methods for finding out - which buttons were down just before they were released. - - @param event details about the position and status of the mouse event, including - the source component in which it occurred - @see mouseDown, mouseDrag, mouseDoubleClick, contains - */ - virtual void mouseUp (const MouseEvent& event) override; - - /** Called when a mouse button has been double-clicked on a component. - - The MouseEvent object passed in contains lots of methods for finding out - which button was pressed, as well as which modifier keys (e.g. shift, ctrl) - were held down at the time. - - @param event details about the position and status of the mouse event, including - the source component in which it occurred - @see mouseDown, mouseUp - */ - virtual void mouseDoubleClick (const MouseEvent& event) override; - - /** Called when the mouse-wheel is moved. - - This callback is sent to the component that the mouse is over when the - wheel is moved. - - If not overridden, a component will forward this message to its parent, so - that parent components can collect mouse-wheel messages that happen to - child components which aren't interested in them. (Bear in mind that if - you attach a component as a mouse-listener to other components, then - those wheel moves will also end up calling this method and being passed up - to the parents, which may not be what you intended to happen). - - @param event details about the mouse event - @param wheel details about the mouse wheel movement - */ - virtual void mouseWheelMove (const MouseEvent& event, - const MouseWheelDetails& wheel) override; - - /** Called when a pinch-to-zoom mouse-gesture is used. - - If not overridden, a component will forward this message to its parent, so - that parent components can collect gesture messages that are unused by child - components. - - @param event details about the mouse event - @param scaleFactor a multiplier to indicate by how much the size of the target - should be changed. A value of 1.0 would indicate no change, - values greater than 1.0 mean it should be enlarged. - */ - virtual void mouseMagnify (const MouseEvent& event, float scaleFactor); - - //============================================================================== - /** Ensures that a non-stop stream of mouse-drag events will be sent during the - current mouse-drag operation. - - This allows you to make sure that mouseDrag() events are sent continuously, even - when the mouse isn't moving. This can be useful for things like auto-scrolling - components when the mouse is near an edge. - - Call this method during a mouseDown() or mouseDrag() callback, specifying the - minimum interval between consecutive mouse drag callbacks. The callbacks - will continue until the mouse is released, and then the interval will be reset, - so you need to make sure it's called every time you begin a drag event. - Passing an interval of 0 or less will cancel the auto-repeat. - - @see mouseDrag, Desktop::beginDragAutoRepeat - */ - static void JUCE_CALLTYPE beginDragAutoRepeat (int millisecondsBetweenCallbacks); - - /** Causes automatic repaints when the mouse enters or exits this component. - - If turned on, then when the mouse enters/exits, or when the button is pressed/released - on the component, it will trigger a repaint. - - This is handy for things like buttons that need to draw themselves differently when - the mouse moves over them, and it avoids having to override all the different mouse - callbacks and call repaint(). - - @see mouseEnter, mouseExit, mouseDown, mouseUp - */ - void setRepaintsOnMouseActivity (bool shouldRepaint) noexcept; - - /** Registers a listener to be told when mouse events occur in this component. - - If you need to get informed about mouse events in a component but can't or - don't want to override its methods, you can attach any number of listeners - to the component, and these will get told about the events in addition to - the component's own callbacks being called. - - Note that a MouseListener can also be attached to more than one component. - - @param newListener the listener to register - @param wantsEventsForAllNestedChildComponents if true, the listener will receive callbacks - for events that happen to any child component - within this component, including deeply-nested - child components. If false, it will only be - told about events that this component handles. - @see MouseListener, removeMouseListener - */ - void addMouseListener (MouseListener* newListener, - bool wantsEventsForAllNestedChildComponents); - - /** Deregisters a mouse listener. - @see addMouseListener, MouseListener - */ - void removeMouseListener (MouseListener* listenerToRemove); - - //============================================================================== - /** Adds a listener that wants to hear about keypresses that this component receives. - - The listeners that are registered with a component are called by its keyPressed() or - keyStateChanged() methods (assuming these haven't been overridden to do something else). - - If you add an object as a key listener, be careful to remove it when the object - is deleted, or the component will be left with a dangling pointer. - - @see keyPressed, keyStateChanged, removeKeyListener - */ - void addKeyListener (KeyListener* newListener); - - /** Removes a previously-registered key listener. - @see addKeyListener - */ - void removeKeyListener (KeyListener* listenerToRemove); - - /** Called when a key is pressed. - - When a key is pressed, the component that has the keyboard focus will have this - method called. Remember that a component will only be given the focus if its - setWantsKeyboardFocus() method has been used to enable this. - - If your implementation returns true, the event will be consumed and not passed - on to any other listeners. If it returns false, the key will be passed to any - KeyListeners that have been registered with this component. As soon as one of these - returns true, the process will stop, but if they all return false, the event will - be passed upwards to this component's parent, and so on. - - The default implementation of this method does nothing and returns false. - - @see keyStateChanged, getCurrentlyFocusedComponent, addKeyListener - */ - virtual bool keyPressed (const KeyPress& key); - - /** Called when a key is pressed or released. - - Whenever a key on the keyboard is pressed or released (including modifier keys - like shift and ctrl), this method will be called on the component that currently - has the keyboard focus. Remember that a component will only be given the focus if - its setWantsKeyboardFocus() method has been used to enable this. - - If your implementation returns true, the event will be consumed and not passed - on to any other listeners. If it returns false, then any KeyListeners that have - been registered with this component will have their keyStateChanged methods called. - As soon as one of these returns true, the process will stop, but if they all return - false, the event will be passed upwards to this component's parent, and so on. - - The default implementation of this method does nothing and returns false. - - To find out which keys are up or down at any time, see the KeyPress::isKeyCurrentlyDown() - method. - - @param isKeyDown true if a key has been pressed; false if it has been released - - @see keyPressed, KeyPress, getCurrentlyFocusedComponent, addKeyListener - */ - virtual bool keyStateChanged (bool isKeyDown); - - /** Called when a modifier key is pressed or released. - - Whenever the shift, control, alt or command keys are pressed or released, - this method will be called on the component that currently has the keyboard focus. - Remember that a component will only be given the focus if its setWantsKeyboardFocus() - method has been used to enable this. - - The default implementation of this method actually calls its parent's modifierKeysChanged - method, so that focused components which aren't interested in this will give their - parents a chance to act on the event instead. - - @see keyStateChanged, ModifierKeys - */ - virtual void modifierKeysChanged (const ModifierKeys& modifiers); - - //============================================================================== - /** Enumeration used by the focusChanged() and focusLost() methods. */ - enum FocusChangeType - { - focusChangedByMouseClick, /**< Means that the user clicked the mouse to change focus. */ - focusChangedByTabKey, /**< Means that the user pressed the tab key to move the focus. */ - focusChangedDirectly /**< Means that the focus was changed by a call to grabKeyboardFocus(). */ - }; - - /** Called to indicate that this component has just acquired the keyboard focus. - @see focusLost, setWantsKeyboardFocus, getCurrentlyFocusedComponent, hasKeyboardFocus - */ - virtual void focusGained (FocusChangeType cause); - - /** Called to indicate that this component has just lost the keyboard focus. - @see focusGained, setWantsKeyboardFocus, getCurrentlyFocusedComponent, hasKeyboardFocus - */ - virtual void focusLost (FocusChangeType cause); - - /** Called to indicate a change in whether or not this component is the parent of the - currently-focused component. - - Essentially this is called when the return value of a call to hasKeyboardFocus (true) has - changed. It happens when focus moves from one of this component's children (at any depth) - to a component that isn't contained in this one, (or vice-versa). - Note that this method does NOT get called to when focus simply moves from one of its - child components to another. - - @see focusGained, setWantsKeyboardFocus, getCurrentlyFocusedComponent, hasKeyboardFocus - */ - virtual void focusOfChildComponentChanged (FocusChangeType cause); - - //============================================================================== - /** Returns true if the mouse is currently over this component. - - If the mouse isn't over the component, this will return false, even if the - mouse is currently being dragged - so you can use this in your mouseDrag - method to find out whether it's really over the component or not. - - Note that when the mouse button is being held down, then the only component - for which this method will return true is the one that was originally - clicked on. - - If includeChildren is true, then this will also return true if the mouse is over - any of the component's children (recursively) as well as the component itself. - - @see isMouseButtonDown. isMouseOverOrDragging, mouseDrag - */ - bool isMouseOver (bool includeChildren = false) const; - - /** Returns true if the mouse button is currently held down in this component. - - Note that this is a test to see whether the mouse is being pressed in this - component, so it'll return false if called on component A when the mouse - is actually being dragged in component B. - - @see isMouseButtonDownAnywhere, isMouseOver, isMouseOverOrDragging - */ - bool isMouseButtonDown() const; - - /** True if the mouse is over this component, or if it's being dragged in this component. - This is a handy equivalent to (isMouseOver() || isMouseButtonDown()). - @see isMouseOver, isMouseButtonDown, isMouseButtonDownAnywhere - */ - bool isMouseOverOrDragging() const; - - /** Returns true if a mouse button is currently down. - - Unlike isMouseButtonDown, this will test the current state of the - buttons without regard to which component (if any) it has been - pressed in. - - @see isMouseButtonDown, ModifierKeys - */ - static bool JUCE_CALLTYPE isMouseButtonDownAnywhere() noexcept; - - /** Returns the mouse's current position, relative to this component. - The return value is relative to the component's top-left corner. - */ - Point getMouseXYRelative() const; - - //============================================================================== - /** Called when this component's size has been changed. - - A component can implement this method to do things such as laying out its - child components when its width or height changes. - - The method is called synchronously as a result of the setBounds or setSize - methods, so repeatedly changing a components size will repeatedly call its - resized method (unlike things like repainting, where multiple calls to repaint - are coalesced together). - - If the component is a top-level window on the desktop, its size could also - be changed by operating-system factors beyond the application's control. - - @see moved, setSize - */ - virtual void resized(); - - /** Called when this component's position has been changed. - - This is called when the position relative to its parent changes, not when - its absolute position on the screen changes (so it won't be called for - all child components when a parent component is moved). - - The method is called synchronously as a result of the setBounds, setTopLeftPosition - or any of the other repositioning methods, and like resized(), it will be - called each time those methods are called. - - If the component is a top-level window on the desktop, its position could also - be changed by operating-system factors beyond the application's control. - - @see resized, setBounds - */ - virtual void moved(); - - /** Called when one of this component's children is moved or resized. - - If the parent wants to know about changes to its immediate children (not - to children of its children), this is the method to override. - - @see moved, resized, parentSizeChanged - */ - virtual void childBoundsChanged (Component* child); - - /** Called when this component's immediate parent has been resized. - - If the component is a top-level window, this indicates that the screen size - has changed. - - @see childBoundsChanged, moved, resized - */ - virtual void parentSizeChanged(); - - /** Called when this component has been moved to the front of its siblings. - - The component may have been brought to the front by the toFront() method, or - by the operating system if it's a top-level window. - - @see toFront - */ - virtual void broughtToFront(); - - /** Adds a listener to be told about changes to the component hierarchy or position. - - Component listeners get called when this component's size, position or children - change - see the ComponentListener class for more details. - - @param newListener the listener to register - if this is already registered, it - will be ignored. - @see ComponentListener, removeComponentListener - */ - void addComponentListener (ComponentListener* newListener); - - /** Removes a component listener. - @see addComponentListener - */ - void removeComponentListener (ComponentListener* listenerToRemove); - - //============================================================================== - /** Dispatches a numbered message to this component. - - This is a quick and cheap way of allowing simple asynchronous messages to - be sent to components. It's also safe, because if the component that you - send the message to is a null or dangling pointer, this won't cause an error. - - The command ID is later delivered to the component's handleCommandMessage() method by - the application's message queue. - - @see handleCommandMessage - */ - void postCommandMessage (int commandId); - - /** Called to handle a command that was sent by postCommandMessage(). - - This is called by the message thread when a command message arrives, and - the component can override this method to process it in any way it needs to. - - @see postCommandMessage - */ - virtual void handleCommandMessage (int commandId); - - //============================================================================== - /** Runs a component modally, waiting until the loop terminates. - - This method first makes the component visible, brings it to the front and - gives it the keyboard focus. - - It then runs a loop, dispatching messages from the system message queue, but - blocking all mouse or keyboard messages from reaching any components other - than this one and its children. - - This loop continues until the component's exitModalState() method is called (or - the component is deleted), and then this method returns, returning the value - passed into exitModalState(). - - @see enterModalState, exitModalState, isCurrentlyModal, getCurrentlyModalComponent, - isCurrentlyBlockedByAnotherModalComponent, ModalComponentManager - */ - #if JUCE_MODAL_LOOPS_PERMITTED - int runModalLoop(); - #endif - - /** Puts the component into a modal state. - - This makes the component modal, so that messages are blocked from reaching - any components other than this one and its children, but unlike runModalLoop(), - this method returns immediately. - - If takeKeyboardFocus is true, the component will use grabKeyboardFocus() to - get the focus, which is usually what you'll want it to do. If not, it will leave - the focus unchanged. - - The callback is an optional object which will receive a callback when the modal - component loses its modal status, either by being hidden or when exitModalState() - is called. If you pass an object in here, the system will take care of deleting it - later, after making the callback - - If deleteWhenDismissed is true, then when it is dismissed, the component will be - deleted and then the callback will be called. (This will safely handle the situation - where the component is deleted before its exitModalState() method is called). - - @see exitModalState, runModalLoop, ModalComponentManager::attachCallback - */ - void enterModalState (bool takeKeyboardFocus = true, - ModalComponentManager::Callback* callback = nullptr, - bool deleteWhenDismissed = false); - - /** Ends a component's modal state. - - If this component is currently modal, this will turn off its modalness, and return - a value to the runModalLoop() method that might have be running its modal loop. - - @see runModalLoop, enterModalState, isCurrentlyModal - */ - void exitModalState (int returnValue); - - /** Returns true if this component is the modal one. - - It's possible to have nested modal components, e.g. a pop-up dialog box - that launches another pop-up, but this will only return true for - the one at the top of the stack. - - @see getCurrentlyModalComponent - */ - bool isCurrentlyModal() const noexcept; - - /** Returns the number of components that are currently in a modal state. - @see getCurrentlyModalComponent - */ - static int JUCE_CALLTYPE getNumCurrentlyModalComponents() noexcept; - - /** Returns one of the components that are currently modal. - - The index specifies which of the possible modal components to return. The order - of the components in this list is the reverse of the order in which they became - modal - so the component at index 0 is always the active component, and the others - are progressively earlier ones that are themselves now blocked by later ones. - - @returns the modal component, or null if no components are modal (or if the - index is out of range) - @see getNumCurrentlyModalComponents, runModalLoop, isCurrentlyModal - */ - static Component* JUCE_CALLTYPE getCurrentlyModalComponent (int index = 0) noexcept; - - /** Checks whether there's a modal component somewhere that's stopping this one - from receiving messages. - - If there is a modal component, its canModalEventBeSentToComponent() method - will be called to see if it will still allow this component to receive events. - - @see runModalLoop, getCurrentlyModalComponent - */ - bool isCurrentlyBlockedByAnotherModalComponent() const; - - /** When a component is modal, this callback allows it to choose which other - components can still receive events. - - When a modal component is active and the user clicks on a non-modal component, - this method is called on the modal component, and if it returns true, the - event is allowed to reach its target. If it returns false, the event is blocked - and the inputAttemptWhenModal() callback is made. - - It called by the isCurrentlyBlockedByAnotherModalComponent() method. The default - implementation just returns false in all cases. - */ - virtual bool canModalEventBeSentToComponent (const Component* targetComponent); - - /** Called when the user tries to click on a component that is blocked by another - modal component. - - When a component is modal and the user clicks on one of the other components, - the modal component will receive this callback. - - The default implementation of this method will play a beep, and bring the currently - modal component to the front, but it can be overridden to do other tasks. - - @see isCurrentlyBlockedByAnotherModalComponent, canModalEventBeSentToComponent - */ - virtual void inputAttemptWhenModal(); - - - //============================================================================== - /** Returns the set of properties that belong to this component. - Each component has a NamedValueSet object which you can use to attach arbitrary - items of data to it. - */ - NamedValueSet& getProperties() noexcept { return properties; } - - /** Returns the set of properties that belong to this component. - Each component has a NamedValueSet object which you can use to attach arbitrary - items of data to it. - */ - const NamedValueSet& getProperties() const noexcept { return properties; } - - //============================================================================== - /** Looks for a colour that has been registered with the given colour ID number. - - If a colour has been set for this ID number using setColour(), then it is - returned. If none has been set, the method will try calling the component's - LookAndFeel class's findColour() method. If none has been registered with the - look-and-feel either, it will just return black. - - The colour IDs for various purposes are stored as enums in the components that - they are relevent to - for an example, see Slider::ColourIds, - Label::ColourIds, TextEditor::ColourIds, TreeView::ColourIds, etc. - - @see setColour, isColourSpecified, colourChanged, LookAndFeel::findColour, LookAndFeel::setColour - */ - Colour findColour (int colourId, bool inheritFromParent = false) const; - - /** Registers a colour to be used for a particular purpose. - - Changing a colour will cause a synchronous callback to the colourChanged() - method, which your component can override if it needs to do something when - colours are altered. - - For more details about colour IDs, see the comments for findColour(). - - @see findColour, isColourSpecified, colourChanged, LookAndFeel::findColour, LookAndFeel::setColour - */ - void setColour (int colourId, Colour newColour); - - /** If a colour has been set with setColour(), this will remove it. - This allows you to make a colour revert to its default state. - */ - void removeColour (int colourId); - - /** Returns true if the specified colour ID has been explicitly set for this - component using the setColour() method. - */ - bool isColourSpecified (int colourId) const; - - /** This looks for any colours that have been specified for this component, - and copies them to the specified target component. - */ - void copyAllExplicitColoursTo (Component& target) const; - - /** This method is called when a colour is changed by the setColour() method. - @see setColour, findColour - */ - virtual void colourChanged(); - - //============================================================================== - /** Components can implement this method to provide a MarkerList. - The default implementation of this method returns nullptr, but you can override - it to return a pointer to the component's marker list. If xAxis is true, it should - return the X marker list; if false, it should return the Y markers. - */ - virtual MarkerList* getMarkers (bool xAxis); - - //============================================================================== - /** Returns the underlying native window handle for this component. - - This is platform-dependent and strictly for power-users only! - */ - void* getWindowHandle() const; - - //============================================================================== - /** Holds a pointer to some type of Component, which automatically becomes null if - the component is deleted. - - If you're using a component which may be deleted by another event that's outside - of your control, use a SafePointer instead of a normal pointer to refer to it, - and you can test whether it's null before using it to see if something has deleted - it. - - The ComponentType typedef must be Component, or some subclass of Component. - - You may also want to use a WeakReference object for the same purpose. - */ - template - class SafePointer - { - public: - /** Creates a null SafePointer. */ - SafePointer() noexcept {} - - /** Creates a SafePointer that points at the given component. */ - SafePointer (ComponentType* component) : weakRef (component) {} - - /** Creates a copy of another SafePointer. */ - SafePointer (const SafePointer& other) noexcept : weakRef (other.weakRef) {} - - /** Copies another pointer to this one. */ - SafePointer& operator= (const SafePointer& other) { weakRef = other.weakRef; return *this; } - - /** Copies another pointer to this one. */ - SafePointer& operator= (ComponentType* newComponent) { weakRef = newComponent; return *this; } - - /** Returns the component that this pointer refers to, or null if the component no longer exists. */ - ComponentType* getComponent() const noexcept { return dynamic_cast (weakRef.get()); } - - /** Returns the component that this pointer refers to, or null if the component no longer exists. */ - operator ComponentType*() const noexcept { return getComponent(); } - - /** Returns the component that this pointer refers to, or null if the component no longer exists. */ - ComponentType* operator->() noexcept { return getComponent(); } - - /** Returns the component that this pointer refers to, or null if the component no longer exists. */ - const ComponentType* operator->() const noexcept { return getComponent(); } - - /** If the component is valid, this deletes it and sets this pointer to null. */ - void deleteAndZero() { delete getComponent(); } - - bool operator== (ComponentType* component) const noexcept { return weakRef == component; } - bool operator!= (ComponentType* component) const noexcept { return weakRef != component; } - - private: - WeakReference weakRef; - }; - - //============================================================================== - /** A class to keep an eye on a component and check for it being deleted. - - This is designed for use with the ListenerList::callChecked() methods, to allow - the list iterator to stop cleanly if the component is deleted by a listener callback - while the list is still being iterated. - */ - class JUCE_API BailOutChecker - { - public: - /** Creates a checker that watches one component. */ - BailOutChecker (Component* component); - - /** Returns true if either of the two components have been deleted since this object was created. */ - bool shouldBailOut() const noexcept; - - private: - const WeakReference safePointer; - - JUCE_DECLARE_NON_COPYABLE (BailOutChecker) - }; - - //============================================================================== - /** - Base class for objects that can be used to automatically position a component according to - some kind of algorithm. - - The component class simply holds onto a reference to a Positioner, but doesn't actually do - anything with it - all the functionality must be implemented by the positioner itself (e.g. - it might choose to watch some kind of value and move the component when the value changes). - */ - class JUCE_API Positioner - { - public: - /** Creates a Positioner which can control the specified component. */ - explicit Positioner (Component& component) noexcept; - /** Destructor. */ - virtual ~Positioner() {} - - /** Returns the component that this positioner controls. */ - Component& getComponent() const noexcept { return component; } - - /** Attempts to set the component's position to the given rectangle. - Unlike simply calling Component::setBounds(), this may involve the positioner - being smart enough to adjust itself to fit the new bounds, e.g. a RelativeRectangle's - positioner may try to reverse the expressions used to make them fit these new coordinates. - */ - virtual void applyNewBounds (const Rectangle& newBounds) = 0; - - private: - Component& component; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Positioner) - }; - - /** Returns the Positioner object that has been set for this component. - @see setPositioner() - */ - Positioner* getPositioner() const noexcept; - - /** Sets a new Positioner object for this component. - If there's currently another positioner set, it will be deleted. The object that is passed in - will be deleted automatically by this component when it's no longer required. Pass a null pointer - to clear the current positioner. - @see getPositioner() - */ - void setPositioner (Positioner* newPositioner); - - /** Gives the component a CachedComponentImage that should be used to buffer its painting. - The object that is passed-in will be owned by this component, and will be deleted automatically - later on. - @see setBufferedToImage - */ - void setCachedComponentImage (CachedComponentImage* newCachedImage); - - /** Returns the object that was set by setCachedComponentImage(). - @see setCachedComponentImage - */ - CachedComponentImage* getCachedComponentImage() const noexcept { return cachedImage; } - - //============================================================================== - // These methods are deprecated - use localPointToGlobal, getLocalPoint, getLocalPoint, etc instead. - JUCE_DEPRECATED (Point relativePositionToGlobal (Point) const); - JUCE_DEPRECATED (Point globalPositionToRelative (Point) const); - JUCE_DEPRECATED (Point relativePositionToOtherComponent (const Component*, Point) const); - -private: - //============================================================================== - friend class ComponentPeer; - friend class MouseInputSource; - friend class MouseInputSourceInternal; - - #ifndef DOXYGEN - static Component* currentlyFocusedComponent; - - //============================================================================== - String componentName, componentID; - Component* parentComponent; - Rectangle bounds; - ScopedPointer positioner; - ScopedPointer affineTransform; - Array childComponentList; - LookAndFeel* lookAndFeel; - MouseCursor cursor; - ImageEffectFilter* effect; - ScopedPointer cachedImage; - - class MouseListenerList; - friend class MouseListenerList; - friend struct ContainerDeletePolicy; - ScopedPointer mouseListeners; - ScopedPointer > keyListeners; - ListenerList componentListeners; - NamedValueSet properties; - - friend class WeakReference; - WeakReference::Master masterReference; - - struct ComponentFlags - { - bool hasHeavyweightPeerFlag : 1; - bool visibleFlag : 1; - bool opaqueFlag : 1; - bool ignoresMouseClicksFlag : 1; - bool allowChildMouseClicksFlag : 1; - bool wantsFocusFlag : 1; - bool isFocusContainerFlag : 1; - bool dontFocusOnMouseClickFlag : 1; - bool alwaysOnTopFlag : 1; - bool bufferToImageFlag : 1; - bool bringToFrontOnClickFlag : 1; - bool repaintOnMouseActivityFlag : 1; - bool currentlyModalFlag : 1; - bool isDisabledFlag : 1; - bool childCompFocusedFlag : 1; - bool dontClipGraphicsFlag : 1; - bool mouseDownWasBlocked : 1; - bool isMoveCallbackPending : 1; - bool isResizeCallbackPending : 1; - #if JUCE_DEBUG - bool isInsidePaintCall : 1; - #endif - }; - - union - { - uint32 componentFlags; - ComponentFlags flags; - }; - - uint8 componentTransparency; - - //============================================================================== - void internalMouseEnter (MouseInputSource, Point, Time); - void internalMouseExit (MouseInputSource, Point, Time); - void internalMouseDown (MouseInputSource, Point, Time); - void internalMouseUp (MouseInputSource, Point, Time, const ModifierKeys oldModifiers); - void internalMouseDrag (MouseInputSource, Point, Time); - void internalMouseMove (MouseInputSource, Point, Time); - void internalMouseWheel (MouseInputSource, Point, Time, const MouseWheelDetails&); - void internalMagnifyGesture (MouseInputSource, Point, Time, float); - void internalBroughtToFront(); - void internalFocusGain (FocusChangeType, const WeakReference&); - void internalFocusGain (FocusChangeType); - void internalFocusLoss (FocusChangeType); - void internalChildFocusChange (FocusChangeType, const WeakReference&); - void internalModalInputAttempt(); - void internalModifierKeysChanged(); - void internalChildrenChanged(); - void internalHierarchyChanged(); - void internalRepaint (const Rectangle&); - void internalRepaintUnchecked (const Rectangle&, bool); - Component* removeChildComponent (int index, bool sendParentEvents, bool sendChildEvents); - void reorderChildInternal (int sourceIndex, int destIndex); - void paintComponentAndChildren (Graphics&); - void paintWithinParentContext (Graphics&); - void sendMovedResizedMessages (bool wasMoved, bool wasResized); - void sendMovedResizedMessagesIfPending(); - void repaintParent(); - void sendFakeMouseMove() const; - void takeKeyboardFocus (const FocusChangeType); - void grabFocusInternal (const FocusChangeType, bool canTryParent); - static void giveAwayFocus (bool sendFocusLossEvent); - void sendEnablementChangeMessage(); - void sendVisibilityChangeMessage(); - - struct ComponentHelpers; - friend struct ComponentHelpers; - - /* Components aren't allowed to have copy constructors, as this would mess up parent hierarchies. - You might need to give your subclasses a private dummy constructor to avoid compiler warnings. - */ - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Component) - - //============================================================================== - #if JUCE_CATCH_DEPRECATED_CODE_MISUSE - // This is included here just to cause a compile error if your code is still handling - // drag-and-drop with this method. If so, just update it to use the new FileDragAndDropTarget - // class, which is easy (just make your class inherit from FileDragAndDropTarget, and - // implement its methods instead of this Component method). - virtual void filesDropped (const StringArray&, int, int) {} - - // This is included here to cause an error if you use or overload it - it has been deprecated in - // favour of contains (Point) - void contains (int, int) JUCE_DELETED_FUNCTION; - #endif - -protected: - //============================================================================== - /** @internal */ - virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo); - #endif -}; - - -#endif // JUCE_COMPONENT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp deleted file mode 100755 index 3e5cd35..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -void ComponentListener::componentMovedOrResized (Component&, bool, bool) {} -void ComponentListener::componentBroughtToFront (Component&) {} -void ComponentListener::componentVisibilityChanged (Component&) {} -void ComponentListener::componentChildrenChanged (Component&) {} -void ComponentListener::componentParentHierarchyChanged (Component&) {} -void ComponentListener::componentNameChanged (Component&) {} -void ComponentListener::componentBeingDeleted (Component&) {} diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h deleted file mode 100755 index 56c0631..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ComponentListener.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_COMPONENTLISTENER_H_INCLUDED -#define JUCE_COMPONENTLISTENER_H_INCLUDED - - -//============================================================================== -/** - Gets informed about changes to a component's hierarchy or position. - - To monitor a component for changes, register a subclass of ComponentListener - with the component using Component::addComponentListener(). - - Be sure to deregister listeners before you delete them! - - @see Component::addComponentListener, Component::removeComponentListener -*/ -class JUCE_API ComponentListener -{ -public: - /** Destructor. */ - virtual ~ComponentListener() {} - - /** Called when the component's position or size changes. - - @param component the component that was moved or resized - @param wasMoved true if the component's top-left corner has just moved - @param wasResized true if the component's width or height has just changed - @see Component::setBounds, Component::resized, Component::moved - */ - virtual void componentMovedOrResized (Component& component, - bool wasMoved, - bool wasResized); - - /** Called when the component is brought to the top of the z-order. - - @param component the component that was moved - @see Component::toFront, Component::broughtToFront - */ - virtual void componentBroughtToFront (Component& component); - - /** Called when the component is made visible or invisible. - - @param component the component that changed - @see Component::setVisible - */ - virtual void componentVisibilityChanged (Component& component); - - /** Called when the component has children added or removed, or their z-order - changes. - - @param component the component whose children have changed - @see Component::childrenChanged, Component::addChildComponent, - Component::removeChildComponent - */ - virtual void componentChildrenChanged (Component& component); - - /** Called to indicate that the component's parents have changed. - - When a component is added or removed from its parent, all of its children - will produce this notification (recursively - so all children of its - children will also be called as well). - - @param component the component that this listener is registered with - @see Component::parentHierarchyChanged - */ - virtual void componentParentHierarchyChanged (Component& component); - - /** Called when the component's name is changed. - - @see Component::setName, Component::getName - */ - virtual void componentNameChanged (Component& component); - - /** Called when the component is in the process of being deleted. - - This callback is made from inside the destructor, so be very, very cautious - about what you do in here. - - In particular, bear in mind that it's the Component base class's destructor that calls - this - so if the object that's being deleted is a subclass of Component, then the - subclass layers of the object will already have been destructed when it gets to this - point! - */ - virtual void componentBeingDeleted (Component& component); -}; - - -#endif // JUCE_COMPONENTLISTENER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp deleted file mode 100755 index bb77371..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.cpp +++ /dev/null @@ -1,415 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -Desktop::Desktop() - : mouseSources (new MouseInputSource::SourceList()), - mouseClickCounter (0), mouseWheelCounter (0), - kioskModeComponent (nullptr), - kioskModeReentrant (false), - allowedOrientations (allOrientations), - masterScaleFactor ((float) getDefaultMasterScale()) -{ - displays = new Displays (*this); -} - -Desktop::~Desktop() -{ - setScreenSaverEnabled (true); - - jassert (instance == this); - instance = nullptr; - - // doh! If you don't delete all your windows before exiting, you're going to - // be leaking memory! - jassert (desktopComponents.size() == 0); -} - -Desktop& JUCE_CALLTYPE Desktop::getInstance() -{ - if (instance == nullptr) - instance = new Desktop(); - - return *instance; -} - -Desktop* Desktop::instance = nullptr; - -//============================================================================== -int Desktop::getNumComponents() const noexcept -{ - return desktopComponents.size(); -} - -Component* Desktop::getComponent (const int index) const noexcept -{ - return desktopComponents [index]; -} - -Component* Desktop::findComponentAt (Point screenPosition) const -{ - ASSERT_MESSAGE_MANAGER_IS_LOCKED - - for (int i = desktopComponents.size(); --i >= 0;) - { - Component* const c = desktopComponents.getUnchecked(i); - - if (c->isVisible()) - { - const Point relative (c->getLocalPoint (nullptr, screenPosition)); - - if (c->contains (relative)) - return c->getComponentAt (relative); - } - } - - return nullptr; -} - -//============================================================================== -LookAndFeel& Desktop::getDefaultLookAndFeel() noexcept -{ - if (currentLookAndFeel == nullptr) - { - if (defaultLookAndFeel == nullptr) - defaultLookAndFeel = new LookAndFeel_V2(); - - currentLookAndFeel = defaultLookAndFeel; - } - - return *currentLookAndFeel; -} - -void Desktop::setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel) -{ - ASSERT_MESSAGE_MANAGER_IS_LOCKED - currentLookAndFeel = newDefaultLookAndFeel; - - for (int i = getNumComponents(); --i >= 0;) - if (Component* const c = getComponent (i)) - c->sendLookAndFeelChange(); -} - -//============================================================================== -void Desktop::addDesktopComponent (Component* const c) -{ - jassert (c != nullptr); - jassert (! desktopComponents.contains (c)); - desktopComponents.addIfNotAlreadyThere (c); -} - -void Desktop::removeDesktopComponent (Component* const c) -{ - desktopComponents.removeFirstMatchingValue (c); -} - -void Desktop::componentBroughtToFront (Component* const c) -{ - const int index = desktopComponents.indexOf (c); - jassert (index >= 0); - - if (index >= 0) - { - int newIndex = -1; - - if (! c->isAlwaysOnTop()) - { - newIndex = desktopComponents.size(); - - while (newIndex > 0 && desktopComponents.getUnchecked (newIndex - 1)->isAlwaysOnTop()) - --newIndex; - - --newIndex; - } - - desktopComponents.move (index, newIndex); - } -} - -//============================================================================== -Point Desktop::getMousePosition() -{ - return getMousePositionFloat().roundToInt(); -} - -Point Desktop::getMousePositionFloat() -{ - return getInstance().getMainMouseSource().getScreenPosition(); -} - -void Desktop::setMousePosition (Point newPosition) -{ - getInstance().getMainMouseSource().setScreenPosition (newPosition.toFloat()); -} - -Point Desktop::getLastMouseDownPosition() -{ - return getInstance().getMainMouseSource().getLastMouseDownPosition().roundToInt(); -} - -int Desktop::getMouseButtonClickCounter() const noexcept { return mouseClickCounter; } -int Desktop::getMouseWheelMoveCounter() const noexcept { return mouseWheelCounter; } - -void Desktop::incrementMouseClickCounter() noexcept { ++mouseClickCounter; } -void Desktop::incrementMouseWheelCounter() noexcept { ++mouseWheelCounter; } - -const Array& Desktop::getMouseSources() const noexcept { return mouseSources->sourceArray; } -int Desktop::getNumMouseSources() const noexcept { return mouseSources->sources.size(); } -int Desktop::getNumDraggingMouseSources() const noexcept { return mouseSources->getNumDraggingMouseSources(); } -MouseInputSource* Desktop::getMouseSource (int index) const noexcept { return mouseSources->getMouseSource (index); } -MouseInputSource* Desktop::getDraggingMouseSource (int index) const noexcept { return mouseSources->getDraggingMouseSource (index); } -MouseInputSource Desktop::getMainMouseSource() const noexcept { return MouseInputSource (mouseSources->sources.getUnchecked(0)); } -void Desktop::beginDragAutoRepeat (int interval) { mouseSources->beginDragAutoRepeat (interval); } - -//============================================================================== -void Desktop::addFocusChangeListener (FocusChangeListener* const listener) { focusListeners.add (listener); } -void Desktop::removeFocusChangeListener (FocusChangeListener* const listener) { focusListeners.remove (listener); } -void Desktop::triggerFocusCallback() { triggerAsyncUpdate(); } - -void Desktop::handleAsyncUpdate() -{ - // The component may be deleted during this operation, but we'll use a SafePointer rather than a - // BailOutChecker so that any remaining listeners will still get a callback (with a null pointer). - WeakReference currentFocus (Component::getCurrentlyFocusedComponent()); - focusListeners.call (&FocusChangeListener::globalFocusChanged, currentFocus); -} - -//============================================================================== -void Desktop::resetTimer() -{ - if (mouseListeners.size() == 0) - stopTimer(); - else - startTimer (100); - - lastFakeMouseMove = getMousePositionFloat(); -} - -ListenerList& Desktop::getMouseListeners() -{ - resetTimer(); - return mouseListeners; -} - -void Desktop::addGlobalMouseListener (MouseListener* const listener) -{ - ASSERT_MESSAGE_MANAGER_IS_LOCKED - mouseListeners.add (listener); - resetTimer(); -} - -void Desktop::removeGlobalMouseListener (MouseListener* const listener) -{ - ASSERT_MESSAGE_MANAGER_IS_LOCKED - mouseListeners.remove (listener); - resetTimer(); -} - -void Desktop::timerCallback() -{ - if (lastFakeMouseMove != getMousePositionFloat()) - sendMouseMove(); -} - -void Desktop::sendMouseMove() -{ - if (! mouseListeners.isEmpty()) - { - startTimer (20); - - lastFakeMouseMove = getMousePositionFloat(); - - if (Component* const target = findComponentAt (lastFakeMouseMove.roundToInt())) - { - Component::BailOutChecker checker (target); - const Point pos (target->getLocalPoint (nullptr, lastFakeMouseMove)); - const Time now (Time::getCurrentTime()); - - const MouseEvent me (getMainMouseSource(), pos, ModifierKeys::getCurrentModifiers(), - target, target, now, pos, now, 0, false); - - if (me.mods.isAnyMouseButtonDown()) - mouseListeners.callChecked (checker, &MouseListener::mouseDrag, me); - else - mouseListeners.callChecked (checker, &MouseListener::mouseMove, me); - } - } -} - - -//============================================================================== -Desktop::Displays::Displays (Desktop& desktop) { init (desktop); } -Desktop::Displays::~Displays() {} - -const Desktop::Displays::Display& Desktop::Displays::getMainDisplay() const noexcept -{ - ASSERT_MESSAGE_MANAGER_IS_LOCKED - jassert (displays.getReference(0).isMain); - return displays.getReference(0); -} - -const Desktop::Displays::Display& Desktop::Displays::getDisplayContaining (Point position) const noexcept -{ - ASSERT_MESSAGE_MANAGER_IS_LOCKED - const Display* best = &displays.getReference(0); - double bestDistance = 1.0e10; - - for (int i = displays.size(); --i >= 0;) - { - const Display& d = displays.getReference(i); - - if (d.totalArea.contains (position)) - { - best = &d; - break; - } - - const double distance = d.totalArea.getCentre().getDistanceFrom (position); - - if (distance < bestDistance) - { - bestDistance = distance; - best = &d; - } - } - - return *best; -} - -RectangleList Desktop::Displays::getRectangleList (bool userAreasOnly) const -{ - ASSERT_MESSAGE_MANAGER_IS_LOCKED - RectangleList rl; - - for (int i = 0; i < displays.size(); ++i) - { - const Display& d = displays.getReference(i); - rl.addWithoutMerging (userAreasOnly ? d.userArea : d.totalArea); - } - - return rl; -} - -Rectangle Desktop::Displays::getTotalBounds (bool userAreasOnly) const -{ - return getRectangleList (userAreasOnly).getBounds(); -} - -bool operator== (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept; -bool operator== (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept -{ - return d1.userArea == d2.userArea - && d1.totalArea == d2.totalArea - && d1.scale == d2.scale - && d1.isMain == d2.isMain; -} - -bool operator!= (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept; -bool operator!= (const Desktop::Displays::Display& d1, const Desktop::Displays::Display& d2) noexcept -{ - return ! (d1 == d2); -} - -void Desktop::Displays::init (Desktop& desktop) -{ - findDisplays (desktop.getGlobalScaleFactor()); - jassert (displays.size() > 0); -} - -void Desktop::Displays::refresh() -{ - Array oldDisplays; - oldDisplays.swapWith (displays); - - init (Desktop::getInstance()); - jassert (displays.size() > 0); - - if (oldDisplays != displays) - { - for (int i = ComponentPeer::getNumPeers(); --i >= 0;) - if (ComponentPeer* const peer = ComponentPeer::getPeer (i)) - peer->handleScreenSizeChange(); - } -} - -//============================================================================== -void Desktop::setKioskModeComponent (Component* componentToUse, const bool allowMenusAndBars) -{ - if (kioskModeReentrant) - return; - - const ScopedValueSetter setter (kioskModeReentrant, true, false); - - if (kioskModeComponent != componentToUse) - { - // agh! Don't delete or remove a component from the desktop while it's still the kiosk component! - jassert (kioskModeComponent == nullptr || ComponentPeer::getPeerFor (kioskModeComponent) != nullptr); - - if (Component* const oldKioskComp = kioskModeComponent) - { - kioskModeComponent = nullptr; // (to make sure that isKioskMode() returns false when resizing the old one) - setKioskComponent (oldKioskComp, false, allowMenusAndBars); - oldKioskComp->setBounds (kioskComponentOriginalBounds); - } - - kioskModeComponent = componentToUse; - - if (kioskModeComponent != nullptr) - { - // Only components that are already on the desktop can be put into kiosk mode! - jassert (ComponentPeer::getPeerFor (kioskModeComponent) != nullptr); - - kioskComponentOriginalBounds = kioskModeComponent->getBounds(); - setKioskComponent (kioskModeComponent, true, allowMenusAndBars); - } - } -} - -//============================================================================== -void Desktop::setOrientationsEnabled (const int newOrientations) -{ - // Dodgy set of flags being passed here! Make sure you specify at least one permitted orientation. - jassert (newOrientations != 0 && (newOrientations & ~allOrientations) == 0); - - allowedOrientations = newOrientations; -} - -bool Desktop::isOrientationEnabled (const DisplayOrientation orientation) const noexcept -{ - // Make sure you only pass one valid flag in here... - jassert (orientation == upright || orientation == upsideDown - || orientation == rotatedClockwise || orientation == rotatedAntiClockwise); - - return (allowedOrientations & orientation) != 0; -} - -void Desktop::setGlobalScaleFactor (float newScaleFactor) noexcept -{ - ASSERT_MESSAGE_MANAGER_IS_LOCKED - - if (masterScaleFactor != newScaleFactor) - { - masterScaleFactor = newScaleFactor; - displays->refresh(); - } -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h b/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h deleted file mode 100755 index 4cc3317..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_Desktop.h +++ /dev/null @@ -1,460 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DESKTOP_H_INCLUDED -#define JUCE_DESKTOP_H_INCLUDED - - -//============================================================================== -/** - Classes can implement this interface and register themselves with the Desktop class - to receive callbacks when the currently focused component changes. - - @see Desktop::addFocusChangeListener, Desktop::removeFocusChangeListener -*/ -class JUCE_API FocusChangeListener -{ -public: - /** Destructor. */ - virtual ~FocusChangeListener() {} - - /** Callback to indicate that the currently focused component has changed. */ - virtual void globalFocusChanged (Component* focusedComponent) = 0; -}; - - -//============================================================================== -/** - Describes and controls aspects of the computer's desktop. - -*/ -class JUCE_API Desktop : private DeletedAtShutdown, - private Timer, - private AsyncUpdater -{ -public: - //============================================================================== - /** There's only one desktop object, and this method will return it. */ - static Desktop& JUCE_CALLTYPE getInstance(); - - //============================================================================== - /** Returns the mouse position. - - The coordinates are relative to the top-left of the main monitor. - - Note that this is just a shortcut for calling getMainMouseSource().getScreenPosition(), and - you should only resort to grabbing the global mouse position if there's really no - way to get the coordinates via a mouse event callback instead. - */ - static Point getMousePosition(); - - /** Makes the mouse pointer jump to a given location. - The coordinates are relative to the top-left of the main monitor. - */ - static void setMousePosition (Point newPosition); - - /** Returns the last position at which a mouse button was pressed. - - Note that this is just a shortcut for calling getMainMouseSource().getLastMouseDownPosition(), - and in a multi-touch environment, it doesn't make much sense. ALWAYS prefer to - get this information via other means, such as MouseEvent::getMouseDownScreenPosition() - if possible, and only ever call this as a last resort. - */ - static Point getLastMouseDownPosition(); - - /** Returns the number of times the mouse button has been clicked since the app started. - Each mouse-down event increments this number by 1. - @see getMouseWheelMoveCounter - */ - int getMouseButtonClickCounter() const noexcept; - - /** Returns the number of times the mouse wheel has been moved since the app started. - Each mouse-wheel event increments this number by 1. - @see getMouseButtonClickCounter - */ - int getMouseWheelMoveCounter() const noexcept; - - //============================================================================== - /** This lets you prevent the screensaver from becoming active. - - Handy if you're running some sort of presentation app where having a screensaver - appear would be annoying. - - Pass false to disable the screensaver, and true to re-enable it. (Note that this - won't enable a screensaver unless the user has actually set one up). - - The disablement will only happen while the Juce application is the foreground - process - if another task is running in front of it, then the screensaver will - be unaffected. - - @see isScreenSaverEnabled - */ - static void setScreenSaverEnabled (bool isEnabled); - - /** Returns true if the screensaver has not been turned off. - - This will return the last value passed into setScreenSaverEnabled(). Note that - it won't tell you whether the user is actually using a screen saver, just - whether this app is deliberately preventing one from running. - - @see setScreenSaverEnabled - */ - static bool isScreenSaverEnabled(); - - //============================================================================== - /** Registers a MouseListener that will receive all mouse events that occur on - any component. - - @see removeGlobalMouseListener - */ - void addGlobalMouseListener (MouseListener* listener); - - /** Unregisters a MouseListener that was added with the addGlobalMouseListener() - method. - - @see addGlobalMouseListener - */ - void removeGlobalMouseListener (MouseListener* listener); - - //============================================================================== - /** Registers a MouseListener that will receive a callback whenever the focused - component changes. - */ - void addFocusChangeListener (FocusChangeListener* listener); - - /** Unregisters a listener that was added with addFocusChangeListener(). */ - void removeFocusChangeListener (FocusChangeListener* listener); - - //============================================================================== - /** Takes a component and makes it full-screen, removing the taskbar, dock, etc. - - The component must already be on the desktop for this method to work. It will - be resized to completely fill the screen and any extraneous taskbars, menu bars, - etc will be hidden. - - To exit kiosk mode, just call setKioskModeComponent (nullptr). When this is called, - the component that's currently being used will be resized back to the size - and position it was in before being put into this mode. - - If allowMenusAndBars is true, things like the menu and dock (on mac) are still - allowed to pop up when the mouse moves onto them. If this is false, it'll try - to hide as much on-screen paraphenalia as possible. - */ - void setKioskModeComponent (Component* componentToUse, - bool allowMenusAndBars = true); - - /** Returns the component that is currently being used in kiosk-mode. - - This is the component that was last set by setKioskModeComponent(). If none - has been set, this returns nullptr. - */ - Component* getKioskModeComponent() const noexcept { return kioskModeComponent; } - - //============================================================================== - /** Returns the number of components that are currently active as top-level - desktop windows. - - @see getComponent, Component::addToDesktop - */ - int getNumComponents() const noexcept; - - /** Returns one of the top-level desktop window components. - - The index is from 0 to getNumComponents() - 1. This could return 0 if the - index is out-of-range. - - @see getNumComponents, Component::addToDesktop - */ - Component* getComponent (int index) const noexcept; - - /** Finds the component at a given screen location. - - This will drill down into top-level windows to find the child component at - the given position. - - Returns nullptr if the coordinates are inside a non-Juce window. - */ - Component* findComponentAt (Point screenPosition) const; - - /** The Desktop object has a ComponentAnimator instance which can be used for performing - your animations. - - Having a single shared ComponentAnimator object makes it more efficient when multiple - components are being moved around simultaneously. It's also more convenient than having - to manage your own instance of one. - - @see ComponentAnimator - */ - ComponentAnimator& getAnimator() noexcept { return animator; } - - //============================================================================== - /** Returns the current default look-and-feel for components which don't have one - explicitly set. - @see setDefaultLookAndFeel - */ - LookAndFeel& getDefaultLookAndFeel() noexcept; - - /** Changes the default look-and-feel. - @param newDefaultLookAndFeel the new look-and-feel object to use - if this is - set to nullptr, it will revert to using the system's - default one. The object passed-in must be deleted by the - caller when it's no longer needed. - @see getDefaultLookAndFeel - */ - void setDefaultLookAndFeel (LookAndFeel* newDefaultLookAndFeel); - - //============================================================================== - /** Provides access to the array of mouse sources, for iteration. - In a traditional single-mouse system, there might be only one MouseInputSource. On a - multi-touch system, there could be one input source per potential finger. The number - of mouse sources returned here may increase dynamically as the program runs. - To find out how many mouse events are currently happening, use getNumDraggingMouseSources(). - */ - const Array& getMouseSources() const noexcept; - - /** Returns the number of MouseInputSource objects the system has at its disposal. - In a traditional single-mouse system, there might be only one MouseInputSource. On a - multi-touch system, there could be one input source per potential finger. The number - of mouse sources returned here may increase dynamically as the program runs. - To find out how many mouse events are currently happening, use getNumDraggingMouseSources(). - @see getMouseSource - */ - int getNumMouseSources() const noexcept; - - /** Returns one of the system's MouseInputSource objects. - The index should be from 0 to getNumMouseSources() - 1. Out-of-range indexes will return - a null pointer. - In a traditional single-mouse system, there might be only one object. On a multi-touch - system, there could be one input source per potential finger. - */ - MouseInputSource* getMouseSource (int index) const noexcept; - - /** Returns the main mouse input device that the system is using. - @see getNumMouseSources() - */ - MouseInputSource getMainMouseSource() const noexcept; - - /** Returns the number of mouse-sources that are currently being dragged. - In a traditional single-mouse system, this will be 0 or 1, depending on whether a - juce component has the button down on it. In a multi-touch system, this could - be any number from 0 to the number of simultaneous touches that can be detected. - */ - int getNumDraggingMouseSources() const noexcept; - - /** Returns one of the mouse sources that's currently being dragged. - The index should be between 0 and getNumDraggingMouseSources() - 1. If the index is - out of range, or if no mice or fingers are down, this will return a null pointer. - */ - MouseInputSource* getDraggingMouseSource (int index) const noexcept; - - /** Ensures that a non-stop stream of mouse-drag events will be sent during the - current mouse-drag operation. - - This allows you to make sure that mouseDrag() events are sent continuously, even - when the mouse isn't moving. This can be useful for things like auto-scrolling - components when the mouse is near an edge. - - Call this method during a mouseDown() or mouseDrag() callback, specifying the - minimum interval between consecutive mouse drag callbacks. The callbacks - will continue until the mouse is released, and then the interval will be reset, - so you need to make sure it's called every time you begin a drag event. - Passing an interval of 0 or less will cancel the auto-repeat. - - @see mouseDrag - */ - void beginDragAutoRepeat (int millisecondsBetweenCallbacks); - - //============================================================================== - /** In a tablet device which can be turned around, this is used to inidicate the orientation. */ - enum DisplayOrientation - { - upright = 1, /**< Indicates that the display is the normal way up. */ - upsideDown = 2, /**< Indicates that the display is upside-down. */ - rotatedClockwise = 4, /**< Indicates that the display is turned 90 degrees clockwise from its upright position. */ - rotatedAntiClockwise = 8, /**< Indicates that the display is turned 90 degrees anti-clockwise from its upright position. */ - - allOrientations = 1 + 2 + 4 + 8 /**< A combination of all the orientation values */ - }; - - /** In a tablet device which can be turned around, this returns the current orientation. */ - DisplayOrientation getCurrentOrientation() const; - - /** Sets which orientations the display is allowed to auto-rotate to. - - For devices that support rotating desktops, this lets you specify which of the orientations your app can use. - - The parameter is a bitwise or-ed combination of the values in DisplayOrientation, and must contain at least one - set bit. - */ - void setOrientationsEnabled (int allowedOrientations); - - /** Returns whether the display is allowed to auto-rotate to the given orientation. - Each orientation can be enabled using setOrientationEnabled(). By default, all orientations are allowed. - */ - bool isOrientationEnabled (DisplayOrientation orientation) const noexcept; - - //============================================================================== - class JUCE_API Displays - { - public: - /** Contains details about a display device. */ - struct Display - { - /** This is the bounds of the area of this display which isn't covered by - OS-dependent objects like the taskbar, menu bar, etc. */ - Rectangle userArea; - - /** This is the total physical area of this display, including any taskbars, etc */ - Rectangle totalArea; - - /** This is the scale-factor of this display. - If you create a component with size 1x1, this scale factor indicates the actual - size of the component in terms of physical pixels. - For higher-resolution displays, it may be a value greater than 1.0 - */ - double scale; - - /** The DPI of the display. - This is the number of physical pixels per inch. To get the number of logical - pixels per inch, divide this by the Display::scale value. - */ - double dpi; - - /** This will be true if this is the user's main screen. */ - bool isMain; - }; - - /** Returns the display which acts as user's main screen. */ - const Display& getMainDisplay() const noexcept; - - /** Returns the display which contains a particular point. - If the point lies outside all the displays, the nearest one will be returned. - */ - const Display& getDisplayContaining (Point position) const noexcept; - - /** Returns a RectangleList made up of all the displays. */ - RectangleList getRectangleList (bool userAreasOnly) const; - - /** Returns the smallest bounding box which contains all the displays. */ - Rectangle getTotalBounds (bool userAreasOnly) const; - - /** The list of displays. */ - Array displays; - - #ifndef DOXYGEN - /** @internal */ - void refresh(); - #endif - - private: - friend class Desktop; - friend struct ContainerDeletePolicy; - Displays (Desktop&); - ~Displays(); - - void init (Desktop&); - void findDisplays (float masterScale); - }; - - const Displays& getDisplays() const noexcept { return *displays; } - - //============================================================================== - /** Sets a global scale factor to be used for all desktop windows. - Setting this will also scale the monitor sizes that are returned by getDisplays(). - */ - void setGlobalScaleFactor (float newScaleFactor) noexcept; - - /** Returns the current global scale factor, as set by setGlobalScaleFactor(). - @see setGlobalScaleFactor - */ - float getGlobalScaleFactor() const noexcept { return masterScaleFactor; } - - //============================================================================== - /** True if the OS supports semitransparent windows */ - static bool canUseSemiTransparentWindows() noexcept; - -private: - //============================================================================== - static Desktop* instance; - - friend class Component; - friend class ComponentPeer; - friend class MouseInputSourceInternal; - friend class DeletedAtShutdown; - friend class TopLevelWindowManager; - - ScopedPointer mouseSources; - - ListenerList mouseListeners; - ListenerList focusListeners; - - Array desktopComponents; - Array peers; - - ScopedPointer displays; - - Point lastFakeMouseMove; - void sendMouseMove(); - - int mouseClickCounter, mouseWheelCounter; - void incrementMouseClickCounter() noexcept; - void incrementMouseWheelCounter() noexcept; - - ScopedPointer defaultLookAndFeel; - WeakReference currentLookAndFeel; - - Component* kioskModeComponent; - Rectangle kioskComponentOriginalBounds; - bool kioskModeReentrant; - - int allowedOrientations; - float masterScaleFactor; - - ComponentAnimator animator; - - void timerCallback() override; - void resetTimer(); - ListenerList& getMouseListeners(); - - void addDesktopComponent (Component*); - void removeDesktopComponent (Component*); - void componentBroughtToFront (Component*); - - void setKioskComponent (Component*, bool shouldBeEnabled, bool allowMenusAndBars); - - void triggerFocusCallback(); - void handleAsyncUpdate() override; - - static Point getMousePositionFloat(); - - static double getDefaultMasterScale(); - - Desktop(); - ~Desktop(); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Desktop) -}; - - -#endif // JUCE_DESKTOP_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp deleted file mode 100755 index 12b81df..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.cpp +++ /dev/null @@ -1,294 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class ModalComponentManager::ModalItem : public ComponentMovementWatcher -{ -public: - ModalItem (Component* const comp, const bool autoDelete_) - : ComponentMovementWatcher (comp), - component (comp), returnValue (0), - isActive (true), autoDelete (autoDelete_) - { - jassert (comp != nullptr); - } - - void componentMovedOrResized (bool, bool) override {} - - void componentPeerChanged() override - { - if (! component->isShowing()) - cancel(); - } - - void componentVisibilityChanged() override - { - if (! component->isShowing()) - cancel(); - } - - void componentBeingDeleted (Component& comp) override - { - ComponentMovementWatcher::componentBeingDeleted (comp); - - if (component == &comp || comp.isParentOf (component)) - { - autoDelete = false; - cancel(); - } - } - - void cancel() - { - if (isActive) - { - isActive = false; - - if (ModalComponentManager* mcm = ModalComponentManager::getInstanceWithoutCreating()) - mcm->triggerAsyncUpdate(); - } - } - - Component* component; - OwnedArray callbacks; - int returnValue; - bool isActive, autoDelete; - -private: - JUCE_DECLARE_NON_COPYABLE (ModalItem) -}; - -//============================================================================== -ModalComponentManager::ModalComponentManager() -{ -} - -ModalComponentManager::~ModalComponentManager() -{ - stack.clear(); - clearSingletonInstance(); -} - -juce_ImplementSingleton_SingleThreaded (ModalComponentManager) - - -//============================================================================== -void ModalComponentManager::startModal (Component* component, bool autoDelete) -{ - if (component != nullptr) - stack.add (new ModalItem (component, autoDelete)); -} - -void ModalComponentManager::attachCallback (Component* component, Callback* callback) -{ - if (callback != nullptr) - { - ScopedPointer callbackDeleter (callback); - - for (int i = stack.size(); --i >= 0;) - { - ModalItem* const item = stack.getUnchecked(i); - - if (item->component == component) - { - item->callbacks.add (callback); - callbackDeleter.release(); - break; - } - } - } -} - -void ModalComponentManager::endModal (Component* component) -{ - for (int i = stack.size(); --i >= 0;) - { - ModalItem* const item = stack.getUnchecked(i); - - if (item->component == component) - item->cancel(); - } -} - -void ModalComponentManager::endModal (Component* component, int returnValue) -{ - for (int i = stack.size(); --i >= 0;) - { - ModalItem* const item = stack.getUnchecked(i); - - if (item->component == component) - { - item->returnValue = returnValue; - item->cancel(); - } - } -} - -int ModalComponentManager::getNumModalComponents() const -{ - int n = 0; - for (int i = 0; i < stack.size(); ++i) - if (stack.getUnchecked(i)->isActive) - ++n; - - return n; -} - -Component* ModalComponentManager::getModalComponent (const int index) const -{ - int n = 0; - for (int i = stack.size(); --i >= 0;) - { - const ModalItem* const item = stack.getUnchecked(i); - if (item->isActive) - if (n++ == index) - return item->component; - } - - return nullptr; -} - -bool ModalComponentManager::isModal (Component* const comp) const -{ - for (int i = stack.size(); --i >= 0;) - { - const ModalItem* const item = stack.getUnchecked(i); - if (item->isActive && item->component == comp) - return true; - } - - return false; -} - -bool ModalComponentManager::isFrontModalComponent (Component* const comp) const -{ - return comp == getModalComponent (0); -} - -void ModalComponentManager::handleAsyncUpdate() -{ - for (int i = stack.size(); --i >= 0;) - { - const ModalItem* const item = stack.getUnchecked(i); - - if (! item->isActive) - { - ScopedPointer deleter (stack.removeAndReturn (i)); - Component::SafePointer compToDelete (item->autoDelete ? item->component : nullptr); - - for (int j = item->callbacks.size(); --j >= 0;) - item->callbacks.getUnchecked(j)->modalStateFinished (item->returnValue); - - compToDelete.deleteAndZero(); - } - } -} - -void ModalComponentManager::bringModalComponentsToFront (bool topOneShouldGrabFocus) -{ - ComponentPeer* lastOne = nullptr; - - for (int i = 0; i < getNumModalComponents(); ++i) - { - Component* const c = getModalComponent (i); - - if (c == nullptr) - break; - - ComponentPeer* peer = c->getPeer(); - - if (peer != nullptr && peer != lastOne) - { - if (lastOne == nullptr) - { - peer->toFront (topOneShouldGrabFocus); - - if (topOneShouldGrabFocus) - peer->grabFocus(); - } - else - peer->toBehind (lastOne); - - lastOne = peer; - } - } -} - -bool ModalComponentManager::cancelAllModalComponents() -{ - const int numModal = getNumModalComponents(); - - for (int i = numModal; --i >= 0;) - if (Component* const c = getModalComponent(i)) - c->exitModalState (0); - - return numModal > 0; -} - -#if JUCE_MODAL_LOOPS_PERMITTED -class ModalComponentManager::ReturnValueRetriever : public ModalComponentManager::Callback -{ -public: - ReturnValueRetriever (int& v, bool& done) : value (v), finished (done) {} - - void modalStateFinished (int returnValue) - { - finished = true; - value = returnValue; - } - -private: - int& value; - bool& finished; - - JUCE_DECLARE_NON_COPYABLE (ReturnValueRetriever) -}; - -int ModalComponentManager::runEventLoopForCurrentComponent() -{ - // This can only be run from the message thread! - jassert (MessageManager::getInstance()->isThisTheMessageThread()); - - int returnValue = 0; - - if (Component* currentlyModal = getModalComponent (0)) - { - FocusRestorer focusRestorer; - - bool finished = false; - attachCallback (currentlyModal, new ReturnValueRetriever (returnValue, finished)); - - JUCE_TRY - { - while (! finished) - { - if (! MessageManager::getInstance()->runDispatchLoopUntil (20)) - break; - } - } - JUCE_CATCH_EXCEPTION - } - - return returnValue; -} -#endif diff --git a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h b/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h deleted file mode 100755 index 1b927e1..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/components/juce_ModalComponentManager.h +++ /dev/null @@ -1,369 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_MODALCOMPONENTMANAGER_H_INCLUDED -#define JUCE_MODALCOMPONENTMANAGER_H_INCLUDED - - -//============================================================================== -/** - Manages the system's stack of modal components. - - Normally you'll just use the Component methods to invoke modal states in components, - and won't have to deal with this class directly, but this is the singleton object that's - used internally to manage the stack. - - @see Component::enterModalState, Component::exitModalState, Component::isCurrentlyModal, - Component::getCurrentlyModalComponent, Component::isCurrentlyBlockedByAnotherModalComponent -*/ -class JUCE_API ModalComponentManager : private AsyncUpdater, - private DeletedAtShutdown -{ -public: - //============================================================================== - /** Receives callbacks when a modal component is dismissed. - - You can register a callback using Component::enterModalState() or - ModalComponentManager::attachCallback(). - - For some quick ways of creating callback objects, see the ModalCallbackFunction class. - @see ModalCallbackFunction - */ - class Callback - { - public: - /** */ - Callback() {} - - /** Destructor. */ - virtual ~Callback() {} - - /** Called to indicate that a modal component has been dismissed. - - You can register a callback using Component::enterModalState() or - ModalComponentManager::attachCallback(). - - The returnValue parameter is the value that was passed to Component::exitModalState() - when the component was dismissed. - - The callback object will be deleted shortly after this method is called. - */ - virtual void modalStateFinished (int returnValue) = 0; - }; - - //============================================================================== - /** Returns the number of components currently being shown modally. - @see getModalComponent - */ - int getNumModalComponents() const; - - /** Returns one of the components being shown modally. - An index of 0 is the most recently-shown, topmost component. - */ - Component* getModalComponent (int index) const; - - /** Returns true if the specified component is in a modal state. */ - bool isModal (Component* component) const; - - /** Returns true if the specified component is currently the topmost modal component. */ - bool isFrontModalComponent (Component* component) const; - - /** Adds a new callback that will be called when the specified modal component is dismissed. - - If the component is modal, then when it is dismissed, either by being hidden, or by calling - Component::exitModalState(), then the Callback::modalStateFinished() method will be - called. - - Each component can have any number of callbacks associated with it, and this one is added - to that list. - - The object that is passed in will be deleted by the manager when it's no longer needed. If - the given component is not currently modal, the callback object is deleted immediately and - no action is taken. - */ - void attachCallback (Component* component, Callback* callback); - - /** Brings any modal components to the front. */ - void bringModalComponentsToFront (bool topOneShouldGrabFocus = true); - - /** Calls exitModalState (0) on any components that are currently modal. - @returns true if any components were modal; false if nothing needed cancelling - */ - bool cancelAllModalComponents(); - - #if JUCE_MODAL_LOOPS_PERMITTED - /** Runs the event loop until the currently topmost modal component is dismissed, and - returns the exit code for that component. - */ - int runEventLoopForCurrentComponent(); - #endif - - //============================================================================== - juce_DeclareSingleton_SingleThreaded_Minimal (ModalComponentManager) - -protected: - /** Creates a ModalComponentManager. - You shouldn't ever call the constructor - it's a singleton, so use ModalComponentManager::getInstance() - */ - ModalComponentManager(); - - /** Destructor. */ - ~ModalComponentManager(); - - /** @internal */ - void handleAsyncUpdate() override; - -private: - //============================================================================== - class ModalItem; - class ReturnValueRetriever; - - friend class Component; - friend struct ContainerDeletePolicy; - OwnedArray stack; - - void startModal (Component*, bool autoDelete); - void endModal (Component*, int returnValue); - void endModal (Component*); - - JUCE_DECLARE_NON_COPYABLE (ModalComponentManager) -}; - -//============================================================================== -/** - This class provides some handy utility methods for creating ModalComponentManager::Callback - objects that will invoke a static function with some parameters when a modal component is dismissed. -*/ -class ModalCallbackFunction -{ -public: - //============================================================================== - /** This is a utility function to create a ModalComponentManager::Callback that will - call a static function with a parameter. - - The function that you supply must take two parameters - the first being an int, which is - the result code that was used when the modal component was dismissed, and the second - can be a custom type. Note that this custom value will be copied and stored, so it must - be a primitive type or a class that provides copy-by-value semantics. - - E.g. @code - static void myCallbackFunction (int modalResult, double customValue) - { - if (modalResult == 1) - doSomethingWith (customValue); - } - - Component* someKindOfComp; - ... - someKindOfComp->enterModalState (ModalCallbackFunction::create (myCallbackFunction, 3.0)); - @endcode - @see ModalComponentManager::Callback - */ - template - static ModalComponentManager::Callback* create (void (*functionToCall) (int, ParamType), - ParamType parameterValue) - { - return new FunctionCaller1 (functionToCall, parameterValue); - } - - //============================================================================== - /** This is a utility function to create a ModalComponentManager::Callback that will - call a static function with two custom parameters. - - The function that you supply must take three parameters - the first being an int, which is - the result code that was used when the modal component was dismissed, and the next two are - your custom types. Note that these custom values will be copied and stored, so they must - be primitive types or classes that provide copy-by-value semantics. - - E.g. @code - static void myCallbackFunction (int modalResult, double customValue1, String customValue2) - { - if (modalResult == 1) - doSomethingWith (customValue1, customValue2); - } - - Component* someKindOfComp; - ... - someKindOfComp->enterModalState (ModalCallbackFunction::create (myCallbackFunction, 3.0, String ("xyz"))); - @endcode - @see ModalComponentManager::Callback - */ - template - static ModalComponentManager::Callback* withParam (void (*functionToCall) (int, ParamType1, ParamType2), - ParamType1 parameterValue1, - ParamType2 parameterValue2) - { - return new FunctionCaller2 (functionToCall, parameterValue1, parameterValue2); - } - - //============================================================================== - /** This is a utility function to create a ModalComponentManager::Callback that will - call a static function with a component. - - The function that you supply must take two parameters - the first being an int, which is - the result code that was used when the modal component was dismissed, and the second - can be a Component class. The component will be stored as a WeakReference, so that if it gets - deleted before this callback is invoked, the pointer that is passed to the function will be null. - - E.g. @code - static void myCallbackFunction (int modalResult, Slider* mySlider) - { - if (modalResult == 1 && mySlider != nullptr) // (must check that mySlider isn't null in case it was deleted..) - mySlider->setValue (0.0); - } - - Component* someKindOfComp; - Slider* mySlider; - ... - someKindOfComp->enterModalState (ModalCallbackFunction::forComponent (myCallbackFunction, mySlider)); - @endcode - @see ModalComponentManager::Callback - */ - template - static ModalComponentManager::Callback* forComponent (void (*functionToCall) (int, ComponentType*), - ComponentType* component) - { - return new ComponentCaller1 (functionToCall, component); - } - - //============================================================================== - /** Creates a ModalComponentManager::Callback that will call a static function with a component. - - The function that you supply must take three parameters - the first being an int, which is - the result code that was used when the modal component was dismissed, the second being a Component - class, and the third being a custom type (which must be a primitive type or have copy-by-value semantics). - The component will be stored as a WeakReference, so that if it gets deleted before this callback is - invoked, the pointer that is passed into the function will be null. - - E.g. @code - static void myCallbackFunction (int modalResult, Slider* mySlider, String customParam) - { - if (modalResult == 1 && mySlider != nullptr) // (must check that mySlider isn't null in case it was deleted..) - mySlider->setName (customParam); - } - - Component* someKindOfComp; - Slider* mySlider; - ... - someKindOfComp->enterModalState (ModalCallbackFunction::forComponent (myCallbackFunction, mySlider, String ("hello"))); - @endcode - @see ModalComponentManager::Callback - */ - template - static ModalComponentManager::Callback* forComponent (void (*functionToCall) (int, ComponentType*, ParamType), - ComponentType* component, - ParamType param) - { - return new ComponentCaller2 (functionToCall, component, param); - } - -private: - //============================================================================== - template - class FunctionCaller1 : public ModalComponentManager::Callback - { - public: - typedef void (*FunctionType) (int, ParamType); - - FunctionCaller1 (FunctionType& f, ParamType& p1) - : function (f), param (p1) {} - - void modalStateFinished (int returnValue) { function (returnValue, param); } - - private: - const FunctionType function; - ParamType param; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FunctionCaller1) - }; - - template - class FunctionCaller2 : public ModalComponentManager::Callback - { - public: - typedef void (*FunctionType) (int, ParamType1, ParamType2); - - FunctionCaller2 (FunctionType& f, ParamType1& p1, ParamType2& p2) - : function (f), param1 (p1), param2 (p2) {} - - void modalStateFinished (int returnValue) { function (returnValue, param1, param2); } - - private: - const FunctionType function; - ParamType1 param1; - ParamType2 param2; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FunctionCaller2) - }; - - template - class ComponentCaller1 : public ModalComponentManager::Callback - { - public: - typedef void (*FunctionType) (int, ComponentType*); - - ComponentCaller1 (FunctionType& f, ComponentType* c) - : function (f), comp (c) {} - - void modalStateFinished (int returnValue) - { - function (returnValue, static_cast (comp.get())); - } - - private: - const FunctionType function; - WeakReference comp; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComponentCaller1) - }; - - template - class ComponentCaller2 : public ModalComponentManager::Callback - { - public: - typedef void (*FunctionType) (int, ComponentType*, ParamType1); - - ComponentCaller2 (FunctionType& f, ComponentType* c, ParamType1 p1) - : function (f), comp (c), param1 (p1) {} - - void modalStateFinished (int returnValue) - { - function (returnValue, static_cast (comp.get()), param1); - } - - private: - const FunctionType function; - WeakReference comp; - ParamType1 param1; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ComponentCaller2) - }; - - ModalCallbackFunction(); - ~ModalCallbackFunction(); - JUCE_DECLARE_NON_COPYABLE (ModalCallbackFunction) -}; - - -#endif // JUCE_MODALCOMPONENTMANAGER_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp deleted file mode 100755 index 3e88318..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -Drawable::Drawable() -{ - setInterceptsMouseClicks (false, false); - setPaintingIsUnclipped (true); -} - -Drawable::Drawable (const Drawable& other) - : Component (other.getName()) -{ - setComponentID (other.getComponentID()); -} - -Drawable::~Drawable() -{ -} - -//============================================================================== -void Drawable::draw (Graphics& g, float opacity, const AffineTransform& transform) const -{ - const_cast (this)->nonConstDraw (g, opacity, transform); -} - -void Drawable::nonConstDraw (Graphics& g, float opacity, const AffineTransform& transform) -{ - Graphics::ScopedSaveState ss (g); - - g.addTransform (AffineTransform::translation ((float) -(originRelativeToComponent.x), - (float) -(originRelativeToComponent.y)) - .followedBy (getTransform()) - .followedBy (transform)); - - if (! g.isClipEmpty()) - { - if (opacity < 1.0f) - { - g.beginTransparencyLayer (opacity); - paintEntireComponent (g, true); - g.endTransparencyLayer(); - } - else - { - paintEntireComponent (g, true); - } - } -} - -void Drawable::drawAt (Graphics& g, float x, float y, float opacity) const -{ - draw (g, opacity, AffineTransform::translation (x, y)); -} - -void Drawable::drawWithin (Graphics& g, const Rectangle& destArea, - RectanglePlacement placement, float opacity) const -{ - draw (g, opacity, placement.getTransformToFit (getDrawableBounds(), destArea)); -} - -//============================================================================== -DrawableComposite* Drawable::getParent() const -{ - return dynamic_cast (getParentComponent()); -} - -void Drawable::transformContextToCorrectOrigin (Graphics& g) -{ - g.setOrigin (originRelativeToComponent); -} - -void Drawable::parentHierarchyChanged() -{ - setBoundsToEnclose (getDrawableBounds()); -} - -void Drawable::setBoundsToEnclose (const Rectangle& area) -{ - Drawable* const parent = getParent(); - Point parentOrigin; - if (parent != nullptr) - parentOrigin = parent->originRelativeToComponent; - - const Rectangle newBounds (area.getSmallestIntegerContainer() + parentOrigin); - originRelativeToComponent = parentOrigin - newBounds.getPosition(); - setBounds (newBounds); -} - -//============================================================================== -bool Drawable::replaceColour (Colour original, Colour replacement) -{ - bool changed = false; - - for (int i = getNumChildComponents(); --i >= 0;) - if (Drawable* d = dynamic_cast (getChildComponent(i))) - changed = d->replaceColour (original, replacement) || changed; - - return changed; -} - -//============================================================================== -void Drawable::setOriginWithOriginalSize (Point originWithinParent) -{ - setTransform (AffineTransform::translation (originWithinParent.x, originWithinParent.y)); -} - -void Drawable::setTransformToFit (const Rectangle& area, RectanglePlacement placement) -{ - if (! area.isEmpty()) - setTransform (placement.getTransformToFit (getDrawableBounds(), area)); -} - -//============================================================================== -Drawable* Drawable::createFromImageData (const void* data, const size_t numBytes) -{ - Drawable* result = nullptr; - - Image image (ImageFileFormat::loadFrom (data, numBytes)); - - if (image.isValid()) - { - DrawableImage* const di = new DrawableImage(); - di->setImage (image); - result = di; - } - else - { - const String asString (String::createStringFromData (data, (int) numBytes)); - - XmlDocument doc (asString); - ScopedPointer outer (doc.getDocumentElement (true)); - - if (outer != nullptr && outer->hasTagName ("svg")) - { - ScopedPointer svg (doc.getDocumentElement()); - - if (svg != nullptr) - result = Drawable::createFromSVG (*svg); - } - } - - return result; -} - -Drawable* Drawable::createFromImageDataStream (InputStream& dataSource) -{ - MemoryOutputStream mo; - mo << dataSource; - - return createFromImageData (mo.getData(), mo.getDataSize()); -} - -Drawable* Drawable::createFromImageFile (const File& file) -{ - FileInputStream fin (file); - - return fin.openedOk() ? createFromImageDataStream (fin) : nullptr; -} - -//============================================================================== -template -class DrawableTypeHandler : public ComponentBuilder::TypeHandler -{ -public: - DrawableTypeHandler() - : ComponentBuilder::TypeHandler (DrawableClass::valueTreeType) - { - } - - Component* addNewComponentFromState (const ValueTree& state, Component* parent) - { - DrawableClass* const d = new DrawableClass(); - - if (parent != nullptr) - parent->addAndMakeVisible (d); - - updateComponentFromState (d, state); - return d; - } - - void updateComponentFromState (Component* component, const ValueTree& state) - { - DrawableClass* const d = dynamic_cast (component); - jassert (d != nullptr); - d->refreshFromValueTree (state, *this->getBuilder()); - } -}; - -void Drawable::registerDrawableTypeHandlers (ComponentBuilder& builder) -{ - builder.registerTypeHandler (new DrawableTypeHandler ()); - builder.registerTypeHandler (new DrawableTypeHandler ()); - builder.registerTypeHandler (new DrawableTypeHandler ()); - builder.registerTypeHandler (new DrawableTypeHandler ()); - builder.registerTypeHandler (new DrawableTypeHandler ()); -} - -Drawable* Drawable::createFromValueTree (const ValueTree& tree, ComponentBuilder::ImageProvider* imageProvider) -{ - ComponentBuilder builder (tree); - builder.setImageProvider (imageProvider); - registerDrawableTypeHandlers (builder); - - ScopedPointer comp (builder.createComponent()); - Drawable* const d = dynamic_cast (static_cast (comp)); - - if (d != nullptr) - comp.release(); - - return d; -} - -//============================================================================== -Drawable::ValueTreeWrapperBase::ValueTreeWrapperBase (const ValueTree& state_) - : state (state_) -{ -} - -String Drawable::ValueTreeWrapperBase::getID() const -{ - return state [ComponentBuilder::idProperty]; -} - -void Drawable::ValueTreeWrapperBase::setID (const String& newID) -{ - if (newID.isEmpty()) - state.removeProperty (ComponentBuilder::idProperty, nullptr); - else - state.setProperty (ComponentBuilder::idProperty, newID, nullptr); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h deleted file mode 100755 index b8956d5..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_Drawable.h +++ /dev/null @@ -1,259 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DRAWABLE_H_INCLUDED -#define JUCE_DRAWABLE_H_INCLUDED - - -//============================================================================== -/** - The base class for objects which can draw themselves, e.g. polygons, images, etc. - - @see DrawableComposite, DrawableImage, DrawablePath, DrawableText -*/ -class JUCE_API Drawable : public Component -{ -protected: - //============================================================================== - /** The base class can't be instantiated directly. - - @see DrawableComposite, DrawableImage, DrawablePath, DrawableText - */ - Drawable(); - -public: - /** Destructor. */ - virtual ~Drawable(); - - //============================================================================== - /** Creates a deep copy of this Drawable object. - - Use this to create a new copy of this and any sub-objects in the tree. - */ - virtual Drawable* createCopy() const = 0; - - //============================================================================== - /** Renders this Drawable object. - - Note that the preferred way to render a drawable in future is by using it - as a component and adding it to a parent, so you might want to consider that - before using this method. - - @see drawWithin - */ - void draw (Graphics& g, float opacity, - const AffineTransform& transform = AffineTransform::identity) const; - - /** Renders the Drawable at a given offset within the Graphics context. - - The coordinates passed-in are used to translate the object relative to its own - origin before drawing it - this is basically a quick way of saying: - - @code - draw (g, AffineTransform::translation (x, y)). - @endcode - - Note that the preferred way to render a drawable in future is by using it - as a component and adding it to a parent, so you might want to consider that - before using this method. - */ - void drawAt (Graphics& g, float x, float y, float opacity) const; - - /** Renders the Drawable within a rectangle, scaling it to fit neatly inside without - changing its aspect-ratio. - - The object can placed arbitrarily within the rectangle based on a Justification type, - and can either be made as big as possible, or just reduced to fit. - - Note that the preferred way to render a drawable in future is by using it - as a component and adding it to a parent, so you might want to consider that - before using this method. - - @param g the graphics context to render onto - @param destArea the target rectangle to fit the drawable into - @param placement defines the alignment and rescaling to use to fit - this object within the target rectangle. - @param opacity the opacity to use, in the range 0 to 1.0 - */ - void drawWithin (Graphics& g, - const Rectangle& destArea, - RectanglePlacement placement, - float opacity) const; - - - //============================================================================== - /** Resets any transformations on this drawable, and positions its origin within - its parent component. - */ - void setOriginWithOriginalSize (Point originWithinParent); - - /** Sets a transform for this drawable that will position it within the specified - area of its parent component. - */ - void setTransformToFit (const Rectangle& areaInParent, RectanglePlacement placement); - - /** Returns the DrawableComposite that contains this object, if there is one. */ - DrawableComposite* getParent() const; - - //============================================================================== - /** Tries to turn some kind of image file into a drawable. - - The data could be an image that the ImageFileFormat class understands, or it - could be SVG. - */ - static Drawable* createFromImageData (const void* data, size_t numBytes); - - /** Tries to turn a stream containing some kind of image data into a drawable. - - The data could be an image that the ImageFileFormat class understands, or it - could be SVG. - */ - static Drawable* createFromImageDataStream (InputStream& dataSource); - - /** Tries to turn a file containing some kind of image data into a drawable. - - The data could be an image that the ImageFileFormat class understands, or it - could be SVG. - */ - static Drawable* createFromImageFile (const File& file); - - /** Attempts to parse an SVG (Scalable Vector Graphics) document, and to turn this - into a Drawable tree. - - The object returned must be deleted by the caller. If something goes wrong - while parsing, it may return nullptr. - - SVG is a pretty large and complex spec, and this doesn't aim to be a full - implementation, but it can return the basic vector objects. - */ - static Drawable* createFromSVG (const XmlElement& svgDocument); - - /** Parses an SVG path string and returns it. */ - static Path parseSVGPath (const String& svgPath); - - //============================================================================== - /** Tries to create a Drawable from a previously-saved ValueTree. - The ValueTree must have been created by the createValueTree() method. - If there are any images used within the drawable, you'll need to provide a valid - ImageProvider object that can be used to retrieve these images from whatever type - of identifier is used to represent them. - Internally, this uses a ComponentBuilder, and registerDrawableTypeHandlers(). - */ - static Drawable* createFromValueTree (const ValueTree& tree, ComponentBuilder::ImageProvider* imageProvider); - - /** Creates a ValueTree to represent this Drawable. - The ValueTree that is returned can be turned back into a Drawable with createFromValueTree(). - If there are any images used in this drawable, you'll need to provide a valid ImageProvider - object that can be used to create storable representations of them. - */ - virtual ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const = 0; - - /** Returns the area that this drawble covers. - The result is expressed in this drawable's own coordinate space, and does not take - into account any transforms that may be applied to the component. - */ - virtual Rectangle getDrawableBounds() const = 0; - - /** Recursively replaces a colour that might be used for filling or stroking. - return true if any instances of this colour were found. - */ - virtual bool replaceColour (Colour originalColour, Colour replacementColour); - - //============================================================================== - /** Internal class used to manage ValueTrees that represent Drawables. */ - class ValueTreeWrapperBase - { - public: - ValueTreeWrapperBase (const ValueTree& state); - - ValueTree& getState() noexcept { return state; } - - String getID() const; - void setID (const String& newID); - - ValueTree state; - }; - - //============================================================================== - /** Registers a set of ComponentBuilder::TypeHandler objects that can be used to - load all the different Drawable types from a saved state. - @see ComponentBuilder::registerTypeHandler() - */ - static void registerDrawableTypeHandlers (ComponentBuilder& componentBuilder); - -protected: - //============================================================================== - friend class DrawableComposite; - friend class DrawableShape; - - /** @internal */ - void transformContextToCorrectOrigin (Graphics&); - /** @internal */ - void parentHierarchyChanged() override; - /** @internal */ - void setBoundsToEnclose (const Rectangle&); - - Point originRelativeToComponent; - - #ifndef DOXYGEN - /** Internal utility class used by Drawables. */ - template - class Positioner : public RelativeCoordinatePositionerBase - { - public: - Positioner (DrawableType& c) - : RelativeCoordinatePositionerBase (c), - owner (c) - {} - - bool registerCoordinates() { return owner.registerCoordinates (*this); } - void applyToComponentBounds() - { - ComponentScope scope (getComponent()); - owner.recalculateCoordinates (&scope); - } - - void applyNewBounds (const Rectangle&) - { - jassertfalse; // drawables can't be resized directly! - } - - private: - DrawableType& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Positioner) - }; - - Drawable (const Drawable&); - #endif - -private: - void nonConstDraw (Graphics&, float opacity, const AffineTransform&); - - Drawable& operator= (const Drawable&); - JUCE_LEAK_DETECTOR (Drawable) -}; - - -#endif // JUCE_DRAWABLE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp deleted file mode 100755 index 688507f..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.cpp +++ /dev/null @@ -1,327 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -DrawableComposite::DrawableComposite() - : bounds (Point(), Point (100.0f, 0.0f), Point (0.0f, 100.0f)), - updateBoundsReentrant (false) -{ - setContentArea (RelativeRectangle (RelativeCoordinate (0.0), - RelativeCoordinate (100.0), - RelativeCoordinate (0.0), - RelativeCoordinate (100.0))); -} - -DrawableComposite::DrawableComposite (const DrawableComposite& other) - : Drawable (other), - bounds (other.bounds), - markersX (other.markersX), - markersY (other.markersY), - updateBoundsReentrant (false) -{ - for (int i = 0; i < other.getNumChildComponents(); ++i) - if (const Drawable* const d = dynamic_cast (other.getChildComponent(i))) - addAndMakeVisible (d->createCopy()); -} - -DrawableComposite::~DrawableComposite() -{ - deleteAllChildren(); -} - -Drawable* DrawableComposite::createCopy() const -{ - return new DrawableComposite (*this); -} - -//============================================================================== -Rectangle DrawableComposite::getDrawableBounds() const -{ - Rectangle r; - - for (int i = getNumChildComponents(); --i >= 0;) - if (const Drawable* const d = dynamic_cast (getChildComponent(i))) - r = r.getUnion (d->isTransformed() ? d->getDrawableBounds().transformedBy (d->getTransform()) - : d->getDrawableBounds()); - - return r; -} - -MarkerList* DrawableComposite::getMarkers (bool xAxis) -{ - return xAxis ? &markersX : &markersY; -} - -RelativeRectangle DrawableComposite::getContentArea() const -{ - jassert (markersX.getNumMarkers() >= 2 && markersX.getMarker (0)->name == contentLeftMarkerName && markersX.getMarker (1)->name == contentRightMarkerName); - jassert (markersY.getNumMarkers() >= 2 && markersY.getMarker (0)->name == contentTopMarkerName && markersY.getMarker (1)->name == contentBottomMarkerName); - - return RelativeRectangle (markersX.getMarker(0)->position, markersX.getMarker(1)->position, - markersY.getMarker(0)->position, markersY.getMarker(1)->position); -} - -void DrawableComposite::setContentArea (const RelativeRectangle& newArea) -{ - markersX.setMarker (contentLeftMarkerName, newArea.left); - markersX.setMarker (contentRightMarkerName, newArea.right); - markersY.setMarker (contentTopMarkerName, newArea.top); - markersY.setMarker (contentBottomMarkerName, newArea.bottom); -} - -void DrawableComposite::setBoundingBox (const RelativeParallelogram& newBounds) -{ - if (bounds != newBounds) - { - bounds = newBounds; - - if (bounds.isDynamic()) - { - Drawable::Positioner* const p = new Drawable::Positioner (*this); - setPositioner (p); - p->apply(); - } - else - { - setPositioner (nullptr); - recalculateCoordinates (nullptr); - } - } -} - -void DrawableComposite::resetBoundingBoxToContentArea() -{ - const RelativeRectangle content (getContentArea()); - - setBoundingBox (RelativeParallelogram (RelativePoint (content.left, content.top), - RelativePoint (content.right, content.top), - RelativePoint (content.left, content.bottom))); -} - -void DrawableComposite::resetContentAreaAndBoundingBoxToFitChildren() -{ - const Rectangle activeArea (getDrawableBounds()); - - setContentArea (RelativeRectangle (RelativeCoordinate (activeArea.getX()), - RelativeCoordinate (activeArea.getRight()), - RelativeCoordinate (activeArea.getY()), - RelativeCoordinate (activeArea.getBottom()))); - resetBoundingBoxToContentArea(); -} - -bool DrawableComposite::registerCoordinates (RelativeCoordinatePositionerBase& pos) -{ - bool ok = pos.addPoint (bounds.topLeft); - ok = pos.addPoint (bounds.topRight) && ok; - return pos.addPoint (bounds.bottomLeft) && ok; -} - -void DrawableComposite::recalculateCoordinates (Expression::Scope* scope) -{ - Point resolved[3]; - bounds.resolveThreePoints (resolved, scope); - - const Rectangle content (getContentArea().resolve (scope)); - - AffineTransform t (AffineTransform::fromTargetPoints (content.getX(), content.getY(), resolved[0].x, resolved[0].y, - content.getRight(), content.getY(), resolved[1].x, resolved[1].y, - content.getX(), content.getBottom(), resolved[2].x, resolved[2].y)); - - if (t.isSingularity()) - t = AffineTransform::identity; - - setTransform (t); -} - -void DrawableComposite::parentHierarchyChanged() -{ - DrawableComposite* parent = getParent(); - if (parent != nullptr) - originRelativeToComponent = parent->originRelativeToComponent - getPosition(); -} - -void DrawableComposite::childBoundsChanged (Component*) -{ - updateBoundsToFitChildren(); -} - -void DrawableComposite::childrenChanged() -{ - updateBoundsToFitChildren(); -} - -void DrawableComposite::updateBoundsToFitChildren() -{ - if (! updateBoundsReentrant) - { - const ScopedValueSetter setter (updateBoundsReentrant, true, false); - - Rectangle childArea; - - for (int i = getNumChildComponents(); --i >= 0;) - childArea = childArea.getUnion (getChildComponent(i)->getBoundsInParent()); - - const Point delta (childArea.getPosition()); - childArea += getPosition(); - - if (childArea != getBounds()) - { - if (! delta.isOrigin()) - { - originRelativeToComponent -= delta; - - for (int i = getNumChildComponents(); --i >= 0;) - if (Component* const c = getChildComponent(i)) - c->setBounds (c->getBounds() - delta); - } - - setBounds (childArea); - } - } -} - -//============================================================================== -const char* const DrawableComposite::contentLeftMarkerName = "left"; -const char* const DrawableComposite::contentRightMarkerName = "right"; -const char* const DrawableComposite::contentTopMarkerName = "top"; -const char* const DrawableComposite::contentBottomMarkerName = "bottom"; - -//============================================================================== -const Identifier DrawableComposite::valueTreeType ("Group"); - -const Identifier DrawableComposite::ValueTreeWrapper::topLeft ("topLeft"); -const Identifier DrawableComposite::ValueTreeWrapper::topRight ("topRight"); -const Identifier DrawableComposite::ValueTreeWrapper::bottomLeft ("bottomLeft"); -const Identifier DrawableComposite::ValueTreeWrapper::childGroupTag ("Drawables"); -const Identifier DrawableComposite::ValueTreeWrapper::markerGroupTagX ("MarkersX"); -const Identifier DrawableComposite::ValueTreeWrapper::markerGroupTagY ("MarkersY"); - -//============================================================================== -DrawableComposite::ValueTreeWrapper::ValueTreeWrapper (const ValueTree& state_) - : ValueTreeWrapperBase (state_) -{ - jassert (state.hasType (valueTreeType)); -} - -ValueTree DrawableComposite::ValueTreeWrapper::getChildList() const -{ - return state.getChildWithName (childGroupTag); -} - -ValueTree DrawableComposite::ValueTreeWrapper::getChildListCreating (UndoManager* undoManager) -{ - return state.getOrCreateChildWithName (childGroupTag, undoManager); -} - -RelativeParallelogram DrawableComposite::ValueTreeWrapper::getBoundingBox() const -{ - return RelativeParallelogram (state.getProperty (topLeft, "0, 0"), - state.getProperty (topRight, "100, 0"), - state.getProperty (bottomLeft, "0, 100")); -} - -void DrawableComposite::ValueTreeWrapper::setBoundingBox (const RelativeParallelogram& newBounds, UndoManager* undoManager) -{ - state.setProperty (topLeft, newBounds.topLeft.toString(), undoManager); - state.setProperty (topRight, newBounds.topRight.toString(), undoManager); - state.setProperty (bottomLeft, newBounds.bottomLeft.toString(), undoManager); -} - -void DrawableComposite::ValueTreeWrapper::resetBoundingBoxToContentArea (UndoManager* undoManager) -{ - const RelativeRectangle content (getContentArea()); - - setBoundingBox (RelativeParallelogram (RelativePoint (content.left, content.top), - RelativePoint (content.right, content.top), - RelativePoint (content.left, content.bottom)), undoManager); -} - -RelativeRectangle DrawableComposite::ValueTreeWrapper::getContentArea() const -{ - MarkerList::ValueTreeWrapper marksX (getMarkerList (true)); - MarkerList::ValueTreeWrapper marksY (getMarkerList (false)); - - return RelativeRectangle (marksX.getMarker (marksX.getMarkerState (0)).position, - marksX.getMarker (marksX.getMarkerState (1)).position, - marksY.getMarker (marksY.getMarkerState (0)).position, - marksY.getMarker (marksY.getMarkerState (1)).position); -} - -void DrawableComposite::ValueTreeWrapper::setContentArea (const RelativeRectangle& newArea, UndoManager* undoManager) -{ - MarkerList::ValueTreeWrapper marksX (getMarkerListCreating (true, nullptr)); - MarkerList::ValueTreeWrapper marksY (getMarkerListCreating (false, nullptr)); - - marksX.setMarker (MarkerList::Marker (contentLeftMarkerName, newArea.left), undoManager); - marksX.setMarker (MarkerList::Marker (contentRightMarkerName, newArea.right), undoManager); - marksY.setMarker (MarkerList::Marker (contentTopMarkerName, newArea.top), undoManager); - marksY.setMarker (MarkerList::Marker (contentBottomMarkerName, newArea.bottom), undoManager); -} - -MarkerList::ValueTreeWrapper DrawableComposite::ValueTreeWrapper::getMarkerList (bool xAxis) const -{ - return state.getChildWithName (xAxis ? markerGroupTagX : markerGroupTagY); -} - -MarkerList::ValueTreeWrapper DrawableComposite::ValueTreeWrapper::getMarkerListCreating (bool xAxis, UndoManager* undoManager) -{ - return state.getOrCreateChildWithName (xAxis ? markerGroupTagX : markerGroupTagY, undoManager); -} - -//============================================================================== -void DrawableComposite::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) -{ - const ValueTreeWrapper wrapper (tree); - setComponentID (wrapper.getID()); - - wrapper.getMarkerList (true).applyTo (markersX); - wrapper.getMarkerList (false).applyTo (markersY); - - setBoundingBox (wrapper.getBoundingBox()); - - builder.updateChildComponents (*this, wrapper.getChildList()); -} - -ValueTree DrawableComposite::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const -{ - ValueTree tree (valueTreeType); - ValueTreeWrapper v (tree); - - v.setID (getComponentID()); - v.setBoundingBox (bounds, nullptr); - - ValueTree childList (v.getChildListCreating (nullptr)); - - for (int i = 0; i < getNumChildComponents(); ++i) - { - const Drawable* const d = dynamic_cast (getChildComponent(i)); - jassert (d != nullptr); // You can't save a mix of Drawables and normal components! - - childList.addChild (d->createValueTree (imageProvider), -1, nullptr); - } - - v.getMarkerListCreating (true, nullptr).readFrom (markersX, nullptr); - v.getMarkerListCreating (false, nullptr).readFrom (markersY, nullptr); - - return tree; -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h deleted file mode 100755 index 1de9111..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableComposite.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DRAWABLECOMPOSITE_H_INCLUDED -#define JUCE_DRAWABLECOMPOSITE_H_INCLUDED - - -//============================================================================== -/** - A drawable object which acts as a container for a set of other Drawables. - - @see Drawable -*/ -class JUCE_API DrawableComposite : public Drawable -{ -public: - //============================================================================== - /** Creates a composite Drawable. */ - DrawableComposite(); - - /** Creates a copy of a DrawableComposite. */ - DrawableComposite (const DrawableComposite&); - - /** Destructor. */ - ~DrawableComposite(); - - //============================================================================== - /** Sets the parallelogram that defines the target position of the content rectangle when the drawable is rendered. - @see setContentArea - */ - void setBoundingBox (const RelativeParallelogram& newBoundingBox); - - /** Returns the parallelogram that defines the target position of the content rectangle when the drawable is rendered. - @see setBoundingBox - */ - const RelativeParallelogram& getBoundingBox() const noexcept { return bounds; } - - /** Changes the bounding box transform to match the content area, so that any sub-items will - be drawn at their untransformed positions. - */ - void resetBoundingBoxToContentArea(); - - /** Returns the main content rectangle. - The content area is actually defined by the markers named "left", "right", "top" and - "bottom", but this method is a shortcut that returns them all at once. - @see contentLeftMarkerName, contentRightMarkerName, contentTopMarkerName, contentBottomMarkerName - */ - RelativeRectangle getContentArea() const; - - /** Changes the main content area. - The content area is actually defined by the markers named "left", "right", "top" and - "bottom", but this method is a shortcut that sets them all at once. - @see setBoundingBox, contentLeftMarkerName, contentRightMarkerName, contentTopMarkerName, contentBottomMarkerName - */ - void setContentArea (const RelativeRectangle& newArea); - - /** Resets the content area and the bounding transform to fit around the area occupied - by the child components (ignoring any markers). - */ - void resetContentAreaAndBoundingBoxToFitChildren(); - - //============================================================================== - /** The name of the marker that defines the left edge of the content area. */ - static const char* const contentLeftMarkerName; - /** The name of the marker that defines the right edge of the content area. */ - static const char* const contentRightMarkerName; - /** The name of the marker that defines the top edge of the content area. */ - static const char* const contentTopMarkerName; - /** The name of the marker that defines the bottom edge of the content area. */ - static const char* const contentBottomMarkerName; - - //============================================================================== - /** @internal */ - Drawable* createCopy() const; - /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); - /** @internal */ - ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; - /** @internal */ - static const Identifier valueTreeType; - /** @internal */ - Rectangle getDrawableBounds() const; - /** @internal */ - void childBoundsChanged (Component*) override; - /** @internal */ - void childrenChanged() override; - /** @internal */ - void parentHierarchyChanged() override; - /** @internal */ - MarkerList* getMarkers (bool xAxis) override; - - //============================================================================== - /** Internally-used class for wrapping a DrawableComposite's state into a ValueTree. */ - class ValueTreeWrapper : public Drawable::ValueTreeWrapperBase - { - public: - ValueTreeWrapper (const ValueTree& state); - - ValueTree getChildList() const; - ValueTree getChildListCreating (UndoManager* undoManager); - - RelativeParallelogram getBoundingBox() const; - void setBoundingBox (const RelativeParallelogram& newBounds, UndoManager* undoManager); - void resetBoundingBoxToContentArea (UndoManager* undoManager); - - RelativeRectangle getContentArea() const; - void setContentArea (const RelativeRectangle& newArea, UndoManager* undoManager); - - MarkerList::ValueTreeWrapper getMarkerList (bool xAxis) const; - MarkerList::ValueTreeWrapper getMarkerListCreating (bool xAxis, UndoManager* undoManager); - - static const Identifier topLeft, topRight, bottomLeft; - - private: - static const Identifier childGroupTag, markerGroupTagX, markerGroupTagY; - }; - -private: - //============================================================================== - RelativeParallelogram bounds; - MarkerList markersX, markersY; - bool updateBoundsReentrant; - - friend class Drawable::Positioner; - bool registerCoordinates (RelativeCoordinatePositionerBase&); - void recalculateCoordinates (Expression::Scope*); - - void updateBoundsToFitChildren(); - - DrawableComposite& operator= (const DrawableComposite&); - JUCE_LEAK_DETECTOR (DrawableComposite) -}; - - -#endif // JUCE_DRAWABLECOMPOSITE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp deleted file mode 100755 index d609011..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.cpp +++ /dev/null @@ -1,290 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -DrawableImage::DrawableImage() - : opacity (1.0f), - overlayColour (0x00000000) -{ - bounds.topRight = RelativePoint (Point (1.0f, 0.0f)); - bounds.bottomLeft = RelativePoint (Point (0.0f, 1.0f)); -} - -DrawableImage::DrawableImage (const DrawableImage& other) - : Drawable (other), - image (other.image), - opacity (other.opacity), - overlayColour (other.overlayColour), - bounds (other.bounds) -{ - setBounds (other.getBounds()); -} - -DrawableImage::~DrawableImage() -{ -} - -//============================================================================== -void DrawableImage::setImage (const Image& imageToUse) -{ - image = imageToUse; - setBounds (imageToUse.getBounds()); - - bounds.topLeft = RelativePoint (Point (0.0f, 0.0f)); - bounds.topRight = RelativePoint (Point ((float) image.getWidth(), 0.0f)); - bounds.bottomLeft = RelativePoint (Point (0.0f, (float) image.getHeight())); - recalculateCoordinates (nullptr); - - repaint(); -} - -void DrawableImage::setOpacity (const float newOpacity) -{ - opacity = newOpacity; -} - -void DrawableImage::setOverlayColour (Colour newOverlayColour) -{ - overlayColour = newOverlayColour; -} - -void DrawableImage::setBoundingBox (const RelativeParallelogram& newBounds) -{ - if (bounds != newBounds) - { - bounds = newBounds; - - if (bounds.isDynamic()) - { - Drawable::Positioner* const p = new Drawable::Positioner (*this); - setPositioner (p); - p->apply(); - } - else - { - setPositioner (nullptr); - recalculateCoordinates (nullptr); - } - } -} - -//============================================================================== -bool DrawableImage::registerCoordinates (RelativeCoordinatePositionerBase& pos) -{ - bool ok = pos.addPoint (bounds.topLeft); - ok = pos.addPoint (bounds.topRight) && ok; - return pos.addPoint (bounds.bottomLeft) && ok; -} - -void DrawableImage::recalculateCoordinates (Expression::Scope* scope) -{ - if (image.isValid()) - { - Point resolved[3]; - bounds.resolveThreePoints (resolved, scope); - - const Point tr (resolved[0] + (resolved[1] - resolved[0]) / (float) image.getWidth()); - const Point bl (resolved[0] + (resolved[2] - resolved[0]) / (float) image.getHeight()); - - AffineTransform t (AffineTransform::fromTargetPoints (resolved[0].x, resolved[0].y, - tr.x, tr.y, - bl.x, bl.y)); - - if (t.isSingularity()) - t = AffineTransform::identity; - - setTransform (t); - } -} - -//============================================================================== -void DrawableImage::paint (Graphics& g) -{ - if (image.isValid()) - { - if (opacity > 0.0f && ! overlayColour.isOpaque()) - { - g.setOpacity (opacity); - g.drawImageAt (image, 0, 0, false); - } - - if (! overlayColour.isTransparent()) - { - g.setColour (overlayColour.withMultipliedAlpha (opacity)); - g.drawImageAt (image, 0, 0, true); - } - } -} - -Rectangle DrawableImage::getDrawableBounds() const -{ - return image.getBounds().toFloat(); -} - -bool DrawableImage::hitTest (int x, int y) -{ - return Drawable::hitTest (x, y) && image.isValid() && image.getPixelAt (x, y).getAlpha() >= 127; -} - -Drawable* DrawableImage::createCopy() const -{ - return new DrawableImage (*this); -} - -//============================================================================== -const Identifier DrawableImage::valueTreeType ("Image"); - -const Identifier DrawableImage::ValueTreeWrapper::opacity ("opacity"); -const Identifier DrawableImage::ValueTreeWrapper::overlay ("overlay"); -const Identifier DrawableImage::ValueTreeWrapper::image ("image"); -const Identifier DrawableImage::ValueTreeWrapper::topLeft ("topLeft"); -const Identifier DrawableImage::ValueTreeWrapper::topRight ("topRight"); -const Identifier DrawableImage::ValueTreeWrapper::bottomLeft ("bottomLeft"); - -//============================================================================== -DrawableImage::ValueTreeWrapper::ValueTreeWrapper (const ValueTree& state_) - : ValueTreeWrapperBase (state_) -{ - jassert (state.hasType (valueTreeType)); -} - -var DrawableImage::ValueTreeWrapper::getImageIdentifier() const -{ - return state [image]; -} - -Value DrawableImage::ValueTreeWrapper::getImageIdentifierValue (UndoManager* undoManager) -{ - return state.getPropertyAsValue (image, undoManager); -} - -void DrawableImage::ValueTreeWrapper::setImageIdentifier (const var& newIdentifier, UndoManager* undoManager) -{ - state.setProperty (image, newIdentifier, undoManager); -} - -float DrawableImage::ValueTreeWrapper::getOpacity() const -{ - return (float) state.getProperty (opacity, 1.0); -} - -Value DrawableImage::ValueTreeWrapper::getOpacityValue (UndoManager* undoManager) -{ - if (! state.hasProperty (opacity)) - state.setProperty (opacity, 1.0, undoManager); - - return state.getPropertyAsValue (opacity, undoManager); -} - -void DrawableImage::ValueTreeWrapper::setOpacity (float newOpacity, UndoManager* undoManager) -{ - state.setProperty (opacity, newOpacity, undoManager); -} - -Colour DrawableImage::ValueTreeWrapper::getOverlayColour() const -{ - return Colour::fromString (state [overlay].toString()); -} - -void DrawableImage::ValueTreeWrapper::setOverlayColour (Colour newColour, UndoManager* undoManager) -{ - if (newColour.isTransparent()) - state.removeProperty (overlay, undoManager); - else - state.setProperty (overlay, String::toHexString ((int) newColour.getARGB()), undoManager); -} - -Value DrawableImage::ValueTreeWrapper::getOverlayColourValue (UndoManager* undoManager) -{ - return state.getPropertyAsValue (overlay, undoManager); -} - -RelativeParallelogram DrawableImage::ValueTreeWrapper::getBoundingBox() const -{ - return RelativeParallelogram (state.getProperty (topLeft, "0, 0"), - state.getProperty (topRight, "100, 0"), - state.getProperty (bottomLeft, "0, 100")); -} - -void DrawableImage::ValueTreeWrapper::setBoundingBox (const RelativeParallelogram& newBounds, UndoManager* undoManager) -{ - state.setProperty (topLeft, newBounds.topLeft.toString(), undoManager); - state.setProperty (topRight, newBounds.topRight.toString(), undoManager); - state.setProperty (bottomLeft, newBounds.bottomLeft.toString(), undoManager); -} - - -//============================================================================== -void DrawableImage::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) -{ - const ValueTreeWrapper controller (tree); - setComponentID (controller.getID()); - - const float newOpacity = controller.getOpacity(); - const Colour newOverlayColour (controller.getOverlayColour()); - - Image newImage; - const var imageIdentifier (controller.getImageIdentifier()); - - - jassert (builder.getImageProvider() != 0 || imageIdentifier.isVoid()); // if you're using images, you need to provide something that can load and save them! - - if (builder.getImageProvider() != nullptr) - newImage = builder.getImageProvider()->getImageForIdentifier (imageIdentifier); - - const RelativeParallelogram newBounds (controller.getBoundingBox()); - - if (bounds != newBounds || newOpacity != opacity - || overlayColour != newOverlayColour || image != newImage) - { - repaint(); - opacity = newOpacity; - overlayColour = newOverlayColour; - - if (image != newImage) - setImage (newImage); - - setBoundingBox (newBounds); - } -} - -ValueTree DrawableImage::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const -{ - ValueTree tree (valueTreeType); - ValueTreeWrapper v (tree); - - v.setID (getComponentID()); - v.setOpacity (opacity, nullptr); - v.setOverlayColour (overlayColour, nullptr); - v.setBoundingBox (bounds, nullptr); - - if (image.isValid()) - { - jassert (imageProvider != nullptr); // if you're using images, you need to provide something that can load and save them! - - if (imageProvider != nullptr) - v.setImageIdentifier (imageProvider->getIdentifierForImage (image), nullptr); - } - - return tree; -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h deleted file mode 100755 index 6089dee..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableImage.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DRAWABLEIMAGE_H_INCLUDED -#define JUCE_DRAWABLEIMAGE_H_INCLUDED - - -//============================================================================== -/** - A drawable object which is a bitmap image. - - @see Drawable -*/ -class JUCE_API DrawableImage : public Drawable -{ -public: - //============================================================================== - DrawableImage(); - DrawableImage (const DrawableImage&); - - /** Destructor. */ - ~DrawableImage(); - - //============================================================================== - /** Sets the image that this drawable will render. */ - void setImage (const Image& imageToUse); - - /** Returns the current image. */ - const Image& getImage() const noexcept { return image; } - - /** Sets the opacity to use when drawing the image. */ - void setOpacity (float newOpacity); - - /** Returns the image's opacity. */ - float getOpacity() const noexcept { return opacity; } - - /** Sets a colour to draw over the image's alpha channel. - - By default this is transparent so isn't drawn, but if you set a non-transparent - colour here, then it will be overlaid on the image, using the image's alpha - channel as a mask. - - This is handy for doing things like darkening or lightening an image by overlaying - it with semi-transparent black or white. - */ - void setOverlayColour (Colour newOverlayColour); - - /** Returns the overlay colour. */ - Colour getOverlayColour() const noexcept { return overlayColour; } - - /** Sets the bounding box within which the image should be displayed. */ - void setBoundingBox (const RelativeParallelogram& newBounds); - - /** Returns the position to which the image's top-left corner should be remapped in the target - coordinate space when rendering this object. - @see setTransform - */ - const RelativeParallelogram& getBoundingBox() const noexcept { return bounds; } - - //============================================================================== - /** @internal */ - void paint (Graphics&) override; - /** @internal */ - bool hitTest (int x, int y) override; - /** @internal */ - Drawable* createCopy() const override; - /** @internal */ - Rectangle getDrawableBounds() const override; - /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ComponentBuilder&); - /** @internal */ - ValueTree createValueTree (ComponentBuilder::ImageProvider*) const override; - /** @internal */ - static const Identifier valueTreeType; - - //============================================================================== - /** Internally-used class for wrapping a DrawableImage's state into a ValueTree. */ - class ValueTreeWrapper : public Drawable::ValueTreeWrapperBase - { - public: - ValueTreeWrapper (const ValueTree& state); - - var getImageIdentifier() const; - void setImageIdentifier (const var&, UndoManager*); - Value getImageIdentifierValue (UndoManager*); - - float getOpacity() const; - void setOpacity (float newOpacity, UndoManager*); - Value getOpacityValue (UndoManager*); - - Colour getOverlayColour() const; - void setOverlayColour (Colour newColour, UndoManager*); - Value getOverlayColourValue (UndoManager*); - - RelativeParallelogram getBoundingBox() const; - void setBoundingBox (const RelativeParallelogram&, UndoManager*); - - static const Identifier opacity, overlay, image, topLeft, topRight, bottomLeft; - }; - -private: - //============================================================================== - Image image; - float opacity; - Colour overlayColour; - RelativeParallelogram bounds; - - friend class Drawable::Positioner; - bool registerCoordinates (RelativeCoordinatePositionerBase&); - void recalculateCoordinates (Expression::Scope*); - - DrawableImage& operator= (const DrawableImage&); - JUCE_LEAK_DETECTOR (DrawableImage) -}; - - -#endif // JUCE_DRAWABLEIMAGE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp deleted file mode 100755 index 6dc46ba..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.cpp +++ /dev/null @@ -1,570 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -DrawablePath::DrawablePath() -{ -} - -DrawablePath::DrawablePath (const DrawablePath& other) - : DrawableShape (other) -{ - if (other.relativePath != nullptr) - setPath (*other.relativePath); - else - setPath (other.path); -} - -DrawablePath::~DrawablePath() -{ -} - -Drawable* DrawablePath::createCopy() const -{ - return new DrawablePath (*this); -} - -//============================================================================== -void DrawablePath::setPath (const Path& newPath) -{ - path = newPath; - pathChanged(); -} - -const Path& DrawablePath::getPath() const -{ - return path; -} - -const Path& DrawablePath::getStrokePath() const -{ - return strokePath; -} - -void DrawablePath::applyRelativePath (const RelativePointPath& newRelativePath, Expression::Scope* scope) -{ - Path newPath; - newRelativePath.createPath (newPath, scope); - - if (path != newPath) - { - path.swapWithPath (newPath); - pathChanged(); - } -} - -//============================================================================== -class DrawablePath::RelativePositioner : public RelativeCoordinatePositionerBase -{ -public: - RelativePositioner (DrawablePath& comp) - : RelativeCoordinatePositionerBase (comp), - owner (comp) - { - } - - bool registerCoordinates() - { - bool ok = true; - - jassert (owner.relativePath != nullptr); - const RelativePointPath& path = *owner.relativePath; - - for (int i = 0; i < path.elements.size(); ++i) - { - RelativePointPath::ElementBase* const e = path.elements.getUnchecked(i); - - int numPoints; - RelativePoint* const points = e->getControlPoints (numPoints); - - for (int j = numPoints; --j >= 0;) - ok = addPoint (points[j]) && ok; - } - - return ok; - } - - void applyToComponentBounds() - { - jassert (owner.relativePath != nullptr); - - ComponentScope scope (getComponent()); - owner.applyRelativePath (*owner.relativePath, &scope); - } - - void applyNewBounds (const Rectangle&) - { - jassertfalse; // drawables can't be resized directly! - } - -private: - DrawablePath& owner; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RelativePositioner) -}; - -void DrawablePath::setPath (const RelativePointPath& newRelativePath) -{ - if (newRelativePath.containsAnyDynamicPoints()) - { - if (relativePath == nullptr || newRelativePath != *relativePath) - { - relativePath = new RelativePointPath (newRelativePath); - - RelativePositioner* const p = new RelativePositioner (*this); - setPositioner (p); - p->apply(); - } - } - else - { - relativePath = nullptr; - applyRelativePath (newRelativePath, nullptr); - } -} - -//============================================================================== -const Identifier DrawablePath::valueTreeType ("Path"); - -const Identifier DrawablePath::ValueTreeWrapper::nonZeroWinding ("nonZeroWinding"); -const Identifier DrawablePath::ValueTreeWrapper::point1 ("p1"); -const Identifier DrawablePath::ValueTreeWrapper::point2 ("p2"); -const Identifier DrawablePath::ValueTreeWrapper::point3 ("p3"); - -//============================================================================== -DrawablePath::ValueTreeWrapper::ValueTreeWrapper (const ValueTree& state_) - : FillAndStrokeState (state_) -{ - jassert (state.hasType (valueTreeType)); -} - -ValueTree DrawablePath::ValueTreeWrapper::getPathState() -{ - return state.getOrCreateChildWithName (path, nullptr); -} - -bool DrawablePath::ValueTreeWrapper::usesNonZeroWinding() const -{ - return state [nonZeroWinding]; -} - -void DrawablePath::ValueTreeWrapper::setUsesNonZeroWinding (bool b, UndoManager* undoManager) -{ - state.setProperty (nonZeroWinding, b, undoManager); -} - -void DrawablePath::ValueTreeWrapper::readFrom (const RelativePointPath& p, UndoManager* undoManager) -{ - setUsesNonZeroWinding (p.usesNonZeroWinding, undoManager); - - ValueTree pathTree (getPathState()); - pathTree.removeAllChildren (undoManager); - - for (int i = 0; i < p.elements.size(); ++i) - pathTree.addChild (p.elements.getUnchecked(i)->createTree(), -1, undoManager); -} - -void DrawablePath::ValueTreeWrapper::writeTo (RelativePointPath& p) const -{ - p.usesNonZeroWinding = usesNonZeroWinding(); - RelativePoint points[3]; - - const ValueTree pathTree (state.getChildWithName (path)); - const int num = pathTree.getNumChildren(); - for (int i = 0; i < num; ++i) - { - const Element e (pathTree.getChild(i)); - - const int numCps = e.getNumControlPoints(); - for (int j = 0; j < numCps; ++j) - points[j] = e.getControlPoint (j); - - RelativePointPath::ElementBase* newElement = nullptr; - const Identifier t (e.getType()); - - if (t == Element::startSubPathElement) newElement = new RelativePointPath::StartSubPath (points[0]); - else if (t == Element::closeSubPathElement) newElement = new RelativePointPath::CloseSubPath(); - else if (t == Element::lineToElement) newElement = new RelativePointPath::LineTo (points[0]); - else if (t == Element::quadraticToElement) newElement = new RelativePointPath::QuadraticTo (points[0], points[1]); - else if (t == Element::cubicToElement) newElement = new RelativePointPath::CubicTo (points[0], points[1], points[2]); - else jassertfalse; - - p.addElement (newElement); - } -} - -//============================================================================== -const Identifier DrawablePath::ValueTreeWrapper::Element::mode ("mode"); -const Identifier DrawablePath::ValueTreeWrapper::Element::startSubPathElement ("Move"); -const Identifier DrawablePath::ValueTreeWrapper::Element::closeSubPathElement ("Close"); -const Identifier DrawablePath::ValueTreeWrapper::Element::lineToElement ("Line"); -const Identifier DrawablePath::ValueTreeWrapper::Element::quadraticToElement ("Quad"); -const Identifier DrawablePath::ValueTreeWrapper::Element::cubicToElement ("Cubic"); - -const char* DrawablePath::ValueTreeWrapper::Element::cornerMode = "corner"; -const char* DrawablePath::ValueTreeWrapper::Element::roundedMode = "round"; -const char* DrawablePath::ValueTreeWrapper::Element::symmetricMode = "symm"; - -DrawablePath::ValueTreeWrapper::Element::Element (const ValueTree& state_) - : state (state_) -{ -} - -DrawablePath::ValueTreeWrapper::Element::~Element() -{ -} - -DrawablePath::ValueTreeWrapper DrawablePath::ValueTreeWrapper::Element::getParent() const -{ - return ValueTreeWrapper (state.getParent().getParent()); -} - -DrawablePath::ValueTreeWrapper::Element DrawablePath::ValueTreeWrapper::Element::getPreviousElement() const -{ - return Element (state.getSibling (-1)); -} - -int DrawablePath::ValueTreeWrapper::Element::getNumControlPoints() const noexcept -{ - const Identifier i (state.getType()); - if (i == startSubPathElement || i == lineToElement) return 1; - if (i == quadraticToElement) return 2; - if (i == cubicToElement) return 3; - return 0; -} - -RelativePoint DrawablePath::ValueTreeWrapper::Element::getControlPoint (const int index) const -{ - jassert (index >= 0 && index < getNumControlPoints()); - return RelativePoint (state [index == 0 ? point1 : (index == 1 ? point2 : point3)].toString()); -} - -Value DrawablePath::ValueTreeWrapper::Element::getControlPointValue (int index, UndoManager* undoManager) -{ - jassert (index >= 0 && index < getNumControlPoints()); - return state.getPropertyAsValue (index == 0 ? point1 : (index == 1 ? point2 : point3), undoManager); -} - -void DrawablePath::ValueTreeWrapper::Element::setControlPoint (const int index, const RelativePoint& point, UndoManager* undoManager) -{ - jassert (index >= 0 && index < getNumControlPoints()); - state.setProperty (index == 0 ? point1 : (index == 1 ? point2 : point3), point.toString(), undoManager); -} - -RelativePoint DrawablePath::ValueTreeWrapper::Element::getStartPoint() const -{ - const Identifier i (state.getType()); - - if (i == startSubPathElement) - return getControlPoint (0); - - jassert (i == lineToElement || i == quadraticToElement || i == cubicToElement || i == closeSubPathElement); - - return getPreviousElement().getEndPoint(); -} - -RelativePoint DrawablePath::ValueTreeWrapper::Element::getEndPoint() const -{ - const Identifier i (state.getType()); - if (i == startSubPathElement || i == lineToElement) return getControlPoint (0); - if (i == quadraticToElement) return getControlPoint (1); - if (i == cubicToElement) return getControlPoint (2); - - jassert (i == closeSubPathElement); - return RelativePoint(); -} - -float DrawablePath::ValueTreeWrapper::Element::getLength (Expression::Scope* scope) const -{ - const Identifier i (state.getType()); - - if (i == lineToElement || i == closeSubPathElement) - return getEndPoint().resolve (scope).getDistanceFrom (getStartPoint().resolve (scope)); - - if (i == cubicToElement) - { - Path p; - p.startNewSubPath (getStartPoint().resolve (scope)); - p.cubicTo (getControlPoint (0).resolve (scope), getControlPoint (1).resolve (scope), getControlPoint (2).resolve (scope)); - return p.getLength(); - } - - if (i == quadraticToElement) - { - Path p; - p.startNewSubPath (getStartPoint().resolve (scope)); - p.quadraticTo (getControlPoint (0).resolve (scope), getControlPoint (1).resolve (scope)); - return p.getLength(); - } - - jassert (i == startSubPathElement); - return 0; -} - -String DrawablePath::ValueTreeWrapper::Element::getModeOfEndPoint() const -{ - return state [mode].toString(); -} - -void DrawablePath::ValueTreeWrapper::Element::setModeOfEndPoint (const String& newMode, UndoManager* undoManager) -{ - if (state.hasType (cubicToElement)) - state.setProperty (mode, newMode, undoManager); -} - -void DrawablePath::ValueTreeWrapper::Element::convertToLine (UndoManager* undoManager) -{ - const Identifier i (state.getType()); - - if (i == quadraticToElement || i == cubicToElement) - { - ValueTree newState (lineToElement); - Element e (newState); - e.setControlPoint (0, getEndPoint(), undoManager); - state = newState; - } -} - -void DrawablePath::ValueTreeWrapper::Element::convertToCubic (Expression::Scope* scope, UndoManager* undoManager) -{ - const Identifier i (state.getType()); - - if (i == lineToElement || i == quadraticToElement) - { - ValueTree newState (cubicToElement); - Element e (newState); - - const RelativePoint start (getStartPoint()); - const RelativePoint end (getEndPoint()); - const Point startResolved (start.resolve (scope)); - const Point endResolved (end.resolve (scope)); - e.setControlPoint (0, startResolved + (endResolved - startResolved) * 0.3f, undoManager); - e.setControlPoint (1, startResolved + (endResolved - startResolved) * 0.7f, undoManager); - e.setControlPoint (2, end, undoManager); - - state = newState; - } -} - -void DrawablePath::ValueTreeWrapper::Element::convertToPathBreak (UndoManager* undoManager) -{ - const Identifier i (state.getType()); - - if (i != startSubPathElement) - { - ValueTree newState (startSubPathElement); - Element e (newState); - e.setControlPoint (0, getEndPoint(), undoManager); - state = newState; - } -} - -namespace DrawablePathHelpers -{ - static Point findCubicSubdivisionPoint (float proportion, const Point points[4]) - { - const Point mid1 (points[0] + (points[1] - points[0]) * proportion), - mid2 (points[1] + (points[2] - points[1]) * proportion), - mid3 (points[2] + (points[3] - points[2]) * proportion); - - const Point newCp1 (mid1 + (mid2 - mid1) * proportion), - newCp2 (mid2 + (mid3 - mid2) * proportion); - - return newCp1 + (newCp2 - newCp1) * proportion; - } - - static Point findQuadraticSubdivisionPoint (float proportion, const Point points[3]) - { - const Point mid1 (points[0] + (points[1] - points[0]) * proportion), - mid2 (points[1] + (points[2] - points[1]) * proportion); - - return mid1 + (mid2 - mid1) * proportion; - } -} - -float DrawablePath::ValueTreeWrapper::Element::findProportionAlongLine (Point targetPoint, Expression::Scope* scope) const -{ - using namespace DrawablePathHelpers; - const Identifier pointType (state.getType()); - float bestProp = 0; - - if (pointType == cubicToElement) - { - RelativePoint rp1 (getStartPoint()), rp2 (getControlPoint (0)), rp3 (getControlPoint (1)), rp4 (getEndPoint()); - - const Point points[] = { rp1.resolve (scope), rp2.resolve (scope), rp3.resolve (scope), rp4.resolve (scope) }; - - float bestDistance = std::numeric_limits::max(); - - for (int i = 110; --i >= 0;) - { - float prop = i > 10 ? ((i - 10) / 100.0f) : (bestProp + ((i - 5) / 1000.0f)); - const Point centre (findCubicSubdivisionPoint (prop, points)); - const float distance = centre.getDistanceFrom (targetPoint); - - if (distance < bestDistance) - { - bestProp = prop; - bestDistance = distance; - } - } - } - else if (pointType == quadraticToElement) - { - RelativePoint rp1 (getStartPoint()), rp2 (getControlPoint (0)), rp3 (getEndPoint()); - const Point points[] = { rp1.resolve (scope), rp2.resolve (scope), rp3.resolve (scope) }; - - float bestDistance = std::numeric_limits::max(); - - for (int i = 110; --i >= 0;) - { - float prop = i > 10 ? ((i - 10) / 100.0f) : (bestProp + ((i - 5) / 1000.0f)); - const Point centre (findQuadraticSubdivisionPoint ((float) prop, points)); - const float distance = centre.getDistanceFrom (targetPoint); - - if (distance < bestDistance) - { - bestProp = prop; - bestDistance = distance; - } - } - } - else if (pointType == lineToElement) - { - RelativePoint rp1 (getStartPoint()), rp2 (getEndPoint()); - const Line line (rp1.resolve (scope), rp2.resolve (scope)); - bestProp = line.findNearestProportionalPositionTo (targetPoint); - } - - return bestProp; -} - -ValueTree DrawablePath::ValueTreeWrapper::Element::insertPoint (Point targetPoint, Expression::Scope* scope, UndoManager* undoManager) -{ - ValueTree newTree; - const Identifier pointType (state.getType()); - - if (pointType == cubicToElement) - { - float bestProp = findProportionAlongLine (targetPoint, scope); - - RelativePoint rp1 (getStartPoint()), rp2 (getControlPoint (0)), rp3 (getControlPoint (1)), rp4 (getEndPoint()); - const Point points[] = { rp1.resolve (scope), rp2.resolve (scope), rp3.resolve (scope), rp4.resolve (scope) }; - - const Point mid1 (points[0] + (points[1] - points[0]) * bestProp), - mid2 (points[1] + (points[2] - points[1]) * bestProp), - mid3 (points[2] + (points[3] - points[2]) * bestProp); - - const Point newCp1 (mid1 + (mid2 - mid1) * bestProp), - newCp2 (mid2 + (mid3 - mid2) * bestProp); - - const Point newCentre (newCp1 + (newCp2 - newCp1) * bestProp); - - setControlPoint (0, mid1, undoManager); - setControlPoint (1, newCp1, undoManager); - setControlPoint (2, newCentre, undoManager); - setModeOfEndPoint (roundedMode, undoManager); - - Element newElement (newTree = ValueTree (cubicToElement)); - newElement.setControlPoint (0, newCp2, nullptr); - newElement.setControlPoint (1, mid3, nullptr); - newElement.setControlPoint (2, rp4, nullptr); - - state.getParent().addChild (newTree, state.getParent().indexOf (state) + 1, undoManager); - } - else if (pointType == quadraticToElement) - { - float bestProp = findProportionAlongLine (targetPoint, scope); - - RelativePoint rp1 (getStartPoint()), rp2 (getControlPoint (0)), rp3 (getEndPoint()); - const Point points[] = { rp1.resolve (scope), rp2.resolve (scope), rp3.resolve (scope) }; - - const Point mid1 (points[0] + (points[1] - points[0]) * bestProp), - mid2 (points[1] + (points[2] - points[1]) * bestProp); - - const Point newCentre (mid1 + (mid2 - mid1) * bestProp); - - setControlPoint (0, mid1, undoManager); - setControlPoint (1, newCentre, undoManager); - setModeOfEndPoint (roundedMode, undoManager); - - Element newElement (newTree = ValueTree (quadraticToElement)); - newElement.setControlPoint (0, mid2, nullptr); - newElement.setControlPoint (1, rp3, nullptr); - - state.getParent().addChild (newTree, state.getParent().indexOf (state) + 1, undoManager); - } - else if (pointType == lineToElement) - { - RelativePoint rp1 (getStartPoint()), rp2 (getEndPoint()); - const Line line (rp1.resolve (scope), rp2.resolve (scope)); - const Point newPoint (line.findNearestPointTo (targetPoint)); - - setControlPoint (0, newPoint, undoManager); - - Element newElement (newTree = ValueTree (lineToElement)); - newElement.setControlPoint (0, rp2, nullptr); - - state.getParent().addChild (newTree, state.getParent().indexOf (state) + 1, undoManager); - } - else if (pointType == closeSubPathElement) - { - } - - return newTree; -} - -void DrawablePath::ValueTreeWrapper::Element::removePoint (UndoManager* undoManager) -{ - state.getParent().removeChild (state, undoManager); -} - -//============================================================================== -void DrawablePath::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) -{ - ValueTreeWrapper v (tree); - setComponentID (v.getID()); - - refreshFillTypes (v, builder.getImageProvider()); - setStrokeType (v.getStrokeType()); - - RelativePointPath newRelativePath; - v.writeTo (newRelativePath); - setPath (newRelativePath); -} - -ValueTree DrawablePath::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const -{ - ValueTree tree (valueTreeType); - ValueTreeWrapper v (tree); - - v.setID (getComponentID()); - writeTo (v, imageProvider, nullptr); - - if (relativePath != nullptr) - v.readFrom (*relativePath, nullptr); - else - v.readFrom (RelativePointPath (path), nullptr); - - return tree; -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h deleted file mode 100755 index bed3895..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawablePath.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DRAWABLEPATH_H_INCLUDED -#define JUCE_DRAWABLEPATH_H_INCLUDED - - -//============================================================================== -/** - A drawable object which renders a filled or outlined shape. - - For details on how to change the fill and stroke, see the DrawableShape class. - - @see Drawable, DrawableShape -*/ -class JUCE_API DrawablePath : public DrawableShape -{ -public: - //============================================================================== - /** Creates a DrawablePath. */ - DrawablePath(); - DrawablePath (const DrawablePath&); - - /** Destructor. */ - ~DrawablePath(); - - //============================================================================== - /** Changes the path that will be drawn. - @see setFillColour, setStrokeType - */ - void setPath (const Path& newPath); - - /** Sets the path using a RelativePointPath. - Calling this will set up a Component::Positioner to automatically update the path - if any of the points in the source path are dynamic. - */ - void setPath (const RelativePointPath& newPath); - - /** Returns the current path. */ - const Path& getPath() const; - - /** Returns the current path for the outline. */ - const Path& getStrokePath() const; - - //============================================================================== - /** @internal */ - Drawable* createCopy() const; - /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); - /** @internal */ - ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; - /** @internal */ - static const Identifier valueTreeType; - - //============================================================================== - /** Internally-used class for wrapping a DrawablePath's state into a ValueTree. */ - class ValueTreeWrapper : public DrawableShape::FillAndStrokeState - { - public: - ValueTreeWrapper (const ValueTree& state); - - bool usesNonZeroWinding() const; - void setUsesNonZeroWinding (bool b, UndoManager* undoManager); - - class Element - { - public: - explicit Element (const ValueTree& state); - ~Element(); - - const Identifier getType() const noexcept { return state.getType(); } - int getNumControlPoints() const noexcept; - - RelativePoint getControlPoint (int index) const; - Value getControlPointValue (int index, UndoManager*); - RelativePoint getStartPoint() const; - RelativePoint getEndPoint() const; - void setControlPoint (int index, const RelativePoint& point, UndoManager*); - float getLength (Expression::Scope*) const; - - ValueTreeWrapper getParent() const; - Element getPreviousElement() const; - - String getModeOfEndPoint() const; - void setModeOfEndPoint (const String& newMode, UndoManager*); - - void convertToLine (UndoManager*); - void convertToCubic (Expression::Scope*, UndoManager*); - void convertToPathBreak (UndoManager* undoManager); - ValueTree insertPoint (Point targetPoint, Expression::Scope*, UndoManager*); - void removePoint (UndoManager* undoManager); - float findProportionAlongLine (Point targetPoint, Expression::Scope*) const; - - static const Identifier mode, startSubPathElement, closeSubPathElement, - lineToElement, quadraticToElement, cubicToElement; - static const char* cornerMode; - static const char* roundedMode; - static const char* symmetricMode; - - ValueTree state; - }; - - ValueTree getPathState(); - - void readFrom (const RelativePointPath& path, UndoManager* undoManager); - void writeTo (RelativePointPath& path) const; - - static const Identifier nonZeroWinding, point1, point2, point3; - }; - -private: - //============================================================================== - ScopedPointer relativePath; - - class RelativePositioner; - friend class RelativePositioner; - void applyRelativePath (const RelativePointPath&, Expression::Scope*); - - DrawablePath& operator= (const DrawablePath&); - JUCE_LEAK_DETECTOR (DrawablePath) -}; - - -#endif // JUCE_DRAWABLEPATH_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp deleted file mode 100755 index 5a8c1c8..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -DrawableRectangle::DrawableRectangle() -{ -} - -DrawableRectangle::DrawableRectangle (const DrawableRectangle& other) - : DrawableShape (other), - bounds (other.bounds), - cornerSize (other.cornerSize) -{ -} - -DrawableRectangle::~DrawableRectangle() -{ -} - -Drawable* DrawableRectangle::createCopy() const -{ - return new DrawableRectangle (*this); -} - -//============================================================================== -void DrawableRectangle::setRectangle (const RelativeParallelogram& newBounds) -{ - if (bounds != newBounds) - { - bounds = newBounds; - rebuildPath(); - } -} - -void DrawableRectangle::setCornerSize (const RelativePoint& newSize) -{ - if (cornerSize != newSize) - { - cornerSize = newSize; - rebuildPath(); - } -} - -void DrawableRectangle::rebuildPath() -{ - if (bounds.isDynamic() || cornerSize.isDynamic()) - { - Drawable::Positioner* const p = new Drawable::Positioner (*this); - setPositioner (p); - p->apply(); - } - else - { - setPositioner (nullptr); - recalculateCoordinates (nullptr); - } -} - -bool DrawableRectangle::registerCoordinates (RelativeCoordinatePositionerBase& pos) -{ - bool ok = pos.addPoint (bounds.topLeft); - ok = pos.addPoint (bounds.topRight) && ok; - ok = pos.addPoint (bounds.bottomLeft) && ok; - return pos.addPoint (cornerSize) && ok; -} - -void DrawableRectangle::recalculateCoordinates (Expression::Scope* scope) -{ - Point points[3]; - bounds.resolveThreePoints (points, scope); - - const float cornerSizeX = (float) cornerSize.x.resolve (scope); - const float cornerSizeY = (float) cornerSize.y.resolve (scope); - - const float w = Line (points[0], points[1]).getLength(); - const float h = Line (points[0], points[2]).getLength(); - - Path newPath; - - if (cornerSizeX > 0 && cornerSizeY > 0) - newPath.addRoundedRectangle (0, 0, w, h, cornerSizeX, cornerSizeY); - else - newPath.addRectangle (0, 0, w, h); - - newPath.applyTransform (AffineTransform::fromTargetPoints (0, 0, points[0].x, points[0].y, - w, 0, points[1].x, points[1].y, - 0, h, points[2].x, points[2].y)); - - if (path != newPath) - { - path.swapWithPath (newPath); - pathChanged(); - } -} - -//============================================================================== -const Identifier DrawableRectangle::valueTreeType ("Rectangle"); -const Identifier DrawableRectangle::ValueTreeWrapper::topLeft ("topLeft"); -const Identifier DrawableRectangle::ValueTreeWrapper::topRight ("topRight"); -const Identifier DrawableRectangle::ValueTreeWrapper::bottomLeft ("bottomLeft"); -const Identifier DrawableRectangle::ValueTreeWrapper::cornerSize ("cornerSize"); - -//============================================================================== -DrawableRectangle::ValueTreeWrapper::ValueTreeWrapper (const ValueTree& state_) - : FillAndStrokeState (state_) -{ - jassert (state.hasType (valueTreeType)); -} - -RelativeParallelogram DrawableRectangle::ValueTreeWrapper::getRectangle() const -{ - return RelativeParallelogram (state.getProperty (topLeft, "0, 0"), - state.getProperty (topRight, "100, 0"), - state.getProperty (bottomLeft, "0, 100")); -} - -void DrawableRectangle::ValueTreeWrapper::setRectangle (const RelativeParallelogram& newBounds, UndoManager* undoManager) -{ - state.setProperty (topLeft, newBounds.topLeft.toString(), undoManager); - state.setProperty (topRight, newBounds.topRight.toString(), undoManager); - state.setProperty (bottomLeft, newBounds.bottomLeft.toString(), undoManager); -} - -void DrawableRectangle::ValueTreeWrapper::setCornerSize (const RelativePoint& newSize, UndoManager* undoManager) -{ - state.setProperty (cornerSize, newSize.toString(), undoManager); -} - -RelativePoint DrawableRectangle::ValueTreeWrapper::getCornerSize() const -{ - return RelativePoint (state [cornerSize]); -} - -Value DrawableRectangle::ValueTreeWrapper::getCornerSizeValue (UndoManager* undoManager) -{ - return state.getPropertyAsValue (cornerSize, undoManager); -} - -//============================================================================== -void DrawableRectangle::refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder) -{ - ValueTreeWrapper v (tree); - setComponentID (v.getID()); - - refreshFillTypes (v, builder.getImageProvider()); - setStrokeType (v.getStrokeType()); - setRectangle (v.getRectangle()); - setCornerSize (v.getCornerSize()); -} - -ValueTree DrawableRectangle::createValueTree (ComponentBuilder::ImageProvider* imageProvider) const -{ - ValueTree tree (valueTreeType); - ValueTreeWrapper v (tree); - - v.setID (getComponentID()); - writeTo (v, imageProvider, nullptr); - v.setRectangle (bounds, nullptr); - v.setCornerSize (cornerSize, nullptr); - - return tree; -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h deleted file mode 100755 index 9bae02e..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableRectangle.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DRAWABLERECTANGLE_H_INCLUDED -#define JUCE_DRAWABLERECTANGLE_H_INCLUDED - - -//============================================================================== -/** - A Drawable object which draws a rectangle. - - For details on how to change the fill and stroke, see the DrawableShape class. - - @see Drawable, DrawableShape -*/ -class JUCE_API DrawableRectangle : public DrawableShape -{ -public: - //============================================================================== - DrawableRectangle(); - DrawableRectangle (const DrawableRectangle&); - - /** Destructor. */ - ~DrawableRectangle(); - - //============================================================================== - /** Sets the rectangle's bounds. */ - void setRectangle (const RelativeParallelogram& newBounds); - - /** Returns the rectangle's bounds. */ - const RelativeParallelogram& getRectangle() const noexcept { return bounds; } - - /** Returns the corner size to be used. */ - const RelativePoint& getCornerSize() const noexcept { return cornerSize; } - - /** Sets a new corner size for the rectangle */ - void setCornerSize (const RelativePoint& newSize); - - //============================================================================== - /** @internal */ - Drawable* createCopy() const; - /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); - /** @internal */ - ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const; - /** @internal */ - static const Identifier valueTreeType; - - //============================================================================== - /** Internally-used class for wrapping a DrawableRectangle's state into a ValueTree. */ - class ValueTreeWrapper : public DrawableShape::FillAndStrokeState - { - public: - ValueTreeWrapper (const ValueTree& state); - - RelativeParallelogram getRectangle() const; - void setRectangle (const RelativeParallelogram& newBounds, UndoManager*); - - void setCornerSize (const RelativePoint& cornerSize, UndoManager*); - RelativePoint getCornerSize() const; - Value getCornerSizeValue (UndoManager*); - - static const Identifier topLeft, topRight, bottomLeft, cornerSize; - }; - - -private: - friend class Drawable::Positioner; - - RelativeParallelogram bounds; - RelativePoint cornerSize; - - void rebuildPath(); - bool registerCoordinates (RelativeCoordinatePositionerBase&); - void recalculateCoordinates (Expression::Scope*); - - DrawableRectangle& operator= (const DrawableRectangle&); - JUCE_LEAK_DETECTOR (DrawableRectangle) -}; - - -#endif // JUCE_DRAWABLERECTANGLE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp deleted file mode 100755 index 5813493..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.cpp +++ /dev/null @@ -1,472 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -DrawableShape::DrawableShape() - : strokeType (0.0f), - mainFill (Colours::black), - strokeFill (Colours::black) -{ -} - -DrawableShape::DrawableShape (const DrawableShape& other) - : Drawable (other), - strokeType (other.strokeType), - mainFill (other.mainFill), - strokeFill (other.strokeFill) -{ -} - -DrawableShape::~DrawableShape() -{ -} - -//============================================================================== -class DrawableShape::RelativePositioner : public RelativeCoordinatePositionerBase -{ -public: - RelativePositioner (DrawableShape& comp, const DrawableShape::RelativeFillType& f, bool isMain) - : RelativeCoordinatePositionerBase (comp), - owner (comp), - fill (f), - isMainFill (isMain) - { - } - - bool registerCoordinates() - { - bool ok = addPoint (fill.gradientPoint1); - ok = addPoint (fill.gradientPoint2) && ok; - return addPoint (fill.gradientPoint3) && ok; - } - - void applyToComponentBounds() - { - ComponentScope scope (owner); - if (isMainFill ? owner.mainFill.recalculateCoords (&scope) - : owner.strokeFill.recalculateCoords (&scope)) - owner.repaint(); - } - - void applyNewBounds (const Rectangle&) - { - jassertfalse; // drawables can't be resized directly! - } - -private: - DrawableShape& owner; - const DrawableShape::RelativeFillType fill; - const bool isMainFill; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RelativePositioner) -}; - -void DrawableShape::setFill (const FillType& newFill) -{ - setFill (RelativeFillType (newFill)); -} - -void DrawableShape::setStrokeFill (const FillType& newFill) -{ - setStrokeFill (RelativeFillType (newFill)); -} - -void DrawableShape::setFillInternal (RelativeFillType& fill, const RelativeFillType& newFill, - ScopedPointer& pos) -{ - if (fill != newFill) - { - fill = newFill; - pos = nullptr; - - if (fill.isDynamic()) - { - pos = new RelativePositioner (*this, fill, true); - pos->apply(); - } - else - { - fill.recalculateCoords (nullptr); - } - - repaint(); - } -} - -void DrawableShape::setFill (const RelativeFillType& newFill) -{ - setFillInternal (mainFill, newFill, mainFillPositioner); -} - -void DrawableShape::setStrokeFill (const RelativeFillType& newFill) -{ - setFillInternal (strokeFill, newFill, strokeFillPositioner); -} - -void DrawableShape::setStrokeType (const PathStrokeType& newStrokeType) -{ - if (strokeType != newStrokeType) - { - strokeType = newStrokeType; - strokeChanged(); - } -} - -void DrawableShape::setStrokeThickness (const float newThickness) -{ - setStrokeType (PathStrokeType (newThickness, strokeType.getJointStyle(), strokeType.getEndStyle())); -} - -bool DrawableShape::isStrokeVisible() const noexcept -{ - return strokeType.getStrokeThickness() > 0.0f && ! strokeFill.fill.isInvisible(); -} - -void DrawableShape::refreshFillTypes (const FillAndStrokeState& newState, ComponentBuilder::ImageProvider* imageProvider) -{ - setFill (newState.getFill (FillAndStrokeState::fill, imageProvider)); - setStrokeFill (newState.getFill (FillAndStrokeState::stroke, imageProvider)); -} - -void DrawableShape::writeTo (FillAndStrokeState& state, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) const -{ - state.setFill (FillAndStrokeState::fill, mainFill, imageProvider, undoManager); - state.setFill (FillAndStrokeState::stroke, strokeFill, imageProvider, undoManager); - state.setStrokeType (strokeType, undoManager); -} - -//============================================================================== -void DrawableShape::paint (Graphics& g) -{ - transformContextToCorrectOrigin (g); - - g.setFillType (mainFill.fill); - g.fillPath (path); - - if (isStrokeVisible()) - { - g.setFillType (strokeFill.fill); - g.fillPath (strokePath); - } -} - -void DrawableShape::pathChanged() -{ - strokeChanged(); -} - -void DrawableShape::strokeChanged() -{ - strokePath.clear(); - strokeType.createStrokedPath (strokePath, path, AffineTransform::identity, 4.0f); - - setBoundsToEnclose (getDrawableBounds()); - repaint(); -} - -Rectangle DrawableShape::getDrawableBounds() const -{ - if (isStrokeVisible()) - return strokePath.getBounds(); - - return path.getBounds(); -} - -bool DrawableShape::hitTest (int x, int y) -{ - bool allowsClicksOnThisComponent, allowsClicksOnChildComponents; - getInterceptsMouseClicks (allowsClicksOnThisComponent, allowsClicksOnChildComponents); - - if (! allowsClicksOnThisComponent) - return false; - - const float globalX = (float) (x - originRelativeToComponent.x); - const float globalY = (float) (y - originRelativeToComponent.y); - - return path.contains (globalX, globalY) - || (isStrokeVisible() && strokePath.contains (globalX, globalY)); -} - -//============================================================================== -DrawableShape::RelativeFillType::RelativeFillType() -{ -} - -DrawableShape::RelativeFillType::RelativeFillType (const FillType& fill_) - : fill (fill_) -{ - if (fill.isGradient()) - { - const ColourGradient& g = *fill.gradient; - - gradientPoint1 = g.point1.transformedBy (fill.transform); - gradientPoint2 = g.point2.transformedBy (fill.transform); - gradientPoint3 = Point (g.point1.x + g.point2.y - g.point1.y, - g.point1.y + g.point1.x - g.point2.x) - .transformedBy (fill.transform); - fill.transform = AffineTransform::identity; - } -} - -DrawableShape::RelativeFillType::RelativeFillType (const RelativeFillType& other) - : fill (other.fill), - gradientPoint1 (other.gradientPoint1), - gradientPoint2 (other.gradientPoint2), - gradientPoint3 (other.gradientPoint3) -{ -} - -DrawableShape::RelativeFillType& DrawableShape::RelativeFillType::operator= (const RelativeFillType& other) -{ - fill = other.fill; - gradientPoint1 = other.gradientPoint1; - gradientPoint2 = other.gradientPoint2; - gradientPoint3 = other.gradientPoint3; - return *this; -} - -bool DrawableShape::RelativeFillType::operator== (const RelativeFillType& other) const -{ - return fill == other.fill - && ((! fill.isGradient()) - || (gradientPoint1 == other.gradientPoint1 - && gradientPoint2 == other.gradientPoint2 - && gradientPoint3 == other.gradientPoint3)); -} - -bool DrawableShape::RelativeFillType::operator!= (const RelativeFillType& other) const -{ - return ! operator== (other); -} - -bool DrawableShape::RelativeFillType::recalculateCoords (Expression::Scope* scope) -{ - if (fill.isGradient()) - { - const Point g1 (gradientPoint1.resolve (scope)); - const Point g2 (gradientPoint2.resolve (scope)); - AffineTransform t; - - ColourGradient& g = *fill.gradient; - - if (g.isRadial) - { - const Point g3 (gradientPoint3.resolve (scope)); - const Point g3Source (g1.x + g2.y - g1.y, - g1.y + g1.x - g2.x); - - t = AffineTransform::fromTargetPoints (g1.x, g1.y, g1.x, g1.y, - g2.x, g2.y, g2.x, g2.y, - g3Source.x, g3Source.y, g3.x, g3.y); - } - - if (g.point1 != g1 || g.point2 != g2 || fill.transform != t) - { - g.point1 = g1; - g.point2 = g2; - fill.transform = t; - return true; - } - } - - return false; -} - -bool DrawableShape::RelativeFillType::isDynamic() const -{ - return gradientPoint1.isDynamic() || gradientPoint2.isDynamic() || gradientPoint3.isDynamic(); -} - -void DrawableShape::RelativeFillType::writeTo (ValueTree& v, ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) const -{ - if (fill.isColour()) - { - v.setProperty (FillAndStrokeState::type, "solid", undoManager); - v.setProperty (FillAndStrokeState::colour, String::toHexString ((int) fill.colour.getARGB()), undoManager); - } - else if (fill.isGradient()) - { - v.setProperty (FillAndStrokeState::type, "gradient", undoManager); - v.setProperty (FillAndStrokeState::gradientPoint1, gradientPoint1.toString(), undoManager); - v.setProperty (FillAndStrokeState::gradientPoint2, gradientPoint2.toString(), undoManager); - v.setProperty (FillAndStrokeState::gradientPoint3, gradientPoint3.toString(), undoManager); - - const ColourGradient& cg = *fill.gradient; - v.setProperty (FillAndStrokeState::radial, cg.isRadial, undoManager); - - String s; - for (int i = 0; i < cg.getNumColours(); ++i) - s << ' ' << cg.getColourPosition (i) - << ' ' << String::toHexString ((int) cg.getColour(i).getARGB()); - - v.setProperty (FillAndStrokeState::colours, s.trimStart(), undoManager); - } - else if (fill.isTiledImage()) - { - v.setProperty (FillAndStrokeState::type, "image", undoManager); - - if (imageProvider != nullptr) - v.setProperty (FillAndStrokeState::imageId, imageProvider->getIdentifierForImage (fill.image), undoManager); - - if (fill.getOpacity() < 1.0f) - v.setProperty (FillAndStrokeState::imageOpacity, fill.getOpacity(), undoManager); - else - v.removeProperty (FillAndStrokeState::imageOpacity, undoManager); - } - else - { - jassertfalse; - } -} - -bool DrawableShape::RelativeFillType::readFrom (const ValueTree& v, ComponentBuilder::ImageProvider* imageProvider) -{ - const String newType (v [FillAndStrokeState::type].toString()); - - if (newType == "solid") - { - const String colourString (v [FillAndStrokeState::colour].toString()); - fill.setColour (colourString.isEmpty() ? Colours::black - : Colour::fromString (colourString)); - return true; - } - else if (newType == "gradient") - { - ColourGradient g; - g.isRadial = v [FillAndStrokeState::radial]; - - StringArray colourSteps; - colourSteps.addTokens (v [FillAndStrokeState::colours].toString(), false); - - for (int i = 0; i < colourSteps.size() / 2; ++i) - g.addColour (colourSteps[i * 2].getDoubleValue(), - Colour::fromString (colourSteps[i * 2 + 1])); - - fill.setGradient (g); - - gradientPoint1 = RelativePoint (v [FillAndStrokeState::gradientPoint1]); - gradientPoint2 = RelativePoint (v [FillAndStrokeState::gradientPoint2]); - gradientPoint3 = RelativePoint (v [FillAndStrokeState::gradientPoint3]); - return true; - } - else if (newType == "image") - { - Image im; - if (imageProvider != nullptr) - im = imageProvider->getImageForIdentifier (v [FillAndStrokeState::imageId]); - - fill.setTiledImage (im, AffineTransform::identity); - fill.setOpacity ((float) v.getProperty (FillAndStrokeState::imageOpacity, 1.0f)); - return true; - } - - jassertfalse; - return false; -} - -//============================================================================== -const Identifier DrawableShape::FillAndStrokeState::type ("type"); -const Identifier DrawableShape::FillAndStrokeState::colour ("colour"); -const Identifier DrawableShape::FillAndStrokeState::colours ("colours"); -const Identifier DrawableShape::FillAndStrokeState::fill ("Fill"); -const Identifier DrawableShape::FillAndStrokeState::stroke ("Stroke"); -const Identifier DrawableShape::FillAndStrokeState::path ("Path"); -const Identifier DrawableShape::FillAndStrokeState::jointStyle ("jointStyle"); -const Identifier DrawableShape::FillAndStrokeState::capStyle ("capStyle"); -const Identifier DrawableShape::FillAndStrokeState::strokeWidth ("strokeWidth"); -const Identifier DrawableShape::FillAndStrokeState::gradientPoint1 ("point1"); -const Identifier DrawableShape::FillAndStrokeState::gradientPoint2 ("point2"); -const Identifier DrawableShape::FillAndStrokeState::gradientPoint3 ("point3"); -const Identifier DrawableShape::FillAndStrokeState::radial ("radial"); -const Identifier DrawableShape::FillAndStrokeState::imageId ("imageId"); -const Identifier DrawableShape::FillAndStrokeState::imageOpacity ("imageOpacity"); - -DrawableShape::FillAndStrokeState::FillAndStrokeState (const ValueTree& state_) - : Drawable::ValueTreeWrapperBase (state_) -{ -} - -DrawableShape::RelativeFillType DrawableShape::FillAndStrokeState::getFill (const Identifier& fillOrStrokeType, ComponentBuilder::ImageProvider* imageProvider) const -{ - DrawableShape::RelativeFillType f; - f.readFrom (state.getChildWithName (fillOrStrokeType), imageProvider); - return f; -} - -ValueTree DrawableShape::FillAndStrokeState::getFillState (const Identifier& fillOrStrokeType) -{ - ValueTree v (state.getChildWithName (fillOrStrokeType)); - if (v.isValid()) - return v; - - setFill (fillOrStrokeType, FillType (Colours::black), nullptr, nullptr); - return getFillState (fillOrStrokeType); -} - -void DrawableShape::FillAndStrokeState::setFill (const Identifier& fillOrStrokeType, const RelativeFillType& newFill, - ComponentBuilder::ImageProvider* imageProvider, UndoManager* undoManager) -{ - ValueTree v (state.getOrCreateChildWithName (fillOrStrokeType, undoManager)); - newFill.writeTo (v, imageProvider, undoManager); -} - -PathStrokeType DrawableShape::FillAndStrokeState::getStrokeType() const -{ - const String jointStyleString (state [jointStyle].toString()); - const String capStyleString (state [capStyle].toString()); - - return PathStrokeType (state [strokeWidth], - jointStyleString == "curved" ? PathStrokeType::curved - : (jointStyleString == "bevel" ? PathStrokeType::beveled - : PathStrokeType::mitered), - capStyleString == "square" ? PathStrokeType::square - : (capStyleString == "round" ? PathStrokeType::rounded - : PathStrokeType::butt)); -} - -void DrawableShape::FillAndStrokeState::setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager) -{ - state.setProperty (strokeWidth, (double) newStrokeType.getStrokeThickness(), undoManager); - state.setProperty (jointStyle, newStrokeType.getJointStyle() == PathStrokeType::mitered - ? "miter" : (newStrokeType.getJointStyle() == PathStrokeType::curved ? "curved" : "bevel"), undoManager); - state.setProperty (capStyle, newStrokeType.getEndStyle() == PathStrokeType::butt - ? "butt" : (newStrokeType.getEndStyle() == PathStrokeType::square ? "square" : "round"), undoManager); -} - -static bool replaceColourInFill (DrawableShape::RelativeFillType& fill, Colour original, Colour replacement) -{ - if (fill.fill.colour == original && fill.fill.isColour()) - { - fill = FillType (replacement); - return true; - } - - return false; -} - -bool DrawableShape::replaceColour (Colour original, Colour replacement) -{ - bool changed1 = replaceColourInFill (mainFill, original, replacement); - bool changed2 = replaceColourInFill (strokeFill, original, replacement); - return changed1 || changed2; -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h deleted file mode 100755 index ed893f1..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableShape.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DRAWABLESHAPE_H_INCLUDED -#define JUCE_DRAWABLESHAPE_H_INCLUDED - - -//============================================================================== -/** - A base class implementing common functionality for Drawable classes which - consist of some kind of filled and stroked outline. - - @see DrawablePath, DrawableRectangle -*/ -class JUCE_API DrawableShape : public Drawable -{ -protected: - //============================================================================== - DrawableShape(); - DrawableShape (const DrawableShape&); - -public: - /** Destructor. */ - ~DrawableShape(); - - //============================================================================== - /** A FillType wrapper that allows the gradient coordinates to be implemented using RelativePoint. - */ - class RelativeFillType - { - public: - RelativeFillType(); - RelativeFillType (const FillType& fill); - RelativeFillType (const RelativeFillType&); - RelativeFillType& operator= (const RelativeFillType&); - - bool operator== (const RelativeFillType&) const; - bool operator!= (const RelativeFillType&) const; - - bool isDynamic() const; - bool recalculateCoords (Expression::Scope* scope); - - void writeTo (ValueTree& v, ComponentBuilder::ImageProvider*, UndoManager*) const; - bool readFrom (const ValueTree& v, ComponentBuilder::ImageProvider*); - - //============================================================================== - FillType fill; - RelativePoint gradientPoint1, gradientPoint2, gradientPoint3; - }; - - //============================================================================== - /** Sets a fill type for the path. - This colour is used to fill the path - if you don't want the path to be - filled (e.g. if you're just drawing an outline), set this to a transparent - colour. - - @see setPath, setStrokeFill - */ - void setFill (const FillType& newFill); - - /** Sets a fill type for the path. - This colour is used to fill the path - if you don't want the path to be - filled (e.g. if you're just drawing an outline), set this to a transparent - colour. - - @see setPath, setStrokeFill - */ - void setFill (const RelativeFillType& newFill); - - /** Returns the current fill type. - @see setFill - */ - const RelativeFillType& getFill() const noexcept { return mainFill; } - - /** Sets the fill type with which the outline will be drawn. - @see setFill - */ - void setStrokeFill (const FillType& newStrokeFill); - - /** Sets the fill type with which the outline will be drawn. - @see setFill - */ - void setStrokeFill (const RelativeFillType& newStrokeFill); - - /** Returns the current stroke fill. - @see setStrokeFill - */ - const RelativeFillType& getStrokeFill() const noexcept { return strokeFill; } - - /** Changes the properties of the outline that will be drawn around the path. - If the stroke has 0 thickness, no stroke will be drawn. - @see setStrokeThickness, setStrokeColour - */ - void setStrokeType (const PathStrokeType& newStrokeType); - - /** Changes the stroke thickness. - This is a shortcut for calling setStrokeType. - */ - void setStrokeThickness (float newThickness); - - /** Returns the current outline style. */ - const PathStrokeType& getStrokeType() const noexcept { return strokeType; } - - //============================================================================== - /** @internal */ - class FillAndStrokeState : public Drawable::ValueTreeWrapperBase - { - public: - FillAndStrokeState (const ValueTree& state); - - ValueTree getFillState (const Identifier& fillOrStrokeType); - RelativeFillType getFill (const Identifier& fillOrStrokeType, ComponentBuilder::ImageProvider*) const; - void setFill (const Identifier& fillOrStrokeType, const RelativeFillType& newFill, - ComponentBuilder::ImageProvider*, UndoManager*); - - PathStrokeType getStrokeType() const; - void setStrokeType (const PathStrokeType& newStrokeType, UndoManager*); - - static const Identifier type, colour, colours, fill, stroke, path, jointStyle, capStyle, strokeWidth, - gradientPoint1, gradientPoint2, gradientPoint3, radial, imageId, imageOpacity; - }; - - /** @internal */ - Rectangle getDrawableBounds() const override; - /** @internal */ - void paint (Graphics&) override; - /** @internal */ - bool hitTest (int x, int y) override; - /** @internal */ - bool replaceColour (Colour originalColour, Colour replacementColour) override; - -protected: - //============================================================================== - /** Called when the cached path should be updated. */ - void pathChanged(); - /** Called when the cached stroke should be updated. */ - void strokeChanged(); - /** True if there's a stroke with a non-zero thickness and non-transparent colour. */ - bool isStrokeVisible() const noexcept; - /** Updates the details from a FillAndStrokeState object, returning true if something changed. */ - void refreshFillTypes (const FillAndStrokeState& newState, ComponentBuilder::ImageProvider*); - /** Writes the stroke and fill details to a FillAndStrokeState object. */ - void writeTo (FillAndStrokeState& state, ComponentBuilder::ImageProvider*, UndoManager*) const; - - //============================================================================== - PathStrokeType strokeType; - Path path, strokePath; - -private: - class RelativePositioner; - RelativeFillType mainFill, strokeFill; - ScopedPointer mainFillPositioner, strokeFillPositioner; - - void setFillInternal (RelativeFillType& fill, const RelativeFillType& newFill, - ScopedPointer& positioner); - - DrawableShape& operator= (const DrawableShape&); -}; - - -#endif // JUCE_DRAWABLESHAPE_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp deleted file mode 100755 index e9c9802..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.cpp +++ /dev/null @@ -1,334 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -DrawableText::DrawableText() - : colour (Colours::black), - justification (Justification::centredLeft) -{ - setBoundingBox (RelativeParallelogram (RelativePoint (0.0f, 0.0f), - RelativePoint (50.0f, 0.0f), - RelativePoint (0.0f, 20.0f))); - setFont (Font (15.0f), true); -} - -DrawableText::DrawableText (const DrawableText& other) - : Drawable (other), - bounds (other.bounds), - fontHeight (other.fontHeight), - fontHScale (other.fontHScale), - font (other.font), - text (other.text), - colour (other.colour), - justification (other.justification) -{ - refreshBounds(); -} - -DrawableText::~DrawableText() -{ -} - -//============================================================================== -void DrawableText::setText (const String& newText) -{ - if (text != newText) - { - text = newText; - refreshBounds(); - } -} - -void DrawableText::setColour (Colour newColour) -{ - if (colour != newColour) - { - colour = newColour; - repaint(); - } -} - -void DrawableText::setFont (const Font& newFont, bool applySizeAndScale) -{ - if (font != newFont) - { - font = newFont; - - if (applySizeAndScale) - { - fontHeight = font.getHeight(); - fontHScale = font.getHorizontalScale(); - } - - refreshBounds(); - } -} - -void DrawableText::setJustification (Justification newJustification) -{ - justification = newJustification; - repaint(); -} - -void DrawableText::setBoundingBox (const RelativeParallelogram& newBounds) -{ - if (bounds != newBounds) - { - bounds = newBounds; - refreshBounds(); - } -} - -void DrawableText::setFontHeight (const RelativeCoordinate& newHeight) -{ - if (fontHeight != newHeight) - { - fontHeight = newHeight; - refreshBounds(); - } -} - -void DrawableText::setFontHorizontalScale (const RelativeCoordinate& newScale) -{ - if (fontHScale != newScale) - { - fontHScale = newScale; - refreshBounds(); - } -} - -void DrawableText::refreshBounds() -{ - if (bounds.isDynamic() || fontHeight.isDynamic() || fontHScale.isDynamic()) - { - Drawable::Positioner* const p = new Drawable::Positioner (*this); - setPositioner (p); - p->apply(); - } - else - { - setPositioner (0); - recalculateCoordinates (0); - } -} - -bool DrawableText::registerCoordinates (RelativeCoordinatePositionerBase& pos) -{ - bool ok = pos.addPoint (bounds.topLeft); - ok = pos.addPoint (bounds.topRight) && ok; - ok = pos.addPoint (bounds.bottomLeft) && ok; - ok = pos.addCoordinate (fontHeight) && ok; - return pos.addCoordinate (fontHScale) && ok; -} - -void DrawableText::recalculateCoordinates (Expression::Scope* scope) -{ - bounds.resolveThreePoints (resolvedPoints, scope); - - const float w = Line (resolvedPoints[0], resolvedPoints[1]).getLength(); - const float h = Line (resolvedPoints[0], resolvedPoints[2]).getLength(); - - const float height = jlimit (0.01f, jmax (0.01f, h), (float) fontHeight.resolve (scope)); - const float hscale = jlimit (0.01f, jmax (0.01f, w), (float) fontHScale.resolve (scope)); - - scaledFont = font; - scaledFont.setHeight (height); - scaledFont.setHorizontalScale (hscale); - - setBoundsToEnclose (getDrawableBounds()); - repaint(); -} - -//============================================================================== -void DrawableText::paint (Graphics& g) -{ - transformContextToCorrectOrigin (g); - - const float w = Line (resolvedPoints[0], resolvedPoints[1]).getLength(); - const float h = Line (resolvedPoints[0], resolvedPoints[2]).getLength(); - - g.addTransform (AffineTransform::fromTargetPoints (0, 0, resolvedPoints[0].x, resolvedPoints[0].y, - w, 0, resolvedPoints[1].x, resolvedPoints[1].y, - 0, h, resolvedPoints[2].x, resolvedPoints[2].y)); - g.setFont (scaledFont); - g.setColour (colour); - - g.drawFittedText (text, Rectangle (w, h).getSmallestIntegerContainer(), justification, 0x100000); -} - -Rectangle DrawableText::getDrawableBounds() const -{ - return RelativeParallelogram::getBoundingBox (resolvedPoints); -} - -Drawable* DrawableText::createCopy() const -{ - return new DrawableText (*this); -} - -//============================================================================== -const Identifier DrawableText::valueTreeType ("Text"); - -const Identifier DrawableText::ValueTreeWrapper::text ("text"); -const Identifier DrawableText::ValueTreeWrapper::colour ("colour"); -const Identifier DrawableText::ValueTreeWrapper::font ("font"); -const Identifier DrawableText::ValueTreeWrapper::justification ("justification"); -const Identifier DrawableText::ValueTreeWrapper::topLeft ("topLeft"); -const Identifier DrawableText::ValueTreeWrapper::topRight ("topRight"); -const Identifier DrawableText::ValueTreeWrapper::bottomLeft ("bottomLeft"); -const Identifier DrawableText::ValueTreeWrapper::fontHeight ("fontHeight"); -const Identifier DrawableText::ValueTreeWrapper::fontHScale ("fontHScale"); - -//============================================================================== -DrawableText::ValueTreeWrapper::ValueTreeWrapper (const ValueTree& state_) - : ValueTreeWrapperBase (state_) -{ - jassert (state.hasType (valueTreeType)); -} - -String DrawableText::ValueTreeWrapper::getText() const -{ - return state [text].toString(); -} - -void DrawableText::ValueTreeWrapper::setText (const String& newText, UndoManager* undoManager) -{ - state.setProperty (text, newText, undoManager); -} - -Value DrawableText::ValueTreeWrapper::getTextValue (UndoManager* undoManager) -{ - return state.getPropertyAsValue (text, undoManager); -} - -Colour DrawableText::ValueTreeWrapper::getColour() const -{ - return Colour::fromString (state [colour].toString()); -} - -void DrawableText::ValueTreeWrapper::setColour (Colour newColour, UndoManager* undoManager) -{ - state.setProperty (colour, newColour.toString(), undoManager); -} - -Justification DrawableText::ValueTreeWrapper::getJustification() const -{ - return Justification ((int) state [justification]); -} - -void DrawableText::ValueTreeWrapper::setJustification (Justification newJustification, UndoManager* undoManager) -{ - state.setProperty (justification, newJustification.getFlags(), undoManager); -} - -Font DrawableText::ValueTreeWrapper::getFont() const -{ - return Font::fromString (state [font]); -} - -void DrawableText::ValueTreeWrapper::setFont (const Font& newFont, UndoManager* undoManager) -{ - state.setProperty (font, newFont.toString(), undoManager); -} - -Value DrawableText::ValueTreeWrapper::getFontValue (UndoManager* undoManager) -{ - return state.getPropertyAsValue (font, undoManager); -} - -RelativeParallelogram DrawableText::ValueTreeWrapper::getBoundingBox() const -{ - return RelativeParallelogram (state [topLeft].toString(), state [topRight].toString(), state [bottomLeft].toString()); -} - -void DrawableText::ValueTreeWrapper::setBoundingBox (const RelativeParallelogram& newBounds, UndoManager* undoManager) -{ - state.setProperty (topLeft, newBounds.topLeft.toString(), undoManager); - state.setProperty (topRight, newBounds.topRight.toString(), undoManager); - state.setProperty (bottomLeft, newBounds.bottomLeft.toString(), undoManager); -} - -RelativeCoordinate DrawableText::ValueTreeWrapper::getFontHeight() const -{ - return state [fontHeight].toString(); -} - -void DrawableText::ValueTreeWrapper::setFontHeight (const RelativeCoordinate& coord, UndoManager* undoManager) -{ - state.setProperty (fontHeight, coord.toString(), undoManager); -} - -RelativeCoordinate DrawableText::ValueTreeWrapper::getFontHorizontalScale() const -{ - return state [fontHScale].toString(); -} - -void DrawableText::ValueTreeWrapper::setFontHorizontalScale (const RelativeCoordinate& coord, UndoManager* undoManager) -{ - state.setProperty (fontHScale, coord.toString(), undoManager); -} - -//============================================================================== -void DrawableText::refreshFromValueTree (const ValueTree& tree, ComponentBuilder&) -{ - ValueTreeWrapper v (tree); - setComponentID (v.getID()); - - const RelativeParallelogram newBounds (v.getBoundingBox()); - const RelativeCoordinate newFontHeight (v.getFontHeight()); - const RelativeCoordinate newFontHScale (v.getFontHorizontalScale()); - const Colour newColour (v.getColour()); - const Justification newJustification (v.getJustification()); - const String newText (v.getText()); - const Font newFont (v.getFont()); - - if (text != newText || font != newFont || justification != newJustification - || colour != newColour || bounds != newBounds - || newFontHeight != fontHeight || newFontHScale != fontHScale) - { - setBoundingBox (newBounds); - setFontHeight (newFontHeight); - setFontHorizontalScale (newFontHScale); - setColour (newColour); - setFont (newFont, false); - setJustification (newJustification); - setText (newText); - } -} - -ValueTree DrawableText::createValueTree (ComponentBuilder::ImageProvider*) const -{ - ValueTree tree (valueTreeType); - ValueTreeWrapper v (tree); - - v.setID (getComponentID()); - v.setText (text, nullptr); - v.setFont (font, nullptr); - v.setJustification (justification, nullptr); - v.setColour (colour, nullptr); - v.setBoundingBox (bounds, nullptr); - v.setFontHeight (fontHeight, nullptr); - v.setFontHorizontalScale (fontHScale, nullptr); - - return tree; -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h deleted file mode 100755 index ac44fb4..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_DrawableText.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DRAWABLETEXT_H_INCLUDED -#define JUCE_DRAWABLETEXT_H_INCLUDED - - -//============================================================================== -/** - A drawable object which renders a line of text. - - @see Drawable -*/ -class JUCE_API DrawableText : public Drawable -{ -public: - //============================================================================== - /** Creates a DrawableText object. */ - DrawableText(); - DrawableText (const DrawableText&); - - /** Destructor. */ - ~DrawableText(); - - //============================================================================== - /** Sets the text to display.*/ - void setText (const String& newText); - - /** Returns the currently displayed text */ - const String& getText() const noexcept { return text;} - - /** Sets the colour of the text. */ - void setColour (Colour newColour); - - /** Returns the current text colour. */ - Colour getColour() const noexcept { return colour; } - - /** Sets the font to use. - Note that the font height and horizontal scale are set as RelativeCoordinates using - setFontHeight and setFontHorizontalScale. If applySizeAndScale is true, then these height - and scale values will be changed to match the dimensions of the font supplied; - if it is false, then the new font object's height and scale are ignored. - */ - void setFont (const Font& newFont, bool applySizeAndScale); - - /** Returns the current font. */ - const Font& getFont() const noexcept { return font; } - - /** Changes the justification of the text within the bounding box. */ - void setJustification (Justification newJustification); - - /** Returns the current justification. */ - Justification getJustification() const noexcept { return justification; } - - /** Returns the parallelogram that defines the text bounding box. */ - const RelativeParallelogram& getBoundingBox() const noexcept { return bounds; } - - /** Sets the bounding box that contains the text. */ - void setBoundingBox (const RelativeParallelogram& newBounds); - - const RelativeCoordinate& getFontHeight() const { return fontHeight; } - void setFontHeight (const RelativeCoordinate& newHeight); - - const RelativeCoordinate& getFontHorizontalScale() const { return fontHScale; } - void setFontHorizontalScale (const RelativeCoordinate& newScale); - - //============================================================================== - /** @internal */ - void paint (Graphics&) override; - /** @internal */ - Drawable* createCopy() const override; - /** @internal */ - void refreshFromValueTree (const ValueTree& tree, ComponentBuilder& builder); - /** @internal */ - ValueTree createValueTree (ComponentBuilder::ImageProvider* imageProvider) const override; - /** @internal */ - static const Identifier valueTreeType; - /** @internal */ - Rectangle getDrawableBounds() const override; - - //============================================================================== - /** Internally-used class for wrapping a DrawableText's state into a ValueTree. */ - class ValueTreeWrapper : public Drawable::ValueTreeWrapperBase - { - public: - ValueTreeWrapper (const ValueTree& state); - - String getText() const; - void setText (const String& newText, UndoManager* undoManager); - Value getTextValue (UndoManager* undoManager); - - Colour getColour() const; - void setColour (Colour newColour, UndoManager* undoManager); - - Justification getJustification() const; - void setJustification (Justification newJustification, UndoManager* undoManager); - - Font getFont() const; - void setFont (const Font& newFont, UndoManager* undoManager); - Value getFontValue (UndoManager* undoManager); - - RelativeParallelogram getBoundingBox() const; - void setBoundingBox (const RelativeParallelogram& newBounds, UndoManager* undoManager); - - RelativeCoordinate getFontHeight() const; - void setFontHeight (const RelativeCoordinate& newHeight, UndoManager* undoManager); - - RelativeCoordinate getFontHorizontalScale() const; - void setFontHorizontalScale (const RelativeCoordinate& newScale, UndoManager* undoManager); - - static const Identifier text, colour, font, justification, topLeft, topRight, bottomLeft, fontHeight, fontHScale; - }; - -private: - //============================================================================== - RelativeParallelogram bounds; - RelativeCoordinate fontHeight, fontHScale; - Point resolvedPoints[3]; - Font font, scaledFont; - String text; - Colour colour; - Justification justification; - - friend class Drawable::Positioner; - bool registerCoordinates (RelativeCoordinatePositionerBase&); - void recalculateCoordinates (Expression::Scope*); - void refreshBounds(); - - DrawableText& operator= (const DrawableText&); - JUCE_LEAK_DETECTOR (DrawableText) -}; - - -#endif // JUCE_DRAWABLETEXT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp b/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp deleted file mode 100755 index 5e236f0..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/drawables/juce_SVGParser.cpp +++ /dev/null @@ -1,1354 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -class SVGState -{ -public: - //============================================================================== - explicit SVGState (const XmlElement* const topLevel) - : topLevelXml (topLevel, nullptr), - elementX (0), elementY (0), - width (512), height (512), - viewBoxW (0), viewBoxH (0) - { - } - - struct XmlPath - { - XmlPath (const XmlElement* e, const XmlPath* p) noexcept : xml (e), parent (p) {} - - const XmlElement& operator*() const noexcept { jassert (xml != nullptr); return *xml; } - const XmlElement* operator->() const noexcept { return xml; } - XmlPath getChild (const XmlElement* e) const noexcept { return XmlPath (e, this); } - - const XmlElement* xml; - const XmlPath* parent; - }; - - //============================================================================== - Drawable* parseSVGElement (const XmlPath& xml) - { - if (! xml->hasTagNameIgnoringNamespace ("svg")) - return nullptr; - - DrawableComposite* const drawable = new DrawableComposite(); - - setDrawableID (*drawable, xml); - - SVGState newState (*this); - - if (xml->hasAttribute ("transform")) - newState.addTransform (xml); - - newState.elementX = getCoordLength (xml->getStringAttribute ("x", String (newState.elementX)), viewBoxW); - newState.elementY = getCoordLength (xml->getStringAttribute ("y", String (newState.elementY)), viewBoxH); - newState.width = getCoordLength (xml->getStringAttribute ("width", String (newState.width)), viewBoxW); - newState.height = getCoordLength (xml->getStringAttribute ("height", String (newState.height)), viewBoxH); - - if (newState.width <= 0) newState.width = 100; - if (newState.height <= 0) newState.height = 100; - - Point viewboxXY; - - if (xml->hasAttribute ("viewBox")) - { - const String viewBoxAtt (xml->getStringAttribute ("viewBox")); - String::CharPointerType viewParams (viewBoxAtt.getCharPointer()); - Point vwh; - - if (parseCoords (viewParams, viewboxXY, true) - && parseCoords (viewParams, vwh, true) - && vwh.x > 0 - && vwh.y > 0) - { - newState.viewBoxW = vwh.x; - newState.viewBoxH = vwh.y; - - const int placementFlags = parsePlacementFlags (xml->getStringAttribute ("preserveAspectRatio").trim()); - - if (placementFlags != 0) - newState.transform = RectanglePlacement (placementFlags) - .getTransformToFit (Rectangle (viewboxXY.x, viewboxXY.y, vwh.x, vwh.y), - Rectangle (newState.width, newState.height)) - .followedBy (newState.transform); - } - } - else - { - if (viewBoxW == 0) newState.viewBoxW = newState.width; - if (viewBoxH == 0) newState.viewBoxH = newState.height; - } - - newState.parseSubElements (xml, *drawable); - - drawable->setContentArea (RelativeRectangle (RelativeCoordinate (viewboxXY.x), - RelativeCoordinate (viewboxXY.x + newState.viewBoxW), - RelativeCoordinate (viewboxXY.y), - RelativeCoordinate (viewboxXY.y + newState.viewBoxH))); - drawable->resetBoundingBoxToContentArea(); - - return drawable; - } - - //============================================================================== - void parsePathString (Path& path, const String& pathString) const - { - String::CharPointerType d (pathString.getCharPointer().findEndOfWhitespace()); - - Point subpathStart, last, last2, p1, p2, p3; - juce_wchar lastCommandChar = 0; - bool isRelative = true; - bool carryOn = true; - - const CharPointer_ASCII validCommandChars ("MmLlHhVvCcSsQqTtAaZz"); - - while (! d.isEmpty()) - { - if (validCommandChars.indexOf (*d) >= 0) - { - lastCommandChar = d.getAndAdvance(); - isRelative = (lastCommandChar >= 'a' && lastCommandChar <= 'z'); - } - - switch (lastCommandChar) - { - case 'M': - case 'm': - case 'L': - case 'l': - if (parseCoordsOrSkip (d, p1, false)) - { - if (isRelative) - p1 += last; - - if (lastCommandChar == 'M' || lastCommandChar == 'm') - { - subpathStart = p1; - path.startNewSubPath (p1); - lastCommandChar = 'l'; - } - else - path.lineTo (p1); - - last2 = last; - last = p1; - } - break; - - case 'H': - case 'h': - if (parseCoord (d, p1.x, false, true)) - { - if (isRelative) - p1.x += last.x; - - path.lineTo (p1.x, last.y); - - last2.x = last.x; - last.x = p1.x; - } - else - { - ++d; - } - break; - - case 'V': - case 'v': - if (parseCoord (d, p1.y, false, false)) - { - if (isRelative) - p1.y += last.y; - - path.lineTo (last.x, p1.y); - - last2.y = last.y; - last.y = p1.y; - } - else - { - ++d; - } - break; - - case 'C': - case 'c': - if (parseCoordsOrSkip (d, p1, false) - && parseCoordsOrSkip (d, p2, false) - && parseCoordsOrSkip (d, p3, false)) - { - if (isRelative) - { - p1 += last; - p2 += last; - p3 += last; - } - - path.cubicTo (p1, p2, p3); - - last2 = p2; - last = p3; - } - break; - - case 'S': - case 's': - if (parseCoordsOrSkip (d, p1, false) - && parseCoordsOrSkip (d, p3, false)) - { - if (isRelative) - { - p1 += last; - p3 += last; - } - - p2 = last + (last - last2); - path.cubicTo (p2, p1, p3); - - last2 = p1; - last = p3; - } - break; - - case 'Q': - case 'q': - if (parseCoordsOrSkip (d, p1, false) - && parseCoordsOrSkip (d, p2, false)) - { - if (isRelative) - { - p1 += last; - p2 += last; - } - - path.quadraticTo (p1, p2); - - last2 = p1; - last = p2; - } - break; - - case 'T': - case 't': - if (parseCoordsOrSkip (d, p1, false)) - { - if (isRelative) - p1 += last; - - p2 = last + (last - last2); - path.quadraticTo (p2, p1); - - last2 = p2; - last = p1; - } - break; - - case 'A': - case 'a': - if (parseCoordsOrSkip (d, p1, false)) - { - String num; - - if (parseNextNumber (d, num, false)) - { - const float angle = num.getFloatValue() * (180.0f / float_Pi); - - if (parseNextNumber (d, num, false)) - { - const bool largeArc = num.getIntValue() != 0; - - if (parseNextNumber (d, num, false)) - { - const bool sweep = num.getIntValue() != 0; - - if (parseCoordsOrSkip (d, p2, false)) - { - if (isRelative) - p2 += last; - - if (last != p2) - { - double centreX, centreY, startAngle, deltaAngle; - double rx = p1.x, ry = p1.y; - - endpointToCentreParameters (last.x, last.y, p2.x, p2.y, - angle, largeArc, sweep, - rx, ry, centreX, centreY, - startAngle, deltaAngle); - - path.addCentredArc ((float) centreX, (float) centreY, - (float) rx, (float) ry, - angle, (float) startAngle, (float) (startAngle + deltaAngle), - false); - - path.lineTo (p2); - } - - last2 = last; - last = p2; - } - } - } - } - } - - break; - - case 'Z': - case 'z': - path.closeSubPath(); - last = last2 = subpathStart; - d = d.findEndOfWhitespace(); - lastCommandChar = 'M'; - break; - - default: - carryOn = false; - break; - } - - if (! carryOn) - break; - } - - // paths that finish back at their start position often seem to be - // left without a 'z', so need to be closed explicitly.. - if (path.getCurrentPosition() == subpathStart) - path.closeSubPath(); - } - -private: - //============================================================================== - const XmlPath topLevelXml; - float elementX, elementY, width, height, viewBoxW, viewBoxH; - AffineTransform transform; - String cssStyleText; - - static void setDrawableID (Drawable& d, const XmlPath& xml) - { - String compID (xml->getStringAttribute ("id")); - d.setName (compID); - d.setComponentID (compID); - } - - //============================================================================== - void parseSubElements (const XmlPath& xml, DrawableComposite& parentDrawable) - { - forEachXmlChildElement (*xml, e) - parentDrawable.addAndMakeVisible (parseSubElement (xml.getChild (e))); - } - - Drawable* parseSubElement (const XmlPath& xml) - { - const String tag (xml->getTagNameWithoutNamespace()); - - if (tag == "g") return parseGroupElement (xml); - if (tag == "svg") return parseSVGElement (xml); - if (tag == "path") return parsePath (xml); - if (tag == "rect") return parseRect (xml); - if (tag == "circle") return parseCircle (xml); - if (tag == "ellipse") return parseEllipse (xml); - if (tag == "line") return parseLine (xml); - if (tag == "polyline") return parsePolygon (xml, true); - if (tag == "polygon") return parsePolygon (xml, false); - if (tag == "text") return parseText (xml, true); - if (tag == "switch") return parseSwitch (xml); - if (tag == "style") parseCSSStyle (xml); - - return nullptr; - } - - DrawableComposite* parseSwitch (const XmlPath& xml) - { - if (const XmlElement* const group = xml->getChildByName ("g")) - return parseGroupElement (xml.getChild (group)); - - return nullptr; - } - - DrawableComposite* parseGroupElement (const XmlPath& xml) - { - DrawableComposite* const drawable = new DrawableComposite(); - - setDrawableID (*drawable, xml); - - if (xml->hasAttribute ("transform")) - { - SVGState newState (*this); - newState.addTransform (xml); - - newState.parseSubElements (xml, *drawable); - } - else - { - parseSubElements (xml, *drawable); - } - - drawable->resetContentAreaAndBoundingBoxToFitChildren(); - return drawable; - } - - //============================================================================== - Drawable* parsePath (const XmlPath& xml) const - { - Path path; - parsePathString (path, xml->getStringAttribute ("d")); - - if (getStyleAttribute (xml, "fill-rule").trim().equalsIgnoreCase ("evenodd")) - path.setUsingNonZeroWinding (false); - - return parseShape (xml, path); - } - - Drawable* parseRect (const XmlPath& xml) const - { - Path rect; - - const bool hasRX = xml->hasAttribute ("rx"); - const bool hasRY = xml->hasAttribute ("ry"); - - if (hasRX || hasRY) - { - float rx = getCoordLength (xml, "rx", viewBoxW); - float ry = getCoordLength (xml, "ry", viewBoxH); - - if (! hasRX) - rx = ry; - else if (! hasRY) - ry = rx; - - rect.addRoundedRectangle (getCoordLength (xml, "x", viewBoxW), - getCoordLength (xml, "y", viewBoxH), - getCoordLength (xml, "width", viewBoxW), - getCoordLength (xml, "height", viewBoxH), - rx, ry); - } - else - { - rect.addRectangle (getCoordLength (xml, "x", viewBoxW), - getCoordLength (xml, "y", viewBoxH), - getCoordLength (xml, "width", viewBoxW), - getCoordLength (xml, "height", viewBoxH)); - } - - return parseShape (xml, rect); - } - - Drawable* parseCircle (const XmlPath& xml) const - { - Path circle; - - const float cx = getCoordLength (xml, "cx", viewBoxW); - const float cy = getCoordLength (xml, "cy", viewBoxH); - const float radius = getCoordLength (xml, "r", viewBoxW); - - circle.addEllipse (cx - radius, cy - radius, radius * 2.0f, radius * 2.0f); - - return parseShape (xml, circle); - } - - Drawable* parseEllipse (const XmlPath& xml) const - { - Path ellipse; - - const float cx = getCoordLength (xml, "cx", viewBoxW); - const float cy = getCoordLength (xml, "cy", viewBoxH); - const float radiusX = getCoordLength (xml, "rx", viewBoxW); - const float radiusY = getCoordLength (xml, "ry", viewBoxH); - - ellipse.addEllipse (cx - radiusX, cy - radiusY, radiusX * 2.0f, radiusY * 2.0f); - - return parseShape (xml, ellipse); - } - - Drawable* parseLine (const XmlPath& xml) const - { - Path line; - - const float x1 = getCoordLength (xml, "x1", viewBoxW); - const float y1 = getCoordLength (xml, "y1", viewBoxH); - const float x2 = getCoordLength (xml, "x2", viewBoxW); - const float y2 = getCoordLength (xml, "y2", viewBoxH); - - line.startNewSubPath (x1, y1); - line.lineTo (x2, y2); - - return parseShape (xml, line); - } - - Drawable* parsePolygon (const XmlPath& xml, const bool isPolyline) const - { - const String pointsAtt (xml->getStringAttribute ("points")); - String::CharPointerType points (pointsAtt.getCharPointer()); - Path path; - Point p; - - if (parseCoords (points, p, true)) - { - Point first (p), last; - - path.startNewSubPath (first); - - while (parseCoords (points, p, true)) - { - last = p; - path.lineTo (p); - } - - if ((! isPolyline) || first == last) - path.closeSubPath(); - } - - return parseShape (xml, path); - } - - //============================================================================== - Drawable* parseShape (const XmlPath& xml, Path& path, - const bool shouldParseTransform = true) const - { - if (shouldParseTransform && xml->hasAttribute ("transform")) - { - SVGState newState (*this); - newState.addTransform (xml); - - return newState.parseShape (xml, path, false); - } - - DrawablePath* dp = new DrawablePath(); - setDrawableID (*dp, xml); - dp->setFill (Colours::transparentBlack); - - path.applyTransform (transform); - dp->setPath (path); - - dp->setFill (getPathFillType (path, - getStyleAttribute (xml, "fill"), - getStyleAttribute (xml, "fill-opacity"), - getStyleAttribute (xml, "opacity"), - pathContainsClosedSubPath (path) ? Colours::black - : Colours::transparentBlack)); - - const String strokeType (getStyleAttribute (xml, "stroke")); - - if (strokeType.isNotEmpty() && ! strokeType.equalsIgnoreCase ("none")) - { - dp->setStrokeFill (getPathFillType (path, strokeType, - getStyleAttribute (xml, "stroke-opacity"), - getStyleAttribute (xml, "opacity"), - Colours::transparentBlack)); - - dp->setStrokeType (getStrokeFor (xml)); - } - - return dp; - } - - static bool pathContainsClosedSubPath (const Path& path) noexcept - { - for (Path::Iterator iter (path); iter.next();) - if (iter.elementType == Path::Iterator::closePath) - return true; - - return false; - } - - struct SetGradientStopsOp - { - const SVGState* state; - ColourGradient* gradient; - - void operator() (const XmlPath& xml) - { - state->addGradientStopsIn (*gradient, xml); - } - }; - - void addGradientStopsIn (ColourGradient& cg, const XmlPath& fillXml) const - { - if (fillXml.xml != nullptr) - { - forEachXmlChildElementWithTagName (*fillXml, e, "stop") - { - int index = 0; - Colour col (parseColour (getStyleAttribute (fillXml.getChild (e), "stop-color"), index, Colours::black)); - - const String opacity (getStyleAttribute (fillXml.getChild (e), "stop-opacity", "1")); - col = col.withMultipliedAlpha (jlimit (0.0f, 1.0f, opacity.getFloatValue())); - - double offset = e->getDoubleAttribute ("offset"); - - if (e->getStringAttribute ("offset").containsChar ('%')) - offset *= 0.01; - - cg.addColour (jlimit (0.0, 1.0, offset), col); - } - } - } - - FillType getGradientFillType (const XmlPath& fillXml, - const Path& path, - const float opacity) const - { - ColourGradient gradient; - - { - const String id (fillXml->getStringAttribute ("xlink:href")); - - if (id.startsWithChar ('#')) - { - SetGradientStopsOp op = { this, &gradient, }; - findElementForId (topLevelXml, id.substring (1), op); - } - } - - addGradientStopsIn (gradient, fillXml); - - if (gradient.getNumColours() > 0) - { - gradient.addColour (0.0, gradient.getColour (0)); - gradient.addColour (1.0, gradient.getColour (gradient.getNumColours() - 1)); - } - else - { - gradient.addColour (0.0, Colours::black); - gradient.addColour (1.0, Colours::black); - } - - if (opacity < 1.0f) - gradient.multiplyOpacity (opacity); - - jassert (gradient.getNumColours() > 0); - - gradient.isRadial = fillXml->hasTagNameIgnoringNamespace ("radialGradient"); - - float gradientWidth = viewBoxW; - float gradientHeight = viewBoxH; - float dx = 0.0f; - float dy = 0.0f; - - const bool userSpace = fillXml->getStringAttribute ("gradientUnits").equalsIgnoreCase ("userSpaceOnUse"); - - if (! userSpace) - { - const Rectangle bounds (path.getBounds()); - dx = bounds.getX(); - dy = bounds.getY(); - gradientWidth = bounds.getWidth(); - gradientHeight = bounds.getHeight(); - } - - if (gradient.isRadial) - { - if (userSpace) - gradient.point1.setXY (dx + getCoordLength (fillXml->getStringAttribute ("cx", "50%"), gradientWidth), - dy + getCoordLength (fillXml->getStringAttribute ("cy", "50%"), gradientHeight)); - else - gradient.point1.setXY (dx + gradientWidth * getCoordLength (fillXml->getStringAttribute ("cx", "50%"), 1.0f), - dy + gradientHeight * getCoordLength (fillXml->getStringAttribute ("cy", "50%"), 1.0f)); - - const float radius = getCoordLength (fillXml->getStringAttribute ("r", "50%"), gradientWidth); - gradient.point2 = gradient.point1 + Point (radius, 0.0f); - - //xxx (the fx, fy focal point isn't handled properly here..) - } - else - { - if (userSpace) - { - gradient.point1.setXY (dx + getCoordLength (fillXml->getStringAttribute ("x1", "0%"), gradientWidth), - dy + getCoordLength (fillXml->getStringAttribute ("y1", "0%"), gradientHeight)); - - gradient.point2.setXY (dx + getCoordLength (fillXml->getStringAttribute ("x2", "100%"), gradientWidth), - dy + getCoordLength (fillXml->getStringAttribute ("y2", "0%"), gradientHeight)); - } - else - { - gradient.point1.setXY (dx + gradientWidth * getCoordLength (fillXml->getStringAttribute ("x1", "0%"), 1.0f), - dy + gradientHeight * getCoordLength (fillXml->getStringAttribute ("y1", "0%"), 1.0f)); - - gradient.point2.setXY (dx + gradientWidth * getCoordLength (fillXml->getStringAttribute ("x2", "100%"), 1.0f), - dy + gradientHeight * getCoordLength (fillXml->getStringAttribute ("y2", "0%"), 1.0f)); - } - - if (gradient.point1 == gradient.point2) - return Colour (gradient.getColour (gradient.getNumColours() - 1)); - } - - FillType type (gradient); - - const AffineTransform gradientTransform (parseTransform (fillXml->getStringAttribute ("gradientTransform")) - .followedBy (transform)); - - if (gradient.isRadial) - { - type.transform = gradientTransform; - } - else - { - // Transform the perpendicular vector into the new coordinate space for the gradient. - // This vector is now the slope of the linear gradient as it should appear in the new coord space - const Point perpendicular (Point (gradient.point2.y - gradient.point1.y, - gradient.point1.x - gradient.point2.x) - .transformedBy (gradientTransform.withAbsoluteTranslation (0, 0))); - - const Point newGradPoint1 (gradient.point1.transformedBy (gradientTransform)); - const Point newGradPoint2 (gradient.point2.transformedBy (gradientTransform)); - - // Project the transformed gradient vector onto the transformed slope of the linear - // gradient as it should appear in the new coordinate space - const float scale = perpendicular.getDotProduct (newGradPoint2 - newGradPoint1) - / perpendicular.getDotProduct (perpendicular); - - type.gradient->point1 = newGradPoint1; - type.gradient->point2 = newGradPoint2 - perpendicular * scale; - } - - return type; - } - - struct GetFillTypeOp - { - const SVGState* state; - FillType* dest; - const Path* path; - float opacity; - - void operator() (const XmlPath& xml) - { - if (xml->hasTagNameIgnoringNamespace ("linearGradient") - || xml->hasTagNameIgnoringNamespace ("radialGradient")) - *dest = state->getGradientFillType (xml, *path, opacity); - } - }; - - FillType getPathFillType (const Path& path, - const String& fill, - const String& fillOpacity, - const String& overallOpacity, - const Colour defaultColour) const - { - float opacity = 1.0f; - - if (overallOpacity.isNotEmpty()) - opacity = jlimit (0.0f, 1.0f, overallOpacity.getFloatValue()); - - if (fillOpacity.isNotEmpty()) - opacity *= (jlimit (0.0f, 1.0f, fillOpacity.getFloatValue())); - - if (fill.startsWithIgnoreCase ("url")) - { - const String id (fill.fromFirstOccurrenceOf ("#", false, false) - .upToLastOccurrenceOf (")", false, false).trim()); - - FillType result; - GetFillTypeOp op = { this, &result, &path, opacity }; - - if (findElementForId (topLevelXml, id, op)) - return result; - } - - if (fill.equalsIgnoreCase ("none")) - return Colours::transparentBlack; - - int i = 0; - return parseColour (fill, i, defaultColour).withMultipliedAlpha (opacity); - } - - static PathStrokeType::JointStyle getJointStyle (const String& join) noexcept - { - if (join.equalsIgnoreCase ("round")) return PathStrokeType::curved; - if (join.equalsIgnoreCase ("bevel")) return PathStrokeType::beveled; - - return PathStrokeType::mitered; - } - - static PathStrokeType::EndCapStyle getEndCapStyle (const String& cap) noexcept - { - if (cap.equalsIgnoreCase ("round")) return PathStrokeType::rounded; - if (cap.equalsIgnoreCase ("square")) return PathStrokeType::square; - - return PathStrokeType::butt; - } - - float getStrokeWidth (const String& strokeWidth) const noexcept - { - return transform.getScaleFactor() * getCoordLength (strokeWidth, viewBoxW); - } - - PathStrokeType getStrokeFor (const XmlPath& xml) const - { - return PathStrokeType (getStrokeWidth (getStyleAttribute (xml, "stroke-width", "1")), - getJointStyle (getStyleAttribute (xml, "stroke-linejoin")), - getEndCapStyle (getStyleAttribute (xml, "stroke-linecap"))); - } - - //============================================================================== - Drawable* parseText (const XmlPath& xml, bool shouldParseTransform) - { - if (shouldParseTransform && xml->hasAttribute ("transform")) - { - SVGState newState (*this); - newState.addTransform (xml); - - return newState.parseText (xml, false); - } - - Array xCoords, yCoords, dxCoords, dyCoords; - - getCoordList (xCoords, getInheritedAttribute (xml, "x"), true, true); - getCoordList (yCoords, getInheritedAttribute (xml, "y"), true, false); - getCoordList (dxCoords, getInheritedAttribute (xml, "dx"), true, true); - getCoordList (dyCoords, getInheritedAttribute (xml, "dy"), true, false); - - const Font font (getFont (xml)); - const String anchorStr = getStyleAttribute(xml, "text-anchor"); - - DrawableComposite* dc = new DrawableComposite(); - setDrawableID (*dc, xml); - - forEachXmlChildElement (*xml, e) - { - if (e->isTextElement()) - { - const String text (e->getText().trim()); - - DrawableText* dt = new DrawableText(); - dc->addAndMakeVisible (dt); - - dt->setText (text); - dt->setFont (font, true); - dt->setTransform (transform); - - int i = 0; - dt->setColour (parseColour (getStyleAttribute (xml, "fill"), i, Colours::black) - .withMultipliedAlpha (getStyleAttribute (xml, "fill-opacity", "1").getFloatValue())); - - Rectangle bounds (xCoords[0], yCoords[0] - font.getAscent(), - font.getStringWidthFloat (text), font.getHeight()); - - if (anchorStr == "middle") bounds.setX (bounds.getX() - bounds.getWidth() / 2.0f); - else if (anchorStr == "end") bounds.setX (bounds.getX() - bounds.getWidth()); - - dt->setBoundingBox (bounds); - } - else if (e->hasTagNameIgnoringNamespace ("tspan")) - { - dc->addAndMakeVisible (parseText (xml.getChild (e), true)); - } - } - - return dc; - } - - Font getFont (const XmlPath& xml) const - { - const float fontSize = getCoordLength (getStyleAttribute (xml, "font-size"), 1.0f); - - int style = getStyleAttribute (xml, "font-style").containsIgnoreCase ("italic") ? Font::italic : Font::plain; - - if (getStyleAttribute (xml, "font-weight").containsIgnoreCase ("bold")) - style |= Font::bold; - - const String family (getStyleAttribute (xml, "font-family")); - - return family.isEmpty() ? Font (fontSize, style) - : Font (family, fontSize, style); - } - - //============================================================================== - void addTransform (const XmlPath& xml) - { - transform = parseTransform (xml->getStringAttribute ("transform")) - .followedBy (transform); - } - - //============================================================================== - bool parseCoord (String::CharPointerType& s, float& value, const bool allowUnits, const bool isX) const - { - String number; - - if (! parseNextNumber (s, number, allowUnits)) - { - value = 0; - return false; - } - - value = getCoordLength (number, isX ? viewBoxW : viewBoxH); - return true; - } - - bool parseCoords (String::CharPointerType& s, Point& p, const bool allowUnits) const - { - return parseCoord (s, p.x, allowUnits, true) - && parseCoord (s, p.y, allowUnits, false); - } - - bool parseCoordsOrSkip (String::CharPointerType& s, Point& p, const bool allowUnits) const - { - if (parseCoords (s, p, allowUnits)) - return true; - - if (! s.isEmpty()) ++s; - return false; - } - - float getCoordLength (const String& s, const float sizeForProportions) const noexcept - { - float n = s.getFloatValue(); - const int len = s.length(); - - if (len > 2) - { - const float dpi = 96.0f; - - const juce_wchar n1 = s [len - 2]; - const juce_wchar n2 = s [len - 1]; - - if (n1 == 'i' && n2 == 'n') n *= dpi; - else if (n1 == 'm' && n2 == 'm') n *= dpi / 25.4f; - else if (n1 == 'c' && n2 == 'm') n *= dpi / 2.54f; - else if (n1 == 'p' && n2 == 'c') n *= 15.0f; - else if (n2 == '%') n *= 0.01f * sizeForProportions; - } - - return n; - } - - float getCoordLength (const XmlPath& xml, const char* attName, const float sizeForProportions) const noexcept - { - return getCoordLength (xml->getStringAttribute (attName), sizeForProportions); - } - - void getCoordList (Array& coords, const String& list, bool allowUnits, const bool isX) const - { - String::CharPointerType text (list.getCharPointer()); - float value; - - while (parseCoord (text, value, allowUnits, isX)) - coords.add (value); - } - - //============================================================================== - void parseCSSStyle (const XmlPath& xml) - { - cssStyleText = xml->getAllSubText() + "\n" + cssStyleText; - } - - static String::CharPointerType findStyleItem (String::CharPointerType source, String::CharPointerType name) - { - const int nameLength = (int) name.length(); - - while (! source.isEmpty()) - { - if (source.getAndAdvance() == '.' - && CharacterFunctions::compareIgnoreCaseUpTo (source, name, nameLength) == 0) - { - String::CharPointerType endOfName ((source + nameLength).findEndOfWhitespace()); - - if (*endOfName == '{') - return endOfName; - } - } - - return source; - } - - String getStyleAttribute (const XmlPath& xml, StringRef attributeName, - const String& defaultValue = String()) const - { - if (xml->hasAttribute (attributeName)) - return xml->getStringAttribute (attributeName, defaultValue); - - const String styleAtt (xml->getStringAttribute ("style")); - - if (styleAtt.isNotEmpty()) - { - const String value (getAttributeFromStyleList (styleAtt, attributeName, String())); - - if (value.isNotEmpty()) - return value; - } - else if (xml->hasAttribute ("class")) - { - String::CharPointerType openBrace = findStyleItem (cssStyleText.getCharPointer(), - xml->getStringAttribute ("class").getCharPointer()); - - if (! openBrace.isEmpty()) - { - String::CharPointerType closeBrace = CharacterFunctions::find (openBrace, (juce_wchar) '}'); - - if (closeBrace != openBrace) - { - const String value (getAttributeFromStyleList (String (openBrace + 1, closeBrace), - attributeName, defaultValue)); - if (value.isNotEmpty()) - return value; - } - } - } - - if (xml.parent != nullptr) - return getStyleAttribute (*xml.parent, attributeName, defaultValue); - - return defaultValue; - } - - String getInheritedAttribute (const XmlPath& xml, StringRef attributeName) const - { - if (xml->hasAttribute (attributeName)) - return xml->getStringAttribute (attributeName); - - if (xml.parent != nullptr) - return getInheritedAttribute (*xml.parent, attributeName); - - return String(); - } - - static int parsePlacementFlags (const String& align) noexcept - { - if (align.isEmpty()) - return 0; - - if (align.containsIgnoreCase ("none")) - return RectanglePlacement::stretchToFit; - - return (align.containsIgnoreCase ("slice") ? RectanglePlacement::fillDestination : 0) - | (align.containsIgnoreCase ("xMin") ? RectanglePlacement::xLeft - : (align.containsIgnoreCase ("xMax") ? RectanglePlacement::xRight - : RectanglePlacement::xMid)) - | (align.containsIgnoreCase ("yMin") ? RectanglePlacement::yTop - : (align.containsIgnoreCase ("yMax") ? RectanglePlacement::yBottom - : RectanglePlacement::yMid)); - } - - //============================================================================== - static bool isIdentifierChar (const juce_wchar c) - { - return CharacterFunctions::isLetter (c) || c == '-'; - } - - static String getAttributeFromStyleList (const String& list, StringRef attributeName, const String& defaultValue) - { - int i = 0; - - for (;;) - { - i = list.indexOf (i, attributeName); - - if (i < 0) - break; - - if ((i == 0 || (i > 0 && ! isIdentifierChar (list [i - 1]))) - && ! isIdentifierChar (list [i + attributeName.length()])) - { - i = list.indexOfChar (i, ':'); - - if (i < 0) - break; - - int end = list.indexOfChar (i, ';'); - - if (end < 0) - end = 0x7ffff; - - return list.substring (i + 1, end).trim(); - } - - ++i; - } - - return defaultValue; - } - - //============================================================================== - static bool parseNextNumber (String::CharPointerType& text, String& value, const bool allowUnits) - { - String::CharPointerType s (text); - - while (s.isWhitespace() || *s == ',') - ++s; - - String::CharPointerType start (s); - - if (s.isDigit() || *s == '.' || *s == '-') - ++s; - - while (s.isDigit() || *s == '.') - ++s; - - if ((*s == 'e' || *s == 'E') - && ((s + 1).isDigit() || s[1] == '-' || s[1] == '+')) - { - s += 2; - - while (s.isDigit()) - ++s; - } - - if (allowUnits) - while (s.isLetter()) - ++s; - - if (s == start) - { - text = s; - return false; - } - - value = String (start, s); - - while (s.isWhitespace() || *s == ',') - ++s; - - text = s; - return true; - } - - //============================================================================== - static Colour parseColour (const String& s, int& index, const Colour defaultColour) - { - if (s [index] == '#') - { - uint32 hex[6] = { 0 }; - int numChars = 0; - - for (int i = 6; --i >= 0;) - { - const int hexValue = CharacterFunctions::getHexDigitValue (s [++index]); - - if (hexValue >= 0) - hex [numChars++] = (uint32) hexValue; - else - break; - } - - if (numChars <= 3) - return Colour ((uint8) (hex [0] * 0x11), - (uint8) (hex [1] * 0x11), - (uint8) (hex [2] * 0x11)); - - return Colour ((uint8) ((hex [0] << 4) + hex [1]), - (uint8) ((hex [2] << 4) + hex [3]), - (uint8) ((hex [4] << 4) + hex [5])); - } - - if (s [index] == 'r' - && s [index + 1] == 'g' - && s [index + 2] == 'b') - { - const int openBracket = s.indexOfChar (index, '('); - const int closeBracket = s.indexOfChar (openBracket, ')'); - - if (openBracket >= 3 && closeBracket > openBracket) - { - index = closeBracket; - - StringArray tokens; - tokens.addTokens (s.substring (openBracket + 1, closeBracket), ",", ""); - tokens.trim(); - tokens.removeEmptyStrings(); - - if (tokens[0].containsChar ('%')) - return Colour ((uint8) roundToInt (2.55 * tokens[0].getDoubleValue()), - (uint8) roundToInt (2.55 * tokens[1].getDoubleValue()), - (uint8) roundToInt (2.55 * tokens[2].getDoubleValue())); - else - return Colour ((uint8) tokens[0].getIntValue(), - (uint8) tokens[1].getIntValue(), - (uint8) tokens[2].getIntValue()); - } - } - - return Colours::findColourForName (s, defaultColour); - } - - static AffineTransform parseTransform (String t) - { - AffineTransform result; - - while (t.isNotEmpty()) - { - StringArray tokens; - tokens.addTokens (t.fromFirstOccurrenceOf ("(", false, false) - .upToFirstOccurrenceOf (")", false, false), - ", ", ""); - - tokens.removeEmptyStrings (true); - - float numbers[6]; - - for (int i = 0; i < numElementsInArray (numbers); ++i) - numbers[i] = tokens[i].getFloatValue(); - - AffineTransform trans; - - if (t.startsWithIgnoreCase ("matrix")) - { - trans = AffineTransform (numbers[0], numbers[2], numbers[4], - numbers[1], numbers[3], numbers[5]); - } - else if (t.startsWithIgnoreCase ("translate")) - { - trans = AffineTransform::translation (numbers[0], numbers[1]); - } - else if (t.startsWithIgnoreCase ("scale")) - { - trans = AffineTransform::scale (numbers[0], numbers[tokens.size() > 1 ? 1 : 0]); - } - else if (t.startsWithIgnoreCase ("rotate")) - { - trans = AffineTransform::rotation (numbers[0] / (180.0f / float_Pi), numbers[1], numbers[2]); - } - else if (t.startsWithIgnoreCase ("skewX")) - { - trans = AffineTransform::shear (std::tan (numbers[0] * (float_Pi / 180.0f)), 0.0f); - } - else if (t.startsWithIgnoreCase ("skewY")) - { - trans = AffineTransform::shear (0.0f, std::tan (numbers[0] * (float_Pi / 180.0f))); - } - - result = trans.followedBy (result); - t = t.fromFirstOccurrenceOf (")", false, false).trimStart(); - } - - return result; - } - - static void endpointToCentreParameters (const double x1, const double y1, - const double x2, const double y2, - const double angle, - const bool largeArc, const bool sweep, - double& rx, double& ry, - double& centreX, double& centreY, - double& startAngle, double& deltaAngle) noexcept - { - const double midX = (x1 - x2) * 0.5; - const double midY = (y1 - y2) * 0.5; - - const double cosAngle = std::cos (angle); - const double sinAngle = std::sin (angle); - const double xp = cosAngle * midX + sinAngle * midY; - const double yp = cosAngle * midY - sinAngle * midX; - const double xp2 = xp * xp; - const double yp2 = yp * yp; - - double rx2 = rx * rx; - double ry2 = ry * ry; - - const double s = (xp2 / rx2) + (yp2 / ry2); - double c; - - if (s <= 1.0) - { - c = std::sqrt (jmax (0.0, ((rx2 * ry2) - (rx2 * yp2) - (ry2 * xp2)) - / (( rx2 * yp2) + (ry2 * xp2)))); - - if (largeArc == sweep) - c = -c; - } - else - { - const double s2 = std::sqrt (s); - rx *= s2; - ry *= s2; - c = 0; - } - - const double cpx = ((rx * yp) / ry) * c; - const double cpy = ((-ry * xp) / rx) * c; - - centreX = ((x1 + x2) * 0.5) + (cosAngle * cpx) - (sinAngle * cpy); - centreY = ((y1 + y2) * 0.5) + (sinAngle * cpx) + (cosAngle * cpy); - - const double ux = (xp - cpx) / rx; - const double uy = (yp - cpy) / ry; - const double vx = (-xp - cpx) / rx; - const double vy = (-yp - cpy) / ry; - - const double length = juce_hypot (ux, uy); - - startAngle = acos (jlimit (-1.0, 1.0, ux / length)); - - if (uy < 0) - startAngle = -startAngle; - - startAngle += double_Pi * 0.5; - - deltaAngle = acos (jlimit (-1.0, 1.0, ((ux * vx) + (uy * vy)) - / (length * juce_hypot (vx, vy)))); - - if ((ux * vy) - (uy * vx) < 0) - deltaAngle = -deltaAngle; - - if (sweep) - { - if (deltaAngle < 0) - deltaAngle += double_Pi * 2.0; - } - else - { - if (deltaAngle > 0) - deltaAngle -= double_Pi * 2.0; - } - - deltaAngle = fmod (deltaAngle, double_Pi * 2.0); - } - - template - static bool findElementForId (const XmlPath& parent, const String& id, OperationType& op) - { - forEachXmlChildElement (*parent, e) - { - if (e->compareAttribute ("id", id)) - { - op (parent.getChild (e)); - return true; - } - - if (findElementForId (parent.getChild (e), id, op)) - return true; - } - - return false; - } - - SVGState& operator= (const SVGState&) JUCE_DELETED_FUNCTION; -}; - - -//============================================================================== -Drawable* Drawable::createFromSVG (const XmlElement& svgDocument) -{ - SVGState state (&svgDocument); - return state.parseSVGElement (SVGState::XmlPath (&svgDocument, nullptr)); -} - -Path Drawable::parseSVGPath (const String& svgPath) -{ - SVGState state (nullptr); - Path p; - state.parsePathString (p, svgPath); - return p; -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp deleted file mode 100755 index 265df83..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -DirectoryContentsDisplayComponent::DirectoryContentsDisplayComponent (DirectoryContentsList& listToShow) - : fileList (listToShow) -{ -} - -DirectoryContentsDisplayComponent::~DirectoryContentsDisplayComponent() -{ -} - -//============================================================================== -FileBrowserListener::~FileBrowserListener() -{ -} - -void DirectoryContentsDisplayComponent::addListener (FileBrowserListener* const listener) -{ - listeners.add (listener); -} - -void DirectoryContentsDisplayComponent::removeListener (FileBrowserListener* const listener) -{ - listeners.remove (listener); -} - -void DirectoryContentsDisplayComponent::sendSelectionChangeMessage() -{ - Component::BailOutChecker checker (dynamic_cast (this)); - listeners.callChecked (checker, &FileBrowserListener::selectionChanged); -} - -void DirectoryContentsDisplayComponent::sendMouseClickMessage (const File& file, const MouseEvent& e) -{ - if (fileList.getDirectory().exists()) - { - Component::BailOutChecker checker (dynamic_cast (this)); - listeners.callChecked (checker, &FileBrowserListener::fileClicked, file, e); - } -} - -void DirectoryContentsDisplayComponent::sendDoubleClickMessage (const File& file) -{ - if (fileList.getDirectory().exists()) - { - Component::BailOutChecker checker (dynamic_cast (this)); - listeners.callChecked (checker, &FileBrowserListener::fileDoubleClicked, file); - } -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h deleted file mode 100755 index ebe1680..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DIRECTORYCONTENTSDISPLAYCOMPONENT_H_INCLUDED -#define JUCE_DIRECTORYCONTENTSDISPLAYCOMPONENT_H_INCLUDED - - -//============================================================================== -/** - A base class for components that display a list of the files in a directory. - - @see DirectoryContentsList -*/ -class JUCE_API DirectoryContentsDisplayComponent -{ -public: - //============================================================================== - /** Creates a DirectoryContentsDisplayComponent for a given list of files. */ - DirectoryContentsDisplayComponent (DirectoryContentsList& listToShow); - - /** Destructor. */ - virtual ~DirectoryContentsDisplayComponent(); - - //============================================================================== - /** Returns the number of files the user has got selected. - @see getSelectedFile - */ - virtual int getNumSelectedFiles() const = 0; - - /** Returns one of the files that the user has currently selected. - The index should be in the range 0 to (getNumSelectedFiles() - 1). - @see getNumSelectedFiles - */ - virtual File getSelectedFile (int index) const = 0; - - /** Deselects any selected files. */ - virtual void deselectAllFiles() = 0; - - /** Scrolls this view to the top. */ - virtual void scrollToTop() = 0; - - /** If the specified file is in the list, it will become the only selected item - (and if the file isn't in the list, all other items will be deselected). */ - virtual void setSelectedFile (const File&) = 0; - - //============================================================================== - /** Adds a listener to be told when files are selected or clicked. - @see removeListener - */ - void addListener (FileBrowserListener* listener); - - /** Removes a listener. - @see addListener - */ - void removeListener (FileBrowserListener* listener); - - - //============================================================================== - /** A set of colour IDs to use to change the colour of various aspects of the list. - - These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() - methods. - - @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour - */ - enum ColourIds - { - highlightColourId = 0x1000540, /**< The colour to use to fill a highlighted row of the list. */ - textColourId = 0x1000541, /**< The colour for the text. */ - }; - - //============================================================================== - /** @internal */ - void sendSelectionChangeMessage(); - /** @internal */ - void sendDoubleClickMessage (const File& file); - /** @internal */ - void sendMouseClickMessage (const File& file, const MouseEvent& e); - -protected: - //============================================================================== - DirectoryContentsList& fileList; - ListenerList listeners; - -private: - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectoryContentsDisplayComponent) -}; - - -#endif // JUCE_DIRECTORYCONTENTSDISPLAYCOMPONENT_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp deleted file mode 100755 index db98eb2..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp +++ /dev/null @@ -1,258 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -DirectoryContentsList::DirectoryContentsList (const FileFilter* f, TimeSliceThread& t) - : fileFilter (f), thread (t), - fileTypeFlags (File::ignoreHiddenFiles | File::findFiles), - shouldStop (true) -{ -} - -DirectoryContentsList::~DirectoryContentsList() -{ - stopSearching(); -} - -void DirectoryContentsList::setIgnoresHiddenFiles (const bool shouldIgnoreHiddenFiles) -{ - setTypeFlags (shouldIgnoreHiddenFiles ? (fileTypeFlags | File::ignoreHiddenFiles) - : (fileTypeFlags & ~File::ignoreHiddenFiles)); -} - -bool DirectoryContentsList::ignoresHiddenFiles() const -{ - return (fileTypeFlags & File::ignoreHiddenFiles) != 0; -} - -//============================================================================== -void DirectoryContentsList::setDirectory (const File& directory, - const bool includeDirectories, - const bool includeFiles) -{ - jassert (includeDirectories || includeFiles); // you have to speciify at least one of these! - - if (directory != root) - { - clear(); - root = directory; - changed(); - - // (this forces a refresh when setTypeFlags() is called, rather than triggering two refreshes) - fileTypeFlags &= ~(File::findDirectories | File::findFiles); - } - - int newFlags = fileTypeFlags; - if (includeDirectories) newFlags |= File::findDirectories; else newFlags &= ~File::findDirectories; - if (includeFiles) newFlags |= File::findFiles; else newFlags &= ~File::findFiles; - - setTypeFlags (newFlags); -} - -void DirectoryContentsList::setTypeFlags (const int newFlags) -{ - if (fileTypeFlags != newFlags) - { - fileTypeFlags = newFlags; - refresh(); - } -} - -void DirectoryContentsList::stopSearching() -{ - shouldStop = true; - thread.removeTimeSliceClient (this); - fileFindHandle = nullptr; -} - -void DirectoryContentsList::clear() -{ - stopSearching(); - - if (files.size() > 0) - { - files.clear(); - changed(); - } -} - -void DirectoryContentsList::refresh() -{ - clear(); - - if (root.isDirectory()) - { - fileFindHandle = new DirectoryIterator (root, false, "*", fileTypeFlags); - shouldStop = false; - thread.addTimeSliceClient (this); - } -} - -void DirectoryContentsList::setFileFilter (const FileFilter* newFileFilter) -{ - const ScopedLock sl (fileListLock); - fileFilter = newFileFilter; -} - -//============================================================================== -bool DirectoryContentsList::getFileInfo (const int index, FileInfo& result) const -{ - const ScopedLock sl (fileListLock); - - if (const FileInfo* const info = files [index]) - { - result = *info; - return true; - } - - return false; -} - -File DirectoryContentsList::getFile (const int index) const -{ - const ScopedLock sl (fileListLock); - - if (const FileInfo* const info = files [index]) - return root.getChildFile (info->filename); - - return File(); -} - -bool DirectoryContentsList::contains (const File& targetFile) const -{ - const ScopedLock sl (fileListLock); - - for (int i = files.size(); --i >= 0;) - if (root.getChildFile (files.getUnchecked(i)->filename) == targetFile) - return true; - - return false; -} - -bool DirectoryContentsList::isStillLoading() const -{ - return fileFindHandle != nullptr; -} - -void DirectoryContentsList::changed() -{ - sendChangeMessage(); -} - -//============================================================================== -int DirectoryContentsList::useTimeSlice() -{ - const uint32 startTime = Time::getApproximateMillisecondCounter(); - bool hasChanged = false; - - for (int i = 100; --i >= 0;) - { - if (! checkNextFile (hasChanged)) - { - if (hasChanged) - changed(); - - return 500; - } - - if (shouldStop || (Time::getApproximateMillisecondCounter() > startTime + 150)) - break; - } - - if (hasChanged) - changed(); - - return 0; -} - -bool DirectoryContentsList::checkNextFile (bool& hasChanged) -{ - if (fileFindHandle != nullptr) - { - bool fileFoundIsDir, isHidden, isReadOnly; - int64 fileSize; - Time modTime, creationTime; - - if (fileFindHandle->next (&fileFoundIsDir, &isHidden, &fileSize, - &modTime, &creationTime, &isReadOnly)) - { - if (addFile (fileFindHandle->getFile(), fileFoundIsDir, - fileSize, modTime, creationTime, isReadOnly)) - { - hasChanged = true; - } - - return true; - } - - fileFindHandle = nullptr; - } - - return false; -} - -struct FileInfoComparator -{ - static int compareElements (const DirectoryContentsList::FileInfo* const first, - const DirectoryContentsList::FileInfo* const second) - { - #if JUCE_WINDOWS - if (first->isDirectory != second->isDirectory) - return first->isDirectory ? -1 : 1; - #endif - - return first->filename.compareNatural (second->filename); - } -}; - -bool DirectoryContentsList::addFile (const File& file, const bool isDir, - const int64 fileSize, - Time modTime, Time creationTime, - const bool isReadOnly) -{ - const ScopedLock sl (fileListLock); - - if (fileFilter == nullptr - || ((! isDir) && fileFilter->isFileSuitable (file)) - || (isDir && fileFilter->isDirectorySuitable (file))) - { - ScopedPointer info (new FileInfo()); - - info->filename = file.getFileName(); - info->fileSize = fileSize; - info->modificationTime = modTime; - info->creationTime = creationTime; - info->isDirectory = isDir; - info->isReadOnly = isReadOnly; - - for (int i = files.size(); --i >= 0;) - if (files.getUnchecked(i)->filename == info->filename) - return false; - - FileInfoComparator comp; - files.addSorted (comp, info.release()); - return true; - } - - return false; -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h deleted file mode 100755 index b2e6a21..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h +++ /dev/null @@ -1,223 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_DIRECTORYCONTENTSLIST_H_INCLUDED -#define JUCE_DIRECTORYCONTENTSLIST_H_INCLUDED - - -//============================================================================== -/** - A class to asynchronously scan for details about the files in a directory. - - This keeps a list of files and some information about them, using a background - thread to scan for more files. As files are found, it broadcasts change messages - to tell any listeners. - - @see FileListComponent, FileBrowserComponent -*/ -class JUCE_API DirectoryContentsList : public ChangeBroadcaster, - private TimeSliceClient -{ -public: - //============================================================================== - /** Creates a directory list. - - To set the directory it should point to, use setDirectory(), which will - also start it scanning for files on the background thread. - - When the background thread finds and adds new files to this list, the - ChangeBroadcaster class will send a change message, so you can register - listeners and update them when the list changes. - - @param fileFilter an optional filter to select which files are - included in the list. If this is nullptr, then all files - and directories are included. Make sure that the filter - doesn't get deleted during the lifetime of this object - @param threadToUse a thread object that this list can use - to scan for files as a background task. Make sure - that the thread you give it has been started, or you - won't get any files! - */ - DirectoryContentsList (const FileFilter* fileFilter, - TimeSliceThread& threadToUse); - - /** Destructor. */ - ~DirectoryContentsList(); - - - //============================================================================== - /** Returns the directory that's currently being used. */ - const File& getDirectory() const noexcept { return root; } - - /** Sets the directory to look in for files. - - If the directory that's passed in is different to the current one, this will - also start the background thread scanning it for files. - */ - void setDirectory (const File& directory, - bool includeDirectories, - bool includeFiles); - - /** Returns true if this list contains directories. - @see setDirectory - */ - bool isFindingDirectories() const noexcept { return (fileTypeFlags & File::findDirectories) != 0; } - - /** Returns true if this list contains files. - @see setDirectory - */ - bool isFindingFiles() const noexcept { return (fileTypeFlags & File::findFiles) != 0; } - - /** Clears the list, and stops the thread scanning for files. */ - void clear(); - - /** Clears the list and restarts scanning the directory for files. */ - void refresh(); - - /** True if the background thread hasn't yet finished scanning for files. */ - bool isStillLoading() const; - - /** Tells the list whether or not to ignore hidden files. - By default these are ignored. - */ - void setIgnoresHiddenFiles (bool shouldIgnoreHiddenFiles); - - /** Returns true if hidden files are ignored. - @see setIgnoresHiddenFiles - */ - bool ignoresHiddenFiles() const; - - /** Replaces the current FileFilter. - This can be nullptr to have no filter. The DirectoryContentList does not take - ownership of this object - it just keeps a pointer to it, so you must manage its - lifetime. - Note that this only replaces the filter, it doesn't refresh the list - you'll - probably want to call refresh() after calling this. - */ - void setFileFilter (const FileFilter* newFileFilter); - - //============================================================================== - /** Contains cached information about one of the files in a DirectoryContentsList. - */ - struct FileInfo - { - //============================================================================== - /** The filename. - - This isn't a full pathname, it's just the last part of the path, same as you'd - get from File::getFileName(). - - To get the full pathname, use DirectoryContentsList::getDirectory().getChildFile (filename). - */ - String filename; - - /** File size in bytes. */ - int64 fileSize; - - /** File modification time. - As supplied by File::getLastModificationTime(). - */ - Time modificationTime; - - /** File creation time. - As supplied by File::getCreationTime(). - */ - Time creationTime; - - /** True if the file is a directory. */ - bool isDirectory; - - /** True if the file is read-only. */ - bool isReadOnly; - }; - - //============================================================================== - /** Returns the number of files currently available in the list. - - The info about one of these files can be retrieved with getFileInfo() or getFile(). - - Obviously as the background thread runs and scans the directory for files, this - number will change. - - @see getFileInfo, getFile - */ - int getNumFiles() const noexcept { return files.size(); } - - /** Returns the cached information about one of the files in the list. - - If the index is in-range, this will return true and will copy the file's details - to the structure that is passed-in. - - If it returns false, then the index wasn't in range, and the structure won't - be affected. - - @see getNumFiles, getFile - */ - bool getFileInfo (int index, FileInfo& resultInfo) const; - - /** Returns one of the files in the list. - - @param index should be less than getNumFiles(). If this is out-of-range, the - return value will be File::nonexistent - @see getNumFiles, getFileInfo - */ - File getFile (int index) const; - - /** Returns the file filter being used. - The filter is specified in the constructor. - */ - const FileFilter* getFilter() const noexcept { return fileFilter; } - - /** Returns true if the list contains the specified file. */ - bool contains (const File&) const; - - //============================================================================== - /** @internal */ - TimeSliceThread& getTimeSliceThread() const noexcept { return thread; } - -private: - File root; - const FileFilter* fileFilter; - TimeSliceThread& thread; - int fileTypeFlags; - - CriticalSection fileListLock; - OwnedArray files; - - ScopedPointer fileFindHandle; - bool volatile shouldStop; - - int useTimeSlice() override; - void stopSearching(); - void changed(); - bool checkNextFile (bool& hasChanged); - bool addFile (const File&, bool isDir, int64 fileSize, Time modTime, - Time creationTime, bool isReadOnly); - void setTypeFlags (int); - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectoryContentsList) -}; - - -#endif // JUCE_DIRECTORYCONTENTSLIST_H_INCLUDED diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp deleted file mode 100755 index 4a2f023..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.cpp +++ /dev/null @@ -1,586 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -FileBrowserComponent::FileBrowserComponent (int flags_, - const File& initialFileOrDirectory, - const FileFilter* fileFilter_, - FilePreviewComponent* previewComp_) - : FileFilter (String::empty), - fileFilter (fileFilter_), - flags (flags_), - previewComp (previewComp_), - currentPathBox ("path"), - fileLabel ("f", TRANS ("file:")), - thread ("Juce FileBrowser") -{ - // You need to specify one or other of the open/save flags.. - jassert ((flags & (saveMode | openMode)) != 0); - jassert ((flags & (saveMode | openMode)) != (saveMode | openMode)); - - // You need to specify at least one of these flags.. - jassert ((flags & (canSelectFiles | canSelectDirectories)) != 0); - - String filename; - - if (initialFileOrDirectory == File::nonexistent) - { - currentRoot = File::getCurrentWorkingDirectory(); - } - else if (initialFileOrDirectory.isDirectory()) - { - currentRoot = initialFileOrDirectory; - } - else - { - chosenFiles.add (initialFileOrDirectory); - currentRoot = initialFileOrDirectory.getParentDirectory(); - filename = initialFileOrDirectory.getFileName(); - } - - fileList = new DirectoryContentsList (this, thread); - - if ((flags & useTreeView) != 0) - { - FileTreeComponent* const tree = new FileTreeComponent (*fileList); - fileListComponent = tree; - - if ((flags & canSelectMultipleItems) != 0) - tree->setMultiSelectEnabled (true); - - addAndMakeVisible (tree); - } - else - { - FileListComponent* const list = new FileListComponent (*fileList); - fileListComponent = list; - list->setOutlineThickness (1); - - if ((flags & canSelectMultipleItems) != 0) - list->setMultipleSelectionEnabled (true); - - addAndMakeVisible (list); - } - - fileListComponent->addListener (this); - - addAndMakeVisible (currentPathBox); - currentPathBox.setEditableText (true); - resetRecentPaths(); - currentPathBox.addListener (this); - - addAndMakeVisible (filenameBox); - filenameBox.setMultiLine (false); - filenameBox.setSelectAllWhenFocused (true); - filenameBox.setText (filename, false); - filenameBox.addListener (this); - filenameBox.setReadOnly ((flags & (filenameBoxIsReadOnly | canSelectMultipleItems)) != 0); - - addAndMakeVisible (fileLabel); - fileLabel.attachToComponent (&filenameBox, true); - - addAndMakeVisible (goUpButton = getLookAndFeel().createFileBrowserGoUpButton()); - goUpButton->addListener (this); - goUpButton->setTooltip (TRANS ("Go up to parent directory")); - - if (previewComp != nullptr) - addAndMakeVisible (previewComp); - - setRoot (currentRoot); - - thread.startThread (4); -} - -FileBrowserComponent::~FileBrowserComponent() -{ - fileListComponent = nullptr; - fileList = nullptr; - thread.stopThread (10000); -} - -//============================================================================== -void FileBrowserComponent::addListener (FileBrowserListener* const newListener) -{ - listeners.add (newListener); -} - -void FileBrowserComponent::removeListener (FileBrowserListener* const listener) -{ - listeners.remove (listener); -} - -//============================================================================== -bool FileBrowserComponent::isSaveMode() const noexcept -{ - return (flags & saveMode) != 0; -} - -int FileBrowserComponent::getNumSelectedFiles() const noexcept -{ - if (chosenFiles.size() == 0 && currentFileIsValid()) - return 1; - - return chosenFiles.size(); -} - -File FileBrowserComponent::getSelectedFile (int index) const noexcept -{ - if ((flags & canSelectDirectories) != 0 && filenameBox.getText().isEmpty()) - return currentRoot; - - if (! filenameBox.isReadOnly()) - return currentRoot.getChildFile (filenameBox.getText()); - - return chosenFiles[index]; -} - -bool FileBrowserComponent::currentFileIsValid() const -{ - const File f (getSelectedFile (0)); - - if (isSaveMode()) - return (flags & canSelectDirectories) != 0 || ! f.isDirectory(); - - return f.exists(); -} - -File FileBrowserComponent::getHighlightedFile() const noexcept -{ - return fileListComponent->getSelectedFile (0); -} - -void FileBrowserComponent::deselectAllFiles() -{ - fileListComponent->deselectAllFiles(); -} - -//============================================================================== -bool FileBrowserComponent::isFileSuitable (const File& file) const -{ - return (flags & canSelectFiles) != 0 - && (fileFilter == nullptr || fileFilter->isFileSuitable (file)); -} - -bool FileBrowserComponent::isDirectorySuitable (const File&) const -{ - return true; -} - -bool FileBrowserComponent::isFileOrDirSuitable (const File& f) const -{ - if (f.isDirectory()) - return (flags & canSelectDirectories) != 0 - && (fileFilter == nullptr || fileFilter->isDirectorySuitable (f)); - - return (flags & canSelectFiles) != 0 && f.exists() - && (fileFilter == nullptr || fileFilter->isFileSuitable (f)); -} - -//============================================================================== -const File& FileBrowserComponent::getRoot() const -{ - return currentRoot; -} - -void FileBrowserComponent::setRoot (const File& newRootDirectory) -{ - bool callListeners = false; - - if (currentRoot != newRootDirectory) - { - callListeners = true; - fileListComponent->scrollToTop(); - - String path (newRootDirectory.getFullPathName()); - - if (path.isEmpty()) - path = File::separatorString; - - StringArray rootNames, rootPaths; - getRoots (rootNames, rootPaths); - - if (! rootPaths.contains (path, true)) - { - bool alreadyListed = false; - - for (int i = currentPathBox.getNumItems(); --i >= 0;) - { - if (currentPathBox.getItemText (i).equalsIgnoreCase (path)) - { - alreadyListed = true; - break; - } - } - - if (! alreadyListed) - currentPathBox.addItem (path, currentPathBox.getNumItems() + 2); - } - } - - currentRoot = newRootDirectory; - fileList->setDirectory (currentRoot, true, true); - - String currentRootName (currentRoot.getFullPathName()); - if (currentRootName.isEmpty()) - currentRootName = File::separatorString; - - currentPathBox.setText (currentRootName, dontSendNotification); - - goUpButton->setEnabled (currentRoot.getParentDirectory().isDirectory() - && currentRoot.getParentDirectory() != currentRoot); - - if (callListeners) - { - Component::BailOutChecker checker (this); - listeners.callChecked (checker, &FileBrowserListener::browserRootChanged, currentRoot); - } -} - -void FileBrowserComponent::setFileName (const String& newName) -{ - filenameBox.setText (newName, true); - - fileListComponent->setSelectedFile (currentRoot.getChildFile (newName)); -} - -void FileBrowserComponent::resetRecentPaths() -{ - currentPathBox.clear(); - - StringArray rootNames, rootPaths; - getRoots (rootNames, rootPaths); - - for (int i = 0; i < rootNames.size(); ++i) - { - if (rootNames[i].isEmpty()) - currentPathBox.addSeparator(); - else - currentPathBox.addItem (rootNames[i], i + 1); - } - - currentPathBox.addSeparator(); -} - -void FileBrowserComponent::goUp() -{ - setRoot (getRoot().getParentDirectory()); -} - -void FileBrowserComponent::refresh() -{ - fileList->refresh(); -} - -void FileBrowserComponent::setFileFilter (const FileFilter* const newFileFilter) -{ - if (fileFilter != newFileFilter) - { - fileFilter = newFileFilter; - refresh(); - } -} - -String FileBrowserComponent::getActionVerb() const -{ - return isSaveMode() ? ((flags & canSelectDirectories) != 0 ? TRANS("Choose") - : TRANS("Save")) - : TRANS("Open"); -} - -void FileBrowserComponent::setFilenameBoxLabel (const String& name) -{ - fileLabel.setText (name, dontSendNotification); -} - -FilePreviewComponent* FileBrowserComponent::getPreviewComponent() const noexcept -{ - return previewComp; -} - -DirectoryContentsDisplayComponent* FileBrowserComponent::getDisplayComponent() const noexcept -{ - return fileListComponent; -} - -//============================================================================== -void FileBrowserComponent::resized() -{ - getLookAndFeel() - .layoutFileBrowserComponent (*this, fileListComponent, previewComp, - ¤tPathBox, &filenameBox, goUpButton); -} - -//============================================================================== -void FileBrowserComponent::sendListenerChangeMessage() -{ - Component::BailOutChecker checker (this); - - if (previewComp != nullptr) - previewComp->selectedFileChanged (getSelectedFile (0)); - - // You shouldn't delete the browser when the file gets changed! - jassert (! checker.shouldBailOut()); - - listeners.callChecked (checker, &FileBrowserListener::selectionChanged); -} - -void FileBrowserComponent::selectionChanged() -{ - StringArray newFilenames; - bool resetChosenFiles = true; - - for (int i = 0; i < fileListComponent->getNumSelectedFiles(); ++i) - { - const File f (fileListComponent->getSelectedFile (i)); - - if (isFileOrDirSuitable (f)) - { - if (resetChosenFiles) - { - chosenFiles.clear(); - resetChosenFiles = false; - } - - chosenFiles.add (f); - newFilenames.add (f.getRelativePathFrom (getRoot())); - } - } - - if (newFilenames.size() > 0) - filenameBox.setText (newFilenames.joinIntoString (", "), false); - - sendListenerChangeMessage(); -} - -void FileBrowserComponent::fileClicked (const File& f, const MouseEvent& e) -{ - Component::BailOutChecker checker (this); - listeners.callChecked (checker, &FileBrowserListener::fileClicked, f, e); -} - -void FileBrowserComponent::fileDoubleClicked (const File& f) -{ - if (f.isDirectory()) - { - setRoot (f); - - if ((flags & canSelectDirectories) != 0) - filenameBox.setText (String::empty); - } - else - { - Component::BailOutChecker checker (this); - listeners.callChecked (checker, &FileBrowserListener::fileDoubleClicked, f); - } -} - -void FileBrowserComponent::browserRootChanged (const File&) {} - -bool FileBrowserComponent::keyPressed (const KeyPress& key) -{ - (void) key; - - #if JUCE_LINUX || JUCE_WINDOWS - if (key.getModifiers().isCommandDown() - && (key.getKeyCode() == 'H' || key.getKeyCode() == 'h')) - { - fileList->setIgnoresHiddenFiles (! fileList->ignoresHiddenFiles()); - fileList->refresh(); - return true; - } - #endif - - return false; -} - -//============================================================================== -void FileBrowserComponent::textEditorTextChanged (TextEditor&) -{ - sendListenerChangeMessage(); -} - -void FileBrowserComponent::textEditorReturnKeyPressed (TextEditor&) -{ - if (filenameBox.getText().containsChar (File::separator)) - { - const File f (currentRoot.getChildFile (filenameBox.getText())); - - if (f.isDirectory()) - { - setRoot (f); - chosenFiles.clear(); - filenameBox.setText (String::empty); - } - else - { - setRoot (f.getParentDirectory()); - chosenFiles.clear(); - chosenFiles.add (f); - filenameBox.setText (f.getFileName()); - } - } - else - { - fileDoubleClicked (getSelectedFile (0)); - } -} - -void FileBrowserComponent::textEditorEscapeKeyPressed (TextEditor&) -{ -} - -void FileBrowserComponent::textEditorFocusLost (TextEditor&) -{ - if (! isSaveMode()) - selectionChanged(); -} - -//============================================================================== -void FileBrowserComponent::buttonClicked (Button*) -{ - goUp(); -} - -void FileBrowserComponent::comboBoxChanged (ComboBox*) -{ - const String newText (currentPathBox.getText().trim().unquoted()); - - if (newText.isNotEmpty()) - { - const int index = currentPathBox.getSelectedId() - 1; - - StringArray rootNames, rootPaths; - getRoots (rootNames, rootPaths); - - if (rootPaths [index].isNotEmpty()) - { - setRoot (File (rootPaths [index])); - } - else - { - File f (newText); - - for (;;) - { - if (f.isDirectory()) - { - setRoot (f); - break; - } - - if (f.getParentDirectory() == f) - break; - - f = f.getParentDirectory(); - } - } - } -} - -void FileBrowserComponent::getDefaultRoots (StringArray& rootNames, StringArray& rootPaths) -{ - #if JUCE_WINDOWS - Array roots; - File::findFileSystemRoots (roots); - rootPaths.clear(); - - for (int i = 0; i < roots.size(); ++i) - { - const File& drive = roots.getReference(i); - - String name (drive.getFullPathName()); - rootPaths.add (name); - - if (drive.isOnHardDisk()) - { - String volume (drive.getVolumeLabel()); - - if (volume.isEmpty()) - volume = TRANS("Hard Drive"); - - name << " [" << volume << ']'; - } - else if (drive.isOnCDRomDrive()) - { - name << " [" << TRANS("CD/DVD drive") << ']'; - } - - rootNames.add (name); - } - - rootPaths.add (String::empty); - rootNames.add (String::empty); - - rootPaths.add (File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName()); - rootNames.add (TRANS("Documents")); - rootPaths.add (File::getSpecialLocation (File::userMusicDirectory).getFullPathName()); - rootNames.add (TRANS("Music")); - rootPaths.add (File::getSpecialLocation (File::userPicturesDirectory).getFullPathName()); - rootNames.add (TRANS("Pictures")); - rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName()); - rootNames.add (TRANS("Desktop")); - - #elif JUCE_MAC - rootPaths.add (File::getSpecialLocation (File::userHomeDirectory).getFullPathName()); - rootNames.add (TRANS("Home folder")); - rootPaths.add (File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName()); - rootNames.add (TRANS("Documents")); - rootPaths.add (File::getSpecialLocation (File::userMusicDirectory).getFullPathName()); - rootNames.add (TRANS("Music")); - rootPaths.add (File::getSpecialLocation (File::userPicturesDirectory).getFullPathName()); - rootNames.add (TRANS("Pictures")); - rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName()); - rootNames.add (TRANS("Desktop")); - - rootPaths.add (String::empty); - rootNames.add (String::empty); - - Array volumes; - File vol ("/Volumes"); - vol.findChildFiles (volumes, File::findDirectories, false); - - for (int i = 0; i < volumes.size(); ++i) - { - const File& volume = volumes.getReference(i); - - if (volume.isDirectory() && ! volume.getFileName().startsWithChar ('.')) - { - rootPaths.add (volume.getFullPathName()); - rootNames.add (volume.getFileName()); - } - } - - #else - rootPaths.add ("/"); - rootNames.add ("/"); - rootPaths.add (File::getSpecialLocation (File::userHomeDirectory).getFullPathName()); - rootNames.add (TRANS("Home folder")); - rootPaths.add (File::getSpecialLocation (File::userDesktopDirectory).getFullPathName()); - rootNames.add (TRANS("Desktop")); - #endif -} - -void FileBrowserComponent::getRoots (StringArray& rootNames, StringArray& rootPaths) -{ - getDefaultRoots (rootNames, rootPaths); -} diff --git a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h b/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h deleted file mode 100755 index a1151ef..0000000 --- a/JuceLibraryCode/modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h +++ /dev/null @@ -1,290 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library. - Copyright (c) 2013 - Raw Material Software Ltd. - - Permission is granted to use this software under the terms of either: - a) the GPL v2 (or any later version) - b) the Affero GPL v3 - - Details of these licenses can be found at: www.gnu.org/licenses - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.juce.com for more information. - - ============================================================================== -*/ - -#ifndef JUCE_FILEBROWSERCOMPONENT_H_INCLUDED -#define JUCE_FILEBROWSERCOMPONENT_H_INCLUDED - - -//============================================================================== -/** - A component for browsing and selecting a file or directory to open or save. - - This contains a FileListComponent and adds various boxes and controls for - navigating and selecting a file. It can work in different modes so that it can - be used for loading or saving a file, or for choosing a directory. - - @see FileChooserDialogBox, FileChooser, FileListComponent -*/ -class JUCE_API FileBrowserComponent : public Component, - private FileBrowserListener, - private TextEditorListener, - private ButtonListener, - private ComboBoxListener, // (can't use ComboBox::Listener due to idiotic VC2005 bug) - private FileFilter -{ -public: - //============================================================================== - /** Various options for the browser. - - A combination of these is passed into the FileBrowserComponent constructor. - */ - enum FileChooserFlags - { - openMode = 1, /**< specifies that the component should allow the user to - choose an existing file with the intention of opening it. */ - saveMode = 2, /**< specifies that the component should allow the user to specify - the name of a file that will be used to save something. */ - canSelectFiles = 4, /**< specifies that the user can select files (can be used in - conjunction with canSelectDirectories). */ - canSelectDirectories = 8, /**< specifies that the user can select directories (can be used in - conjuction with canSelectFiles). */ - canSelectMultipleItems = 16, /**< specifies that the user can select multiple items. */ - useTreeView = 32, /**< specifies that a tree-view should be shown instead of a file list. */ - filenameBoxIsReadOnly = 64, /**< specifies that the user can't type directly into the filename box. */ - warnAboutOverwriting = 128 /**< specifies that the dialog should warn about overwriting existing files (if possible). */ - }; - - //============================================================================== - /** Creates a FileBrowserComponent. - - @param flags A combination of flags from the FileChooserFlags enumeration, used to - specify the component's behaviour. The flags must contain either openMode - or saveMode, and canSelectFiles and/or canSelectDirectories. - @param initialFileOrDirectory The file or directory that should be selected when the component begins. - If this is File::nonexistent, a default directory will be chosen. - @param fileFilter an optional filter to use to determine which files are shown. - If this is nullptr then all files are displayed. Note that a pointer - is kept internally to this object, so make sure that it is not deleted - before the FileBrowserComponent object is deleted. - @param previewComp an optional preview component that will be used to show previews of - files that the user selects - */ - FileBrowserComponent (int flags, - const File& initialFileOrDirectory, - const FileFilter* fileFilter, - FilePreviewComponent* previewComp); - - /** Destructor. */ - ~FileBrowserComponent(); - - //============================================================================== - /** Returns the number of files that the user has got selected. - If multiple select isn't active, this will only be 0 or 1. To get the complete - list of files they've chosen, pass an index to getCurrentFile(). - */ - int getNumSelectedFiles() const noexcept; - - /** Returns one of the files that the user has chosen. - If the box has multi-select enabled, the index lets you specify which of the files - to get - see getNumSelectedFiles() to find out how many files were chosen. - @see getHighlightedFile - */ - File getSelectedFile (int index) const noexcept; - - /** Deselects any files that are currently selected. - */ - void deselectAllFiles(); - - /** Returns true if the currently selected file(s) are usable. - - This can be used to decide whether the user can press "ok" for the - current file. What it does depends on the mode, so for example in an "open" - mode, this only returns true if a file has been selected and if it exists. - In a "save" mode, a non-existent file would also be valid. - */ - bool currentFileIsValid() const; - - /** This returns the last item in the view that the user has highlighted. - This may be different from getCurrentFile(), which returns the value - that is shown in the filename box, and if there are multiple selections, - this will only return one of them. - @see getSelectedFile - */ - File getHighlightedFile() const noexcept; - - //============================================================================== - /** Returns the directory whose contents are currently being shown in the listbox. */ - const File& getRoot() const; - - /** Changes the directory that's being shown in the listbox. */ - void setRoot (const File& newRootDirectory); - - /** Changes the name that is currently shown in the filename box. */ - void setFileName (const String& newName); - - /** Equivalent to pressing the "up" button to browse the parent directory. */ - void goUp(); - - /** Refreshes the directory that's currently being listed. */ - void refresh(); - - /** Changes the filter that's being used to sift the files. */ - void setFileFilter (const FileFilter* newFileFilter); - - /** Returns a verb to describe what should happen when the file is accepted. - - E.g. if browsing in "load file" mode, this will be "Open", if in "save file" - mode, it'll be "Save", etc. - */ - virtual String getActionVerb() const; - - /** Returns true if the saveMode flag was set when this component was created. - */ - bool isSaveMode() const noexcept; - - /** Sets the label that will be displayed next to the filename entry box. - By default this is just "file", but you might want to change it to something more - appropriate for your app. - */ - void setFilenameBoxLabel (const String& name); - - //============================================================================== - /** Adds a listener to be told when the user selects and clicks on files. - @see removeListener - */ - void addListener (FileBrowserListener* listener); - - /** Removes a listener. - @see addListener - */ - void removeListener (FileBrowserListener* listener); - - /** Returns a platform-specific list of names and paths for some suggested places the user - might want to use as root folders. - The list returned contains empty strings to indicate section breaks. - @see getRoots() - */ - static void getDefaultRoots (StringArray& rootNames, StringArray& rootPaths); - - //============================================================================== - /** This abstract base class is implemented by LookAndFeel classes to provide - various file-browser layout and drawing methods. - */ - struct JUCE_API LookAndFeelMethods - { - virtual ~LookAndFeelMethods() {} - - // These return a pointer to an internally cached drawable - make sure you don't keep - // a copy of this pointer anywhere, as it may become invalid in the future. - virtual const Drawable* getDefaultFolderImage() = 0; - virtual const Drawable* getDefaultDocumentFileImage() = 0; - - virtual AttributedString createFileChooserHeaderText (const String& title, - const String& instructions) = 0; - - virtual void drawFileBrowserRow (Graphics&, int width, int height, - const String& filename, - Image* optionalIcon, - const String& fileSizeDescription, - const String& fileTimeDescription, - bool isDirectory, - bool isItemSelected, - int itemIndex, - DirectoryContentsDisplayComponent&) = 0; - - virtual Button* createFileBrowserGoUpButton() = 0; - - virtual void layoutFileBrowserComponent (FileBrowserComponent& browserComp, - DirectoryContentsDisplayComponent* fileListComponent, - FilePreviewComponent* previewComp, - ComboBox* currentPathBox, - TextEditor* filenameBox, - Button* goUpButton) = 0; - }; - - //============================================================================== - /** @internal */ - void resized() override; - /** @internal */ - void buttonClicked (Button*) override; - /** @internal */ - void comboBoxChanged (ComboBox*) override; - /** @internal */ - void textEditorTextChanged (TextEditor&) override; - /** @internal */ - void textEditorReturnKeyPressed (TextEditor&) override; - /** @internal */ - void textEditorEscapeKeyPressed (TextEditor&) override; - /** @internal */ - void textEditorFocusLost (TextEditor&) override; - /** @internal */ - bool keyPressed (const KeyPress&) override; - /** @internal */ - void selectionChanged() override; - /** @internal */ - void fileClicked (const File&, const MouseEvent&) override; - /** @internal */ - void fileDoubleClicked (const File&) override; - /** @internal */ - void browserRootChanged (const File&) override; - /** @internal */ - bool isFileSuitable (const File&) const override; - /** @internal */ - bool isDirectorySuitable (const File&) const override; - - /** @internal */ - FilePreviewComponent* getPreviewComponent() const noexcept; - - /** @internal */ - DirectoryContentsDisplayComponent* getDisplayComponent() const noexcept; - -protected: - /** Returns a list of names and paths for the default places the user might want to look. - - By default this just calls getDefaultRoots(), but you may want to override it to - return a custom list. - */ - virtual void getRoots (StringArray& rootNames, StringArray& rootPaths); - - /** Updates the items in the dropdown list of recent paths with the values from getRoots(). */ - void resetRecentPaths(); - -private: - //============================================================================== - ScopedPointer fileList; - const FileFilter* fileFilter; - - int flags; - File currentRoot; - Array chosenFiles; - ListenerList listeners; - - ScopedPointer fileListComponent; - FilePreviewComponent* previewComp; - ComboBox currentPathBox; - TextEditor filenameBox; - Label fileLabel; - ScopedPointer